From 4b7f7770337c1b3069ee4700024b5552366250c7 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 19 Dec 2019 17:57:20 +0100 Subject: [PATCH 001/296] Add new event for registering deposits. (#4459) --- frame/balances/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 5367d7413b..4b53f71898 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -267,6 +267,8 @@ decl_event!( Transfer(AccountId, AccountId, Balance, Balance), /// A balance was set by root (who, free, reserved). BalanceSet(AccountId, Balance, Balance), + /// Some amount was deposited (e.g. for transaction fees). + Deposit(AccountId, Balance), } ); @@ -587,7 +589,7 @@ impl, I: Instance> Module { T::OnFreeBalanceZero::on_free_balance_zero(who); let mut reserved_balance = Self::reserved_balance(who); - + if !dust.is_zero() { if reserved_balance >= T::ExistentialDeposit::get() { // any individual account cannot cause overflow in balance. -- GitLab From ab217bf3513a8f6c287b33dedc5bce0bd9ec863b Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Thu, 19 Dec 2019 18:57:42 +0200 Subject: [PATCH 002/296] Warn about using --rpc-external and --ws-external options (#4448) * Warn about using --rpc-external and --ws-external options * Apply review comments * Remove links placeholders * Add links to wiki --- client/cli/src/lib.rs | 25 +++++++++++++++++++++++-- client/cli/src/params.rs | 20 ++++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index c2e11b56ca..41456fc8c4 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -890,8 +890,8 @@ where } }); - let rpc_interface: &str = if cli.rpc_external { "0.0.0.0" } else { "127.0.0.1" }; - let ws_interface: &str = if cli.ws_external { "0.0.0.0" } else { "127.0.0.1" }; + let rpc_interface: &str = interface_str(cli.rpc_external, cli.unsafe_rpc_external, cli.validator)?; + let ws_interface: &str = interface_str(cli.ws_external, cli.unsafe_ws_external, cli.validator)?; let grafana_interface: &str = if cli.grafana_external { "0.0.0.0" } else { "127.0.0.1" }; config.rpc_http = Some(parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)?); @@ -931,6 +931,27 @@ where Ok(config) } +fn interface_str( + is_external: bool, + is_unsafe_external: bool, + is_validator: bool, +) -> Result<&'static str, error::Error> { + if is_external && is_validator { + return Err(error::Error::Input("--rpc-external and --ws-external options shouldn't be \ + used if the node is running as a validator. Use `--unsafe-rpc-external` if you understand \ + the risks. See the options description for more information.".to_owned())); + } + + if is_external || is_unsafe_external { + log::warn!("It isn't safe to expose RPC publicly without a proxy server that filters \ + available set of RPC methods."); + + Ok("0.0.0.0") + } else { + Ok("127.0.0.1") + } +} + /// Creates a configuration including the database path. pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 10be3f0c1b..6cb425bd74 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -438,16 +438,32 @@ pub struct RunCmd { /// Listen to all RPC interfaces. /// - /// Default is local. + /// Default is local. Note: not all RPC methods are safe to be exposed publicly. Use a RPC proxy + /// server to filter out dangerous methods. More details: https://github.com/paritytech/substrate/wiki/Public-RPC. + /// Use `--unsafe-rpc-external` to suppress the warning if you understand the risks. #[structopt(long = "rpc-external")] pub rpc_external: bool, + /// Listen to all RPC interfaces. + /// + /// Same as `--rpc-external`. + #[structopt(long = "unsafe-rpc-external")] + pub unsafe_rpc_external: bool, + /// Listen to all Websocket interfaces. /// - /// Default is local. + /// Default is local. Note: not all RPC methods are safe to be exposed publicly. Use a RPC proxy + /// server to filter out dangerous methods. More details: https://github.com/paritytech/substrate/wiki/Public-RPC. + /// Use `--unsafe-ws-external` to suppress the warning if you understand the risks. #[structopt(long = "ws-external")] pub ws_external: bool, + /// Listen to all Websocket interfaces. + /// + /// Same as `--ws-external`. + #[structopt(long = "unsafe-ws-external")] + pub unsafe_ws_external: bool, + /// Listen to all Grafana data source interfaces. /// /// Default is local. -- GitLab From d8197745e5f559b3fdc9a5c3148c9e531492ba07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 19 Dec 2019 17:38:01 +0000 Subject: [PATCH 003/296] babe: remove unused slot_duration variable (#4461) --- client/consensus/babe/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index de06f63848..20f06332e2 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -494,8 +494,6 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork slot_lenience, slot_lenience, BACKOFF_STEP); } - let slot_duration = slot_info.duration << (slot_lenience / BACKOFF_STEP); - let slot_lenience = Duration::from_secs(slot_duration); Some(slot_lenience + slot_remaining) } -- GitLab From e267d210178e646996dffafb6cd0c8b9d4a4b87f Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 20 Dec 2019 00:23:20 +0100 Subject: [PATCH 004/296] Update Balances Pallet for `decl_error!` (#4405) * Update balances for `decl_error!` * Update for new `decl_error` * Fix staking tests * Use `ok_or` over `match` --- frame/balances/src/lib.rs | 52 ++++++++++++++++--------- frame/balances/src/mock.rs | 22 +++++------ frame/balances/src/tests.rs | 78 ++++++++++++++++++------------------- frame/staking/src/lib.rs | 2 +- frame/staking/src/tests.rs | 42 +++++++++++++++++--- 5 files changed, 120 insertions(+), 76 deletions(-) diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 4b53f71898..1b89ae2b16 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -163,7 +163,7 @@ use sp_std::prelude::*; use sp_std::{cmp, result, mem, fmt::Debug}; use codec::{Codec, Encode, Decode}; use frame_support::{ - StorageValue, Parameter, decl_event, decl_storage, decl_module, + StorageValue, Parameter, decl_event, decl_storage, decl_module, decl_error, traits::{ UpdateBalanceOutcome, Currency, OnFreeBalanceZero, OnUnbalanced, TryDrop, WithdrawReason, WithdrawReasons, LockIdentifier, LockableCurrency, ExistenceRequirement, @@ -272,6 +272,27 @@ decl_event!( } ); +decl_error! { + pub enum Error for Module, I: Instance> { + /// Vesting balance too high to send value + VestingBalance, + /// Account liquidity restrictions prevent withdrawal + LiquidityRestrictions, + /// Got an overflow after adding + Overflow, + /// Balance too low to send value + InsufficientBalance, + /// Value too low to create account due to existential deposit + ExistentialDeposit, + /// Transfer/payment would kill account + KeepAlive, + /// A vesting schedule already exists for this account + ExistingVestingSchedule, + /// Beneficiary account must pre-exist + DeadAccount, + } +} + /// Struct to encode the vesting schedule of an individual account. #[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] pub struct VestingSchedule { @@ -390,6 +411,8 @@ decl_storage! { decl_module! { pub struct Module, I: Instance = DefaultInstance> for enum Call where origin: T::Origin { + type Error = Error; + /// The minimum amount required to keep an account open. const ExistentialDeposit: T::Balance = T::ExistentialDeposit::get(); @@ -897,7 +920,7 @@ where if reasons.intersects(WithdrawReason::Reserve | WithdrawReason::Transfer) && Self::vesting_balance(who) > new_balance { - Err("vesting balance too high to send value")? + Err(Error::::VestingBalance)? } let locks = Self::locks(who); if locks.is_empty() { @@ -914,7 +937,7 @@ where { Ok(()) } else { - Err("account liquidity restrictions prevent withdrawal".into()) + Err(Error::::LiquidityRestrictions.into()) } } @@ -928,31 +951,22 @@ where let to_balance = Self::free_balance(dest); let would_create = to_balance.is_zero(); let fee = if would_create { T::CreationFee::get() } else { T::TransferFee::get() }; - let liability = match value.checked_add(&fee) { - Some(l) => l, - None => Err("got overflow after adding a fee to value")?, - }; + let liability = value.checked_add(&fee).ok_or(Error::::Overflow)?; + let new_from_balance = from_balance.checked_sub(&liability).ok_or(Error::::InsufficientBalance)?; - let new_from_balance = match from_balance.checked_sub(&liability) { - None => Err("balance too low to send value")?, - Some(b) => b, - }; if would_create && value < T::ExistentialDeposit::get() { - Err("value too low to create account")? + Err(Error::::ExistentialDeposit)? } Self::ensure_can_withdraw(transactor, value, WithdrawReason::Transfer.into(), new_from_balance)?; // NOTE: total stake being stored in the same type means that this could never overflow // but better to be safe than sorry. - let new_to_balance = match to_balance.checked_add(&value) { - Some(b) => b, - None => Err("destination balance too high to receive value")?, - }; + let new_to_balance = to_balance.checked_add(&value).ok_or(Error::::Overflow)?; if transactor != dest { if existence_requirement == ExistenceRequirement::KeepAlive { if new_from_balance < Self::minimum_balance() { - Err("transfer would kill account")? + Err(Error::::KeepAlive)? } } @@ -1026,7 +1040,7 @@ where value: Self::Balance ) -> result::Result { if Self::total_balance(who).is_zero() { - Err("beneficiary account must pre-exist")? + Err(Error::::DeadAccount)? } Self::set_free_balance(who, Self::free_balance(who) + value); Ok(PositiveImbalance::new(value)) @@ -1143,7 +1157,7 @@ where value: Self::Balance, ) -> result::Result { if Self::total_balance(beneficiary).is_zero() { - Err("beneficiary account must pre-exist")? + Err(Error::::DeadAccount)? } let b = Self::reserved_balance(slashed); let slash = cmp::min(b, value); diff --git a/frame/balances/src/mock.rs b/frame/balances/src/mock.rs index c54165d6ec..f5664be7e8 100644 --- a/frame/balances/src/mock.rs +++ b/frame/balances/src/mock.rs @@ -27,7 +27,7 @@ use crate::{GenesisConfig, Module, Trait}; use frame_system as system; impl_outer_origin!{ - pub enum Origin for Runtime {} + pub enum Origin for Test {} } thread_local! { @@ -53,14 +53,14 @@ impl Get for CreationFee { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug)] -pub struct Runtime; +pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: Weight = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::one(); } -impl frame_system::Trait for Runtime { +impl frame_system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; @@ -82,15 +82,15 @@ parameter_types! { pub const TransactionBaseFee: u64 = 0; pub const TransactionByteFee: u64 = 1; } -impl pallet_transaction_payment::Trait for Runtime { - type Currency = Module; +impl pallet_transaction_payment::Trait for Test { + type Currency = Module; type OnTransactionPayment = (); type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; type WeightToFee = ConvertInto; type FeeMultiplierUpdate = (); } -impl Trait for Runtime { +impl Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); type OnNewAccount = (); @@ -152,8 +152,8 @@ impl ExtBuilder { } pub fn build(self) -> sp_io::TestExternalities { self.set_associated_consts(); - let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - GenesisConfig:: { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig:: { balances: if self.monied { vec![ (1, 10 * self.existential_deposit), @@ -179,10 +179,10 @@ impl ExtBuilder { } } -pub type System = frame_system::Module; -pub type Balances = Module; +pub type System = frame_system::Module; +pub type Balances = Module; -pub const CALL: &::Call = &(); +pub const CALL: &::Call = &(); /// create a transaction info struct from weight. Handy to avoid building the whole struct. pub fn info_from_weight(w: Weight) -> DispatchInfo { diff --git a/frame/balances/src/tests.rs b/frame/balances/src/tests.rs index fe0df11b3a..d5cf35a212 100644 --- a/frame/balances/src/tests.rs +++ b/frame/balances/src/tests.rs @@ -17,7 +17,7 @@ //! Tests for the module. use super::*; -use mock::{Balances, ExtBuilder, Runtime, System, info_from_weight, CALL}; +use mock::{Balances, ExtBuilder, Test, System, info_from_weight, CALL}; use sp_runtime::traits::{SignedExtension, BadOrigin}; use frame_support::{ assert_noop, assert_ok, assert_err, @@ -38,7 +38,7 @@ fn basic_locking_should_work() { Balances::set_lock(ID_1, &1, 9, u64::max_value(), WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 5, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); }); } @@ -94,17 +94,17 @@ fn lock_value_extension_should_work() { Balances::set_lock(ID_1, &1, 5, u64::max_value(), WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); Balances::extend_lock(ID_1, &1, 2, u64::max_value(), WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); Balances::extend_lock(ID_1, &1, 8, u64::max_value(), WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 3, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); }); } @@ -119,11 +119,11 @@ fn lock_reasons_should_work() { Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Transfer.into()); assert_noop!( >::transfer(&1, &2, 1, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); assert_ok!(>::reserve(&1, 1)); // NOTE: this causes a fee payment. - assert!( as SignedExtension>::pre_dispatch( + assert!( as SignedExtension>::pre_dispatch( ChargeTransactionPayment::from(1), &1, CALL, @@ -135,9 +135,9 @@ fn lock_reasons_should_work() { assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); assert_noop!( >::reserve(&1, 1), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); - assert!( as SignedExtension>::pre_dispatch( + assert!( as SignedExtension>::pre_dispatch( ChargeTransactionPayment::from(1), &1, CALL, @@ -148,7 +148,7 @@ fn lock_reasons_should_work() { Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::TransactionPayment.into()); assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); assert_ok!(>::reserve(&1, 1)); - assert!( as SignedExtension>::pre_dispatch( + assert!( as SignedExtension>::pre_dispatch( ChargeTransactionPayment::from(1), &1, CALL, @@ -164,7 +164,7 @@ fn lock_block_number_should_work() { Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 1, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); System::set_block_number(2); @@ -178,18 +178,18 @@ fn lock_block_number_extension_should_work() { Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); Balances::extend_lock(ID_1, &1, 10, 1, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); System::set_block_number(2); Balances::extend_lock(ID_1, &1, 10, 8, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 3, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); }); } @@ -200,17 +200,17 @@ fn lock_reasons_extension_should_work() { Balances::set_lock(ID_1, &1, 10, 10, WithdrawReason::Transfer.into()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReasons::none()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReason::Reserve.into()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), - "account liquidity restrictions prevent withdrawal" + Error::::LiquidityRestrictions ); }); } @@ -227,7 +227,7 @@ fn default_indexing_on_new_accounts_should_not_work2() { // ext_deposit is 10, value is 9, not satisfies for ext_deposit assert_noop!( Balances::transfer(Some(1).into(), 5, 9), - "value too low to create account", + Error::::ExistentialDeposit, ); assert_eq!(Balances::is_dead_account(&5), true); // account 5 should not exist assert_eq!(Balances::free_balance(&1), 100); @@ -277,7 +277,7 @@ fn reward_should_work() { assert_eq!(Balances::total_balance(&1), 10); assert_ok!(Balances::deposit_into_existing(&1, 10).map(drop)); assert_eq!(Balances::total_balance(&1), 20); - assert_eq!(>::get(), 120); + assert_eq!(>::get(), 120); }); } @@ -379,7 +379,7 @@ fn balance_transfer_when_reserved_should_not_work() { assert_ok!(Balances::reserve(&1, 69)); assert_noop!( Balances::transfer(Some(1).into(), 2, 69), - "balance too low to send value", + Error::::InsufficientBalance, ); }); } @@ -412,7 +412,7 @@ fn slashing_balance_should_work() { assert!(Balances::slash(&1, 69).1.is_zero()); assert_eq!(Balances::free_balance(&1), 0); assert_eq!(Balances::reserved_balance(&1), 42); - assert_eq!(>::get(), 42); + assert_eq!(>::get(), 42); }); } @@ -424,7 +424,7 @@ fn slashing_incomplete_balance_should_work() { assert_eq!(Balances::slash(&1, 69).1, 27); assert_eq!(Balances::free_balance(&1), 0); assert_eq!(Balances::reserved_balance(&1), 0); - assert_eq!(>::get(), 0); + assert_eq!(>::get(), 0); }); } @@ -447,7 +447,7 @@ fn slashing_reserved_balance_should_work() { assert_eq!(Balances::slash_reserved(&1, 42).1, 0); assert_eq!(Balances::reserved_balance(&1), 69); assert_eq!(Balances::free_balance(&1), 0); - assert_eq!(>::get(), 69); + assert_eq!(>::get(), 69); }); } @@ -459,7 +459,7 @@ fn slashing_incomplete_reserved_balance_should_work() { assert_eq!(Balances::slash_reserved(&1, 69).1, 27); assert_eq!(Balances::free_balance(&1), 69); assert_eq!(Balances::reserved_balance(&1), 0); - assert_eq!(>::get(), 69); + assert_eq!(>::get(), 69); }); } @@ -482,7 +482,7 @@ fn transferring_reserved_balance_to_nonexistent_should_fail() { ExtBuilder::default().build().execute_with(|| { let _ = Balances::deposit_creating(&1, 111); assert_ok!(Balances::reserve(&1, 111)); - assert_noop!(Balances::repatriate_reserved(&1, &2, 42), "beneficiary account must pre-exist"); + assert_noop!(Balances::repatriate_reserved(&1, &2, 42), Error::::DeadAccount); }); } @@ -503,12 +503,12 @@ fn transferring_incomplete_reserved_balance_should_work() { #[test] fn transferring_too_high_value_should_not_panic() { ExtBuilder::default().build().execute_with(|| { - >::insert(1, u64::max_value()); - >::insert(2, 1); + >::insert(1, u64::max_value()); + >::insert(2, 1); assert_err!( Balances::transfer(Some(1).into(), 2, u64::max_value()), - "destination balance too high to receive value", + Error::::Overflow, ); assert_eq!(Balances::free_balance(&1), u64::max_value()); @@ -520,12 +520,12 @@ fn transferring_too_high_value_should_not_panic() { fn account_create_on_free_too_low_with_other() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { let _ = Balances::deposit_creating(&1, 100); - assert_eq!(>::get(), 100); + assert_eq!(>::get(), 100); // No-op. let _ = Balances::deposit_creating(&2, 50); assert_eq!(Balances::free_balance(&2), 0); - assert_eq!(>::get(), 100); + assert_eq!(>::get(), 100); }) } @@ -536,14 +536,14 @@ fn account_create_on_free_too_low() { // No-op. let _ = Balances::deposit_creating(&2, 50); assert_eq!(Balances::free_balance(&2), 0); - assert_eq!(>::get(), 0); + assert_eq!(>::get(), 0); }) } #[test] fn account_removal_on_free_too_low() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { - assert_eq!(>::get(), 0); + assert_eq!(>::get(), 0); // Setup two accounts with free balance above the existential threshold. let _ = Balances::deposit_creating(&1, 110); @@ -551,7 +551,7 @@ fn account_removal_on_free_too_low() { assert_eq!(Balances::free_balance(&1), 110); assert_eq!(Balances::free_balance(&2), 110); - assert_eq!(>::get(), 220); + assert_eq!(>::get(), 220); // Transfer funds from account 1 of such amount that after this transfer // the balance of account 1 will be below the existential threshold. @@ -563,7 +563,7 @@ fn account_removal_on_free_too_low() { assert_eq!(Balances::free_balance(&2), 130); // Verify that TotalIssuance tracks balance removal when free balance is too low. - assert_eq!(>::get(), 130); + assert_eq!(>::get(), 130); }); } @@ -575,7 +575,7 @@ fn transfer_overflow_isnt_exploitable() { assert_err!( Balances::transfer(Some(1).into(), 5, evil_value), - "got overflow after adding a fee to value", + Error::::Overflow, ); }); } @@ -656,7 +656,7 @@ fn unvested_balance_should_not_transfer() { assert_eq!(Balances::vesting_balance(&1), 45); assert_noop!( Balances::transfer(Some(1).into(), 2, 56), - "vesting balance too high to send value", + Error::::VestingBalance, ); // Account 1 cannot send more than vested amount }); } @@ -751,7 +751,7 @@ fn transfer_keep_alive_works() { let _ = Balances::deposit_creating(&1, 100); assert_err!( Balances::transfer_keep_alive(Some(1).into(), 2, 100), - "transfer would kill account" + Error::::KeepAlive ); assert_eq!(Balances::is_dead_account(&1), false); assert_eq!(Balances::total_balance(&1), 100); @@ -763,8 +763,8 @@ fn transfer_keep_alive_works() { #[should_panic="the balance of any account should always be more than existential deposit."] fn cannot_set_genesis_value_below_ed() { mock::EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = 11); - let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - let _ = GenesisConfig:: { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + let _ = GenesisConfig:: { balances: vec![(1, 10)], vesting: vec![], }.assimilate_storage(&mut t).unwrap(); diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 2acbe28a0a..f8cdd27059 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -784,7 +784,7 @@ decl_event!( ); decl_error! { - /// Error for the stacking module. + /// Error for the staking module. pub enum Error for Module { /// Not a controller account. NotController, diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 109f2e086f..9bb10610a0 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -20,7 +20,11 @@ use super::*; use mock::*; use sp_runtime::{assert_eq_error_rate, traits::{OnInitialize, BadOrigin}}; use sp_staking::offence::OffenceDetails; -use frame_support::{assert_ok, assert_noop, traits::{Currency, ReservableCurrency}}; +use frame_support::{ + assert_ok, assert_noop, + traits::{Currency, ReservableCurrency}, + dispatch::DispatchError, +}; use substrate_test_utils::assert_eq_uvec; #[test] @@ -32,7 +36,11 @@ fn force_unstake_works() { // Cant transfer assert_noop!( Balances::transfer(Origin::signed(11), 1, 10), - "account liquidity restrictions prevent withdrawal" + DispatchError::Module { + index: 0, + error: 1, + message: Some("LiquidityRestrictions"), + } ); // Force unstake requires root. assert_noop!(Staking::force_unstake(Origin::signed(11), 11), BadOrigin); @@ -326,7 +334,14 @@ fn staking_should_work() { Some(StakingLedger { stash: 3, total: 1500, active: 1500, unlocking: vec![] }) ); // e.g. it cannot spend more than 500 that it has free from the total 2000 - assert_noop!(Balances::reserve(&3, 501), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + Balances::reserve(&3, 501), + DispatchError::Module { + index: 0, + error: 1, + message: Some("LiquidityRestrictions"), + } + ); assert_ok!(Balances::reserve(&3, 409)); }); } @@ -817,7 +832,11 @@ fn cannot_transfer_staked_balance() { // Confirm account 11 cannot transfer as a result assert_noop!( Balances::transfer(Origin::signed(11), 20, 1), - "account liquidity restrictions prevent withdrawal", + DispatchError::Module { + index: 0, + error: 1, + message: Some("LiquidityRestrictions"), + } ); // Give account 11 extra free balance @@ -842,7 +861,11 @@ fn cannot_transfer_staked_balance_2() { // Confirm account 21 can transfer at most 1000 assert_noop!( Balances::transfer(Origin::signed(21), 20, 1001), - "account liquidity restrictions prevent withdrawal", + DispatchError::Module { + index: 0, + error: 1, + message: Some("LiquidityRestrictions"), + } ); assert_ok!(Balances::transfer(Origin::signed(21), 20, 1000)); }); @@ -859,7 +882,14 @@ fn cannot_reserve_staked_balance() { // Confirm account 11 (via controller 10) is totally staked assert_eq!(Staking::stakers(&11).own, 1000); // Confirm account 11 cannot transfer as a result - assert_noop!(Balances::reserve(&11, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + Balances::reserve(&11, 1), + DispatchError::Module { + index: 0, + error: 1, + message: Some("LiquidityRestrictions"), + } + ); // Give account 11 extra free balance let _ = Balances::make_free_balance_be(&11, 10000); -- GitLab From 8a70cde829bdb411f99c91ea6bf35ec612bd07f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 20 Dec 2019 12:36:55 +0100 Subject: [PATCH 005/296] Subkey add support for interactive password (#4465) * Subkey add support for interactive password * Support inserting the URI from tty as well --- Cargo.lock | 1 + bin/utils/subkey/Cargo.toml | 1 + bin/utils/subkey/src/main.rs | 31 +++++++++++++++++++++++++------ client/cli/Cargo.toml | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 46d59553a4..f34bc4686d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6675,6 +6675,7 @@ dependencies = [ "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-runtime 2.0.0", diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index ca3519ae27..2fcd2aa473 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -20,6 +20,7 @@ codec = { package = "parity-scale-codec", version = "1.0.0" } frame-system = { version = "2.0.0", path = "../../../frame/system" } pallet-balances = { version = "2.0.0", path = "../../../frame/balances" } pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transaction-payment" } +rpassword = "4.0.1" [features] bench = [] diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index 10a2e13170..e89e0466ea 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -167,6 +167,7 @@ fn get_app<'a, 'b>() -> App<'a, 'b> { [network] -n, --network 'Specify a network. One of substrate \ (default), polkadot, kusama, dothereum, edgeware, or kulupu' [password] -p, --password 'The password for the key' + --password-interactive 'You will be prompted for the password for the key.' ") .subcommands(vec![ SubCommand::with_name("generate") @@ -177,8 +178,9 @@ fn get_app<'a, 'b>() -> App<'a, 'b> { "), SubCommand::with_name("inspect") .about("Gets a public key and a SS58 address from the provided Secret URI") - .args_from_usage(" 'A Key URI to be inspected. May be a secret seed, \ - secret URI (with derivation paths and password), SS58 or public URI.' + .args_from_usage("[uri] 'A Key URI to be inspected. May be a secret seed, \ + secret URI (with derivation paths and password), SS58 or public URI. \ + If not given, you will be prompted for the URI.' "), SubCommand::with_name("sign") .about("Sign a message, provided on STDIN, with a given (secret) key") @@ -240,7 +242,21 @@ where SignatureOf: SignatureT, PublicOf: PublicT, { + let password_interactive = matches.is_present("password-interactive"); let password = matches.value_of("password"); + + let password = if password.is_some() && password_interactive { + panic!("`--password` given and `--password-interactive` selected!"); + } else if password_interactive { + Some( + rpassword::read_password_from_tty(Some("Key password: ")) + .expect("Reads password from tty") + ) + } else { + password.map(Into::into) + }; + let password = password.as_ref().map(String::as_str); + let maybe_network: Option = matches.value_of("network").map(|network| { network .try_into() @@ -255,10 +271,13 @@ where C::print_from_uri(mnemonic.phrase(), password, maybe_network); } ("inspect", Some(matches)) => { - let uri = matches - .value_of("uri") - .expect("URI parameter is required; thus it can't be None; qed"); - C::print_from_uri(uri, password, maybe_network); + let uri = match matches.value_of("uri") { + Some(uri) => uri.into(), + None => rpassword::read_password_from_tty(Some("URI: ")) + .expect("Failed to read URI"), + }; + + C::print_from_uri(&uri, password, maybe_network); } ("sign", Some(matches)) => { let should_decode = matches.is_present("hex"); diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 937135a8c3..49f327405b 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -42,5 +42,5 @@ tempfile = "3.1.0" [features] wasmtime = [ - "sc-service/wasmtime", + "sc-service/wasmtime", ] -- GitLab From 0fae69b7e7b331929d7d37e2572f263daa704b9f Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 20 Dec 2019 14:37:21 +0300 Subject: [PATCH 006/296] use multiple threads in integration tests (#4379) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7d1debb2fc..643ac7afd1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -202,7 +202,7 @@ test-linux-stable-int: - echo "___Logs will be partly shown at the end in case of failure.___" - echo "___Full log will be saved to the job artifacts only in case of failure.___" - WASM_BUILD_NO_COLOR=1 RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace - time cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 + time cargo test -p node-cli --release --verbose --locked -- --ignored &> ${CI_COMMIT_SHORT_SHA}_int_failure.log - sccache -s after_script: -- GitLab From e1713bae737aed4e10563d583444643fcca75efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 20 Dec 2019 14:47:19 +0100 Subject: [PATCH 007/296] Fix warnings and make CI working again (#4469) * Fix warnings and make CI working again * Fix test --- Cargo.lock | 6 +- client/authority-discovery/src/lib.rs | 2 +- client/finality-grandpa/src/tests.rs | 2 +- client/src/light/backend.rs | 2 +- frame/support/src/dispatch.rs | 6 +- frame/support/src/error.rs | 2 +- frame/support/test/tests/decl_storage.rs | 4 +- primitives/runtime-interface/test/src/lib.rs | 73 ++++++++++---------- primitives/runtime/Cargo.toml | 2 +- 9 files changed, 50 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f34bc4686d..f68ae16202 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4121,13 +4121,13 @@ dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec-derive 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-scale-codec-derive" -version = "1.1.0" +version = "1.1.1" 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)", @@ -8381,7 +8381,7 @@ dependencies = [ "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" "checksum parity-multihash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c70cad855872dd51ce6679e823efb6434061a2c1782a1686438aabf506392cdd" "checksum parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f9f9d99dae413590a5f37e43cd99b94d4e62a244160562899126913ea7108673" -"checksum parity-scale-codec-derive 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "492ac3aa93d6caa5d20e4e3e0b75d08e2dcd9dd8a50d19529548b6fe11b3f295" +"checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "570093f39f786beea92dcc09e45d8aae7841516ac19a50431953ac82a0e8f85c" "checksum parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index 6ab2d899a5..d8cb074395 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -693,7 +693,7 @@ mod tests { &self, _: &BlockId, _: ExecutionContext, - _: Option<(Block)>, + _: Option, _: Vec, ) -> std::result::Result, sp_blockchain::Error> { unimplemented!("Not required for testing!") diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 7b52aad6e3..6b4d8bb681 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -225,7 +225,7 @@ impl Core for RuntimeApi { &self, _: &BlockId, _: ExecutionContext, - _: Option<(Block)>, + _: Option, _: Vec, ) -> Result> { unimplemented!("Not required for testing!") diff --git a/client/src/light/backend.rs b/client/src/light/backend.rs index f946d91b3c..e6ec2ae2cf 100644 --- a/client/src/light/backend.rs +++ b/client/src/light/backend.rs @@ -62,7 +62,7 @@ pub struct ImportOperation { finalized_blocks: Vec>, set_head: Option>, storage_update: Option>, - _phantom: ::std::marker::PhantomData<(S)>, + _phantom: ::std::marker::PhantomData, } /// Either in-memory genesis state, or locally-unavailable state. diff --git a/frame/support/src/dispatch.rs b/frame/support/src/dispatch.rs index 6683aaea31..f6f42a28ca 100644 --- a/frame/support/src/dispatch.rs +++ b/frame/support/src/dispatch.rs @@ -1186,7 +1186,7 @@ macro_rules! decl_module { { #[doc(hidden)] #[codec(skip)] - __PhantomItem($crate::sp_std::marker::PhantomData<($trait_instance $(, $instance)?)>, $crate::dispatch::Never), + __PhantomItem($crate::sp_std::marker::PhantomData<($trait_instance, $($instance)?)>, $crate::dispatch::Never), $( $generated_variants )* } }; @@ -1224,7 +1224,7 @@ macro_rules! decl_module { pub struct $mod_type< $trait_instance: $trait_name $(, $instance: $instantiable $( = $module_default_instance)?)? - >($crate::sp_std::marker::PhantomData<($trait_instance $(, $instance)?)>) where + >($crate::sp_std::marker::PhantomData<($trait_instance, $( $instance)?)>) where $( $other_where_bounds )*; $crate::decl_module! { @@ -1671,7 +1671,7 @@ macro_rules! __impl_module_constants_metadata { , $const_instance: $const_instantiable )? >($crate::dispatch::marker::PhantomData< - ($const_trait_instance $(, $const_instance)?) + ($const_trait_instance, $( $const_instance)?) >); impl<$const_trait_instance: 'static + $const_trait_name $( , $const_instance: $const_instantiable)? diff --git a/frame/support/src/error.rs b/frame/support/src/error.rs index 0120b6da60..5461dfaeb7 100644 --- a/frame/support/src/error.rs +++ b/frame/support/src/error.rs @@ -86,7 +86,7 @@ macro_rules! decl_error { pub enum $error<$generic: $trait $(, $inst_generic: $instance)?> { #[doc(hidden)] __Ignore( - $crate::sp_std::marker::PhantomData<($generic $(, $inst_generic)?)>, + $crate::sp_std::marker::PhantomData<($generic, $( $inst_generic)?)>, $crate::dispatch::Never, ), $( diff --git a/frame/support/test/tests/decl_storage.rs b/frame/support/test/tests/decl_storage.rs index e12799f479..86d351ad6e 100644 --- a/frame/support/test/tests/decl_storage.rs +++ b/frame/support/test/tests/decl_storage.rs @@ -79,7 +79,7 @@ mod tests { COMPLEXTYPE1: ::std::vec::Vec<::Origin>; COMPLEXTYPE2: (Vec)>>, u32); - COMPLEXTYPE3: ([u32;25]); + COMPLEXTYPE3: [u32;25]; } add_extra_genesis { build(|_| {}); @@ -430,7 +430,7 @@ mod tests { StorageEntryMetadata { name: DecodeDifferent::Encode("COMPLEXTYPE3"), modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("([u32; 25])")), + ty: StorageEntryType::Plain(DecodeDifferent::Encode("[u32; 25]")), default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructCOMPLEXTYPE3(PhantomData::)) ), diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index a791442fc4..fb3d10b023 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -15,6 +15,7 @@ // along with Substrate. If not, see . //! Integration tests for runtime interface primitives +#![cfg(test)] use sp_runtime_interface::*; use sp_runtime_interface_test_wasm::{WASM_BINARY, test_api::HostFunctions}; @@ -23,85 +24,85 @@ use sp_wasm_interface::HostFunctions as HostFunctionsT; type TestExternalities = sp_state_machine::TestExternalities; fn call_wasm_method(method: &str) -> TestExternalities { - let mut ext = TestExternalities::default(); - let mut ext_ext = ext.ext(); - - sc_executor::call_in_wasm::< - _, - ( - HF, - sp_io::SubstrateHostFunctions, - sc_executor::deprecated_host_interface::SubstrateExternals - ) - >( - method, - &[], - sc_executor::WasmExecutionMethod::Interpreted, - &mut ext_ext, - &WASM_BINARY[..], - 8, - ).expect(&format!("Executes `{}`", method)); - - ext + let mut ext = TestExternalities::default(); + let mut ext_ext = ext.ext(); + + sc_executor::call_in_wasm::< + _, + ( + HF, + sp_io::SubstrateHostFunctions, + sc_executor::deprecated_host_interface::SubstrateExternals + ) + >( + method, + &[], + sc_executor::WasmExecutionMethod::Interpreted, + &mut ext_ext, + &WASM_BINARY[..], + 8, + ).expect(&format!("Executes `{}`", method)); + + ext } #[test] fn test_return_data() { - call_wasm_method::("test_return_data"); + call_wasm_method::("test_return_data"); } #[test] fn test_return_option_data() { - call_wasm_method::("test_return_option_data"); + call_wasm_method::("test_return_option_data"); } #[test] fn test_set_storage() { - let mut ext = call_wasm_method::("test_set_storage"); + let mut ext = call_wasm_method::("test_set_storage"); - let expected = "world"; - assert_eq!(expected.as_bytes(), &ext.ext().storage("hello".as_bytes()).unwrap()[..]); + let expected = "world"; + assert_eq!(expected.as_bytes(), &ext.ext().storage("hello".as_bytes()).unwrap()[..]); } #[test] fn test_return_value_into_mutable_reference() { - call_wasm_method::("test_return_value_into_mutable_reference"); + call_wasm_method::("test_return_value_into_mutable_reference"); } #[test] fn test_get_and_return_array() { - call_wasm_method::("test_get_and_return_array"); + call_wasm_method::("test_get_and_return_array"); } #[test] fn test_array_as_mutable_reference() { - call_wasm_method::("test_array_as_mutable_reference"); + call_wasm_method::("test_array_as_mutable_reference"); } #[test] fn test_return_input_public_key() { - call_wasm_method::("test_return_input_public_key"); + call_wasm_method::("test_return_input_public_key"); } #[test] #[should_panic( - expected = "Other(\"Instantiation: Export ext_test_api_return_input_version_1 not found\")" + expected = "Other(\"Instantiation: Export ext_test_api_return_input_version_1 not found\")" )] fn host_function_not_found() { - call_wasm_method::<()>("test_return_data"); + call_wasm_method::<()>("test_return_data"); } #[test] #[should_panic( - expected = - "FunctionExecution(\"ext_test_api_invalid_utf8_data_version_1\", \ - \"Invalid utf8 data provided\")" + expected = + "FunctionExecution(\"ext_test_api_invalid_utf8_data_version_1\", \ + \"Invalid utf8 data provided\")" )] fn test_invalid_utf8_data_should_return_an_error() { - call_wasm_method::("test_invalid_utf8_data_should_return_an_error"); + call_wasm_method::("test_invalid_utf8_data_should_return_an_error"); } #[test] fn test_overwrite_native_function_implementation() { - call_wasm_method::("test_overwrite_native_function_implementation"); + call_wasm_method::("test_overwrite_native_function_implementation"); } diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index 2b3829529d..2574fef4b9 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.1.0", default-features = false, features = ["derive"] } sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-application-crypto = { version = "2.0.0", default-features = false, path = "../application-crypto" } sp-arithmetic = { version = "2.0.0", default-features = false, path = "../arithmetic" } -- GitLab From 7cdf93911335dcdbe376694c2906ec32ca27fd54 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Fri, 20 Dec 2019 16:05:01 +0100 Subject: [PATCH 008/296] Shared params in CLI API (#4466) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Common shared parames getter * Expose more types from `service-builder` Co-authored-by: Bastian Köcher --- bin/node/cli/src/cli.rs | 10 ++++--- client/cli/src/lib.rs | 27 ++++++++++++++---- client/cli/src/params.rs | 53 +++-------------------------------- client/cli/src/traits.rs | 9 +++--- client/service/src/builder.rs | 12 ++++---- client/service/src/lib.rs | 5 +++- 6 files changed, 47 insertions(+), 69 deletions(-) diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 6e8afc6133..8cd8cb9f33 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -21,7 +21,7 @@ use sc_cli::{IntoExit, NoCustom, SharedParams, ImportParams, error}; use sc_service::{AbstractService, Roles as ServiceRoles, Configuration}; use log::info; use structopt::{StructOpt, clap::App}; -use sc_cli::{display_role, parse_and_prepare, AugmentClap, GetLogFilter, ParseAndPrepare}; +use sc_cli::{display_role, parse_and_prepare, AugmentClap, GetSharedParams, ParseAndPrepare}; use crate::{service, ChainSpec, load_spec}; use crate::factory_impl::FactoryState; use node_transaction_factory::RuntimeAdapter; @@ -38,9 +38,11 @@ pub enum CustomSubcommands { Factory(FactoryCmd), } -impl GetLogFilter for CustomSubcommands { - fn get_log_filter(&self) -> Option { - None +impl GetSharedParams for CustomSubcommands { + fn shared_params(&self) -> Option<&SharedParams> { + match self { + CustomSubcommands::Factory(cmd) => Some(&cmd.shared_params), + } } } diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 41456fc8c4..d1b3388432 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -57,7 +57,7 @@ use params::{ NodeKeyParams, NodeKeyType, Cors, CheckBlockCmd, }; pub use params::{NoCustom, CoreParams, SharedParams, ImportParams, ExecutionStrategy}; -pub use traits::{GetLogFilter, AugmentClap}; +pub use traits::{GetSharedParams, AugmentClap}; use app_dirs::{AppInfo, AppDataType}; use log::info; use lazy_static::lazy_static; @@ -195,7 +195,7 @@ pub fn parse_and_prepare<'a, CC, RP, I>( args: I, ) -> ParseAndPrepare<'a, CC, RP> where - CC: StructOpt + Clone + GetLogFilter, + CC: StructOpt + Clone + GetSharedParams, RP: StructOpt + Clone + AugmentClap, I: IntoIterator, ::Item: Into + Clone, @@ -216,10 +216,9 @@ where .setting(AppSettings::SubcommandsNegateReqs) .get_matches_from(args); let cli_args = CoreParams::::from_clap(&matches); - init_logger(cli_args.get_log_filter().as_ref().map(|v| v.as_ref()).unwrap_or("")); fdlimit::raise_fd_limit(); - match cli_args { + let args = match cli_args { params::CoreParams::Run(params) => ParseAndPrepare::Run( ParseAndPrepareRun { params, impl_name, version } ), @@ -242,7 +241,9 @@ where ParseAndPrepareRevert { params, version } ), params::CoreParams::Custom(params) => ParseAndPrepare::CustomCommand(params), - } + }; + init_logger(args.shared_params().and_then(|p| p.log.as_ref()).map(|v| v.as_ref()).unwrap_or("")); + args } /// Returns a string displaying the node role, special casing the sentry mode @@ -277,6 +278,22 @@ pub enum ParseAndPrepare<'a, CC, RP> { CustomCommand(CC), } +impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> where CC: GetSharedParams { + /// Return common set of parameters shared by all commands. + pub fn shared_params(&self) -> Option<&SharedParams> { + match self { + ParseAndPrepare::Run(c) => Some(&c.params.left.shared_params), + ParseAndPrepare::BuildSpec(c) => Some(&c.params.shared_params), + ParseAndPrepare::ExportBlocks(c) => Some(&c.params.shared_params), + ParseAndPrepare::ImportBlocks(c) => Some(&c.params.shared_params), + ParseAndPrepare::CheckBlock(c) => Some(&c.params.shared_params), + ParseAndPrepare::PurgeChain(c) => Some(&c.params.shared_params), + ParseAndPrepare::RevertChain(c) => Some(&c.params.shared_params), + ParseAndPrepare::CustomCommand(c) => c.shared_params(), + } + } +} + /// Command ready to run the main client. pub struct ParseAndPrepareRun<'a, RP> { params: MergeParameters, diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 6cb425bd74..e8d00978a8 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -14,24 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::traits::{AugmentClap, GetLogFilter}; +use crate::traits::{AugmentClap, GetSharedParams}; use std::{str::FromStr, path::PathBuf}; use structopt::{StructOpt, clap::{arg_enum, App, AppSettings, SubCommand, Arg}}; pub use crate::execution_strategy::ExecutionStrategy; -/// Auxiliary macro to implement `GetLogFilter` for all types that have the `shared_params` field. -macro_rules! impl_get_log_filter { - ( $type:ident ) => { - impl $crate::GetLogFilter for $type { - fn get_log_filter(&self) -> Option { - self.shared_params.get_log_filter() - } - } - } -} - impl Into for ExecutionStrategy { fn into(self) -> sc_client_api::ExecutionStrategy { match self { @@ -153,12 +142,6 @@ pub struct ImportParams { pub state_cache_size: usize, } -impl GetLogFilter for SharedParams { - fn get_log_filter(&self) -> Option { - self.log.clone() - } -} - /// Parameters used to create the network configuration. #[derive(Debug, StructOpt, Clone)] pub struct NetworkConfigurationParams { @@ -723,7 +706,6 @@ fn parse_cors(s: &str) -> Result> { } impl_augment_clap!(RunCmd); -impl_get_log_filter!(RunCmd); /// The `build-spec` command used to build a specification. #[derive(Debug, StructOpt, Clone)] @@ -748,8 +730,6 @@ pub struct BuildSpecCmd { pub node_key_params: NodeKeyParams, } -impl_get_log_filter!(BuildSpecCmd); - /// Wrapper type of `String` which holds an arbitary sized unsigned integer formatted as decimal. #[derive(Debug, Clone)] pub struct BlockNumber(String); @@ -813,8 +793,6 @@ pub struct ExportBlocksCmd { pub shared_params: SharedParams, } -impl_get_log_filter!(ExportBlocksCmd); - /// The `import-blocks` command used to import blocks. #[derive(Debug, StructOpt, Clone)] pub struct ImportBlocksCmd { @@ -837,8 +815,6 @@ pub struct ImportBlocksCmd { pub import_params: ImportParams, } -impl_get_log_filter!(ImportBlocksCmd); - /// The `check-block` command used to validate blocks. #[derive(Debug, StructOpt, Clone)] pub struct CheckBlockCmd { @@ -861,8 +837,6 @@ pub struct CheckBlockCmd { pub import_params: ImportParams, } -impl_get_log_filter!(CheckBlockCmd); - /// The `revert` command used revert the chain to a previous state. #[derive(Debug, StructOpt, Clone)] pub struct RevertCmd { @@ -875,8 +849,6 @@ pub struct RevertCmd { pub shared_params: SharedParams, } -impl_get_log_filter!(RevertCmd); - /// The `purge-chain` command used to remove the whole chain. #[derive(Debug, StructOpt, Clone)] pub struct PurgeChainCmd { @@ -889,8 +861,6 @@ pub struct PurgeChainCmd { pub shared_params: SharedParams, } -impl_get_log_filter!(PurgeChainCmd); - /// All core commands that are provided by default. /// /// The core commands are split into multiple subcommands and `Run` is the default subcommand. From @@ -924,7 +894,7 @@ pub enum CoreParams { } impl StructOpt for CoreParams where - CC: StructOpt + GetLogFilter, + CC: StructOpt + GetSharedParams, RP: StructOpt + AugmentClap { fn clap<'a, 'b>() -> App<'a, 'b> { @@ -979,21 +949,6 @@ impl StructOpt for CoreParams where } } -impl GetLogFilter for CoreParams where CC: GetLogFilter { - fn get_log_filter(&self) -> Option { - match self { - CoreParams::Run(c) => c.left.get_log_filter(), - CoreParams::BuildSpec(c) => c.get_log_filter(), - CoreParams::ExportBlocks(c) => c.get_log_filter(), - CoreParams::ImportBlocks(c) => c.get_log_filter(), - CoreParams::CheckBlock(c) => c.get_log_filter(), - CoreParams::PurgeChain(c) => c.get_log_filter(), - CoreParams::Revert(c) => c.get_log_filter(), - CoreParams::Custom(c) => c.get_log_filter(), - } - } -} - /// A special commandline parameter that expands to nothing. /// Should be used as custom subcommand/run arguments if no custom values are required. #[derive(Clone, Debug, Default)] @@ -1015,8 +970,8 @@ impl AugmentClap for NoCustom { } } -impl GetLogFilter for NoCustom { - fn get_log_filter(&self) -> Option { +impl GetSharedParams for NoCustom { + fn shared_params(&self) -> Option<&SharedParams> { None } } diff --git a/client/cli/src/traits.rs b/client/cli/src/traits.rs index 0f8d247e49..dddba0b25a 100644 --- a/client/cli/src/traits.rs +++ b/client/cli/src/traits.rs @@ -15,6 +15,7 @@ // along with Substrate. If not, see . use structopt::{StructOpt, clap::App}; +use crate::params::SharedParams; /// Something that can augment a clap app with further parameters. /// `derive(StructOpt)` is implementing this function by default, so a macro `impl_augment_clap!` @@ -37,8 +38,8 @@ macro_rules! impl_augment_clap { } } -/// Returns the log filter given by the user as commandline argument. -pub trait GetLogFilter { - /// Returns the set log filter. - fn get_log_filter(&self) -> Option; +/// Supports getting common params. +pub trait GetSharedParams { + /// Returns shared params if any. + fn shared_params(&self) -> Option<&SharedParams>; } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 713b873ff9..9b5afe957a 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -95,7 +95,7 @@ pub struct ServiceBuilder = Client< +pub type TFullClient = Client< TFullBackend, TFullCallExecutor, TBl, @@ -103,16 +103,16 @@ type TFullClient = Client< >; /// Full client backend type. -type TFullBackend = sc_client_db::Backend; +pub type TFullBackend = sc_client_db::Backend; /// Full client call executor type. -type TFullCallExecutor = sc_client::LocalCallExecutor< +pub type TFullCallExecutor = sc_client::LocalCallExecutor< sc_client_db::Backend, NativeExecutor, >; /// Light client type. -type TLightClient = Client< +pub type TLightClient = Client< TLightBackend, TLightCallExecutor, TBl, @@ -120,13 +120,13 @@ type TLightClient = Client< >; /// Light client backend type. -type TLightBackend = sc_client::light::backend::Backend< +pub type TLightBackend = sc_client::light::backend::Backend< sc_client_db::light::LightStorage, Blake2Hasher, >; /// Light call executor type. -type TLightCallExecutor = sc_client::light::call_executor::GenesisCallExecutor< +pub type TLightCallExecutor = sc_client::light::call_executor::GenesisCallExecutor< sc_client::light::backend::Backend< sc_client_db::light::LightStorage, Blake2Hasher diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 757d3b0bf6..d9dc9bd004 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -53,7 +53,10 @@ use sp_runtime::generic::BlockId; use sp_runtime::traits::{NumberFor, Block as BlockT}; pub use self::error::Error; -pub use self::builder::{ServiceBuilder, ServiceBuilderCommand}; +pub use self::builder::{ + ServiceBuilder, ServiceBuilderCommand, TFullClient, TLightClient, TFullBackend, TLightBackend, + TFullCallExecutor, TLightCallExecutor, +}; pub use config::{Configuration, Roles, PruningMode}; pub use sc_chain_spec::{ChainSpec, Properties, RuntimeGenesis, Extension as ChainSpecExtension}; pub use sp_transaction_pool::{TransactionPool, TransactionPoolMaintainer, InPoolTransaction, error::IntoPoolError}; -- GitLab From 9e2a022f114eec8730c307a574e319fa8523865f Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Fri, 20 Dec 2019 18:12:21 +0200 Subject: [PATCH 009/296] Migrate membership, nicks, scored-pool and session to decl_error (#4463) * Migrate membership, nicks, scored-pool and session to decl_error * Fix tests * Update frame/scored-pool/src/tests.rs Co-Authored-By: Shawn Tabrizi * Remove InsufficientBalance error from scored-pool * Replace Error:: with Error:: Co-authored-by: Shawn Tabrizi --- frame/membership/src/lib.rs | 58 +++++++++++++++++++--------------- frame/nicks/src/lib.rs | 44 ++++++++++++++++---------- frame/scored-pool/src/lib.rs | 35 +++++++++++++------- frame/scored-pool/src/tests.rs | 25 +++++++-------- frame/session/src/lib.rs | 25 +++++++++++---- frame/staking/src/lib.rs | 5 +-- frame/treasury/src/lib.rs | 4 +-- 7 files changed, 115 insertions(+), 81 deletions(-) diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index 0a7f8ec7fc..3a65f1604e 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -24,7 +24,7 @@ use sp_std::prelude::*; use frame_support::{ - decl_module, decl_storage, decl_event, + decl_module, decl_storage, decl_event, decl_error, traits::{ChangeMembers, InitializeMembers}, weights::SimpleDispatchInfo, }; @@ -93,6 +93,16 @@ decl_event!( } ); +decl_error! { + /// Error for the nicks module. + pub enum Error for Module, I: Instance> { + /// Already a member. + AlreadyMember, + /// Not a member. + NotMember, + } +} + decl_module! { pub struct Module, I: Instance=DefaultInstance> for enum Call @@ -107,11 +117,10 @@ decl_module! { fn add_member(origin, who: T::AccountId) { T::AddOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; let mut members = >::get(); - let location = members.binary_search(&who).err().ok_or("already a member")?; + let location = members.binary_search(&who).err().ok_or(Error::::AlreadyMember)?; members.insert(location, who.clone()); >::put(&members); @@ -127,11 +136,10 @@ decl_module! { fn remove_member(origin, who: T::AccountId) { T::RemoveOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; let mut members = >::get(); - let location = members.binary_search(&who).ok().ok_or("not a member")?; + let location = members.binary_search(&who).ok().ok_or(Error::::NotMember)?; members.remove(location); >::put(&members); @@ -147,14 +155,13 @@ decl_module! { fn swap_member(origin, remove: T::AccountId, add: T::AccountId) { T::SwapOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; if remove == add { return Ok(()) } let mut members = >::get(); - let location = members.binary_search(&remove).ok().ok_or("not a member")?; - let _ = members.binary_search(&add).err().ok_or("already a member")?; + let location = members.binary_search(&remove).ok().ok_or(Error::::NotMember)?; + let _ = members.binary_search(&add).err().ok_or(Error::::AlreadyMember)?; members[location] = add.clone(); members.sort(); >::put(&members); @@ -176,8 +183,7 @@ decl_module! { fn reset_members(origin, members: Vec) { T::ResetOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; let mut members = members; members.sort(); @@ -198,8 +204,8 @@ decl_module! { if remove != new { let mut members = >::get(); - let location = members.binary_search(&remove).ok().ok_or("not a member")?; - let _ = members.binary_search(&new).err().ok_or("already a member")?; + let location = members.binary_search(&remove).ok().ok_or(Error::::NotMember)?; + let _ = members.binary_search(&new).err().ok_or(Error::::AlreadyMember)?; members[location] = new.clone(); members.sort(); >::put(&members); @@ -225,7 +231,7 @@ mod tests { use sp_core::H256; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. - use sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header, traits::BadOrigin}; use frame_system::EnsureSignedBy; impl_outer_origin! { @@ -328,8 +334,8 @@ mod tests { #[test] fn add_member_works() { new_test_ext().execute_with(|| { - assert_noop!(Membership::add_member(Origin::signed(5), 15), "bad origin"); - assert_noop!(Membership::add_member(Origin::signed(1), 10), "already a member"); + assert_noop!(Membership::add_member(Origin::signed(5), 15), BadOrigin); + assert_noop!(Membership::add_member(Origin::signed(1), 10), Error::::AlreadyMember); assert_ok!(Membership::add_member(Origin::signed(1), 15)); assert_eq!(Membership::members(), vec![10, 15, 20, 30]); assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); @@ -339,8 +345,8 @@ mod tests { #[test] fn remove_member_works() { new_test_ext().execute_with(|| { - assert_noop!(Membership::remove_member(Origin::signed(5), 20), "bad origin"); - assert_noop!(Membership::remove_member(Origin::signed(2), 15), "not a member"); + assert_noop!(Membership::remove_member(Origin::signed(5), 20), BadOrigin); + assert_noop!(Membership::remove_member(Origin::signed(2), 15), Error::::NotMember); assert_ok!(Membership::remove_member(Origin::signed(2), 20)); assert_eq!(Membership::members(), vec![10, 30]); assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); @@ -350,9 +356,9 @@ mod tests { #[test] fn swap_member_works() { new_test_ext().execute_with(|| { - assert_noop!(Membership::swap_member(Origin::signed(5), 10, 25), "bad origin"); - assert_noop!(Membership::swap_member(Origin::signed(3), 15, 25), "not a member"); - assert_noop!(Membership::swap_member(Origin::signed(3), 10, 30), "already a member"); + assert_noop!(Membership::swap_member(Origin::signed(5), 10, 25), BadOrigin); + assert_noop!(Membership::swap_member(Origin::signed(3), 15, 25), Error::::NotMember); + assert_noop!(Membership::swap_member(Origin::signed(3), 10, 30), Error::::AlreadyMember); assert_ok!(Membership::swap_member(Origin::signed(3), 20, 20)); assert_eq!(Membership::members(), vec![10, 20, 30]); assert_ok!(Membership::swap_member(Origin::signed(3), 10, 25)); @@ -373,8 +379,8 @@ mod tests { #[test] fn change_key_works() { new_test_ext().execute_with(|| { - assert_noop!(Membership::change_key(Origin::signed(3), 25), "not a member"); - assert_noop!(Membership::change_key(Origin::signed(10), 20), "already a member"); + assert_noop!(Membership::change_key(Origin::signed(3), 25), Error::::NotMember); + assert_noop!(Membership::change_key(Origin::signed(10), 20), Error::::AlreadyMember); assert_ok!(Membership::change_key(Origin::signed(10), 40)); assert_eq!(Membership::members(), vec![20, 30, 40]); assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); @@ -393,7 +399,7 @@ mod tests { #[test] fn reset_members_works() { new_test_ext().execute_with(|| { - assert_noop!(Membership::reset_members(Origin::signed(1), vec![20, 40, 30]), "bad origin"); + assert_noop!(Membership::reset_members(Origin::signed(1), vec![20, 40, 30]), BadOrigin); assert_ok!(Membership::reset_members(Origin::signed(4), vec![20, 40, 30])); assert_eq!(Membership::members(), vec![20, 30, 40]); assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index d2f0b4d8c9..f407c4aad0 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -43,7 +43,7 @@ use sp_runtime::{ traits::{StaticLookup, EnsureOrigin, Zero} }; use frame_support::{ - decl_module, decl_event, decl_storage, ensure, + decl_module, decl_event, decl_storage, ensure, decl_error, traits::{Currency, ReservableCurrency, OnUnbalanced, Get}, weights::SimpleDispatchInfo, }; @@ -97,9 +97,23 @@ decl_event!( } ); +decl_error! { + /// Error for the nicks module. + pub enum Error for Module { + /// A name is too short. + TooShort, + /// A name is too long. + TooLong, + /// An account in't named. + Unnamed, + } +} + decl_module! { // Simple declaration of the `Module` type. Lets the macro know what it's working on. pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + fn deposit_event() = default; /// Reservation fee. @@ -131,8 +145,8 @@ decl_module! { fn set_name(origin, name: Vec) { let sender = ensure_signed(origin)?; - ensure!(name.len() >= T::MinLength::get(), "Name too short"); - ensure!(name.len() <= T::MaxLength::get(), "Name too long"); + ensure!(name.len() >= T::MinLength::get(), Error::::TooShort,); + ensure!(name.len() <= T::MaxLength::get(), Error::::TooLong); let deposit = if let Some((_, deposit)) = >::get(&sender) { Self::deposit_event(RawEvent::NameSet(sender.clone())); @@ -160,7 +174,7 @@ decl_module! { fn clear_name(origin) { let sender = ensure_signed(origin)?; - let deposit = >::take(&sender).ok_or("Not named")?.1; + let deposit = >::take(&sender).ok_or(Error::::Unnamed)?.1; let _ = T::Currency::unreserve(&sender, deposit.clone()); @@ -184,13 +198,12 @@ decl_module! { fn kill_name(origin, target: ::Source) { T::ForceOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; // Figure out who we're meant to be clearing. let target = T::Lookup::lookup(target)?; // Grab their deposit (and check that they have one). - let deposit = >::take(&target).ok_or("Not named")?.1; + let deposit = >::take(&target).ok_or(Error::::Unnamed)?.1; // Slash their deposit from them. T::Slashed::on_unbalanced(T::Currency::slash_reserved(&target, deposit.clone()).0); @@ -213,8 +226,7 @@ decl_module! { fn force_name(origin, target: ::Source, name: Vec) { T::ForceOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; let target = T::Lookup::lookup(target)?; let deposit = >::get(&target).map(|x| x.1).unwrap_or_else(Zero::zero); @@ -235,7 +247,7 @@ mod tests { // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. use sp_runtime::{ - Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}, + Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup, BadOrigin}, }; impl_outer_origin! { @@ -336,7 +348,7 @@ mod tests { new_test_ext().execute_with(|| { assert_noop!( Nicks::set_name(Origin::signed(2), b"Dr. David Brubeck, III".to_vec()), - "Name too long" + Error::::TooLong, ); assert_ok!(Nicks::set_name(Origin::signed(2), b"Dave".to_vec())); @@ -369,18 +381,18 @@ mod tests { #[test] fn error_catching_should_work() { new_test_ext().execute_with(|| { - assert_noop!(Nicks::clear_name(Origin::signed(1)), "Not named"); + assert_noop!(Nicks::clear_name(Origin::signed(1)), Error::::Unnamed); assert_noop!(Nicks::set_name(Origin::signed(3), b"Dave".to_vec()), "not enough free funds"); - assert_noop!(Nicks::set_name(Origin::signed(1), b"Ga".to_vec()), "Name too short"); + assert_noop!(Nicks::set_name(Origin::signed(1), b"Ga".to_vec()), Error::::TooShort); assert_noop!( Nicks::set_name(Origin::signed(1), b"Gavin James Wood, Esquire".to_vec()), - "Name too long" + Error::::TooLong ); assert_ok!(Nicks::set_name(Origin::signed(1), b"Dave".to_vec())); - assert_noop!(Nicks::kill_name(Origin::signed(2), 1), "bad origin"); - assert_noop!(Nicks::force_name(Origin::signed(2), 1, b"Whatever".to_vec()), "bad origin"); + assert_noop!(Nicks::kill_name(Origin::signed(2), 1), BadOrigin); + assert_noop!(Nicks::force_name(Origin::signed(2), 1, b"Whatever".to_vec()), BadOrigin); }); } } diff --git a/frame/scored-pool/src/lib.rs b/frame/scored-pool/src/lib.rs index 65a867df60..685345aff6 100644 --- a/frame/scored-pool/src/lib.rs +++ b/frame/scored-pool/src/lib.rs @@ -94,7 +94,7 @@ use sp_std::{ prelude::*, }; use frame_support::{ - decl_module, decl_storage, decl_event, ensure, + decl_module, decl_storage, decl_event, ensure, decl_error, traits::{ChangeMembers, InitializeMembers, Currency, Get, ReservableCurrency}, }; use frame_system::{self as system, ensure_root, ensure_signed}; @@ -222,11 +222,25 @@ decl_event!( } ); +decl_error! { + /// Error for the scored-pool module. + pub enum Error for Module, I: Instance> { + /// Already a member. + AlreadyInPool, + /// Index out of bounds. + InvalidIndex, + /// Index does not match requested account. + WrongAccountIndex, + } +} + decl_module! { pub struct Module, I: Instance=DefaultInstance> for enum Call where origin: T::Origin { + type Error = Error; + fn deposit_event() = default; /// Every `Period` blocks the `Members` set is refreshed from the @@ -251,11 +265,10 @@ decl_module! { /// the index of the transactor in the `Pool`. pub fn submit_candidacy(origin) { let who = ensure_signed(origin)?; - ensure!(!>::exists(&who), "already a member"); + ensure!(!>::exists(&who), Error::::AlreadyInPool); let deposit = T::CandidateDeposit::get(); - T::Currency::reserve(&who, deposit) - .map_err(|_| "balance too low to submit candidacy")?; + T::Currency::reserve(&who, deposit)?; // can be inserted as last element in pool, since entities with // `None` are always sorted to the end. @@ -305,8 +318,7 @@ decl_module! { ) { T::KickOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; let who = T::Lookup::lookup(dest)?; @@ -331,8 +343,7 @@ decl_module! { ) { T::ScoreOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| "bad origin")?; + .or_else(ensure_root)?; let who = T::Lookup::lookup(dest)?; @@ -414,7 +425,7 @@ impl, I: Instance> Module { mut pool: PoolT, remove: T::AccountId, index: u32 - ) -> Result<(), &'static str> { + ) -> Result<(), Error> { // all callers of this function in this module also check // the index for validity before calling this function. // nevertheless we check again here, to assert that there was @@ -444,11 +455,11 @@ impl, I: Instance> Module { pool: &PoolT, who: &T::AccountId, index: u32 - ) -> Result<(), &'static str> { - ensure!(index < pool.len() as u32, "index out of bounds"); + ) -> Result<(), Error> { + ensure!(index < pool.len() as u32, Error::::InvalidIndex); let (index_who, _index_score) = &pool[index as usize]; - ensure!(index_who == who, "index does not match requested account"); + ensure!(index_who == who, Error::::WrongAccountIndex); Ok(()) } diff --git a/frame/scored-pool/src/tests.rs b/frame/scored-pool/src/tests.rs index 0b3ede9ee0..6b6649f73c 100644 --- a/frame/scored-pool/src/tests.rs +++ b/frame/scored-pool/src/tests.rs @@ -20,15 +20,12 @@ use super::*; use mock::*; use frame_support::{assert_ok, assert_noop}; -use sp_runtime::traits::OnInitialize; +use sp_runtime::traits::{OnInitialize, BadOrigin}; type ScoredPool = Module; type System = frame_system::Module; type Balances = pallet_balances::Module; -const OOB_ERR: &str = "index out of bounds"; -const INDEX_ERR: &str = "index does not match requested account"; - #[test] fn query_membership_works() { new_test_ext().execute_with(|| { @@ -44,11 +41,11 @@ fn submit_candidacy_must_not_work() { new_test_ext().execute_with(|| { assert_noop!( ScoredPool::submit_candidacy(Origin::signed(99)), - "balance too low to submit candidacy" + "not enough free funds" ); assert_noop!( ScoredPool::submit_candidacy(Origin::signed(40)), - "already a member" + Error::::AlreadyInPool ); }); } @@ -111,7 +108,7 @@ fn kicking_works_only_for_authorized() { new_test_ext().execute_with(|| { let who = 40; let index = find_in_pool(who).expect("entity must be in pool") as u32; - assert_noop!(ScoredPool::kick(Origin::signed(99), who, index), "bad origin"); + assert_noop!(ScoredPool::kick(Origin::signed(99), who, index), BadOrigin); }); } @@ -203,7 +200,7 @@ fn withdraw_candidacy_must_only_work_for_members() { new_test_ext().execute_with(|| { let who = 77; let index = 0; - assert_noop!( ScoredPool::withdraw_candidacy(Origin::signed(who), index), INDEX_ERR); + assert_noop!( ScoredPool::withdraw_candidacy(Origin::signed(who), index), Error::::WrongAccountIndex); }); } @@ -212,9 +209,9 @@ fn oob_index_should_abort() { new_test_ext().execute_with(|| { let who = 40; let oob_index = ScoredPool::pool().len() as u32; - assert_noop!(ScoredPool::withdraw_candidacy(Origin::signed(who), oob_index), OOB_ERR); - assert_noop!(ScoredPool::score(Origin::signed(ScoreOrigin::get()), who, oob_index, 99), OOB_ERR); - assert_noop!(ScoredPool::kick(Origin::signed(KickOrigin::get()), who, oob_index), OOB_ERR); + assert_noop!(ScoredPool::withdraw_candidacy(Origin::signed(who), oob_index), Error::::InvalidIndex); + assert_noop!(ScoredPool::score(Origin::signed(ScoreOrigin::get()), who, oob_index, 99), Error::::InvalidIndex); + assert_noop!(ScoredPool::kick(Origin::signed(KickOrigin::get()), who, oob_index), Error::::InvalidIndex); }); } @@ -223,9 +220,9 @@ fn index_mismatches_should_abort() { new_test_ext().execute_with(|| { let who = 40; let index = 3; - assert_noop!(ScoredPool::withdraw_candidacy(Origin::signed(who), index), INDEX_ERR); - assert_noop!(ScoredPool::score(Origin::signed(ScoreOrigin::get()), who, index, 99), INDEX_ERR); - assert_noop!(ScoredPool::kick(Origin::signed(KickOrigin::get()), who, index), INDEX_ERR); + assert_noop!(ScoredPool::withdraw_candidacy(Origin::signed(who), index), Error::::WrongAccountIndex); + assert_noop!(ScoredPool::score(Origin::signed(ScoreOrigin::get()), who, index, 99), Error::::WrongAccountIndex); + assert_noop!(ScoredPool::kick(Origin::signed(KickOrigin::get()), who, index), Error::::WrongAccountIndex); }); } diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index 5b3e4e2aee..79bace0d4a 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -125,7 +125,7 @@ use sp_runtime::{KeyTypeId, Perbill, RuntimeAppPublic, BoundToRuntimeAppPublic}; use frame_support::weights::SimpleDispatchInfo; use sp_runtime::traits::{Convert, Zero, Member, OpaqueKeys}; use sp_staking::SessionIndex; -use frame_support::{dispatch, ConsensusEngineId, decl_module, decl_event, decl_storage}; +use frame_support::{dispatch, ConsensusEngineId, decl_module, decl_event, decl_storage, decl_error}; use frame_support::{ensure, traits::{OnFreeBalanceZero, Get, FindAuthor, ValidatorRegistration}, Parameter}; use frame_system::{self as system, ensure_signed}; @@ -464,12 +464,26 @@ decl_event!( } ); +decl_error! { + /// Error for the session module. + pub enum Error for Module { + /// Invalid ownership proof. + InvalidProof, + /// No associated validator ID for account. + NoAssociatedValidatorId, + /// Registered duplicate key. + DuplicatedKey, + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { /// Used as first key for `NextKeys` and `KeyOwner` to put all the data into the same branch /// of the trie. const DEDUP_KEY_PREFIX: &[u8] = DEDUP_KEY_PREFIX; + type Error = Error; + fn deposit_event() = default; /// Sets the session key(s) of the function caller to `key`. @@ -486,12 +500,9 @@ decl_module! { fn set_keys(origin, keys: T::Keys, proof: Vec) -> dispatch::DispatchResult { let who = ensure_signed(origin)?; - ensure!(keys.ownership_proof_is_valid(&proof), "invalid ownership proof"); + ensure!(keys.ownership_proof_is_valid(&proof), Error::::InvalidProof); - let who = match T::ValidatorIdOf::convert(who) { - Some(val_id) => val_id, - None => Err("no associated validator ID for account.")?, - }; + let who = T::ValidatorIdOf::convert(who).ok_or(Error::::NoAssociatedValidatorId)?; Self::do_set_keys(&who, keys)?; @@ -640,7 +651,7 @@ impl Module { // ensure keys are without duplication. ensure!( Self::key_owner(*id, key).map_or(true, |owner| &owner == who), - "registered duplicate key" + Error::::DuplicatedKey, ); if let Some(old) = old_keys.as_ref().map(|k| k.get_raw(*id)) { diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index f8cdd27059..34c42da359 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -794,8 +794,6 @@ decl_error! { AlreadyBonded, /// Controller is already paired. AlreadyPaired, - /// Should be the root origin or the `T::SlashCancelOrigin`. - BadOrigin, /// Targets cannot be empty. EmptyTargets, /// Duplicate index. @@ -1190,8 +1188,7 @@ decl_module! { fn cancel_deferred_slash(origin, era: EraIndex, slash_indices: Vec) { T::SlashCancelOrigin::try_origin(origin) .map(|_| ()) - .or_else(ensure_root) - .map_err(|_| Error::::BadOrigin)?; + .or_else(ensure_root)?; let mut slash_indices = slash_indices; slash_indices.sort_unstable(); diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index ee0e1adc5e..6e1c6fb8d8 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -166,7 +166,7 @@ decl_module! { /// # #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { - T::RejectOrigin::ensure_origin(origin).map_err(|e| Into::<&str>::into(e))?; + T::RejectOrigin::ensure_origin(origin)?; let proposal = >::take(proposal_id).ok_or(Error::::InvalidProposalIndex)?; let value = proposal.bond; @@ -184,7 +184,7 @@ decl_module! { /// # #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { - T::ApproveOrigin::ensure_origin(origin).map_err(|e| Into::<&str>::into(e))?; + T::ApproveOrigin::ensure_origin(origin)?; ensure!(>::exists(proposal_id), Error::::InvalidProposalIndex); -- GitLab From 07b927727407a2fade8cfeec270d7fff8487c237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 20 Dec 2019 18:43:04 +0100 Subject: [PATCH 010/296] Add `Clone` bound to the `Origin`. (#4472) --- frame/system/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index f713811f21..903523fdf8 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -158,7 +158,9 @@ 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, Self::Origin>> + From>; + Into, Self::Origin>> + + From> + + Clone; /// The aggregated `Call` type. type Call: Debug; -- GitLab From e0a6b0bc765617a2849e241af45e335549b8bc32 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 20 Dec 2019 21:35:51 +0100 Subject: [PATCH 011/296] Add ProposalRejected event to Treasury (#4468) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #4467 Co-authored-by: Bastian Köcher --- frame/treasury/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 6e1c6fb8d8..121432fd05 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -167,11 +167,13 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::RejectOrigin::ensure_origin(origin)?; - let proposal = >::take(proposal_id).ok_or(Error::::InvalidProposalIndex)?; + let proposal = >::take(&proposal_id).ok_or(Error::::InvalidProposalIndex)?; let value = proposal.bond; let imbalance = T::Currency::slash_reserved(&proposal.proposer, value).0; T::ProposalRejection::on_unbalanced(imbalance); + + Self::deposit_event(Event::::Rejected(proposal_id, value)); } /// Approve a proposal. At a later time, the proposal will be allocated to the beneficiary @@ -244,6 +246,8 @@ decl_event!( Spending(Balance), /// Some funds have been allocated. Awarded(ProposalIndex, Balance, AccountId), + /// A proposal was rejected; funds were slashed. + Rejected(ProposalIndex, Balance), /// Some of our funds have been burnt. Burnt(Balance), /// Spending has finished; this is the amount that rolls over until next spend. -- GitLab From a98625501be68cc3084e666497c16b111741dded Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Fri, 20 Dec 2019 15:50:18 -0500 Subject: [PATCH 012/296] Rename ChainSpec field (#4471) * initial rename * nitpick: add space in "chain spec" * Add comment to client spec. --- client/chain-spec/src/chain_spec.rs | 45 +++++++++++++++-------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/client/chain-spec/src/chain_spec.rs b/client/chain-spec/src/chain_spec.rs index c5d0fcf402..0207eaee51 100644 --- a/client/chain-spec/src/chain_spec.rs +++ b/client/chain-spec/src/chain_spec.rs @@ -80,7 +80,7 @@ impl<'a, G: RuntimeGenesis, E> BuildStorage for &'a ChainSpec { let child_info = ChildInfo::resolve_child_info( child_content.child_type, child_content.child_info.as_slice(), - ).expect("chainspec contains correct content").to_owned(); + ).expect("chain spec contains correct content").to_owned(); ( sk.0, StorageChild { @@ -129,10 +129,11 @@ enum Genesis { Raw(RawGenesis), } +/// A configuration of a client. Does not include runtime storage initialization. #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] -struct ChainSpecFile { +struct ClientSpec { pub name: String, pub id: String, pub boot_nodes: Vec, @@ -157,14 +158,14 @@ pub type NoExtension = Option<()>; /// A configuration of a chain. Can be used to build a genesis block. pub struct ChainSpec { - spec: ChainSpecFile, + client_spec: ClientSpec, genesis: GenesisSource, } impl Clone for ChainSpec { fn clone(&self) -> Self { ChainSpec { - spec: self.spec.clone(), + client_spec: self.client_spec.clone(), genesis: self.genesis.clone(), } } @@ -173,44 +174,44 @@ impl Clone for ChainSpec { impl ChainSpec { /// A list of bootnode addresses. pub fn boot_nodes(&self) -> &[String] { - &self.spec.boot_nodes + &self.client_spec.boot_nodes } /// Spec name. pub fn name(&self) -> &str { - &self.spec.name + &self.client_spec.name } /// Spec id. pub fn id(&self) -> &str { - &self.spec.id + &self.client_spec.id } /// Telemetry endpoints (if any) pub fn telemetry_endpoints(&self) -> &Option { - &self.spec.telemetry_endpoints + &self.client_spec.telemetry_endpoints } /// Network protocol id. pub fn protocol_id(&self) -> Option<&str> { - self.spec.protocol_id.as_ref().map(String::as_str) + self.client_spec.protocol_id.as_ref().map(String::as_str) } /// Additional loosly-typed properties of the chain. /// /// Returns an empty JSON object if 'properties' not defined in config pub fn properties(&self) -> Properties { - self.spec.properties.as_ref().unwrap_or(&json::map::Map::new()).clone() + self.client_spec.properties.as_ref().unwrap_or(&json::map::Map::new()).clone() } /// Add a bootnode to the list. pub fn add_boot_node(&mut self, addr: Multiaddr) { - self.spec.boot_nodes.push(addr.to_string()) + self.client_spec.boot_nodes.push(addr.to_string()) } /// Returns a reference to defined chain spec extensions. pub fn extensions(&self) -> &E { - &self.spec.extensions + &self.client_spec.extensions } /// Create hardcoded spec. @@ -224,7 +225,7 @@ impl ChainSpec { properties: Option, extensions: E, ) -> Self { - let spec = ChainSpecFile { + let client_spec = ClientSpec { name: name.to_owned(), id: id.to_owned(), boot_nodes: boot_nodes, @@ -237,7 +238,7 @@ impl ChainSpec { }; ChainSpec { - spec, + client_spec, genesis: GenesisSource::Factory(Rc::new(constructor)), } } @@ -247,10 +248,10 @@ impl ChainSpec { /// Parse json content into a `ChainSpec` pub fn from_json_bytes(json: impl Into>) -> Result { let json = json.into(); - let spec = json::from_slice(json.as_ref()) + let client_spec = json::from_slice(json.as_ref()) .map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(ChainSpec { - spec, + client_spec, genesis: GenesisSource::Binary(json), }) } @@ -259,10 +260,10 @@ impl ChainSpec { pub fn from_json_file(path: PathBuf) -> Result { let file = File::open(&path) .map_err(|e| format!("Error opening spec file: {}", e))?; - let spec = json::from_reader(file) + let client_spec = json::from_reader(file) .map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(ChainSpec { - spec, + client_spec, genesis: GenesisSource::File(path), }) } @@ -274,7 +275,7 @@ impl ChainSpec { #[derive(Serialize, Deserialize)] struct Container { #[serde(flatten)] - spec: ChainSpecFile, + client_spec: ClientSpec, genesis: Genesis, }; @@ -304,11 +305,11 @@ impl ChainSpec { }, (_, genesis) => genesis, }; - let spec = Container { - spec: self.spec, + let container = Container { + client_spec: self.client_spec, genesis, }; - json::to_string_pretty(&spec) + json::to_string_pretty(&container) .map_err(|e| format!("Error generating spec json: {}", e)) } } -- GitLab From 5461c56695c4cf6816d19fa388ace9e1cec1d3a7 Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Sat, 21 Dec 2019 16:10:29 +0200 Subject: [PATCH 013/296] Migrate generic-asset, identity and im-online to decl_error (#4473) * Migrate generic-asset, identity and im-online to decl_error * Update democracy tests * Update nicks test --- frame/balances/src/lib.rs | 8 +-- frame/democracy/src/lib.rs | 8 +-- frame/generic-asset/src/lib.rs | 72 +++++++++++++++++------- frame/generic-asset/src/tests.rs | 22 ++++---- frame/identity/src/lib.rs | 96 +++++++++++++++++++++----------- frame/im-online/src/lib.rs | 17 +++++- frame/nicks/src/lib.rs | 5 +- frame/scored-pool/src/tests.rs | 2 +- 8 files changed, 153 insertions(+), 77 deletions(-) diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 1b89ae2b16..8d37ce0f5a 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -1002,13 +1002,13 @@ where // ...yet is was alive before && old_balance >= T::ExistentialDeposit::get() { - Err("payment would kill account")? + Err(Error::::KeepAlive)? } Self::ensure_can_withdraw(who, value, reasons, new_balance)?; Self::set_free_balance(who, new_balance); Ok(NegativeImbalance::new(value)) } else { - Err("too few free funds in account")? + Err(Error::::InsufficientBalance)? } } @@ -1123,7 +1123,7 @@ where fn reserve(who: &T::AccountId, value: Self::Balance) -> result::Result<(), DispatchError> { let b = Self::free_balance(who); if b < value { - Err("not enough free funds")? + Err(Error::::InsufficientBalance)? } let new_balance = b - value; Self::ensure_can_withdraw(who, value, WithdrawReason::Reserve.into(), new_balance)?; @@ -1268,7 +1268,7 @@ where starting_block: T::BlockNumber ) -> DispatchResult { if >::exists(who) { - Err("A vesting schedule already exists for this account.")? + Err(Error::::ExistingVestingSchedule)? } let vesting_schedule = VestingSchedule { locked, diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 3bbe011497..61d1dc285e 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -1152,7 +1152,7 @@ mod tests { traits::{BlakeTwo256, IdentityLookup, Bounded, BadOrigin}, testing::Header, Perbill, }; - use pallet_balances::BalanceLock; + use pallet_balances::{BalanceLock, Error as BalancesError}; use frame_system::EnsureSignedBy; const AYE: Vote = Vote{ aye: true, conviction: Conviction::None }; @@ -1356,7 +1356,7 @@ mod tests { PREIMAGE_BYTE_DEPOSIT.with(|v| *v.borrow_mut() = 100); assert_noop!( Democracy::note_preimage(Origin::signed(6), vec![0; 500]), - "not enough free funds", + BalancesError::::InsufficientBalance, ); // fee of 1 is reasonable. PREIMAGE_BYTE_DEPOSIT.with(|v| *v.borrow_mut() = 1); @@ -2118,7 +2118,7 @@ mod tests { fn poor_proposer_should_not_work() { new_test_ext().execute_with(|| { System::set_block_number(1); - assert_noop!(propose_set_balance(1, 2, 11), "not enough free funds"); + assert_noop!(propose_set_balance(1, 2, 11), BalancesError::::InsufficientBalance); }); } @@ -2127,7 +2127,7 @@ mod tests { new_test_ext().execute_with(|| { System::set_block_number(1); assert_ok!(propose_set_balance_and_note(2, 2, 11)); - assert_noop!(Democracy::second(Origin::signed(1), 0), "not enough free funds"); + assert_noop!(Democracy::second(Origin::signed(1), 0), BalancesError::::InsufficientBalance); }); } diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index de63ba2f12..d332d63c4e 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -151,7 +151,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use codec::{Decode, Encode, HasCompact, Input, Output, Error}; +use codec::{Decode, Encode, HasCompact, Input, Output, Error as CodecError}; use sp_runtime::{RuntimeDebug, DispatchResult, DispatchError}; use sp_runtime::traits::{ @@ -162,7 +162,7 @@ use sp_runtime::traits::{ use sp_std::prelude::*; use sp_std::{cmp, result, fmt::Debug}; use frame_support::{ - decl_event, decl_module, decl_storage, ensure, dispatch, + decl_event, decl_module, decl_storage, ensure, dispatch, decl_error, traits::{ Currency, ExistenceRequirement, Imbalance, LockIdentifier, LockableCurrency, ReservableCurrency, SignedImbalance, UpdateBalanceOutcome, WithdrawReason, WithdrawReasons, TryDrop, @@ -285,7 +285,7 @@ impl Encode for PermissionVersions { impl codec::EncodeLike for PermissionVersions {} impl Decode for PermissionVersions { - fn decode(input: &mut I) -> core::result::Result { + fn decode(input: &mut I) -> core::result::Result { let version = PermissionVersionNumber::decode(input)?; Ok( match version { @@ -320,8 +320,42 @@ impl Into> for PermissionLatest { + /// No new assets id available. + NoIdAvailable, + /// Cannot transfer zero amount. + ZeroAmount, + /// The origin does not have enough permission to update permissions. + NoUpdatePermission, + /// The origin does not have permission to mint an asset. + NoMintPermission, + /// The origin does not have permission to burn an asset. + NoBurnPermission, + /// Total issuance got overflowed after minting. + TotalMintingOverflow, + /// Free balance got overflowed after minting. + FreeMintingOverflow, + /// Total issuance got underflowed after burning. + TotalBurningUnderflow, + /// Free balance got underflowed after burning. + FreeBurningUnderflow, + /// Asset id is already taken. + IdAlreadyTaken, + /// Asset id not available. + IdUnavailable, + /// The balance is too low to send amount. + InsufficientBalance, + /// The account liquidity restrictions prevent withdrawal. + LiquidityRestrictions, + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + fn deposit_event() = default; /// Create a new kind of asset. @@ -332,7 +366,7 @@ decl_module! { let permissions: PermissionVersions = options.permissions.clone().into(); // The last available id serves as the overflow mark and won't be used. - let next_id = id.checked_add(&One::one()).ok_or_else(|| "No new assets id available.")?; + let next_id = id.checked_add(&One::one()).ok_or_else(|| Error::::NoIdAvailable)?; >::put(next_id); >::insert(id, &options.initial_issuance); @@ -347,7 +381,7 @@ decl_module! { /// Transfer some liquid free balance to another account. pub fn transfer(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, #[compact] amount: T::Balance) { let origin = ensure_signed(origin)?; - ensure!(!amount.is_zero(), "cannot transfer zero amount"); + ensure!(!amount.is_zero(), Error::::ZeroAmount); Self::make_transfer_with_event(&asset_id, &origin, &to, amount)?; } @@ -370,7 +404,7 @@ decl_module! { Ok(()) } else { - Err("Origin does not have enough permission to update permissions.")? + Err(Error::::NoUpdatePermission)? } } @@ -384,9 +418,9 @@ decl_module! { let original_free_balance = Self::free_balance(&asset_id, &to); let current_total_issuance = >::get(asset_id); let new_total_issuance = current_total_issuance.checked_add(&amount) - .ok_or_else(|| "total_issuance got overflow after minting.")?; + .ok_or(Error::::TotalMintingOverflow)?; let value = original_free_balance.checked_add(&amount) - .ok_or_else(|| "free balance got overflow after minting.")?; + .ok_or(Error::::FreeMintingOverflow)?; >::insert(asset_id, new_total_issuance); Self::set_free_balance(&asset_id, &to, value); @@ -395,7 +429,7 @@ decl_module! { Ok(()) } else { - Err("The origin does not have permission to mint an asset.")? + Err(Error::::NoMintPermission)? } } @@ -412,9 +446,9 @@ decl_module! { let current_total_issuance = >::get(asset_id); let new_total_issuance = current_total_issuance.checked_sub(&amount) - .ok_or_else(|| "total_issuance got underflow after burning")?; + .ok_or(Error::::TotalBurningUnderflow)?; let value = original_free_balance.checked_sub(&amount) - .ok_or_else(|| "free_balance got underflow after burning")?; + .ok_or(Error::::FreeBurningUnderflow)?; >::insert(asset_id, new_total_issuance); @@ -424,7 +458,7 @@ decl_module! { Ok(()) } else { - Err("The origin does not have permission to burn an asset.")? + Err(Error::::NoBurnPermission)? } } @@ -545,14 +579,14 @@ impl Module { options: AssetOptions, ) -> dispatch::DispatchResult { let asset_id = if let Some(asset_id) = asset_id { - ensure!(!>::exists(&asset_id), "Asset id already taken."); - ensure!(asset_id < Self::next_asset_id(), "Asset id not available."); + ensure!(!>::exists(&asset_id), Error::::IdAlreadyTaken); + ensure!(asset_id < Self::next_asset_id(), Error::::IdUnavailable); asset_id } else { let asset_id = Self::next_asset_id(); let next_id = asset_id .checked_add(&One::one()) - .ok_or_else(|| "No new user asset id available.")?; + .ok_or(Error::::NoIdAvailable)?; >::put(next_id); asset_id }; @@ -579,7 +613,7 @@ impl Module { ) -> dispatch::DispatchResult { let new_balance = Self::free_balance(asset_id, from) .checked_sub(&amount) - .ok_or_else(|| "balance too low to send amount")?; + .ok_or(Error::::InsufficientBalance)?; Self::ensure_can_withdraw(asset_id, from, amount, WithdrawReason::Transfer.into(), new_balance)?; if from != to { @@ -618,7 +652,7 @@ impl Module { let original_reserve_balance = Self::reserved_balance(asset_id, who); let original_free_balance = Self::free_balance(asset_id, who); if original_free_balance < amount { - Err("not enough free funds")? + Err(Error::::InsufficientBalance)? } let new_reserve_balance = original_reserve_balance + amount; Self::set_reserved_balance(asset_id, who, new_reserve_balance); @@ -767,7 +801,7 @@ impl Module { { Ok(()) } else { - Err("account liquidity restrictions prevent withdrawal")? + Err(Error::::LiquidityRestrictions)? } } @@ -1155,7 +1189,7 @@ where ) -> result::Result { let new_balance = Self::free_balance(who) .checked_sub(&value) - .ok_or_else(|| "account has too few funds")?; + .ok_or(Error::::InsufficientBalance)?; Self::ensure_can_withdraw(who, value, reasons, new_balance)?; >::set_free_balance(&U::asset_id(), who, new_balance); Ok(NegativeImbalance::new(value)) diff --git a/frame/generic-asset/src/tests.rs b/frame/generic-asset/src/tests.rs index 1f9f458b2c..20647cc6f2 100644 --- a/frame/generic-asset/src/tests.rs +++ b/frame/generic-asset/src/tests.rs @@ -65,7 +65,7 @@ fn issuing_with_next_asset_id_overflow_should_not_work() { permissions: default_permission } ), - "No new assets id available." + Error::::NoIdAvailable ); assert_eq!(GenericAsset::next_asset_id(), u32::max_value()); }); @@ -173,7 +173,7 @@ fn transferring_amount_should_fail_when_transferring_more_than_free_balance() { )); assert_noop!( GenericAsset::transfer(Origin::signed(1), asset_id, 2, 2000), - "balance too low to send amount" + Error::::InsufficientBalance ); }); } @@ -198,7 +198,7 @@ fn transferring_less_than_one_unit_should_not_work() { assert_eq!(GenericAsset::free_balance(&asset_id, &1), 100); assert_noop!( GenericAsset::transfer(Origin::signed(1), asset_id, 2, 0), - "cannot transfer zero amount" + Error::::ZeroAmount ); }); } @@ -256,7 +256,7 @@ fn transferring_more_units_than_total_supply_should_not_work() { assert_eq!(GenericAsset::free_balance(&asset_id, &1), 100); assert_noop!( GenericAsset::transfer(Origin::signed(1), asset_id, 2, 101), - "balance too low to send amount" + Error::::InsufficientBalance ); }); } @@ -424,7 +424,7 @@ fn reserve_should_moves_amount_from_balance_to_reserved_balance() { #[test] fn reserve_should_not_moves_amount_from_balance_to_reserved_balance() { ExtBuilder::default().free_balance((1, 0, 100)).build().execute_with(|| { - assert_noop!(GenericAsset::reserve(&1, &0, 120), "not enough free funds"); + assert_noop!(GenericAsset::reserve(&1, &0, 120), Error::::InsufficientBalance); assert_eq!(GenericAsset::free_balance(&1, &0), 100); assert_eq!(GenericAsset::reserved_balance(&1, &0), 0); }); @@ -626,7 +626,7 @@ fn mint_should_throw_permission_error() { assert_noop!( GenericAsset::mint(Origin::signed(origin), asset_id, to_account, amount), - "The origin does not have permission to mint an asset." + Error::::NoMintPermission, ); }); } @@ -687,7 +687,7 @@ fn burn_should_throw_permission_error() { assert_noop!( GenericAsset::burn(Origin::signed(origin), asset_id, to_account, amount), - "The origin does not have permission to burn an asset." + Error::::NoBurnPermission, ); }); } @@ -873,8 +873,6 @@ fn update_permission_should_throw_error_when_lack_of_permissions() { burn: Owner::None, }; - let expected_error_message = "Origin does not have enough permission to update permissions."; - assert_ok!(GenericAsset::create( Origin::signed(origin), AssetOptions { @@ -885,7 +883,7 @@ fn update_permission_should_throw_error_when_lack_of_permissions() { assert_noop!( GenericAsset::update_permission(Origin::signed(origin), asset_id, new_permission), - expected_error_message, + Error::::NoUpdatePermission, ); }); } @@ -963,7 +961,7 @@ fn create_asset_with_non_reserved_asset_id_should_not_work() { permissions: default_permission.clone() } ), - "Asset id not available." + Error::::IdUnavailable, ); }); } @@ -1005,7 +1003,7 @@ fn create_asset_with_a_taken_asset_id_should_not_work() { permissions: default_permission.clone() } ), - "Asset id already taken." + Error::::IdAlreadyTaken, ); }); } diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 0957396658..3fda978b13 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -71,7 +71,7 @@ use enumflags2::BitFlags; use codec::{Encode, Decode}; use sp_runtime::{DispatchResult, traits::{StaticLookup, EnsureOrigin, Zero}, RuntimeDebug}; use frame_support::{ - decl_module, decl_event, decl_storage, ensure, + decl_module, decl_event, decl_storage, ensure, decl_error, traits::{Currency, ReservableCurrency, OnUnbalanced, Get}, weights::SimpleDispatchInfo, }; @@ -401,9 +401,39 @@ decl_event!( } ); +decl_error! { + /// Error for the identity module. + pub enum Error for Module { + /// Too many subs-accounts. + TooManySubAccounts, + /// Account isn't found. + NotFound, + /// Account isn't named. + NotNamed, + /// Empty index. + EmptyIndex, + /// Fee is changed. + FeeChanged, + /// No identity found. + NoIdentity, + /// Sticky judgement. + StickyJudgement, + /// Judgement given. + JudgementGiven, + /// Invalid judgement. + InvalidJudgement, + /// The index is invalid. + InvalidIndex, + /// The target is invalid. + InvalidTarget, + } +} + decl_module! { // Simple declaration of the `Module` type. Lets the macro know what it's working on. pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + fn deposit_event() = default; /// Add a registrar to the system. @@ -497,8 +527,8 @@ decl_module! { /// # fn set_subs(origin, subs: Vec<(T::AccountId, Data)>) { let sender = ensure_signed(origin)?; - ensure!(>::exists(&sender), "not found"); - ensure!(subs.len() <= T::MaximumSubAccounts::get() as usize, "too many subs"); + ensure!(>::exists(&sender), Error::::NotFound); + ensure!(subs.len() <= T::MaximumSubAccounts::get() as usize, Error::::TooManySubAccounts); let (old_deposit, old_ids) = >::get(&sender); let new_deposit = T::SubAccountDeposit::get() * >::from(subs.len() as u32); @@ -545,7 +575,7 @@ decl_module! { let sender = ensure_signed(origin)?; let (subs_deposit, sub_ids) = >::take(&sender); - let deposit = >::take(&sender).ok_or("not named")?.total_deposit() + let deposit = >::take(&sender).ok_or(Error::::NotNamed)?.total_deposit() + subs_deposit; for sub in sub_ids.iter() { >::remove(sub); @@ -587,14 +617,14 @@ decl_module! { let sender = ensure_signed(origin)?; let registrars = >::get(); let registrar = registrars.get(reg_index as usize).and_then(Option::as_ref) - .ok_or("empty index")?; - ensure!(max_fee >= registrar.fee, "fee changed"); - let mut id = >::get(&sender).ok_or("no identity")?; + .ok_or(Error::::EmptyIndex)?; + ensure!(max_fee >= registrar.fee, Error::::FeeChanged); + let mut id = >::get(&sender).ok_or(Error::::NoIdentity)?; let item = (reg_index, Judgement::FeePaid(registrar.fee)); match id.judgements.binary_search_by_key(®_index, |x| x.0) { Ok(i) => if id.judgements[i].1.is_sticky() { - Err("sticky judgement")? + Err(Error::::StickyJudgement)? } else { id.judgements[i] = item }, @@ -628,14 +658,14 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedNormal(50_000)] fn cancel_request(origin, reg_index: RegistrarIndex) { let sender = ensure_signed(origin)?; - let mut id = >::get(&sender).ok_or("no identity")?; + let mut id = >::get(&sender).ok_or(Error::::NoIdentity)?; let pos = id.judgements.binary_search_by_key(®_index, |x| x.0) - .map_err(|_| "not found")?; + .map_err(|_| Error::::NotFound)?; let fee = if let Judgement::FeePaid(fee) = id.judgements.remove(pos).1 { fee } else { - Err("judgement given")? + Err(Error::::JudgementGiven)? }; let _ = T::Currency::unreserve(&sender, fee); @@ -667,7 +697,7 @@ decl_module! { rs.get_mut(index as usize) .and_then(|x| x.as_mut()) .and_then(|r| if r.account == who { r.fee = fee; Some(()) } else { None }) - .ok_or_else(|| "invalid index".into()) + .ok_or_else(|| Error::::InvalidIndex.into()) ) } @@ -694,7 +724,7 @@ decl_module! { rs.get_mut(index as usize) .and_then(|x| x.as_mut()) .and_then(|r| if r.account == who { r.account = new; Some(()) } else { None }) - .ok_or_else(|| "invalid index".into()) + .ok_or_else(|| Error::::InvalidIndex.into()) ) } @@ -721,7 +751,7 @@ decl_module! { rs.get_mut(index as usize) .and_then(|x| x.as_mut()) .and_then(|r| if r.account == who { r.fields = fields; Some(()) } else { None }) - .ok_or_else(|| "invalid index".into()) + .ok_or_else(|| Error::::InvalidIndex.into()) ) } @@ -752,13 +782,13 @@ decl_module! { ) { let sender = ensure_signed(origin)?; let target = T::Lookup::lookup(target)?; - ensure!(!judgement.has_deposit(), "invalid judgement"); + ensure!(!judgement.has_deposit(), Error::::InvalidJudgement); >::get() .get(reg_index as usize) .and_then(Option::as_ref) .and_then(|r| if r.account == sender { Some(r) } else { None }) - .ok_or("invalid index")?; - let mut id = >::get(&target).ok_or("invalid target")?; + .ok_or(Error::::InvalidIndex)?; + let mut id = >::get(&target).ok_or(Error::::InvalidTarget)?; let item = (reg_index, judgement); match id.judgements.binary_search_by_key(®_index, |x| x.0) { @@ -803,7 +833,7 @@ decl_module! { let target = T::Lookup::lookup(target)?; // Grab their deposit (and check that they have one). let (subs_deposit, sub_ids) = >::take(&target); - let deposit = >::take(&target).ok_or("not named")?.total_deposit() + let deposit = >::take(&target).ok_or(Error::::NotNamed)?.total_deposit() + subs_deposit; for sub in sub_ids.iter() { >::remove(sub); @@ -951,7 +981,7 @@ mod tests { assert_eq!(Balances::free_balance(10), 90); assert_ok!(Identity::clear_identity(Origin::signed(10))); assert_eq!(Balances::free_balance(10), 100); - assert_noop!(Identity::clear_identity(Origin::signed(10)), "not named"); + assert_noop!(Identity::clear_identity(Origin::signed(10)), Error::::NotNamed); }); } @@ -960,23 +990,23 @@ mod tests { new_test_ext().execute_with(|| { assert_noop!( Identity::provide_judgement(Origin::signed(3), 0, 10, Judgement::Reasonable), - "invalid index" + Error::::InvalidIndex ); assert_ok!(Identity::add_registrar(Origin::signed(1), 3)); assert_noop!( Identity::provide_judgement(Origin::signed(3), 0, 10, Judgement::Reasonable), - "invalid target" + Error::::InvalidTarget ); assert_ok!(Identity::set_identity(Origin::signed(10), ten())); assert_noop!( Identity::provide_judgement(Origin::signed(10), 0, 10, Judgement::Reasonable), - "invalid index" + Error::::InvalidIndex ); assert_noop!( Identity::provide_judgement(Origin::signed(3), 0, 10, Judgement::FeePaid(1)), - "invalid judgement" + Error::::InvalidJudgement ); assert_ok!(Identity::provide_judgement(Origin::signed(3), 0, 10, Judgement::Reasonable)); @@ -1003,7 +1033,7 @@ mod tests { assert_ok!(Identity::kill_identity(Origin::signed(2), 10)); assert_eq!(Identity::identity(10), None); assert_eq!(Balances::free_balance(10), 90); - assert_noop!(Identity::kill_identity(Origin::signed(2), 10), "not named"); + assert_noop!(Identity::kill_identity(Origin::signed(2), 10), Error::::NotNamed); }); } @@ -1011,7 +1041,7 @@ mod tests { fn setting_subaccounts_should_work() { new_test_ext().execute_with(|| { let mut subs = vec![(20, Data::Raw(vec![40; 1]))]; - assert_noop!(Identity::set_subs(Origin::signed(10), subs.clone()), "not found"); + assert_noop!(Identity::set_subs(Origin::signed(10), subs.clone()), Error::::NotFound); assert_ok!(Identity::set_identity(Origin::signed(10), ten())); assert_ok!(Identity::set_subs(Origin::signed(10), subs.clone())); @@ -1044,7 +1074,7 @@ mod tests { assert_eq!(Identity::super_of(40), None); subs.push((20, Data::Raw(vec![40; 1]))); - assert_noop!(Identity::set_subs(Origin::signed(10), subs.clone()), "too many subs"); + assert_noop!(Identity::set_subs(Origin::signed(10), subs.clone()), Error::::TooManySubAccounts); }); } @@ -1075,15 +1105,15 @@ mod tests { new_test_ext().execute_with(|| { assert_ok!(Identity::add_registrar(Origin::signed(1), 3)); assert_ok!(Identity::set_fee(Origin::signed(3), 0, 10)); - assert_noop!(Identity::cancel_request(Origin::signed(10), 0), "no identity"); + assert_noop!(Identity::cancel_request(Origin::signed(10), 0), Error::::NoIdentity); assert_ok!(Identity::set_identity(Origin::signed(10), ten())); assert_ok!(Identity::request_judgement(Origin::signed(10), 0, 10)); assert_ok!(Identity::cancel_request(Origin::signed(10), 0)); assert_eq!(Balances::free_balance(10), 90); - assert_noop!(Identity::cancel_request(Origin::signed(10), 0), "not found"); + assert_noop!(Identity::cancel_request(Origin::signed(10), 0), Error::::NotFound); assert_ok!(Identity::provide_judgement(Origin::signed(3), 0, 10, Judgement::Reasonable)); - assert_noop!(Identity::cancel_request(Origin::signed(10), 0), "judgement given"); + assert_noop!(Identity::cancel_request(Origin::signed(10), 0), Error::::JudgementGiven); }); } @@ -1093,19 +1123,19 @@ mod tests { assert_ok!(Identity::add_registrar(Origin::signed(1), 3)); assert_ok!(Identity::set_fee(Origin::signed(3), 0, 10)); assert_ok!(Identity::set_identity(Origin::signed(10), ten())); - assert_noop!(Identity::request_judgement(Origin::signed(10), 0, 9), "fee changed"); + assert_noop!(Identity::request_judgement(Origin::signed(10), 0, 9), Error::::FeeChanged); assert_ok!(Identity::request_judgement(Origin::signed(10), 0, 10)); // 10 for the judgement request, 10 for the identity. assert_eq!(Balances::free_balance(10), 80); // Re-requesting won't work as we already paid. - assert_noop!(Identity::request_judgement(Origin::signed(10), 0, 10), "sticky judgement"); + assert_noop!(Identity::request_judgement(Origin::signed(10), 0, 10), Error::::StickyJudgement); assert_ok!(Identity::provide_judgement(Origin::signed(3), 0, 10, Judgement::Erroneous)); // Registrar got their payment now. assert_eq!(Balances::free_balance(3), 20); // Re-requesting still won't work as it's erroneous. - assert_noop!(Identity::request_judgement(Origin::signed(10), 0, 10), "sticky judgement"); + assert_noop!(Identity::request_judgement(Origin::signed(10), 0, 10), Error::::StickyJudgement); // Requesting from a second registrar still works. assert_ok!(Identity::add_registrar(Origin::signed(1), 4)); @@ -1137,7 +1167,7 @@ mod tests { new_test_ext().execute_with(|| { assert_ok!(Identity::add_registrar(Origin::signed(1), 3)); // account 4 cannot change the first registrar's identity since it's owned by 3. - assert_noop!(Identity::set_account_id(Origin::signed(4), 0, 3), "invalid index"); + assert_noop!(Identity::set_account_id(Origin::signed(4), 0, 3), Error::::InvalidIndex); // account 3 can, because that's the registrar's current account. assert_ok!(Identity::set_account_id(Origin::signed(3), 0, 4)); // account 4 can now, because that's their new ID. diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index d7dfb1c673..b681f7e4bd 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -89,7 +89,7 @@ use sp_staking::{ offence::{ReportOffence, Offence, Kind}, }; use frame_support::{ - decl_module, decl_event, decl_storage, print, Parameter, debug, + decl_module, decl_event, decl_storage, print, Parameter, debug, decl_error, traits::Get, }; use frame_system::{self as system, ensure_none}; @@ -243,9 +243,20 @@ decl_storage! { } } +decl_error! { + /// Error for the im-online module. + pub enum Error for Module { + /// Non existent public key. + InvalidKey, + /// Duplicated heartbeat. + DuplicatedHeartbeat, + } +} decl_module! { pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + fn deposit_event() = default; fn heartbeat( @@ -274,9 +285,9 @@ decl_module! { &network_state ); } else if exists { - Err("Duplicated heartbeat.")? + Err(Error::::DuplicatedHeartbeat)? } else { - Err("Non existent public key.")? + Err(Error::::InvalidKey)? } } diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index f407c4aad0..997bf74392 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -383,7 +383,10 @@ mod tests { new_test_ext().execute_with(|| { assert_noop!(Nicks::clear_name(Origin::signed(1)), Error::::Unnamed); - assert_noop!(Nicks::set_name(Origin::signed(3), b"Dave".to_vec()), "not enough free funds"); + assert_noop!( + Nicks::set_name(Origin::signed(3), b"Dave".to_vec()), + pallet_balances::Error::::InsufficientBalance + ); assert_noop!(Nicks::set_name(Origin::signed(1), b"Ga".to_vec()), Error::::TooShort); assert_noop!( diff --git a/frame/scored-pool/src/tests.rs b/frame/scored-pool/src/tests.rs index 6b6649f73c..1cecc7b309 100644 --- a/frame/scored-pool/src/tests.rs +++ b/frame/scored-pool/src/tests.rs @@ -41,7 +41,7 @@ fn submit_candidacy_must_not_work() { new_test_ext().execute_with(|| { assert_noop!( ScoredPool::submit_candidacy(Origin::signed(99)), - "not enough free funds" + pallet_balances::Error::::InsufficientBalance, ); assert_noop!( ScoredPool::submit_candidacy(Origin::signed(40)), -- GitLab From 5dece712a2fd86a638a7d1f7e624330361802968 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Sat, 21 Dec 2019 06:34:36 -0800 Subject: [PATCH 014/296] Clean up definition for custom ss58 address formats (#4470) * Clearer definition for custom ss58 address formats * Fix subkey compile --- Cargo.lock | 1 + bin/utils/subkey/Cargo.toml | 1 + bin/utils/subkey/src/main.rs | 36 +++++++++++++++++++++-------------- primitives/core/src/crypto.rs | 34 +++++++++++++++++---------------- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f68ae16202..67fa81af0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6669,6 +6669,7 @@ dependencies = [ "frame-system 2.0.0", "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "node-runtime 2.0.0", "pallet-balances 2.0.0", diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 2fcd2aa473..6d687ce910 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -21,6 +21,7 @@ frame-system = { version = "2.0.0", path = "../../../frame/system" } pallet-balances = { version = "2.0.0", path = "../../../frame/balances" } pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transaction-payment" } rpassword = "4.0.1" +itertools = "0.8.2" [features] bench = [] diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index e89e0466ea..9526fa1b52 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -22,6 +22,7 @@ use bip39::{Language, Mnemonic, MnemonicType}; use clap::{App, ArgMatches, SubCommand}; use codec::{Decode, Encode}; use hex_literal::hex; +use itertools::Itertools; use node_primitives::{Balance, Hash, Index, AccountId, Signature}; use node_runtime::{BalancesCall, Call, Runtime, SignedPayload, UncheckedExtrinsic, VERSION}; use sp_core::{ @@ -155,20 +156,25 @@ impl PublicT for sr25519::Public { fn into_runtime(self) -> AccountPublic { self impl PublicT for ed25519::Public { fn into_runtime(self) -> AccountPublic { self.into() } } impl PublicT for ecdsa::Public { fn into_runtime(self) -> AccountPublic { self.into() } } -fn get_app<'a, 'b>() -> App<'a, 'b> { +fn get_usage() -> String { + let networks = Ss58AddressFormat::all().iter().cloned().map(String::from).join("/"); + let default_network = String::from(Ss58AddressFormat::default()); + format!(" + -e, --ed25519 'Use Ed25519/BIP39 cryptography' + -k, --secp256k1 'Use SECP256k1/ECDSA/BIP39 cryptography' + -s, --sr25519 'Use Schnorr/Ristretto x25519/BIP39 cryptography' + [network] -n, --network 'Specify a network. One of {}. Default is {}' + [password] -p, --password 'The password for the key' + --password-interactive 'You will be prompted for the password for the key.' + ", networks, default_network) +} + +fn get_app<'a, 'b>(usage: &'a str) -> App<'a, 'b> { App::new("subkey") .author("Parity Team ") .about("Utility for generating and restoring with Substrate keys") .version(env!("CARGO_PKG_VERSION")) - .args_from_usage(" - -e, --ed25519 'Use Ed25519/BIP39 cryptography' - -k, --secp256k1 'Use SECP256k1/ECDSA/BIP39 cryptography' - -s, --sr25519 'Use Schnorr/Ristretto x25519/BIP39 cryptography' - [network] -n, --network 'Specify a network. One of substrate \ - (default), polkadot, kusama, dothereum, edgeware, or kulupu' - [password] -p, --password 'The password for the key' - --password-interactive 'You will be prompted for the password for the key.' - ") + .args_from_usage(usage) .subcommands(vec![ SubCommand::with_name("generate") .about("Generate a random account") @@ -226,7 +232,8 @@ fn get_app<'a, 'b>() -> App<'a, 'b> { } fn main() { - let matches = get_app().get_matches(); + let usage = get_usage(); + let matches = get_app(&usage).get_matches(); if matches.is_present("ed25519") { return execute::(matches) @@ -260,7 +267,7 @@ where let maybe_network: Option = matches.value_of("network").map(|network| { network .try_into() - .expect("Invalid network name: must be polkadot/substrate/kusama/dothereum/edgeware") + .expect("Invalid network name. See --help for available networks.") }); if let Some(network) = maybe_network { set_default_ss58_version(network); @@ -553,7 +560,8 @@ mod tests { SignatureOf: SignatureT, PublicOf: PublicT, { - let app = get_app(); + let usage = get_usage(); + let app = get_app(&usage); let password = None; // Generate public key and seed. @@ -581,7 +589,7 @@ mod tests { // Verify the previous signature. let arg_vec = vec!["subkey", "verify", &signature[..], &public_key[..]]; - let matches = get_app().get_matches_from(arg_vec); + let matches = get_app(&usage).get_matches_from(arg_vec); let matches = matches.subcommand().1.unwrap(); assert!(do_verify::(matches, message)); } diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index fe3a53c83a..c5a42243dc 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -264,11 +264,7 @@ pub trait Ss58Codec: Sized + AsMut<[u8]> + AsRef<[u8]> + Default { fn from_ss58check(s: &str) -> Result { Self::from_ss58check_with_version(s) .and_then(|(r, v)| match v { - Ss58AddressFormat::SubstrateAccountDirect => Ok(r), - Ss58AddressFormat::PolkadotAccountDirect => Ok(r), - Ss58AddressFormat::KusamaAccountDirect => Ok(r), - Ss58AddressFormat::DothereumAccountDirect => Ok(r), - Ss58AddressFormat::EdgewareAccountDirect => Ok(r), + v if !v.is_custom() => Ok(r), v if v == *DEFAULT_VERSION.lock() => Ok(r), _ => Err(PublicError::UnknownVersion), }) @@ -298,11 +294,7 @@ pub trait Ss58Codec: Sized + AsMut<[u8]> + AsRef<[u8]> + Default { fn from_string(s: &str) -> Result { Self::from_string_with_version(s) .and_then(|(r, v)| match v { - Ss58AddressFormat::SubstrateAccountDirect => Ok(r), - Ss58AddressFormat::PolkadotAccountDirect => Ok(r), - Ss58AddressFormat::KusamaAccountDirect => Ok(r), - Ss58AddressFormat::DothereumAccountDirect => Ok(r), - Ss58AddressFormat::EdgewareAccountDirect => Ok(r), + v if !v.is_custom() => Ok(r), v if v == *DEFAULT_VERSION.lock() => Ok(r), _ => Err(PublicError::UnknownVersion), }) @@ -377,6 +369,14 @@ macro_rules! ss58_address_format { pub fn all() -> &'static [Ss58AddressFormat] { &ALL_SS58_ADDRESS_FORMATS } + + /// Whether the address is custom. + pub fn is_custom(&self) -> bool { + match self { + Self::Custom(_) => true, + _ => false, + } + } } impl From for u8 { @@ -410,6 +410,13 @@ macro_rules! ss58_address_format { } } + #[cfg(feature = "std")] + impl Default for Ss58AddressFormat { + fn default() -> Self { + *DEFAULT_VERSION.lock() + } + } + #[cfg(feature = "std")] impl From for String { fn from(x: Ss58AddressFormat) -> String { @@ -442,12 +449,7 @@ ss58_address_format!( /// typically used not just to encode format/version but also network identity) that is used for /// encoding and decoding SS58 addresses. If an unknown version is provided then it fails. /// -/// Current known "versions" are: -/// - 0 direct (payload) checksum for 32-byte *25519 Polkadot addresses. -/// - 2 direct (payload) checksum for 32-byte *25519 Kusama addresses. -/// - 7 direct (payload) checksum for 32-byte *25519 Edgeware addresses. -/// - 20 direct (payload) checksum for 32-byte *25519 Dothereum addresses. -/// - 42 direct (payload) checksum for 32-byte *25519 addresses on any Substrate-based network. +/// See `ss58_address_format!` for all current known "versions". #[cfg(feature = "std")] pub fn set_default_ss58_version(version: Ss58AddressFormat) { *DEFAULT_VERSION.lock() = version -- GitLab From bbb363f4320b4a72e059c0fca96af42296d5a6bf Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sun, 22 Dec 2019 20:41:55 +0100 Subject: [PATCH 015/296] Extend Utility pallet with multisig and pseudonyms (#4462) * Add subaccounts functionality * More work * Multisig prototyped with tests * Add timepoints to prevent replay * Remove TODO * Check for the right owner in cancel. * Test the timepoint stuff * Batch works with any origin * Refactor tuples into structs. * Finalise function docs/complexity and also add proper weights. * Fix wasm * Module-level docs * Fix typo * Runtime fix * Better deposit system; more tests. * Fix typo * Switch +1 for -1 * Add Blake2_128Concat; fix insecurity; change return policy. * Fix typo * Update frame/utility/src/lib.rs Co-Authored-By: Shawn Tabrizi * Update frame/utility/src/lib.rs Co-Authored-By: Shawn Tabrizi * Update bin/node/runtime/src/lib.rs Co-Authored-By: Sergei Pepyakin Co-authored-by: Shawn Tabrizi Co-authored-by: Sergei Pepyakin --- bin/node/runtime/src/lib.rs | 14 +- frame/assets/src/lib.rs | 1 - frame/metadata/src/lib.rs | 1 + frame/support/procedural/src/lib.rs | 1 + frame/support/procedural/src/storage/mod.rs | 3 + frame/support/procedural/src/storage/parse.rs | 3 + frame/support/src/hash.rs | 23 + frame/support/src/lib.rs | 4 +- frame/utility/Cargo.toml | 1 + frame/utility/src/lib.rs | 959 +++++++++++++++++- primitives/runtime/src/lib.rs | 11 + 11 files changed, 985 insertions(+), 36 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 488b29aa2a..3b7fcb19c3 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -128,9 +128,21 @@ impl frame_system::Trait for Runtime { type ModuleToIndex = (); } +parameter_types! { + // One storage item; value is size 4+4+16+32 bytes = 56 bytes. + pub const MultisigDepositBase: Balance = 30 * CENTS; + // Additional storage item size of 32 bytes. + pub const MultisigDepositFactor: Balance = 5 * CENTS; + pub const MaxSignatories: u16 = 100; +} + impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; + type Currency = Balances; + type MultisigDepositBase = MultisigDepositBase; + type MultisigDepositFactor = MultisigDepositFactor; + type MaxSignatories = MaxSignatories; } parameter_types! { @@ -515,7 +527,7 @@ construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: frame_system::{Module, Call, Storage, Config, Event}, - Utility: pallet_utility::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Storage, Event, Error}, Babe: pallet_babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, Authorship: pallet_authorship::{Module, Call, Storage, Inherent}, diff --git a/frame/assets/src/lib.rs b/frame/assets/src/lib.rs index 94ec8f73df..8cf9e60d44 100644 --- a/frame/assets/src/lib.rs +++ b/frame/assets/src/lib.rs @@ -223,7 +223,6 @@ decl_error! { /// Balance should be non-zero BalanceZero, } - } decl_storage! { diff --git a/frame/metadata/src/lib.rs b/frame/metadata/src/lib.rs index d47e0c75cf..9d829ab192 100644 --- a/frame/metadata/src/lib.rs +++ b/frame/metadata/src/lib.rs @@ -273,6 +273,7 @@ impl sp_std::fmt::Debug for DefaultByteGetter { pub enum StorageHasher { Blake2_128, Blake2_256, + Blake2_128Concat, Twox128, Twox256, Twox64Concat, diff --git a/frame/support/procedural/src/lib.rs b/frame/support/procedural/src/lib.rs index d9c2fe03c9..477663b681 100644 --- a/frame/support/procedural/src/lib.rs +++ b/frame/support/procedural/src/lib.rs @@ -153,6 +153,7 @@ use proc_macro::TokenStream; /// * `twox_64_concat` - TwoX with 64bit + key concatenated. /// * `twox_128` - TwoX with 128bit. /// * `twox_256` - TwoX with with 256bit. +/// * `blake2_128_concat` - Blake2 with 128bit + key concatenated. /// * `blake2_128` - Blake2 with 128bit. /// * `blake2_256` - Blake2 with 256bit. /// diff --git a/frame/support/procedural/src/storage/mod.rs b/frame/support/procedural/src/storage/mod.rs index 8fbb97d916..ef199c92c4 100644 --- a/frame/support/procedural/src/storage/mod.rs +++ b/frame/support/procedural/src/storage/mod.rs @@ -368,6 +368,7 @@ pub struct ExtraGenesisLineDef { pub enum HasherKind { Blake2_256, Blake2_128, + Blake2_128Concat, Twox256, Twox128, Twox64Concat, @@ -378,6 +379,7 @@ impl HasherKind { match self { HasherKind::Blake2_256 => quote!( Blake2_256 ), HasherKind::Blake2_128 => quote!( Blake2_128 ), + HasherKind::Blake2_128Concat => quote!( Blake2_128Concat ), HasherKind::Twox256 => quote!( Twox256 ), HasherKind::Twox128 => quote!( Twox128 ), HasherKind::Twox64Concat => quote!( Twox64Concat ), @@ -388,6 +390,7 @@ impl HasherKind { match self { HasherKind::Blake2_256 => quote!( StorageHasher::Blake2_256 ), HasherKind::Blake2_128 => quote!( StorageHasher::Blake2_128 ), + HasherKind::Blake2_128Concat => quote!( StorageHasher::Blake2_128Concat ), HasherKind::Twox256 => quote!( StorageHasher::Twox256 ), HasherKind::Twox128 => quote!( StorageHasher::Twox128 ), HasherKind::Twox64Concat => quote!( StorageHasher::Twox64Concat ), diff --git a/frame/support/procedural/src/storage/parse.rs b/frame/support/procedural/src/storage/parse.rs index a5cd14aa1f..2fe37da256 100644 --- a/frame/support/procedural/src/storage/parse.rs +++ b/frame/support/procedural/src/storage/parse.rs @@ -31,6 +31,7 @@ mod keyword { syn::custom_keyword!(double_map); syn::custom_keyword!(blake2_256); syn::custom_keyword!(blake2_128); + syn::custom_keyword!(blake2_128_concat); syn::custom_keyword!(twox_256); syn::custom_keyword!(twox_128); syn::custom_keyword!(twox_64_concat); @@ -179,6 +180,7 @@ struct DeclStorageDoubleMap { enum Hasher { Blake2_256(keyword::blake2_256), Blake2_128(keyword::blake2_128), + Blake2_128Concat(keyword::blake2_128_concat), Twox256(keyword::twox_256), Twox128(keyword::twox_128), Twox64Concat(keyword::twox_64_concat), @@ -207,6 +209,7 @@ impl From for super::HasherKind { match hasher { Hasher::Blake2_256(_) => super::HasherKind::Blake2_256, Hasher::Blake2_128(_) => super::HasherKind::Blake2_128, + Hasher::Blake2_128Concat(_) => super::HasherKind::Blake2_128Concat, Hasher::Twox256(_) => super::HasherKind::Twox256, Hasher::Twox128(_) => super::HasherKind::Twox128, Hasher::Twox64Concat(_) => super::HasherKind::Twox64Concat, diff --git a/frame/support/src/hash.rs b/frame/support/src/hash.rs index d9c1247f7b..332a8f4e42 100644 --- a/frame/support/src/hash.rs +++ b/frame/support/src/hash.rs @@ -24,6 +24,7 @@ use sp_io::hashing::{blake2_128, blake2_256, twox_64, twox_128, twox_256}; pub trait Hashable: Sized { fn blake2_128(&self) -> [u8; 16]; fn blake2_256(&self) -> [u8; 32]; + fn blake2_128_concat(&self) -> Vec; fn twox_128(&self) -> [u8; 16]; fn twox_256(&self) -> [u8; 32]; fn twox_64_concat(&self) -> Vec; @@ -36,6 +37,9 @@ impl Hashable for T { fn blake2_256(&self) -> [u8; 32] { self.using_encoded(blake2_256) } + fn blake2_128_concat(&self) -> Vec { + self.using_encoded(Blake2_128Concat::hash) + } fn twox_128(&self) -> [u8; 16] { self.using_encoded(twox_128) } @@ -66,6 +70,19 @@ impl StorageHasher for Twox64Concat { } } +/// Hash storage keys with `concat(blake2_128(key), key)` +pub struct Blake2_128Concat; +impl StorageHasher for Blake2_128Concat { + type Output = Vec; + fn hash(x: &[u8]) -> Vec { + blake2_128(x) + .iter() + .chain(x.into_iter()) + .cloned() + .collect::>() + } +} + /// Hash storage keys with blake2 128 pub struct Blake2_128; impl StorageHasher for Blake2_128 { @@ -111,4 +128,10 @@ mod tests { let r = Twox64Concat::hash(b"foo"); assert_eq!(r.split_at(8), (&twox_128(b"foo")[..8], &b"foo"[..])) } + + #[test] + fn test_blake2_128_concat() { + let r = Blake2_128Concat::hash(b"foo"); + assert_eq!(r.split_at(16), (&blake2_128(b"foo")[..], &b"foo"[..])) + } } diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index f0357cff2f..56afc79333 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -66,7 +66,9 @@ pub mod error; pub mod traits; pub mod weights; -pub use self::hash::{Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat, Hashable}; +pub use self::hash::{ + Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat, Blake2_128Concat, Hashable +}; pub use self::storage::{ StorageValue, StorageMap, StorageLinkedMap, StorageDoubleMap, StoragePrefixedMap }; diff --git a/frame/utility/Cargo.toml b/frame/utility/Cargo.toml index f74e059e36..afd7ae3d37 100644 --- a/frame/utility/Cargo.toml +++ b/frame/utility/Cargo.toml @@ -9,6 +9,7 @@ serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } frame-support = { version = "2.0.0", default-features = false, path = "../support" } frame-system = { version = "2.0.0", default-features = false, path = "../system" } +sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "2.0.0", default-features = false, path = "../../primitives/io" } diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index 7f8552c402..edc75abe53 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -15,65 +15,645 @@ // along with Substrate. If not, see . //! # Utility Module -//! A module full of useful helpers for practical chain management. +//! A module with helpers for dispatch management. +//! +//! - [`utility::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! +//! ## Overview +//! +//! This module contains three basic pieces of functionality, two of which are stateless: +//! - Batch dispatch: A stateless operation, allowing any origin to execute multiple calls in a +//! single dispatch. This can be useful to amalgamate proposals, combining `set_code` with +//! corresponding `set_storage`s, for efficient multiple payouts with just a single signature +//! verify, or in combination with one of the other two dispatch functionality. +//! - Pseudonymal dispatch: A stateless operation, allowing a signed origin to execute a call from +//! an alternative signed origin. Each account has 2**16 possible "pseudonyms" (alternative +//! account IDs) and these can be stacked. This can be useful as a key management tool, where you +//! need multiple distinct accounts (e.g. as controllers for many staking accounts), but where +//! it's perfectly fine to have each of them controlled by the same underlying keypair. +//! - Multisig dispatch (stateful): A potentially stateful operation, allowing multiple signed +//! origins (accounts) to coordinate and dispatch a call from a well-known origin, derivable +//! deterministically from the set of account IDs and the threshold number of accounts from the +//! set that must approve it. In the case that the threshold is just one then this is a stateless +//! operation. This is useful for multisig wallets where cryptographic threshold signatures are +//! not available or desired. +//! +//! ## Interface +//! +//! ### Dispatchable Functions +//! +//! #### For batch dispatch +//! * `batch` - Dispatch multiple calls from the sender's origin. +//! +//! #### For pseudonymal dispatch +//! * `as_sub` - Dispatch a call from a secondary ("sub") signed origin. +//! +//! #### For multisig dispatch +//! * `as_multi` - Approve and if possible dispatch a call from a composite origin formed from a +//! number of signed origins. +//! * `approve_as_multi` - Approve a call from a composite origin. +//! * `cancel_as_multi` - Cancel a call from a composite origin. +//! +//! [`Call`]: ./enum.Call.html +//! [`Trait`]: ./trait.Trait.html // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] use sp_std::prelude::*; -use frame_support::{decl_module, decl_event, Parameter, weights::SimpleDispatchInfo}; -use frame_system::{self as system, ensure_root}; -use sp_runtime::{traits::Dispatchable, DispatchError}; +use codec::{Encode, Decode}; +use sp_core::TypeId; +use sp_io::hashing::blake2_256; +use frame_support::{decl_module, decl_event, decl_error, decl_storage, Parameter, ensure, RuntimeDebug}; +use frame_support::{traits::{Get, ReservableCurrency, Currency}, weights::{ + GetDispatchInfo, ClassifyDispatch, WeighData, Weight, DispatchClass, PaysFee +}}; +use frame_system::{self as system, ensure_signed}; +use sp_runtime::{DispatchError, DispatchResult, traits::Dispatchable}; + +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; /// Configuration trait. pub trait Trait: frame_system::Trait { /// The overarching event type. - type Event: From + Into<::Event>; + type Event: From> + Into<::Event>; /// The overarching call type. - type Call: Parameter + Dispatchable; + type Call: Parameter + Dispatchable + GetDispatchInfo; + + /// The currency mechanism. + type Currency: ReservableCurrency; + + /// The base amount of currency needed to reserve for creating a multisig execution. + /// + /// This is held for an additional storage item whose value size is + /// `4 + sizeof((BlockNumber, Balance, AccountId))` bytes. + type MultisigDepositBase: Get>; + + /// The amount of currency needed per unit threshold when creating a multisig execution. + /// + /// This is held for adding 32 bytes more into a pre-existing storage value. + type MultisigDepositFactor: Get>; + + /// The maximum amount of signatories allowed in the multisig. + type MaxSignatories: Get; +} + +/// A global extrinsic index, formed as the extrinsic index within a block, together with that +/// block's height. This allows a transaction in which a multisig operation of a particular +/// composite was created to be uniquely identified. +#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, Default, RuntimeDebug)] +pub struct Timepoint { + /// The hieght of the chain at the point in time. + height: BlockNumber, + /// The index of the extrinsic at the point in time. + index: u32, +} + +/// An open multisig operation. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Default, RuntimeDebug)] +pub struct Multisig { + /// The extrinsic when the multisig operation was opened. + when: Timepoint, + /// The amount held in reserve of the `depositor`, to be returned once the operation ends. + deposit: Balance, + /// The account who opened it (i.e. the first to approve it). + depositor: AccountId, + /// The approvals achieved so far, including the depositor. Always sorted. + approvals: Vec, +} + +decl_storage! { + trait Store for Module as Utility { + /// The set of open multisig operations. + pub Multisigs: double_map hasher(twox_64_concat) T::AccountId, blake2_128_concat([u8; 32]) + => Option, T::AccountId>>; + } +} + +decl_error! { + pub enum Error for Module { + /// Threshold is too low (zero). + ZeroThreshold, + /// Call is already approved by this signatory. + AlreadyApproved, + /// Call doesn't need any (more) approvals. + NoApprovalsNeeded, + /// There are too few signatories in the list. + TooFewSignatories, + /// There are too many signatories in the list. + TooManySignatories, + /// The signatories were provided out of order; they should be ordered. + SignatoriesOutOfOrder, + /// The sender was contained in the other signatories; it shouldn't be. + SenderInSignatories, + /// Multisig operation not found when attempting to cancel. + NotFound, + /// Only the account that originally created the multisig is able to cancel it. + NotOwner, + /// No timepoint was given, yet the multisig operation is already underway. + NoTimepoint, + /// A different timepoint was given to the multisig operation that is underway. + WrongTimepoint, + /// A timepoint was given, yet no multisig operation is underway. + UnexpectedTimepoint, + } } -decl_event!( +decl_event! { /// Events type. - pub enum Event { - BatchExecuted(Vec>), + pub enum Event where + AccountId = ::AccountId, + BlockNumber = ::BlockNumber + { + /// Batch of dispatches did not complete fully. Index of first failing dispatch given, as + /// well as the error. + BatchInterrupted(u32, DispatchError), + /// Batch of dispatches completed fully with no error. + BatchCompleted, + /// A new multisig operation has begun. First param is the account that is approving, + /// second is the multisig account. + NewMultisig(AccountId, AccountId), + /// A multisig operation has been approved by someone. First param is the account that is + /// approving, third is the multisig account. + MultisigApproval(AccountId, Timepoint, AccountId), + /// A multisig operation has been executed. First param is the account that is + /// approving, third is the multisig account. + MultisigExecuted(AccountId, Timepoint, AccountId, DispatchResult), + /// A multisig operation has been cancelled. First param is the account that is + /// cancelling, third is the multisig account. + MultisigCancelled(AccountId, Timepoint, AccountId), + } +} + +/// Simple index-based pass through for the weight functions. +struct Passthrough(sp_std::marker::PhantomData); + +impl Passthrough { + fn new() -> Self { Self(Default::default()) } +} +impl WeighData<(&u16, &Box)> for Passthrough { + fn weigh_data(&self, (_, call): (&u16, &Box)) -> Weight { + call.get_dispatch_info().weight + 10_000 + } +} +impl ClassifyDispatch<(&u16, &Box)> for Passthrough { + fn classify_dispatch(&self, (_, call): (&u16, &Box)) -> DispatchClass { + call.get_dispatch_info().class + } +} +impl PaysFee for Passthrough { + fn pays_fee(&self) -> bool { + true + } +} + +/// Sumation pass-through for the weight function of the batch call. +/// +/// This just adds all of the weights together of all of the calls. +struct BatchPassthrough(sp_std::marker::PhantomData); + +impl BatchPassthrough { + fn new() -> Self { Self(Default::default()) } +} +impl WeighData<(&Vec,)> for BatchPassthrough { + fn weigh_data(&self, (calls,): (&Vec,)) -> Weight { + calls.iter() + .map(|call| call.get_dispatch_info().weight) + .fold(10_000, |a, n| a + n) } +} +impl ClassifyDispatch<(&Vec,)> for BatchPassthrough { + fn classify_dispatch(&self, (_,): (&Vec,)) -> DispatchClass { + DispatchClass::Normal + } +} +impl PaysFee for BatchPassthrough { + fn pays_fee(&self) -> bool { + true + } +} + +/// Simple index-based pass through for the weight functions. +struct MultiPassthrough( + sp_std::marker::PhantomData<(Call, AccountId, Timepoint)> ); +impl MultiPassthrough { + fn new() -> Self { Self(Default::default()) } +} +impl WeighData<(&u16, &Vec, &Timepoint, &Box)> +for MultiPassthrough +{ + fn weigh_data(&self, (_, sigs, _, call): (&u16, &Vec, &Timepoint, &Box)) -> Weight { + call.get_dispatch_info().weight + 10_000 * (sigs.len() as u32 + 1) + } +} +impl ClassifyDispatch<(&u16, &Vec, &Timepoint, &Box)> +for MultiPassthrough +{ + fn classify_dispatch(&self, (_, _, _, _): (&u16, &Vec, &Timepoint, &Box)) + -> DispatchClass + { + DispatchClass::Normal + } +} +impl PaysFee +for MultiPassthrough +{ + fn pays_fee(&self) -> bool { + true + } +} + +/// Simple index-based pass through for the weight functions. +struct SigsLen( + sp_std::marker::PhantomData<(AccountId, Timepoint)> +); + +impl SigsLen { + fn new() -> Self { Self(Default::default()) } +} +impl WeighData<(&u16, &Vec, &Timepoint, &[u8; 32])> +for SigsLen +{ + fn weigh_data(&self, (_, sigs, _, _): (&u16, &Vec, &Timepoint, &[u8; 32])) -> Weight { + 10_000 * (sigs.len() as u32 + 1) + } +} +impl ClassifyDispatch<(&u16, &Vec, &Timepoint, &[u8; 32])> +for SigsLen +{ + fn classify_dispatch(&self, (_, _, _, _): (&u16, &Vec, &Timepoint, &[u8; 32])) + -> DispatchClass + { + DispatchClass::Normal + } +} +impl PaysFee +for SigsLen +{ + fn pays_fee(&self) -> bool { + true + } +} + +/// A module identifier. These are per module and should be stored in a registry somewhere. +#[derive(Clone, Copy, Eq, PartialEq, Encode, Decode)] +struct IndexedUtilityModuleId(u16); + +impl TypeId for IndexedUtilityModuleId { + const TYPE_ID: [u8; 4] = *b"suba"; +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { /// Deposit one of this module's events by using the default implementation. fn deposit_event() = default; - /// Send a batch of dispatch calls (only root). - #[weight = SimpleDispatchInfo::FreeOperational] + /// Send a batch of dispatch calls. + /// + /// This will execute until the first one fails and then stop. + /// + /// May be called from any origin. + /// + /// - `calls`: The calls to be dispatched from the same origin. + /// + /// # + /// - The sum of the weights of the `calls`. + /// - One event. + /// # + /// + /// This will return `Ok` in all circumstances. To determine the success of the batch, an + /// event is deposited. If a call failed and the batch was interrupted, then the + /// `BatchInterrupted` event is deposited, along with the number of successful calls made + /// and the error of the failed call. If all were successful, then the `BatchCompleted` + /// event is deposited. + #[weight = ::Call>>::new()] fn batch(origin, calls: Vec<::Call>) { - ensure_root(origin)?; - let results = calls.into_iter() - .map(|call| call.dispatch(frame_system::RawOrigin::Root.into())) - .map(|res| res.map_err(Into::into)) - .collect::>(); - Self::deposit_event(Event::BatchExecuted(results)); + for (index, call) in calls.into_iter().enumerate() { + let result = call.dispatch(origin.clone()); + if let Err(e) = result { + Self::deposit_event(Event::::BatchInterrupted(index as u32, e)); + return Ok(()); + } + } + Self::deposit_event(Event::::BatchCompleted); + } + + /// Send a call through an indexed pseudonym of the sender. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// # + /// - The weight of the `call`. + /// # + #[weight = ::Call>>::new()] + fn as_sub(origin, index: u16, call: Box<::Call>) -> DispatchResult { + let who = ensure_signed(origin)?; + let pseudonym = Self::sub_account_id(who, index); + call.dispatch(frame_system::RawOrigin::Signed(pseudonym).into()) + } + + /// Register approval for a dispatch to be made from a deterministic composite account if + /// approved by a total of `threshold - 1` of `other_signatories`. + /// + /// If there are enough, then dispatch the call. + /// + /// Payment: `MultisigDepositBase` will be reserved if this is the first approval, plus + /// `threshold` times `MultisigDepositFactor`. It is returned once this dispatch happens or + /// is cancelled. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// - `threshold`: The total number of approvals for this dispatch before it is executed. + /// - `other_signatories`: The accounts (other than the sender) who can approve this + /// dispatch. May not be empty. + /// - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + /// not the first approval, then it must be `Some`, with the timepoint (block number and + /// transaction index) of the first approval transaction. + /// - `call`: The call to be executed. + /// + /// NOTE: Unless this is the final approval, you will generally want to use + /// `approve_as_multi` instead, since it only requires a hash of the call. + /// + /// Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + /// on success, result is `Ok` and the result from the interior call, if it was executed, + /// may be found in the deposited `MultisigExecuted` event. + /// + /// # + /// - `O(S + Z + Call)`. + /// - Up to one balance-reserve or unreserve operation. + /// - One passthrough operation, one insert, both `O(S)` where `S` is the number of + /// signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + /// - One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + /// - One encode & hash, both of complexity `O(S)`. + /// - Up to one binary search and insert (`O(logS + S)`). + /// - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + /// - One event. + /// - The weight of the `call`. + /// - Storage: inserts one item, value size bounded by `MaxSignatories`, with a + /// deposit taken for its lifetime of + /// `MultisigDepositBase + threshold * MultisigDepositFactor`. + /// # + #[weight = ::Call, T::AccountId, Option>>>::new()] + fn as_multi(origin, + threshold: u16, + other_signatories: Vec, + maybe_timepoint: Option>, + call: Box<::Call>, + ) -> DispatchResult { + let who = ensure_signed(origin)?; + ensure!(threshold >= 1, Error::::ZeroThreshold); + let max_sigs = T::MaxSignatories::get() as usize; + ensure!(!other_signatories.is_empty(), Error::::TooFewSignatories); + ensure!(other_signatories.len() < max_sigs, Error::::TooManySignatories); + let signatories = Self::ensure_sorted_and_insert(other_signatories, who.clone())?; + + let id = Self::multi_account_id(&signatories, threshold); + let call_hash = call.using_encoded(blake2_256); + + if let Some(mut m) = >::get(&id, call_hash) { + let timepoint = maybe_timepoint.ok_or(Error::::NoTimepoint)?; + ensure!(m.when == timepoint, Error::::WrongTimepoint); + if let Err(pos) = m.approvals.binary_search(&who) { + // we know threshold is greater than zero from the above ensure. + if (m.approvals.len() as u16) < threshold - 1 { + m.approvals.insert(pos, who.clone()); + >::insert(&id, call_hash, m); + Self::deposit_event(RawEvent::MultisigApproval(who, timepoint, id)); + return Ok(()) + } + } else { + if (m.approvals.len() as u16) < threshold { + Err(Error::::AlreadyApproved)? + } + } + + let result = call.dispatch(frame_system::RawOrigin::Signed(id.clone()).into()); + let _ = T::Currency::unreserve(&m.depositor, m.deposit); + >::remove(&id, call_hash); + Self::deposit_event(RawEvent::MultisigExecuted(who, timepoint, id, result)); + } else { + ensure!(maybe_timepoint.is_none(), Error::::UnexpectedTimepoint); + if threshold > 1 { + let deposit = T::MultisigDepositBase::get() + + T::MultisigDepositFactor::get() * threshold.into(); + T::Currency::reserve(&who, deposit)?; + >::insert(&id, call_hash, Multisig { + when: Self::timepoint(), + deposit, + depositor: who.clone(), + approvals: vec![who.clone()], + }); + Self::deposit_event(RawEvent::NewMultisig(who, id)); + } else { + return call.dispatch(frame_system::RawOrigin::Signed(id).into()) + } + } + Ok(()) + } + + /// Register approval for a dispatch to be made from a deterministic composite account if + /// approved by a total of `threshold - 1` of `other_signatories`. + /// + /// Payment: `MultisigDepositBase` will be reserved if this is the first approval, plus + /// `threshold` times `MultisigDepositFactor`. It is returned once this dispatch happens or + /// is cancelled. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// - `threshold`: The total number of approvals for this dispatch before it is executed. + /// - `other_signatories`: The accounts (other than the sender) who can approve this + /// dispatch. May not be empty. + /// - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + /// not the first approval, then it must be `Some`, with the timepoint (block number and + /// transaction index) of the first approval transaction. + /// - `call_hash`: The hash of the call to be executed. + /// + /// NOTE: If this is the final approval, you will want to use `as_multi` instead. + /// + /// # + /// - `O(S)`. + /// - Up to one balance-reserve or unreserve operation. + /// - One passthrough operation, one insert, both `O(S)` where `S` is the number of + /// signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + /// - One encode & hash, both of complexity `O(S)`. + /// - Up to one binary search and insert (`O(logS + S)`). + /// - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + /// - One event. + /// - Storage: inserts one item, value size bounded by `MaxSignatories`, with a + /// deposit taken for its lifetime of + /// `MultisigDepositBase + threshold * MultisigDepositFactor`. + /// # + #[weight = >>>::new()] + fn approve_as_multi(origin, + threshold: u16, + other_signatories: Vec, + maybe_timepoint: Option>, + call_hash: [u8; 32], + ) -> DispatchResult { + let who = ensure_signed(origin)?; + ensure!(threshold >= 1, Error::::ZeroThreshold); + let max_sigs = T::MaxSignatories::get() as usize; + ensure!(!other_signatories.is_empty(), Error::::TooFewSignatories); + ensure!(other_signatories.len() < max_sigs, Error::::TooManySignatories); + let signatories = Self::ensure_sorted_and_insert(other_signatories, who.clone())?; + + let id = Self::multi_account_id(&signatories, threshold); + + if let Some(mut m) = >::get(&id, call_hash) { + let timepoint = maybe_timepoint.ok_or(Error::::NoTimepoint)?; + ensure!(m.when == timepoint, Error::::WrongTimepoint); + ensure!(m.approvals.len() < threshold as usize, Error::::NoApprovalsNeeded); + if let Err(pos) = m.approvals.binary_search(&who) { + m.approvals.insert(pos, who.clone()); + >::insert(&id, call_hash, m); + Self::deposit_event(RawEvent::MultisigApproval(who, timepoint, id)); + } else { + Err(Error::::AlreadyApproved)? + } + } else { + if threshold > 1 { + ensure!(maybe_timepoint.is_none(), Error::::UnexpectedTimepoint); + let deposit = T::MultisigDepositBase::get() + + T::MultisigDepositFactor::get() * threshold.into(); + T::Currency::reserve(&who, deposit)?; + >::insert(&id, call_hash, Multisig { + when: Self::timepoint(), + deposit, + depositor: who.clone(), + approvals: vec![who.clone()], + }); + Self::deposit_event(RawEvent::NewMultisig(who, id)); + } else { + Err(Error::::NoApprovalsNeeded)? + } + } + Ok(()) + } + + /// Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + /// for this operation will be unreserved on success. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// - `threshold`: The total number of approvals for this dispatch before it is executed. + /// - `other_signatories`: The accounts (other than the sender) who can approve this + /// dispatch. May not be empty. + /// - `timepoint`: The timepoint (block number and transaction index) of the first approval + /// transaction for this dispatch. + /// - `call_hash`: The hash of the call to be executed. + /// + /// # + /// - `O(S)`. + /// - Up to one balance-reserve or unreserve operation. + /// - One passthrough operation, one insert, both `O(S)` where `S` is the number of + /// signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + /// - One encode & hash, both of complexity `O(S)`. + /// - One event. + /// - I/O: 1 read `O(S)`, one remove. + /// - Storage: removes one item. + /// # + #[weight = >>::new()] + fn cancel_as_multi(origin, + threshold: u16, + other_signatories: Vec, + timepoint: Timepoint, + call_hash: [u8; 32], + ) -> DispatchResult { + let who = ensure_signed(origin)?; + ensure!(threshold >= 1, Error::::ZeroThreshold); + let max_sigs = T::MaxSignatories::get() as usize; + ensure!(!other_signatories.is_empty(), Error::::TooFewSignatories); + ensure!(other_signatories.len() < max_sigs, Error::::TooManySignatories); + let signatories = Self::ensure_sorted_and_insert(other_signatories, who.clone())?; + + let id = Self::multi_account_id(&signatories, threshold); + + let m = >::get(&id, call_hash) + .ok_or(Error::::NotFound)?; + ensure!(m.when == timepoint, Error::::WrongTimepoint); + ensure!(m.depositor == who, Error::::NotOwner); + + let _ = T::Currency::unreserve(&m.depositor, m.deposit); + >::remove(&id, call_hash); + + Self::deposit_event(RawEvent::MultisigCancelled(who, timepoint, id)); + Ok(()) } } } +impl Module { + /// Derive a sub-account ID from the owner account and the sub-account index. + pub fn sub_account_id(who: T::AccountId, index: u16) -> T::AccountId { + let entropy = (b"modlpy/utilisuba", who, index).using_encoded(blake2_256); + T::AccountId::decode(&mut &entropy[..]).unwrap_or_default() + } + + /// Derive a multi-account ID from the sorted list of accounts and the threshold that are + /// required. + /// + /// NOTE: `who` must be sorted. If it is not, then you'll get the wrong answer. + pub fn multi_account_id(who: &[T::AccountId], threshold: u16) -> T::AccountId { + let entropy = (b"modlpy/utilisuba", who, threshold).using_encoded(blake2_256); + T::AccountId::decode(&mut &entropy[..]).unwrap_or_default() + } + + /// The current `Timepoint`. + pub fn timepoint() -> Timepoint { + Timepoint { + height: >::block_number(), + index: >::extrinsic_count(), + } + } + + /// Check that signatories is sorted and doesn't contain sender, then insert sender. + fn ensure_sorted_and_insert(other_signatories: Vec, who: T::AccountId) + -> Result, DispatchError> + { + let mut signatories = other_signatories; + let mut maybe_last = None; + let mut index = 0; + for item in signatories.iter() { + if let Some(last) = maybe_last { + ensure!(last < item, Error::::SignatoriesOutOfOrder); + } + if item <= &who { + ensure!(item != &who, Error::::SenderInSignatories); + index += 1; + } + maybe_last = Some(item); + } + signatories.insert(index, who); + Ok(signatories) + } +} + #[cfg(test)] mod tests { use super::*; use frame_support::{ assert_ok, assert_noop, impl_outer_origin, parameter_types, impl_outer_dispatch, - weights::Weight + weights::Weight, impl_outer_event }; use sp_core::H256; - use sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup, BadOrigin}, testing::Header}; + use sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use crate as utility; impl_outer_origin! { - pub enum Origin for Test where system = frame_system {} + pub enum Origin for Test where system = frame_system {} } + impl_outer_event! { + pub enum TestEvent for Test { + pallet_balances, + utility, + } + } impl_outer_dispatch! { pub enum Call for Test where origin: Origin { pallet_balances::Balances, @@ -102,7 +682,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; - type Event = (); + type Event = TestEvent; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; @@ -119,47 +699,360 @@ mod tests { type Balance = u64; type OnFreeBalanceZero = (); type OnNewAccount = (); - type Event = (); + type Event = TestEvent; type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type TransferFee = TransferFee; type CreationFee = CreationFee; } + parameter_types! { + pub const MultisigDepositBase: u64 = 1; + pub const MultisigDepositFactor: u64 = 1; + pub const MaxSignatories: u16 = 3; + } impl Trait for Test { - type Event = (); + type Event = TestEvent; type Call = Call; + type Currency = Balances; + type MultisigDepositBase = MultisigDepositBase; + type MultisigDepositFactor = MultisigDepositFactor; + type MaxSignatories = MaxSignatories; } type Balances = pallet_balances::Module; type Utility = Module; + use pallet_balances::Call as BalancesCall; + use pallet_balances::Error as BalancesError; + fn new_test_ext() -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig:: { - balances: vec![(1, 10), (2, 0)], + balances: vec![(1, 10), (2, 10), (3, 10), (4, 10), (5, 10)], vesting: vec![], }.assimilate_storage(&mut t).unwrap(); t.into() } + fn last_event() -> TestEvent { + system::Module::::events().pop().map(|e| e.event).expect("Event expected") + } + + fn expect_event>(e: E) { + assert_eq!(last_event(), e.into()); + } + + fn now() -> Timepoint { + Utility::timepoint() + } + + #[test] + fn multisig_deposit_is_taken_and_returned() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 2); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + assert_ok!(Utility::as_multi(Origin::signed(1), 2, vec![2, 3], None, call.clone())); + assert_eq!(Balances::free_balance(1), 2); + assert_eq!(Balances::reserved_balance(1), 3); + + assert_ok!(Utility::as_multi(Origin::signed(2), 2, vec![1, 3], Some(now()), call)); + assert_eq!(Balances::free_balance(1), 5); + assert_eq!(Balances::reserved_balance(1), 0); + }); + } + #[test] - fn batch_works() { + fn cancel_multisig_returns_deposit() { new_test_ext().execute_with(|| { + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + let hash = call.using_encoded(blake2_256); + assert_ok!(Utility::approve_as_multi(Origin::signed(1), 3, vec![2, 3], None, hash.clone())); + assert_ok!(Utility::approve_as_multi(Origin::signed(2), 3, vec![1, 3], Some(now()), hash.clone())); + assert_eq!(Balances::free_balance(1), 6); + assert_eq!(Balances::reserved_balance(1), 4); + assert_ok!( + Utility::cancel_as_multi(Origin::signed(1), 3, vec![2, 3], now(), hash.clone()), + ); assert_eq!(Balances::free_balance(1), 10); - assert_eq!(Balances::free_balance(2), 0); + assert_eq!(Balances::reserved_balance(1), 0); + }); + } + + #[test] + fn timepoint_checking_works() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 2); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + let hash = call.using_encoded(blake2_256); + assert_noop!( - Utility::batch(Origin::signed(1), vec![ - Call::Balances(pallet_balances::Call::force_transfer(1, 2, 5)), - Call::Balances(pallet_balances::Call::force_transfer(1, 2, 5)) - ]), - BadOrigin, + Utility::approve_as_multi(Origin::signed(2), 2, vec![1, 3], Some(now()), hash.clone()), + Error::::UnexpectedTimepoint, ); + + assert_ok!(Utility::approve_as_multi(Origin::signed(1), 2, vec![2, 3], None, hash)); + + assert_noop!( + Utility::as_multi(Origin::signed(2), 2, vec![1, 3], None, call.clone()), + Error::::NoTimepoint, + ); + let later = Timepoint { index: 1, .. now() }; + assert_noop!( + Utility::as_multi(Origin::signed(2), 2, vec![1, 3], Some(later), call.clone()), + Error::::WrongTimepoint, + ); + }); + } + + #[test] + fn multisig_2_of_3_works() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 2); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + let hash = call.using_encoded(blake2_256); + assert_ok!(Utility::approve_as_multi(Origin::signed(1), 2, vec![2, 3], None, hash)); + assert_eq!(Balances::free_balance(6), 0); + + assert_ok!(Utility::as_multi(Origin::signed(2), 2, vec![1, 3], Some(now()), call)); + assert_eq!(Balances::free_balance(6), 15); + }); + } + + #[test] + fn multisig_3_of_3_works() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 3); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + let hash = call.using_encoded(blake2_256); + assert_ok!(Utility::approve_as_multi(Origin::signed(1), 3, vec![2, 3], None, hash.clone())); + assert_ok!(Utility::approve_as_multi(Origin::signed(2), 3, vec![1, 3], Some(now()), hash.clone())); + assert_eq!(Balances::free_balance(6), 0); + + assert_ok!(Utility::as_multi(Origin::signed(3), 3, vec![1, 2], Some(now()), call)); + assert_eq!(Balances::free_balance(6), 15); + }); + } + + #[test] + fn cancel_multisig_works() { + new_test_ext().execute_with(|| { + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + let hash = call.using_encoded(blake2_256); + assert_ok!(Utility::approve_as_multi(Origin::signed(1), 3, vec![2, 3], None, hash.clone())); + assert_ok!(Utility::approve_as_multi(Origin::signed(2), 3, vec![1, 3], Some(now()), hash.clone())); + assert_noop!( + Utility::cancel_as_multi(Origin::signed(2), 3, vec![1, 3], now(), hash.clone()), + Error::::NotOwner, + ); + assert_ok!( + Utility::cancel_as_multi(Origin::signed(1), 3, vec![2, 3], now(), hash.clone()), + ); + }); + } + + #[test] + fn multisig_2_of_3_as_multi_works() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 2); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + assert_ok!(Utility::as_multi(Origin::signed(1), 2, vec![2, 3], None, call.clone())); + assert_eq!(Balances::free_balance(6), 0); + + assert_ok!(Utility::as_multi(Origin::signed(2), 2, vec![1, 3], Some(now()), call)); + assert_eq!(Balances::free_balance(6), 15); + }); + } + + #[test] + fn multisig_2_of_3_as_multi_with_many_calls_works() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 2); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call1 = Box::new(Call::Balances(BalancesCall::transfer(6, 10))); + let call2 = Box::new(Call::Balances(BalancesCall::transfer(7, 5))); + + assert_ok!(Utility::as_multi(Origin::signed(1), 2, vec![2, 3], None, call1.clone())); + assert_ok!(Utility::as_multi(Origin::signed(2), 2, vec![1, 3], None, call2.clone())); + assert_ok!(Utility::as_multi(Origin::signed(3), 2, vec![1, 2], Some(now()), call2)); + assert_ok!(Utility::as_multi(Origin::signed(3), 2, vec![1, 2], Some(now()), call1)); + + assert_eq!(Balances::free_balance(6), 10); + assert_eq!(Balances::free_balance(7), 5); + }); + } + + #[test] + fn multisig_2_of_3_cannot_reissue_same_call() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 2); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 10))); + assert_ok!(Utility::as_multi(Origin::signed(1), 2, vec![2, 3], None, call.clone())); + assert_ok!(Utility::as_multi(Origin::signed(2), 2, vec![1, 3], Some(now()), call.clone())); + assert_eq!(Balances::free_balance(multi), 5); + + assert_ok!(Utility::as_multi(Origin::signed(1), 2, vec![2, 3], None, call.clone())); + assert_ok!(Utility::as_multi(Origin::signed(3), 2, vec![1, 2], Some(now()), call)); + + let err = DispatchError::from(BalancesError::::InsufficientBalance).stripped(); + expect_event(RawEvent::MultisigExecuted(3, now(), multi, Err(err))); + }); + } + + #[test] + fn zero_threshold_fails() { + new_test_ext().execute_with(|| { + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + assert_noop!( + Utility::as_multi(Origin::signed(1), 0, vec![2], None, call), + Error::::ZeroThreshold, + ); + }); + } + + #[test] + fn too_many_signatories_fails() { + new_test_ext().execute_with(|| { + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + assert_noop!( + Utility::as_multi(Origin::signed(1), 2, vec![2, 3, 4], None, call.clone()), + Error::::TooManySignatories, + ); + }); + } + + #[test] + fn duplicate_approvals_are_ignored() { + new_test_ext().execute_with(|| { + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + let hash = call.using_encoded(blake2_256); + assert_ok!(Utility::approve_as_multi(Origin::signed(1), 2, vec![2, 3], None, hash.clone())); + assert_noop!( + Utility::approve_as_multi(Origin::signed(1), 2, vec![2, 3], Some(now()), hash.clone()), + Error::::AlreadyApproved, + ); + assert_ok!(Utility::approve_as_multi(Origin::signed(2), 2, vec![1, 3], Some(now()), hash.clone())); + assert_noop!( + Utility::approve_as_multi(Origin::signed(3), 2, vec![1, 2], Some(now()), hash.clone()), + Error::::NoApprovalsNeeded, + ); + }); + } + + #[test] + fn multisig_1_of_3_works() { + new_test_ext().execute_with(|| { + let multi = Utility::multi_account_id(&[1, 2, 3][..], 1); + assert_ok!(Balances::transfer(Origin::signed(1), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(2), multi, 5)); + assert_ok!(Balances::transfer(Origin::signed(3), multi, 5)); + + let call = Box::new(Call::Balances(BalancesCall::transfer(6, 15))); + let hash = call.using_encoded(blake2_256); + assert_noop!( + Utility::approve_as_multi(Origin::signed(1), 1, vec![2, 3], None, hash.clone()), + Error::::NoApprovalsNeeded, + ); + assert_noop!( + Utility::as_multi(Origin::signed(4), 1, vec![2, 3], None, call.clone()), + BalancesError::::InsufficientBalance, + ); + assert_ok!(Utility::as_multi(Origin::signed(1), 1, vec![2, 3], None, call)); + + assert_eq!(Balances::free_balance(6), 15); + }); + } + + #[test] + fn as_sub_works() { + new_test_ext().execute_with(|| { + let sub_1_0 = Utility::sub_account_id(1, 0); + assert_ok!(Balances::transfer(Origin::signed(1), sub_1_0, 5)); + assert_noop!(Utility::as_sub( + Origin::signed(1), + 1, + Box::new(Call::Balances(BalancesCall::transfer(6, 3))), + ), BalancesError::::InsufficientBalance); + assert_ok!(Utility::as_sub( + Origin::signed(1), + 0, + Box::new(Call::Balances(BalancesCall::transfer(2, 3))), + )); + assert_eq!(Balances::free_balance(sub_1_0), 2); + assert_eq!(Balances::free_balance(2), 13); + }); + } + + #[test] + fn batch_with_root_works() { + new_test_ext().execute_with(|| { + assert_eq!(Balances::free_balance(1), 10); + assert_eq!(Balances::free_balance(2), 10); assert_ok!(Utility::batch(Origin::ROOT, vec![ - Call::Balances(pallet_balances::Call::force_transfer(1, 2, 5)), - Call::Balances(pallet_balances::Call::force_transfer(1, 2, 5)) + Call::Balances(BalancesCall::force_transfer(1, 2, 5)), + Call::Balances(BalancesCall::force_transfer(1, 2, 5)) ])); assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::free_balance(2), 20); + }); + } + + #[test] + fn batch_with_signed_works() { + new_test_ext().execute_with(|| { + assert_eq!(Balances::free_balance(1), 10); + assert_eq!(Balances::free_balance(2), 10); + assert_ok!( + Utility::batch(Origin::signed(1), vec![ + Call::Balances(BalancesCall::transfer(2, 5)), + Call::Balances(BalancesCall::transfer(2, 5)) + ]), + ); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::free_balance(2), 20); + }); + } + + #[test] + fn batch_early_exit_works() { + new_test_ext().execute_with(|| { + assert_eq!(Balances::free_balance(1), 10); assert_eq!(Balances::free_balance(2), 10); + assert_ok!( + Utility::batch(Origin::signed(1), vec![ + Call::Balances(BalancesCall::transfer(2, 5)), + Call::Balances(BalancesCall::transfer(2, 10)), + Call::Balances(BalancesCall::transfer(2, 5)), + ]), + ); + assert_eq!(Balances::free_balance(1), 5); + assert_eq!(Balances::free_balance(2), 15); }); } } diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 986b4bf660..1e8178f05e 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -384,6 +384,17 @@ pub enum DispatchError { }, } +impl DispatchError { + /// Return the same error but without the attached message. + pub fn stripped(self) -> Self { + match self { + DispatchError::Module { index, error, message: Some(_) } + => DispatchError::Module { index, error, message: None }, + m => m, + } + } +} + impl From for DispatchError { fn from(_: crate::traits::LookupError) -> Self { Self::CannotLookup -- GitLab From e3962b6869640308016b1a8a50845a78bda391ce Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sun, 22 Dec 2019 23:11:34 +0100 Subject: [PATCH 016/296] Twitter field for IdentityInfo (in a back-compat way) (#4476) --- frame/identity/src/lib.rs | 31 ++++++++++++++++++--- primitives/runtime/src/traits.rs | 46 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 3fda978b13..1e98e60b5e 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -69,7 +69,8 @@ use sp_std::prelude::*; use sp_std::{fmt::Debug, ops::Add, iter::once}; use enumflags2::BitFlags; use codec::{Encode, Decode}; -use sp_runtime::{DispatchResult, traits::{StaticLookup, EnsureOrigin, Zero}, RuntimeDebug}; +use sp_runtime::{DispatchResult, RuntimeDebug}; +use sp_runtime::traits::{StaticLookup, EnsureOrigin, Zero, AppendZerosInput}; use frame_support::{ decl_module, decl_event, decl_storage, ensure, decl_error, traits::{Currency, ReservableCurrency, OnUnbalanced, Get}, @@ -246,6 +247,7 @@ pub enum IdentityField { Email = 0b0000000000000000000000000000000000000000000000000000000000010000, PgpFingerprint = 0b0000000000000000000000000000000000000000000000000000000000100000, Image = 0b0000000000000000000000000000000000000000000000000000000001000000, + Twitter = 0b0000000000000000000000000000000000000000000000000000000010000000, } /// Wrapper type for `BitFlags` that implements `Codec`. @@ -296,7 +298,7 @@ pub struct IdentityInfo { /// Stored as UTF-8. pub web: Data, - /// The Riot handle held by the controller of the account. + /// The Riot/Matrix handle held by the controller of the account. /// /// Stored as UTF-8. pub riot: Data, @@ -312,6 +314,9 @@ pub struct IdentityInfo { /// A graphic image representing the controller of the account. Should be a company, /// organization or project logo or a headshot in the case of a human. pub image: Data, + + /// The Twitter identity. The leading `@` character may be elided. + pub twitter: Data, } /// Information concerning the identity of the controller of an account. @@ -344,7 +349,7 @@ impl < } /// Information concerning a registrar. -#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug)] +#[derive(Clone, Encode, Eq, PartialEq, RuntimeDebug)] pub struct RegistrarInfo< Balance: Encode + Decode + Clone + Debug + Eq + PartialEq, AccountId: Encode + Decode + Clone + Debug + Eq + PartialEq @@ -360,6 +365,16 @@ pub struct RegistrarInfo< pub fields: IdentityFields, } +impl< + Balance: Encode + Decode + Clone + Debug + Eq + PartialEq, + AccountId: Encode + Decode + Clone + Debug + Eq + PartialEq +> Decode for RegistrarInfo { + fn decode(input: &mut I) -> sp_std::result::Result { + let (account, fee, fields) = Decode::decode(&mut AppendZerosInput::new(input))?; + Ok(Self { account, fee, fields }) + } +} + decl_storage! { trait Store for Module as Sudo { /// Information that is pertinent to identify the entity behind an account. @@ -958,6 +973,16 @@ mod tests { } } + #[test] + fn trailing_zeros_decodes_into_default_data() { + let encoded = Data::Raw(b"Hello".to_vec()).encode(); + assert!(<(Data, Data)>::decode(&mut &encoded[..]).is_err()); + let input = &mut &encoded[..]; + let (a, b) = <(Data, Data)>::decode(&mut AppendZerosInput::new(input)).unwrap(); + assert_eq!(a, Data::Raw(b"Hello".to_vec())); + assert_eq!(b, Data::None); + } + #[test] fn adding_registrar_should_work() { new_test_ext().execute_with(|| { diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 22cd2814e7..a40cd35882 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -999,6 +999,52 @@ pub trait OpaqueKeys: Clone { fn ownership_proof_is_valid(&self, _proof: &[u8]) -> bool { true } } +/// Input that adds infinite number of zero after wrapped input. +/// +/// This can add an infinite stream of zeros onto any input, not just a slice as with +/// `TrailingZerosInput`. +pub struct AppendZerosInput<'a, T>(&'a mut T); + +impl<'a, T> AppendZerosInput<'a, T> { + /// Create a new instance from the given byte array. + pub fn new(input: &'a mut T) -> Self { + Self(input) + } +} + +impl<'a, T: codec::Input> codec::Input for AppendZerosInput<'a, T> { + fn remaining_len(&mut self) -> Result, codec::Error> { + Ok(None) + } + + fn read(&mut self, into: &mut [u8]) -> Result<(), codec::Error> { + let remaining = self.0.remaining_len()?; + let completed = if let Some(n) = remaining { + let readable = into.len().min(n); + // this should never fail if `remaining_len` API is implemented correctly. + self.0.read(&mut into[..readable])?; + readable + } else { + // Fill it byte-by-byte. + let mut i = 0; + while i < into.len() { + if let Ok(b) = self.0.read_byte() { + into[i] = b; + i += 1; + } else { + break; + } + } + i + }; + // Fill the rest with zeros. + for i in &mut into[completed..] { + *i = 0; + } + Ok(()) + } +} + /// Input that adds infinite number of zero after wrapped input. pub struct TrailingZeroInput<'a>(&'a [u8]); -- GitLab From 56d9f642101d94bd88fac037e62792ba956c6492 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 23 Dec 2019 17:41:43 +0300 Subject: [PATCH 017/296] fix warnings in grafana module (#4486) --- utils/grafana-data-source/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils/grafana-data-source/src/lib.rs b/utils/grafana-data-source/src/lib.rs index 229400066a..86c523cc53 100644 --- a/utils/grafana-data-source/src/lib.rs +++ b/utils/grafana-data-source/src/lib.rs @@ -71,10 +71,15 @@ pub fn record_metrics_slice(metrics: &[(&str, f32)]) -> Result<(), Error> { /// Error type that can be returned by either `record_metrics` or `run_server`. #[derive(Debug, derive_more::Display, derive_more::From)] pub enum Error { + /// Hyper internal error. Hyper(hyper::Error), + /// Serialization/deserialization error. Serde(serde_json::Error), + /// Http request error. Http(hyper::http::Error), + /// Timestamp error. Timestamp(TryFromIntError), + /// i/o error. Io(std::io::Error) } -- GitLab From 042c9bb89c6ca8a432d0f66c70c97ebc36e49702 Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Mon, 23 Dec 2019 18:23:35 +0200 Subject: [PATCH 018/296] Change log level for DhtEvent::ValueNotFound from warn to debug (#4485) --- client/authority-discovery/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index d8cb074395..0bcd6c75ca 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -281,7 +281,7 @@ where self.handle_dht_value_found_event(v)?; } - DhtEvent::ValueNotFound(hash) => warn!( + DhtEvent::ValueNotFound(hash) => debug!( target: "sub-authority-discovery", "Value for hash '{:?}' not found on Dht.", hash ), -- GitLab From 73ae66aeb11f96303283a7ebde58b4849ee1fadc Mon Sep 17 00:00:00 2001 From: gabriel klawitter Date: Tue, 24 Dec 2019 03:43:05 +0900 Subject: [PATCH 019/296] ci: increase git cloning depth to 100 (#4481) * ci: increase git cloning depth to 100 * check_runtime: verify shallow git clones to contain origin/master * check_runtime: fetch master branch --- .gitlab-ci.yml | 2 +- .maintain/gitlab/check_runtime.sh | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 643ac7afd1..90e0c2b007 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ stages: variables: GIT_STRATEGY: fetch - GIT_DEPTH: "3" + GIT_DEPTH: 100 CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}" SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache" CARGO_INCREMENTAL: 0 diff --git a/.maintain/gitlab/check_runtime.sh b/.maintain/gitlab/check_runtime.sh index 157878d239..f989904cb5 100755 --- a/.maintain/gitlab/check_runtime.sh +++ b/.maintain/gitlab/check_runtime.sh @@ -27,6 +27,15 @@ github_label () { +git fetch --depth=${GIT_DEPTH:-100} origin master + +# check if master is part of this checkout +if ! git log -n 1 origin/master +then + echo "unable to check for runtime changes: checkout does not contain origin/master branch" + exit 3 +fi + # check if the wasm sources changed if ! git diff --name-only origin/master...${CI_COMMIT_SHA} \ | grep -q -e '^bin/node/src/runtime' -e '^frame/' -e '^primitives/sr-' | grep -v -e '^primitives/sr-arithmetic/fuzzer' -- GitLab From afd36f4b02b518cffbf436d38319ab5b7a924fe7 Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Tue, 24 Dec 2019 12:11:57 +0200 Subject: [PATCH 020/296] Migrate election-phragmen, election contracts and authorship to decl_error (#4479) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Migrate election-phragmen * Migrate elections * Migrate contracts module * Update authorship module * Apply suggestions from code review Co-authored-by: Bastian Köcher --- frame/authorship/src/lib.rs | 52 +++++++---- frame/contracts/src/lib.rs | 37 +++++--- frame/elections-phragmen/src/lib.rs | 96 +++++++++++++------- frame/elections/src/lib.rs | 135 ++++++++++++++++++++-------- frame/elections/src/tests.rs | 50 +++++------ frame/generic-asset/src/lib.rs | 2 +- 6 files changed, 255 insertions(+), 117 deletions(-) diff --git a/frame/authorship/src/lib.rs b/frame/authorship/src/lib.rs index 5c2f964220..d8fd742026 100644 --- a/frame/authorship/src/lib.rs +++ b/frame/authorship/src/lib.rs @@ -22,7 +22,7 @@ use sp_std::{result, prelude::*}; use sp_std::collections::btree_set::BTreeSet; -use frame_support::{decl_module, decl_storage, dispatch, ensure}; +use frame_support::{decl_module, decl_storage, decl_error, dispatch, ensure}; use frame_support::traits::{FindAuthor, VerifySeal, Get}; use codec::{Encode, Decode}; use frame_system::ensure_none; @@ -161,8 +161,30 @@ decl_storage! { } } +decl_error! { + /// Error for the authorship module. + pub enum Error for Module { + /// The uncle parent not in the chain. + InvalidUncleParent, + /// Uncles already set in the block. + UnclesAlreadySet, + /// Too many uncles. + TooManyUncles, + /// The uncle is genesis. + GenesisUncle, + /// The uncle is too high in chain. + TooHighUncle, + /// The uncle is already included. + UncleAlreadyIncluded, + /// The uncle isn't recent enough to be included. + OldUncle, + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + fn on_initialize(now: T::BlockNumber) { let uncle_generations = T::UncleGenerations::get(); // prune uncles that are older than the allowed number of generations. @@ -186,10 +208,10 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_uncles(origin, new_uncles: Vec) -> dispatch::DispatchResult { ensure_none(origin)?; - ensure!(new_uncles.len() <= MAX_UNCLES, "Too many uncles"); + ensure!(new_uncles.len() <= MAX_UNCLES, Error::::TooManyUncles); if ::DidSetUncles::get() { - Err("Uncles already set in block.")? + Err(Error::::UnclesAlreadySet)? } ::DidSetUncles::put(true); @@ -251,7 +273,7 @@ impl Module { uncle: &T::Header, existing_uncles: I, accumulator: &mut >::Accumulator, - ) -> Result, &'static str> + ) -> Result, dispatch::DispatchError> { let now = >::block_number(); @@ -269,34 +291,34 @@ impl Module { let hash = uncle.hash(); if uncle.number() < &One::one() { - return Err("uncle is genesis"); + return Err(Error::::GenesisUncle.into()); } if uncle.number() > &maximum_height { - return Err("uncle is too high in chain"); + return Err(Error::::TooHighUncle.into()); } { let parent_number = uncle.number().clone() - One::one(); let parent_hash = >::block_hash(&parent_number); if &parent_hash != uncle.parent_hash() { - return Err("uncle parent not in chain"); + return Err(Error::::InvalidUncleParent.into()); } } if uncle.number() < &minimum_height { - return Err("uncle not recent enough to be included"); + return Err(Error::::OldUncle.into()); } let duplicate = existing_uncles.into_iter().find(|h| **h == hash).is_some(); let in_chain = >::block_hash(uncle.number()) == hash; if duplicate || in_chain { - return Err("uncle already included") + return Err(Error::::UncleAlreadyIncluded.into()) } // check uncle validity. - T::FilterUncle::filter_uncle(&uncle, accumulator) + T::FilterUncle::filter_uncle(&uncle, accumulator).map_err(|e| Into::into(e)) } fn prune_old_uncles(minimum_height: T::BlockNumber) { @@ -360,7 +382,7 @@ impl ProvideInherent for Module { fn check_inherent(call: &Self::Call, _data: &InherentData) -> result::Result<(), Self::Error> { match call { Call::set_uncles(ref uncles) if uncles.len() > MAX_UNCLES => { - Err(InherentError::Uncles("Too many uncles".into())) + Err(InherentError::Uncles(Error::::TooManyUncles.as_str().into())) }, _ => { Ok(()) @@ -566,7 +588,7 @@ mod tests { ); assert_eq!( Authorship::verify_and_import_uncles(vec![uncle_a.clone(), uncle_a.clone()]), - Err("uncle already included".into()), + Err(Error::::UncleAlreadyIncluded.into()), ); } @@ -581,7 +603,7 @@ mod tests { assert_eq!( Authorship::verify_and_import_uncles(vec![uncle_a.clone()]), - Err("uncle already included".into()), + Err(Error::::UncleAlreadyIncluded.into()), ); } @@ -591,7 +613,7 @@ mod tests { assert_eq!( Authorship::verify_and_import_uncles(vec![uncle_clone]), - Err("uncle already included".into()), + Err(Error::::UncleAlreadyIncluded.into()), ); } @@ -615,7 +637,7 @@ mod tests { assert_eq!( Authorship::verify_and_import_uncles(vec![gen_2]), - Err("uncle not recent enough to be included".into()), + Err(Error::::OldUncle.into()), ); } diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index d1bea0ca98..d17f09cda8 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -121,7 +121,7 @@ use sp_runtime::{ }; use frame_support::dispatch::{DispatchResult, Dispatchable}; use frame_support::{ - Parameter, decl_module, decl_event, decl_storage, storage::child, + Parameter, decl_module, decl_event, decl_storage, decl_error, storage::child, parameter_types, IsSubType, weights::DispatchInfo, }; @@ -467,9 +467,29 @@ impl ComputeDispatchFee<::Call, BalanceOf> for DefaultD } } +decl_error! { + /// Error for the contracts module. + pub enum Error for Module { + /// A new schedule must have a greater version than the current one. + InvalidScheduleVersion, + /// An origin must be signed or inherent and auxiliary sender only provided on inherent. + InvalidSurchargeClaim, + /// Cannot restore from nonexisting or tombstone contract. + InvalidSourceContract, + /// Cannot restore to nonexisting or alive contract. + InvalidDestinationContract, + /// Tombstones don't match. + InvalidTombstone, + /// An origin TrieId written in the current block. + InvalidContractOrigin + } +} + decl_module! { /// Contracts module. pub struct Module for enum Call where origin: ::Origin { + type Error = Error; + /// Number of block delay an extrinsic claim surcharge has. /// /// When claim surcharge is called by an extrinsic the rent is checked @@ -542,7 +562,7 @@ decl_module! { pub fn update_schedule(origin, schedule: Schedule) -> DispatchResult { ensure_root(origin)?; if >::current_schedule().version >= schedule.version { - Err("new schedule must have a greater version than current")? + Err(Error::::InvalidScheduleVersion)? } Self::deposit_event(RawEvent::ScheduleUpdated(schedule.version)); @@ -636,10 +656,7 @@ decl_module! { (Ok(frame_system::RawOrigin::None), Some(aux_sender)) => { (false, aux_sender) }, - _ => Err( - "Invalid surcharge claim: origin must be signed or \ - inherent and auxiliary sender only provided on inherent" - )?, + _ => Err(Error::::InvalidSurchargeClaim)?, }; // Add some advantage for block producers (who send unsigned extrinsics) by @@ -786,17 +803,17 @@ impl Module { ) -> DispatchResult { let mut origin_contract = >::get(&origin) .and_then(|c| c.get_alive()) - .ok_or("Cannot restore from inexisting or tombstone contract")?; + .ok_or(Error::::InvalidSourceContract)?; let current_block = >::block_number(); if origin_contract.last_write == Some(current_block) { - Err("Origin TrieId written in the current block")? + Err(Error::::InvalidContractOrigin)? } let dest_tombstone = >::get(&dest) .and_then(|c| c.get_tombstone()) - .ok_or("Cannot restore to inexisting or alive contract")?; + .ok_or(Error::::InvalidDestinationContract)?; let last_write = if !delta.is_empty() { Some(current_block) @@ -841,7 +858,7 @@ impl Module { ); } - return Err("Tombstones don't match".into()); + return Err(Error::::InvalidTombstone.into()); } origin_contract.storage_size -= key_values_taken.iter() diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 8e93775649..8c12f314f8 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -83,9 +83,9 @@ #![cfg_attr(not(feature = "std"), no_std)] use sp_std::prelude::*; -use sp_runtime::{print, DispatchResult, traits::{Zero, StaticLookup, Bounded, Convert}}; +use sp_runtime::{print, DispatchResult, DispatchError, traits::{Zero, StaticLookup, Bounded, Convert}}; use frame_support::{ - decl_storage, decl_event, ensure, decl_module, weights::SimpleDispatchInfo, + decl_storage, decl_event, ensure, decl_module, decl_error, weights::SimpleDispatchInfo, traits::{ Currency, Get, LockableCurrency, LockIdentifier, ReservableCurrency, WithdrawReasons, ChangeMembers, OnUnbalanced, WithdrawReason @@ -167,8 +167,44 @@ decl_storage! { } } +decl_error! { + /// Error for the elections-phragmen module. + pub enum Error for Module { + /// Cannot vote when no candidates or members exist. + UnableToVote, + /// Must vote for at least one candidate. + NoVotes, + /// Cannot vote more than candidates. + TooManyVotes, + /// Cannot vote more than maximum allowed. + MaximumVotesExceeded, + /// Cannot vote with stake less than minimum balance. + LowBalance, + /// Voter can not pay voting bond. + UnableToPayBond, + /// Must be a voter. + MustBeVoter, + /// Cannot report self. + ReportSelf, + /// Duplicated candidate submission. + DuplicatedCandidate, + /// Member cannot re-submit candidacy. + MemberSubmit, + /// Runner cannot re-submit candidacy. + RunnerSubmit, + /// Candidate does not have enough funds. + InsufficientCandidateFunds, + /// Origin is not a candidate, member or a runner up. + InvalidOrigin, + /// Not a member. + NotMember, + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + fn deposit_event() = default; const CandidacyBond: BalanceOf = T::CandidacyBond::get(); @@ -201,20 +237,20 @@ decl_module! { // addition is valid: candidates and members never overlap. let allowed_votes = candidates_count + members_count; - ensure!(!allowed_votes.is_zero(), "cannot vote when no candidates or members exist"); - ensure!(votes.len() <= allowed_votes, "cannot vote more than candidates"); - ensure!(votes.len() <= MAXIMUM_VOTE, "cannot vote more than maximum allowed"); - ensure!(!votes.is_empty(), "must vote for at least one candidate."); + ensure!(!allowed_votes.is_zero(), Error::::UnableToVote); + ensure!(votes.len() <= allowed_votes, Error::::TooManyVotes); + ensure!(votes.len() <= MAXIMUM_VOTE, Error::::MaximumVotesExceeded); + ensure!(!votes.is_empty(), Error::::NoVotes); ensure!( value > T::Currency::minimum_balance(), - "cannot vote with stake less than minimum balance" + Error::::LowBalance, ); if !Self::is_voter(&who) { // first time voter. Reserve bond. T::Currency::reserve(&who, T::VotingBond::get()) - .map_err(|_| "voter can not pay voting bond")?; + .map_err(|_| Error::::UnableToPayBond)?; } // Amount to be locked up. let locked_balance = value.min(T::Currency::total_balance(&who)); @@ -242,7 +278,7 @@ decl_module! { fn remove_voter(origin) { let who = ensure_signed(origin)?; - ensure!(Self::is_voter(&who), "must be a voter"); + ensure!(Self::is_voter(&who), Error::::MustBeVoter); Self::do_remove_voter(&who, true); } @@ -265,8 +301,8 @@ decl_module! { let reporter = ensure_signed(origin)?; let target = T::Lookup::lookup(target)?; - ensure!(reporter != target, "cannot report self"); - ensure!(Self::is_voter(&reporter), "reporter must be a voter"); + ensure!(reporter != target, Error::::ReportSelf); + ensure!(Self::is_voter(&reporter), Error::::MustBeVoter); // Checking if someone is a candidate and a member here is O(LogN), making the whole // function O(MLonN) with N candidates in total and M of them being voted by `target`. @@ -308,15 +344,15 @@ decl_module! { let who = ensure_signed(origin)?; let is_candidate = Self::is_candidate(&who); - ensure!(is_candidate.is_err(), "duplicate candidate submission"); + ensure!(is_candidate.is_err(), Error::::DuplicatedCandidate); // assured to be an error, error always contains the index. let index = is_candidate.unwrap_err(); - ensure!(!Self::is_member(&who), "member cannot re-submit candidacy"); - ensure!(!Self::is_runner(&who), "runner cannot re-submit candidacy"); + ensure!(!Self::is_member(&who), Error::::MemberSubmit); + ensure!(!Self::is_runner(&who), Error::::RunnerSubmit); T::Currency::reserve(&who, T::CandidacyBond::get()) - .map_err(|_| "candidate does not have enough funds")?; + .map_err(|_| Error::::InsufficientCandidateFunds)?; >::mutate(|c| c.insert(index, who)); } @@ -373,7 +409,7 @@ decl_module! { return Ok(()); } - Err("origin is not a candidate, member or a runner up.")? + Err(Error::::InvalidOrigin)? } /// Remove a particular member from the set. This is effective immediately and the bond of @@ -402,7 +438,7 @@ decl_module! { if !had_replacement { Self::do_phragmen(); } - }).map_err(Into::into) + }) } /// What to do at the end of each block. Checks if an election needs to happen or not. @@ -444,7 +480,7 @@ impl Module { /// accordingly. Furthermore, the membership change is reported. /// /// O(phragmen) in the worse case. - fn remove_and_replace_member(who: &T::AccountId) -> Result { + fn remove_and_replace_member(who: &T::AccountId) -> Result { let mut members_with_stake = Self::members(); if let Ok(index) = members_with_stake.binary_search_by(|(ref m, ref _s)| m.cmp(who)) { members_with_stake.remove(index); @@ -469,7 +505,7 @@ impl Module { } result } else { - Err("not a member") + Err(Error::::NotMember)? } } @@ -1072,7 +1108,7 @@ mod tests { assert_eq!(Elections::candidates(), vec![1]); assert_noop!( Elections::submit_candidacy(Origin::signed(1)), - "duplicate candidate submission" + Error::::DuplicatedCandidate, ); }); } @@ -1093,7 +1129,7 @@ mod tests { assert_noop!( Elections::submit_candidacy(Origin::signed(5)), - "member cannot re-submit candidacy" + Error::::MemberSubmit, ); }); } @@ -1116,7 +1152,7 @@ mod tests { assert_noop!( Elections::submit_candidacy(Origin::signed(3)), - "runner cannot re-submit candidacy", + Error::::RunnerSubmit, ); }); } @@ -1127,7 +1163,7 @@ mod tests { assert_eq!(Elections::candidates(), Vec::::new()); assert_noop!( Elections::submit_candidacy(Origin::signed(7)), - "candidate does not have enough funds", + Error::::InsufficientCandidateFunds, ); }); } @@ -1186,7 +1222,7 @@ mod tests { ExtBuilder::default().build().execute_with(|| { assert_noop!( Elections::vote(Origin::signed(2), vec![], 20), - "cannot vote when no candidates or members exist" + Error::::UnableToVote, ); }); } @@ -1217,7 +1253,7 @@ mod tests { assert_noop!( Elections::vote(Origin::signed(2), vec![10, 20, 30], 20), - "cannot vote more than candidates", + Error::::TooManyVotes, ); }); } @@ -1230,7 +1266,7 @@ mod tests { assert_noop!( Elections::vote(Origin::signed(2), vec![4], 1), - "cannot vote with stake less than minimum balance", + Error::::LowBalance, ); }) } @@ -1276,7 +1312,7 @@ mod tests { #[test] fn non_voter_remove_should_not_work() { ExtBuilder::default().build().execute_with(|| { - assert_noop!(Elections::remove_voter(Origin::signed(3)), "must be a voter"); + assert_noop!(Elections::remove_voter(Origin::signed(3)), Error::::MustBeVoter); }); } @@ -1289,7 +1325,7 @@ mod tests { assert_ok!(Elections::remove_voter(Origin::signed(2))); assert_eq!(all_voters(), vec![]); - assert_noop!(Elections::remove_voter(Origin::signed(2)), "must be a voter"); + assert_noop!(Elections::remove_voter(Origin::signed(2)), Error::::MustBeVoter); }); } @@ -1318,7 +1354,7 @@ mod tests { ExtBuilder::default().build().execute_with(|| { assert_noop!( Elections::report_defunct_voter(Origin::signed(1), 2), - "reporter must be a voter", + Error::::MustBeVoter, ); }); } @@ -2032,7 +2068,7 @@ mod tests { ExtBuilder::default().build().execute_with(|| { assert_noop!( Elections::renounce_candidacy(Origin::signed(5)), - "origin is not a candidate, member or a runner up.", + Error::::InvalidOrigin, ); }) } diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index 1435c05951..9b3dc61540 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -29,7 +29,7 @@ use sp_runtime::{ traits::{Zero, One, StaticLookup, Bounded, Saturating}, }; use frame_support::{ - decl_storage, decl_event, ensure, decl_module, + decl_storage, decl_event, ensure, decl_module, decl_error, weights::SimpleDispatchInfo, traits::{ Currency, ExistenceRequirement, Get, LockableCurrency, LockIdentifier, @@ -267,8 +267,72 @@ decl_storage! { } } +decl_error! { + /// Error for the elections module. + pub enum Error for Module { + /// Reporter must be a voter. + NotVoter, + /// Target for inactivity cleanup must be active. + InactiveTarget, + /// Cannot reap during presentation period. + CannotReapPresenting, + /// Cannot reap during grace period. + ReapGrace, + /// Not a proxy. + NotProxy, + /// Invalid reporter index. + InvalidReporterIndex, + /// Invalid target index. + InvalidTargetIndex, + /// Invalid vote index. + InvalidVoteIndex, + /// Cannot retract when presenting. + CannotRetractPresenting, + /// Cannot retract non-voter. + RetractNonVoter, + /// Invalid retraction index. + InvalidRetractionIndex, + /// Duplicate candidate submission. + DuplicatedCandidate, + /// Invalid candidate slot. + InvalidCandidateSlot, + /// Candidate has not enough funds. + InsufficientCandidateFunds, + /// Presenter must have sufficient slashable funds. + InsufficientPresenterFunds, + /// Stake deposited to present winner and be added to leaderboard should be non-zero. + ZeroDeposit, + /// Candidate not worthy of leaderboard. + UnworthyCandidate, + /// Leaderboard must exist while present phase active. + LeaderboardMustExist, + /// Cannot present outside of presentation period. + NotPresentationPeriod, + /// Presented candidate must be current. + InvalidCandidate, + /// Duplicated presentation. + DuplicatedPresentation, + /// Incorrect total. + IncorrectTotal, + /// Invalid voter index. + InvalidVoterIndex, + /// New voter must have sufficient funds to pay the bond. + InsufficientVoterFunds, + /// Locked value must be more than limit. + InsufficientLockedValue, + /// Amount of candidate votes cannot exceed amount of candidates. + TooManyVotes, + /// Amount of candidates to receive approval votes should be non-zero. + ZeroCandidates, + /// No approval changes during presentation period. + ApprovalPresentation, + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + /// How much should be locked up in order to submit one's candidacy. A reasonable /// default value is 9. const CandidacyBond: BalanceOf = T::CandidacyBond::get(); @@ -363,7 +427,7 @@ decl_module! { hint: SetIndex, #[compact] value: BalanceOf ) -> DispatchResult { - let who = Self::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; + let who = Self::proxy(ensure_signed(origin)?).ok_or(Error::::NotProxy)?; Self::do_set_approvals(who, votes, index, hint, value) } @@ -390,26 +454,25 @@ decl_module! { let reporter = ensure_signed(origin)?; let who = T::Lookup::lookup(who)?; - ensure!(!Self::presentation_active(), "cannot reap during presentation period"); - ensure!(Self::voter_info(&reporter).is_some(), "reporter must be a voter"); + ensure!(!Self::presentation_active(), Error::::CannotReapPresenting); + ensure!(Self::voter_info(&reporter).is_some(), Error::::NotVoter); - let info = Self::voter_info(&who) - .ok_or("target for inactivity cleanup must be active")?; + let info = Self::voter_info(&who).ok_or(Error::::InactiveTarget)?; let last_active = info.last_active; - ensure!(assumed_vote_index == Self::vote_index(), "vote index not current"); + ensure!(assumed_vote_index == Self::vote_index(), Error::::InvalidVoteIndex); ensure!( assumed_vote_index > last_active + T::InactiveGracePeriod::get(), - "cannot reap during grace period" + Error::::ReapGrace, ); let reporter_index = reporter_index as usize; let who_index = who_index as usize; - 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")?; + let assumed_reporter = Self::voter_at(reporter_index).ok_or(Error::::InvalidReporterIndex)?; + let assumed_who = Self::voter_at(who_index).ok_or(Error::::InvalidTargetIndex)?; - ensure!(assumed_reporter == reporter, "bad reporter index"); - ensure!(assumed_who == who, "bad target index"); + ensure!(assumed_reporter == reporter, Error::::InvalidReporterIndex); + ensure!(assumed_who == who, Error::::InvalidTargetIndex); // will definitely kill one of reporter or who now. @@ -458,11 +521,11 @@ decl_module! { 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"); + ensure!(!Self::presentation_active(), Error::::CannotRetractPresenting); + ensure!(>::exists(&who), Error::::RetractNonVoter); let index = index as usize; - let voter = Self::voter_at(index).ok_or("retraction index invalid")?; - ensure!(voter == who, "retraction index mismatch"); + let voter = Self::voter_at(index).ok_or(Error::::InvalidRetractionIndex)?; + ensure!(voter == who, Error::::InvalidRetractionIndex); Self::remove_voter(&who, index); T::Currency::unreserve(&who, T::VotingBond::get()); @@ -486,18 +549,18 @@ decl_module! { fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; - ensure!(!Self::is_a_candidate(&who), "duplicate candidate submission"); + ensure!(!Self::is_a_candidate(&who), Error::::DuplicatedCandidate); let slot = slot as usize; let count = Self::candidate_count() as usize; let candidates = Self::candidates(); ensure!( (slot == count && count == candidates.len()) || (slot < candidates.len() && candidates[slot] == T::AccountId::default()), - "invalid candidate slot" + Error::::InvalidCandidateSlot, ); // NOTE: This must be last as it has side-effects. T::Currency::reserve(&who, T::CandidacyBond::get()) - .map_err(|_| "candidate has not enough funds")?; + .map_err(|_| Error::::InsufficientCandidateFunds)?; >::insert(&who, (Self::vote_index(), slot as u32)); let mut candidates = candidates; @@ -529,35 +592,35 @@ decl_module! { let who = ensure_signed(origin)?; ensure!( !total.is_zero(), - "stake deposited to present winner and be added to leaderboard should be non-zero", + Error::::ZeroDeposit, ); let candidate = T::Lookup::lookup(candidate)?; - ensure!(index == Self::vote_index(), "index not current"); + ensure!(index == Self::vote_index(), Error::::InvalidVoteIndex); let (_, _, expiring) = Self::next_finalize() - .ok_or("cannot present outside of presentation period")?; + .ok_or(Error::::NotPresentationPeriod)?; let bad_presentation_punishment = T::PresentSlashPerVoter::get() * BalanceOf::::from(Self::voter_count() as u32); ensure!( T::Currency::can_slash(&who, bad_presentation_punishment), - "presenter must have sufficient slashable funds" + Error::::InsufficientPresenterFunds, ); let mut leaderboard = Self::leaderboard() - .ok_or("leaderboard must exist while present phase active")?; - ensure!(total > leaderboard[0].0, "candidate not worthy of leaderboard"); + .ok_or(Error::::LeaderboardMustExist)?; + ensure!(total > leaderboard[0].0, Error::::UnworthyCandidate); if let Some(p) = Self::members().iter().position(|&(ref c, _)| c == &candidate) { ensure!( p < expiring.len(), - "candidate must not form a duplicated member if elected" + Error::::DuplicatedCandidate, ); } let voters = Self::all_voters(); let (registered_since, candidate_index): (VoteIndex, u32) = - Self::candidate_reg_info(&candidate).ok_or("presented candidate must be current")?; + Self::candidate_reg_info(&candidate).ok_or(Error::::InvalidCandidate)?; let actual_total = voters.iter() .filter_map(|maybe_voter| maybe_voter.as_ref()) .filter_map(|voter| match Self::voter_info(voter) { @@ -586,7 +649,7 @@ decl_module! { // better safe than sorry. let imbalance = T::Currency::slash(&who, bad_presentation_punishment).0; T::BadPresentation::on_unbalanced(imbalance); - Err(if dupe { "duplicate presentation" } else { "incorrect total" })? + Err(if dupe { Error::::DuplicatedPresentation } else { Error::::IncorrectTotal })? } } @@ -752,11 +815,11 @@ impl Module { ) -> DispatchResult { let candidates_len = ::Candidates::decode_len().unwrap_or(0_usize); - ensure!(!Self::presentation_active(), "no approval changes during presentation period"); - ensure!(index == Self::vote_index(), "incorrect vote index"); + ensure!(!Self::presentation_active(), Error::::ApprovalPresentation); + ensure!(index == Self::vote_index(), Error::::InvalidVoteIndex); ensure!( !candidates_len.is_zero(), - "amount of candidates to receive approval votes should be non-zero" + Error::::ZeroCandidates, ); // 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 @@ -764,9 +827,9 @@ impl Module { // bond would cover. ensure!( candidates_len >= votes.len(), - "amount of candidate votes cannot exceed amount of candidates" + Error::::TooManyVotes, ); - ensure!(value >= T::MinimumVotingLock::get(), "locked value must be more than limit"); + ensure!(value >= T::MinimumVotingLock::get(), Error::::InsufficientLockedValue); // Amount to be locked up. let mut locked_balance = value.min(T::Currency::total_balance(&who)); @@ -775,8 +838,8 @@ impl Module { 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"); + let voter = Self::voter_at(hint).ok_or(Error::::InvalidVoterIndex)?; + ensure!(voter == who, Error::::InvalidVoterIndex); // write new accumulated offset. let last_win = info.last_win; @@ -787,7 +850,7 @@ impl Module { // not yet a voter. Index _could be valid_. Fee might apply. Bond will be reserved O(1). ensure!( T::Currency::free_balance(&who) > T::VotingBond::get(), - "new voter must have sufficient funds to pay the bond" + Error::::InsufficientVoterFunds, ); let (set_index, vec_index) = Self::split_index(hint, VOTER_SET_SIZE); diff --git a/frame/elections/src/tests.rs b/frame/elections/src/tests.rs index d7d7e8718b..40acb72f9e 100644 --- a/frame/elections/src/tests.rs +++ b/frame/elections/src/tests.rs @@ -256,7 +256,7 @@ fn chunking_voter_index_does_not_take_holes_into_account() { // proof: can submit a new approval with the old index. assert_noop!( Elections::set_approvals(Origin::signed(65), vec![], 0, 64 - 2, 10), - "wrong voter index" + Error::::InvalidVoterIndex, ); assert_ok!(Elections::set_approvals(Origin::signed(65), vec![], 0, 64, 10)); }) @@ -338,12 +338,12 @@ fn voting_subsequent_set_approvals_checks_voter_index() { // invalid index assert_noop!( Elections::set_approvals(Origin::signed(4), vec![true], 0, 5, 40), - "invalid voter index" + Error::::InvalidVoterIndex, ); // wrong index assert_noop!( Elections::set_approvals(Origin::signed(4), vec![true], 0, 0, 40), - "wrong voter index" + Error::::InvalidVoterIndex, ); // correct assert_ok!(Elections::set_approvals(Origin::signed(4), vec![true], 0, 1, 40)); @@ -357,7 +357,7 @@ fn voting_cannot_lock_less_than_limit() { assert_noop!( Elections::set_approvals(Origin::signed(3), vec![], 0, 0, 4), - "locked value must be more than limit", + Error::::InsufficientLockedValue, ); assert_ok!(Elections::set_approvals(Origin::signed(3), vec![], 0, 0, 5)); }); @@ -414,7 +414,7 @@ fn voting_without_any_candidate_count_should_not_work() { assert_noop!( Elections::set_approvals(Origin::signed(4), vec![], 0, 0, 40), - "amount of candidates to receive approval votes should be non-zero" + Error::::ZeroCandidates, ); }); } @@ -429,7 +429,7 @@ fn voting_setting_an_approval_vote_count_more_than_candidate_count_should_not_wo assert_noop!( Elections::set_approvals(Origin::signed(4),vec![true, true], 0, 0, 40), - "amount of candidate votes cannot exceed amount of candidates" + Error::::TooManyVotes, ); }); } @@ -507,7 +507,7 @@ fn voting_invalid_retraction_index_should_not_work() { assert_ok!(Elections::set_approvals(Origin::signed(1), vec![true], 0, 0, 10)); assert_ok!(Elections::set_approvals(Origin::signed(2), vec![true], 0, 0, 20)); assert_eq!(voter_ids(), vec![1, 2]); - assert_noop!(Elections::retract_voter(Origin::signed(1), 1), "retraction index mismatch"); + assert_noop!(Elections::retract_voter(Origin::signed(1), 1), Error::::InvalidRetractionIndex); }); } @@ -518,7 +518,7 @@ fn voting_overflow_retraction_index_should_not_work() { assert_ok!(Elections::submit_candidacy(Origin::signed(3), 0)); assert_ok!(Elections::set_approvals(Origin::signed(1), vec![true], 0, 0, 10)); - assert_noop!(Elections::retract_voter(Origin::signed(1), 1), "retraction index invalid"); + assert_noop!(Elections::retract_voter(Origin::signed(1), 1), Error::::InvalidRetractionIndex); }); } @@ -529,7 +529,7 @@ fn voting_non_voter_retraction_should_not_work() { assert_ok!(Elections::submit_candidacy(Origin::signed(3), 0)); assert_ok!(Elections::set_approvals(Origin::signed(1), vec![true], 0, 0, 10)); - assert_noop!(Elections::retract_voter(Origin::signed(2), 0), "cannot retract non-voter"); + assert_noop!(Elections::retract_voter(Origin::signed(2), 0), Error::::RetractNonVoter); }); } @@ -627,7 +627,7 @@ fn retracting_inactive_voter_with_bad_reporter_index_should_not_work() { 42, 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 - ), "invalid reporter index"); + ), Error::::InvalidReporterIndex); }); } @@ -656,7 +656,7 @@ fn retracting_inactive_voter_with_bad_target_index_should_not_work() { (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2, 42, 2 - ), "invalid target index"); + ), Error::::InvalidTargetIndex); }); } @@ -733,7 +733,7 @@ fn retracting_inactive_voter_by_nonvoter_should_not_work() { 0, 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 - ), "reporter must be a voter"); + ), Error::::NotVoter); }); } @@ -803,7 +803,7 @@ fn candidacy_submission_not_using_free_slot_should_not_work() { System::set_block_number(1); assert_noop!( Elections::submit_candidacy(Origin::signed(4), 3), - "invalid candidate slot" + Error::::InvalidCandidateSlot ); }); } @@ -815,7 +815,7 @@ fn candidacy_bad_candidate_slot_submission_should_not_work() { assert_eq!(Elections::candidates(), Vec::::new()); assert_noop!( Elections::submit_candidacy(Origin::signed(1), 1), - "invalid candidate slot" + Error::::InvalidCandidateSlot ); }); } @@ -829,7 +829,7 @@ fn candidacy_non_free_candidate_slot_submission_should_not_work() { assert_eq!(Elections::candidates(), vec![1]); assert_noop!( Elections::submit_candidacy(Origin::signed(2), 0), - "invalid candidate slot" + Error::::InvalidCandidateSlot ); }); } @@ -843,7 +843,7 @@ fn candidacy_dupe_candidate_submission_should_not_work() { assert_eq!(Elections::candidates(), vec![1]); assert_noop!( Elections::submit_candidacy(Origin::signed(1), 1), - "duplicate candidate submission" + Error::::DuplicatedCandidate, ); }); } @@ -855,7 +855,7 @@ fn candidacy_poor_candidate_submission_should_not_work() { assert_eq!(Elections::candidates(), Vec::::new()); assert_noop!( Elections::submit_candidacy(Origin::signed(7), 0), - "candidate has not enough funds" + Error::::InsufficientCandidateFunds, ); }); } @@ -1014,7 +1014,7 @@ fn election_presentations_with_zero_staked_deposit_should_not_work() { System::set_block_number(6); assert_noop!( Elections::present_winner(Origin::signed(4), 2, 0, 0), - "stake deposited to present winner and be added to leaderboard should be non-zero" + Error::::ZeroDeposit, ); }); } @@ -1036,7 +1036,7 @@ fn election_double_presentations_should_be_punished() { assert_ok!(Elections::present_winner(Origin::signed(4), 5, 50, 0)); assert_eq!( Elections::present_winner(Origin::signed(4), 5, 50, 0), - Err("duplicate presentation".into()), + Err(Error::::DuplicatedPresentation.into()), ); assert_ok!(Elections::end_block(System::block_number())); @@ -1067,7 +1067,7 @@ fn election_presenting_for_double_election_should_not_work() { System::set_block_number(10); assert_noop!( Elections::present_winner(Origin::signed(4), 2, 20, 1), - "candidate must not form a duplicated member if elected" + Error::::DuplicatedCandidate, ); }); } @@ -1101,7 +1101,7 @@ fn election_presenting_loser_should_not_work() { (60, 1) ])); - assert_noop!(Elections::present_winner(Origin::signed(4), 2, 20, 0), "candidate not worthy of leaderboard"); + assert_noop!(Elections::present_winner(Origin::signed(4), 2, 20, 0), Error::::UnworthyCandidate); }); } @@ -1144,7 +1144,7 @@ fn election_present_outside_of_presentation_period_should_not_work() { assert!(!Elections::presentation_active()); assert_noop!( Elections::present_winner(Origin::signed(5), 5, 1, 0), - "cannot present outside of presentation period" + Error::::NotPresentationPeriod, ); }); } @@ -1160,7 +1160,7 @@ fn election_present_with_invalid_vote_index_should_not_work() { assert_ok!(Elections::end_block(System::block_number())); System::set_block_number(6); - assert_noop!(Elections::present_winner(Origin::signed(4), 2, 20, 1), "index not current"); + assert_noop!(Elections::present_winner(Origin::signed(4), 2, 20, 1), Error::::InvalidVoteIndex); }); } @@ -1190,7 +1190,7 @@ fn election_present_when_presenter_is_poor_should_not_work() { if p > 5 { assert_noop!(Elections::present_winner( Origin::signed(1), 1, 10, 0), - "presenter must have sufficient slashable funds" + Error::::InsufficientPresenterFunds, ); } else { assert_ok!(Elections::present_winner(Origin::signed(1), 1, 10, 0)); @@ -1215,7 +1215,7 @@ fn election_invalid_present_tally_should_slash() { assert_ok!(Elections::end_block(System::block_number())); System::set_block_number(6); - assert_err!(Elections::present_winner(Origin::signed(4), 2, 80, 0), "incorrect total"); + assert_err!(Elections::present_winner(Origin::signed(4), 2, 80, 0), Error::::IncorrectTotal); assert_eq!(Balances::total_balance(&4), 38); }); diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index d332d63c4e..26f5161d87 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -321,7 +321,7 @@ impl Into> for PermissionLatest { /// No new assets id available. NoIdAvailable, -- GitLab From dd34fb435ae80bb5ab2b3af61765afd7388b97c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 24 Dec 2019 11:13:29 +0100 Subject: [PATCH 021/296] Fix replace_previous of Ready Transaction Queue. (#4488) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix transaction replacements. * Test. * Fix typo. * Update client/transaction-pool/graph/src/ready.rs Co-Authored-By: Bastian Köcher Co-authored-by: Bastian Köcher --- .../transaction-pool/graph/src/base_pool.rs | 7 +- client/transaction-pool/graph/src/ready.rs | 190 ++++++++++++------ 2 files changed, 136 insertions(+), 61 deletions(-) diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 8878e9e6dd..820c1bea73 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -274,7 +274,12 @@ impl BasePool Clone for TransactionRef { impl Ord for TransactionRef { fn cmp(&self, other: &Self) -> cmp::Ordering { self.transaction.priority.cmp(&other.transaction.priority) - .then(other.transaction.valid_till.cmp(&self.transaction.valid_till)) - .then(other.insertion_id.cmp(&self.insertion_id)) + .then_with(|| other.transaction.valid_till.cmp(&self.transaction.valid_till)) + .then_with(|| other.insertion_id.cmp(&self.insertion_id)) } } @@ -161,7 +161,10 @@ impl ReadyTransactions { &mut self, tx: WaitingTransaction, ) -> error::Result>>> { - assert!(tx.is_ready(), "Only ready transactions can be imported."); + assert!( + tx.is_ready(), + "Only ready transactions can be imported. Missing: {:?}", tx.missing_tags + ); assert!(!self.ready.read().contains_key(&tx.transaction.hash), "Transaction is already imported."); self.insertion_id += 1; @@ -169,10 +172,11 @@ impl ReadyTransactions { let hash = tx.transaction.hash.clone(); let transaction = tx.transaction; - let replaced = self.replace_previous(&transaction)?; + let (replaced, unlocks) = self.replace_previous(&transaction)?; let mut goes_to_best = true; let mut ready = self.ready.write(); + let mut requires_offset = 0; // Add links to transactions that unlock the current one for tag in &transaction.requires { // Check if the transaction that satisfies the tag is still in the queue. @@ -181,10 +185,14 @@ impl ReadyTransactions { tx.unlocks.push(hash.clone()); // this transaction depends on some other, so it doesn't go to best directly. goes_to_best = false; + } else { + requires_offset += 1; } } // update provided_tags + // call to replace_previous guarantees that we will be overwriting + // only entries that have been removed. for tag in &transaction.provides { self.provided_tags.insert(tag.clone(), hash.clone()); } @@ -202,8 +210,8 @@ impl ReadyTransactions { // insert to Ready ready.insert(hash, ReadyTx { transaction, - unlocks: vec![], - requires_offset: 0, + unlocks, + requires_offset, }); Ok(replaced) @@ -236,9 +244,21 @@ impl ReadyTransactions { /// (i.e. the entire subgraph that this transaction is a start of will be removed). /// All removed transactions are returned. pub fn remove_subtree(&mut self, hashes: &[Hash]) -> Vec>> { - let mut removed = vec![]; - let mut to_remove = hashes.iter().cloned().collect::>(); + let to_remove = hashes.iter().cloned().collect::>(); + self.remove_subtree_with_tag_filter(to_remove, None) + } + /// Removes a subtrees of transactions trees starting from roots given in `to_remove`. + /// + /// We proceed with a particular branch only if there is at least one provided tag + /// that is not part of `provides_tag_filter`. I.e. the filter contains tags + /// that will stay in the pool, so that we can early exit and avoid descending. + fn remove_subtree_with_tag_filter( + &mut self, + mut to_remove: Vec, + provides_tag_filter: Option>, + ) -> Vec>> { + let mut removed = vec![]; let mut ready = self.ready.write(); loop { let hash = match to_remove.pop() { @@ -247,10 +267,21 @@ impl ReadyTransactions { }; if let Some(mut tx) = ready.remove(&hash) { + let invalidated = tx.transaction.transaction.provides + .iter() + .filter(|tag| provides_tag_filter + .as_ref() + .map(|filter| !filter.contains(&**tag)) + .unwrap_or(true) + ); + + let mut removed_some_tags = false; // remove entries from provided_tags - for tag in &tx.transaction.transaction.provides { + for tag in invalidated { + removed_some_tags = true; self.provided_tags.remove(tag); } + // remove from unlocks for tag in &tx.transaction.transaction.requires { if let Some(hash) = self.provided_tags.get(tag) { @@ -263,8 +294,10 @@ impl ReadyTransactions { // remove from best self.best.remove(&tx.transaction); - // remove all transactions that the current one unlocks - to_remove.append(&mut tx.unlocks); + if removed_some_tags { + // remove all transactions that the current one unlocks + to_remove.append(&mut tx.unlocks); + } // add to removed trace!(target: "txpool", "[{:?}] Removed as part of the subtree.", hash); @@ -363,9 +396,15 @@ impl ReadyTransactions { /// we are about to replace is lower than the priority of the replacement transaction. /// We remove/replace old transactions in case they have lower priority. /// - /// In case replacement is successful returns a list of removed transactions. - fn replace_previous(&mut self, tx: &Transaction) -> error::Result>>> { - let mut to_remove = { + /// In case replacement is successful returns a list of removed transactions + /// and a list of hashes that are still in pool and gets unlocked by the new transaction. + fn replace_previous( + &mut self, + tx: &Transaction, + ) -> error::Result< + (Vec>>, Vec) + > { + let (to_remove, unlocks) = { // check if we are replacing a transaction let replace_hashes = tx.provides .iter() @@ -374,7 +413,7 @@ impl ReadyTransactions { // early exit if we are not replacing anything. if replace_hashes.is_empty() { - return Ok(vec![]); + return Ok((vec![], vec![])); } // now check if collective priority is lower than the replacement transaction. @@ -383,7 +422,9 @@ impl ReadyTransactions { replace_hashes .iter() .filter_map(|hash| ready.get(hash)) - .fold(0u64, |total, tx| total.saturating_add(tx.transaction.transaction.priority)) + .fold(0u64, |total, tx| + total.saturating_add(tx.transaction.transaction.priority) + ) }; // bail - the transaction has too low priority to replace the old ones @@ -391,35 +432,31 @@ impl ReadyTransactions { return Err(error::Error::TooLowPriority { old: old_priority, new: tx.priority }) } - replace_hashes.into_iter().cloned().collect::>() - }; - - let new_provides = tx.provides.iter().cloned().collect::>(); - let mut removed = vec![]; - loop { - let hash = match to_remove.pop() { - Some(hash) => hash, - None => return Ok(removed), + // construct a list of unlocked transactions + let unlocks = { + let ready = self.ready.read(); + replace_hashes + .iter() + .filter_map(|hash| ready.get(hash)) + .fold(vec![], |mut list, tx| { + list.extend(tx.unlocks.iter().cloned()); + list + }) }; - let tx = self.ready.write().remove(&hash).expect(HASH_READY); - // check if this transaction provides stuff that is not provided by the new one. - let (mut unlocks, tx) = (tx.unlocks, tx.transaction.transaction); - { - let invalidated = tx.provides - .iter() - .filter(|tag| !new_provides.contains(&**tag)); + ( + replace_hashes.into_iter().cloned().collect::>(), + unlocks + ) + }; - for tag in invalidated { - // remove the tag since it's no longer provided by any transaction - self.provided_tags.remove(tag); - // add more transactions to remove - to_remove.append(&mut unlocks); - } - } + let new_provides = tx.provides.iter().cloned().collect::>(); + let removed = self.remove_subtree_with_tag_filter(to_remove, Some(new_provides)); - removed.push(tx); - } + Ok(( + removed, + unlocks + )) } /// Returns number of transactions in this queue. @@ -444,7 +481,7 @@ impl BestIterator { /// Depending on number of satisfied requirements insert given ref /// either to awaiting set or to best set. fn best_or_awaiting(&mut self, satisfied: usize, tx_ref: TransactionRef) { - if satisfied == tx_ref.transaction.requires.len() { + if satisfied >= tx_ref.transaction.requires.len() { // If we have satisfied all deps insert to best self.best.insert(tx_ref); @@ -517,6 +554,14 @@ mod tests { } } + fn import( + ready: &mut ReadyTransactions, + tx: Transaction + ) -> error::Result>>> { + let x = WaitingTransaction::new(tx, ready.provided_tags(), &[]); + ready.import(x) + } + #[test] fn should_replace_transaction_that_provides_the_same_tag() { // given @@ -531,24 +576,56 @@ mod tests { tx3.provides = vec![vec![4]]; // when - let x = WaitingTransaction::new(tx2, &ready.provided_tags(), &[]); - ready.import(x).unwrap(); - let x = WaitingTransaction::new(tx3, &ready.provided_tags(), &[]); - ready.import(x).unwrap(); + import(&mut ready, tx2).unwrap(); + import(&mut ready, tx3).unwrap(); assert_eq!(ready.get().count(), 2); // too low priority - let x = WaitingTransaction::new(tx1.clone(), &ready.provided_tags(), &[]); - ready.import(x).unwrap_err(); + import(&mut ready, tx1.clone()).unwrap_err(); tx1.priority = 10; - let x = WaitingTransaction::new(tx1.clone(), &ready.provided_tags(), &[]); - ready.import(x).unwrap(); + import(&mut ready, tx1).unwrap(); // then assert_eq!(ready.get().count(), 1); } + #[test] + fn should_replace_multiple_transactions_correctly() { + // given + let mut ready = ReadyTransactions::default(); + let mut tx0 = tx(0); + tx0.requires = vec![]; + tx0.provides = vec![vec![0]]; + let mut tx1 = tx(1); + tx1.requires = vec![]; + tx1.provides = vec![vec![1]]; + let mut tx2 = tx(2); + tx2.requires = vec![vec![0], vec![1]]; + tx2.provides = vec![vec![2], vec![3]]; + let mut tx3 = tx(3); + tx3.requires = vec![vec![2]]; + tx3.provides = vec![vec![4]]; + let mut tx4 = tx(4); + tx4.requires = vec![vec![3]]; + tx4.provides = vec![vec![5]]; + // replacement + let mut tx2_2 = tx(5); + tx2_2.requires = vec![vec![0], vec![1]]; + tx2_2.provides = vec![vec![2]]; + tx2_2.priority = 10; + + for tx in vec![tx0, tx1, tx2, tx3, tx4] { + import(&mut ready, tx).unwrap(); + } + assert_eq!(ready.get().count(), 5); + + // when + import(&mut ready, tx2_2).unwrap(); + + // then + assert_eq!(ready.get().count(), 3); + } #[test] fn should_return_best_transactions_in_correct_order() { @@ -577,16 +654,9 @@ mod tests { }; // when - let x = WaitingTransaction::new(tx1, &ready.provided_tags(), &[]); - ready.import(x).unwrap(); - let x = WaitingTransaction::new(tx2, &ready.provided_tags(), &[]); - ready.import(x).unwrap(); - let x = WaitingTransaction::new(tx3, &ready.provided_tags(), &[]); - ready.import(x).unwrap(); - let x = WaitingTransaction::new(tx4, &ready.provided_tags(), &[]); - ready.import(x).unwrap(); - let x = WaitingTransaction::new(tx5, &ready.provided_tags(), &[]); - ready.import(x).unwrap(); + for tx in vec![tx1, tx2, tx3, tx4, tx5] { + import(&mut ready, tx).unwrap(); + } // then assert_eq!(ready.best.len(), 1); -- GitLab From 963b7be0f8f6e12fd13a3f101dcf0ed9eb7a8b76 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Tue, 24 Dec 2019 13:17:41 +0100 Subject: [PATCH 022/296] Extract execution engines definitions into their own crates (#4489) * Clean imports in wasmi_execution * Replace `interpret_runtime_api_result` with `pointer_and_len_from_u64`. * Extract sc-executor-common crate * Extract `sc-executor-wasmi` into its own crate * Extract `sc-executor-wasmtime` into its own crate. * Add missing headers. * Clean and docs * Docs for sc-executor-wasmi * Expand a comment about sandboxing * Fix assert_matches * Rename (un)pack_ptr_and_len and move them into util module * Remove wasmtime errors in sc-executor-common --- Cargo.lock | 58 ++++++++++++++++-- Cargo.toml | 3 + client/executor/Cargo.toml | 21 ++----- client/executor/common/Cargo.toml | 18 ++++++ client/executor/{ => common}/src/allocator.rs | 3 + client/executor/{ => common}/src/error.rs | 13 +--- client/executor/common/src/lib.rs | 24 ++++++++ client/executor/{ => common}/src/sandbox.rs | 5 +- client/executor/common/src/wasm_runtime.rs | 39 ++++++++++++ client/executor/src/lib.rs | 8 +-- client/executor/src/native_executor.rs | 9 +-- client/executor/src/wasm_runtime.rs | 28 ++------- client/executor/src/wasm_utils.rs | 13 ---- client/executor/wasmi/Cargo.toml | 16 +++++ .../wasmi_execution.rs => wasmi/src/lib.rs} | 18 +++--- client/executor/wasmtime/Cargo.toml | 28 +++++++++ .../src}/function_executor.rs | 10 ++-- .../wasmtime/mod.rs => wasmtime/src/lib.rs} | 1 + .../{src/wasmtime => wasmtime/src}/runtime.rs | 47 +++++++-------- .../wasmtime => wasmtime/src}/trampoline.rs | 6 +- .../{src/wasmtime => wasmtime/src}/util.rs | 2 +- primitives/runtime-interface/src/impls.rs | 42 ++++--------- primitives/runtime-interface/src/lib.rs | 6 +- primitives/runtime-interface/src/pass_by.rs | 10 ++-- primitives/runtime-interface/src/util.rs | 59 +++++++++++++++++++ 25 files changed, 326 insertions(+), 161 deletions(-) create mode 100644 client/executor/common/Cargo.toml rename client/executor/{ => common}/src/allocator.rs (99%) rename client/executor/{ => common}/src/error.rs (91%) create mode 100644 client/executor/common/src/lib.rs rename client/executor/{ => common}/src/sandbox.rs (99%) create mode 100644 client/executor/common/src/wasm_runtime.rs create mode 100644 client/executor/wasmi/Cargo.toml rename client/executor/{src/wasmi_execution.rs => wasmi/src/lib.rs} (98%) create mode 100644 client/executor/wasmtime/Cargo.toml rename client/executor/{src/wasmtime => wasmtime/src}/function_executor.rs (97%) rename client/executor/{src/wasmtime/mod.rs => wasmtime/src/lib.rs} (99%) rename client/executor/{src/wasmtime => wasmtime/src}/runtime.rs (92%) rename client/executor/{src/wasmtime => wasmtime/src}/trampoline.rs (98%) rename client/executor/{src/wasmtime => wasmtime/src}/util.rs (98%) create mode 100644 primitives/runtime-interface/src/util.rs diff --git a/Cargo.lock b/Cargo.lock index 67fa81af0e..f951617658 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5275,11 +5275,6 @@ name = "sc-executor" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-native 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5288,6 +5283,9 @@ dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-executor-common 2.0.0", + "sc-executor-wasmi 2.0.0", + "sc-executor-wasmtime 2.0.0", "sc-runtime-test 2.0.0", "sp-core 2.0.0", "sp-externalities 2.0.0", @@ -5303,6 +5301,56 @@ dependencies = [ "test-case 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sc-executor-common" +version = "2.0.0" +dependencies = [ + "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-core 2.0.0", + "sp-runtime-interface 2.0.0", + "sp-serializer 2.0.0", + "sp-wasm-interface 2.0.0", + "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sc-executor-wasmi" +version = "2.0.0" +dependencies = [ + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-executor-common 2.0.0", + "sp-core 2.0.0", + "sp-externalities 2.0.0", + "sp-runtime-interface 2.0.0", + "sp-wasm-interface 2.0.0", + "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sc-executor-wasmtime" +version = "2.0.0" +dependencies = [ + "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-native 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-executor-common 2.0.0", + "sp-core 2.0.0", + "sp-externalities 2.0.0", + "sp-runtime-interface 2.0.0", + "sp-wasm-interface 2.0.0", + "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-jit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-runtime 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 4aabe5916f..505cd299d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,9 @@ members = [ "client/consensus/uncles", "client/db", "client/executor", + "client/executor/common", + "client/executor/wasmi", + "client/executor/wasmtime", "client/executor/runtime-test", "client/finality-grandpa", "client/tracing", diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index b21a8165c5..68eee17684 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -19,19 +19,13 @@ lazy_static = "1.4.0" sp-wasm-interface = { version = "2.0.0", path = "../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../primitives/runtime-interface" } sp-externalities = { version = "2.0.0", path = "../../primitives/externalities" } +sc-executor-common = { version = "2.0.0", path = "common" } +sc-executor-wasmi = { version = "2.0.0", path = "wasmi" } +sc-executor-wasmtime = { version = "2.0.0", path = "wasmtime", optional = true } parking_lot = "0.9.0" log = "0.4.8" libsecp256k1 = "0.3.2" -cranelift-codegen = { version = "0.50", optional = true } -cranelift-entity = { version = "0.50", optional = true } -cranelift-frontend = { version = "0.50", optional = true } -cranelift-native = { version = "0.50", optional = true } -cranelift-wasm = { version = "0.50", optional = true } -wasmtime-environ = { version = "0.8", optional = true } -wasmtime-jit = { version = "0.8", optional = true } -wasmtime-runtime = { version = "0.8", optional = true } - [dev-dependencies] assert_matches = "1.3.0" wabt = "0.9.2" @@ -47,14 +41,7 @@ default = [ "std" ] std = [] wasm-extern-trace = [] wasmtime = [ - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "cranelift-wasm", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", + "sc-executor-wasmtime", ] wasmi-errno = [ "wasmi/errno" diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml new file mode 100644 index 0000000000..ddd40de62b --- /dev/null +++ b/client/executor/common/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "sc-executor-common" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +log = "0.4.8" +derive_more = "0.99.2" +codec = { package = "parity-scale-codec", version = "1.0.0" } +wasmi = "0.6.2" +sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } +sp-serializer = { version = "2.0.0", path = "../../../primitives/serializer" } + +[features] +default = [] diff --git a/client/executor/src/allocator.rs b/client/executor/common/src/allocator.rs similarity index 99% rename from client/executor/src/allocator.rs rename to client/executor/common/src/allocator.rs index 88624a0ec2..f872eea8a7 100644 --- a/client/executor/src/allocator.rs +++ b/client/executor/common/src/allocator.rs @@ -69,6 +69,9 @@ const MIN_POSSIBLE_ALLOCATION: u32 = 8; // to which it belongs. const PREFIX_SIZE: u32 = 8; +/// An implementation of freeing bump allocator. +/// +/// Refer to the module-level documentation for further details. pub struct FreeingBumpHeapAllocator { bumper: u32, heads: [u32; N], diff --git a/client/executor/src/error.rs b/client/executor/common/src/error.rs similarity index 91% rename from client/executor/src/error.rs rename to client/executor/common/src/error.rs index a15452c48b..09acbd1684 100644 --- a/client/executor/src/error.rs +++ b/client/executor/common/src/error.rs @@ -18,8 +18,6 @@ use sp_serializer; use wasmi; -#[cfg(feature = "wasmtime")] -use wasmtime_jit::{ActionError, SetupError}; /// Result type alias. pub type Result = std::result::Result; @@ -33,9 +31,6 @@ pub enum Error { Trap(wasmi::Trap), /// Wasmi loading/instantiating error Wasmi(wasmi::Error), - /// Wasmtime action error - #[cfg(feature = "wasmtime")] - Wasmtime(ActionError), /// Error in the API. Parameter is an error message. #[from(ignore)] ApiError(String), @@ -135,10 +130,6 @@ pub enum WasmError { InvalidHeapPages, /// Instantiation error. Instantiation(String), - /// The compiler does not support the host machine as a target. - #[cfg(feature = "wasmtime")] - MissingCompilerSupport(&'static str), - /// Wasmtime setup error. - #[cfg(feature = "wasmtime")] - WasmtimeSetup(SetupError), + /// Other error happenend. + Other(String), } diff --git a/client/executor/common/src/lib.rs b/client/executor/common/src/lib.rs new file mode 100644 index 0000000000..361a346e29 --- /dev/null +++ b/client/executor/common/src/lib.rs @@ -0,0 +1,24 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! A set of common definitions that are needed for defining execution engines. + +#![warn(missing_docs)] + +pub mod sandbox; +pub mod allocator; +pub mod error; +pub mod wasm_runtime; diff --git a/client/executor/src/sandbox.rs b/client/executor/common/src/sandbox.rs similarity index 99% rename from client/executor/src/sandbox.rs rename to client/executor/common/src/sandbox.rs index e0e1780a14..0b1330d27f 100644 --- a/client/executor/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -14,9 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -#![warn(missing_docs)] - //! This module implements sandboxing support in the runtime. +//! +//! Sandboxing is baked by wasmi at the moment. In future, however, we would like to add/switch to +//! a compiled execution engine. use crate::error::{Result, Error}; use std::{collections::HashMap, rc::Rc}; diff --git a/client/executor/common/src/wasm_runtime.rs b/client/executor/common/src/wasm_runtime.rs new file mode 100644 index 0000000000..0df7d21ac2 --- /dev/null +++ b/client/executor/common/src/wasm_runtime.rs @@ -0,0 +1,39 @@ +// 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 . + +//! Definitions for a wasm runtime. + +use crate::error::Error; +use sp_core::traits::Externalities; +use sp_wasm_interface::Function; + +/// A trait that defines an abstract wasm runtime. +/// +/// This can be implemented by an execution engine. +pub trait WasmRuntime { + /// Attempt to update the number of heap pages available during execution. + /// + /// Returns false if the update cannot be applied. The function is guaranteed to return true if + /// the heap pages would not change from its current value. + fn update_heap_pages(&mut self, heap_pages: u64) -> bool; + + /// Return the host functions that are registered for this Wasm runtime. + fn host_functions(&self) -> &[&'static dyn Function]; + + /// Call a method in the Substrate runtime by name. Returns the encoded result on success. + fn call(&mut self, ext: &mut dyn Externalities, method: &str, data: &[u8]) + -> Result, Error>; +} diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index 5045874859..c343e97b44 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -31,19 +31,13 @@ #[macro_use] mod wasm_utils; -mod wasmi_execution; #[macro_use] mod native_executor; -mod sandbox; -mod allocator; pub mod deprecated_host_interface; mod wasm_runtime; -#[cfg(feature = "wasmtime")] -mod wasmtime; #[cfg(test)] mod integration_tests; -pub mod error; pub use wasmi; pub use native_executor::{with_native_environment, NativeExecutor, NativeExecutionDispatch}; pub use sp_version::{RuntimeVersion, NativeVersion}; @@ -54,6 +48,8 @@ pub use sp_core::traits::Externalities; pub use sp_wasm_interface; pub use wasm_runtime::WasmExecutionMethod; +pub use sc_executor_common::{error, allocator, sandbox}; + /// Call the given `function` in the given wasm `code`. /// /// The signature of `function` needs to follow the default Substrate function signature. diff --git a/client/executor/src/native_executor.rs b/client/executor/src/native_executor.rs index 09e514f603..73e3e8da8d 100644 --- a/client/executor/src/native_executor.rs +++ b/client/executor/src/native_executor.rs @@ -16,20 +16,15 @@ use crate::{ RuntimeInfo, error::{Error, Result}, - wasm_runtime::{RuntimesCache, WasmExecutionMethod, WasmRuntime}, + wasm_runtime::{RuntimesCache, WasmExecutionMethod}, }; - use sp_version::{NativeVersion, RuntimeVersion}; - use codec::{Decode, Encode}; - use sp_core::{NativeOrEncoded, traits::{CodeExecutor, Externalities}}; - use log::trace; - use std::{result, cell::RefCell, panic::{UnwindSafe, AssertUnwindSafe}}; - use sp_wasm_interface::{HostFunctions, Function}; +use sc_executor_common::wasm_runtime::WasmRuntime; thread_local! { static RUNTIMES_CACHE: RefCell = RefCell::new(RuntimesCache::new()); diff --git a/client/executor/src/wasm_runtime.rs b/client/executor/src/wasm_runtime.rs index 6181a1aab2..4c7e80f925 100644 --- a/client/executor/src/wasm_runtime.rs +++ b/client/executor/src/wasm_runtime.rs @@ -19,36 +19,16 @@ //! The primary means of accessing the runtimes is through a cache which saves the reusable //! components of the runtime that are expensive to initialize. -use crate::{wasmi_execution, error::{Error, WasmError}}; -#[cfg(feature = "wasmtime")] -use crate::wasmtime; +use crate::error::{Error, WasmError}; use log::{trace, warn}; - use codec::Decode; - use sp_core::{storage::well_known_keys, traits::Externalities}; - use sp_version::RuntimeVersion; use std::{collections::hash_map::{Entry, HashMap}, panic::AssertUnwindSafe}; +use sc_executor_common::wasm_runtime::WasmRuntime; use sp_wasm_interface::Function; -/// The Substrate Wasm runtime. -pub trait WasmRuntime { - /// Attempt to update the number of heap pages available during execution. - /// - /// Returns false if the update cannot be applied. The function is guaranteed to return true if - /// the heap pages would not change from its current value. - fn update_heap_pages(&mut self, heap_pages: u64) -> bool; - - /// Return the host functions that are registered for this Wasm runtime. - fn host_functions(&self) -> &[&'static dyn Function]; - - /// Call a method in the Substrate runtime by name. Returns the encoded result on success. - fn call(&mut self, ext: &mut dyn Externalities, method: &str, data: &[u8]) - -> Result, Error>; -} - /// Specification of different methods of executing the runtime Wasm code. #[derive(Debug, PartialEq, Eq, Hash, Copy, Clone)] pub enum WasmExecutionMethod { @@ -214,11 +194,11 @@ pub fn create_wasm_runtime_with_code( ) -> Result, WasmError> { match wasm_method { WasmExecutionMethod::Interpreted => - wasmi_execution::create_instance(code, heap_pages, host_functions) + sc_executor_wasmi::create_instance(code, heap_pages, host_functions) .map(|runtime| -> Box { Box::new(runtime) }), #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => - wasmtime::create_instance(code, heap_pages, host_functions) + sc_executor_wasmtime::create_instance(code, heap_pages, host_functions) .map(|runtime| -> Box { Box::new(runtime) }), } } diff --git a/client/executor/src/wasm_utils.rs b/client/executor/src/wasm_utils.rs index 95b1db65ce..90ab76fda5 100644 --- a/client/executor/src/wasm_utils.rs +++ b/client/executor/src/wasm_utils.rs @@ -16,8 +16,6 @@ //! Utilities for defining the wasm host environment. -use sp_wasm_interface::{Pointer, WordSize}; - /// Converts arguments into respective WASM types. #[macro_export] macro_rules! convert_args { @@ -173,14 +171,3 @@ macro_rules! impl_wasm_host_interface { } ); } - -/// Runtime API functions return an i64 which encodes a pointer in the least-significant 32 bits -/// and a length in the most-significant 32 bits. This interprets the returned value as a pointer, -/// length tuple. -pub fn interpret_runtime_api_result(retval: i64) -> (Pointer, WordSize) { - let ptr = >::new(retval as u32); - // The first cast to u64 is necessary so that the right shift does not sign-extend. - let len = ((retval as u64) >> 32) as WordSize; - (ptr, len) -} - diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml new file mode 100644 index 0000000000..7a13d7ea97 --- /dev/null +++ b/client/executor/wasmi/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "sc-executor-wasmi" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +log = "0.4.8" +wasmi = "0.6.2" +parity-wasm = "0.41.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } +sc-executor-common = { version = "2.0.0", path = "../common" } +sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sp-externalities = { version = "2.0.0", path = "../../../primitives/externalities" } diff --git a/client/executor/src/wasmi_execution.rs b/client/executor/wasmi/src/lib.rs similarity index 98% rename from client/executor/src/wasmi_execution.rs rename to client/executor/wasmi/src/lib.rs index cdead6cee1..9719153104 100644 --- a/client/executor/src/wasmi_execution.rs +++ b/client/executor/wasmi/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-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 @@ -14,25 +14,27 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Implementation of a Wasm runtime using the Wasmi interpreter. +//! This crate provides an implementation of `WasmRuntime` that is baked by wasmi. +use sc_executor_common::{ + error::{Error, WasmError}, + sandbox, + allocator, +}; use std::{str, mem}; use wasmi::{ Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, ModuleRef, memory_units::Pages, RuntimeValue::{I32, I64, self}, }; -use crate::error::{Error, WasmError}; use codec::{Encode, Decode}; use sp_core::{sandbox as sandbox_primitives, traits::Externalities}; -use crate::sandbox; -use crate::allocator; -use crate::wasm_utils::interpret_runtime_api_result; -use crate::wasm_runtime::WasmRuntime; use log::{error, trace}; use parity_wasm::elements::{deserialize_buffer, DataSegment, Instruction, Module as RawModule}; use sp_wasm_interface::{ FunctionContext, Pointer, WordSize, Sandbox, MemoryId, Result as WResult, Function, }; +use sp_runtime_interface::unpack_ptr_and_len; +use sc_executor_common::wasm_runtime::WasmRuntime; struct FunctionExecutor<'a> { sandbox_store: sandbox::Store, @@ -375,7 +377,7 @@ fn call_in_wasm_module( match result { Ok(Some(I64(r))) => { - let (ptr, length) = interpret_runtime_api_result(r); + let (ptr, length) = unpack_ptr_and_len(r as u64); memory.get(ptr.into(), length as usize).map_err(|_| Error::Runtime) }, Err(e) => { diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml new file mode 100644 index 0000000000..0d6bede016 --- /dev/null +++ b/client/executor/wasmtime/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "sc-executor-wasmtime" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +log = "0.4.8" +wasmi = "0.6.2" +parity-wasm = "0.41.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } +sc-executor-common = { version = "2.0.0", path = "../common" } +sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sp-externalities = { version = "2.0.0", path = "../../../primitives/externalities" } + +cranelift-codegen = "0.50" +cranelift-entity = "0.50" +cranelift-frontend = "0.50" +cranelift-native = "0.50" +cranelift-wasm = "0.50" +wasmtime-environ = "0.8" +wasmtime-jit = "0.8" +wasmtime-runtime = "0.8" + +[dev-dependencies] +assert_matches = "1.3.0" diff --git a/client/executor/src/wasmtime/function_executor.rs b/client/executor/wasmtime/src/function_executor.rs similarity index 97% rename from client/executor/src/wasmtime/function_executor.rs rename to client/executor/wasmtime/src/function_executor.rs index 4db7adc83a..5f5a637794 100644 --- a/client/executor/src/wasmtime/function_executor.rs +++ b/client/executor/wasmtime/src/function_executor.rs @@ -14,10 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::allocator::FreeingBumpHeapAllocator; -use crate::error::{Error, Result}; -use crate::sandbox::{self, SandboxCapabilities, SupervisorFuncIndex}; -use crate::wasmtime::util::{ +use sc_executor_common::allocator::FreeingBumpHeapAllocator; +use sc_executor_common::error::{Error, Result}; +use sc_executor_common::sandbox::{self, SandboxCapabilities, SupervisorFuncIndex}; +use crate::util::{ checked_range, cranelift_ir_signature, read_memory_into, write_memory_from, }; @@ -173,7 +173,7 @@ impl<'a> SandboxCapabilities for FunctionExecutor<'a> { let exec_code_buf = self.compiler .get_published_trampoline(func_ptr, &signature, value_size) .map_err(ActionError::Setup) - .map_err(Error::Wasmtime)?; + .map_err(|e| Error::Other(e.to_string()))?; // Call the trampoline. if let Err(message) = unsafe { diff --git a/client/executor/src/wasmtime/mod.rs b/client/executor/wasmtime/src/lib.rs similarity index 99% rename from client/executor/src/wasmtime/mod.rs rename to client/executor/wasmtime/src/lib.rs index 7f442417ab..085a92e2a0 100644 --- a/client/executor/src/wasmtime/mod.rs +++ b/client/executor/wasmtime/src/lib.rs @@ -22,3 +22,4 @@ mod trampoline; mod util; pub use runtime::create_instance; + diff --git a/client/executor/src/wasmtime/runtime.rs b/client/executor/wasmtime/src/runtime.rs similarity index 92% rename from client/executor/src/wasmtime/runtime.rs rename to client/executor/wasmtime/src/runtime.rs index 6fdf9f0e9e..9395d0049c 100644 --- a/client/executor/src/wasmtime/runtime.rs +++ b/client/executor/wasmtime/src/runtime.rs @@ -16,28 +16,31 @@ //! Defines the compiled Wasm runtime that uses Wasmtime internally. -use crate::error::{Error, Result, WasmError}; -use crate::wasm_runtime::WasmRuntime; -use crate::wasm_utils::interpret_runtime_api_result; -use crate::wasmtime::function_executor::FunctionExecutorState; -use crate::wasmtime::trampoline::{EnvState, make_trampoline}; -use crate::wasmtime::util::{cranelift_ir_signature, read_memory_into, write_memory_from}; -use crate::Externalities; +use crate::function_executor::FunctionExecutorState; +use crate::trampoline::{EnvState, make_trampoline}; +use crate::util::{cranelift_ir_signature, read_memory_into, write_memory_from}; + +use sc_executor_common::{ + error::{Error, Result, WasmError}, + wasm_runtime::WasmRuntime, +}; +use sp_core::traits::Externalities; +use sp_wasm_interface::{Pointer, WordSize, Function}; +use sp_runtime_interface::unpack_ptr_and_len; + +use std::cell::RefCell; +use std::collections::HashMap; +use std::convert::TryFrom; +use std::rc::Rc; use cranelift_codegen::ir; use cranelift_codegen::isa::TargetIsa; use cranelift_entity::{EntityRef, PrimaryMap}; use cranelift_frontend::FunctionBuilderContext; use cranelift_wasm::DefinedFuncIndex; -use std::cell::RefCell; -use std::collections::HashMap; -use std::convert::TryFrom; -use std::rc::Rc; -use sp_wasm_interface::{Pointer, WordSize, Function}; use wasmtime_environ::{Module, translate_signature}; use wasmtime_jit::{ - ActionOutcome, ActionError, CodeMemory, CompilationStrategy, CompiledModule, Compiler, Context, - SetupError, RuntimeValue, + ActionOutcome, CodeMemory, CompilationStrategy, CompiledModule, Compiler, Context, RuntimeValue, }; use wasmtime_runtime::{Export, Imports, InstanceHandle, VMFunctionBody}; @@ -134,7 +137,7 @@ fn create_compiled_unit( // Compile the wasm module. let module = context.compile_module(&code) - .map_err(WasmError::WasmtimeSetup)?; + .map_err(|e| WasmError::Other(format!("module compile error: {}", e)))?; Ok((module, context)) } @@ -155,9 +158,7 @@ fn call_method( clear_globals(&mut *context.get_global_exports().borrow_mut()); let mut instance = module.instantiate() - .map_err(SetupError::Instantiate) - .map_err(ActionError::Setup) - .map_err(Error::Wasmtime)?; + .map_err(|e| Error::Other(e.to_string()))?; // Ideally there would be a way to set the heap pages during instantiation rather than // growing the memory after the fact. Currently this may require an additional mmap and copy. @@ -178,12 +179,12 @@ fn call_method( let outcome = sp_externalities::set_and_run_with_externalities(ext, || { context .invoke(&mut instance, method, &args[..]) - .map_err(Error::Wasmtime) + .map_err(|e| Error::Other(format!("error calling runtime: {}", e))) })?; let trap_error = reset_env_state_and_take_trap(context, None)?; let (output_ptr, output_len) = match outcome { ActionOutcome::Returned { values } => match values.as_slice() { - [RuntimeValue::I64(retval)] => interpret_runtime_api_result(*retval), + [RuntimeValue::I64(retval)] => unpack_ptr_and_len(*retval as u64), _ => return Err(Error::InvalidReturn), } ActionOutcome::Trapped { message } => return Err(trap_error.unwrap_or_else( @@ -194,7 +195,7 @@ fn call_method( // Read the output data from guest memory. let mut output = vec![0; output_len as usize]; let memory = get_memory_mut(&mut instance)?; - read_memory_into(memory, output_ptr, &mut output)?; + read_memory_into(memory, Pointer::new(output_ptr), &mut output)?; Ok(output) } @@ -252,13 +253,13 @@ fn instantiate_env_module( None, Box::new(env_state), ); - result.map_err(|e| WasmError::WasmtimeSetup(SetupError::Instantiate(e))) + result.map_err(|e| WasmError::Other(format!("cannot instantiate env: {}", e))) } /// Build a new TargetIsa for the host machine. fn target_isa() -> std::result::Result, WasmError> { let isa_builder = cranelift_native::builder() - .map_err(WasmError::MissingCompilerSupport)?; + .map_err(|e| WasmError::Other(format!("missing compiler support: {}", e)))?; let flag_builder = cranelift_codegen::settings::builder(); Ok(isa_builder.finish(cranelift_codegen::settings::Flags::new(flag_builder))) } diff --git a/client/executor/src/wasmtime/trampoline.rs b/client/executor/wasmtime/src/trampoline.rs similarity index 98% rename from client/executor/src/wasmtime/trampoline.rs rename to client/executor/wasmtime/src/trampoline.rs index 1251125251..cd9666332c 100644 --- a/client/executor/src/wasmtime/trampoline.rs +++ b/client/executor/wasmtime/src/trampoline.rs @@ -19,6 +19,9 @@ //! This code is based on and large parts are copied from wasmtime's //! wasmtime-api/src/trampoline/func.rs. +use crate::function_executor::{FunctionExecutorState, FunctionExecutor}; +use sc_executor_common::error::{Error, WasmError}; + use cranelift_codegen::{Context, binemit, ir, isa}; use cranelift_codegen::ir::{InstBuilder, StackSlotData, StackSlotKind, TrapCode}; use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext}; @@ -29,9 +32,6 @@ use wasmtime_runtime::{VMContext, VMFunctionBody}; use sp_wasm_interface::{Function, Value, ValueType}; use std::{cmp, panic::{self, AssertUnwindSafe}, ptr}; -use crate::error::{Error, WasmError}; -use crate::wasmtime::function_executor::{FunctionExecutorState, FunctionExecutor}; - const CALL_SUCCESS: u32 = 0; const CALL_FAILED_WITH_ERROR: u32 = 1; const CALL_WITH_BAD_HOST_STATE: u32 = 2; diff --git a/client/executor/src/wasmtime/util.rs b/client/executor/wasmtime/src/util.rs similarity index 98% rename from client/executor/src/wasmtime/util.rs rename to client/executor/wasmtime/src/util.rs index 55cb5ecc50..82df2be1c6 100644 --- a/client/executor/src/wasmtime/util.rs +++ b/client/executor/wasmtime/src/util.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::error::{Error, Result}; +use sc_executor_common::error::{Error, Result}; use cranelift_codegen::{ir, isa}; use std::ops::Range; diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index 97dfcb769a..681f304b4d 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -16,7 +16,10 @@ //! Provides implementations for the runtime interface traits. -use crate::{RIType, Pointer, pass_by::{PassBy, Codec, Inner, PassByInner}}; +use crate::{ + RIType, Pointer, pass_by::{PassBy, Codec, Inner, PassByInner}, + util::{unpack_ptr_and_len, pack_ptr_and_len}, +}; #[cfg(feature = "std")] use crate::host::*; #[cfg(not(feature = "std"))] @@ -44,27 +47,6 @@ assert_eq_size!(usize, u32); #[cfg(all(not(feature = "std"), not(feature = "disable_target_static_assertions")))] assert_eq_size!(*const u8, u32); -/// Converts a pointer and length into an `u64`. -pub fn pointer_and_len_to_u64(ptr: u32, len: u32) -> u64 { - // The static assertions from above are changed into a runtime check. - #[cfg(all(not(feature = "std"), feature = "disable_target_static_assertions"))] - assert_eq!(4, sp_std::mem::size_of::()); - - (u64::from(len) << 32) | u64::from(ptr) -} - -/// Splits an `u64` into the pointer and length. -pub fn pointer_and_len_from_u64(val: u64) -> (u32, u32) { - // The static assertions from above are changed into a runtime check. - #[cfg(all(not(feature = "std"), feature = "disable_target_static_assertions"))] - assert_eq!(4, sp_std::mem::size_of::()); - - let ptr = (val & (!0u32 as u64)) as u32; - let len = (val >> 32) as u32; - - (ptr, len) -} - /// Implement the traits for the given primitive traits. macro_rules! impl_traits_for_primitives { ( @@ -186,7 +168,7 @@ impl IntoFFIValue for Vec { let ptr = context.allocate_memory(vec.as_ref().len() as u32)?; context.write_memory(ptr, &vec)?; - Ok(pointer_and_len_to_u64(ptr.into(), vec.len() as u32)) + Ok(pack_ptr_and_len(ptr.into(), vec.len() as u32)) } } @@ -211,7 +193,7 @@ impl IntoFFIValue for Vec { #[cfg(not(feature = "std"))] impl FromFFIValue for Vec { fn from_ffi_value(arg: u64) -> Vec { - let (ptr, len) = pointer_and_len_from_u64(arg); + let (ptr, len) = unpack_ptr_and_len(arg); let len = len as usize; if TypeId::of::() == TypeId::of::() { @@ -238,7 +220,7 @@ impl FromFFIValue for [T] { type SelfInstance = Vec; fn from_ffi_value(context: &mut dyn FunctionContext, arg: u64) -> Result> { - let (ptr, len) = pointer_and_len_from_u64(arg); + let (ptr, len) = unpack_ptr_and_len(arg); let vec = context.read_memory(Pointer::new(ptr), len)?; @@ -259,7 +241,7 @@ impl IntoPreallocatedFFIValue for [u8] { context: &mut dyn FunctionContext, allocated: u64, ) -> Result<()> { - let (ptr, len) = pointer_and_len_from_u64(allocated); + let (ptr, len) = unpack_ptr_and_len(allocated); if (len as usize) < self_instance.len() { Err( @@ -282,10 +264,10 @@ impl IntoFFIValue for [T] { fn into_ffi_value(&self) -> WrappedFFIValue> { if TypeId::of::() == TypeId::of::() { let slice = unsafe { mem::transmute::<&[T], &[u8]>(self) }; - pointer_and_len_to_u64(slice.as_ptr() as u32, slice.len() as u32).into() + pack_ptr_and_len(slice.as_ptr() as u32, slice.len() as u32).into() } else { let data = self.encode(); - let ffi_value = pointer_and_len_to_u64(data.as_ptr() as u32, data.len() as u32); + let ffi_value = pack_ptr_and_len(data.as_ptr() as u32, data.len() as u32); (ffi_value, data).into() } } @@ -428,7 +410,7 @@ impl FromFFIValue for str { type SelfInstance = String; fn from_ffi_value(context: &mut dyn FunctionContext, arg: u64) -> Result { - let (ptr, len) = pointer_and_len_from_u64(arg); + let (ptr, len) = unpack_ptr_and_len(arg); let vec = context.read_memory(Pointer::new(ptr), len)?; @@ -443,7 +425,7 @@ impl IntoFFIValue for str { fn into_ffi_value(&self) -> WrappedFFIValue { let bytes = self.as_bytes(); - pointer_and_len_to_u64(bytes.as_ptr() as u32, bytes.len() as u32).into() + pack_ptr_and_len(bytes.as_ptr() as u32, bytes.len() as u32).into() } } diff --git a/primitives/runtime-interface/src/lib.rs b/primitives/runtime-interface/src/lib.rs index b02ccc6ab2..4fb906c030 100644 --- a/primitives/runtime-interface/src/lib.rs +++ b/primitives/runtime-interface/src/lib.rs @@ -241,6 +241,10 @@ pub mod host; pub mod wasm; pub mod pass_by; +mod util; + +pub use util::unpack_ptr_and_len; + /// Something that can be used by the runtime interface as type to communicate between wasm and the /// host. /// @@ -260,4 +264,4 @@ pub type Pointer = *mut T; /// A pointer that can be used in a runtime interface function signature. #[cfg(feature = "std")] -pub type Pointer = sp_wasm_interface::Pointer; \ No newline at end of file +pub type Pointer = sp_wasm_interface::Pointer; diff --git a/primitives/runtime-interface/src/pass_by.rs b/primitives/runtime-interface/src/pass_by.rs index dd38a4f80f..000278839e 100644 --- a/primitives/runtime-interface/src/pass_by.rs +++ b/primitives/runtime-interface/src/pass_by.rs @@ -20,7 +20,7 @@ //! [`Codec`](pass_by::Codec), [`Inner`](pass_by::Inner) and [`Enum`](pass_by::Enum) are the //! provided strategy implementations. -use crate::{RIType, impls::{pointer_and_len_from_u64, pointer_and_len_to_u64}}; +use crate::{RIType, util::{unpack_ptr_and_len, pack_ptr_and_len}}; #[cfg(feature = "std")] use crate::host::*; @@ -228,14 +228,14 @@ impl PassByImpl for Codec { let ptr = context.allocate_memory(vec.len() as u32)?; context.write_memory(ptr, &vec)?; - Ok(pointer_and_len_to_u64(ptr.into(), vec.len() as u32)) + Ok(pack_ptr_and_len(ptr.into(), vec.len() as u32)) } fn from_ffi_value( context: &mut dyn FunctionContext, arg: Self::FFIType, ) -> Result { - let (ptr, len) = pointer_and_len_from_u64(arg); + let (ptr, len) = unpack_ptr_and_len(arg); let vec = context.read_memory(Pointer::new(ptr), len)?; T::decode(&mut &vec[..]) .map_err(|e| format!("Could not decode value from wasm: {}", e.what())) @@ -248,12 +248,12 @@ impl PassByImpl for Codec { fn into_ffi_value(instance: &T) -> WrappedFFIValue { let data = instance.encode(); - let ffi_value = pointer_and_len_to_u64(data.as_ptr() as u32, data.len() as u32); + let ffi_value = pack_ptr_and_len(data.as_ptr() as u32, data.len() as u32); (ffi_value, data).into() } fn from_ffi_value(arg: Self::FFIType) -> T { - let (ptr, len) = pointer_and_len_from_u64(arg); + let (ptr, len) = unpack_ptr_and_len(arg); let len = len as usize; let slice = unsafe { slice::from_raw_parts(ptr as *const u8, len) }; diff --git a/primitives/runtime-interface/src/util.rs b/primitives/runtime-interface/src/util.rs new file mode 100644 index 0000000000..992c3b93cf --- /dev/null +++ b/primitives/runtime-interface/src/util.rs @@ -0,0 +1,59 @@ +// 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 . + +//! Various utilities that help interfacing with wasm runtime code. + +/// Pack a pointer and length into an `u64`. +pub fn pack_ptr_and_len(ptr: u32, len: u32) -> u64 { + // The static assertions from above are changed into a runtime check. + #[cfg(all(not(feature = "std"), feature = "disable_target_static_assertions"))] + assert_eq!(4, sp_std::mem::size_of::()); + + (u64::from(len) << 32) | u64::from(ptr) +} + +/// Unpacks an `u64` into the pointer and length. +/// +/// Runtime API functions return a 64-bit value which encodes a pointer in the least-significant +/// 32-bits and a length in the most-significant 32 bits. This interprets the returned value as a pointer, +/// length tuple. +pub fn unpack_ptr_and_len(val: u64) -> (u32, u32) { + // The static assertions from above are changed into a runtime check. + #[cfg(all(not(feature = "std"), feature = "disable_target_static_assertions"))] + assert_eq!(4, sp_std::mem::size_of::()); + + let ptr = (val & (!0u32 as u64)) as u32; + let len = (val >> 32) as u32; + + (ptr, len) +} + +#[cfg(test)] +mod tests { + use super::{pack_ptr_and_len, unpack_ptr_and_len}; + + #[test] + fn ptr_len_packing_unpacking() { + const PTR: u32 = 0x1337; + const LEN: u32 = 0x7f000000; + + let packed = pack_ptr_and_len(PTR, LEN); + let (ptr, len) = unpack_ptr_and_len(packed); + + assert_eq!(PTR, ptr); + assert_eq!(LEN, len); + } +} -- GitLab From 0e9db8686e74908aea23e52c01281d7a2a95bb24 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Tue, 24 Dec 2019 14:16:14 +0100 Subject: [PATCH 023/296] Remove unnecessary unsafe. (#4494) --- primitives/runtime-interface/src/impls.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index 681f304b4d..23929e5b17 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -301,7 +301,7 @@ macro_rules! impl_traits_for_arrays { #[cfg(not(feature = "std"))] impl FromFFIValue for [u8; $n] { fn from_ffi_value(arg: u32) -> [u8; $n] { - let mut res = unsafe { mem::MaybeUninit::<[u8; $n]>::zeroed().assume_init() }; + let mut res = [0u8; $n]; res.copy_from_slice(unsafe { slice::from_raw_parts(arg as *const u8, $n) }); // Make sure we free the pointer. @@ -317,7 +317,7 @@ macro_rules! impl_traits_for_arrays { fn from_ffi_value(context: &mut dyn FunctionContext, arg: u32) -> Result<[u8; $n]> { let data = context.read_memory(Pointer::new(arg), $n)?; - let mut res = unsafe { mem::MaybeUninit::<[u8; $n]>::zeroed().assume_init() }; + let mut res = [0u8; $n]; res.copy_from_slice(&data); Ok(res) } -- GitLab From 445239dc65ebf61909218b3c9efb19e9571ace7a Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Tue, 24 Dec 2019 23:16:19 +0800 Subject: [PATCH 024/296] use generated ModuleToIndex type (#4495) --- bin/node/runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 3b7fcb19c3..679bad2371 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -125,7 +125,7 @@ impl frame_system::Trait for Runtime { type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; - type ModuleToIndex = (); + type ModuleToIndex = ModuleToIndex; } parameter_types! { -- GitLab From 85de8d95188928e901c444a195bd785407c325cb Mon Sep 17 00:00:00 2001 From: Weiliang Li Date: Wed, 25 Dec 2019 00:17:19 +0900 Subject: [PATCH 025/296] Use `sc_network::NetworkStateInfo` instead of implementing redundant traits (#4436) * Implement local_peer_id for gossip * refactor local_peer_id * fix * reset gossip * Update tests.rs * fix ci * fix review * fix Cargo.lock * fix Cargo.lock --- client/authority-discovery/src/lib.rs | 368 +---------------- client/authority-discovery/src/tests.rs | 383 ++++++++++++++++++ .../src/communication/tests.rs | 3 +- client/network/src/service.rs | 14 +- client/network/test/src/lib.rs | 2 +- client/offchain/src/api.rs | 4 +- client/offchain/src/lib.rs | 2 +- client/service/test/src/lib.rs | 2 +- 8 files changed, 397 insertions(+), 381 deletions(-) create mode 100644 client/authority-discovery/src/tests.rs diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index 0bcd6c75ca..fe3da18ca6 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -64,14 +64,15 @@ use error::{Error, Result}; use log::{debug, error, log_enabled, warn}; use libp2p::Multiaddr; use sc_network::specialization::NetworkSpecialization; -use sc_network::{DhtEvent, ExHashT}; +use sc_network::{DhtEvent, ExHashT, NetworkStateInfo}; use sp_core::crypto::{key_types, Pair}; use sp_core::traits::BareCryptoStorePtr; use prost::Message; use sp_runtime::generic::BlockId; use sp_runtime::traits::{Block as BlockT, ProvideRuntimeApi}; -type Interval = Box + Unpin + Send + Sync>; +#[cfg(test)] +mod tests; mod error; /// Dht payload schemas generated from Protobuf definitions via Prost crate in build.rs. @@ -79,6 +80,8 @@ mod schema { include!(concat!(env!("OUT_DIR"), "/authority_discovery.rs")); } +type Interval = Box + Unpin + Send + Sync>; + /// Upper bound estimation on how long one should wait before accessing the Kademlia DHT. const LIBP2P_KADEMLIA_BOOTSTRAP_TIME: Duration = Duration::from_secs(30); @@ -99,7 +102,6 @@ where Network: NetworkProvider, Client: ProvideRuntimeApi + Send + Sync + 'static + HeaderBackend, ::Api: AuthorityDiscoveryApi, - { client: Arc, @@ -480,13 +482,7 @@ where /// NetworkProvider provides AuthorityDiscovery with all necessary hooks into the underlying /// Substrate networking. Using this trait abstraction instead of NetworkService directly is /// necessary to unit test AuthorityDiscovery. -pub trait NetworkProvider { - /// Returns the local external addresses. - fn external_addresses(&self) -> Vec; - - /// Returns the network identity of the node. - fn local_peer_id(&self) -> libp2p::PeerId; - +pub trait NetworkProvider: NetworkStateInfo { /// Modify a peerset priority group. fn set_priority_group( &self, @@ -507,12 +503,6 @@ where S: NetworkSpecialization, H: ExHashT, { - fn external_addresses(&self) -> Vec { - self.external_addresses() - } - fn local_peer_id(&self) -> libp2p::PeerId { - self.local_peer_id() - } fn set_priority_group( &self, group_id: String, @@ -543,349 +533,3 @@ fn interval_at(start: Instant, duration: Duration) -> Interval { Box::new(stream) } - -#[cfg(test)] -mod tests { - use super::*; - use sp_api::{ApiExt, Core, RuntimeVersion, StorageProof}; - use futures::channel::mpsc::channel; - use futures::executor::block_on; - use futures::future::poll_fn; - use sp_core::{ExecutionContext, NativeOrEncoded, testing::KeyStore}; - use sp_runtime::traits::Zero; - use sp_runtime::traits::{ApiRef, Block as BlockT, NumberFor, ProvideRuntimeApi}; - use std::sync::{Arc, Mutex}; - use sp_test_primitives::Block; - - #[test] - fn interval_at_with_start_now() { - let start = Instant::now(); - - let mut interval = interval_at( - std::time::Instant::now(), - std::time::Duration::from_secs(10), - ); - - futures::executor::block_on(async { - interval.next().await; - }); - - assert!( - Instant::now().saturating_duration_since(start) < Duration::from_secs(1), - "Expected low resolution instant interval to fire within less than a second.", - ); - } - - #[test] - fn interval_at_is_queuing_ticks() { - let start = Instant::now(); - - let interval = interval_at( - start, - std::time::Duration::from_millis(100), - ); - - // Let's wait for 200ms, thus 3 elements should be queued up (1st at 0ms, 2nd at 100ms, 3rd - // at 200ms). - std::thread::sleep(Duration::from_millis(200)); - - futures::executor::block_on(async { - interval.take(3).collect::>().await; - }); - - // Make sure we did not wait for more than 300 ms, which would imply that `at_interval` is - // not queuing ticks. - assert!( - Instant::now().saturating_duration_since(start) < Duration::from_millis(300), - "Expect interval to /queue/ events when not polled for a while.", - ); - } - - #[test] - fn interval_at_with_initial_delay() { - let start = Instant::now(); - - let mut interval = interval_at( - std::time::Instant::now() + Duration::from_millis(100), - std::time::Duration::from_secs(10), - ); - - futures::executor::block_on(async { - interval.next().await; - }); - - assert!( - Instant::now().saturating_duration_since(start) > Duration::from_millis(100), - "Expected interval with initial delay not to fire right away.", - ); - } - - #[derive(Clone)] - struct TestApi { - authorities: Vec, - } - - impl ProvideRuntimeApi for TestApi { - type Api = RuntimeApi; - - fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api> { - RuntimeApi{authorities: self.authorities.clone()}.into() - } - } - - /// Blockchain database header backend. Does not perform any validation. - impl HeaderBackend for TestApi { - fn header( - &self, - _id: BlockId, - ) -> std::result::Result, sp_blockchain::Error> { - Ok(None) - } - - fn info(&self) -> sc_client_api::blockchain::Info { - sc_client_api::blockchain::Info { - best_hash: Default::default(), - best_number: Zero::zero(), - finalized_hash: Default::default(), - finalized_number: Zero::zero(), - genesis_hash: Default::default(), - } - } - - fn status( - &self, - _id: BlockId, - ) -> std::result::Result { - Ok(sc_client_api::blockchain::BlockStatus::Unknown) - } - - fn number( - &self, - _hash: Block::Hash, - ) -> std::result::Result>, sp_blockchain::Error> { - Ok(None) - } - - fn hash( - &self, - _number: NumberFor, - ) -> std::result::Result, sp_blockchain::Error> { - Ok(None) - } - } - - struct RuntimeApi { - authorities: Vec, - } - - impl Core for RuntimeApi { - fn Core_version_runtime_api_impl( - &self, - _: &BlockId, - _: ExecutionContext, - _: Option<()>, - _: Vec, - ) -> std::result::Result, sp_blockchain::Error> { - unimplemented!("Not required for testing!") - } - - fn Core_execute_block_runtime_api_impl( - &self, - _: &BlockId, - _: ExecutionContext, - _: Option, - _: Vec, - ) -> std::result::Result, sp_blockchain::Error> { - unimplemented!("Not required for testing!") - } - - fn Core_initialize_block_runtime_api_impl( - &self, - _: &BlockId, - _: ExecutionContext, - _: Option<&::Header>, - _: Vec, - ) -> std::result::Result, sp_blockchain::Error> { - unimplemented!("Not required for testing!") - } - } - - impl ApiExt for RuntimeApi { - type Error = sp_blockchain::Error; - - fn map_api_result std::result::Result, R, E>( - &self, - _: F, - ) -> std::result::Result { - unimplemented!("Not required for testing!") - } - - fn runtime_version_at( - &self, - _: &BlockId, - ) -> std::result::Result { - unimplemented!("Not required for testing!") - } - - fn record_proof(&mut self) { - unimplemented!("Not required for testing!") - } - - fn extract_proof(&mut self) -> Option { - unimplemented!("Not required for testing!") - } - } - - impl AuthorityDiscoveryApi for RuntimeApi { - fn AuthorityDiscoveryApi_authorities_runtime_api_impl( - &self, - _: &BlockId, - _: ExecutionContext, - _: Option<()>, - _: Vec, - ) -> std::result::Result>, sp_blockchain::Error> { - return Ok(NativeOrEncoded::Native(self.authorities.clone())); - } - } - - #[derive(Default)] - struct TestNetwork { - // Whenever functions on `TestNetwork` are called, the function arguments are added to the - // vectors below. - pub put_value_call: Arc)>>>, - pub get_value_call: Arc>>, - pub set_priority_group_call: Arc)>>>, - } - - impl NetworkProvider for TestNetwork { - fn external_addresses(&self) -> Vec { - vec![] - } - fn local_peer_id(&self) -> libp2p::PeerId { - libp2p::PeerId::random() - } - fn set_priority_group( - &self, - group_id: String, - peers: HashSet, - ) -> std::result::Result<(), String> { - self.set_priority_group_call - .lock() - .unwrap() - .push((group_id, peers)); - Ok(()) - } - fn put_value(&self, key: libp2p::kad::record::Key, value: Vec) { - self.put_value_call.lock().unwrap().push((key, value)); - } - fn get_value(&self, key: &libp2p::kad::record::Key) { - self.get_value_call.lock().unwrap().push(key.clone()); - } - } - - #[test] - fn publish_ext_addresses_puts_record_on_dht() { - let (_dht_event_tx, dht_event_rx) = channel(1000); - let network: Arc = Arc::new(Default::default()); - let key_store = KeyStore::new(); - let public = key_store.write() - .sr25519_generate_new(key_types::AUTHORITY_DISCOVERY, None) - .unwrap(); - let test_api = Arc::new(TestApi {authorities: vec![public.into()]}); - - let mut authority_discovery = AuthorityDiscovery::new( - test_api, network.clone(), vec![], key_store, dht_event_rx.boxed(), - ); - - authority_discovery.publish_ext_addresses().unwrap(); - - // Expect authority discovery to put a new record onto the dht. - assert_eq!(network.put_value_call.lock().unwrap().len(), 1); - } - - #[test] - fn request_addresses_of_others_triggers_dht_get_query() { - let _ = ::env_logger::try_init(); - let (_dht_event_tx, dht_event_rx) = channel(1000); - - // Generate authority keys - let authority_1_key_pair = AuthorityPair::from_seed_slice(&[1; 32]).unwrap(); - let authority_2_key_pair = AuthorityPair::from_seed_slice(&[2; 32]).unwrap(); - - let test_api = Arc::new(TestApi { - authorities: vec![authority_1_key_pair.public(), authority_2_key_pair.public()], - }); - - let network: Arc = Arc::new(Default::default()); - let key_store = KeyStore::new(); - - let mut authority_discovery = AuthorityDiscovery::new( - test_api, network.clone(), vec![], key_store, dht_event_rx.boxed(), - ); - - authority_discovery.request_addresses_of_others().unwrap(); - - // Expect authority discovery to request new records from the dht. - assert_eq!(network.get_value_call.lock().unwrap().len(), 2); - } - - #[test] - fn handle_dht_events_with_value_found_should_call_set_priority_group() { - let _ = ::env_logger::try_init(); - // Create authority discovery. - - let (mut dht_event_tx, dht_event_rx) = channel(1000); - let key_pair = AuthorityPair::from_seed_slice(&[1; 32]).unwrap(); - let test_api = Arc::new(TestApi {authorities: vec![key_pair.public()]}); - let network: Arc = Arc::new(Default::default()); - let key_store = KeyStore::new(); - - let mut authority_discovery = AuthorityDiscovery::new( - test_api, network.clone(), vec![], key_store, dht_event_rx.boxed(), - ); - - // Create sample dht event. - - let authority_id_1 = hash_authority_id(key_pair.public().as_ref()).unwrap(); - let address_1: libp2p::Multiaddr = "/ip6/2001:db8::".parse().unwrap(); - - let mut serialized_addresses = vec![]; - schema::AuthorityAddresses { - addresses: vec![address_1.to_vec()], - } - .encode(&mut serialized_addresses) - .unwrap(); - - let signature = key_pair.sign(serialized_addresses.as_ref()).encode(); - let mut signed_addresses = vec![]; - schema::SignedAuthorityAddresses { - addresses: serialized_addresses, - signature: signature, - } - .encode(&mut signed_addresses) - .unwrap(); - - let dht_event = sc_network::DhtEvent::ValueFound(vec![(authority_id_1, signed_addresses)]); - dht_event_tx.try_send(dht_event).unwrap(); - - // Make authority discovery handle the event. - let f = |cx: &mut Context<'_>| -> Poll<()> { - authority_discovery.handle_dht_events(cx).unwrap(); - - // Expect authority discovery to set the priority set. - assert_eq!(network.set_priority_group_call.lock().unwrap().len(), 1); - - assert_eq!( - network.set_priority_group_call.lock().unwrap()[0], - ( - "authorities".to_string(), - HashSet::from_iter(vec![address_1.clone()].into_iter()) - ) - ); - - Poll::Ready(()) - }; - - let _ = block_on(poll_fn(f)); - } -} diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs new file mode 100644 index 0000000000..bd81e791db --- /dev/null +++ b/client/authority-discovery/src/tests.rs @@ -0,0 +1,383 @@ +// 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 . + +use std::sync::{Arc, Mutex}; + +use futures::channel::mpsc::channel; +use futures::executor::block_on; +use futures::future::poll_fn; +use libp2p::{kad, PeerId}; + +use sp_api::{ApiExt, Core, RuntimeVersion, StorageProof}; +use sp_core::{testing::KeyStore, ExecutionContext, NativeOrEncoded}; +use sp_runtime::traits::Zero; +use sp_runtime::traits::{ApiRef, Block as BlockT, NumberFor, ProvideRuntimeApi}; +use sp_test_primitives::Block; + +use super::*; + +#[test] +fn interval_at_with_start_now() { + let start = Instant::now(); + + let mut interval = interval_at( + std::time::Instant::now(), + std::time::Duration::from_secs(10), + ); + + futures::executor::block_on(async { + interval.next().await; + }); + + assert!( + Instant::now().saturating_duration_since(start) < Duration::from_secs(1), + "Expected low resolution instant interval to fire within less than a second.", + ); +} + +#[test] +fn interval_at_is_queuing_ticks() { + let start = Instant::now(); + + let interval = interval_at(start, std::time::Duration::from_millis(100)); + + // Let's wait for 200ms, thus 3 elements should be queued up (1st at 0ms, 2nd at 100ms, 3rd + // at 200ms). + std::thread::sleep(Duration::from_millis(200)); + + futures::executor::block_on(async { + interval.take(3).collect::>().await; + }); + + // Make sure we did not wait for more than 300 ms, which would imply that `at_interval` is + // not queuing ticks. + assert!( + Instant::now().saturating_duration_since(start) < Duration::from_millis(300), + "Expect interval to /queue/ events when not polled for a while.", + ); +} + +#[test] +fn interval_at_with_initial_delay() { + let start = Instant::now(); + + let mut interval = interval_at( + std::time::Instant::now() + Duration::from_millis(100), + std::time::Duration::from_secs(10), + ); + + futures::executor::block_on(async { + interval.next().await; + }); + + assert!( + Instant::now().saturating_duration_since(start) > Duration::from_millis(100), + "Expected interval with initial delay not to fire right away.", + ); +} + +#[derive(Clone)] +struct TestApi { + authorities: Vec, +} + +impl ProvideRuntimeApi for TestApi { + type Api = RuntimeApi; + + fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api> { + RuntimeApi { + authorities: self.authorities.clone(), + } + .into() + } +} + +/// Blockchain database header backend. Does not perform any validation. +impl HeaderBackend for TestApi { + fn header( + &self, + _id: BlockId, + ) -> std::result::Result, sp_blockchain::Error> { + Ok(None) + } + + fn info(&self) -> sc_client_api::blockchain::Info { + sc_client_api::blockchain::Info { + best_hash: Default::default(), + best_number: Zero::zero(), + finalized_hash: Default::default(), + finalized_number: Zero::zero(), + genesis_hash: Default::default(), + } + } + + fn status( + &self, + _id: BlockId, + ) -> std::result::Result { + Ok(sc_client_api::blockchain::BlockStatus::Unknown) + } + + fn number( + &self, + _hash: Block::Hash, + ) -> std::result::Result>, sp_blockchain::Error> { + Ok(None) + } + + fn hash( + &self, + _number: NumberFor, + ) -> std::result::Result, sp_blockchain::Error> { + Ok(None) + } +} + +struct RuntimeApi { + authorities: Vec, +} + +impl Core for RuntimeApi { + fn Core_version_runtime_api_impl( + &self, + _: &BlockId, + _: ExecutionContext, + _: Option<()>, + _: Vec, + ) -> std::result::Result, sp_blockchain::Error> { + unimplemented!("Not required for testing!") + } + + fn Core_execute_block_runtime_api_impl( + &self, + _: &BlockId, + _: ExecutionContext, + _: Option, + _: Vec, + ) -> std::result::Result, sp_blockchain::Error> { + unimplemented!("Not required for testing!") + } + + fn Core_initialize_block_runtime_api_impl( + &self, + _: &BlockId, + _: ExecutionContext, + _: Option<&::Header>, + _: Vec, + ) -> std::result::Result, sp_blockchain::Error> { + unimplemented!("Not required for testing!") + } +} + +impl ApiExt for RuntimeApi { + type Error = sp_blockchain::Error; + + fn map_api_result std::result::Result, R, E>( + &self, + _: F, + ) -> std::result::Result { + unimplemented!("Not required for testing!") + } + + fn runtime_version_at( + &self, + _: &BlockId, + ) -> std::result::Result { + unimplemented!("Not required for testing!") + } + + fn record_proof(&mut self) { + unimplemented!("Not required for testing!") + } + + fn extract_proof(&mut self) -> Option { + unimplemented!("Not required for testing!") + } +} + +impl AuthorityDiscoveryApi for RuntimeApi { + fn AuthorityDiscoveryApi_authorities_runtime_api_impl( + &self, + _: &BlockId, + _: ExecutionContext, + _: Option<()>, + _: Vec, + ) -> std::result::Result>, sp_blockchain::Error> { + return Ok(NativeOrEncoded::Native(self.authorities.clone())); + } +} + +#[derive(Default)] +struct TestNetwork { + // Whenever functions on `TestNetwork` are called, the function arguments are added to the + // vectors below. + pub put_value_call: Arc)>>>, + pub get_value_call: Arc>>, + pub set_priority_group_call: Arc)>>>, +} + +impl NetworkProvider for TestNetwork { + fn set_priority_group( + &self, + group_id: String, + peers: HashSet, + ) -> std::result::Result<(), String> { + self.set_priority_group_call + .lock() + .unwrap() + .push((group_id, peers)); + Ok(()) + } + fn put_value(&self, key: kad::record::Key, value: Vec) { + self.put_value_call.lock().unwrap().push((key, value)); + } + fn get_value(&self, key: &kad::record::Key) { + self.get_value_call.lock().unwrap().push(key.clone()); + } +} + +impl NetworkStateInfo for TestNetwork { + fn local_peer_id(&self) -> PeerId { + PeerId::random() + } + + fn external_addresses(&self) -> Vec { + vec![] + } +} + +#[test] +fn publish_ext_addresses_puts_record_on_dht() { + let (_dht_event_tx, dht_event_rx) = channel(1000); + let network: Arc = Arc::new(Default::default()); + let key_store = KeyStore::new(); + let public = key_store + .write() + .sr25519_generate_new(key_types::AUTHORITY_DISCOVERY, None) + .unwrap(); + let test_api = Arc::new(TestApi { + authorities: vec![public.into()], + }); + + let mut authority_discovery = AuthorityDiscovery::new( + test_api, + network.clone(), + vec![], + key_store, + dht_event_rx.boxed(), + ); + + authority_discovery.publish_ext_addresses().unwrap(); + + // Expect authority discovery to put a new record onto the dht. + assert_eq!(network.put_value_call.lock().unwrap().len(), 1); +} + +#[test] +fn request_addresses_of_others_triggers_dht_get_query() { + let _ = ::env_logger::try_init(); + let (_dht_event_tx, dht_event_rx) = channel(1000); + + // Generate authority keys + let authority_1_key_pair = AuthorityPair::from_seed_slice(&[1; 32]).unwrap(); + let authority_2_key_pair = AuthorityPair::from_seed_slice(&[2; 32]).unwrap(); + + let test_api = Arc::new(TestApi { + authorities: vec![authority_1_key_pair.public(), authority_2_key_pair.public()], + }); + + let network: Arc = Arc::new(Default::default()); + let key_store = KeyStore::new(); + + let mut authority_discovery = AuthorityDiscovery::new( + test_api, + network.clone(), + vec![], + key_store, + dht_event_rx.boxed(), + ); + + authority_discovery.request_addresses_of_others().unwrap(); + + // Expect authority discovery to request new records from the dht. + assert_eq!(network.get_value_call.lock().unwrap().len(), 2); +} + +#[test] +fn handle_dht_events_with_value_found_should_call_set_priority_group() { + let _ = ::env_logger::try_init(); + // Create authority discovery. + + let (mut dht_event_tx, dht_event_rx) = channel(1000); + let key_pair = AuthorityPair::from_seed_slice(&[1; 32]).unwrap(); + let test_api = Arc::new(TestApi { + authorities: vec![key_pair.public()], + }); + let network: Arc = Arc::new(Default::default()); + let key_store = KeyStore::new(); + + let mut authority_discovery = AuthorityDiscovery::new( + test_api, + network.clone(), + vec![], + key_store, + dht_event_rx.boxed(), + ); + + // Create sample dht event. + + let authority_id_1 = hash_authority_id(key_pair.public().as_ref()).unwrap(); + let address_1: Multiaddr = "/ip6/2001:db8::".parse().unwrap(); + + let mut serialized_addresses = vec![]; + schema::AuthorityAddresses { + addresses: vec![address_1.to_vec()], + } + .encode(&mut serialized_addresses) + .unwrap(); + + let signature = key_pair.sign(serialized_addresses.as_ref()).encode(); + let mut signed_addresses = vec![]; + schema::SignedAuthorityAddresses { + addresses: serialized_addresses, + signature: signature, + } + .encode(&mut signed_addresses) + .unwrap(); + + let dht_event = sc_network::DhtEvent::ValueFound(vec![(authority_id_1, signed_addresses)]); + dht_event_tx.try_send(dht_event).unwrap(); + + // Make authority discovery handle the event. + let f = |cx: &mut Context<'_>| -> Poll<()> { + authority_discovery.handle_dht_events(cx).unwrap(); + + // Expect authority discovery to set the priority set. + assert_eq!(network.set_priority_group_call.lock().unwrap().len(), 1); + + assert_eq!( + network.set_priority_group_call.lock().unwrap()[0], + ( + "authorities".to_string(), + HashSet::from_iter(vec![address_1.clone()].into_iter()) + ) + ); + + Poll::Ready(()) + }; + + let _ = block_on(poll_fn(f)); +} diff --git a/client/finality-grandpa/src/communication/tests.rs b/client/finality-grandpa/src/communication/tests.rs index 3e99d14de6..3dafc0ab2c 100644 --- a/client/finality-grandpa/src/communication/tests.rs +++ b/client/finality-grandpa/src/communication/tests.rs @@ -45,8 +45,7 @@ struct TestNetwork { } impl sc_network_gossip::Network for TestNetwork { - fn event_stream(&self) - -> Box + Send> { + fn event_stream(&self) -> Box + Send> { let (tx, rx) = mpsc::unbounded(); let _ = self.sender.unbounded_send(Event::EventStream(tx)); Box::new(rx) diff --git a/client/network/src/service.rs b/client/network/src/service.rs index d945bb0e26..9f080b58c9 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -422,11 +422,6 @@ impl, H: ExHashT> NetworkWorker } impl, H: ExHashT> NetworkService { - /// Returns the network identity of the node. - pub fn local_peer_id(&self) -> PeerId { - self.local_peer_id.clone() - } - /// Writes a message on an open notifications channel. Has no effect if the notifications /// channel with this protocol name is closed. /// @@ -609,11 +604,6 @@ impl, H: ExHashT> NetworkServic pub fn num_connected(&self) -> usize { self.num_connected.load(Ordering::Relaxed) } - - /// Returns the local external addresses. - pub fn external_addresses(&self) -> Vec { - self.external_addresses.lock().clone() - } } impl, H: ExHashT> sp_consensus::SyncOracle @@ -646,7 +636,7 @@ pub trait NetworkStateInfo { fn external_addresses(&self) -> Vec; /// Returns the local Peer ID. - fn peer_id(&self) -> PeerId; + fn local_peer_id(&self) -> PeerId; } impl NetworkStateInfo for NetworkService @@ -661,7 +651,7 @@ impl NetworkStateInfo for NetworkService } /// Returns the local Peer ID. - fn peer_id(&self) -> PeerId { + fn local_peer_id(&self) -> PeerId { self.local_peer_id.clone() } } diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 8e598c95a3..ac4ec6f414 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -49,7 +49,7 @@ use sp_consensus::Error as ConsensusError; use sp_consensus::{BlockOrigin, ForkChoiceStrategy, BlockImportParams, BlockCheckParams, JustificationImport}; use futures::prelude::*; use futures03::{StreamExt as _, TryStreamExt as _}; -use sc_network::{NetworkWorker, NetworkService, ReportHandle, config::ProtocolId}; +use sc_network::{NetworkWorker, NetworkStateInfo, NetworkService, ReportHandle, config::ProtocolId}; use sc_network::config::{NetworkConfiguration, TransportConfig, BoxFinalityProofRequestBuilder}; use libp2p::PeerId; use parking_lot::Mutex; diff --git a/client/offchain/src/api.rs b/client/offchain/src/api.rs index 4db08c145d..83e5e8a353 100644 --- a/client/offchain/src/api.rs +++ b/client/offchain/src/api.rs @@ -75,7 +75,7 @@ impl OffchainExt for Api { let external_addresses = self.network_state.external_addresses(); let state = NetworkState::new( - self.network_state.peer_id(), + self.network_state.local_peer_id(), external_addresses, ); Ok(OpaqueNetworkState::from(state)) @@ -292,7 +292,7 @@ mod tests { Vec::new() } - fn peer_id(&self) -> PeerId { + fn local_peer_id(&self) -> PeerId { PeerId::random() } } diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index 208cfdfb0f..fc28455141 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -158,7 +158,7 @@ mod tests { Vec::new() } - fn peer_id(&self) -> PeerId { + fn local_peer_id(&self) -> PeerId { PeerId::random() } } diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index dae0f5604f..f66e4a65da 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -33,7 +33,7 @@ use sc_service::{ Roles, Error, }; -use sc_network::{multiaddr, Multiaddr}; +use sc_network::{multiaddr, Multiaddr, NetworkStateInfo}; use sc_network::config::{NetworkConfiguration, TransportConfig, NodeKeyConfig, Secret, NonReservedPeerMode}; use sp_runtime::{generic::BlockId, traits::Block as BlockT}; use sp_transaction_pool::TransactionPool; -- GitLab From 584d3752928015d6e3e51333f89a9ac5b90702db Mon Sep 17 00:00:00 2001 From: Weiliang Li Date: Wed, 25 Dec 2019 17:01:17 +0900 Subject: [PATCH 026/296] fix ligature (#4497) --- primitives/application-crypto/src/traits.rs | 2 +- primitives/runtime/src/traits.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/primitives/application-crypto/src/traits.rs b/primitives/application-crypto/src/traits.rs index 917ec3b0e9..982e001013 100644 --- a/primitives/application-crypto/src/traits.rs +++ b/primitives/application-crypto/src/traits.rs @@ -71,7 +71,7 @@ pub trait AppPublic: #[cfg(feature = "full_crypto")] pub trait AppPair: AppKey + Pair::Public> { /// The wrapped type which is just a plain instance of `Pair`. - type Generic: IsWrappedBy + Pair::Public as AppPublic>::Generic>; + type Generic: IsWrappedBy + Pair::Public as AppPublic>::Generic>; } /// A application's signature. diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index a40cd35882..2b9ea98f05 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -117,7 +117,7 @@ pub trait AppVerify { } impl< - S: Verify::Public as sp_application_crypto::AppPublic>::Generic> + From, + S: Verify::Public as sp_application_crypto::AppPublic>::Generic> + From, T: sp_application_crypto::Wraps + sp_application_crypto::AppKey + sp_application_crypto::AppSignature + AsRef + AsMut + From, > AppVerify for T where -- GitLab From c3a4c55cfc3a5d6f236dc184ea76f5b9ebe1eae4 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 26 Dec 2019 16:04:07 +0300 Subject: [PATCH 027/296] Check aura slot numbers are strictly increasing (#4020) * initial block import handler * fix node template * fix error message * fix error message again * final fixes * fix node template again --- bin/node-template/src/service.rs | 12 ++- client/consensus/aura/src/lib.rs | 144 +++++++++++++++++++++++++------ 2 files changed, 124 insertions(+), 32 deletions(-) diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index e1379d2200..92574704f7 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -56,9 +56,13 @@ macro_rules! new_full_start { client.clone(), &*client, select_chain )?; - let import_queue = sc_consensus_aura::import_queue::<_, _, AuraPair, _>( + let aura_block_import = sc_consensus_aura::AuraBlockImport::<_, _, _, AuraPair>::new( + grandpa_block_import.clone(), client.clone(), + ); + + let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, _>( sc_consensus_aura::SlotDuration::get_or_compute(&*client)?, - Box::new(grandpa_block_import.clone()), + aura_block_import, Some(Box::new(grandpa_block_import.clone())), None, client, @@ -220,9 +224,9 @@ pub fn new_light(config: Configuration( + let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, ()>( sc_consensus_aura::SlotDuration::get_or_compute(&*client)?, - Box::new(grandpa_block_import), + grandpa_block_import, None, Some(Box::new(finality_proof_import)), client, diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 82ea2e764c..a2d6fa0c31 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -28,48 +28,42 @@ //! //! 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, pin::Pin}; +use std::{ + sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug, pin::Pin, + collections::HashMap +}; + +use futures::prelude::*; +use parking_lot::Mutex; +use log::{debug, info, trace}; use codec::{Encode, Decode, Codec}; + use sp_consensus::{ self, BlockImport, Environment, Proposer, CanAuthorWith, ForkChoiceStrategy, BlockImportParams, - BlockOrigin, Error as ConsensusError, SelectChain, SlotData, + BlockOrigin, Error as ConsensusError, SelectChain, SlotData, BlockCheckParams, ImportResult }; use sp_consensus::import_queue::{ - Verifier, BasicQueue, BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport, + Verifier, BasicQueue, BoxJustificationImport, BoxFinalityProofImport, }; use sc_client_api::backend::AuxStore; -use sc_client::{ - blockchain::ProvideCache, BlockOf -}; +use sc_client::BlockOf; use sp_blockchain::{ - Result as CResult, well_known_cache_keys::{self, Id as CacheKeyId}, + self, Result as CResult, well_known_cache_keys::{self, Id as CacheKeyId}, + ProvideCache, HeaderBackend, }; - use sp_block_builder::BlockBuilder as BlockBuilderApi; - use sp_runtime::{generic::{BlockId, OpaqueDigestItemId}, Justification}; use sp_runtime::traits::{Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; - use sp_core::crypto::Pair; use sp_inherents::{InherentDataProviders, InherentData}; - -use futures::prelude::*; -use parking_lot::Mutex; -use log::{debug, info, trace}; -use sp_blockchain; - use sp_timestamp::{ TimestampInherentData, InherentType as TimestampInherent, InherentError as TIError }; - use sc_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_INFO}; - use sc_consensus_slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible}; use sc_consensus_slots::check_equivocation; - use sc_keystore::KeyStorePtr; - use sp_api::ApiExt; pub use sp_consensus_aura::{ @@ -220,11 +214,11 @@ impl sc_consensus_slots::SimpleSlotWorker for Au SO: SyncOracle + Send + Clone, Error: ::std::error::Error + Send + From<::sp_consensus::Error> + From + 'static, { - type EpochData = Vec>; - type Claim = P; + type BlockImport = I; type SyncOracle = SO; type Proposer = E::Proposer; - type BlockImport = I; + type Claim = P; + type EpochData = Vec>; fn logging_target(&self) -> &'static str { "aura" @@ -357,7 +351,7 @@ fn aura_err(error: Error) -> Error { error } -#[derive(derive_more::Display)] +#[derive(derive_more::Display, Debug)] enum Error { #[display(fmt = "Multiple Aura pre-runtime headers")] MultipleHeaders, @@ -376,6 +370,16 @@ enum Error { Client(sp_blockchain::Error), DataProvider(String), Runtime(String), + #[display(fmt = "Slot number must increase: parent slot: {}, this slot: {}", _0, _1)] + SlotNumberMustIncrease(u64, u64), + #[display(fmt = "Parent ({}) of {} unavailable. Cannot import", _0, _1)] + ParentUnavailable(B::Hash, B::Hash), +} + +impl std::convert::From> for String { + fn from(error: Error) -> String { + error.to_string() + } } fn find_pre_digest(header: &B::Header) -> Result> @@ -708,10 +712,93 @@ fn register_aura_inherent_data_provider( } } +/// A block-import handler for Aura. +pub struct AuraBlockImport, P> { + inner: I, + client: Arc, + _phantom: PhantomData<(Block, P)>, +} + +impl, P> Clone for AuraBlockImport { + fn clone(&self) -> Self { + AuraBlockImport { + inner: self.inner.clone(), + client: self.client.clone(), + _phantom: PhantomData, + } + } +} + +impl, P> AuraBlockImport { + /// New aura block import. + pub fn new( + inner: I, + client: Arc, + ) -> Self { + Self { + inner, + client, + _phantom: PhantomData, + } + } +} + +impl BlockImport for AuraBlockImport where + I: BlockImport + Send + Sync, + I::Error: Into, + C: HeaderBackend, + P: Pair + Send + Sync + 'static, + P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, + P::Signature: Encode + Decode, +{ + type Error = ConsensusError; + + fn check_block( + &mut self, + block: BlockCheckParams, + ) -> Result { + self.inner.check_block(block).map_err(Into::into) + } + + fn import_block( + &mut self, + block: BlockImportParams, + new_cache: HashMap>, + ) -> Result { + let hash = block.post_header().hash(); + let slot_number = find_pre_digest::(&block.header) + .expect("valid Aura headers must contain a predigest; \ + header has been already verified; qed"); + + let parent_hash = *block.header.parent_hash(); + let parent_header = self.client.header(BlockId::Hash(parent_hash)) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()))? + .ok_or_else(|| ConsensusError::ChainLookup(aura_err( + Error::::ParentUnavailable(parent_hash, hash) + ).into()))?; + + let parent_slot = find_pre_digest::(&parent_header) + .expect("valid Aura headers contain a pre-digest; \ + parent header has already been verified; qed"); + + // make sure that slot number is strictly increasing + if slot_number <= parent_slot { + return Err( + ConsensusError::ClientImport(aura_err( + Error::::SlotNumberMustIncrease(parent_slot, slot_number) + ).into()) + ); + } + + self.inner.import_block(block, new_cache) + .map_err(Into::into) + } +} + /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue( +pub fn import_queue( slot_duration: SlotDuration, - block_import: BoxBlockImport, + block_import: I, justification_import: Option>, finality_proof_import: Option>, client: Arc, @@ -719,8 +806,9 @@ pub fn import_queue( transaction_pool: Option>, ) -> Result, sp_consensus::Error> where B: BlockT, - C: 'static + ProvideRuntimeApi + BlockOf + ProvideCache + Send + Sync + AuxStore, C::Api: BlockBuilderApi + AuraApi> + ApiExt, + C: 'static + ProvideRuntimeApi + BlockOf + ProvideCache + Send + Sync + AuxStore + HeaderBackend, + I: BlockImport + Send + Sync + 'static, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, @@ -738,7 +826,7 @@ pub fn import_queue( }; Ok(BasicQueue::new( verifier, - block_import, + Box::new(block_import), justification_import, finality_proof_import, )) -- GitLab From 9f2caf2718f2fd174c17b487da269187b10611b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 27 Dec 2019 09:12:25 +0100 Subject: [PATCH 028/296] Support loading the URI from a file in subkey (#4503) * Support loading the URI from a file in subkey * Fix tests --- bin/utils/subkey/src/main.rs | 69 ++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index 9526fa1b52..f10c949dbe 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -31,9 +31,7 @@ use sp_core::{ }; use sp_runtime::{traits::{IdentifyAccount, Verify}, generic::Era}; use std::{ - convert::{TryInto, TryFrom}, - io::{stdin, Read}, - str::FromStr, + convert::{TryInto, TryFrom}, io::{stdin, Read}, str::FromStr, path::PathBuf, fs, }; mod vanity; @@ -186,13 +184,16 @@ fn get_app<'a, 'b>(usage: &'a str) -> App<'a, 'b> { .about("Gets a public key and a SS58 address from the provided Secret URI") .args_from_usage("[uri] 'A Key URI to be inspected. May be a secret seed, \ secret URI (with derivation paths and password), SS58 or public URI. \ + If the value is a file, the file content is used as URI. \ If not given, you will be prompted for the URI.' "), SubCommand::with_name("sign") .about("Sign a message, provided on STDIN, with a given (secret) key") .args_from_usage(" -h, --hex 'The message on STDIN is hex-encoded data' - 'The secret key URI.' + 'The secret key URI. \ + If the value is a file, the file content is used as URI. \ + If not given, you will be prompted for the URI.' "), SubCommand::with_name("sign-transaction") .about("Sign transaction from encoded Call. Returns a signed and encoded \ @@ -226,7 +227,9 @@ fn get_app<'a, 'b>(usage: &'a str) -> App<'a, 'b> { .args_from_usage(" -h, --hex 'The message on STDIN is hex-encoded data' 'Signature, hex-encoded.' - 'The public or secret key URI.' + 'The public or secret key URI. \ + If the value is a file, the file content is used as URI. \ + If not given, you will be prompted for the URI.' "), ]) } @@ -244,6 +247,29 @@ fn main() { return execute::(matches) } +/// Get `URI` from CLI or prompt the user. +/// +/// `URI` is extracted from `matches` by using `match_name`. +/// +/// If the `URI` given as CLI argument is a file, the file content is taken as `URI`. +/// If no `URI` is given to the CLI, the user is prompted for it. +fn get_uri(match_name: &str, matches: &ArgMatches) -> String { + if let Some(uri) = matches.value_of(match_name) { + let file = PathBuf::from(uri); + if file.is_file() { + fs::read_to_string(uri) + .expect(&format!("Failed to read `URI` file: {}", uri)) + .trim_end() + .into() + } else { + uri.into() + } + } else { + rpassword::read_password_from_tty(Some("URI: ")) + .expect("Failed to read `URI`") + } +} + fn execute(matches: ArgMatches) where SignatureOf: SignatureT, @@ -278,24 +304,20 @@ where C::print_from_uri(mnemonic.phrase(), password, maybe_network); } ("inspect", Some(matches)) => { - let uri = match matches.value_of("uri") { - Some(uri) => uri.into(), - None => rpassword::read_password_from_tty(Some("URI: ")) - .expect("Failed to read URI"), - }; - - C::print_from_uri(&uri, password, maybe_network); + C::print_from_uri(&get_uri("uri", &matches), password, maybe_network); } ("sign", Some(matches)) => { + let suri = get_uri("suri", &matches); let should_decode = matches.is_present("hex"); let message = read_message_from_stdin(should_decode); - let signature = do_sign::(matches, message, password); + let signature = do_sign::(&suri, message, password); println!("{}", signature); } ("verify", Some(matches)) => { + let uri = get_uri("uri", &matches); let should_decode = matches.is_present("hex"); let message = read_message_from_stdin(should_decode); - let is_valid_signature = do_verify::(matches, message); + let is_valid_signature = do_verify::(matches, &uri, message); if is_valid_signature { println!("Signature verifies correctly."); } else { @@ -356,23 +378,23 @@ fn generate_mnemonic(matches: &ArgMatches) -> Mnemonic { Mnemonic::new(words, Language::English) } -fn do_sign(matches: &ArgMatches, message: Vec, password: Option<&str>) -> String +fn do_sign(suri: &str, message: Vec, password: Option<&str>) -> String where SignatureOf: SignatureT, PublicOf: PublicT, { - let pair = read_pair::(matches.value_of("suri"), password); + let pair = read_pair::(Some(suri), password); let signature = pair.sign(&message); format_signature::(&signature) } -fn do_verify(matches: &ArgMatches, message: Vec) -> bool +fn do_verify(matches: &ArgMatches, uri: &str, message: Vec) -> bool where SignatureOf: SignatureT, PublicOf: PublicT, { let signature = read_signature::(matches); - let pubkey = read_public_key::(matches.value_of("uri")); + let pubkey = read_public_key::(Some(uri)); <::Pair as Pair>::verify(&signature, &message, &pubkey) } @@ -577,21 +599,16 @@ mod tests { let public_key = CryptoType::public_from_pair(&pair); let public_key = format_public_key::(public_key); let seed = format_seed::(seed); - - // Sign a message using previous seed. - let arg_vec = vec!["subkey", "sign", &seed[..]]; - - let matches = app.get_matches_from(arg_vec); - let matches = matches.subcommand().1.unwrap(); let message = "Blah Blah\n".as_bytes().to_vec(); - let signature = do_sign::(matches, message.clone(), password); + + let signature = do_sign::(&seed, message.clone(), password); // Verify the previous signature. let arg_vec = vec!["subkey", "verify", &signature[..], &public_key[..]]; let matches = get_app(&usage).get_matches_from(arg_vec); let matches = matches.subcommand().1.unwrap(); - assert!(do_verify::(matches, message)); + assert!(do_verify::(matches, &public_key, message)); } #[test] -- GitLab From 0fcb22c2cc65ddd08a23348cedab8baf79f7e93e Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 27 Dec 2019 23:07:04 +0300 Subject: [PATCH 029/296] Improve subkey error reporting. (#4504) --- Cargo.lock | 1 + bin/utils/subkey/Cargo.toml | 1 + bin/utils/subkey/src/main.rs | 182 +++++++++++++++++++-------------- bin/utils/subkey/src/vanity.rs | 2 +- 4 files changed, 109 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f951617658..af59d9ece1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6714,6 +6714,7 @@ name = "subkey" version = "2.0.0" dependencies = [ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "frame-system 2.0.0", "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 6d687ce910..c042b76f4a 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -22,6 +22,7 @@ pallet-balances = { version = "2.0.0", path = "../../../frame/balances" } pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transaction-payment" } rpassword = "4.0.1" itertools = "0.8.2" +derive_more = { version = "0.99.2" } [features] bench = [] diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index f10c949dbe..d586fac6f9 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -31,7 +31,7 @@ use sp_core::{ }; use sp_runtime::{traits::{IdentifyAccount, Verify}, generic::Era}; use std::{ - convert::{TryInto, TryFrom}, io::{stdin, Read}, str::FromStr, path::PathBuf, fs, + convert::{TryInto, TryFrom}, io::{stdin, Read}, str::FromStr, path::PathBuf, fs, fmt, }; mod vanity; @@ -234,12 +234,12 @@ fn get_app<'a, 'b>(usage: &'a str) -> App<'a, 'b> { ]) } -fn main() { +fn main() -> Result<(), Error> { let usage = get_usage(); let matches = get_app(&usage).get_matches(); if matches.is_present("ed25519") { - return execute::(matches) + return execute::(matches); } if matches.is_present("secp256k1") { return execute::(matches) @@ -253,24 +253,41 @@ fn main() { /// /// If the `URI` given as CLI argument is a file, the file content is taken as `URI`. /// If no `URI` is given to the CLI, the user is prompted for it. -fn get_uri(match_name: &str, matches: &ArgMatches) -> String { - if let Some(uri) = matches.value_of(match_name) { +fn get_uri(match_name: &str, matches: &ArgMatches) -> Result { + let uri = if let Some(uri) = matches.value_of(match_name) { let file = PathBuf::from(uri); if file.is_file() { - fs::read_to_string(uri) - .expect(&format!("Failed to read `URI` file: {}", uri)) + fs::read_to_string(uri)? .trim_end() .into() } else { uri.into() } } else { - rpassword::read_password_from_tty(Some("URI: ")) - .expect("Failed to read `URI`") + rpassword::read_password_from_tty(Some("URI: "))? + }; + + Ok(uri) +} + +#[derive(derive_more::Display, derive_more::From)] +enum Error { + Static(&'static str), + Io(std::io::Error), + Formatted(String), +} + +impl fmt::Debug for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) } } -fn execute(matches: ArgMatches) +fn static_err(msg: &'static str) -> Result<(), Error> { + Err(Error::Static(msg)) +} + +fn execute(matches: ArgMatches) -> Result<(), Error> where SignatureOf: SignatureT, PublicOf: PublicT, @@ -279,49 +296,55 @@ where let password = matches.value_of("password"); let password = if password.is_some() && password_interactive { - panic!("`--password` given and `--password-interactive` selected!"); + return static_err("`--password` given and `--password-interactive` selected!"); } else if password_interactive { Some( - rpassword::read_password_from_tty(Some("Key password: ")) - .expect("Reads password from tty") + rpassword::read_password_from_tty(Some("Key password: "))? ) } else { password.map(Into::into) }; let password = password.as_ref().map(String::as_str); - let maybe_network: Option = matches.value_of("network").map(|network| { + let maybe_network: Option = match matches.value_of("network").map(|network| { network .try_into() - .expect("Invalid network name. See --help for available networks.") - }); + .map_err(|_| Error::Static("Invalid network name. See --help for available networks.")) + }) { + Some(Err(e)) => return Err(e), + Some(Ok(v)) => Some(v), + None => None, + }; + if let Some(network) = maybe_network { set_default_ss58_version(network); } match matches.subcommand() { ("generate", Some(matches)) => { - let mnemonic = generate_mnemonic(matches); + let mnemonic = generate_mnemonic(matches)?; C::print_from_uri(mnemonic.phrase(), password, maybe_network); } ("inspect", Some(matches)) => { - C::print_from_uri(&get_uri("uri", &matches), password, maybe_network); + C::print_from_uri(&get_uri("uri", &matches)?, password, maybe_network); } ("sign", Some(matches)) => { - let suri = get_uri("suri", &matches); + let suri = get_uri("suri", &matches)?; let should_decode = matches.is_present("hex"); - let message = read_message_from_stdin(should_decode); - let signature = do_sign::(&suri, message, password); + + let message = read_message_from_stdin(should_decode)?; + let signature = do_sign::(&suri, message, password)?; println!("{}", signature); } ("verify", Some(matches)) => { - let uri = get_uri("uri", &matches); + let uri = get_uri("uri", &matches)?; let should_decode = matches.is_present("hex"); - let message = read_message_from_stdin(should_decode); - let is_valid_signature = do_verify::(matches, &uri, message); + + let message = read_message_from_stdin(should_decode)?; + let is_valid_signature = do_verify::(matches, &uri, message)?; if is_valid_signature { println!("Signature verifies correctly."); } else { - println!("Signature invalid."); + return static_err("Signature invalid."); } } ("vanity", Some(matches)) => { @@ -329,17 +352,17 @@ where .value_of("pattern") .map(str::to_string) .unwrap_or_default(); - let result = vanity::generate_key::(&desired).expect("Key generation failed"); + let result = vanity::generate_key::(&desired)?; let formated_seed = format_seed::(result.seed); C::print_from_uri(&formated_seed, None, maybe_network); } ("transfer", Some(matches)) => { - let signer = read_pair::(matches.value_of("from"), password); - let index = read_required_parameter::(matches, "index"); - let genesis_hash = read_genesis_hash(matches); + let signer = read_pair::(matches.value_of("from"), password)?; + let index = read_required_parameter::(matches, "index")?; + let genesis_hash = read_genesis_hash(matches)?; let to: AccountId = read_account_id(matches.value_of("to")); - let amount = read_required_parameter::(matches, "amount"); + let amount = read_required_parameter::(matches, "amount")?; let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); let extrinsic = create_extrinsic::(function, index, signer, genesis_hash); @@ -347,9 +370,9 @@ where print_extrinsic(extrinsic); } ("sign-transaction", Some(matches)) => { - let signer = read_pair::(matches.value_of("suri"), password); - let index = read_required_parameter::(matches, "nonce"); - let genesis_hash = read_genesis_hash(matches); + let signer = read_pair::(matches.value_of("suri"), password)?; + let index = read_required_parameter::(matches, "nonce")?; + let genesis_hash = read_genesis_hash(matches)?; let call = matches.value_of("call").expect("call is required; qed"); let function: Call = hex::decode(&call) @@ -363,81 +386,86 @@ where } _ => print_usage(&matches), } + + Ok(()) } /// Creates a new randomly generated mnemonic phrase. -fn generate_mnemonic(matches: &ArgMatches) -> Mnemonic { - 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); - Mnemonic::new(words, Language::English) -} - -fn do_sign(suri: &str, message: Vec, password: Option<&str>) -> String +fn generate_mnemonic(matches: &ArgMatches) -> Result { + let words = match matches.value_of("words") { + Some(words) => { + let num = usize::from_str(words).map_err(|_| Error::Static("Invalid number given for --words"))?; + MnemonicType::for_word_count(num) + .map_err(|_| Error::Static("Invalid number of words given for phrase: must be 12/15/18/21/24"))? + }, + None => MnemonicType::Words12, + }; + Ok(Mnemonic::new(words, Language::English)) +} + +fn do_sign(suri: &str, message: Vec, password: Option<&str>) -> Result where SignatureOf: SignatureT, PublicOf: PublicT, { - let pair = read_pair::(Some(suri), password); + let pair = read_pair::(Some(suri), password)?; let signature = pair.sign(&message); - format_signature::(&signature) + Ok(format_signature::(&signature)) } -fn do_verify(matches: &ArgMatches, uri: &str, message: Vec) -> bool +fn do_verify(matches: &ArgMatches, uri: &str, message: Vec) -> Result where SignatureOf: SignatureT, PublicOf: PublicT, { - let signature = read_signature::(matches); + + let signature = read_signature::(matches)?; let pubkey = read_public_key::(Some(uri)); - <::Pair as Pair>::verify(&signature, &message, &pubkey) + Ok(<::Pair as Pair>::verify(&signature, &message, &pubkey)) +} + +fn decode_hex>(message: T) -> Result, Error> { + hex::decode(message).map_err(|e| Error::Formatted(format!("Invalid hex ({})", e))) } -fn read_message_from_stdin(should_decode: bool) -> Vec { +fn read_message_from_stdin(should_decode: bool) -> Result, Error> { let mut message = vec![]; stdin() .lock() - .read_to_end(&mut message) - .expect("Error reading from stdin"); + .read_to_end(&mut message)?; if should_decode { - message = hex::decode(&message).expect("Invalid hex in message"); + message = decode_hex(&message)?; } - message + Ok(message) } -fn read_required_parameter(matches: &ArgMatches, name: &str) -> T where +fn read_required_parameter(matches: &ArgMatches, name: &str) -> Result where ::Err: std::fmt::Debug, { let str_value = matches .value_of(name) .expect("parameter is required; thus it can't be None; qed"); - str::parse::(str_value).unwrap_or_else(|_| - panic!("Invalid `{}' parameter; expecting an integer.", name) + str::parse::(str_value).map_err(|_| + Error::Formatted(format!("Invalid `{}' parameter; expecting an integer.", name)) ) } -fn read_genesis_hash(matches: &ArgMatches) -> H256 { +fn read_genesis_hash(matches: &ArgMatches) -> Result { 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[..]).ok()) + h => Decode::decode(&mut &decode_hex(h)?[..]) .expect("Invalid genesis hash or unrecognised chain identifier"), }; println!( "Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref()) ); - genesis_hash + Ok(genesis_hash) } -fn read_signature(matches: &ArgMatches) -> SignatureOf where +fn read_signature(matches: &ArgMatches) -> Result, Error> +where SignatureOf: SignatureT, PublicOf: PublicT, { @@ -445,19 +473,20 @@ fn read_signature(matches: &ArgMatches) -> SignatureOf where .value_of("sig") .expect("signature parameter is required; thus it can't be None; qed"); let mut signature = <::Pair as Pair>::Signature::default(); - let sig_data = hex::decode(sig_data).expect("signature is invalid hex"); + let sig_data = decode_hex(sig_data)?; if sig_data.len() != signature.as_ref().len() { - panic!( + return Err(Error::Formatted(format!( "signature has an invalid length. read {} bytes, expected {} bytes", sig_data.len(), signature.as_ref().len(), - ); + ))); } signature.as_mut().copy_from_slice(&sig_data); - signature + Ok(signature) } -fn read_public_key(matched_uri: Option<&str>) -> PublicOf where +fn read_public_key(matched_uri: Option<&str>) -> PublicOf +where PublicOf: PublicT, { let uri = matched_uri.expect("parameter is required; thus it can't be None; qed"); @@ -494,12 +523,12 @@ fn read_account_id(matched_uri: Option<&str>) -> AccountId { fn read_pair( matched_suri: Option<&str>, password: Option<&str>, -) -> ::Pair where +) -> Result<::Pair, Error> where SignatureOf: SignatureT, PublicOf: PublicT, { - let suri = matched_suri.expect("parameter is required; thus it can't be None; qed"); - C::pair_from_suri(suri, password) + let suri = matched_suri.ok_or(Error::Static("parameter is required; thus it can't be None; qed"))?; + Ok(C::pair_from_suri(suri, password)) } fn format_signature(signature: &SignatureOf) -> String { @@ -591,7 +620,7 @@ mod tests { let matches = app.clone().get_matches_from(arg_vec); let matches = matches.subcommand().1.unwrap(); - let mnemonic = generate_mnemonic(matches); + let mnemonic = generate_mnemonic(matches).expect("generate failed"); let (pair, seed) = <::Pair as Pair>::from_phrase(mnemonic.phrase(), password) @@ -601,14 +630,15 @@ mod tests { let seed = format_seed::(seed); let message = "Blah Blah\n".as_bytes().to_vec(); - let signature = do_sign::(&seed, message.clone(), password); + let signature = do_sign::(&seed, message.clone(), password).expect("signing failed"); // Verify the previous signature. let arg_vec = vec!["subkey", "verify", &signature[..], &public_key[..]]; let matches = get_app(&usage).get_matches_from(arg_vec); let matches = matches.subcommand().1.unwrap(); - assert!(do_verify::(matches, &public_key, message)); + + assert!(do_verify::(matches, &public_key, message).expect("verify failed")); } #[test] diff --git a/bin/utils/subkey/src/vanity.rs b/bin/utils/subkey/src/vanity.rs index 33e8559b1f..ee5a2f2cce 100644 --- a/bin/utils/subkey/src/vanity.rs +++ b/bin/utils/subkey/src/vanity.rs @@ -62,7 +62,7 @@ fn calculate_score(_desired: &str, key: &str) -> usize { 0 } -pub(super) fn generate_key(desired: &str) -> Result, &str> where +pub(super) fn generate_key(desired: &str) -> Result, &'static str> where PublicOf: PublicT, { if desired.is_empty() { -- GitLab From d1012cd81a1167ab1d7771e004ddab3a0f3f4bcb Mon Sep 17 00:00:00 2001 From: Denis Pisarev Date: Sat, 28 Dec 2019 17:00:39 +0100 Subject: [PATCH 030/296] less dupes, cleanup (#4491) * build node job is separated from build substrate; less dupes, cleanup * it's not effective yet to split these jobs --- .gitlab-ci.yml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 90e0c2b007..f27543026f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -150,7 +150,7 @@ test-linux-stable: &test-linux paths: - ${CI_COMMIT_SHORT_SHA}_warnings.log -test-dependency-rules: &test-linux +test-dependency-rules: stage: test <<: *docker-env except: @@ -159,7 +159,7 @@ test-dependency-rules: &test-linux script: - .maintain/ensure-deps.sh -test-frame-staking: &test-frame-staking +test-frame-staking: stage: test <<: *docker-env variables: @@ -175,7 +175,7 @@ test-frame-staking: &test-frame-staking - WASM_BUILD_NO_COLOR=1 time cargo test --release --verbose --no-default-features --features std - sccache -s -test-wasmtime: &test-wasmtime +test-wasmtime: stage: test <<: *docker-env variables: @@ -244,7 +244,7 @@ node-exits: - ./.maintain/check_for_exit.sh -test-full-crypto-feature: &test-full-crypto-feature +test-full-crypto-feature: stage: test <<: *docker-env variables: @@ -265,17 +265,18 @@ test-full-crypto-feature: &test-full-crypto-feature #### stage: build -build-linux-substrate: +build-linux-substrate: &build-binary stage: build <<: *collect-artifacts <<: *docker-env <<: *build-only + before_script: + - mkdir -p ./artifacts/substrate/ except: variables: - $DEPLOY_TAG script: - WASM_BUILD_NO_COLOR=1 time cargo build --release --verbose - - mkdir -p ./artifacts/substrate/ - mv ./target/release/substrate ./artifacts/substrate/. - echo -n "Substrate version = " - if [ "${CI_COMMIT_TAG}" ]; then @@ -292,19 +293,13 @@ build-linux-substrate: - sccache -s build-linux-subkey: - stage: build - <<: *collect-artifacts - <<: *docker-env - <<: *build-only - except: - variables: - - $DEPLOY_TAG + <<: *build-binary + before_script: + - mkdir -p ./artifacts/subkey script: - cd ./bin/utils/subkey - BUILD_DUMMY_WASM_BINARY=1 time cargo build --release --verbose - cd - - - sccache -s - - mkdir -p ./artifacts/subkey - mv ./target/release/subkey ./artifacts/subkey/. - echo -n "Subkey version = " - ./artifacts/subkey/subkey --version | -- GitLab From 43ee8a35cee587646e496bebc41d3b516c56b8d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 28 Dec 2019 22:52:18 +0100 Subject: [PATCH 031/296] Fix cli for structopt 0.3.7 and pin to that version (#4509) * Fix cli for structopt 0.3.7 and pin to that version This is just some hotfix to make everything compile. In the future it will require another pr to not depend on internals of StructOpt, but that will probably also require some additions to StructOpt itself. To not break the code again with another StructOpt, this also pins the StructOpt version. * Fix benches * Fix for fix --- Cargo.lock | 55 +++++++++++++++++-------- bin/node/cli/Cargo.toml | 4 +- bin/node/cli/src/cli.rs | 10 +---- bin/utils/chain-spec-builder/Cargo.toml | 2 +- client/cli/Cargo.toml | 2 +- client/cli/src/lib.rs | 6 +-- client/cli/src/params.rs | 26 ++++-------- client/cli/src/traits.rs | 22 ---------- frame/indices/Cargo.toml | 3 -- frame/indices/src/mock.rs | 23 ++++++----- 10 files changed, 68 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af59d9ece1..e918ca65c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -490,7 +490,7 @@ dependencies = [ "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-keystore 2.0.0", "sp-core 2.0.0", - "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3053,7 +3053,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-timestamp 2.0.0", "sp-transaction-pool 2.0.0", - "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-build-script-utils 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3801,7 +3801,6 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "parity-scale-codec 1.1.0 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -4367,12 +4366,26 @@ dependencies = [ [[package]] name = "proc-macro-error" -version = "0.2.6" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-error-attr 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "proc-macro-error-attr" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn-mid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4738,11 +4751,6 @@ dependencies = [ "rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ref_thread_local" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "regex" version = "1.3.1" @@ -5029,7 +5037,7 @@ dependencies = [ "sp-panic-handler 2.0.0", "sp-runtime 2.0.0", "sp-state-machine 2.0.0", - "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6671,20 +6679,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.3.5" +version = "0.4.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-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6913,6 +6921,16 @@ dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "syn-mid" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "synstructure" version = "0.12.3" @@ -8460,7 +8478,8 @@ dependencies = [ "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" "checksum primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0253db64c26d8b4e7896dd2063b516d2a1b9e0a5da26b5b78335f236d1e9522" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aeccfe4d5d8ea175d5f0e4a2ad0637e0f4121d63bd99d356fb1f39ab2e7c6097" +"checksum proc-macro-error 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "53c98547ceaea14eeb26fcadf51dc70d01a2479a7839170eae133721105e4428" +"checksum proc-macro-error-attr 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c2bf5d493cf5d3e296beccfd61794e445e830dfc8070a9c248ad3ee071392c6c" "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" "checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" @@ -8500,7 +8519,6 @@ dependencies = [ "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d" -"checksum ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d813022b2e00774a48eaf43caaa3c20b45f040ba8cbf398e2e8911a06668dbe6" "checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" "checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" "checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" @@ -8560,8 +8578,8 @@ dependencies = [ "checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" "checksum string-interner 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd710eadff449a1531351b0e43eb81ea404336fa2f56c777427ab0e32a4cf183" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "30b3a3e93f5ad553c38b3301c8a0a0cec829a36783f6a0c467fc4bf553a5f5bf" -"checksum structopt-derive 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea692d40005b3ceba90a9fe7a78fa8d4b82b0ce627eebbffc329aab850f3410e" +"checksum structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "884ae79d6aad1e738f4a70dff314203fd498490a63ebc4d03ea83323c40b7b72" +"checksum structopt-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a97f829a34a0a9d5b353a881025a23b8c9fd09d46be6045df6b22920dbd7a93" "checksum strum 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" "checksum strum_macros 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" "checksum substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" @@ -8569,6 +8587,7 @@ dependencies = [ "checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" "checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" +"checksum syn-mid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd3937748a7eccff61ba5b90af1a20dbf610858923a9192ea0ecb0cb77db1d0" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" "checksum sysinfo 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4b2468c629cffba39c0a4425849ab3cdb03d9dfacba69684609aea04d08ff9" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 0ce5115831..47efe3c702 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -31,7 +31,7 @@ hex-literal = "0.2.1" jsonrpc-core = "14.0.3" log = "0.4.8" rand = "0.7.2" -structopt = "0.3.3" +structopt = "=0.3.7" # primitives sp-authority-discovery = { version = "2.0.0", path = "../../../primitives/authority-discovery" } @@ -107,7 +107,7 @@ tempfile = "3.1.0" [build-dependencies] sc-cli = { version = "2.0.0", package = "sc-cli", path = "../../../client/cli" } build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../../utils/build-script-utils" } -structopt = "0.3.3" +structopt = "=0.3.7" vergen = "3.0.4" [features] diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 8cd8cb9f33..3b11ff3125 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -20,8 +20,8 @@ use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; use sc_cli::{IntoExit, NoCustom, SharedParams, ImportParams, error}; use sc_service::{AbstractService, Roles as ServiceRoles, Configuration}; use log::info; -use structopt::{StructOpt, clap::App}; -use sc_cli::{display_role, parse_and_prepare, AugmentClap, GetSharedParams, ParseAndPrepare}; +use structopt::StructOpt; +use sc_cli::{display_role, parse_and_prepare, GetSharedParams, ParseAndPrepare}; use crate::{service, ChainSpec, load_spec}; use crate::factory_impl::FactoryState; use node_transaction_factory::RuntimeAdapter; @@ -88,12 +88,6 @@ pub struct FactoryCmd { pub import_params: ImportParams, } -impl AugmentClap for FactoryCmd { - fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { - FactoryCmd::augment_clap(app) - } -} - /// Parse command line arguments into service configuration. pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Result<()> where I: IntoIterator, diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index e31419d3b9..c8d79afbce 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -11,4 +11,4 @@ sc-keystore = { version = "2.0.0", path = "../../../client/keystore" } node-cli = { version = "2.0.0", path = "../../node/cli" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } rand = "0.7.2" -structopt = "0.3.3" +structopt = "=0.3.7" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 49f327405b..460cc2a05a 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -31,7 +31,7 @@ sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" sc-telemetry = { version = "2.0.0", path = "../telemetry" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } names = "0.11.0" -structopt = "0.3.3" +structopt = "=0.3.7" sc-tracing = { version = "2.0.0", path = "../tracing" } [target.'cfg(not(target_os = "unknown"))'.dependencies] diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index d1b3388432..19ee599e02 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -48,7 +48,7 @@ use std::{ use names::{Generator, Name}; use regex::Regex; -use structopt::{StructOpt, clap::AppSettings}; +use structopt::{StructOpt, StructOptInternal, clap::AppSettings}; #[doc(hidden)] pub use structopt::clap::App; use params::{ @@ -57,7 +57,7 @@ use params::{ NodeKeyParams, NodeKeyType, Cors, CheckBlockCmd, }; pub use params::{NoCustom, CoreParams, SharedParams, ImportParams, ExecutionStrategy}; -pub use traits::{GetSharedParams, AugmentClap}; +pub use traits::GetSharedParams; use app_dirs::{AppInfo, AppDataType}; use log::info; use lazy_static::lazy_static; @@ -196,7 +196,7 @@ pub fn parse_and_prepare<'a, CC, RP, I>( ) -> ParseAndPrepare<'a, CC, RP> where CC: StructOpt + Clone + GetSharedParams, - RP: StructOpt + Clone + AugmentClap, + RP: StructOpt + Clone + StructOptInternal, I: IntoIterator, ::Item: Into + Clone, { diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index e8d00978a8..780dcd4983 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -14,10 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::traits::{AugmentClap, GetSharedParams}; +use crate::traits::GetSharedParams; use std::{str::FromStr, path::PathBuf}; -use structopt::{StructOpt, clap::{arg_enum, App, AppSettings, SubCommand, Arg}}; +use structopt::{StructOpt, StructOptInternal, clap::{arg_enum, App, AppSettings, SubCommand, Arg}}; pub use crate::execution_strategy::ExecutionStrategy; @@ -208,7 +208,7 @@ pub struct NetworkConfigurationParams { #[allow(missing_docs)] #[structopt(flatten)] - pub node_key_params: NodeKeyParams + pub node_key_params: NodeKeyParams, } arg_enum! { @@ -278,7 +278,7 @@ pub struct NodeKeyParams { /// If the file does not exist, it is created with a newly generated secret key of /// the chosen type. #[structopt(long = "node-key-file", value_name = "FILE")] - pub node_key_file: Option + pub node_key_file: Option, } /// Parameters used to create the pool configuration. @@ -623,14 +623,14 @@ impl StructOpt for Keyring { unimplemented!("Should not be called for `TestAccounts`.") } - fn from_clap(m: &::structopt::clap::ArgMatches) -> Self { + fn from_clap(m: &structopt::clap::ArgMatches) -> Self { Keyring { account: TEST_ACCOUNTS_CLI_VALUES.iter().find(|a| m.is_present(&a.name)).map(|a| a.variant), } } } -impl AugmentClap for Keyring { +impl StructOptInternal for Keyring { fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { TEST_ACCOUNTS_CLI_VALUES.iter().fold(app, |app, a| { let conflicts_with_strs = a.conflicts_with.iter().map(|s| s.as_str()).collect::>(); @@ -646,12 +646,6 @@ impl AugmentClap for Keyring { } } -impl Keyring { - fn is_subcommand() -> bool { - false - } -} - /// Default to verbosity level 0, if none is provided. fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box> { let pos = s.find(' '); @@ -705,8 +699,6 @@ fn parse_cors(s: &str) -> Result> { Ok(if is_all { Cors::All } else { Cors::List(origins) }) } -impl_augment_clap!(RunCmd); - /// The `build-spec` command used to build a specification. #[derive(Debug, StructOpt, Clone)] pub struct BuildSpecCmd { @@ -895,7 +887,7 @@ pub enum CoreParams { impl StructOpt for CoreParams where CC: StructOpt + GetSharedParams, - RP: StructOpt + AugmentClap + RP: StructOpt + StructOptInternal, { fn clap<'a, 'b>() -> App<'a, 'b> { RP::augment_clap( @@ -964,7 +956,7 @@ impl StructOpt for NoCustom { } } -impl AugmentClap for NoCustom { +impl StructOptInternal for NoCustom { fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { app } @@ -985,7 +977,7 @@ pub struct MergeParameters { pub right: R, } -impl StructOpt for MergeParameters where L: StructOpt + AugmentClap, R: StructOpt { +impl StructOpt for MergeParameters where L: StructOpt + StructOptInternal, R: StructOpt { fn clap<'a, 'b>() -> App<'a, 'b> { L::augment_clap(R::clap()) } diff --git a/client/cli/src/traits.rs b/client/cli/src/traits.rs index dddba0b25a..2f4007c846 100644 --- a/client/cli/src/traits.rs +++ b/client/cli/src/traits.rs @@ -14,30 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use structopt::{StructOpt, clap::App}; use crate::params::SharedParams; -/// 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 { - /// Augment the given clap `App` with further parameters. - fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b>; -} - -/// Macro for implementing the `AugmentClap` trait. -/// This requires that the given type uses `derive(StructOpt)`! -#[macro_export] -macro_rules! impl_augment_clap { - ( $type:ident ) => { - impl $crate::AugmentClap for $type { - fn augment_clap<'a, 'b>(app: $crate::App<'a, 'b>) -> $crate::App<'a, 'b> { - $type::augment_clap(app) - } - } - } -} - /// Supports getting common params. pub trait GetSharedParams { /// Returns shared params if any. diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index 574c2d3eb6..d05a7654d1 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -16,9 +16,6 @@ sp-core = { version = "2.0.0", default-features = false, path = "../../primitive frame-support = { version = "2.0.0", default-features = false, path = "../support" } frame-system = { version = "2.0.0", default-features = false, path = "../system" } -[dev-dependencies] -ref_thread_local = "0.0.0" - [features] default = ["std"] std = [ diff --git a/frame/indices/src/mock.rs b/frame/indices/src/mock.rs index 2a1cb0746f..150664126d 100644 --- a/frame/indices/src/mock.rs +++ b/frame/indices/src/mock.rs @@ -18,8 +18,7 @@ #![cfg(test)] -use std::collections::HashSet; -use ref_thread_local::{ref_thread_local, RefThreadLocal}; +use std::{cell::RefCell, collections::HashSet}; use sp_runtime::testing::Header; use sp_runtime::Perbill; use sp_core::H256; @@ -30,23 +29,23 @@ impl_outer_origin!{ pub enum Origin for Runtime where system = frame_system {} } -ref_thread_local! { - static managed ALIVE: HashSet = HashSet::new(); +thread_local! { + static ALIVE: RefCell> = Default::default(); } pub fn make_account(who: u64) { - ALIVE.borrow_mut().insert(who); + ALIVE.with(|a| a.borrow_mut().insert(who)); Indices::on_new_account(&who); } pub fn kill_account(who: u64) { - ALIVE.borrow_mut().remove(&who); + ALIVE.with(|a| a.borrow_mut().remove(&who)); } pub struct TestIsDeadAccount {} impl IsDeadAccount for TestIsDeadAccount { fn is_dead_account(who: &u64) -> bool { - !ALIVE.borrow_mut().contains(who) + !ALIVE.with(|a| a.borrow_mut().contains(who)) } } @@ -70,6 +69,7 @@ parameter_types! { pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::one(); } + impl frame_system::Trait for Runtime { type Origin = Origin; type Index = u64; @@ -88,6 +88,7 @@ impl frame_system::Trait for Runtime { type Version = (); type ModuleToIndex = (); } + impl Trait for Runtime { type AccountIndex = u64; type IsDeadAccount = TestIsDeadAccount; @@ -97,9 +98,11 @@ impl Trait for Runtime { pub fn new_test_ext() -> sp_io::TestExternalities { { - let mut h = ALIVE.borrow_mut(); - h.clear(); - for i in 1..5 { h.insert(i); } + ALIVE.with(|a| { + let mut h = a.borrow_mut(); + h.clear(); + for i in 1..5 { h.insert(i); } + }); } let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); -- GitLab From dacb199f89049d68376c03ffed3130e591276ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sun, 29 Dec 2019 21:54:10 +0100 Subject: [PATCH 032/296] Make wasm-builder remove invalid members (#4510) * Make wasm-builder remove invalid members Wasm-builder now removes members that point to packages that do not exist anymore or that were renamed. Up to now, the build would fail and required manual fixing. * Fixes build --- utils/wasm-builder/src/wasm_project.rs | 59 ++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/utils/wasm-builder/src/wasm_project.rs b/utils/wasm-builder/src/wasm_project.rs index bb32d62218..66da930f3a 100644 --- a/utils/wasm-builder/src/wasm_project.rs +++ b/utils/wasm-builder/src/wasm_project.rs @@ -172,18 +172,69 @@ fn get_wasm_workspace_root() -> PathBuf { panic!("Could not find target dir in: {}", build_helper::out_dir().display()) } -fn create_wasm_workspace_project(wasm_workspace: &Path, cargo_manifest: &Path) { - let members = WalkDir::new(wasm_workspace) +/// Find all workspace members. +/// +/// Each folder in `wasm_workspace` is seen as a member of the workspace. Exceptions are +/// folders starting with "." and the "target" folder. +/// +/// Every workspace member that is not valid anymore is deleted (the folder of it). A +/// member is not valid anymore when the `wasm-project` dependency points to an non-existing +/// folder or the package name is not valid. +fn find_and_clear_workspace_members(wasm_workspace: &Path) -> Vec { + let mut members = WalkDir::new(wasm_workspace) .min_depth(1) .max_depth(1) .into_iter() .filter_map(|p| p.ok()) .map(|d| d.into_path()) - .filter(|p| p.is_dir() && !p.ends_with("target")) + .filter(|p| p.is_dir()) .filter_map(|p| p.file_name().map(|f| f.to_owned()).and_then(|s| s.into_string().ok())) - .filter(|f| !f.starts_with(".")) + .filter(|f| !f.starts_with(".") && f != "target") .collect::>(); + let mut i = 0; + while i != members.len() { + let path = wasm_workspace.join(&members[i]).join("Cargo.toml"); + + // Extract the `wasm-project` dependency. + // If the path can be extracted and is valid and the package name matches, + // the member is valid. + if let Some(mut wasm_project) = fs::read_to_string(path) + .ok() + .and_then(|s| toml::from_str::(&s).ok()) + .and_then(|mut t| t.remove("dependencies")) + .and_then(|p| p.try_into::
().ok()) + .and_then(|mut t| t.remove("wasm_project")) + .and_then(|p| p.try_into::
().ok()) + { + if let Some(path) = wasm_project.remove("path") + .and_then(|p| p.try_into::().ok()) + { + if let Some(name) = wasm_project.remove("package") + .and_then(|p| p.try_into::().ok()) + { + let path = PathBuf::from(path); + if path.exists() { + if name == get_crate_name(&path.join("Cargo.toml")) { + i += 1; + continue + } + } + } + } + } + + fs::remove_dir_all(wasm_workspace.join(&members[i])) + .expect("Removing invalid workspace member can not fail; qed"); + members.remove(i); + } + + members +} + +fn create_wasm_workspace_project(wasm_workspace: &Path, cargo_manifest: &Path) { + let members = find_and_clear_workspace_members(wasm_workspace); + let crate_metadata = MetadataCommand::new() .manifest_path(cargo_manifest) .exec() -- GitLab From cd5cb4f495b83858319427c58b2641b920e1972a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 30 Dec 2019 15:59:37 +0100 Subject: [PATCH 033/296] Increase metadata version to 10 (#4512) Changes in https://github.com/paritytech/substrate/pull/4462 required a metadata version increment that was forgotten. --- frame/metadata/src/lib.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frame/metadata/src/lib.rs b/frame/metadata/src/lib.rs index 9d829ab192..28ed730b5f 100644 --- a/frame/metadata/src/lib.rs +++ b/frame/metadata/src/lib.rs @@ -345,8 +345,10 @@ pub enum RuntimeMetadata { V7(RuntimeMetadataDeprecated), /// Version 8 for runtime metadata. No longer used. V8(RuntimeMetadataDeprecated), - /// Version 9 for runtime metadata. - V9(RuntimeMetadataV9), + /// Version 9 for runtime metadata. No longer used. + V9(RuntimeMetadataDeprecated), + /// Version 10 for runtime metadata. + V10(RuntimeMetadataV10), } /// Enum that should fail. @@ -370,12 +372,12 @@ impl Decode for RuntimeMetadataDeprecated { /// The metadata of a runtime. #[derive(Eq, Encode, PartialEq, RuntimeDebug)] #[cfg_attr(feature = "std", derive(Decode, Serialize))] -pub struct RuntimeMetadataV9 { +pub struct RuntimeMetadataV10 { pub modules: DecodeDifferentArray, } /// The latest version of the metadata. -pub type RuntimeMetadataLastVersion = RuntimeMetadataV9; +pub type RuntimeMetadataLastVersion = RuntimeMetadataV10; /// All metadata about an runtime module. #[derive(Clone, PartialEq, Eq, Encode, RuntimeDebug)] @@ -400,6 +402,6 @@ impl Into for RuntimeMetadataPrefixed { impl Into for RuntimeMetadataLastVersion { fn into(self) -> RuntimeMetadataPrefixed { - RuntimeMetadataPrefixed(META_RESERVED, RuntimeMetadata::V9(self)) + RuntimeMetadataPrefixed(META_RESERVED, RuntimeMetadata::V10(self)) } } -- GitLab From c2fccb36ffacd118fc3502aa93453580a07dc402 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 30 Dec 2019 22:26:34 +0300 Subject: [PATCH 034/296] update libsecp256k1 (#4513) --- Cargo.lock | 17 +++++++++-------- client/executor/Cargo.toml | 2 +- primitives/io/Cargo.toml | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e918ca65c2..a426e58fcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2358,7 +2358,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2691,13 +2691,14 @@ dependencies = [ [[package]] name = "libsecp256k1" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "hmac-drbg 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5286,7 +5287,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6275,7 +6276,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6358,7 +6359,7 @@ name = "sp-io" version = "2.0.0" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -7474,7 +7475,7 @@ name = "twox-hash" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8392,7 +8393,7 @@ dependencies = [ "checksum libp2p-websocket 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d74d4fc229ad7e8d1a973178786bdcd5dadbdd7b9822c4477c8687df6f82f66" "checksum libp2p-yamux 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1913eb7dd6eb5515957b6f1770296f6921968db87bc9b985f0e974b6657e1003" "checksum librocksdb-sys 6.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0785e816e1e11e7599388a492c61ef80ddc2afc91e313e61662cce537809be" -"checksum libsecp256k1 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd9a7c16c9487e710536b699c962f022266347c94201174aa0a7eb0546051aa" +"checksum libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "df6edf84fd62aad1c93932b39324eaeda3912c1d26bc18dfaee6293848e49a50" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" "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" diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index 68eee17684..a2f6ebaac0 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -24,7 +24,7 @@ sc-executor-wasmi = { version = "2.0.0", path = "wasmi" } sc-executor-wasmtime = { version = "2.0.0", path = "wasmtime", optional = true } parking_lot = "0.9.0" log = "0.4.8" -libsecp256k1 = "0.3.2" +libsecp256k1 = "0.3.4" [dev-dependencies] assert_matches = "1.3.0" diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index a89b2d4c20..04350c9479 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -9,7 +9,7 @@ codec = { package = "parity-scale-codec", version = "1.0.6", default-features = hash-db = { version = "0.15.2", default-features = false } sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-std = { version = "2.0.0", default-features = false, path = "../std" } -libsecp256k1 = { version = "0.3.0", optional = true } +libsecp256k1 = { version = "0.3.4", optional = true } sp-state-machine = { version = "2.0.0", optional = true, path = "../../primitives/state-machine" } sp-runtime-interface = { version = "2.0.0", default-features = false, path = "../runtime-interface" } sp-trie = { version = "2.0.0", optional = true, path = "../../primitives/trie" } -- GitLab From 20a9b15cdbed4bf962a4447e8bfb812f766f2fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 31 Dec 2019 20:04:53 +0100 Subject: [PATCH 035/296] Make `MultiSigner` use compressed ECDSA public key (#4502) * Don't use compressed ecdsa public key in verify * Make `ECDSA` public support compressed * Make it a proper `expect` message --- primitives/core/Cargo.toml | 5 +- primitives/core/src/ecdsa.rs | 191 ++++++++++++++++-------------- primitives/core/src/hexdisplay.rs | 2 +- primitives/runtime/src/lib.rs | 25 +++- primitives/runtime/src/traits.rs | 17 ++- 5 files changed, 145 insertions(+), 95 deletions(-) diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 706a9cb276..8242ff8044 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -28,13 +28,13 @@ parking_lot = { version = "0.9.0", optional = true } sp-debug-derive = { version = "2.0.0", path = "../debug-derive" } sp-externalities = { version = "2.0.0", optional = true, path = "../externalities" } sp-storage = { version = "2.0.0", default-features = false, path = "../storage" } +libsecp256k1 = { version = "0.3.2", default-features = false } # full crypto ed25519-dalek = { version = "1.0.0-pre.3", default-features = false, features = ["u64_backend", "alloc"], optional = true } blake2-rfc = { version = "0.2.18", default-features = false, optional = true } tiny-keccak = { version = "2.0.1", features = ["keccak"], optional = true } schnorrkel = { version = "0.8.5", features = ["preaudit_deprecated", "u64_backend"], default-features = false, optional = true } -libsecp256k1 = { version = "0.3.2", default-features = false, optional = true } sha2 = { version = "0.8.0", default-features = false, optional = true } hex = { version = "0.4", default-features = false, optional = true } twox-hash = { version = "1.5.0", default-features = false, optional = true } @@ -90,7 +90,7 @@ std = [ "schnorrkel/std", "regex", "num-traits/std", - "libsecp256k1", + "libsecp256k1/std", "tiny-keccak", "sp-debug-derive/std", "sp-externalities", @@ -107,7 +107,6 @@ full_crypto = [ "blake2-rfc", "tiny-keccak", "schnorrkel", - "libsecp256k1", "hex", "sha2", "twox-hash", diff --git a/primitives/core/src/ecdsa.rs b/primitives/core/src/ecdsa.rs index e097d0c5e6..fbdb8a56f7 100644 --- a/primitives/core/src/ecdsa.rs +++ b/primitives/core/src/ecdsa.rs @@ -46,9 +46,14 @@ use secp256k1::{PublicKey, SecretKey}; #[cfg(feature = "full_crypto")] type Seed = [u8; 32]; -/// The ECDSA 64-byte raw public key. +/// The ECDSA public key. #[derive(Clone, Encode, Decode)] -pub struct Public(pub [u8; 64]); +pub enum Public { + /// A full raw ECDSA public key. + Full([u8; 64]), + /// A compressed ECDSA public key. + Compressed([u8; 33]), +} impl PartialOrd for Public { fn partial_cmp(&self, other: &Self) -> Option { @@ -58,47 +63,113 @@ impl PartialOrd for Public { impl Ord for Public { fn cmp(&self, other: &Self) -> Ordering { - self.0[..].cmp(&other.0[..]) + self.as_ref().cmp(&other.as_ref()) } } impl PartialEq for Public { fn eq(&self, other: &Self) -> bool { - &self.0[..] == &other.0[..] + self.as_ref() == other.as_ref() } } impl Eq for Public {} -impl Default for Public { - fn default() -> Self { - Public([0u8; 64]) +/// An error type for SS58 decoding. +#[cfg(feature = "std")] +#[derive(Clone, Copy, Eq, PartialEq, Debug)] +pub enum PublicError { + /// Bad alphabet. + BadBase58, + /// Bad length. + BadLength, + /// Unknown version. + UnknownVersion, + /// Invalid checksum. + InvalidChecksum, +} + +impl Public { + /// A new instance from the given 64-byte `data`. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! + pub fn from_raw(data: [u8; 64]) -> Self { + Self::Full(data) + } + + /// A new instance from the given 65-byte `data`. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! + pub fn from_full(data: [u8; 65]) -> Self { + let raw_key = &data[1..]; + let mut key = [0u8; 64]; + key.copy_from_slice(raw_key); + Self::Full(key) + } + + /// Return in compressed format. + /// + /// Returns an error if `self` is an invalid full public key. + pub fn as_compressed(&self) -> Result<[u8; 33], ()> { + match self { + Self::Full(d) => secp256k1::PublicKey::parse_slice(d, None) + .map(|k| k.serialize_compressed()) + .map_err(|_| ()), + Self::Compressed(d) => Ok(*d), + } + } + + /// Convert `Self` into a compressed public key. + /// + /// Returns an error if `self` is an invalid full public key. + pub fn into_compressed(self) -> Result { + self.as_compressed().map(Self::Compressed) } } -/// A key pair. -#[cfg(feature = "full_crypto")] -#[derive(Clone)] -pub struct Pair { - public: PublicKey, - secret: SecretKey, +impl TraitPublic for Public { + /// A new instance from the given slice that should be 33 bytes long. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! + fn from_slice(data: &[u8]) -> Self { + if data.len() == 33 { + let mut r = [0u8; 33]; + r.copy_from_slice(data); + Self::Compressed(r) + } else { + let mut r = [0u8; 64]; + r.copy_from_slice(data); + Self::Full(r) + } + } } -impl AsRef<[u8; 64]> for Public { - fn as_ref(&self) -> &[u8; 64] { - &self.0 +impl Derive for Public {} + +impl Default for Public { + fn default() -> Self { + Public::Full([0u8; 64]) } } impl AsRef<[u8]> for Public { fn as_ref(&self) -> &[u8] { - &self.0[..] + match self { + Self::Full(d) => &d[..], + Self::Compressed(d) => &d[..], + } } } impl AsMut<[u8]> for Public { fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] + match self { + Self::Full(d) => &mut d[..], + Self::Compressed(d) => &mut d[..], + } } } @@ -106,22 +177,14 @@ impl sp_std::convert::TryFrom<&[u8]> for Public { type Error = (); fn try_from(data: &[u8]) -> Result { - if data.len() == 64 { - let mut inner = [0u8; 64]; - inner.copy_from_slice(data); - Ok(Public(inner)) + if data.len() == 33 || data.len() == 64 { + Ok(Self::from_slice(data)) } else { Err(()) } } } -impl From for [u8; 64] { - fn from(x: Public) -> Self { - x.0 - } -} - #[cfg(feature = "full_crypto")] impl From for Public { fn from(x: Pair) -> Self { @@ -131,7 +194,7 @@ impl From for Public { impl UncheckedFrom<[u8; 64]> for Public { fn unchecked_from(x: [u8; 64]) -> Self { - Public(x) + Public::Full(x) } } @@ -146,7 +209,7 @@ impl std::fmt::Display for Public { impl std::fmt::Debug for Public { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&&self.0[..]), &s[0..8]) + write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8]) } } @@ -168,7 +231,7 @@ impl<'de> Deserialize<'de> for Public { #[cfg(feature = "full_crypto")] impl sp_std::hash::Hash for Public { fn hash(&self, state: &mut H) { - self.0.hash(state); + self.as_ref().hash(state); } } @@ -317,60 +380,6 @@ impl<'a> TryFrom<&'a Signature> for (secp256k1::Signature, secp256k1::RecoveryId } } -/// An error type for SS58 decoding. -#[cfg(feature = "std")] -#[derive(Clone, Copy, Eq, PartialEq, Debug)] -pub enum PublicError { - /// Bad alphabet. - BadBase58, - /// Bad length. - BadLength, - /// Unknown version. - UnknownVersion, - /// Invalid checksum. - InvalidChecksum, -} - -impl Public { - /// A new instance from the given 64-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_raw(data: [u8; 64]) -> Self { - Public(data) - } - - /// A new instance from the given 65-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_full(data: [u8; 65]) -> Self { - let raw_key = &data[1..]; - let mut key = [0u8; 64]; - key.copy_from_slice(raw_key); - Public(key) - } - - /// Return a slice filled with raw data. - pub fn as_array_ref(&self) -> &[u8; 64] { - self.as_ref() - } -} - -impl TraitPublic for Public { - /// A new instance from the given slice that should be 33 bytes long. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - fn from_slice(data: &[u8]) -> Self { - let mut r = [0u8; 64]; - r.copy_from_slice(data); - Public(r) - } -} - -impl Derive for Public {} - /// Derive a single hard junction. #[cfg(feature = "full_crypto")] fn derive_hard_junction(secret_seed: &Seed, cc: &[u8; 32]) -> Seed { @@ -388,6 +397,14 @@ pub enum DeriveError { SoftKeyInPath, } +/// A key pair. +#[cfg(feature = "full_crypto")] +#[derive(Clone)] +pub struct Pair { + public: PublicKey, + secret: SecretKey, +} + #[cfg(feature = "full_crypto")] impl TraitPair for Pair { type Public = Public; @@ -473,7 +490,9 @@ impl TraitPair for Pair { let message = secp256k1::Message::parse(&blake2_256(message.as_ref())); let sig: (_, _) = match sig.try_into() { Ok(x) => x, _ => return false }; match secp256k1::recover(&message, &sig.0, &sig.1) { - Ok(actual) => &pubkey.0[..] == &actual.serialize()[1..], + Ok(actual) => pubkey.as_compressed() + .map(|p| &p[..] == &actual.serialize_compressed()[..]) + .unwrap_or(false), _ => false, } } diff --git a/primitives/core/src/hexdisplay.rs b/primitives/core/src/hexdisplay.rs index 104aaf812e..83c2363a4c 100644 --- a/primitives/core/src/hexdisplay.rs +++ b/primitives/core/src/hexdisplay.rs @@ -58,7 +58,7 @@ pub trait AsBytesRef { fn as_bytes_ref(&self) -> &[u8]; } -impl<'a> AsBytesRef for &'a [u8] { +impl AsBytesRef for &[u8] { fn as_bytes_ref(&self) -> &[u8] { self } } diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 1e8178f05e..80ef992f6b 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -212,7 +212,7 @@ pub enum MultiSigner { Ed25519(ed25519::Public), /// An Sr25519 identity. Sr25519(sr25519::Public), - /// An SECP256k1/ECDSA identity (actually, the Blake2 hash of the pub key). + /// An SECP256k1/ECDSA identity (actually, the Blake2 hash of the compressed pub key). Ecdsa(ecdsa::Public), } @@ -246,7 +246,9 @@ impl traits::IdentifyAccount for MultiSigner { match self { MultiSigner::Ed25519(who) => <[u8; 32]>::from(who).into(), MultiSigner::Sr25519(who) => <[u8; 32]>::from(who).into(), - MultiSigner::Ecdsa(who) => sp_io::hashing::blake2_256(who.as_ref()).into(), + MultiSigner::Ecdsa(who) => sp_io::hashing::blake2_256( + &who.as_compressed().expect("`who` is a valid `ECDSA` public key; qed")[..], + ).into(), } } } @@ -688,8 +690,9 @@ pub fn print(print: impl traits::Printable) { #[cfg(test)] mod tests { - use crate::DispatchError; + use super::*; use codec::{Encode, Decode}; + use sp_core::crypto::Pair; #[test] fn opaque_extrinsic_serialization() { @@ -716,4 +719,20 @@ mod tests { }, ); } + + #[test] + fn multi_signature_ecdsa_verify_works() { + let msg = &b"test-message"[..]; + let (pair, _) = ecdsa::Pair::generate(); + + let signature = pair.sign(&msg); + assert!(ecdsa::Pair::verify(&signature, msg, &pair.public())); + + let multi_sig = MultiSignature::from(signature); + let multi_signer = MultiSigner::from(pair.public()); + assert!(multi_sig.verify(msg, &multi_signer.into_account())); + + let multi_signer = MultiSigner::from(pair.public().into_compressed().unwrap()); + assert!(multi_sig.verify(msg, &multi_signer.into_account())); + } } diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 2b9ea98f05..a0970accd8 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -102,7 +102,7 @@ impl Verify for sp_core::ecdsa::Signature { self.as_ref(), &sp_io::hashing::blake2_256(msg.get()), ) { - Ok(pubkey) => >::as_ref(signer) == &pubkey[..], + Ok(pubkey) => signer.as_compressed().map(|s| &s[..] == &pubkey[..]).unwrap_or(false), _ => false, } } @@ -1307,8 +1307,9 @@ pub trait BlockIdTo { #[cfg(test)] mod tests { - use super::AccountIdConversion; + use super::*; use crate::codec::{Encode, Decode, Input}; + use sp_core::{crypto::Pair, ecdsa}; mod t { use sp_core::crypto::KeyTypeId; @@ -1388,4 +1389,16 @@ mod tests { assert_eq!(t.remaining_len(), Ok(None)); assert_eq!(buffer, [0, 0]); } + + #[test] + fn ecdsa_verify_works() { + let msg = &b"test-message"[..]; + let (pair, _) = ecdsa::Pair::generate(); + + let signature = pair.sign(&msg); + assert!(ecdsa::Pair::verify(&signature, msg, &pair.public())); + + assert!(signature.verify(msg, &pair.public())); + assert!(signature.verify(msg, &pair.public().into_compressed().unwrap())); + } } -- GitLab From 73049c0510c45cb7fb6053560cf3348175aee390 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 2 Jan 2020 14:46:07 +0300 Subject: [PATCH 036/296] Refactor to use only chain info (#4516) --- bin/node/cli/src/service.rs | 6 +- client/cli/src/informant.rs | 4 +- client/consensus/aura/src/lib.rs | 2 +- client/consensus/babe/src/lib.rs | 4 +- client/consensus/babe/src/tests.rs | 4 +- client/finality-grandpa/src/environment.rs | 4 +- client/finality-grandpa/src/import.rs | 4 +- client/finality-grandpa/src/lib.rs | 16 ++--- client/finality-grandpa/src/light_import.rs | 6 +- client/finality-grandpa/src/observer.rs | 2 +- client/finality-grandpa/src/tests.rs | 32 +++++----- client/network/src/chain.rs | 10 ++-- client/network/src/protocol.rs | 12 ++-- client/network/src/protocol/sync.rs | 17 +++--- client/network/test/src/lib.rs | 16 ++--- client/network/test/src/sync.rs | 36 ++++++------ client/rpc/src/author/mod.rs | 6 +- client/rpc/src/chain/mod.rs | 10 ++-- client/rpc/src/state/state_full.rs | 8 +-- client/rpc/src/state/state_light.rs | 2 +- client/service/src/builder.rs | 6 +- client/service/src/chain_ops.rs | 6 +- client/service/src/lib.rs | 2 +- client/service/test/src/lib.rs | 14 ++--- client/src/client.rs | 62 +++++++++++--------- client/src/light/fetcher.rs | 8 +-- primitives/api/test/benches/bench.rs | 12 ++-- primitives/api/test/tests/runtime_calls.rs | 28 ++++----- test-utils/runtime/client/src/trait_tests.rs | 6 +- test-utils/runtime/src/lib.rs | 8 +-- 30 files changed, 178 insertions(+), 175 deletions(-) diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 1403393866..408f2653ba 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -427,7 +427,7 @@ mod tests { let keys: Vec<&ed25519::Pair> = vec![&*alice, &*bob]; let dummy_runtime = ::tokio::runtime::Runtime::new().unwrap(); let block_factory = |service: &::FullService| { - let block_id = BlockId::number(service.client().info().chain.best_number); + let block_id = BlockId::number(service.client().chain_info().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 { @@ -513,7 +513,7 @@ mod tests { .expect("Creates inherent data."); inherent_data.replace_data(sp_finality_tracker::INHERENT_IDENTIFIER, &1u64); - let parent_id = BlockId::number(service.client().info().chain.best_number); + let parent_id = BlockId::number(service.client().chain_info().best_number); let parent_header = service.client().header(&parent_id).unwrap().unwrap(); let mut proposer_factory = sc_basic_authority::ProposerFactory { client: service.client(), @@ -580,7 +580,7 @@ mod tests { let to: Address = AccountPublic::from(bob.public()).into_account().into(); let from: Address = AccountPublic::from(charlie.public()).into_account().into(); let genesis_hash = service.client().block_hash(0).unwrap().unwrap(); - let best_block_id = BlockId::number(service.client().info().chain.best_number); + let best_block_id = BlockId::number(service.client().chain_info().best_number); let version = service.client().runtime_version_at(&best_block_id).unwrap().spec_version; let signer = charlie.clone(); diff --git a/client/cli/src/informant.rs b/client/cli/src/informant.rs index be896e180d..6f0ed8dcdf 100644 --- a/client/cli/src/informant.rs +++ b/client/cli/src/informant.rs @@ -35,14 +35,14 @@ pub fn build(service: &impl AbstractService) -> impl futures::Future BlockImport for BabeBlockImport( B: Backend, RA: Send + Sync, { - let info = client.info().chain; + let info = client.chain_info(); let finalized_slot = { let finalized_header = client.header(&BlockId::Hash(info.finalized_hash)) diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 8ee4ae22e2..828fafc5a9 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -707,7 +707,7 @@ fn importing_epoch_change_block_prunes_tree() { // We finalize block #13 from the canon chain, so on the next epoch // change the tree should be pruned, to not contain F (#7). client.finalize_block(BlockId::Hash(canon_hashes[12]), None, false).unwrap(); - propose_and_import_blocks(BlockId::Hash(client.info().chain.best_hash), 7); + propose_and_import_blocks(BlockId::Hash(client.chain_info().best_hash), 7); // at this point no hashes from the first fork must exist on the tree assert!( @@ -725,7 +725,7 @@ fn importing_epoch_change_block_prunes_tree() { // finalizing block #25 from the canon chain should prune out the second fork client.finalize_block(BlockId::Hash(canon_hashes[24]), None, false).unwrap(); - propose_and_import_blocks(BlockId::Hash(client.info().chain.best_hash), 8); + propose_and_import_blocks(BlockId::Hash(client.chain_info().best_hash), 8); // at this point no hashes from the second fork must exist on the tree assert!( diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index efc8052ab8..1d0532cc28 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -964,7 +964,7 @@ pub(crate) fn finalize_block, E, RA>( // below. let mut authority_set = authority_set.inner().write(); - let status = client.info().chain; + let status = client.chain_info(); if number <= status.finalized_number && client.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 @@ -1037,7 +1037,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.chain_info().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/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index 17d2f1f8d8..cb354c64d9 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -87,7 +87,7 @@ impl, RA, SC> JustificationImport fn on_start(&mut self) -> Vec<(Block::Hash, NumberFor)> { let mut out = Vec::new(); - let chain_info = self.inner.info().chain; + let chain_info = self.inner.chain_info(); // request justifications for all pending changes for which change blocks have already been imported let authorities = self.authority_set.inner().read(); @@ -324,7 +324,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. - let best_finalized_number = self.inner.info().chain.finalized_number; + let best_finalized_number = self.inner.chain_info().finalized_number; let canon_number = best_finalized_number.min(median_last_finalized_number); let canon_hash = self.inner.header(&BlockId::Number(canon_number)) diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index b6745baf69..f123995552 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -411,8 +411,8 @@ where RA: Send + Sync, SC: SelectChain, { - let chain_info = client.info(); - let genesis_hash = chain_info.chain.genesis_hash; + let chain_info = client.chain_info(); + let genesis_hash = chain_info.genesis_hash; let persistent_data = aux_schema::load_persistent( &*client, @@ -507,7 +507,7 @@ fn register_finality_tracker_inherent_data_provider ?info.finalized_number, "finalized_hash" => ?info.finalized_hash, @@ -710,10 +710,10 @@ where "authority_id" => authority_id.to_string(), ); - let chain_info = self.env.client.info(); + let chain_info = self.env.client.chain_info(); telemetry!(CONSENSUS_INFO; "afg.authority_set"; - "number" => ?chain_info.chain.finalized_number, - "hash" => ?chain_info.chain.finalized_hash, + "number" => ?chain_info.finalized_number, + "hash" => ?chain_info.finalized_hash, "authority_id" => authority_id.to_string(), "authority_set_id" => ?self.env.set_id, "authorities" => { @@ -727,8 +727,8 @@ where match &*self.env.voter_set_state.read() { VoterSetState::Live { completed_rounds, .. } => { let last_finalized = ( - chain_info.chain.finalized_hash, - chain_info.chain.finalized_number, + chain_info.finalized_hash, + chain_info.finalized_number, ); let global_comms = global_communication( diff --git a/client/finality-grandpa/src/light_import.rs b/client/finality-grandpa/src/light_import.rs index fe05f6dc46..5e69588f2b 100644 --- a/client/finality-grandpa/src/light_import.rs +++ b/client/finality-grandpa/src/light_import.rs @@ -62,7 +62,7 @@ pub fn light_block_import, RA>( { let info = client.info(); let import_data = load_aux_import_data( - info.chain.finalized_hash, + info.finalized_hash, &*client, genesis_authorities_provider, )?; @@ -158,7 +158,7 @@ impl, RA> FinalityProofImport fn on_start(&mut self) -> Vec<(Block::Hash, NumberFor)> { let mut out = Vec::new(); - let chain_info = self.client.info().chain; + let chain_info = self.client.chain_info(); let data = self.data.read(); for (pending_number, pending_hash) in data.consensus_changes.pending_changes() { @@ -647,7 +647,7 @@ pub mod tests { origin: BlockOrigin::Own, header: Header { number: 1, - parent_hash: client.info().chain.best_hash, + parent_hash: client.chain_info().best_hash, state_root: Default::default(), digest: Default::default(), extrinsics_root: Default::default(), diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index 2cb3c18045..6ce91c9e4e 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -258,7 +258,7 @@ where &self.keystore, ); - let last_finalized_number = self.client.info().chain.finalized_number; + let last_finalized_number = self.client.chain_info().finalized_number; // NOTE: since we are not using `round_communication` we have to // manually note the round with the gossip validator, otherwise we won't diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 6b4d8bb681..e2ddda7b44 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -469,7 +469,7 @@ fn finalize_3_voters_no_observers() { net.block_until_sync(&mut runtime); for i in 0..3 { - assert_eq!(net.peer(i).client().info().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().best_number, 20, "Peer #{} failed to sync", i); } @@ -602,7 +602,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().chain.best_number, 1, + assert_eq!(full_client.chain_info().best_number, 1, "Peer #{} failed to sync", i); let set: AuthoritySet = crate::aux_schema::load_authorities(&*full_client).unwrap(); @@ -821,7 +821,7 @@ fn sync_justifications_on_change_blocks() { net.block_until_sync(&mut runtime); for i in 0..4 { - assert_eq!(net.peer(i).client().info().chain.best_number, 25, + assert_eq!(net.peer(i).client().info().best_number, 25, "Peer #{} failed to sync", i); } @@ -898,7 +898,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().chain.best_number, 30, + assert_eq!(net.peer(i).client().info().best_number, 30, "Peer #{} failed to sync", i); } @@ -948,7 +948,7 @@ fn force_change_to_new_set() { net.lock().block_until_sync(&mut runtime); for (i, peer) in net.lock().peers().iter().enumerate() { - assert_eq!(peer.client().info().chain.best_number, 26, + assert_eq!(peer.client().info().best_number, 26, "Peer #{} failed to sync", i); let full_client = peer.client().as_full().expect("only full clients are used in test"); @@ -1091,7 +1091,7 @@ fn voter_persists_its_votes() { net.peer(0).push_blocks(20, false); net.block_until_sync(&mut runtime); - assert_eq!(net.peer(0).client().info().chain.best_number, 20, + assert_eq!(net.peer(0).client().info().best_number, 20, "Peer #{} failed to sync", 0); @@ -1265,7 +1265,7 @@ fn voter_persists_its_votes() { future::Either::A(interval .take_while(move |_| { - Ok(net2.lock().peer(1).client().info().chain.best_number != 40) + Ok(net2.lock().peer(1).client().info().best_number != 40) }) .for_each(|_| Ok(())) .and_then(move |_| { @@ -1342,7 +1342,7 @@ fn finalize_3_voters_1_light_observer() { net.block_until_sync(&mut runtime); for i in 0..4 { - assert_eq!(net.peer(i).client().info().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().best_number, 20, "Peer #{} failed to sync", i); } @@ -1395,7 +1395,7 @@ fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { // check that the block#1 is finalized on light client runtime.block_on(futures::future::poll_fn(move || -> std::result::Result<_, ()> { - if net.lock().peer(1).client().info().chain.finalized_number == 1 { + if net.lock().peer(1).client().info().finalized_number == 1 { Ok(Async::Ready(())) } else { net.lock().poll(); @@ -1467,7 +1467,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // check block, finalized on light client assert_eq!( - net.lock().peer(3).client().info().chain.finalized_number, + net.lock().peer(3).client().info().finalized_number, if FORCE_CHANGE { 0 } else { 10 }, ); } @@ -1662,7 +1662,7 @@ fn grandpa_environment_respects_voting_rules() { // the unrestricted environment should just return the best block assert_eq!( unrestricted_env.best_chain_containing( - peer.client().info().chain.finalized_hash + peer.client().info().finalized_hash ).unwrap().1, 20, ); @@ -1671,14 +1671,14 @@ fn grandpa_environment_respects_voting_rules() { // way in the unfinalized chain assert_eq!( three_quarters_env.best_chain_containing( - peer.client().info().chain.finalized_hash + peer.client().info().finalized_hash ).unwrap().1, 15, ); assert_eq!( default_env.best_chain_containing( - peer.client().info().chain.finalized_hash + peer.client().info().finalized_hash ).unwrap().1, 15, ); @@ -1689,7 +1689,7 @@ fn grandpa_environment_respects_voting_rules() { // the 3/4 environment should propose block 20 for voting assert_eq!( three_quarters_env.best_chain_containing( - peer.client().info().chain.finalized_hash + peer.client().info().finalized_hash ).unwrap().1, 20, ); @@ -1698,7 +1698,7 @@ fn grandpa_environment_respects_voting_rules() { // on the best block assert_eq!( default_env.best_chain_containing( - peer.client().info().chain.finalized_hash + peer.client().info().finalized_hash ).unwrap().1, 19, ); @@ -1711,7 +1711,7 @@ fn grandpa_environment_respects_voting_rules() { // the given base (#20). assert_eq!( default_env.best_chain_containing( - peer.client().info().chain.finalized_hash + peer.client().info().finalized_hash ).unwrap().1, 20, ); diff --git a/client/network/src/chain.rs b/client/network/src/chain.rs index 8231f3bb53..bb952eb86f 100644 --- a/client/network/src/chain.rs +++ b/client/network/src/chain.rs @@ -17,8 +17,8 @@ //! Blockchain access trait use sc_client::Client as SubstrateClient; -use sp_blockchain::Error; -use sc_client_api::{ChangesProof, StorageProof, ClientInfo, CallExecutor}; +use sp_blockchain::{Error, Info as BlockchainInfo}; +use sc_client_api::{ChangesProof, StorageProof, CallExecutor}; use sp_consensus::{BlockImport, BlockStatus, Error as ConsensusError}; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; use sp_runtime::generic::{BlockId}; @@ -29,7 +29,7 @@ use sp_core::storage::{StorageKey, ChildInfo}; /// Local client abstraction for the network. pub trait Client: Send + Sync { /// Get blockchain info. - fn info(&self) -> ClientInfo; + fn info(&self) -> BlockchainInfo; /// Get block status. fn block_status(&self, id: &BlockId) -> Result; @@ -99,8 +99,8 @@ impl Client for SubstrateClient where Block: BlockT, RA: Send + Sync { - fn info(&self) -> ClientInfo { - (self as &SubstrateClient).info() + fn info(&self) -> BlockchainInfo { + (self as &SubstrateClient).chain_info() } fn block_status(&self, id: &BlockId) -> Result { diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 165cef0c68..495fa57a8e 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -473,7 +473,7 @@ impl, H: ExHashT> Protocol { chain, }, light_dispatch: LightDispatch::new(checker), - genesis_hash: info.chain.genesis_hash, + genesis_hash: info.genesis_hash, sync, specialization, handshaking_peers: HashMap::new(), @@ -1010,7 +1010,7 @@ impl, H: ExHashT> Protocol { .context_data .chain .info() - .chain.best_number; + .best_number; let blocks_difference = self_best_block .checked_sub(&status.best_number) .unwrap_or_else(Zero::zero) @@ -1232,7 +1232,7 @@ impl, H: ExHashT> Protocol { return; } - let is_best = self.context_data.chain.info().chain.best_hash == hash; + let is_best = self.context_data.chain.info().best_hash == hash; debug!(target: "sync", "Reannouncing block {:?}", hash); self.send_announcement(&header, data, is_best, true) } @@ -1278,10 +1278,10 @@ impl, H: ExHashT> Protocol { let status = message::generic::Status { version: CURRENT_VERSION, min_supported_version: MIN_VERSION, - genesis_hash: info.chain.genesis_hash, + genesis_hash: info.genesis_hash, roles: self.config.roles.into(), - best_number: info.chain.best_number, - best_hash: info.chain.best_hash, + best_number: info.best_number, + best_hash: info.best_hash, chain_status: self.specialization.status(), }; diff --git a/client/network/src/protocol/sync.rs b/client/network/src/protocol/sync.rs index 4e248b7fe4..4ff87fd17d 100644 --- a/client/network/src/protocol/sync.rs +++ b/client/network/src/protocol/sync.rs @@ -28,8 +28,7 @@ //! use blocks::BlockCollection; -use sc_client_api::ClientInfo; -use sp_blockchain::Error as ClientError; +use sp_blockchain::{Error as ClientError, Info as BlockchainInfo}; use sp_consensus::{BlockOrigin, BlockStatus, block_validation::{BlockAnnounceValidator, Validation}, import_queue::{IncomingBlock, BlockImportResult, BlockImportError} @@ -291,7 +290,7 @@ impl ChainSync { pub fn new( role: Roles, client: Arc>, - info: &ClientInfo, + info: &BlockchainInfo, request_builder: Option>, block_announce_validator: Box + Send>, max_parallel_downloads: u32, @@ -306,9 +305,9 @@ impl ChainSync { client, peers: HashMap::new(), blocks: BlockCollection::new(), - best_queued_hash: info.chain.best_hash, - best_queued_number: info.chain.best_number, - best_imported_number: info.chain.best_number, + best_queued_hash: info.best_hash, + best_queued_number: info.best_number, + best_imported_number: info.best_number, extra_finality_proofs: ExtraRequests::new(), extra_justifications: ExtraRequests::new(), role, @@ -579,7 +578,7 @@ impl ChainSync { let attrs = &self.required_block_attributes; let fork_targets = &mut self.fork_targets; let mut have_requests = false; - let last_finalized = self.client.info().chain.finalized_number; + let last_finalized = self.client.info().finalized_number; let best_queued = self.best_queued_number; let client = &self.client; let queue = &self.queue_blocks; @@ -1142,8 +1141,8 @@ impl ChainSync { self.queue_blocks.clear(); self.blocks.clear(); let info = self.client.info(); - self.best_queued_hash = info.chain.best_hash; - self.best_queued_number = std::cmp::max(info.chain.best_number, self.best_imported_number); + self.best_queued_hash = info.best_hash; + self.best_queued_number = std::cmp::max(info.best_number, self.best_imported_number); self.is_idle = false; debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); let old_peers = std::mem::replace(&mut self.peers, HashMap::new()); diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index ac4ec6f414..7c281ae1e5 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -28,10 +28,10 @@ use libp2p::build_multiaddr; use log::trace; use sc_network::FinalityProofProvider; use sp_blockchain::{ - Result as ClientResult, well_known_cache_keys::{self, Id as CacheKeyId}, + Result as ClientResult, well_known_cache_keys::{self, Id as CacheKeyId}, Info as BlockchainInfo, }; use sc_client_api::{ - ClientInfo, BlockchainEvents, BlockImportNotification, + BlockchainEvents, BlockImportNotification, FinalityNotifications, ImportNotifications, FinalityNotification, backend::{AuxStore, Backend, Finalizer} @@ -161,10 +161,10 @@ impl PeersClient { } } - pub fn info(&self) -> ClientInfo { + pub fn info(&self) -> BlockchainInfo { match *self { - PeersClient::Full(ref client, ref _backend) => client.info(), - PeersClient::Light(ref client, ref _backend) => client.info(), + PeersClient::Full(ref client, ref _backend) => client.chain_info(), + PeersClient::Light(ref client, ref _backend) => client.chain_info(), } } @@ -270,7 +270,7 @@ impl> Peer { pub fn generate_blocks(&mut self, count: usize, origin: BlockOrigin, edit_block: F) -> H256 where F: FnMut(BlockBuilder) -> Block { - let best_hash = self.client.info().chain.best_hash; + let best_hash = self.client.info().best_hash; self.generate_blocks_at(BlockId::Hash(best_hash), count, origin, edit_block) } @@ -320,7 +320,7 @@ impl> Peer { /// Push blocks to the peer (simplified: with or without a TX) pub fn push_blocks(&mut self, count: usize, with_tx: bool) -> H256 { - let best_hash = self.client.info().chain.best_hash; + let best_hash = self.client.info().best_hash; self.push_blocks_at(BlockId::Hash(best_hash), count, with_tx) } @@ -689,7 +689,7 @@ pub trait TestNetFactory: Sized { if peer.is_major_syncing() || peer.network.num_queued_blocks() != 0 { return Async::NotReady } - match (highest, peer.client.info().chain.best_hash) { + match (highest, peer.client.info().best_hash) { (None, b) => highest = Some(b), (Some(ref a), ref b) if a == b => {}, (Some(_), _) => return Async::NotReady, diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index 0160c081e3..7911f76f80 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -374,8 +374,8 @@ fn own_blocks_are_announced() { net.block_until_sync(&mut runtime); - 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(0).client.info().best_number, 1); + assert_eq!(net.peer(1).client.info().best_number, 1); let peer0 = &net.peers()[0]; assert!(net.peers()[1].blockchain_canon_equals(peer0)); (net.peers()[2].blockchain_canon_equals(peer0)); @@ -396,9 +396,9 @@ fn blocks_are_not_announced_by_light_nodes() { // Sync between 0 and 1. net.peer(0).push_blocks(1, false); - assert_eq!(net.peer(0).client.info().chain.best_number, 1); + assert_eq!(net.peer(0).client.info().best_number, 1); net.block_until_sync(&mut runtime); - assert_eq!(net.peer(1).client.info().chain.best_number, 1); + assert_eq!(net.peer(1).client.info().best_number, 1); // Add another node and remove node 0. net.add_full_peer(&ProtocolConfig::default()); @@ -410,7 +410,7 @@ fn blocks_are_not_announced_by_light_nodes() { net.poll(); delay.poll().map_err(|_| ()) })).unwrap(); - assert_eq!(net.peer(1).client.info().chain.best_number, 0); + assert_eq!(net.peer(1).client.info().best_number, 0); } #[test] @@ -423,13 +423,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().chain.best_hash; + let small_hash = net.peer(0).client().info().best_hash; net.peer(0).push_blocks_at(BlockId::Number(30), 10, false); - assert_eq!(net.peer(0).client().info().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().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().chain.best_number, 40); + assert_eq!(net.peer(1).client().info().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()); @@ -446,7 +446,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().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().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()); @@ -493,8 +493,8 @@ fn can_not_sync_from_light_peer() { net.block_until_sync(&mut runtime); // ensure #0 && #1 have the same best block - let full0_info = net.peer(0).client.info().chain; - let light_info = net.peer(1).client.info().chain; + let full0_info = net.peer(0).client.info(); + let light_info = net.peer(1).client.info(); assert_eq!(full0_info.best_number, 1); assert_eq!(light_info.best_number, 1); assert_eq!(light_info.best_hash, full0_info.best_hash); @@ -555,14 +555,14 @@ fn can_sync_explicit_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().chain.best_hash; - let small_number = net.peer(0).client().info().chain.best_number; + let small_hash = net.peer(0).client().info().best_hash; + let small_number = net.peer(0).client().info().best_number; net.peer(0).push_blocks_at(BlockId::Number(30), 10, false); - assert_eq!(net.peer(0).client().info().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().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().chain.best_number, 40); + assert_eq!(net.peer(1).client().info().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()); @@ -579,7 +579,7 @@ fn can_sync_explicit_forks() { // synchronization: 0 synced to longer chain and 1 didn't sync to small chain. - assert_eq!(net.peer(0).client().info().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().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()); @@ -612,8 +612,8 @@ fn syncs_header_only_forks() { net.peer(1).push_blocks(2, false); net.peer(0).push_blocks(2, true); - let small_hash = net.peer(0).client().info().chain.best_hash; - let small_number = net.peer(0).client().info().chain.best_number; + let small_hash = net.peer(0).client().info().best_hash; + let small_number = net.peer(0).client().info().best_number; net.peer(1).push_blocks(4, false); net.block_until_sync(&mut runtime); diff --git a/client/rpc/src/author/mod.rs b/client/rpc/src/author/mod.rs index 1cdbda5904..75a5a6a770 100644 --- a/client/rpc/src/author/mod.rs +++ b/client/rpc/src/author/mod.rs @@ -102,7 +102,7 @@ impl AuthorApi for Author Result { - let best_block_hash = self.client.info().chain.best_hash; + let best_block_hash = self.client.chain_info().best_hash; self.client.runtime_api().generate_session_keys( &generic::BlockId::Hash(best_block_hash), None, @@ -114,7 +114,7 @@ impl AuthorApi for Author xt, Err(err) => return Box::new(result(Err(err.into()))), }; - let best_block_hash = self.client.info().chain.best_hash; + let best_block_hash = self.client.chain_info().best_hash; Box::new(self.pool .submit_one(&generic::BlockId::hash(best_block_hash), xt) .compat() @@ -157,7 +157,7 @@ impl AuthorApi for Author Result<_> { - let best_block_hash = self.client.info().chain.best_hash; + let best_block_hash = self.client.chain_info().best_hash; let dxt = TransactionFor::

::decode(&mut &xt[..]) .map_err(error::Error::from)?; Ok( diff --git a/client/rpc/src/chain/mod.rs b/client/rpc/src/chain/mod.rs index 28442eca46..95e26a8a10 100644 --- a/client/rpc/src/chain/mod.rs +++ b/client/rpc/src/chain/mod.rs @@ -63,7 +63,7 @@ trait ChainBackend: Send + Sync + 'static /// Tries to unwrap passed block hash, or uses best block hash otherwise. fn unwrap_or_best(&self, hash: Option) -> Block::Hash { match hash.into() { - None => self.client().info().chain.best_hash, + None => self.client().chain_info().best_hash, Some(hash) => hash, } } @@ -82,7 +82,7 @@ trait ChainBackend: Send + Sync + 'static number: Option>>, ) -> Result> { Ok(match number { - None => Some(self.client().info().chain.best_hash), + None => Some(self.client().chain_info().best_hash), Some(num_or_hex) => self.client() .header(&BlockId::number(num_or_hex.to_number()?)) .map_err(client_err)? @@ -92,7 +92,7 @@ trait ChainBackend: Send + Sync + 'static /// Get hash of the last finalized block in the canon chain. fn finalized_head(&self) -> Result { - Ok(self.client().info().chain.finalized_hash) + Ok(self.client().chain_info().finalized_hash) } /// New head subscription @@ -105,7 +105,7 @@ trait ChainBackend: Send + Sync + 'static self.client(), self.subscriptions(), subscriber, - || self.client().info().chain.best_hash, + || self.client().chain_info().best_hash, || self.client().import_notification_stream() .filter(|notification| future::ready(notification.is_new_best)) .map(|notification| Ok::<_, ()>(notification.header)) @@ -132,7 +132,7 @@ trait ChainBackend: Send + Sync + 'static self.client(), self.subscriptions(), subscriber, - || self.client().info().chain.finalized_hash, + || self.client().chain_info().finalized_hash, || self.client().finality_notification_stream() .map(|notification| Ok::<_, ()>(notification.header)) .compat(), diff --git a/client/rpc/src/state/state_full.rs b/client/rpc/src/state/state_full.rs index 05bb64c36f..3095c0eec0 100644 --- a/client/rpc/src/state/state_full.rs +++ b/client/rpc/src/state/state_full.rs @@ -83,7 +83,7 @@ impl FullState /// Returns given block hash or best block hash if None is passed. fn block_or_best(&self, hash: Option) -> ClientResult { - Ok(hash.unwrap_or_else(|| self.client.info().chain.best_hash)) + Ok(hash.unwrap_or_else(|| self.client.chain_info().best_hash)) } /// Splits the `query_storage` block range into 'filtered' and 'unfiltered' subranges. @@ -403,9 +403,9 @@ impl StateBackend for FullState StateBackend for FullState + 'static, B, E, RA> LightState) -> Block::Hash { - hash.unwrap_or_else(|| self.client.info().chain.best_hash) + hash.unwrap_or_else(|| self.client.chain_info().best_hash) } } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 9b5afe957a..0c50ae3969 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -766,7 +766,7 @@ ServiceBuilder< sp_session::generate_initial_session_keys( client.clone(), - &BlockId::Hash(client.info().chain.best_hash), + &BlockId::Hash(client.chain_info().best_hash), config.dev_key_seed.clone().map(|s| vec![s]).unwrap_or_default(), )?; @@ -780,7 +780,7 @@ ServiceBuilder< let (essential_failed_tx, essential_failed_rx) = mpsc::unbounded(); let import_queue = Box::new(import_queue); - let chain_info = client.info().chain; + let chain_info = client.chain_info(); let version = config.full_version(); info!("Highest known block at #{}", chain_info.best_number); @@ -916,7 +916,7 @@ ServiceBuilder< let (state_tx, state_rx) = mpsc::unbounded::<(NetworkStatus<_>, NetworkState)>(); network_status_sinks.lock().push(std::time::Duration::from_millis(5000), state_tx); let tel_task = state_rx.for_each(move |(net_status, _)| { - let info = client_.info(); + let info = client_.usage_info(); let best_number = info.chain.best_number.saturated_into::(); let best_hash = info.chain.best_hash; let num_peers = net_status.num_connected_peers; diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index fb62cd3399..512f3888ee 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -198,7 +198,7 @@ impl< } if link.imported_blocks >= count { - info!("Imported {} blocks. Best: #{}", read_block_count, client.info().chain.best_number); + info!("Imported {} blocks. Best: #{}", read_block_count, client.chain_info().best_number); return std::task::Poll::Ready(Ok(())); } else { @@ -222,7 +222,7 @@ impl< let last = match to { Some(v) if v.is_zero() => One::one(), Some(v) => v, - None => client.info().chain.best_number, + None => client.chain_info().best_number, }; let mut wrote_header = false; @@ -283,7 +283,7 @@ impl< blocks: NumberFor ) -> Result<(), Error> { let reverted = self.client.revert(blocks)?; - let info = self.client.info().chain; + let info = self.client.chain_info(); if reverted.is_zero() { info!("There aren't any non-finalized blocks to revert."); diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index d9dc9bd004..e383703da7 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -684,7 +684,7 @@ where let encoded = transaction.encode(); match Decode::decode(&mut &encoded[..]) { Ok(uxt) => { - let best_block_id = BlockId::hash(self.client.info().chain.best_hash); + let best_block_id = BlockId::hash(self.client.info().best_hash); let import_future = self.pool.submit_one(&best_block_id, uxt); let import_future = import_future .then(move |import_result| { diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index f66e4a65da..9601257f07 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -446,15 +446,15 @@ pub fn sync( } network.run_until_all_full( |_index, service| - service.get().client().info().chain.best_number == (NUM_BLOCKS as u32).into(), + service.get().client().chain_info().best_number == (NUM_BLOCKS as u32).into(), |_index, service| - service.get().client().info().chain.best_number == (NUM_BLOCKS as u32).into(), + service.get().client().chain_info().best_number == (NUM_BLOCKS as u32).into(), ); info!("Checking extrinsic propagation"); let first_service = network.full_nodes[0].1.clone(); let first_user_data = &network.full_nodes[0].2; - let best_block = BlockId::number(first_service.get().client().info().chain.best_number); + let best_block = BlockId::number(first_service.get().client().chain_info().best_number); let extrinsic = extrinsic_factory(&first_service.get(), first_user_data); futures03::executor::block_on(first_service.get().transaction_pool().submit_one(&best_block, extrinsic)).unwrap(); network.run_until_all_full( @@ -501,9 +501,9 @@ pub fn consensus( } network.run_until_all_full( |_index, service| - service.get().client().info().chain.finalized_number >= (NUM_BLOCKS as u32 / 2).into(), + service.get().client().chain_info().finalized_number >= (NUM_BLOCKS as u32 / 2).into(), |_index, service| - service.get().client().info().chain.best_number >= (NUM_BLOCKS as u32 / 2).into(), + service.get().client().chain_info().best_number >= (NUM_BLOCKS as u32 / 2).into(), ); info!("Adding more peers"); @@ -523,8 +523,8 @@ pub fn consensus( } network.run_until_all_full( |_index, service| - service.get().client().info().chain.finalized_number >= (NUM_BLOCKS as u32).into(), + service.get().client().chain_info().finalized_number >= (NUM_BLOCKS as u32).into(), |_index, service| - service.get().client().info().chain.best_number >= (NUM_BLOCKS as u32).into(), + service.get().client().chain_info().best_number >= (NUM_BLOCKS as u32).into(), ); } diff --git a/client/src/client.rs b/client/src/client.rs index a0fc940d24..c8868d4fd2 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -655,11 +655,11 @@ impl Client where Self: ProvideRuntimeApi, ::Api: BlockBuilderApi { - let info = self.info(); + let info = self.chain_info(); sc_block_builder::BlockBuilder::new( self, - info.chain.best_hash, - info.chain.best_number, + info.best_hash, + info.best_number, false, inherent_digests, ) @@ -1148,15 +1148,19 @@ impl Client where Ok(self.backend.revert(n)?) } - /// Get blockchain info. - pub fn info(&self) -> ClientInfo { - let info = self.backend.blockchain().info(); + /// Get usage info about current client. + pub fn usage_info(&self) -> ClientInfo { ClientInfo { - chain: info, + chain: self.chain_info(), used_state_cache_size: self.backend.used_state_cache_size(), } } + /// Get blockchain info. + pub fn chain_info(&self) -> blockchain::Info { + self.backend.blockchain().info() + } + /// Get block status. pub fn block_status(&self, id: &BlockId) -> sp_blockchain::Result { // this can probably be implemented more efficiently @@ -1862,14 +1866,14 @@ pub(crate) mod tests { assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().chain.best_number), + &BlockId::Number(client.chain_info().best_number), AccountKeyring::Alice.into() ).unwrap(), 1000 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().chain.best_number), + &BlockId::Number(client.chain_info().best_number), AccountKeyring::Ferdie.into() ).unwrap(), 0 @@ -1884,7 +1888,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().chain.best_number, 1); + assert_eq!(client.chain_info().best_number, 1); } #[test] @@ -1902,21 +1906,21 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().chain.best_number, 1); + assert_eq!(client.chain_info().best_number, 1); 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), + &BlockId::Number(client.chain_info().best_number), AccountKeyring::Alice.into() ).unwrap(), 958 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().chain.best_number), + &BlockId::Number(client.chain_info().best_number), AccountKeyring::Ferdie.into() ).unwrap(), 42 @@ -1945,7 +1949,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().chain.best_number, 1); + assert_eq!(client.chain_info().best_number, 1); assert_ne!( client.state_at(&BlockId::Number(1)).unwrap().pairs(), client.state_at(&BlockId::Number(0)).unwrap().pairs() @@ -1960,7 +1964,7 @@ pub(crate) mod tests { let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); - let genesis_hash = client.info().chain.genesis_hash; + let genesis_hash = client.chain_info().genesis_hash; assert_eq!( genesis_hash.clone(), @@ -2073,7 +2077,7 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - let genesis_hash = client.info().chain.genesis_hash; + let genesis_hash = client.chain_info().genesis_hash; let uncles1 = client.uncles(a4.hash(), 10).unwrap(); assert_eq!(vec![b2.hash(), d2.hash()], uncles1); @@ -2109,7 +2113,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().chain.genesis_hash; + let genesis_hash = client.chain_info().genesis_hash; 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()); @@ -2189,9 +2193,9 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - assert_eq!(client.info().chain.best_hash, a5.hash()); + assert_eq!(client.chain_info().best_hash, a5.hash()); - let genesis_hash = client.info().chain.genesis_hash; + let genesis_hash = client.chain_info().genesis_hash; let leaves = longest_chain_select.leaves().unwrap(); assert!(leaves.contains(&a5.hash())); @@ -2417,7 +2421,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().chain.genesis_hash; + let genesis_hash = client.chain_info().genesis_hash; assert_eq!(a2.hash(), longest_chain_select.finality_target(genesis_hash, Some(10)).unwrap().unwrap()); } @@ -2460,7 +2464,7 @@ pub(crate) mod tests { client.import_justified(BlockOrigin::Own, a3.clone(), justification.clone()).unwrap(); assert_eq!( - client.info().chain.finalized_hash, + client.chain_info().finalized_hash, a3.hash(), ); @@ -2507,7 +2511,7 @@ pub(crate) mod tests { // A2 is the current best since it's the longest chain assert_eq!( - client.info().chain.best_hash, + client.chain_info().best_hash, a2.hash(), ); @@ -2516,12 +2520,12 @@ pub(crate) mod tests { client.import_justified(BlockOrigin::Own, b1.clone(), justification).unwrap(); assert_eq!( - client.info().chain.best_hash, + client.chain_info().best_hash, b1.hash(), ); assert_eq!( - client.info().chain.finalized_hash, + client.chain_info().finalized_hash, b1.hash(), ); } @@ -2556,7 +2560,7 @@ pub(crate) mod tests { // A2 is the current best since it's the longest chain assert_eq!( - client.info().chain.best_hash, + client.chain_info().best_hash, a2.hash(), ); @@ -2566,14 +2570,14 @@ pub(crate) mod tests { // B1 should now be the latest finalized assert_eq!( - client.info().chain.finalized_hash, + client.chain_info().finalized_hash, b1.hash(), ); // and B1 should be the new best block (`finalize_block` as no way of // knowing about B2) assert_eq!( - client.info().chain.best_hash, + client.chain_info().best_hash, b1.hash(), ); @@ -2592,7 +2596,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, b3.clone()).unwrap(); assert_eq!( - client.info().chain.best_hash, + client.chain_info().best_hash, b3.hash(), ); } @@ -2614,7 +2618,7 @@ pub(crate) mod tests { let current_balance = || client.runtime_api().balance_of( - &BlockId::number(client.info().chain.best_number), AccountKeyring::Alice.into() + &BlockId::number(client.chain_info().best_number), AccountKeyring::Alice.into() ).unwrap(); // G -> A1 -> A2 diff --git a/client/src/light/fetcher.rs b/client/src/light/fetcher.rs index c081f6bb9e..cf08c8b471 100644 --- a/client/src/light/fetcher.rs +++ b/client/src/light/fetcher.rs @@ -550,8 +550,8 @@ pub mod tests { local_executor(), ); 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; + let max = remote_client.chain_info().best_number; + let max_hash = remote_client.chain_info().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(); @@ -648,8 +648,8 @@ pub mod tests { local_executor(), ); 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; + let max = remote_client.chain_info().best_number; + let max_hash = remote_client.chain_info().best_hash; let (begin, end, key, _) = test_cases[0].clone(); let begin_hash = remote_client.block_hash(begin).unwrap().unwrap(); diff --git a/primitives/api/test/benches/bench.rs b/primitives/api/test/benches/bench.rs index 9b41834097..395ef7ed20 100644 --- a/primitives/api/test/benches/bench.rs +++ b/primitives/api/test/benches/bench.rs @@ -26,14 +26,14 @@ fn sp_api_benchmark(c: &mut Criterion) { c.bench_function("add one with same runtime api", |b| { let client = substrate_test_runtime_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); b.iter(|| runtime_api.benchmark_add_one(&block_id, &1)) }); c.bench_function("add one with recreating runtime api", |b| { let client = substrate_test_runtime_client::new(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); b.iter(|| client.runtime_api().benchmark_add_one(&block_id, &1)) }); @@ -41,7 +41,7 @@ fn sp_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with same runtime api", |b| { let client = substrate_test_runtime_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| runtime_api.benchmark_vector_add_one(&block_id, &data)) @@ -49,7 +49,7 @@ fn sp_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with recreating runtime api", |b| { let client = substrate_test_runtime_client::new(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| client.runtime_api().benchmark_vector_add_one(&block_id, &data)) @@ -57,13 +57,13 @@ fn sp_api_benchmark(c: &mut Criterion) { c.bench_function("calling function by function pointer in wasm", |b| { let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); b.iter(|| client.runtime_api().benchmark_indirect_call(&block_id).unwrap()) }); c.bench_function("calling function in wasm", |b| { let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); b.iter(|| client.runtime_api().benchmark_direct_call(&block_id).unwrap()) }); } diff --git a/primitives/api/test/tests/runtime_calls.rs b/primitives/api/test/tests/runtime_calls.rs index 34184c936a..0dd5ea4c37 100644 --- a/primitives/api/test/tests/runtime_calls.rs +++ b/primitives/api/test/tests/runtime_calls.rs @@ -34,7 +34,7 @@ use codec::Encode; fn calling_function_with_strat(strat: ExecutionStrategy) { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert_eq!(runtime_api.benchmark_add_one(&block_id, &1).unwrap(), 2); } @@ -57,7 +57,7 @@ fn calling_wasm_runtime_function() { fn calling_native_runtime_function_with_non_decodable_parameter() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); runtime_api.fail_convert_parameter(&block_id, DecodeFails::new()).unwrap(); } @@ -66,7 +66,7 @@ fn calling_native_runtime_function_with_non_decodable_parameter() { fn calling_native_runtime_function_with_non_decodable_return_value() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); runtime_api.fail_convert_return_value(&block_id).unwrap(); } @@ -74,7 +74,7 @@ fn calling_native_runtime_function_with_non_decodable_return_value() { fn calling_native_runtime_signature_changed_function() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert_eq!(runtime_api.function_signature_changed(&block_id).unwrap(), 1); } @@ -83,7 +83,7 @@ fn calling_native_runtime_signature_changed_function() { fn calling_wasm_runtime_signature_changed_old_function() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); #[allow(deprecated)] let res = runtime_api.function_signature_changed_before_version_2(&block_id).unwrap(); @@ -94,7 +94,7 @@ fn calling_wasm_runtime_signature_changed_old_function() { fn calling_with_both_strategy_and_fail_on_wasm_should_return_error() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert!(runtime_api.fail_on_wasm(&block_id).is_err()); } @@ -102,7 +102,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 = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } @@ -111,7 +111,7 @@ fn calling_with_both_strategy_and_fail_on_native_should_work() { fn calling_with_native_else_wasm_and_fail_on_wasm_should_work() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert_eq!(runtime_api.fail_on_wasm(&block_id).unwrap(), 1); } @@ -119,7 +119,7 @@ fn calling_with_native_else_wasm_and_fail_on_wasm_should_work() { fn calling_with_native_else_wasm_and_fail_on_native_should_work() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } @@ -127,7 +127,7 @@ fn calling_with_native_else_wasm_and_fail_on_native_should_work() { fn use_trie_function() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert_eq!(runtime_api.use_trie(&block_id).unwrap(), 2); } @@ -135,7 +135,7 @@ fn use_trie_function() { fn initialize_block_works() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert_eq!(runtime_api.get_block_number(&block_id).unwrap(), 1); } @@ -143,7 +143,7 @@ fn initialize_block_works() { fn initialize_block_is_called_only_once() { 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); + let block_id = BlockId::Number(client.chain_info().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); } @@ -152,7 +152,7 @@ fn initialize_block_is_called_only_once() { fn initialize_block_is_skipped() { 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); + let block_id = BlockId::Number(client.chain_info().best_number); assert!(runtime_api.without_initialize_block(&block_id).unwrap()); } @@ -162,7 +162,7 @@ fn record_proof_works() { .set_execution_strategy(ExecutionStrategy::Both) .build_with_longest_chain(); - let block_id = BlockId::Number(client.info().chain.best_number); + let block_id = BlockId::Number(client.chain_info().best_number); let storage_root = longest_chain.best_chain().unwrap().state_root().clone(); let transaction = Transfer { diff --git a/test-utils/runtime/client/src/trait_tests.rs b/test-utils/runtime/client/src/trait_tests.rs index 9217cff801..129c1e4240 100644 --- a/test-utils/runtime/client/src/trait_tests.rs +++ b/test-utils/runtime/client/src/trait_tests.rs @@ -44,7 +44,7 @@ pub fn test_leaves_for_backend(backend: Arc) where let client = TestClientBuilder::with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); - let genesis_hash = client.info().chain.genesis_hash; + let genesis_hash = client.chain_info().genesis_hash; assert_eq!( blockchain.leaves().unwrap(), @@ -224,7 +224,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().chain.genesis_hash; + let genesis_hash = client.chain_info().genesis_hash; let children1 = blockchain.children(a4.hash()).unwrap(); assert_eq!(vec![a5.hash()], children1); @@ -314,7 +314,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc Date: Thu, 2 Jan 2020 14:46:45 +0300 Subject: [PATCH 037/296] Insert key via node RPC for subkey (#4514) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Insert key via node RPC. * somewhat address the reivew * Update bin/utils/subkey/src/rpc.rs Co-Authored-By: Bastian Köcher * Update bin/utils/subkey/src/rpc.rs Co-Authored-By: Bastian Köcher * Update bin/utils/subkey/src/main.rs Co-Authored-By: Bastian Köcher Co-authored-by: Bastian Köcher --- Cargo.lock | 4 +++ bin/utils/subkey/Cargo.toml | 4 +++ bin/utils/subkey/src/main.rs | 28 +++++++++++++++++++++ bin/utils/subkey/src/rpc.rs | 49 ++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 bin/utils/subkey/src/rpc.rs diff --git a/Cargo.lock b/Cargo.lock index a426e58fcf..e53a3e440e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6725,9 +6725,12 @@ dependencies = [ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "frame-system 2.0.0", + "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "node-runtime 2.0.0", "pallet-balances 2.0.0", @@ -6736,6 +6739,7 @@ dependencies = [ "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-rpc 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", "substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index c042b76f4a..b4398d9f8b 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] +futures = "0.1.29" sp-core = { version = "*", path = "../../../primitives/core" } node-runtime = { version = "*", path = "../../node/runtime" } node-primitives = { version = "*", path = "../../node/primitives" } @@ -23,6 +24,9 @@ pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transac rpassword = "4.0.1" itertools = "0.8.2" derive_more = { version = "0.99.2" } +sc-rpc = { version = "2.0.0", path = "../../../client/rpc" } +jsonrpc-core-client = { version = "14.0.3", features = ["http"] } +hyper = "0.12.35" [features] bench = [] diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index d586fac6f9..616b169289 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -34,6 +34,7 @@ use std::{ convert::{TryInto, TryFrom}, io::{stdin, Read}, str::FromStr, path::PathBuf, fs, fmt, }; +mod rpc; mod vanity; trait Crypto: Sized { @@ -231,6 +232,15 @@ fn get_app<'a, 'b>(usage: &'a str) -> App<'a, 'b> { If the value is a file, the file content is used as URI. \ If not given, you will be prompted for the URI.' "), + SubCommand::with_name("insert") + .about("Insert a key to the keystore of a node") + .args_from_usage(" + 'The secret key URI. \ + If the value is a file, the file content is used as URI. \ + If not given, you will be prompted for the URI.' + 'Key type, examples: \"gran\", or \"imon\" ' + [node-url] 'Node JSON-RPC endpoint, default \"http:://localhost:9933\"' + "), ]) } @@ -384,6 +394,24 @@ where print_extrinsic(extrinsic); } + ("insert", Some(matches)) => { + let suri = get_uri("suri", &matches)?; + let pair = read_pair::(Some(&suri), password)?; + let node_url = matches.value_of("node-url").unwrap_or("http://localhost:9933"); + let key_type = matches.value_of("key-type").ok_or(Error::Static("Key type id is required"))?; + + // Just checking + let _key_type_id = sp_core::crypto::KeyTypeId::try_from(key_type) + .map_err(|_| Error::Static("Cannot convert argument to keytype: argument should be 4-character string"))?; + + let rpc = rpc::RpcClient::new(node_url.to_string()); + + rpc.insert_key( + key_type.to_string(), + suri, + sp_core::Bytes(pair.public().as_ref().to_vec()), + ); + } _ => print_usage(&matches), } diff --git a/bin/utils/subkey/src/rpc.rs b/bin/utils/subkey/src/rpc.rs new file mode 100644 index 0000000000..1b8e46315c --- /dev/null +++ b/bin/utils/subkey/src/rpc.rs @@ -0,0 +1,49 @@ +// 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 . + +//! Helper to run commands against current node RPC + +use futures::Future; +use hyper::rt; +use node_primitives::Hash; +use sc_rpc::author::AuthorClient; +use jsonrpc_core_client::transports::http; +use sp_core::Bytes; + +pub struct RpcClient { url: String } + +impl RpcClient { + pub fn new(url: String) -> Self { Self { url } } + + pub fn insert_key( + &self, + key_type: String, + suri: String, + public: Bytes, + ) { + let url = self.url.clone(); + + rt::run( + http::connect(&url) + .and_then(|client: AuthorClient| { + client.insert_key(key_type, suri, public).map(|_| ()) + }) + .map_err(|e| { + println!("Error inserting key: {:?}", e); + }) + ); + } +} -- GitLab From 93569d0d1af7aa5eb67b9de8b58d7fffde63b421 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 2 Jan 2020 20:37:42 +0300 Subject: [PATCH 038/296] Update libp2p to fix build (#4522) * update libp2p * update toml files also --- Cargo.lock | 98 +++++++++++++------------- bin/node/cli/Cargo.toml | 2 +- client/authority-discovery/Cargo.toml | 2 +- client/network-gossip/Cargo.toml | 2 +- client/network/Cargo.toml | 2 +- client/network/test/Cargo.toml | 2 +- client/peerset/Cargo.toml | 2 +- client/telemetry/Cargo.toml | 2 +- primitives/consensus/common/Cargo.toml | 2 +- 9 files changed, 57 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e53a3e440e..5113c6a5ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2310,25 +2310,25 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.13.1" +version = "0.13.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.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core-derive 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-deflate 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-dns 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-mdns 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-mplex 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-ping 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-tcp 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-uds 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2347,7 +2347,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2396,7 +2396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2406,14 +2406,14 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2421,7 +2421,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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2431,12 +2431,12 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.13.1" +version = "0.13.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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2450,7 +2450,7 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2458,7 +2458,7 @@ dependencies = [ "either 1.5.3 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2483,7 +2483,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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2505,7 +2505,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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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)", @@ -2515,14 +2515,14 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.11.0" +version = "0.11.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)", "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2540,7 +2540,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)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2552,12 +2552,12 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.13.0" +version = "0.13.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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.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)", @@ -2567,7 +2567,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.13.0" +version = "0.13.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)", @@ -2577,7 +2577,7 @@ dependencies = [ "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2600,7 +2600,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2616,7 +2616,7 @@ dependencies = [ "futures 0.1.29 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2629,7 +2629,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2641,7 +2641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2655,7 +2655,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)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2672,7 +2672,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3007,7 +3007,7 @@ dependencies = [ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", @@ -4930,7 +4930,7 @@ dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5433,7 +5433,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5477,7 +5477,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5493,7 +5493,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5549,7 +5549,7 @@ name = "sc-peerset" version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5728,7 +5728,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6210,7 +6210,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7479,7 +7479,7 @@ name = "twox-hash" version = "1.5.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.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8376,20 +8376,20 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" "checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -"checksum libp2p 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fab3090cd3af0f0ff5e6c2cc0f6fe6607e9f9282680cf7cd3bdd4cda38ea722" -"checksum libp2p-core 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4a3def059145c191b6975e51784d5edc59e77e1ed5b25402fccac704dd7731f3" +"checksum libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4674c6738fdd8b1cf7104dd046abcef78dc932fe25f8eb40f3a8e71341717d" +"checksum libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "01efc769c392d0d8863a7160d266f9b9f794968554f87490c8af4aa34ccaa94f" "checksum libp2p-core-derive 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eeb2704ac14c60f31967e351ed928b848526a5fc6db4104520020665012826f" "checksum libp2p-deflate 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef2b0bf5d37692ac90e2bffa436bec26c0b0def6c0cab7ea85ff67a353d58aaa" "checksum libp2p-dns 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3175fb0fc9016c95c8517a297bbdb5fb6bfbd5665bacd2eb23495d1cbdeb033" -"checksum libp2p-floodsub 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92c11b95281e8cb87eb83c204b3ca4988fa665ed9351199b5bcc323056f49816" -"checksum libp2p-identify 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4e4b0b4bcf410f77361b08335022d5705df34970dc1744ff58d4bb902309547" -"checksum libp2p-kad 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fd25360fc12b23edb1ed13f73426325a38d32e0927a46fec26ddb6873d7644d" +"checksum libp2p-floodsub 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b360bbaad2560d6b8a905bd63528273d933fe54475a44def47f31e23108b3683" +"checksum libp2p-identify 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c087bcd044a6f67a994573a92a109487a902a31555e4e63bcc4ae144c45594fe" +"checksum libp2p-kad 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dcaf76a5b33b6c0203e85d450ae1855cae6860dc82eb0174ac1fee8bf68f7af5" "checksum libp2p-mdns 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c4c2e225a7dfc571c3ad77a0a5ecccc9537afe42d72289ac9f19768567cd677d" "checksum libp2p-mplex 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2fe584816d993dc0f893396521a3c93191d78a6f28a892b150baa714a12c3e5" -"checksum libp2p-noise 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a30ec2640262a7ad6b1a8b28f6cd8281e620a6802f700adf9ff26e61487c333a" +"checksum libp2p-noise 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d50494fcba7cdab08390d72b3cb9d2c72fcf178e6a0c1043855ab259d818b972" "checksum libp2p-ping 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5b975ad345eb9bb29ddc64670664a50a8ab3e66e28357abb0f83cfc0a9ca2d78" -"checksum libp2p-plaintext 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4fe82189f5c20e8f0a11deaa04d492703c501cefd2428ad68f4f64aefab76f" -"checksum libp2p-secio 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee09e259ceb7633a52fd17f187bedf94e3545b1746487beedbd3a0a07d99817" +"checksum libp2p-plaintext 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f07be6983e1c00e8f6a5676da54ed3a8cae7fb50f1fb6ea163414613ca656cc" +"checksum libp2p-secio 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04aa6d67a5fb2b36241a1ba54037a13deb2594cf141e43b597ce379521d530a8" "checksum libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd55bc9f5f9eac2bb1ff24ca3c8a655810a566ac38c7a6ee1f30aced5a62905b" "checksum libp2p-tcp 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "234a7093d05651ab5630db926a4a42ca8978a65bab8c27c2ce2b66b200c76989" "checksum libp2p-uds 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e2fe0648967da3e56e4a55055c857c8c48326b66be0047d0e04c8ca60d34630" diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 47efe3c702..ca12f41b01 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -87,7 +87,7 @@ ctrlc = { version = "3.1.3", features = ["termination"], optional = true } node-transaction-factory = { version = "2.0.0", optional = true, path = "../transaction-factory" } # WASM-specific dependencies -libp2p = { version = "0.13.0", default-features = false, optional = true } +libp2p = { version = "0.13.2", default-features = false, optional = true } clear_on_drop = { version = "0.2.3", features = ["no_cc"], optional = true } # Imported just for the `no_cc` feature console_error_panic_hook = { version = "0.1.1", optional = true } console_log = { version = "0.1.2", optional = true } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 3564ad477d..fc1ac95785 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -17,7 +17,7 @@ derive_more = "0.99.2" futures = "0.3.1" futures-timer = "2.0" sc-keystore = { version = "2.0.0", path = "../keystore" } -libp2p = { version = "0.13.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.13.2", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" sc-network = { version = "0.8", path = "../network" } sp-core = { version = "2.0.0", path = "../../primitives/core" } diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 79246151c3..e5df654a03 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -12,7 +12,7 @@ futures01 = { package = "futures", version = "0.1.29" } futures = { version = "0.3.1", features = ["compat"] } futures-timer = "0.4.0" lru = "0.1.2" -libp2p = { version = "0.13.0", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } sc-network = { version = "0.8", path = "../network" } parking_lot = "0.9.0" sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 73b180b780..e143806414 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -22,7 +22,7 @@ linked_hash_set = "0.1.3" lru = "0.4.0" rustc-hex = "2.0.1" rand = "0.7.2" -libp2p = { version = "0.13.0", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } sc-client = { version = "2.0.0", path = "../" } diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index c935843d77..1d37196724 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -14,7 +14,7 @@ futures = "0.1.29" futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } futures-timer = "0.4.0" rand = "0.7.2" -libp2p = { version = "0.13.0", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } sc-client = { version = "2.0.0", path = "../../" } sc-client-api = { version = "2.0.0", path = "../../api" } diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index 31de04c497..7a8607daee 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" [dependencies] futures = "0.3.1" -libp2p = { version = "0.13.0", default-features = false } +libp2p = { version = "0.13.2", default-features = false } log = "0.4.8" serde_json = "1.0.41" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 0fdacc5d79..6163e90581 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -11,7 +11,7 @@ parking_lot = "0.9.0" futures01 = { package = "futures", version = "0.1" } futures = { version = "0.3.1", features = ["compat"] } futures-timer = "2.0.0" -libp2p = { version = "0.13.0", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } log = "0.4.8" rand = "0.7.2" serde = { version = "1.0.101", features = ["derive"] } diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 768552a8ed..c781ce2100 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] derive_more = "0.99.2" -libp2p = { version = "0.13.0", default-features = false } +libp2p = { version = "0.13.2", default-features = false } log = "0.4.8" sp-core = { path= "../../core" } sp-inherents = { version = "2.0.0", path = "../../inherents" } -- GitLab From 63c5d049b822743c81f553e0b0a8565396c7965d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 2 Jan 2020 20:10:20 +0100 Subject: [PATCH 039/296] Check for invalid modules when registering a pallet in construct_runtime (#4520) --- bin/node-template/runtime/src/lib.rs | 2 +- bin/node/runtime/src/lib.rs | 6 ++-- frame/elections/src/mock.rs | 2 +- frame/support/procedural/Cargo.toml | 1 - .../procedural/src/construct_runtime/parse.rs | 36 +++++++++++++------ 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 60d8b7485d..8580bfd895 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -251,7 +251,7 @@ construct_runtime!( Aura: aura::{Module, Config, Inherent(Timestamp)}, Grandpa: grandpa::{Module, Call, Storage, Config, Event}, Indices: indices, - Balances: balances::{default, Error}, + Balances: balances, TransactionPayment: transaction_payment::{Module, Storage}, Sudo: sudo, // Used for the module template in `./template.rs` diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 679bad2371..7a8ba7613b 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -527,14 +527,14 @@ construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: frame_system::{Module, Call, Storage, Config, Event}, - Utility: pallet_utility::{Module, Call, Storage, Event, Error}, + Utility: pallet_utility::{Module, Call, Storage, Event}, Babe: pallet_babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, Authorship: pallet_authorship::{Module, Call, Storage, Inherent}, Indices: pallet_indices, - Balances: pallet_balances::{default, Error}, + Balances: pallet_balances, TransactionPayment: pallet_transaction_payment::{Module, Storage}, - Staking: pallet_staking::{default, OfflineWorker}, + Staking: pallet_staking, Session: pallet_session::{Module, Call, Storage, Event, Config}, Democracy: pallet_democracy::{Module, Call, Storage, Config, Event}, Council: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, diff --git a/frame/elections/src/mock.rs b/frame/elections/src/mock.rs index c53789f7ad..93efb71355 100644 --- a/frame/elections/src/mock.rs +++ b/frame/elections/src/mock.rs @@ -154,7 +154,7 @@ frame_support::construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: system::{Module, Call, Event}, - Balances: pallet_balances::{Module, Call, Event, Config, Error}, + Balances: pallet_balances::{Module, Call, Event, Config}, Elections: elections::{Module, Call, Event, Config}, } ); diff --git a/frame/support/procedural/Cargo.toml b/frame/support/procedural/Cargo.toml index 9280289028..321002e08b 100644 --- a/frame/support/procedural/Cargo.toml +++ b/frame/support/procedural/Cargo.toml @@ -9,7 +9,6 @@ proc-macro = true [dependencies] frame-support-procedural-tools = { version = "2.0.0", path = "./tools" } - proc-macro2 = "1.0.6" quote = "1.0.2" syn = { version = "1.0.7", features = ["full"] } diff --git a/frame/support/procedural/src/construct_runtime/parse.rs b/frame/support/procedural/src/construct_runtime/parse.rs index 84ac6573c6..14dd18cb06 100644 --- a/frame/support/procedural/src/construct_runtime/parse.rs +++ b/frame/support/procedural/src/construct_runtime/parse.rs @@ -180,8 +180,8 @@ impl Parse for ModuleDeclaration { let has_default = parts.into_iter().any(|m| m.is_default()); for entry in parts { match entry { - ModuleEntry::Part(part) if has_default => { - if part.is_included_in_default() { + ModuleEntry::Part(part) => { + if has_default && part.is_included_in_default() { let msg = format!( "`{}` is already included in `default`. Either remove `default` or remove `{}`", part.name, @@ -189,8 +189,7 @@ impl Parse for ModuleDeclaration { ); return Err(Error::new(part.name.span(), msg)); } - } - ModuleEntry::Part(part) => { + if !resolved.insert(part.name.clone()) { let msg = format!( "`{}` was already declared before. Please remove the duplicate declaration", @@ -287,7 +286,18 @@ pub struct ModulePart { impl Parse for ModulePart { fn parse(input: ParseStream) -> Result { - let name = input.parse()?; + let name: Ident = input.parse()?; + + if !ModulePart::all_allowed().iter().any(|n| name == n) { + return Err(syn::Error::new( + name.span(), + format!( + "Only the following modules are allowed: {}", + ModulePart::format_names(ModulePart::all_allowed()), + ), + )) + } + let generics: syn::Generics = input.parse()?; if !generics.params.is_empty() && !Self::is_allowed_generic(&name) { let valid_generics = ModulePart::format_names(ModulePart::allowed_generics()); @@ -313,6 +323,7 @@ impl Parse for ModulePart { } else { None }; + Ok(Self { name, generics, @@ -330,15 +341,20 @@ impl ModulePart { Self::allowed_args().into_iter().any(|n| ident == n) } - pub fn allowed_generics() -> Vec<&'static str> { - vec!["Event", "Origin", "Config"] + pub fn allowed_generics() -> &'static [&'static str] { + &["Event", "Origin", "Config"] + } + + pub fn allowed_args() -> &'static [&'static str] { + &["Inherent"] } - pub fn allowed_args() -> Vec<&'static str> { - vec!["Inherent"] + /// Returns all allowed names for module parts. + pub fn all_allowed() -> &'static [&'static str] { + &["Module", "Call", "Storage", "Event", "Config", "Origin", "Inherent", "ValidateUnsigned"] } - pub fn format_names(names: Vec<&'static str>) -> String { + pub fn format_names(names: &[&'static str]) -> String { let res: Vec<_> = names.into_iter().map(|s| format!("`{}`", s)).collect(); res.join(", ") } -- GitLab From 4119391c5267a6ca96ad73708f915a4970915027 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 3 Jan 2020 11:47:31 +0100 Subject: [PATCH 040/296] ServerToWorkerMsg -> ServiceToWorkerMsg (#4519) --- client/network/src/service.rs | 56 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 9f080b58c9..8db2bf0ee0 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -114,7 +114,7 @@ pub struct NetworkService, H: E /// nodes it should be connected to or not. peerset: PeersetHandle, /// Channel that sends messages to the actual worker. - to_worker: mpsc::UnboundedSender>, + to_worker: mpsc::UnboundedSender>, /// Marker to pin the `H` generic. Serves no purpose except to not break backwards /// compatibility. _marker: PhantomData, @@ -434,7 +434,7 @@ impl, H: ExHashT> NetworkServic /// The protocol must have been registered with `register_notifications_protocol`. /// pub fn write_notification(&self, target: PeerId, engine_id: ConsensusEngineId, message: Vec) { - let _ = self.to_worker.unbounded_send(ServerToWorkerMsg::WriteNotification { + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::WriteNotification { target, engine_id, message, @@ -449,7 +449,7 @@ impl, H: ExHashT> NetworkServic pub fn event_stream(&self) -> impl Stream { // Note: when transitioning to stable futures, remove the `Error` entirely let (tx, rx) = mpsc::unbounded(); - let _ = self.to_worker.unbounded_send(ServerToWorkerMsg::EventStream(tx)); + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::EventStream(tx)); rx } @@ -466,7 +466,7 @@ impl, H: ExHashT> NetworkServic &self, engine_id: ConsensusEngineId, ) { - let _ = self.to_worker.unbounded_send(ServerToWorkerMsg::RegisterNotifProtocol { + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::RegisterNotifProtocol { engine_id, }); } @@ -476,7 +476,7 @@ impl, H: ExHashT> NetworkServic /// The latest transactions will be fetched from the `TransactionPool` that was passed at /// initialization as part of the configuration. pub fn trigger_repropagate(&self) { - let _ = self.to_worker.unbounded_send(ServerToWorkerMsg::PropagateExtrinsics); + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::PropagateExtrinsics); } /// Make sure an important block is propagated to peers. @@ -484,7 +484,7 @@ impl, H: ExHashT> NetworkServic /// In chain-based consensus, we often need to make sure non-best forks are /// at least temporarily synced. This function forces such an announcement. pub fn announce_block(&self, hash: B::Hash, data: Vec) { - let _ = self.to_worker.unbounded_send(ServerToWorkerMsg::AnnounceBlock(hash, data)); + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::AnnounceBlock(hash, data)); } /// Report a given peer as either beneficial (+) or costly (-) according to the @@ -497,7 +497,7 @@ impl, H: ExHashT> NetworkServic /// /// This triggers the same effects as if the connection had closed itself spontaneously. pub fn disconnect_peer(&self, who: PeerId) { - let _ = self.to_worker.unbounded_send(ServerToWorkerMsg::DisconnectPeer(who)); + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::DisconnectPeer(who)); } /// Request a justification for the given block from the network. @@ -507,7 +507,7 @@ impl, H: ExHashT> NetworkServic pub fn request_justification(&self, hash: &B::Hash, number: NumberFor) { let _ = self .to_worker - .unbounded_send(ServerToWorkerMsg::RequestJustification(hash.clone(), number)); + .unbounded_send(ServiceToWorkerMsg::RequestJustification(hash.clone(), number)); } /// Execute a closure with the chain-specific network specialization. @@ -516,7 +516,7 @@ impl, H: ExHashT> NetworkServic { let _ = self .to_worker - .unbounded_send(ServerToWorkerMsg::ExecuteWithSpec(Box::new(f))); + .unbounded_send(ServiceToWorkerMsg::ExecuteWithSpec(Box::new(f))); } /// Are we in the process of downloading the chain? @@ -531,7 +531,7 @@ impl, H: ExHashT> NetworkServic pub fn get_value(&self, key: &record::Key) { let _ = self .to_worker - .unbounded_send(ServerToWorkerMsg::GetValue(key.clone())); + .unbounded_send(ServiceToWorkerMsg::GetValue(key.clone())); } /// Start putting a value in the DHT. @@ -541,7 +541,7 @@ impl, H: ExHashT> NetworkServic pub fn put_value(&self, key: record::Key, value: Vec) { let _ = self .to_worker - .unbounded_send(ServerToWorkerMsg::PutValue(key, value)); + .unbounded_send(ServiceToWorkerMsg::PutValue(key, value)); } /// Connect to unreserved peers and allow unreserved peers to connect. @@ -566,7 +566,7 @@ impl, H: ExHashT> NetworkServic self.peerset.add_reserved_peer(peer_id.clone()); let _ = self .to_worker - .unbounded_send(ServerToWorkerMsg::AddKnownAddress(peer_id, addr)); + .unbounded_send(ServiceToWorkerMsg::AddKnownAddress(peer_id, addr)); Ok(()) } @@ -579,7 +579,7 @@ impl, H: ExHashT> NetworkServic pub fn set_sync_fork_request(&self, peers: Vec, hash: B::Hash, number: NumberFor) { let _ = self .to_worker - .unbounded_send(ServerToWorkerMsg::SyncFork(peers, hash, number)); + .unbounded_send(ServiceToWorkerMsg::SyncFork(peers, hash, number)); } /// Modify a peerset priority group. @@ -594,7 +594,7 @@ impl, H: ExHashT> NetworkServic for (peer_id, addr) in peers.into_iter() { let _ = self .to_worker - .unbounded_send(ServerToWorkerMsg::AddKnownAddress(peer_id, addr)); + .unbounded_send(ServiceToWorkerMsg::AddKnownAddress(peer_id, addr)); } Ok(()) @@ -659,7 +659,7 @@ impl NetworkStateInfo for NetworkService /// Messages sent from the `NetworkService` to the `NetworkWorker`. /// /// Each entry corresponds to a method of `NetworkService`. -enum ServerToWorkerMsg> { +enum ServiceToWorkerMsg> { PropagateExtrinsics, RequestJustification(B::Hash, NumberFor), AnnounceBlock(B::Hash, Vec), @@ -698,7 +698,7 @@ pub struct NetworkWorker, H: Ex /// The import queue that was passed as initialization. import_queue: Box>, /// Messages from the `NetworkService` and that must be processed. - from_worker: mpsc::UnboundedReceiver>, + from_worker: mpsc::UnboundedReceiver>, /// Receiver for queries from the light client that must be processed. light_client_rqs: Option>>, /// Senders for events that happen on the network. @@ -734,36 +734,36 @@ impl, H: ExHashT> Future for Ne }; match msg { - ServerToWorkerMsg::ExecuteWithSpec(task) => { + ServiceToWorkerMsg::ExecuteWithSpec(task) => { let protocol = self.network_service.user_protocol_mut(); let (mut context, spec) = protocol.specialization_lock(); task(spec, &mut context); }, - ServerToWorkerMsg::AnnounceBlock(hash, data) => + ServiceToWorkerMsg::AnnounceBlock(hash, data) => self.network_service.user_protocol_mut().announce_block(hash, data), - ServerToWorkerMsg::RequestJustification(hash, number) => + ServiceToWorkerMsg::RequestJustification(hash, number) => self.network_service.user_protocol_mut().request_justification(&hash, number), - ServerToWorkerMsg::PropagateExtrinsics => + ServiceToWorkerMsg::PropagateExtrinsics => self.network_service.user_protocol_mut().propagate_extrinsics(), - ServerToWorkerMsg::GetValue(key) => + ServiceToWorkerMsg::GetValue(key) => self.network_service.get_value(&key), - ServerToWorkerMsg::PutValue(key, value) => + ServiceToWorkerMsg::PutValue(key, value) => self.network_service.put_value(key, value), - ServerToWorkerMsg::AddKnownAddress(peer_id, addr) => + ServiceToWorkerMsg::AddKnownAddress(peer_id, addr) => self.network_service.add_known_address(peer_id, addr), - ServerToWorkerMsg::SyncFork(peer_ids, hash, number) => + ServiceToWorkerMsg::SyncFork(peer_ids, hash, number) => self.network_service.user_protocol_mut().set_sync_fork_request(peer_ids, &hash, number), - ServerToWorkerMsg::EventStream(sender) => + ServiceToWorkerMsg::EventStream(sender) => self.event_streams.push(sender), - ServerToWorkerMsg::WriteNotification { message, engine_id, target } => + ServiceToWorkerMsg::WriteNotification { message, engine_id, target } => self.network_service.user_protocol_mut().write_notification(target, engine_id, message), - ServerToWorkerMsg::RegisterNotifProtocol { engine_id } => { + ServiceToWorkerMsg::RegisterNotifProtocol { engine_id } => { let events = self.network_service.user_protocol_mut().register_notifications_protocol(engine_id); for event in events { self.event_streams.retain(|sender| sender.unbounded_send(event.clone()).is_ok()); } }, - ServerToWorkerMsg::DisconnectPeer(who) => + ServiceToWorkerMsg::DisconnectPeer(who) => self.network_service.user_protocol_mut().disconnect_peer(&who), } } -- GitLab From b94464fb8ee3f72404de08e1589c552822da8d39 Mon Sep 17 00:00:00 2001 From: ddorgan Date: Fri, 3 Jan 2020 12:25:31 +0100 Subject: [PATCH 041/296] Update flamingfir spec for new testnet (#4518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- bin/node/cli/res/flaming-fir.json | 231 ++++++++++++++++-------------- 1 file changed, 121 insertions(+), 110 deletions(-) diff --git a/bin/node/cli/res/flaming-fir.json b/bin/node/cli/res/flaming-fir.json index 1e7d4424b5..401825b4a6 100644 --- a/bin/node/cli/res/flaming-fir.json +++ b/bin/node/cli/res/flaming-fir.json @@ -1,111 +1,122 @@ { - "name": "Flaming Fir", - "id": "flaming-fir", - "properties": { - "tokenDecimals": 15, - "tokenSymbol": "FIR" - }, - "bootNodes": [ - "/ip4/35.246.224.91/tcp/30333/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", - "/ip4/35.246.224.91/tcp/30334/ws/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", - "/ip4/35.246.210.11/tcp/30333/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", - "/ip4/35.246.210.11/tcp/30334/ws/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", - "/ip4/35.198.110.45/tcp/30333/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", - "/ip4/35.198.110.45/tcp/30334/ws/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", - "/ip4/35.198.114.154/tcp/30333/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6", - "/ip4/35.198.114.154/tcp/30334/ws/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6" - ], - "telemetryEndpoints": [ - ["wss://telemetry.polkadot.io/submit/", 0] - ], - "protocolId": "fir2", - "consensusEngine": null, - "genesis": { - "raw": [ - { - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b6579730a299be621974fd19374a88f1dddd8442b21db25d2c923907dda6af815b657fe": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0xf6ffc06ff28623000000000000000000", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b6579731143fa96e07eb73af3db3a1b057d18899f864e6fc5d2f905f9296ca641565564": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797397dddc7aba561f16ac00da4bae75ab812aa7b81418bebdab74425f0d6aa31cee": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", - "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797340944475c781bbdc9726766a78b1964888e039600b1c865c62586ab8f98c171e": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", - "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", - "0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809", - "0xaf837bb0dec545e1b97d62ed037898d1": "0x1000299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", - "0xe026dd082e3158e72eb7c985fc8bac4f": "0x80700000", - "0xb49a6659ec27619e87dd18e11b6838c0": "0x00", - "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797399a2fc4b1339e668345bac7e1aadd1a834b90939a4ea40b64f30433a1d475817": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b6579732c1312343dce08149336968907c27cc602536aaf7a2b105d6fa07058a3803d31": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0x72143961950b9317e15506626c4524c4": "0x1000299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", - "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973dc4036f96ca26a30da6d8637ca1431896c1069bf172c419e98dc08109e7b23b5": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", - "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", - "0x90e2849b965314409e8bc00011f3004f": "0x04000000", - "0x52b963fbdb3d6e1b03808fc20071f07f": "0x004e0c00", - "0x87e6cbd186029472cea8c1748f99126b": "0x00000000", - "0x717a2ee9c64ad3424e10e4461ec08296": "0x0000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000008700000000000000af0000000000000001000000000000000100000000000000040000000000010010000000004000000020000000", - "0xeecb67c20ca6cc8ba4d4434687f61309": "0x103919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef01000000000000005633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce44001000000000000007932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f01000000000000009becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993320100000000000000", - "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", - "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0ff6ffc06ff286230ff6ffc06ff2862300", - "0xfacbe054606f2488121046f9c5539d98": "0x00", - "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", - "0xc1bc13c775b3406279618b05c28523cb": "0x00", - "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b657973711590f60a214f6f06502eb29dd14f55aa04e72e2fa12c098ba4fa5a00c57fa9": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e", - "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", - "0x579ab55d37b1220812be3c3df29d4858": "0x00000000", - "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff0f", - "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973be035f25cd43adc80f1dcf505f5ffd158d1592ab3719f354a256a4c3b7571934": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", - "0x1ba14d232d3c301a93e35f55e3d7aef2d98dbb9cc0ce48f457b81b421e0f704d": "0x0000c16ff28623000000000000000000", - "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", - "0xa978690c6b811e943721dbb6cb9b6246": "0x0000000000000000", - "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", - "0x8cb577756012d928f17362e0741f9f2c": "0x01000000", - "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", - "0x637414312dac3b280120bf15b4f66cee": "0x00000000", - "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", - "0x3a636f6465": "0x0061736d01000000019f022660037f7f7f017f60027f7f017f60027f7f0060017f0060057f7f7f7f7f0060037f7f7f0060047f7f7f7f0060017f017e60057f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60017e0060067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f6000017f60077f7f7f7f7f7f7f017f60017f017f60027f7f017e60000060037e7f7f017f60047f7f7e7e0060077f7f7e7e7f7f7f0060087f7f7f7f7f7e7e7f0060057f7f7f7e7e0060077f7f7f7e7e7f7f0060037f7e7e0060057f7f7e7e7f0060077f7e7e7f7f7f7f0060067f7f7e7e7f7f0060077f7f7f7f7f7e7e0060047f7f7f7f017e6000017e60077f7f7f7e7e7e7f0060067f7f7f7e7e7f0060037f7e7f0060047f7e7e7f0060057f7e7e7e7e0060067f7e7e7e7e7f0002af082803656e760e6578745f626c616b65325f323536000503656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000803656e76176578745f636c6561725f6368696c645f73746f72616765000603656e76146578745f6765745f73746f726167655f696e746f000803656e76166578745f6b696c6c5f6368696c645f73746f72616765000203656e76156578745f7365745f6368696c645f73746f72616765000903656e76196578745f6765745f616c6c6f63617465645f73746f72616765000003656e760f6578745f7365745f73746f72616765000603656e760c6578745f74776f785f313238000503656e76116578745f636c6561725f73746f72616765000203656e76126578745f737232353531395f766572696679000a03656e760e6578745f7072696e745f75746638000203656e760d6578745f7072696e745f6e756d000b03656e76166578745f6368696c645f73746f726167655f726f6f74000003656e76106578745f636c6561725f707265666978000203656e76166578745f73616e64626f785f6d656d6f72795f6e6577000103656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000303656e76176578745f73616e64626f785f696e7374616e7469617465000c03656e76126578745f73616e64626f785f696e766f6b65000d03656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000303656e76106578745f73746f726167655f726f6f74000303656e76186578745f73746f726167655f6368616e6765735f726f6f74000003656e76126578745f656432353531395f766572696679000a03656e76166578745f73616e64626f785f6d656d6f72795f676574000a03656e76166578745f73616e64626f785f6d656d6f72795f736574000a03656e760d6578745f7072696e745f686578000203656e76106578745f69735f76616c696461746f72000e03656e76156578745f6c6f63616c5f73746f726167655f676574000a03656e76216578745f6c6f63616c5f73746f726167655f636f6d706172655f616e645f736574000f03656e76116578745f6e6574776f726b5f7374617465001003656e76106578745f737232353531395f7369676e000803656e76166578745f7375626d69745f7472616e73616374696f6e000103656e76156578745f6c6f63616c5f73746f726167655f736574000403656e76146578745f656432353531395f67656e6572617465000603656e76146578745f737232353531395f67656e6572617465000603656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000603656e760a6578745f6d616c6c6f63001003656e76086578745f66726565000303656e76176578745f737232353531395f7075626c69635f6b657973000103656e760b6578745f74776f785f3634000503fd04fb0410100303000010101112030205001202060001010201021303070c0a0200060101011001010101010201060305030001010001010800010001010101010102030203030202020202020203020202020202020202020202020202020502020202050304050205010205020202140303020e02020303030202020201020102020405020202020202020202030202150101160509021706030505180602030202020205050505000314141212030212120501030303030303030303030303030303020202020202020502020202051202020303120e050502020502141406060505050502020205171919120503020302031a02020202021b020303030203140303051c1905050202020502050201010303020202020503020203020202060605030302020302020202020202021d0206030302020303030205020503030302020202020312020206020202030202050205060202051206090606060606060606060606060606060606060606060606061e02020203030203021f1203020302020505020203030302020203030202030303050510120202020202120202030202031010020202040302060202020303030203030202010a020202020202030b03030202030202020202020202020220030321060202020102010602030505020202030302021111021111050202111111021111110511031111111111111111030303030202020202020202030214020204020303020202020302020202020a0101010101010102010101010102010105020102050503050202010101050501010205050405220202020505040202050303030302020204020201050102060501050606050501040405050505060303010101000000002323242424250407017001de01de0105030100120619037f01418080c0000b7f004188b1c6000b7f004188b1c6000b078d0518066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000a5f5f646174615f656e6403010b5f5f686561705f62617365030209686173685f7465737400300c436f72655f76657273696f6e008c0412436f72655f657865637574655f626c6f636b008d0415436f72655f696e697469616c697a655f626c6f636b008f04114d657461646174615f6d657461646174610090041c426c6f636b4275696c6465725f6170706c795f65787472696e7369630094041b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00950420426c6f636b4275696c6465725f696e686572656e745f65787472696e736963730096041c426c6f636b4275696c6465725f636865636b5f696e686572656e747300980418426c6f636b4275696c6465725f72616e646f6d5f736565640099042b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e009a04214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572009c041e4772616e6470614170695f6772616e6470615f617574686f726974696573009e0415426162654170695f636f6e66696775726174696f6e009f0421417574686f72697479446973636f766572794170695f617574686f72697469657300a0041a417574686f72697479446973636f766572794170695f7369676e00a1041c417574686f72697479446973636f766572794170695f76657269667900a2041d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e636500a30411436f6e7472616374734170695f63616c6c00a4042153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b65797300a50409a403010041010bdd013d4c5147e50448495ea201a401fd02ff0280038103820383038403850386038703880389038a038b038c038d038e038f0390039103920393039403950396039703d801ca04d0048605d2048205e604d804e204d4044f8c05d10497059405393a3b8901644155565758595a5b6160636566678a018b018d018e01900192014e4d9d03be04b301be01a701bf01a801b601c001bb01f20262ad03ac03d901b103a203a403d503d403d6039c039b03c403da01a202a002db01a402a904a804dc01b204dc02db02dd01dd02ba04b904de01bf04b603b503df01b703c802c702e001cb02d903d803e101b602b702d802d702e201e302e202e301e402e703e603e401ea0389048804e501a702a602e601b201e701a302cd02ef03f003c902b402b502b902b802ca02bb04d202d102d002cf02ce02cc02f303d902ac04de02e802e702e502f602f402f702f302f502a303a603a503b003af03ae03d703e903e803f403f203f103ee03ed03ec03eb038a04af04ae04ad04ab04aa04b304bd04bc04c304c204c104c004cc04ce04cb04c904c704c804cf04e104d5049505980596050ac3c540fb040600200010290b0600200010240b06002000102b0b0600200010250b0a00200020012002102d0b2801017f0240200210242203450d002003200020022001200120024b1b109a051a200010250b20030b06002000102f0b1c01017f0240200010242201450d002001410020001099051a0b20010bfa0202017f037e230041206b220224002001ad42adfed5e4d485fda8d8007e42c3007c210302400240024002400240200141084b0d00200141014b0d0120010d02420021040c030b0240200141104b0d00200241106a2000290000200385420042adfed5e4d485fda8d8004200109f05200241186a29030020022903107c200120006a41786a2900008521040c040b200120006a41786a2900002105200321040340200029000020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e2003852103200041086a2100200442cf829ebbefefde82147c2104200141786a220141084b0d000b200320058521040c030b0240200141034b0d00200120006a417e6a33000042108620003300008420038521040c030b200120006a417c6a35000042208620003500008420038521040c020b200031000021040b200420038521040b20022004420042adfed5e4d485fda8d8004200109f05200241086a290300210420022903002103200241206a2400200420037c0b0a00418080c0001032000b5b02017f037e230041306b220124002000290208210220002902102103200029020021042001420437031020014201370204200120043703182001200141186a36020020012003370328200120023703202001200141206a103e000b870301067f230041306b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b024002400240024002400240200141146a2802000d00200621070c010b024020040d0041ac80c000410041001034000b024002402006410f4b0d002003280204450d010b200620066a220720064f0d010b4101210541002107200241086a21060c010b2007417f4c0d01200241086a2106024020070d0041012105410021070c010b200710282205450d020b200241003602102002200736020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a29020037030020022001290200370318200241146a41bc80c000200241186a10350d0220002006290200370200200041086a200641086a280200360200200241306a24000f0b1036000b200741011037000b41d480c0004133200241186a418881c0001038000b6c01017f230041306b2203240020032002360204200320013602002003411c6a41023602002003412c6a41013602002003420237020c200341e883c000360208200341013602242003200341206a360218200320033602282003200341046a360220200341086a2000103e000bbd0801087f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a36020020034280808080800437030820032000360220410021062003410036021820034100360210200320053602302003200536022802400240024002400240200228020822070d0020022802002108200228020422092004200420094b1b220a450d0141012104200020082802002008280204200128020c1100000d04200841086a210241012106034002402005280200200341086a200541046a280200110100450d00410121040c060b2006200a4f0d02200241046a210020022802002101200541086a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110000450d000c050b0b20022802002108200228020422092002410c6a2802002205200520094b1b220a450d0041012104200020082802002008280204200128020c1100000d03200741106a2105200841086a21024101210603402003200541786a28020036020c2003200541106a2d00003a003820032005417c6a28020036020841002101410021040240024002400240200541086a2802000e0400010203000b2005410c6a2802002100410121040c020b02402005410c6a2802002207200328023422044f0d0041002104200328023020074103746a22072802044102470d0220072802002802002100410121040c020b41a089c000200720041034000b4100210420032802282207200328022c460d002003200741086a3602284100210420072802044102470d0020072802002802002100410121040b2003200036021420032004360210024002400240024002400240024020052802000e0404010006040b20032802282200200328022c470d010c050b200541046a2802002200200328023422044f0d01200328023020004103746a22002802044102470d04200028020028020021040c030b2003200041086a36022820002802044102470d03200028020028020021040c020b41a089c000200020041034000b200541046a28020021040b410121010b2003200436021c2003200136021802400240200541706a2802004101460d0020032802282204200328022c460d042003200441086a3602280c010b200541746a2802002204200328023422004f0d04200328023020044103746a21040b02402004280200200341086a200441046a280200110100450d00410121040c050b2006200a4f0d01200241046a210020022802002101200541246a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110000450d000c040b0b0240200920064d0d00410121042003280220200820064103746a22052802002005280204200328022428020c1100000d030b410021040c020b41f087c0001032000b41b089c000200420001034000b200341c0006a240020040b05001031000b0e0041a6f4c500412210e70400000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004412c6a41023602002004413c6a41033602002004420237021c200441b8c2c200360218200441043602342004200441306a3602282004200441106a3602382004200441086a360230200441186a4188afc000103e000bb10101037f0240024002400240200028020022002802042203200028020822046b2002490d00200028020021030c010b200420026a22052004490d02200341017422042005200420054b1b22044100480d020240024020030d002004102821030c010b200028020020032004102c21030b2003450d012000200436020420002003360200200028020821040b2000200420026a360208200320046a20012002109a051a41000f0b200441011037000b1031000ba70401047f230041106b220224002000280200210002400240024002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c040b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c030b0240200028020822032000280204470d00200341016a22042003490d06200341017422052004200520044b1b22044100480d060240024020030d002004102821030c010b200028020020032004102c21030b2003450d022000200436020420002003360200200028020821030b200028020020036a20013a00002000200028020841016a3602080c030b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b200441011037000b0240024020002802042204200028020822036b2001490d00200028020021040c010b200320016a22052003490d03200441017422032005200320054b1b22034100480d030240024020040d002003102821040c010b200028020020042003102c21040b2004450d022000200336020420002004360200200028020821030b2000200320016a360208200420036a2002410c6a2001109a051a0b200241106a240041000f0b200341011037000b1031000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc80c000200241086a10352101200241206a240020010b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c2002418486c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a419486c000103e000b0d00200035020041012001103f0b4702017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241f883c0003602042002410136020020021040000bd40203027f017e037f230041306b22032400412721040240024020004290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a200020004290ce0080220542f0b17f7e7ca7220741ffff037141e4006e220841017441ba84c0006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441ba84c0006a2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b02402005a7220641e3004c0d00200341096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441ba84c0006a2f00003b00000b024002402006410a480d00200341096a2004417e6a22046a200641017441ba84c0006a2f00003b00000c010b200341096a2004417f6a22046a200641306a3a00000b2002200141b8aec6004100200341096a20046a412720046b10422104200341306a240020040b6601017f230041c0006b220124002001200036020c200141346a410136020020014201370224200141b0aec6003602202001410536023c2001200141386a36023020012001410c6a360238200141106a200141206a10332001280210200128021810e70400000b0d0042c8dfc497e99ce988eb000be00501057f024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21080c010b200541016a210820002802002106412d21070b0240024020064104710d00410021020c010b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21080b410121010240024020002802084101460d00200020072002200310430d012000280218200420052000411c6a28020028020c1100000f0b02402000410c6a280200220920084b0d00200020072002200310430d012000280218200420052000411c6a28020028020c1100000f0b0240024020064108710d00200920086b210941002101024002400240410120002d0030220a200a4103461b0e0402000100020b20092101410021090c010b20094101762101200941016a41017621090b200141016a210103402001417f6a2201450d0220002802182000280204200028021c280210110100450d000b41010f0b41012101200041013a003020004130360204200020072002200310430d01200920086b210941002101024002400240410120002d0030220a200a4103461b0e0402000100020b20092101410021090c010b20094101762101200941016a41017621090b200141016a2101024003402001417f6a2201450d0120002802182000280204200028021c280210110100450d000b41010f0b2000280204210a41012101200028021820042005200028021c28020c1100000d01200941016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110100450d000c020b0b2000280204210a41012101200020072002200310430d00200028021820042005200028021c28020c1100000d00200941016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110100450d000b0b20010b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101101000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11000021040b20040b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c200241cc86c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41dc86c000103e000b8307010c7f200028021021030240024002400240200028020822044101460d0020030d012000280218200120022000411c6a28020028020c11000021030c030b2003450d010b0240024020020d00410021020c010b200120026a2105200041146a28020041016a21064100210720012103200121080340200341016a210902400240024020032c0000220a417f4a0d000240024020092005470d004100210b200521030c010b20032d0001413f71210b200341026a220921030b200a411f71210c0240200a41ff0171220a41df014b0d00200b200c41067472210a0c020b0240024020032005470d004100210d2005210e0c010b20032d0000413f71210d200341016a2209210e0b200d200b41067472210b0240200a41f0014f0d00200b200c410c7472210a0c020b02400240200e2005470d004100210a200921030c010b200e41016a2103200e2d0000413f71210a0b200b410674200c411274418080f0007172200a72220a418080c400470d020c040b200a41ff0171210a0b200921030b02402006417f6a2206450d00200720086b20036a21072003210820052003470d010c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20040d002000280218200120022000411c6a28020028020c1100000f0b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b0240200220096b200028020c2206490d002000280218200120022000411c6a28020028020c1100000f0b410021074100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a210a024002400240410020002d0030220320034103461b0e0402000100020b200a21074100210a0c010b200a4101762107200a41016a410176210a0b200741016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110100450d000b41010f0b2000280204210941012103200028021820012002200028021c28020c1100000d00200a41016a2103200028021c210a20002802182100034002402003417f6a22030d0041000f0b20002009200a280210110100450d000b41010f0b20030bcd0801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b2107418002210803400240200820014f0d00200020086a2c000041bf7f4c0d0041002105200821060c020b2008417f6a21064100210520084101460d01200720086a21092006210820094101470d000b0b200420063602142004200036021020044100410520051b36021c200441b8aec600419287c00020051b3602180240024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b200420023602202002450d0220022001460d02200141016a210903400240200220014f0d00200020026a2c000041404e0d040b2002417f6a210820024101460d0420092002462106200821022006450d000c040b0b20042002200320081b360228200441306a41146a4103360200200441c8006a41146a4104360200200441d4006a4104360200200442033702342004419887c0003602302004410136024c2004200441c8006a3602402004200441186a3602582004200441106a3602502004200441286a360248200441306a41b087c000103e000b200441e4006a4104360200200441c8006a41146a4104360200200441d4006a4101360200200441306a41146a410436020020044204370234200441c087c0003602302004410136024c2004200441c8006a3602402004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a360248200441306a41e087c000103e000b200221080b024020082001460d00410121060240024002400240200020086a22092c00002202417f4a0d0041002105200020016a220621010240200941016a2006460d00200941026a210120092d0001413f7121050b2002411f712109200241ff017141df014b0d01200520094106747221010c020b2004200241ff0171360224200441286a21020c020b4100210020062107024020012006460d00200141016a210720012d0000413f7121000b200020054106747221010240200241ff017141f0014f0d0020012009410c747221010c010b41002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d020b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441306a41146a4105360200200441ec006a4104360200200441e4006a4104360200200441c8006a41146a4106360200200441d4006a4107360200200442053702342004418888c000360230200420023602582004410136024c2004200441c8006a3602402004200441186a3602682004200441106a3602602004200441246a3602502004200441206a360248200441306a41b088c000103e000b41f087c0001032000b100020012000280200200028020410450b6c01037f230041206b22022400024020002001104b0d002001411c6a280200210320012802182104200242043703182002420137020c2002419889c00036020820042003200241086a10350d00200041046a2001104b2101200241206a240020010f0b200241206a240041010bd90a02077f017e410121020240200128021841272001411c6a2802002802101101000d0041022103024002400240024002402000280200220241776a2200411e4d0d00200241dc00470d010c020b41f40021040240024020000e1f05010202000202020202020202020202020202020202020202030202020203050b41f20021040c040b41ee0021040c030b02400240024002400240024002402002104a0d00024002400240024002400240200241808004490d00200241808008490d0120024190fc476a4190fc0b490d0a200241e28b746a41e28d2c490d0a2002419fa8746a419f18490d0a200241dee2746a410e490d0a200241feffff0071419ef00a460d0a200241a9b2756a4129490d0a200241cb91756a410a4d0d0a410121030c0e0b20024180fe0371410876210541d095c000210041002106200241ff017121040340200041026a2107200620002d000122036a2108024020002d000022002005460d00200020054b0d092008210620072100200741a296c000470d010c090b20082006490d02200841a5024b0d03200641a296c0006a2100024003402003450d012003417f6a210320002d00002106200041016a210020062004470d000c0c0b0b2008210620072100200741a296c000470d000c080b0b20024180fe0371410876210541819bc000210041002106200241ff017121040340200041026a2107200620002d000122036a2108024020002d000022002005460d00200020054b0d072008210620072100200741c79bc000470d010c070b20082006490d03200841a6014b0d04200641c79bc0006a2100024003402003450d012003417f6a210320002d00002106200041016a210020062004470d000c0b0b0b2008210620072100200741c79bc000470d000c060b0b200620081044000b200841a502103c000b200620081044000b200841a601103c000b200241017267410276410773ad4280808080d0008421090c040b200241ffff0371210441ed9cc00021034101210002400340200341016a21080240024020032d0000220641187441187522074100480d00200821030c010b20084185a0c000460d02200741ff007141087420032d0001722106200341026a21030b200420066b22044100480d032000410173210020034185a0c000470d000c030b0b41f087c0001032000b200241ffff0371210441c798c0002103410121000340200341016a21080240024020032d0000220641187441187522074100480d00200821030c010b200841819bc000460d05200741ff007141087420032d0001722106200341026a21030b200420066b22044100480d0120004101732100200341819bc000470d000b0b4101210320004101710d030b200241017267410276410773ad4280808080d0008421090b410321030c020b41f087c0001032000b0b200221040b03402003210641dc0021004101210241012103024002400240024020060e0401020300010b024002400240024002402009422088a741ff01710e06050403020100050b200942ffffffff8f60834280808080c000842109410321030c060b200942ffffffff8f608342808080803084210941f5002100410321030c050b200942ffffffff8f608342808080802084210941fb002100410321030c040b20042009a72206410274411c7176410f712203413072200341d7006a2003410a491b210002402006450d002009427f7c42ffffffff0f83200942808080807083842109410321030c040b200942ffffffff8f6083428080808010842109410321030c030b200942ffffffff8f6083210941fd002100410321030c020b20012802184127200128021c2802101101000f0b41002103200421000b20012802182000200128021c280210110100450d000b0b20020b950201017f024002402000418010490d00024002400240024002400240200041808004490d002000410c7641706a2201418002490d0141a8a0c00020014180021034000b200041067641606a220141df074b0d01200141f08bc0006a2d0000220141c9004b0d0220014103744180a1c0006a21010c060b200141d093c0006a2d00004106742000410676413f7172220141ff034b0d02200141d0a5c0006a2d0000220141394b0d03200141037441d0a9c0006a21010c050b4188a0c000200141e0071034000b4198a0c000200141ca001034000b41b8a0c00020014180041034000b41c8a0c0002001413a1034000b200041037641f8ffffff017141d889c0006a21010b200129030042012000413f71ad86834200520baf0201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001103f21000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000b20024180016a240020000f0b20044180011044000b20044180011044000b0d00200035020041012001103f0b1c00200128021841a1aec000410b2001411c6a28020028020c1100000b1c00200128021841acaec000410e2001411c6a28020028020c1100000b6901037f230041206b220224002001411c6a280200210320012802182104200241086a41106a2000280200220141106a290200370300200241086a41086a200141086a2902003703002002200129020037030820042003200241086a10352101200241206a240020010b5e01017f230041306b220224002002200136020c20022000360208200241246a410136020020024201370214200241b0aec6003602102002410436022c2002200241286a3602202002200241086a360228200241106a41f8aec000103e000b140020002802002001200028020428020c1101000bc30501077f410021040240024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024003400240200620096b41034b0d0041002107200141ff0171210603402008450d04200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b2005200a200141ff01714641016a4101716a20076a417f6a21050c020b200520092d0000220a2007476a2105200a2007460d012005200941016a2d0000220a2007476a2105200a2007460d012005200941026a2d0000220a2007476a2105200a2007460d012005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000b0b410121090c010b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024003400240200220096b41034b0d0041002107200141ff0171210203402008450d04200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050c020b200520092d0000220a2007476a2105200a2007460d012005200941016a2d0000220a2007476a2105200a2007460d012005200941026a2d0000220a2007476a2105200a2007460d012005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000b0b41012109200520046a21050c020b41002109200520076a20046a21050c010b200420031044000b20002005360204200020093602000b2601017f200028020022012802002001280204200028020428020020002802082802001046000b850804057f017e017f017e02400240024002402002450d00410020016b410020014103711b2103200241796a4100200241074b1b210441002105034002400240200120056a2d000022064118744118752207417f4a0d0042808080801021080240200641e681c0006a2d0000417e6a220941024d0d0042808080808020210a0c070b0240024002400240024020090e03000102000b200541016a22062002490d024200210a0c090b4200210a200541016a220920024f0d08200120096a2d0000210902400240200641a07e6a2206410d4b0d000240024020060e0e0002020202020202020202020201000b200941e0017141a001460d0242808080808020210a0c0c0b02402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141a001490d0142808080808020210a0c0b0b02402007411f6a41ff0171410b4b0d0002402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141c001490d0142808080808020210a0c0b0b0240200941ff017141bf014d0d0042808080808020210a0c0b0b0240200741fe017141ee01460d0042808080808020210a0c0b0b2009411874411875417f4c0d0042808080808020210a0c0a0b42002108200541026a220620024f0d09200120066a2d000041c00171418001460d020c070b4200210a200541016a220920024f0d07200120096a2d0000210902400240200641907e6a220641044b0d000240024020060e050002020201000b200941f0006a41ff01714130490d0242808080808020210a0c0b0b02402009411874411875417f4c0d0042808080808020210a0c0b0b200941ff0171419001490d0142808080808020210a0c0a0b0240200941ff017141bf014d0d0042808080808020210a0c0a0b02402007410f6a41ff017141024d0d0042808080808020210a0c0a0b2009411874411875417f4c0d0042808080808020210a0c090b200541026a220620024f0d07200120066a2d000041c00171418001470d0642002108200541036a220620024f0d08200120066a2d000041c00171418001460d01428080808080e000210a42808080801021080c080b42808080808020210a4280808080102108200120066a2d000041c00171418001470d070b200641016a21050c010b0240200320056b4103710d000240200520044f0d000340200120056a220641046a280200200628020072418081828478710d01200541086a22052004490d000b0b200520024f0d010340200120056a2c00004100480d022002200541016a2205470d000c040b0b200541016a21050b20052002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210a42808080801021080c010b420021080b2000200a2008842005ad84370204200041013602000b02000ba20401077f230041306b220324000240024020020d00410021040c010b200341286a210502400240024002400340024020002802082d0000450d00200028020041e4afc0004104200028020428020c1100000d050b2003410a3602282003428a808080103703202003200236021c200341003602182003200236021420032001360210200341086a410a200120021052024002400240024020032802084101470d00200328020c210403402003200420032802186a41016a2204360218024002402004200328022422064f0d00200328021421070c010b200328021422072004490d00200641054f0d072003280210200420066b22086a22092005460d04200920052006109c05450d040b200328021c22092004490d0220072009490d0220032006200341106a6a41176a2d0000200328021020046a200920046b10522003280204210420032802004101460d000b0b2003200328021c3602180b200028020841003a0000200221040c010b200028020841013a0000200841016a21040b2000280204210920002802002106024020044520022004467222070d00200220044d0d03200120046a2c000041bf7f4c0d030b200620012004200928020c1100000d04024020070d00200220044d0d04200120046a2c000041bf7f4c0d040b200120046a2101200220046b22020d000b410021040c040b20064104103c000b20012002410020041046000b20012002200420021046000b410121040b200341306a240020040bf90101017f230041106b220224002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a200110562101200241106a240020010b6001017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41ccafc000200241086a10352101200241206a240020010b0d0020002802002001200210560b800201017f230041106b22022400200028020021002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a200110562101200241106a240020010b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41ccafc000200241086a10352101200241206a240020010bdb0302047f057e230041d0006b2205240041012106024020002d00040d0020002d000521070240200028020022082d00004104710d0041012106200828021841caafc00041e8afc000200741ff017122071b4102410320071b2008411c6a28020028020c1100000d014101210620002802002208280218200120022008411c6a28020028020c1100000d01410121062000280200220828021841b9a8c40041022008411c6a28020028020c1100000d0120032000280200200428020c11010021060c010b0240200741ff01710d0041012106200828021841ebafc00041032008411c6a28020028020c1100000d01200028020021080b41012106200541013a00172005200541176a360210200829020821092008290210210a200541346a41b0afc000360200200520082902183703082008290220210b2008290228210c200520082d00303a00482008290200210d2005200c3703402005200b3703382005200a370328200520093703202005200d3703182005200541086a360230200541086a2001200210560d00200541086a41b9a8c400410210560d002003200541186a200428020c1101000d00200528023041c8afc0004102200528023428020c11000021060b200041013a0005200020063a0004200541d0006a240020000bf30202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d0041012104200628021841caafc00041f1afc00020051b4102410120051b2006411c6a28020028020c1100000d0120012000280200200228020c11010021040c010b024020050d0041012104200628021841f2afc00041022006411c6a28020028020c1100000d01200028020021060b41012104200341013a00172003200341176a3602102006290208210720062902102108200341346a41b0afc00036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b2003200a3703402003200937033820032008370328200320073703202003200b3703182003200341086a3602302001200341186a200228020c1101000d00200328023041c8afc0004102200328023428020c11000021040b200020043a00082000200028020441016a360204200341d0006a240020000b6401027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10352100200241206a240020000bb50f020d7f017e230041206b220324004101210402400240200228021841222002411c6a2802002802101101000d000240024020010d00410021050c010b200020016a21062000210741002105410021080240034020072109200741016a210a02400240024020072c0000220b417f4a0d0002400240200a2006470d004100210c200621070c010b20072d0001413f71210c200741026a220a21070b200b411f7121040240200b41ff0171220b41df014b0d00200c200441067472210b0c020b0240024020072006470d004100210d2006210e0c010b20072d0000413f71210d200741016a220a210e0b200d200c41067472210c0240200b41f0014f0d00200c2004410c7472210b0c020b02400240200e2006470d004100210b200a21070c010b200e41016a2107200e2d0000413f71210b0b200c4106742004411274418080f0007172200b72220b418080c400470d020c040b200b41ff0171210b0b200a21070b4102210a024002400240024002400240200b41776a220c411e4d0d00200b41dc00470d010c020b41f400210e02400240200c0e1f05010202000202020202020202020202020202020202020202030202020203050b41f200210e0c040b41ee00210e0c030b02400240200b104a0d00024002400240024002400240024002400240200b41808004490d00200b41808008490d01200b4190fc476a4190fc0b490d09200b41e28b746a41e28d2c490d09200b419fa8746a419f18490d09200b41dee2746a410e490d09200b41feffff0071419ef00a460d09200b41a9b2756a4129490d09200b41cb91756a410a4d0d090c0e0b200b4180fe0371410876210f41d095c000210c410021040340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d08200e2104200d210c200d41a296c000470d010c080b200e2004490d02200e41a5024b0d03200441a296c0006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c0b0b0b200e2104200d210c200d41a296c000470d000c070b0b200b4180fe0371410876210f41819bc000210c410021040340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d06200e2104200d210c200d41c79bc000470d010c060b200e2004490d03200e41a6014b0d04200441c79bc0006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c0a0b0b200e2104200d210c200d41c79bc000470d000c050b0b2004200e1044000b200e41a502103c000b2004200e1044000b200e41a601103c000b200b41ffff0371210e41ed9cc000210a4101210c02400340200a41016a210d02400240200a2d00002204411874411875220f4100480d00200d210a0c010b200d4185a0c000460d02200f41ff0071410874200a2d0001722104200a41026a210a0b200e20046b220e4100480d03200c410173210c200a4185a0c000470d000c030b0b41f087c0001032000b200b41ffff0371210e41c798c000210a4101210c0340200a41016a210d02400240200a2d00002204411874411875220f4100480d00200d210a0c010b200d41819bc000460d04200f41ff0071410874200a2d0001722104200a41026a210a0b200e20046b220e4100480d01200c410173210c200a41819bc000470d000b0b200c4101710d050b200b41017267410276410773ad4280808080d0008421104103210a0c020b41f087c0001032000b0b200b210e0b2003200136020420032000360200200320053602082003200836020c0240024020082005490d0002402005450d0020052001460d00200520014f0d01200020056a2c000041bf7f4c0d010b02402008450d0020082001460d00200820014f0d01200020086a2c000041bf7f4c0d010b2002280218200020056a200820056b200228021c28020c110000450d01410121040c060b20032003410c6a3602182003200341086a36021420032003360210200341106a1053000b0340200a210c4101210441dc0021054101210a024002400240024002400240200c0e0402010500020b02400240024002402010422088a741ff01710e06050302010006050b201042ffffffff8f60834280808080308421104103210a41f50021050c070b201042ffffffff8f60834280808080208421104103210a41fb0021050c060b200e2010a7220c410274411c7176410f71220a413072200a41d7006a200a410a491b21050240200c450d002010427f7c42ffffffff0f832010428080808070838421100c050b201042ffffffff8f60834280808080108421100c040b201042ffffffff8f608321104103210a41fd0021050c040b4100210a200e21050c030b4101210a0240200b418001490d004102210a200b418010490d0041034104200b41808004491b210a0b200a20086a21050c040b201042ffffffff8f60834280808080c0008421100b4103210a0b20022802182005200228021c2802101101000d050c000b0b200820096b20076a210820062007470d000b0b2005450d0020052001460d00200520014f0d02200020056a2c000041bf7f4c0d020b410121042002280218200020056a200120056b200228021c28020c1100000d0020022802184122200228021c28021011010021040b200341206a240020040f0b20002001200520011046000bc00201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff018341012001103f21000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000b20024180016a240020000f0b20044180011044000b20044180011044000b0b0020002802002001104b0b800201027f230041106b2202240020012802184198b0c00041092001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200036020c200241a1b0c000410b2002410c6a41f8afc000105c21012002200041046a36020c200141acb0c00041092002410c6a41b8b0c000105c1a20022d00042101024020022d0005450d00200141ff0171210041012101024020000d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d00200341eeafc0004102200011000021010c010b200341f0afc0004101200011000021010b200220013a00040b200241106a2400200141ff01714100470bb50201027f230041106b2202240002400240200028020022002d00004101460d00200128021841e0e2c50041042001411c6a28020028020c11000021010c010b2002200128021841e4e2c50041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041016a36020c20022002410c6a4188b0c000105d1a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841f4afc00041012000411c6a28020028020c1100000d010b2002280200220128021841c8a4c60041012001411c6a28020028020c11000021010b200220013a00080b200141ff017141004721010b200241106a240020010b1c00200128021841b8aec60041052001411c6a28020028020c1100000b040041000b02000b02000b9e10020a7f017e23004180016b2202240002400240024020012802042203200128020022046b41e100490d000240024003402001200441206a3602002001280208220341186a280200210520032802102106200241e0006a41186a22034200370300200241e0006a41106a22074200370300200241e0006a41086a220842003703002002420037036020044120200241e0006a1000200241106a41186a22092003290300370300200241106a41106a220a2007290300370300200241106a41086a220b2008290300370300200220022903603703102002410036026020062005200241106a4120200241e0006a10012106024020022802602205417f460d0020022005360258200220053602542002200636025020012802082201280218210320012802102101200241e0006a41186a22074200370300200241e0006a41106a22084200370300200241e0006a41086a220942003703002002420037036020044120200241e0006a1000200241306a41186a2007290300370300200241306a41106a2008290300370300200241306a41086a20092903003703002002200229036037033020012003200241306a41201002200241086a2002280258360200200220022903503703000c050b20012001280200220441206a3602002001280208220541186a2802002106200528021021052003420037030020074200370300200842003703002002420037036020044120200241e0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903603703102002410036026020052006200241106a4120200241e0006a10012106024020022802602205417f470d0020012001280200220441206a3602002001280208220541186a2802002106200528021021052003420037030020074200370300200842003703002002420037036020044120200241e0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903603703102002410036026020052006200241106a4120200241e0006a1001210620022802602205417f470d0320012001280200220441206a3602002001280208220541186a2802002106200528021021052003420037030020074200370300200842003703002002420037036020044120200241e0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903603703102002410036026020052006200241106a4120200241e0006a1001210720022802602203417f470d0220012802042203200128020022046b41e0004b0d010c040b0b20022005360258200220053602542002200636025020012802082201280218210320012802102101200241e0006a41186a22074200370300200241e0006a41106a22084200370300200241e0006a41086a220942003703002002420037036020044120200241e0006a1000200241306a41186a2007290300370300200241306a41106a2008290300370300200241306a41086a20092903003703002002200229036037033020012003200241306a41201002200241086a2002280258360200200220022903503703000c030b20022003360258200220033602542002200736025020012802082201280218210320012802102101200241e0006a41186a22074200370300200241e0006a41106a22084200370300200241e0006a41086a220942003703002002420037036020044120200241e0006a1000200241306a41186a2007290300370300200241306a41106a2008290300370300200241306a41086a20092903003703002002200229036037033020012003200241306a41201002200241086a2002280258360200200220022903503703000c020b20022005360258200220053602542002200636025020012802082201280218210320012802102101200241e0006a41186a22074200370300200241e0006a41106a22084200370300200241e0006a41086a220942003703002002420037036020044120200241e0006a1000200241306a41186a2007290300370300200241306a41106a2008290300370300200241306a41086a20092903003703002002200229036037033020012003200241306a41201002200241086a2002280258360200200220022903503703000c010b024020042003460d0003402001200441206a3602002001280208220341186a280200210720032802102103200241e0006a41186a22084200370300200241e0006a41106a22094200370300200241e0006a41086a220a42003703002002420037036020044120200241e0006a1000200241106a41186a2008290300370300200241106a41106a2009290300370300200241106a41086a200a290300370300200220022903603703102002410036026020032007200241106a4120200241e0006a10012107024020022802602203417f460d0020022003360258200220033602542002200736025020012802082201280218210320012802102101200241e0006a41186a22074200370300200241e0006a41106a22084200370300200241e0006a41086a220942003703002002420037036020044120200241e0006a1000200241306a41186a2007290300370300200241306a41106a2008290300370300200241306a41086a20092903003703002002200229036037033020012003200241306a41201002200241086a2002280258360200200220022903503703000c030b200128020022042001280204470d000b0b200041003602000c010b200241e0006a41086a2002220141086a280200220336020020022001290200220c370360200020043602002000200c3702042000410c6a20033602000b20024180016a24000b950201057f230041e0026b22012400024020002802082202200028020c460d00200141b0016a4101722103200141d8016a210403402000200241b0016a36020820022d00002105200141b0016a200241016a41af01109a051a20054103460d01200141016a200141b0016a41af01109a051a200120053a00b0012003200141016a41af01109a051a02400240200541014b0d000240024020050e020001000b024020012802b801450d0020012802b401102a0b20012d00c0014105490d0220012802e801450d0220012802e401102a0c020b2004106a0c010b200128029802450d00200128029402102a0b20002802082202200028020c470d000b0b02402000280204450d002000280200102a0b200141e0026a24000baa0b01057f02402000280200220141124b0d00024002400240024002400240024002400240024002400240024020010e13000d0d010d0d020304050607080d090d0a0b0c000b0240200041086a280200220141054b0d0002400240024020010e06101000100102100b200041106a280200450d0f2000410c6a280200102a0f0b200041106a280200450d0e2000410c6a280200102a0f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141186a2101200241686a22020d000b0b200041106a280200450d0d200028020c102a0f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200102a0b2001410c6a2101200241746a22020d000b0b200041106a280200450d0c200028020c102a0f0b02402000410c6a2802002201450d0020002802042203200141f0006c6a2104034002402003410c6a2802002202450d0020032802042101200241246c210203400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012002415c6a22020d000b0b200341f0006a21010240200341086a280200450d002003280204102a0b2001210320012004470d000b0b200041086a280200450d0b2000280204102a0f0b0240200041086a2d00002201410c4b0d0020014106470d0b200041106a280200450d0b2000410c6a280200102a0f0b200041106a280200450d0a2000410c6a280200102a0f0b200041086a280200450d092000280204102a0f0b200041086a2d0000417f6a220141074b0d08024002400240024020010e08000c0c0c0c010203000b2000410c6a2201280200106a2001280200102a0f0b2000410c6a2201280200106a2001280200102a0f0b2000410c6a2201280200106a2001280200102a0f0b2000410c6a2201280200106a2001280200102a0f0b20002d0004417f6a220141024b0d0702400240024020010e03000102000b2000410c6a280200450d09200041086a280200102a0f0b200041086a2201280200106a2001280200102a0f0b2000410c6a2201280200106a2001280200102a0f0b20002d0004417f6a220141024b0d0602400240024020010e03000102000b2000410c6a280200450d08200041086a280200102a0f0b200041086a2201280200106a2001280200102a0f0b2000410c6a2201280200106a2001280200102a0f0b200041086a280200417f6a220141014b0d050240024020010e020001000b200041106a280200450d062000410c6a280200102a0f0b200041106a280200450d052000410c6a280200102a0f0b20002d00044104490d042000410c6a280200450d04200041086a280200102a0c040b200041086a280200450d032000280204102a0f0b200041086a2d0000417e6a220141024b0d0202400240024020010e03000102000b200041106a280200450d042000410c6a280200102a0f0b200041346a280200450d03200041306a280200102a0f0b200041306a280200450d022000412c6a280200102a0f0b02402000280204220141024b0d00024020010e03030003030b200041086a2201280200106a2001280200102a0f0b2000412c6a2201280200106a2001280200102a0f0b02402000410c6a280200450d00200041086a280200102a0b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d002001280200102a0b2001410c6a2101200241746a22020d000b0b200041186a280200450d002000280214102a0f0b0b960301097f230041106b2202240002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a3602002006450d0020042d0001210720012003417e6a22063602042001200441026a3602002006450d0020042d0002210820012003417d6a22063602042001200441036a3602002006450d0020042d0003210620012003417c6a3602042001200441046a360200200241086a2001106c20022802080d022001280204200228020c2204490d022004417f4c0d0302400240024020040d004101210341010d010c050b2004102e2203450d0120012802042004490d03200320012802002004109a0521092001280204220a2004490d062001200a20046b3602042001200128020020046a3602002009450d040b20002004360208200020033602042000410c6a2004360200200020074108742005722008411074722006411874723602000c060b200441011037000b200041003602040c040b2003102a0b200041003602040c020b1036000b2004200a1044000b200241106a24000bcf0201067f0240024020012802042202450d00200128020022032d0000210420012002417f6a2205360204410121062001200341016a3602000240200441037122074103460d0002400240024020070e03000102000b20044102762107410021060c040b41012106024020050d000c040b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d03200141fcff03714102762107410021060c030b20054103490d01200341036a2d0000210620032f0001210720012002417c6a3602042001200341046a3602002007200641107472410874200472220141027621072001418080044921060c020b0240200441034d0d000c020b20054104490d012003280001210720012002417b6a3602042001200341056a36020020074180808080044921060c010b410121060b20002007360204200020063602000baf04010a7f230041d0006b2202240020022001106c0240024002400240024020022802000d00200128020422034160712204417f4c0d022002280204210502400240200341057622060d00410121070c010b200410282207450d040b02402005450d00410021080340200241003a00482008220941016a21082001280204417f6a21034100210402400240024003402003417f460d01200241286a20046a2001280200220a2d00003a0000200120033602042001200a41016a3602002002200441016a220a3a00482003417f6a2103200a2104200a4120470d000b200241086a41186a2204200241286a41186a290300370300200241086a41106a220a200241286a41106a290300370300200241086a41086a220b200241286a41086a2903003703002002200229032837030820062009470d020240200941017422032008200320084b1b220641ffffff3f712006470d002006410574220341004e0d020b1031000b0240200441ff0171450d00200241003a00480b200041003602002006450d052007102a0c050b0240024020090d002003102821070c010b200720094105742003102c21070b2007450d070b200720094105746a22032002290308370000200341186a2004290300370000200341106a200a290300370000200341086a200b29030037000020082005470d000b0b2000200636020420002007360200200041086a20053602000c010b200041003602000b200241d0006a24000f0b1036000b200441011037000b200341011037000b9203010a7f200041086a220228020021034100210420024100360200024002402003450d004100210541002106410021044100210702400340024002402004450d00200741057421080340200720034f0d062001200028020022096b2008460d02200920086a220a20014120109c05450d020240200620076a220b20034f0d00200920056a20086a2209200a290000370000200941186a200a41186a290000370000200941106a200a41106a290000370000200941086a200a41086a290000370000200841206a2108200741016a22072003490d010c050b0b41c4b2c000200b20031034000b200028020020074105746a21080340200720034f0d0520012008460d01200820014120109c05450d01200841206a2108200741016a22072003490d000b410021040c030b200541606a21052006417f6a2106200441016a2104200741016a22072003490d000b0b2004450d00200320074d0d00200028020020074105746a220820044105746b2008200320076b410574109b051a0b2002200320046b3602000f0b41e8b1c000200720031034000bfe0203017f017e0b7f024002400240024020012802082202ad42187e2203422088a70d002003a72204417f4c0d00200128020021050240024020040d00410421060c010b200410282206450d020b0240024020020d00410021070c010b2005200241186c6a210841002107200621010340200541086a2802002204417f4c0d02200528020021090240024020040d004101210a4100210b0c010b2004210b20041028220a450d050b200a20092004109a05210a200541146a2802002209417f4c0d022005410c6a280200210c0240024020090d004100210d4101210e0c010b2009210d20091028220e450d060b200e200c2009109a05210c200141146a2009360200200141106a200d3602002001410c6a200c360200200141086a2004360200200141046a200b3602002001200a360200200141186a2101200741016a2107200541186a22052008470d000b0b2000200736020820002002360204200020063602000f0b1036000b200441041037000b200441011037000b200941011037000bc90a03027f017e1c7f230041f0006b22022400024002400240024002400240024020012802082203ad42f0007e2204422088a70d002004a72205417f4c0d00200128020021060240024020050d00410421070c010b200510282207450d020b0240024020030d00410021080c010b2006200341f0006c6a2109410021082007210a0340200241c0006a41086a220b200641186a290000370300200241c0006a41106a220c200641206a290000370300200241c0006a41186a220d200641286a290000370300200241206a41086a220e200641386a29000037030020062900102104200241206a41106a220f200641c0006a290000370300200241206a41186a2210200641c8006a290000370300200241186a2211200641e8006a290000370300200241106a2212200641e0006a290000370300200241086a2213200641d8006a290000370300200220043703402002200629003037032020022006290050370300200628020c2214ad42247e2204422088a70d022004a72201417f4c0d0220062802002115200628020421160240024020010d00410421170c010b200110282217450d050b0240024020140d00410021180c010b201441246c211941002105410021180340024002400240024002400240201620056a22012d00000e050001020304000b2002200141146a2900003703602002200141196a290000370065200141056a2f0000200141076a2d000041107472211a200141106a280000211b2001410c6a280000211c200141086a280000211d200141016a280000211e4100211f0c040b200141106a280200221b417f4c0d08200141086a2802002120200141016a280000211e4101211f0240201b0d004100211c4101211d41012020201b109a051a0c040b201b211c201b1028221d450d0b201d2020201b109a051a0c030b200141106a280200221b417f4c0d07200141086a280200211f200141016a280000211e02400240201b0d004100211c4101211d0c010b201b211c201b1028221d450d0c0b201d201f201b109a051a4102211f0c020b200141106a280200221b417f4c0d06200141086a280200211f200141016a280000211e02400240201b0d004100211c4101211d0c010b201b211c201b1028221d450d0c0b201d201f201b109a051a4103211f0c010b2001410c6a280200221c417f4c0d05200141046a280200210102400240201c0d004101211a4100211d0c010b201c211d201c1028221a450d0c0b201a2001201c109a052201411874211e2001410876211a4104211f0b201720056a2201201f3a0000200141076a201a4110763a0000200141056a201a3b0000200141106a201b3600002001410c6a201c360000200141086a201d360000200141016a201e360000200141146a20022903603702002001411c6a200241e0006a41086a290300370200201841016a21182019200541246a2205470d000b0b200a2017360204200a410c6a2018360200200a41086a2014360200200a2002290340370210200a41186a200b290300370200200a2015360200200a2002290320370230200a41206a200c290300370200200a41286a200d290300370200200a41386a200e290300370200200a41c0006a200f290300370200200a41c8006a2010290300370200200a41e8006a2011290300370200200a41e0006a2012290300370200200a41d8006a2013290300370200200a2002290300370250200841016a2108200a41f0006a210a200641f0006a22062009470d000b0b200020083602082000200336020420002007360200200241f0006a24000f0b1036000b200541041037000b200141041037000b201b41011037000b201b41011037000b201b41011037000b201c41011037000b890203017f017e077f02400240024020012802082202ad420c7e2203422088a70d002003a72204417f4c0d00200128020021050240024020040d00410421060c010b200410282206450d020b0240024020020d00410021070c010b20052002410c6c6a210841002107200621040340200541086a2802002201417f4c0d02200528020021090240024020010d004101210a0c010b20011028220a450d050b200a20092001109a052109200441086a2001360200200441046a2001360200200420093602002004410c6a2104200741016a21072005410c6a22052008470d000b0b2000200736020820002002360204200020063602000f0b1036000b200441041037000b200141011037000bd70201037f024020002802082201450d002000280200220020014188016c6a2102200041f8006a2100034002400240200041887f6a22012d00002203410e4b0d00024002400240024020030e0f050505050500050501050205030505050b200041907f6a2d00004101470d042000419c7f6a280200450d04200041987f6a280200102a0c040b2000418c7f6a2d00004103470d030240200041947f6a280200450d00200041907f6a280200102a0b200041a07f6a280200450d032000419c7f6a280200102a0c030b2000418c7f6a2802000d02200041947f6a280200450d02200041907f6a280200102a0c020b200041907f6a2d00004105490d01200041b87f6a280200450d01200041b47f6a280200102a0c010b200041907f6a280200450d002000418c7f6a280200102a0b0240200141fc006a280200450d002000280200102a0b20004188016a210020014188016a2002470d000b0b0baf04010a7f230041d0006b2202240020022001106c0240024002400240024020022802000d00200128020422034160712204417f4c0d022002280204210502400240200341057622060d00410121070c010b200410282207450d040b02402005450d00410021080340200241003a00482008220941016a21082001280204417f6a21034100210402400240024003402003417f460d01200241286a20046a2001280200220a2d00003a0000200120033602042001200a41016a3602002002200441016a220a3a00482003417f6a2103200a2104200a4120470d000b200241086a41186a2204200241286a41186a290300370300200241086a41106a220a200241286a41106a290300370300200241086a41086a220b200241286a41086a2903003703002002200229032837030820062009470d020240200941017422032008200320084b1b220641ffffff3f712006470d002006410574220341004e0d020b1031000b0240200441ff0171450d00200241003a00480b200041003602002006450d052007102a0c050b0240024020090d002003102821070c010b200720094105742003102c21070b2007450d070b200720094105746a22032002290308370000200341186a2004290300370000200341106a200a290300370000200341086a200b29030037000020082005470d000b0b2000200636020420002007360200200041086a20053602000c010b200041003602000b200241d0006a24000f0b1036000b200441011037000b200341011037000b8a06030a7f037e017f23004190016b2202240020022001106c0240024002400240024020022802000d00200128020441216e220341216c2204417f4c0d01200228020421050240024020040d00410121060c010b200410282206450d030b02402005450d0041002107034020012802042208450d05200128020022092d0000210420012008417f6a220a3602042001200941016a360200200441014b0d054100210b0240024020040e020100010b41002104200241003a0088012008417e6a210803400240200a2004470d00200441ff0171450d08200241003a0088010c080b200241e8006a20046a200920046a220b41016a2d00003a0000200120083602042001200b41026a3602002002200441016a220b3a0088012008417f6a2108200b2104200b4120470d000b200241c8006a41186a200241e8006a41186a290300370300200241c8006a41106a200241e8006a41106a290300370300200241c8006a41086a200241e8006a41086a290300370300200220022903683703484101210b0b200741016a2108200241286a41186a200241c8006a41186a290300220c370300200241286a41106a200241c8006a41106a290300220d370300200241286a41086a200241c8006a41086a290300220e370300200241086a41086a2209200e370300200241086a41106a220a200d370300200241086a41186a220f200c37030020022002290348220c3703282002200c370308024020032007470d000240200741017422042008200420084b1b2203ad42217e220c422088a70d00200ca722044100480d000240024020070d002004102821060c010b2006200741216c2004102c21060b20060d01200441011037000b1031000b2006200741216c6a2204200b3a000020042002290308370001200441096a2009290300370000200441116a200a290300370000200441196a200f2903003700002008210720082005470d000b0b2000200336020420002006360200200041086a20053602000c040b200041003602000c030b1036000b200441011037000b200041003602002003450d002006102a0b20024190016a24000bc902010a7f230041106b22022400200241086a2001106c0240024020022802080d00024020012802042203417f4c0d00200228020c210402400240024020030d00410121050c010b200310282205450d010b02402004450d004100210641002107034002400240024020012802042208450d00200741016a21092001280200220a2d0000210b20012008417f6a3602042001200a41016a36020020072003460d010c020b200041003602002003450d072005102a0c070b024020062009200620094b1b22034100480d000240024020070d002003102821050c010b200520072003102c21050b20050d01200341011037000b1031000b200520076a200b3a0000200641026a21062009210720042009470d000b0b2000200336020420002005360200200041086a20043602000c030b200341011037000b1036000b200041003602000b200241106a24000b990a02137f017e230041e0006b22022400200241086a2001106c0240024020022802080d000240200128020441246e220341246c2204417f4c0d00200228020c210502400240024020040d00410421060c010b200410282206450d010b02400240024020050d00410021040c010b2002412d6a2107200241cb006a220841056a21094100210a4100210b0340024002402001280204220c450d002001280200220d2d000021042001200c417f6a220e3602042001200d41016a360200200441064b0d00024002400240024002400240024020040e0700070107030402000b20022001106c20022802000d0620012802042002280204220c490d06200c417f4c0d0c024002400240200c0d004101210441010d010c090b200c102e2204450d012001280204200c490d0620042001280200200c109a05210f2001280204220d200c490d072001200d200c6b36020420012001280200200c6a360200200f450d080b200241206a41086a200241386a41086a290200370300200220022902383703202004410876210f4104210d200c210e201041ffffff0771200441187472221021110c080b200c41011037000b41002104200241003a0058200c417e6a210c03400240200e2004470d00200441ff0171450d07200241003a00580c070b200241386a20046a200d20046a220f41016a2d00003a00002001200c3602042001200f41026a3602002002200441016a220f3a0058200c417f6a210c200f2104200f4120470d000b2002200829000037032020022009290000370025200228004721122002280043210e200228003f210c2002280238211120022f013c210420022d003e210f200741026a200241356a41026a2d00003a0000200720022f00353b00002004200f41107472210f4100210d0c060b200241386a2001106b200228023c220c450d04200228024421122002280240210e200228023821114101210d0c050b200241386a2001106b200228023c220c450d03200228024421122002280240210e200228023821114102210d0c040b200241386a2001106b200228023c220c450d02200228024421122002280240210e200228023821114103210d0c030b2004102a0c010b200c200d1044000b200041003602000240200b450d002006210403400240024020042d0000220141034b0d0002400240024020010e0404000102040b2004410c6a280200450d03200441086a280200102a0c030b2004410c6a280200450d02200441086a280200102a0c020b2004410c6a280200450d01200441086a280200102a0c010b200441086a280200450d00200441046a280200102a0b200441246a2104200a415c6a220a0d000b0b2003450d072006102a0c070b200241106a41086a2213200241206a41086a290300370300200220022903203703100240200b2003470d0002400240200341016a22042003490d00200341017422142004201420044b1b2204ad42247e2215422088a70d002015a7221441004e0d010b1031000b0240024020030d002014102821060c010b2006200341246c2014102c21060b2006450d03200421030b2006200b41246c6a220420123600102004200e36000c2004200c3600082004200f3b0005200420113600012004200d3a0000200441076a200f4110763a0000200420022903103700142004411c6a2013290300370000200a41246a210a200b41016a2204210b20042005470d000b0b2000200336020420002006360200200041086a20043602000c040b201441041037000b200441041037000b1036000b200041003602000b200241e0006a24000bb906020c7f047e230041b0016b2202240020022001106c02400240024002400240024020022802000d00200128020441286e220341286c2204417f4c0d02200228020421050240024020040d00410821060c010b200410282206450d040b02402005450d00410021070340200241003a00a8012007220841016a210720012802042109417f210a4100210402400240024002400240034020092004460d0120024188016a20046a2001280200220b2d00003a000020012009200a6a3602042001200b41016a3602002002200441016a220c3a00a801200a417f6a210a200c2104200c4120470d000b200241e8006a41186a220420024188016a41186a290300370300200241e8006a41106a220a20024188016a41106a290300370300200241e8006a41086a220d20024188016a41086a29030037030020022002290388013703682009200c6b220c41074d0d01200b290001210e2001200b41096a3602002001200c41786a360204200241286a41086a200d290300220f370300200241286a41106a200a2903002210370300200241286a41186a20042903002211370300200241086a41086a220a200f370300200241086a41106a220c2010370300200241086a41186a2209201137030020022002290368220f3703282002200f37030820032008470d04200841017422042007200420074b1b2203ad42287e220f422088a70d0c200fa722044100480d0c20080d022004102821060c030b200441ff0171450d00200241003a00a8010b200241286a41186a200241c8006a41186a290300370300200241286a41106a200241c8006a41106a290300370300200241286a41086a200241c8006a41086a29030037030020022002290348370328200041003602002003450d062006102a0c060b2006200841286c2004102c21060b2006450d070b2006200841286c6a22042002290308370300200a290300210f200c2903002110200929030021112004200e370320200441186a2011370300200441106a2010370300200441086a200f37030020072005470d000b0b2000200336020420002006360200200041086a20053602000c010b200041003602000b200241b0016a24000f0b1036000b200441081037000b200441081037000b1031000bf80404097f027e027f017e230041d0006b2202240020022001106c024002400240024002400240024020022802000d00200128020441306e220341306c2204417f4c0d01200228020421050240024020040d00410821060c010b200410282206450d030b02402005450d00410021070340200128020422084110490d07200741016a21092001280200220a41086a290000210b200a290000210c2001200a41106a3602002001200841706a220d36020441002104200241003a00482008416f6a210803400240200d2004470d00200441ff0171450d09200241003a00480c090b200241286a20046a200a20046a220e41106a2d00003a0000200120083602042001200e41116a3602002002200441016a220e3a00482008417f6a2108200e2104200e4120470d000b200241086a41186a2208200241286a41186a290300370300200241086a41106a220e200241286a41106a290300370300200241086a41086a220a200241286a41086a29030037030020022002290328370308024020032007470d00200741017422042009200420094b1b2203ad42307e220f422088a70d07200fa722044100480d070240024020070d002004102821060c010b2006200741306c2004102c21060b2006450d060b2006200741306c6a2204200b3703082004200c37030020042002290308370310200441186a200a290300370300200441206a200e290300370300200441286a20082903003703002009210720092005470d000b0b2000200336020420002006360200200041086a20053602000c060b200041003602000c050b1036000b200441081037000b200441081037000b1031000b200041003602002003450d002006102a0b200241d0006a24000ba40303087f017e017f230041d0046b22022400200241086a2001106c02400240024002400240024020022802080d00200128020441a0026e220341a0026c2204417f4c0d02200228020c21050240024020040d00410821060c010b200410282206450d040b024002402005450d004100210741002104410021080340200241b0026a2001107a2002290398034203510d02200841016a2109200241106a200241b0026a41a002109a051a024020082003470d0020072009200720094b1b2203ad42a0027e220a422088a70d09200aa7220b4100480d090240024020080d00200b102821060c010b20062004200b102c21060b2006450d080b200620046a200241106a41a002109a051a200741026a2107200441a0026a21042009210820052009470d000b0b2000200336020420002006360200200041086a20053602000c020b2000410036020002402008450d0020064198016a210903402009106a200941a0026a2109200441e07d6a22040d000b0b2003450d012006102a0c010b200041003602000b200241d0046a24000f0b1036000b200441081037000b200b41081037000b1031000bae0c04047f017e097f067e23004180066b22022400200241286a2001106c02400240024002400240024020022802280d000240200228022c2203450d0003402003417f6a22030d000b0b20012802042203450d01200128020022042d0000210520012003417f6a3602042001200441016a36020002400240200541ff00714103470d0020054118744118754100480d01420221060c060b200042033703680c060b20024198046a200110a50120022d0098044102460d02200241f0036a41206a20024198046a41206a280200360200200241f0036a41186a20024198046a41186a290300370300200241f0036a41106a20024198046a41106a290300370300200241f0036a41086a20024198046a41086a29030037030020022002290398043703f00341002103200241003a00c00220012802042107417f2105024002400240034020072003460d0120024180026a20036a200128020022082d00003a00002001200720056a3602042001200841016a3602002002200341016a22043a00c0022005417f6a210520042103200441c000470d000b200241c0056a41386a220320024180026a41386a290300370300200241c0056a41306a220920024180026a41306a290300370300200241c0056a41286a220a20024180026a41286a290300370300200241c0056a41206a220b20024180026a41206a290300370300200241c0056a41186a220c20024180026a41186a290300370300200241c0056a41106a220d20024180026a41106a290300370300200241c0056a41086a220e20024180026a41086a29030037030020022002290380023703c005200441ff017141c000490d0520024180056a41386a220f200329030037030020024180056a41306a2009290300220637030020024180056a41286a200a290300221037030020024180056a41206a200b290300221137030020024180056a41186a200c290300221237030020024180056a41106a200d290300221337030020024180056a41086a200e2903002214370300200220022903c005221537038005200241c0046a41306a2006370300200241c0046a41286a2010370300200241c0046a41206a2011370300200241c0046a41186a2012370300200241c0046a41106a2013370300200241c0046a41086a2014370300200241c0046a41386a200f290300370300200220153703c00420072004460d05200831000121112001200720056a3602042001200841026a360200201150450d01420021060c020b200341ff0171450d04200241003a00c0020c040b2007417f6a2004460d03200831000221122001200841036a3602002001200720046b417e6a36020442022011420f838622104204540d034201210620124208862011844204882010420c882211420120114201561b7e221120105a0d030b200241206a2001106c20022802200d0220022802242105200241086a2001109f012002290308a70d02200241086a41106a290300211320022903102112200241e8026a41206a200241f0036a41206a280200360200200241e8026a41186a200241f0036a41186a290300370300200241e8026a41106a200241f0036a41106a290300370300200241e8026a41086a200241f0036a41086a29030037030020024194036a200241c0046a41086a2903003702002002419c036a200241c0046a41106a290300370200200241a4036a200241c0046a41186a290300370200200241ac036a200241c0046a41206a290300370200200241b4036a200241e8046a290300370200200241bc036a200241f0046a290300370200200241c4036a200241f8046a290300370200200220022903f0033703e802200220022903c00437028c0320024180026a200241e8026a41e800109a051a0c030b200042033703680c040b200042033703680c030b420221060b20024198016a20024180026a41e800109a051a024020064202520d00200042033703680c020b200241306a20024198016a41e800109a051a0b200241e8026a2001108101024020022802e8024113460d002000200241306a41e800109a0522034188016a201337030020034180016a201237030020034190016a2005360200200341f8006a2011370300200320103703702003200637036820034198016a200241e8026a418801109a051a0c010b200042033703680b20024180066a24000bfb1002147f037e230041c0026b22022400200241086a2001106c0240024020022802080d000240200128020441c4006e220341c4006c2204417f4c0d00200228020c210502400240024020040d00410421060c010b200410282206450d010b024002402005450d0020024198026a410772210741002108034002400240024002400240024020012802042209450d002001280200220a2d0000210420012009417f6a220b3602042001200a41016a360200200441014b0d000240024020040e020001000b200b41034d0d01200a280001210c20012009417b6a3602042001200a41056a360200200241d4016a41026a200241d8016a41026a2d00003a0000200241b8016a41086a200241f8016a41086a290200370300200241b8016a41106a200241f8016a41106a290200370300200241b8016a41186a200241f8016a41186a2d00003a000020024198016a41086a20024198026a41086a29010037030020024198016a41106a20024198026a41106a29010037030020024198016a41186a20024198026a41186a290100370300200220022f00d8013b01d401200220022902f8013703b801200220022901980237039801200220022f01f4013b0196014100210d0c030b4100210e200241003a00b8022009417e6a210d03400240200b200e2204470d000240200441ff0171450d00200241003a00b8020b4102210d0c040b20024198026a20046a200a20046a220e41016a2d00003a00002001200d3602042001200e41026a3602002002200441016a220e3a00b802200d417f6a210d200e4120470d000b200241f4016a41026a220f20022d009a023a0000200241d8016a41086a2210200741086a290000370300200241d8016a41106a2211200741106a290000370300200241d8016a41186a2212200741186a2d00003a0000200220022f0198023b01f401200220072900003703d801200b200e460d01200228009b022113200a200e6a220a41016a2d0000210b2001200d3602042001200a41026a360200200b41014b0d014100211402400240200b0e020100010b4100210d200241003a00b802200e20096b41026a210b200920046b417c6a210403400240200b200d6a0d00200d41ff0171450d04200241003a00b8020c040b20024198026a200d6a200a200d6a220e41026a2d00003a0000200120043602042001200e41036a3602002002200d41016a220e3a00b8022004417f6a2104200e210d200e4120470d000b200241f8016a41186a20024198026a41186a290300370300200241f8016a41106a20024198026a41106a290300370300200241f8016a41086a20024198026a41086a29030037030020022002290398023703f801410121140b20024198016a41186a200241f8016a41186a29030037030020024198016a41106a200241f8016a41106a29030037030020024198016a41086a200241f8016a41086a290300370300200241d4016a41026a200f2d00003a0000200241b8016a41086a2010290300370300200241b8016a41106a2011290300370300200241b8016a41186a20122d00003a0000200220022903f80137039801200220022f01f4013b01d401200220022903d8013703b8014101210d201421152013210c0c020b20024192016a41026a200241d4016a41026a2d00003a0000200241f8006a41086a200241b8016a41086a290300370300200241f8006a41106a200241b8016a41106a290300370300200241f8006a41186a200241b8016a41186a2d00003a0000200241d8006a41086a20024198016a41086a290300370300200241d8006a41106a20024198016a41106a290300370300200241d8006a41186a20024198016a41186a290300370300200220022f01d4013b019201200220022903b8013703782002200229039801370358200220022f0196013b01560c020b4102210d0b20024192016a41026a2204200241d4016a41026a2d00003a0000200241f8006a41086a220a200241b8016a41086a290300370300200241f8006a41106a220b200241b8016a41106a290300370300200241f8006a41186a2209200241b8016a41186a2d00003a0000200241d8006a41086a220f20024198016a41086a290300370300200241d8006a41106a221020024198016a41106a290300370300200241d8006a41186a221120024198016a41186a290300370300200220022f01d4013b019201200220022903b8013703782002200229039801370358200220022f0196013b0156200d4102460d00200841016a210e200241d2006a41026a221220042d00003a0000200241386a41086a2213200a290300370300200241386a41106a220a200b290300370300200241386a41186a220b20092d00003a0000200241186a41086a2209200f290300370300200241186a41106a220f2010290300370300200241186a41186a22102011290300370300200220022f0192013b01522002200229037837033820022002290358370318200220022f01563b011620032008470d02024020084101742204200e2004200e4b1b2203ad42c4007e2216422088a70d002016a7220441004e0d020b1031000b200041003602002003450d082006102a0c080b0240024020080d002004102821060c010b2006200841c4006c2004102c21060b2006450d030b2006200841c4006c6a2204200d3a00002004200c360004200441036a20122d00003a0000200420022f01523b0001200b2d0000210d200a29030021162013290300211720022903382118200420153a002120042018370008200441106a2017370000200441186a2016370000200441206a200d3a00002004413a6a2010290300370000200441326a200f2903003700002004412a6a200929030037000020042002290318370022200420022f01163b0042200e2108200e2005470d000b0b2000200336020420002006360200200041086a20053602000c040b200441041037000b200441041037000b1036000b200041003602000b200241c0026a24000baf04010a7f230041d0006b2202240020022001106c0240024002400240024020022802000d00200128020422034160712204417f4c0d022002280204210502400240200341057622060d00410121070c010b200410282207450d040b02402005450d00410021080340200241003a00482008220941016a21082001280204417f6a21034100210402400240024003402003417f460d01200241286a20046a2001280200220a2d00003a0000200120033602042001200a41016a3602002002200441016a220a3a00482003417f6a2103200a2104200a4120470d000b200241086a41186a2204200241286a41186a290300370300200241086a41106a220a200241286a41106a290300370300200241086a41086a220b200241286a41086a2903003703002002200229032837030820062009470d020240200941017422032008200320084b1b220641ffffff3f712006470d002006410574220341004e0d020b1031000b0240200441ff0171450d00200241003a00480b200041003602002006450d052007102a0c050b0240024020090d002003102821070c010b200720094105742003102c21070b2007450d070b200720094105746a22032002290308370000200341186a2004290300370000200341106a200a290300370000200341086a200b29030037000020082005470d000b0b2000200636020420002007360200200041086a20053602000c010b200041003602000b200241d0006a24000f0b1036000b200441011037000b200341011037000bb005020c7f037e230041f0006b2202240020022001106c0240024002400240024020022802000d00200128020441246e220341246c2204417f4c0d02200228020421050240024020040d00410421060c010b200410282206450d040b02402005450d00410021070340200241003a00682007220841016a210720012802042109417f210a410021040240024002400240034020092004460d01200241c8006a20046a2001280200220b2d00003a000020012009200a6a3602042001200b41016a3602002002200441016a220c3a0068200a417f6a210a200c2104200c4120470d000b200241286a41186a2204200241c8006a41186a290300370300200241286a41106a220a200241c8006a41106a290300370300200241286a41086a220d200241c8006a41086a290300370300200220022903483703282009200c6b220c4104490d01200b28000121092001200b41056a3602002001200c417c6a360204200241086a41086a220c200d290300370300200241086a41106a220b200a290300370300200241086a41186a220a20042903003703002002200229032837030820032008470d030240200841017422042007200420074b1b2203ad42247e220e422088a70d00200ea7220441004e0d030b1031000b200441ff0171450d00200241003a00680b200041003602002003450d052006102a0c050b0240024020080d002004102821060c010b2006200841246c2004102c21060b2006450d070b2006200841246c6a22042002290308370200200c290300210e200b290300210f200a290300211020042009360220200441186a2010370200200441106a200f370200200441086a200e37020020072005470d000b0b2000200336020420002006360200200041086a20053602000c010b200041003602000b200241f0006a24000f0b1036000b200441041037000b200441041037000be60403087f017e017f230041f0016b22022400200241086a2001106c02400240024002400240024020022802080d00200128020441f0006e220341f0006c2204417f4c0d02200228020c21050240024020040d00410421060c010b200410282206450d040b024002402005450d00410021074100210841002109034020024180016a2001107f200228028401450d02200941016a2104200241106a20024180016a41f000109a051a024020092003470d0020072004200720044b1b2203ad42f0007e220a422088a70d09200aa7220b4100480d090240024020090d00200b102821060c010b20062008200b102c21060b2006450d080b200620086a200241106a41f000109a051a200741026a2107200841f0006a21082004210920052004470d000b0b2000200336020420002006360200200041086a20053602000c020b2000410036020002402009450d00200620086a210120062107034002402007410c6a2802002209450d0020072802042104200941246c210903400240024020042d0000220841034b0d0002400240024020080e0404000102040b2004410c6a280200450d03200441086a280200102a0c030b2004410c6a280200450d02200441086a280200102a0c020b2004410c6a280200450d01200441086a280200102a0c010b200441086a280200450d00200441046a280200102a0b200441246a21042009415c6a22090d000b0b200741f0006a21040240200741086a280200450d002007280204102a0b2004210720012004470d000b0b2003450d012006102a0c010b200041003602000b200241f0016a24000f0b1036000b200441041037000b200b41041037000b1031000b9f0a03077f037e057f230041d0026b2202240041002103200241003a00c8022001280204417f6a210402400240024003402004417f460d01200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241e8006a41086a200241a8026a41086a290300370300200241e8006a41106a200241a8026a41106a290300370300200241e8006a41186a200241a8026a41186a290300370300200220022903a80237036820022001106c2002280200450d01200041003602040c020b0240200341ff0171450d00200241003a00c8020b200041003602040c010b2002280204210641002104200241003a00c80220012802042107417f21030240034020072004460d01200241a8026a20046a200128020022082d00003a00002001200720036a3602042001200841016a3602002002200441016a22053a00c8022003417f6a21032005210420054120470d000b200241a8016a41086a200241a8026a41086a2903002209370300200241a8016a41106a200241a8026a41106a290300220a370300200241a8016a41186a200241a8026a41186a290300220b37030020024188016a41086a200937030020024188016a41106a200a37030020024188016a41186a200b370300200220022903a80222093703a801200220093703880141002104200241003a00c802200720056b210c200720036a210303400240200c2004470d000240200441ff0171450d00200241003a00c8020b200041003602040c030b200241a8026a20046a200820046a220541016a2d00003a0000200120033602042001200541026a3602002002200441016a22053a00c8022003417f6a21032005210420054120470d000b200241e8016a41086a200241a8026a41086a2903002209370300200241e8016a41106a200241a8026a41106a290300220a370300200241e8016a41186a200241a8026a41186a290300220b370300200241c8016a41086a22042009370300200241c8016a41106a2203200a370300200241c8016a41186a2205200b370300200220022903a80222093703e801200220093703c801200241a8026a20011076024020022802a8022201450d00200241c8006a41086a2208200241e8006a41086a290300370300200241c8006a41106a2207200241e8006a41106a290300370300200241c8006a41186a220c200241e8006a41186a290300370300200241286a41086a220d20024188016a41086a290300370300200241286a41106a220e20024188016a41106a290300370300200241286a41186a220f20024188016a41186a29030037030020022002290368370348200220022903880137032820022902ac022109200241086a41186a22102005290300370300200241086a41106a22052003290300370300200241086a41086a22032004290300370300200220022903c801370308200020093702082000200136020420002006360200200041106a2002290348370200200041186a2008290300370200200041206a2007290300370200200041286a200c290300370200200041306a2002290328370200200041386a200d290300370200200041c0006a200e290300370200200041c8006a200f290300370200200041e8006a2010290300370200200041e0006a2005290300370200200041d8006a2003290300370200200041d0006a20022903083702000c020b200041003602040c010b0240200441ff0171450d00200241003a00c8020b200041003602040b200241d0026a24000b9505020c7f017e230041b0056b22022400200241086a2001106c0240024002400240024020022802080d0020012802044190016e22034190016c2204417f4c0d02200228020c21050240024020040d00410821060c010b200410282206450d040b02402005450d00200241a0036a410472210741002108410021044100210903400240024002402001280204220a450d002001280200220b2d0000210c2001200a417f6a3602042001200b41016a360200200c41014b0d004113210a024002400240200c0e020100010b200241a8046a200110810120022802a8044113460d02200241a0036a200241a8046a418801109a051a2001280204220c4104490d012001280200220a280000210d2001200c417c6a3602042001200a41046a36020020022802a003210a2002419c026a2007418401109a051a200a4113460d0220024198016a2002419c026a418401109a051a200a4114460d020b200941016a210c200241146a20024198016a418401109a051a20092003470d0302402008200c2008200c4b1b2203ad4290017e220e422088a70d00200ea7220b41004e0d030b1031000b200241a0036a106a0b2000410036020002402009450d00200621010340024020012802004113460d002001106a0b20014190016a2101200441f07e6a22040d000b0b2003450d052006102a0c050b0240024020090d00200b102821060c010b20062004200b102c21060b2006450d070b200620046a2209200a360200200941046a200241146a418401109a051a20094188016a200d360200200841026a210820044190016a2104200c21092005200c470d000b0b2000200336020420002006360200200041086a20053602000c010b200041003602000b200241b0056a24000f0b1036000b200441081037000b200b41081037000bf3910107087f017e067f087e087f017e017f230041f0096b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541144b0d16200141046a210720050e150102030405060708090a0b0c0d0e0f101112131415010b200041133602000c4c0b02402006450d0020042d0001210620012003417e6a22083602042001200441026a360200200641054b0d004101210902400240024002400240024020060e06510001020304510b20022001106c20022802000d05200128020420022802042204490d052004417f4c0d1e02400240024020040d00410121050c010b2004102e2205450d0120072802002004490d06200520012802002004109a051a200128020422032004490d212001200320046b3602042001200128020020046a3602000b2005450d062004ad220a422086200a84210a410221090c510b200441011037000b20084108490d042004290002210a2001200341766a36020420012004410a6a360200410321090c4f0b200241086a2001106c20022802080d032001280204200228020c2204490d032004417f4c0d1c02400240024020040d00410121050c010b2004102e2205450d0120072802002004490d04200520012802002004109a051a200128020422032004490d202001200320046b3602042001200128020020046a3602000b2005450d042004ad220a422086200a84210a410421090c4f0b200441011037000b200241206a2001106c20022802200d02200728020041186e220b41186c2204417f4c0d1b2002280224210c0240024020040d00410421050c010b200410282205450d1f0b0240200c450d004100210d41002106410021080340200241186a2001106c02400240024020022802180d002001280204200228021c2204490d002004417f4c0d2002400240024020040d004101210e0c010b2004102e220e450d3920072802002004490d01200e20012802002004109a051a200128020422032004490d262001200320046b3602042001200128020020046a3602000b200241106a2001106c024020022802100d00200128020420022802142203490d002003417f4c0d22024002400240024020030d004101210f0c010b2003102e220f450d0120072802002003490d02200f20012802002003109a051a200128020422092003490d2a2001200920036b3602042001200128020020036a3602000b200841016a21092008200b470d06200d2009200d20094b1b220bad42187e220a422088a70d55200aa7221041004e0d050c550b200341011037000b200f102a0b2004450d010b200e102a0b02402008450d002005210103400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141186a2101200641686a22060d000b0b200b0d050c060b0240024020080d002010102821050c010b200520062010102c21050b2005450d240b200520066a2208200e360200200841146a2003ad220a3e02002008410c6a200a422086200fad84370200200841046a2004ad220a422086200a84370200200d41026a210d200641186a210620092108200c2009470d000b0b2005450d02200cad422086200bad84210a410521090c4d0b200241306a2001106c20022802300d012007280200410c6e220e410c6c2204417f4c0d1a2002280234210f0240024020040d00410421050c010b200410282205450d220b024002400240200f450d004100210841002103410021090340200241286a2001106c20022802280d032001280204200228022c2204490d032004417f4c0d1e0240024020040d004101210d0c010b2004102e220d450d3720072802002004490d03200d20012802002004109a051a200128020422062004490d272001200620046b3602042001200128020020046a3602000b200941016a210602402009200e470d0020082006200820064b1b220ead420c7e220a422088a70d50200aa7220b4100480d500240024020090d00200b102821050c010b20052003200b102c21050b2005450d280b200520036a2209200d360200200941086a2004360200200941046a2004360200200841026a21082003410c6a210320062109200f2006470d000b0b2005450d03200fad422086200ead84210a410621090c4e0b200d102a0b02402009450d002005210103400240200141046a280200450d002001280200102a0b2001410c6a2101200341746a22030d000b0b200e450d010b2005102a0b200041133602000c4b0b02402006450d0020012003417e6a3602042001200441026a3602000b200041133602000c4a0b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241386a2001109e012002290338a70d002002290340210a20004102360200200041086a200a370300200041106a200241e8086a41f800109a051a0c4a0b200041133602000c490b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241e0076a2001107e20022802e00722010d130b200041133602000c480b02402006450d0020012003417e6a3602042001200441026a3602000b200041133602000c470b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541024b0d00024002400240024020050e03000102000b200241e8086a200110a50120022d00e8084102460d0320024184096a290200210a200241fc086a2902002111200241e8086a41106a2802002107200241f4086a2802002104200241f0086a280200210320022802ec08210520022802e8082106200241c8006a2001109f0120022802480d03200241c8006a41106a290300211241012101200229035021130c020b200241e8086a200110a50120022d00e8084102460d02200241e0076a41086a20024180096a290300370300200241e0076a41106a20024188096a2802003602002002200241e8086a41106a2903003703e007200241f4086a2802002104200241e8086a41086a280200210320022802ec08210520022802e8082106200241f8006a2001109f012002290378a70d02200241f8006a41106a29030021122002290380012113200241e0006a2001109f012002290360a70d02200241e0006a41106a290300211420022903682115200241a8056a41106a200241e0076a41106a280200360200200241a8056a41086a200241e0076a41086a290300370300200220022903e00722163703a805200241b4056a290200210a20022902ac0521112016a7210741022101420021160c010b200241e8086a200110a50120022d00e8084102460d0120024184096a290200210a200241fc086a2902002111200241e8086a41106a22092802002107200241f4086a2802002104200241e8086a41086a2208280200210320022802ec08210520022802e8082106200241e8086a200110a50120022d00e8084102460d01200241e0076a41206a220d200241e8086a41206a280200360200200241e0076a41186a220e200241e8086a41186a290300370300200241e0076a41106a2009290300370300200241e0076a41086a2008290300370300200220022903e8083703e00720024190016a2001109f01200229039001a70d0120024190016a41106a29030021172002290398012118200241e8076a2903002112200241f0076a2903002115200e2903002114200d350200211620022903e0072113410321010b20004105360200200041e0006a2017370200200041d8006a2018370200200041c8006a2014370200200041c0006a2015370200200041386a2012370200200041306a2013370200200041286a200a370200200041206a2011370200200041d0006a20163702002000411c6a2007360200200041186a2004360200200041146a2003360200200041106a20053602002000410c6a2006360200200041086a2001360200200041e8006a200229038806370300200041f0006a20024188066a41086a290300370300200041f8006a20024188066a41106a29030037030020004180016a20024188066a41186a2903003703000c470b200041133602000c460b2006450d4120042d0001210520012003417e6a22193602042001200441026a3602002005410c4b0d41410421104100211a4100211b02400240024002400240024002400240024002400240024020050e0d0001024e030405060708090a0b000b200241e0076a200110a50120022d00e0074102460d4c200241ec076a290200211120024180086a280200210b200241ff076a2d00002108200241fe076a2d0000210d200241fd076a2d0000210c200241f9076a2800002104200241f5076a280000210f200241f4076a2d0000210e20022902e407210a20022802e0072106200241a8016a2001109f0120022903a801a70d4c20072802002203450d4c200241b8016a290300211320022903b0012112200128020022052d0000210920012003417f6a360204410121102001200541016a36020020094103492201450d4c200441807e71410020011b211b2004410020011b211a0c4d0b200241c0016a2001109f0120022903c001a70d4b200241d0016a290300211120022903c801210a410221104100211b0c4c0b200241d8016a2001109f0120022903d801a70d4a200241e8016a290300211120022903e001210a410321104100210c4100211a4100211b0c4b0b200241f0016a2001109f0120022903f001a70d4920024180026a290300211120022903f801210a410521104100211b0c4a0b20024188026a2001106c2002280288020d48200728020041246e221c41246c2204417f4c0d19200228028c02211d0240024020040d00410421060c010b200410282206450d240b0240201d450d0041232105200241f0076a211e41002107410021040340200241e0076a200110a501024020022d00e00722094102470d00201c450d4b2006102a0c4b0b200441016a2103201e290300210a20022903e807211120022d008308210820022d008208210d20022d008108210e20022800fd07210f20022800f907210b20022d00f807210c20022802e407211020022d00e307211b20022d00e207211920022d00e107211f02402004201c470d0020072003200720034b1b221cad42247e2212422088a70d4d2012a722204100480d4d0240024020040d002020102821060c010b20062005415d6a2020102c21060b2006450d270b200620056a220420083a0000200441656a2208200a370008200820113700002004417f6a200d3a00002004417e6a200e3a00002004417a6a200f360000200441766a200b360000200441756a200c3a0000200441616a2010360000200441606a201b3a00002004415f6a20193a00002004415e6a201f3a00002004415d6a20093a0000200741026a2107200541246a210520032104201d2003470d000b0b2006450d48201dad422086201cad84210a42002111410621104100211b0c490b410721104100211b0c480b2019450d4620042d0002210920012003417d6a3602042001200441036a360200200941034f0d46410821104100211b0c470b200241e0076a200110a50120022d00e0074102460d45200241f9076a280000221a41807e71211b200241ec076a290200211120024180086a280200210b200241ff076a2d00002108200241fe076a2d0000210d200241fd076a2d0000210c200241f5076a280000210f200241f4076a2d0000210e20022902e407210a20022802e0072106410921100c460b20024190026a2001106c2002280290020d442002280294022106410a21104100211b0c450b410b21104100211b0c440b410c21104100211b0c430b200241e0076a2001106d20022802e0072206450d4120022902e407210a42002111410d21104100211b0c420b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241e8086a200110e80120022d00e8084101460d00200241e0076a200241e8086a41017241e000109a051a20024198026a2001106c2002280298020d002001280204200228029c022204490d002004417f4c0d12024002400240024020040d004101210341010d010c040b2004102e2203450d0120072802002004490d02200320012802002004109a052105200128020422062004490d212001200620046b3602042001200128020020046a3602002005450d030b20024188066a200241e0076a41e000109a051a200241a8056a20024188066a41e000109a051a2000410c6a2004360200200041086a20043602002000200336020420004107360200200041106a200241a8056a41e000109a051a20004180016a20024188076a41106a290300370300200041f8006a20024188076a41086a290300370300200041f0006a2002290388073703000c470b200441011037000b2003102a0b200041133602000c440b2006450d3e20042d0001210520012003417e6a221d3602042001200441026a360200200541104b0d3e410e211a4100211c024002400240024002400240024002400240024002400240024002400240024020050e11000102030405060708090a0b0c4d0d0e0f000b200241e0076a200110810120022802e0074113460d4d200241e8086a200241e0076a418801109a051a41880110282206450d382006200241e8086a418801109a052104200241a0026a2001109f01024020022903a002a7450d002004106a2004102a0c4e0b200241b0026a290300210a2004411876211c20022903a8022211422088a7211f2011a7211b4101211a0c4c0b200241b8026a2001106c20022802b8020d4c20022802bc022206411876211c4102211a0c4a0b200241c0026a2001106c20022802c0020d4b20072802002204450d4b20022802c4022106200128020022052d0000210320012004417f6a3602042001200541016a360200200341ff0071220d41064b0d4b2006411876211c200341077621084103211a0c480b200241c8026a2001106c20022802c8020d4a20072802002204450d4a20022802cc022106200128020022052d0000210320012004417f6a3602042001200541016a360200200341ff0071220d41064b0d4a2006411876211c200341077621084104211a0c470b201d4104490d492004280002210620012003417a6a3602042001200441066a3602002006411876211c4105211a0c470b200241e0076a200110810120022802e0074113460d48200241e8086a200241e0076a418801109a051a41880110282206450d342006200241e8086a418801109a05411876211c4106211a0c460b200241e0076a200110810120022802e0074113460d47200241e8086a200241e0076a418801109a051a41880110282206450d342006200241e8086a418801109a05411876211c4107211a0c450b200241e0076a200110810120022802e0074113460d46200241e8086a200241e0076a418801109a051a41880110282206450d342006200241e8086a418801109a05411876211c4108211a0c440b41002105200241003a0088092003417e6a2109417d21060340024020092005470d00200541ff0171450d47200241003a0088090c470b200241e8086a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0088092006417f6a21062007210520074120470d000b200241b0056a2205200241f1086a290000370300200241a8056a41106a200241f9086a290000370300200241bf056a220620024180096a290000370000200220022900e908220a3703a805200320076b2203417e6a4104490d4520022d00ac05210920022f01aa05210d200241b5056a330000211120023500b105211220052d0000211b20022f01ae05211a200241bd056a3100002113200241bb056a330000211620023500b705211820022d00e80821082006280000210f20022d00ad05211c20022d00a905211020022800c305210b20022d00be05210e200420076a220441026a280000210c20012003417a6a22053602042001200441066a220736020020054104490d45200d2009411074722106200aa7210d200728000021192001200341766a36020420012004410a6a36020020182016201342108684422086844208862012201142208684221142ffffffffffff3f83221242288884210a2012421886201a201b41107472ad42ffffff078384a7211b2011420888a7211f4109211a0c440b41002105200241003a0088092003417e6a21072003417d6a21030340024020072005470d00200541ff0171450d46200241003a0088090c460b200241e8086a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0088092003417f6a21032006210520064120470d000b200241b0056a200241f1086a290000370300200241bf056a220120024180096a290000370000200241a8056a41106a200241f9086a290000370300200220022900e90822113703a80520022f01aa0520022d00ac0541107472210620022901ae052212422088a7211f20022d00e80821082001280000210f200241b6056a290100210a20022d00ad05211c20022d00a905211020022800c305210b20022d00be05210e2011a7210d2012a7211b410a211a0c430b200241d0026a2001106c20022802d0020d4320022802d4022206411876211c410b211a0c410b200241e8026a2001106c20022802e8020d4220022802ec022106200241e0026a2001106c20022802e0020d4220022802e402211b200241d8026a2001106c20022802d8020d4220022802dc02211f2006411876211c410c211a0c410b41002105200241003a0088092003417e6a21072003417d6a21030340024020072005470d00200541ff0171450d43200241003a0088090c430b200241e8086a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0088092003417f6a21032006210520064120470d000b200241b0056a200241f1086a290000370300200241bf056a220120024180096a290000370000200241a8056a41106a200241f9086a290000370300200220022900e90822113703a80520022f01aa0520022d00ac0541107472210620022901ae052212422088a7211f20022d00e80821082001280000210f200241b6056a290100210a20022d00ad05211c20022d00a905211020022800c305210b20022d00be05210e2011a7210d2012a7211b410d211a0c400b41002105200241003a0088092003417e6a21072003417d6a21030340024020072005470d00200541ff0171450d42200241003a0088090c420b200241e8086a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0088092003417f6a21032006210520064120470d000b200241b0056a2201200241f1086a290000370300200241a8056a41106a200241f9086a290000370300200241bf056a220420024180096a290000370000200220022900e90822123703a80520023500b705200241bb056a330000200241bd056a310000421086844220868442088620023500b105200241b5056a33000042208684221142288884210a201142188620023301ae0520013100004210868484a7211b20022f01aa0520022d00ac054110747221062011420888a7211f20022d00e80821082004280000210f20022d00ad05211c20022d00a905211020022800c305210b20022d00be05210e2012a7210d410f211a0c3f0b41002105200241003a0088092003417e6a21092003417d6a21060340024020092005470d00200541ff0171450d41200241003a0088090c410b200241e8086a20056a200420056a220741026a2d00003a0000200120063602042001200741036a3602002002200541016a22073a0088092006417f6a21062007210520074120470d000b200241b0056a200241f1086a290000370300200241b8056a200241f9086a290000370300200241bf056a220520024180096a290000370000200220022900e908220a3703a805200241d8076a41046a20022d00ac053a0000200241e8066a41046a200241b5056a2f00003b01002002200a3e02d807200220022800b1053602e8062003417e6a2007460d3f20022d00e808210820022800ad05211c2005290000211120022900b705210a200420076a220441026a2d00002109200120063602042001200441036a360200200941064b0d3f20024190076a200241e8066a41046a2f01003b0100200220022802d807220d3602d007200220022802e80636028c072002201c360288072002200a37019207200a423888201142088684a7210e4110211a20022f01d207200241d8076a41046a2d00004110747221062011422088a7210b2002290089072212422088a7211f20024191076a290000210a20022d00d10721102011a7210f2012a7211b0c3e0b4111211a0c3d0b200241e0076a200110e90120022d00e0074105470d0d200041133602000c420b200241e0076a200110e90120022d00e0074105470d0d200041133602000c410b2006450d3720042d0001210520012003417e6a3602042001200441026a360200200541094b0d37024002400240024002400240024002400240024020050e0a00010203040506070809000b200241e0076a2001107520022802e0072204450d40200241e8076a280200210520022802e4072103200241f0026a2001106c024020022802f002450d0020030d400c410b0240200728020022094104490d0020022802f402210620012802002208280000210720012009417c6a220d3602042001200841046a360200200d4110490d002008410c6a29000021122008290004211320012009416c6a3602042001200841146a360200410121010c3f0b20030d3f0c400b200241e0076a2001107520022802e0072204450d3f200241e8076a280200210520022802e4072103200241f8026a2001106c024020022802f802450d002003450d400c3f0b0240200728020022094104490d0020022802fc02210620012802002208280000210720012009417c6a220d3602042001200841046a360200200d4110490d002008410c6a29000021122008290004211320012009416c6a3602042001200841146a360200410221010c3e0b20030d3e0c3f0b20024190036a2001106c2002280290030d3e2002280294032104200241e0076a200110a50120022d00e0074102460d3e20024188066a41086a200241f8076a29030037030020024188066a41106a20024180086a2802003602002002200241e0076a41106a29030037038806200241ec076a2802002107200241e0076a41086a280200210620022802e407210520022802e007210320024188036a2001106c2002280288030d3e200228028c03210920024180036a2001106c2002280280030d3e20024198066a280200210820024190066a29030021122002290388062113200228028403ad210a42002111410321010c3c0b20024198036a2001106c2002280298030d3d41042101200228029c0321040c3b0b200241a0036a2001106c20022802a0030d3c4105210120022802a40321040c3a0b200241e0076a200110a50120022d00e0074102460d3b20024188066a41086a200241f8076a29030037030020024188066a41106a20024180086a2802003602002002200241e0076a41106a29030037038806200241e0076a41086a290300211620022903e0072118200241b0036a2001109f0120022903b003a70d3b200241b0036a41106a290300211120022903b803210a200241a8036a2001106c20022802a8030d3b20022802ac032108200241a8056a41106a20024188066a41106a280200360200200241a8056a41086a20024188066a41086a290300370300200220022903880622173703a8052018422088a721032016422088a72106200241b4056a290200211220022902ac0521132017a721072018a721042016a72105410621010c390b200241c8036a2001106c20022802c8030d3a4107210120022802cc0321040c380b200241e0076a200110a50120022d00e0074102460d39200241fc076a2902002112200241f4076a2902002113200241f0076a2802002107200241ec076a280200210641082101200241e0076a41086a280200210520022802e407210320022802e00721040c370b200241d0036a2001106c20022802d0030d384109210120022802d40321040c360b200241d8036a2001106c20022802d8030d37410a210120022802dc0321040c350b2006450d3320042d0001210520012003417e6a3602042001200441026a360200200541034b0d33024002400240024020050e0400010203000b41002105200241003a0080082003417e6a21072003417d6a21030340024020072005470d00200541ff0171450d38200241003a0080080c380b200241e0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0080082003417f6a21032006210520064120470d000b200241a8056a41106a200241f1076a290000370300200241b0056a200241e0076a41096a290000220a370300200241bf056a2201200241e0076a41186a290000370000200241e8066a41096a200a370000200241e8066a41106a200241b7056a290000370000200220022d00e007220d3a00e806200220022900e1073700e9062001280000210f20022800c305210b20022800ef06220c411876211020022800eb062201411876210820022d00ff06211b20022900f706211220022800f306211a20022d00ea06211920022d00e906211f4101211c0c350b41002105200241003a0080082003417e6a21072003417d6a21030340024020072005470d00200541ff0171450d37200241003a0080080c370b200241e0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0080082003417f6a21032006210520064120470d000b200241b0056a200241e9076a290000370300200241bf056a2204200241e0076a41186a290000370000200241a8056a41106a200241f1076a290000370300200220022900e107220a3703a80520022f01aa0520022d00ac0541107472210120022901ae052211a7220c41187621102011422088a7211a20022d00e007210d2004280000210f200241b6056a290100211220022d00ad05210820022d00a905211920022800c305210b20022d00be05211b200aa7211f4102211c0c340b41002105200241003a008008410220036b21092003417d6a210603400240200920056a0d00200541ff0171450d36200241003a0080080c360b200241e0076a20056a200420056a220741026a2d00003a0000200120063602042001200741036a3602002002200541016a22073a0080082006417f6a21062007210520074120470d000b200241b0056a200241e9076a290000370300200241b8056a200241f1076a290000370300200241bf056a2205200241f8076a290000370000200220022900e107220a3703a805200241d8076a41046a20022d00ac053a0000200241e8066a41046a200241b5056a2f00003b01002002200a3e02d807200220022800b1053602e80620022d00e007210d20022800ad0521082005290000211320022900b705211241002105200241003a008008200420076a2109200720036b41026a210303400240200320056a0d00200541ff0171450d36200241003a0080080c360b200241e0076a20056a200920056a220441026a2d00003a0000200120063602042001200441036a3602002002200541016a22043a0080082006417f6a21062004210520044120470d000b200241bf056a2201200241f8076a290000370000200241a8056a41106a200241f1076a290000370300200241a8056a41086a2203200241e9076a290000370300200220022900e10722163703a80520022d00e007210420012800002109200241bb056a3300002111200241bd056a3100002118200241b5056a330000210a2003310000211720022801aa05210620022d00a905210520022800c305210e20022d00be05210720023500b705211520023500b105211420023301ae052121200241d0076a41046a2201200241d8076a41046a2d00003a0000200220022802d8073602d007200220083602880720024188076a41086a200241e8066a41046a2f01003b0100200220022802e80636028c0720022012370192072002419a076a20133701002014200a422086842214421886202120174210868484210a201520112018421086844220868442088620144228888421112012423888201342088684a7211b2008410876210c20022f01d20720012d00004110747221012013422088a7210b2002290091072112200228008d07211a20022d008c07211020022d00d107211920022d00d007211f2016a721032013a7210f4103211c0c330b200241e0076a2001106d20022802e0072201450d3320022802e407220c411876211020014118762108200241e8076a280200211a4104211c0c320b024002402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241e0036a2001106c20022802e003450d010b200041133602000c3f0b20022802e40321012000410d36020020002001360204200041086a200241e8086a418001109a051a0c3e0b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241e8036a2001106c20022802e8030d00200128020420022802ec032204490d002004417f4c0d0b024002400240024020040d00410121030c010b2004102e2203450d0120072802002004490d02200320012802002004109a051a200128020422052004490d1b2001200520046b3602042001200128020020046a3602000b2003450d02200020033602042000410e360200200041086a2004ad220a422086200a84370200200041106a200241e8086a41f800109a051a0c400b200441011037000b2003102a0b200041133602000c3d0b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541024b0d0002400240024020050e03000102000b200241f0036a2001109f0120022903f003a70d0220024180046a290300210a20022903f8032111200241e0076a200110a50120022d00e0074102460d02200241fc076a2902002112200241f4076a2902002113200241f0076a2802002101200241ec076a2802002104200241e8076a280200210320022802e407210520022802e0072106410121070c310b20024188046a2001106c2002280288040d0141022107200228028c0421060c300b20024190046a2001106c2002280290040d004103210720022802940421060c2f0b200041133602000c3c0b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541044b0d0002400240024002400240024002400240024020050e050001020607000b200241e8086a200110ea0120022d00d8094102460d08200241e8076a20024198096a290300370300200241f0076a200241a0096a29030037030020022002290390093703e0072002418c096a280200210b20024184096a2802002104200241fd086a2800002108200241f9086a280000210d200228028809211b20022d008309210520022d008209210620022d008109210f20022d00f808210e20022903f008210a20022903e8082111200241d8096a2903002113200241b8096a2903002116200241c5096a2800002101200241c1096a280000210320022903d009211820022903b009211720022802cc09210720022d00cb09210c20022d00ca09211f20022d00c909211c20022d00c009211d20022903a8092112410121220c020b200241a0046a2001109e0120022903a004a70d0720022903a804210a20024198046a2001106c2002280298040d072001280204200228029c042204490d072004417f4c0d1002400240024020040d00410121090c010b2004102e2209450d0120072802002004490d08200920012802002004109a051a200128020422032004490d202001200320046b3602042001200128020020046a3602000b2009450d082004ad22114220862011842111200241e0076a41106a200241e8086a41106a290300370300200241e0076a41086a200241e8086a41086a290300370300200220022903e8083703e007410221220c350b200441011037000b200241e8086a200110a50120022d00e8084102460d06200241f4086a290200210a20024188096a280200210420024187096a2d0000210520024186096a2d0000210620024185096a2d0000210f20024181096a2800002108200241fd086a280000210d200241fc086a2d0000210e20022902ec08211120022802e8082109200241c8046a2001109f0120022903c804a70d06200241d8046a290300211320022903d0042116200241b8046a2001109e0120022903b804a70d0620022903c0042112200241b0046a2001106c20022802b0040d06200128020420022802b404220b490d06200b417f4c0d0f02400240200b0d004101211b41010d010c080b200b102e221b450d022007280200200b490d03201b2001280200200b109a05210320012802042207200b490d1f20012007200b6b36020420012001280200200b6a3602002003450d070b200241f0076a2013370300200220163703e8072002200b3602e007410321220b0c320b200b41011037000b201b102a0c030b200241f8046a2001109f0120022903f804a70d0220024188056a290300210a2002290380052111200241e8046a2001109e0120022903e804a70d0220022903f004211241002103200241003a0088092007280200417f6a21040240024002400240024003402004417f460d01200241e8086a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0088092004417f6a21042005210320054120470d000b20024190076a200241e8086a410e6a290100221337030020024198076a200241e8086a41166a2204290100370300200241a0076a20024186096a2f01003b0100200241e8066a410e6a2013370100200241e8066a41166a20042f01003b0100200220022d00e80822103a00e806200220022800e9083600e906200220022d00ed083a00ed06200220022901ee0822133701ee062002201337038807200228019e072108200228019a07210d200241e0046a2001106c20022802e0040d07200128020420022802e404220b490d07200b417f4c0d10200b0d01410121040c020b200341ff0171450d06200241003a0088090c060b200b102e2204450d012007280200200b490d0220042001280200200b109a051a20012802042203200b490d1e20012003200b6b36020420012001280200200b6a3602000b2004450d04200220113703e007200220123703f0072002200a3703e807200241f7066a290000210a20022900ef06211120022d00ff06210e20022800eb06210920022d00ea06211a20022d00e906211941042122200b211b0c310b200b41011037000b2004102a0c020b41002105200241003a0088092003417e6a21092003417d6a21060340024020092005470d00200541ff0171450d03200241003a0088090c030b200241e8086a20056a200420056a220741026a2d00003a0000200120063602042001200741036a3602002002200541016a22073a0088092006417f6a21062007210520074120470d000b2003417e6a2007460d01200241f7086a290000210a20022900ef08211120022d00e808211020022d00e908211920022d00ea08211a20022800eb08210920022d00ff08210e200228028009210d2002280284092108200420076a220c41026a2d0000211f200120063602042001200c41036a360200201f41014b0d014100210f02400240201f0e020100010b41002104200241003a008809200720036b41036a2106200320076b417c6a210303400240200620046a0d00200441ff0171450d04200241003a0088090c040b200241e8086a20046a200c20046a220541036a2d00003a0000200120033602042001200541046a3602002002200441016a22053a0088092003417f6a21032005210420054120470d000b200241b0056a200241f1086a290000370300200241b8056a200241f9086a290000370300200241bf056a220120024180096a290000370000200220022900e90822123703a805200241d8076a41046a20022d00ac053a0000200241e8066a41046a2203200241b5056a2f00003b0100200220123e02d807200220022800b1053602e80620022d00e808210620022800ad05211b2001290000211320022900b705211220022802e806210b20022800d907210420022d00d8072105200220032f01003b0188074101210f0b200241ea076a2013370100200241f6076a200241ce076a2f01003b0100200220022f0188073b01e007200220123701e207200220022801ca073601f207410521220c2e0b2009102a0b200041133602000c3b0b2006450d2a20042d0001210520012003417e6a3602042001200441026a360200200541024b0d2a0240024002400240024020050e03000102000b200241e0076a200110810120022802e0074113470d020c2e0b200241e8086a200110a5014102210120022d00e8084102460d2d200241a8056a41106a20024188096a280200360200200241a8056a41086a20024180096a2903003703002002200241e8086a41106a29030022123703a80520022903e8082213422088a72103200241e8086a41086a2903002216422088a72105200241b4056a290200210a20022902ac0521112013a721042012a721062016a721070c020b200241e8086a200110a50120022d00e8084102460d2c20024184096a290200210a200241fc086a2902002111200241f8086a2802002106200241f4086a2802002105200241f0086a280200210720022802ec08210320022802e8082104200241e0076a200110810120022802e0074113460d2c200241e8086a200241e0076a418801109a051a41880110282209450d1b2009200241e8086a418801109a051a410321010c010b200241e8086a200241e0076a418801109a051a41880110282204450d192004200241e8086a418801109a051a410121010b2000200136020420004111360200200041246a200a3702002000411c6a20113702002000412c6a2009360200200041186a2006360200200041146a2005360200200041106a20073602002000410c6a2003360200200041086a2004360200200041306a20024188066a41d800109a051a0c3a0b2006450d2820042d0001210520012003417e6a22063602042001200441026a36020020050d2820064104490d282004280002210b20012003417a6a3602042001200441066a360200200241a0056a2001106c20022802a0050d28200128020420022802a4052205490d282005417f4c0d060240024020050d004101210c41010d010c2a0b2005102e220c450d2520072802002005490d28200c20012802002005109a052104200128020422032005490d1a2001200320056b3602042001200128020020056a3602002004450d290b20024198056a2001106c2002280298050d262007280200410c6e220f410c6c2204417f4c0d06200228029c0521100240024020040d004104210e0c010b20041028220e450d1b0b0240024002400240024002402010450d00410021084100210341002109034020024190056a2001106c2002280290050d0320012802042002280294052204490d032004417f4c0d0d0240024020040d004101210d0c010b2004102e220d450d2b20072802002004490d03200d20012802002004109a051a200128020422062004490d232001200620046b3602042001200128020020046a3602000b200941016a210602402009200f470d0020082006200820064b1b220fad420c7e220a422088a70d3f200aa7221b4100480d3f0240024020090d00201b1028210e0c010b200e2003201b102c210e0b200e450d240b200e20036a2209200d360200200941046a2004ad220a422086200a84370200200841026a21082003410c6a21032006210920102006470d000b0b200e450d2b200c450d2d200728020022034104490d0220012802002207280000210820012003417c6a22043602042001200741046a36020020044104490d032007280004210d2001200341786a22093602042001200741086a36020041002104200241003a00a809200341776a2103034020092004460d05200241e8086a20046a200720046a220641086a2d00003a0000200120033602042001200641096a3602002002200441016a22063a00a8092003417f6a210320062104200641c000470d000b200241e0076a41386a2201200241e8086a41386a290300370300200241e0076a41306a2204200241e8086a41306a290300370300200241e0076a41286a2203200241e8086a41286a290300370300200241e0076a41206a2207200241e8086a41206a290300370300200241e0076a41186a2209200241e8086a41186a290300370300200241e0076a41106a221b200241e8086a41106a290300370300200241e0076a41086a221a200241e8086a41086a290300370300200220022903e8083703e007200641ff017141c000490d2a20024188066a41386a2206200129030037030020024188066a41306a2004290300220a37030020024188066a41286a2003290300221137030020024188066a41206a2007290300221237030020024188066a41186a2009290300221337030020024188066a41106a201b290300221637030020024188066a41086a201a2903002218370300200220022903e007221737038806200241a8056a41306a200a370300200241a8056a41286a2011370300200241a8056a41206a2012370300200241a8056a41186a2013370300200241a8056a41106a2016370300200241a8056a41086a2018370300200241a8056a41386a2006290300370300200220173703a805200c450d2d20024188076a41386a2201200241a8056a41386a29030037030020024188076a41306a2204200241a8056a41306a29030037030020024188076a41286a2203200241a8056a41286a29030037030020024188076a41206a2206200241a8056a41206a29030037030020024188076a41186a2207200241a8056a41186a29030037030020024188076a41106a2209200241a8056a41106a29030037030020024188076a41086a221b200241a8056a41086a290300370300200220022903a80537038807200041246a200d360200200041206a20083602002000411c6a2010360200200041186a200f360200200041146a200e360200200041106a20053602002000410c6a2005360200200041086a200c3602002000200b36020420004112360200200041286a200229038807370200200041306a201b290300370200200041386a2009290300370200200041c0006a2007290300370200200041c8006a2006290300370200200041d0006a2003290300370200200041d8006a2004290300370200200041e0006a200129030037020020004180016a200241e8066a41186a290300370300200041f8006a200241e8066a41106a290300370300200041f0006a200241e8066a41086a290300370300200041e8006a20022903e8063703000c3e0b200d102a0b02402009450d00200e210103400240200141046a280200450d002001280200102a0b2001410c6a2101200341746a22030d000b0b200f450d29200e102a0c290b02402005450d00200c102a0b02402010450d002010410c6c2104200e210103400240200141046a280200450d002001280200102a0b2001410c6a2101200441746a22040d000b0b200f450d2a200e102a0c2a0b02402005450d00200c102a0b02402010450d002010410c6c2104200e210103400240200141046a280200450d002001280200102a0b2001410c6a2101200441746a22040d000b0b200f450d29200e102a0c290b200441ff0171450d25200241003a00a8090c250b02402006450d0020012003417e6a3602042001200441026a3602000b200041133602000c380b02402006450d0020012003417e6a3602042001200441026a3602000b200041133602000c370b200041133602000c360b200041086a20022902e4073702002000200136020420004103360200200041106a200241e8086a41f800109a051a0c350b20024188066a41206a200241e0076a41206a290300220a37030020024188066a41186a200241e0076a41186a290300221137030020024188066a41106a200241e0076a41106a290300221237030020024188066a41086a200241e0076a41086a2903002213370300200220022903e00722163703880620004109360200200020163702042000410c6a2013370200200041146a20123702002000411c6a2011370200200041246a200a3702002000412c6a200241e8086a41dc00109a051a0c340b20024188066a41206a200241e0076a41206a290300220a37030020024188066a41186a200241e0076a41186a290300221137030020024188066a41106a200241e0076a41106a290300221237030020024188066a41086a200241e0076a41086a2903002213370300200220022903e0072216370388062000410a360200200020163702042000410c6a2013370200200041146a20123702002000411c6a2011370200200041246a200a3702002000412c6a200241e8086a41dc00109a051a0c330b1036000b200420031044000b200420031044000b200441041037000b200420031044000b200320091044000b201041041037000b200441041037000b200420061044000b200b41041037000b200441041037000b202041041037000b200420061044000b200420051044000b200420031044000b200b20071044000b200b20031044000b41880141081037000b41880141081037000b200520031044000b200441041037000b200420061044000b201b41041037000b200441011037000b200441011037000b41880141081037000b41880141081037000b41880141081037000b41880141081037000b200441011037000b200541011037000b02402005450d00200c102a0b02402010450d002010410c6c2104200e210103400240200141046a280200450d002001280200102a0b2001410c6a2101200441746a22040d000b0b200f450d02200e102a0c020b2005450d010b200c102a0b200041133602000c100b200041133602000c0f0b20024188066a41106a221e200241e0076a41106a29030037030020024188066a41086a2220200241e0076a41086a290300370300200220022903e00737038806200041346a200b360200200041306a201b3602002000412c6a2004360200200020053a002b200020063a002a2000200f3a0029200041256a2008360000200041216a200d360000200041206a200e3a0000200041186a200a370200200041106a20113700002000410c6a20093600002000201a3a000b200020193a000a200020103a0009200041086a20223a000020004110360200200041d0006a2012370200200041e9006a2003360000200041ed006a2001360000200041f4006a2007360200200041f8006a201837020020004180016a20133702002000200c3a00732000201f3a00722000201c3a0071200041e8006a201d3a0000200041d8006a2017370200200041e0006a2016370200200041386a200229038806370200200041c0006a2020290300370200200041c8006a201e2903003702000c0e0b2000410f360200200041386a200a370200200041306a2011370200200041286a2012370200200041206a20133702002000411c6a2001360200200041186a2004360200200041146a2003360200200041106a20053602002000410c6a2006360200200041086a2007360200200041c0006a200241e8086a41c800109a051a0c0d0b2000200e3600412000200936003d200020053a0027200020033a0026200020043a0025200020193a00072000201f3a00062000200d3a00052000201c3a00042000410c360200200041346a20113700002000412c6a200a3700002000413c6a20073a0000200041286a2006360000200041216a200b3600002000411d6a200f3600002000411c6a201b3a0000200041146a2012370000200041106a201a3600002000410c6a2010411874200c41ffffff077172360000200041086a2008411874200141ffffff07717236000020004180016a200241a0096a290300370300200041f8006a20024198096a290300370300200041f0006a200241e8086a41286a290300370300200041e8006a20024188096a290300370300200041e0006a200241e8086a41186a290300370300200041d8006a200241e8086a41106a290300370300200041d0006a200241e8086a41086a290300370300200041c8006a20022903e8083703000c0c0b200041133602000c0b0b2000410b360200200041c0006a2011370200200041386a200a370200200041286a2012370200200041206a2013370200200041346a2009360200200041306a20083602002000411c6a2007360200200041186a2006360200200041146a2005360200200041106a20033602002000410c6a2004360200200041086a2001360200200041c8006a20022903e808370300200041d0006a200241e8086a41086a290300370300200041d8006a200241e8086a41106a290300370300200041e0006a200241e8086a41186a290300370300200041e8006a200241e8086a41206a290300370300200041f0006a200241e8086a41286a290300370300200041f8006a200241e8086a41306a29030037030020004180016a200241e8086a41386a2903003703000c0a0b2004102a0b200041133602000c080b4100211f4200210a0c010b4100211f4200210a0b200020093a0029200020103a000b2000200d3a000a200020083a000920004108360200200041186a200a370200200041346a4100360200200041306a20193602002000412c6a200c360200200041256a200b360000200041216a200f360000200041206a200e3a0000200041086a201a3a00002000410c6a201c411874200641ffffff077172360200200041106a201fad422086201bad84370200200041386a20024188066a41d000109a051a0c050b200041133602000c040b200041133602000c030b200020083a002b2000200d3a002a2000200c3a0029200020093a000920004106360200200041386a2013370200200041306a2012370200200041186a2011370200200041106a200a3702002000412c6a200b360200200041216a200f360000200041206a200e3a00002000410c6a2006360200200041086a20103a0000200041256a201b201a41ff017172360000200041c0006a200241e8086a41c800109a051a0c020b1031000b20004100360200200041106a200a3702002000410c6a2005360200200041086a2009360200200041186a200241e8086a41f000109a051a0b200241f0096a24000bf602010b7f230041106b22022400200241086a2001106c0240024002400240024020022802080d0020012802042203417c712204417f4c0d02200228020c210502400240200341027622060d00410421070c010b200410282207450d040b02402005450d0041002108410021094100210403400240024002402001280204220a4104490d00200441016a21032001280200220b280000210c2001200a417c6a3602042001200b41046a36020020042006470d02024020082003200820034b1b220641ffffffff03712006470d002006410274220a41004e0d020b1031000b200041003602002006450d052007102a0c050b0240024020040d00200a102821070c010b20072009200a102c21070b2007450d070b200720096a200c360200200841026a2108200941046a21092003210420052003470d000b0b2000200636020420002007360200200041086a20053602000c010b200041003602000b200241106a24000f0b1036000b200441041037000b200a41041037000bbf0701107f230041f0006b22032400200341206a2001200228020c22041102000240024020032802200d002000410036020820004201370200200120022802001103002002280204450d012001102a0c010b200341c8006a41106a200341206a41106a290300370300200341c8006a41086a200341206a41086a290300370300200341c8006a41186a200341206a41186a290300370300200341c8006a41206a200341206a41206a280200360200200341086a200341d4006a290200370300200341106a200341dc006a290200370300200341186a200341e4006a290200370300200320032903203703482003200329024c370300200341c8006a2001200228021022051102000240417f2003280248220641016a220720072006491b220641ffffff3f712006470d0020064105742207417f4c0d004101210841012109024002402007450d00200710282209450d010b20092003290300370000200941186a200341186a220a290300370000200941106a200341106a220b290300370000200941086a200341086a220c290300370000200341206a200120041102000240024020032802200d002006210d0c010b200341c8006a41047221074120210e410121080340200341c8006a41206a200341206a41206a280200360200200341c8006a41186a220f200341206a41186a290300370300200341c8006a41106a2210200341206a41106a290300370300200341c8006a41086a2211200341206a41086a29030037030020032003290320370348200c200741086a290000370300200b200741106a290000370300200a200741186a29000037030020032007290000370300200f200a2903003703002010200b2903003703002011200c290300370300200320032903003703480240024020082006460d002006210d0c010b200341206a2001200511020002402006417f2003280220220d41016a22122012200d491b6a220d2006490d0020064101742212200d2012200d4b1b220d41ffffff3f71200d470d00200d41057422124100480d000240024020060d002012102821090c010b200920064105742012102c21090b20090d01201241011037000b1031000b2009200e6a22062003290348370000200641186a200f290300370000200641106a2010290300370000200641086a2011290300370000200341206a20012004110200200e41206a210e200841016a2108200d210620032802200d000b0b2001200228020011030002402002280204450d002001102a0b200020083602082000200d360204200020093602000c020b200741011037000b1036000b200341f0006a24000bad08040c7f017e057f037e23004180016b22022400024002400240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014b210903402003200441206a220a360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a29000037030020022004290000370360410021040240024020090d0020080e020401040b2008210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a4120109c054101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a4120109c050d02200a2104200a2005470d000b0b20004100360208200042013702002001280204450d012001280200102a0c010b200241c0006a41086a2204200241e0006a41086a290300370300200241c0006a41106a220b200241e0006a41106a290300370300200241c0006a41186a220c200241e0006a41186a29030037030020022002290360220e3703002002200e370340024041201028220f450d00200f2002290340370000200f41186a200c290300370000200f41106a200b290300370000200f41086a2004290300370000200128020421102001280200211102400240200a2005470d0041012112410121130c010b41012112410121130340200628020821032006280200210702400340200241e0006a41186a2208200a41186a290000370300200241e0006a41106a2209200a41106a290000370300200241e0006a41086a2201200a41086a2900003703002002200a290000370360200a41206a210a4100210402400240200341014b0d0020030e020301030b2003210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a4120109c054101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a4120109c050d01200a2005470d000c030b0b200241c0006a41086a2001290300220e370300200241c0006a41106a20092903002214370300200241c0006a41186a20082903002215370300200220022903602216370340200241186a220b2015370300200241106a220c2014370300200241086a220d200e37030020022016370300024020132012470d000240201241016a22042012490d00201241017422072004200720044b1b221341ffffff3f712013470d00201341057422044100480d000240024020120d0020041028210f0c010b200f20124105742004102c210f0b200f0d01200441011037000b1031000b200f20124105746a22042002290300370000200441186a200b290300370000200441106a200c290300370000200441086a200d290300370000201241016a2112200a2005470d000b0b02402010450d002011102a0b20002012360208200020133602042000200f3602000c010b412041011037000b20024180016a24000bce0401057f23004180016b2202240002400240024020012802042203200128020022046b41e100490d0003402001200441206a360200200241206a2004108601024020022802602204450d00200241206a21010c030b20012001280200220441206a360200200241206a2004108601024020022802602204450d00200241206a21010c030b20012001280200220441206a360200200241206a2004108601024020022802602204450d00200241206a21010c030b20012001280200220441206a360200200241206a2004108601024020022802602204450d00200241206a21010c030b20012802042203200128020022046b41e0004b0d000b0b024020042003460d0003402001200441206a360200200241206a2004108601024020022802602204450d00200241206a21010c030b200128020022042001280204470d000b0b200041003602400c010b20002001290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200241086a2203200141cc006a290200370300200241106a2205200141d4006a290200370300200241186a2206200141dc006a2802003602002002200141c4006a2902003703002000200436024020002002290300370244200041cc006a2003290300370200200041d4006a2005290300370200200041dc006a20062802003602000b20024180016a24000bf00c030c7f017e067f230041a0026b22022400024002400240411010282203450d002003410029008ab740370000200341086a4100290092b7403700002002429080808080023702e401200220033602e0012002200241e0016a3602a0012001200241a0016a10c80120022802e001210320022802e8012101200241f8006a41186a22044200370300200241f8006a41106a22054200370300200241f8006a41086a220642003703002002420037037820032001200241f8006a1000200241d8006a41186a2004290300370300200241d8006a41106a2005290300370300200241d8006a41086a200629030037030020022002290378370358024020022802e401450d0020022802e001102a0b200241003602e001200241d8006a4120200241e0016a1006210420022802e0012205417f460d012004450d012002200536029c01200220043602980141002103200241003a0038024002400340024020052003470d002002410036029c01200341ff0171450d02200241003a00380c020b200241186a20036a200420036a22012d00003a00002002200141016a360298012002200341016a22013a00382001210320014120470d000b200241f8006a41086a2206200241186a41086a2207290300370300200241f8006a41106a2208200241186a41106a2209290300370300200241f8006a41186a220a200241186a41186a220b290300370300200220022903183703782002200520016b36029c01200241186a20024198016a10d40120022802382203450d00200241e0016a41186a220c200a290300370300200241e0016a41106a220a2008290300370300200241e0016a41086a220d2006290300370300200241e0016a41286a22062007290300370300200241e0016a41306a22072009290300370300200241e0016a41386a2208200b290300370300200220022903783703e00120022002290318370380022002413c6a2802002101200241186a41286a2209290300210e200241a0016a41086a200d290300370300200241a0016a41106a200a290300370300200241a0016a41186a200c290300370300200241a0016a41206a220a200229038002370300200241a0016a41286a220b2006290300370300200241a0016a41306a220c2007290300370300200241a0016a41386a220d2008290300370300200220022903e0013703a001200241186a20024198016a106d20022802180d012001450d002003102a0b41c4d1c3004133200241a0016a419cd9c3001038000b200241f8006a41086a220f200241186a41086a2210280200360200200241e0016a41086a2211200241a0016a41086a290300370300200241e0016a41106a2212200241a0016a41106a290300370300200241e0016a41186a2213200241a0016a41186a290300370300200241e0016a41206a2214200a2903003703002006200b2903003703002007200c2903003703002008200d29030037030020022002290318370378200220022903a0013703e00120102011290300370300200241186a41106a2012290300370300200241186a41186a2013290300370300200241186a41206a201429030037030020092006290300370300200241186a41306a2007290300370300200241186a41386a2008290300370300200241086a41086a200f280200360200200220022903e001370318200220022903783703082005450d022004102a0c020b411041011037000b410021030b200241e0016a41086a2204200241186a41086a290300370300200241e0016a41106a2205200241186a41106a290300370300200241e0016a41186a2206200241186a41186a290300370300200241e0016a41206a2207200241186a41206a290300370300200241e0016a41286a2208200241186a41286a290300370300200241e0016a41306a2209200241186a41306a290300370300200241e0016a41386a220a200241186a41386a290300370300200220022903183703e001200241a0016a41086a220b200241086a41086a280200360200200220022903083703a00102402003450d00200020022903e00137030020002001360244200041c8006a200e370200200041386a200a290300370300200041306a2009290300370300200041286a2008290300370300200041206a2007290300370300200041186a2006290300370300200041106a2005290300370300200041086a2004290300370300200041d8006a200b280200360200200041d0006a20022903a0013702000b20002003360240200241a0026a24000bb00705077f037e097f017e017f23004180016b22022400024002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f4006a2107034020032004220841206a2204360200200841086a2903002109200841106a290300210a2008290300210b200241e0006a41186a200841186a290300370300200241e0006a41106a200a370300200241e0006a41086a20093703002002200b3703600240200aa720062802004d0d002001280214220c2007460d002007290000200c290000520d030b20052004470d000b0b20004100360208200042083702002001280204450d012001280200102a0c010b200241086a2204200241e0006a41086a290300370300200241106a2203200241e0006a41106a290300370300200241186a2207200241e0006a41186a29030037030020022002290360220a3703202002200a3703000240024002400240024041201028220d450d00200d2002290300370300200d41186a2007290300370300200d41106a2003290300370300200d41086a20042903003703002001280204210e2001280200210f200541606a2008460d03200841206a2110200541606a2111200241f4006a21014101211241012113200d21140340200c2001460d042010210802400340200241e0006a41186a2204200841186a290300370300200241e0006a41106a2203200841106a290300220a370300200241e0006a41086a2207200841086a290300370300200220082903003703600240200aa720062802004d0d002001290000200c290000520d020b2005200841206a2208470d000c070b0b200241206a41086a2007290300220a370300200241206a41106a20032903002209370300200241206a41186a2004290300220b3703002002200229036022153703202004200b370300200320093703002007200a37030020022015370360024020132012470d00201241016a22132012490d04201241017422102013201020134b1b221341ffffff3f712013470d04201341057422104100480d040240024020120d002010102821140c010b201420124105742010102c21140b2014450d030b200841206a2110201420124105746a22162002290360370300201641186a2004290300370300201641106a2003290300370300201641086a2007290300370300201241016a211220112008470d000c050b0b412041081037000b201041081037000b1031000b4101211241012113200d21140b0240200e450d00200f102a0b2000201236020820002013360204200020143602000b20024180016a24000bed0704067f017e0a7f027e230041f0006b22032400200341206a2001200228020c22041102000240024020032802200d002000410036020820004208370200200120022802001103002002280204450d012001102a0c010b200341c8006a41106a200341206a41106a290300370300200341c8006a41086a200341206a41086a290300370300200341c8006a41186a200341206a41186a290300370300200341c8006a41206a200341206a41206a280200360200200341086a200341d4006a290200370300200341106a200341dc006a290200370300200341186a200341e4006a290200370300200320032903203703482003200329024c370300200341c8006a2001200228021022051102000240024002400240417f2003280248220641016a220720072006491b2208ad42287e2209422088a70d002009a72206417f4c0d000240024020060d004108210a4108210b0c010b20061028220a450d02200a210b0b200a2003290300370300200a41186a200341186a220c290300370300200a41106a200341106a220d290300370300200a41086a200341086a290300370300200b4201370320200341206a200120041102000240024020032802200d004101210e0c010b200341c8006a410472210641c800210f4101210e0340200341c8006a41206a200341206a41206a280200360200200341c8006a41186a2210200341206a41186a290300370300200341c8006a41106a2211200341206a41106a290300370300200341c8006a41086a2212200341206a41086a29030037030020032003290320370348200341086a2207200641086a290200370300200d200641106a290200370300200c200641186a290200370300200320062902003703002010200c2903003703002011200d29030037030020122007290300370300200320032903003703480240200e2008470d00200341206a200120051102002008417f2003280220220741016a221320132007491b6a22072008490d06200841017422132007201320074b1b2213ad42287e2209422088a70d062009a722074100480d060240024020080d0020071028210a0c010b200a200841286c2007102c210a0b200a450d05200a210b201321080b200b200f6a221341606a2207200329034837030020122903002109201129030021142010290300211520134201370300200741186a2015370300200741106a2014370300200741086a2009370300200341206a20012004110200200f41286a210f200e41016a210e20032802200d000b0b2001200228020011030002402002280204450d002001102a0b2000200e360208200020083602042000200b3602000c040b1036000b200641081037000b200741081037000b1031000b200341f0006a24000b02000bef0101057f230041c0006b220524000240024020030d00200041003602000c010b2003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1000200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a10012104024020052802202203417f460d002000200336020420002004360200200041086a20033602000c010b200041003602000b200541c0006a24000baf0201027f23004190016b2203240020032002108c010240024020032d000022024102470d00200041003a00000c010b200341e0006a200341286a290300370300200341e8006a200341306a290300370300200341d8006a41186a200341386a290300370300200341d8006a41206a200341c0006a290300370300200341d8006a41286a200341c8006a290300370300200341d8006a41306a200341d0006a2802003602002003200341206a29030037035802402002450d00200041003a00000c010b2003411c6a2802002102200341186a28020021042000200329026c370001200041013a0000200041196a20034184016a290200370000200041116a200341fc006a290200370000200041096a200341d8006a411c6a2902003700002002450d002004102a0b20034190016a24000bd60201057f230041d0016b220224000240411710282203450d00200341002900f1d8433700002003410f6a4100290080d943370000200341086a41002900f9d84337000020024297808080f00237027c200220033602782001200241f8006a108f01200228028001210320022802782101200241186a22044200370300200241106a22054200370300200241086a22064200370300200242003703002001200320021000200241d8006a41186a2004290300370300200241d8006a41106a2005290300370300200241d8006a41086a2006290300370300200220022903003703580240200228027c450d002002280278102a0b2002200241d8006a10960220022d00002103200241f8006a200241017241d700109a051a0240024020034102470d00200041023a00000c010b200020033a0000200041016a200241f8006a41d700109a051a0b200241d0016a24000f0b411741011037000b870102017f037e230041e0006b22032400200341086a2002108c010240024020032d000822024102470d00420021040c010b2002410173ad2104200341186a2903002105200341106a290300210620020d00200341246a280200450d00200341206a280200102a0b2000200637030820002004370300200041106a2005370300200341e0006a24000b940201057f230041d0006b220224000240411710282203450d00200341002900f1d8433700002003410f6a4100290080d943370000200341086a41002900f9d84337000020024297808080f002370224200220033602202001200241206a108f012002280228210320022802202101200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020012003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b2002412041014100410010032103200241d0006a24002003417f470f0b411741011037000b952801057f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2202280200200141086a22032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0120012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00003a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0220012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00013a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0320012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00023a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0420012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00033a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0520012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00043a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0620012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00053a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0720012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00063a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0820012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00073a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0920012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00083a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0a20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00093a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000a3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0c20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000b3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0d20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000c3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0e20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000d3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0f20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000e3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1020012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000f3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1120012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00103a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1220012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00113a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1320012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00123a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1420012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00133a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1520012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00143a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1620012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00153a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1720012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00163a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1820012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00173a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1920012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00183a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1a20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00193a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001a3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1c20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001b3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1d20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001c3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1e20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001d3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1f20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001e3a000002400240200228020020032802002202460d00200128020021040c010b200241016a22042002490d21200241017422052004200520044b1b22054100480d210240024020020d002005102821040c010b200128020020022005102c21040b2004450d2020012004360200200141046a2005360200200141086a28020021020b2003200241016a360200200420026a20002d001f3a00000f0b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200541011037000b1031000b3802017f017e230041106b2203240020032002109101200329030021042000200341086a29030037030820002004370300200341106a24000bf40202057f027e230041d0006b2202240002400240411410282203450d00200341002900cfe140370000200341106a41002800dfe140360000200341086a41002900d7e14037000020024294808080c002370224200220033602202001200241206a108f012002280228210320022802202101200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020012003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b2002410036023020024120200241306a100621030240024020022802302201417f470d0042002107420021080c010b20014110490d02200341086a2900002108200329000021072003102a0b2000200737030020002008370308200241d0006a24000f0b411441011037000b41c4d1c3004133200241306a419cd9c3001038000bbc200b067f017e0d7f067e047f037e017f027e0d7f027e067f230041c0046b22022400200241186a42003703002002420037031020024200370308200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b200241106a21072002413c6a20042f0106360200200241206a41186a4100360200200241346a2004360200200220033602402002410036023020024200370328200220013602242002410036022020024188016a200241206a109301024002400240024020022903a80122084202510d00200241bc016a210920024188016a412c6a210a20024188016a410472210b200241e5016a210c20024188016a41086a2103200241e8026a412c6a210d200241e8026a41106a210e200241b8016a210f200241d0016a21100340200241e8006a41186a220620024188016a41186a2201290300370300200241e8006a41106a221120024188016a41106a2204290300370300200241e8006a41086a22122003290300370300200241c8006a41086a2213200c41086a290000370300200241c8006a41106a2214200c41106a290000370300200241c8006a41186a2215200c41186a29000037030020022002290388013703682002200c290000370348200f29030021162010290300211720022903b001211820022903c801211920022903c001211a20022903d801211b20022802e001211c20022d00e401211d20022d008502210520024188026a41186a200629030037030020024188026a41106a201129030037030020024188026a41086a20122903003703002002200229036837038802200241a8026a41186a22122015290300370300200241a8026a41106a221e2014290300370300200241a8026a41086a221f2013290300370300200220022903483703a8020240024002402005ad42ff0183200820085022061b4201520d0020024188016a20024188026a4200201820061b4200201620061b10940120042903002120200229039001211820022d00a00121062002290388012121200241086a41106a221129030021082002290310211602400240024002400240024020022903084201510d0020214200510d022016201856200820205620082020511b0d04202020087d2018201654ad7d2121201820167d21220c010b20214200510d02427f200820207c201620187c22182016542213ad7c22162013201620085420162008511b22131b2121427f201820131b21220b420121080c030b427f200820207c201620187c22182016542213ad7c22162013201620085420162008511b22131b2121427f201820131b2122420021080c020b202020087d2018201654ad7d200820207d2016201854ad7d20182016562020200856202020085122131b22141b2121201820167d201620187d20141b21222018201658202020085820131bad21080c010b200820207d2016201854ad7d2121201620187d2122420021080b201120213703002002202237031020022008370308200641ff01710d010b024002400240201d41ff0171222341014622060d00200541ff01710d00201c201aa772450d010b20024188016a20024188026a108c010240024020022d0088012211417f6a221341014b0d00024020130e020002000b20110d0420022802a401450d0420022802a001102a0c040b200241c8026a41086a200941086a290200370300200241c8026a41106a200941106a290200370300200241c8026a41186a200941186a290200370300200220092902003703c80220042903002124200229039001212520022802dc01212620022802b801212720022802b401212820022802b001212920022802ac01212a20022802a801212b20022802a401212c20022802a001212d0c020b4102212820110d0120022802a401450d0120022802a001102a0c010b201ba7210402400240201b422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b2002201c3602a801200241003602a001200241003602980120024200370390012002200136028c0120024100360288012002200436029c01200220042f01063602a40120024188016a1095010c020b4102212e02400240024002400240024002400240024020284102460d00202b417f4c0d0102400240202b0d004100212f410121300c010b202b212f202b10282230450d030b2030202d202b109a051a2001200241c8026a41186a2903003703002004200241c8026a41106a2903003703002003200241c8026a41086a290300370300200220022903c802370388012028410146212e202b2131202a2132202521332024213420292135202721360b200241b8036a41186a22372001290300370300200241b8036a41106a22382004290300370300200241b8036a41086a22392003290300370300200241a0046a41086a221d201f290300370300200241a0046a41106a2214201e290300370300200241a0046a41186a2215201229030037030020022002290388013703b803200220022903a8023703a004200541ff0171450d030c020b1036000b202b41011037000b202e4102460d0120302031100420060d0320024188026a109601202f450d022030102a0c020b202e4102460d00200d20022903b803370200200d41086a2039290300370200200d41106a2038290300370200200d41186a2037290300370200200220333703e80220022036360290032002202e36028c032002203536028803200220323602840320022031360280032002202f3602fc02200220303602f802200220343703f0022035213a2033212020342121203221110c030b2006450d004108211120024188016a20024188026a109701109801213a200e41086a20024188016a41086a280200360200200e200229038801370200200d20022903a004370100200d41086a200241a0046a41086a290300370100200d41106a2014290300370100200d41186a2015290300370100427f21202002427f3703f0022002427f3703e80220024108360284034100212e2002410036028c032002203a36028803427f21210c020b20284102460d020240202c0d004100212c0c030b202d102a0c020b4108211120024188016a20024188026a109701109801213a200e41086a20024188016a41086a280200360200200e200229038801370200200d20022903a004370100200d41086a200241a0046a41086a290300370100200d41106a2014290300370100200d41186a2015290300370100427f21202002427f3703f0022002427f3703e80220024108360284034100212e2002410036028c032002203a360288030240202f450d002030102a427f21200b427f21210b0240201a4201520d00200220193703e802200220173703f00220192120201721210b02402023450d00200d20022903a802370000200d41186a2012290300370000200d41106a201e290300370000200d41086a201f2903003700000b0240201c450d0010980121054101212e2002410136028c0320022005360290030b201ba7210502400240201b422088a722120d00200521060c010b2012211320052106034020062802ec0321062013417f6a22130d000b0340200520052f01064102746a41ec036a28020021052012417f6a22120d000b0b20052f010621122002201c3602d803200220123602d403200241003602d003200220053602cc03200241003602c803200242003703c003200220063602bc03200241003602b80320024188016a200241b8036a10990102402002280288014101470d00200228028003211320022802f802211c0340200241e0036a41186a200b41186a2902002208370300200241e0036a41106a200b41106a290200221b370300200241e0036a41086a200b41086a29020022163703002002200b29020022183703e00320022802ac01210520022802b001211e20022802b401210620024180046a41186a200837030020024180046a41106a201b37030020024180046a41086a20163703002002201837038004200142003703002004420037030020034200370300200242003703880120024180046a412020024188016a10002015200129030037030020142004290300370300201d200329030037030020022002290388013703a0042002410036028801201c2013200241a0046a412020024188016a1001211f02402002280288012212417f460d00201120126b21112012450d00201f102a0b0240024020050d00200142003703002004420037030020034200370300200242003703880120024180046a412020024188016a10002015200129030037030020142004290300370300201d200329030037030020022002290388013703a004201c2013200241a0046a412010020c010b200142003703002004420037030020034200370300200242003703880120024180046a412020024188016a10002015200129030037030020142004290300370300201d200329030037030020022002290388013703a004201c2013200241a0046a4120200520061005201120066a2111201e450d002005102a0b20024188016a200241b8036a1099012002280288014101460d000b20022011360284030b200241b8036a1095012037200241c8026a41186a2903003703002038200241c8026a41106a2903003703002039200241c8026a41086a290300370300200220022903c8023703b8030240024020284102460d00200a20022903b803370200200a41086a2039290300370200200a41106a2038290300370200200a41186a20372903003702002002202537038801200220273602b001200220283602ac01200220293602a8012002202a3602a4012002202c36029c012002202d36029801200220263602d40120022024370390012002202b3602a001410121040240202b200228028003470d0002400240202d20022802f8022201460d00202d2001202b109c050d02202a2011470d020c010b202a2011470d010b200a200d4120109c050d0020252020852024202185844200520d002029203a470d0002402028202e470d004100210420284101470d012027200228029003460d010b410121040b0240202c450d00202d102a0b20044102460d002004450d010b2003200241e8026a41d000109a051a200241003a00880120024188026a20024188016a109a010c020b20022802fc02450d0120022802f802102a0c010b201ba7210402400240201b422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b2002201c3602a801200241003602a001200241003602980120024200370390012002200136028c0120024100360288012002200436029c01200220042f01063602a40120024188016a1095010b20024188016a200241206a10930120022903a80122084202520d000b20022903082108200241206a109b012008500d010c020b200241206a109b010b02402002290310200241186a29030084500d0041f4b5c0001032000b20022903084200520d00200220073602880120024188016a109c010c010b200220073602880120024188016a109d010b200241c0046a24000bf90503087f017e017f23004180026b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e000109a051a2001200341016a36020c200120043602082001200536020420024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e000109a051a200020024180016a418001109a051a0c020b200042023703200c010b2001280200210702400240200528020022030d002004ad210a410021030c010b200741016a210720053301044220862004ad84210a0b2005102a200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b034002400240200328020022050d002004ad210a410021050c010b200741016a210720033301044220862004ad84210a0b2003102a200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e000109a051a200641027420056a418c0b6a280200210302402007417f6a2205450d00034020032802880b21032005417f6a22050d000b0b2001410036020c20012004360208200120033602042001410036020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e000109a051a200020024180016a418001109a051a0b20024180026a24000ba90703067f027e017f230041a0016b220424000240024002400240411410282205450d00200541002900cfe140370000200541106a41002800dfe140360000200541086a41002900d7e14037000020044294808080c002370224200420053602202001200441206a108f012004280228210520042802202106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020062005200441306a1000200441186a2007290300370300200441106a2008290300370300200441086a20092903003703002004200429033037030002402004280224450d002004280220102a0b2004410036023020044120200441306a100621050240024020042802302206417f470d004200210a4200210b0c010b20064110490d02200541086a290000210b2005290000210a2005102a0b0240200242ffffe883b1de1656200342005220035022051b0d00200a200b844200520d0020004200370300200041013a0018200041106a4200370300200041086a42003703000c040b4101210602402002428080e983b1de1654410020051b0d00411410282205450d0341002106200541002900cfe140370000200541106a41002800dfe140360000200541086a41002900d7e14037000020044294808080c002370224200420053602202001200441206a108f012004280228210520042802202107200441306a41186a22084200370300200441306a41106a22094200370300200441306a41086a220c42003703002004420037033020072005200441306a1000200441186a2008290300370300200441106a2009290300370300200441086a200c2903003703002004200429033037030002402004280224450d002004280220102a0b200441204101410041001003417f470d002001109302200441e8006a2003370300200441e0006a200237030041002106200441306a41086a41003a0000200441396a2001290000370000200441c1006a200141086a290000370000200441c9006a200141106a290000370000200441d1006a200141186a290000370000200441023a003041014100200441306a10cc010b200120022003108f02200041106a200b20037d200a200254ad7d2003200b7d2002200a54ad7d200a200256200b200356200b2003511b22051b3703002000200a20027d2002200a7d20051b370308200020063a001820002005ad3703000c030b411441011037000b41c4d1c3004133200441306a419cd9c3001038000b411441011037000b200441a0016a24000bb00101037f230041306b2201240020012000109901024020012802004101470d000340024020012802242202450d002001280228450d002002102a0b2001200010990120012802004101460d000b0b02402000280204220241f8b9c000460d00200228020021032002102a2003450d00200328020021002003102a2000450d00024020002802002202450d0003402000102a2002210020022802002203210220030d000b0b2000102a0b200141306a24000b870201057f230041d0006b220124000240411710282202450d00200241002900f1d8433700002002410f6a4100290080d943370000200241086a41002900f9d84337000020014297808080f002370224200120023602202000200141206a108f012001280228210220012802202100200141306a41186a22034200370300200141306a41106a22044200370300200141306a41086a220542003703002001420037033020002002200141306a1000200141186a2003290300370300200141106a2004290300370300200141086a20052903003703002001200129033037030002402001280224450d002001280220102a0b200141201009200141d0006a24000f0b411741011037000ba60603037f017e017f230041c0006b22022400200241206a41086a220342003703002002420037032041d8fec5004117200241206a1008200241086a2003290300370300200220022903203703002002410036022020024110200241206a1006210302400240024002400240024020022802202204417f470d00420121050c010b024020030d00420121050c010b20044108490d01200329000021052003102a200542017c21050b200241206a41086a220342003703002002420037032041d8fec5004117200241206a1008200241086a2003290300370300200220022903203703002002200537032020024110200241206a41081007412010282203450d0120032001290000370000200341186a200141186a290000370000200341106a200141106a290000370000200341086a200141086a2900003700002003412041c000102c2201450d0220012005370020200241206a41186a22034200370300200241206a41106a22044200370300200241206a41086a220642003703002002420037032020014128200241206a1000200241186a2003290300370300200241106a2004290300370300200241086a200629030037030020022002290320370300413710282203450d03200342bac6a1cbc68dd9aff300370000200342f4dec98bf6ac999de400370008200341e5cc85ab073600102003413a3a0016200341ece8013b001420032002290300370017200320022f01083b001f2003200228010a360021200320022f010e3b0025200320022d00103a0027200320022d00113a0028200320022d00123a0029200320022d00133a002a200320022d00143a002b200320022d00153a002c200320022d00163a002d200320022d00173a002e200320022d00183a002f200320022d00193a0030200320022d001a3a0031200320022d001b3a0032200320022d001c3a0033200320022d001d3a0034200320022d001e3a0035200320022d001f3a0036200041ed93c40041c593c4006b410f6a36020820004137360204200020033602002001102a200241c0006a24000f0b41c4d1c3004133200241206a419cd9c3001038000b412041011037000b41c00041011037000b413741011037000ba70101047f230041206b22002400200041106a41086a220142003703002000420037031041d9efc200410d200041106a1008200041086a200129030037030020002000290310370300410021022000410036021020004110200041106a100621010240024020002802102203417f460d002001450d0020034104490d01200128000021022001102a0b200041206a240020020f0b41c4d1c3004133200041106a419cd9c3001038000bdd0605057f047e017f017e047f23004190016b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241e0006a41186a200520034105746a220641206a2900002207370300200241e0006a41106a200641186a2900002208370300200241e0006a41086a200641106a29000022093703002002200641086a290000220a370360200241306a41086a20052003410c6c6a220641f0026a280200220b360200200641e8026a290200210c2001200341016a36020c20012004360208200120053602042002200c3703302000200a3702042000410c6a2009370200200041146a20083702002000411c6a2007370200200041246a200c3702002000412c6a200b360200200041013602000c020b200041003602000c010b2001280200210602400240200528020022030d002004ad210c410021030c010b200641016a210620053301044220862004ad84210c0b2005102a200ca7210402400240200c422088a7220b20032f01064f0d00200321050c010b034002400240200328020022050d002004ad210c410021050c010b200641016a210620033301044220862004ad84210c0b2003102a200ca7210420052103200c422088a7220b20052f01064f0d000b0b200241306a41186a220d2005200b4105746a220341206a290000370300200241306a41106a220e200341186a290000370300200241306a41086a220f200341106a2900003703002002200341086a290000370330200241d0006a41086a22102005200b410c6c6a220341f0026a2802003602002002200341e8026a290200370350200b41027420056a41f0036a280200210302402006417f6a2205450d00034020032802ec0321032005417f6a22050d000b0b2001410036020c200120043602082001200336020420014100360200200241e0006a41186a200d290300220c370300200241e0006a41106a200e2903002207370300200241e0006a41086a200f290300220837030020024188016a201028020022033602002000200229033022093702042000410c6a2008370200200041146a20073702002000411c6a200c370200200041246a2002290350220c3702002000412c6a2003360200200220093703602002200c37038001200041013602000b20024190016a24000ba70201057f230041d0006b220224000240411710282203450d00200341002900f1d8433700002003410f6a4100290080d943370000200341086a41002900f9d84337000020024297808080f002370224200220033602202000200241206a108f012002280228210320022802202100200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020002003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b2002200110e203024020012d00000d002001411c6a280200450d00200141186a280200102a0b200241d0006a24000f0b411741011037000bca0201067f230041b0016b22012400200141086a2000109301024020012903284202510d000340200128026021022001280258210302400240200128025c22040d00200321050c010b2004210620032105034020052802ec0321052006417f6a22060d000b0340200320032f01064102746a41ec036a28020021032004417f6a22040d000b0b200120023602a801200141003602a001200141003602980120014200370390012001200536028c0120014100360288012001200336029c01200120032f01063602a40120014188016a109501200141086a200010930120012903284202520d000b0b02402000280204220341f8b9c000460d00200328020021042003102a2004450d00200428020021052004102a2005450d00024020052802002203450d0003402005102a2003210520032802002204210320040d000b0b2005102a0b200141b0016a24000bcf0204017f017e027f037e230041206b2201240042002102200141106a41086a220342003703002001420037031041ace1c0004116200141106a1008200141086a2003290300370300200120012903103703002001410036021020014110200141106a1006210302400240024020012802102204417f470d00420021050c010b20044110490d01200341086a2900002105200329000021022003102a0b2000280200220341086a290300210620032903002107200141106a41086a220342003703002001420037031041ace1c0004116200141106a1008200141086a2003290300370300200120012903103703002001427f200520067c200220077c22062002542203ad7c22022003200220055420022005511b22031b3703182001427f200620031b37031020014110200141106a41101007200141206a24000f0b41c4d1c3004133200141106a419cd9c3001038000bd00204017f017e027f037e230041206b2201240042002102200141106a41086a220342003703002001420037031041ace1c0004116200141106a1008200141086a2003290300370300200120012903103703002001410036021020014110200141106a1006210302400240024020012802102204417f470d00420021050c010b20044110490d01200341086a2900002105200329000021022003102a0b2000280200220341086a290300210620032903002107200141106a41086a220342003703002001420037031041ace1c0004116200141106a1008200141086a20032903003703002001200129031037030020014200200520067d2002200754ad7d2206200220077d2207200256200620055620062005511b22031b37031820014200200720031b37031020014110200141106a41101007200141206a24000f0b41c4d1c3004133200141106a419cd9c3001038000bb50404057f017e017f017e0240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a3602000240200441037122064103460d00024002400240024020060e03000102000b2004410276ad21070c020b41012106024020050d000c050b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d04200141fcff0371410276ad21070c010b410121060240200541034f0d000c040b200341036a2d0000210520032f0001210820012002417c6a3602042001200341046a3602002008200541107472410874200472220141808004490d032001410276ad21070b410021060c020b02402004410276220841044b0d000240024020080e050002020201000b20054104490d022003350001210720012002417b6a3602042001200341056a36020020074280808080045421060c030b20054108490d01200329000121072001200241776a3602042001200341096a3602002007428080808080808080015421060c020b200841046a220541084b0d002002417e6a2102200341026a2103410021044200210741012106034002402002417f470d000c030b2003417f6a310000210920012002360204200120033602002002417f6a2102200341016a210320092004410374413871ad862007842107200441016a220441ff01712005490d000b2007427f412820084103746b413871ad885821060c010b410121060b2000200737030820002006ad3703000bde0506067f017e017f017e017f017e230041206b220224000240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200024002400240200541037122074103460d0002400240024020070e03000102000b2005410276ad21080c040b410121072006450d0220042d0001210620012003417e6a3602042001200441026a3602002006410874200572220141ffff0371418002490d02200141fcff0371410276ad21080c030b4101210720064103490d01200441036a2d0000210620042f0001210920012003417c6a3602042001200441046a3602002009200641107472410874200572220141808004490d012001410276ad21080c020b024020054102762209410c4b0d0002400240024020090e0d00030303010303030303030302000b20064104490d052004350001210820012003417b6a3602042001200441056a36020020084280808080045421074200210a0c060b20064108490d04200429000121082001200341776a3602042001200441096a3602002008428080808080808080015421074200210a0c050b20064110490d03200441096a290000210a2004290001210820012003416f6a3602042001200441116a360200200a428080808080808080015421070c040b200941046a220641104b0d022003417e6a2103200441026a21044100210541012107200241186a210b420021084200210a03402003417f460d01200241106a2004417f6a3100004200200541037441f80071109d0520012003360204200120043602002003417f6a2103200441016a2104200b290300200a84210a20022903102008842108200541016a220541ff01712006490d000b2002427f427f41e80020094103746b41f80071109e052008200229030058200a200241086a290300220c58200a200c511b21070c030b0c020b4200210a410021070c010b410121070b20002008370308200041106a200a37030020002007ad370300200241206a24000b9e0701037f02400240024002400240024020002802002202413f4b0d0002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d06200041017422042003200420034b1b22044100480d060240024020000d002004102821030c010b200128020020002004102c21030b2003450d0220012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000f0b200241808001490d032002418080808004490d020c010b200441011037000b0240024002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d05200241017422042003200420034b1b22044100480d050240024020020d002004102821030c010b200128020020022004102c21030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280200210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d05200241017422002004200020044b1b22004100480d050240024020020d002000102821020c010b200128020020022000102c21020b2002450d0220012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b200441011037000b200041011037000b024002400240200141046a2802002203200141086a28020022006b4104490d00200128020021030c010b200041046a22042000490d03200341017422002004200020044b1b22004100480d030240024020030d002000102821030c010b200128020020032000102c21030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b200041011037000b024002400240200141046a2802002203200141086a28020022006b4102490d00200128020021030c010b200041026a22042000490d02200341017422002004200020044b1b22004100480d020240024020030d002000102821030c010b200128020020032000102c21030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b200041011037000b1031000bac0903017f017e057f230041e0006b220224000240024002400240024002400240024002400240024020002903002203423f560d0002400240200141046a280200200141086a2802002200460d00200128020021040c010b200041016a22042000490d0b200041017422052004200520044b1b22054100480d0b0240024020000d002005102821040c010b200128020020002005102c21040b2004450d0220012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a00000c080b200342808001540d062003428080808004540d054108200379a741037622056b4104490d0402400240200141046a280200200141086a2802002204460d00200128020021060c010b200441016a22072004490d0a200441017422062007200620074b1b22074100480d0a0240024020040d002007102821060c010b200128020020042007102c21060b2006450d0220012006360200200141046a2007360200200141086a28020021040b200141086a2207200441016a360200200620046a411320054102746b3a0000200220002903002203370308200541786a2104200141046a2106034002400240200628020020072802002200460d00200128020021050c010b200041016a22052000490d0b200041017422082005200820054b1b22084100480d0b0240024020000d002008102821050c010b200128020020002008102c21050b2005450d042001200536020020062008360200200728020021000b2007200041016a360200200520006a2003a73a000020034208882103200441016a22002004492105200021042005450d000b20022003370308200350450d030c070b200541011037000b200741011037000b200841011037000b200241286a41146a4108360200200241346a4109360200200241106a41146a41033602002002200241086a360240200241f8b9c00036024420024203370214200241c8afc6003602102002410936022c200242043703582002420137024c20024180bac0003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a4188bac000103e000b41dcb9c0001032000b024002400240200141046a2802002204200141086a28020022006b4104490d00200128020021040c010b200041046a22052000490d05200441017422002005200020054b1b22004100480d050240024020040d002000102821040c010b200128020020042000102c21040b2004450d0120012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a74102744102723600000c020b200041011037000b02400240200141046a2802002204200141086a28020022006b4102490d00200128020021040c010b200041026a22052000490d03200441017422002005200020054b1b22004100480d030240024020040d002000102821040c010b200128020020042000102c21040b2004450d0220012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b00000b200241e0006a24000f0b200041011037000b1031000bbf0202027f017e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d01200441012001103f21000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000b20024180016a240020000f0b20034180011044000b20034180011044000b800a03017f027e057f230041e0006b2202240002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d0002400240200141046a280200200141086a2802002200460d00200128020021050c010b200041016a22052000490d0b200041017422062005200620054b1b22064100480d0b0240024020000d002006102821050c010b200128020020002006102c21050b2005450d0220012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a00000c080b20034280800154410020051b0d06200342808080800454410020051b0d05411020047920037942c0007c20044200521ba741037622066b4104490d0402400240200141046a280200200141086a2802002205460d00200128020021070c010b200541016a22082005490d0a200541017422072008200720084b1b22084100480d0a0240024020050d002008102821070c010b200128020020052008102c21070b2007450d0220012007360200200141046a2008360200200141086a28020021050b200141086a2208200541016a360200200720056a413320064102746b3a0000200029030021032002200041086a290300220437030820022003370300200641706a2105200141046a2107034002400240200728020020082802002200460d00200128020021060c010b200041016a22062000490d0b200041017422092006200920064b1b22094100480d0b0240024020000d002009102821060c010b200128020020002009102c21060b2006450d042001200636020020072009360200200828020021000b2008200041016a360200200620006a2003a73a00002003420888200442388684210320044208882104200541016a22002005492106200021052006450d000b2002200337030020022004370308200320048450450d030c070b200641011037000b200841011037000b200941011037000b200241286a41146a4108360200200241346a410a360200200241106a41146a410336020020022002360240200241a8bbc00036024420024203370214200241c8afc6003602102002410a36022c200242043703582002420137024c20024180bac0003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41b8bbc000103e000b418cbbc0001032000b024002400240200141046a2802002205200141086a28020022006b4104490d00200128020021050c010b200041046a22062000490d05200541017422002006200020064b1b22004100480d050240024020050d002000102821050c010b200128020020052000102c21050b2005450d0120012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a74102744102723600000c020b200041011037000b02400240200141046a2802002205200141086a28020022006b4102490d00200128020021050c010b200041026a22062000490d03200541017422002006200020064b1b22004100480d030240024020050d002000102821050c010b200128020020052000102c21050b2005450d0220012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b00000b200241e0006a24000f0b200041011037000b1031000b810605027f027e017f027e027f230041a0016b220224002000280200210002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0220054290ce005441002004501b450d012005a72103412721000c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d0220014101419087c0004102200241206a20006a41800120006b104221000c060b41272100200241186a21060340200241106a200520044290ce00420010a0052002200229031022072006290300220842f0b17f427f109f05200241206a20006a2203417c6a200520022903007ca7220941ffff037141e4006e220a41017441ba84c0006a2f00003b00002003417e6a200a419c7f6c20096a41ffff037141017441ba84c0006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000c040b0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d0120014101419087c0004102200241206a20006a41800120006b104221000c040b20004180011044000b20004180011044000b2007a721030b02400240200341e3004a0d00200321090c010b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441ba84c0006a2f00003b00000b024002402009410a480d00200241206a2000417e6a22006a200941017441ba84c0006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141b8aec6004100200241206a20006a412720006b104221000b200241a0016a240020000bf40601067f230041f0006b21020240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204410121072001200441016a360200200541f001490d0a200541847e6a220541034b0d0420050e0401020803010b200041023a00000f0b20064102490d0320042f0001210520012003417d6a3602042001200441036a360200200541ef014b0d04200041023a00000f0b20064104490d042004280001210520012003417b6a3602042001200441056a36020041012107200541ffff034b0d07200041023a00000f0b41002105200241003a00682003417f6a21062003417e6a210302400340024020062005470d000240200541ff0171450d00200241003a00680b410121010c020b200241c8006a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00682003417f6a21032007210520074120470d000b200241c6006a20022d004a3a0000200241306a200241d7006a290000370300200241386a200241df006a290000370300200241c0006a200241e7006a2d00003a0000200220022f01483b01442002200229004f370328200228004b2105410021010b200241246a41026a2203200241c4006a41026a2d00003a0000200241086a41086a2207200241286a41086a290300370300200241086a41106a2204200241286a41106a290300370300200241086a41186a2206200241286a41186a2d00003a0000200220022f01443b0124200220022903283703082001450d05200041023a00000f0b200041023a00000f0b200041023a00000f0b410121070c030b200041023a00000f0b0240200641044f0d00200041023a00000f0b200041023a000020012003417b6a3602042001200441056a3602000f0b200241286a41026a20032d00003a0000200241c8006a41086a2007290300370300200241c8006a41106a2004290300370300200241c8006a41186a20062d00003a0000200220022f01243b012820022002290308370348410021070b200020073a0000200020022f01283b0001200041046a2005360200200041086a2002290348370200200041036a2002412a6a2d00003a0000200041106a200241c8006a41086a290300370200200041186a200241c8006a41106a290300370200200041206a200241c8006a41186a2802003602000bb30801037f0240024002400240024002400240024020002d00004101460d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d08200241017422042003200420034b1b22044100480d080240024020020d002004102821030c010b200128020020022004102c21030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41ff013a0000200041016a2001108f010f0b0240024002400240200041046a280200220241ffff034b0d00200241ef014b0d03200141046a280200200141086a2802002200460d01200128020021030c020b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0a200041017422042003200420034b1b22044100480d0a0240024020000d002004102821030c010b200128020020002004102c21030b2003450d0520012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a000002400240200141046a2802002203200428020022006b4104490d00200128020021030c010b200041046a22042000490d0a200341017422002004200020044b1b22004100480d0a0240024020030d002000102821030c010b200128020020032000102c21030b2003450d0620012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000f0b200041016a22032000490d08200041017422042003200420034b1b22044100480d080240024020000d002004102821030c010b200128020020002004102c21030b2003450d0520012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d07200041017422042003200420034b1b22044100480d070240024020000d002004102821030c010b200128020020002004102c21030b2003450d0520012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a000002400240200141046a2802002203200428020022006b4102490d00200128020021030c010b200041026a22042000490d07200341017422002004200020044b1b22004100480d070240024020030d002000102821030c010b200128020020032000102c21030b2003450d0620012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b200441011037000b200441011037000b200041011037000b200441011037000b200441011037000b200041011037000b1031000bd80402097f017e230041106b22052400024002400240200128020041016a220641004c0d0020012006360200200141046a2106200141086a28020021070240024003402006280200220841086a210920082f0106220a41057421064100210b0240024003402006450d01200220094120109c05220c450d02200641606a2106200b41016a210b200941206a2109200c417f4a0d000b200b417f6a210a0b2007450d022007417f6a21072008200a4102746a41880b6a21060c010b0b2008200b41e0006c6a22094198036a2106200941e8026a210d2009419c036a2802002107024003402006280200220841086a210920082f0106220a41057421064100210b0240024003402006450d01200420094120109c05220c450d02200641606a2106200b41016a210b200941206a2109200c417f4a0d000b200b417f6a210a0b024020070d004100210c0c030b2007417f6a21072008200a4102746a41ec036a21060c010b0b4101210c0240200841e8026a200b410c6c6a2206280200220b0d00410021060c010b20062802082209417f4c0d040240024020090d0020054200370300410121060c010b200910282206450d0620054100360204200520093602000b200520093602042006200b2009109a051a2005290300210e0b02400240200d2d005d450d0020064100200c1b21060c010b200c450d010b2000200e370204200020063602000c010b20002001280210200220032004200141146a28020028020c1104000b20012001280200417f6a360200200541106a24000f0b41b8b8c0004118200541086a41e0b8c0001038000b1036000b200941011037000bfc0202097f037e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d01200220084120109c05220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a22054190036a290300210c20054188036a290300210d20054180036a290300210e0240200541c5036a2d00000d00200ea721054201210e2005450d010c020b200e4202520d010b200320012802102002200141146a280200280214110500200341106a290300210c200128020021042003290308210d2003290300210e0b20012004417f6a360200200041106a200c3703002000200d3703082000200e370300200341206a24000f0b41b8b8c0004118200341186a41e0b8c0001038000bd70501037f024002400240024002400240024020002d00004101460d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d07200241017422042003200420034b1b22044100480d070240024020020d002004102821030c010b200128020020022004102c21030b2003450d0320012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c010b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d06200241017422042003200420034b1b22044100480d060240024020020d002004102821030c010b200128020020022004102c21030b2003450d0320012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a0000200041016a2001108f010b024020002d00214101460d0002400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d06200041017422032002200320024b1b22034100480d060240024020000d002003102821020c010b200128020020002003102c21020b2002450d0420012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d05200241017422042003200420034b1b22044100480d050240024020020d002004102821030c010b200128020020022004102c21030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a0000200041226a2001108f010f0b200441011037000b200441011037000b200341011037000b200441011037000b1031000bbf0501047f200141046a2802002102200141086a28020021030240024002400240024002400240200028020022040d000240024020022003460d00200128020021020c010b200341016a22022003490d07200341017422042002200420024b1b22044100480d070240024020030d002004102821020c010b200128020020032004102c21020b2002450d0320012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c010b0240024020022003460d00200128020021020c010b200341016a22022003490d06200341017422052002200520024b1b22054100480d060240024020030d002005102821020c010b200128020020032005102c21020b2002450d0320012002360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200220036a41013a000020042001108f010b200141046a2802002102200141086a28020021030240200028020422040d000240024020022003460d00200128020021000c010b200341016a22002003490d06200341017422022000200220004b1b22024100480d060240024020030d002002102821000c010b200128020020032002102c21000b2000450d0420012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b0240024020022003460d00200128020021000c010b200341016a22002003490d05200341017422022000200220004b1b22024100480d050240024020030d002002102821000c010b200128020020032002102c21000b2000450d0420012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41013a000020042001108f010f0b200441011037000b200541011037000b200241011037000b200241011037000b1031000b860a05037f047e057f027e047f230022022103200241c0016b41607122022400200141186a220429000021052004200229039801370000200129001021062001200229039001370010200129000821072001200229038801370008200241003a00800120012900002108200120022903800137000020022005370378200220063703702002200737036820022008370360200141206a2d0000210420024180016a41176a2209200537000020024180016a41106a220a200229007137030020024180016a41086a220b2002290069370300200220022900613703800102402008a741ff01714101460d0020004200370300200324000f0b200241186a41176a2009290000370000200241186a41106a200a290300370300200241186a41086a200b2903003703002002200229038001370318200220043a0037200241386a200241186a10ac012002410036028001200241386a412020024180016a1006210c02400240200228028001220d417f460d002002200d36025c2002200c3602582002200241d8006a109f012002290300a70d01200228025c2204450d01200241106a290300210e2002290308210f20022004417f6a220a36025c20022002280258221041016a220b36025820102d0000220441014b0d01410021110240024020040e020100010b4100210403400240200a2004470d002002410036025c0c040b2002201020046a41026a360258200441016a2209210420094120470d000b2002200a20096b220a36025c41012111201020096a41016a210b0b200a450d012002200a417f6a220a36025c2002200b41016a360258200b2d0000220941014b0d01410021040240024020090e020100010b41002104200241003a00a00103400240200a2004470d002002410036025c200441ff0171450d04200241003a00a0010c040b20024180016a20046a200b20046a220941016a2d00003a00002002200941026a3602582002200441016a22093a00a0012009210420094120470d000b200241e0006a41086a20024180016a41086a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41186a20024180016a41186a29030037030020022002290380013703602002200a20096b36025c410121040b20024180016a41186a2209200241e0006a41186a220a29030037030020024180016a41106a220b200241e0006a41106a221029030037030020024180016a41086a2212200241e0006a41086a2213290300370300200220022903603703800120114102460d01200a20092903003703002010200b2903003703002013201229030037030020022002290380013703600240200d450d00200c102a0b20024180016a41186a200241e0006a41186a2209290300220537030020024180016a41106a200241e0006a41106a220a290300220837030020024180016a41086a200241e0006a41086a220b29030022063703002002200229036022073703800120092005370300200a2008370300200b200637030020022007370360200120043a000020012007370001200141096a2006370000200141116a2008370000200141196a2005370000200041306a200e370300200041286a200f3703002000420137030020002002290318370008200041106a200241186a41086a290300370000200041186a200241186a41106a290300370000200041206a200241186a41186a290300370000200324000f0b41c9b4c00041dd001050000b41c4d1c3004133200241b8016a419cd9c3001038000bfc0101057f230041306b220224000240411210282203450d00200341002900c1ae44370000200341106a41002f00d1ae443b0000200341086a41002900c9ae4437000020024292808080a0023702042002200336020020012002108f012002280208210320022802002101200241106a41186a22044200370300200241106a41106a22054200370300200241106a41086a220642003703002002420037031020012003200241106a1000200041186a2004290300370000200041106a2005290300370000200041086a20062903003700002000200229031037000002402002280204450d002002280200102a0b200241306a24000f0b411241011037000b910a03037f047e0c7f230022022103200241c0016b41607122022400200141186a220429000021052004200229039801370000200129001021062001200229039001370010200129000821072001200229038801370008200241003a00800120012900002108200120022903800137000020022005370378200220063703702002200737036820022008370360200141206a2d0000210420024180016a41176a2209200537000020024180016a41106a220a200229007137030020024180016a41086a220b2002290069370300200220022900613703800102402008a741ff01714101460d0020004100360220200324000f0b200241086a41176a2009290000370000200241086a41106a200a290300370300200241086a41086a200b2903003703002002200229038001370308200220043a0027200241286a200241086a10ae012002410036028001200241286a412020024180016a1006210c024002400240200228028001220d417f460d002002200d36024c2002200c360248200241d0006a200241c8006a106d2002280250220e450d022002280254210f200228024c2204450d01200241d8006a280200211020022004417f6a220a36024c20022002280248221141016a220b36024820112d0000220441014b0d01410021120240024020040e020100010b4100210403400240200a2004470d002002410036024c0c040b2002201120046a41026a360248200441016a2209210420094120470d000b2002200a20096b220a36024c41012112201120096a41016a210b0b200a450d012002200a417f6a220a36024c2002200b41016a360248200b2d0000220941014b0d01410021040240024020090e020100010b41002104200241003a00a00103400240200a2004470d002002410036024c200441ff0171450d04200241003a00a0010c040b20024180016a20046a200b20046a220941016a2d00003a00002002200941026a3602482002200441016a22093a00a0012009210420094120470d000b200241e0006a41086a20024180016a41086a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41186a20024180016a41186a29030037030020022002290380013703602002200a20096b36024c410121040b20024180016a41186a2209200241e0006a41186a220a29030037030020024180016a41106a220b200241e0006a41106a221129030037030020024180016a41086a2213200241e0006a41086a2214290300370300200220022903603703800120124102460d02200a20092903003703002011200b2903003703002014201329030037030020022002290380013703600240200d450d00200c102a0b20024180016a41186a200241e0006a41186a2209290300220537030020024180016a41106a200241e0006a41106a220a290300220837030020024180016a41086a200241e0006a41086a220b29030022063703002002200229036022073703800120092005370300200a2008370300200b200637030020022007370360200120043a000020012007370001200141096a2006370000200141116a2008370000200141196a2005370000200041286a20103602002000200f3602242000200e36022020002002290308370000200041086a200241086a41086a290300370000200041106a200241086a41106a290300370000200041186a200241086a41186a290300370000200324000f0b41c9b4c00041dd001050000b200f450d00200e102a0b41c4d1c3004133200241d0006a419cd9c3001038000bfc0101057f230041306b220224000240411210282203450d0020034100290095ae44370000200341106a41002f00a5ae443b0000200341086a410029009dae4437000020024292808080a0023702042002200336020020012002108f012002280208210320022802002101200241106a41186a22044200370300200241106a41106a22054200370300200241106a41086a220642003703002002420037031020012003200241106a1000200041186a2004290300370000200041106a2005290300370000200041086a20062903003700002000200229031037000002402002280204450d002002280200102a0b200241306a24000f0b411241011037000bfe0703037f047e0a7f23002202210320024180036b41607122022400200141186a220429000021052004200229039802370000200129001021062001200229039002370010200129000821072001200229038802370008200241003a0080022001290000210820012002290380023700002002200537039801200220063703900120022007370388012002200837038001200141206a2d0000210420024180026a41176a2209200537000020024180026a41106a220a20022900910137030020024180026a41086a220b20022900890137030020022002290081013703800202402008a741ff01714101460d00200041073a0040200324000f0b200241186a41176a2009290000370000200241186a41106a200a290300370300200241186a41086a200b2903003703002002200229038002370318200220043a0037200241e0006a200241186a10b0012002410036028002200241e0006a412020024180026a1006210c0240200228028002220d417f460d002002200d36023c2002200c36023820024180026a200241386a10b101024020022d00a1024102460d00200241d8016a41206a220420024180026a41206a2d00003a0000200241d8016a41186a220920024180026a41186a220e290300370300200241d8016a41106a220a20024180026a41106a220f290300370300200241d8016a41086a220b20024180026a41086a221029030037030020022002290380023703d80120024180016a200241a2026a41c100109a051a0240200d450d00200c102a0b200241386a41206a220d20042d00003a0000200241386a41186a220c2009290300370300200241386a41106a2211200a290300370300200241386a41086a2212200b290300370300200220022903d80137033820024180026a20024180016a41c100109a051a2004200d2d00003a00002009200c290300370300200a2011290300370300200b2012290300370300200220022903383703d80120024180016a20024180026a41c100109a051a200141206a20024180016a41c0006a2d00003a0000200141186a20024180016a41386a290000370000200141106a20024180016a41306a290000370000200141086a20024180016a41286a290000370000200120022900a001370000200e200241186a41186a290300370300200f200241186a41106a2903003703002010200241186a41086a290300370300200220022903183703800220024180026a41286a200b29030037030020024180026a41306a200a29030037030020024180026a41386a200929030037030020024180026a41c0006a20042d00003a0000200220022903d8013703a002200020024180026a41c100109a051a200324000f0b41c4d1c300413320024180016a419cd9c3001038000b41c9b4c00041dd001050000bfc0101057f230041306b220224000240411510282203450d00200341002900d088453700002003410d6a41002900dd8845370000200341086a41002900d8884537000020024295808080d0023702042002200336020020012002108f012002280208210320022802002101200241106a41186a22044200370300200241106a41106a22054200370300200241106a41086a220642003703002002420037031020012003200241106a1000200041186a2004290300370000200041106a2005290300370000200041086a20062903003700002000200229031037000002402002280204450d002002280200102a0b200241306a24000f0b411541011037000bd30b03097f017e017f23004190026b2202240041002103200241003a00880220012802042204417d6a2105417f21060240024002400240024002400240034020042003460d01200241e8016a20036a200128020022072d00003a00002001200420066a3602042001200741016a3602002002200341016a22083a0088022005417f6a21052006417f6a21062008210320084120470d000b200241c8016a41186a200241e8016a41186a290300370300200241c8016a41106a200241e8016a41106a290300370300200241c8016a41086a200241e8016a41086a290300370300200220022903e8013703c80120042008460d0120072d000121092001200420066a3602042001200741026a360200200941074f0d01200241086a41186a200241c8016a41186a290300370300200241086a41106a200241c8016a41106a290300370300200241086a41086a200241c8016a41086a290300370300200220022903c8013703082004417f6a2008460d0520072d000221032001200741036a220a3602002001200420086b2206417e6a2208360204200341014b0d0520030e020302030b200341ff0171450d00200241003a0088020b200041023a00210c040b41002103200241003a0088022006417e6a2104417d21080340024020042003470d00200341ff0171450d04200241003a0088020c040b200241e8016a20036a200720036a220641036a2d00003a00002001200520036b3602042001200641046a3602002002200341016a22063a0088022008417f6a21082006210320064120470d000b200241a8016a41086a200241e8016a41086a290300220b37030020024188016a41186a200241e8016a41186a29030037030020024188016a41106a200241e8016a41106a29030037030020024188016a41086a200b370300200220022903e801220b3703a8012002200b370388014101210c200520066b41016a2108200720066a41036a210a0c010b4100210c0b200241e8006a41186a20024188016a41186a290300370300200241e8006a41106a20024188016a41106a290300370300200241e8006a41086a20024188016a41086a29030037030020022002290388013703682008450d00200a2d0000210320012008417f6a3602042001200a41016a360200200341014b0d00410021060240024020030e020100010b41002103200241003a0088022008417f6a21042008417e6a21060340024020042003470d00200341ff0171450d03200241003a0088020c030b200241e8016a20036a200a20036a220841016a2d00003a0000200120063602042001200841026a3602002002200341016a22083a0088022006417f6a21062008210320084120470d000b200241a8016a41086a200241e8016a41086a290300220b37030020024188016a41186a200241e8016a41186a29030037030020024188016a41106a200241e8016a41106a29030037030020024188016a41086a200b370300200220022903e801220b3703a8012002200b37038801410121060b200241286a41186a220320024188016a41186a290300370300200241286a41106a220120024188016a41106a290300370300200241286a41086a220820024188016a41086a290300370300200241c8006a41086a2204200241e8006a41086a290300370300200241c8006a41106a2205200241e8006a41106a290300370300200241c8006a41186a2207200241e8006a41186a290300370300200220022903880137032820022002290368370348200041186a200241086a41186a290300370000200041106a200241086a41106a290300370000200041086a200241086a41086a290300370000200020022903083700002000200c3a0021200020093a0020200041c2006a20063a0000200020022903483700222000412a6a2004290300370000200041326a20052903003700002000413a6a2007290300370000200041c3006a2002290328370000200041cb006a2008290300370000200041d3006a2001290300370000200041db006a20032903003700000c010b200041023a00210b20024190026a24000b340020004197dbc00036020420004100360200200041146a4103360200200041106a41bcbcc000360200200041086a42083702000b5201027f230041106b2202240002404104102822030d00410441011037000b20024204370204200220033602004100200210b401200041086a200228020836020020002002290300370200200241106a24000b920701037f0240024002400240024002402000413f4b0d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d06200241017422042003200420034b1b22044100480d060240024020020d002004102821030c010b200128020020022004102c21030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000f0b200041808001490d032000418080808004490d020c010b200441011037000b0240024002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d05200241017422042003200420034b1b22044100480d050240024020020d002004102821030c010b200128020020022004102c21030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a000002400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d05200341017422022004200220044b1b22024100480d050240024020030d002002102821030c010b200128020020032002102c21030b2003450d0220012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b200441011037000b200241011037000b024002400240200141046a2802002203200141086a28020022026b4104490d00200128020021030c010b200241046a22042002490d03200341017422022004200220044b1b22024100480d030240024020030d002002102821030c010b200128020020032002102c21030b2003450d0120012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b200241011037000b024002400240200141046a2802002203200141086a28020022026b4102490d00200128020021030c010b200241026a22042002490d02200341017422022004200220044b1b22024100480d020240024020030d002002102821030c010b200128020020032002102c21030b2003450d0120012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b200241011037000b1031000bd82504027f027e087f037e230041b00d6b220724000240024002402001280230200128024022082802b801460d002004420020042903082209200841c0006a2903007d220a200a20095622081b3703082008450d0120004188c5c00036020420004101360200200041086a412a3602002000410c6a2006290200370200200041146a200641086a2802003602000c020b200041f3c3c00036020420004101360200200041086a41293602002000410c6a2006290200370200200041146a200641086a2802003602000c010b200741186a41186a200141e8006a290000370300200741186a41106a200141e0006a290000370300200741186a41086a200141d8006a290000370300200720012900503703182006280208210b20062802002108200741b0026a41186a220c4200370300200741b0026a41106a220d4200370300200741b0026a41086a220e4200370300200742003703b0022008200b200741b0026a1000200741d00a6a41186a200c290300370300200741d00a6a41106a200d290300370300200741d00a6a41086a200e290300370300200720072903b0023703d00a0240024002400240024002400240024002400240412010282208450d0020082005290000370000200841186a200541186a290000370000200841106a200541106a290000370000200841086a200541086a2900003700002008412041c000102c2208450d01200820072903d00a370020200841386a200741d00a6a41186a290300370000200841306a200741d00a6a41106a290300370000200841286a200741d00a6a41086a290300370000200841c000418001102c2208450d0220082007290318370040200841d8006a200741186a41186a290300370000200841d0006a200741186a41106a290300370000200841c8006a200741186a41086a290300370000200741b0026a41186a220c4200370300200741b0026a41106a220d4200370300200741b0026a41086a220e4200370300200742003703b002200841e000200741b0026a1000200741386a41186a220f200c290300370300200741386a41106a220c200d290300370300200741386a41086a220d200e290300370300200720072903b0023703382008102a20062902002109200741d8006a41d8006a200d290300370300200741d8006a41e0006a200c290300370300200741c0016a200f29030037030020074194016a410036020020074184016a419cc4c000360200200741f8006a4200370300200741f4006a221041f8b9c00036020020072001360260200741d8006a41286a200141186a2211360200200720072903383703a8012007420837028c012007410036027020074100360264200720012802483602a00120072001290340370398012007200128023041016a360288012001290300210a2007200128024c3602a4012007200a370358200741c8016a41186a200541186a290000370300200741c8016a41106a200541106a290000370300200741c8016a41086a200541086a29000037030020074101360270200720052900003703c8012011200741386a10b601210620072007280270417f6a2208360270024020060d0020080d042007417f36027020074190026a41186a200741386a41186a29030037030020074190026a41106a200741386a41106a29030037030020074190026a41086a200741386a41086a2903003703002007200729033837039002024002402007280274220e41f8b9c000460d002007280278210f0c010b4100210f200741d00a6a410041e0021099051a200741b0026a410041a0081099051a41880b1028220e450d06200e41003b0106200e4100360200200e41086a200741d00a6a41e002109a051a200e41e8026a200741b0026a41a008109a051a200741003602782007200e3602740b024002400340200e41086a2108200e2f0106221241057421064100210c0240024003402006450d0120074190026a20084120109c05220d450d02200641606a2106200c41016a210c200841206a2108200d417f4a0d000b200c417f6a21120b200f450d02200f417f6a210f200e20124102746a41880b6a280200210e0c010b0b200e200c41e0006c6a41e8026a21060c010b200741f0016a41186a20074190026a41186a290300220a370300200741f0016a41106a20074190026a41106a2903002213370300200741f0016a41086a20074190026a41086a2903002214370300200720072903900222153703f001200741ec0a6a2014370200200741d00a6a41246a2013370200200741fc0a6a200a3702002007200741d8006a41246a3602e00a200720123602dc0a200720103602d80a2007200e3602d40a200741003602d00a200720153702e40a200741e4026a4200370200200741003a00ec02200742003703b002200741003a008d03200741f8b9c0003602e002200742003703c802200741d00a6a200741b0026a10b70121060b200741e0016a290300210a20064201370318200641013a003c200641286a427f370300200641206a427f3703002006413d6a20072903c801370000200641d5006a200a370000200641cd006a200741d8016a290300370000200641c5006a200741d0016a2903003700002007200728027041016a360270200741106a20044101200741186a200741386a20022003200741d8006a10b8012007280210220e0d06200741b0026a200520072802a00128020010b901024020072802b0024101470d002009422088a72106200741b8026a280200210520072802b402210e2009a721010c0b0b20074190026a41186a200741b0026a410472220641186a2802002208360200200741d00a6a41106a200641086a290200370300200741d00a6a41186a200641106a290200370300200741f00a6a2008360200200741063602d40a200741b38dc6003602d00a200720062902003703d80a200728029c0121062007200741d8006a3602c8022007290358210a20072802a4012108200741d8026a200741186a41086a290300370300200741e0026a200741186a41106a290300370300200741e8026a200741186a41186a290300370300200720033703b802200720023703b002200720083602cc022007200a3703c002200720072903183703d0022007200b3602f801200720093703f00120074190026a2006200741d00a6a200741b0026a200741f0016a200410ba012007419c026a290200210220074190026a41086a2802002112200728029402210f02402007280290024101470d002002422088a72106200741a4026a280200210b2002a7210120122105200f210e0c0a0b200728027041016a220b41004c0d072007200b360270200728027821040240024003402010280200220541086a210820052f0106220e41057421064100210c0240024003402006450d01200741386a20084120109c05220d450d02200641606a2106200c41016a210c200841206a2108200d417f4a0d000b200c417f6a210e0b2004450d022004417f6a21042005200e4102746a41880b6a21100c010b0b2005200c41e0006c6a220641c5036a310000200641e8026a290300220320035022081ba7450d004200200641f8026a29030020081b21034200200641f0026a29030020081b21090c010b2007200728028001200741386a20072802840128021c110500200741086a2903002103200729030021092007280270210b0b2007200b417f6a3602702009200728029801220629037854200320064180016a29030022095420032009511b450d082002a7210b41c0c4c000210e411e2105200f2101201221060c090b2009422088a721062009a7210141dec4c000210e412a21050c090b412041011037000b41c00041011037000b41800141011037000b41a8b8c0004110200741b0026a41d0b8c0001038000b41880b41081037000b200728021421052009422088a721062009a721010c030b41b8b8c0004118200741b0026a41e0b8c0001038000b20074190026a41086a2208200741186a41086a29030037030020074190026a41106a220c200741186a41106a29030037030020074190026a41186a220d200741186a41186a290300370300200741f0016a41086a2205200741386a41086a290300370300200741f0016a41106a2204200741386a41106a290300370300200741f0016a41186a220e200741386a41186a2903003703002007200729031837039002200720072903383703f00102400240024002402007280294012206200728029001470d00200641016a220b2006490d0320064101742210200b2010200b4b1b2210ad42b0017e2203422088a70d032003a7220b4100480d030240024020060d00200b102821060c010b200728028c01200641b0016c200b102c21060b2006450d0120072010360290012007200636028c0120072802940121060b200728028c01200641b0016c6a220641003a0000200620072f00ed013b0001200641013a00102006410036000c200642013700042006200729039002370011200620072903f001370031200641036a200741ef016a2d00003a0000200641196a2008290300370000200641216a200c290300370000200641296a200d290300370000200641396a2005290300370000200641c1006a2004290300370000200641c9006a200e290300370000200641e0006a200741d7016a290000370000200641d9006a200741c8016a41086a290000370000200620072900c801370051200641e8006a200741b0026a41c800109a051a200720072802940141016a2208360294010240200741d00a6a41186a280200450d00200741e40a6a280200102a20072802940121080b200728029001210e200728028c012105200728027c210b2007280278210d2007280274210602402007280264220c450d00200741e8006a280200450d00200c102a0b0240024020024280808080f01f8350450d002007200b3602b8022007200d3602b402200720063602b0022011200741b0026a10bb012007200e3602b402200720053602b00220072005200841b0016c22086a22043602bc0202400240200141386a280200220c2001413c6a28020022066b200841b0016d220d490d002001280234210c0c010b2006200d6a220e2006490d05200c4101742206200e2006200e4b1b2206ad42b0017e2203422088a70d052003a7220e4100480d0502400240200c0d00200e1028210c0c010b2001280234200c41b0016c200e102c210c0b200c450d042001200c360234200141386a20063602002001413c6a28020021060b200c200641b0016c6a20052008109a051a2001413c6a22062006280200200d6a360200200720043602b802200741b0026a10690c010b02402008450d00200841b0016c210441002108034002400240200520086a220c2d0000220141014b0d000240024020010e020001000b0240200c41086a280200450d00200c41046a280200102a0b200c41106a2d00004105490d02200c41386a280200450d02200c41346a280200102a0c020b200c41286a106a0c010b200c41e8006a280200450d00200c41e4006a280200102a0b2004200841b0016a2208470d000b0b0240200e450d002005102a0b02400240200d0d00200621080c010b200d210c20062108034020082802880b2108200c417f6a220c0d000b0340200620062f01064102746a41880b6a2802002106200d417f6a220d0d000b0b200741cc026a20062f0106360200200741c8026a4100360200200741c4026a20063602002007200b3602d002200741003602c002200742003703b802200720083602b402200741003602b002200741b0026a109b010b20002007290338370004200041003602002000412c6a2002370200200041286a2012360200200041246a200f3602002000411c6a200741d0006a290300370000200041146a200741c8006a2903003700002000410c6a200741c0006a2903003700000c050b200b41081037000b200e41081037000b1031000b200741e80a6a280200450d00200741e40a6a280200102a0b024020072802642208450d00200741e8006a280200450d002008102a0b2006ad2102200728027c21042007280274210602400240200728027822080d002006210c0c010b2008210d2006210c0340200c2802880b210c200d417f6a220d0d000b0340200620062f01064102746a41880b6a28020021062008417f6a22080d000b0b200242208621022001ad2103200741cc026a20062f010636020041002108200741c8026a4100360200200741c4026a2006360200200720043602d002200741003602c002200742003703b8022007200c3602b402200741003602b002200741b0026a109b0102402007280294012206450d00200728028c01210d200641b0016c2101034002400240200d20086a22062d0000220c41014b0d0002400240200c0e020001000b0240200641086a280200450d00200641046a280200102a0b200641106a2d00004105490d02200641386a280200450d02200641346a280200102a0c020b200641286a106a0c010b200641e8006a280200450d00200641e4006a280200102a0b2001200841b0016a2208470d000b0b200220038421020240200728029001450d00200728028c01102a0b2000200e36020420004101360200200041146a200b3602002000410c6a2002370200200041086a20053602000b200741b00d6a24000bb80201097f230041106b220224000240200028020041016a220341004c0d0020002003360200200041046a2104200041086a280200210502400240024003402004280200220641086a210720062f010622084105742104410021090240024003402004450d01200120074120109c05220a450d02200441606a2104200941016a2109200741206a2107200a417f4a0d000b2009417f6a21080b2005450d022005417f6a2105200620084102746a41880b6a21040c010b0b2006200941e0006c6a220441a4036a2d000022074101410220074101461b200441c5036a2d00001b22044102470d010b20002802102001200041146a2802002802181101002104200028020021030c010b200441014621040b20002003417f6a360200200241106a240020040f0b41b8b8c0004118200241086a41e0b8c0001038000b8f1901187f230041d0116b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e000109a051a024002400240024020032f01062201410b490d00200241b0036a410041e0021099051a20024198066a410041a0081099051a0240024041880b10282209450d00200941003b010620094100360200200941086a200241b0036a41e002109a052101200941e8026a20024198066a41a008109a052106200220032f00c8013b01ac032002200341ca016a2d00003a00ae03200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210a200341cf016a280000210b200341d3016a280000210c200341d7016a280000210d20024198066a200341a8076a41e000109a051a2001200341e8016a20032f010641796a2200410574109a052101200620034188086a200041e0006c109a052106200341063b0106200920003b0106200220022f01ac033b019403200220022d00ae033a0096032002200229039803370380032002200229009d0337008503200241b0036a20024198066a41e000109a051a0240024020044107490d00200441057420016a41c07e6a2001200441796a22074105746a2201200041ffff037120076b410574109b051a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200441e0006c20066a220041c07b6a200041e07a6a220e200941066a22002f010020076b41e0006c109b051a200e200241a0026a41e000109a051a0c010b200341086a20044105746a220141206a2001200341066a22002f010020046b410574109b051a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220e41e0006a200e20002f010020046b41e0006c109b051a200e200241a0026a41e000109a051a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e000109a051a2002411c6a41026a220f20042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e000109a051a20032802002206450d0320032f0104211020024198066a410272211103402002419c026a41026a2212200f2d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e000109a051a201041ffff0371210702400240024020062f01062203410b490d002011410041b20b1099051a41b80b10282201450d0520014100360200200141046a20024198066a41b40b109a051a200220062f00c8013b01ac032002200641ca016a2d00003a00ae03200220062900db01370398032002200641e0016a29000037009d03200641cb016a2800002113200641cf016a2800002114200641d3016a2800002115200641d7016a280000211620024198066a200641a8076a41e000109a051a200141086a200641e8016a20062f0106220041796a2203410574109a052117200141e8026a20064188086a200341e0006c109a052118200141880b6a200641a40b6a2000417a6a2208410274109a052119200641063b0106200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024198066a41e000109a051a200220022d00ae0322033a009603200220022f01ac0322003b0194032002200229009d033700850320022002290398033703800320024194066a41026a220820033a0000200220003b01940620022002290380033703800120022002290085033700850120024198066a200241b0036a41e000109a051a201041ffff037122004107490d0120172007417a6a22044105746a2017200741796a22034105746a220020012f010620036b410574109b051a200041186a200229008d023700002000200d36000f2000200c36000b2000200b3600072000200a360003200041026a20122d00003a0000200020022f019c023b00002000200229038802370013200741e0006c20186a220041c07b6a200041e07a6a220020012f010620036b41e0006c109b051a2000200241a0026a41e000109a051a200120012f010641016a22003b01062007410274220a20196a416c6a201920044102746a2210200041ffff0371220720046b410274109b051a2010200936020020072004490d022001200a6a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020032007490d000c030b0b200641086a2200200741016a22044105746a200020074105746a2200200320076b2201410574109b051a2000200d36000f2000200c36000b2000200b3600072000200a360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002006200741e0006c6a220041c8036a200041e8026a2200200141e0006c109b051a2000200241a0026a41e000109a051a2006200341016a22033b01062007410274200641880b6a22006a41086a200020044102746a2200200341ffff037120046b410274109b051a20002009360200201041ffff037120062f010622034f0d07200920043b010420092006360200200420034f0d072003417f6a210120062004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042006360200200041046a21002001200341016a2203470d000c080b0b200641086a2203200741016a22044105746a200320074105746a220320062f0106221020076b2219410574109b051a2003200d36000f2003200c36000b2003200b3600072003200a360003200341026a20122d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200641e8026a200741e0006c6a220341e0006a2003201941e0006c109b051a2003200241a0026a41e000109a051a2006201041016a22033b010620074102742219200641880b6a22106a41086a201020044102746a2210200341ffff037120046b410274109b051a20102009360200200020062f010622044f0d00200620196a418c0b6a2103034020032802002200200741016a22073b010420002006360200200341046a210320042007470d000b0b20024184026a41026a220320082d00003a0000200220022f0194063b01840220022002290380013703f00120022002290085013700f50120024190016a20024198066a41e000109a051a200f20032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e000109a051a0240200628020022030d002013210a2016210d2015210c2014210b200121090c050b20062f010421102013210a2016210d2015210c2014210b20032106200121090c000b0b41880b41081037000b41b80b41081037000b200320044105746a220041286a200041086a2210200120046b410574109b051a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000201020022903203700002003200441e0006c6a220041c8036a200041e8026a220e20032f010620046b41e0006c109b051a200e200241a0026a41e000109a051a200320032f010641016a3b01060c010b20024198066a410272410041b20b1099051a41b80b10282203450d0120034100360200200341046a20024198066a41b40b109a051a2003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200320032f010622044105746a220041086a20022f011c3b00002000410a6a2002411c6a41026a2d00003a0000200041176a200d360000200041136a200c3600002000410f6a200b3600002000410b6a200a3600002000411b6a2002290308370000200041206a200229000d3700002003200441e0006c6a41e8026a200241206a41e000109a051a200341880b6a200441016a22004102746a2009360200200320003b0106200920003b0104200920033602000b200241d0116a2400200e0f0b41b80b41081037000b9f19020a7f087e230041800c6b220824000240024002400240024002400240024002400240200728021841016a220941004c0d0020072009360218200741206a280200210a2007411c6a220b210c024002400340200c280200220d41086a210e200d2f0106220f410574210c41002110024002400340200c450d012004200e4120109c052211450d02200c41606a210c201041016a2110200e41206a210e2011417f4a0d000b2010417f6a210f0b200a450d02200a417f6a210a200d200f4102746a41880b6a210c0c010b0b200d201041e0006c6a220c41c5036a310000200c41e8026a2903002212201250220e1ba7450d004200200c41f8026a290300200e1b21134200200c41f0026a290300200e1b21140c010b200841286a200741286a28020020042007412c6a28020028021c110500200841306a290300211320072802182109200829032821140b20072009417f6a360218200141186a29030021122007280240210c20012903102115024002400240024041004101410220142013842216501b20021b0e03010200010b200c41a8016a210c0c020b200c4188016a210c0c010b200c4198016a210c0b20152012844200510d01200841186a200c290300200c41086a2903002015201210a00520014200200129030822122008290318427f200841186a41086a290300501b7d22152015201256220c1b3703080240200c450d0041b2c5c000210c4122210e0c0a0b200728021841016a220141004c0d02200720013602182007280220210a200b210c024002400340200c280200220d41086a210e200d2f0106220f410574210c41002110024002400340200c450d012003200e4120109c052211450d02200c41606a210c201041016a2110200e41206a210e2011417f4a0d000b2010417f6a210f0b200a450d02200a417f6a210a200d200f4102746a41880b6a210c0c010b0b200d201041e0006c6a220c41c5036a310000200c41e8026a2903002212201250220e1ba7450d004200200c41f8026a290300200e1b21124200200c41f0026a290300200e1b21150c010b200841086a200741286a28020020032007412c6a28020028021c110500200841106a290300211220072802182101200829030821150b20072001417f6a3602180240201520057d2217201556201220067d2015200554ad7d221520125620152012511b4101470d00419893c100210c411d210e0c0a0b024020164200520d002007280240220c290378200556200c4180016a290300221220065620122006511b450d0041e293c100210c411f210e0c0a0b2008200341022017201510bc0102402008280200220c450d002008280204210e0c0a0b0240201420057c2216201454220c201320067c200cad7c221220135420122013511b450d0041b593c100210c412d210e0c0a0b4100210c024020032004470d000c0a0b0240200320044120109c050d000c0a0b20072802180d032007417f360218200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a2900003703002008200329000037036002400240200728021c221141f8b9c000460d002007280220210a0c010b4100210a200841a0096a410041e0021099051a20084180016a410041a0081099051a41880b10282211450d05201141003b010620114100360200201141086a200841a0096a41e002109a051a201141e8026a20084180016a41a008109a051a200741003602202007201136021c0b02400240034020112f0106220f410574210d4100210c4100210e02400340200d200c460d01200841e0006a2011200c6a41086a4120109c052210450d03200c41206a210c200e41016a210e2010417f4a0d000b200e417f6a210f0b0240200a450d00200a417f6a210a2011200f4102746a41880b6a28020021110c010b0b200841c0006a41186a200841e0006a41186a2903002213370300200841c0006a41106a200841e0006a41106a2903002214370300200841c0006a41086a200841e0006a41086a2903002218370300200820082903602219370340200841bc096a2018370200200841a0096a41246a2014370200200841cc096a20133702002008200741246a22013602b0092008200f3602ac092008200b3602a809200820113602a409200841003602a009200820193702b409200841b4016a4200370200200841bc016a41003a0000200841f8b9c0003602b00120084200370398012008420037038001200841003a00dd01200841a0096a20084180016a10b701210c0c010b20084198016a420037030020084194016a41f8b9c000360200200841003602a00120084100360290012008420037038801200841f8b9c000360284012008410036028001200741246a21012011200e41e0006c6a41e8026a210c20084180016a1095010b200c41106a2015370300200c2017370308200c420137030020072007280218220c41016a220e360218200e200c4f0d052007417f360218200841e0006a41186a200441186a290000370300200841e0006a41106a200441106a290000370300200841e0006a41086a200441086a2900003703002008200429000037036002400240200728021c221141f8b9c000460d002007280220210a0c010b4100210a200841a0096a410041e0021099051a20084180016a410041a0081099051a41880b10282211450d07201141003b010620114100360200201141086a200841a0096a41e002109a051a201141e8026a20084180016a41a008109a051a200741003602202007201136021c0b02400240034020112f0106220f410574210d4100210c4100210e02400340200d200c460d01200841e0006a2011200c6a41086a4120109c052210450d03200c41206a210c200e41016a210e2010417f4a0d000b200e417f6a210f0b0240200a450d00200a417f6a210a2011200f4102746a41880b6a28020021110c010b0b200841c0006a41186a200841e0006a41186a2903002215370300200841c0006a41106a200841e0006a41106a2903002213370300200841c0006a41086a200841e0006a41086a2903002214370300200820082903602217370340200841bc096a2014370200200841c4096a2013370200200841cc096a2015370200200820013602b0092008200f3602ac092008200b3602a809200820113602a409200841003602a009200820173702b409200841b4016a4200370200200841bc016a41003a0000200841f8b9c0003602b00120084200370398012008420037038001200841003a00dd01200841a0096a20084180016a10b701210c0c010b20084198016a420037030020084194016a41f8b9c000360200200841003602a00120084100360290012008420037038801200841f8b9c0003602840120084100360280012011200e41e0006c6a41e8026a210c20084180016a1095010b200c41106a2012370300200c2016370308200c42013703002007200728021841016a360218200841a0096a41086a2210200341086a290000370300200841a0096a41106a2211200341106a290000370300200841a0096a41186a220d200341186a290000370300200841e0006a41086a220a200441086a290000370300200841e0006a41106a220f200441106a290000370300200841e0006a41186a2201200441186a290000370300200820032900003703a0092008200429000037036002402007413c6a280200220e200741386a280200470d00200e41016a220c200e490d09200e4101742204200c2004200c4b1b2203ad42b0017e2212422088a70d092012a722044100480d0902400240200e0d0020041028210c0c010b2007280234200e41b0016c2004102c210c0b200c450d082007200c360234200741386a2003360200200728023c210e0b4100210c2007280234200e41b0016c6a220e41003a0000200e20082f003d3b0001200e4200370008200e4101360004200e20082903a009370011200e2008290360370031200e41036a2008413f6a2d00003a0000200e41106a41003a0000200e41196a2010290300370000200e41216a2011290300370000200e41296a200d290300370000200e41396a200a290300370000200e41c1006a200f290300370000200e41c9006a2001290300370000200e2005370358200e41e0006a2006370300200e41d4006a200841c0006a41036a280000360000200e2008280040360051200e41e8006a20084180016a41c800109a051a2007200728023c41016a36023c0c090b41b8b8c000411820084180016a41e0b8c0001038000b419cb7c0001032000b41b8b8c000411820084180016a41e0b8c0001038000b41a8b8c000411020084180016a41d0b8c0001038000b41880b41081037000b41a8b8c000411020084180016a41d0b8c0001038000b41880b41081037000b200441081037000b1031000b2000200e3602042000200c360200200841800c6a24000bb011030b7f017e047f230041b0016b220324000240024002400240024002400240024002400240411410282204450d00200441002900ddd843370000200441106a41002800edd843360000200441086a41002900e5d84337000020034294808080c00237023c200320043602382003200341386a36028001200120034180016a10c801200328023821042003280240210520034180016a41186a2206420037030020034180016a41106a2207420037030020034180016a41086a2208420037030020034200370380012004200520034180016a1000200341d8006a41186a2006290300370300200341d8006a41106a2007290300370300200341d8006a41086a200829030037030020032003290380013703580240200328023c450d002003280238102a0b2003410036028001200341d8006a412020034180016a100621062003280280012209417f460d032006450d0320032009360284012003200636028001200341286a20034180016a106c20032802280d02200328022c2105200341206a20034180016a106c20032802200d0220032802242108200341186a20034180016a106c20032802180d022003280284012204450d02200328021c210a20032004417f6a360284012003200328028001220441016a3602800120042d0000220441014b0d024100210b0240024020040e020100010b4101210b0b200341106a20034180016a106c20032802100d02200328028401220c20032802142204490d022004417f4c0d050240024020040d00410121070c010b2004102e2207450d022007200328028001220d2004109a051a2003200c20046b360284012003200d20046a360280010b2007450d02200341a0016a41026a220c200341386a41026a220d2d00003a0000200320032f00383b01a00102402009450d002006102a0b200d200c2d000022063a0000200341346a41026a20063a0000200320032f01a00122063b0138200320063b0134410021060c040b411441011037000b200441011037000b41c4d1c3004133200341386a419cd9c3001038000b4101210641d2bfc2002105411121084102210b0b200341306a41026a2209200341346a41026a220c2d00003a0000200320032f01343b013002402006450d002000200536020420004101360200200041086a20083602000c050b200c20092d00003a0000200320032f01303b013402400240200228025820054b0d002004210620042102200721090c010b411510282205450d02200541002900c8d8433700002005410d6a41002900d5d843370000200541086a41002900d0d84337000020034295808080d00237023c200320053602382003200341386a36028001200120034180016a10c801200328023821052003280240210620034180016a41186a2208420037030020034180016a41106a2209420037030020034180016a41086a220b420037030020034200370380012005200620034180016a1000200341d8006a41186a2008290300370300200341d8006a41106a2009290300370300200341d8006a41086a200b29030037030020032003290380013703580240200328023c450d002003280238102a0b2003410036028001200341d8006a412020034180016a100621060240024002402003280280012208417f460d002006450d0020032008360284012003200636028001200341086a20034180016a106c02400240024020032802080d002003280284012209200328020c2205490d002005417f4c0d070240024020050d004101210c0c010b2005102e220c450d02200c200328028001220b2005109a051a2003200920056b360284012003200b20056a360280010b200c0d020b41c4d1c3004133200341386a419cd9c3001038000b200541011037000b2005ad220e422086200e84210e02402008450d002006102a0b20034180016a200c200e422088a7200210f802200ea7210d20034180016a41086a280200210820032802840121052003280280014101470d022000200536020420004101360200200041086a2008360200200d450d01200c102a0c010b200041e3bfc20036020420004101360200200041086a411a3602000b2004450d062007102a0c060b200341d8006a41026a220f2003419f016a2d00003a0000200320032f009d013b01582003419c016a2d0000210b20034198016a280200210620034194016a280200210220034190016a28020021092003418c016a280200210a02402004450d002007102a0b200341346a41026a200f2d00003a0000200320032f01583b01342006417f4c0d010240024020060d0041002107410121040c010b20062107200610282204450d040b200420092006109a05210f200341386a41146a2006360200200341386a41106a20073602002003200a3602402003200836023c200320053602382003200f3602442003200b41ff01714101463a0050411410282204450d04200441002900ddd843370000200441106a41002800edd843360000200441086a41002900e5d84337000020034294808080c0023702a401200320043602a0012003200341a0016a36028001200120034180016a10c80120032802a001210420032802a801210120034180016a41186a2210420037030020034180016a41106a2211420037030020034180016a41086a2212420037030020034200370380012004200120034180016a1000200341d8006a41186a2010290300370300200341d8006a41106a2011290300370300200341d8006a41086a20122903003703002003200329038001370358024020032802a401450d0020032802a001102a0b20034120360284012003200341d8006a36028001200341386a20034180016a10f90202402007450d00200f102a0b200d450d00200c102a0b20002005360204200020032f01343b001d200041003602002000411c6a200b3a0000200041186a2006360200200041146a2002360200200041106a20093602002000410c6a200a360200200041086a20083602002000411f6a200341366a2d00003a00000c040b1036000b411541011037000b200641011037000b411441011037000b200341b0016a24000b821d02097f017e230041e0006b22062400024002402002410c6a280200200241106a280200100f2207417f460d00410c102822080d01410c41041037000b10fc02000b200820073602082008428180808010370200200641186a420037030020064280808080c0003703102006420437030802400240024002400240024002400240024002400240024002400240024002402008280200220741016a220941014d0d00200820093602002007417e460d002008200741026a3602000240200628021c22072006280218470d00200741016a22092007490d0b2007410174220a2009200a20094b1b220941ffffffff03712009470d0b2009410274220b4100480d0b0240024020070d00200b1028210a0c010b20062802142007410274200b102c210a0b200a450d02200620093602182006200a3602140b200628021420074102746a20083602002006200628021c41016a36021c2008280208210b410310282209450d02200941026a41002d00fae2453a0000200941002f00f8e2453b000041061028220a450d03200a41046a41002f00cf8f443b0000200a41002800cb8f44360000024020062802102207200628020c470d00200741016a220c2007490d0b2007410174220d200c200d200c4b1b220c41ffffff3f71200c470d0b200c410574220e4100480d0b0240024020070d00200e1028210d0c010b20062802082007410574200e102c210d0b200d450d052006200c36020c2006200d3602080b200628020820074105746a220741013602182007200a36020c2007428380808030370204200720093602002007411c6a200b360200200741106a4286808080e0003702002006200628021041016a36021020082008280200417f6a2207360200024020070d002008280208101020082008280204417f6a220736020420070d002008102a0b200641086a41f8e2c500410341effec5004103410b10fe02200641086a41f8e2c500410341f2fec500410f410c10fe02200641086a41f8e2c50041034181ffc500410f410d10fe02200641086a41f8e2c50041034190ffc5004108410e10fe02200641086a41f8e2c50041034198ffc500410f410f10fe02200641086a41f8e2c500410341a7ffc500410a411010fe02200641086a41f8e2c500410341b1ffc500410a411110fe02200641086a41f8e2c500410341bbffc500410b411210fe02200641086a41f8e2c500410341c6ffc500410d411310fe02200641086a41f8e2c500410341d3ffc500410c411410fe02200641086a41f8e2c500410341dfffc500410b411510fe02200641086a41f8e2c500410341eaffc5004115411610fe02200641086a41f8e2c500410341ffffc500410a411710fe02200641086a41f8e2c5004103418980c6004107411810fe02200641086a41f8e2c5004103419080c6004113411910fe02200641086a41f8e2c500410341a380c6004111411a10fe02200641086a41f8e2c500410341b480c600410e411b10fe02200641086a41f8e2c500410341c280c6004110411c10fe02200641086a41f8e2c500410341d280c6004110411d10fe02200641086a41f8e2c500410341e280c6004111411e10fe02200641086a41f8e2c500410341f380c6004111411f10fe02200641086a41f8e2c5004103418481c6004116412010fe02200641086a41f8e2c5004103419a81c6004112412110fe02200641086a41f8e2c500410341ac81c600410b412210fe02200641086a41f8e2c500410341b781c6004110412310fe02200641206a410c6a200441086a280200360200200620033602204100210d2006410036023c20062005360238200620083602342006200429020037022420062001280200360230200241146a280200210b2002411c6a280200210c200628020821072006280210210820064100360258200642013703502008200641d0006a10b40102402008450d00200720084105746a2105034020072802002104200741086a2802002208200641d0006a10b401024002402006280254220a200628025822096b2008490d002006280250210a0c010b200920086a22012009490d0d200a41017422032001200320014b1b22014100480d0d02400240200a0d0020011028210a0c010b2006280250200a2001102c210a0b200a450d08200620013602542006200a3602500b2006200920086a360258200a20096a20042008109a051a2007410c6a2802002103200741146a280200220a200641d0006a10b4010240024020062802542209200628025822046b200a490d00200628025021080c010b2004200a6a22082004490d0d200941017422012008200120084b1b22014100480d0d0240024020090d002001102821080c010b200628025020092001102c21080b2008450d092006200136025420062008360250200121090b20062004200a6a2201360258200820046a2003200a109a051a02400240200741186a2802004101460d000240024020092001460d002009210a0c010b200941016a220a2009490d0f20094101742204200a2004200a4b1b220a4100480d0f0240024020090d00200a102821080c010b20082009200a102c21080b2008450d0c2006200a360254200620083602500b2006200141016a2209360258200820016a41013a000020062007411c6a2802002204360248200641c8006a21010c010b0240024020092001460d002009210a0c010b200941016a220a2009490d0e20094101742204200a2004200a4b1b220a4100480d0e0240024020090d00200a102821080c010b20082009200a102c21080b2008450d0c2006200a360254200620083602500b2006200141016a2209360258200820016a41023a000020062007411c6a2802002204360248200641c8006a21010b0240200a20096b41034b0d00200941046a22042009490d0d200a41017422032004200320044b1b22044100480d0d02400240200a0d002004102821080c010b2008200a2004102c21080b2008450d0c2006200436025420062008360250200128020021040b2006200941046a360258200820096a2004360000200741206a22072005470d000b0b2006280254210302404124200b200c2006280250220e2006280258200641206a1011220b41036a220841024b0d000240024020080e03000201000b4102210d0b41012104024020030d000c110b200e102a0c100b200628021c220541ffffffff03712005470d0b20054102742207417f4c0d0b200628021421080240024020070d004104210c0c010b20071028220c450d0d0b0240024020050d004100210a0c010b200541027421044100210a200c210703402008280200220928020041016a220141014d0d022009200136020020072009360200200a41016a210a200741046a2107200841046a21082004417c6a22040d000b0b02402003450d00200e102a0b200228020421092002280200210420064100360258200642013703504100200641d0006a10b401200628025821012006280254210220062802502107410a102e2208450d0d0240024002400240200b20042009200720012008410a200641206a101241036a220941034b0d004101210420090e0402000001020b41a8c7c2001032000b2006410936024c410121042006200841016a36024820082d0000220941014b0d01410421010240024020090e020100010b200641d0006a200641c8006a109803200628025022014104460d02200628025421030b410021040b2008102a2002450d0f2007102a0c0f0b2008102a024020020d000c0f0b2007102a0c0e0b00000b200b41041037000b410341011037000b410641011037000b200e41041037000b200141011037000b200141011037000b200a41011037000b200a41011037000b200441011037000b1031000b1036000b200741041037000b410a41011037000b200b10130240200a450d00200a4102742107200c21080340200828020022092009280200417f6a3602000240200828020022092802000d0020092802081010200828020022092009280204417f6a360204200828020022092802040d002009102a0b200841046a21082007417c6a22070d000b0b4102210d2005450d00200c102a0b200641206a41086a28020021072006280234210820062802242109024002400240024002400240024002400240200628023c220a0d002006412c6a290200210f20040d04200141044b0d0320010e050203030301020b2000200a36020420004100360200200041106a41003a0000200041086a200641c0006a29030037020002402007450d002009102a0b20082008280200417f6a220736020020070d072008280208101020082008280204417f6a22073602042007450d060c070b2000200936020441002109200041106a41003a00002000410c6a4100360200200041086a20073602000c040b20002009360204200041106a20033a00002000410c6a200f3e0200200041086a2007360200410021090c030b200041aa9cc400360204200041146a200f3e0200200041106a20073602002000410c6a2009360200200041086a41113602000c010b0240200d450d00200041cb9cc400360204200041146a200f3e0200200041106a20073602002000410c6a2009360200200041086a41103602000c010b200041bb9cc400360204200041146a200f3e0200200041106a20073602002000410c6a2009360200200041086a41103602000b410121090b2000200936020020082008280200417f6a220736020020070d012008280208101020082008280204417f6a220736020420070d010b2008102a0b024020062802102207450d00200628020821082007410574210703400240200841046a280200450d002008280200102a0b0240200841106a280200450d002008410c6a280200102a0b200841206a2108200741606a22070d000b0b0240200628020c450d002006280208102a0b0240200628021c2207450d0020062802142108200741027421070340200828020022092009280200417f6a3602000240200828020022092802000d0020092802081010200828020022092009280204417f6a360204200828020022092802040d002009102a0b200841046a21082007417c6a22070d000b0b02402006280218450d002006280214102a0b200641e0006a24000b8a1409057f017e0c7f047e037f017e037f047e097f230041f00c6b22022400024020002802000d002000417f360200200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241f0016a2002109301024020022903900222074202510d002000410c6a2108200041046a2109200241900a6a41146a210a200241900a6a41206a210b200241f0016a4104722103200241f0016a413d6a210c200241cd026a210d200241b8026a210e200241f0016a41306a210f200241f0016a41286a21100340200241c8006a41086a2204200241f0016a41086a2211290300370300200241c8006a41106a2201200241f0016a41106a2212290300370300200241c8006a41186a2205200241f0016a41186a2213290300370300200220022903f001370348200e2903002114200f290300211520022903b0022116200229039802211720022f01ee02211820022d00ed02211920022d00cc02211a20022903a802211b20022802c002211c20022802c402211d20022802c802211e200241286a41186a200d41186a290000221f370300200241286a41106a200d41106a2900002220370300200241286a41086a200d41086a29000022213703002002200d2900002222370328200241e8006a41186a2223201f370300200241e8006a41106a22242020370300200241e8006a41086a222520213703002002202237036820024188016a41186a2226200529030037030020024188016a41106a2227200129030037030020024188016a41086a222820042903003703002002200229034837038801024002400240024002402009280200222941f8b9c000460d002000280208212a0c010b200241900a6a410041e0021099051a200241f0016a410041a0081099051a41880b10282229450d014100212a202941003b010620294100360200202941086a200241900a6a41e002109a051a202941e8026a200241f0016a41a008109a051a20004100360208200020293602040b0340202941086a210120292f0106222b410574210441002105024003402004450d0120024188016a20014120109c052206450d04200441606a2104200541016a2105200141206a21012006417f4a0d000b2005417f6a212b0b0240202a450d00202a417f6a212a2029202b4102746a41880b6a28020021290c010b0b200241c0016a41186a2026290300221f370300200241c0016a41106a20272903002220370300200241c0016a41086a20282903002221370300200220022903880122223703c001200a2022370200200a41086a2021370200200a41106a2020370200200a41186a201f370200200220083602a00a2002202b36029c0a200220093602980a200220293602940a200241003602900a20102014370300201220153703002002201637039002200220173703f8012002201a3a00ac022002201e3602a8022002201d3602a4022002201c3602a0022002201b37038802200220073703f001200c2002290368370000200c41086a2025290300370000200c41106a2024290300370000200c41186a2023290300370000200220183b01ce02200220193a00cd02200241900a6a200241f0016a10b7011a0c020b41880b41081037000b202941e8026a200541e0006c6a2129024020194101710d0020292029290300200720075022041b37030020292029290308201720041b370308202941106a22012001290300201520041b370300200241900a6a41186a22062023290300370300200241900a6a41106a222a2024290300370300200241900a6a41086a222b2025290300370300200220022903683703900a20292d003c21012013202941d5006a22052900003703002012202941cd006a22192900003703002011202941c5006a222329000037030020022029413d6a22242900003703f0012028200241900a6a200241f0016a201a41ff0171410146221a1b220441086a2900003703002027200441106a2900003703002026200441186a2900003703002002200429000037038801202941012001201a1b3a003c2024200229038801370000202320282903003700002019202729030037000020052026290300370000202920162029290320201ba722041b370320202941286a22012014200129030020041b3703002029201b202929031820041b37031802400240201d0d00201c21040c010b201d2101201c2104034020042802ec0321042001417f6a22010d000b0340201c201c2f01064102746a41ec036a280200211c201d417f6a221d0d000b0b201c2f010621012002201e3602a801200220013602a401200241003602a0012002201c36029c01200241003602980120024200370390012002200436028c012002410036028801200241f0016a20024188016a109901024020022802f0014101470d00202941306a211c0340200241900a6a41286a200341286a280200360200200b200341206a2902003703002006200341186a2204290200370300202a200341106a2201290200370300202b200341086a2205290200370300200220032902003703900a200241c0016a41186a2004290000370300200241c0016a41106a2001290000370300200241c0016a41086a2005290000370300200220032900003703c001200241e0016a41086a200b41086a2802003602002002200b2902003703e001200241b0016a201c200241c0016a200241e0016a10bd01024020022802b001450d0020022802b4012204450d0020022802b801450d002004102a0b200241f0016a20024188016a10990120022802f0014101460d000b0b20024188016a1095010c010b202941386a212b202941306a212a202928023821262029280230210402400240202941346a28020022050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b200220263602900220024100360288022002410036028002200242003703f801200220013602f401200241003602f0012002200436028402200220042f010636028c02200241f0016a109501202941286a201437030020292016370320202941106a2015370300202920173703082029201b37031820292007370300202a201d360204202a201c360200202b201e3602002029201a3a003c2029413d6a2002290368370000202941c5006a2025290300370000202941cd006a2024290300370000202941d5006a2023290300370000202920183b015e202920193a005d0b200241f0016a200210930120022903900222074202520d000b0b2002109b012000200028020041016a360200200241f00c6a24000f0b41a8b8c0004110200241f0016a41d0b8c0001038000bf00203027f017e037f230041306b22052400024002400240200241ff0171417e6a220641024b0d000240024020060e03000201000b200520011099022005290300200358200541086a290300220720045820072004511b0d010c020b200541106a20011099022005290310200356200541186a290300220720045620072004511b0d010b200541206a2001109a020240200528022822010d0002402005280224450d002005280220102a0b410021010c020b200141057421061098012108200528022421092005280220220a2101024002400240034002402008200141106a2802004f0d002001290300200358200141086a290300220720045820072004511b0d002001411c6a2d000020027141ff0171200241ff0171460d020b200141206a2101200641606a22060d000b4100210120090d010c020b4184dfc00021012009450d010b200a102a0b413121060c010b41dedec0002101412621060b2000200636020420002001360200200541306a24000bc31e03087f037e127f23004180076b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a290000370300200420022900003703600240024002400240024002400240024002402001280200220541f8b9c000460d00200128020421060c010b41002106200441e8026a410041e0021099051a200441c0016a41004184011099051a41ec0310282205450d01200541003b010620054100360200200541086a200441e8026a41e002109a051a200541e8026a200441c0016a418401109a051a20014100360204200120053602000b02400340200541086a2107200541066a210820052f0106220941057421024100210a0240024003402002450d01200441e0006a20074120109c05220b450d02200241606a2102200a41016a210a200741206a2107200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200520094102746a41ec036a28020021050c010b0b200441e8026a41086a22022005200a410c6c6a220741f0026a220a2802003602002004200741e8026a22072902003703e80220072003290200370200200a200341086a280200360200200441c0016a41086a20022802002202360200200420042903e802220c3703c0012000410c6a20023602002000200c370204200041013602000c060b200441086a41186a220b200441e0006a41186a2202290300370300200441086a41106a200441e0006a41106a2207290300220c370300200441086a41086a200441e0006a41086a220a290300220d37030020042004290360220e3703082001200128020841016a3602082007200c370300200a200d3703002002200b2903003703002004200e370360200441d8026a41086a2206200341086a280200360200200420032902003703d802024020082f01002203410b490d00200441e8026a410041e0021099051a200441c0016a41004184011099051a41ec031028220f450d02200f41003b0106200f4100360200200f41086a200441e8026a41e002109a052107200f41e8026a200441c0016a418401109a05210a200441e8026a41086a220b200541b8036a280200360200200420052900db013703a8012004200541e0016a2900003700ad01200420052902b0033703e802200420052f00c8013b01bc012004200541ca016a2d00003a00be01200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a20052f010641796a2202410574109a052107200a200541bc036a2002410c6c109a05210a200541063b0106200f20023b0106200420042f01bc013b01a401200420042d00be013a00a601200420042903a8013703c001200420042900ad013700c501200441286a41086a200b280200360200200420042903e8023703280240024020094107490d00200941057420076a41c07e6a2007200941796a220b4105746a2207200241ffff0371200b6b410574109b051a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a290300370000200720042903603700002009410c6c200a6a220241b87f6a200241ac7f6a2202200f41066a22082f0100200b6b410c6c109b051a200241086a200441d8026a41086a280200360200200220042903d8023702000c010b200541086a20094105746a220241206a200220082f010020096b410574109b051a200241186a200441e0006a41186a290300370000200241106a200441e0006a41106a290300370000200241086a200441e0006a41086a29030037000020022004290360370000200541e8026a2009410c6c6a2202410c6a200220082f010020096b410c6c109b051a200241086a200441d8026a41086a280200360200200220042903d8023702000b200820082f010041016a3b010020044198016a41026a220220042d00a6013a0000200441c8026a41086a2214200441286a41086a280200360200200420042f01a4013b019801200420042903c001370350200420042900c501370055200420042903283703c8022004413c6a41026a221520022d00003a0000200420042f0198013b013c2004200429005537002d20042004290350370328200441c0006a41086a22162014280200360200200420042903c80237034020052802002206450d0420052f01042103200441e8026a4102722117034020044194016a41026a221820152d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a41086a221920162802003602002004200429034037039801200341ffff0371210502400240024020062f01062202410b490d00201741004196041099051a419c041028220b450d07200b4100360200200b41046a200441e8026a419804109a051a200420062f00c8013b01bc012004200641ca016a2d00003a00be012004200641db016a2900003703a8012004200641e0016a2900003700ad01200641cb016a280000211a200641cf016a280000211b200641d3016a280000211c200641d7016a280000211d200441e8026a41086a221e200641b8036a2802003602002004200641b0036a2902003703e802200b41086a200641e8016a20062f0106220741796a2202410574109a05211f200b41e8026a200641bc036a2002410c6c109a052120200b41ec036a20064188046a2007417a6a2209410274109a052108200641063b0106200b20023b010602402009450d00410021022008210703402007280200220a20023b0104200a200b360200200741046a21072009200241016a2202470d000b0b200441d8026a41086a2202201e280200360200200420042d00be0122073a00a601200420042f01bc01220a3b01a401200420042903a8013703c001200420042900ad013700c501200420042903e8023703d802200441c4026a41026a220920073a00002004200a3b01c402200420042903c0013703e802200420042900c5013700ed0220142002280200360200200420042903d8023703c802200341ffff037122074107490d01201f2005417a6a220a4105746a201f200541796a22024105746a2207200b2f010620026b410574109b051a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20182d00003a0000200720042f0194013b0000200720042903603700132005410c6c20206a220741b87f6a200741ac7f6a2207200b2f0106220320026b410c6c109b051a200741086a20192802003602002007200429039801370200200b200341016a22073b01062005410274221020086a416c6a2008200a4102746a2203200741ffff03712205200a6b410274109b051a2003200f3602002005200a490d02200b20106a41d4036a210703402007280200220a200241016a22023b0104200a200b360200200741046a210720022005490d000c030b0b200641086a2207200541016a220a4105746a200720054105746a2207200220056b410574109b051a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20044194016a41026a2d00003a0000200720042f0194013b00002007200429036037001320062005410c6c6a220241f4026a200241e8026a220720062f0106220b20056b410c6c109b051a200241f0026a20044198016a41086a28020036020020072004290398013702002006200b41016a22023b01062005410274200641ec036a22076a41086a2007200a4102746a2207200241ffff0371220b200a6b410274109b051a2007200f360200200341ffff0371200b4f0d082006200a417f6a22024102746a41f0036a210703402007280200220a200241016a22023b0104200a2006360200200741046a21072002200b490d000c090b0b200641086a2202200541016a22034105746a200220054105746a220220062f010620056b410574109b051a200241186a20042900653700002002201336000f2002201236000b2002201136000720022010360003200241026a20182d00003a0000200220042f0194013b000020022004290360370013200641e8026a2005410c6c6a2202410c6a200220062f0106220a20056b410c6c109b051a200241086a201928020036020020022004290398013702002006200a41016a22023b010620054102742210200641ec036a220a6a41086a200a20034102746a2208200241ffff0371220a20036b410274109b051a2008200f3602002007200a4f0d00200620106a41f0036a2102034020022802002207200541016a22053b010420072006360200200241046a2102200a2005470d000b0b20044190016a41026a220220092d00003a000020044180016a41086a22072014280200360200200420042f01c402220a3b019001200420042903e802370350200420042900ed02370055200420042903c80237038001201520022d00003a00002004200a3b013c2004200429005537002d200420042903503703282016200728020036020020042004290380013703400240200628020022020d00201a2110201d2113201c2112201b2111200b210f0c060b20062f01042103201a2110201d2113201c2112201b211120022106200b210f0c000b0b200520094105746a220b41286a200b41086a2201200320096b410574109b051a200b41206a2002290300370000200b41186a2007290300370000200b41106a200a2903003700002001200429036037000020052009410c6c6a220241f4026a200241e8026a220720052f010620096b410c6c109b051a200241f0026a2006280200360200200720042903d802370200200520052f010641016a3b01060c040b41ec0341041037000b41ec0341041037000b419c0441041037000b200441e8026a41027241004196041099051a419c0410282202450d0220024100360200200241046a200441e8026a419804109a051a2002200128020022073602ec03200120023602002001200128020441016a360204200741003b010420072002360200200220022f0106220a4105746a220741086a20042f013c3b00002007410a6a2004413c6a41026a2d00003a0000200741176a2013360000200741136a20123600002007410f6a20113600002007410b6a20103600002007411b6a2004290328370000200741206a200429002d3700002002200a410c6c6a220741f0026a200441c0006a41086a280200360200200741e8026a2004290340370200200241ec036a200a41016a22074102746a200f360200200220073b0106200f20073b0104200f20023602000b200041003602000b20044180076a24000f0b419c0441041037000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a28020022040d00200321000c010b2004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000b0b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a109b01200141306a24000bcb0401097f230041c0006b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a280200210602400240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d01200220084120109c05220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a220841e8026a210502400240200841c5036a2d00000d00200341206a41086a220a200541c5006a290000370300200341206a41106a220b200541cd006a290000370300200341206a41186a2207200541d5006a29000037030020032005413d6a2900003703204102210820052d003c4101470d01200341186a2007290300370300200341106a200b290300370300200341086a200a29030037030020032003290320370300410121080c010b200341086a200541c5006a290000370300200341106a200541cd006a290000370300200341186a200541d5006a29000037030020032005413d6a29000037030020052d003c21080b200841ff01714102470d010b200020012802102002200141146a280200280210110500200128020021040c010b200020083a000020002003290300370001200041096a200341086a290300370000200041116a200341106a290300370000200041196a200341186a2903003700000b20012004417f6a360200200341c0006a24000f0b41b8b8c0004118200341206a41e0b8c0001038000be80202097f027e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d01200220084120109c05220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a220541c5036a310000200541e8026a290300220c200c5022081ba7450d004200200541f8026a29030020081b210c4200200541f0026a29030020081b210d0c010b200341086a20012802102002200141146a28020028021c110500200341106a290300210c200128020021042003290308210d0b20012004417f6a3602002000200c3703082000200d370300200341206a24000f0b41b8b8c0004118200341186a41e0b8c0001038000ba62a020c7f037e230022072108200741800f6b41607122072400200720043703382007200337033020072005360244024002400240024002402001280230200128024022092802b801460d002005420020052903082203200941386a2903007d2204200420035622091b37030820090d0120074180046a20024100410110c201200741a4046a280200210a200741a0046a280200210b20072d008804220541037122094103460d0220090e03030203030b200041d4c5c00036020420004101360200200041086a41293602002000410c6a2006290200370200200041146a200641086a2802003602000c030b200041fdc5c00036020420004101360200200041086a41233602002000410c6a2006290200370200200041146a200641086a280200360200200824000f0b200041a0c6c00036020420004101360200200041086a41193602002000410c6a2006290200370200200041146a200641086a28020036020020050d01200a450d01200b102a200824000f0b200741a8046a2802002109200741c8006a41186a220c200141e8006a290000370300200741c8006a41106a220d200141e0006a290000370300200741c8006a41086a220e200141d8006a290000370300200720012900503703484100210f4100211002400240024002400240024002400240024002400240024002400240024020050d002009417f4c0d010240024020090d002007420037038004410121100c010b200910282210450d03200741003602840420072009360280040b20072009360284042010200b2009109a051a2007290380042103200a450d00200b102a0b200741a4016a410036020020074194016a419cc4c000360200200741e8006a41206a420037030020074184016a41f8b9c000360200200741e8006a41106a2003370300200741e8006a41d8006a200241086a290000370300200741e8006a41e0006a200241106a290000370300200741e8006a41e8006a200241186a29000037030020072001360270200741e8006a41286a200141186a22113602002007420837029c01200741003602800120072010360274200720022900003703b801200720012802483602b001200720012903403703a8012007200128023041016a36029801200129030021032007200128024c3602b40120072003370368200741d8016a41206a200e290300370300200741d8016a41286a200d29030037030020074188026a200c290300370300200741ec016a200641086a280200360200200720023602e001200720072903483703f001200720062902003702e4012007200741c4006a3602dc012007200741306a3602d8010240024020072903302203200741306a41086a290300220484500d00200741286a20072802444100200741f0016a200220032004200741e8006a10b801200728022822060d01200728028001210f20072802e00121020b200f41016a220d41004c0d03200741d8016a41186a210e200741e4016a210f2007200d36028001200741e8006a41206a280200210a20074184016a2212210602400240024003402006280200220b41086a2105200b2f0106220c4105742106410021090240024003402006450d01200220054120109c052210450d02200641606a2106200941016a2109200541206a21052010417f4a0d000b2009417f6a210c0b200a450d02200a417f6a210a200b200c4102746a41880b6a21060c010b0b200b200941e0006c6a220541e8026a210602400240200541c5036a2d00000d0020074180046a41086a2209200641c5006a29000037030020074180046a41106a2210200641cd006a29000037030020074180046a41186a220b200641d5006a29000037030020072006413d6a290000370380044102210520062d003c4101470d01200741a00c6a41186a200b290300370300200741a00c6a41106a2010290300370300200741a00c6a41086a200929030037030020072007290380043703a00c410121050c010b200741a80c6a200641c5006a290000370300200741b00c6a200641cd006a290000370300200741b80c6a200641d5006a29000037030020072006413d6a2900003703a00c20062d003c21050b200541ff01714102470d010b20074190026a2007280290012002200728029401280210110500200728028001210d20072d00900221050c010b20074199026a200741a80c6a290300370000200741a1026a200741b00c6a290300370000200741a9026a200741b80c6a290300370000200720053a009002200720072903a00c370091020b2007200d417f6a360280014101210a0240200541ff01714101470d00200741b8026a41186a200741a9026a290000370300200741b8026a41106a200741a1026a290000370300200741b8026a41086a20074199026a29000037030020072007290091023703b80220074180046a200741b8026a20072802b00128020010b90102402007280280044101470d0020072902e4012203422088a7210520074180046a41086a28020021092007280284042106200741ec016a28020021102003a721020c100b200741a00c6a41186a220520074180046a410472220641186a2802002209360200200741d8026a41106a200641086a290200370300200741d8026a41186a200641106a290200370300200741f8026a2009360200200741043602dc02200741af8dc6003602d802200720062902003703e00220072802ac0121062005200e41186a2900002203370300200741a00c6a41106a200e41106a2900002204370300200741a00c6a41086a2205200e41086a2900002213370300200741a8046a2013370300200741b0046a2004370300200741b8046a20033703002007200e29000022033703a00c200720033703a00420072802d801220941086a29030021032007200741e8006a36029804200929030021042007290368211320072802b4012109200720033703880420072004370380042007200936029c0420072013370390042005200f41086a2802003602002007200f2902003703a00c200741e0036a2006200741d8026a20074180046a200741a00c6a20072802dc0128020010ba01200741ec036a2902002103200741e0036a41086a280200210c20072802e403210a024020072802e0034101470d002003422088a72105200741f4036a28020021102003a72102200c2109200a21060c0f0b20072802800141016a220f41004c0d0520072802e00121022007200f36028001200728028801210d201221060240024003402006280200220b41086a2105200b2f0106220e4105742106410021090240024003402006450d01200220054120109c052210450d02200641606a2106200941016a2109200541206a21052010417f4a0d000b2009417f6a210e0b200d450d02200d417f6a210d200b200e4102746a41880b6a21060c010b0b200b200941e0006c6a220641c5036a310000200641e8026a290300220420045022051ba7450d004200200641f8026a29030020051b21044200200641f0026a29030020051b21130c010b200741186a200728029001200220072802940128021c110500200741206a290300210420072903182113200728028001210f0b2007200f417f6a221036028001201320072802a801220629037854200420064180016a29030022135420042013511b0d060c070b4100210c420021030240200741e8016a280200450d0020072802e401102a0b420021040c070b200728022c210920072902e4012203422088a721052003a72102200741ec016a28020021100c0d0b1036000b200941011037000b41b8b8c000411820074180046a41e0b8c0001038000b41b8b8c000411820074180046a41e0b8c0001038000b20072802702206450d020240024020072802e0012205200641d0006a2209460d00200920054120109c05450d00034020062802082206450d022005200641d0006a2209460d01200920054120109c050d000b0b2003a7211041b9c6c000210641372109200c2105200a21020c080b20100d032007417f36028001200741003a00bc03200742003702b403200741013a009d03200741f8b9c0003602b003200741e0036a41186a200541186a290000370300200741e0036a41106a200541106a290000370300200741e0036a41086a200541086a290000370300200720052900003703e00302400240200728028401221041f8b9c000460d00200728028801210b0c010b200741a00c6a410041e0021099051a20074180046a410041a0081099051a41880b10282210450d054100210b201041003b010620104100360200201041086a200741a00c6a41e002109a051a201041e8026a20074180046a41a008109a051a200741003602880120072010360284010b02400240034020102f0106220d4105742102410021064100210502400240034020022006460d01200741e0036a201020066a41086a4120109c052209450d02200641206a2106200541016a21052009417f4a0d000b2005417f6a210d0b200b450d02200b417f6a210b2010200d4102746a41880b6a28020021100c010b0b2010200541e0006c6a22064190036a20072903a80337030020064188036a20072903a003370300200641c0036a200729039803370000200641b8036a200729039003370000200641b0036a200729038803370000200641a8036a20072903800337000020064180036a4200370300200641e8026a2205290300211320054200370300200641a0036a22052802002102200520072903b80337030020064198036a22062903002104200620072903b0033703002004a721062004422088a721050c010b200741c0036a41186a200741e0036a41186a2903002204370300200741c0036a41106a200741e0036a41106a2903002213370300200741c0036a41086a200741e0036a41086a2903002214370300200720072903e00322153703c003200741bc0c6a2014370200200741a00c6a41246a2013370200200741cc0c6a20043702002007200741e8006a41246a3602b00c2007200d3602ac0c200720123602a80c200720103602a40c200741003602a00c200720153702b40c20074180046a41186a42003703002007420037038004200741b8046a20072903b803370300200741b0046a20072903b003370300200741a8046a20072903a803370300200741a0046a20072903a003370300200741d8046a200729039803370300200741d0046a200729039003370300200741c8046a200729038803370300200741c0046a200729038003370300200741a00c6a20074180046a10b7011a420221130b024020134202510d000240024020050d00200621090c010b2005211020062109034020092802ec0321092010417f6a22100d000b0340200620062f01064102746a41ec036a28020021062005417f6a22050d000b0b2007419c046a20062f010636020020074198046a410036020020074194046a2006360200200720023602a004200741003602900420074200370388042007200936028404200741003602800420074180046a1095010b200720072802800141016a360280010b0240200741f0026a280200450d00200741ec026a280200102a0b200342ffffffff0f83210420034280808080708321030b20072802a401210520072802a001210d200728029c01210b200728028c01210e20072802880121102007280284012106024020072802742209450d00200741f8006a280200450d002009102a0b200420038421040240024020034280808080f01f8350450d002007200e3602880420072010360284042007200636028004201120074180046a10bb012007200d360284042007200b360280042007200b200541b0016c22056a220236028c0402400240200141386a28020022092001413c6a28020022066b200541b0016d2210490d00200128023421090c010b200620106a220d2006490d0720094101742206200d2006200d4b1b2206ad42b0017e2203422088a70d072003a7220d4100480d070240024020090d00200d102821090c010b2001280234200941b0016c200d102c21090b2009450d0620012009360234200141386a20063602002001413c6a28020021060b2009200641b0016c6a200b2005109a051a2001413c6a2206200628020020106a360200200720023602880420074180046a10692000410c6a2004370200200041086a200c3602002000200a3602040c010b2000200a3602042000410c6a2004370200200041086a200c36020002402005450d00200541b0016c210141002105034002400240200b20056a22092d0000220241014b0d000240024020020e020001000b0240200941086a280200450d00200941046a280200102a0b200941106a2d00004105490d02200941386a280200450d02200941346a280200102a0c020b200941286a106a0c010b200941e8006a280200450d00200941e4006a280200102a0b2001200541b0016a2205470d000b0b0240200d450d00200b102a0b0240024020100d00200621050c010b2010210920062105034020052802880b21052009417f6a22090d000b0340200620062f01064102746a41880b6a28020021062010417f6a22100d000b0b2007419c046a20062f010636020020074198046a410036020020074194046a20063602002007200e3602a004200741003602900420074200370388042007200536028404200741003602800420074180046a109b010b20004100360200200824000f0b41f0c6c00041321050000b41a8b8c000411020074180046a41d0b8c0001038000b41880b41081037000b200d41081037000b1031000b200741f0026a280200450d00200741ec026a280200102a0b2000200636020420004101360200200041146a2010360200200041086a20093602002000410c6a2005ad4220862002ad84370200024020072802742206450d00200741f8006a280200450d002006102a0b200741e8006a411c6a2802002106200728028c0121000240024020072802880122050d00200621090c010b2005211020062109034020092802880b21092010417f6a22100d000b0340200620062f01064102746a41880b6a28020021062005417f6a22050d000b0b20074180046a411c6a20062f01063602004100210520074198046a410036020020074194046a2006360200200720003602a004200741003602900420074200370388042007200936028404200741003602800420074180046a109b01024020072802a4012206450d00200728029c012110200641b0016c2100034002400240201020056a22062d0000220941014b0d000240024020090e020001000b0240200641086a280200450d00200641046a280200102a0b200641106a2d00004105490d02200641386a280200450d02200641346a280200102a0c020b200641286a106a0c010b200641e8006a280200450d00200641e4006a280200102a0b2000200541b0016a2205470d000b0b20072802a001450d00200728029c01102a200824000f0b200824000b871304057f027e0a7f077e230041f0026b22042400200441d0006a2001108c010240024020042d00502205417f6a41ff017141024f0d00200041003a0000200041086a200441d0006a41d800109a051a0c010b200441a8016a41086a2206200441d0006a413c6a290200370300200441a8016a41106a2207200441d0006a41c4006a290200370300200441a8016a41186a2208200441d0006a41cc006a2902003703002004200441d0006a41346a2902003703a801200441d0006a41106a2903002109200441d0006a41086a290300210a200441d0006a41306a280200210b200441d0006a412c6a280200210c200441d0006a41246a280200210d200441d0006a41206a280200210e200441ec006a280200210f200441d0006a41186a2802002110200441d0006a41d4006a2802002111200441d0006a41286a28020021120240024002400240024002400240024002400240024041004100109801221320026b2202200220134b1b220220126b2214201420024b1b2214450d00200441c0006a2001109101200441306a20042903402215200441c0006a41086a2903002216428080a8ec85afd1b101420010a0054200200dad2217200429033022187d221920192017564200200441306a41086a2903002017201854ad7c7d22174200522017501b22021b22184200201720021b221784500d042015428080d287e2bc2d5441002016501b0d01200441186a2014ad420020182017109f05200441086a2004290318200441186a41086a290300428080e983b1de164200109f05200441286a20014108420020152015428080aef89dc3527c2217200a200a201756200920162017201554ad7c427f7c22175620092017511b22021b22182004290308221920182019542017200920021b2218200441086a41086a29030022175420182017511b22021b221a7d221b201b20155620162018201720021b22187d2015201a54ad7d221520165620152016511b22141b4200201520141b10bc010240024020042802280d000240024020020d002003450d010b20044188026a2001201a201841081098022004280288024101460d08200420044198026a2903003703f001200420044188026a41086a2903003703e8012004200441e8016a3602880220044188026a109d010b20020d0020030d01200041003a0008200041023a0000200041186a2009370000200041106a200a370000200041386a200b360000200041346a200c360000200041306a20123600002000412c6a200d360000200041286a200e360000200041246a200f360000200041206a20103600002000413c6a20042903a801370000200041c4006a200441b0016a290300370000200041cc006a200441a8016a41106a290300370000200041d4006a200441a8016a41186a290300370000200041dc006a2011360000200541037122004103460d0520000e030d05050d0b20044100360288022010200e20044188026a100d21142004280288022213417f460d07200441e8016a41186a200441a8016a41186a290300370300200441e8016a41106a200441a8016a41106a290300370300200441e8016a41086a200441a8016a41086a290300370300200420042903a8013703e801200441003602e802200442013703e00220142013200441e0026a10b2020240024020042802e402220320042802e802220d6b4120490d00200d41206a211220042802e00221020c010b200d41206a2212200d490d0a200341017422022012200220124b1b220b4100480d0a0240024020030d00200b102821020c010b20042802e0022003200b102c21020b2002450d092004200b3602e402200420023602e002200b21030b200420123602e8022002200d6a220d20042903e801370000200d41086a200441e8016a41086a290300370000200d41106a200441e8016a41106a290300370000200d41186a200441e8016a41186a29030037000020044188026a41186a220d420037030020044188026a41106a220b420037030020044188026a41086a220c420037030020044200370388022002201220044188026a1000200441c8016a41186a2212200d290300370300200441c8016a41106a220d200b290300370300200441c8016a41086a220b200c29030037030020042004290388023703c80102402003450d002002102a0b200441a1026a201229030037000020044199026a200d29030037000020044191026a200b290300370000200420042903c80137008902200441013a008802200120044188026a10b3022010200e1004200041013a0000200041086a20044188026a41d800109a051a2013450d032014102a0c030b200441b8026a200b360200200441b4026a200c360200200441b0026a2013360200200441ac026a200d360200200441a8026a200e360200200441a4026a200f36020020044188026a41186a2010360200200441bc026a20042903a801370200200441c4026a200441a8016a41086a290300370200200441cc026a200441a8016a41106a290300370200200441d4026a200441a8016a41186a29030037020020044188026a41106a200920177d200a201954ad7d370300200441003a0088022004200a20197d37039002200120044188026a10b302200041023a0000200041086a20044188026a41d800109a051a0c090b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041386a200b360000200041346a200c360000200041306a20123600002000412c6a200d360000200041286a200e360000200041246a200f360000200041206a20103600002000413c6a20042903a801370000200041c4006a2006290300370000200041cc006a2007290300370000200041d4006a2008290300370000200041dc006a20113600000c080b20011096012010200e1004200041023a0008200041013a00000b200f450d062010102a0c060b200f450d070c060b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041386a200b360000200041346a200c360000200041306a20123600002000412c6a200d360000200041286a200e360000200041246a200f360000200041206a20103600002000413c6a20042903a801370000200041c4006a200441b0016a290300370000200041cc006a200441a8016a41106a290300370000200041d4006a200441a8016a41186a290300370000200041dc006a20113600000c040b2004200429028c023703e80141f896c10041fe00200441e8016a41f897c1001038000b41eef3c50041381050000b200b41011037000b1031000b0240200541037122004103460d0020000e03020000020b200f450d010b2010102a0b200441f0026a24000be20d03047f017e027f230041106b2202240020024100360208200242013703000240024002400240024002400240024002400240024002400240024002402001280200220341044b0d000240024002400240024020030e050001020304000b410110282203450d05200242818080801037020420022003360200200341013a0000200128020421042001410c6a2802002203200210b40102402003450d002004200341286c6a2105034020042002108f01200441206a29030021060240024020022802042207200228020822036b4108490d00200228020021070c010b200341086a22082003490d15200741017422032008200320084b1b22034100480d150240024020070d002003102821070c010b200228020020072003102c21070b2007450d092002200336020420022007360200200228020821030b2002200341086a360208200720036a20063700002005200441286a2204470d000b0b200141106a28020021070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d13200441017422032008200320084b1b22034100480d130240024020040d002003102821040c010b200228020020042003102c21040b2004450d082002200336020420022004360200200228020821030b2002200341046a360208200420036a20073600000c040b410110282203450d07200242818080801037020420022003360200200341023a0000200128020421070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d12200441017422052008200520084b1b22084100480d120240024020040d002008102821040c010b200228020020042008102c21040b2004450d0920022008360204200220043602000b2002200341046a360208200420036a200736000020012802082104200141106a2802002203200210b40102402003450d002004200341286c6a2105034020042002108f01200441206a29030021060240024020022802042207200228020822036b4108490d00200228020021070c010b200341086a22082003490d14200741017422032008200320084b1b22034100480d140240024020070d002003102821070c010b200228020020072003102c21070b2007450d0c2002200336020420022007360200200228020821030b2002200341086a360208200720036a20063700002005200441286a2204470d000b0b200141146a28020021070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d12200441017422032008200320084b1b22034100480d120240024020040d002003102821040c010b200228020020042003102c21040b2004450d0b2002200336020420022004360200200228020821030b2002200341046a360208200420036a20073600000c030b410110282203450d0a200242818080801037020420022003360200200341033a0000200141086a29030021060240024020022802042207200228020822036b4108490d00200341086a2104200228020021070c010b200341086a22042003490d11200741017422082004200820044b1b22084100480d110240024020070d002008102821070c010b200228020020072008102c21070b2007450d0c20022008360204200220073602000b20022004360208200720036a20063700000c020b410110282203450d0b200242818080801037020420022003360200200341043a0000200128020421070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d10200441017422012008200120084b1b22084100480d100240024020040d002008102821040c010b200228020020042008102c21040b2004450d0d20022008360204200220043602000b2002200341046a360208200420036a20073600000c010b410110282203450d0c200242818080801037020420022003360200200341053a0000200128020421080240024020022802042207200228020822036b4104490d00200341046a2104200228020021070c010b200341046a22042003490d0f200741017422012004200120044b1b22014100480d0f0240024020070d002001102821070c010b200228020020072001102c21070b2007450d0e20022001360204200220073602000b20022004360208200720036a20083600000b20002002290300370200200041086a200241086a280200360200200241106a24000f0b410141011037000b200341011037000b200341011037000b410141011037000b200841011037000b200341011037000b200341011037000b410141011037000b200841011037000b410141011037000b200841011037000b410141011037000b200141011037000b1031000bfb0101077f230041106b220124002001410036020820014201370300200110c40120012802042102200128020021030240024002400240200041046a2802002204200041086a28020022056b20012802082206490d00200028020021040c010b200520066a22072005490d02200441017422052007200520074b1b22054100480d020240024020040d002005102821040c010b200028020020042005102c21040b2004450d0120002004360200200041046a2005360200200041086a28020021050b200041086a200520066a360200200420056a20032006109a051a02402002450d002003102a0b200141106a24000f0b200541011037000b1031000ba5900108027f017e0b7f037e2f7f027e057f0e7e23004190106b220224000240024002400240024002400240024002400240024002400240200141106a2802002203ad42d0007e2204422088a70d002004a72205417f4c0d00200128020821060240024002400240024002400240024020050d00410821070c010b200510282207450d010b0240024020030d00410021080c010b2006200341d0006c6a2109410021082007210a0340200241c8046a41186a220b200641186a290300370300200241c8046a41106a220c200641106a290300370300200241c8046a41086a220d200641086a290300370300200220062903003703c8042006280248220ead42307e2204422088a70d082004a7220f417f4c0d08200641386a2903002104200641286a290300211020062903302111200629032021122006280240210502400240200f0d00410821130c010b200f10282213450d040b200641d0006a210602400240200e0d00410021140c010b2005200e41306c6a2115410021142013210f0340200f2005290300370300200f200541086a290300370308200f41106a200541106a290300370300200f41186a200541186a290300370300200f41206a200541206a290300370300200f41286a200541286a290300370300200f41306a210f201441016a2114200541306a22052015470d000b0b200a2012370320200a20022903c804370300200a41386a2004370300200a41306a2011370300200a41286a2010370300200a41c8006a2014360200200a41c4006a200e360200200a41c0006a2013360200200a41186a200b290300370300200a41106a200c290300370300200a41086a200d290300370300200841016a2108200a41d0006a210a20062009470d000b0b200028020821162000280204211720002802002118200128020421192001280200210b41041028221a450d02201a200b36000020024284808080c0003702bc072002201a3602b807411b10282205450d03200541176a41002800f39646360000200541106a41002900ec9646370000200541086a41002900e49646370000200541002900dc96463700002002429b808080b00337028c08200220053602880841a2c7c00020024188086a10c601200228029008210f2002280288082105200241c8046a41186a22144200370300200241c8046a41106a22154200370300200241c8046a41086a22064200370300200242003703c8042005200f200241c8046a1000200241b00f6a41186a2014290300370300200241b00f6a41106a2015290300370300200241b00f6a41086a2006290300370300200220022903c8043703b00f0240200228028c08450d002005102a0b2002410036028808200241b00f6a412020024188086a100621142002280288082215417f460d042014450d042002201536028c082002201436028808200241d0026a20024188086a106c02400240024020022802d0020d00200228028c08220620022802d402220f490d00200f417f4c0d0902400240200f0d00410121050c010b200f102e2205450d022005200228028808220a200f109a051a20022006200f6b36028c082002200a200f6a360288080b20050d020b41c4d1c3004133200241f8056a419cd9c3001038000b200f41011037000b200fad220442208620048421042015450d052014102a0c050b200541081037000b200f41081037000b410441011037000b411b41011037000b410021050b20022005410120051b22133602b00f20022004420020051b22104220883e02b40f200241c8026a200241b00f6a106c20022802cc02210e41002106024020022802c8020d0020022802b40f220541246e220a41246c220f417f4c0d0102400240024002400240200f0d00410421060c010b200f10282206450d010b200e450d034100210c034020054104490d03200c41016a210d20022005417c6a22143602b40f200220022802b00f221541046a3602b00f2015280000210941002105200241003a00a8080340024020142005470d00200241003602b40f200541ff0171450d05200241003a00a8080c050b20024188086a20056a201520056a220f41046a2d00003a00002002200f41056a3602b00f2002200541016a220f3a00a808200f2105200f4120470d000b200241c8046a41086a221520024188086a41086a290300370300200241c8046a41106a220020024188086a41106a290300370300200241c8046a41186a221b20024188086a41186a29030037030020022002290388083703c80420022014200f6b22053602b40f0240200a200c470d00200c410174220f200d200f200d4b1b220aad42247e2204422088a70d122004a7220f4100480d1202400240200c0d00200f102821060c010b2006200c41246c200f102c21060b2006450d030b2006200c41246c6a220f2009360200200f20022903c804370204200f410c6a2015290300370200200f41146a2000290300370200200f411c6a201b290300370200200d210c200d200e470d000c040b0b200f41041037000b200f41041037000b0240200a0d00410021060c010b2006102a410021060b200241b00f6a200241b8076a10c70120022802b80f210f20022802b00f210520024100360288082005200f20024188086a1006210f024002402002280288082214417f460d00200f450d00200220143602dc062002200f3602d80620024188086a200241d8066a106d0240200228028808221c450d00200229028c0821042014450d02200f102a0c020b41c4d1c3004133200241f8056a419cd9c3001038000b420021044101211c0b024020022802b40f450d002005102a0b2004422088211102402010a7450d002013102a0b200e410020061b211d200a410020061b211e2006410420061b210c2011a7211f2004a72120200242003702dc02200241f8b9c0003602d8022007200841d0006c6a21210240024020080d00200721130c010b200241b8036a41306a212220024188086a410c6a212320164101742205201641ffffff3f712224200520244b1b222541ffffff3f71202547212620254105742127202420164721282016410574222941606a41057641016a212a20024188086a41306a212b20024188086a41206a212c20024188086a410272212d20024198056a41046a212e20024188086a41c0006a212f200241b00f6a41106a2130200241b8076a4104722131200241b8036a41c4006a21322018201820296a4621332007211302400240034020024188086a41386a22062013220541386a290300370300202b200541306a29030037030020024188086a41286a220a200541286a290300370300202c200541206a29030037030020024188086a41186a2234200541186a29030037030020024188086a41106a2235200541106a29030037030020024188086a41086a2236200541086a290300370300200241b00f6a41086a221b200541cc006a28020036020020022005290300370388082002200541c4006a2902003703b00f200541d0006a2113200541c0006a2802002205450d03200241f8026a41386a220f2006290300370300200241f8026a41306a2214202b290300370300200241f8026a41286a2215200a290300370300200241f8026a41206a220e202c290300370300200241f8026a41186a220d2034290300370300200241f8026a41106a22092035290300370300200241f8026a41086a22002036290300370300200241e8026a41086a2237201b28020036020020022002290388083703f802200220022903b00f3703e802200241b8036a41386a2238200f29030037030020222014290300370300200241b8036a41286a22392015290300370300200241b8036a41206a2215200e290300370300200241b8036a41186a223a200d290300370300200241b8036a41106a223b2009290300370300200241b8036a41086a223c2000290300370300200220022903f8023703b803200220053602f803203220022903e802370200203241086a20372802003602000240024002400240024002400240410410282214450d002014200b360000202341002900a2c740370000202341086a41002900aac74037000020024284808080c00037028c0820022014360288082002200241b8036a3602a408410810282205450d01200242083702b40f200220053602b00f2023200241b00f6a10c6014104200241b00f6a10b4010240024020022802b40f220f20022802b80f22056b4104490d0020022802b00f210f0c010b200541046a220e2005490d18200f4101742205200e2005200e4b1b22054100480d1802400240200f0d0020051028210f0c010b20022802b00f200f2005102c210f0b200f450d03200220053602b40f2002200f3602b00f20022802b80f21050b2002200541046a3602b80f200f20056a2014280000360000200241b8036a200241b00f6a108f01200220153602b807200241b8076a200241b00f6a10a301200220223602b807200241b8076a200241b00f6a10a30120022802f8032105200228028004220f200241b00f6a10b4010240200f450d00200f41306c210f0340200541106a200241b00f6a108f01200220053602b807200541306a2105200241b8076a200241b00f6a10a301200f41506a220f0d000b0b20022802b40f210f20022802b80f211520022802b00f2105200241c8046a41186a220d4200370300200241c8046a41106a22094200370300200241c8046a41086a22004200370300200242003703c80420052015200241c8046a100020024188046a41186a223d200d29030037030020024188046a41106a223e200929030037030020024188046a41086a223f2000290300370300200220022903c804370388040240200f450d002005102a0b2014102a411010282205450d032005410029008ab7402204370000200541086a4100290092b740221037000020024290808080800237028c082002200536028808200220024188086a3602b80720024188046a200241b8076a10c8012002280288082105200228029008210f200d42003703002009420037030020004200370300200242003703c8042005200f200241c8046a1000200241b00f6a41186a2240200d29030037030020302009290300370300201b2000290300370300200220022903c8043703b00f0240200228028c08450d00200228028808102a0b200241b00f6a41204101410041001003417f460d050c040b410441011037000b410841011037000b200541011037000b411041011037000b20022802fc03450d0120022802f803102a0c010b200241a8046a41186a2241203a290300370300200241a8046a41106a223a203b290300370300200241a8046a41086a223b203c290300370300200220022903b8033703a804200228028004220ead42307e2211422088a70d052011a7220f417f4c0d05203829030021112039290300211220022903e803214220022903d803214320022802f8032105024002400240024002400240024002400240024002400240200f0d00410821370c010b200f10282237450d010b02400240200e0d00410021140c010b2005200e41306c6a2115410021142037210f0340200f2005290300370300200f200541086a290300370308200f41106a200541106a290300370300200f41186a200541186a290300370300200f41206a200541206a290300370300200f41286a200541286a290300370300200f41306a210f201441016a2114200541306a22052015470d000b0b200241b00f6a41386a2011370300200241b00f6a41286a2012370300204020412903003703002030203a290300370300201b203b290300370300200220423703e00f200220433703d00f200220022903a8043703b00f200220143602f80f2002200e3602f40f200220373602f00f0240024020022802d802220541f8b9c000460d0020022802dc02210f0c010b20024188086a410041f0061099051a41f80610282205450d024100210f200541003b010620054100360200200541086a20024188086a41f006109a051a200241003602dc02200220053602d8020b2002200536028c082002200f360288082002200241d8026a36029008200241b8076a20024188086a200241b00f6a10c901024020022802b8074101470d00202f20312902003702002036203041086a2903003703002035203041106a2903003703002034203041186a290300370300202c203041206a290300370300200a203041286a290300370300202b203041306a2903003703002006203041386a290300370300202f41086a203141086a290200370200200220302903003703880820022802bc0f2115202e41086a220f201b280200360200202e20022903b00f370200200241c8046a20024188086a41d000109a051a200241a8056a200241c8046a41d000109a051a200220022802e00241016a3602e00220022802f005214120022802f405211420022802ec052105200241d8066a41086a22442000290300370300200241d8066a41106a220e2009290300370300200241d8066a41186a2237200d290300370300200241d8066a41206a2239200241c8046a41206a290300370300200241d8066a41286a223a200241c8046a41286a290300370300200241d8066a41306a223b200241c8046a41306a290300370300200241d8066a41386a223c200241c8046a41386a290300370300200241c8066a41086a2245200f280200360200200220022903c8043703d8062002202e2902003703c80620052f01062238410b490d0520024188086a410041f0061099051a41f80610282238450d03203841003b010620384100360200203841086a20024188086a41f006109a05210f20024188086a4108200541086a2246200541f8b9c0004622471b224841e0036a41d000109a051a200f204841b0046a20052f010641796a224841d0006c109a05210f200541063b0106203820483b0106200241b00f6a20024188086a41d000109a051a0240024020144107490d00201441d0006c4108200f203841f8b9c0004622061b6a220f41a07c6a200f41d07b6a220f4100204841ffff037120061b20146b41d0006c41b0046a109b051a200f201536020c200f41086a2045280200360200200f20022903c806370300200f20022903d806370310200f41186a2044290300370300200f41206a200e290300370300200f41286a2037290300370300200f41306a2039290300370300200f41386a203a290300370300200f41c0006a203b290300370300200f41c8006a203c290300370300203820382f010641016a3b01060c010b4108210f200241a8076a41086a200241c8066a41086a28020036020020024188086a41086a200241d8066a41086a2903003703002035200e29030037030020342037290300370300202c2039290300370300200a203a290300370300202b203b2903003703002006203c290300370300200220022903c8063703a807200220022903d80637038808024002402047450d004100210e0c010b20052f0106210e2046210f0b200f201441d0006c6a220f41d0006a200f200e20146b41d0006c109b051a200f201536020c200f41086a200241a8076a41086a280200360200200f20022903a807370300200f200229038808370310200f41186a2036290300370300200f41206a2035290300370300200f41286a2034290300370300200f41306a202c290300370300200f41386a200a290300370300200f41c0006a202b290300370300200f41c8006a2006290300370300200520052f010641016a3b01060b200241b8076a200241b00f6a41d000109a051a200241f8056a200241b8076a41d000109a051a2005280200220e450d0620052f010421370340200241d8066a200241f8056a41d000109a051a203741ffff0371210602400240024002400240200e2f01062205410b490d00202d410041a2071099051a41a80710282215450d0a20154100360200201541046a20024188086a41a407109a051a20024188086a4108200e41086a223b200e41f8b9c00046223c1b220541e0036a41d000109a051a201541086a223a200541b0046a200e2f0106220541796a220f41d0006c109a051a201541f8066a200e4194076a2005417a6a220a410274109a052139200e41063b01062015200f3b01060240200a450d00410021052039210f0340200f280200221420053b010420142015360200200f41046a210f200a200541016a2205470d000b0b200241b00f6a20024188086a41d000109a051a200241b8076a200241b00f6a41d000109a051a203741ffff037122054107490d0320024188086a200241d8066a41d000109a051a200641796a210541f8b9c0002114201541f8b9c000470d014108213a4100210a0c020b4108200e41086a200e41f8b9c0004622141b200641d0006c6a220f41d0006a200f4100200520141b20066b41d0006c109b051a200f200241d8066a41d000109a051a200e200e2f010641016a220f3b01062006410274200e41f8066a22146a41086a2014200641016a22054102746a2214200f41ffff0371220f20056b410274109b051a201420383602002006200f4f0d0c203820053b01042038200e3602002005200f4f0d0c200f417f6a2115200e2005417f6a22054102746a4180076a210f0340200f2802002214200541026a3b01042014200e360200200f41046a210f2015200541016a2205470d000c0d0b0b20152f0106210a201521140b203a2006417a6a220f41d0006c6a203a200541d0006c6a2237200a20056b41d0006c109b051a203720024188086a41d000109a051a201520152f010641016a220a3b01062006410274223720396a416c6a2039200f4102746a2206200a41ffff0371200f6b410274109b051a20062038360200200f20142f010622064b0d01201520376a41e0066a210f0340200f2802002214200541016a22053b010420142015360200200f41046a210f20052006490d000c020b0b200e41f8066a210f20024188086a200241d8066a41d000109a051a02400240203c450d004108213b4100210a0c010b200e2f0106210a0b203b200641d0006c6a221441d0006a2014200a20066b41d0006c109b051a201420024188086a41d000109a051a200e200e2f010641016a22143b010620064102742237200f6a41086a200f200641016a220a4102746a220f201441ffff0371200a6b410274109b051a200f20383602002005200e2f010622144f0d00200e20376a41fc066a210503402005280200220f200641016a22063b0104200f200e360200200541046a210520142006470d000b0b200241f8056a200241b8076a41d000109a051a0240200e28020022050d00201521380c080b200e2f010421372005210e201521380c000b0b20024198056a41086a203141086a2902003703002002203129020037039805200e450d062037102a0c060b200f41081037000b41f80641081037000b41f80641081037000b41a80741081037000b4108200541086a200541f8b9c0004622061b201441d0006c6a220f41d0006a200f4100203820061b20146b41d0006c109b051a200f201536020c200f41086a2045280200360200200f20022903c806370300200f20022903d806370310200f41186a2044290300370300200f41206a200e290300370300200f41286a2037290300370300200f41306a2039290300370300200f41386a203a290300370300200f41c0006a203b290300370300200f41c8006a203c290300370300200520052f010641016a3b01060c010b202d410041a2071099051a41a80710282205450d0120054100360200200541046a20024188086a41a407109a051a20052041280200220f3602f806204120053602002041204128020441016a360204200f41003b0104200f20053602004108200541086a200541f8b9c000461b20052f0106220f41d0006c6a200241f8056a41d000109a051a200541f8066a200f41016a220f4102746a2038360200200520052f010641016a3b01062038200f3b0104203820053602000b200241b00f6a200241b8036a41d000109a051a20280d082029417f4c0d080240024020290d00410121150c010b202910282215450d020b024020162024490d00201621060c030b20262027410048720d140240024020160d002027102821150c010b201520292027102c21150b2025210620150d02202741011037000b41a80741081037000b202941011037000b024002402033450d00410021050c010b20292114201521052018210f03402005200f290000370000200541186a200f41186a290000370000200541106a200f41106a290000370000200541086a200f41086a290000370000200541206a2105200f41206a210f201441606a22140d000b202a21050b20024188086a200241b00f6a41d000109a051a200220053602e008200220063602dc08200220153602d808024002400240411010282205450d0020052004370000200541086a20103700002002429080808080023702bc07200220053602b8072002200241b8076a3602d80620024188046a200241d8066a10c80120022802b807210520022802c007210f200d42003703002009420037030020004200370300200242003703c8042005200f200241c8046a10002040200d29030037030020302009290300370300201b2000290300370300200220022903c8043703b00f024020022802bc07450d0020022802b807102a0b200241003602c007200242013703b80720024188086a200241b8076a108f012002202c3602d806200241d8066a200241b8076a10a3012002202b3602d806200241d8066a200241b8076a10a30120022802c808210520022802d008220f200241b8076a10b4010240200f450d00200f41306c210f0340200541106a200241b8076a108f01200220053602d806200541306a2105200241d8066a200241b8076a10a301200f41506a220f0d000b0b20022802d808210520022802e008220f200241b8076a10b4010240200f450d00200f410574210f03402005200241b8076a108f01200541206a2105200f41606a220f0d000b0b20022802bc072105200241b00f6a412020022802b807220f20022802c007100702402005450d00200f102a0b024020022802cc08450d0020022802c808102a0b024020022802dc08450d0020022802d808102a0b200241b8076a41186a2206203d290300370300200241b8076a41106a220a203e290300370300200241b8076a41086a220e203f29030037030020022002290388043703b807410021050240201d41014b0d000240201d0e020003000b203420062903003703002035200a2903003703002036200e290300370300200220022903b80737038808410021050c030b201d210f03402005200f410176221420056a2215200c201541246c6a280200200b4b1b2105200f20146b220f41014b0d000c020b0b411041011037000b0240200c200541246c6a280200220f200b460d002005200f200b496a21050b203420062903003703002035200a2903003703002036200e290300370300200220022903b80737038808201d20054f0d0041f8b0c0001032000b0240201d201e470d00201d41016a220f201d490d12201d4101742214200f2014200f4b1b221ead42247e2204422088a70d122004a7220f4100480d1202400240201d0d00200f1028210c0c010b200c201d41246c200f102c210c0b200c450d030b200c200541246c6a220f41246a200f201d20056b41246c109b051a200f200b360200200f411c6a2034290300370200200f41146a2035290300370200200f410c6a2036290300370200200f200229038808370204204020062903003703002030200a290300370300201b200e290300370300200220022903b8073703b00f0240201f2020470d00201f41016a2205201f490d12201f410174220f2005200f20054b1b222041ffffff3f712020470d12202041057422054100480d1202400240201f0d0020051028211c0c010b201c201f4105742005102c211c0b201c450d040b201d41016a211d201c201f4105746a220520022903b00f370000200541186a2040290300370000200541106a2030290300370000200541086a201b290300370000201f41016a211f0b20132021470d000b202121130c020b200f41041037000b200541011037000b024020132021460d002007200841d0006c6a21140340201341c0006a280200220f450d01201341d0006a21050240201341c4006a280200450d00200f102a0b2005211320142005470d000b0b02402003450d002007102a0b0240024002400240024002400240024002400240024020022802e0020d0020022802d80220022802dc02410010ca01201a102a02402020450d00201c102a0b0240201e450d00200c102a0b2017450d012018102a0c010b2002201c3602d8062002201c201f4105746a3602dc06200241b00f6a200241d8066a10850102400240200241f00f6a2802000d004108210841002109410021230c010b20024188086a200241b00f6a41e000109a051a41e00010282208450d03200820024188086a41e000109a051a200220022903d8063703b807200241b00f6a200241b8076a1085010240200241f00f6a2802000d0041012109410121230c010b4102210f41e00021054101210941012123034020024188086a200241b00f6a41e000109a051a024020092023470d00200941016a22142009490d19200f2014200f20144b1b2223ad42e0007e2204422088a70d192004a722144100480d190240024020090d002014102821080c010b200820052014102c21080b2008450d060b200820056a20024188086a41e000109a051a200f41026a210f200541e0006a2105200941016a2109200241b00f6a200241b8076a10850120022802f00f0d000b0b200241a8086a201d360200200241a4086a201e36020020024198086a201fad4220862020ad843703002002201c3602940820024284808080c00037028c082002201a360288082002200c3602a008200241003602b80f200242013703b00f201d200241b00f6a10b4010240201d450d00200c201d41246c6a210a200c210f0340200f28020021150240024020022802b40f221420022802b80f22056b4104490d0020022802b00f21140c010b200541046a22062005490d19201441017422052006200520064b1b22054100480d190240024020140d002005102821140c010b20022802b00f20142005102c21140b2014450d07200220053602b40f200220143602b00f20022802b80f21050b2002200541046a3602b80f201420056a20153600002002200241b00f6a3602b807200f41046a200241b8076a10c801200f41246a220f200a470d000b0b20022802b80f211420022802b40f211520022802b00f210f411b10282205450d05200541176a41002800f39646360000200541106a41002900ec9646370000200541086a41002900e49646370000200541002900dc96463700002002429b808080b0033702bc07200220053602b80741a2c7c000200241b8076a10c60120022802c007210620022802b8072105200241c8046a41186a220a4200370300200241c8046a41106a220e4200370300200241c8046a41086a22134200370300200242003703c80420052006200241c8046a1000200241b00f6a41186a200a290300370300200241b00f6a41106a200e290300370300200241b00f6a41086a2013290300370300200220022903c8043703b00f024020022802bc07450d002005102a0b200241203602bc072002200241b00f6a3602b807200f2014200241b8076a10cb0102402015450d00200f102a0b200241b8076a20024188086a10c70120022802c007211520022802b8072114200241003602b80f200242013703b00f201f200241b00f6a10b4010240201f450d00201f410574210f201c210503402002200241b00f6a3602d8062005200241d8066a10c801200541206a2105200f41606a220f0d000b0b20022802b40f21052014201520022802b00f220f20022802b80f100702402005450d00200f102a0b024020022802bc07450d002014102a0b201a102a02402020450d00201c102a0b0240201e450d00200c102a0b20022802d802210520022902dc02210402402017450d002018102a0b20050d010b20012802082114024020012802102205450d00200541d0006c210f201441c0006a210503400240200541046a280200450d002005280200102a0b200541d0006a2105200f41b07f6a220f0d000b0b2001410c6a280200450d142014102a0c140b200220043702bc03200220053602b803410410282205450d042005200b36000020024190086a4284808080c00037030020024198086a41002900a2c740370300200241a0086a41002900aac7403703002002200536028c082002410f3a0088084101410020024188086a10cc012019418094ebdc036e22054101200541014b1b220520194b0d052019200941036c417d6a220f200f20194b1b20056ead428094ebdc037e201920056ead221080a741146e2215211420092004422088a76b220f0d060c070b41e00041081037000b201441081037000b200541011037000b411b41011037000b410441011037000b41acaac3001032000b2002418094ebdc0336028c082002418094ebdc03201941002009200f6b2214201420094b1b41036c417d6a2214201420194b1b20056ead428094ebdc037e201080a741146e22056bad4100201520056b2205200520154b1bad7e428094ebdc0380a722053602880820024188086a2005418094ebdc034b4102746a28020021140b200941e0006c220541e0006e2129410021130240024020050d0041042138410021290c010b2029410274220610282238450d020b0240200820056a2008460d000240200f0d00200941e0006c210f4100211320382105034020052014360200201341016a2113200541046a2105200f41a07f6a220f0d000c020b0b2008200941e0006c6a2106200941057441606a210a203821052008210f0340200220022802b8033602b40f200220022802bc033602b00f2002200241b8036a3602b80f20024188086a200241b00f6a200f10c9012005201420152002280288084101461b360200200541046a21052006200f41e0006a220f470d000b200a41057641016a21130b20024188086a41086a220542003703002002420037038808419e9dc600411b20024188086a1008200241b00f6a41086a200529030037030020022002290388083703b00f4100211b2002410036028808200241b00f6a411020024188086a100621050240200228028808220f417f460d002005450d00200f4104490d032005280000211b2005102a0b20024188086a41086a22054200370300200242003703880841bb9cc600411220024188086a1008200241b00f6a41086a200529030037030020022002290388083703b00f4100213b2002410036028808200241b00f6a411020024188086a100621050240200228028808220f417f460d002005450d00200f4104490d042005280000213b2005102a0b411710282205450d042005410f6a41002900d3fe44370000200541086a41002900ccfe44370000200541002900c4fe4437000020054117412e102c2205450d052005203b36001742002149200241f8056a41186a220f4200370300200241f8056a41106a22144200370300200241f8056a41086a22154200370300200242003703f8052005411b200241f8056a1000200241a8056a41186a200f290300370300200241a8056a41106a2014290300370300200241a8056a41086a2015290300370300200220022903f8053703a8052005102a2002410036028808200241a8056a412020024188086a100621002002280288082230417f460d092000450d09200220303602fc02200220003602f802200241c0026a200241f8026a106c20022802c0020d0820022802fc0222154140712205417f4c0d0020022802c402210d024002402015410676220e0d004108211d0c010b20051028221d450d070b0240200d450d004100210a0340200241003a00a808200a220641016a210a41002105024002400240034020152005460d0120024188086a20056a20022802f80222142d00003a00002002201441016a3602f8022002200541016a220f3a00a808200f2105200f4120470d000b200241f8056a41186a220520024188086a41186a290300370300200241f8056a41106a220b20024188086a41106a290300370300200241f8056a41086a220c20024188086a41086a29030037030020022002290388083703f8052015200f6b220f4110490d012002201441116a3602f802200f41706a410f4b0d02200f41706a210f0c010b0240200541ff0171450d00200241003a00a8080b4100210f0b200241b8076a41086a200241b00f6a41086a290300370300200220022903b00f3703b8072002200f3602fc02200e450d0b201d102a0c0b0b201441096a290000210420142900012110200241b8076a41086a2215200c290300370300200241b8076a41106a220c200b290300370300200241b8076a41186a220b20052903003703002002201441216a3602f802200220022903f80522113703b00f200220113703b807201441196a290000211120142900112112200241d8066a41186a2214200b290300370300200241d8066a41106a220b200c290300370300200241d8066a41086a220c2015290300370300200220022903b8073703d8060240200e2006470d0020064101742205200a2005200a4b1b220e41ffffff1f71200e470d0f200e41067422054100480d0f0240024020060d0020051028211d0c010b201d20064106742005102c211d0b201d450d0a0b200f41606a2115201d20064106746a220520123703102005200437030820052010370300200541186a2011370300200520022903d806370320200541286a200c290300370300200541306a200b290300370300200541386a2014290300370300200a200d470d000b2002200f41606a3602fc020b201d450d08200dad422086200ead84214902402030450d002000102a0b2049422088a7210f2049a7210e0c0a0b1036000b200641041037000b41c4d1c3004133200241f8056a419cd9c3001038000b41c4d1c3004133200241f8056a419cd9c3001038000b411741011037000b412e41011037000b200541081037000b200541081037000b41c4d1c3004133200241f8056a419cd9c3001038000b4108211d4100210f4100210e0b0240024020132009200920134b1b221f0d004200214a4200214b0c010b200241b00f6a4105722122200241b8076a41036a213920024188086a410572213220024188086a41086a2113201bad214c20024191086a2135200241e8016a41186a213a2008210b4200214a4200214b41002130034020134200370300200242003703880841c8ffc400411520024188086a1008200241b00f6a41086a2236201329030037030020022002290388083703b00f2002410036028808200241b00f6a411020024188086a100621140240024002400240024002400240024002400240024002400240024002400240024002400240200228028808220f417f460d002002200f3602bc07200220143602b80720024188086a200241b8076a106d2002280288082205450d02200229028c082104200f450d012014102a0c010b42002104410121050b20052004422088a72008203041e0006c6a220f10cd01211402402004a7450d002005102a0b20140d10200241b0026a200f41206a22342903002204203441086a222c290300428094ebdc03420010a005200241a0026a20022903b0022210200241b0026a41086a29030022114280ec94a37c427f109f0520024190026a20102011203820304102746a35020022124200109f0520022903900222102012200420022903a0027c7e428094ebdc038042ffffffff0f837c220420024190026a41086a2903002004201054ad7c2210844200510d1020134200370300200242003703880841c785c200411220024188086a100820024198056a41086a220c2013290300370300200220022903880837039805200241003602880820024198056a411020024188086a10062105024002402002280288082214417f460d002005450d00200220143602b40f200220053602b00f20024188086a200241b00f6a106d2002280288082237450d03200229028c0821122014450d012005102a0c010b41012137420021120b20372012422088a74105746a21064100211420372105024003400240200620056b41e0004b0d004102212b20052006460d080340200b2005460d0320142005200f4120109c0522154100476a21142015450d032006200541206a2205470d000c090b0b2005200f460d0120142005200f4120109c0522154100476a21142015450d01200541206a2215200f460d0120142015200f4120109c0522154100476a21142015450d01200541c0006a2215200f460d0120142015200f4120109c0522154100476a21142015450d01200541e0006a2215200f460d0120142015200f4120109c0522154100476a211420054180016a210520150d000b0b20134200370300200242003703880841bd99c600411a20024188086a1008200c2013290300370300200220022903880837039805200241003602880820024198056a411020024188086a100621052002280288082206417f460d032005450d03200220063602b40f200220053602b00f20024188086a200241b00f6a1082012002280288082215450d02200229028c0821112006450d042005102a0c040b41c4d1c3004133200241f8056a419cd9c3001038000b41c4d1c3004133200241f8056a419cd9c3001038000b41c4d1c3004133200241f8056a419cd9c3001038000b410021150b2015410420151b21004100210502400240024002402011420020151b22114220882242a7220e41014b0d00200e0e020201020b200e2115034020052015410176220620056a220a20142000200a4102746a280200491b2105201520066b221541014b0d000b0b4100212b02402014200020054102746a2802002215470d00410021400c020b2005201420154b6a21050b20134200370300200242003703880841c785c200411220024188086a1008200c2013290300370300200220022903880837039805200241003602880820024198056a411020024188086a1006210602400240200228028808220a417f470d00410021150c010b024020060d00410021150c010b2002200a36028c08200220063602880820024188026a20024188086a106c024002402002280288020d00200228028c0221150c010b410021150b200a450d002006102a0b20152015418094ebdc036e22064180ec94a37c6c6aad4280fd87d1007e428094ebdc038021432005200e4b0d020240200e2011a7470d00200e41016a2215200e490d11200e410174220a20152015200a491b221541ffffffff03712015470d112015410274220a4100480d1102400240200e0d00200a102821000c010b2000200e410274200a102c21000b2000450d042015ad21110b200020054102746a221541046a2015200e20056b410274109b051a2015201436020041012140201142ffffffff0f83200e41016a2205ad2242422086842111200520064180fd87d1006c2043a76a4b212b0b20134200370300200242003703880841bd99c600411a20024188086a1008200c20132903003703002002200229038808370398050240024020000d0020024198056a411010090c010b200241003602900820024201370388082042a7221520024188086a10b4010240024020150d00200228029008210c200228028c08210e20022802880821150c010b410020022802900822056b2106200020154102746a211b200228028c08210e2000210a0340200a280200210d02400240200e20066a4104490d0020022802880821150c010b200541046a22152005490d13200e410174220c2015200c20154b1b220c4100480d1302400240200e0d00200c102821150c010b200228028808200e200c102c21150b2015450d072002200c36028c082002201536028808200c210e0b2002200541046a220c36029008201520056a200d3600002006417c6a2106200c2105201b200a41046a220a470d000b0b2011a7210520024198056a41102015200c10070240200e450d002015102a0b2005450d002000102a0b2040450d00200241023602b00f20022014ad3703b80f20024188086a200241b00f6a10c301203941086a221520132802003600002039200229038808370000203220022900b807370000203241076a200241b8076a41076a2206290000370000200241c6a4b9da0436008908200241023a00880820024188086a10ce012002201436028c082002410136028808200241003602b80f200242013703b00f410110282205450d04200220053602b00f200520022802b80f22146a41023a0000200241013602b40f2002201441016a22053602b80f200228028c08210a02400240410020146b4104490d0020022802b00f21140c010b200541046a22142005490d10410141017422052014200520144b1b22054100480d100240024041010d002005102821140c010b20022802b00f41012005102c21140b2014450d06200220053602b40f200220143602b00f20022802b80f21050b2002200541046a3602b80f201420056a200a360000200241d8066a41086a20022802b80f2205360200200220022903b00f22113703d8062015200536000020392011370000202220022900b807370000202241076a2006290000370000200241c28289aa043600b10f200241023a00b00f200241b00f6a10ce012002280288080d00200228029008450d00200228028c08102a0b02402012a7450d002037102a0b0240202b4102460d00202b410171450d00201342003703002002420037038808418e9dc600411020024188086a10082036201329030037030020022002290388083703b00f410110282205450d06200541013a0000200241b00f6a41102005410110072005102a0b202c2903002212201020342903002243200454201220105420122010511b22051b214d2043200420051b214e024002402049422088224fa722060d0042002110420021040c010b20064106742114201d41206a21054200211042002104034002400240200b2005460d002005200f4120109c050d010b427f2004200541706a221541086a2903007c201020152903007c22112010542215ad7c22102015201020045420102004511b22151b2104427f201120151b21100b200541c0006a2105201441406a22140d000b0b200241e8016a200f204e4200200f290330221120107d22422042201156200f41386a290300224220047d2011201054ad7d220420425620042042511b22051b22102010204e564200200420051b2204204d562004204d511b22051b2210204d200420051b220410cf01200241e8016a41086a290300215020022903e80121510240204e201020022903f80122527d22537d2254204d2004203a2903007d2010205254ad7d22557d204e205354ad7d225284500d00204320117d2210201220427d2043201154ad7d220484500d00200f2802482214450d00200f2802402205201441306c6a2115200241c8016a20542052428094ebdc03420010a005200241d8016a20102004428094ebdc03420010a005200241b8016a20022903c8012252200241c8016a41086a29030022564280ec94a37c427f109f05200241d8016a41086a2903002211420020022903d801224242015620114200522011501b22141b21122042420120141b2142205420022903b8017c21540340200241a8016a2010200529030022112011201056200541086a290300221120045620112004511b22141b2004201120141b2042201210a00520022903a8012243428080808010544100200241a8016a41086a290300501b450d0820024198016a201020042042201210a005200229039801221142808080801054410020024198016a41086a290300501b450d092011a7450d0a200241e8006a20522056204342ffffffff0f83428094ebdc037e201142ffffffff0f838042ffffffff0f8322114200109f05200241f8006a200541106a20022903682243201120547e428094ebdc038042ffffffff0f837c2211200241e8006a41086a2903002011204354ad7c10cf01427f2050200241f8006a41086a2903007c205120022903787c22432051542214ad7c22112014201120505420112050511b22141b2150427f204320141b2151200541306a22052015470d000b0b200241a8056a41186a2215200f41186a220a290300370300200241a8056a41106a220e200f41106a220c290300370300200241a8056a41086a220d200f41086a22002903003703002002200f2903003703a8050240024020062049a7460d00200621140c010b200641016a22052006490d0f204fa72214410174221b20052005201b491b220541ffffff1f712005470d0f2005410674221b4100480d0f0240024020060d00201b1028211d0c010b201d2014410674201b102c211d0b201d450d0a2005ad21490b200241d8006a20512050428094ebdc03420010a005200241c8006a20022903582204200241d8006a41086a29030022104280ec94a37c427f109f05200241386a20042010204c4200109f05201d20144106746a220520533703102005204d3703082005204e370300200541186a2055370300200520022903a805370320200541286a200d290300370300200541306a200e290300370300200541386a2015290300370300200241013a009008200241033a008808200a2900002104200c290000211020002900002111200f290000211220024188086a41386a204d37030020352012370000203541086a2011370000203541106a2010370000203541186a20043700002002204e3703b8084101410020024188086a10cc01204942ffffffff0f83201441016aad4220868421490240024020022903382210205120022903487c204c7e428094ebdc038042ffffffff0f837c2204200241386a41086a2903002004201054ad7c221084500d00200f41d8006a28020022050d010b427f204b20507c204a20517c2210204a542205ad7c220420052004204b542004204b511b22051b214b427f201020051b214a0c0b0b200241286a200420512051200456205020105620502010511b22141b22542010205020141b224d2005ad420010a00520054105742114200f2802502105200241286a41086a29030021522002290328215620542112204d21420340200241186a2005205620122012205656204220525620422052511b220f1b220420522042200f1b221010d00120024188086a41106a2010200241186a41086a29030022437d20042002290318221154ad7d204320107d2011200454ad7d201120045820432010582043201051220f1b22151b3703002002200420117d201120047d20151b37039008200220112004562043201056200f1b220fad37038808204220107d21102012200454ad211102400240200f0d00200220133602b00f200241b00f6a109d010c010b200220133602b00f200241b00f6a109c010b201020117d2142201220047d2112200541206a2105201441606a22140d000b427f427f204b20427c204a20127c2210204a542205ad7c220420052004204b542004204b511b22051b22042050204d7d2051205454ad7d7c427f201020051b2210205120547d7c22112010542205ad7c22102005201020045420102004511b22051b214b427f201120051b214a0c0a0b41f8b0c0001032000b200a41041037000b200c41011037000b410141011037000b200541011037000b410141011037000b10d101000b10d201000b41acaac3001032000b201b41081037000b200b41e0006a210b203041016a2230201f490d000b2049422088a7210f2049a7210e0b024002400240024002400240411710282205450d002005410f6a41002900d3fe44370000200541086a41002900ccfe44370000200541002900c4fe4437000020054117412e102c2205450d012005203b360017200241f8056a41186a22144200370300200241f8056a41106a22154200370300200241f8056a41086a22064200370300200242003703f8052005411b200241f8056a1000200241a8056a41186a2014290300370300200241a8056a41106a2015290300370300200241a8056a41086a2006290300370300200220022903f8053703a8052005102a20024100360290082002420137038808200f20024188086a10b401200f450d02200f410674210a201d21050340200541206a20024188086a108f01200541086a29030021042005290300211002400240200228028c08221420022802900822156b4110490d00200228028808210f0c010b201541106a220f2015490d0920144101742215200f2015200f4b1b22064100480d090240024020140d0020061028210f0c010b20022802880820142006102c210f0b200f450d052002200636028c082002200f360288082002280290082115200621140b200f20156a22062004370008200620103700002002201541106a221536029008200541186a2903002104200541106a290300211002400240201420156b410f4d0d00201421060c010b201541106a22062015490d09201441017422152006201520064b1b22064100480d090240024020140d0020061028210f0c010b200f20142006102c210f0b200f450d062002200636028c082002200f3602880820022802900821150b200541c0006a2105200f20156a22142004370008201420103700002002201541106a221436029008200a41406a220a0d000c060b0b411741011037000b412e41011037000b2002280290082114200228028c082106200228028808210f0c020b200641011037000b200641011037000b200241a8056a4120200f2014100702402006450d00200f102a0b0240200e450d00201d102a0b20024188086a10d301200241086a20024188086a204a204b10d001200241c00f6a204b200241086a41086a29030022107d204a2002290308220454ad7d2010204b7d2004204a54ad7d2004204a582010204b582010204b5122051b220f1b3703002002204a20047d2004204a7d200f1b3703b80f20022004204a562010204b5620051b2205ad3703b00f200241b00f6a41086a210f0240024020050d002002200f3602b807200241b8076a109d010c010b2002200f3602b807200241b8076a109c010b02402029450d002038102a0b02402009450d00200941e0006c210f200841d4006a210503400240200541706a280200450d002005416c6a280200102a0b02402005280200450d002005417c6a280200102a0b200541e0006a2105200f41a07f6a220f0d000b0b02402023450d002008102a0b20022802b80320022802bc0320022802c00310ca0120012802082114024020012802102205450d00200541d0006c210f201441c0006a210503400240200541046a280200450d002005280200102a0b200541d0006a2105200f41b07f6a220f0d000b0b2001410c6a280200450d002014102a0b20024190106a24000f0b1031000b8c1501037f0240024002400240024002400240024002400240024002400240024002400240024002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00003a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00013a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0320012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00023a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00033a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0520012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00043a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00053a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00063a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0820012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00073a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0920012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00083a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0a20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00093a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d000a3a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0c20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d000b3a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0d20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d000c3a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0e20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d000d3a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d0f20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d000e3a000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d11200241017422042003200420034b1b22044100480d110240024020020d002004102821030c010b200128020020022004102c21030b2003450d1020012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20002d000f3a00000f0b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b1031000bba0601087f230041d0006b220224000240024002400240024002400240411f10282203450d00200341176a41002900c9c740370000200341106a41002900c2c740370000200341086a41002900bac740370000200341002900b2c7403700002002429f808080f0033702242002200336022041a2c7c000200241206a10c6012002280228210420022802202103200241306a41186a22054200370300200241306a41106a22064200370300200241306a41086a220742003703002002420037033020032004200241306a1000200241186a2005290300370300200241106a2006290300370300200241086a20072903003703002002200229033037030002402002280224450d002003102a0b412010282203450d0120032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a2903003700002001280208220441046a2205417f4c0d02200128020021070240024020050d00410121010c010b200510282201450d040b2002410036023820022005360234200220013602302004200241306a10b4010240024020022802342206200228023822016b2004490d00200228023021050c010b200120046a22052001490d06200641017422082005200820054b1b22084100480d060240024020060d002008102821050c010b200228023020062008102c21050b2005450d052002200836023420022005360230200821060b200520016a20072004109a051a200241306a41186a22074200370300200241306a41106a22084200370300200241306a41086a22094200370300200242003703302005200120046a200241306a1000200241186a2007290300370300200241106a2008290300370300200241086a20092903003703002002200229033037030002402006450d002005102a0b2003412041c000102c2203450d0620032002290300370020200341386a200241186a290300370000200341306a200241106a290300370000200341286a200241086a290300370000200042c0808080800837020420002003360200200241d0006a24000f0b411f41011037000b412041011037000b1036000b200541011037000b200841011037000b1031000b41c00041011037000bba0501037f02400240024002400240024002400240410110282202450d00200220002d00003a0000200241014102102c2202450d01200220002d00013a0001200241024104102c2202450d02200220002d00023a0002200220002d00033a0003200241044108102c2202450d03200220002d00043a0004200220002d00053a0005200220002d00063a0006200220002d00073a0007200241084110102c2202450d04200220002d00083a0008200220002d00093a0009200220002d000a3a000a200220002d000b3a000b200220002d000c3a000c200220002d000d3a000d200220002d000e3a000e200220002d000f3a000f200241104120102c2202450d05200220002d00103a0010200220002d00113a0011200220002d00123a0012200220002d00133a0013200220002d00143a0014200220002d00153a0015200220002d00163a0016200220002d00173a0017200220002d00183a0018200220002d00193a0019200220002d001a3a001a200220002d001b3a001b200220002d001c3a001c200220002d001d3a001d200220002d001e3a001e200220002d001f3a001f024002402001280200220041046a2802002203200041086a28020022016b4120490d00200028020021030c010b200141206a22042001490d08200341017422012004200120044b1b22014100480d080240024020030d002001102821030c010b200028020020032001102c21030b2003450d0720002003360200200041046a2001360200200041086a28020021010b200041086a200141206a360200200320016a220041186a200241186a290000370000200041106a200241106a290000370000200041086a200241086a290000370000200020022900003700002002102a0f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000b200141011037000b1031000b9705060a7f047e037f027e047f027e200128020821032001280204210420012802002105200241386a2106200241286a2107034002400240200441f8b9c000462208450d00410021094108210a4108210b0c010b20042f01062109200441086a220a210b0b200b200941d0006c6a210c2006290300210d2007290300210e2002290330210f2002290320211020022802482111200228024021124100210b0240024002400340200b21090240200a200c470d0002402008450d00410021090c030b20042f010621090c020b024002402002200a4120109c05220b450d00417f4101200b4100481b21130c010b417f2010200a290320221485200e200a41286a290300221585844200522010201454200e201554200e2015511b1b22130d00417f200f200a41306a290300221485200d200a41386a29030022158584420052200f201454200d201554200d2015511b1b22130d00200a41c8006a28020022162011201120164b1b2117200a280240210b417f21182012211903400240201841016a22182017490d00417f201120164720112016491b21130c020b0240201941106a200b41106a4120109c052213450d00417f410120134100481b21130c020b2019290300221a200b290300221b54201941086a2903002215200b41086a29030022145420152014511b0d03200b41306a210b201941306a211941012113201a201b85201520148584500d000b0b200941016a210b200a41d0006a210a0240201341016a0e03020001020b0b4100210a0c010b20050d014101210a410021050b200020053602042000200a360200200041106a20093602002000410c6a2003360200200041086a20043602000f0b2001200336020820012005417f6a22053602002001200420094102746a41f8066a28020022043602040c000b0bee0303047f017e017f02402001450d00034020002802f80621002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d004108200041086a200041f8b9c000461b200141d0006c6a22042802442105200441c0006a2802002106200141016a21010c010b02400240200028020022010d002003ad210741002104410021010c010b20003301044220862003ad842107410121040b2000102a2007a72103024002402007422088a7220820012f01064f0d00200121000c010b034002400240200128020022000d002003ad2107410021000c010b200441016a210420013301044220862003ad8421070b2001102a2007a72103200021012007422088a7220820002f01064f0d000b0b4108200041086a200041f8b9c000461b200841d0006c6a22012802442105200141c0006a2802002106200841027420006a41fc066a280200210002402004417f6a2201450d00034020002802f80621002001417f6a22010d000b0b410021010b2006450d012002417f6a210202402005450d002006102a0b20020d000b0b0240200041f8b9c000460d00200028020021012000102a2001450d00200128020021002001102a2000450d00024020002802002201450d0003402000102a2001210020012802002203210120030d000b0b2000102a0b0b9d0201057f230041106b220324000240024002400240200141046a2204417f4c0d000240024020040d00410121050c010b200410282205450d020b2003410036020820032004360204200320053602002001200310b4010240024020032802042206200328020822056b2001490d00200328020021040c010b200520016a22042005490d04200641017422072004200720044b1b22074100480d040240024020060d002007102821040c010b200328020020062007102c21040b2004450d032003200736020420032004360200200721060b200420056a20002001109a051a200228020020022802042004200520016a100702402006450d002004102a0b200341106a24000f0b1036000b200441011037000b200741011037000b1031000bcd1f03087f047e017f230041a0036b2203240020034100360288014188e8c200411020034188016a10062104024002402003280288012205417f460d002004450d00024020054104490d00200428000021062004102a410021070c020b41c4d1c300413320034188016a419cd9c3001038000b410121070b0240024002400240024002400240024002400240024020010d004101210841002105410021090c010b200141057422044100480d07200410282208450d012001410574220941606a410576210a2008210420002105034020034188016a41186a200541186a290000220b37030020034188016a41106a200541106a290000220c37030020034188016a41086a200541086a290000220d37030020032005290000220e37038801200441186a200b370000200441106a200c370000200441086a200d3700002004200e370000200441206a2104200541206a2105200941606a22090d000b200a41016a2109200121050b200341f4006a2006360200200320073602702003200241f000109a0522044180016a2009360200200441fc006a20053602002004200836027820044190026a41086a22054200370300200442003703900241eea0c600411120044190026a1008200441b0026a41086a200529030037030020042004290390023703b0022004410036028801200441b0026a411020044188016a10062105024002400240024002400240024002402004280288012203417f470d00410021080c010b024020050d00410021080c010b20034104490d01200528000021082005102a0b0240200841016a22032008490d0020044190026a41086a22054200370300200442003703900241eea0c600411120044190026a1008200441b0026a41086a2209200529030037030020042004290390023703b0022004200336028801200441b0026a411020044188016a4104100720044188016a2004418801109a051a20054200370300200442003703900241d4f2c200410d20044190026a10082009200529030037030020042004290390023703b0022004410036029002200441b0026a411020044190026a10062103024002402004280290022205417f460d002005210920030d010b2004410036028003200442083703f80220044100360298022004420137039002410020044190026a10b401200428029802210520042802940221092004280290022103200441f8026a10720b200420053602c802200420093602c402200420033602c002024002402005450d0020044190026a20032005410110d6022004280290024101470d0120042802c402450d0c20042802c002102a0c0c0b4101200441c0026a10b40120044188016a200441c0026a10aa030c090b200428029402210202402004419c026a280200220520044198026a2802002203460d0020042802c802200520036b6a22094188016a2207417f4c0d100240024020070d00410121060c010b200710282206450d040b200420073602d402200420063602d002200420093602d8022004200441d0026a36029002200220044190026a200510d70120092005490d0420042802d80222022009490d0520042802c80222022003490d0620042802d002210720042802c00221062004200920056b22093602dc022004200220036b22023602940320092002470d07200720056a200620036a2009109a051a20044188016a200441d0026a10aa0320042802d802210320042802d402210920042802d002210520042802c402450d0a20042802c002102a0c0a0b2004200441c0026a36029002200220044190026a200310d70120044188016a200441c0026a10aa030c080b200410ab030c0b0b41c4d1c300413320044188016a419cd9c3001038000b200741011037000b200520091044000b20092002103c000b200320021044000b200441f8026a41146a410836020020044184036a4125360200200441e0026a41146a4103360200200442033702e402200441c8afc6003602e002200441253602fc022004200441dc026a36029803200420044194036a36029c03200442043703a00220044201370294022004419cb0c600360290022004200441f8026a3602f002200420044190026a3602880320042004419c036a36028003200420044198036a3602f802200441e0026a41d8b0c600103e000b200441011037000b20042802c802210320042802c402210920042802c00221050b20050d010b20044188016a10ab030c010b200441b0026a411020052003100702402009450d002005102a0b20044188016a10ab0320044190026a41086a22054200370300200442003703900241d9efc200410d20044190026a1008200441b0026a41086a200529030037030020042004290390023703b0024100210f2004410036028801200441b0026a411020044188016a1006210502402004280288012203417f460d002005450d0020034104490d032005280000210f2005102a0b2001450d002001410574210a02400340200420083602d4022004200f3602d0020240024002400240024002400240024002400240024002400240024002400240411210282205450d00200541106a41002f00f1f2423b0000200541086a41002900e9f242370000200541002900e1f24237000020044188016a41186a2203420037030020044188016a41106a2209420037030020044188016a41086a2201420037030020044200370388012005411220044188016a100020044190026a41186a2202200329030037030020044190026a41106a2207200929030037030020044190026a41086a220620012903003703002004200429038801370390022005102a412010282205450d012005200429039002370000200541186a2002290300370000200541106a2007290300370000200541086a200629030037000020044188016a200010e0022005412041c000102c2205450d022005200429008801370020200541386a2003290000370000200541306a2009290000370000200541286a20012900003700002004410036028801200541c00020044188016a10062109024002402004280288012201417f460d00200121030c010b20044100360290012004420137038801410020044188016a10b4012004280290012103200428028c01210120042802880121090b200420033602b802200420013602b402200420093602b002024002400240024002402003450d0020044188016a20092003410110d6022004280288014101460d04200428028c01210220042802940122032004280290012209460d0320042802b802200320096b6a220141086a2207417f4c0d1a20070d01410121060c020b4101200441b0026a10b40120042802d00221010240024020042802b402220920042802b80222036b4104490d0020042802b00221090c010b200341046a22022003490d18200941017422032002200320024b1b22034100480d180240024020090d002003102821090c010b20042802b00220092003102c21090b2009450d08200420033602b402200420093602b00220042802b80221030b2004200341046a3602b802200920036a200136000020042802d40221010240024020042802b402220920042802b80222036b4104490d0020042802b00221090c010b200341046a22022003490d18200941017422032002200320024b1b22034100480d180240024020090d002003102821090c010b20042802b00220092003102c21090b2009450d09200420033602b402200420093602b00220042802b80221030b2004200341046a3602b802200920036a20013600000c120b200710282206450d080b200420073602e402200420063602e002200420013602e8022004200441e0026a36028801200220044188016a200310d70120012003490d0820042802e80222022001490d0920042802b80222022009490d0a20042802e002210720042802b00221062004200120036b2201360294032004200220096b22023602980320012002470d0b200720036a200620096a2001109a051a20042802d00221010240024020042802e402220920042802e80222036b4104490d0020042802e00221090c010b200341046a22022003490d16200941017422032002200320024b1b22034100480d160240024020090d002003102821090c010b20042802e00220092003102c21090b2009450d0d200420033602e402200420093602e00220042802e80221030b2004200341046a3602e802200920036a200136000020042802d40221010240024020042802e402220920042802e80222036b4104490d0020042802e00221090c010b200341046a22022003490d16200941017422032002200320024b1b22034100480d160240024020090d002003102821090c010b20042802e00220092003102c21090b2009450d0e200420033602e402200420093602e00220042802e80221030b2004200341046a3602e802200920036a200136000020042802e802210920042802e402210120042802e002210320042802b402450d1120042802b002102a0c110b2004200441b0026a36028801200220044188016a200910d70120042802d00221010240024020042802b402220920042802b80222036b4104490d0020042802b00221090c010b200341046a22022003490d15200941017422032002200320024b1b22034100480d150240024020090d002003102821090c010b20042802b00220092003102c21090b2009450d0e200420033602b402200420093602b00220042802b80221030b2004200341046a3602b802200920036a200136000020042802d40221010240024020042802b402220920042802b80222036b4104490d0020042802b00221090c010b200341046a22022003490d15200941017422032002200320024b1b22034100480d150240024020090d002003102821090c010b20042802b00220092003102c21090b2009450d0f200420033602b402200420093602b00220042802b80221030b2004200341046a3602b802200920036a20013600000c0f0b20042802b402450d1120042802b002102a0c110b411241011037000b412041011037000b41c00041011037000b200341011037000b200341011037000b200741011037000b200320011044000b20012002103c000b200920021044000b200441f8026a41146a410836020020044184036a412536020020044190026a41146a41033602002004420337029402200441c8afc60036029002200441253602fc02200420044194036a36029c03200420044198036a3602c00220044204370398012004420137028c012004419cb0c600360288012004200441f8026a3602a002200420044188016a360288032004200441c0026a3602800320042004419c036a3602f80220044190026a41d8b0c600103e000b200341011037000b200341011037000b200341011037000b200341011037000b20042802b802210920042802b402210120042802b00221030b2003450d01200541c00020032009100702402001450d002003102a0b200041206a21002005102a200a41606a220a0d000c020b0b2005102a0b200441a0036a24000f0b1031000b41c4d1c300413320044188016a419cd9c3001038000b1036000bcd0101047f200020014105746a210320002104024003400240200320046b41e0004b0d00024020042003460d00200020014105746a210503404101210620022004460d04200420024120109c05450d042005200441206a2204470d000b0b41000f0b4101210620042002460d01200420024120109c05450d01200441206a22052002460d01200520024120109c05450d01200441c0006a22052002460d01200520024120109c05450d01200441e0006a22052002460d0120044180016a2104200520024120109c050d000b0b20060bba0604017f017e047f027e230041c0006b2201240042002102200141186a41086a220342003703002001420037031841b1f0c200410d200141186a1008200141086a200329030037030020012001290318370300410021032001410036021820014110200141186a100621040240024002400240024020012802182205417f460d002001200536021420012004360210200141186a200141106a107620012802182206450d02200129021c210202402005450d002004102a0b2002422088a721032002a721050c010b41042106410021050b200141186a41206a200041206a280200360200200141186a41186a200041186a290200370300200141186a41106a200041106a290200370300200141186a41086a200041086a29020037030020012000290200370318024020032005470d00024020032002a7470d00200341016a22002003490d04200341017422052000200520004b1bad220742247e2208422088a70d042008a722004100480d040240024020030d002000102821060c010b2006200341246c2000102c21060b2006450d0320024280808080708320078421020b2002422088a721030b2006200341246c22056a22002001290318370200200041206a200141186a41206a280200360200200041186a200141186a41186a290300370200200041106a200141186a41106a290300370200200041086a200141186a41086a2200290300370200200042003703002001420037031841b1f0c200410d200141186a1008200141086a2000290300370300200120012903183703002001411036021c200120013602182006200341016a2200200141186a10e102024020002003490d00200541246a21002006210303400240024020032d0000220541034b0d0002400240024020050e0404000102040b2003410c6a280200450d03200341086a280200102a0c030b2003410c6a280200450d02200341086a280200102a0c020b2003410c6a280200450d01200341086a280200102a0c010b200341086a280200450d00200341046a280200102a0b200341246a21032000415c6a22000d000b0b02402002a7450d002006102a0b200141c0006a24000f0b41c4d1c3004133200141186a419cd9c3001038000b200041041037000b1031000b8c0702067f067e230041d0006b220424000240024002400240411410282205450d00200541002900cfe140370000200541106a41002800dfe140360000200541086a41002900d7e14037000020044294808080c002370224200420053602202001200441206a108f012004280228210520042802202106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020062005200441306a1000200441186a2007290300370300200441106a2008290300370300200441086a20092903003703002004200429033037030002402004280224450d002004280220102a0b2004410036023020044120200441306a100621050240024020042802302206417f470d004200210a4200210b0c010b20064110490d02200541086a290000210b2005290000210a2005102a0b2001200a2002200a200a200256200b200356200b2003511b22051b220c7d200b2003200b20051b220d7d200a200c54ad7d108f02024002402002200c7d220b2003200d7d2002200c54ad7d220e8450450d004200210a4200210e0c010b411810282205450d03200541002900e3e140370000200541106a41002900f3e140370000200541086a41002900ebe140370000200442988080808003370224200420053602202001200441206a108f012004280228210520042802202106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020062005200441306a1000200441186a2007290300370300200441106a2008290300370300200441086a20092903003703002004200429033037030002402004280224450d002004280220102a0b2004410036023020044120200441306a100621050240024020042802302206417f470d0042002102420021030c010b20064110490d05200541086a2900002103200529000021022005102a0b20012002200b20022002200b562003200e562003200e511b22051b220a7d2003200e200320051b220f7d2002200a54ad7d109002200e200f7d200b200a54ad7d210e200f200d7c200a200c7c2202200a54ad7c2103200b200a7d210a0b2000200a37031020002002370300200041186a200e37030020002003370308200441d0006a24000f0b411441011037000b41c4d1c3004133200441306a419cd9c3001038000b411841011037000b41c4d1c3004133200441306a419cd9c3001038000be20302067f027e230041d0006b2204240002400240411410282205450d00200541002900cfe140370000200541106a41002800dfe140360000200541086a41002900d7e14037000020044294808080c002370224200420053602202001200441206a108f012004280228210520042802202106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020062005200441306a1000200441186a2007290300370300200441106a2008290300370300200441086a20092903003703002004200429033037030002402004280224450d002004280220102a0b2004410036023020044120200441306a100621050240024020042802302206417f470d004200210a4200210b0c010b20064110490d02200541086a290000210b2005290000210a2005102a0b200441306a2001200a20027c2202200b20037c2002200a54ad7c109401200441106a200441306a41106a290300220a370300200420042903382202370308200420042903302203370300024020034200510d002004200441086a360230200441306a109d01420021024200210a0b200020023703002000200a370308200441d0006a24000f0b411441011037000b41c4d1c3004133200441306a419cd9c3001038000b0a0041a8acc3001032000b0a0041b8abc3001032000bbf0301077f230041d0006b22012400024002400240024002400240410110282202450d00200241ed003a0000200241014102102c2202450d01200241ef003a0001200241024104102c2202450d02200241e4d8013b0002200241044108102c2202450d03200241f0f2bda107360004200241084110102c2203450d04200341f2e6c9cb07360008200141003a0048410c210220032104410021050340200141003a0008200141086a200420024100472206109a051a024020020d00200141003a00080b20022006490d06200141286a20056a20012d00083a00002001200541016a22073a0048200220066b2102200420066a21042007210520074120470d000b200141086a41186a2202200141286a41186a290300370300200141086a41106a2206200141286a41106a290300370300200141086a41086a2204200141286a41086a290300370300200120012903283703082003102a200041186a2002290300370000200041106a2006290300370000200041086a200429030037000020002001290308370000200141d0006a24000f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b200620021044000b940705017f047e087f057e017f23004180026b22022400200241c0006a2001109f01024002402002290340a7450d00200041003602200c010b200241c0006a41106a290300210320022903482104200241286a2001109f0102402002290328a7450d00200041003602200c010b200241286a41106a290300210520022903302106200241206a2001106c0240024002400240024020022802200d00200128020441306e220741306c2208417f4c0d02200228022421090240024020080d004108210a0c010b20081028220a450d040b02402009450d004100210b0340200241003a00f801200b220c41016a210b2001280204417f6a21084100210d024002400240024003402008417f460d01200241d8016a200d6a2001280200220e2d00003a0000200120083602042001200e41016a3602002002200d41016a220e3a00f8012008417f6a2108200e210d200e4120470d000b200241b8016a41186a2208200241d8016a41186a290300370300200241b8016a41106a220d200241d8016a41106a290300370300200241b8016a41086a220e200241d8016a41086a290300370300200220022903d8013703b801200241086a2001109f012002290308a70d01200241086a41106a290300210f20022903102110200241f8006a41086a200e2903002211370300200241f8006a41106a200d2903002212370300200241f8006a41186a20082903002213370300200241d8006a41086a220d2011370300200241d8006a41106a220e2012370300200241d8006a41186a22142013370300200220022903b8012211370378200220113703582007200c470d030240200c4101742208200b2008200b4b1b2207ad42307e2211422088a70d002011a7220841004e0d030b1031000b200d41ff0171450d00200241003a00f8010b200241f8006a41086a20024198016a41086a2903003703002007450d04200a102a0c040b02400240200c0d0020081028210a0c010b200a200c41306c2008102c210a0b200a450d070b200a200c41306c6a2208200f3703082008201037030020082002290358370310200841186a200d290300370300200841206a200e290300370300200841286a2014290300370300200b2009470d000b0b200a0d010b200041003602200c040b20002004370300200020073602242000200a3602202000200637031020002003370308200041286a2009360200200041186a20053703000c030b1036000b200841081037000b200841081037000b20024180026a24000b0a0041f0b8c0001032000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccd1c5003602002000410436021c200041c4d1c5003602182000200041186a360210200041ccb9c000103e000b8d0301027f230041e0006b22032400200341003a0005024002402000413f4b0d0041012104200341013a0005200320004102743a00000c010b02400240200041808001490d0020004180808080044f0d0141042104200341043a0005200320004102744102723602000c020b41022104200341023a0005200320004102744101723b01000c010b41052104200341053a0005200341033a0000200320003600010b024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d01200020032002109a051a200341e0006a24000f0b20022001103c000b200341286a41146a4108360200200341346a4125360200200341106a41146a410336020020034203370214200341c8afc6003602102003412536022c2003200341086a36024020032003410c6a360244200342043703582003420137024c2003419cb0c6003602482003200341286a3602202003200341c8006a3602382003200341c4006a3602302003200341c0006a360228200341106a41d8b0c600103e000bb60201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001103f21000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000b20024180016a240020000f0b20044180011044000b20044180011044000b130020004102360204200041cc9dc6003602000b130020004101360204200041b8a8c3003602000b130020004103360204200041a8dcc0003602000b130020004103360204200041bcaac4003602000b130020004101360204200041d899c6003602000b13002000410b3602042000418082c5003602000b13002000410636020420004198e8c2003602000b130020004104360204200041d09ec1003602000b130020004105360204200041f8aec3003602000b130020004103360204200041ec91c6003602000b130020004105360204200041ac81c2003602000b130020004106360204200041f8d1c3003602000b130020004103360204200041a896c4003602000b13002000410136020420004190e0c0003602000b130020004101360204200041f896c6003602000b8b0701077f23004190026b2202240041002103200241003a002820012802042104417f210502400240034020042003460d01200241086a20036a200128020022062d00003a00002001200420056a3602042001200641016a3602002002200341016a22073a00282005417f6a21052007210320074120470d000b200241e8006a41086a200241086a41086a290300370300200241e8006a41106a200241086a41106a290300370300200241e8006a41186a200241086a41186a2903003703002002200229030837036841002103200241003a0028200420076b2108200420056a21050340024020082003470d000240200341ff0171450d00200241003a00280b200041013a00000c030b200241086a20036a200620036a220741016a2d00003a0000200120053602042001200741026a3602002002200341016a22073a00282005417f6a21052007210320074120470d000b20024188016a41086a200241086a41086a29030037030020024188016a41106a200241086a41106a29030037030020024188016a41186a200241086a41186a290300370300200220022903083703880141002103200241003a008802200620076a2106034002402005417f470d000240200341ff0171450d00200241003a0088020b200041013a00000c030b200241e8016a20036a200620036a220741016a2d00003a0000200120053602042001200741026a3602002002200341016a22073a0088022005417f6a21052007210320074120470d000b200241a8016a41086a2201200241e8016a41086a290300370300200241a8016a41106a2203200241e8016a41106a290300370300200241a8016a41186a2205200241e8016a41186a290300370300200241086a41086a200241e8006a41086a290300370300200241086a41106a200241e8006a41106a290300370300200241086a41186a200241e8006a41186a290300370300200220022903e8013703a80120022002290368370308200241c0006a20024188016a41186a290300370300200241386a20024188016a41106a290300370300200241306a20024188016a41086a2903003703002002200229038801370328200241e0006a2005290300370300200241d8006a2003290300370300200241d0006a2001290300370300200220022903a801370348200041016a200241086a41e000109a051a200041003a00000c010b0240200341ff0171450d00200241003a00280b200041013a00000b20024190026a24000bf90802067f047e230041d0026b220224000240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a360200200541034b0d0620050e0401020304010b200041053a00000c090b200241206a2001106d20022802200d03200041053a00000c080b200241c0006a20011081010240024020022802404113460d00200241c8016a200241c0006a418801109a051a418801102822050d0141880141081037000b200041053a00000c080b2005200241c8016a418801109a052105200041023a0000200020022f00103b0001200041036a200241106a41026a2d00003a0000200041046a2005360200200041086a2002290220370200200041106a200241206a41086a290200370200200041186a200241206a41106a290200370200200041206a200241206a41186a2902003702000c070b20022001106c20022802000d0520022802042105200241c0006a200110810120022802404113460d05200241c8016a200241c0006a418801109a051a41880110282201450d032001200241c8016a418801109a052101200041033a0000200020022f00103b0001200041036a200241126a2d00003a0000200041086a2001360200200041046a20053602002000410c6a2002290220370200200041146a200241206a41086a2902003702002000411c6a200241306a290200370200200041246a200241386a2802003602000c060b41002105200241003a00e8012003417f6a21062003417e6a21030340024020062005470d00200541ff0171450d05200241003a00e8010c050b200241c8016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00e8012003417f6a21032007210520074120470d000b200241c0006a41186a200241c8016a41186a290300370300200241c0006a41106a200241c8016a41106a290300370300200241c0006a41086a200241c8016a41086a290300370300200220022903c801370340200241086a2001106c20022802080d0320012802042205450d03200228020c2103200128020022072d0000210420012005417f6a3602042001200741016a360200200241206a41086a200241c0006a41086a2903002208370300200241206a41106a200241c0006a41106a2903002209370300200241206a41186a200241c0006a41186a290300220a37030020022002290340220b370320200041043a00002000200b370001200041096a2008370000200041116a2009370000200041196a200a370000200041246a2003360200200041216a20043a00000c050b200241cb006a200241206a41086a28020036000020022002290320370043200041013a000020002002290040370001200041086a200241c7006a290000370000200041106a20022902c801370200200041186a200241c8016a41086a290200370200200041206a200241c8016a41106a2902003702000c040b200041053a00000c030b41880141081037000b200041053a00000c010b200041053a00000b200241d0026a24000bd50603057f0b7e057f230041106b21020240200128020422034104490d0020012802002204280000210520012003417c6a22063602042001200441046a36020020064108490d00200429000421072001200341746a220636020420012004410c6a36020020064108490d00200429000c210820012003416c6a22063602042001200441146a36020020064108490d00200429001421092001200341646a220636020420012004411c6a36020020064108490d00200429001c210a20012003415c6a22063602042001200441246a36020020064108490d002004290024210b2001200341546a220636020420012004412c6a36020020064108490d00200429002c210c20012003414c6a22063602042001200441346a36020020064108490d002004290034210d2001200341446a220636020420012004413c6a36020020064108490d00200429003c210e2001200341bc7f6a22063602042001200441c4006a36020020064108490d002004290044210f2001200341b47f6a22063602042001200441cc006a36020020064108490d00200429004c21102001200341ac7f6a22063602042001200441d4006a36020020064108490d00200429005421112001200341a47f6a22063602042001200441dc006a36020020064104490d00200428005c21122001200341a07f6a22063602042001200441e0006a36020020064104490d002004280060211320012003419c7f6a22063602042001200441e4006a36020020064104490d00200428006421142001200341987f6a22063602042001200441e8006a36020020064104490d00200428006821152001200341947f6a22063602042001200441ec006a22043602002006450d0020042d000021162001200341937f6a22063602042001200441016a36020020064104490d00200020163a00702000201536026820002014360264200020133602602000201236025c2000200536025820002011370350200020103703482000200f3703402000200e3703382000200d3703302000200c3703282000200b3703202000200a3703182000200937031020002008370308200020073703002004280001210620012003418f7f6a3602042001200441056a3602002000200636026c200041f4006a2002410c6a280000360000200020022800093600710f0b200041023a00700bfb910205057f017e067f017e017f230041206b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200220341144b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e15000102030405060708090a0b0c0d0e0f1011121314000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d62200341017422052004200520044b1b22054100480d620240024020030d002005102821040c010b200128020020032005102c21040b2004450d1720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000280208417f6a220341054b0d1502400240024002400240024020030e06000102030405000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d67200341017422042000200420004b1b22044100480d670240024020030d002004102821000c010b200128020020032004102c21000b2000450d1d20012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000c1a0b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d66200341017422052004200520044b1b22054100480d660240024020030d002005102821040c010b200128020020032005102c21040b2004450d1d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200028020c2106200041146a2802002203200110b40102400240200141046a2802002204200528020022006b2003490d00200128020021040c010b200020036a22052000490d66200441017422002005200020054b1b22004100480d660240024020040d002000102821040c010b200128020020042000102c21040b2004450d1e20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a20062003109a051a0c190b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d65200341017422052004200520044b1b22054100480d650240024020030d002005102821040c010b200128020020032005102c21040b2004450d1e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000290310210702400240200141046a2802002200200528020022036b4108490d00200128020021000c010b200341086a22042003490d65200041017422032004200320044b1b22034100480d650240024020000d002003102821000c010b200128020020002003102c21000b2000450d1f20012000360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200020036a20073700000c180b200241033a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d64200341017422052004200520044b1b22054100480d640240024020030d002005102821040c010b200128020020032005102c21040b2004450d1f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c2106200041146a2802002203200110b40102400240200141046a2802002204200528020022006b2003490d00200128020021040c010b200020036a22052000490d64200441017422002005200020054b1b22004100480d640240024020040d002000102821040c010b200128020020042000102c21040b2004450d2020012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a20062003109a051a0c170b200141086a2802002103200241043a0018024002402003200141046a280200460d00200128020021050c010b200341016a22042003490d63200341017422052004200520044b1b22044100480d630240024020030d002004102821050c010b200128020020032004102c21050b2005450d2020012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41043a0000200028020c2103200041146a2802002200200110b4012000450d162003200041186c6a2108200141046a2106034020032802002109200341086a2802002200200110b401024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d64200a4101742205200b2005200b4b1b22054100480d6402400240200a0d0020051028210a0c010b2001280200200a2005102c210a0b200a450d222001200a36020020062005360200200428020021050b2004200520006a360200200a20056a20092000109a051a2003410c6a2802002109200341146a2802002200200110b401024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d64200a4101742205200b2005200b4b1b22054100480d6402400240200a0d0020051028210a0c010b2001280200200a2005102c210a0b200a450d232001200a36020020062005360200200428020021050b2004200520006a360200200a20056a20092000109a051a200341186a22032008470d000c170b0b200241053a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d62200341017422052004200520044b1b22054100480d620240024020030d002005102821040c010b200128020020032005102c21040b2004450d2220012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41053a0000200028020c2104200041146a2802002203200110b4012003450d1520042003410c6c6a2108200141046a210903402004280200210a200441086a2802002203200110b4010240024020092802002205200628020022006b2003490d00200128020021050c010b200020036a220b2000490d6320054101742200200b2000200b4b1b22004100480d630240024020050d002000102821050c010b200128020020052000102c21050b2005450d242001200536020020092000360200200628020021000b2006200020036a360200200520006a200a2003109a051a2004410c6a22042008470d000c160b0b02400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d61200341017422042000200420004b1b22044100480d610240024020030d002004102821000c010b200128020020032004102c21000b2000450d2320012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41013a00000c130b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d60200341017422052004200520044b1b22054100480d600240024020030d002005102821040c010b200128020020032005102c21040b2004450d2320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d60200341017422052004200520044b1b22054100480d600240024020030d002005102821040c010b200128020020032005102c21040b2004450d2420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110a1010c130b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5f200341017422052004200520044b1b22054100480d5f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d2420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5f200341017422052004200520044b1b22054100480d5f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d2520012004360200200141046a2005360200200141086a28020021030b200141086a220a200341016a360200200420036a41003a00002000280204210c2000410c6a2802002203200110b4012003450d12200c200341f0006c6a210d200141046a210b034020022001360208200c41106a200241086a10c801200c200110a00120022001360208200c41306a200241086a10c80120022001360208200c41d0006a200241086a10c801200c2802042104200c28020c2203200110b40102402003450d00200341246c21090340200241086a200410ec012002280208210602400240200b2802002205200a28020022036b20022802102200490d00200128020021050c010b200320006a22082003490d62200541017422032008200320084b1b22034100480d620240024020050d002003102821050c010b200128020020052003102c21050b2005450d2920012005360200200b2003360200200a28020021030b200a200320006a360200200520036a20062000109a051a0240200228020c450d002006102a0b200441246a21042009415c6a22090d000b0b200c41f0006a220c200d470d000c130b0b02400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d5e200341017422042000200420004b1b22044100480d5e0240024020030d002004102821000c010b200128020020032004102c21000b2000450d2620012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41043a00000c100b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5d200341017422052004200520044b1b22054100480d5d0240024020030d002005102821040c010b200128020020032005102c21040b2004450d2620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000280208417f6a220341024b0d10024002400240024020030e03000102000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d60200341017422052004200520044b1b22044100480d600240024020030d002004102821050c010b200128020020032004102c21050b2005450d2a20012005360200200141046a2004360200200141086a28020021030b200041306a2104200141086a200341016a360200200520036a41003a00002000410c6a200110a601200241146a21030c020b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d5f200341017422052004200520044b1b22044100480d5f0240024020030d002004102821050c010b200128020020032004102c21050b2005450d2a20012005360200200141046a2004360200200141086a28020021030b200041c0006a2104200141086a200341016a360200200520036a41013a00002000410c6a200110a6012002200041306a360218200241186a200110a3012002411c6a21030c010b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d5e200341017422052004200520044b1b22044100480d5e0240024020030d002004102821050c010b200128020020032004102c21050b2005450d2a20012005360200200141046a2004360200200141086a28020021030b200041d8006a2104200141086a200341016a360200200520036a41023a00002000410c6a200110a601200041306a200110a601200241086a21030b200320043602002003200110a3010c100b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5c200341017422052004200520044b1b22054100480d5c0240024020030d002005102821040c010b200128020020032005102c21040b2004450d2920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a000020002d0008417f6a2203410c4b0d0f024002400240024002400240024002400240024002400240024020030e0d000102030405060708090a0b0c000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d68200341017422052004200520044b1b22054100480d680240024020030d002005102821040c010b200128020020032005102c21040b2004450d3620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110a6012002200041306a360208200241086a200110a30120002d0009220341024b0d1b02400240024020030e03000102000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d6a200341017422042000200420004b1b22044100480d6a0240024020030d002004102821000c010b200128020020032004102c21000b2000450d3920012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000c1d0b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d69200341017422042000200420004b1b22044100480d690240024020030d002004102821000c010b200128020020032004102c21000b2000450d3920012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41013a00000c1c0b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d68200341017422042000200420004b1b22044100480d680240024020030d002004102821000c010b200128020020032004102c21000b2000450d3920012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41023a00000c1b0b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d67200341017422052004200520044b1b22054100480d670240024020030d002005102821040c010b200128020020032005102c21040b2004450d3920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a360208200241086a200110a3010c1a0b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d66200341017422052004200520044b1b22054100480d660240024020030d002005102821040c010b200128020020032005102c21040b2004450d3920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a360208200241086a200110a3010c190b200241033a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d65200341017422042000200420004b1b22044100480d650240024020030d002004102821000c010b200128020020032004102c21000b2000450d3920012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41033a00000c180b200141086a2802002103200241043a0018024002402003200141046a280200460d00200128020021040c010b200341016a22042003490d64200341017422052004200520044b1b22054100480d640240024020030d002005102821040c010b200128020020032005102c21040b2004450d3920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002002200041106a360208200241086a200110a3010c170b200241053a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d63200341017422052004200520044b1b22054100480d630240024020030d002005102821040c010b200128020020032005102c21040b2004450d3920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a0000200028020c2103200041146a2802002200200110b4012000450d16200041246c210003402003200110a601200341246a21032000415c6a22000d000c170b0b200241063a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d62200341017422042000200420004b1b22044100480d620240024020030d002004102821000c010b200128020020032004102c21000b2000450d3920012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41063a00000c150b200241073a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d61200341017422052004200520044b1b22054100480d610240024020030d002005102821040c010b200128020020032005102c21040b2004450d3920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a000020002d0009220341024b0d1402400240024020030e03000102000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d63200341017422042000200420004b1b22044100480d630240024020030d002004102821000c010b200128020020032004102c21000b2000450d3c20012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000c160b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d62200341017422042000200420004b1b22044100480d620240024020030d002004102821000c010b200128020020032004102c21000b2000450d3c20012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41013a00000c150b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d61200341017422042000200420004b1b22044100480d610240024020030d002004102821000c010b200128020020032004102c21000b2000450d3c20012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41023a00000c140b200141046a2802002104200241083a0018024002402004200141086a2802002203460d00200128020021040c010b200341016a22042003490d60200341017422052004200520044b1b22054100480d600240024020030d002005102821040c010b200128020020032005102c21040b2004450d3c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110a6010c130b200241093a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5f200341017422052004200520044b1b22054100480d5f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d3c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a200110a0010c120b2002410a3a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d5e200341017422042000200420004b1b22044100480d5e0240024020030d002004102821000c010b200128020020032004102c21000b2000450d3c20012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a410a3a00000c110b2002410b3a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d5d200341017422042000200420004b1b22044100480d5d0240024020030d002004102821000c010b200128020020032004102c21000b2000450d3c20012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a410b3a00000c100b2002410c3a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5c200341017422052004200520044b1b22054100480d5c0240024020030d002005102821040c010b200128020020032005102c21040b2004450d3c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200028020c2103200041146a2802002200200110b4012000450d0f20004105742100034020032001108f01200341206a2103200041606a22000d000c100b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5b200341017422052004200520044b1b22054100480d5b0240024020030d002005102821040c010b200128020020032005102c21040b2004450d3c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5b200341017422052004200520044b1b22054100480d5b0240024020030d002005102821040c010b200128020020032005102c21040b2004450d3d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041106a2001108f01200041306a2001108f01200041d0006a2001108f01200028020421062000410c6a2802002203200110b40102400240200141046a2802002204200528020022006b2003490d00200128020021040c010b200020036a22052000490d5b200441017422002005200020054b1b22004100480d5b0240024020040d002000102821040c010b200128020020042000102c21040b2004450d3e20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a20062003109a051a0c0e0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d5a2003410174220a2005200a20054b1b220a4100480d5a0240024020030d00200a102821050c010b20012802002003200a102c21050b2005450d3e20012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41083a0000200041086a22052d0000417f6a220341104b0d0d0240024002400240024002400240024002400240024002400240024002400240024020030e11000102030405060708090a0b0c0d0e0f10000b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6a200341017422052004200520044b1b22054100480d6a0240024020030d002005102821040c010b200128020020032005102c21040b2004450d4f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200028020c200110eb012002200041106a360208200241086a200110a3010c1d0b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d69200341017422052004200520044b1b22054100480d690240024020030d002005102821040c010b200128020020032005102c21040b2004450d4f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110a0010c1c0b02400240200628020020042802002203460d00200128020021060c010b200341016a22062003490d682003410174220a2006200a20064b1b220a4100480d680240024020030d00200a102821060c010b20012802002003200a102c21060b2006450d4f20012006360200200141046a200a360200200141086a28020021030b200141086a220a200341016a360200200620036a41023a00002000410c6a200110a00120052d00012106200541026a2d0000210502400240200141046a280200200a2802002203460d00200128020021000c010b200341016a22002003490d682003410174220a2000200a20004b1b220a4100480d680240024020030d00200a102821000c010b20012802002003200a102c21000b2000450d5020012000360200200141046a200a360200200141086a28020021030b2004200341016a360200200020036a20064100474107742005723a00000c1b0b02400240200628020020042802002203460d00200128020021060c010b200341016a22062003490d672003410174220a2006200a20064b1b220a4100480d670240024020030d00200a102821060c010b20012802002003200a102c21060b2006450d5020012006360200200141046a200a360200200141086a28020021030b200141086a220a200341016a360200200620036a41033a00002000410c6a200110a00120052d00012106200541026a2d0000210502400240200141046a280200200a2802002203460d00200128020021000c010b200341016a22002003490d672003410174220a2000200a20004b1b220a4100480d670240024020030d00200a102821000c010b20012802002003200a102c21000b2000450d5120012000360200200141046a200a360200200141086a28020021030b2004200341016a360200200020036a20064100474107742005723a00000c1a0b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d662003410174220a2005200a20054b1b220a4100480d660240024020030d00200a102821050c010b20012802002003200a102c21050b2005450d5120012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41043a0000200028020c21050240024020062802002200200428020022036b4104490d00200128020021000c010b200341046a22062003490d66200041017422032006200320064b1b22034100480d660240024020000d002003102821000c010b200128020020002003102c21000b2000450d5220012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a20053600000c190b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d65200341017422052004200520044b1b22054100480d650240024020030d002005102821040c010b200128020020032005102c21040b2004450d5220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a0000200028020c200110eb010c180b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d64200341017422052004200520044b1b22054100480d640240024020030d002005102821040c010b200128020020032005102c21040b2004450d5220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200028020c200110eb010c170b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d63200341017422052004200520044b1b22054100480d630240024020030d002005102821040c010b200128020020032005102c21040b2004450d5220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200028020c200110eb010c160b02400240200628020020042802002203460d002001280200210a0c010b200341016a220a2003490d6220034101742209200a2009200a4b1b22094100480d620240024020030d0020091028210a0c010b200128020020032009102c210a0b200a450d522001200a360200200141046a2009360200200141086a28020021030b200141086a2209200341016a360200200a20036a41083a000020022001360208200541016a200241086a10c801200028022c210a02400240200141046a2802002205200928020022036b4104490d00200128020021050c010b200341046a22092003490d62200541017422032009200320094b1b22034100480d620240024020050d002003102821050c010b200128020020052003102c21050b2005450d5320012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200a360000200028023021050240024020062802002200200428020022036b4104490d00200128020021000c010b200341046a22062003490d62200041017422032006200320064b1b22034100480d620240024020000d002003102821000c010b200128020020002003102c21000b2000450d5420012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a20053600000c150b02400240200628020020042802002203460d00200128020021000c010b200341016a22002003490d61200341017422042000200420004b1b22044100480d610240024020030d002004102821000c010b200128020020032004102c21000b2000450d5420012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41093a000020022001360208200541016a200241086a10c8010c140b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d60200341017422052004200520044b1b22054100480d600240024020030d002005102821040c010b200128020020032005102c21040b2004450d5420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a00002000410c6a200110a0010c130b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5f200341017422052004200520044b1b22054100480d5f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d5420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a200110a001200041106a200110a001200041146a200110a0010c120b02400240200628020020042802002203460d00200128020021000c010b200341016a22002003490d5e200341017422042000200420004b1b22044100480d5e0240024020030d002004102821000c010b200128020020032004102c21000b2000450d5420012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a410c3a0000200541016a2001108f010c110b02400240200628020020042802002203460d00200128020021000c010b200341016a22002003490d5d200341017422052000200520004b1b22054100480d5d0240024020030d002005102821000c010b200128020020032005102c21000b2000450d5420012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a410d3a00000c100b02400240200628020020042802002203460d00200128020021000c010b200341016a22002003490d5c200341017422042000200420004b1b22044100480d5c0240024020030d002004102821000c010b200128020020032004102c21000b2000450d5420012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a410e3a0000200541016a2001108f010c0f0b02400240200628020020042802002203460d00200128020021000c010b200341016a22002003490d5b2003410174220a2000200a20004b1b220a4100480d5b0240024020030d00200a102821000c010b20012802002003200a102c21000b2000450d5420012000360200200141046a200a360200200141086a28020021030b200141086a200341016a360200200020036a410f3a0000200541016a2001108f0120052d0021220341064b0d0e0240024002400240024002400240024020030e0700010203040506000b410021000c060b410121000c050b410221000c040b410321000c030b410421000c020b410521000c010b410621000b200220003a001802400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5b200341017422062005200620054b1b22064100480d5b0240024020030d002006102821050c010b200128020020032006102c21050b2005450d5520012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a20003a00000c0e0b02400240200628020020042802002203460d00200128020021000c010b200341016a22002003490d5a200341017422052000200520004b1b22054100480d5a0240024020030d002005102821000c010b200128020020032005102c21000b2000450d5520012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41103a00000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d59200341017422052004200520044b1b22054100480d590240024020030d002005102821040c010b200128020020032005102c21040b2004450d5520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041046a200110ed010c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d58200341017422052004200520044b1b22054100480d580240024020030d002005102821040c010b200128020020032005102c21040b2004450d5520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041046a200110ed010c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d57200341017422052004200520044b1b22054100480d570240024020030d002005102821040c010b200128020020032005102c21040b2004450d5520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000280208417f6a220341094b0d0a024002400240024002400240024002400240024020030e0a00010203040506070809000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d60200341017422052004200520044b1b22054100480d600240024020030d002005102821040c010b200128020020032005102c21040b2004450d5f20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a0000200028020c2104200041146a280200220a200110b4010240200a450d00200141046a2109034002400240200928020020062802002203460d00200128020021050c010b200341016a22052003490dad012003410174220b2005200b20054b1b220b4100480dad010240024020030d00200b102821050c010b20012802002003200b102c21050b2005450d63200120053602002009200b360200200628020021030b2006200341016a360200200520036a20042d00003a0000200441016a2104200a417f6a220a0d000b0b200041186a200110a001200028021c210502400240200141046a2802002204200628020022036b4104490d00200128020021040c010b200341046a22062003490dab01200441017422032006200320064b1b22034100480dab010240024020040d002003102821040c010b200128020020042003102c21040b2004450d6220012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041286a29030021072000290320210e02400240200141046a2802002200200628020022036b4110490d00200128020021000c010b200341106a22042003490dab01200041017422032004200320044b1b22034100480dab010240024020000d002003102821000c010b200128020020002003102c21000b2000450d6320012000360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200020036a220320073700082003200e3700000c130b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490daa01200341017422052004200520044b1b22054100480daa010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6320012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41013a0000200028020c2104200041146a280200220a200110b4010240200a450d00200141046a2109034002400240200928020020062802002203460d00200128020021050c010b200341016a22052003490dac012003410174220b2005200b20054b1b220b4100480dac010240024020030d00200b102821050c010b20012802002003200b102c21050b2005450d66200120053602002009200b360200200628020021030b2006200341016a360200200520036a20042d00003a0000200441016a2104200a417f6a220a0d000b0b200041186a200110a001200028021c210502400240200141046a2802002204200628020022036b4104490d00200128020021040c010b200341046a22062003490daa01200441017422032006200320064b1b22034100480daa010240024020040d002003102821040c010b200128020020042003102c21040b2004450d6520012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041286a29030021072000290320210e02400240200141046a2802002200200628020022036b4110490d00200128020021000c010b200341106a22042003490daa01200041017422032004200320044b1b22034100480daa010240024020000d002003102821000c010b200128020020002003102c21000b2000450d6620012000360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200020036a220320073700082003200e3700000c120b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da901200341017422052004200520044b1b22054100480da9010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110a001200041106a200110a601200041346a200110a001200041386a200110a0010c110b200241033a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da801200341017422052004200520044b1b22054100480da8010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a200110a0010c100b200141086a2802002103200241043a0018024002402003200141046a280200460d00200128020021040c010b200341016a22042003490da701200341017422052004200520044b1b22054100480da7010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a200110a0010c0f0b200241053a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da601200341017422052004200520044b1b22054100480da6010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110a6012002200041386a360208200241086a200110a301200041306a200110a0010c0e0b200241063a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da501200341017422052004200520044b1b22054100480da5010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a200110a0010c0d0b200241073a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da401200341017422052004200520044b1b22054100480da4010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110a6010c0c0b200141046a2802002104200241083a0018024002402004200141086a2802002203460d00200128020021040c010b200341016a22042003490da301200341017422052004200520044b1b22054100480da3010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110a0010c0b0b200241093a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da201200341017422052004200520044b1b22054100480da2010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a200110a0010c0a0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da101200341017422052004200520044b1b22054100480da1010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200041046a22042d0000417f6a220341034b0d09024002400240024020030e0400010203000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490da401200341017422052000200520004b1b22054100480da4010240024020030d002005102821000c010b200128020020032005102c21000b2000450d6a20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a41003a0000200441016a2001108f010c0c0b200141086a2802002103200141046a2802002100200241013a00180240024020002003460d00200128020021000c010b200341016a22002003490da301200341017422052000200520004b1b22054100480da3010240024020030d002005102821000c010b200128020020032005102c21000b2000450d6a20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a41013a0000200441016a2001108f010c0b0b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490da201200341017422052000200520004b1b22054100480da2010240024020030d002005102821000c010b200128020020032005102c21000b2000450d6a20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a41023a0000200441016a2001108f01200441216a2001108f010c0a0b200241033a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da101200341017422052004200520044b1b22054100480da1010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a000020002802082103200041106a2802002200200110b4012000450d0920004105742100034020032001108f01200341206a2103200041606a22000d000c0a0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da001200341017422052004200520044b1b22054100480da0010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490da001200341017422052004200520044b1b22054100480da0010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041046a200110a0010c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9f01200341017422052004200520044b1b22054100480d9f010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d9f01200341017422052004200520044b1b22054100480d9f010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200028020421062000410c6a2802002203200110b40102400240200141046a2802002204200528020022006b2003490d00200128020021040c010b200020036a22052000490d9f01200441017422002005200020054b1b22004100480d9f010240024020040d002000102821040c010b200128020020042000102c21040b2004450d6d20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a20062003109a051a0c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9e01200341017422052004200520044b1b22054100480d9e010240024020030d002005102821040c010b200128020020032005102c21040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410f3a00002000280208417f6a220341024b0d0602400240024020030e03000102000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da001200341017422052004200520044b1b22054100480da0010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a360208200241086a200110a3012000410c6a200110a6010c080b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9f01200341017422052004200520044b1b22054100480d9f010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110a0010c070b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9e01200341017422052004200520044b1b22054100480d9e010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110a0010c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9d01200341017422052004200520044b1b22054100480d9d010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41103a0000200041086a22042d0000417f6a220341044b0d050240024002400240024020030e050001020304000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da101200341017422052004200520044b1b22054100480da1010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a200110ee010c090b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490da001200341017422052004200520044b1b22054100480da0010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a200110a101200028020c2106200041146a2802002203200110b40102400240200141046a2802002204200528020022006b2003490d00200128020021040c010b200020036a22052000490da001200441017422002005200020054b1b22004100480da0010240024020040d002000102821040c010b200128020020042000102c21040b2004450d7620012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a20062003109a051a0c080b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9f01200341017422052004200520044b1b22054100480d9f010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a200110a6012002200041c0006a360208200241086a200110a301200041d0006a200110a10120002802302106200041386a2802002203200110b40102400240200141046a2802002204200528020022006b2003490d00200128020021040c010b200020036a22052000490d9f01200441017422002005200020054b1b22004100480d9f010240024020040d002000102821040c010b200128020020042000102c21040b2004450d7720012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a20062003109a051a0c070b200241033a001802400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22052003490d9e01200341017422062005200620054b1b22064100480d9e010240024020030d002006102821050c010b200128020020032006102c21050b2005450d7720012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41033a00002002200041386a360208200241086a200110a301200041c8006a200110a10120022001360208200441016a200241086a10c801200028022c2105200041346a2802002203200110b40102400240200141046a2802002204200628020022006b2003490d00200128020021040c010b200020036a22062000490d9e01200441017422002006200020064b1b22004100480d9e010240024020040d002000102821040c010b200128020020042000102c21040b2004450d7820012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a20052003109a051a0c060b200141086a2802002103200241043a0018024002402003200141046a280200460d00200128020021000c010b200341016a22002003490d9d01200341017422052000200520004b1b22054100480d9d010240024020030d002005102821000c010b200128020020032005102c21000b2000450d7820012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41043a0000200441016a2001108f01024020042d00214101460d00200241003a001802400240200141046a28020020052802002203460d00200128020021000c010b200341016a22002003490d9e01200341017422042000200420004b1b22044100480d9e010240024020030d002004102821000c010b200128020020032004102c21000b2000450d7a20012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000c060b200241013a001802400240200141046a28020020052802002203460d00200128020021000c010b200341016a22002003490d9d01200341017422052000200520004b1b22054100480d9d010240024020030d002005102821000c010b200128020020032005102c21000b2000450d7a20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a41013a0000200441226a2001108f010c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9c01200341017422052004200520044b1b22054100480d9c010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41113a00002000280204417f6a220341024b0d0402400240024020030e03000102000b200241003a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9e01200341017422052004200520044b1b22054100480d9e010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000280208200110eb010c060b200241013a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9d01200341017422052004200520044b1b22054100480d9d010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110a6010c050b200241023a001802400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9c01200341017422052004200520044b1b22054100480d9c010240024020030d002005102821040c010b200128020020032005102c21040b2004450d7d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041086a200110a601200028022c200110eb010c040b02400240200141046a220a280200200141086a22032802002204460d00200128020021050c010b200441016a22052004490d9b01200441017422062005200620054b1b22064100480d9b010240024020040d002006102821050c010b200128020020042006102c21050b2005450d7d20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a41123a000002400240200a28020020032802002204460d00200128020021050c010b200441016a22052004490d9b01200441017422062005200620054b1b22064100480d9b010240024020040d002006102821050c010b200128020020042006102c21050b2005450d7e20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a41003a00002000280204210602400240200a2802002205200328020022046b4104490d00200128020021050c010b200441046a22092004490d9b01200541017422042009200420094b1b22044100480d9b010240024020050d002004102821050c010b200128020020052004102c21050b2005450d7f20012005360200200141046a2004360200200141086a28020021040b200141086a2209200441046a360200200520046a2006360000200041086a280200210b200041106a2802002204200110b40102400240200141046a2802002206200928020022056b2004490d00200128020021060c010b200520046a22092005490d9b01200641017422052009200520094b1b22054100480d9b010240024020060d002005102821060c010b200128020020062005102c21060b2006450d800120012006360200200141046a2005360200200141086a28020021050b200141086a2208200520046a360200200620056a200b2004109a051a200041146a28020021062000411c6a2802002204200110b40102402004450d0020062004410c6c6a210f200141046a210c03402006280200210b200641086a2802002204200110b40102400240200c2802002209200828020022056b2004490d00200128020021090c010b200520046a220d2005490d9d0120094101742205200d2005200d4b1b22054100480d9d010240024020090d002005102821090c010b200128020020092005102c21090b2009450d830120012009360200200c2005360200200828020021050b2003200520046a360200200920056a200b2004109a051a2006410c6a2206200f470d000b0b200041206a280200210602400240200a2802002205200328020022046b4104490d00200128020021050c010b200441046a22092004490d9b01200541017422042009200420094b1b22044100480d9b010240024020050d002004102821050c010b200128020020052004102c21050b2005450d820120012005360200200141046a2004360200200141086a28020021040b2003200441046a360200200520046a2006360000200041246a280200210602400240200a2802002205200328020022046b4104490d00200128020021050c010b200441046a22092004490d9b01200541017422042009200420094b1b22044100480d9b010240024020050d002004102821050c010b200128020020052004102c21050b2005450d830120012005360200200141046a2004360200200141086a28020021040b2003200441046a360200200520046a200636000002400240200a28020020032802002204460d00200128020021050c010b200441016a22052004490d9b01200441017422062005200620054b1b22064100480d9b010240024020040d002006102821050c010b200128020020042006102c21050b2005450d840120012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041286a22042d00003a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d850120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00013a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d860120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d002a3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d870120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00033a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d880120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d002c3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d890120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00053a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d8a0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d002e3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d8b0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00073a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d8c0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00303a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d8d0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00093a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d8e0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00323a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d8f0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d000b3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d900120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00343a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d910120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d000d3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d920120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00363a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d930120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d000f3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d940120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00383a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d950120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00113a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d960120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d003a3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d970120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00133a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d980120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d003c3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d990120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00153a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490d9b01200541017422092006200920064b1b22094100480d9b010240024020050d002009102821060c010b200128020020052009102c21060b2006450d9a0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d003e3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450d9c0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00173a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450d9d0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00403a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450d9e0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00193a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450d9f0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00423a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da00120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d001b3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da10120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00443a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da20120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d001d3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da30120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00463a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da40120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d001f3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da50120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00483a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da60120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00213a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da70120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d004a3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da80120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00233a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450da90120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d004c3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450daa0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00253a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dab0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d004e3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dac0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00273a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dad0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00503a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dae0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00293a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450daf0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00523a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db00120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d002b3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db10120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00543a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db20120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d002d3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db30120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00563a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db40120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d002f3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db50120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00583a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db60120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00313a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db70120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d005a3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db80120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00333a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450db90120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d005c3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dba0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00353a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dbb0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d005e3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dbc0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00373a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dbd0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00603a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dbe0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d00393a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dbf0120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00623a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dc00120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20042d003b3a000002400240200a28020020032802002205460d00200128020021060c010b200541016a22062005490dc701200541017422092006200920064b1b22094100480dc7010240024020050d002009102821060c010b200128020020052009102c21060b2006450dc10120012006360200200141046a2009360200200141086a28020021050b2003200541016a360200200620056a20002d00643a000002400240200a28020020032802002200460d00200128020021050c010b200041016a22052000490dc701200041017422062005200620054b1b22064100480dc7010240024020000d002006102821050c010b200128020020002006102c21050b2005450dc20120012005360200200141046a2006360200200141086a28020021000b2003200041016a360200200520006a20042d003d3a000002400240200a28020020032802002200460d00200128020021050c010b200041016a22052000490dc701200041017422062005200620054b1b22064100480dc7010240024020000d002006102821050c010b200128020020002006102c21050b2005450dc30120012005360200200141046a2006360200200141086a28020021000b2003200041016a360200200520006a20042d003e3a000002400240200a28020020032802002200460d00200128020021050c010b200041016a22052000490dc701200041017422062005200620054b1b22064100480dc7010240024020000d002006102821050c010b200128020020002006102c21050b2005450dc40120012005360200200141046a2006360200200141086a28020021000b2003200041016a360200200520006a20042d003f3a00000c030b02400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490dc601200341017422042000200420004b1b22044100480dc6010240024020030d002004102821000c010b200128020020032004102c21000b2000450dc40120012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41133a00000c010b02400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490dc501200341017422042000200420004b1b22044100480dc5010240024020030d002004102821000c010b200128020020032004102c21000b2000450dc40120012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41143a00000b200110c4010b200241206a24000f0b200541011037000b200441011037000b200541011037000b200041011037000b200541011037000b200341011037000b200541011037000b200041011037000b200441011037000b200541011037000b200541011037000b200541011037000b200041011037000b200441011037000b200541011037000b200541011037000b200541011037000b200541011037000b200341011037000b200441011037000b200541011037000b200441011037000b200441011037000b200441011037000b200541011037000b200541011037000b200441011037000b200441011037000b200441011037000b200541011037000b200541011037000b200441011037000b200541011037000b200541011037000b200441011037000b200541011037000b200441011037000b200441011037000b200441011037000b200541011037000b200541011037000b200441011037000b200441011037000b200541011037000b200541011037000b200541011037000b200041011037000b200a41011037000b200541011037000b200541011037000b200a41011037000b200a41011037000b200a41011037000b200a41011037000b200a41011037000b200341011037000b200541011037000b200541011037000b200541011037000b200941011037000b200341011037000b200341011037000b200441011037000b200541011037000b200541011037000b200441011037000b200541011037000b200441011037000b200a41011037000b200641011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b1031000b200b41011037000b200341011037000b200341011037000b200541011037000b200b41011037000b200341011037000b200341011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200041011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200041011037000b200541011037000b200041011037000b200641011037000b200041011037000b200541011037000b200441011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200641011037000b200641011037000b200441011037000b200541011037000b200541011037000b200441011037000b200441011037000b200641011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b1031000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200941011037000b200641011037000b200641011037000b200641011037000b200441011037000b200441011037000b1031000bb31601067f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e050003010204000b2002410036020820024201370300410110282203450d05200242818080801037020420022003360200200341023a00002002200236020c200141016a2002410c6a10c8010c040b2002410036020820024201370300410110282203450d05200242818080801037020420022003360200200341043a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d1a200341017422052004200520044b1b22054100480d1a0240024020030d002005102821040c010b200228020020032005102c21040b2004450d0720022005360204200220043602000b2002200341016a360208200420036a20012d00013a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d1a200341017422052004200520044b1b22054100480d1a0240024020030d002005102821040c010b200228020020032005102c21040b2004450d0820022005360204200220043602000b2002200341016a360208200420036a20012d00023a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d1a200341017422052004200520044b1b22054100480d1a0240024020030d002005102821040c010b200228020020032005102c21040b2004450d0920022005360204200220043602000b2002200341016a360208200420036a20012d00033a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d1a200341017422052004200520044b1b22054100480d1a0240024020030d002005102821040c010b200228020020032005102c21040b2004450d0a20022005360204200220043602000b2002200341016a360208200420036a20012d00043a000020012802082105200141106a2802002201200210b4010240024020022802042204200228020822036b2001490d00200228020021040c010b200320016a22062003490d1a200441017422072006200720064b1b22064100480d1a0240024020040d002006102821040c010b200228020020042006102c21040b2004450d0b20022006360204200220043602000b2002200320016a360208200420036a20052001109a051a0c030b2002410036020820024201370300410110282203450d0a200242818080801037020420022003360200200341053a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d19200341017422052004200520044b1b22054100480d190240024020030d002005102821040c010b200228020020032005102c21040b2004450d0c20022005360204200220043602000b2002200341016a360208200420036a20012d00013a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d19200341017422052004200520044b1b22054100480d190240024020030d002005102821040c010b200228020020032005102c21040b2004450d0d20022005360204200220043602000b2002200341016a360208200420036a20012d00023a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d19200341017422052004200520044b1b22054100480d190240024020030d002005102821040c010b200228020020032005102c21040b2004450d0e20022005360204200220043602000b2002200341016a360208200420036a20012d00033a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d19200341017422052004200520044b1b22054100480d190240024020030d002005102821040c010b200228020020032005102c21040b2004450d0f20022005360204200220043602000b2002200341016a360208200420036a20012d00043a000020012802082105200141106a2802002201200210b4010240024020022802042204200228020822036b2001490d00200228020021040c010b200320016a22062003490d19200441017422072006200720064b1b22064100480d190240024020040d002006102821040c010b200228020020042006102c21040b2004450d1020022006360204200220043602000b2002200320016a360208200420036a20052001109a051a0c020b2002410036020820024201370300410110282203450d0f200242818080801037020420022003360200200341063a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d18200341017422052004200520044b1b22054100480d180240024020030d002005102821040c010b200228020020032005102c21040b2004450d1120022005360204200220043602000b2002200341016a360208200420036a20012d00013a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d18200341017422052004200520044b1b22054100480d180240024020030d002005102821040c010b200228020020032005102c21040b2004450d1220022005360204200220043602000b2002200341016a360208200420036a20012d00023a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d18200341017422052004200520044b1b22054100480d180240024020030d002005102821040c010b200228020020032005102c21040b2004450d1320022005360204200220043602000b2002200341016a360208200420036a20012d00033a000002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d18200341017422052004200520044b1b22054100480d180240024020030d002005102821040c010b200228020020032005102c21040b2004450d1420022005360204200220043602000b2002200341016a360208200420036a20012d00043a000020012802082105200141106a2802002201200210b4010240024020022802042204200228020822036b2001490d00200228020021040c010b200320016a22062003490d18200441017422072006200720064b1b22064100480d180240024020040d002006102821040c010b200228020020042006102c21040b2004450d1520022006360204200220043602000b2002200320016a360208200420036a20052001109a051a0c010b2002410036020820024201370300410110282203450d14200242818080801037020420022003360200200341003a0000200141046a28020021052001410c6a2802002201200210b4010240024020022802042204200228020822036b2001490d00200228020021040c010b200320016a22062003490d17200441017422072006200720064b1b22064100480d170240024020040d002006102821040c010b200228020020042006102c21040b2004450d1620022006360204200220043602000b2002200320016a360208200420036a20052001109a051a0b200020022201290200370200200041086a200141086a280200360200200241106a24000f0b410141011037000b410141011037000b200541011037000b200541011037000b200541011037000b200541011037000b200641011037000b410141011037000b200541011037000b200541011037000b200541011037000b200541011037000b200641011037000b410141011037000b200541011037000b200541011037000b200541011037000b200541011037000b200641011037000b410141011037000b200641011037000b1031000b800801047f230041106b22022400024002400240024002400240024020002d0000417f6a220341034b0d00024002400240024020030e0400010203000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a200341017422052004200520044b1b22054100480d0a0240024020030d002005102821040c010b200128020020032005102c21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200028020421032000410c6a2802002200200110b4012000450d0320004105742100034020032001108f01200341206a2103200041606a22000d000c040b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102821040c010b200128020020032005102c21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000280204200110eb010c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d08200341017422052004200520044b1b22054100480d080240024020030d002005102821040c010b200128020020032005102c21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041046a200110a0012000280208200110eb010c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d07200341017422052004200520044b1b22054100480d070240024020030d002005102821040c010b200128020020032005102c21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002002200136020c200041016a2002410c6a10c801200041246a200110a00102400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d07200341017422052004200520044b1b22054100480d070240024020030d002005102821040c010b200128020020032005102c21040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00213a00000b200241106a24000f0b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b1031000bf71802047f017e20002802582102024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2802002203200141086a28020022046b4104490d00200128020021030c010b200441046a22052004490d13200341017422042005200420054b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240200141046a2802002203200528020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0220012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0320012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0420012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0520012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0620012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0720012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0820012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0920012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0a20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290348210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290350210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0c20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028025c210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0d20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280260210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0e20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280264210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d0f20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280268210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d13200341017422042002200420024b1b22044100480d130240024020030d002004102821030c010b200128020020032004102c21030b2003450d1020012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000002400240200141046a28020020022802002204460d00200128020021030c010b200441016a22032004490d13200441017422022003200220034b1b22024100480d130240024020040d002002102821030c010b200128020020042002102c21030b2003450d1120012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a20002d00703a0000200028026c210302400240200141046a2802002204200228020022006b4104490d00200128020021040c010b200041046a22022000490d13200441017422002002200020024b1b22004100480d130240024020040d002000102821040c010b200128020020042000102c21040b2004450d1220012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000f0b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200241011037000b200041011037000b1031000bb90201057f230041106b2203240020034100360208200342013703002001200310b4010240024002402001450d00200141b0016c2104034020004188016a28020021050240024020032802042206200328020822016b4104490d00200328020021060c010b200141046a22072001490d04200641017422012007200120074b1b22014100480d040240024020060d002001102821060c010b200328020020062001102c21060b2006450d032003200136020420032006360200200328020821010b2003200141046a360208200620016a20053600002000200310eb012000418c016a2003108f01200041b0016a2100200441d07e6a22040d000b0b2003280204210020022802002002280204200328020022012003280208100702402000450d002001102a0b200341106a24000f0b200141011037000b1031000bee1405177f017e017f027e047f230041206b220224000240024020014115490d0002402001410176220341ffffff3f712003470d0020034105742204417f4c0d0041012105024002402004450d00200410282205450d010b200041606a2106200041a07f6a210741002108410021094104210a4100210b2001210c034002400240200c220d417f6a220e0d004101210f4100210c0c010b0240024002400240024002402000200e4105746a200d410574221020006a41406a4120109c054100480d004102200d6b210e200720106a21044101210f03400240200e200f6a4101470d004100210c200d210f0c080b200f41016a210f200441206a20044120109c052111200441606a21042011417f4a0d000b200d200f6b210e0c010b200720106a2104024003400240200e4101470d004100210e0c020b200e417f6a210e200441206a20044120109c052111200441606a210420114100480d000b0b200d200e490d01200d20014b0d03200d200e6b220f4101762212450d00200620106a21042000200e4105746a21110340200241186a2210201141186a2213290000370300200241106a2214201141106a2215290000370300200241086a2216201141086a221729000037030020022011290000370300200441086a22182900002119200441106a221a290000211b200441186a220c290000211c201120042900003700002013201c3700002015201b37000020172019370000200c2010290300370000201a20142903003700002018201629030037000020042002290300370000200441606a2104201141206a21112012417f6a22120d000b0b0240200e0d00200e210c0c050b0240200f41094d0d00200e210c0c050b200d20014b0d01200d200e6b21122000200e4105746a21100340200d200e417f6a220c490d040240200d200c6b220f4102490d002000200e4105746a22042000200c4105746a220e4120109c05417f4a0d00200e2900002119200e2004290000370000200241186a2216200e41186a2211290000370300200241106a2217200e41106a2213290000370300200241086a2218200e41086a22142900003703002014200441086a2900003700002013200441106a2900003700002011200441186a29000037000020022019370300410121150240200f4103490d00200e41c0006a20024120109c05417f4a0d00410221112010210402400340200441186a200441386a290000370000200441106a200441306a290000370000200441086a200441286a2900003700002004200441206a221329000037000020122011460d01200441c0006a21142011211520132104201141016a2111201420024120109c05417f4a0d020c000b0b201121150b200e20154105746a22042002290300370000200441186a2016290300370000200441106a2017290300370000200441086a20182903003700000b200c450d05201041606a2110201241016a2112200c210e200f410a4f0d050c000b0b200e200d1044000b200d200e417f6a220c490d010b200d2001103c000b200c200d1044000b024002400240200b2009470d0002400240200941016a22042009490d00200941017422112004201120044b1b220441ffffffff01712004470d002004410374221141004e0d010b1031000b0240024020090d0020111028210a0c010b200a20094103742011102c210a0b200a450d01200421092008210b0b200a200b4103746a2204200f3602042004200c360200200841016a220b2108200b4102490d01024003400240024002400240200a200b417f6a22084103746a2204280200450d00200b410374200a6a220f41746a280200220e200428020422114d0d000240200b41024b0d00200b21084102210b0c080b200a200b417d6a22164103746a28020422042011200e6a4d0d010240200b41034b0d00200b21084103210b0c080b200f41646a2802002004200e6a4d0d01200b21080c070b200b4103490d0120042802042111200a200b417d6a22164103746a28020421040b20042011490d010b200b417e6a21160b024002400240024002400240200b201641016a221d4b221e450d00200b20164b221f450d01200a20164103746a2217280204222020172802006a2204200a201d4103746a2218280200221a490d02200420014b0d032000201a4105746a22142018280204221541057422116a210f2004410574210e2004201a6b220d20156b220420154f0d042005200f20044105742211109a05221320116a21120240024020154101480d00200441014e0d010b200f2104201321110c060b2006200e6a210e200f21040340200e200441606a220f201241606a220d200d200f4120109c0541004822101b2211290000370000200e41186a201141186a290000370000200e41106a201141106a290000370000200e41086a201141086a2900003700002012200d20101b211202402014200f200420101b2204490d00201321110c070b200e41606a210e2013211120132012490d000c060b0b41b8dbc000201d200b1034000b41b8dbc0002016200b1034000b201a20041044000b20042001103c000b200520142011109a05221320116a21120240024020154101480d00200d20154a0d010b20142104201321110c010b2000200e6a2110201321112014210403402004200f2011200f20114120109c05410048220d1b220e290000370000200441186a200e41186a290000370000200441106a200e41106a290000370000200441086a200e41086a2900003700002011201141206a200d1b2111200441206a2104200f41206a200f200d1b220f20104f0d01201220114b0d000b0b20042011201220116b416071109a051a0240201f450d002017201a360200201741046a202020156a360200201e450d022018201841086a200b201d417f736a410374109b051a2008210b200841014d0d040c010b0b41c8dbc0002016200b1034000b41b0b1c0001032000b201141041037000b200c0d000b02402009450d00200a102a0b2003450d032005102a0c030b200441011037000b1036000b20014102490d002001417f6a2111200141057420006a41206a2110410121120340024002400240024020112204417f6a221120014b0d00200120116b220e4102490d03200020044105746a2204200020114105746a220d4120109c05417f4a0d03200d2900002119200d2004290000370000200241186a2214200d41186a220f290000370300200241106a220b200d41106a2213290000370300200241086a2215200d41086a220a290000370300200a200441086a2900003700002013200441106a290000370000200f200441186a2900003700002002201937030041012104200e4103490d02200d41c0006a20024120109c05417f4a0d0241002113201021040340200441406a220e200441606a220f290000370000200e41186a200f41186a290000370000200e41106a200f41106a290000370000200e41086a200f41086a29000037000020122013220e460d02200e417f6a2113200420024120109c05210f200441206a2104200f417f4a0d020c000b0b201120011044000b4102200e6b21040b200d20044105746a22042002290300370000200441186a2014290300370000200441106a200b290300370000200441086a20152903003700000b201041606a21102012417f6a211220110d000b0b200241206a24000ba3950103057f027e027f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00000e10000102030405060708090a0b0c0d0e0f000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5c200341017422052004200520044b1b22054100480d5c0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302402000410c6a2d000022054102470d000240024020042003460d00200128020021000c010b200341016a22002003490d5d200341017422042000200420004b1b22044100480d5d0240024020030d002004102821000c010b200128020020032004102c21000b2000450d1320012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000c100b0240024020042003460d00200128020021040c010b200341016a22042003490d5c200341017422062004200620044b1b22064100480d5c0240024020030d002006102821040c010b200128020020032006102c21040b2004450d1320012004360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200420036a41013a00000240024020054101460d0002400240200141046a28020020062802002203460d00200128020021040c010b200341016a22042003490d5e200341017422052004200520044b1b22054100480d5e0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00000c010b02400240200141046a28020020062802002203460d00200128020021040c010b200341016a22042003490d5d200341017422052004200520044b1b22054100480d5d0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5d200341017422052004200520044b1b22054100480d5d0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d000d3a00000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5c200341017422052004200520044b1b22054100480d5c0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d000e3a00000c0f0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5b200341017422052004200520044b1b22054100480d5b0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5b200341017422052004200520044b1b22054100480d5b0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041086a2001108f012000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5b200341017422002005200020054b1b22004100480d5b0240024020030d002000102821030c010b200128020020032000102c21030b2003450d1920012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0e0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5a200341017422052004200520044b1b22054100480d5a0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a000020002d0008220341024b0d0d02400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5c200341017422052004200520044b1b22054100480d5c0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041096a2001108f01200041386a29030021072000290330210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5c200341017422002004200020044b1b22004100480d5c0240024020030d002000102821030c010b200128020020032000102c21030b2003450d1d20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c0f0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5b200341017422052004200520044b1b22054100480d5b0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041096a2001108f010c0e0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5a200341017422052004200520044b1b22054100480d5a0240024020030d002005102821040c010b200128020020032005102c21040b2004450d1d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041096a2001108f01200041296a2001108f01200041d8006a29030021072000290350210802400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d5a200441017422032005200320054b1b22034100480d5a0240024020040d002003102821040c010b200128020020042003102c21040b2004450d1e20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a2203200737000820032008370000200041e8006a29030021072000290360210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5a200341017422002004200020044b1b22004100480d5a0240024020030d002000102821030c010b200128020020032000102c21030b2003450d1f20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d59200341017422052004200520044b1b22054100480d590240024020030d002005102821040c010b200128020020032005102c21040b2004450d1f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a000020002d0008220341024b0d0c02400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5b200341017422052004200520044b1b22054100480d5b0240024020030d002005102821040c010b200128020020032005102c21040b2004450d2220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a29030021072000290310210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5b200341017422002004200020044b1b22004100480d5b0240024020030d002000102821030c010b200128020020032000102c21030b2003450d2320012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c0e0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5a200341017422052004200520044b1b22054100480d5a0240024020030d002005102821040c010b200128020020032005102c21040b2004450d2320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041096a2001108f01200041386a29030021072000290330210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5a200341017422002004200020044b1b22004100480d5a0240024020030d002000102821030c010b200128020020032000102c21030b2003450d2420012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d59200341017422052004200520044b1b22054100480d590240024020030d002005102821040c010b200128020020032005102c21040b2004450d2420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d59200341017422002005200020054b1b22004100480d590240024020030d002000102821030c010b200128020020032000102c21030b2003450d2520012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d58200341017422052004200520044b1b22054100480d580240024020030d002005102821040c010b200128020020032005102c21040b2004450d2520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d58200341017422052004200520044b1b22054100480d580240024020030d002005102821040c010b200128020020032005102c21040b2004450d2620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d58200341017422002005200020054b1b22004100480d580240024020030d002000102821030c010b200128020020032000102c21030b2003450d2720012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0b0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d57200341017422092005200920054b1b22094100480d570240024020030d002009102821050c010b200128020020032009102c21050b2005450d2720012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41053a000020002d00082203410a4b0d0a0240024002400240024002400240024002400240024020030e0b000102030405060708090a000b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d61200341017422092005200920054b1b22094100480d610240024020030d002009102821050c010b200128020020032009102c21050b2005450d3220012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41003a0000200028020c21090240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d6120054101742203200a2003200a4b1b22034100480d610240024020050d002003102821050c010b200128020020052003102c21050b2005450d3320012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2009360000200041186a2903002107200029031021080240024020062802002203200428020022006b4110490d00200128020021030c010b200041106a22052000490d61200341017422002005200020054b1b22004100480d610240024020030d002000102821030c010b200128020020032000102c21030b2003450d3420012003360200200141046a2000360200200141086a28020021000b2004200041106a360200200320006a22012007370008200120083700000c140b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d60200341017422092005200920054b1b22094100480d600240024020030d002009102821050c010b200128020020032009102c21050b2005450d3420012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41013a0000200028020c21090240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d6020054101742203200a2003200a4b1b22034100480d600240024020050d002003102821050c010b200128020020052003102c21050b2005450d3520012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2009360000200041286a2903002107200029032021080240024020062802002205200428020022036b4110490d00200128020021040c010b200341106a22042003490d60200541017422032004200320044b1b22034100480d600240024020050d002003102821040c010b200128020020052003102c21040b2004450d3620012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220320073700082003200837000020002802102103200041186a2802002200200110b4012000450d1320004105742100034020032001108f01200341206a2103200041606a22000d000c140b0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5f200041017422052003200520034b1b22054100480d5f0240024020000d002005102821030c010b200128020020002005102c21030b2003450d3620012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c120b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5e200341017422092005200920054b1b22094100480d5e0240024020030d002009102821050c010b200128020020032009102c21050b2005450d3620012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41033a0000200028020c21090240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5e20054101742203200a2003200a4b1b22034100480d5e0240024020050d002003102821050c010b200128020020052003102c21050b2005450d3720012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200936000020002d0009220041024b0d1102400240024020000e03000102000b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d60200041017422052003200520034b1b22054100480d600240024020000d002005102821030c010b200128020020002005102c21030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c130b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5f200041017422052003200520034b1b22054100480d5f0240024020000d002005102821030c010b200128020020002005102c21030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c120b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5e200041017422052003200520034b1b22054100480d5e0240024020000d002005102821030c010b200128020020002005102c21030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c110b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5d200341017422092005200920054b1b22094100480d5d0240024020030d002009102821050c010b200128020020032009102c21050b2005450d3a20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41043a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d5d200341017422002006200020064b1b22004100480d5d0240024020030d002000102821030c010b200128020020032000102c21030b2003450d3b20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c100b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5c200341017422092005200920054b1b22094100480d5c0240024020030d002009102821050c010b200128020020032009102c21050b2005450d3b20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41053a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d5c200341017422002006200020064b1b22004100480d5c0240024020030d002000102821030c010b200128020020032000102c21030b2003450d3c20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0f0b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5b200341017422092005200920054b1b22094100480d5b0240024020030d002009102821050c010b200128020020032009102c21050b2005450d3c20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41063a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d5b200341017422002006200020064b1b22004100480d5b0240024020030d002000102821030c010b200128020020032000102c21030b2003450d3d20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0e0b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5a200341017422092005200920054b1b22094100480d5a0240024020030d002009102821050c010b200128020020032009102c21050b2005450d3d20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41073a0000200028020c21090240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5a20054101742203200a2003200a4b1b22034100480d5a0240024020050d002003102821050c010b200128020020052003102c21050b2005450d3e20012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200936000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5a200341017422062005200620054b1b22064100480d5a0240024020030d002006102821050c010b200128020020032006102c21050b2005450d3f20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a20002d00093a00000c0d0b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d59200341017422052004200520044b1b22054100480d590240024020030d002005102821040c010b200128020020032005102c21040b2004450d3f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041096a2001108f01200041296a2001108f010c0c0b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d58200341017422052004200520044b1b22054100480d580240024020030d002005102821040c010b200128020020032005102c21040b2004450d3f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041096a2001108f010c0b0b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d57200341017422062005200620054b1b22064100480d570240024020030d002006102821050c010b200128020020032006102c21050b2005450d3f20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a410a3a0000200041096a2001108f0120022001360208200041296a200241086a10c801200028024c210502400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22062000490d57200341017422002006200020064b1b22004100480d570240024020030d002000102821030c010b200128020020032000102c21030b2003450d4020012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0a0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d56200341017422052004200520044b1b22054100480d560240024020030d002005102821040c010b200128020020032005102c21040b2004450d4020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200041046a200110f2010c090b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d55200341017422052004200520044b1b22054100480d550240024020030d002005102821040c010b200128020020032005102c21040b2004450d4020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041046a200110f2010c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d54200341017422052004200520044b1b22054100480d540240024020030d002005102821040c010b200128020020032005102c21040b2004450d4020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a0000024002400240024020002d00040e0400010203000b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d57200341017422052004200520044b1b22054100480d570240024020030d002005102821040c010b200128020020032005102c21040b2004450d4420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041056a2001108f01200041256a2001108f010c0a0b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d56200341017422052004200520044b1b22054100480d560240024020030d002005102821040c010b200128020020032005102c21040b2004450d4420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041056a2001108f010c090b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d55200341017422052004200520044b1b22054100480d550240024020030d002005102821040c010b200128020020032005102c21040b2004450d4420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000280208210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d55200341017422002005200020054b1b22004100480d550240024020030d002000102821030c010b200128020020032000102c21030b2003450d4520012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c080b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d54200341017422052004200520044b1b22054100480d540240024020030d002005102821040c010b200128020020032005102c21040b2004450d4520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a000020002802082103200041106a2802002204200110b40102402004450d0020044105742104034020032001108f01200341206a2103200441606a22040d000b0b200028021421032000411c6a2802002200200110b4012000450d0720004105742100034020032001108f01200341206a2103200041606a22000d000c080b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d53200341017422052004200520044b1b22054100480d530240024020030d002005102821040c010b200128020020032005102c21040b2004450d4520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a000020002d0001220041044b0d060240024002400240024020000e050001020304000b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d57200041017422042003200420034b1b22044100480d570240024020000d002004102821030c010b200128020020002004102c21030b2003450d4a20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a00000c0a0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d56200041017422042003200420034b1b22044100480d560240024020000d002004102821030c010b200128020020002004102c21030b2003450d4a20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c090b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d55200041017422042003200420034b1b22044100480d550240024020000d002004102821030c010b200128020020002004102c21030b2003450d4a20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a00000c080b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d54200041017422042003200420034b1b22044100480d540240024020000d002004102821030c010b200128020020002004102c21030b2003450d4a20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41033a00000c070b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d53200041017422042003200420034b1b22044100480d530240024020000d002004102821030c010b200128020020002004102c21030b2003450d4a20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41043a00000c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d52200341017422052004200520044b1b22054100480d520240024020030d002005102821040c010b200128020020032005102c21040b2004450d4a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a00002000280204220341024b0d0502400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d54200341017422052004200520044b1b22054100480d540240024020030d002005102821040c010b200128020020032005102c21040b2004450d4d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000020002802082103200041106a2802002200200110b4012000450d072003200041286c6a210a200141046a2106034020032001108f01200341206a29030021070240024020062802002204200528020022006b4108490d00200128020021040c010b200041086a22092000490d55200441017422002009200020094b1b22004100480d550240024020040d002000102821040c010b200128020020042000102c21040b2004450d4f2001200436020020062000360200200528020021000b2005200041086a360200200420006a2007370000200a200341286a2203470d000c080b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d53200041017422042003200420034b1b22044100480d530240024020000d002004102821030c010b200128020020002004102c21030b2003450d4e20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c060b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d52200041017422042003200420034b1b22044100480d520240024020000d002004102821030c010b200128020020002004102c21030b2003450d4e20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a00000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d51200341017422052004200520044b1b22054100480d510240024020030d002005102821040c010b200128020020032005102c21040b2004450d4e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a000020002d0008220341044b0d040240024002400240024020030e050001020304000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d55200341017422052004200520044b1b22054100480d550240024020030d002005102821040c010b200128020020032005102c21040b2004450d5320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d55200341017422002005200020054b1b22004100480d550240024020030d002000102821030c010b200128020020032000102c21030b2003450d5420012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d74200341017422052004200520044b1b22054100480d740240024020030d002005102821040c010b200128020020032005102c21040b2004450d5520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a29030021072000290310210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d74200341017422002004200020044b1b22004100480d740240024020030d002000102821030c010b200128020020032000102c21030b2003450d5620012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d73200341017422052004200520044b1b22054100480d730240024020030d002005102821040c010b200128020020032005102c21040b2004450d5620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200028022c210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d73200441017422032005200320054b1b22034100480d730240024020040d002003102821040c010b200128020020042003102c21040b2004450d5720012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a29030021072000290330210802400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d73200441017422032005200320054b1b22034100480d730240024020040d002003102821040c010b200128020020042003102c21040b2004450d5820012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a2203200737000820032008370000200041096a2001108f010c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d72200341017422052004200520044b1b22054100480d720240024020030d002005102821040c010b200128020020032005102c21040b2004450d5820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a29030021072000290310210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d72200341017422002004200020044b1b22004100480d720240024020030d002000102821030c010b200128020020032000102c21030b2003450d5920012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d71200341017422052004200520044b1b22054100480d710240024020030d002005102821040c010b200128020020032005102c21040b2004450d5920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a29030021072000290310210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d71200341017422002004200020044b1b22004100480d710240024020030d002000102821030c010b200128020020032000102c21030b2003450d5a20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d70200341017422052004200520044b1b22054100480d700240024020030d002005102821040c010b200128020020032005102c21040b2004450d5a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a000020002d0008220341054b0d0302400240024002400240024020030e06000102030405000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d75200341017422052004200520044b1b22054100480d750240024020030d002005102821040c010b200128020020032005102c21040b2004450d6020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041096a2001108f01200041296a2001108f01200041d8006a29030021072000290350210802400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d75200341017422002004200020044b1b22004100480d750240024020030d002000102821030c010b200128020020032000102c21030b2003450d6120012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012007370008200120083700000c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d74200341017422052004200520044b1b22054100480d740240024020030d002005102821040c010b200128020020032005102c21040b2004450d6120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041096a2001108f01200041296a2001108f010c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d73200341017422052004200520044b1b22054100480d730240024020030d002005102821040c010b200128020020032005102c21040b2004450d6120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200136020c200041096a2002410c6a10c8010c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d72200341017422052004200520044b1b22054100480d720240024020030d002005102821040c010b200128020020032005102c21040b2004450d6120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d72200341017422002005200020054b1b22004100480d720240024020030d002000102821030c010b200128020020032000102c21030b2003450d6220012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d71200341017422052004200520044b1b22054100480d710240024020030d002005102821040c010b200128020020032005102c21040b2004450d6220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041096a2001108f0102400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d71200341017422052004200520044b1b22054100480d710240024020030d002005102821040c010b200128020020032005102c21040b2004450d6320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00293a00000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d70200341017422052004200520044b1b22054100480d700240024020030d002005102821040c010b200128020020032005102c21040b2004450d6320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a0000200041096a2001108f01200028022c2106200041346a2802002200200110b40102400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d70200441017422032005200320054b1b22034100480d700240024020040d002003102821040c010b200128020020042003102c21040b2004450d6420012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a20062000109a051a0c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6f200341017422052004200520044b1b22054100480d6f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d6420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410d3a000020002d0001220341024b0d0202400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d71200341017422052004200520044b1b22054100480d710240024020030d002005102821040c010b200128020020032005102c21040b2004450d6720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d71200341017422052004200520044b1b22054100480d710240024020030d002005102821040c010b200128020020032005102c21040b2004450d6820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00023a00000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d70200341017422052004200520044b1b22054100480d700240024020030d002005102821040c010b200128020020032005102c21040b2004450d6820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041026a2001108f010c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6f200341017422052004200520044b1b22054100480d6f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d6820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d6f200341017422052004200520044b1b22054100480d6f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d6920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00023a00000c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6e200341017422052004200520044b1b22054100480d6e0240024020030d002005102821040c010b200128020020032005102c21040b2004450d6920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d6e200341017422052004200520044b1b22054100480d6e0240024020030d002005102821040c010b200128020020032005102c21040b2004450d6a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041016a2001108f010c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6d200341017422052004200520044b1b22054100480d6d0240024020030d002005102821040c010b200128020020032005102c21040b2004450d6a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410f3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d6d200341017422052004200520044b1b22054100480d6d0240024020030d002005102821040c010b200128020020032005102c21040b2004450d6b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041106a200110c601200028020421062000410c6a2802002200200110b40102400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d6d200441017422032005200320054b1b22034100480d6d0240024020040d002003102821040c010b200128020020042003102c21040b2004450d6c20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a20062000109a051a0b200241106a24000f0b200541011037000b200441011037000b200641011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200041011037000b200541011037000b200541011037000b200041011037000b200541011037000b200541011037000b200341011037000b200041011037000b200541011037000b200541011037000b200041011037000b200541011037000b200041011037000b200541011037000b200041011037000b200541011037000b200541011037000b200041011037000b200941011037000b200941011037000b200341011037000b200041011037000b200941011037000b200341011037000b200341011037000b200541011037000b200941011037000b200341011037000b200541011037000b200541011037000b200541011037000b200941011037000b200041011037000b200941011037000b200041011037000b200941011037000b200041011037000b200941011037000b200341011037000b200641011037000b200541011037000b200541011037000b200641011037000b200041011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200041011037000b200541011037000b200541011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200541011037000b200541011037000b200041011037000b200441011037000b200441011037000b200541011037000b200541011037000b200041011037000b1031000b200541011037000b200041011037000b200541011037000b200341011037000b200341011037000b200541011037000b200041011037000b200541011037000b200041011037000b200541011037000b200541011037000b200041011037000b200541011037000b200541011037000b200541011037000b200041011037000b200541011037000b200541011037000b200541011037000b200341011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200341011037000b1031000bfd1201057f230041106b2202240002400240024002400240024002400240024002400240024002400240024020002d0000220341054b0d0002400240024002400240024020030e06000102030405000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d14200341017422052004200520044b1b22054100480d140240024020030d002005102821040c010b200128020020032005102c21040b2004450d0720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041016a2001108f012000280244210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d14200441017422032005200320054b1b22034100480d140240024020040d002003102821040c010b200128020020042003102c21040b2004450d0820012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a20063600002002200136020c200041216a2002410c6a10c8012000280248210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d14200341017422002005200020054b1b22004100480d140240024020030d002000102821030c010b200128020020032000102c21030b2003450d0920012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d13200341017422052004200520044b1b22054100480d130240024020030d002005102821040c010b200128020020032005102c21040b2004450d0920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041016a2001108f012002200136020c200041216a2002410c6a10c80102400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d13200341017422052004200520044b1b22054100480d130240024020030d002005102821040c010b200128020020032005102c21040b2004450d0a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20002d00413a00002000280244210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d13200441017422032005200320054b1b22034100480d130240024020040d002003102821040c010b200128020020042003102c21040b2004450d0b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a20063600002000280248210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d13200341017422002005200020054b1b22004100480d130240024020030d002000102821030c010b200128020020032000102c21030b2003450d0c20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102821040c010b200128020020032005102c21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200136020c200041016a2002410c6a10c8010c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d11200341017422052004200520044b1b22054100480d110240024020030d002005102821040c010b200128020020032005102c21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002002200136020c200041016a2002410c6a10c8010c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d10200341017422052004200520044b1b22054100480d100240024020030d002005102821040c010b200128020020032005102c21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002002200136020c200041016a2002410c6a10c80102400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d10200341017422052004200520044b1b22054100480d100240024020030d002005102821040c010b200128020020032005102c21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00213a00000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a00002002200136020c200041016a2002410c6a10c80102400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102821040c010b200128020020032005102c21040b2004450d0e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00213a00000b200241106a24000f0b200541011037000b200341011037000b200041011037000b200541011037000b200541011037000b200341011037000b200041011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b1031000bf40501027f4190ce0021024100210302400240024002400240024002400240024002400240024002400240024020012802000e15000e08080e01020304050607090e0e0a0e0c0e0e0e000b417f2102200141086a280200417f6a220141054b0d0a41012103024020010e060e0b0d000d0d0e0b41c09a0c21020c0d0b200141086a280200417f6a220141024b0d0941c0843d210241002103024020010e030d000d0d0b4101210341d0860321020c0c0b200141086a2d0000417f6a2201410c4b0d0841a0c21e21024100210302400240024020010e0d0e0e000001010e0e01020808080e0b4180b5182102410021030c0d0b41b0e32d2102410021030c0c0b4101210341f0930921020c0b0b41f093092102410021030c0a0b200141086a2d0000417f6a220141104b0d0641c096b102210241002103024002400240024020010e110d0d0101000d0d0d0101070702020203030d0b4101210341a0c21e21020c0c0b41c09a0c2102410021030c0b0b41a08d062102410021030c0a0b41a0c21e2102410021030c090b20012d0004417f6a220141034b0d054101210341a08d0621020240024020010e040a0a00010a0b41c096b10221020c090b41c09a0c21020c080b20012d0004417f6a220141034b0d044101210341a08d0621020240024020010e0409090001090b41c096b10221020c080b41c09a0c21020c070b200141086a280200417f6a220141094b0d0341a0cb98012102410021030240024020010e0a08080800080102020202080b41d0a5cc002102410021030c070b4180ade2042102410021030c060b410121030c040b41d086034190ce0020012d0004411d7441808080807e6a411d75417f4a1b2102410021030c040b200141086a280200417f6a220141024b0d0041a0c21e210241002103024020010e03040000040b4101210341a08d0621020c030b4190ce002102410021030c020b02402001280204417f6a220141024b0d00410121034100210220010e03020002020b410021030b4190ce0021020b200020033a0004200020023602000be6fe0109017f017e067f017e047f017e0a7f037e177f230041d0076b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e15000102031e1c1b1a191817160f0e0d0c0b0a090807000b200141106a29030021042001410c6a280200210520022d0001210620022d000021020240024002400240024002400240200141086a28020022070e0700060102030405000b200341d4066a4101360200200342013702c406200341ccd1c5003602c006200341043602e405200341c4d1c5003602e0052003200341e0056a3602d006200341c0066a4188a6c300103e000b2004a7210702400240200241ff01710d00200641ff01714101460d010b2007450d2d2005102a0c2d0b2007450d2a2005102a0c2a0b200220067241ff01710d2a410810282202450d09200220043700004198a6c300410a2002410810072002102a0c290b2004a721070240200220067241ff0171450d002007450d2a2005102a0c2a0b41a2a6c300410520052004422088a710072007450d282005102a0c280b2004422088a721082004a721090240200220067241ff0171450d0002402008450d00200841186c21062005210203400240200241046a280200450d002002280200102a0b0240200241106a280200450d002002410c6a280200102a0b200241186a2102200641686a22060d000b0b410121064100210a4105210820090d260c270b0240200841186c2202450d00200520026a21062005210203402002280200200241086a2802002002410c6a280200200241146a2802001007200241186a22022006470d000b0b02402008450d00200841186c21062005210203400240200241046a280200450d002002280200102a0b0240200241106a280200450d002002410c6a280200102a0b200241186a2102200641686a22060d000b0b410121064100210a4107210820090d250c260b2004422088a721082004a721090240200220067241ff0171450d0002402008450d002008410c6c21062005210203400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b410021064101210a410521082009450d260c250b02402008410c6c2202450d00200520026a21062005210203402002280200200241086a28020010092002410c6a22022006470d000b0b02402008450d002008410c6c21062005210203400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b410021064101210a4107210820090d240c250b200220067241ff01710d260c250b10f501000b024020022d00000d0020022d000141ff01714102470d00200141086a290300210420034180056a41086a22024200370300200342003703800541d8a1c600411320034180056a1008200341b8026a41086a2206200229030037030020032003290380053703b8020240200341b8026a41104101410041001003417f470d0020024200370300200342003703800541feb3c300410d20034180056a10082006200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a100621020240024020032802c0062206417f460d002002450d0020064108490d012002290000210b2002102a200b500d004200210b20034180056a41086a22024200370300200342003703800541feb3c300410d20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a10062102024020032802c0062206417f460d002002450d0020064108490d072002290000210b2002102a0b200b42dc0b7c2004560d050b20034180056a41086a22024200370300200342003703800541feb3c300410d20034180056a1008200341b8026a41086a2206200229030037030020032003290380053703b802200320043703c006200341b8026a4110200341c0066a4108100741012105200341013a00c00620024200370300200342003703800541d8a1c600411320034180056a10082006200229030037030020032003290380053703b802200341b8026a4110200341c0066a41011007200041023a0008410121060c2b0b41c4d1c3004133200341c8076a419cd9c3001038000b41c8adc3001032000b20004181043b01082000410f360204200041ea9fc6003602002000410a6a41003a00000c1a0b2001410c6a2802002105200141086a280200210c2001280204210d41ea9fc600210e410f210f20022d00000d1e20022d000141ff01714102470d1e20034180056a41086a22024200370300200342003703800541c8fbc500411720034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a10062102024002400240024020032802c0062206417f460d002002450d002006450d0120022d000021062002102a20064102460d002006410171450d0041a4cdc200210e411c210f0c220b200341013a00c00620034180056a41086a22024200370300200342003703800541c8fbc500411720034180056a1008200341b8026a41086a2206200229030037030020032003290380053703b802200341b8026a4110200341c0066a4101100710980121082002420037030020034200370380054193cdc200411120034180056a10082006200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a1006210202400240024020032802c0062206417f460d002002450d0020032006360294012003200236029001200341c0066a20034190016a107b20032802c0062207450d0520032902c406210402402006450d002002102a0b200320073602980302402004422088220ba722022004a7470d00200341c0066a21060c020b200341c0066a21060c020b4104210720034104360298034200210441002102200341c0066a21060b024020022004a7470d00200241016a220a2002490d1120024101742209200a2009200a4b1bad220b42c4007e2210422088a70d112010a7220a4100480d110240024020020d00200a102821070c010b2007200241c4006c200a102c21070b2007450d032003200736029803200442808080807083200b8421040b2004422088220ba721020b2007200241c4006c6a22022008360204200241003a000020022006290200370208200241106a200641086a290200370200200241186a200641106a290200370200200241206a200641186a290200370200200241286a200641206a290200370200200241306a200641286a290200370200200241386a200641306a290200370200200241c0006a200641386a280200360200200b422086200442ffffffff0f83844280808080107c2104200d200541f0006c6a2108024020050d00200d21070c200b200341e0056a417f6a210a20034193046a2111200341d7046a21122003419b056a2113200341c0066a41106a2114200341c0066a41086a211520034180056a41186a2116200d2107024003402007280204210220072802002106200341c0066a200741086a41e800109a051a200741f0006a21072002450d2120034190016a200341c0066a41e800109a051a200320023602c406200320063602c006201520034190016a41e800109a051a20032802980321171098012102200341e0056a200341c0066a10f60102400240024020032802c00622060d0041d6cdc200210e4110210f0c010b0240200620024d0d00411a210f41e6cdc200210e0c010b20034198046a2006417f6a10f701024020034198046a20144120109c05450d004119210f4180cec200210e0c010b024020032802c006221841002002417b6a2206200620024b1b4f0d004126210f4199cec200210e0c010b20172004422088220ba7220941c4006c22196a21052017210202400240201941cd01490d00201721020340024020022d00004101470d00200241016a2106200a2002460d032006200341e0056a4120109c05450d030b0240200241c4006a2d00004101470d00200241c5006a210620132002460d032006200341e0056a4120109c05450d030b024020024188016a2d00004101470d0020024189016a210620122002460d032006200341e0056a4120109c05450d030b0240200241cc016a2d00004101470d00200241cd016a210620112002460d032006200341e0056a4120109c05450d030b200520024190026a22026b41cc014b0d000b0b024020022005460d000340024020022d00004101470d00200241016a2106200a2002460d032006200341e0056a4120109c05450d030b2005200241c4006a2202470d000b0b410021060b20034198046a201810f70120034198046a200341e0056a4120109c052102200341b8036a41086a221a20034180056a41086a2205290200370300200341b8036a41106a20034180056a41106a221829020037030020032003290280053703b80341c0cdc200210e4116210f20060d2220020d010c220b200341b8036a41086a20034180056a41086a290200370300200341b8036a41106a20034180056a41106a29020037030020032003290280053703b8030c210b200341b8026a410e6a2206200341b8036a410e6a290100370100200341b8026a41086a220e201a290300370300200320032903b8033703b80220034198046a200341c0066a10f6012016420037030020184200370300200542003703002003420037038005024041c80010282202450d0020034198026a10f8012002410236022020024101360244200241186a20034198026a41186a290300370200200241106a20034198026a41106a290300370200200241086a20034198026a41086a290300370200200220032903980237020020022003290380053700242002412c6a2005290300370000200241346a20182903003700002002413c6a2016290300370000200320023602e00520034282808080203702e405200341e0056a10f901200341f8016a41086a220520034198046a41086a290300370300200341f8016a41106a221820034198046a41106a290300370300200341f8016a41186a220f20034198046a41186a290300370300200341e0056a41086a221a200e290300370300200341e0056a410e6a220e200629010037010020032003290398043703f801200320032903b8023703e0050240024020092004a7460d00200421100c010b200941016a22022009490d13200ba74101742206200220022006491bad221042c4007e220b422088a70d13200ba722064100480d130240024020090d002006102821020c010b201720192006102c21020b2002450d0320032002360298032004422088220ba721090b200328029803200941c4006c6a220241013a0000200f29030021042018290300211b2005290300211c20032903f801211d20024116360028200241c0cdc200360024200241003a00212002413a6a200e290100370000200241346a201a290300370000200220032903e00537002c2002201d370001200241096a201c370000200241116a201b370000200241196a2004370000201042ffffffff0f832104200b422086210b024020032802cc062206450d0020032802c4062102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102a0c030b2002410c6a280200450d02200241086a280200102a0c020b2002410c6a280200450d01200241086a280200102a0c010b200241086a280200450d00200241046a280200102a0b200241246a21022006415c6a22060d000b0b200b2004842104024020032802c806450d0020032802c406102a0b20044280808080107c210420072008470d010c230b0b41c80041041037000b200641041037000b41c4d1c3004133200341c8076a419cd9c3001038000b200a41041037000b41c4d1c3004133200341c8076a419cd9c3001038000b4190aec3001032000b41c4d1c3004133200341c8076a419cd9c3001038000b410841011037000b10d601000b10fa01000b200141246a280200211a200141206a280200210f2001411c6a280200210a200141186a2802002118200141146a2802002109200141106a28020021132001410c6a280200210e200141086a280200211920022d0001210620022d000021022001280204210820034190016a41386a200141e0006a29000037030020034190016a41306a200141d8006a29000037030020034190016a41286a200141d0006a29000037030020034190016a41206a200141c8006a29000037030020034190016a41186a200141c0006a29000037030020034190016a41106a200141386a29000037030020034190016a41086a200141306a2900003703002003200141286a2900003703900141ea9fc6002105410f21070240024020020d00200641ff01714102470d00024010fb01200f460d0041fb91c1002105411c21070c010b200341c0066a200f201a10fc0120032802c006220220032802c80641014100410010032106024020032802c406450d002002102a0b20034180056a41086a22024200370300200342003703800541c2e1c000410d20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a1006210202400240024002400240024002400240024002400240024020032802c0062205417f460d002002450d002003200536029c042003200236029804200341c0066a20034198046a107c20032802c006220c450d0220032902c40621042005450d012002102a0c010b420021044101210c0b02402006417f460d0041b392c1002105411521070c030b200c201a4105746a4100201a2004422088a7491b22120d0141c892c1002105411821070c020b41c4d1c3004133200341c8076a419cd9c3001038000b200341003602c806200342013703c00602400240024002400240410410282202450d0020034284808080c0003702c406200320023602c006200220083600002013200341c0066a10b4010240024020032802c406220620032802c80622026b2013490d0020032802c00621060c010b200220136a22052002490d16200641017422072005200720054b1b22054100480d160240024020060d002005102821060c010b20032802c00620062005102c21060b2006450d02200320053602c406200320063602c0060b2003200220136a3602c806200620026a20192013109a051a200a200341c0066a10b4012009200a410c6c6a2116200a450d0220092106034020062802002117200641086a2802002202200341c0066a10b4010240024020032802c406220720032802c80622056b2002490d0020032802c00621080c010b200520026a22082005490d172007410174220d2008200d20084b1b220d4100480d170240024020070d00200d102821080c010b20032802c0062007200d102c21080b2008450d052003200d3602c406200320083602c006200d21070b2003200520026a220d3602c806200820056a20172002109a051a2006410c6a22062016470d000c050b0b410441011037000b200541011037000b20032802c406210720032802c806210d0c010b200d41011037000b024002402007200d6b4104490d0020032802c00621020c010b200d41046a2202200d490d11200741017422062002200620024b1b22064100480d110240024020070d002006102821020c010b20032802c00620072006102c21020b2002450d03200320063602c406200320023602c006200621070b2003200d41046a22063602c8062002200d6a200f36000002400240200720066b41034d0d00200721050c010b200641046a22052006490d11200741017422082005200820054b1b22054100480d110240024020070d002005102821020c010b200220072005102c21020b2002450d04200320053602c406200320023602c0060b200220066a201a3600002002200d41086a20034190016a2012100a210602402005450d002002102a0b2006450d01419792c1002105411c21070b2004a7450d07200c102a0c070b201241086a290000210b201241106a29000021102012290000211b20034198026a41186a201241186a290000221c37030020034198026a41106a201037030020034198026a41086a200b3703002003201b37039802200341c9066a200b370000200341d1066a2010370000200341d9066a201c3700002003410e3a00c0062003201b3700c10641014100200341c0066a10cc01200341003602c806200342013703c0062013200341c0066a10b4010240024020032802c406220620032802c80622026b2013490d0020032802c00621060c010b200220136a22052002490d0f200641017422072005200720054b1b22054100480d0f0240024020060d002005102821060c010b20032802c00620062005102c21060b2006450d03200320053602c406200320063602c0060b2003200220136a3602c806200620026a20192013109a051a200a200341c0066a10b401200a450d0320092106034020062802002117200641086a2802002202200341c0066a10b4010240024020032802c406220820032802c80622056b2002490d0020032802c00621070c010b200520026a22072005490d102008410174220d2007200d20074b1b220d4100480d100240024020080d00200d102821070c010b20032802c0062008200d102c21070b2007450d062003200d3602c406200320073602c006200d21080b2003200520026a220d3602c806200720056a20172002109a051a2006410c6a22062016470d000c060b0b200641011037000b200541011037000b200541011037000b20032802c806210d20032802c406210820032802c00621070c010b200d41011037000b200341c0066a200f201a10fc0120032802c0062102200320032802c80636029c0420032002360298042007200d20034198046a10cb01024020032802c406450d002002102a0b02402008450d002007102a0b02402004a7450d00200c102a0b0240200e450d002019102a0b0240200a450d00200a410c6c21062009210203400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b02402018450d002009102a0b200041023a0008410021160c010b0240200e450d002019102a0b0240200a450d00200a410c6c21062009210203400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b02402018450d002009102a0b20004181243b01082000200736020420002005360200410021162000410a6a41003a00000b410121054101210641012107410121084101210a41012109410121174101210d410121184101210e4101210f410121190c2b0b2002411a6a2901002104200241196a2d00002119200241186a2d00002116200241166a2f0100211a200241156a2d00002113200241146a2d0000210c200241126a2f01002112200241116a2d00002111200241106a2d000021092002410e6a2f010021172002410d6a2d0000210d2002410c6a2d000021182002410a6a2f0100210e200241096a2d0000210f200241086a2d00002106200241066a2f01002105200241056a2d00002107200241046a2d00002115200241026a2f01002114200141216a290000210b200141206a2d0000211e2001411d6a2f0000211f2001411c6a2d00002120200141196a2f00002121200141186a2d00002122200141156a2f00002123200141146a2d00002124200141116a2f00002125200141106a2d000021262001410c6a2802002127200141086a280200210a20022d0001210820022d0000210220012d001f212820012d001b212920012d0017212a20012d0013212b024002400240024002400240024002400240024020012802040e0400010203000b200341c0066a41146a4101360200200342013702c406200341ccd1c5003602c006200341043602e405200341c4d1c5003602e0052003200341e0056a3602d006200341c0066a41b49dc400103e000b410420054108742006411874722007724104200841ff017141014622061b200241ff017122021b21050240024020020d0020060d010b410f210641ea9fc600210202400240024002400240024020050e070001020304050a000b200e410874200f7220184118747221022017410874200d7220094118747221060c090b410e210641dc9fc60021020c080b410c210641d09fc60021020c070b4109210641c79fc60021020c060b4113210641b49fc60021020c050b4111210641a39fc60021020c040b200320043703b004200320193a00af04200320163a00ae042003201a3b01ac04200320133a00ab042003200c3a00aa04200320123b01a804200320113a00a704200320093a00a604200320173b01a4042003200d3a00a304200320183a00a2042003200e3b01a0042003200f3a009f042003200536009b04200320153a009a04200320143b01980420034180056a41086a22024200370300200342003703800541e69dc400410820034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341c0066a200341b8026a411010fd010240024020032d00c0064101460d00200341a8016a420037030020034190016a41106a420037030020034190016a41086a420037030020034200370390010c010b200320032f00c1063b019001200320032d00c3063a009201200320032802c406360093012003200341c0066a41086a2d00003a0097012003200341d9066a2900003703a8012003200341c9066a290000370398012003200341d1066a2900003703a0010b024020034198046a20034190016a4120109c05450d0041c49dc4002102412221060c040b200341c0066a200a418801109a051a200341003b019001200341e0056a200341c0066a20034190016a10f40141012102024020032d00e80522064102460d00200341e9056a310000210b20033100ea05210420032802e405210720032802e005210541f19ec600410d100b02402006450d00200b100c0b2004100c410021022005450d0020052007100b0b200320023a00c2062003410d3b01c00641014100200341c0066a10cc01200a102a0c060b410420054108742006411874722007724104200841ff017141014622061b200241ff017122021b21050240024020020d0020060d010b410f210641ea9fc600210202400240024002400240024020050e070001020304050a000b200e410874200f7220184118747221022017410874200d7220094118747221060c090b410e210641dc9fc60021020c080b410c210641d09fc60021020c070b4109210641c79fc60021020c060b4113210641b49fc60021020c050b4111210641a39fc60021020c040b200320043703b004200320193a00af04200320163a00ae042003201a3b01ac04200320133a00ab042003200c3a00aa04200320123b01a804200320113a00a704200320093a00a604200320173b01a4042003200d3a00a304200320183a00a2042003200e3b01a0042003200f3a009f042003200536009b04200320153a009a04200320143b01980420034180056a41086a22024200370300200342003703800541e69dc400410820034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341c0066a200341b8026a411010fd010240024020032d00c0064101460d00200341a8016a420037030020034190016a41106a420037030020034190016a41086a420037030020034200370390010c010b200320032f00c1063b019001200320032d00c3063a009201200320032802c406360093012003200341c0066a41086a2d00003a0097012003200341d9066a2900003703a8012003200341c9066a290000370398012003200341d1066a2900003703a0010b024020034198046a20034190016a4120109c05450d0041ee9dc4002102413121060c050b0240200a41ff01714101460d00200a4118762105200a41087621070c020b200341c0066a202741067610fe0120032802c00621060240024020032802c8062027413f7122024b0d00410021020c010b200620024105746a2202290018210b20022d0017211e20022d0016212820022f0014211f20022d0013212020022d0012212920022f0010212120022d000f212220022d000e212a20022f000c212320022d000b212420022d000a212b20022f0008212520022d000721262002280003212720022d0002210520022f00002107410121020b024020032802c406450d002006102a0b20020d0141dc9fc6002102410e21060c040b2001412c6a280200212c410420054108742007722006411874724104200841ff017141014622061b200241ff017122021b210502400240024020020d0020060d010b410f210641ea9fc600210202400240024002400240024020050e0700010203040507000b200e410874200f7220184118747221022017410874200d7220094118747221060c060b410e210641dc9fc60021020c050b410c210641d09fc60021020c040b4109210641c79fc60021020c030b4113210641b49fc60021020c020b4111210641a39fc60021020c010b200320043703b004200320193a00af04200320163a00ae042003201a3b01ac04200320133a00ab042003200c3a00aa04200320123b01a804200320113a00a704200320093a00a604200320173b01a4042003200d3a00a304200320183a00a2042003200e3b01a0042003200f3a009f042003200536009b04200320153a009a04200320143b01980420034180056a41086a22024200370300200342003703800541e69dc400410820034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341c0066a200341b8026a411010fd010240024020032d00c0064101460d00200341a8016a420037030020034190016a41106a420037030020034190016a41086a420037030020034200370390010c010b200320032f00c1063b019001200320032d00c3063a009201200320032802c406360093012003200341c0066a41086a2d00003a0097012003200341d9066a2900003703a8012003200341c9066a290000370398012003200341d1066a2900003703a0010b024020034198046a20034190016a4120109c05450d0041c49dc4002102412221060c010b4101210602400240200a41ff01714101460d00200a4118762105200a41087621020c010b200341c0066a202741067610fe0120032802c00621070240024020032802c8062027413f7122024b0d00410021080c010b200720024105746a2202290018210b20022d0017211e20022d0016212820022f0014211f20022d0013212020022d0012212920022f0010212120022d000f212220022d000e212a20022f000c212320022d000b212420022d000a212b20022f0008212520022d000721262002280003212720022d0002210520022f00002102410121080b024020032802c406450d002007102a0b20080d0041dc9fc6002102410e21060c010b200341c0066a202c418801109a051a200341aa016a200b370100200341a9016a201e3a0000200341a8016a20283a0000200341a6016a201f3b0100200341a5016a20203a0000200341a4016a20293a0000200341a2016a20213b0100200341a1016a20223a0000200341a0016a202a3a00002003419e016a20233b010020034190016a410d6a20243a00002003419c016a202b3a00002003419a016a20253b010020034190016a41096a20263a00002003202736009501200320053a009401200320023b01920120034180023b019001200341e0056a200341c0066a20034190016a10f401024020032d00e80522024102460d00200341e0056a41096a310000210b20033100ea05210420032802e405210720032802e005210541f19ec600410d100b02402002450d00200b100c0b2004100c410021062005450d0020052007100b0b200320063a00c2062003418d043b01c00641014100200341c0066a10cc01202c102a0c050b202c106a202c102a0c020b20034180056a41086a22064200370300200342003703800541e69dc400410820034180056a1008200341b8026a41086a2208200629030037030020032003290380053703b802200341c0066a200341b8026a411010fd01200341c0066a41086a2d0000210a200341c9066a22092f00002117200341cb066a2d0000210d200341cc066a22182d0000210e200341cd066a220f2f00002119200341cf066a2d00002116200341c0066a41106a221a2d00002113200341d1066a220c2f00002112200341d3066a2d00002111200341d4066a22152d00002114200341d5066a222c2f0000212d200341d7066a2d0000212e200341d8066a222f2d0000213020032f00c106213120032d00c306213220032802c4062133200341da066a200341d9066a2234290000420020032d00c00641014622021b37010020342030410020021b3a0000202f202e410020021b3a0000200341d6066a202d410020021b3b0100202c2014410020021b3a000020152011410020021b3a0000200341d2066a2012410020021b3b0100200c2013410020021b3a0000201a2016410020021b3a0000200341ce066a2019410020021b3b0100200f200e410020021b3a00002018200d410020021b3a0000200341ca066a2017410020021b3b01002009200a410020021b3a000020032033410020021b3600c50620032032410020021b3a00c40620032031410020021b3b01c2062003418d023b01c00641014100200341c0066a10cc012003200b3703d8062003201e3a00d706200320283a00d6062003201f3b01d406200320203a00d306200320293a00d206200320213b01d006200320223a00cf062003202a3a00ce06200320233b01cc06200320243a00cb062003202b3a00ca06200320253b01c806200320263a00c706200320273600c306200320053a00c206200320073b01c00620064200370300200342003703800541e69dc400410820034180056a10082008200629030037030020032003290380053703b80220034110360294012003200341b8026a36029001200341c0066a20034190016a10ff010c030b200a106a200a102a0b2002450d010b20004181223b01082000200636020420002002360200410021192000410a6a41003a00000c010b200041023a0008410021190b410121054101210641012107410121084101210a41012109410121174101210d410121184101210e4101210f0c290b200341c0066a200141086a418001109a051a20034190016a41206a200241206a29020037030020034190016a41186a200241186a29020037030020034190016a41106a200241106a29020037030020034190016a41086a200241086a290200370300200320022902003703900120034188016a200341c0066a20034190016a1080020240024020032802880122020d00200041023a00084100210f0c010b200328028c01210620004181203b0108200020023602004100210f2000410a6a41003a0000200020063602040b410121054101210641012107410121084101210a41012109410121174101210d410121184101210e410121190c280b200341b8036a41086a22092001411c6a290200370300200341b8036a41106a2217200141246a290200370300200341b8036a41186a220d2001412c6a2802003602002003200141146a2902003703b803200241086a28020021062001410c6a280200210a410e2105200241046a280200210820022d000021070240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141086a2802000e0400010203000b200341c0066a41146a4101360200200342013702c406200341ccd1c5003602c006200341043602e405200341c4d1c5003602e0052003200341e0056a3602d006200341c0066a41e4c4c200103e000b200641107621182006410876210e200141386a290300210b200141306a29030021042002411a6a2901002110200241196a2d00002113200241186a2d0000210c200241166a2f01002112200241156a2d00002111200241146a2d00002115200241126a2f01002114200241116a2d00002127200241106a2d0000210f2002410e6a2f010021192002410d6a2d000021162002410c6a2d0000211a200241026a2f0100211e200141106a280200210520022d0001210220034198046a41186a200d28020036020020034198046a41106a201729030037030020034198046a41086a2009290300370300200320032903b80337039804410420084108762006411874724104200241014622091b200741ff017122021b21060240024020020d0020090d010b410f210541ea9fc600210202400240024002400240024020060e0700010203040516000b200e41ff0171201841087472201a4118747221022019410874201672200f4118747221050c150b410e210541dc9fc60021020c140b410c210541d09fc60021020c130b4109210541c79fc60021020c120b4113210541b49fc60021020c110b4111210541a39fc60021020c100b200320103703a801200320133a00a7012003200c3a00a601200320123b01a401200320113a00a301200320153a00a201200320143b01a001200320273a009f012003200f3a009e01200320193b019c01200320163a009b012003201a3a009a01200320183b0198012003200e3a0097012003200636009301200320083a0092012003201e3b019001200341c0066a41186a220220034198046a41186a280200360200200341c0066a41106a220720034198046a41106a290300370300200341c0066a41086a220820034198046a41086a29030037030020032003290398043703c0060240200a41ff01714101460d00200a4108762106200341e0056a41186a20022d00003a0000200341e0056a41106a2007290300370300200341e0056a41086a2008290300370300200320032903c0063703e0050c0f0b20034198026a200541067610fe0120032802980221070240024020032802a0022005413f7122024b0d00410021020c010b200341e8056a200720024105746a2202410f6a290000370300200341e0056a41106a200241176a290000370300200341f8056a2002411f6a2d00003a0000200320022900073703e00520022f0000200241026a2d000041107472210620022800032105410121020b0240200328029c02450d002007102a0b20020d0e200341b8026a41086a20034180056a41086a290000370300200341b8026a41106a20034180056a41106a29000037030041dc9fc6002102410e21050c0f0b41a6f5c5002102200741ff01714101470d0f20064102490d0f200841ff01710d0f411210282202450d01200241106a41002f008086423b0000200241086a41002900f88542370000200241002900f08542370000200241124124102c2202450d022002200a36001220034198026a41186a2206420037030020034198026a41106a2205420037030020034198026a41086a2207420037030020034200370398022002411620034198026a1000200341f8016a41186a2006290300370300200341f8016a41106a2005290300370300200341f8016a41086a200729030037030020032003290398023703f8012002102a200341003602c006200341f8016a4120200341c0066a1006210220032802c0062206417f460d092002450d09200320063602bc02200320023602b802200341c0066a200341b8026a10810220032903c0064201510d0320032802c806210520034198046a200341cc066a41dc00109a051a02402006450d002002102a0b200341c0066a20034198046a41dc00109a051a200341f8016a41201009410121020c0a0b41a6f5c5002102200741ff01714101470d0e20064104490d0e200841ff01710d0e411210282202450d03200241106a41002f008086423b0000200241086a41002900f88542370000200241002900f08542370000200241124124102c2202450d042002200a36001220034198026a41186a2206420037030020034198026a41106a2205420037030020034198026a41086a2207420037030020034200370398022002411620034198026a1000200341f8016a41186a2006290300370300200341f8016a41106a2005290300370300200341f8016a41086a200729030037030020032003290398023703f8012002102a200341f8016a41204101410041001003417f460d0a20034180056a41086a2202420037030020034200370380054181a2c600411220034180056a1008200341b8026a41086a200229030037030020032003290380053703b80241002102200341003602c006200341b8026a4110200341c0066a100621060240024020032802c0062205417f470d000c010b024020060d000c010b20032005360294012003200636029001200341c0066a20034190016a10820120032802c0062202450d0620032902c40621042005450d002006102a0b2002410420021b210d02402004420020021b2204422088220ba722022004a7470d00200241016a22062002490d19200ba722074101742205200620062005491b220641ffffffff03712006470d19200641027422054100480d190240024020020d0020051028210d0c010b200d20074102742005102c210d0b200d450d072004422088220ba721022006ad21040b200d20024102746a200a36020020034180056a41086a2202420037030020034200370380054181a2c600411220034180056a1008200341b8026a41086a200229030037030020032003290380053703b8020240200d0d00200341b8026a411010090c100b200341003602c806200342013703c006200ba741016a2206200341c0066a10b4010240024020060d0020032802c806210a20032802c406210820032802c00621060c010b410020032802c80622026b2105200d20064102746a211720032802c4062108200d210703402007280200210902400240200820056a4104490d0020032802c00621060c010b200241046a22062002490d1b2008410174220a2006200a20064b1b220a4100480d1b0240024020080d00200a102821060c010b20032802c0062008200a102c21060b2006450d0a2003200a3602c406200320063602c006200a21080b2003200241046a220a3602c806200620026a20093600002005417c6a2105200a21022017200741046a2207470d000b0b2004a72102200341b8026a41102006200a100702402008450d002006102a0b2002450d0f200d102a0c0f0b411241011037000b412441011037000b41c4d1c3004133200341c8076a419cd9c3001038000b411241011037000b412441011037000b41c4d1c3004133200341c8076a419cd9c3001038000b200541041037000b200a41011037000b410021020b200341e0056a200341c0066a41dc00109a051a200341c0066a200341e0056a41dc00109a051a20020d010b418ec5c2002102411921050c030b20034180056a200341c0066a41dc00109a051a200320053602900120034190016a41047220034180056a41dc00109a051a200341f8006a200341b0016a20032903a001200341a8016a29030010820220032903782104200320034180016a2903003703c806200320043703c0062003200341c0066a3602980420034198046a109d010c030b200341e0006a2004200b42c0843d420010a005200341d0006a20032903602210200341e0006a41086a290300221b42c0fb42427f109f05200341c0006a2010201b42d086034200109f0520034198036a41086a200341e0056a41086a29030037030020034198036a41106a200341e0056a41106a29030037030020034198036a41186a200341e0056a41186a2d00003a0000200320032903e00522103703b8022003201037039803200341f0006a20034190016a2003290340221b200420032903507c42148042ffffffff0f837c2210428080e983b1de162010428080e983b1de1656200341c0006a41086a2903002010201b54ad7c22104200522010501b22021b221b2010420020021b221010830202402003280270450d0041f4c4c2002102411a21050c010b20034180056a41086a22024200370300200342003703800541eba1c600411620034180056a1008200341b8026a41086a200229030037030020032003290380053703b80241002107200341003602c006200341b8026a4110200341c0066a10062102024020032802c0062208417f460d002002450d0020084104490d04200228000021072002102a0b20034180056a41086a22024200370300200342003703800541eba1c600411620034180056a1008200341b8026a41086a200229030037030020032003290380053703b8022003200741016a3602c006200341b8026a4110200341c0066a41041007200341f8066a20034190016a41186a290300370300200341f0066a20034190016a41106a290300370300200341e8066a20034190016a41086a29030037030020034183076a200536000020034187076a2003290398033700002003418f076a20034198036a41086a29030037000020034197076a20034198036a41106a2903003700002003419f076a20034198036a41186a2d00003a0000200320063b01800720034182076a20064110763a00002003200b3703c806200320043703c00620032003290390013703e006200341c0066a41186a20103703002003201b3703d006411210282202450d04200241106a41002f008086423b0000200241086a41002900f88542370000200241002900f08542370000200241124124102c2202450d052002200736001220034198026a41186a2206420037030020034198026a41106a2205420037030020034198026a41086a2208420037030020034200370398022002411620034198026a1000200341f8016a41186a2006290300370300200341f8016a41106a2005290300370300200341f8016a41086a200829030037030020032003290398023703f8012002102a200341003602e805200342013703e005200341e0066a200341e0056a108f01200341c0066a41086a290300210420032903c006210b0240024020032802e405220620032802e80522026b4110490d0020032802e00521060c010b200241106a22052002490d0c200641017422022005200220054b1b22024100480d0c0240024020060d002002102821060c010b20032802e00520062002102c21060b2006450d07200320023602e405200320063602e00520032802e80521020b200620026a220620043700082006200b3700002003200241106a3602e80520034180076a200341e0056a108f01200341d8066a290300210420032903d006210b0240024020032802e405220520032802e80522066b4110490d0020032802e00521020c010b200641106a22022006490d0c200541017422062002200620024b1b22084100480d0c0240024020050d002008102821020c010b20032802e00520052008102c21020b2002450d08200320083602e405200320023602e00520032802e8052106200821050b200220066a220820043700082008200b370000200341f8016a41202002200641106a100702402005450d002002102a0b200341cc066a200736020041002102200341c8066a41003a00002003410b3a00c00641014100200341c0066a10cc010b2002450d010b200041811e3b010820002005360204200020023602002000410a6a41003a00000c160b200041023a00080c150b41c4d1c3004133200341c8076a419cd9c3001038000b411241011037000b412441011037000b200241011037000b200841011037000b200141086a28020021062001280204210502400240024020022d00000d0020022d000141ff01714101460d010b02402006450d002005102a0b200041811c3b010820004113360204200041b49fc6003602004100210e2000410a6a41003a00000c010b02402006450d002005102a0b200041023a00084100210e0b410121054101210641012107410121084101210a41012109410121174101210d410121180c250b02400240024020022d00000d0020022d000141ff01714102470d002001280204210220034180056a41086a220642003703002003420037038005418194c100411020034180056a1008200341b8026a41086a200629030037030020032003290380053703b802200341b8026a41104101410041001003417f470d011098012002490d0220034180056a41086a220642003703002003420037038005418194c100411020034180056a1008200341b8026a41086a200629030037030020032003290380053703b802200320023602c006200341b8026a4110200341c0066a41041007200041023a00080c110b200041811a3b01082000410f360204200041ea9fc6003602002000410a6a41003a00000c100b41a894c1001032000b41bc95c1001032000b200341b8036a41026a2205200141076a2d00003a000020034190016a41086a22072001411c6a29020037030020034190016a41106a220a200141246a29020037030020034190016a41186a2001412c6a290200370300200341b0016a200141346a290200370300200341b8016a2001413c6a290200370300200341c0016a200141c4006a2d00003a0000200320012f00053b01b8032003200141146a29020037039001200141086a28020021082001410c6a2802002109200141106a280200210620022f0001200241036a2d000041107472210d2002410c6a2802002118200241086a280200210e200241046a280200210f20022d0000210202400240024002400240024002400240024002400240024020012d000422170e050001020304000b200341c0066a41146a4101360200200342013702c406200341ccd1c5003602c006200341043602e405200341c4d1c5003602e0052003200341e0056a3602d006200341c0066a41e8cfc300103e000b200341af046a2007290300370000200341b7046a200a2d00003a0000200320032f01b8033b019804200320063600a3042003200936009f042003200836009b0420032003290390013700a704200320052d00003a009a04024002402002417f6a220641024b0d00024020060e03000102000b200e41017420184d0d00200f41ff0171450d010b2002200d7241ff0171450d0041a3d0c3002105410a2118410021060c0e0b20034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a1006210202400240024002400240024002400240024020032802c0062206417f460d002002450d00200320063602e405200320023602e005200341c0066a200341e0056a106d20032802c006220a450d0c20032902c406210420032802c406211802402006450d002002102a0b2003200a3602e0052004a7210e410021022004422088a7220d41014b0d02200d0e020103010b4101210a200341013602e005410021184100210e0b200341f8016a41186a20034198046a41186a290300370300200341f8016a41106a20034198046a41106a290300370300200341f8016a41086a20034198046a41086a29030037030020032003290398043703f8014100210d200341f8016a2106410021050c020b200d210603402006410176220520026a22072002200a20074105746a20034198046a4120109c054101481b2102200620056b220641014b0d000b0b0240200a20024105746a20034198046a4120109c0522060d004193d0c3002105200e450d05200a102a0c050b200341f8016a41186a20034198046a41186a290300370300200341f8016a41106a20034198046a41106a290300370300200341f8016a41086a20034198046a41086a29030037030020032003290398043703f8012006411f7620026a2205200d4b0d01200341f8016a21060b200d200e460d012018210e0c020b41f8b0c0001032000b02402018200d460d002018210e0c010b201841016a22022018490d0c201841017422072002200720024b1b220e41ffffff3f71200e470d0c200e41057422024100480d0c0240024020180d0020021028210a0c010b200a20184105742002102c210a0b200a450d062003200a3602e0050b200a20054105746a220241206a2002200d20056b410574109b051a200241186a200641186a290000370000200241106a200641106a290000370000200241086a200641086a2900003700002002200629000037000020034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b80220032802e0052102200341003602c806200342013703c006200d41016a2207200341c0066a10b40102402007200d490d00200d41057441206a210603402002200341c0066a108f01200241206a2102200641606a22060d000b0b20032802c4062102200341b8026a411020032802c006220620032802c806100702402002450d002006102a0b200341c0066a41186a20034198046a41186a290300370300200341c0066a41106a20034198046a41106a290300370300200341c0066a41086a20034198046a41086a29030037030020032003290398043703c006410021054101410020032802e00522022007108402200341093b01c00641014100200341c0066a10cc01200e450d002002102a0b41102118410021060c0d0b200341af046a2007290300370000200341b7046a200a2d00003a0000200320032f01b8033b019804200320063600a3042003200936009f042003200836009b0420032003290390013700a704200320052d00003a009a04024002402002417f6a220641024b0d00024020060e03000102000b200e41017420184d0d00200f41ff0171450d010b2002200d7241ff0171450d0041a3d0c3002105410a2118410021060c0d0b20034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a100621020240024020032802c0062206417f460d002002450d00200320063602e405200320023602e005200341c0066a200341e0056a106d20032802c006220a450d0620032902c40621042006450d012002102a0c010b420021044101210a0b41002102024002400240024002402004422088a7220d41014b0d00200d0e020201020b200d210603402006410176220520026a22072002200a20074105746a20034198046a4120109c054101481b2102200620056b220641014b0d000b0b200a20024105746a20034198046a4120109c05450d010b41add0c3002105410c21182004a7450d01200a102a410021060c0e0b2002200d4f0d06200a20024105746a2206200641206a2002417f73200d6a410574109b051a20034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c806200342013703c006200d417f6a2205200341c0066a10b40102402005450d00200d41057441606a2106200a210203402002200341c0066a108f01200241206a2102200641606a22060d000b0b20032802c4062102200341b8026a411020032802c006220620032802c806100702402002450d002006102a0b200341c0066a41186a20034198046a41186a290300370300200341c0066a41106a20034198046a41106a290300370300200341c0066a41086a20034198046a41086a29030037030020032003290398043703c006200341c0066a4101200a200510840220034189023b01c0064100210541014100200341c0066a10cc0102402004a7450d00200a102a0b0b410021060c0c0b200341f7056a2007290300370000200341ff056a200a2d00003a0000200320032f01b8033b01e005200320063600eb05200320093600e705200320083600e30520032003290390013700ef05200320052d00003a00e20520034198046a41186a200341b9016a29000037030020034198046a41106a200341b1016a29000037030020034198046a41086a200341a9016a290000370300200320032900a10137039804024002402002417f6a220641024b0d00024020060e03000102000b200e41017420184d0d00200f41ff0171450d010b2002200d7241ff0171450d0041a3d0c3002105410a2118410021060c0c0b02400240200341e0056a20034198046a4120109c050d00410021050c010b20034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a100621020240024020032802c0062206417f460d002002450d0020032006360284052003200236028005200341c0066a20034180056a106d20032802c006220d450d0820032902c40621042006450d012002102a0c010b4101210d420021040b41add0c3002105410c211841002102024002402004422088a7220e41014b0d00200e0e020c010c0b200e210603402006410176220720026a220a2002200d200a4105746a200341e0056a4120109c054101481b2102200620076b220641014b0d000b0b200d20024105746a2206200341e0056a4120109c050d0a20034198026a41186a220520034198046a41186a29030037030020034198026a41106a220720034198046a41106a29030037030020034198026a41086a220a20034198046a41086a2903003703002003200329039804370398022002200e4f0d072006200329039802370000200641186a2005290300370000200641106a2007290300370000200641086a200a290300370000410021020240200e4101460d0041002102200e210603402006410176220520026a22072002200d20074105746a20034198046a4120109c054101481b2102200620056b220641014b0d000b0b0240200d20024105746a20034198046a4120109c050d004193d0c3002105411021180c0b0b200d200e10f00120034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c806200342013703c006200e200341c0066a10b4010240200e450d00200e4105742106200d210203402002200341c0066a108f01200241206a2102200641606a22060d000b0b20032802c4062102200341b8026a411020032802c006220620032802c806100702402002450d002006102a0b200341c0066a41186a200341e0056a41186a290300370300200341c0066a41106a200341e0056a41106a290300370300200341c0066a41086a200341e0056a41086a290300370300200320032903e0053703c006200341c0066a4101200d200e10840220034189043b01c0064100210541014100200341c0066a10cc012004a7450d00200d102a0b0c0a0b024002402002417f6a220541024b0d00024020050e03000102000b200e41017420184d0d00200f41ff0171450d010b2002200d7241ff0171450d0002402009450d002008102a0b41a3d0c3002105410a21180c0c0b2008200610f00120034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c006200341b8026a4110200341c0066a100621050240024020032802c0062207417f460d002005450d002003200736029c042003200536029804200341c0066a20034198046a106d20032802c0062202450d0820032902c40621042007450d012005102a0c010b42002104410121020b2008200620022004422088a710850202402004a7450d002002102a0b20034180056a41086a22024200370300200342003703800541f8cfc300411b20034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341003602c806200342013703c0062006200341c0066a10b40102402006450d00200641057421062008210203402002200341c0066a108f01200241206a2102200641606a22060d000b0b20032802c4062102200341b8026a411020032802c006220620032802c806100702402002450d002006102a0b02402009450d002008102a0b20034189063b01c006410021054101210641014100200341c0066a10cc010c0a0b41c4d1c3004133200341c8076a419cd9c3001038000b200241011037000b41c4d1c3004133200341c8076a419cd9c3001038000b41b0b1c0001032000b41c4d1c3004133200341c8076a419cd9c3001038000b41bcd0c3002002200e1034000b41c4d1c3004133200341c8076a419cd9c3001038000b1031000b2004a7450d00200d102a410021060c010b410021060b0240024002402017417f6a220241034b0d00024020020e0403030300030b200620094572450d010c020b20174104490d012009450d010b2008102a0b20050d00200041023a0008410021180c010b20004181183b01082000201836020420002005360200410021182000410a6a41003a00000b410121054101210641012107410121084101210a41012109410121174101210d0c1c0b200341c0066a41386a200141c0006a290300370300200341c0066a41306a200141386a290300370300200341c0066a41286a200141306a290300370300200341c0066a41206a200141286a290300370300200341c0066a41186a200141206a290300370300200341c0066a41106a200141186a290300370300200341c0066a41086a200141106a2903003703002003200141086a2903003703c00620034190016a41206a200241206a29020037030020034190016a41186a200241186a29020037030020034190016a41106a200241106a29020037030020034190016a41086a200241086a2902003703002003200229020037039001200341386a200341c0066a20034190016a10860202400240200328023822020d00200041023a00084100210d0c010b200328023c210620004181163b0108200020023602004100210d2000410a6a41003a0000200020063602040b410121054101210641012107410121084101210a41012109410121170c1a0b20034190016a41206a200141246a29020037030020034190016a41186a2001411c6a29020037030020034190016a41106a200141146a29020037030020034190016a41086a2001410c6a2902003703002003200129020437039001200341c0066a41206a200241206a290200370300200341c0066a41186a200241186a290200370300200341c0066a41106a200241106a290200370300200341c0066a41086a200241086a290200370300200320022902003703c006200341306a20034190016a200341c0066a10870202400240200328023022020d00200041023a0008410021170c010b2003280234210620004181143b010820002002360200410021172000410a6a41003a0000200020063602040b410121054101210641012107410121084101210a410121090c180b20034190016a41206a200141246a29020037030020034190016a41186a2001411c6a29020037030020034190016a41106a200141146a29020037030020034190016a41086a2001410c6a2902003703002003200129020437039001200341c0066a41206a200241206a290200370300200341c0066a41186a200241186a290200370300200341c0066a41106a200241106a290200370300200341c0066a41086a200241086a290200370300200320022902003703c006200341286a20034190016a200341c0066a10880202400240200328022822020d00200041023a0008410021090c010b200328022c210620004181123b010820002002360200410021092000410a6a41003a0000200020063602040b410121054101210641012107410121084101210a0c160b200341c0066a41286a200141306a290300370300200341c0066a41206a200141286a290300370300200341c0066a41186a200141206a290300370300200341c0066a41106a200141186a290300370300200341c0066a41086a200141106a2903003703002003200141086a2903003703c00620034190016a41206a200241206a29020037030020034190016a41186a200241186a29020037030020034190016a41106a200241106a29020037030020034190016a41086a200241086a2902003703002003200229020037039001200341206a200341c0066a20034190016a10890202400240200328022022020d00200041023a00084100210a0c010b2003280224210620004181103b0108200020023602004100210a2000410a6a41003a0000200020063602040b410121054101210641012107410121080c140b200141086a28020021162001280204211a200341c0066a2001410c6a41e400109a051a2002411a6a2901002104200241196a2d00002118200241186a2d0000210e200241166a2f0100210f200241156a2d00002119200241146a2d00002113200241126a2f0100210c200241116a2d00002112200241106a2d000021072002410e6a2f010021082002410d6a2d0000210a2002410c6a2d000021092002410a6a2f01002117200241096a2d0000210d200241046a2d00002111200241026a2f01002115200241056a280000210520022d0000210620022d00012102200341b8026a200341c0066a41046a41e000109a051a410420054104200241014622021b20061b21050240024002400240024020060d0020020d010b410f210641ea9fc600210202400240024002400240024020050e0700010203040507000b2017410874200d7220094118747221022008410874200a7220074118747221060c060b410e210641dc9fc60021020c050b410c210641d09fc60021020c040b4109210641c79fc60021020c030b4113210641b49fc60021020c020b4111210641a39fc60021020c010b2003200437039805200320183a0097052003200e3a0096052003200f3b019405200320193a009305200320133a0092052003200c3b019005200320123a008f05200320073a008e05200320083b018c052003200a3a008b05200320093a008a05200320173b0188052003200d3a0087052003200536008305200320113a008205200320153b018005024002400240024002400240410e10282202450d002002410029008aaf44370000200241066a4100290090af443700002003428e808080e00137029401200320023602900120034180056a20034190016a108f012003280298012102200328029001210620034198026a41186a2205420037030020034198026a41106a2207420037030020034198026a41086a2208420037030020034200370398022006200220034198026a1000200341f8016a41186a2005290300370300200341f8016a41106a2007290300370300200341f8016a41086a200829030037030020032003290398023703f8010240200328029401450d00200328029001102a0b2003410036029001200341f8016a412020034190016a100621022003280290012206417f460d022002450d022003200636029c02200320023602980220034190016a20034198026a108a0220032802b0012217450d0120034198046a41086a2205200341c0016a29030037030020034198046a41106a2207200341c8016a29030037030020034198046a41186a2208200341d0016a29030037030020034198046a41206a220a200341d8016a2802003602002003200341b8016a2903003703980420032802b401210902402006450d002002102a0b200341e0056a41086a20052903002204370300200341e0056a41106a2007290300220b370300200341e0056a41186a20082903002210370300200341e0056a41206a200a28020022023602002003200329039804221b3703e00520034190016a41106a200b37030020034190016a41086a200437030020034190016a41186a201037030020034190016a41206a2002360200200341f8016a41086a2003419c016a290200370300200341f8016a41106a200341a4016a290200370300200341f8016a41186a200341ac016a2902003703002003201b3703900120032003290294013703f80102402009450d002017102a0b20034198036a41086a200341f8016a41086a29030037030020034198036a41106a200341f8016a41106a29030037030020034198036a41186a200341f8016a41186a290300370300200320032903f80137039803200341b8036a200341b8026a41e000109a051a20034198026a20034198036a108b0220032802a0022106200328029802210220034100360290012002200620034190016a100621062003280290012205417f460d042006450d042003200536028405200320063602800520034190016a20034180056a10e80120032d0090014101460d03200341e0056a20034190016a41017241e000109a051a02402005450d002006102a0b20034180056a200341e0056a41e000109a051a20034190016a20034180056a41e000109a051a200341013a00980420034198046a41017220034190016a41e000109a051a0c050b410e41011037000b41c4d1c3004133200341c8076a419cd9c3001038000b41a5c4c2002102412721060c030b41c4d1c3004133200341c8076a419cd9c3001038000b20034190016a20034180056a41e000109a051a200341003a0098040b0240200328029c02450d002002102a0b200341b9046a2112200341d9046a2111200341b8036a41206a2113200341f8036a210c20034198046a410172211520034190016a41017221054104210741e7e485f30621060240024003400240024002400240200641e9dabdf30646220f0d000240200641e7e485f306470d00200341b8036a210a0c020b200641e2c289ab06470d022013210a0c010b200c210a0b41202102410021084120102822090d01412041011037000b41012108410021024101210a410121090b2009200a2002109a052109200320023602a402200320023602a0022003200936029c022003200636029802200341f8016a20034198026a108c0220034190016a20032802f801221720032802800210fd0120034180056a41086a220d200541086a29000037030020034180056a41106a2218200541106a29000037030020034180056a41186a220e200541186a29000037030020032005290000370380050240024020032d0090014101470d00200341e0056a41186a2219200e290300370300200341e0056a41106a220e2018290300370300200341e0056a41086a2218200d29030037030020032003290380053703e005024020032802fc01450d002017102a0b024020080d002009102a0b20034190016a41186a201929030037030020034190016a41106a200e29030037030020034190016a41086a2018290300370300200320032903e0053703900120034190016a20034198036a4120109c05450d0141ccc4c2002102411821060c050b024020032802fc01450d002017102a0b20080d002009102a0b0240024020032d0098044101470d00024002400240200641e2c289ab06460d00200f0d010240200641e7e485f306460d0041002109410121170c030b41202109201521170c020b41202109201221170c010b41202109201121170b024020022009470d00200a2017460d02200a20172002109c05450d020b0240024020090d004100210d410121180c010b2009210d200910282218450d040b201820172009109a0521172003200936029c012003200d3602980120032017360294012003200636029001200341e0056a20034190016a108c0220032802e005220920032802e8051009024020032802e405450d002009102a0b200d450d002017102a0b41012109024020080d00200210282209450d040b2009200a2002109a05210a2003200236029c0120032002360298012003200a360294012003200636029001200341e0056a20034190016a108c0220032802e0052102200320032802e80536028405200320023602800520034198036a20034180056a10ff01024020032802e405450d002002102a0b20080d00200a102a0b02402007410c460d00200741f8c8c0006a2800002106200741046a21070c010b0b200341e0056a20034198036a108b0220032802e805210620032802e005210220034100360298012003420137039001200341b8036a20034190016a108f01201320034190016a108f01200c20034190016a108f012003280294012105200220062003280290012207200328029801100702402005450d002007102a0b024020032802e405450d002002102a0b2016450d03201a102a0c030b200941011037000b200241011037000b02402016450d00201a102a0b2002450d00200041810e3b01082000200636020420002002360200410021082000410a6a41003a00000c010b200041023a0008410021080b4101210541012106410121070c120b200341c0066a41306a200141386a290300370300200341c0066a41286a200141306a290300370300200341c0066a41206a200141286a290300370300200341c0066a41186a200141206a290300370300200341c0066a41106a200141186a290300370300200341c0066a41086a200141106a2903003703002003200141086a2903003703c00620034190016a41206a200241206a29020037030020034190016a41186a200241186a29020037030020034190016a41106a200241106a29020037030020034190016a41086a200241086a2902003703002003200229020037039001200341186a200341c0066a20034190016a108d0202400240200328021822020d00200041023a0008410021070c010b200328021c2106200041810c3b010820002002360200410021072000410a6a41003a0000200020063602040b41012105410121060c100b200141256a2900002110200141246a2d0000211a200141216a2f00002113200141206a2d0000210c2001411d6a2f000021122001411c6a2d00002111200141196a2f00002109200141186a2d00002117200141156a2f0000210d200141146a2d00002118200141106a28020021052001410d6a2f0000210e2001410c6a2d00002127200141086a2802002107200141306a2903002104200141386a290300210b20012d0023211520012d001f211420012d001b210f20012d0017211920012d000f211620034198046a41106a200141d0006a2d00003a000020034198046a41086a221e200141c8006a2903003703002003200141c0006a290300370398044111210620022d0001210820022d0000210a02400240024002400240024002400240024002400240024002400240024020070e0400010203000b200341c0066a41146a4101360200200342013702c406200341ccd1c5003602c006200341043602e405200341c4d1c5003602e0052003200341e0056a3602d006200341c0066a41e092c100103e000b200241106a2d0000211e2002410e6a2f0100211f2002410d6a2d000021202002410c6a2d000021212002410a6a2f01002122200241096a2d000021234104200241056a2800004104200841ff017141014622081b200a41ff017122061b21070240024020060d0020080d010b410f210641ea9fc600210202400240024002400240024020070e0700010203040511000b20224108742023722021411874722102201f410874202072201e4118747221060c100b410e210641dc9fc60021020c0f0b410c210641d09fc60021020c0e0b4109210641c79fc60021020c0d0b4113210641b49fc60021020c0c0b4111210641a39fc60021020c0b0b200241196a2d00002106200241186a2d00002108200241166a2f0100210a200241156a2d00002124200241146a2d00002125200241126a2f01002126200241116a2d00002128200241046a2d00002129200241026a2f0100212a20032002411a6a2901003703a801200320063a00a701200320083a00a6012003200a3b01a401200320243a00a301200320253a00a201200320263b01a001200320283a009f012003201e3a009e012003201f3b019c01200320203a009b01200320213a009a01200320223b019801200320233a0097012003200736009301200320293a0092012003202a3b01900102400240202741ff01714101470d00200341e0056a200541067610fe0120032802e00521060240024020032802e8052005413f7122024b0d00410021020c010b200620024105746a2202290018211020022d0017211a20022d0016211520022f0014211320022d0013210c20022d0012211420022f0010211220022d000f211120022d000e210f20022f000c210920022d000b211720022d000a211920022f0008210d20022d000721182002280003210520022d0002211620022f0000210e410121020b024020032802e405450d002006102a0b20020d00410121020c010b410021020b20032010370390022003201a3a008f02200320153a008e02200320133b018c022003200c3a008b02200320143a008a02200320123b018802200320113a0087022003200f3a008602200320093b018402200320173a008302200320193a0082022003200d3b018002200320183a00ff01200320053600fb01200320163a00fa012003200e3b01f80120020d09200341c0066a41186a200341f8016a41186a290300370300200341c0066a41106a200341f8016a41106a290300370300200341c0066a41086a200341f8016a41086a290300370300200320032903f8013703c006200341086a20034190016a200341c0066a2004200b108e0220032802082202450d0b200328020c21060c0a0b41a39fc60021022008200a7241ff01710d0b201e290300211b200329039804211c0240202741ff01714101470d0020034190016a200541067610fe012003280290012106024002402003280298012005413f7122024b0d00410021020c010b200620024105746a2202290018211020022d0017211a20022d0016211520022f0014211320022d0013210c20022d0012211420022f0010211220022d000f211120022d000e210f20022f000c210920022d000b211720022d000a211920022f0008210d20022d000721182002280003210520022d0002211620022f0000210e410121020b0240200328029401450d002006102a0b2002450d080b200320103703d8062003201a3a00d706200320153a00d606200320133b01d4062003200c3a00d306200320143a00d206200320123b01d006200320113a00cf062003200f3a00ce06200320093b01cc06200320173a00cb06200320193a00ca062003200d3b01c806200320183a00c706200320053600c306200320163a00c2062003200e3b01c006411410282202450d01200241002900cfe140370000200241106a41002800dfe140360000200241086a41002900d7e14037000020034294808080c002370294012003200236029001200341c0066a20034190016a108f012003280298012102200328029001210620034198026a41186a2205420037030020034198026a41106a2207420037030020034198026a41086a2208420037030020034200370398022006200220034198026a1000200341f8016a41186a2005290300370300200341f8016a41106a2007290300370300200341f8016a41086a200829030037030020032003290398023703f8010240200328029401450d00200328029001102a0b2003410036029001200341f8016a412020034190016a100621022003280290012206417f460d052002450d0520064110490d02200241086a29000021102002290000211d2002102a0c060b41a39fc60021022008200a7241ff01710d0a200141e0006a290300211c200141d8006a290300211d20032900a104211b20032d00a004210720032d009f04210820032f009d04210a20032d009c04211e20032d009b04211f20032f009904212020032d00980421210240202741ff01714101470d00200341c0066a200541067610fe0120032802c00621060240024020032802c8062005413f7122024b0d00410021020c010b200620024105746a2202290018211020022d0017211a20022d0016211520022f0014211320022d0013210c20022d0012211420022f0010211220022d000f211120022d000e210f20022f000c210920022d000b211720022d000a211920022f0008210d20022d000721182002280003210520022d0002211620022f0000210e410121020b024020032802c406450d002006102a0b2002450d070b2004422088a72106200320103703a8012003201a3a00a701200320153a00a601200320133b01a4012003200c3a00a301200320143a00a201200320123b01a001200320113a009f012003200f3a009e01200320093b019c01200320173a009b01200320193a009a012003200d3b019801200320183a0097012003200536009301200320163a0092012003200e3b01900102402004a741ff01714101460d00200ba72118200b423888a7210f200b422888a72109200b422088a72117200b421888a72119200b420888a7210d2004421888a721162004420888a7210e0c030b200341e0056a2004422688a710fe0120032802e00521050240024020032802e8052006413f7122024b0d00410021022013210a200c211e2014211f201221202011212120152108201a21072010211b0c010b200520024105746a2202290018211b20022d0017210720022d0016210820022f0014210a20022d0013211e20022d0012211f20022f0010212020022d000f212120022d000e210f20022f000c210920022d000b211720022d000a211920022f0008210d20022d000721182002280003210620022d0002211620022f0000210e410121020b024020032802e405450d002005102a0b20020d02410121020c030b411441011037000b41c4d1c3004133200341c8076a419cd9c3001038000b410021020b2003201b37039002200320073a008f02200320083a008e022003200a3b018c022003201e3a008b022003201f3a008a02200320203b018802200320213a0087022003200f3a008602200320093b018402200320173a008302200320193a0082022003200d3b018002200320183a00ff01200320063600fb01200320163a00fa012003200e3b01f80120020d03200341c0066a41186a200341f8016a41186a290300370300200341c0066a41106a200341f8016a41106a290300370300200341c0066a41086a200341f8016a41086a290300370300200320032903f8013703c006200341106a20034190016a200341c0066a201d201c108e0220032802102202450d05200328021421060c040b4200211d420021100b02400240201d20045422062010200b542010200b5122021b0d00201d2004562010200b5620021b450d012003201d20047d3703900120032010200b7d2006ad7d37039801200320034190016a3602e005200341e0056a109d010c010b20032004201d7d370390012003200b20107d2004201d54ad7d37039801200320034190016a3602e005200341e0056a109c010b200341c0066a2004200b108f020240024002400240411810282202450d00200241002900e3e140370000200241106a41002900f3e140370000200241086a41002900ebe140370000200342988080808003370294012003200236029001200341c0066a20034190016a108f012003280298012102200328029001210620034198026a41186a2205420037030020034198026a41106a2207420037030020034198026a41086a2208420037030020034200370398022006200220034198026a1000200341f8016a41186a2005290300370300200341f8016a41106a2007290300370300200341f8016a41086a200829030037030020032003290398023703f8010240200328029401450d00200328029001102a0b2003410036029001200341f8016a412020034190016a100621022003280290012206417f460d022002450d0220064110490d01200241086a29000021042002290000210b2002102a0c030b411841011037000b41c4d1c3004133200341c8076a419cd9c3001038000b4200210b420021040b02400240200b201c5422062004201b542004201b5122021b0d00200b201c562004201b5620021b450d012003200b201c7d3703900120032004201b7d2006ad7d37039801200320034190016a3602e005200341e0056a109d010c010b2003201c200b7d370390012003201b20047d201c200b54ad7d37039801200320034190016a3602e005200341e0056a109c010b200341c0066a201c201b1090020c030b41dc9fc6002102410e21060c030b41dc9fc6002102410e21060b20020d010b200041023a00080c010b200041810a3b010820002006360204200020023602002000410a6a41003a00000b41012105410121060c0d0b109102000b024020032802cc062206450d0020032802c4062102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102a0c030b2002410c6a280200450d02200241086a280200102a0c020b2002410c6a280200450d01200241086a280200102a0c010b200241086a280200450d00200241046a280200102a0b200241246a21022006415c6a22060d000b0b024020032802c806450d0020032802c406102a0b024020072008460d0003402007280204220a450d01200741086a280200210902402007410c6a2802002202450d00200241246c2106200a210203400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102a0c030b2002410c6a280200450d02200241086a280200102a0c020b2002410c6a280200450d01200241086a280200102a0c010b200241086a280200450d00200241046a280200102a0b200241246a21022006415c6a22060d000b0b200741f0006a210702402009450d00200a102a0b20072008470d000b0b0240200c450d00200d102a0b2004a7450d032017102a0c030b20072008460d0003402007280204220a450d01200741086a280200210902402007410c6a2802002202450d00200241246c2106200a210203400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102a0c030b2002410c6a280200450d02200241086a280200102a0c020b2002410c6a280200450d01200241086a280200102a0c010b200241086a280200450d00200241046a280200102a0b200241246a21022006415c6a22060d000b0b200741f0006a210702402009450d00200a102a0b20072008470d000b0b0240200c450d00200d102a0b20034180056a41086a2202420037030020034200370380054193cdc200411120034180056a1008200341b8026a41086a200229030037030020032003290380053703b802200341c0066a20032802980322022004422088a7109202200341b8026a411020032802c006220620032802c8061007024020032802c406450d002006102a0b02402004a7450d002002102a0b200041023a000841002106410121050c090b02402005450d00200d200541f0006c6a2108200d2107034002402007410c6a2802002206450d0020072802042102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102a0c030b2002410c6a280200450d02200241086a280200102a0c020b2002410c6a280200450d01200241086a280200102a0c010b200241086a280200450d00200241046a280200102a0b200241246a21022006415c6a22060d000b0b200741f0006a21020240200741086a280200450d002007280204102a0b2002210720022008470d000b0b200c450d00200d102a0b20004181063b01082000200f3602042000200e360200410021062000410a6a41003a0000410121050c070b2005102a0b0240024002402007417f6a220241054b0d00024002400240024020020e06060006010203060b41000d052004a70d040c050b41000d042004a70d030c040b200a450d0302402004422088a72202450d00200241186c21062005210203400240200241046a280200450d002002280200102a0b0240200241106a280200450d002002410c6a280200102a0b200241186a2102200641686a22060d000b0b2004a70d020c030b2006450d0202402004422088a72202450d002002410c6c21062005210203400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b2004a70d010c020b02402004422088a72202450d002002410c6c21062005210203400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b2004a7450d010b2005102a0b410f210241ea9fc6002105410621072008417c6a0e0402010300020b200041023a0008410121060c030b4111210241a39fc6002105410521070c010b4113210241b49fc6002105410421070b41012106200041013b010820002002360204200020053602002000410a6a20073a00000b410021050b410121070b410121080b4101210a0b410121090b410121170b4101210d0b410121180b4101210e0b4101210f410121190b410121160b02402001280200220241124b0d00024002400240024002400240024002400240024002400240024020020e13000d0d010d0d020304050607080d090d0a0b0c000b2005450d0c0240200141086a280200220241054b0d0002400240024020020e06101000100102100b200141106a280200450d0f2001410c6a280200102a0c0f0b200141106a280200450d0e2001410c6a280200102a0c0e0b0240200141146a2802002206450d002001410c6a2802002102200641186c210603400240200241046a280200450d002002280200102a0b0240200241106a280200450d002002410c6a280200102a0b200241186a2102200641686a22060d000b0b200141106a280200450d0d200128020c102a0c0d0b0240200141146a2802002206450d002001410c6a28020021022006410c6c210603400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b200141106a280200450d0c200128020c102a0c0c0b2006450d0b02402001410c6a2802002202450d0020012802042200200241f0006c6a2107034002402000410c6a2802002206450d0020002802042102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102a0c030b2002410c6a280200450d02200241086a280200102a0c020b2002410c6a280200450d01200241086a280200102a0c010b200241086a280200450d00200241046a280200102a0b200241246a21022006415c6a22060d000b0b200041f0006a21020240200041086a280200450d002000280204102a0b2002210020022007470d000b0b200141086a280200450d0b2001280204102a0c0b0b2007450d0a0240200141086a2d00002202410c4b0d0020024106470d0b200141106a280200450d0b2001410c6a280200102a0c0b0b200141106a280200450d0a2001410c6a280200102a0c0a0b2008450d09200141086a280200450d092001280204102a0c090b200a450d08200141086a2d0000417f6a220241074b0d08024002400240024020020e08000c0c0c0c010203000b2001410c6a2202280200106a2002280200102a0c0b0b2001410c6a2202280200106a2002280200102a0c0a0b2001410c6a2202280200106a2002280200102a0c090b2001410c6a2202280200106a2002280200102a0c080b2009450d0720012d0004417f6a220241024b0d0702400240024020020e03000102000b2001410c6a280200450d09200141086a280200102a0c090b200141086a2202280200106a2002280200102a0c080b2001410c6a2202280200106a2002280200102a0c070b2017450d0620012d0004417f6a220241024b0d0602400240024020020e03000102000b2001410c6a280200450d08200141086a280200102a0c080b200141086a2202280200106a2002280200102a0c070b2001410c6a2202280200106a2002280200102a0c060b200d450d05200141086a280200417f6a220241014b0d050240024020020e020001000b200141106a280200450d062001410c6a280200102a0c060b200141106a280200450d052001410c6a280200102a0c050b2018450d0420012d00044104490d042001410c6a280200450d04200141086a280200102a0c040b200e450d03200141086a280200450d032001280204102a0c030b200f450d02200141086a2d0000417e6a220241024b0d0202400240024020020e03000102000b200141106a280200450d042001410c6a280200102a0c040b200141346a280200450d03200141306a280200102a0c030b200141306a280200450d022001412c6a280200102a0c020b2019450d0102402001280204220241024b0d00024020020e03030003030b200141086a2202280200106a2002280200102a0c020b2001412c6a2202280200106a2002280200102a0c010b2016450d0002402001410c6a280200450d00200141086a280200102a0b02402001411c6a2802002206450d00200141146a28020021022006410c6c210603400240200241046a280200450d002002280200102a0b2002410c6a2102200641746a22060d000b0b200141186a280200450d002001280214102a0b200341d0076a24000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccd1c5003602002000410436021c200041c4d1c5003602182000200041186a360210200041a8c6c200103e000bfa0301077f230041306b22022400200241003602082002420137030020022002360210200141106a200241106a10c8012001200210a00120022002360210200141306a200241106a10c80120022002360210200141d0006a200241106a10c801200128020421032001410c6a2802002201200210b4010240024002402001450d00200141246c21040340200241106a200310ec01200228021021050240024020022802042206200228020822016b20022802182207490d00200228020021060c010b200120076a22082001490d04200641017422012008200120084b1b22014100480d040240024020060d002001102821060c010b200228020020062001102c21060b2006450d032002200136020420022006360200200228020821010b2002200120076a360208200620016a20052007109a051a02402002280214450d002005102a0b200341246a21032004415c6a22040d000b0b200228020421072002280208210320022802002101200241106a41186a22064200370300200241106a41106a22054200370300200241106a41086a220442003703002002420037031020012003200241106a1000200041186a2006290300370000200041106a2005290300370000200041086a20042903003700002000200229031037000002402007450d002001102a0b200241306a24000f0b200141011037000b1031000ba80301047f230041f0006b2202240002400240411010282203450d00200341086a41002900c6f042370000200341002900bef042370000200341104120102c2203450d0120032001360010200241086a41186a22014200370300200241086a41106a22044200370300200241086a41086a220542003703002002420037030820034114200241086a1000200241306a41186a2001290300370300200241306a41106a2004290300370300200241306a41086a2005290300370300200220022903083703302003102a200241086a200241306a412010a703200241d0006a41086a200241116a290000370300200241d0006a41106a2203200241196a290000370300200241d0006a41186a2201200241216a290000370300200220022900093703500240024020022d00084101460d0020004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b20002002290350370000200041186a2001290300370000200041106a2003290300370000200041086a200241d0006a41086a2903003700000b200241f0006a24000f0b411041011037000b412041011037000bd50c04077f017e027f017e230041b0016b22012400200141306a41086a220242003703002001420037033041afc5c2004111200141306a1008200141086a200229030037030020012001290330370300200141c0006a2001411010fd0120012d00402103200141106a41186a2204200141d9006a290000370300200141106a41106a2205200141c0006a41116a290000370300200141106a41086a2206200141c9006a290000370300200120012900413703100240024020034101470d0020002001290310370000200041186a2004290300370000200041106a2005290300370000200041086a20062903003700000c010b200141c0006a41086a220342003703002001420037034041b1f0c200410d200141c0006a1008200220032903003703002001200129034037033020014100360240200141306a4110200141c0006a1006210202400240024020012802402203417f460d002002450d002001200336021420012002360210200141c0006a200141106a107620012802402207450d02200129024421082003450d012002102a0c010b41042107420021080b20072008422088a7220941246c6a2104200721020240024002400240034002400240200420026b41ed00490d0003400240200222032d00004101470d00200341246a210a200341106a2105200341086a2106200341016a21020c030b0240200341246a2d00004101470d00200341c8006a210a200341346a21052003412c6a2106200341256a21020c030b0240200341c8006a2d00004101470d00200341ec006a210a200341d8006a2105200341d0006a2106200341c9006a21020c030b0240200341ec006a2d00004101470d0020034190016a210a200341fc006a2105200341f4006a2106200341ed006a21020c030b200420034190016a22026b41ec004b0d000b20034190016a21020b20022004460d020240034020022d00004101460d012004200241246a2202460d040c000b0b200241246a210a200241106a2105200241086a2106200241016a21020b200228000021022006280200210320012005280200360214200120033602100240200241c28289aa04460d00200a21020c010b0b200141c0006a200141106a10ba0220012d004022024102460d00200141a4016a28020021062001280244210a4200210b200141306a41086a220342003703002001420037033041c785c2004112200141306a1008200141c0006a41086a20032903003703002001200129033037034020014100360210200141c0006a4110200141106a100621050240024020012802102203417f460d002001200336023420012005360230200141106a200141306a106d20012802102204450d052001290214210b2003450d012005102a0c010b410121040b410021030240200a200620024101711b2202200b422088a74f0d00200420024105746a2202450d00200141106a41186a200241186a290000370300200141106a41106a200241106a290000370300200141106a41086a200241086a29000037030020012002290000370310410121030b0240200ba7450d002004102a0b20030d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b200141c0006a41186a2202200141106a41186a290300370300200141c0006a41106a2203200141106a41106a290300370300200141c0006a41086a2204200141106a41086a29030037030020012001290310370340200141306a41086a220542003703002001420037033041afc5c2004111200141306a1008200141086a2005290300370300200120012903303703002001411036023420012001360230200141c0006a200141306a10ff01200041186a2002290300370000200041106a2003290300370000200041086a2004290300370000200020012903403700000b02402009450d00200941246c21032007210203400240024020022d0000220441034b0d0002400240024020040e0404000102040b2002410c6a280200450d03200241086a280200102a0c030b2002410c6a280200450d02200241086a280200102a0c020b2002410c6a280200450d01200241086a280200102a0c010b200241086a280200450d00200241046a280200102a0b200241246a21022003415c6a22030d000b0b2008a7450d022007102a0c020b41c4d1c30041332001419cd9c3001038000b41c4d1c30041332001419cd9c3001038000b200141b0016a24000b860c07057f017e047f027e037f027e047f230041c0006b22012400200141106a41086a220242003703002001420037031041f09cc600411e200141106a1008200141086a2203200229030037030020012001290310370300200141106a200110de03200128021021042001280214210520012903182106200028020821072000280204210820002802002109200242003703002001420037031041a5afc4004116200141106a100820032002290300370300200120012903103703002001410036021020014110200141106a100621000240024002400240024002400240024020012802102202417f460d002000450d002001200236023420012000360230200141106a200141306a106d2001280210220a450d022001290214210b2002450d012000102a0c010b4101210a4200210b0b2006420020051b210c2004410020051b21042005410420051b210d02402007450d002009200741246c6a210e200a200b422088a74105746a21032009210203402002280220210f200241086a2900002106200241106a290000211020022900002111200141106a41186a200241186a290000370300200141106a41106a2010370300200141106a41086a200637030020012011370310200241246a2102200a2105410021000240024003400240200320056b41e0004b0d0020052003460d030340200141106a2005460d0320002005200141106a4120109c0522074100476a21002007450d032003200541206a2205470d000c040b0b200141106a2005460d0120002005200141106a4120109c0522074100476a21002007450d01200541206a2207200141106a460d0120002007200141106a4120109c0522074100476a21002007450d01200541c0006a2207200141106a460d0120002007200141106a4120109c0522074100476a21002007450d01200541e0006a2207200141106a460d0120054180016a210520002007200141106a4120109c0522074100476a210020070d000b0b2004200f6a22072004490d000240200041016a2204200c422088a722054d0d000240200ca7221220056b20042005200420054b1b221320056b22044f0d00200520046a22142005490d0a201241017422152014201520144b1b221441ffffffff03712014470d0a201441027422154100480d0a0240024020120d0020151028210d0c010b200d20124102742015102c210d0b200d450d062014ad210c0b200d20054102746a21120240024020044102490d002012410020132005417f736a22044102741099051a200d200520136a20056b4102746a417c6a2112200420056a21050c010b2004450d010b20124100360200200541016a21050b200520004d0d05200d20004102746a22002000280200200f6a360200200c42ffffffff0f832005ad42208684210c200721040b2002200e470d000b0b02402008450d002009102a0b0240200ba7450d00200a102a0b200141106a41086a220542003703002001420037031041f09cc600411e200141106a1008200141086a20052903003703002001200129031037030002400240200d0d002001411010090c010b2001410036021820014201370310410410282205450d042005200436000020014284808080c00037021420012005360210200c422088a72205200141106a10b4010240024020050d002001280218210420012802142103200128021021000c010b2005410274210f4100200128021822056b210220012802142103200d210703402007280200210a02400240200320026a4104490d00200128021021000c010b200541046a22002005490d09200341017422042000200420004b1b22044100480d090240024020030d002004102821000c010b200128021020032004102c21000b2000450d082001200436021420012000360210200421030b200741046a21072001200541046a2204360218200020056a200a3600002002417c6a210220042105200f417c6a220f0d000b0b200ca721052001411020002004100702402003450d002000102a0b2005450d00200d102a0b200141c0006a24000f0b41c4d1c3004133200141386a419cd9c3001038000b201541041037000b41ac9bc600200020051034000b410441011037000b200441011037000b1031000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccd1c5003602002000410436021c200041c4d1c5003602182000200041186a3602102000419896c400103e000ba70101047f230041206b22002400200041106a41086a2201420037030020004200370310419499c6004114200041106a1008200041086a200129030037030020002000290310370300410021022000410036021020004110200041106a100621010240024020002802102203417f460d002001450d0020034104490d01200128000021022001102a0b200041206a240020020f0b41c4d1c3004133200041106a419cd9c3001038000b9d0401067f230041d0006b220324000240024002400240411b10282204450d00200441176a41002800d89646360000200441106a41002900d19646370000200441086a41002900c99646370000200441002900c196463700002004411b4136102c2204450d012004200136001b200341306a41186a22014200370300200341306a41106a22054200370300200341306a41086a22064200370300200342003703302004411f200341306a1000200341086a41186a22072001290300370300200341086a41106a2005290300370300200341086a41086a2006290300370300200320032903303703082004102a412010282204450d0220042003290308370000200441186a2007290300370000200441106a200341086a41106a2205290300370000200441086a200341086a41086a22062903003700002003200236022c20014200370300200341306a41106a22024200370300200341306a41086a22084200370300200342003703302003412c6a4104200341306a1000200720012903003703002005200229030037030020062008290300370300200320032903303703082004412041c000102c2204450d0320042003290308370020200441386a200341206a290300370000200441306a2005290300370000200441286a2006290300370000200042c0808080800837020420002004360200200341d0006a24000f0b411b41011037000b413641011037000b412041011037000b41c00041011037000bcb0201047f230041d0006b220324002003410036022820012002200341286a1006210402400240024020032802282205417f460d0020040d010b200041003a00000c010b41002101200341003a00480340024020052001470d000240200141ff0171450d00200341003a00480b41c4d1c3004133200341286a419cd9c3001038000b200341286a20016a200420016a2d00003a00002003200141016a22023a00482002210120024120470d000b200341086a41186a2201200341286a41186a290300370300200341086a41106a2202200341286a41106a290300370300200341086a41086a2206200341286a41086a2903003703002003200329032837030802402005450d002004102a0b20002003290308370001200041013a0000200041196a2001290300370000200041116a2002290300370000200041096a20062903003700000b200341d0006a24000bec0202047f017e230041d0006b22022400024002400240410f10282203450d00200341076a4100290092b4433700002003410029008bb4433700002003410f411e102c2203450d012003200136000f200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034113200241286a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903283703002003102a2002410036022820024120200241286a100621010240024020022802282203417f460d002002200336022420022001360220200241286a200241206a106d20022802282204450d04200229022c210602402003450d002001102a0b20002006370204200020043602000c010b20004100360208200042013702000b200241d0006a24000f0b410f41011037000b411e41011037000b41c4d1c3004133200241c8006a419cd9c3001038000bdf0301017f024002400240024002400240410110282202450d00200220002d00003a0000200241014102102c2202450d01200220002d00013a0001200241024104102c2202450d02200220002d00023a0002200220002d00033a0003200241044108102c2202450d03200220002d00043a0004200220002d00053a0005200220002d00063a0006200220002d00073a0007200241084110102c2202450d04200220002d00083a0008200220002d00093a0009200220002d000a3a000a200220002d000b3a000b200220002d000c3a000c200220002d000d3a000d200220002d000e3a000e200220002d000f3a000f200241104120102c2202450d05200220002d00103a0010200220002d00113a0011200220002d00123a0012200220002d00133a0013200220002d00143a0014200220002d00153a0015200220002d00163a0016200220002d00173a0017200220002d00183a0018200220002d00193a0019200220002d001a3a001a200220002d001b3a001b200220002d001c3a001c200220002d001d3a001d200220002d001e3a001e200220002d001f3a001f200128020020012802042002412010072002102a0f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000bf54606077f027e0f7f047e117f017e230041800a6b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e06000102030405000b200341cc026a4101360200200342013702bc02200341ccd1c5003602b802200341043602b406200341c4d1c5003602b0062003200341b0066a3602c802200341b8026a41e893c400103e000b200141e0006a2802002104200341b0066a200141086a41d800109a051a20034198056a200141fc006a28020036020020034190056a200141f4006a29020037030020034180056a41086a200141ec006a2902003703002003200141e4006a29020037038005024020022d000120022d000072450d0041a39fc600210541112104410121060c120b200341b8026a10f70302402003280290032004490d0041f893c400210541352104410121060c120b200341b8026a41086a41033a00002003410c3a00b802200341b8026a410c6a20043602004100210541014100200341b8026a10cc01200341b8026a200341b0066a41d800109a051a2003419c036a20034180056a41086a290300370200200341a4036a20034180056a41106a290300370200200341ac036a20034180056a41186a2802003602002003200436029003200320032903800537029403200341c0086a41086a22024200370300200342003703c00841c0fec5004118200341c0086a100820034180046a41086a2002290300370300200320032903c00837038004200341003602c808200342013703c008200341b8026a200341c0086a10ee0120032802c408210220034180046a411020032802c008220420032802c80810072002450d0f2004102a0c0f0b2001410c6a2802002107200141086a280200210841042104200141046a2802002109200141106a290300210a2002411a6a290100210b200241196a2d0000210c200241186a2d0000210d200241166a2f0100210e200241156a2d0000210f200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d000021152002410c6a2d000021162002410a6a2f01002117200241096a2d00002118200241046a2d00002119200241026a2f0100211a0240024020022d00000d0020022d00014101470d00200241056a2d00002104200241066a2f01002105200241086a2d00002102410021060c010b4101210641002102410021050b200541ffff0371410874200241187472200441ff017172210202402006450d0041ea9fc6002105410f210402400240024002400240024020020e0700010203040513000b20174108742018722016411874722105201441087420157220134118747221040c120b41dc9fc6002105410e21040c110b41d09fc6002105410c21040c100b41c79fc6002105410921040c0f0b41b49fc6002105411321040c0e0b41a39fc6002105411121040c0d0b2003200b370398042003200c3a0097042003200d3a0096042003200e3b0194042003200f3a009304200320103a009204200320113b019004200320123a008f04200320133a008e04200320143b018c04200320153a008b04200320163a008a04200320173b018804200320183a0087042003200236008304200320193a0082042003201a3b018004200341e8006a10f603024002402003290368220b200341e8006a41086a290300221b8450450d004200211c4200211d0c010b200341c8006a201b4200200a4200109f05200341d8006a200b4200200a4200109f05200341386a42004200200b4200109f0502402003290350200329034084420052200341e0006a290300221c200329034820032903387c7c221d201c5472450d0041a6b5c0002105412721040c0e0b2003290358211c0b200341b8026a20034180046a201c201d4108109802024020032802b8024101470d0020032802c002210420032802bc0221050c0d0b200341c8026a290300211c20032903c002211d200341b8026a10f703200341286a20032903b80242002007ad4200109f050240200a427f200329032820032903304200521b7d221e200a562205450d0041fdbfc2002102412c21040c0b0b200341b0066a20092007200341b8026a10f802024020032802b0064101470d00200341b8066a280200210420032802b40621020c0b0b200341c8096a41186a2206200341b0066a410472220241186a280200360200200341c8096a41106a2216200241106a290200370300200341c8096a41086a2217200241086a290200370300200320022902003703c80920034180056a41186a2213420037030020034180056a41106a2214420037030020034180056a41086a2215420037030020034200370380052009200720034180056a1000200341da016a221820032d0082053a000020034198026a41086a220c20034180056a41136a290000370300200341a5026a220d2013290000370000200320032f0180053b01d8012003200329008b053703980220032800830521022003280087052104200341e0076a41186a2006280200360200200341e0076a41106a2016290300370300200341e0076a41086a2017290300370300200320032903c8093703e007200320043600b706200320023600b306200320182d00003a00b206200320032f01d8013b01b006200341b0066a41136a200c290300370000200341b0066a41186a200d29000037000020032003290398023700bb06411410282206450d03200641002900ddd843370000200641106a41002800edd843360000200641086a41002900e5d84337000020034294808080c0023702fc01200320063602f8012003200341f8016a36028005200341b0066a20034180056a10c80120032802f8012106200328028002211620134200370300201442003703002015420037030020034200370380052006201620034180056a1000200341c0086a41186a2013290300370300200341c0086a41106a2014290300370300200341c0086a41086a201529030037030020032003290380053703c008024020032802fc01450d0020032802f801102a0b200341203602b4062003200341c0086a3602b006200341e0076a200341b0066a10f9020240200341f0076a280200450d0020032802ec07102a0b200341c3066a20034198026a41086a290300370000200341b0066a41186a20034198026a410d6a2900003700002003200341da016a2d00003a00b206200320032f01d8013b01b006200320043600b706200320023600b30620032003290398023700bb06411510282206450d04200641002900c8d8433700002006410d6a41002900d5d843370000200641086a41002900d0d84337000020034295808080d0023702e407200320063602e0072003200341e0076a36028005200341b0066a20034180056a10c80120032802e007210620032802e807211320034180056a41186a2214420037030020034180056a41106a2215420037030020034180056a41086a2216420037030020034200370380052006201320034180056a1000200341c0086a41186a2014290300370300200341c0086a41106a2015290300370300200341c0086a41086a201629030037030020032003290380053703c008024020032802e407450d0020032802e007102a0b200341203602b4062003200341c0086a3602b00620092007200341b0066a10cb0102402008450d002009102a0b200341f8016a41026a200341d8016a41026a2d000022063a000020034180056a41086a221320034198026a41086a29030037030020034180056a410d6a220820034198026a410d6a290000370000200320032f01d80122093b01f801200320032903980237038005200341b0066a41086a41023a0000200341b9066a20093b0000200341bb066a20063a0000200341c0066a20043602002003410c3a00b006200341b0066a410c6a2002360200200341c4066a200329038005370200200341cc066a2013290300370200200341d1066a20082900003700004100211341014100200341b0066a10cc010c0b0b200141c0006a290300210b200141386a290300211d2002411a6a290100211c200241196a2d0000211f200241186a2d00002120200241166a2f01002121200241156a2d00002122200241146a2d00002123200241126a2f01002124200241116a2d00002125200241106a2d000021262002410e6a2f010021272002410d6a2d000021282002410c6a2d000021292002410a6a2f0100212a200241096a2d0000212b41042104200241046a2d0000212c200241026a2f0100212d200141306a280200212e2001412c6a2802002108200141286a28020021092001411d6a290000210a2001411c6a2d000021142001411b6a2d00002115200141196a2f00002116200141186a2d00002117200141176a2d00002118200141156a2f0000210c200141146a2d0000210d200141136a2d0000210e200141116a2f0000210f200141106a2d000021102001410f6a2d000021112001410d6a2f000021122001410c6a2d00002119200141086a2802002105200141076a2d0000211a200141056a2f00002107200141046a2d0000212f200141c8006a290300211b0240024020022d00000d0020022d00014101470d00200241056a2d00002104200241066a2f01002106200241086a2d00002102410021130c010b4101211341002102410021060b200641ffff0371410874200241187472200441ff01717221060240024002402013450d0041ea9fc6002105410f21040240024002400240024020060e0700060102030410000b202a410874202b722029411874722105202741087420287220264118747221040c0f0b41d09fc6002105410c21040c0e0b41c79fc6002105410921040c0d0b41b49fc6002105411321040c0c0b41a39fc6002105411121040c0b0b202f41ff01714101470d01200341b8026a200541067610fe0120032802b80221040240024020032802c0022005413f7122024b0d00410021020c010b200420024105746a2202290018210a20022d0017211420022d0016211520022f0014211620022d0013211720022d0012211820022f0010210c20022d000f210d20022d000e210e20022f000c210f20022d000b211020022d000a211120022f0008211220022d000721192002280003210520022d0002211a20022f00002107410121020b024020032802bc02450d002004102a0b20020d010b41dc9fc6002105410e21040c090b2003201c3703c8062003201f3a00c706200320203a00c606200320213b01c406200320223a00c306200320233a00c206200320243b01c006200320253a00bf06200320263a00be06200320273b01bc06200320283a00bb06200320293a00ba062003202a3b01b8062003202b3a00b706200320063600b3062003202c3a00b2062003202d3b01b0062003200a3703d002200320143a00cf02200320153a00ce02200320163b01cc02200320173a00cb02200320183a00ca022003200c3b01c8022003200d3a00c7022003200e3a00c6022003200f3b01c402200320103a00c302200320113a00c202200320123b01c002200320193a00bf02200320053600bb022003201a3a00ba02200320073b01b8022003202e3602c808200320083602c408200320093602c00820034180056a200341b0066a200341b8026a201d200b201b200341c0086a10f5030240024002402003280280054101460d00024020034188056a280200450d00200328028405102a0b41002113410121060c010b4101210620032802840522050d01410021130b41012108410021050c110b20034188056a2802002104024020034190056a280200450d002003418c056a280200102a0b41002113410121080c100b200141386a290300211c200141306a290300211b200141c0006a290300210a200341d8016a41186a200141196a290000370300200341d8016a41106a200141116a290000370300200341d8016a41086a200141096a290000370300200320012900013703d8012002411a6a290100210b200241196a2d0000210c200241186a2d0000210d200241166a2f0100210e200241156a2d0000210f200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021092002410e6a2f010021142002410d6a2d000021152002410c6a2d000021162002410a6a2f01002117200241096a2d0000211841042104200241046a2d00002119200241026a2f0100211a2001412c6a2802002107200141286a2802002106200141246a28020021080240024020022d00000d0020022d00014101470d00200241056a2d00002104200241066a2f01002105200241086a2d00002102410021130c010b4101211341002105410021020b200541ffff0371410874200441ff017172200241187472210202402013450d00410f210441ea9fc6002105024002400240024002400240024020020e0700010203040506000b20174108742018722016411874722105201441087420157220094118747221040c050b410e210441dc9fc60021050c040b410c210441d09fc60021050c030b4109210441c79fc60021050c020b4113210441b49fc60021050c010b4111210441a39fc60021050b2006450d072008102a0c070b2003200b370390022003200c3a008f022003200d3a008e022003200e3b018c022003200f3a008b02200320103a008a02200320113b018802200320123a008702200320093a008602200320143b018402200320153a008302200320163a008202200320173b018002200320183a00ff01200320023600fb01200320193a00fa012003201a3b01f801200341c8016a10f603024002400240024020032903c801220b200341c8016a41086a29030022308450450d004200211e4200211d0c010b200341a8016a20304200200a4200109f05200341b8016a200b4200200a4200109f0520034198016a42004200200b4200109f05024020032903b00120032903a00184420052200341c0016a290300221e20032903a8012003290398017c7c221d201e5472450d004127210441a6b5c00021050c020b20032903b801211e0b200341b8026a200341f8016a201e201d410810980220032802b8024101470d0120032802c002210420032802bc0221050b2006450d072008102a0c070b200341b8026a41106a290300211e20032903c002211d20034198026a41186a20303703002003200b3703a8022003200a3703a0022003200a37039802200341b8026a10f703200341b8036a4200370300200341e8036a4200370300200341d8036a4200370300200341c8036a42003703002003428080e983b1de163703b00320034280a094a58d1d3703e00320034280a094a58d1d3703d00320034280a094a58d1d3703c003200342808880808080103703f0032003200341b8026a3602f8032003200341b8026a3602fc03200341b0066a41186a2204200341f8016a41186a290300370300200341b0066a41106a2202200341f8016a41106a290300370300200341b0066a41086a2205200341f8016a41086a290300370300200320032903f8013703b00610a003210a1098012113200341b8046a420037030020034180046a412c6a41d0b5c00036020020034180046a41286a4101360200200341a0046a42003703002003419c046a41f8b9c000360200200341d8046a2005290300370300200341e0046a2002290300370300200341e8046a200429030037030020034200370388042003428080808080013703b004410021122003410036029804200320032903b0063703d0042003200341fc036a3602c8042003200341f8036a3602c4042003200341b8026a3602c004200320133602cc042003200a37038004200320073602880520032006360284052003200836028005200341b0066a20034180046a201b201c20034198026a200341d8016a20034180056a10b50120032802b0064101470d0420022802002207410876212f200341bc066a2802002126200341b0066a41086a280200210420032802b406211a41012112410121190c050b200141216a2d0000210620034180056a41186a200141196a29000037030020034180056a41106a200141116a29000037030020034180056a41086a200141096a290000370300200320012900013703800541ad94c400210541e900210420022d00000d0c200228000121130240200641ff01714101460d00201341ff01714101470d0d20134118762104201341087621052002411a6a290100210a200241196a2d00002106200241186a2d00002113200241166a2f01002108200241156a2d00002109200241146a2d00002114200241126a2f01002115200241116a2d00002116200241106a2d000021172002410e6a2f010021182002410d6a2d0000210c2002410c6a2d0000210d2002410a6a2f0100210e200241096a2d0000210f200241056a2800002102410221100c030b201341ff01714102470d0c2001413a6a290000210a200141396a2d00002106200141386a2d00002113200141366a2f00002108200141356a2d00002109200141346a2d00002114200141326a2f00002115200141316a2d00002116200141306a2d000021172001412e6a2f000021182001412d6a2d0000210c2001412c6a2d0000210d2001412a6a2f0000210e200141296a2d0000210f200141256a2800002102200141246a2d00002104200141226a2f00002105410021100c020b411441011037000b411541011037000b2003200a3703c806200320063a00c706200320133a00c606200320083b01c406200320093a00c306200320143a00c206200320153b01c006200320163a00bf06200320173a00be06200320183b01bc062003200c3a00bb062003200d3a00ba062003200e3b01b8062003200f3a00b706200320023600b306200320043a00b206200320053b01b006200341b8026a20034180056a2010410010c20120032d00b8022102024020032d00c0020d00200341dc026a280200450d00200341d8026a280200102a0b0240200241ff01714101470d00200341b8026a200341b0066a42808086bdbacdd21a420010a502024020032802b8024101470d0020032802c002210420032802bc022105410121060c0c0b200320032903c0023703c0082003200341c8026a2903003703c8082003200341c0086a3602800420034180046a109c010b410021050c080b200341e0066a2802002207410876212f200341b0066a412c6a2802002126200341b0066a41286a2802002104200341d4066a280200211a41012119200741ff01710d00200341b0066a41086a200341a0046a29030037030020034180056a41086a200341bc066a28020036020020032003290398043703b006200320032902b40637038005200341f8096a20034180056a1092014100210741002112410021190b200341f8006a20032903a802200341b0026a29030020032903a002220a4200109f05200329039802200a7d10e50320034188016a200341f8016a2003290378200341f8006a41086a29030010d001200341c0066a201e20034188016a41086a290300220b7d201d200329038801220a54ad7d200b201e7d200a201d54ad7d200a201d58200b201e58200b201e5122021b22051b221c3703002003201d200a7d200a201d7d20051b221b3703b8062003200a201d56200b201e5620021b2202ad220a3703b00641012105024020020d002003201b370380052003201c37038805200320034180056a3602c008200341c0086a109d014100210520032903b006210a0b200341b0066a41086a210202400240200a4200520d002005450d01200320023602800520034180056a109d010c010b200320023602800520034180056a109c010b20032802bc04210520032802b8042106200320032802b40422023602f804200320063602f404200320023602f00420032002200541b0016c6a22163602fc0402402005450d00200341c0086a410172210e200341e7076a210f200341e0076a4102722113200341b0066a41106a2110200341d8066a210d20034194076a2118200341f1066a2108200341d1066a2109200341b0066a4101722117200341a8076a2111034020022d0000210520034180056a200241016a41af01109a051a0240024020054103460d00200320053a00b006201720034180056a41af01109a052106024002400240024020050e03000102000b20032802b806211520032802bc06210620032802b4062105200f201041d800109a051a2003410c3a00c008200e200341e0076a41df00109a051a20052006200341c0086a10cc01410121064100211402402015450d002005102a0b410021150c020b20032f00b106210520032d00b306211420032802b406211520032d00b806210c20032900b906210a20032900c106210b20032900c906211d200341c0086a200d418801109a051a20132006290000370000201341086a200641086a290000370000201341106a200641106a290000370000201341186a200641186a29000037000020034180023b01e007200341c8096a200341c0086a200341e0076a10f401200320032d00d0094102463a00e9082003201d3700e1082003200b3700d9082003200a3700d1082003200c3a00d008200320153602cc08200320143a00cb08200320053b00c908200341043a00c8082003410c3a00c008410021064101211441014100200341c0086a10cc01410021150c010b2011290300210a20032903a007210b200341c8096a41186a200641186a290000370300200341c8096a41106a200641106a290000370300200341c8096a41086a200641086a290000370300200320062900003703c809200341e0076a41186a200941186a290000370300200341e0076a41106a200941106a290000370300200341e0076a41086a200941086a290000370300200320092900003703e007200341c0086a41186a200841186a290000370300200341c0086a41106a200841106a290000370300200341c0086a41086a200841086a290000370300200320082900003703c008200341e8096a41086a201841086a280200360200200320182902003703e809200341c8096a200341e0076a200341c0086a200b200a200341e8096a10f8034101211441012106410121150b024020032d00b006220541014b0d000240024020050e020001000b2014450d03024020032802b806450d0020032802b406102a0b20032d00c0064105490d0320032802e806450d0320032802e406102a0c030b2006450d02200d106a0c020b201520032802980745720d01200328029407102a0c010b2003200241b0016a3602f8040c020b200241b0016a22022016470d000b200320163602f8040b200341f0046a10690240200328028c042202450d0020034190046a280200450d002002102a0b02402019450d0020034180046a411c6a280200210220032802a40421080240024020032802a00422060d00200221050c010b2006211320022105034020052802880b21052013417f6a22130d000b0340200220022f01064102746a41880b6a28020021022006417f6a22060d000b0b200341b0066a411c6a20022f0106360200200341c8066a4100360200200341c4066a2002360200200320083602d006200341003602c006200342003703b806200320053602b406200341003602b006200341b0066a109b010b024020120d0041002105024020040d00410021040c020b201a102a0c010b0240201a0d00410021050c010b0240202f410874200741ff017172450d002026102a0b201a21050b4100210841012106410121130c080b41002113410121062008450d032009102a410121080c070b410121132008450d002009102a0b200341086a200b201b4200201e20051b221e4200109f05200a201e7d10e503200341186a20034180046a2003290308200341086a41086a29030010d001200341c0066a201c200341186a41086a290300220b7d201d2003290318220a54ad7d200b201c7d200a201d54ad7d200a201d58200b201c58200b201c5122051b22061b221b3703002003201d200a7d200a201d7d20061b221e3703b8062003200a201d56200b201c5620051b2205ad220a3703b00641012106024020050d002003201e3703c0082003201b3703c8082003200341c0086a3602e007200341e0076a109d014100210620032903b006210a0b200341b0066a41086a210502400240200a4200520d002006450d01200320053602c008200341c0086a109d010c010b200320053602c008200341c0086a109c010b41002106410021052013450d04200221050c040b41012113410021062008450d002009102a0b410121080c030b0b410121060b41012113410121080b024020012d0000417e6a220241024b0d00024002400240024020020e03000102000b2006450d03200141086a280200450d03200141046a280200102a0c030b20130d010c020b2008450d01200141286a280200450d01200141246a280200102a0c010b2001412c6a280200450d00200141286a280200102a0b2000200436020420002005360200200341800a6a24000be90604057f027e067f027e23004190016b2202240041002103200241003a008801200128020421040240024003402004450d01200241e8006a20036a200128020022052d00003a000020012004417f6a22043602042001200541016a3602002002200341016a22063a0088012006210320064120470d000b200241086a41086a200241e8006a41086a290300370300200241086a41106a200241e8006a41106a290300370300200241086a41186a200241e8006a41186a29030037030020022002290368370308024020044110490d00200541096a2900002107200529000121082001200441706a22093602042001200541116a36020041002103200241003a008801416f210a0340024020092003470d000240200341ff0171450d00200241003a0088010b200042013703000c040b200241e8006a20036a200520036a220641116a2d00003a00002001200420036b416f6a3602042001200641126a3602002002200341016a22063a008801200a417f6a210a2006210320064120470d000b200241286a41086a220b200241e8006a41086a2203290300370300200241286a41106a220c200241e8006a41106a220a290300370300200241286a41186a220d200241e8006a41186a2209290300370300200220022903683703280240200420066b220441706a4110490d002003200241086a41086a290300370300200a200241086a41106a2903003703002009200241086a41186a290300370300200241c8006a41086a220e200b290300370300200241c8006a41106a220b200c290300370300200241c8006a41186a220c200d290300370300200520066a220641116a290000210f200641196a29000021102001200441606a3602042001200641216a3602002002200229030837036820022002290328370348200041206a2010370300200041186a200f370300200041106a200737030020002008370308200041286a2002290368370300200041306a2003290300370300200041386a200a290300370300200041c0006a2009290300370300200041c8006a2002290348370300200041d0006a200e290300370300200041d8006a200b290300370300200041e0006a200c290300370300200042003703000c030b200042013703000c020b200042013703000c010b0240200341ff0171450d00200241003a0088010b200042013703000b20024190016a24000ba80302067f027e230041d0006b2204240002400240411810282205450d00200541002900e3e140370000200541106a41002900f3e140370000200541086a41002900ebe140370000200442988080808003370224200420053602202001200441206a108f012004280228210520042802202106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020062005200441306a1000200441186a2007290300370300200441106a2008290300370300200441086a20092903003703002004200429033037030002402004280224450d002004280220102a0b2004410036023020044120200441306a100621050240024020042802302206417f470d004200210a4200210b0c010b20064110490d02200541086a290000210b2005290000210a2005102a0b2001200a2002200a200a200256200b200356200b2003511b22051b22027d200b2003200b20051b22037d200a200254ad7d1090022000200337030820002002370300200441d0006a24000f0b411841011037000b41c4d1c3004133200441306a419cd9c3001038000be40602067f047e230041e0006b22042400024002400240024002400240411410282205450d00200541002900cfe140370000200541106a41002800dfe140360000200541086a41002900d7e14037000020044294808080c002370234200420053602302001200441306a108f012004280238210520042802302106200441c0006a41186a22074200370300200441c0006a41106a22084200370300200441c0006a41086a220942003703002004420037034020062005200441c0006a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429034037031002402004280234450d002004280230102a0b20044100360240200441106a4120200441c0006a100621050240024020042802402206417f470d004200210a4200210b0c010b20064110490d02200541086a290000210b2005290000210a2005102a0b0240200a2002542205200b200354200b2003511b450d00418991c1002105411521010c060b200441086a20014104200a20027d220a200b20037d2005ad7d220b10bc01200428020822050d04411810282205450d02200541002900e3e140370000200541106a41002900f3e140370000200541086a41002900ebe140370000200442988080808003370234200420053602302001200441306a108f012004280238210520042802302106200441c0006a41186a22074200370300200441c0006a41106a22084200370300200441c0006a41086a220942003703002004420037034020062005200441c0006a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429034037031002402004280234450d002004280230102a0b20044100360240200441106a4120200441c0006a100621050240024020042802402206417f470d004200210c4200210d0c010b20064110490d04200541086a290000210d2005290000210c2005102a0b2001200c20027c2202200d20037c2002200c54ad7c1090022001200a200b108f02410021050c050b411441011037000b41c4d1c3004133200441c0006a419cd9c3001038000b411841011037000b41c4d1c3004133200441c0006a419cd9c3001038000b200428020c21010b2000200136020420002005360200200441e0006a24000bd9140a057f017e067f037e037f017e017f027e077f057e23002204210520044180026b4160712204240002400240200141ffffff3f712001470d0020014105742206417f4c0d0002400240024020060d00410121070c010b200610282207450d010b410021084100210602402001450d002001410574210820072106034020062000290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a290000370000200641206a2106200041206a2100200841606a22080d000b200141057441606a41057641016a2106200121080b20042006360218200420083602142004200736021020072006410041202006676b10c40242002109200441b0016a41086a22004200370300200442003703b00141cf96c300411d200441b0016a1008200441e0016a41086a2000290300370300200420042903b0013703e001200441003602b001200441e0016a4110200441b0016a1006210602400240024020042802b0012200417f460d0020042000360294012004200636029001200441b0016a20044190016a106d20042802b001220a450d0220042902b40121092000450d012006102a0c010b4101210a0b2009422088a72200450d032000410574210b200441e0016a410c6a210c200441e0016a411472210d200441e0016a410872210e200441c0006a410c72210f200a210002400340200041086a2900002110200041106a290000211120002900002112200441206a41186a2213200041186a290000370300200441206a41106a22142011370300200441206a41086a22152010370300200420123703200240024002400240411a10282206450d00200641002900ec96432216370000200641186a41002f0084974322173b0000200641106a41002900fc96432218370000200641086a41002900f4964322193700002004429a808080a0033702b401200420063602b0012004200441b0016a3602e001200441206a200441e0016a10c80120042802b001210720042802b801211a200441e0016a41186a22014200370300200441e0016a41106a22064200370300200441e0016a41086a22084200370300200442003703e0012007201a200441e0016a100020044190016a41186a221b200129030037030020044190016a41106a221c200629030037030020044190016a41086a221a2008290300370300200420042903e00137039001024020042802b401450d0020042802b001102a0b200441003602e00120044190016a4120200441e0016a1006211d20042802e0012207417f460d02200420073602642004201d360260200441e0016a200441e0006a10b30320042802e801221e450d01200441b0016a41086a221f200c41086a290200370300200441b0016a41106a2220200c41106a2802003602002004200c2902003703b00120042903e001211002402007450d00201d102a0b200f20042903b00122113702002006202028020022073602002008201f2903002212370300200f41086a2012370200200f41106a2007360200200420113703e001200420103703400c030b411a41011037000b41c4d1c3004133200441d0016a419cd9c3001038000b2006200441b0016a41106a2802003602002008200441b0016a41086a290300370300200420042903b0013703e0014100211e0b2004201e360248200441003602e80120042903582112200420042903f801222137035820042903502122200420042903f001222337035020042903402124200420042903e001221137034020042903482110200420042903e80122253703482025a72107024002402010a7221d0d002025211020232122202121120c010b200420243703e001200420103703e801200420223703f001200420123703f8012004201d2022a74105746a3602bc012004201d3602b80120042010422088a73602b4012004201d3602b0012004200441106a3602c00120044190016a200441b0016a108401200e41086a201a280200360200200e20042903900137020020042022422088a7221d2012422088a74105746a3602bc012004201d3602b80120042012a73602b4012004201d3602b0012004200441106a3602c00120044190016a200441b0016a108401200d41086a201a280200360200200d20042903900137020020042903e801211020042903e001211120042903f801211220042903f001212202402007450d002021a7211d02402025422088a7450d002007102a0b201d450d002023422088a7102a0b200420113703402004201037034820042022370350200420123703582010a721070b2004201137036020042010370368200420223703702004201237037802400240024020070d00200441b0016a41186a2013290300370300200441b0016a41106a2014290300370300200441b0016a41086a2015290300370300200420042903203703b001411a10282207450d0220072016370000200741186a20173b0000200741106a2018370000200741086a20193700002004429a808080a0033702d401200420073602d0012004200441d0016a3602e001200441b0016a200441e0016a10c80120042802d001210720042802d801211d200142003703002006420037030020084200370300200442003703e0012007201d200441e0016a1000201b2001290300370300201c2006290300370300201a2008290300370300200420042903e00137039001024020042802d401450d0020042802d001102a0b20044190016a412010090c010b200441b0016a41186a2013290300370300200441b0016a41106a2014290300370300200441b0016a41086a2015290300370300200420042903203703b001411a10282207450d0320072016370000200741186a20173b0000200741106a2018370000200741086a20193700002004429a808080a0033702d401200420073602d0012004200441d0016a3602e001200441b0016a200441e0016a10c80120042802d001210720042802d801211d200142003703002006420037030020084200370300200442003703e0012007201d200441e0016a1000201b2001290300370300201c2006290300370300201a2008290300370300200420042903e00137039001024020042802d401450d0020042802d001102a0b200441203602e401200420044190016a3602e001200441e0006a200441e0016a10b4030b02402010a72206450d002012a7210802402010422088a7450d002006102a0b2008450d002022422088a7102a0b200041206a2100200b41606a220b0d010c060b0b411a41011037000b411a41011037000b41c4d1c3004133200441d0016a419cd9c3001038000b200641011037000b1036000b02402009a7450d00200a102a0b200441003602e801200442013703e0012003200441e0016a10b40102402003450d002003410574210003402002200441e0016a108f01200241206a2102200041606a22000d000b0b20042802e401210620042802e801210820042802e0012100200441b0016a41086a22014200370300200442003703b0014196f0c200411b200441b0016a1008200441e0016a41086a2001290300370300200420042903b0013703e001200441e0016a411020002008100702402006450d002000102a0b02402004280214450d002004280210102a0b200524000bb80901177f230041206b220424002002410020031b21052000410020011b2106200241206a200220031b2107200041206a200020011b2108200020014105746a2109200220034105746a210a4100210b4100210c4101210d4100210e4100210f41012110024002400340200b4101742111200b4105742112024002400240024002400340024020050d0020072113200d2114200c2115200b21160c040b2005210220072103200d2114200c2115200b2116201221172011211802400340024002402006450d0020022006460d06200220064120109c052213450d062013417f4c0d01200321072014210d2015210c2016210b200221050c080b200441186a2203200541186a290000370300200441106a2216200541106a290000370300200441086a2206200541086a290000370300200420052900003703000240200b200c470d00200b41016a2202200b490d0c200b41017422172002201720024b1b220c41ffffff3f71200c470d0c200c41057422024100480d0c02400240200b0d0020021028210d0c010b200d200b4105742002102c210d0b200d450d030b200d200b4105746a22022004290300370000200241186a2003290300370000200241106a2016290300370000200241086a200629030037000041002106410020072007200a4622021b2105201141026a2111201241206a2112200b41016a210b2007200741206a20021b21070c030b200441186a2213200241186a290000370300200441106a2219200241106a290000370300200441086a221a200241086a29000037030020042002290000370300024020162015470d00201641016a22022016490d0b20182002201820024b1b221541ffffff3f712015470d0b201541057422024100480d0b0240024020160d002002102821140c010b201420172002102c21140b2014450d040b201420176a22022004290300370000200241186a2013290300370000200241106a2019290300370000200241086a201a290300370000410020032003200a4622131b2102201841026a2118201741206a2117201641016a21162003200341206a20131b221321032002450d050c000b0b0b200241011037000b200241011037000b2014210d2015210c2016210b2003200341206a2003200a4622021b210741002008200820094622161b21064100200320021b21052008200841206a20161b21080c030b410021052006450d01201321072014210d2015210c2016210b0b200441186a2203200641186a290000370300200441106a2216200641106a290000370300200441086a2217200641086a290000370300200420062900003703000240200e200f470d00200e41016a2202200e490d04200e41017422062002200620024b1b220f41ffffff3f71200f470d04200f41057422024100480d0402400240200e0d002002102821100c010b2010200e4105742002102c21100b2010450d030b2010200e4105746a22022004290300370000200241186a2003290300370000200241106a2016290300370000200241086a201729030037000041002008200820094622021b2106200e41016a210e2008200841206a20021b21080c010b0b201420162000200110840202402015450d002014102a0b0240200f450d002010102a0b200441206a24000f0b200241011037000b1031000ba8ca0106017f027e057f017e217f0b7e230041e0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e0b000102030405060c0d0e0f000b20034184036a4101360200200342013702f402200341ccd1c5003602f002200341043602b404200341c4d1c5003602b0042003200341b0046a36028003200341f0026a41a0f8c100103e000b200141206a2903002104200141186a29030021052001410c6a2802002106200141086a2802002107200141146a2802002108200141106a28020021092001280204210a2002411a6a290100210b200241196a2d0000210c200241186a2d0000210d200241166a2f0100210e200241156a2d0000210f200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d000021152002410c6a2d000021162002410a6a2f01002117200241096a2d0000211841042119200241046a2d0000211a200241026a2f0100211b0240024020022d00000d0020022d00014101470d00200241056a2d00002119200241066a2f0100211c200241086a2d000021024100211d0c010b4101211d410021024100211c0b2003200b370380012003200c3a007f2003200d3a007e2003200e3b017c2003200f3a007b200320103a007a200320113b0178200320123a0077200320133a0076200320143b0174200320153a0073200320163a0072200320173b0170200320183a006f2003201a3a006a2003201b3b01682003201c41ffff0371410874200241187472201941ff017172221c36006b201d450d0e410f210241ea9fc60021190240024002400240024002400240201c0e0700010203040506000b200328006f2119200328007321020c050b410e210241dc9fc60021190c040b410c210241d09fc60021190c030b4109210241c79fc60021190c020b4113210241b49fc60021190c010b4111210241a39fc60021190b4100210c4101211d2007450d43200a102a0c430b200141206a2903002104200141186a29030021052001410c6a2802002106200141086a280200211b200141146a2802002108200141106a28020021092001280204210a2002411a6a290100210b200241196a2d0000210c200241186a2d00002107200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002110200241116a2d00002111200241106a2d000021122002410e6a2f010021132002410d6a2d000021142002410c6a2d000021152002410a6a2f01002116200241096a2d0000211741042119200241046a2d00002118200241026a2f0100211a0240024020022d00000d0020022d00014101470d00200241056a2d00002119200241066a2f0100211c200241086a2d000021024100211d0c010b4101211d410021024100211c0b2003200b3703e8022003200c3a00e702200320073a00e6022003200d3b01e4022003200e3a00e3022003200f3a00e202200320103b01e002200320113a00df02200320123a00de02200320133b01dc02200320143a00db02200320153a00da02200320163b01d802200320173a00d702200320183a00d2022003201a3b01d0022003201c41ffff0371410874200241187472201941ff017172221c3600d3020240201d450d00410f210241ea9fc6002119024002400240024002400240201c0e0700010203040548000b20032800d702211920032800db0221020c470b410e210241dc9fc60021190c460b410c210241d09fc60021190c450b4109210241c79fc60021190c440b4113210241b49fc60021190c430b4111210241a39fc60021190c420b20034188046a41186a200341d0026a41186a29030037030020034188046a41106a200341d0026a41106a29030037030020034188046a41086a200341d0026a41086a290300370300200320032903d00237038804410d10282202450d0e200241002900b0f841370000200241056a41002900b5f8413700002003428d808080d0013702f402200320023602f00220034188046a200341f0026a108f0120032802f802210220032802f0022119200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a220c4200370300200342003703b00420192002200341b0046a1000200341e8006a41186a201c290300370300200341e8006a41106a201d290300370300200341e8006a41086a200c290300370300200320032903b004370368024020032802f402450d0020032802f002102a0b200341003602f002200341e8006a4120200341f0026a1006211c20032802f002221d417f460d3f201c450d3f41002102200341003a009003024002400340201d2002460d01200341f0026a20026a201c20026a2d00003a00002003200241016a22193a0090032019210220194120470d000b200341b0046a41186a2202200341f0026a41186a290300370300200341b0046a41106a200341f0026a41106a290300370300200341b0046a41086a200341f0026a41086a290300370300200320032903f0023703b004201941ff0171411f4d0d01200341e0036a41086a2219200341c3046a290000370300200341e0036a410d6a220c2002290000370000200341e8016a41026a220720032d00b2043a0000200341a8026a41086a2019290300370300200341a8026a410d6a220d200c290000370000200320032f01b0043b01e801200320032900bb043703a80220032800b304211920032800b70421020240201d450d00201c102a0b200341b0046a41026a20072d00003a0000200341f0026a41086a200341a8026a41086a290300370300200341f0026a410d6a200d290000370000200320032f01e8013b01b004200320032903a8023703f0024101211c0c420b200241ff0171450d00200341003a0090030b41c4d1c3004133200341d8046a419cd9c3001038000b200141216a290000210b200141206a2d000021072001411d6a2f0000210d2001411c6a2d0000210e200141196a2f0000210f200141186a2d00002110200141156a2f00002111200141146a2d00002112200141116a2f00002113200141106a2d000021142001410c6a280200211c200141086a2d0000211e200141306a280200211f2001412c6a280200212020012d001f211520012d001b211620012d0017211720012d0013211820012d000b211a20012f0009211b200128020421212002411a6a2901002104200241196a2d00002122200241186a2d00002123200241166a2f01002124200241156a2d00002125200241146a2d00002126200241126a2f01002127200241116a2d00002128200241106a2d0000210a2002410e6a2f010021062002410d6a2d000021082002410c6a2d000021092002410a6a2f01002129200241096a2d0000212a41042119200241046a2d0000212b200241026a2f0100212c0240024020022d00000d0020022d00014101470d00200241056a2d00002119200241066a2f0100211d200241086a2d000021024100210c0c010b4101210c410021024100211d0b201d41ffff0371410874200241187472201941ff017172211d0240200c450d00410f210241ea9fc60021190240201d0e0700050607083e3f000b2029410874202a7220094118747221192006410874200872200a4118747221020c3e0b200320043703a002200320223a009f02200320233a009e02200320243b019c02200320253a009b02200320263a009a02200320273b019802200320283a0097022003200a3a009602200320063b019402200320083a009302200320093a009202200320293b0190022003202a3a008f022003201d36008b022003202b3a008a022003202c3b0188020240201e41ff01714101470d00200341f0026a201c41067610fe0120032802f00221190240024020032802f802201c413f7122024b0d00410021020c010b201920024105746a2202290018210b20022d0017210720022d0016211520022f0014210d20022d0013210e20022d0012211620022f0010210f20022d000f211020022d000e211720022f000c211120022d000b211220022d000a211820022f0008211320022d000721142002280003211c20022d0002211a20022f0000211b410121020b024020032802f402450d002019102a0b2002450d3c0b2003200b3703c002200320073a00bf02200320153a00be022003200d3b01bc022003200e3a00bb02200320163a00ba022003200f3b01b802200320103a00b702200320173a00b602200320113b01b402200320123a00b302200320183a00b202200320133b01b002200320143a00af022003201c3600ab022003201a3a00aa022003201b3b01a802200341b0046a41086a22024200370300200342003703b00441b8a2c1004114200341b0046a1008200341e8006a41086a2002290300370300200320032903b0043703680240200341e8006a41104101410041001003417f460d0041bdf8c1002119412621020c3e0b411310282202450d0e200241002900c2a3413700002002410f6a41002800d1a341360000200241086a41002900caa34137000020034293808080b0023702f402200320023602f00220034188026a200341f0026a108f0120032802f802210220032802f0022119200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a220c4200370300200342003703b00420192002200341b0046a1000200341d0026a41186a201c290300370300200341d0026a41106a201d290300370300200341d0026a41086a200c290300370300200320032903b0043703d002024020032802f402450d0020032802f002102a0b200341003602f002200341d0026a4120200341f0026a1006210220032802f0022219417f460d102002450d10200320193602b404200320023602b004200341f0026a200341b0046a10c20220032903f0024201510d0f02402019450d002002102a0b411310282202450d11200241002900c2a3413700002002410f6a41002800d1a341360000200241086a41002900caa34137000020034293808080b0023702f402200320023602f002200341a8026a200341f0026a108f0120032802f802210220032802f0022119200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a220c4200370300200342003703b00420192002200341b0046a1000200341d0026a41186a201c290300370300200341d0026a41106a201d290300370300200341d0026a41086a200c290300370300200320032903b0043703d002024020032802f402450d0020032802f002102a0b200341003602f002200341d0026a4120200341f0026a1006210220032802f0022219417f460d132002450d13200320193602b404200320023602b004200341f0026a200341b0046a10c20220032903f0024201510d1220034198036a280200211002402019450d002002102a0b200341b0046a41086a22024200370300200342003703b004418891c6004111200341b0046a1008200341e8006a41086a2002290300370300200320032903b00437036841002119200341003602f002200341e8006a4110200341f0026a10062102024020032802f002221c417f460d002002450d00201c4104490d15200228000021192002102a0b02402019201f460d0041e3f8c1002119411621020c3e0b0240201041016a201f490d0041f9f8c1002119411f21020c3e0b410e10282202450d15200241066a41002900b2a441370000200241002900aca4413700002002410e411c102c2202450d162002202141067636000e200341b0046a41186a22194200370300200341b0046a41106a221c4200370300200341b0046a41086a221d4200370300200342003703b00420024112200341b0046a1000200341d0026a41186a2019290300370300200341d0026a41106a201c290300370300200341d0026a41086a201d290300370300200320032903b0043703d0022002102a200341003602f002200341d0026a4120200341f0026a1006210220032802f0022219417f460d342002450d34200320193602b404200320023602b004200341f0026a200341b0046a107420032802f002220c450d172021413f71211c20032902f402210b02402019450d002002102a0b4100211d201c200b422088a74f0d32200c201c41216c6a22192d00004101470d32200341a6016a201941036a2d00003a000020034188016a41086a201941146a29000037030020034195016a201941196a290000370000200320192f00013b01a40120032019410c6a29000037038801201941086a2800002102201941046a28000021194101211d0c330b2001280204211b2002411a6a290100210b200241196a2d0000210c200241186a2d00002107200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002110200241116a2d00002111200241106a2d000021122002410e6a2f010021132002410d6a2d000021142002410c6a2d000021152002410a6a2f01002116200241096a2d0000211741042119200241046a2d00002118200241026a2f0100211a0240024020022d00000d0020022d00014101470d00200241056a2d00002119200241066a2f0100211c200241086a2d000021024100211d0c010b4101211d410021024100211c0b2003200b3703e8022003200c3a00e702200320073a00e6022003200d3b01e4022003200e3a00e3022003200f3a00e202200320103b01e002200320113a00df02200320123a00de02200320133b01dc02200320143a00db02200320153a00da02200320163b01d802200320173a00d702200320183a00d2022003201a3b01d0022003201c41ffff0371410874200241187472201941ff017172221c3600d3020240201d450d00410f210241ea9fc60021190240201c0e0700040506073d3e000b20032800d702211920032800db0221020c3d0b20034188046a41186a200341d0026a41186a29030037030020034188046a41106a200341d0026a41106a29030037030020034188046a41086a200341d0026a41086a290300370300200320032903d00237038804200341b0046a41086a22024200370300200342003703b00441b8a2c1004114200341b0046a1008200341e8006a41086a2002290300370300200320032903b0043703680240200341e8006a41104101410041001003417f460d0041d9fac1002119411e21020c3d0b411310282202450d17200241002900c2a3413700002002410f6a41002800d1a341360000200241086a41002900caa34137000020034293808080b0023702f402200320023602f00220034188046a200341f0026a108f0120032802f802211920032802f002211c41182102200341b0046a41186a221d4200370300200341b0046a41106a220c4200370300200341b0046a41086a22074200370300200342003703b004201c2019200341b0046a1000200341d0026a41186a201d290300370300200341d0026a41106a200c290300370300200341d0026a41086a2007290300370300200320032903b0043703d002024020032802f402450d0020032802f002102a0b0240200341d0026a41204101410041001003417f470d0041f7fac10021190c3d0b410e10282202450d18200241066a41002900b2a441370000200241002900aca4413700002002410e411c102c2219450d192019201b41067636000e41182102200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a220c4200370300200342003703b00420194112200341b0046a1000200341e8006a41186a201c290300370300200341e8006a41106a201d290300370300200341e8006a41086a200c290300370300200320032903b0043703682019102a200341003602b004200341e8006a4120200341b0046a1006211c20032802b0042219417f460d1b200320193602e4032003201c3602e003200341b0046a200341e0036a107420032802b004221d450d1a201b413f71210220032902b404210b02402019450d00201c102a0b4100211c2002200b422088a74f0d2e201d200241216c6a22192d00004101470d2e20034186026a201941036a2d00003a0000200341e8016a41086a201941146a290000370300200341f5016a201941196a290000370000200320192f00013b01840220032019410c6a2900003703e801201941086a2800002102201941046a28000021194101211c0c2f0b2001280204210c2002411a6a290100210b200241196a2d00002112200241186a2d00002113200241166a2f01002114200241156a2d00002115200241146a2d00002116200241126a2f01002117200241116a2d00002118200241106a2d000021072002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d0000211141042119200241046a2d0000211a200241026a2f0100211b0240024020022d00000d0020022d00014101470d00200241056a2d00002119200241066a2f0100211c200241086a2d000021024100211d0c010b4101211d4100211c410021020b201c41ffff0371410874201941ff017172200241187472211c0240201d450d00410f210241ea9fc60021190240201c0e0700030405063c3d000b2010410874201172200f411874722119200d410874200e7220074118747221020c3c0b2003200b3703a004200320123a009f04200320133a009e04200320143b019c04200320153a009b04200320163a009a04200320173b019804200320183a009704200320073a0096042003200d3b0194042003200e3a0093042003200f3a009204200320103b019004200320113a008f042003201c36008b042003201a3a008a042003201b3b018804411610282202450d1b20024100290093a2413700002002410e6a41002900a1a241370000200241086a410029009ba24137000020034296808080e0023702f402200320023602f00220034188046a200341f0026a108f0120032802f802210220032802f0022119200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a22074200370300200342003703b00420192002200341b0046a1000200341e8006a41186a201c290300370300200341e8006a41106a201d290300370300200341e8006a41086a2007290300370300200320032903b004370368024020032802f402450d0020032802f002102a0b4101211d0240200341e8006a41204101410041001003417f460d00418ffbc1002119411e21024101210c0c400b200341b0046a41086a22024200370300200342003703b00441bf91c6004116200341b0046a1008200341e8006a41086a2002290300370300200320032903b0043703684100211c200341003602f002200341e8006a4110200341f0026a10062102024020032802f0022219417f460d002002450d0020194104490d1d2002280000211c2002102a0b200341b0046a41086a22024200370300200342003703b00441b0a3c1004112200341b0046a1008200341e8006a41086a2002290300370300200320032903b004370368200341003602f002200341e8006a4110200341f0026a100621020240024020032802f0022219417f460d002002450d00200320193602b404200320023602b004200341f0026a200341b0046a106d20032802f0022207450d1f20032902f402210b02402019450d002002102a0b200b422088a7210d0c010b4100210d4200210b410121070b0240024002400240201c200c470d00200d200c460d010b41adfbc100211941162102200d200c4d0d01200c200b422088a7220d4f0d2120034188036a420037030020034180036a4200370300200341f8026a4200370300200342003703f0022007200c4105746a220d200341f0026a460d00200d200341f0026a4120109c050d010b200341306a20034188046a4280809aa6eaafe30142001083022003280230450d0141c3fbc1002119411e21020b0240200ba7450d002007102a0b4101210c0c400b200341b0046a41086a22024200370300200342003703b004418891c6004111200341b0046a1008200341e8006a41086a2002290300370300200320032903b00437036841002119200341003602f002200341e8006a4110200341f0026a10062102024020032802f002221d417f460d002002450d00201d4104490d20200228000021192002102a0b411610282202450d2020024100290093a2413700002002410e6a41002900a1a241370000200241086a410029009ba24137000020034296808080e0023702f402200320023602f00220034188046a200341f0026a108f0120032802f802210220032802f002211d200341b0046a41186a220d4200370300200341b0046a41106a220e4200370300200341b0046a41086a220f4200370300200342003703b004201d2002200341b0046a1000200341e8006a41186a200d290300370300200341e8006a41106a200e290300370300200341e8006a41086a200f290300370300200320032903b004370368024020032802f402450d0020032802f002102a0b410810282202450d212002200c36000420022019360000200341e8006a41202002410810072002102a200ba7211d02400240200c200b422088a72202460d00200341d0026a41186a220d20034188046a41186a290300370300200341d0026a41106a220e20034188046a41106a290300370300200341d0026a41086a20034188046a41086a29030037030020032003290388043703d002200c20024f0d242007200c4105746a221920032903d002370000201941186a200d290300370000201941106a200e290300370000201941086a200341d0026a41086a2903003700000c010b200341d0026a41186a221920034188046a41186a290300370300200341d0026a41106a220d20034188046a41106a290300370300200341d0026a41086a20034188046a41086a29030037030020032003290388043703d0020240200c201d470d00200c41016a2202200c490d38200c410174221d2002201d20024b1b221d41ffffff3f71201d470d38201d41057422024100480d3802400240200c0d002002102821070c010b2007200c4105742002102c21070b2007450d25200b422088a7210c0b2007200c4105746a220220032903d002370000200241186a2019290300370000200241106a200d290300370000200241086a200341d0026a41086a290300370000200c41016a21020b200341b0046a41086a22194200370300200342003703b00441b0a3c1004112200341b0046a1008200341e8006a41086a2019290300370300200320032903b004370368200341003602f802200342013703f0022002200341f0026a10b40102402002450d00200241057421192007210203402002200341f0026a108f01200241206a2102201941606a22190d000b0b20032802f4022102200341e8006a411020032802f002221920032802f802100702402002450d002019102a0b0240201d450d002007102a0b200341b0046a41086a22024200370300200342003703b00441bf91c6004116200341b0046a1008200341e8006a41086a2002290300370300200320032903b0043703684101211d2003201c41016a3602f002200341e8006a4110200341f0026a41041007410021194101210c0c3f0b200141386a2903002104200141306a29030021052001411d6a290000210b2001411c6a2d00002112200141196a2f00002113200141186a2d00002114200141156a2f00002115200141146a2d00002116200141116a2f00002117200141106a2d000021182001410d6a2f0000211a2001410c6a2d0000211b200141086a280200210c200141286a280200211f20012d001b210a20012d0017210620012d0013210820012d000f210920012d0007212920012f0005212a20012d0004212c2002411a6a290100212d200241196a2d0000211e200241186a2d00002122200241166a2f01002123200241156a2d00002124200241146a2d00002125200241126a2f01002126200241116a2d00002127200241106a2d000021072002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d0000211141042119200241046a2d00002128200241026a2f0100212b0240024020022d00000d0020022d00014101470d00200241056a2d00002119200241066a2f0100211c200241086a2d000021024100211d0c010b4101211d4100211c410021020b201c41ffff0371410874201941ff017172200241187472211c201d450d04410f210241ea9fc60021190240201c0e0700010203043a3b000b2010410874201172200f411874722119200d410874200e7220074118747221020c3a0b410e210241dc9fc60021190c390b410c210241d09fc60021190c380b4109210241c79fc60021190c370b4113210241b49fc60021190c360b2003202d3703f8032003201e3a00f703200320223a00f603200320233b01f403200320243a00f303200320253a00f203200320263b01f003200320273a00ef03200320073a00ee032003200d3b01ec032003200e3a00eb032003200f3a00ea03200320103b01e803200320113a00e7032003201c3600e303200320283a00e2032003202b3b01e0030240200520048450450d00419ffcc100211941d00021020c360b02400240202c41ff01714101470d00200341f0026a200c41067610fe0120032802f00221190240024020032802f802200c413f7122024b0d00410021020c010b201920024105746a2202290018210b20022d0017211220022d0016210a20022f0014211320022d0013211420022d0012210620022f0010211520022d000f211620022d000e210820022f000c211720022d000b211820022d000a210920022f0008211a20022d0007211b2002280003210c20022d0002212920022f0000212a410121020b024020032802f402450d002019102a0b20020d00410121020c010b410021020b2003200b3701e802200320123a00e7022003200a3a00e602200320133b01e402200320143a00e302200320063a00e202200320153b01e002200320163a00df02200320083a00de02200320173b01dc02200320183a00db02200320093a00da022003201a3b01d8022003201b3a00d7022003200c3600d302200320293a00d2022003202a3b01d00220020d3320034188046a41186a200341d0026a41186a29010037030020034188046a41106a200341d0026a41106a29010037030020034188046a41086a200341d0026a41086a290100370300200320032901d00237038804200341b0046a41086a22024200370300200342003703b004418891c6004111200341b0046a1008200341e8006a41086a2002290300370300200320032903b00437036841002119200341003602f002200341e8006a4110200341f0026a10062102024020032802f002221c417f460d002002450d00201c4104490d1f200228000021192002102a0b02402019201f460d00418efcc1002119411121020c360b200341b0046a41086a22024200370300200342003703b00441b8a2c1004114200341b0046a1008200341e8006a41086a22192002290300370300200320032903b004370368200341f0026a200341e8006a10be02024020032802f802220d0d0041e1fbc1002119412d21020c360b20032902fc02212e20024200370300200342003703b00441ad91c6004112200341b0046a100820192002290300370300200320032903b00437036841002119200341003602f002200341e8006a4110200341f0026a10062102024020032802f002221c417f460d002002450d00201c4104490d20200228000021192002102a0b200341d8006a2019ad42004280a094a58d1d4200109f05200341d8006a41086a290300210b411410282202450d202003290358212f200241002900cfe140370000200241106a41002800dfe140360000200241086a41002900d7e14037000020034294808080c0023702d402200320023602d002200341e0036a200341d0026a108f0120032802d802210220032802d0022119200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a220c4200370300200342003703b00420192002200341b0046a1000200341f0026a41186a201c290300370300200341f0026a41106a201d290300370300200341f0026a41086a200c290300370300200320032903b0043703f002024020032802d402450d0020032802d002102a0b200341003602b004200341f0026a4120200341b0046a1006210220032802b0042219417f460d252002450d2520194110490d21200241086a290000212d200229000021302002102a0c260b4101211d20022d000120022d0000720d2320012802042102200341b0046a41086a22194200370300200342003703b00441f490c6004114200341b0046a1008200341e8006a41086a2019290300370300200320032903b004370368200320023602f002200341e8006a4110200341f0026a41041007410021194101210c0c380b024020022d000120022d000072450d0041a39fc6002119411121020c340b200141086a2802002119024020012d00044101460d00200141106a2d0000211c200141146a2d0000211d200141186a2d0000210c2001411c6a2d0000210720012f0005210220012d0007210d20012d000c210e20012f000d210f20012d000f211020012f0011211120012d0013211220012f0015211320012d0017211420012f0019211520012d001b2116200129001d210b0c210b200341f0026a201941067610fe0120032802f00221170240024020032802f8022019413f7122024b0d00410021180c010b201720024105746a2202290018210b20022d0017210720022d0016211620022f0014211520022d0013210c20022d0012211420022f0010211320022d000f211d20022d000e211220022f000c211120022d000b211c20022d000a211020022f0008210f20022d0007210e2002280003211920022d0002210d20022f00002102410121180b024020032802f402450d002017102a0b20180d20410121170c210b4101211d20022d000120022d0000720d2120012802042102200341b0046a41086a22194200370300200342003703b00441f0a2c100411c200341b0046a1008200341e8006a41086a2019290300370300200320032903b004370368200320023602f002200341e8006a4110200341f0026a41041007410021194101210c0c360b4101211d20022d000120022d0000720d2020012802042102200341b0046a41086a22194200370300200342003703b00441dca2c1004114200341b0046a1008200341e8006a41086a2019290300370300200320032903b004370368200320023602f002200341e8006a4110200341f0026a41041007410021194101210c0c350b200341d0026a41186a200341e8006a41186a290300220b370300200341d0026a41106a200341e8006a41106a290300222d370300200341d0026a41086a200341e8006a41086a290300222e37030020032003290368222f3703d002200341f0026a41186a200b370300200341f0026a41106a202d370300200341f0026a41086a202e3703002003202f3703f002200320063602b804200320073602b4042003200a3602b0042003200341f0026a200341b0046a200920082005200410d40220032802042102200328020021194100210c4101211d0c340b410d41011037000b411341011037000b41c4d1c3004133200341d8046a419cd9c3001038000b41c4f9c1002119411821020c2c0b411341011037000b41c4d1c3004133200341d8046a419cd9c3001038000b4198f9c1002119412c21020c290b41c4d1c3004133200341d8046a419cd9c3001038000b410e41011037000b411c41011037000b41c4d1c3004133200341d8046a419cd9c3001038000b411341011037000b410e41011037000b411c41011037000b41c4d1c3004133200341d8046a419cd9c3001038000b4101211c41a8fac10021190c140b411641011037000b41c4d1c3004133200341d8046a419cd9c3001038000b41c4d1c3004133200341d8046a419cd9c3001038000b41cca2c100200c200d1034000b41c4d1c3004133200341d8046a419cd9c3001038000b411641011037000b410841011037000b41a0a3c100200c20021034000b200241011037000b41c4d1c3004133200341d8046a419cd9c3001038000b41c4d1c3004133200341d8046a419cd9c3001038000b411441011037000b41c4d1c3004133200341d8046a419cd9c3001038000b410021170b2003200b37018001200320073a007f200320163a007e200320153b017c2003200c3a007b200320143a007a200320133b01782003201d3a0077200320123a0076200320113b01742003201c3a0073200320103a00722003200f3b01702003200e3a006f2003201936006b2003200d3a006a200320023b016820170d0f200341d0026a41186a200341e8006a41186a290100370300200341d0026a41106a200341e8006a41106a290100370300200341d0026a41086a200341e8006a41086a2202290100370300200320032901683703d002200341b0046a41086a22194200370300200342003703b00441a9a2c100410f200341b0046a100820022019290300370300200320032903b004370368200341003602f002200341e8006a4110200341f0026a10062102024002400240024002400240024020032802f0022219417f460d002002450d00200320193602b404200320023602b004200341f0026a200341b0046a107d20032802f002221c450d0220032902f402210b2019450d012002102a0c010b4200210b4104211c0b200ba72111024002400240200b422088a72207450d00201c200741246c221d6a210c410021190340200341f0026a41206a201c20196a220241206a280200360200200341f0026a41186a200241186a290200370300200341f0026a41106a200241106a290200370300200341f0026a41086a200241086a290200370300200320022902003703f002200341f0026a200341d0026a4120109c050d02201d201941246a2219470d000b0b4104210f4100210d024020110d00410021100c020b201c102a410021100c010b20034188046a41086a200341f0026a41086a290300220b370300200341e0036a41086a221d200b370300200341e0036a41106a220d200341f0026a41106a290300370300200341e0036a41186a220e200341f0026a41186a290300370300200341e0036a41206a2210200341f0026a41206a280200360200200320032903f002220b370388042003200b3703e00341241028220f450d02200f20032903e003370200200f41206a2010280200360200200f41186a200e290300370200200f41106a200d290300370200200f41086a201d29030037020002400240200741246c415c6a2019470d004101210d410121100c010b200241246a2113200c415c6a21144101210d4101211003402013210202400340200341f0026a41206a2219200241206a280200360200200341f0026a41186a221d200241186a290200370300200341f0026a41106a2207200241106a290200370300200341f0026a41086a220e200241086a290200370300200320022902003703f002200341f0026a200341d0026a4120109c050d01200c200241246a2202470d000c030b0b200341b0046a41206a2019280200221236020020034188046a41086a200e290300220b37030020034188046a41106a2007290300220437030020034188046a41186a201d290300220537030020034188046a41206a2012360200200320032903f002222d3703880420192012360200201d200537030020072004370300200e200b3703002003202d3703f00202402010200d470d00200d41016a2210200d490d15200d41017422122010201220104b1b2210ad42247e220b422088a70d15200ba722124100480d1502400240200d0d0020121028210f0c010b200f200d41246c2012102c210f0b200f450d060b200241246a2113200f200d41246c6a221220032903f002370200201241206a2019280200360200201241186a201d290300370200201241106a2007290300370200201241086a200e290300370200200d41016a210d20142002470d000b0b2011450d00201c102a0b200341b0046a41086a22024200370300200342003703b00441a9a2c100410f200341b0046a1008200341e8006a41086a2002290300370300200320032903b004370368200341003602f802200342013703f002200d200341f0026a10b4010240200d450d00200f200d41246c6a2107200f211903402019200341f0026a108f01201941206a280200211d0240024020032802f402221c20032802f80222026b4104490d0020032802f002211c0c010b200241046a220c2002490d14201c4101742202200c2002200c4b1b22024100480d1402400240201c0d0020021028211c0c010b20032802f002201c2002102c211c0b201c450d06200320023602f4022003201c3602f00220032802f80221020b2003200241046a3602f802201c20026a201d3600002007201941246a2219470d000b0b20032802f4022102200341e8006a411020032802f002221920032802f802100702402002450d002019102a0b200d41246c220241246d210c4100211c0240024020020d00410121074100210c0c010b200c41ffffff3f71200c470d12200c41057422024100480d12200210282207450d050b0240200d450d00200d41246c211d4100211c20072102200f21190340201941086a290000210b201941106a290000210420192900002105200241186a201941186a290000370000200241106a2004370000200241086a200b37000020022005370000201c41016a211c200241206a2102201941246a2119201d415c6a221d0d000b0b02402010450d00200f102a0b200341f0026a41186a200341d0026a41186a290300370300200341f0026a41106a200341d0026a41106a290300370300200341f0026a41086a200341d0026a41086a290300370300200320032903d0023703f002410021192007201c41004120201c676b10c4024101211d200341f0026a41012007201c10c5020240200c450d002007102a0b4101210c0c1a0b41c4d1c3004133200341d8046a419cd9c3001038000b412441041037000b201241041037000b200241011037000b200241011037000b41a39fc6002119411121024101210c0c140b420021304200212d0b024002402030202f54202d200b54202d200b511b450d0041a0fdc1002119412e21020c010b200341b0046a41086a22024200370300200342003703b004418ca3c1004113200341b0046a1008200341e8006a41086a2002290300370300200320032903b004370368200341003602f002200341e8006a4110200341f0026a1006210202400240024002400240024002400240024020032802f0022219417f460d002002450d00200320193602b404200320023602b004200341f0026a200341b0046a107820032802f0022210450d0320032902f402212d02402019450d002002102a0b202d422088a72217450d05202da7211441f1fdc1002119412321022010290300200554201041086a290300223020045420302004511b450d07200341b0046a41086a22194200370300200342003703b00441a9a2c100410f200341b0046a1008200341e8006a41086a2019290300370300200320032903b004370368200341003602f002200341e8006a4110200341f0026a1006211920032802f002221c417f460d012019450d012003201c3602b404200320193602b004200341f0026a200341b0046a107d20032802f0022207450d0420032902f4022130201c450d022019102a0c020b41effcc1002119413121020c080b42002130410421070b20072030422088a7220e41246c6a210c200721194100211c024003400240200c20196b41ec004b0d00200c2019460d062007200e41246c6a210c034020034188046a2019460d03201c201920034188046a4120109c05221d4100476a211c201d450d03200c201941246a2219470d000c070b0b201920034188046a460d01201c201920034188046a4120109c05221d4100476a211c201d450d01201941246a221d20034188046a460d01201c201d20034188046a4120109c05221d4100476a211c201d450d01201941c8006a221d20034188046a460d01201c201d20034188046a4120109c05221d4100476a211c201d450d01201941ec006a221d20034188046a460d0120194190016a2119201c201d20034188046a4120109c05221d4100476a211c201d0d000b0b201c202e422088a7490d034194fec1002119413621022030a7450d042007102a0c040b41c4d1c3004133200341d8046a419cd9c3001038000b41c4d1c3004133200341d8046a419cd9c3001038000b41cca2c100410041001034000b02402030a7450d002007102a0b200341a8026a10c002200341f0026a20034188046a10bf0220032802f0024101460d01024020032802ac02450d0020032802a802102a0b41cefdc10021190b2014450d012010102a0c010b20032802a80221260240024002400240024002400240024002400240024020032802b00222020d0042002131420021320c010b20032802f4022111200241216c211c202641016a2102200341f8026a2802002219410876211241012019411f7174211520194105764107712213417f7321164200213142002132034002402002417f6a2d00004101470d00411310282219450d06201941002900c2a3413700002019410f6a41002800d1a341360000201941086a41002900caa34137000020034293808080b0023702f402200320193602f0022002200341f0026a108f0120032802f802211d20032802f002210c200341b0046a41186a22074200370300200341b0046a41106a220e4200370300200341b0046a41086a22194200370300200342003703b004200c201d200341b0046a1000200341e8006a41186a2007290300370300200341e8006a41106a200e290300370300200341e8006a41086a22072019290300370300200320032903b004370368024020032802f402450d0020032802f002102a0b200341003602f002200341e8006a4120200341f0026a1006210c20032802f002221d417f460d002003201d3602b4042003200c3602b004200341f0026a200341b0046a10c20220032903f0024201510d05200341f0026a41206a2903002133200341f0026a41106a220f2903002134200329038803213520032903f8022136200328029803210e0240201d450d00200c102a0b200e2011490d0020194200370300200342003703b004418891c6004111200341b0046a100820072019290300370300200320032903b004370368200341003602f002200341e8006a4110200341f0026a10062119024020032802f002221d417f460d00201d41034d0d052019102a0b200341f0026a41186a200241186a290000370300200f200241106a290000370300200341f0026a41086a200241086a290000370300200320022900003703f0022003201236029003200341b0046a200341f0026a10c10242002130420021370240201320032802b80422194f0d00201920166a221d20194f0d04203320347c203520367c2230203554ad7c420020032802b004201d4102746a28020020157122191b21372030420020191b21300b024020032802b404450d0020032802b004102a0b203720327c203020317c2231203054ad7c21320b200241216a2102201c415f6a221c0d000b0b2010201741306c6a210920102102024002400240024003400240200920026b4190014b0d00024020022009460d0003404101211c200241106a220220034188046a460d04200220034188046a4120109c05450d04200241206a22022009470d000b0b4100211c203120058520322004858450450d02200341d0026a41186a220220034188046a41186a290300370300200341d0026a41106a221920034188046a41106a290300370300200341d0026a41086a221c20034188046a41086a29030037030020032003290388043703d0022010200437030820102005370300201020032903d002370310201041186a201c290300370300201041206a2019290300370300201041286a200229030037030020174115490d0a202d422188220b42307e2204422088a70d182004a72202417f4c0d1820020d03410821254108210f0c040b4101211c200241106a221920034188046a460d01201920034188046a4120109c05450d01200241c0006a221920034188046a460d01201920034188046a4120109c05450d01200241f0006a221920034188046a460d01201920034188046a4120109c05450d01200241a0016a221920034188046a460d01200241c0016a2102201920034188046a4120109c050d000b0b200341386a200341e0036a202f200b10cf012003290338210b2003200341c0006a2903003703f8022003200b3703f00241cafec10041e0fec100201c1b21194116410f201c1b21022003200341f0026a3602b004200341b0046a109d014101211c0c090b200210282225450d012025210f0b200ba7211f201041506a2128201041306a212c201041f07e6a212b410421154100212741002106410021122017210a0340200a21074100210a4101210c02402007417f6a221c450d000240024002400240024002402010201c41306c6a2202290300200741306c221120106a41a07f6a2219290300220454200241086a2903002205201941086a290300220b542005200b511b0d002007417e6a210e202b20116a21024100210a4100211903400240200e2019470d002007210c0c080b20042002290300222d5a211c200b200241086a290300220551211d200b20055a210c200241506a2102201941016a2119202d21042005210b201c200c201d1b0d000b201941016a210c2019417f7320076a211c0c010b202b20116a2102024003400240201c4101470d004100211c0c020b20042002290300222d542119200b200241086a290300220551211d200b200554210c200241506a2102201c417f6a211c202d21042005210b2019200c201d1b0d000b0b2007201c490d01200720174b0d032007201c6b220c410176221d450d00202820116a21022010201c41306c6a21190340200341f0026a41286a220e201941286a2211290300370300200341f0026a41206a2213201941206a2216290300370300200341f0026a41186a2218201941186a221a290300370300200341f0026a41106a221b201941106a220a290300370300200341f0026a41086a2208201941086a2229290300370300200320192903003703f002200241086a222a290300210b200241106a221e2903002104200241186a22222903002105200241206a2223290300212d200241286a2224290300212f201920022903003703002011202f3703002016202d370300201a2005370300200a20043703002029200b3703002024200e2903003703002023201329030037030020222018290300370300201e201b290300370300202a2008290300370300200220032903f002370300201941306a2119200241506a2102201d417f6a221d0d000b0b0240201c0d00201c210a0c050b0240200c41094d0d00201c210a0c050b200720174b0d012007201c6b211d202c201c41306c6a210e03402007201c417f6a220a490d0402402007200a6b220c4102490d002010201c41306c6a22022903002010200a41306c6a221c29030022055a200241086a22192903002204201c41086a2211290300220b5a2004200b511b0d00200341b0046a41186a2216201c41286a2213290300370300200341b0046a41106a2218201c41206a221a290300370300200341b0046a41086a221b201c41186a22082903003703002003201c2903103703b004201c200229030037030020112019290300370300201c41106a200241106a2903003703002008200241186a290300370300201a200241206a2903003703002013200241286a290300370300410121190240200c4103490d00201c29036020055a201c41e8006a2903002204200b5a2004200b511b0d0041022111200e211303402013220241506a22192002290300370300201941286a200241286a290300370300201941206a200241206a290300370300201941186a200241186a290300370300201941106a200241106a290300370300201941086a200241086a290300370300201d20112219460d01201941016a2111200241306a221329030020055a200241386a2903002204200b5a2004200b511b450d000b0b200220053703002002200b370308201c201941306c6a220241286a2016290300370300200241206a2018290300370300200241186a201b290300370300200220032903b0043703100b200a450d05200e41506a210e201d41016a211d200a211c200c410a4f0d050c000b0b201c20071044000b2007201c417f6a220a490d010b20072017103c000b200a20071044000b02400240024020122027470d00202741016a22022027490d18202741017422192002201920024b1b220241ffffffff01712002470d18200241037422194100480d180240024020270d002019102821150c010b201520274103742019102c21150b2015450d0120022127200621120b201520124103746a2202200c3602042002200a360200200641016a2212210620124102490d0102400340024002400240024020152012417f6a22064103746a2202280200450d00201241037420156a221d41746a280200221c200228020422194d0d000240201241024b0d0020122106410221120c080b20152012417d6a22164103746a28020422022019201c6a4d0d010240201241034b0d0020122106410321120c080b201d41646a2802002002201c6a4d0d01201221060c070b20124103490d012002280204211920152012417d6a22164103746a28020421020b20022019490d010b2012417e6a21160b0240024002400240024002402012201641016a22084b2229450d00201220164b222a450d01201520164103746a2218280204221e20182802006a2202201520084103746a221a280200221b490d02200220174b0d032010201b41306c6a2211201a280204221341306c22196a211d200241306c211c2002201b6b220720136b220220134f0d042025201d200241306c2219109a051a200f20196a210c0240024020134101480d00200241014e0d010b201d2102200f21190c060b2028201c6a211c201d21020340201c200241506a221d200c41506a22072007290300201d29030054200741086a290300220b201d41086a290300220454200b2004511b220e1b2219290300370300201c41086a201941086a290300370300201c41106a201941106a290300370300201c41186a201941186a290300370300201c41206a201941206a290300370300201c41286a201941286a290300370300200c2007200e1b210c02402011201d2002200e1b2202490d00200f21190c070b201c41506a211c200f2119200f200c490d000c060b0b41b8dbc000200820121034000b41b8dbc000201620121034000b201b20021044000b20022017103c000b202520112019109a051a200f20196a210c0240024020134101480d00200720134a0d010b20112102200f21190c010b2010201c6a210e200f21192011210203402002201d2019201d290300201929030054201d41086a290300220b201941086a290300220454200b2004511b22071b221c290300370300200241086a201c41086a290300370300200241106a201c41106a290300370300200241186a201c41186a290300370300200241206a201c41206a290300370300200241286a201c41286a2903003703002019201941306a20071b2119200241306a2102201d41306a201d20071b221d200e4f0d01200c20194b0d000b0b20022019200c20196b221c201c4130706b109a051a0240202a450d002018201b360200201841046a201e20136a3602002029450d02201a201a41086a20122008417f736a410374109b051a20062112200641014d0d040c010b0b41c8dbc000201620121034000b41b0b1c0001032000b201941041037000b200a0d000b02402027450d002015102a0b201f450d062025102a0c060b200241081037000b41cca2c100201d20191034000b41c4d1c3004133200341d8046a419cd9c3001038000b41c4d1c3004133200341d8046a419cd9c3001038000b411341011037000b20174102490d002017417f6a211c2010201741306c6a21074101211d03400240024002400240201c2202417f6a221c20174b0d002017201c6b22194102490d032010200241306c6a22022903002010201c41306c6a220c29030022055a200241086a220e2903002204200c41086a220f290300220b5a2004200b511b0d03200341b0046a41186a2211200c41286a2212290300370300200341b0046a41106a2213200c41206a2215290300370300200341b0046a41086a2216200c41186a22182903003703002003200c2903103703b004200c2002290300370300200f200e290300370300200c41106a200241106a2903003703002018200241186a2903003703002015200241206a2903003703002012200241286a2903003703004101210e20194103490d02200c29036020055a200c41e8006a2903002204200b5a2004200b511b0d024100210e2007211903402019220241506a22192002290300370300201941286a200241286a290300370300201941206a200241206a290300370300201941186a200241186a290300370300201941106a200241106a290300370300201941086a200241086a290300370300201d200e220f460d02200f417f6a210e200241306a221929030020055a200241386a2903002204200b5a2004200b511b0d020c000b0b201c20171044000b4102200f6b210e0b200220053703002002200b370308200c200e41306c6a220241286a2011290300370300200241206a2013290300370300200241186a2016290300370300200220032903b0043703100b200741506a2107201d417f6a211d201c0d000b0b200341b0046a41086a22024200370300200342003703b004418ca3c1004113200341b0046a1008200341e8006a41086a2002290300370300200320032903b004370368200341003602f802200342013703f0022017200341f0026a10b401201021020340200241086a290300210b200229030021040240024020032802f402221c20032802f80222196b4110490d0020032802f002211c0c010b201941106a221d2019490d0f201c4101742219201d2019201d4b1b22194100480d0f02400240201c0d0020191028211c0c010b20032802f002201c2019102c211c0b201c450d03200320193602f4022003201c3602f00220032802f80221190b201c20196a221c200b370008201c20043700002003201941106a3602f802200241106a200341f0026a108f01200241306a22022009470d000b20032802f4022102200341e8006a411020032802f002221920032802f802100702402002450d002019102a0b02402014450d002010102a0b4100211c410021190b024020032802ac02450d002026102a0b0240201c0d00202ea7450d120c020b02402014450d002010102a0b202ea7450d110c010b201941011037000b200d102a0c0f0b202ea7450d0e200d102a0c0e0b0b024002400240200ba7450d00201d102a201c0d010c020b201c450d010b200341e4016a41026a20034184026a41026a2d00003a0000200341c8016a41086a200341e8016a41086a290300370300200341c8016a410d6a200341e8016a410d6a290000370000200320032f0184023b01e401200320032903e8013703c8014100211c0c010b4101211c4118210241a8fac10021190b200341c4016a41026a221d200341e4016a41026a2d00003a0000200341a8016a41086a220c200341c8016a41086a290300370300200341a8016a41106a200341c8016a41106a290300370300200320032f01e4013b01c401200320032903c8013703a801201c0d0b20034183036a200c29030037000020034188036a200341b5016a290000370000200320032f01c4013b01f002200320023600f702200320193600f302200320032903a8013700fb022003201d2d00003a00f2020240200341f0026a20034188046a4120109c050d0020034188046a201b10d50220034188046a428080e983b1de16420010aa02200342f0f2bda9c6add9b1f4003703d00220031098013602a802200341b0046a20034188046a109a0220032802b404211920032802b004210220032802b804211c200341c4046a200341d0026a36020020032002201c4105746a3602bc04200320023602b804200320193602b404200320023602b0042003200341a8026a3602c004200341e0036a200341b0046a108701200341b0046a41086a200341e0036a41086a280200360200200320032903e0033703b00420034188046a200341b0046a109c02410021190c0c0b41c0fac1002119411921020c0b0b0b0240200ba7450d00200c102a201d450d010c020b201d0d010b4101211c4116210241dcf9c10021190c010b200341b0046a41026a200341a4016a41026a2d00003a0000200341f0026a41086a20034188016a41086a290300370300200341f0026a410d6a20034188016a410d6a290000370000200320032f01a4013b01b00420032003290388013703f0024100211c0b200341e8006a41026a221d200341b0046a41026a2d00003a000020034188046a41086a220c200341f0026a41086a29030037030020034188046a41106a200341f0026a41106a290300370300200320032f01b0043b0168200320032903f00237038804201c0d06200341f3036a200c290300370000200341f8036a20034195046a290000370000200320032f01683b01e003200320023600e703200320193600e30320032003290388043700eb032003201d2d00003a00e20302400240024002400240024002400240410e10282202450d00200241066a41002900b2a441370000200241002900aca4413700002002410e411c102c2202450d012002202041067636000e200341b0046a41186a22194200370300200341b0046a41106a221c4200370300200341b0046a41086a221d4200370300200342003703b00420024112200341b0046a1000200341e8006a41186a2019290300370300200341e8006a41106a201c290300370300200341e8006a41086a201d290300370300200320032903b0043703682002102a200341003602f002200341e8006a4120200341f0026a1006210220032802f0022219417f460d052002450d05200320193602b404200320023602b004200341f0026a200341b0046a107420032802f002220c450d022020413f71211c20032902f402210b02402019450d002002102a0b4100211d201c200b422088a74f0d03200c201c41216c6a22192d00004101470d0320034186026a201941036a2d00003a0000200341e8016a41086a201941146a290000370300200341f5016a201941196a290000370000200320192f00013b01840220032019410c6a2900003703e801201941086a2800002102201941046a28000021194101211d0c040b410e41011037000b411c41011037000b41c4d1c3004133200341d8046a419cd9c3001038000b0b0240200ba7450d00200c102a201d450d010c020b201d0d010b4101211c4114210241f2f9c10021190c010b200341e4016a41026a20034184026a41026a2d00003a0000200341c8016a41086a200341e8016a41086a290300370300200341c8016a410d6a200341e8016a410d6a290000370000200320032f0184023b01e401200320032903e8013703c8014100211c0b200341c4016a41026a221d200341e4016a41026a2d00003a0000200341a8016a41086a220c200341c8016a41086a290300370300200341a8016a41106a200341c8016a41106a290300370300200320032f01e4013b01c401200320032903c8013703a801201c0d062003419b046a200c290300370000200341a0046a200341b5016a290000370000200320032f01c4013b0188042003200236008f042003201936008b04200320032903a801370093042003201d2d00003a008a040240200341e0036a20034188026a4120109c05450d004186fac1002119411221020c070b024020034188046a200341a8026a4120109c05450d004198fac1002119411021020c070b200341f0026a41186a2217200341a8026a41186a2218290300370300200341f0026a41106a221a200341a8026a41106a221b290300370300200341f0026a41086a220a200341a8026a41086a2206290300370300200320032903a8023703f002410021022003410036029003200341b0046a200341f0026a10c1020240024020032802b804220d0d0041012112410021130c010b410021114100211341012112410021150340200d417f4c0d0220032802b404211620032802b00421140240024002400240200d1028220e450d0002400240200d41027422020d00410021070c010b201420026a210f410021072014210c0340200c2802002119412010282202450d0320022019411f763a001f200220194101713a000020022019411e764101713a001e20022019411d764101713a001d20022019411c764101713a001c20022019411b764101713a001b20022019411a764101713a001a200220194119764101713a0019200220194118764101713a0018200220194117764101713a0017200220194116764101713a0016200220194115764101713a0015200220194114764101713a0014200220194113764101713a0013200220194112764101713a0012200220194111764101713a0011200220194110764101713a001020022019410f764101713a000f20022019410e764101713a000e20022019410d764101713a000d20022019410c764101713a000c20022019410b764101713a000b20022019410a764101713a000a200220194109764101713a0009200220194108764101713a00082002201941ff017122194107763a0007200220194106764101713a0006200220194105764101713a0005200220194104764101713a0004200220194103764101713a0003200220194102764101713a0002200220194101764101713a0001200c41046a210c4100211902400240024002400340201941206a221c41034d0d010240200220196a221c411f6a2d0000450d002019411f6a211d0c040b0240201c411e6a2d0000450d002019411e6a211d0c040b0240201c411d6a2d00000d002019417c6a2119201c411c6a2d00000d030c010b0b2019411d6a211d0c020b0340201c450d032002201c6a2119201c417f6a221d211c2019417f6a2d0000450d000c020b0b201941206a211d0b201d41016a221c201d490d000240200d20076b201c4120201c4120491b22194f0d00200720196a22192007490d0b200d410174221d2019201d20194b1b22194100480d0b02400240200d0d0020191028210e0c010b200e200d2019102c210e0b200e450d062019210d0b200e20076a211d410021190240034020194120460d01201d20196a200220196a2d00004101713a0000201c201941016a2219470d000b0b200720196a21070b2002102a200c200f470d000b0b02402016450d002014102a0b0240201320116b2007490d00201120076a21020c040b201120076a22022011490d07201341017422192002201920024b1b22194100480d070240024020130d002019102821120c010b201220132019102c21120b02402012450d00201921130c040b201941011037000b200d41011037000b412041011037000b201941011037000b201220116a200e2007109a051a0240200d450d00200e102a0b20172018290300370300201a201b290300370300200a2006290300370300200320032903a8023703f0022003201541016a221536029003200341b0046a200341f0026a10c1022002211120032802b804220d0d000b0b024020032802b404450d0020032802b004102a0b200341b0046a41086a22194200370300200342003703b00441b0a3c1004112200341b0046a1008200341e8006a41086a2019290300370300200320032903b004370368200341003602f002200341e8006a4110200341f0026a1006211902400240024020032802f002221c417f460d002019450d002003201c3602b404200320193602b004200341f0026a200341b0046a106d20032802f002220e450d0220032902f402210b201c450d012019102a0c010b4101210e4200210b0b200b422088a741ffffff3f7122192002200220194b1b221c450d034100211920034188036a211d20034180036a210c200341f8026a2107200e210203400240201220196a2d0000450d00201d4200370300200c420037030020074200370300200342003703f002200341f0026a2002460d002002200341f0026a4120109c05450d00200341f0026a200210bf024101210d20032802f0024101470d0020032802f40220104d0d060b200241206a2102201941016a2219201c4f0d040c000b0b41c4d1c3004133200341d8046a419cd9c3001038000b1036000b1031000b4100210d0b0240200ba7450d00200e102a0b02402013450d002012102a0b20034188026a200341a8026a200d1b221920212020200d1b10d502200342f0f2bda9c6add9b1f4003703c80220031098013602d002200341f0026a2019109a0220032802f402211c20032802f002210220032802f802211d20034184036a200341c8026a36020020032002201d4105746a3602fc02200320023602f8022003201c3602f402200320023602f0022003200341d0026a36028003200341b0046a200341f0026a108701200341f0026a41086a200341b0046a41086a280200360200200320032903b0043703f0022019200341f0026a109c020240024002400240024002400240200d450d00200341106a20034188026a428080e983b1de1642001082022003290310210b2003200341106a41086a2903003703f8022003200b3703f0022003200341f0026a3602b004200341b0046a109d01200341013a00f402200341083a00f002200341f0026a4105722102200341f0026a211c0c010b200341206a20034188026a109d022003290320200341206a41086a29030084500d02411810282202450d03200241002900e3e140370000200241106a41002900f3e140370000200241086a41002900ebe1403700002003429880808080033702d402200320023602d002200341a8026a200341d0026a108f0120032802d802210220032802d0022119200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a220c4200370300200342003703b00420192002200341b0046a1000200341f0026a41186a201c290300370300200341f0026a41106a201d290300370300200341f0026a41086a200c290300370300200320032903b0043703f002024020032802d402450d0020032802d002102a0b200341003602b004200341f0026a4120200341b0046a1006210202400240024020032802b0042219417f470d004200210b420021050c010b20194110490d06200241086a29000021052002290000210b2002102a428080e983b1de1621044200212d200b428080e983b1de165441002005501b450d010b200b21042005212d0b411410282202450d05200241002900cfe140370000200241106a41002800dfe140360000200241086a41002900d7e14037000020034294808080c0023702d402200320023602d00220034188026a200341d0026a108f0120032802d802210220032802d0022119200341b0046a41186a221c4200370300200341b0046a41106a221d4200370300200341b0046a41086a220c4200370300200342003703b00420192002200341b0046a1000200341f0026a41186a201c290300370300200341f0026a41106a201d290300370300200341f0026a41086a200c290300370300200320032903b0043703f002024020032802d402450d0020032802d002102a0b200341003602b004200341f0026a4120200341b0046a100621020240024020032802b0042219417f470d004200212e4200212f0c010b20194110490d02200241086a290000212f2002290000212e2002102a0b20034188026a202e20047c2230202f202d7c2030202e54ad7c108f02200341a8026a200b20047d2005202d7d200b200454ad7d10900220034185036a200341b8026a2903003700002003418d036a200341c0026a290300370000200341083a00f002200341fd026a200341a8026a41086a290300370000200341003a00f402200320032903a8023700f50220034195036a2102200341f0026a211c0b2002200329038802370000200241186a20034188026a41186a290300370000200241106a20034188026a41106a290300370000200241086a20034188026a41086a290300370000410021194101211d41014100201c10cc014101210c0c0b0b41c4d1c3004133200341d8046a419cd9c3001038000b41b5dfc0002119412221020c050b411841011037000b41c4d1c3004133200341d8046a419cd9c3001038000b411441011037000b41dc9fc6002119410e21020c010b4111210241a39fc60021190b4101211d4101210c0c030b4100211c0b20034184026a41026a221d200341b0046a41026a2d00003a0000200341e8016a41086a220c200341f0026a41086a290300370300200341e8016a410d6a2207200341f0026a410d6a290000370000200320032f01b0043b018402200320032903f0023703e80102400240201c0d004101211c410b210241d8d2c50021190c010b200341e4016a41026a201d2d00003a0000200341c8016a41086a200c290300370300200341c8016a410d6a2007290000370000200320032f0184023b01e401200320032903e8013703c8014100211c0b200341c4016a41026a200341e4016a41026a2d00003a0000200341a8016a41086a200341c8016a41086a290300370300200341a8016a41106a200341c8016a41106a290300370300200320032f01e4013b01c401200320032903c8013703a801201c0d00200341a4016a41026a200341c4016a41026a2d0000221c3a000020034188016a41086a221d200341a8016a41086a29030037030020034188016a410d6a220c200341a8016a410d6a290000370000200320032f01c40122073b01a401200320032903a8013703880120034183036a201d29030037000020034188036a200c2900003700002003201c3a00f202200320073b01f002200320023600f702200320193600f30220032003290388013700fb02200320063602b8042003201b3602b4042003200a3602b004200341086a200341f0026a200341b0046a200920082005200410d402200328020c2102200328020821194101210c4100211d0c010b4101210c4100211d201b450d00200a102a0b02402001280200417f6a221c41014b0d0002400240201c0e020100010b201d450d01200141086a280200450d012001280204102a0c010b200c450d00200141086a280200450d002001280204102a0b2000200236020420002019360200200341e0046a24000bb55304087f017e097f027e23004190056b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022040e050001020304000b2003418c046a4101360200200342013702fc03200341ccd1c5003602f803200341043602f402200341c4d1c5003602f0022003200341f0026a36028804200341f8036a41a8a6c300103e000b200141086a2802002105200141046a2802002106024020022d000020022d000172450d0041a39fc600210741112108410021094101210a02402005450d002006102a0b410121060c230b20062001410c6a280200220210f0014200210b200341f8036a41086a22074200370300200342003703f8034196f0c200411b200341f8036a1008200341f0026a41086a2007290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621090240024020032802f8032208417f460d00200320083602ec01200320093602e801200341f8036a200341e8016a106d20032802f8032207450d0520032902fc03210b2008450d012009102a0c010b410121070b200620022007200b422088a71085020240200ba7450d002007102a0b200341f8036a41086a22074200370300200342003703f8034196f0c200411b200341f8036a1008200341f0026a41086a2007290300370300200320032903f8033703f0022003410036028004200342013703f8032002200341f8036a10b40102402002450d00200241057421072006210203402002200341f8036a108f01200241206a2102200741606a22070d000b0b20032802fc032102200341f0026a411020032802f8032207200328028004100702402002450d002007102a0b4101210a2005450d212006102a0c210b200141046a280200210941b49fc60021074113210820022d00000d1e2002280001220a41ff01714101470d1e2003200a4118763a00622003200a4108763b01602003200241216a2d00003a007f2003200241196a2900003700772003200241116a29000037006f2003200241096a2900003700672003200241056a2800003600634200210b200341f8036a41086a22024200370300200342003703f8034196f0c200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621080240024020032802f8032207417f460d00200320073602ec01200320083602e801200341f8036a200341e8016a106d20032802f8032202450d0520032902fc03210b2007450d012008102a0c010b410121020b2002200b422088a7200341e0006a10cd0121070240200ba7450d002002102a0b024020070d0041b8a6c3002107411521080c1f0b4100210a2003410036028004200342013703f8032009200341f8036a10eb0120032802fc032107200328028004210820032802f8032102200341f0026a41186a22064200370300200341f0026a41106a22054200370300200341f0026a41086a220c4200370300200342003703f00220022008200341f0026a1000200341e8016a41186a22082006290300370300200341e8016a41106a220d2005290300370300200341e8016a41086a2205200c290300370300200320032903f0023703e80102402007450d002002102a0b200341f8036a2009418801109a051a200341f0026a410d6a200341e0006a41086a290300370000200341f0026a41156a200341e0006a41106a290300370000200341f0026a411d6a200341e0006a41186a29030037000041012106200341013a00f402200320032903603700f502200341023a00f002200341c0006a200341f8036a200341f0026a10f40120032d00482102200341f8036a410d6a2005290300370000200341f8036a41156a200d290300370000200341f8036a411d6a20082903003700002003419d046a20024102463a0000200341053a00fc03200341073a00f803200320032903e8013700fd0341014100200341f8036a10cc012009102a0c170b200141086a280200210941b49fc60021074113210820022d00000d1c2002280001220a41ff01714101470d1c200141046a28020021062003200a4118763a00422003200a4108763b01402003200241216a2d00003a005f2003200241196a2900003700572003200241116a29000037004f2003200241096a2900003700472003200241056a280000360043200341f8036a41086a22024200370300200342003703f8034196f0c200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621070240024020032802f8032208417f460d002007450d00200320083602ec01200320073602e801200341f8036a200341e8016a106d20032802f8032202450d0520032902fc03210b2008450d012007102a0c010b4200210b410121020b2002200b422088a7200341c0006a10cd0121070240200ba7450d002002102a0b024020070d0041b8a6c3002107411521080c1d0b2003410036028004200342013703f8032009200341f8036a10eb0120032802fc032107200328028004210820032802f8032102200341f0026a41186a220a4200370300200341f0026a41106a22054200370300200341f0026a41086a220c4200370300200342003703f00220022008200341f0026a1000200341e0006a41186a2208200a290300370300200341e0006a41106a220a2005290300370300200341e0006a41086a2205200c290300370300200320032903f00237036002402007450d002002102a0b200341f8036a41186a2008290300370300200341f8036a41106a200a290300370300200341f8036a41086a2005290300370300200320032903603703f803411e10282202450d04200241002900f6a743370000200241166a410029008ca843370000200241106a4100290086a843370000200241086a41002900fea7433700002003429e808080e0033702ec01200320023602e8012003200341e8016a3602f002200341f8036a200341f0026a10c80120032802e801210220032802f0012107200341f0026a41186a22084200370300200341f0026a41106a220a4200370300200341f0026a41086a22054200370300200342003703f00220022007200341f0026a1000200341206a41186a2008290300370300200341206a41106a200a290300370300200341206a41086a2005290300370300200320032903f002370320024020032802ec01450d0020032802e801102a0b200341206a41204101410041001003417f470d05200341f8036a41086a22024200370300200342003703f803024020064102490d004194a8c3004121200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f0024100210a200341003602f803200341f0026a4110200341f8036a10062102024020032802f8032207417f460d002002450d0020074104490d082002280000210a2002102a0b200341f8036a41086a22024200370300200342003703f8034194a8c3004121200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621020240024020032802f8032207417f460d002002450d00024020074104490d00200228000021072002102a200741016a21070c020b41c4d1c300413320034188056a419cd9c3001038000b410121070b200341f8036a41086a22024200370300200342003703f8034194a8c3004121200341f8036a1008200341f0026a41086a22082002290300370300200320032903f8033703f002200320073602f803200341f0026a4110200341f8036a4104100720024200370300200342003703f80341cf96c300411d200341f8036a100820082002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a1006210220032802f8032207417f460d092002450d09200320073602ec01200320023602e801200341f8036a200341e8016a106d20032802f8032208450d0820032902fc03210b02402007450d002002102a0b200320083602e8012003200b3702ec01200341206a41186a200341e0006a41186a290300370300200341206a41106a200341e0006a41106a290300370300200341206a41086a200341e0006a41086a29030037030020032003290360370320200341e8016a2107200b422088a72202200ba72208470d150c140b4196f0c200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f00241002102200341003602f803200341f0026a4110200341f8036a10062108024020032802f8032207417f460d00200320073602ec01200320083602e801200341f8036a200341e8016a106d20032802f803220a450d0a20032902fc03210b02402007450d002008102a0b200b422088a72102200ba7450d00200a102a0b200341f8036a2009418801109a051a200341fc026a2002360200200341f0026a41086a4101360200200341003a00f402200341023a00f002200341e8016a200341f8036a200341f0026a10f40120032d00f001210220034185046a200341e0006a41086a2903003700002003418d046a200341f0006a29030037000020034195046a200341f8006a2903003700002003419d046a20024102463a0000200341043a00fc03200341073a00f803200320032903603700fd03200341f8036a21020c150b200141216a2d0000210a200141246a2802002109200341186a200141196a290000370300200341106a200141116a290000370300200341086a200141096a290000370300200320012900013703000240024020022d00000d002002280001220741ff01714101460d010b41b49fc60021070c110b200320074118763a0042200320074108763b01402003200241216a2d00003a005f2003200241196a2900003700572003200241116a29000037004f2003200241096a2900003700472003200241056a280000360043200341f8036a41086a22024200370300200342003703f8034196f0c200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621070240024020032802f8032208417f460d002007450d00200320083602ec01200320073602e801200341f8036a200341e8016a106d20032802f8032202450d0b20032902fc03210b2008450d012007102a0c010b4200210b410121020b2002200b422088a7200341c0006a10cd0121070240200ba7450d002002102a0b024020070d0041bea7c3002107411221080c120b411a10282202450d0a200241002900ec9643370000200241186a41002f008497433b0000200241106a41002900fc9643370000200241086a41002900f496433700002003429a808080a0033702fc03200320023602f8032003200341f8036a3602f0022003200341f0026a10c80120032802f80321022003280280042107200341f0026a41186a22084200370300200341f0026a41106a22064200370300200341f0026a41086a22054200370300200342003703f00220022007200341f0026a1000200341206a41186a2008290300370300200341206a41106a2006290300370300200341206a41086a2005290300370300200320032903f002370320024020032802fc03450d0020032802f803102a0b200341003602f803200341206a4120200341f8036a1006210220032802f8032207417f460d0f2002450d0f200320073602f402200320023602f002200341f8036a200341f0026a10b3032003280280042205450d0b20034194046a280200210e20034190046a280200210f2003418c046a280200210c41102108200341f8036a41106a2802002110200328028404211120032802fc03211220032802f803210602402007450d002002102a0b41d0a7c300210720062009470d0e200520104105746a21062005210241002108024003400240200620026b41e0004b0d0020022006470d02410021130c100b200341c0006a2002460d0e20082002200341c0006a4120109c0522074100476a21082007450d0e200241206a2207200341c0006a460d0e20082007200341c0006a4120109c0522074100476a21082007450d0e200241c0006a2207200341c0006a460d0e20082007200341c0006a4120109c0522074100476a21082007450d0e200241e0006a2207200341c0006a460d0e20024180016a210220082007200341c0006a4120109c0522074100476a210820070d000c0e0b0b200520104105746a21060340200341c0006a2002460d0d20082002200341c0006a4120109c0522074100476a21082007450d0d410021132006200241206a2202470d000c0e0b0b41c4d1c300413320034188056a419cd9c3001038000b41c4d1c300413320034188056a419cd9c3001038000b41c4d1c300413320034188056a419cd9c3001038000b411e41011037000b41cda6c3002107411f21080c160b41c4d1c300413320034188056a419cd9c3001038000b41c4d1c300413320034188056a419cd9c3001038000b41002102200341003602f001200342013703e801200341206a41186a200341e0006a41186a290300370300200341206a41106a200341e0006a41106a290300370300200341206a41086a200341e0006a41086a29030037030020032003290360370320200341e8016a21070c0a0b41c4d1c300413320034188056a419cd9c3001038000b41c4d1c300413320034188056a419cd9c3001038000b411a41011037000b41c4d1c300413320034188056a419cd9c3001038000b410121130b200c200e4105746a210d200c21024100210702400240024003400240200d20026b41e0004b0d002002200d470d02410021060c040b200341c0006a2002460d0220072002200341c0006a4120109c0522064100476a21072006450d02200241206a2206200341c0006a460d0220072006200341c0006a4120109c0522064100476a21072006450d02200241c0006a2206200341c0006a460d0220072006200341c0006a4120109c0522064100476a21072006450d02200241e0006a2206200341c0006a460d0220024180016a210220072006200341c0006a4120109c0522064100476a210720060d000c020b0b0340200341c0006a2002460d0120072002200341c0006a4120109c0522064100476a21072006450d0141002106200d200241206a2202470d000c020b0b410121060b024002400240024002400240024002400240200a41ff01710d002006450d010c080b20130d07200341f8036a41186a220d200341c0006a41186a290300370300200341f8036a41106a2213200341c0006a41106a290300370300200341f8036a41086a2214200341c0006a41086a290300370300200320032903403703f803024020102011460d0020112108201021110c020b201141016a22022011490d10201141017422082002200820024b1b220841ffffff3f712008470d10200841057422024100480d100240024020110d002002102821050c010b200520114105742002102c21050b20050d01200241011037000b200341f8036a41186a2206200341c0006a41186a290300370300200341f8036a41106a220d200341c0006a41106a290300370300200341f8036a41086a2214200341c0006a41086a290300370300200320032903403703f80302400240200e200f460d00200f2107200e210f0c010b200f41016a2202200f490d10200f41017422072002200720024b1b220741ffffff3f712007470d10200741057422024100480d1002400240200f0d0020021028210c0c010b200c200f4105742002102c210c0b200c0d00200241011037000b200c200f4105746a220220032903f803370000200241186a2006290300370000200241106a200d290300370000200241086a2014290300370000200e41016a210e024002402013450d00201020084d0d0120052010417f6a22104105746a2202290000210b2002290008211520022900102116200520084105746a220841186a200241186a29000037000020082016370010200820153700082008200b3700000b2007210f201121080c020b41c4f2c200200820101034000b200520114105746a220220032903f803370000200241186a200d290300370000200241106a2013290300370000200241086a2014290300370000201041016a21102006450d00200e20074d0d01200c200e417f6a220e4105746a2202290000210b2002290008211520022900102116200c20074105746a220741186a200241186a29000037000020072016370010200720153700082007200b3700000b2003419d046a200329030037000020034185046a200341c0006a41086a2903003700002003418d046a200341c0006a41106a29030037000020034195046a200341c0006a41186a290300370000200341a5046a200341086a290300370000200341ad046a200341106a290300370000200341b5046a200341186a290300370000200341013a00fc03200341073a00f803200320032903403700fd03200341c4046a200e360200200341c0046a2010360200200341bd046a200a3a000041014100200341f8036a10cc01200341f8036a41086a22024200370300200342003703f8034196f0c200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a1006210220032802f8032207417f460d022002450d02200320073602ec01200320023602e801200341f8036a200341e8016a106d20032802f803220a450d0120032902fc03210b02402007450d002002102a0b200b422088a72102200ba7450d03200a102a0c030b41c4f2c2002007200e1034000b41c4d1c300413320034188056a419cd9c3001038000b410021020b024002400240024002400240024002400240201020124f22070d0041002002200e6b220a200a20024b1b2012490d0020034194046a200e360200200341f8036a41186a200f360200200341f8036a41106a201036020020034184046a20083602002003200c36028c042003200536028004200320123602fc03200320093602f803411a10282202450d01200241002900ec9643370000200241186a41002f008497433b0000200241106a41002900fc9643370000200241086a41002900f496433700002003429a808080a0033702ec01200320023602e8012003200341e8016a3602f0022003200341f0026a10c80120032802e801210220032802f0012107200341f0026a41186a22094200370300200341f0026a41106a220a4200370300200341f0026a41086a22064200370300200342003703f00220022007200341f0026a1000200341206a41186a2009290300370300200341206a41106a200a290300370300200341206a41086a2006290300370300200320032903f002370320024020032802ec01450d0020032802e801102a0b200341203602f4022003200341206a3602f002200341f8036a200341f0026a10b40302402008450d002005102a0b200f0d050c060b024020070d0020034185046a200341086a2903003700002003418d046a200341106a29030037000020034195046a200341186a290300370000200341033a00fc03200341073a00f803200320032903003700fd0341014100200341f8036a10cc010c040b20034185046a200341086a2903003700002003418d046a200341106a29030037000020034195046a200341186a290300370000200341023a00fc03200341073a00f803200320032903003700fd0341014100200341f8036a10cc01411e10282207450d01200741002900f6a743370000200741166a410029008ca843370000200741106a4100290086a843370000200741086a41002900fea7433700002003429e808080e0033702fc03200320073602f8032003200341f8036a3602f0022003200341f0026a10c80120032802f80321072003280280042109200341f0026a41186a220a4200370300200341f0026a41106a22064200370300200341f0026a41086a220d4200370300200342003703f00220072009200341f0026a1000200341206a41186a200a290300370300200341206a41106a2006290300370300200341206a41086a200d290300370300200320032903f002370320024020032802fc03450d0020032802f803102a0b200341003602f803200341206a4120200341f8036a100621090240024020032802f803220a417f470d00411321070c010b024020090d00411321070c010b2003200a360284052003200936028005200341f8036a20034180056a10810120032802f80322074113460d03200341f0026a200341f8036a410472418401109a051a0240200a450d002009102a0b200341206a412010090b200341e8016a200341f0026a418401109a051a200341f8036a200341e8016a418401109a051a20074113460d03200341e0006a200341f8036a418401109a051a200320073602f803200341f8036a410472200341e0006a418401109a051a200341fc026a2002360200200341f0026a41086a2012360200200341003a00f402200341023a00f002200341e8016a200341f8036a200341f0026a10f40120032d00f001210220034185046a200341086a2903003700002003418d046a200341106a29030037000020034195046a200341186a2903003700002003419d046a20024102463a0000200341043a00fc03200341073a00f803200320032903003700fd0341014100200341f8036a10cc010c030b411a41011037000b411e41011037000b41c4d1c300413320034188056a419cd9c3001038000b411a10282202450d02200241002900ec9643370000200241186a41002f008497433b0000200241106a41002900fc9643370000200241086a41002900f496433700002003429a808080a0033702fc03200320023602f8032003200341f8036a3602f0022003200341f0026a10c80120032802f80321072003280280042109200341f0026a41186a220a4200370300200341f0026a41106a22064200370300200341f0026a41086a22024200370300200342003703f00220072009200341f0026a1000200341206a41186a200a290300370300200341206a41106a2006290300370300200341206a41086a2002290300370300200320032903f002370320024020032802fc03450d0020032802f803102a0b200341206a41201009200341f8036a41086a22074200370300200342003703f80341cf96c300411d200341f8036a100820022007290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621070240024020032802f8032202417f460d00200320023602ec01200320073602e801200341f8036a200341e8016a106d20032802f8032209450d0520032902fc03210b02402002450d002007102a0b2003200b3702ec01200320093602e8010c010b200341003602f001200342013703e8010b200341e8016a2003106e20032802f001210220032802ec01210a20032802e8012109200341f8036a41086a22074200370300200342003703f80341cf96c300411d200341f8036a1008200341f0026a41086a2007290300370300200320032903f8033703f0020240024020090d00200341f0026a411010090c010b2003410036028004200342013703f8032002200341f8036a10b40102402002450d00200241057421072009210203402003200341f8036a3602602002200341e0006a10c801200241206a2102200741606a22070d000b0b20032802fc032102200341f0026a411020032802f8032207200328028004100702402002450d002007102a0b200a450d002009102a0b02402008450d002005102a0b200f450d010b200c102a0b410021074101210a41012106410121090c140b411a41011037000b41c4d1c300413320034188056a419cd9c3001038000b41e0a7c3002107411621080b02402011450d002005102a0b200f450d02200c102a0c020b41aba7c30021070b411321080b4101210a410121060c0b0b200741046a28020022082002470d00200241016a22082002490d03200241017422052008200520084b1b220841ffffff3f712008470d03200841057422054100480d030240024020020d002005102821020c010b200728020020024105742005102c21020b2002450d0420072002360200200741046a200836020020032802f00121020b200728020022052002410574220d6a22072003290320370000200741186a200341206a41186a290300370000200741106a200341206a41106a290300370000200741086a200341206a41086a2903003700002003200241016a22073602f001200341f8036a41086a220c4200370300200342003703f80341cf96c300411d200341f8036a1008200341f0026a41086a200c290300370300200320032903f8033703f0022003410036028004200342013703f8032007200341f8036a10b401024020072002490d00200d41206a21072005210203402003200341f8036a3602202002200341206a10c801200241206a2102200741606a22070d000b0b20032802fc032102200341f0026a411020032802f8032207200328028004100702402002450d002007102a0b02402008450d002005102a0b200341f8036a2009418801109a051a200341e8016a41186a200341e0006a41186a290300370300200341e8016a41106a200341e0006a41106a290300370300200341e8016a41086a200341e0006a41086a290300370300200320032903603703e801411e10282202450d04200241002900f6a743370000200241166a410029008ca843370000200241106a4100290086a843370000200241086a41002900fea7433700002003429e808080e00337020420032002360200200320033602f002200341e8016a200341f0026a10c8012003280200210220032802082107200341f0026a41186a22084200370300200341f0026a41106a22054200370300200341f0026a41086a220c4200370300200342003703f00220022007200341f0026a1000200341206a41186a2008290300370300200341206a41106a2005290300370300200341206a41086a200c290300370300200320032903f00237032002402003280204450d002003280200102a0b200341003602f802200342013703f002200341f8036a200341f0026a10eb0120032802f4022102200341206a412020032802f002220720032802f802100702402002450d002007102a0b200341f8036a106a412010282202450d0520022003290340370000200241186a200341c0006a41186a290300370000200241106a200341c0006a41106a290300370000200241086a200341c0006a41086a29030037000020034184026a4100360200200341f4016a428180808010370200200342013702fc01200320023602f001200320063602ec012003200a3602e801200341f8036a41186a200341e0006a41186a290300370300200341f8036a41106a200341e0006a41106a290300370300200341f8036a41086a200341e0006a41086a290300370300200320032903603703f803411a10282207450d06200741002900ec9643370000200741186a41002f008497433b0000200741106a41002900fc9643370000200741086a41002900f496433700002003429a808080a00337020420032007360200200320033602f002200341f8036a200341f0026a10c8012003280200210720032802082108200341f0026a41186a22054200370300200341f0026a41106a220c4200370300200341f0026a41086a220d4200370300200342003703f00220072008200341f0026a1000200341206a41186a2005290300370300200341206a41106a200c290300370300200341206a41086a200d290300370300200320032903f00237032002402003280204450d002003280200102a0b200341203602fc032003200341206a3602f803200341e8016a200341f8036a10b4032002102a20034185046a200341c0006a41086a2903003700002003418d046a200341c0006a41106a29030037000020034195046a200341c0006a41186a2903003700002003419d046a2003290360370000200341a5046a200341e0006a41086a290300370000200341ad046a200341e0006a41106a290300370000200341b5046a200341e0006a41186a290300370000200341c4046a2006360200200341c0046a200a360200200341003a00fc03200341073a00f803200320032903403700fd03200341f8036a21020b410021064101210a41014100200210cc012009102a0b41012109410021070c090b1031000b200541011037000b411e41011037000b412041011037000b411a41011037000b2009106a2009102a410021064101210a0c010b2009106a2009102a410121064100210a0b410121090c010b4100210941012106410021070b02402004410771417f6a220241024b0d0002400240024020020e03000102000b2009450d02200141086a280200450d02200141046a280200102a0c020b200a450d01200141046a2802002202106a2002102a0c010b2006450d00200141086a2802002202106a2002102a0b200020083602042000200736020020034190056a24000bf35c040b7f017e127f027e23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024020012d000022040e0500010a0302000b2003418c046a4101360200200342013702fc03200341ccd1c5003602f803200341043602f402200341c4d1c5003602f0022003200341f0026a36028804200341f8036a41a8a6c300103e000b200141086a2802002105200141046a2802002106024020022d000020022d000172450d0041a39fc600210741112108410021094101210a02402005450d002006102a0b4101210b0c0f0b20062001410c6a280200220c10f001200341f8036a41086a22024200370300200342003703f80341fbefc200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a1006210202400240024020032802f8032207417f460d002002450d00200320073602ec01200320023602e801200341f8036a200341e8016a106d20032802f803220d450d0220032902fc03210e2007450d012002102a0c010b4101210d4200210e0b20064100200c1b2109200d41206a200d200e422088a722021b210f200641206a2006200c1b2110200d410020021b21112006200c4105746a2112200d20024105746a2113410021144100211541012116410021174100211841012119024003402014410174211a2014410574211b024002400240024002400340024020110d00200f211c2016211d2015211e201421080c040b20112102200f21072016211d2015211e20142108201b210a201a210b02400340024002402009450d0020022009460d06200220094120109c05221c450d06201c417f4c0d012007210f201d2116201e211520082114200221110c080b200341f8036a41186a2207201141186a290000370300200341f8036a41106a2208201141106a290000370300200341f8036a41086a2209201141086a290000370300200320112900003703f803024020142015470d00201441016a22022014490d0f2014410174220a2002200a20024b1b221541ffffff3f712015470d0f201541057422024100480d0f0240024020140d002002102821160c010b201620144105742002102c21160b2016450d030b201620144105746a220220032903f803370000200241186a2007290300370000200241106a2008290300370000200241086a2009290300370000410021094100200f200f20134622021b2111201a41026a211a201b41206a211b201441016a2114200f200f41206a20021b210f0c030b200341f8036a41186a221c200241186a290000370300200341f8036a41106a221f200241106a290000370300200341f8036a41086a2220200241086a290000370300200320022900003703f80302402008201e470d00200841016a22022008490d0e200b2002200b20024b1b221e41ffffff3f71201e470d0e201e41057422024100480d0e0240024020080d0020021028211d0c010b201d200a2002102c211d0b201d450d040b201d200a6a220220032903f803370000200241186a201c290300370000200241106a201f290300370000200241086a2020290300370000410020072007201346221c1b2102200b41026a210b200a41206a210a200841016a21082007200741206a201c1b221c21072002450d050c000b0b0b200241011037000b200241011037000b201d2116201e2115200821142007200741206a200720134622021b210f41002010201020124622081b21094100200720021b21112010201041206a20081b21100c030b410021112009450d01201c210f201d2116201e2115200821140b200341206a41186a2207200941186a290000370300200341206a41106a2208200941106a290000370300200341206a41086a220a200941086a29000037030020032009290000370320024020172018470d00201741016a22022017490d07201741017422092002200920024b1b221841ffffff3f712018470d07201841057422024100480d070240024020170d002002102821190c010b201920174105742002102c21190b2019450d030b201920174105746a22022003290320370000200241186a2007290300370000200241106a2008290300370000200241086a200a29030037000041002010201020124622021b2109201741016a21172010201041206a20021b21100c010b0b201d20082006200c10c5020240201e450d00201d102a0b02402018450d002019102a0b0240200ea7450d00200d102a0b200341f8036a41086a22024200370300200342003703f80341fbefc200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f0022003410036028004200342013703f803200c200341f8036a10b4010240200c450d00200c41057421072006210203402002200341f8036a108f01200241206a2102200741606a22070d000b0b20032802fc032102200341f0026a411020032802f8032207200328028004100702402002450d002007102a0b4101210a2005450d0f2006102a0c0f0b200241011037000b41c4d1c300413320034188056a419cd9c3001038000b200141216a2d0000210a200141246a2802002109200341186a200141196a290000370300200341106a200141116a290000370300200341086a200141096a29000037030020032001290001370300024002400240024020022d00000d002002280001220741ff01714101460d010b41b49fc60021070c010b200320074118763a0042200320074108763b01402003200241216a2d00003a005f2003200241196a2900003700572003200241116a29000037004f2003200241096a2900003700472003200241056a280000360043200341f8036a41086a22024200370300200342003703f80341fbefc200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a1006210702400240024002400240024002400240024020032802f8032208417f460d002007450d00200320083602ec01200320073602e801200341f8036a200341e8016a106d20032802f8032202450d0220032902fc03210e2008450d012007102a0c010b4200210e410121020b2002200e422088a7200341c0006a10cd0121070240200ea7450d002002102a0b024020070d0041bea7c3002107411221080c090b411a10282202450d01200241002900b59643370000200241186a41002f00cd96433b0000200241106a41002900c59643370000200241086a41002900bd96433700002003429a808080a0033702fc03200320023602f8032003200341f8036a3602f0022003200341f0026a10c80120032802f80321022003280280042107200341f0026a41186a22084200370300200341f0026a41106a220b4200370300200341f0026a41086a221e4200370300200342003703f00220022007200341f0026a1000200341206a41186a2008290300370300200341206a41106a200b290300370300200341206a41086a201e290300370300200320032903f002370320024020032802fc03450d0020032802f803102a0b200341003602f803200341206a4120200341f8036a1006210220032802f8032207417f460d062002450d06200320073602f402200320023602f002200341f8036a200341f0026a10b303200328028004221e450d0220034194046a280200211420034190046a28020021202003418c046a280200211d41102108200341f8036a41106a280200211f200328028404211320032802fc03211020032802f803210b02402007450d002002102a0b41d0a7c3002107200b2009470d05201e201f4105746a210b201e210241002108024003400240200b20026b41e0004b0d002002200b470d02410021110c070b200341c0006a2002460d0520082002200341c0006a4120109c0522074100476a21082007450d05200241206a2207200341c0006a460d0520082007200341c0006a4120109c0522074100476a21082007450d05200241c0006a2207200341c0006a460d0520082007200341c0006a4120109c0522074100476a21082007450d05200241e0006a2207200341c0006a460d0520024180016a210220082007200341c0006a4120109c0522074100476a210820070d000c050b0b201e201f4105746a210b0340200341c0006a2002460d0420082002200341c0006a4120109c0522074100476a21082007450d0441002111200b200241206a2202470d000c050b0b41c4d1c300413320034188056a419cd9c3001038000b411a41011037000b41c4d1c300413320034188056a419cd9c3001038000b410121110b201d20144105746a211c201d21024100210702400240024003400240201c20026b41e0004b0d002002201c470d024100210b0c040b200341c0006a2002460d0220072002200341c0006a4120109c05220b4100476a2107200b450d02200241206a220b200341c0006a460d022007200b200341c0006a4120109c05220b4100476a2107200b450d02200241c0006a220b200341c0006a460d022007200b200341c0006a4120109c05220b4100476a2107200b450d02200241e0006a220b200341c0006a460d0220024180016a21022007200b200341c0006a4120109c05220b4100476a2107200b0d000c020b0b0340200341c0006a2002460d0120072002200341c0006a4120109c05220b4100476a2107200b450d014100210b201c200241206a2202470d000c020b0b4101210b0b024002400240024002400240024002400240200a41ff01710d00200b450d010c080b20110d07200341f8036a41186a221c200341c0006a41186a290300370300200341f8036a41106a2211200341c0006a41106a290300370300200341f8036a41086a220f200341c0006a41086a290300370300200320032903403703f8030240201f2013460d0020132108201f21130c020b201341016a22022013490d0d201341017422082002200820024b1b220841ffffff3f712008470d0d200841057422024100480d0d0240024020130d0020021028211e0c010b201e20134105742002102c211e0b201e0d01200241011037000b200341f8036a41186a220b200341c0006a41186a290300370300200341f8036a41106a221c200341c0006a41106a290300370300200341f8036a41086a220f200341c0006a41086a290300370300200320032903403703f8030240024020142020460d0020202107201421200c010b202041016a22022020490d0d202041017422072002200720024b1b220741ffffff3f712007470d0d200741057422024100480d0d0240024020200d0020021028211d0c010b201d20204105742002102c211d0b201d0d00200241011037000b201d20204105746a220220032903f803370000200241186a200b290300370000200241106a201c290300370000200241086a200f290300370000201441016a2114024002402011450d00201f20084d0d01201e201f417f6a221f4105746a2202290000210e2002290008212120022900102122201e20084105746a220841186a200241186a29000037000020082022370010200820213700082008200e3700000b20072120201321080c020b41c4f2c2002008201f1034000b201e20134105746a220220032903f803370000200241186a201c290300370000200241106a2011290300370000200241086a200f290300370000201f41016a211f200b450d00201420074d0d01201d2014417f6a22144105746a2202290000210e2002290008212120022900102122201d20074105746a220741186a200241186a29000037000020072022370010200720213700082007200e3700000b2003419d046a200329030037000020034185046a200341c0006a41086a2903003700002003418d046a200341c0006a41106a29030037000020034195046a200341c0006a41186a290300370000200341a5046a200341086a290300370000200341ad046a200341106a290300370000200341b5046a200341186a290300370000200341013a00fc03200341063a00f803200320032903403700fd03200341c4046a2014360200200341c0046a201f360200200341bd046a200a3a000041014100200341f8036a10cc01200341f8036a41086a22024200370300200342003703f80341fbefc200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a1006210220032802f8032207417f460d022002450d02200320073602ec01200320023602e801200341f8036a200341e8016a106d20032802f803220a450d0120032902fc03210e02402007450d002002102a0b200e422088a72102200ea7450d03200a102a0c030b41c4f2c200200720141034000b41c4d1c300413320034188056a419cd9c3001038000b410021020b024002400240024002400240024002400240201f20104f22070d004100200220146b220a200a20024b1b2010490d0020034194046a2014360200200341f8036a41186a2020360200200341f8036a41106a201f36020020034184046a20083602002003201d36028c042003201e36028004200320103602fc03200320093602f803411a10282202450d01200241002900b59643370000200241186a41002f00cd96433b0000200241106a41002900c59643370000200241086a41002900bd96433700002003429a808080a0033702ec01200320023602e8012003200341e8016a3602f0022003200341f0026a10c80120032802e801210220032802f0012107200341f0026a41186a22094200370300200341f0026a41106a220a4200370300200341f0026a41086a220b4200370300200342003703f00220022007200341f0026a1000200341206a41186a2009290300370300200341206a41106a200a290300370300200341206a41086a200b290300370300200320032903f002370320024020032802ec01450d0020032802e801102a0b200341203602f4022003200341206a3602f002200341f8036a200341f0026a10b40302402008450d00201e102a0b20200d050c060b024020070d0020034185046a200341086a2903003700002003418d046a200341106a29030037000020034195046a200341186a290300370000200341033a00fc03200341063a00f803200320032903003700fd0341014100200341f8036a10cc010c040b20034185046a200341086a2903003700002003418d046a200341106a29030037000020034195046a200341186a290300370000200341023a00fc03200341063a00f803200320032903003700fd0341014100200341f8036a10cc01411e10282207450d01200741002900eca643370000200741166a4100290082a743370000200741106a41002900fca643370000200741086a41002900f4a6433700002003429e808080e0033702fc03200320073602f8032003200341f8036a3602f0022003200341f0026a10c80120032802f80321072003280280042109200341f0026a41186a220a4200370300200341f0026a41106a220b4200370300200341f0026a41086a221c4200370300200342003703f00220072009200341f0026a1000200341206a41186a200a290300370300200341206a41106a200b290300370300200341206a41086a201c290300370300200320032903f002370320024020032802fc03450d0020032802f803102a0b200341003602f803200341206a4120200341f8036a100621090240024020032802f803220a417f470d00411321070c010b024020090d00411321070c010b2003200a360284052003200936028005200341f8036a20034180056a10810120032802f80322074113460d03200341f0026a200341f8036a410472418401109a051a0240200a450d002009102a0b200341206a412010090b200341e8016a200341f0026a418401109a051a200341f8036a200341e8016a418401109a051a20074113460d03200341e0006a200341f8036a418401109a051a200320073602f803200341f8036a410472200341e0006a418401109a051a200341fc026a2002360200200341f0026a41086a2010360200200341003a00f402200341013a00f002200341e8016a200341f8036a200341f0026a10f40120032d00f001210220034185046a200341086a2903003700002003418d046a200341106a29030037000020034195046a200341186a2903003700002003419d046a20024102463a0000200341043a00fc03200341063a00f803200320032903003700fd0341014100200341f8036a10cc010c030b411a41011037000b411e41011037000b41c4d1c300413320034188056a419cd9c3001038000b411a10282202450d02200241002900b59643370000200241186a41002f00cd96433b0000200241106a41002900c59643370000200241086a41002900bd96433700002003429a808080a0033702fc03200320023602f8032003200341f8036a3602f0022003200341f0026a10c80120032802f80321072003280280042109200341f0026a41186a220a4200370300200341f0026a41106a220b4200370300200341f0026a41086a22024200370300200342003703f00220072009200341f0026a1000200341206a41186a200a290300370300200341206a41106a200b290300370300200341206a41086a2002290300370300200320032903f002370320024020032802fc03450d0020032802f803102a0b200341206a41201009200341f8036a41086a22074200370300200342003703f803419896c300411d200341f8036a100820022007290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621070240024020032802f8032202417f460d00200320023602ec01200320073602e801200341f8036a200341e8016a106d20032802f8032209450d0520032902fc03210e02402002450d002007102a0b2003200e3702ec01200320093602e8010c010b200341003602f001200342013703e8010b200341e8016a2003106e20032802f001210220032802ec01210a20032802e8012109200341f8036a41086a22074200370300200342003703f803419896c300411d200341f8036a1008200341f0026a41086a2007290300370300200320032903f8033703f0020240024020090d00200341f0026a411010090c010b2003410036028004200342013703f8032002200341f8036a10b40102402002450d00200241057421072009210203402003200341f8036a3602602002200341e0006a10c801200241206a2102200741606a22070d000b0b20032802fc032102200341f0026a411020032802f8032207200328028004100702402002450d002007102a0b200a450d002009102a0b02402008450d00201e102a0b2020450d010b201d102a0b410021074101210a4101210b410121090c140b411a41011037000b41c4d1c300413320034188056a419cd9c3001038000b41e0a7c3002107411621080b02402013450d00201e102a0b2020450d02201d102a0c020b41aba7c30021070b411321080b4101210a4101210b0c0b0b200141086a280200210941b49fc60021074113210820022d00000d052002280001220a41ff01714101470d05200141046a280200210b2003200a4118763a00422003200a4108763b01402003200241216a2d00003a005f2003200241196a2900003700572003200241116a29000037004f2003200241096a2900003700472003200241056a280000360043200341f8036a41086a22024200370300200342003703f80341fbefc200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a1006210702400240024002400240024002400240024002400240024020032802f8032208417f460d002007450d00200320083602ec01200320073602e801200341f8036a200341e8016a106d20032802f8032202450d0220032902fc03210e2008450d012007102a0c010b4200210e410121020b2002200e422088a7200341c0006a10cd0121070240200ea7450d002002102a0b024020070d0041b8a6c3002107411521080c100b2003410036028004200342013703f8032009200341f8036a10eb0120032802fc032107200328028004210820032802f8032102200341f0026a41186a220a4200370300200341f0026a41106a221e4200370300200341f0026a41086a221d4200370300200342003703f00220022008200341f0026a1000200341e0006a41186a2208200a290300370300200341e0006a41106a220a201e290300370300200341e0006a41086a221e201d290300370300200320032903f00237036002402007450d002002102a0b200341f8036a41186a2008290300370300200341f8036a41106a200a290300370300200341f8036a41086a201e290300370300200320032903603703f803411e10282202450d01200241002900eca643370000200241166a4100290082a743370000200241106a41002900fca643370000200241086a41002900f4a6433700002003429e808080e0033702ec01200320023602e8012003200341e8016a3602f002200341f8036a200341f0026a10c80120032802e801210220032802f0012107200341f0026a41186a22084200370300200341f0026a41106a220a4200370300200341f0026a41086a221e4200370300200342003703f00220022007200341f0026a1000200341206a41186a2008290300370300200341206a41106a200a290300370300200341206a41086a201e290300370300200320032903f002370320024020032802ec01450d0020032802e801102a0b200341206a41204101410041001003417f470d02200341f8036a41086a22024200370300200342003703f8030240200b4102490d00418aa7c3004121200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f0024100210a200341003602f803200341f0026a4110200341f8036a10062102024020032802f8032207417f460d002002450d0020074104490d052002280000210a2002102a0b200341f8036a41086a22024200370300200342003703f803418aa7c3004121200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621020240024020032802f8032207417f460d002002450d00024020074104490d00200228000021072002102a200741016a21070c020b41c4d1c300413320034188056a419cd9c3001038000b410121070b200341f8036a41086a22024200370300200342003703f803418aa7c3004121200341f8036a1008200341f0026a41086a22082002290300370300200320032903f8033703f002200320073602f803200341f0026a4110200341f8036a4104100720024200370300200342003703f803419896c300411d200341f8036a100820082002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a1006210220032802f8032207417f460d062002450d06200320073602ec01200320023602e801200341f8036a200341e8016a106d20032802f8032208450d0520032902fc03210e02402007450d002002102a0b200320083602e8012003200e3702ec01200341206a41186a200341e0006a41186a290300370300200341206a41106a200341e0006a41106a290300370300200341206a41086a200341e0006a41086a29030037030020032003290360370320200341e8016a2107200e422088a72202200ea72208470d090c080b41fbefc200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f00241002102200341003602f803200341f0026a4110200341f8036a10062108024020032802f8032207417f460d00200320073602ec01200320083602e801200341f8036a200341e8016a106d20032802f803220a450d0720032902fc03210e02402007450d002008102a0b200e422088a72102200ea7450d00200a102a0b200341f8036a2009418801109a051a200341fc026a2002360200200341f0026a41086a4101360200200341003a00f402200341013a00f002200341e8016a200341f8036a200341f0026a10f40120032d00f001210220034185046a200341e0006a41086a2903003700002003418d046a200341f0006a29030037000020034195046a200341f8006a2903003700002003419d046a20024102463a0000200341043a00fc03200341063a00f803200320032903603700fd03200341f8036a21020c090b41c4d1c300413320034188056a419cd9c3001038000b411e41011037000b41cda6c3002107411f21080c0c0b41c4d1c300413320034188056a419cd9c3001038000b41c4d1c300413320034188056a419cd9c3001038000b41002102200341003602f001200342013703e801200341206a41186a200341e0006a41186a290300370300200341206a41106a200341e0006a41106a290300370300200341206a41086a200341e0006a41086a29030037030020032003290360370320200341e8016a21070c010b41c4d1c300413320034188056a419cd9c3001038000b200741046a28020022082002470d00200241016a22082002490d022002410174221e2008201e20084b1b220841ffffff3f712008470d022008410574221e4100480d020240024020020d00201e102821020c010b20072802002002410574201e102c21020b2002450d0320072002360200200741046a200836020020032802f00121020b2007280200221e2002410574221c6a22072003290320370000200741186a200341206a41186a290300370000200741106a200341206a41106a290300370000200741086a200341206a41086a2903003700002003200241016a22073602f001200341f8036a41086a221d4200370300200342003703f803419896c300411d200341f8036a1008200341f0026a41086a201d290300370300200320032903f8033703f0022003410036028004200342013703f8032007200341f8036a10b401024020072002490d00201c41206a2107201e210203402003200341f8036a3602202002200341206a10c801200241206a2102200741606a22070d000b0b20032802fc032102200341f0026a411020032802f8032207200328028004100702402002450d002007102a0b02402008450d00201e102a0b200341f8036a2009418801109a051a200341e8016a41186a200341e0006a41186a290300370300200341e8016a41106a200341e0006a41106a290300370300200341e8016a41086a200341e0006a41086a290300370300200320032903603703e801411e10282202450d03200241002900eca643370000200241166a4100290082a743370000200241106a41002900fca643370000200241086a41002900f4a6433700002003429e808080e00337020420032002360200200320033602f002200341e8016a200341f0026a10c8012003280200210220032802082107200341f0026a41186a22084200370300200341f0026a41106a221e4200370300200341f0026a41086a221d4200370300200342003703f00220022007200341f0026a1000200341206a41186a2008290300370300200341206a41106a201e290300370300200341206a41086a201d290300370300200320032903f00237032002402003280204450d002003280200102a0b200341003602f802200342013703f002200341f8036a200341f0026a10eb0120032802f4022102200341206a412020032802f002220720032802f802100702402002450d002007102a0b200341f8036a106a412010282202450d0420022003290340370000200241186a200341c0006a41186a290300370000200241106a200341c0006a41106a290300370000200241086a200341c0006a41086a29030037000020034184026a4100360200200341f4016a428180808010370200200342013702fc01200320023602f0012003200b3602ec012003200a3602e801200341f8036a41186a200341e0006a41186a290300370300200341f8036a41106a200341e0006a41106a290300370300200341f8036a41086a200341e0006a41086a290300370300200320032903603703f803411a10282207450d05200741002900b59643370000200741186a41002f00cd96433b0000200741106a41002900c59643370000200741086a41002900bd96433700002003429a808080a00337020420032007360200200320033602f002200341f8036a200341f0026a10c8012003280200210720032802082108200341f0026a41186a221e4200370300200341f0026a41106a221d4200370300200341f0026a41086a221c4200370300200342003703f00220072008200341f0026a1000200341206a41186a201e290300370300200341206a41106a201d290300370300200341206a41086a201c290300370300200320032903f00237032002402003280204450d002003280200102a0b200341203602fc032003200341206a3602f803200341e8016a200341f8036a10b4032002102a20034185046a200341c0006a41086a2903003700002003418d046a200341c0006a41106a29030037000020034195046a200341c0006a41186a2903003700002003419d046a2003290360370000200341a5046a200341e0006a41086a290300370000200341ad046a200341e0006a41106a290300370000200341b5046a200341e0006a41186a290300370000200341c4046a200b360200200341c0046a200a360200200341003a00fc03200341063a00f803200320032903403700fd03200341f8036a21020b4100210b4101210a41014100200210cc012009102a0c070b1031000b201e41011037000b411e41011037000b412041011037000b411a41011037000b2009106a2009102a4100210b4101210a0c040b200141046a280200210941b49fc60021074113210820022d00000d022002280001220a41ff01714101470d022003200a4118763a00622003200a4108763b01602003200241216a2d00003a007f2003200241196a2900003700772003200241116a29000037006f2003200241096a2900003700672003200241056a2800003600634200210e200341f8036a41086a22024200370300200342003703f80341fbefc200411b200341f8036a1008200341f0026a41086a2002290300370300200320032903f8033703f002200341003602f803200341f0026a4110200341f8036a100621080240024020032802f8032207417f460d00200320073602ec01200320083602e801200341f8036a200341e8016a106d20032802f8032202450d0320032902fc03210e2007450d012008102a0c010b410121020b2002200e422088a7200341e0006a10cd0121070240200ea7450d002002102a0b024020070d0041b8a6c3002107411521080c030b4100210a2003410036028004200342013703f8032009200341f8036a10eb0120032802fc032107200328028004210820032802f8032102200341f0026a41186a220b4200370300200341f0026a41106a221e4200370300200341f0026a41086a221d4200370300200342003703f00220022008200341f0026a1000200341e8016a41186a2208200b290300370300200341e8016a41106a221c201e290300370300200341e8016a41086a221e201d290300370300200320032903f0023703e80102402007450d002002102a0b200341f8036a2009418801109a051a200341f0026a410d6a200341e0006a41086a290300370000200341f0026a41156a200341e0006a41106a290300370000200341f0026a411d6a200341e0006a41186a2903003700004101210b200341013a00f402200320032903603700f502200341013a00f002200341c0006a200341f8036a200341f0026a10f40120032d00482102200341f8036a410d6a201e290300370000200341f8036a41156a201c290300370000200341f8036a411d6a20082903003700002003419d046a20024102463a0000200341053a00fc03200341063a00f803200320032903e8013700fd0341014100200341f8036a10cc012009102a0b41012109410021070c040b41c4d1c300413320034188056a419cd9c3001038000b2009106a2009102a4101210b4100210a0b410121090c010b410021094101210b410021070b02402004410771417f6a220241024b0d0002400240024020020e03000102000b2009450d02200141086a280200450d02200141046a280200102a0c020b200a450d01200141046a2802002202106a2002102a0c010b200b450d00200141086a2802002202106a2002102a0b200020083602042000200736020020034190056a24000bfad30106017f027e017f017e157f017e230041b0086b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e12000102030405060708090a0b0c0d0e0f1013000b200341ac066a41013602002003420137029c06200341ccd1c5003602980620034104360254200341c4d1c5003602502003200341d0006a3602a80620034198066a41d4d1c500103e000b200141106a2903002104200141086a2903002105200141046a28020021062002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241046a2d00002115200241026a2f0100211602400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002118200241056a2d0000211920022d0001211a200320073703980641002102201a41ff01714101460d010b410121024104211941002117410021180b20032007370348200320083a0047200320093a00462003200a3b01442003200b3a00432003200c3a00422003200d3b01402003200e3a003f2003200f3a003e200320103b013c200320113a003b200320123a003a200320133b0138200320143a0037200320153a0032200320163b01302003201841ffff0371410874201741187472201941ff017172220a36003302402002450d00410f210841ea9fc6002109024002400240024002400240200a0e0700010203040565000b20032800372109200328003b21080c640b410e210841dc9fc60021090c630b410c210841d09fc60021090c620b4109210841c79fc60021090c610b4113210841b49fc60021090c600b4111210841a39fc60021090c5f0b200341b8036a41186a200341306a41186a290300370300200341b8036a41106a200341306a41106a290300370300200341b8036a41086a200341306a41086a290300370300200320032903303703b8030240200542808084fea6dee1115441002004501b450d0041e4d1c5002109410d21080c5f0b2003200341b8036a2005200410830202402003280200450d0041f1d1c5002109411a21080c5f0b20034188086a41086a220242003703002003420037038808419090c600411920034188086a1008200341e8076a41086a200229030037030020032003290388083703e807410021082003410036029806200341e8076a411020034198066a1006210202402003280298062209417f460d002002450d0020094104490d18200228000021082002102a0b20034188086a41086a220942003703002003420037038808419090c600411920034188086a1008200341e8076a41086a220a200929030037030020032003290388083703e8072003200841016a36029806200341e8076a411020034198066a41041007412010282202450d18200220032903b803370000200341ac066a428180808010370200200241186a200341b8036a41186a2217290300370000200241106a200341b8036a41106a2218290300370000200241086a200341b8036a41086a22192903003700002003200537039806200320023602a806200320043703a006200820034198066a10c404200341a0026a200610cf03200341d0006a200341a0026a418801109a051a200341e4016a2019290300370200200341ec016a2018290300370200200341f4016a2017290300370200200320083602d801200320032903b8033702dc0120094200370300200342003703880841ac89c500411520034188086a1008200a200929030037030020032003290388083703e8072003410036029806200341e8076a411020034198066a10062109024002402003280298062202417f460d002002210a20090d010b200341003602a0062003420137039806410020034198066a10b40120032802a0062102200328029c06210a20032802980621090b200320023602d0072003200a3602cc07200320093602c807024002402002450d0020034198066a20092002410110d6022003280298064101470d0120032802cc07450d5d20032802c807102a0c5d0b4101200341c8076a10b40120032802d801210a0240024020032802cc07220920032802d00722026b4104490d0020032802c80721090c010b200241046a22172002490d4b200941017422022017200220174b1b22024100480d4b0240024020090d002002102821090c010b20032802c80720092002102c21090b2009450d1b200320023602cc07200320093602c80720032802d00721020b2003200241046a3602d007200920026a200a360000200341d0006a200341c8076a10eb01200341dc016a200341c8076a108f010c5a0b200328029c0621170240200341a4066a2802002202200341a0066a2802002209460d0020032802d007200220096b6a220a41b0016a2218417f4c0d1b0240024020180d00410121190c010b201810282219450d1d0b2003201836028c0820032019360288082003200a36029008200320034188086a36029806201720034198066a200210d701200a2002490d1d2003280290082217200a490d1e20032802d00722172009490d1f200328028808211820032802c80721192003200a20026b220a3602302003201720096b221736028002200a2017470d20201820026a201920096a200a109a051a20032802d801210a02400240200328028c08220920032802900822026b4104490d0020032802880821090c010b200241046a22172002490d4b200941017422022017200220174b1b22024100480d4b0240024020090d002002102821090c010b20032802880820092002102c21090b2009450d222003200236028c08200320093602880820032802900821020b2003200241046a36029008200920026a200a360000200341d0006a20034188086a10eb01200341dc016a20034188086a108f012003280290082109200328028c08210a200328028808210220032802cc07450d5b20032802c807102a0c5b0b2003200341c8076a36029806201720034198066a200910d70120032802d801210a0240024020032802cc07220920032802d00722026b4104490d0020032802c80721090c010b200241046a22172002490d4a200941017422022017200220174b1b22024100480d4a0240024020090d002002102821090c010b20032802c80720092002102c21090b2009450d22200320023602cc07200320093602c80720032802d00721020b2003200241046a3602d007200920026a200a360000200341d0006a200341c8076a10eb01200341dc016a200341c8076a108f010c590b200141046a28020021162002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d00002119200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002106200241056a2d0000211820022d0001211a200320073703980641002102201a41ff01714101460d010b410121024104211841002117410021060b2003200737039802200320083a009702200320093a0096022003200a3b019402200320193a0093022003200b3a0092022003200c3b0190022003200d3a008f022003200e3a008e022003200f3b018c02200320103a008b02200320113a008a02200320123b018802200320133a008702200320143a008202200320153b0180022003200641ffff0371410874201741187472201841ff017172220a3600830202402002450d00410f210841ea9fc6002109200a0e070f1213141555560f0b200341d0006a41186a20034180026a41186a290300370300200341d0006a41106a20034180026a41106a290300370300200341d0006a41086a20034180026a41086a290300370300200320032903800237035020034198066a201610b804024020032802a80622170d00418bd2c5002109412421084101210a0c570b200341b4066a280200210920034198066a41186a280200210820032802ac062102200341086a200341d0006a200329029c062207422086200335029806842204200341a4066a350200422086200742208884220710830220032802080d53200341306a41186a200341d0006a41186a290300370300200341306a41106a220a200341d0006a41106a290300370300200341306a41086a2218200341d0006a41086a29030037030020032003290350370330024020082002460d0020022106200821020c520b200241016a22062002490d48200241017422192006201920064b1b220641ffffff3f712006470d48200641057422194100480d480240024020020d002019102821170c010b201720024105742019102c21170b20170d51201941011037000b200141026a2d00002116200141046a280200211a20012d0001211b2002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d00002119200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002106200241056a2d0000211820022d0001211c200320073703980641002102201c41ff01714101460d010b410121024104211841002117410021060b20032007370348200320083a0047200320093a00462003200a3b0144200320193a00432003200b3a00422003200c3b01402003200d3a003f2003200e3a003e2003200f3b013c200320103a003b200320113a003a200320123b0138200320133a0037200320143a0032200320153b01302003200641ffff0371410874201741187472201841ff017172220a36003302402002450d00410f210841ea9fc60021090240200a0e0700121314155556000b20032800372109200328003b21084101210a0c560b20034180026a41186a200341306a41186a290300220737030020034180026a41106a200341306a41106a290300220437030020034180026a41086a200341306a41086a290300220537030020032003290330221d3703800220034198066a41186a200737030020034198066a41106a200437030020034198066a41086a20053703002003201d3703980620034198066a201a201b41ff0171410047201610c50421090c4f0b200141026a2d00002116200141046a280200211a20012d0001211b2002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d00002119200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002106200241056a2d0000211820022d0001211c200320073703980641002102201c41ff01714101460d010b410121024104211841002117410021060b2003200737039802200320083a009702200320093a0096022003200a3b019402200320193a0093022003200b3a0092022003200c3b0190022003200d3a008f022003200e3a008e022003200f3b018c02200320103a008b02200320113a008a02200320123b018802200320133a008702200320143a008202200320153b0180022003200641ffff0371410874201741187472201841ff017172220a3600830202402002450d00410f210841ea9fc6002109200a0e070d1011121353540d0b200341d0006a41186a20034180026a41186a290300370300200341d0006a41106a20034180026a41106a290300370300200341d0006a41086a20034180026a41086a2903003703002003200329038002370350410f10282202450d1f200241002900c9d245370000200241076a41002900d0d2453700002003428f808080f00137029c062003200236029806200341d0006a20034198066a108f0120032802a00621022003280298062108200341a0026a41186a22094200370300200341a0026a41106a220a4200370300200341a0026a41086a22174200370300200342003703a00220082002200341a0026a1000200341306a41186a2009290300370300200341306a41106a200a290300370300200341306a41086a2017290300370300200320032903a0023703300240200328029c06450d00200328029806102a0b20034198066a200341306a412010fd01200341e8046a41026a220a20032d009b063a0000200341e8076a41086a200341ac066a290200370300200341e8076a410d6a2217200341b1066a290000370000200320032f0099063b01e8042003200341a4066a2902003703e807410121020240024020032d0098064101460d00410b210841d8d2c50021090c010b20034198066a41086a2802002108200328029c062109200341c0046a41026a200a2d00003a000020034188056a41086a200341e8076a41086a29030037030020034188056a410d6a2017290000370000200320032f01e8043b01c004200320032903e80737038805410021020b200341106a41026a200341c0046a41026a2d00003a000020034188086a41086a220a20034188056a41086a29030037030020034188086a41106a20034188056a41106a290300370300200320032f01c0043b011020032003290388053703880820020d53200341d0056a41026a200341106a41026a2d000022023a0000200341b8036a41086a2217200a290300370300200341b8036a410d6a220a20034188086a410d6a290000370000200320032f011022063b01d00520032003290388083703b803200341ab066a2017290300370000200341b0066a200a290000370000200320023a009a06200320063b0198062003200836009f062003200936009b06200320032903b8033700a30620034198066a201a201b41ff0171410047201610c50421090c4e0b41a6f5c5002109410e210820022d0000417f6a221941024b0d52200141046a280200210b4101210a4101210641012118410121170240024020190e03005d01000b200241046a2d00000d534101210a410121064101211841012117200241086a28020041036c2002410c6a280200410174490d5c0b20034198066a200b10ca03024020032802980622024113470d0041f3d4c5002109410d21084101210a0c540b200341a0026a20034198066a410472419401109a051a20032002360250200341d0006a410472200341a0026a419401109a051a200341003602a0062003420137039806200341d0006a20034198066a10eb01200328029c06210820032802a00621092003280298062102200341a0026a41186a220a4200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220022009200341a0026a1000200341b8036a41186a2209200a290300370300200341b8036a41106a220a2017290300370300200341b8036a41086a22172006290300370300200320032903a0023703b80302402008450d002002102a0b20034198066a41186a200929030037030020034198066a41106a200a29030037030020034198066a41086a2017290300370300200320032903b80337039806411710282202450d1f200241002900e3d2453700002002410f6a41002900f2d245370000200241086a41002900ebd24537000020034297808080f0023702d405200320023602d0052003200341d0056a3602a00220034198066a200341a0026a10c80120032802d005210220032802d8052108200341a0026a41186a22094200370300200341a0026a41106a220a4200370300200341a0026a41086a22174200370300200342003703a00220022008200341a0026a1000200341306a41186a2009290300370300200341306a41106a200a290300370300200341306a41086a2017290300370300200320032903a002370330024020032802d405450d0020032802d005102a0b4101210a200341306a41204101410041001003417f460d4c200341d0006a106a4180d5c5002109412521080c530b200141046a280200210a41a6f5c5002109410e210820022d0000417f6a221741024b0d4a0240024020170e03004c01000b200241086a2802004101742002410c6a280200490d4b200241046a28020041ff01710d4b0b20034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e8070240200341e8076a41104101410041001003417f460d004194d3c5002109411521080c4b0b200341003602a0062003420137039806200a20034198066a10eb01200328029c06210820032802a00621092003280298062102200341a0026a41186a22174200370300200341a0026a41106a22064200370300200341a0026a41086a22184200370300200342003703a00220022009200341a0026a1000200341d0006a41186a22092017290300370300200341d0006a41106a2006290300370300200341d0006a41086a2018290300370300200320032903a00237035002402008450d002002102a0b20034198066a41186a200929030037030020034198066a41106a200341d0006a41106a29030037030020034198066a41086a200341d0006a41086a2903003703002003200329035037039806411310282202450d1f200241002900a9d3453700002002410f6a41002800b8d345360000200241086a41002900b1d34537000020034293808080b0023702d405200320023602d0052003200341d0056a3602a00220034198066a200341a0026a10c80120032802d005210220032802d8052108200341a0026a41186a22094200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220022008200341a0026a1000200341306a41186a2009290300370300200341306a41106a2017290300370300200341306a41086a2006290300370300200320032903a002370330024020032802d405450d0020032802d005102a0b200341b8036a200341306a10e103024020032802bc032202450d0020032802b803210820032802c0032109109801211702402009450d002002102a0b201720084f0d0041fad2c5002109411a21080c4b0b20034198066a200a418801109b051a200341003a00a00720034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e807200341003602a802200342013703a00220034198066a200341a0026a10eb01024020032d00a007220241024b0d00024002400240024020020e03000102000b410021080c020b410121080c010b410221080b200320083a00a8080240024020032802a40220032802a8022202460d0020032802a00221090c010b200241016a22082002490d46200241017422092008200920084b1b22084100480d460240024020020d002008102821090c010b20032802a00220022008102c21090b2009450d22200320083602a402200320093602a00220032d00a808210820032802a80221020b2003200241016a3602a802200920026a20083a00000b20032802a4022102200341e8076a411020032802a002220820032802a802100702402002450d002008102a0b20034198066a106a200a102a4100210a410121060c480b200141046a28020021080240024020022d0000417f6a220941024b0d00024020090e03000102000b200241046a2d00000d00200241086a2802004102742002410c6a28020041036c4f0d010b2008106a2008102a41a6f5c5002109410e2108410021064101210a410121180c530b20034198066a2008418801109a051a200341023a00a00720034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e807200341003602582003420137035020034198066a200341d0006a10eb01024020032d00a007220241024b0d00024002400240024020020e03000102000b410021090c020b410121090c010b410221090b200320093a00a80802400240200328025420032802582202460d002003280250210a0c010b200241016a22092002490d452002410174220a2009200a20094b1b22094100480d450240024020020d0020091028210a0c010b200328025020022009102c210a0b200a450d22200320093602542003200a36025020032d00a8082109200328025821020b2003200241016a360258200a20026a20093a00000b20032802542102200341e8076a4110200328025022092003280258100702402002450d002009102a0b20034198066a106a2008102a410021064101210a0c470b200141046a28020021080240024020022d0000417f6a220941024b0d00024020090e03000102000b200241086a2802002002410c6a280200490d00200241046a28020041ff0171450d010b2008106a2008102a41a6f5c5002109410e2108410021184101210a410121060c520b20034198066a2008418801109a051a200341013a00a00720034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e807200341003602582003420137035020034198066a200341d0006a10eb01024020032d00a007220241024b0d00024002400240024020020e03000102000b410021090c020b410121090c010b410221090b200320093a00a80802400240200328025420032802582202460d002003280250210a0c010b200241016a22092002490d442002410174220a2009200a20094b1b22094100480d440240024020020d0020091028210a0c010b200328025020022009102c210a0b200a450d22200320093602542003200a36025020032d00a8082109200328025821020b2003200241016a360258200a20026a20093a00000b20032802542102200341e8076a4110200328025022092003280258100702402002450d002009102a0b20034198066a106a2008102a410021184101210a410121060c470b200141286a2802002118200141246a2802002106200341e8056a200141196a290000370300200341e0056a200141116a290000370300200341d0056a41086a200141096a290000370300200320012900013703d0054101210a41a6f5c5002109410e210820022d0000417e6a221741014b0d4f0240024020170e020001000b200241046a2d00000d50200241086a28020041036c2002410c6a280200410174490d500b20034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e80720034198066a200341e8076a10df032003280298062102200341a0026a20034198066a410472418401109a051a200320032800a107360288082003200341a4076a28000036008b08024020024113470d0041f2d3c5002109411021080c500b200341a0076a2d00002108200341b8036a200341a0026a418401109a051a20032002360250200341d0006a410472200341b8036a418401109a051a200841ff01710d4341c8d3c5002109412a21080c440b200341a0056a200141196a29000037030020034188056a41106a200141116a29000037030020034188056a41086a200141096a2900003703002003200129000137038805200241216a2f0000200241236a2d00004110747221082002411d6a2f00002002411f6a2d00004110747221092002410d6a2f00002002410f6a2d000041107472210a200241096a2f00002002410b6a2d0000411074722117200241056a2f0000200241076a2d0000411074722106200241206a2d0000210b200241106a2d0000210c2002410c6a2d0000210d200241086a2d0000210e0240024020022d00004102460d00410121180c010b200241246a2802002119200241116a2900002107200241046a2d0000210f2003200241196a2800003602a0062003200737039806410121180240200f4101460d000c010b2007421888a7210f2007a7210241002118200329029c0621070b200320083b019c022003419e026a20084110763a0000200320093b0198022003419a026a20094110763a0000200320023b018c02410e210820034180026a410e6a20024110763a00002003200a3b0188022003418a026a200a4110763a0000200320193a009f022003200b3a009b0220032007370390022003200f3a008f022003200c3a008b022003200d3a0087022003200e3a008302200320173b018402200320174110763a008602200320063b018002200320064110763a00820202402018450d0041a6f5c50021094101210a0c4f0b200341d0056a41186a20034180026a41186a290300370300200341d0056a41106a20034180026a41106a290300370300200341d0056a41086a20034180026a41086a29030037030020032003290380023703d00520034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e80720034198066a200341e8076a10df032003280298062102200341a0026a20034198066a4104722208418401109a051a2003200341a4076a28000036008b08200320032800a10736028808024020024113460d00200341d0006a200341a0026a418401109a051a20032002360298062008200341d0006a418401109a051a200341003602a802200342013703a00220034198066a200341a0026a10eb0120032802a402210820032802a802210920032802a0022102200341a0026a41186a220a4200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220022009200341a0026a1000200341b8036a41186a200a290300370300200341b8036a41106a2017290300370300200341b8036a41086a2006290300370300200320032903a0023703b80302402008450d002002102a0b20034188056a200341b8036a4120109c05210220034198066a106a02402002450d00411021084182d4c50021094101210a0c500b411310282202450d20200241002900a9d3453700002002410f6a41002800b8d345360000200241086a41002900b1d34537000020034293808080b002370254200320023602502003200341d0006a3602a00220034188056a200341a0026a10c8012003280250210220032802582108200341a0026a41186a22094200370300200341a0026a41106a220a4200370300200341a0026a41086a22174200370300200342003703a00220022008200341a0026a1000200341306a41186a2009290300370300200341306a41106a200a290300370300200341306a41086a2017290300370300200320032903a00237033002402003280254450d002003280250102a0b20034198066a200341306a10e103200328029c0622170d374101211741002118410021190c380b411421084192d4c50021094101210a0c4e0b4101210a20022d000120022d0000720d34200141046a28020010ce03410021090c490b4101210a20022d000120022d0000720d332001410c6a2802002119200141086a2802002108200141046a2802002109411710282202450d1e2002410f6a41002900918945370000200241086a410029008a894537000020024100290082894537000020024117412e102c2202450d1f2002200936001742002107200341a0026a41186a22174200370300200341a0026a41106a22064200370300200341a0026a41086a22184200370300200342003703a0022002411b200341a0026a1000200341306a41186a2017290300370300200341306a41106a2006290300370300200341306a41086a2018290300370300200320032903a0023703302002102a2003410036029806200341306a412020034198066a10062102024002402003280298062206417f470d00410821170c010b024020020d00410821170c010b200320063602542003200236025020034198066a200341d0006a1080012003280298062217450d21200329029c0621072006450d002002102a0b2007422088a721020240024002400240201720084190016c6a2206450d00200820024f0d0020062802004113460d01201720084190016c6a22084188016a2802002019470d012006106a20064113360200200841046a200341a0026a418401109a051a2008418c016a2003418b086a28000036000020084189016a200328008808360000411710282208450d252008410f6a41002900918945370000200841086a410029008a894537000020084100290082894537000020084117412e102c2208450d2620082009360017200341a0026a41186a22094200370300200341a0026a41106a22064200370300200341a0026a41086a22184200370300200342003703a0022008411b200341a0026a1000200341306a41186a2009290300370300200341306a41106a2006290300370300200341306a41086a2018290300370300200320032903a0023703302008102a20034198066a2017200210ac02200341306a4120200328029806220820032802a00610070240200328029c06450d002008102a0b20024190016c2108201721020340024020022802004113460d002002106a0b20024190016a2102200841f07e6a22080d000b410021092007a70d030c4c0b2002450d010b20024190016c2108201721020340024020022802004113460d002002106a0b20024190016a2102200841f07e6a22080d000b0b41a5d5c5002109411221082007a7450d4d2017102a0c4d0b2017102a0c480b200341b8036a41186a200141196a290000370300200341b8036a41106a200141116a290000370300200341b8036a41086a200141096a290000370300200320012900013703b8032002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d00002119200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002106200241056a2d0000211820022d00012116200320073703980641002102201641ff01714101460d010b410121024100210641042118410021170b2003200737039802200320083a009702200320093a0096022003200a3b019402200320193a0093022003200b3a0092022003200c3b0190022003200d3a008f022003200e3a008e022003200f3b018c02200320103a008b02200320113a008a02200320123b018802200320133a008702200320143a008202200320153b0180022003200641ffff0371410874201841ff017172201741187472220a3600830202402002450d00410f210841ea9fc6002109200a0e07040708090a4a4b040b200341c0046a41186a20034180026a41186a290300370300200341c0046a41106a20034180026a41106a290300370300200341c0046a41086a20034180026a41086a29030037030020032003290380023703c004410f10282202450d22200241002900c9d245370000200241076a41002900d0d2453700002003428f808080f00137029c062003200236029806200341b8036a20034198066a108f0120032802a00621022003280298062108200341a0026a41186a22094200370300200341a0026a41106a220a4200370300200341a0026a41086a22174200370300200342003703a00220082002200341a0026a1000200341306a41186a2009290300370300200341306a41106a200a290300370300200341306a41086a2017290300370300200320032903a0023703300240200328029c06450d00200328029806102a0b0240200341306a41204101410041001003417f460d0041ccd4c5002109410f21084101210a0c4c0b200341d0006a41186a200341c0046a41186a290300370300200341d0006a41106a200341c0046a41106a290300370300200341d0006a41086a200341c0046a41086a290300370300200320032903c00437035020034198066a41186a200341b8036a41186a29030037030020034198066a41106a200341b8036a41106a29030037030020034198066a41086a200341b8036a41086a290300370300200320032903b80337039806410f10282202450d2341002109200241002900c9d245370000200241076a41002900d0d2453700002003428f808080f0013702d405200320023602d00520034198066a200341d0056a108f0120032802d805210220032802d0052108200341a0026a41186a220a4200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220082002200341a0026a1000200341306a41186a200a290300370300200341306a41106a2017290300370300200341306a41086a2006290300370300200320032903a002370330024020032802d405450d0020032802d005102a0b2003412036029c062003200341306a36029806200341d0006a20034198066a10ff014101210a0c4b0b2002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d00002119200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002106200241056a2d0000211820022d00012116200320073703980641002102201641ff01714101460d010b410121024100210641042118410021170b2003200737039802200320083a009702200320093a0096022003200a3b019402200320193a0093022003200b3a0092022003200c3b0190022003200d3a008f022003200e3a008e022003200f3b018c02200320103a008b02200320113a008a02200320123b018802200320133a008702200320143a008202200320153b0180022003200641ffff0371410874201841ff017172201741187472220a3600830202402002450d00410f210841ea9fc6002109200a0e070306070809494a030b200341c0046a41186a20034180026a41186a2903002207370300200341c0046a41106a20034180026a41106a2903002204370300200341c0046a41086a20034180026a41086a29030022053703002003200329038002221d3703c00420034198066a41186a200737030020034198066a41106a200437030020034198066a41086a20053703002003201d37039806410f10282202450d2341002109200241002900c9d245370000200241076a41002900d0d2453700002003428f808080f0013702542003200236025020034198066a200341d0006a108f012003280258210220032802502108200341a0026a41186a220a4200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220082002200341a0026a1000200341306a41186a200a290300370300200341306a41106a2017290300370300200341306a41086a2006290300370300200320032903a00237033002402003280254450d002003280250102a0b200341306a412010094101210a0c460b200341d0056a41186a200141196a290000370300200341d0056a41106a200141116a290000370300200341d0056a41086a200141096a290000370300200320012900013703d0052002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d00002119200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002106200241056a2d0000211820022d00012116200320073703980641002102201641ff01714101460d010b410121024100210641042118410021170b200320073703d804200320083a00d704200320093a00d6042003200a3b01d404200320193a00d3042003200b3a00d2042003200c3b01d0042003200d3a00cf042003200e3a00ce042003200f3b01cc04200320103a00cb04200320113a00ca04200320123b01c804200320133a00c704200320143a00c204200320153b01c0042003200641ffff0371410874201841ff017172201741187472220a3600c30402402002450d00410f210841ea9fc60021090240200a0e070006070809494a000b20032800c704210920032800cb0421084101210a0c4a0b200341b8036a41186a200341c0046a41186a290300370300200341b8036a41106a200341c0046a41106a290300370300200341b8036a41086a200341c0046a41086a290300370300200320032903c0043703b803410f10282202450d23200241002900c9d245370000200241076a41002900d0d2453700002003428f808080f0013702cc07200320023602c807200341d0056a200341c8076a108f0120032802d007210220032802c8072108200341a0026a41186a22094200370300200341a0026a41106a220a4200370300200341a0026a41086a22174200370300200342003703a00220082002200341a0026a1000200341306a41186a2009290300370300200341306a41106a200a290300370300200341306a41086a2017290300370300200320032903a002370330024020032802cc07450d0020032802c807102a0b20034198066a200341306a412010fd0120034180026a41086a200341a1066a29000037030020034190026a200341a9066a29000037030020034180026a41186a200341b1066a290000370300200320032900990637038002410121020240024020032d0098064101460d00410b210841d8d2c50021090c010b200341e8046a41026a20032d00820222023a0000200341e8076a41086a220a20034193026a290000370300200341e8076a410d6a221720034198026a290000370000200341c0046a41026a20023a0000200320032f01800222023b01e8042003200329008b0222073703e807200320023b01c0042003280083022109200328008702210820034188056a410d6a201729000037000020034188056a41086a200a2903003703002003200737038805410021020b200341106a41026a220a200341c0046a41026a2d00003a000020034188086a41086a221720034188056a41086a29030037030020034188086a41106a20034188056a41106a290300370300200320032f01c0043b011020032003290388053703880820020d48200341e3006a2017290300370000200341d0006a41186a20034195086a290000370000200320032f01103b01502003200836005720032009360053200320032903880837005b2003200a2d00003a00520240200341d0006a200341b8036a4120109c05450d0041dbd4c5002109410b21084101210a0c4a0b20034198066a41186a200341d0056a41186a29030037030020034198066a41106a200341d0056a41106a29030037030020034198066a41086a200341d0056a41086a290300370300200320032903d00537039806410f10282202450d2441002109200241002900c9d245370000200241076a41002900d0d2453700002003428f808080f0013702542003200236025020034198066a200341d0006a108f012003280258210220032802502108200341a0026a41186a220a4200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220082002200341a0026a100020034180026a41186a200a29030037030020034180026a41106a201729030037030020034180026a41086a2006290300370300200320032903a0023703800202402003280254450d002003280250102a0b20034180026a412010094101210a0c490b200141216a2d00002116200341106a41186a200141196a290000370300200341106a41106a200141116a290000370300200341106a41086a200141096a290000370300200320012900013703102002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d00002119200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320083a009b06200320093a009a062003200a3b0198060c010b200241086a2d00002117200241066a2f01002106200241056a2d0000211820022d0001211a200320073703980641002102201a41ff01714101460d010b410121024100210641042118410021170b2003200737039802200320083a009702200320093a0096022003200a3b019402200320193a0093022003200b3a0092022003200c3b0190022003200d3a008f022003200e3a008e022003200f3b018c02200320103a008b02200320113a008a02200320123b018802200320133a008702200320143a008202200320153b0180022003200641ffff0371410874201841ff017172201741187472220a360083022002450d01410f210841ea9fc6002109200a0e0700030405064647000b2003280087022109200328008b0221084101210a0c470b200341c0046a41186a20034180026a41186a2903002207370300200341c0046a41106a20034180026a41106a2903002204370300200341c0046a41086a20034180026a41086a29030022053703002003200329038002221d3703c004200341e8046a41186a2007370300200341e8046a41106a2004370300200341e8046a41086a20053703002003201d3703e80420034188056a41186a200341106a41186a29030037030020034188056a41106a200341106a41106a29030037030020034188056a41086a200341106a41086a2903003703002003200329031037038805200320163a00a805411510282202450d22200241002900d088453700002002410d6a41002900dd8845370000200241086a41002900d8884537000020034295808080d00237029c062003200236029806200341e8046a20034198066a108f0120032802a00621022003280298062108200341a0026a41186a22094200370300200341a0026a41106a220a4200370300200341a0026a41086a22174200370300200342003703a00220082002200341a0026a1000200341306a41186a2009290300370300200341306a41106a200a290300370300200341306a41086a2017290300370300200320032903a0023703300240200328029c06450d00200328029806102a0b2003410036029806200341306a412020034198066a1006210202400240200328029806220a417f460d002002450d002003200a3602bc03200320023602b80320034198066a200341b8036a10b10120032d00b90622084102460d25200341d0006a41186a2217200341d2066a290100370300200341d0006a41106a2206200341ca066a290100370300200341d0006a41086a2218200341c2066a290100370300200341a0026a41086a2219200341e3066a290000370300200341a0026a41106a220b200341eb066a290000370300200341a0026a41186a220c200341f3066a290000370300200320032901ba063703502003200341db066a2900003703a002200341da066a2d000021090240200a450d002002102a0b200341b8036a41186a2017290300370300200341b8036a41106a2006290300370300200341b8036a41086a201829030037030020034188086a41086a201929030037030020034188086a41106a200b29030037030020034188086a41186a200c290300370300200320032903503703b803200320032903a002370388080c010b200341a0026a41186a22024200370300200341a0026a41106a22084200370300200341a0026a41086a22094200370300200342003703a00241e588c500411d200341a0026a100020034198066a41186a220a200229030037030020034198066a41106a2217200829030037030020034198066a41086a22062009290300370300200320032903a00237039806200341d0056a20034198066a412010fd010240024020032d00d0050d00200242003703002008420037030020094200370300200342003703a00241e588c500411d200341a0026a1000200a20022903003703002017200829030037030020062009290300370300200320032903a0023703980620034120360254200320034198066a360250200341e8046a200341d0006a10ff01410021090c010b200341c8076a41186a200341e9056a290000370300200341c8076a41106a200341e1056a290000370300200341c8076a41086a200341d9056a290000370300200320032900d1053703c807200341e8076a200341c8076a10b0012003410036029806200341e8076a412020034198066a100621022003280298062208417f460d272002450d27200320083602542003200236025020034198066a200341d0006a10b10120032d00b906220a4102460d2620034188086a41186a220920034198066a41186a29030037030020034188086a41106a221720034198066a41106a29030037030020034188086a41086a220620034198066a41086a29030037030020032003290398063703880820032d00b8062118200341a0026a200341ba066a221941c100109a051a02402008450d002002102a0b200341d0006a41186a22022009290300370300200341d0006a41106a22082017290300370300200341d0006a41086a220920062903003703002003200329038808370350200341b8036a200341a0026a41c100109a051a200341a0026a41186a22172002290300370300200341a0026a41106a22062008290300370300200341a0026a41086a220b2009290300370300200320032903503703a0022003200a3a00980620034198066a410172200341b8036a41c100109a051a20022017290300370300200820062903003703002009200b290300370300200341f8006a2019410020032d00b9064101461b360200200320032903a002370350200320183a00702003200341e8046a360274200341003602c003200342013703b803200341d0006a200341b8036a108f01024020032d0070220241064b0d000240024002400240024002400240024020020e0700010203040506000b410021080c060b410121080c050b410221080c040b410321080c030b410421080c020b410521080c010b410621080b200320083a00a8080240024020032802bc0320032802c0032202460d0020032802b80321090c010b200241016a22082002490d3c200241017422092008200920084b1b22084100480d3c0240024020020d002008102821090c010b20032802b80320022008102c21090b2009450d2a200320083602bc03200320093602b80320032d00a808210820032802c00321020b2003200241016a3602c003200920026a20083a00000b200341f4006a200341b8036a10aa0120032802bc032102200341e8076a412020032802b803220820032802c003100702402002450d002008102a0b200341a0026a41186a22024200370300200341a0026a41106a22084200370300200341a0026a41086a22094200370300200342003703a00241e588c500411d200341a0026a100020034198066a41186a200229030037030020034198066a41106a200829030037030020034198066a41086a2009290300370300200320032903a0023703980620034120360254200320034198066a360250200341e8046a200341d0006a10ff0120034188086a41086a200341c8076a41086a29030037030020034188086a41106a200341c8076a41106a29030037030020034188086a41186a200341c8076a41186a290300370300200320032903c80737038808410121090b410021080b200341a5066a200341b8036a41086a290300370000200341ad066a200341b8036a41106a290300370000200341b5066a200341b8036a41186a290300370000200341bd066a20093a0000200341be066a200329038808370100200341c6066a20034188086a41086a290300370100200341ce066a20034188086a41106a290300370100200341d6066a20034188086a41186a290300370100200320083a009c06200320032903b80337009d06200320034188056a36029806200341003602582003420137035020034188056a200341d0006a108f01024020032d00a805220241064b0d000240024002400240024002400240024020020e0700010203040506000b410021080c060b410121080c050b410221080c040b410321080c030b410421080c020b410521080c010b410621080b200320083a00a80802400240200328025420032802582202460d00200328025021090c010b200241016a22082002490d3a200241017422092008200920084b1b22084100480d3a0240024020020d002008102821090c010b200328025020022008102c21090b2009450d29200320083602542003200936025020032d00a8082108200328025821020b2003200241016a360258200920026a20083a00000b20034198066a410472200341d0006a10a90120032802542102200341306a4120200328025022082003280258100702402002450d002008102a0b200342e4cab5fbb6ccdcb0e3003703e004200341e0046a200341c0046a417f10a80220034198066a41086a41083a0000200341a1066a20032903c004370000200341a9066a200341c0046a41086a290300370000200341b1066a200341c0046a41106a290300370000200341b9066a200341c0046a41186a290300370000200341c1066a2003290310370000200341c9066a200341106a41086a290300370000200341d1066a200341106a41106a290300370000200341d9066a200341106a41186a290300370000200341053a009806410021094101210a4101410020034198066a10cc010c420b2002411a6a2901002107200241196a2d00002117200241186a2d00002106200241166a2f01002118200241156a2d00002110200241146a2d00002111200241126a2f01002112200241116a2d00002113200241106a2d000021192002410e6a2f0100210b2002410d6a2d0000210c2002410c6a2d0000210d2002410a6a2f0100210e200241096a2d0000210f200241046a2d00002114200241026a2f0100211502400240024020022d0000450d002003200737029c06200320173a009b06200320063a009a06200320183b0198060c010b200241086a2d00002108200241066a2f01002109200241056a2d0000210a20022d00012116200320073703980641002102201641ff01714101460d010b41012102410021094104210a410021080b200941ffff0371410874200a41ff017172200841187472210a2002450d04410f210841ea9fc60021090240200a0e0700010203044445000b200e410874200f72200d411874722109200b410874200c7220194118747221084101210a0c450b410e210841dc9fc60021094101210a0c440b410c210841d09fc60021094101210a0c430b4109210841c79fc60021094101210a0c420b4113210841b49fc60021094101210a0c410b2003200737038005200320173a00ff04200320063a00fe04200320183b01fc04200320103a00fb04200320113a00fa04200320123b01f804200320133a00f704200320193a00f6042003200b3b01f4042003200c3a00f3042003200d3a00f2042003200e3b01f0042003200f3a00ef042003200a3600eb04200320143a00ea04200320153b01e804411510282202450d22200241002900d08845370000410d21082002410d6a41002900dd8845370000200241086a41002900d8884537000020034295808080d00237025420032002360250200341e8046a200341d0006a108f012003280258210220032802502109200341a0026a41186a220a4200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220092002200341a0026a100020034198066a41186a200a29030037030020034198066a41106a201729030037030020034198066a41086a2006290300370300200320032903a0023703980602402003280254450d002003280250102a0b024020034198066a41204101410041001003417f470d0041e6d4c50021094101210a0c410b411510282202450d23200241002900d088453700002002410d6a41002900dd8845370000200241086a41002900d8884537000020034295808080d00237029c062003200236029806200341e8046a20034198066a108f0120032802a00621022003280298062108200341a0026a41186a22094200370300200341a0026a41106a220a4200370300200341a0026a41086a22174200370300200342003703a00220082002200341a0026a1000200341c0046a41186a2009290300370300200341c0046a41106a200a290300370300200341c0046a41086a2017290300370300200320032903a0023703c0040240200328029c06450d00200328029806102a0b2003410036029806200341c0046a412020034198066a100621022003280298062209417f460d252002450d25200320093602542003200236025020034198066a200341d0006a10b10120032d00b90622084102460d2420034188086a41186a20034198066a41186a29030037030020034188086a41106a20034198066a41106a29030037030020034188086a41086a20034198066a41086a29030037030020032003290398063703880820032d00b8062117200341a0026a200341ba066a41c100109a051a02402009450d002002102a0b200341c0046a412010090c260b41c4d1c3004133200341a8086a419cd9c3001038000b412041011037000b200241011037000b1036000b201841011037000b2002200a1044000b200a2017103c000b200920171044000b200341d0056a41146a4108360200200341dc056a412536020020034188056a41146a41033602002003420337028c05200341c8afc60036028805200341253602d4052003200341306a3602c004200320034180026a3602e804200342043703a8062003420137029c062003419cb0c600360298062003200341d0056a36029805200320034198066a3602e0052003200341e8046a3602d8052003200341c0046a3602d00520034188056a41d8b0c600103e000b200241011037000b200241011037000b410f41011037000b411741011037000b411341011037000b200841011037000b200941011037000b200941011037000b411341011037000b411741011037000b412e41011037000b41c4d1c3004133200341a8086a419cd9c3001038000b411741011037000b412e41011037000b410f41011037000b410f41011037000b410f41011037000b410f41011037000b410f41011037000b411541011037000b41c4d1c3004133200341a8086a419cd9c3001038000b41c4d1c3004133200341a8086a419cd9c3001038000b41b7b3c0004192011050000b200841011037000b200841011037000b411541011037000b411541011037000b41c4d1c3004133200341a8086a419cd9c3001038000b410221080b200341c8076a41186a220220034188086a41186a290300370300200341c8076a41106a220920034188086a41106a290300370300200341c8076a41086a220a20034188086a41086a29030037030020032003290388083703c80720034188056a200341a0026a41c100109a051a200341306a41086a2206200a290300370300200341306a41106a220a2009290300370300200341306a41186a22092002290300370300200320032903c807370330200341d0056a20034188056a41c100109a051a41072102024020084102460d0020034180026a41186a200929030037030020034180026a41106a200a29030037030020034180026a41086a20062903003703002003200329033037038002200320083a0050200341d0006a410172200341d0056a41c100109a05210a200341f2006a21094100210202400240024002400240024002400240024020032d00714101470d0020034198066a200910b001200341a0026a41186a20034198066a41186a22082900002207370300200341a0026a41106a20034198066a41106a22062900002204370300200341a0026a41086a20034198066a41086a221829000022053703002003200329009806221d3703a0022008200737030020062004370300201820053703002003201d37039806412010282202450d012002200329039806370000200241186a2008290300370000200241106a2006290300370000200241086a201829030037000020032d005021080b0240200841ff01714101460d0020032d00714101460d03200341a0026a41186a22084200370300200341a0026a41106a22094200370300200341a0026a41086a220a4200370300200342003703a00241e588c500411d200341a0026a100020034198066a41186a200829030037030020034198066a41106a200929030037030020034198066a41086a200a290300370300200320032903a0023703980620034198066a412010090c070b20034198066a200a10b001200341a0026a41186a20034198066a41186a2903002207370300200341a0026a41106a20034198066a41106a2903002204370300200341a0026a41086a20034198066a41086a29030022053703002003200329039806221d3703a002200341e8076a41186a22092007370300200341e8076a41106a220a2004370300200341e8076a41086a220620053703002003201d3703e807412010282208450d01200820032903e807370000200841186a2009290300370000200841106a200a290300370000200841086a200629030037000020034100360298062008412020034198066a1006210a2003280298062206417f460d04200a450d042003200636028c082003200a3602880820034198066a20034188086a10b10120032d00b90622194102460d03200341f1006a2109200341a0026a41206a220b20034198066a41206a22182d00003a0000200341a0026a41186a220c20034198066a41186a220d290300370300200341a0026a41106a220e20034198066a41106a220f290300370300200341a0026a41086a221020034198066a41086a221129030037030020032003290398063703a002200341b8036a200341ba066a221241c100109a051a02402006450d00200a102a0b201220032900b8033701002018200b2d00003a0000200d200c290300370300200f200e29030037030020112010290300370300200341c2066a200341b8036a41086a290000370100200341ca066a200341b8036a41106a290000370100200341d2066a200341b8036a41186a290000370100200320032903a00237039806200320193a00b906200341fa066a200941206a2d00003a0000200341f2066a200941186a290000370100200341ea066a200941106a290000370100200341e2066a200941086a290000370100200341da066a2009290000370100200341003602a802200342013703a00220034198066a200341a0026a108f01024020182d0000220941064b0d000240024002400240024002400240024020090e0700010203040506000b4100210a0c060b4101210a0c050b4102210a0c040b4103210a0c030b4104210a0c020b4105210a0c010b4106210a0b2003200a3a00a8080240024020032802a40220032802a8022209460d0020032802a00221060c010b200941016a220a2009490d1620094101742206200a2006200a4b1b220a4100480d160240024020090d00200a102821060c010b20032802a0022009200a102c21060b2006450d072003200a3602a402200320063602a00220032d00a808210a20032802a80221090b2003200941016a3602a802200620096a200a3a00000b200341b9066a200341a0026a10a90120032802a40221092008412020032802a002220a20032802a802100702402009450d00200a102a0b2008102a4101210a0c070b412041011037000b412041011037000b200341a0026a41186a22084200370300200341a0026a41106a220a4200370300200341a0026a41086a22064200370300200342003703a00241e588c500411d200341a0026a100020034198066a41186a200829030037030020034198066a41106a200a29030037030020034198066a41086a2006290300370300200320032903a00237039806200341203602a402200320034198066a3602a0022009200341a0026a10ff010c030b41c4d1c3004133200341a8086a419cd9c3001038000b41e2bbc00041d8001050000b200a41011037000b410021084100210a0b024002400240024002400240024020020d00410021090c010b20034100360298062002412020034198066a100621092003280298062206417f460d022009450d02200320063602bc03200320093602b80320034198066a200341b8036a10b10120032d00b9064102460d0120034188086a41186a221820034198066a41186a221929030037030020034188086a41106a220b20034198066a41106a220c29030037030020034188086a41086a220d20034198066a41086a220e29030037030020032003290398063703880820032d00b806210f200341a0026a200341ba066a221041c100109a051a02402006450d002009102a0b20192018290300370300200c200b290300370300200e200d2903003703002003200329038808370398062003200f3a00b8062010200341a0026a41c100109a051a200341c1066a200341d0006a41086a290300370000200341c9066a200341d0006a41106a290300370000200341d1066a200341d0006a41186a29030037000020034198066a41c1006a200341d0006a41206a2d00003a0000200320032903503700b906200341003602a802200342013703a00220034198066a200341a0026a108f01024020032d00b806220941064b0d000240024002400240024002400240024020090e0700010203040506000b410021060c060b410121060c050b410221060c040b410321060c030b410421060c020b410521060c010b410621060b200320063a00a8080240024020032802a40220032802a8022209460d0020032802a00221180c010b200941016a22062009490d14200941017422182006201820064b1b22064100480d140240024020090d002006102821180c010b20032802a00220092006102c21180b2018450d05200320063602a402200320183602a00220032d00a808210620032802a80221090b2003200941016a3602a802201820096a20063a00000b200341b9066a200341a0026a10a90120032802a40221092002412020032802a002220620032802a802100702402009450d002006102a0b2002102a410121090b200a20084572450d030c040b41c4d1c3004133200341a8086a419cd9c3001038000b41e2bbc00041d8001050000b200641011037000b2008102a0b02402002452009720d002002102a0b201721020b1098012108200342e4cab5fbb6ccdcb0e30037035041002109200341d0006a200341e8046a427f427f200841002002200241ff01714107461b41187441187541027441f48fc6006a2802004180de346c6a410210a90220034198066a41086a41093a000020034198066a41096a20032903e804370000200341a9066a200341e8046a41086a290300370000200341b1066a200341e8046a41106a290300370000200341b9066a200341e8046a41186a290300370000200341053a0098064101410020034198066a10cc014101210a0c190b41a39fc6002109411121080c180b20032802a006211820032903a0062207a7211941002102024002402007422088a7220641014b0d0020060e020201020b2006210803402008410176220920026a220a20022017200a4105746a200341d0056a4120109c054101481b2102200820096b220841014b0d000b0b201720024105746a200341d0056a4120109c052208450d0a0c010b20034198066a41186a200341d0056a41186a29030037030020034198066a41106a200341d0056a41106a29030037030020034198066a41086a200341d0056a41086a290300370300200320032903d005370398064100210620034198066a2108410021090c010b20034198066a41186a200341d0056a41186a29030037030020034198066a41106a200341d0056a41106a29030037030020034198066a41086a200341d0056a41086a290300370300200320032903d005370398062008411f7620026a220920064b0d0120034198066a21080b20062019460d012018210a0c020b41f8b0c0001032000b024020182006460d002018210a0c010b201841016a22022018490d042018410174220a2002200a20024b1b220a41ffffff3f71200a470d04200a41057422024100480d040240024020180d002002102821170c010b201720184105742002102c21170b2017450d010b201720094105746a220241206a2002200620096b410574109b051a200241186a200841186a290000370000200241106a200841106a290000370000200241086a200841086a290000370000200220082900003700001098012108411310282202450d01200241002900a9d3453700002002410f6a41002800b8d345360000200241086a41002900b1d34537000020034293808080b00237029c062003200236029806200320034198066a36025020034188056a200341d0006a10c801200328029806210220032802a0062109200341a0026a41186a22184200370300200341a0026a41106a22194200370300200341a0026a41086a220b4200370300200342003703a00220022009200341a0026a1000200341306a41186a2018290300370300200341306a41106a2019290300370300200341306a41086a200b290300370300200320032903a0023703300240200328029c06450d00200328029806102a0b410410282202450d0220034284808080c00037029c0620032002360298062002200841809c316a2209360000200641016a220220034198066a10b40102402002450d00200641057441206a2108201721020340200220034198066a108f01200241206a2102200841606a22080d000b0b200328029c062102200341306a4120200328029806220820032802a006100702402002450d002008102a0b0240200a450d002017102a0b20034198066a41086a410a3a0000200341a1066a20032903d005370000200341c1066a200329038805370000200341a9066a200341d0056a41086a290300370000200341b1066a200341d0056a41106a290300370000200341b9066a200341d0056a41186a290300370000200341c9066a20034188056a41086a290300370000200341d1066a20034188056a41106a290300370000200341d9066a20034188056a41186a290300370000200341053a009806200341e4066a2009360200410021094101410020034198066a10cc0120034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e807200341e8076a411010094101210a0c110b200241011037000b411341011037000b410441011037000b1031000b41a6d4c5002109412621082019450d0b2017102a4101210a0c0c0b200341003602a0062003420137039806200341d0006a20034198066a10eb01200328029c06210920032802a00621172003280298062102200341a0026a41186a22194200370300200341a0026a41106a220b4200370300200341a0026a41086a220c4200370300200342003703a00220022017200341a0026a100020034198066a41186a201929030037030020034198066a41106a200b29030037030020034198066a41086a200c290300370300200320032903a0023703980602402009450d002002102a0b0240200341d0056a20034198066a4120109c05450d0041bcd3c5002109410c21080c010b20034188086a41086a22024200370300200342003703880841988bc500411620034188086a1008200341e8076a41086a200229030037030020032003290388083703e807200341e8076a41101009109801210220034198066a200341d0006a418801109a051a200341a0026a200220064180a30520064180a3054b1b6a20034198066a2008201810b704024020032802a0024101470d0020032802a4022209450d00200341a0026a41086a28020021080c0c0b410021090c0b0b200341d0006a106a0c0a0b410121180b41012117410021090c100b200a106a200a102a410121064100210a410121180c080b200341013a00880520034198066a41186a200341b8036a41186a29030037030020034198066a41106a200341b8036a41106a29030037030020034198066a41086a200341b8036a41086a290300370300200320032903b803370398060240411710282202450d0041002109200241002900e3d2453700002002410f6a41002900f2d245370000200241086a41002900ebd24537000020034297808080f0023702d405200320023602d0052003200341d0056a3602a00220034198066a200341a0026a10c80120032802d005210220032802d8052108200341a0026a41186a220a4200370300200341a0026a41106a22174200370300200341a0026a41086a22064200370300200342003703a00220022008200341a0026a1000200341306a41186a200a290300370300200341306a41106a2017290300370300200341306a41086a2006290300370300200320032903a002370330024020032802d405450d0020032802d005102a0b4101210a200341306a412020034188056a41011007200b10ce03200341d0006a106a0c030b411741011037000b412221084101210a0c050b201720024105746a22022003290330370000200241186a200341306a41186a290300370000200241106a200a290300370000200241086a20182903003700004101210a20034198066a41186a200841016a360200200341ac066a2006360200200320073703a0062003200437039806200320093602b406200320173602a806201620034198066a10c404410021090b4101210641012118410121170c0b0b41afd2c5002109411a21082002450d012017102a4101210a0c020b4111210841a39fc60021090b4101210a0b41012106410121180b410121170c060b20032802d007210920032802cc07210a20032802c80721020b2002450d00200341e8076a4110200220091007200a450d012002102a0c010b41b00110282202450d01200320032802d8013602a00720034198066a200341d0006a10cf0320034198066a41a4016a200341d0006a41a4016a29020037020020034198066a419c016a200341d0006a419c016a29020037020020034198066a4194016a200341d0006a4194016a290200370200200320032902dc013702a407200220034198066a41b001109a05210220034188086a41086a22094200370300200342003703880841ac89c500411520034188086a1008200341e8076a41086a200929030037030020032003290388083703e8072003411036029c062003200341e8076a360298062002410120034198066a10ef012002106a2002102a0b200341d0006a106a200341b0066a2004370300200341a8066a2005370300200341a4066a200836020041002117200341a0066a41003a0000200341053a0098064101210a4101410020034198066a10cc012006106a2006102a4101210641012118410021090c020b41b00141081037000b2006106a2006102a410021174101210a41012106410121180b0240024020012d0000417f6a2202410f4b0d00024002400240024020020e1000040404040102030404040405040505000b2017450d04200141046a2202280200106a2002280200102a0c040b200a450d03200141046a2202280200106a2002280200102a0c030b2006450d02200141046a2202280200106a2002280200102a0c020b2018450d01200141046a2202280200106a2002280200102a0c010b200241074b0d00024002400240024020020e080004040404010203000b200141046a2202280200106a2002280200102a0c030b200141046a2202280200106a2002280200102a0c020b200141046a2202280200106a2002280200102a0c010b200141046a2202280200106a2002280200102a0b2000200836020420002009360200200341b0086a24000b8b0708047f047e057f027e017f017e017f017e230041a0016b2202240041002103200241003a0098012001280204417f6a210402400240024003402004417f460d01200241f8006a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0098012004417f6a21042005210320054120470d000b200241d8006a41186a200241f8006a41186a290300370300200241d8006a41106a200241f8006a41106a290300370300200241d8006a41086a200241f8006a41086a29030037030020022002290378370358200241c0006a2001109f012002290340a7450d01200041003602200c020b0240200341ff0171450d00200241003a0098010b200041003602200c010b200241c0006a41106a290300210620022903482107200241286a2001109f0102402002290328a7450d00200041003602200c010b200241286a41106a290300210820022903302109200241206a2001106c02400240024002400240024020022802200d00200128020441186e220a41186c2204417f4c0d022002280224210b0240024020040d004108210c0c010b20041028220c450d040b0240200b450d00200241086a41106a210d4100210e41002105410021030340200241086a2001109f01024002402002290308a70d00200d290300210f2002290310211020022001106c2002280200450d010b200a450d03200c102a0c030b200341016a21042002280204211102402003200a470d00200e2004200e20044b1b220aad42187e2212422088a70d082012a722134100480d080240024020030d0020131028210c0c010b200c20052013102c210c0b200c450d070b200c20056a2203200f37030820032010370300200341106a2011360200200e41026a210e200541186a210520042103200b2004470d000b0b200c0d010b200041003602200c050b200241f8006a41186a200241d8006a41186a290300220f370300200241f8006a41106a200241d8006a41106a2903002210370300200241f8006a41086a200241d8006a41086a2903002212370300200220022903582214370378200041186a2008370300200020093703102000200637030820002007370300200041286a200b3602002000200a3602242000200c3602202000412c6a2014370200200041346a20123702002000413c6a2010370200200041c4006a200f3702000c040b1036000b200441081037000b201341081037000b1031000b200241a0016a24000bde0401067f230041306b2202240002400240024002400240411010282203450d00200341086a4100290097a5423700002003410029008fa54237000020024290808080800237021420022003360210410d200241106a10b40102400240024020022802142204200228021822056b410d490d002005410d6a2106200228021021030c010b2005410d6a22062005490d01200441017422032006200320064b1b22074100480d010240024020040d002007102821030c010b200228021020042007102c21030b2003450d032002200736021420022003360210200721040b20022006360218200320056a22054100290082a542370000200541056a4100290087a54237000020022003200610df0202402004450d002003102a0b20022802082203417f4c0d03200228020021050240024020030d0041012106410021040c010b20032104200310282206450d050b200620052003109a05210702402002280204450d002005102a0b200241106a200110e0020240200420036b4120490d00200341206a21050c060b200341206a22052003490d00200441017422062005200620054b1b22014100480d000240024020040d002001102821060c010b200720042001102c21060b02402006450d00200121040c060b200141011037000b1031000b411041011037000b200741011037000b1036000b200341011037000b200620036a22032002290010370000200341186a200241106a41186a290000370000200341106a200241106a41106a290000370000200341086a200241106a41086a290000370000200020053602082000200436020420002006360200200241306a24000bd00a010b7f230041c0006b2202240002400240024002400240024002400240024002400240411010282203450d00200341086a41002900b1c042370000200341002900a9c04237000020024290808080800237022420022003360220410d200241206a10b40102400240024020022802242204200228022822056b410d490d002005410d6a2106200228022021030c010b2005410d6a22062005490d01200441017422032006200320064b1b22074100480d010240024020040d002007102821030c010b200228022020042007102c21030b2003450d032002200736022420022003360220200721040b20022006360228200320056a22054100290082a542370000200541056a4100290087a54237000020022003200610df0202402004450d002003102a0b20022802082206417f4c0d03200228020021030240024020060d0041012107410021080c010b20062108200610282207450d050b200720032006109a05210902402002280204450d002003102a0b2001410c6a28020041046a2204417f4c0d03024002402004450d00200410282203450d0720024100360228200220043602240c010b200241003602282002200436022420024101360220410110282203450d07200241013602240b2002200336022020024101360228200320012d00003a00000240200228022422044101470d0041000d014102410241024102491b22044100480d01200341012004102c2203450d0820022004360224200220033602200b20024102360228200320012d00013a00010240024020044102460d00200421050c010b200441016a22052004490d012004410174220a2005200a20054b1b22054100480d010240024020040d002005102821030c010b200320042005102c21030b2003450d0920022005360224200220033602200b20024103360228200341026a20012d00023a0000024020054103470d00200541016a22042005490d012005410174220a2004200a20044b1b22044100480d010240024020050d002004102821030c010b200320052004102c21030b2003450d0a20022004360224200220033602200b20024104360228200341036a20012d00033a00002001280204210a200128020c2201200241206a10b4010240024020022802242205200228022822046b2001490d00200228022021030c010b200420016a22032004490d012005410174220b2003200b20034b1b220b4100480d010240024020050d00200b102821030c010b20022802202005200b102c21030b2003450d0b2002200b36022420022003360220200b21050b200320046a200a2001109a051a200241206a41186a220a4200370300200241206a41106a220b4200370300200241206a41086a220c4200370300200242003703202003200420016a200241206a1000200241186a200a290300370300200241106a200b290300370300200241086a200c2903003703002002200229032037030002402005450d002003102a0b0240200820066b4120490d00200641206a21010c0c0b200641206a22012006490d00200841017422032001200320014b1b22034100480d000240024020080d002003102821070c010b200920082003102c21070b02402007450d00200321080c0c0b200341011037000b1031000b411041011037000b200741011037000b1036000b200641011037000b200441011037000b410141011037000b200441011037000b200541011037000b200441011037000b200b41011037000b200720066a22032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200020013602082000200836020420002007360200200241c0006a24000be6e80106017f037e137f017e117f057e230041c0056b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0e000102030405060708090f101112000b20034184056a4101360200200342013702f404200341ccd1c5003602f004200341043602b401200341c4d1c5003602b0012003200341b0016a36028005200341f0046a41bc80c500103e000b200141306a2903002104200141286a29030021052001411d6a29000021062001411c6a2d000021072001411b6a2d00002108200141196a2f00002109200141186a2d0000210a200141176a2d0000210b200141156a2f0000210c200141146a2d0000210d200141136a2d0000210e200141116a2f0000210f200141106a2d000021102001410f6a2d000021112001410d6a2f000021122001410c6a2d00002113200141086a2802002114200141076a2d00002115200141056a2f0000211641042117200141046a2d0000211820012d000121192002411a6a290100211a200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d00002127200241046a2d00002128200241026a2f010021290240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b410021024100212a0b202a41ffff0371410874200241187472201741ff017172212a0240202b450d00410f211741ea9fc60021020240202a0e07000a0b0c0d5253000b20264108742027722025411874722102202341087420247220224118747221170c520b2003201a3703b8032003201b3a00b7032003201c3a00b6032003201d3b01b4032003201e3a00b3032003201f3a00b203200320203b01b003200320213a00af03200320223a00ae03200320233b01ac03200320243a00ab03200320253a00aa03200320263b01a803200320273a00a7032003202a3600a303200320283a00a203200320293b01a003410e10282202450d11200241002900fcae44370000200241066a4100290082af443700002003428e808080e0013702f404200320023602f004200341a0036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b4101212b0240200341d0006a41204101410041001003417f460d00419681c500210241142117410121220c530b0240201841ff01714101470d00200341f0046a201441067610fe0120032802f00421170240024020032802f8042014413f7122024b0d00410021020c010b201720024105746a2202290018210620022d0017210720022d0016210820022f0014210920022d0013210a20022d0012210b20022f0010210c20022d000f210d20022d000e210e20022f000c210f20022d000b211020022d000a211120022f0008211220022d000721132002280003211420022d0002211520022f00002116410121020b024020032802f404450d002017102a0b20020d0041dc9fc6002102410e2117410121220c530b200320063703c801200320073a00c701200320083a00c601200320093b01c4012003200a3a00c3012003200b3a00c2012003200c3b01c0012003200d3a00bf012003200e3a00be012003200f3b01bc01200320103a00bb01200320113a00ba01200320123b01b801200320133a00b701200320143600b301200320153a00b201200320163b01b001410e10282202450d122002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341b0016a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a2222420037030020034188046a41086a2223420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a2022290300370300200341d0006a41086a20232903003703002003200329038804370350024020032802f404450d0020032802f004102a0b0240200341d0006a41204101410041001003417f460d0041cc80c500210241192117410121220c530b02402005428080e983b1de165441002004501b450d0041e580c500210241312117410121220c530b200341f0046a41186a200341b0016a41186a290300370300200341f0046a41106a200341b0016a41106a290300370300200341f0046a41086a200341b0016a41086a290300370300200320032903b0013703f004410e10282202450d13200241002900fcae44370000200241066a4100290082af443700002003428e808080e0013702d404200320023602d004200341a0036a200341d0046a108f0120032802d804210220032802d004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802d404450d0020032802d004102a0b200341203602d4042003200341d0006a3602d004200341f0046a200341d0046a10ff01410d10282202450d1420024100290098af44370000200241056a410029009daf443700002003428d808080d0013702f404200320023602f004200341a0036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b024002400240024002400240201941037122024103460d0020020e03010203010b200341d0006a41204101410010070c040b410021170c020b410121170c010b410221170b200320173a00f004410110282202450d16200220173a0000200341d0006a41202002410110072002102a0b2003200341a0036a109101200341086a290300211a200329030021064100210220034198056a41003602002003419e056a20032d00a2033a00002003419f056a20032800a303360000200341a3056a20032d00a7033a0000200341b4056a20032903b803370200200341a4056a20032903a803370200200341ac056a20032903b00337020020034188056a201a20042006200554201a200454201a2004511b22171b221a370300200320032f01a0033b019c0520034208370390052003201a3703f80420032006200520171b221a3703f0042003201a37038005200341b0016a200341f0046a10b50420034194056a280200450d4f200328029005102a0c4f0b200141106a2903002106200141086a29030021042002411a6a290100211a200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d0000212741042117200241046a2d00002128200241026a2f010021290240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b410021024100212a0b202a41ffff0371410874200241187472201741ff017172212a0240202b450d00410f211741ea9fc60021020240202a0e0700090a0b0c5152000b20264108742027722025411874722102202341087420247220224118747221170c510b2003201a3703e8042003201b3a00e7042003201c3a00e6042003201d3b01e4042003201e3a00e3042003201f3a00e204200320203b01e004200320213a00df04200320223a00de04200320233b01dc04200320243a00db04200320253a00da04200320263b01d804200320273a00d7042003202a3600d304200320283a00d204200320293b01d004200341f0046a200341d0046a10b1044101212a0240024020032d00f0044101460d00410b211741aa81c50021020c010b2003418a046a20032d00f3043a0000200341b0016a41086a20034184056a290200370300200341bd016a20034189056a290000370000200320032f00f1043b0188042003200341fc046a2902003703b001200341f0046a41086a28020021174100212a20032802f40421020b20034180036a41026a222b20034188046a41026a2d00003a0000200341a8046a41086a2222200341b0016a41086a290300370300200341a8046a41106a200341b0016a41106a290300370300200320032f0188043b018003200320032903b0013703a804202a0d50200341b3036a2022290300370000200341a0036a41186a200341b5046a290000370000200320032f0180033b01a003200320173600a703200320023600a303200320032903a8043700ab032003202b2d00003a00a203410e10282202450d152002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341a0036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006211720032802f0042202417f460d2e200320023602ac04200320173602a804200341f0046a200341a8046a108a02200328029005222a450d16200341f0046a41186a290300212c200341f0046a410c6a350200211a200341bc056a280200212b200341f0046a41c4006a2902002105200341f0046a41c0006a2f01002122200341f0046a413c6a2f01002123200341f0046a41386a2f01002124200341f0046a41346a2f01002125200341f0046a412f6a28000021262003419c056a2f01002127200329038005212d20032902f404212e20032d00b305211b20032d00b205211c20032d00af05211d20032d00ae05211e20032d00ab05211f20032d00aa05212020032d00a705212120032d00a605212820032d00a305212920032d009e052114200329029405212f20032802f004210702402002450d002017102a0b200341b0016a41186a202c370300200341b0016a410c6a201a3e0200200341b0016a41c4006a2005370200200341f3016a201b3a0000200341f2016a201c3a0000200341b0016a41c0006a20223b0100200341ef016a201d3a0000200341ee016a201e3a0000200341b0016a413c6a20233b0100200341eb016a201f3a0000200341ea016a20203a0000200341b0016a41386a20243b0100200341e7016a20213a0000200341e6016a20283a0000200341b0016a41346a20253b0100200341e3016a20293a0000200341b0016a412f6a2026360000200341de016a20143a0000200341d4016a202f3702002003202d3703c0012003202e3702b4012003202b3602fc01200320273b01dc012003202a3602d001200320073602b001200341106a200341d0046a10910102402003290310221a20032903b001222e7d222f201a56200341106a41086a2903002205200341b0016a41086a29030022307d201a202e54ad7d221a200556201a2005511b0d0020032004202f202f200456201a200656201a2006511b22021b2204202d7c22053703c001200341c8016a2006201a20021b221a202c7c2005200454ad7c37030020032004202e7c22063703b0012003201a20307c2006200454ad7c3703b801200341a0036a200341b0016a10b5040b20032802d401450d4d20032802d001102a0c4d0b200141106a2903002106200141086a29030021042002411a6a290100211a200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d0000212741042117200241046a2d00002128200241026a2f010021290240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b410021024100212a0b202a41ffff0371410874200241187472201741ff017172212a0240202b450d00410f211741ea9fc60021020240202a0e070008090a0b5051000b20264108742027722025411874722102202341087420247220224118747221170c500b2003201a3703b8032003201b3a00b7032003201c3a00b6032003201d3b01b4032003201e3a00b3032003201f3a00b203200320203b01b003200320213a00af03200320223a00ae03200320233b01ac03200320243a00ab03200320253a00aa03200320263b01a803200320273a00a7032003202a3600a303200320283a00a203200320293b01a003410e10282202450d162002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341a0036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006210220032802f0042217417f460d2d2002450d2d200320173602d404200320023602d004200341f0046a200341d0046a108a02200328029005222a450d17200341f0046a41186a290300211a200341f0046a410c6a350200212d200341bc056a280200212b200341f0046a41c4006a290200212e200341f0046a41c0006a2f01002122200341f0046a413c6a2f01002123200341f0046a41386a2f01002124200341f0046a41346a2f01002125200341f0046a412f6a28000021262003419c056a2f01002127200329038005212c20032902f404212f20032d00b305211b20032d00b205211c20032d00af05211d20032d00ae05211e20032d00ab05211f20032d00aa05212020032d00a705212120032d00a605212820032d00a305212920032d009e052114200329029405210520032802f004210702402017450d002002102a0b200341b0016a41186a201a370300200341b0016a410c6a202d3e0200200341b0016a41c4006a202e370200200341f3016a201b3a0000200341f2016a201c3a0000200341b0016a41c0006a20223b0100200341ef016a201d3a0000200341ee016a201e3a0000200341b0016a413c6a20233b0100200341eb016a201f3a0000200341ea016a20203a0000200341b0016a41386a20243b0100200341e7016a20213a0000200341e6016a20283a0000200341b0016a41346a20253b0100200341e3016a20293a0000200341b0016a412f6a2026360000200341de016a20143a0000200341d4016a20053702002003202c3703c0012003202f3702b4012003202b3602fc01200320273b01dc012003202a3602d001200320073602b0012005a7212b02400240024002402005422088a7411f4b0d00202c2004202c200454201a200654201a2006511b22021b2204201a200620021b220684500d03200341c8016a4200201a20067d202c200454ad7d2205202c20047d222d428080e983b1de165441002005501b22171b37030020034200202d20171b3703c001200341f0046a41086a22024200370300200342003703f00441bb9cc6004112200341f0046a1008200341d0046a41086a2002290300370300200320032903f0043703d004200341003602f004200341d0046a4110200341f0046a1006210220032802f004222a417f470d0141a005212a0c020b41c581c500210241232117202b450d52202a102a0c520b024020020d0041a005212a0c010b202a4104490d1a2002280000212a2002102a202a41a0056a212a0b024020032802d801220220032802d401470d00200241016a222b2002490d4720024101742222202b2022202b4b1b2222ad42187e2205422088a70d472005a7222b4100480d470240024020020d00202b102821020c010b20032802d001200241186c202b102c21020b2002450d1b200320223602d401200320023602d00120032802d80121020b20032802d001200241186c6a2202201a200620171b3703082002202c200420171b3703002002202a360210200320032802d80141016a3602d801200341a0036a200341b0016a10b50420032802d401212b0b202b450d4c20032802d001102a410021020c4d0b2002411a6a290100211a200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d0000212741042117200241046a2d00002128200241026a2f010021290240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b410021024100212a0b202a41ffff0371410874200241187472201741ff017172212a0240202b450d00410f211741ea9fc60021020240202a0e07000708090a4f50000b20264108742027722025411874722102202341087420247220224118747221170c4f0b2003201a3703b8032003201b3a00b7032003201c3a00b6032003201d3b01b4032003201e3a00b3032003201f3a00b203200320203b01b003200320213a00af03200320223a00ae03200320233b01ac03200320243a00ab03200320253a00aa03200320263b01a803200320273a00a7032003202a3600a303200320283a00a203200320293b01a003410e10282202450d192002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341a0036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006210220032802f0042217417f460d2c2002450d2c200320173602b401200320023602b001200341f0046a200341b0016a108a022003280290052224450d1a20034188056a290300212c200341fc046a350200211a200341b4056a290200212e200341b0056a2f01002126200341ac056a2f01002127200341a8056a2f0100211b200341a4056a2f0100211c2003419c056a2f0100211d200329038005212d20032902f404210620032d00b305211e20032d00b205211f20032d00af05212020032d00ae05212120032d00ab05212820032d00aa05212920032d00a705211420032d00a605210720032d00a3052108200328009f05210920032d009e05210a200329029405210420032802f004212a02402017450d002002102a0b200341f0046a41086a22024200370300200342003703f00441bb9cc6004112200341f0046a1008200341d0046a41086a2002290300370300200320032903f0043703d0044100212b200341003602f004200341d0046a4110200341f0046a10062102024020032802f0042217417f460d002002450d0020174104490d1d2002280000212b2002102a0b201a422086200642208884211a2006422086202aad8421062004a7210b0240024002402004422088a7222541186c2202450d00202420026a2122200241686a2117202421020340200241086a290300210520022903002104202b200241106a280200222a490d024200201a20057d2006200454ad7d2205200620047d22042006562005201a562005201a511b222a1b211a42002004202a1b2106201741686a2117200241186a22022022470d000b0b410821234100212a0240200b0d00410021250c020b2024102a410021250c010b411810282223450d1e202320043703002023202a360210202320053703080240024020170d004101212a410121250c010b200241186a210c202541186c20246a41686a210e4101212a410121250340200c210202400340200241086a290300210520022903002104202b200241106a2802002217490d014200201a20057d2006200454ad7d2205200620047d22042006562005201a562005201a511b22171b211a4200200420171b2106200241186a22022022470d000c030b0b02402025202a470d00202a41016a2225202a490d48202a410174220c2025200c20254b1b2225ad42187e222f422088a70d48202fa7220c4100480d4802400240202a0d00200c102821230c010b2023202a41186c200c102c21230b2023450d220b200241186a210c2023202a41186c6a220d2005370308200d2004370300200d2017360210202a41016a212a200e2002470d000b0b200b450d002024102a0b200341b4056a202e370200200341b3056a201e3a0000200341b2056a201f3a0000200341b0056a20263b0100200341af056a20203a0000200341ae056a20213a0000200341ac056a20273b0100200341ab056a20283a0000200341aa056a20293a0000200341a8056a201b3b0100200341a7056a20143a0000200341a6056a20073a0000200341a4056a201c3b0100200341a3056a20083a00002003419f056a20093600002003419e056a200a3a000020034198056a202a36020020034194056a20253602002003202d3703800520034188056a202c370300200320063703f0042003201d3b019c0520032023360290052003201a3703f8040240202d202c844200520d00202a450d1c0b200341a0036a200341f0046a10b5040c4a0b200141106a2903002106200141086a29030021042002411a6a290100211a200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d0000212741042117200241046a2d00002128200241026a2f010021290240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b410021024100212a0b202a41ffff0371410874200241187472201741ff017172212a0240202b450d00410f211741ea9fc60021020240202a0e0700060708094e4f000b20264108742027722025411874722102202341087420247220224118747221170c4e0b2003201a370398012003201b3a0097012003201c3a0096012003201d3b0194012003201e3a0093012003201f3a009201200320203b019001200320213a008f01200320223a008e01200320233b018c01200320243a008b01200320253a008a01200320263b018801200320273a0087012003202a36008301200320283a008201200320293b018001410e10282202450d1e2002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f00420034180016a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006210220032802f0042217417f460d2b2002450d2b200320173602a403200320023602a003200341f0046a200341a0036a108a02200328029005222a450d1f200341f0046a41186a290300211a200341f0046a410c6a3502002105200341bc056a280200212b200341f0046a41c4006a290200212c200341f0046a41c0006a2f01002122200341f0046a413c6a2f01002123200341f0046a41386a2f01002124200341f0046a41346a2f01002125200341f0046a412c6a2f01002126200329038005212d20032902f404212e20032d00b305212720032d00b205211b20032d00af05211c20032d00ae05211d20032d00ab05211e20032d00aa05211f20032d00a705212020032d00a605212120032d00a3052128200328009f05212920032d009e052114200329029405212f20032802f004210702402017450d002002102a0b200341b0016a41186a201a370300200341b0016a410c6a20053e0200200341b0016a41c4006a202c370200200341f3016a20273a0000200341f2016a201b3a0000200341b0016a41c0006a20223b0100200341ef016a201c3a0000200341ee016a201d3a0000200341b0016a413c6a20233b0100200341eb016a201e3a0000200341ea016a201f3a0000200341b0016a41386a20243b0100200341e7016a20203a0000200341e6016a20213a0000200341b0016a41346a20253b0100200341e3016a20283a0000200341df016a2029360000200341de016a20143a0000200341d4016a202f3702002003202d3703c0012003202e3702b4012003202b3602fc01200320263b01dc012003202a3602d001200320073602b001200341b0016a412c6a222310a7042003200637037820032004370370411210282202450d20200241002900c1ae44370000200241106a41002f00d1ae443b0000200241086a41002900c9ae4437000020034292808080a0023702f404200320023602f0042023200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a100621250240024020032802f0042226417f460d002025450d00200320263602ec03200320253602e803200341386a200341e8036a109f0120032802380d4a20032802ec032202450d4a20032002417f6a222a3602ec03200320032802e803222241016a222b3602e80320222d0000220241014b0d4a410021240240024020020e020100010b41002102200341003a00900503400240202a2002470d00200341003602ec03200241ff0171450d4d200341003a0090050c4d0b200341f0046a20026a202220026a221741016a2d00003a00002003201741026a3602e8032003200241016a22173a0090052017210220174120470d000b200341a0036a41086a200341f0046a41086a290300370300200341a0036a41106a200341f0046a41106a290300370300200341a0036a41186a200341f0046a41186a290300370300200320032903f0043703a0032003202a20176b222a3602ec0341012124202220176a41016a212b0b20034188046a41186a200341a0036a41186a29030037030020034188046a41106a200341a0036a41106a29030037030020034188046a41086a200341a0036a41086a290300370300200320032903a00337038804202a450d4a2003202a417f6a222a3602ec032003202b41016a3602e803202b2d0000221741014b0d4a410021020240024020170e020100010b41002102200341003a00900503400240202a2002470d00200341003602ec03200241ff0171450d4d200341003a0090050c4d0b200341f0046a20026a202b20026a221741016a2d00003a00002003201741026a3602e8032003200241016a22173a0090052017210220174120470d000b200341a0036a41086a200341f0046a41086a290300370300200341a0036a41106a200341f0046a41106a290300370300200341a0036a41186a200341f0046a41186a290300370300200320032903f0043703a0032003202a20176b3602ec03410121020b200341c0026a41186a2222200341a0036a41186a2217290300370300200341c0026a41106a2223200341a0036a41106a222a290300370300200341c0026a41086a2227200341a0036a41086a222b290300370300200341e0026a41086a221b20034188046a41086a290300370300200341e0026a41106a221c20034188046a41106a290300370300200341e0026a41186a221d20034188046a41186a290300370300200320032903a0033703c00220032003290388043703e002200341a0026a41186a221e201d290300370300200341a0026a41106a221d201c290300370300200341a0026a41086a221c201b290300370300200320032903e0023703a00220034180026a41186a221b202229030037030020034180026a41106a2222202329030037030020034180026a41086a22232027290300370300200320032903c00237038002200341f0046a41186a2227201e290300370300200341f0046a41106a221e201d290300370300200341f0046a41086a221d201c290300370300200320032903a0023703f0042017201b290300370300202a2022290300370300202b202329030037030020032003290380023703a00320244102460d4a200341d0046a41186a2027290300370300200341d0046a41106a201e290300370300200341d0046a41086a201d290300370300200341a8046a41086a202b290300370300200341a8046a41106a202a290300370300200341a8046a41186a2017290300370300200320032903f0043703d004200320032903a0033703a80402402026450d002025102a0b200341a0036a41186a200341d0046a41186a290300370300200341a0036a41106a200341d0046a41106a290300370300200341a0036a41086a200341d0046a41086a29030037030020034188046a41086a200341a8046a41086a29030037030020034188046a41106a200341a8046a41106a29030037030020034188046a41186a200341a8046a41186a290300370300200320032903d0043703a003200320032903a804370388040c010b200341e8036a41186a22024200370300200341e8036a41106a22174200370300200341e8036a41086a222a4200370300200342003703e80341d3aec400411a200341e8036a1000200341f0046a41186a222b2002290300370300200341f0046a41106a22222017290300370300200341f0046a41086a2224202a290300370300200320032903e8033703f004200341a0036a200341f0046a412010fd01024020032d00a0030d002002420037030020174200370300202a4200370300200342003703e80341d3aec400411a200341e8036a1000202b2002290300370300202220172903003703002024202a290300370300200320032903e8033703f004200341203602d4042003200341f0046a3602d0042023200341d0046a10ff0141002102410021240c010b200341c8036a41186a200341b9036a290000370300200341c8036a41106a200341b1036a290000370300200341c8036a41086a200341a9036a290000370300200320032900a1033703c80320034180036a200341c8036a10ac01200341003602f00420034180036a4120200341f0046a1006212420032802f0042226417f460d222024450d22200320263602a401200320243602a001200341206a200341a0016a109f012003290320a70d4820032802a4012202450d48200341306a290300211a2003290328210620032002417f6a222a3602a401200320032802a001222241016a222b3602a00120222d0000220241014b0d48410021250240024020020e020100010b41002102200341003a00900503400240202a2002470d00200341003602a401200241ff0171450d4b200341003a0090050c4b0b200341f0046a20026a202220026a221741016a2d00003a00002003201741026a3602a0012003200241016a22173a0090052017210220174120470d000b20034188046a41086a200341f0046a41086a2903002204370300200341d0046a41186a200341f0046a41186a290300370300200341d0046a41106a200341f0046a41106a290300370300200341d0046a41086a20043703002003202a20176b222a3602a401200320032903f004220437038804200320043703d00441012125202220176a41016a212b0b200341e8036a41186a200341d0046a41186a290300370300200341e8036a41106a200341d0046a41106a290300370300200341e8036a41086a200341d0046a41086a290300370300200320032903d0043703e80341002122200341003a00f004202a450d482003202a417f6a222a3602a4012003202b41016a3602a001202b2d0000220241014b0d480240024020020e020100010b41002102200341003a00900503400240202a2002470d00200341003602a401200241ff0171450d4b200341003a0090050c4b0b200341f0046a20026a202b20026a221741016a2d00003a00002003201741026a3602a0012003200241016a22173a0090052017210220174120470d000b200341a8046a41086a200341f0046a41086a2903002204370300200341d0046a41186a200341f0046a41186a290300370300200341d0046a41106a200341f0046a41106a290300370300200341d0046a41086a20043703002003202a20176b3602a401200320032903f00422043703a804200320043703d004410121220b200341c0026a41186a222b200341d0046a41186a2202290300370300200341c0026a41106a2227200341d0046a41106a2217290300370300200341c0026a41086a221b200341d0046a41086a222a290300370300200341e0026a41086a221c200341e8036a41086a290300370300200341e0026a41106a221d200341e8036a41106a290300370300200341e0026a41186a221e200341e8036a41186a290300370300200320032903d0043703c002200320032903e8033703e002200341a0026a41186a221f201e290300370300200341a0026a41106a221e201d290300370300200341a0026a41086a221d201c290300370300200320032903e0023703a00220034180026a41186a221c202b29030037030020034180026a41106a222b202729030037030020034180026a41086a2227201b290300370300200320032903c00237038002200341f0046a41186a221b201f290300370300200341f0046a41106a221f201e290300370300200341f0046a41086a221e201d290300370300200320032903a0023703f0042002201c2903003703002017202b290300370300202a202729030037030020032003290380023703d00420254102460d48200341a8046a41186a201b290300370300200341a8046a41106a201f290300370300200341a8046a41086a201e29030037030020034188046a41086a202a29030037030020034188046a41106a201729030037030020034188046a41186a2002290300370300200320032903f0043703a804200320032903d0043703880402402026450d002024102a0b200341d0046a41186a2224200341a8046a41186a290300370300200341d0046a41106a222b200341a8046a41106a290300370300200341d0046a41086a2226200341a8046a41086a290300370300200341e8036a41086a220220034188046a41086a2227290300370300200341e8036a41106a221720034188046a41106a221b290300370300200341e8036a41186a222a20034188046a41186a221c290300370300200320032903a8043703d00420032003290388043703e803200320253a00f004200341f9046a202629030037000020034181056a202b29030037000020034189056a2024290300370000200320032903d0043700f104200320223a00910520034192056a222520032903e8033701002003419a056a2002290300370100200341a2056a2017290300370100200341aa056a202a29030037010041002124200341e4046a2025410020221b3602002003201a3703d804200320063703d004200320233602e004200341003602b004200342013703a8042003200341d0046a3602880420034188046a200341a8046a10a301202b200341a8046a10aa0120032802ac04212b20034180036a412020032802a804222220032802b00410070240202b450d002022102a0b202a42003703002017420037030020024200370300200342003703e80341d3aec400411a200341e8036a1000200341f0046a41186a202a290300370300200341f0046a41106a2017290300370300200341f0046a41086a2002290300370300200320032903e8033703f004200341203602d4042003200341f0046a3602d0042023200341d0046a10ff012027200341c8036a41086a290300370300201b200341c8036a41106a290300370300201c200341c8036a41186a290300370300200320032903c80337038804410121020b200341fd046a200341a0036a41086a29030037000020034185056a200341a0036a41106a2903003700002003418d056a200341a0036a41186a29030037000020034195056a20023a000020034196056a2003290388043701002003419e056a20034188046a41086a290300370100200341a6056a20034188046a41106a290300370100200341ae056a20034188046a41186a290300370100200320243a00f404200320032903a0033700f5042003200341f0006a3602f004200341003602d804200342013703d0042003200341f0006a3602a804200341a8046a200341d0046a10a301200341f0046a410472200341d0046a10a90120032802d4042102200341d0006a412020032802d004221720032802d804100702402002450d002017102a0b20032802d401450d4a20032802d001102a410021020c4b0b2001410c6a2802002108200141086a280200211b41042117200141046a280200211c2002411a6a290100211a200241196a2d0000211d200241186a2d0000211e200241166a2f0100211f200241156a2d00002120200241146a2d00002121200241126a2f01002128200241116a2d00002129200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d00002127200241046a2d00002114200241026a2f010021070240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b4100212a410021020b202a41ffff0371410874201741ff017172200241187472212a0240202b450d00410f211741ea9fc6002102024002400240024002400240202a0e070001020304054c000b20264108742027722025411874722102202341087420247220224118747221170c4b0b410e211741dc9fc60021020c4a0b410c211741d09fc60021020c490b4109211741c79fc60021020c480b4113211741b49fc60021020c470b4111211741a39fc60021020c460b2003201a370398012003201d3a0097012003201e3a0096012003201f3b019401200320203a009301200320213a009201200320283b019001200320293a008f01200320223a008e01200320233b018c01200320243a008b01200320253a008a01200320263b018801200320273a0087012003202a36008301200320143a008201200320073b018001410e10282202450d212002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f00420034180016a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a10062102024020032802f0042217417f460d002002450d00200320173602a403200320023602a003200341f0046a200341a0036a108a02200328029005222a450d23200341f0046a41186a2903002106200341f0046a410c6a3502002104200341bc056a280200212b200341f0046a41c4006a2902002105200341f0046a41c0006a2f01002122200341f0046a413c6a2f01002123200341f0046a41386a2f01002124200341f0046a41346a2f01002125200341f0046a412c6a2f01002126200329038005212c20032902f404212d20032d00b305212720032d00b205211d20032d00af05211e20032d00ae05211f20032d00ab05212020032d00aa05212120032d00a705212820032d00a605212920032d00a3052114200328009f05210720032d009e052109200329029405211a20032802f004210a02402017450d002002102a0b200341b0016a41186a2006370300200341b0016a410c6a20043e0200200341b0016a41c4006a2005370200200341f3016a20273a0000200341f2016a201d3a0000200341b0016a41c0006a20223b0100200341ef016a201e3a0000200341ee016a201f3a0000200341b0016a413c6a20233b0100200341eb016a20203a0000200341ea016a20213a0000200341b0016a41386a20243b0100200341e7016a20283a0000200341e6016a20293a0000200341b0016a41346a20253b0100200341e3016a20143a0000200341df016a2007360000200341de016a20093a0000200341b0016a41246a201a3702002003202c3703c0012003202d3702b4012003202b3602fc01200320263b01dc012003202a3602d0012003200a3602b0012008450d44200341003a00a804200341103602e0042003201c200841246c6a3602dc042003201c3602d8042003201b3602d4042003201c3602d0042003200341a8046a3602e404200341f0046a200341d0046a1085040240024020032d00f0044101460d0020032802dc04212a20032802d8042102024003400240202a2002470d002002212b0c020b20022d00002117200241246a222b210220174102470d000b0b2003202b3602d8044100212441012123024020032802d4040d00410021020c020b20032802d004102a410021020c010b412010282223450d25202320032900f104370000202341186a20034189056a290000370000202341106a20034181056a290000370000202341086a200341f9046a290000370000200341a0036a41106a200341d0046a41106a290300370300200341a0036a41086a200341d0046a41086a290300370300200320032903d0043703a003200341f0046a200341a0036a1085040240024020032d00f0040d0041012102410121240c010b200341f0046a4101722117410221224120212b4101210241012124034020034188046a41186a2225201741186a29000037030020034188046a41106a2226201741106a29000037030020034188046a41086a2227201741086a2900003703002003201729000037038804024020022024470d00200241016a222a2002490d472022202a2022202a4b1b222441ffffff3f712024470d472024410574222a4100480d470240024020020d00202a102821230c010b2023202b202a102c21230b20230d00202a41011037000b2023202b6a222a200329038804370000202a41186a2025290300370000202a41106a2026290300370000202a41086a2027290300370000202241026a2122202b41206a212b200241016a2102200341f0046a200341a0036a10850420032d00f0040d000b0b20032802ac03212b20032802a8032117024003400240202b2017470d00201721220c020b20172d0000212a201741246a22222117202a4102470d000b0b200320223602a80320032802a403450d0020032802a003102a0b024020032d00a804450d002024450d432023102a0c430b2023450d42200341b0016a412c6a222a10a604200320023602a801200320243602a401200320233602a001411210282202450d2520024100290095ae44370000200241106a41002f00a5ae443b0000200241086a410029009dae4437000020034292808080a0023702f404200320023602f004202a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222b420037030020034188046a41106a2222420037030020034188046a41086a2223420037030020034200370388042017200220034188046a1000200341d0006a41186a202b290300370300200341d0006a41106a2022290300370300200341d0006a41086a20232903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006212b024020032802f0042222417f460d00202b450d00200320223602ec032003202b3602e803200341d0046a200341e8036a106d20032802d0042224450d3f20032802d404212a20032802ec032202450d3e20032002417f6a22233602ec03200320032802e803222541016a22263602e80320252d0000221741014b0d3e410021020240024020170e020100010b41002102200341003a0090050340024020232002470d00200341003602ec03200241ff0171450d41200341003a0090050c410b200341f0046a20026a202520026a221741016a2d00003a00002003201741026a3602e8032003200241016a22173a0090052017210220174120470d000b200341a0036a41086a200341f0046a41086a290300370300200341a0036a41106a200341f0046a41106a290300370300200341a0036a41186a200341f0046a41186a290300370300200320032903f0043703a0032003202320176b22233602ec0341012102202520176a41016a21260b20034188046a41186a200341a0036a41186a29030037030020034188046a41106a200341a0036a41106a29030037030020034188046a41086a200341a0036a41086a290300370300200320032903a003370388042023450d3e20032023417f6a22253602ec032003202641016a3602e80320262d0000222341014b0d3e410021170240024020230e020100010b41002117200341003a0090050340024020252017470d00200341003602ec03201741ff0171450d41200341003a0090050c410b200341f0046a20176a202620176a222341016a2d00003a00002003202341026a3602e8032003201741016a22233a0090052023211720234120470d000b200341a0036a41086a200341f0046a41086a290300370300200341a0036a41106a200341f0046a41106a290300370300200341a0036a41186a200341f0046a41186a290300370300200320032903f0043703a0032003202520236b3602ec03410121170b200341c0026a41186a2223200341a0036a41186a2225290300370300200341c0026a41106a2226200341a0036a41106a2227290300370300200341c0026a41086a221b200341a0036a41086a221c290300370300200341e0026a41086a221d20034188046a41086a290300370300200341e0026a41106a221e20034188046a41106a290300370300200341e0026a41186a221f20034188046a41186a290300370300200320032903a0033703c00220032003290388043703e002200341a0026a41186a2220201f290300370300200341a0026a41106a221f201e290300370300200341a0026a41086a221e201d290300370300200320032903e0023703a00220034180026a41186a221d202329030037030020034180026a41106a2223202629030037030020034180026a41086a2226201b290300370300200320032903c00237038002200341f0046a41186a2020290300370300200341f0046a41106a201f290300370300200341f0046a41086a201e290300370300200320032903a0023703f0042025201d29030037030020272023290300370300201c202629030037030020032003290380023703a0030c400b200341e8036a41186a22024200370300200341e8036a41106a22174200370300200341e8036a41086a222b4200370300200342003703e80341a7aec400411a200341e8036a1000200341f0046a41186a22222002290300370300200341f0046a41106a22232017290300370300200341f0046a41086a2224202b290300370300200320032903e8033703f004200341a0036a200341f0046a412010fd01024020032d00a0030d002002420037030020174200370300202b4200370300200342003703e80341a7aec400411a200341e8036a100020222002290300370300202320172903003703002024202b290300370300200320032903e8033703f004200341203602d4042003200341f0046a3602d004202a200341d0046a10ff01410021170c3c0b200341c8036a41186a200341b9036a290000370300200341c8036a41106a200341b1036a290000370300200341c8036a41086a200341a9036a290000370300200320032900a1033703c80320034180036a200341c8036a10ae01200341003602f00420034180036a4120200341f0046a1006212320032802f0042226417f460d262023450d26200320263602cc04200320233602c804200341f0006a200341c8046a106d20032802702224450d392003280274212220032802cc042202450d38200341f8006a280200212b20032002417f6a22273602cc04200320032802c804221b41016a221c3602c804201b2d0000220241014b0d38410021250240024020020e020100010b41002102200341003a0090050340024020272002470d00200341003602cc04200241ff0171450d3b200341003a0090050c3b0b200341f0046a20026a201b20026a221741016a2d00003a00002003201741026a3602c8042003200241016a22173a0090052017210220174120470d000b20034188046a41086a200341f0046a41086a290300221a370300200341d0046a41186a200341f0046a41186a290300370300200341d0046a41106a200341f0046a41106a290300370300200341d0046a41086a201a3703002003202720176b22273602cc04200320032903f004221a370388042003201a3703d00441012125201b20176a41016a211c0b200341e8036a41186a200341d0046a41186a290300370300200341e8036a41106a200341d0046a41106a290300370300200341e8036a41086a200341d0046a41086a290300370300200320032903d0043703e80341002117200341003a00f0042027450d3820032027417f6a22273602cc042003201c41016a3602c804201c2d0000220241014b0d380240024020020e020100010b41002102200341003a0090050340024020272002470d00200341003602cc04200241ff0171450d3b200341003a0090050c3b0b200341f0046a20026a201c20026a221741016a2d00003a00002003201741026a3602c8042003200241016a22173a0090052017210220174120470d000b200341a8046a41086a200341f0046a41086a290300221a370300200341d0046a41186a200341f0046a41186a290300370300200341d0046a41106a200341f0046a41106a290300370300200341d0046a41086a201a3703002003202720176b3602cc04200320032903f004221a3703a8042003201a3703d004410121170b200341c0026a41186a2202200341d0046a41186a2227290300370300200341c0026a41106a221b200341d0046a41106a221c290300370300200341c0026a41086a221d200341d0046a41086a221e290300370300200341e0026a41086a221f200341e8036a41086a290300370300200341e0026a41106a2220200341e8036a41106a290300370300200341e0026a41186a2221200341e8036a41186a290300370300200320032903d0043703c002200320032903e8033703e002200341a0026a41186a22282021290300370300200341a0026a41106a22212020290300370300200341a0026a41086a2220201f290300370300200320032903e0023703a00220034180026a41186a221f200229030037030020034180026a41106a2202201b29030037030020034180026a41086a221b201d290300370300200320032903c00237038002200341f0046a41186a2028290300370300200341f0046a41106a2021290300370300200341f0046a41086a2020290300370300200320032903a0023703f0042027201f290300370300201c2002290300370300201e201b29030037030020032003290380023703d0040c3a0b4110211741b581c50021020c450b2002411a6a290100211a200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d0000212741042117200241046a2d00002128200241026a2f010021290240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b4100212a410021020b202a41ffff0371410874201741ff017172200241187472212a0240202b450d00410f211741ea9fc60021020240202a0e0700040506074c4d000b20264108742027722025411874722102202341087420247220224118747221170c4c0b2003201a3703b8032003201b3a00b7032003201c3a00b6032003201d3b01b4032003201e3a00b3032003201f3a00b203200320203b01b003200320213a00af03200320223a00ae03200320233b01ac03200320243a00ab03200320253a00aa03200320263b01a803200320273a00a7032003202a3600a303200320283a00a203200320293b01a003410e10282202450d252002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341a0036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006211720032802f0042202417f460d29200320023602d404200320173602d004200341f0046a200341d0046a108a02200328029005222a450d26200341f0046a41186a290300211a200341f0046a410c6a3502002106200341bc056a280200212b200341f0046a41c4006a2902002104200341f0046a41c0006a2f01002122200341f0046a413c6a2f01002123200341f0046a41386a2f01002124200341f0046a41346a2f01002125200341f0046a412c6a2f01002126200329038005210520032902f404212c20032d00b305212720032d00b205211b20032d00af05211c20032d00ae05211d20032d00ab05211e20032d00aa05211f20032d00a705212020032d00a605212120032d00a3052128200328009f05212920032d009e052114200329029405212d20032802f004210702402002450d002017102a0b200341b0016a41186a201a370300200341b0016a410c6a20063e0200200341b0016a41c4006a2004370200200341f3016a20273a0000200341f2016a201b3a0000200341b0016a41c0006a20223b0100200341ef016a201c3a0000200341ee016a201d3a0000200341b0016a413c6a20233b0100200341eb016a201e3a0000200341ea016a201f3a0000200341b0016a41386a20243b0100200341e7016a20203a0000200341e6016a20213a0000200341b0016a41346a20253b0100200341e3016a20283a0000200341df016a2029360000200341de016a20143a0000200341d4016a2202202d370200200320053703c0012003202c3702b4012003202b3602fc01200320263b01dc012003202a3602d001200320073602b001200341b0016a412c6a221710a604201710a7042002280200450d4820032802d001102a410021020c490b20012d000121142002411a6a290100211a200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d0000212741042117200241046a2d00002128200241026a2f010021290240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b4100212a410021020b202a41ffff0371410874201741ff017172200241187472212a0240202b450d00410f211741ea9fc60021020240202a0e0700030405064b4c000b20264108742027722025411874722102202341087420247220224118747221170c4b0b2003201a3703b8032003201b3a00b7032003201c3a00b6032003201d3b01b4032003201e3a00b3032003201f3a00b203200320203b01b003200320213a00af03200320223a00ae03200320233b01ac03200320243a00ab03200320253a00aa03200320263b01a803200320273a00a7032003202a3600a303200320283a00a203200320293b01a003410e10282202450d262002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341a0036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006210220032802f0042217417f460d282002450d28200320173602d404200320023602d004200341f0046a200341d0046a108a02200328029005222a450d27200341f0046a41186a290300211a200341f0046a410c6a3502002106200341bc056a280200212b200341f0046a41c4006a2902002104200341f0046a41c0006a2f01002122200341f0046a413c6a2f01002123200341f0046a41386a2f01002124200341f0046a41346a2f01002125200341f0046a412c6a2f01002126200329038005210520032902f404212c20032d00b305212720032d00b205211b20032d00af05211c20032d00ae05211d20032d00ab05211e20032d00aa05211f20032d00a705212020032d00a605212120032d00a3052128200328009f05212920032d009e052107200329029405212d20032802f004210802402017450d002002102a0b200341b0016a41186a201a370300200341b0016a410c6a20063e0200200341b0016a41c4006a2004370200200341f3016a20273a0000200341f2016a201b3a0000200341b0016a41c0006a20223b0100200341ef016a201c3a0000200341ee016a201d3a0000200341b0016a413c6a20233b0100200341eb016a201e3a0000200341ea016a201f3a0000200341b0016a41386a20243b0100200341e7016a20203a0000200341e6016a20213a0000200341b0016a41346a20253b0100200341e3016a20283a0000200341df016a2029360000200341de016a20073a0000200341d4016a202d370200200320053703c0012003202c3702b4012003202b3602fc01200320263b01dc012003202a3602d001200320083602b001410d10282202450d2920024100290098af44370000200241056a410029009daf443700002003428d808080d0013702f404200320023602f004200341b0016a412c6a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b024002400240024002400240201441037122024103460d0020020e03010203010b200341d0006a41204101410010070c040b410021170c020b410121170c010b410221170b200320173a00f004410110282202450d2b200220173a0000200341d0006a41202002410110072002102a0b20032802d401450d4720032802d001102a410021020c480b2001411d6a29000021062001411c6a2d000021072001411b6a2d00002108200141196a2f00002109200141186a2d0000210a200141176a2d0000210b200141156a2f0000210c200141146a2d0000210d200141136a2d0000210e200141116a2f0000210f200141106a2d000021102001410f6a2d000021112001410d6a2f000021122001410c6a2d00002113200141086a280200211b200141076a2d00002115200141056a2f0000211641042117200141046a2d000021182002411a6a290100211a200241196a2d0000211c200241186a2d0000211d200241166a2f0100211e200241156a2d0000211f200241146a2d00002120200241126a2f01002121200241116a2d00002128200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d00002127200241046a2d00002129200241026a2f010021140240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f0100212a200241086a2d000021024100212b0c010b4101212b4100212a410021020b202a41ffff0371410874201741ff017172200241187472212a202b450d04410f211741ea9fc60021020240202a0e070001020304494a000b20264108742027722025411874722102202341087420247220224118747221170c490b410e211741dc9fc60021020c480b410c211741d09fc60021020c470b4109211741c79fc60021020c460b4113211741b49fc60021020c450b2003201a3703e0032003201c3a00df032003201d3a00de032003201e3b01dc032003201f3a00db03200320203a00da03200320213b01d803200320283a00d703200320223a00d603200320233b01d403200320243a00d303200320253a00d203200320263b01d003200320273a00cf032003202a3600cb03200320293a00ca03200320143b01c803200341f0046a200341c8036a10b1044101212a0240024020032d00f0044101460d00410b211741aa81c50021020c010b2003418a046a20032d00f3043a0000200341b0016a41086a20034184056a290200370300200341bd016a20034189056a290000370000200320032f00f1043b0188042003200341fc046a2902003703b001200341f0046a41086a28020021174100212a20032802f40421020b20034180036a41026a222b20034188046a41026a2d00003a0000200341a8046a41086a2222200341b0016a41086a290300370300200341a8046a41106a200341b0016a41106a290300370300200320032f0188043b018003200320032903b0013703a804202a0d44200341fb036a202229030037000020034180046a200341b5046a290000370000200320032f0180033b01e803200320173600ef03200320023600eb03200320032903a8043700f3032003202b2d00003a00ea030240201841ff01714101470d00200341f0046a201b41067610fe0120032802f00421170240024020032802f804201b413f7122024b0d00410021020c010b201720024105746a2202290018210620022d0017210720022d0016210820022f0014210920022d0013210a20022d0012210b20022f0010210c20022d000f210d20022d000e210e20022f000c210f20022d000b211020022d000a211120022f0008211220022d000721132002280003211b20022d0002211520022f00002116410121020b024020032802f404450d002017102a0b20020d0041dc9fc6002102410e21170c450b200320063703c004200320073a00bf04200320083a00be04200320093b01bc042003200a3a00bb042003200b3a00ba042003200c3b01b8042003200d3a00b7042003200e3a00b6042003200f3b01b404200320103a00b304200320113a00b204200320123b01b004200320133a00af042003201b3600ab04200320153a00aa04200320163b01a804410e10282202450d252002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341a8046a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b0240200341d0006a41204101410041001003417f460d0041cc80c5002102411921170c450b200341a8046a200341e8036a4120109c05450d41410e10282202450d26200241002900fcae44370000200241066a4100290082af443700002003428e808080e0013702f404200320023602f004200341c8036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341203602f4042003200341d0006a3602f004200341a8046a200341f0046a10ff01410e10282202450d272002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702f404200320023602f004200341e8036a200341f0046a108f0120032802f804210220032802f004211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802f404450d0020032802f004102a0b200341003602f004200341d0006a4120200341f0046a1006212a0240024020032802f0042217417f470d00410021020c010b2003201736028c042003202a36028804200341f0046a20034188046a108a022003280290052202450d29200341b0016a41186a200341f0046a41186a290300370300200341b0016a41106a200341f0046a41106a290300370300200341b0016a41086a200341f0046a41086a290300370300200320032903f0043703b0012003419c056a2f010021222003419f056a2800002124200341a4056a2f01002126200341a8056a2f0100211c200341ac056a2f0100211f200341b0056a2f01002128200341b4056a290200212d200341bc056a2802002107200329029405212c20032d009e05212320032d00a305212520032d00a605212720032d00a705211b20032d00aa05211d20032d00ab05211e20032d00ae05212020032d00af05212120032d00b205212920032d00b305211402402017450d00202a102a0b200341d0006a412010090b200341a0036a41186a200341b0016a41186a290300221a370300200341a0036a41106a200341b0016a41106a2903002206370300200341a0036a41086a200341b0016a41086a2903002204370300200320032903b00122053703a003200341f0046a41186a2217201a370300200341f0046a41106a222a2006370300200341f0046a41086a222b2004370300200320053703f0042002450d41200341d0046a41186a2017290300221a370300200341d0046a41106a202a2903002206370300200341d0046a41086a202b2903002204370300200320032903f00422053703d0042017201a370300202a2006370300202b2004370300200341b4056a202d370200200341b3056a20143a0000200341b2056a20293a0000200341b0056a20283b0100200341af056a20213a0000200341ae056a20203a0000200341ac056a201f3b0100200341ab056a201e3a0000200341aa056a201d3a0000200341a8056a201c3b0100200341a7056a201b3a0000200341a6056a20273a0000200341a4056a20263b0100200341a3056a20253a00002003419f056a20243600002003419e056a20233a000020034194056a202c370200200320053703f004200320073602bc05200320223b019c052003200236029005410e10282202450d292002410029008aaf44370000200241066a4100290090af443700002003428e808080e0013702b401200320023602b001200341a8046a200341b0016a108f0120032802b801210220032802b001211720034188046a41186a222a420037030020034188046a41106a222b420037030020034188046a41086a2222420037030020034200370388042017200220034188046a1000200341d0006a41186a202a290300370300200341d0006a41106a202b290300370300200341d0006a41086a20222903003703002003200329038804370350024020032802b401450d0020032802b001102a0b200341203602b4012003200341d0006a3602b001200341f0046a200341b0016a10b604200328029405450d41200328029005102a410021020c420b4101212b024020022d000120022d000072450d0041a39fc600210241112117410121220c450b200141046a2802002102200341f0046a41086a22174200370300200342003703f00441889cc6004116200341f0046a1008200341d0046a41086a2017290300370300200320032903f0043703d004200320023602f004200341d0046a4110200341f0046a410410070c2c0b20022d000120022d0000720d2c200341f0046a41086a22024200370300200342003703f004418e9dc6004110200341f0046a1008200341d0046a41086a2002290300370300200320032903f0043703d004200341023a00f0044101212b410110282202450d28200241023a0000200341d0046a41102002410110072002102a0c2b0b20022d000120022d0000720d2b200341f0046a41086a22024200370300200342003703f004418e9dc6004110200341f0046a1008200341d0046a41086a2002290300370300200320032903f0043703d0044101212b200341013a00f004410110282202450d28200241013a0000200341d0046a41102002410110072002102a0c2a0b200141086a280200212a200141046a2802002123024020022d000120022d000072450d0041a39fc600210241112117410021224101212b202a450d422023102a0c420b2001410c6a2802002102200341f0046a41086a22174200370300200342003703f00441c8ffc4004115200341f0046a1008200341d0046a41086a2017290300370300200320032903f0043703d004200341003602f804200342013703f0042002200341f0046a10b40102402002450d00200241057421172023210203402002200341f0046a108f01200241206a2102201741606a22170d000b0b20032802f4042102200341d0046a411020032802f004221720032802f804100702402002450d002017102a0b4101212b202a450d282023102a0c280b410e41011037000b410e41011037000b410e41011037000b410d41011037000b410141011037000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b41c4d1c3004133200341e0026a419cd9c3001038000b202b41081037000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b200341c8016a200341b4056a290200370300200341c0016a200341ac056a290200370300200341b0016a41086a200341a4056a2902003703002003200329029c053703b001200342f3e885db96cddbb3203703e803200310980136028804200341d0046a200341b0016a109a0220032802d404211720032802d004210220032802d804212a200341e4046a200341e8036a36020020032002202a4105746a3602dc04200320023602d804200320173602d404200320023602d004200320034188046a3602e004200341a8046a200341d0046a108701200341d0046a41086a200341a8046a41086a280200360200200320032903a8043703d004200341b0016a200341d0046a109c02200341b0016a1095020c2e0b41c4d1c3004133200341e0026a419cd9c3001038000b411841081037000b200c41081037000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b411241011037000b41b7b3c0004192011050000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b412041011037000b411241011037000b41b7b3c0004192011050000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b41b581c5002102411021170c210b410d41011037000b410141011037000b410e41011037000b410e41011037000b410e41011037000b41c4d1c3004133200341e0026a419cd9c3001038000b410e41011037000b410141011037000b410141011037000b41002122410021020c180b41002102410121220c170b41a39fc6002102411121170c150b2022450d002024102a0b410221250b20254102460d01200341a8046a41186a221c200341f0046a41186a290300370300200341a8046a41106a221d200341f0046a41106a290300370300200341a8046a41086a221e200341f0046a41086a29030037030020034188046a41086a221f200341d0046a41086a222729030037030020034188046a41106a2220200341d0046a41106a220229030037030020034188046a41186a2221200341d0046a41186a221b290300370300200320032903f0043703a804200320032903d0043703880402402026450d002023102a0b201b201c2903003703002002201d2903003703002027201e290300370300200341e8036a41086a2223201f290300370300200341e8036a41106a22262020290300370300200341e8036a41186a221c2021290300370300200320032903a8043703d00420032003290388043703e803200320253a00f004200341f9046a202729030037000020034181056a200229030037000020034189056a201b290300370000200320032903d0043700f104200320173a00910520034192056a222520032903e8033701002003419a056a2023290300370100200341a2056a2026290300370100200341aa056a201c290300370100200220254100201741ff01714101461b3602002003202a3602dc042003202b3602d804200320223602d404200320243602d004200341003602b004200342013703a804202b200341a8046a10b401200341dc046a21230240202b450d00202b41057421172024210203402002200341a8046a108f01200241206a2102201741606a22170d000b0b2023200341a8046a10aa0120032802ac04210220034180036a412020032802a804221720032802b004100702402002450d002017102a0b02402022450d002024102a0b200341e8036a41186a22024200370300200341e8036a41106a22174200370300200341e8036a41086a222b4200370300200342003703e80341a7aec400411a200341e8036a1000200341f0046a41186a2002290300370300200341f0046a41106a2017290300370300200341f0046a41086a202b290300370300200320032903e8033703f004200341203602d4042003200341f0046a3602d004202a200341d0046a10ff0120034188046a41086a200341c8036a41086a29030037030020034188046a41106a200341c8036a41106a29030037030020034188046a41186a200341c8036a41186a290300370300200320032903c80337038804410121170b410021020c040b41c4d1c3004133200341e0026a419cd9c3001038000b202a450d002024102a0b410221020b20024102460d01200341d0046a41186a2223200341f0046a41186a290300370300200341d0046a41106a2225200341f0046a41106a290300370300200341d0046a41086a2226200341f0046a41086a290300370300200341a8046a41086a2227200341a0036a41086a221b290300370300200341a8046a41106a221c200341a0036a41106a221d290300370300200341a8046a41186a221e200341a0036a41186a221f290300370300200320032903f0043703d004200320032903a0033703a80402402022450d00202b102a0b201f2023290300370300201d2025290300370300201b202629030037030020034188046a41086a202729030037030020034188046a41106a201c29030037030020034188046a41186a201e290300370300200320032903d0043703a003200320032903a80437038804202a450d002024102a0b200341fd046a200341a0036a41086a29030037000020034185056a200341a0036a41106a2903003700002003418d056a200341a0036a41186a29030037000020034195056a20173a000020034196056a2003290388043701002003419e056a20034188046a41086a290300370100200341a6056a20034188046a41106a290300370100200341ae056a20034188046a41186a290300370100200320023a00f404200320032903a0033700f5042003200341a0016a3602f004200341003602d804200342013703d00420032802a001210220032802a8012217200341d0046a10b401200341f0046a410472212a02402017450d002017410574211703402002200341d0046a108f01200241206a2102201741606a22170d000b0b202a200341d0046a10a90120032802d4042102200341d0006a412020032802d004221720032802d804100702402002450d002017102a0b024020032802a401450d0020032802a001102a0b024020032802d401450d0020032802d001102a0b4100212b41012122410021020c0d0b41c4d1c3004133200341e0026a419cd9c3001038000b41dc9fc6002102410e21174100212b20032802d401212a0c020b1031000b201aa7212a41e881c5002102411721174101212b0b0240202a450d0020032802d001102a0b202b0d00410121224100212b0c080b410121224100212b201b450d07201c102a0c070b41c4d1c3004133200341e0026a419cd9c3001038000b41c4d1c3004133200341e0026a419cd9c3001038000b200328029405450d00200328029005102a410021020c010b410021020b4101212b410121220c020b4111211741a39fc60021020b4101212b410121220b0240024020012d0000222a410d4b0d004101202a7441be3f710d010240202a4106460d00202a410d470d012022450d02200141086a280200450d02200141046a280200102a0c020b202b450d01200141086a280200450d01200141046a280200102a0c010b200141086a280200450d00200141046a280200102a0b2000201736020420002002360200200341c0056a24000b990d02067f077e230041b0016b22052400024002400240024002400240411410282206450d00200641002900cfe140370000200641106a41002800dfe140360000200641086a41002900d7e14037000020054294808080c002370234200520063602302001200541306a108f012005280238210620052802302107200541c0006a41186a22084200370300200541c0006a41106a22094200370300200541c0006a41086a220a42003703002005420037034020072006200541c0006a1000200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a2903003703002005200529034037031002402005280234450d002005280230102a0b20054100360240200541106a4120200541c0006a100621060240024020052802402207417f470d004200210b4200210c0c010b20074110490d02200641086a290000210c2006290000210b2006102a0b411410282206450d02200641002900cfe140370000200641106a41002800dfe140360000200641086a41002900d7e14037000020054294808080c002370234200520063602302002200541306a108f012005280238210620052802302107200541c0006a41186a22084200370300200541c0006a41106a22094200370300200541c0006a41086a220a42003703002005420037034020072006200541c0006a1000200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a2903003703002005200529034037031002402005280234450d002005280230102a0b20054100360240200541106a4120200541c0006a100621060240024020052802402207417f470d004200210d4200210e0c010b20074110490d04200641086a290000210e2006290000210d2006102a0b024020034280a094a58d1d7c220f200354220620042006ad7c2210200454200f20035a1b450d0041f092c1002106412821010c060b0240200b200f7d2211200b56200c20107d200b200f54ad7d220f200c56200f200c511b4101470d00419893c1002106411d21010c060b0240200342ffffe883b1de165620044200522004501b0d00200d200e8450450d0041e293c1002106411f21010c060b200541086a200141022011200f10bc01024020052802082206450d00200528020c21010c060b0240200d20037c220c200d542206200e20047c2006ad7c220b200e54200b200e511b450d0041b593c1002106412d21010c060b41002106024020012002470d000c060b0240200120024120109c050d000c060b20012011200f108f02411410282206450d04200641002900cfe140370000200641106a41002800dfe140360000200641086a41002900d7e14037000020054294808080c002370234200520063602302002200541306a108f012005280238210620052802302107200541c0006a41186a22084200370300200541c0006a41106a22094200370300200541c0006a41086a220a42003703002005420037034020072006200541c0006a1000200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a2903003703002005200529034037031002402005280234450d002005280230102a0b0240200541106a41204101410041001003417f470d002002109302200541f8006a200b370300200541f0006a200c370300200541c0006a41086a41003a0000200541c9006a2002290000370000200541d1006a200241086a290000370000200541d9006a200241106a290000370000200541e1006a200241186a290000370000200541023a004041014100200541c0006a10cc010b2002200c200b108f022005420037034820054280a094a58d1d3703402005200541c0006a360210200541106a109d01200541a8016a4200370300200541a0016a4280a094a58d1d37030020054198016a200437030020054190016a2003370300200541c0006a41086a41023a0000200541c9006a2001290000370000200541d1006a200141086a290000370000200541d9006a200141106a290000370000200541e1006a200141186a290000370000200541e9006a2002290000370000200541f1006a200241086a290000370000200541f9006a200241106a29000037000020054181016a200241186a290000370000200541023a00404100210641014100200541c0006a10cc010c050b411441011037000b41c4d1c3004133200541c0006a419cd9c3001038000b411441011037000b41c4d1c3004133200541c0006a419cd9c3001038000b411441011037000b2000200136020420002006360200200541b0016a24000b881201097f230041f0026b22032400024002400240024002400240024002400240411410282204450d00200441002900cfe140370000200441106a41002800dfe140360000200441086a41002900d7e14037000020034294808080c002370294012003200436029001200020034190016a108f0120032802980121042003280290012105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020052004200341206a100020034180026a41186a200629030037030020034180026a41106a200729030037030020034180026a41086a200829030037030020032003290320370380020240200328029401450d00200328029001102a0b200320013703202003200237032820034180026a4120200341206a41101007200142ffffe883b1de165620024200522002501b0d06411410282204450d01200441002900cfe140370000200441106a41002800dfe140360000200441086a41002900d7e14037000020034294808080c002370294012003200436029001200020034190016a108f0120032802980121042003280290012105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020052004200341206a100020034180026a41186a200629030037030020034180026a41106a200729030037030020034180026a41086a200829030037030020032003290320370380020240200328029401450d00200328029001102a0b200341086a20034180026a109402200341086a41106a29030021022003290310210120032802082109410e10282204450d02200441002900fbe140370000200441066a4100290081e2403700002003428e808080e001370294012003200436029001200020034190016a108f0120032802980121042003280290012105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020052004200341206a100020034180026a41186a200629030037030020034180026a41106a200729030037030020034180026a41086a200829030037030020032003290320370380020240200328029401450d00200328029001102a0b20034180026a4120100902402001200284500d002009450d0020032001370320200320023703282003200341206a3602800220034180026a109d010b2000109502411710282204450d03200441002900f1d8433700002004410f6a4100290080d943370000200441086a41002900f9d84337000020034297808080f002370294012003200436029001200020034190016a108f0120032802980121042003280290012105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020052004200341206a100020034180026a41186a200629030037030020034180026a41106a200729030037030020034180026a41086a200829030037030020032003290320370380020240200328029401450d00200328029001102a0b200341206a20034180026a109602024020032d002022044102460d0020034180026a412010090b2003413c6a2802002106200341386a2802002105024020040d002005200341c0006a28020010042006450d060c050b20044103710d0520060d040c050b411441011037000b411441011037000b410e41011037000b411741011037000b2005102a0b200341f0016a2000108b0220032802f001210420032802f8012105410021062003410036022020042005200341206a10062108024002400240024020032802202207417f460d00200320073602e402200320083602e002200341206a200341e0026a10e80120032d00204101460d0120034180026a200341206a41017241e000109a051a02402007450d002008102a0b200341206a20034180026a41e000109a051a200420051009410121060b20034190016a200341206a41e000109a051a200341206a20034190016a41e000109a051a2006450d0120034180026a200341206a41e000109a051a024020032802f401450d002004102a0b200341206a20034180026a41e000109a051a200341c0006a210a200341e0006a210b4104210641e7e485f30621040340200b210702400240200441e9dabdf306460d000240200441e7e485f306470d00200341206a21070c010b200a2107200441e2c289ab06460d00410121084100210541012107410121090c010b41202105410021084120102822090d00412041011037000b200920072005109a0521072003200536029c01200320053602980120032007360294012003200436029001200341f0016a20034190016a108c0220032802f001220420032802f8011009024020032802f401450d002004102a0b024020080d002007102a0b2006410c460d03200641f8c8c0006a2800002104200641046a21060c000b0b41c4d1c3004133200341e8026a419cd9c3001038000b20032802f401450d002004102a0b411810282204450d01200441002900e3e140370000200441106a41002900f3e140370000200441086a41002900ebe140370000200342988080808003370294012003200436029001200020034190016a108f0120032802980121042003280290012105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020052004200341206a100020034180026a41186a200629030037030020034180026a41106a200729030037030020034180026a41086a200829030037030020032003290320370380020240200328029401450d00200328029001102a0b2003410036022020034180026a4120200341206a10062104024020032802202205417f460d0020054110490d03200441086a2900002102200429000021012004102a200120028450450d010b2000109702200341206a41086a41013a0000200341296a2000290000370000200341316a200041086a290000370000200341396a200041106a290000370000200341c1006a200041186a290000370000200341023a002041014100200341206a10cc010b200341f0026a24000f0b411841011037000b41c4d1c3004133200341e8026a419cd9c3001038000bd40801067f230041c0016b220324000240024002400240411810282204450d00200441002900e3e140370000200441106a41002900f3e140370000200441086a41002900ebe140370000200342988080808003370244200320043602402000200341c0006a108f012003280248210420032802402105200341d0006a41186a22064200370300200341d0006a41106a22074200370300200341d0006a41086a220842003703002003420037035020052004200341d0006a1000200341206a41186a2006290300370300200341206a41106a2007290300370300200341206a41086a20082903003703002003200329035037032002402003280244450d002003280240102a0b2003200137035020032002370358200341206a4120200341d0006a411010070240200142ffffe883b1de165620024200522002501b0d00411810282204450d02200441002900e3e140370000200441106a41002900f3e140370000200441086a41002900ebe140370000200342988080808003370244200320043602402000200341c0006a108f012003280248210420032802402105200341d0006a41186a22064200370300200341d0006a41106a22074200370300200341d0006a41086a220842003703002003420037035020052004200341d0006a1000200341206a41186a2006290300370300200341206a41106a2007290300370300200341206a41086a20082903003703002003200329035037032002402003280244450d002003280240102a0b200341086a200341206a109402024020032903102202200341086a41106a290300220184500d002003280208450d0020032002370350200320013703582003200341d0006a360220200341206a109d010b411410282204450d03200441002900cfe140370000200441106a41002800dfe140360000200441086a41002900d7e14037000020034294808080c002370244200320043602402000200341c0006a108f012003280248210420032802402105200341d0006a41186a22064200370300200341d0006a41106a22074200370300200341d0006a41086a220842003703002003420037035020052004200341d0006a1000200341206a41186a2006290300370300200341206a41106a2007290300370300200341206a41086a20082903003703002003200329035037032002402003280244450d002003280240102a0b20034100360250200341206a4120200341d0006a10062104024020032802502205417f460d0020054110490d05200441086a2900002102200429000021012004102a200120028450450d010b2000109702200341d0006a41086a41013a0000200341d9006a2000290000370000200341e1006a200041086a290000370000200341e9006a200041106a290000370000200341f1006a200041186a290000370000200341023a005041014100200341d0006a10cc010b200341c0016a24000f0b411841011037000b411841011037000b411441011037000b41c4d1c3004133200341d0006a419cd9c3001038000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccd1c5003602002000410436021c200041c4d1c5003602182000200041186a360210200041e8b5c300103e000bb30701057f230041106b2203240020034100360208200342013703002002200310b40102400240024002400240024002402002450d00200241c4006c210403400240024020012d00004101460d0002400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d0a200241017422062005200620054b1b22064100480d0a0240024020020d002006102821050c010b200328020020022006102c21050b2005450d052003200636020420032005360200200328020821020b2003200241016a360208200520026a41003a0000200141046a28020021060240024020032802042205200328020822026b4104490d00200328020021050c010b200241046a22072002490d0a200541017422022007200220074b1b22024100480d0a0240024020050d002002102821050c010b200328020020052002102c21050b2005450d062003200236020420032005360200200328020821020b2003200241046a360208200520026a20063600000c010b02400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d09200241017422062005200620054b1b22064100480d090240024020020d002006102821050c010b200328020020022006102c21050b2005450d062003200636020420032005360200200328020821020b2003200241016a360208200520026a41013a00002003200336020c200141016a2003410c6a10c8010240200141216a2d00004101460d0002400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d0a200241017422062005200620054b1b22064100480d0a0240024020020d002006102821050c010b200328020020022006102c21050b2005450d082003200636020420032005360200200328020821020b2003200241016a360208200520026a41003a00000c010b02400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d09200241017422062005200620054b1b22064100480d090240024020020d002006102821050c010b200328020020022006102c21050b2005450d082003200636020420032005360200200328020821020b2003200241016a360208200520026a41013a0000200141226a2003108f010b200141c4006a2101200441bc7f6a22040d000b0b20002003290300370200200041086a200341086a280200360200200341106a24000f0b200641011037000b200241011037000b200641011037000b200641011037000b200641011037000b1031000bcc0b03057f037e047f230041a0016b22012400200141306a41086a220242003703002001420037033041f5b8c3004113200141306a1008200141206a41086a2002290300370300200120012903303703204100210220014100360230200141206a4110200141306a100621030240024002400240024002400240024002400240024020012802302204417f460d002003450d0020044104490d01200328000021022003102a0b410110282203450d01200320002d00003a0000200341014102102c2203450d02200320002d00013a0001200341024104102c2203450d03200320002d00023a0002200320002d00033a0003200341044108102c2203450d04200320002d00043a0004200320002d00053a0005200320002d00063a0006200320002d00073a0007200341084110102c2203450d05200320002d00083a0008200320002d00093a0009200320002d000a3a000a200320002d000b3a000b200320002d000c3a000c200320002d000d3a000d200320002d000e3a000e200320002d000f3a000f200341104120102c2203450d06200320002d00103a0010200320002d00113a0011200320002d00123a0012200320002d00133a0013200320002d00143a0014200320002d00153a0015200320002d00163a0016200320002d00173a0017200320002d00183a0018200320002d00193a0019200320002d001a3a001a200320002d001b3a001b200320002d001c3a001c200320002d001d3a001d200320002d001e3a001e200320002d001f3a001f20032d0000210420032d000121052003102a200141206a2004200541087472410676220510fe0102402004413f71220320012802284f0d002001200128022020034105746a2203109d022001290300200141086a290300844200520d00200041086a2900002106200041106a2900002107200041186a290000210820032000290000370000200341186a2008370000200341106a2007370000200341086a2006370000200141306a41086a200141206a41086a280200360200200120012903203703302005200141306a10c5030c0a0b02402001280224450d002001280220102a0b200141306a200210fe010240200128023841c000490d000340200241016a210202402001280234450d002001280230102a0b200141306a200210fe012001280238413f4b0d000b0b200141106a41086a200141306a41086a2205280200220336020020012001290330370310200141306a41186a2209200041186a290000370300200141306a41106a220a200041106a2900003703002005200041086a29000037030020012000290000370330024020032001280214470d00200341016a22042003490d092003410174220b2004200b20044b1b220441ffffff3f712004470d092004410574220c4100480d090240024020030d00200c1028210b0c010b20012802102003410574200c102c210b0b200b450d08200120043602142001200b3602100b200320024106746a210b200128021020034105746a22042001290330370000200441086a2005290300370000200441106a200a290300370000200441186a20092903003700002001200341016a22033602180240200341c000470d00200141306a41086a220342003703002001420037033041f5b8c3004113200141306a1008200141206a41086a2003290300370300200120012903303703202001200241016a360230200141206a4110200141306a410410070b200141306a41086a2203200141106a41086a280200360200200120012903103703302002200141306a10c50320032000290000370300200141306a41106a200041086a290000370300200141306a41186a200041106a290000370300200141d0006a200041186a2900003703002001200b360234200141013a003041014100200141306a10cc010c090b41c4d1c3004133200141306a419cd9c3001038000b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000b200c41011037000b1031000b200141a0016a24000b980102037f037e230041106b220224002002410036020420014120200241046a1006210302400240024020022802042204417f470d00420021050c010b20044110490d01200341086a2900002106200329000021072003102a200141201009420121050b2000200537030020002007370308200041106a2006370300200241106a24000f0b41c4d1c3004133200241086a419cd9c3001038000ba00803067f047e027f230041b0016b22012400024002400240410e10282202450d00200241002900fcae44370000200241066a4100290082af443700002001428e808080e00137026c200120023602682000200141e8006a108f01200128027021022001280268210320014188016a41186a2204420037030020014188016a41106a2205420037030020014188016a41086a2206420037030020014200370388012003200220014188016a1000200141286a41186a2004290300370300200141286a41106a2005290300370300200141286a41086a200629030037030020012001290388013703280240200128026c450d002001280268102a0b20014188016a200141286a412010fd01024020012d00880141014722020d00200141286a412010090b200141c8006a41186a2203200141a1016a2900002207370300200141c8006a41106a220420014199016a2900002208370300200141c8006a41086a220520014191016a29000022093703002001200129008901220a370348200141e8006a41186a22062007370300200141e8006a41106a220b2008370300200141e8006a41086a220c20093703002001200a370368024020020d00200141086a41186a20062903002207370300200141086a41106a200b2903002208370300200141086a41086a200c290300220937030020012001290368220a3703082003200737030020042008370300200520093703002001200a370348410e10282202450d022002410029008aaf44370000200241066a4100290090af443700002001428e808080e00137022c20012002360228200141c8006a200141286a108f01200128023021022001280228210320014188016a41186a2204420037030020014188016a41106a2205420037030020014188016a41086a2206420037030020014200370388012003200220014188016a1000200141e8006a41186a2004290300370300200141e8006a41106a2005290300370300200141e8006a41086a200629030037030020012001290388013703680240200128022c450d002001280228102a0b200141e8006a412010090b410d10282202450d0220024100290098af44370000200241056a410029009daf443700002001428d808080d00137024c200120023602482000200141c8006a108f01200128025021022001280248210320014188016a41186a2204420037030020014188016a41106a2205420037030020014188016a41086a2206420037030020014200370388012003200220014188016a1000200141e8006a41186a2004290300370300200141e8006a41106a2005290300370300200141e8006a41086a200629030037030020012001290388013703680240200128024c450d002001280248102a0b200141e8006a41201009200010a604200010a704200141b0016a24000f0b410e41011037000b410e41011037000b410d41011037000bd00a050a7f027e037f027e017f230041e0006b220224002002410036023820014120200241386a1006210302400240024002400240024002400240024020022802382204417f460d0020030d010b200041023a00000c010b2002200436021c200220033602182004450d0520032d0000210120022004417f6a36021c2002200341016a360218200141014b0d0502400240024020010e020001000b200241086a200241186a106c20022802080d07200228021c200228020c2205490d072005417f4c0d030240024020050d0041012106200228021c21070c010b2005102e2206450d092006200228021822012005109a051a200228021c22042005490d052002200420056b220736021c2002200120056a3602180b20074104490d0520022802182208280000210920022007417c6a220a36021c2002200841046a36021841002101200241003a0058417b210b03400240200a2001470d000240200141ff0171450d00200241003a00580b20050d080c090b200241386a20016a200820016a220441046a2d00003a000020022007200b6a36021c2002200441056a3602182002200141016a22043a0058200b417f6a210b2004210120044120470d000b200220022802383602302002200228003b3600330240024002400240200720046b220b417c6a4110490d00200241c7006a290000210c200229003f210d20022d0057210a2002280053210e200228004f210f2002200820046a220141146a22083602182002200b416c6a221036021c20104104490d002001410c6a2900002111200141046a2900002112200828000021082002200b41686a36021c2002200141186a2210360218200741686a2004460d0320102d000021102002200b41676a221336021c2002200141196a360218201041014b0d034100210420100e020201020b20050d090c0a0b20134104490d01200141196a28000021072002200b41636a36021c20022001411d6a360218410121040b2002200228003336002b20022002280230360228200220022802283602382002200228002b36003b200220022800203602102002200241236a280000360013410021012005210b0c020b2005450d070c060b41002101200241003a00582004417f6a21072004417e6a21040340024020072001470d00200141ff0171450d08200241003a00580c080b200241386a20016a200320016a220b41016a2d00003a00002002200b41026a3602182002200141016a220b3a00582002200436021c2004417f6a2104200b2101200b4120470d000b2002200228003b360033200220022802383602302002200228003336002b20022002280230360228200220022802283602102002200228002b360013200241c7006a2900002111200229003f2112200228004f21062002280053210b20022d005721052002200241236a28000036003b20022002280020360238410121010b2002200228021036023020022002280013360033200220022802383602282002200228003b36002b2003102a200041106a2011370300200041086a2012370300200041c3006a200c3700002000413b6a200d370000200020013a0000200041306a20073602002000412c6a2004360200200041286a2008360200200041246a2009360200200041206a20053602002000411c6a200b360200200041186a2006360200200041d3006a200a3a0000200041cf006a200e360000200041cb006a200f36000020002002280230360001200041046a2002280033360000200041346a2002280228360200200041376a200228002b3600000b200241e0006a24000f0b1036000b200520041044000b2005450d010b2006102a0b41c4d1c3004133200241206a419cd9c3001038000b200541011037000b870201057f230041d0006b220124000240411310282202450d00200241002900cef0423700002002410f6a41002800ddf042360000200241086a41002900d6f04237000020014293808080b002370224200120023602202000200141206a108f012001280228210220012802202100200141306a41186a22034200370300200141306a41106a22044200370300200141306a41086a220542003703002001420037033020002002200141306a1000200141186a2003290300370300200141106a2004290300370300200141086a20052903003703002001200129033037030002402001280224450d002001280220102a0b200141201009200141d0006a24000f0b411341011037000bd10402067f037e230041e0006b22052400024002400240411410282206450d00200641002900cfe140370000200641106a41002800dfe140360000200641086a41002900d7e14037000020054294808080c002370234200520063602302001200541306a108f012005280238210620052802302107200541c0006a41186a22084200370300200541c0006a41106a22094200370300200541c0006a41086a220a42003703002005420037034020072006200541c0006a1000200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a2903003703002005200529034037031002402005280234450d002005280230102a0b20054100360240200541106a4120200541c0006a100621060240024020052802402207417f470d004200210b4200210c0c010b20074110490d02200641086a290000210c2006290000210b2006102a0b410121060240200b20027d220d200b56200c20037d200b200254ad7d220b200c56200b200c511b4101470d00200041d7dfc000360204200041086a411d3602000c030b024002400240200d428080e983b1de16544100200b501b0d00200541086a20012004200d200b10bc0120052802082206450d02200528020c210120002006360204200041086a20013602000c010b200041f4dfc000360204200041086a411a3602000b410121060c030b2001200d200b108f02200041106a2003370300200041086a2002370300410021060c020b411441011037000b41c4d1c3004133200541c0006a419cd9c3001038000b20002006360200200541e0006a24000bdb0702067f087e23004180016b22022400024002400240411010282203450d0020034100290089e240370000200341086a4100290091e240370000200242908080808002370254200220033602502001200241d0006a108f012002280258210320022802502104200241e0006a41186a22054200370300200241e0006a41106a22064200370300200241e0006a41086a220742003703002002420037036020042003200241e0006a1000200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a20072903003703002002200229036037033002402002280254450d002002280250102a0b20024100360260200241306a4120200241e0006a1006210302400240024020022802602204417f460d002003450d00024020044110490d0020044170714110460d002004417c714120470d020b41c4d1c3004133200241e0006a419cd9c3001038000b42002108420021090c010b200341086a290000210a2003290000210b200341186a290000210c20032900102108200328002021042003102a411410282203450d02200341002900cfe140370000200341106a41002800dfe140360000200341086a41002900d7e14037000020024294808080c002370254200220033602502001200241d0006a108f012002280258210320022802502101200241e0006a41186a22054200370300200241e0006a41106a22064200370300200241e0006a41086a220742003703002002420037036020012003200241e0006a1000200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a20072903003703002002200229036037033002402002280254450d002002280250102a0b20024100360260200241306a4120200241e0006a100621030240024020022802602201417f470d004200210d420021090c010b20014110490d04200341086a29000021092003290000210d2003102a0b4200210e200241106a200c42004100109801220320046b2201200120034b1bad220f4200109f05200241206a200f420020084200109f0520024200420020084200109f054200210802402002290308200229031884420052200241286a290300220f200229030020022903107c7c220c200f54720d00200a200c200b2002290320220e56200a200c56200a200c511b22031b200c7d200b200e20031b220c200e54ad7d2108200c200e7d210e0b20082009200d200e56200920085620092008511b22031b2109200e200d20031b21080b200020083703002000200937030820024180016a24000f0b411041011037000b411441011037000b41c4d1c3004133200241e0006a419cd9c3001038000baf07030b7f037e037f230041f0006b22022400024002400240024002400240410e10282203450d00200341002900fbe140370000200341066a4100290081e2403700002002428e808080e001370234200220033602302001200241306a108f012002280238210320022802302101200241c0006a41186a22044200370300200241c0006a41106a22054200370300200241c0006a41086a220642003703002002420037034020012003200241c0006a1000200241106a41186a2004290300370300200241106a41106a2005290300370300200241106a41086a20062903003703002002200229034037031002402002280234450d002002280230102a0b20024100360240200241106a4120200241c0006a100621070240024020022802402208417f460d002002200836023420022007360230200241086a200241306a106c20022802080d07200228023422034160712201417f4c0d03200228020c2109024002402003410576220a0d004108210b0c010b20011028220b450d050b02402009450d004100210c41002106410021050340200241c0006a200241306a109b020240024020022d00404101460d00200228023422014110490d002002290041210d20022002280230220341106a3602302002200141706a220436023420044104490d00200341086a290000210e2003290000210f20022001416c6a22043602342002200341146a36023020040d010b200a450d0a200b102a0c0a0b200541016a210420032800102110200241e6006a41026a200241ed006a41026a2d000022113a0000200241e2006a41026a221220113a000020022001416b6a3602342002200341156a360230200220022f006d22013b0166200220013b016220032d0014210102402005200a470d00200c2004200c20044b1b220a41ffffff3f71200a470d09200a41057422034100480d090240024020050d0020031028210b0c010b200b20062003102c210b0b200b450d080b200b20066a2203411c6a20013a00002003200e3703082003200f370300200341146a200d370200200341106a20103602002003411d6a20022f01623b00002003411f6a20122d00003a0000200c41026a210c200641206a21062004210520092004470d000b0b200b450d072009ad422086200aad84210d02402008450d002007102a0b2000200d3702042000200b3602000c010b20004100360208200042083702000b200241f0006a24000f0b410e41011037000b1036000b200141081037000b200341081037000b1031000b41c4d1c3004133200241c0006a419cd9c3001038000bf00204027f017e017f077e0240024020012802042202450d0020012802002203310000210420012002417f6a22053602042001200341016a3602002005450d012003310001210620012002417e6a22053602042001200341026a3602002005450d012003310002210720012002417d6a22053602042001200341036a3602002005450d012003310003210820012002417c6a22053602042001200341046a3602002005450d012003310004210920012002417b6a22053602042001200341056a3602002005450d012003310005210a20012002417a6a22053602042001200341066a3602002005450d012003310006210b2001200241796a22053602042001200341076a3602002005450d01200041003a00002003310007210c2001200241786a3602042001200341086a3602002000200c423886200b42308684200a422886842009422086842008421886842007421086842006420886842004843700010f0b200041013a00000f0b200041013a00000bce1003077f027e027f230041d0006b220224000240024002400240024002400240024002400240024002400240410e10282203450d00200341002900fbe140370000200341066a4100290081e2403700002002428e808080e001370224200220033602202000200241206a108f012002280228210320022802202100200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020002003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b200128020021072001280208210320024100360238200242013703302003200241306a10b40102402003450d002003410574210841002106034002400240200228023420022802382203460d00200228023021000c010b200341016a22002003490d0f200341017422042000200420004b1b22044100480d0f0240024020030d002004102821000c010b200228023020032004102c21000b2000450d042002200436023420022000360230200228023821030b2002200341016a360238200020036a200720066a220341146a2d00003a000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d052002200536023420022004360230200228023821000b2002200041016a360238200420006a200341156a2d00003a000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d062002200536023420022004360230200228023821000b2002200041016a360238200420006a200341166a2d00003a000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d072002200536023420022004360230200228023821000b2002200041016a360238200420006a200341176a2d00003a000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d082002200536023420022004360230200228023821000b2002200041016a360238200420006a200341186a2d00003a000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d092002200536023420022004360230200228023821000b2002200041016a360238200420006a200341196a2d00003a000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d0a2002200536023420022004360230200228023821000b2002200041016a360238200420006a2003411a6a2d00003a000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d0b2002200536023420022004360230200228023821000b2002200041016a360238200420006a2003411b6a2d00003a0000200341086a29030021092003290300210a0240024020022802342205200228023822046b4110490d00200228023021000c010b200441106a22002004490d0f200541017422042000200420004b1b220b4100480d0f0240024020050d00200b102821000c010b20022802302005200b102c21000b2000450d0c2002200b3602342002200036023020022802382104200b21050b200020046a220b2009370008200b200a3700002002200441106a2204360238200341106a280200210b0240200520046b41034b0d00200441046a220c2004490d0f20054101742204200c2004200c4b1b22044100480d0f0240024020050d002004102821000c010b200020052004102c21000b2000450d0d2002200436023420022000360230200228023821040b2002200441046a360238200020046a200b36000002400240200228023420022802382200460d00200228023021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102821040c010b200228023020002005102c21040b2004450d0e2002200536023420022004360230200228023821000b2002200041016a360238200420006a2003411c6a2d00003a00002008200641206a2206470d000b0b2002280234210320024120200228023022002002280238100702402003450d002000102a0b0240200141046a280200450d002007102a0b200241d0006a24000f0b410e41011037000b200441011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200b41011037000b200441011037000b200541011037000b1031000bd00502067f047e230041d0006b220224000240024002400240411410282203450d00200341002900cfe140370000200341106a41002800dfe140360000200341086a41002900d7e14037000020024294808080c002370224200220033602202001200241206a108f012002280228210320022802202104200241306a41186a22054200370300200241306a41106a22064200370300200241306a41086a220742003703002002420037033020042003200241306a1000200241186a2005290300370300200241106a2006290300370300200241086a20072903003703002002200229033037030002402002280224450d002002280220102a0b2002410036023020024120200241306a100621030240024020022802302204417f470d0042002108420021090c010b20044110490d02200341086a2900002109200329000021082003102a0b411810282203450d02200341002900e3e140370000200341106a41002900f3e140370000200341086a41002900ebe140370000200242988080808003370224200220033602202001200241206a108f012002280228210320022802202101200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020012003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b2002410036023020024120200241306a100621030240024020022802302201417f470d004200210a4200210b0c010b20014110490d04200341086a290000210b2003290000210a2003102a0b2000200a20087c22083703002000200b20097c2008200a54ad7c370308200241d0006a24000f0b411441011037000b41c4d1c3004133200241306a419cd9c3001038000b411841011037000b41c4d1c3004133200241306a419cd9c3001038000bf00906017f037e017f017e017f037e230041c0016b220724004200210842002109024020050d00200741f0006a2006ad42004280c8afa0254200109f05200741f8006a2903002007290370220a4280a094a58d1d7c2208200a54ad7c21090b20074180016a41086a22054200370300200742003703800141bfa0c600411b20074180016a1008200741a0016a41086a220b200529030037030020072007290380013703a001200741e0006a200741a0016a109f02200728026021052007290368210a2007418094ebdc03360284012007200a420020051b220a200a423f87220c7c200c85220c200c428094ebdc037f220c4280ec94a37c7e7ca7220536028001200741d0006a417f2004418094ebdc032004418094ebdc03491b2204417f417f2004ad200ca7417f200c428080808010541bad7e220ca7200c422088a71b220620074180016a2005418094ebdc034b4102746a28020022052004418094ebdc036e220d6c2005ad2004200d4180ec94a37c6c6aad7e428094ebdc0380a76a6a220520052006491b22056a220620062004491b4100200420056b2205200520044b1b200a4200551bad420042e8074200109f0520074180016a2003427f200820072903507c220a20017c220c200c200a5422042009200741d0006a41086a2903007c200a200854ad7c220820027c2004ad7c220a200854200a2008511b22041b220e427f200a20041b220f4101109802024002402007280280014101470d0020004180023b0001200041013a0000200041036a41003a00000c010b200741206a2007290388012209420042044200109f05200741106a4200420020094200109f05200741306a2007290320200741206a41086a290300220820074180016a41106a290300220a42028620072903107c7c220c4205420010a00520072903182101200741306a41086a29030021022007290330211020074180016a10d301200741c0006a20074180016a42b3e6cc99b3e6cc99332010200a200a42ffffffffffffffff3f8352200142005272200c2008547222041b22082009200820095442b3e6cc99b3e6cc9933200220041b220c200a54200c200a511b22041b2208200c200a20041b220c10d001200741a0016a41106a200c200741c0006a41086a29030022027d20082007290340220154ad7d2002200c7d2001200854ad7d20012008582002200c582002200c5122041b22051b3703002007200820017d200120087d20051b3703a801200720012008562002200c5620041b2204ad3703a001200a200c7d2009200854ad7d210a200920087d21080240024020040d002007200b3602bc01200741bc016a109d010c010b2007200b3602bc01200741bc016a109c010b20074180016a10f801200720074180016a2008200a10d001200741b0016a200a200741086a29030022097d20082007290300220c54ad7d2009200a7d200c200854ad7d200c2008582009200a582009200a5122041b22051b37030020072008200c7d200c20087d20051b3703a8012007200c2008562009200a5620041b2204ad3703a001200741a0016a41086a21050240024020040d00200720053602bc01200741bc016a109d010c010b200720053602bc01200741bc016a109c010b200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a200e427f200f501b370300200041003a00000b200741c0016a24000b820102027f027e230041106b220224002002410036020420014110200241046a100621010240024020022802042203417f460d002001450d00024020034108490d00200129000021042001102a420121050c020b41c4d1c3004133200241086a419cd9c3001038000b420021050b2000200437030820002005370300200241106a24000b1300200041033602042000419ce2c0003602000bc70104017f017e027f017e230041206b2201240042002102200141106a41086a220342003703002001420037031041ace1c0004116200141106a1008200141086a2003290300370300200120012903103703002001410036021020014110200141106a1006210302400240024020012802102204417f470d00420021050c010b20044110490d01200341086a2900002105200329000021022003102a0b2000200237030020002005370308200141206a24000f0b41c4d1c3004133200141106a419cd9c3001038000b3400200041b2f3c00036020420004100360200200041146a4105360200200041106a41bcf3c000360200200041086a42083702000b3701017f02404110102822020d00411041011037000b2002420037000820024200370000200042908080808002370204200020023602000b130020004105360204200041d884c1003602000be70302067f037e230041e0006b2204240020042001109d0202400240024002402004290300200441086a29030084500d00411410282205450d02200541002900cfe140370000200541106a41002800dfe140360000200541086a41002900d7e14037000020044294808080c002370234200420053602302001200441306a108f012004280238210520042802302106200441c0006a41186a22074200370300200441c0006a41106a22084200370300200441c0006a41086a220942003703002004420037034020062005200441c0006a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429034037031002402004280234450d002004280230102a0b20044100360240200441106a4120200441c0006a100621050240024020042802402206417f470d004200210a4200210b0c010b20064110490d04200541086a290000210b2005290000210a2005102a0b2001200a20027c220c200b20037c200c200a54ad7c108f02200041106a2003370300200041086a2002370300410021010c010b200041b5dfc000360204200041086a4122360200410121010b20002001360200200441e0006a24000f0b411441011037000b41c4d1c3004133200441c0006a419cd9c3001038000b130020004101360204200041f88ac1003602000b3400200041b18cc10036020420004100360200200041146a4103360200200041106a41bc8cc100360200200041086a42083702000bef0a09037f017e067f037e017f027e077f017e017f230041306b2203240010980121042000280000210520003500042106200341106a2001109a02200328021021072003280214210802400240024002400240024002400240024020032802182209450d0020072009410574220a6a210b200341246a210c200721090340200941086a290300210d200941106a290300210e2009290300210f200341106a41186a200941186a290300370300200341106a41106a200e370300200341106a41086a200d3703002003200f370310200c2000460d02200c2900002000290000510d0202402003280220221020044d0d002003410e6a2003412f6a2d00003a0000200320032f002d3b010c200341186a290300210f427f210e200329031021114201210d20032d002c210c200329022421120c040b200941206a2109200a41606a220a0d000b0b41082113410021102008450d022007102a0c020b2003280220220c2002200c20024b1b211020032d002c410272210c427f21114200210e41002102200329022421124200210d41002105427f210f0b200341026a22142003410c6a41026a2d00003a0000200320032f010c3b010002400240412010282213450d00201320113703002013200c3a001c2013201237021420132010360210201320032f01003b001d2013200f3703082013411f6a20142d00003a000002400240200a4120470d0041012110200e210f410121140c010b200941206a2115200b41606a21162003412d6a2117200341246a210c200e210f4101211041012114034020152109024002400340200341106a41186a200941186a290300370300200341106a41106a200941106a290300370300200341106a41086a220a200941086a2903003703002003200929030037031002400240200c2000460d00200c2900002000290000510d002003280220221820044d0d012003410c6a41026a201741026a2d00003a0000200320172f00003b010c200a29030021112003290310211220032d002c21192003290224211a0c040b200d4201510d024200210e410021024200210f4200210d410021050b200b200941206a2209470d000c040b0b200a290300220d200f20032903102212200e56200d200f56200d200f511b220a1b21112012200e200a1b21122003280220220a2002200a20024b1b211820032d002c41027221194200210e410021022003290224211a4200210f4200210d410021050b200341046a41026a2003410c6a41026a2d0000220a3a0000200320032f010c22153b0104200341106a41026a221b200a3a0000200320153b0110024020142010470d00201041016a220a2010490d0a20104101742214200a2014200a4b1b221441ffffff3f712014470d0a2014410574220a4100480d0a0240024020100d00200a102821130c010b20132010410574200a102c21130b2013450d040b200941206a2115201320104105746a220a20193a001c200a2011370308200a2012370300200a201a370214200a2018360210200a20032f01103b001d200a411f6a201b2d00003a0000201041016a211020162009470d000b0b02402008450d002007102a0b200d4201520d0520102014470d040c030b412041081037000b200a41081037000b427f210e427f210f0b201041016a22092010490d03201041017422002009200020094b1b221441ffffff3f712014470d03201441057422094100480d030240024020100d002009102821130c010b201320104105742009102c21130b2013450d020b201320104105746a2209200f3703082009200e3703002009200536021420092002360210200941186a200642808080802084370300201041016a21100b2003201036021820032014360214200320133602102001200341106a109c02200341306a24000f0b200941081037000b1031000bef0a07037f027e047f087e017f047e027f230022062107200641c0006b41607122062400109801210820062003370310200620023703082006200436021842012109200642013703002006200028000036021c20003500042102200641206a2001109a0220022005ad42ff018342208684210a2006280220210b2006280224210c0240024002400240024020062802282205450d00200b200541057422046a210d200641346a210e2006290300220921032006290308220f2110200629031022112112200629031822132114200b21050340200541086a2903002102200541106a290300211520052903002116200641206a41186a200541186a290300370300200641206a41106a22172015370300200641206a41086a20023703002006201637032002400240200e2000460d00200e2900002000290000510d000240200628023020084b0d0020032102420021030c020b20172903002118200629032821192006290320211a2006290338211b20032102420121030c010b420021094200210f420021114200211342002102200a211b2010211a20122119201421180b20034201510d02200541206a210520022103200441606a22040d000b200620093703002006200f37030820062011370310200620133703180b41002104200c450d01200b102a0c010b200620023703002006201037030820062012370310200620143703180240412010282217450d002017201b3703182017201a37030020172019370308201741106a201837030002400240024020044120470d0041012104200221094101211c0c010b200541206a2105200641346a211d20022109410121044101211c034002400240201d2000460d00200221030340200641206a41186a200541186a290300370300200641206a41106a220e200541106a290300370300200641206a41086a200541086a2903003703002006200529030037032002400240201d2900002000290000510d000240200628023020084b0d0020032102420021030c020b200e290300211b20062903282116200629032021152006290338211a20032102420121030c010b42002109200642003703004200210220102115201221162014211b200a211a0b024020034201510d0020022103200d200541206a2205470d010c050b0b200541206a21050c010b024003402006420037030020024201510d0142002102200d200541206a2205470d000b420021090c030b200541206a2105420021094200210220102115201221162014211b200a211a0b0240201c2004470d00200441016a220e2004490d072004410174221c200e201c200e4b1b221c41ffffff3f71201c470d07201c410574220e4100480d070240024020040d00200e102821170c010b20172004410574200e102c21170b2017450d030b201720044105746a220e2016370308200e2015370300200e41106a201b370300200e41186a201a370300200441016a21042005200d470d000b0b200c450d03200b102a0c030b200e41081037000b412041081037000b4100211c410821170b0240024020094201520d00200641206a41106a22002006410872220541106a290300370300200641206a41086a220e200541086a2903003703002006200529030037032002402004201c470d00200441016a22052004490d03200441017422082005200820054b1b221c41ffffff3f71201c470d03201c41057422054100480d030240024020040d002005102821170c010b201720044105742005102c21170b2017450d020b201720044105746a22052006290320370300200541106a2000290300370300200541086a200e290300370300200541186a200a370300200441016a21040b200620043602282006201c360224200620173602202001200641206a109c02200724000f0b200541081037000b1031000bff0502067f057e230041d0006b220324000240024002400240411810282204450d00200441002900e3e140370000200441106a41002900f3e140370000200441086a41002900ebe140370000200342988080808003370224200320043602202000200341206a108f012003280228210420032802202105200341306a41186a22064200370300200341306a41106a22074200370300200341306a41086a220842003703002003420037033020052004200341306a1000200341186a2006290300370300200341106a2007290300370300200341086a20082903003703002003200329033037030002402003280224450d002003280220102a0b2003410036023020034120200341306a100621040240024020032802302205417f470d00420021094200210a0c010b20054110490d02200441086a290000210a200429000021092004102a0b411410282204450d02200441002900cfe140370000200441106a41002800dfe140360000200441086a41002900d7e14037000020034294808080c002370224200320043602202000200341206a108f012003280228210420032802202105200341306a41186a22064200370300200341306a41106a22074200370300200341306a41086a220842003703002003420037033020052004200341306a1000200341186a2006290300370300200341106a2007290300370300200341086a20082903003703002003200329033037030002402003280224450d002003280220102a0b2003410036023020034120200341306a100621040240024020032802302205417f470d004200210b4200210c0c010b20054110490d04200441086a290000210c2004290000210b2004102a0b2000200b200120092009200156200a200256200a2002511b22041b22017c220d200c2002200a20041b22027c200d200b54ad7c108f022000200920017d200a20027d2009200154ad7d109002200341d0006a24000f0b411841011037000b41c4d1c3004133200341306a419cd9c3001038000b411441011037000b41c4d1c3004133200341306a419cd9c3001038000bc70301047f230041106b2203240020034100360208200342013703002001200310b40102400240024002402001450d00200141216c210403400240024020002d00004101460d0002400240200328020420032802082201460d00200328020021050c010b200141016a22052001490d07200141017422062005200620054b1b22064100480d070240024020010d002006102821050c010b200328020020012006102c21050b2005450d052003200636020420032005360200200328020821010b2003200141016a360208200520016a41003a00000c010b02400240200328020420032802082201460d00200328020021050c010b200141016a22052001490d06200141017422062005200620054b1b22064100480d060240024020010d002006102821050c010b200328020020012006102c21050b2005450d052003200636020420032005360200200328020821010b2003200141016a360208200520016a41013a0000200041016a2003108f010b200041216a21002004415f6a22040d000b0b2003280204210020022802002002280204200328020022012003280208100702402000450d002001102a0b200341106a24000f0b200641011037000b200641011037000b1031000bdb0401057f230041106b2203240020034100360208200342013703002002200310b401024002400240024002402002450d0020024190016c2104034020032802042105200328020821020240024020012802004113470d000240024020052002460d00200328020021050c010b200241016a22052002490d08200241017422062005200620054b1b22064100480d080240024020020d002006102821050c010b200328020020022006102c21050b2005450d052003200636020420032005360200200328020821020b2003200241016a360208200520026a41003a00000c010b0240024020052002460d00200328020021050c010b200241016a22052002490d07200241017422062005200620054b1b22064100480d070240024020020d002006102821050c010b200328020020022006102c21050b2005450d052003200636020420032005360200200328020821020b2003200241016a360208200520026a41013a00002001200310eb0120014188016a28020021060240024020032802042205200328020822026b4104490d00200328020021050c010b200241046a22072002490d07200541017422022007200220074b1b22024100480d070240024020050d002002102821050c010b200328020020052002102c21050b2005450d062003200236020420032005360200200328020821020b2003200241046a360208200520026a20063600000b20014190016a2101200441f07e6a22040d000b0b20002003290300370200200041086a200341086a280200360200200341106a24000f0b200641011037000b200641011037000b200241011037000b1031000b6801037f024041094101200128020022024101461b220310282204450d000240024020020d00200441003a0000410121010c010b200441013a000020042001290204370001410921010b2000200136020820002003360204200020043602000f0b200341011037000bcc0902057f027e230041c0006b22022400024002400240024002402001280200417f6a220341024b0d0020030e03010203010b41a091c1001032000b410121030240024020012d00044101460d00200241026a200141046a220341036a2d00003a0000200241206a41086a200141146a290200370300200241306a2001411c6a290200370300200241386a200141246a2d00003a0000200220032f00013b010020022001410c6a290200370320200141086a2802002104410021030c010b200141086a28020021040b200020033a0004200020022f01003b000520004101360200200041286a2001290328370300200041086a20043602002000410c6a2002290320370200200041306a200141306a290300370300200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a2802003602000c020b410121030240024020012d00044101460d00200241026a200141046a220341036a2d00003a0000200241206a41086a200141146a290200370300200241306a2001411c6a290200370300200241386a200141246a2d00003a0000200220032f00013b010020022001410c6a290200370320200141086a2802002104410021030c010b200141086a28020021040b200020033a0004200020022f01003b0005200041286a2001290328370300200041386a2001290338370300200041086a20043602002000410c6a2002290320370200200041306a200141306a290300370300200041c0006a200141c0006a290300370300200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041023602000c010b200141286a2103410121040240024020012d00044101460d002002411e6a200141046a220441036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220042f00013b011c20022001410c6a290200370300200141086a2802002105410021040c010b200141086a28020021050b410121060240024020032d00004101460d002002413e6a200341036a2d00003a0000200241286a200141386a290200370300200241306a200141c0006a290200370300200241386a200141c8006a2d00003a0000200220032f00013b013c2002200141306a2902003703202001412c6a2802002103410021060c010b2001412c6a28020021030b200020043a0004200020022f011c3b0005200020022f013c3b0029200041086a20053602002000410c6a2002290300370200200041286a20063a0000200041076a2002411c6a41026a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602002000412b6a2002413c6a41026a2d00003a0000200141d8006a2903002107200129035021082000412c6a2003360200200041d0006a2008370300200041d8006a200737030020004103360200200041306a2002290320370200200041386a200241206a41086a290300370200200041c0006a200241206a41106a290300370200200041c8006a200241206a41186a2802003602000b200241c0006a24000b960403077f017e067f02400240024002402001410c6a2802002202417f4c0d0020012802042103200128020021040240024020020d0041012105410021060c010b20022106200210282205450d020b200520032002109a052107200141186a2802002208ad420c7e2209422088a70d002009a72203417f4c0d002001280210210a0240024020030d004104210b0c010b20031028220b450d030b0240024020080d004100210c0c010b200a2008410c6c6a210d4100210c200b21050340200a41086a2802002203417f4c0d02200a280200210e0240024020030d004101210f0c010b20031028220f450d060b200f200e2003109a05210e200541086a2003360200200541046a20033602002005200e3602002005410c6a2105200c41016a210c200a410c6a220a200d470d000b0b20002007360204200020043602002000200129021c37021c200041186a200c360200200041146a2008360200200041106a200b3602002000410c6a2002360200200041086a2006360200200020012902243702242000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a2902003702000f0b1036000b200241011037000b200341041037000b200341011037000bd90303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200441e0006a2802002104200141016a21010c010b02400240200028020022010d002003ad210541002106410021010c010b20003301044220862003ad842105410121060b2000102a2005a72103024002402005422088a7220720012f01064f0d00200121040c010b034002400240200128020022040d002003ad2105410021040c010b200641016a210620013301044220862003ad8421050b2001102a2005a72103200421012005422088a7220720042f01064f0d000b0b200741027420046a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a280200210402402006417f6a2201450d00034020002802e40121002001417f6a22010d000b0b410021010b2004450d012002417f6a210202402005a7450d002004102a0b20020d000b0b0240200041f8b9c000460d00200028020021012000102a2001450d00200128020021042001102a2004450d00024020042802002201450d0003402004102a2001210420012802002200210120000d000b0b2004102a0b0bd308030d7f017e017f230041a0016b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2205200128020422062f01064f0d01200241186a2207200620054105746a220341206a290000370300200241106a2208200341186a290000370300200241086a2209200341106a2900003703002002200341086a290000370300200241206a41286a220a2006200541306c6a22034190036a290300370300200241206a41206a220b20034188036a290300370300200241206a41186a220c20034180036a290300370300200241206a41106a220d200341f8026a290300370300200241206a41086a220e200341f0026a290300370300200341e8026a290300210f2001200541016a36020c20012004360208200120063602042002200f370320200241d0006a41186a2007290300370300200241d0006a41106a2008290300370300200241d0006a41086a200929030037030020022002290300370350200241d0006a41286a200e290300370300200241d0006a41306a200d29030037030020024188016a200c29030037030020024190016a200b29030037030020024198016a200a290300370300200220022903203703702000200241d0006a41d000109a051a0c020b200041003602400c010b2001280200210702400240200628020022030d002004ad210f410021030c010b200741016a210720063301044220862004ad84210f0b2006102a200fa7210502400240200f422088a7220420032f01064f0d00200321060c010b034002400240200328020022060d002005ad210f410021060c010b200741016a210720033301044220862005ad84210f0b2003102a200fa7210520062103200f422088a7220420062f01064f0d000b0b200241186a2208200620044105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41286a220b2006200441306c6a22034190036a290300370300200241206a41206a220c20034188036a290300370300200241206a41186a220d20034180036a290300370300200241206a41106a220e200341f8026a290300370300200241206a41086a2210200341f0026a2903003703002002200341e8026a290300370320200441027420066a41fc066a280200210302402007417f6a2206450d00034020032802f80621032006417f6a22060d000b0b2001410036020c200120053602082001200336020420014100360200200241d0006a41186a2008290300370300200241d0006a41106a2009290300370300200241d0006a41086a200a290300370300200241d0006a41286a2010290300370300200241d0006a41306a200e29030037030020024188016a200d29030037030020024190016a200c29030037030020024198016a200b29030037030020022002290300370350200220022903203703702000200241d0006a41d000109a051a0b200241a0016a24000bbd0301057f230041106b2203240002400240024002400240200141046a2204417f4c0d000240024020040d00410121050c010b200410282205450d020b2003410036020820032004360204200320053602002001200310b4010240024020032802042206200328020822056b2001490d00200328020021040c010b200520016a22042005490d05200641017422072004200720044b1b22074100480d050240024020060d002007102821040c010b200328020020062007102c21040b2004450d032003200736020420032004360200200721060b200420056a20002001109a051a02400240200241046a2802002207200241086a28020022006b200520016a2201490d00200228020021050c010b200020016a22052000490d05200741017422002005200020054b1b22004100480d050240024020070d002000102821050c010b200228020020072000102c21050b2005450d0420022005360200200241046a2000360200200241086a28020021000b200241086a200020016a360200200520006a20042001109a051a02402006450d002004102a0b200341106a24000f0b1036000b200441011037000b200741011037000b200041011037000b1031000b880201057f230041d0006b220224000240411710282203450d00200341002900f1d8433700002003410f6a4100290080d943370000200341086a41002900f9d84337000020024297808080f002370224200220033602202000200241206a108f012002280228210320022802202100200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020002003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b2002200110e203200241d0006a24000f0b411741011037000b1000200028020020002802042001105f0baf0201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001103f21000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000b20024180016a240020000f0b20044180011044000b20044180011044000b130020004101360204200041cc9ac1003602000b130020004102360204200041849cc1003602000b3101017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241e8073600000b3101017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241e5003600000bd20903067f017e057f230041f0016b22022400024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a3602002005417f6a220541014b0d0520050e020102010b200041023a00000c050b20064104490d012004280001210720012003417b6a22053602042001200441056a36020020054108490d02200429000521082001200341736a36020420012004410d6a36020041002105200241003a00b001410d20036b2109200341726a210603400240200920056a0d000240200541ff0171450d00200241003a00b0010b200041023a00000c060b20024190016a20056a200420056a220a410d6a2d00003a0000200120063602042001200a410e6a3602002002200541016a220a3a00b0012006417f6a2106200a2105200a4120470d000b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a290300370300200220022903900137037041002105200241003a00d0012004200a6a2109200a20036b410d6a210a03400240200a20056a0d000240200541ff0171450d00200241003a00d0010b200041023a00000c060b20024190016a20056a200920056a2204410d6a2d00003a00002001200636020420012004410e6a3602002002200541016a22043a00d0012006417f6a210620042105200441c000470d000b200241106a41386a220120024190016a41386a290300370300200241106a41306a220520024190016a41306a290300370300200241106a41286a220620024190016a41286a290300370300200241106a41206a220420024190016a41206a290300370300200241106a41186a220a20024190016a41186a290300370300200241106a41106a220320024190016a41106a290300370300200241106a41086a220920024190016a41086a290300370300200241d0006a41086a220b200241f0006a41086a290300370300200241d0006a41106a220c200241f0006a41106a290300370300200241d0006a41186a220d200241f0006a41186a290300370300200220022903900137031020022002290370370350200041003a000020002002290350370001200041096a200b290300370000200041116a200c290300370000200041196a200d290300370000200041216a2002290310370000200041296a2009290300370000200041316a2003290300370000200041396a200a290300370000200041c1006a2004290300370000200041c9006a2006290300370000200041d1006a2005290300370000200041d9006a2001290300370000200041e3006a2002410f6a2d00003a0000200041e1006a20022f000d3b0000200041e8006a2008370300200041e4006a20073602000c040b0240024020064104490d002004280001210620012003417b6a22053602042001200441056a360200200541084f0d010b200041023a00000c040b200041013a0000200020022f00103b0001200429000521082001200341736a36020420012004410d6a360200200041086a2008370300200041046a2006360200200041036a200241126a2d00003a0000200041106a20024190016a41e000109a051a0c030b200041023a00000c020b200041023a00000c010b200041023a00000b200241f0016a24000be71207027f017e057f027e017f017e0a7f230041b0036b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241f0016a41086a2207200141086a280200360200200220012902003703f001024002400240024020002f01062201410b490d00200241d0026a410272410041da001099051a200241386a41004184011099051a0240024041e40110282208450d0020084100360200200841046a200241d0026a41dc00109a051a200841e0006a200241386a418401109a052107200241386a41086a2209200041b0016a280200360200200220002902a8013703382000413c6a330000210a2000413e6a310000210b20002d003f210c2000350038210d200841086a200041c0006a20002f010641796a2201410374109a05210e2007200041b4016a2001410c6c109a052107200041063b0106200820013b0106200241d0026a41086a2009280200360200200220022903383703d002200d200a200b4210868442208684210a0240024020034107490d002003410374200e6a41506a200e200341796a22094103746a220e200141ffff037120096b410374109b051a200e20043700002003410c6c20076a220341b87f6a200341ac7f6a2203200841066a22012f010020096b410c6c109b051a200341086a200241f0016a41086a280200360200200320022903f0013702000c010b200041086a20034103746a220741086a2007200041066a22012f010020036b410374109b051a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c109b051a200741086a200241f0016a41086a280200360200200720022903f0013702000b200120012f010041016a3b0100200241286a41086a220f200241d0026a41086a22102802002203360200200241086a221120033602002002200c3a0017200220022903d00222043703282002200a3e02102002200a4230883c00162002200a4220883d011420022004370300200229031021042000280200220c450d0320002f01042112200241d0026a410272211303402002200641016a22063602202002200c360224200f201128020036020020022002290300370328201241ffff03712109024002400240200c2f01062200410b490d002013410041da001099051a200241f0016a200241d0026a41dc00109a051a200241386a410041b4011099051a41940210282207450d0520074100360200200741046a200241f0016a41dc00109a051a200741e0006a200241386a41b401109a052103200c41386a290000210a200241386a41086a2214200c41b0016a2802003602002002200c41a8016a290200370338200741086a200c41c0006a200c2f0106220141796a2200410374109a0521152003200c41b4016a2000410c6c109a052116200741e4016a200c4180026a2001417a6a220e410274109a052117200c41063b0106200720003b01060240200e450d00410021002017210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b20102014280200220036020020022002290338220b3703d002201420003602002002200b370338201241ffff037122034107490d0120152009417a6a22034103746a2015200941796a22004103746a220120072f010620006b410374109b051a200120043700002009410c6c20166a220141b87f6a200141ac7f6a220120072f0106220e20006b410c6c109b051a200141086a200f280200360200200120022903283702002007200e41016a22013b01062009410274221220176a416c6a201720034102746a220e200141ffff0371220920036b410274109b051a200e200836020020092003490d02200720126a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320002009490d000c030b0b200c41086a2201200941016a22034103746a200120094103746a2201200020096b2207410374109b051a20012004370000200c2009410c6c6a220141ec006a200141e0006a220e2007410c6c109b051a200141e8006a200241286a41086a280200360200200e2002290328370200200c200041016a22003b01062009410274200c41e4016a22016a41086a200120034102746a2201200041ffff0371220720036b410274109b051a20012008360200201241ffff037120074f0d07200c2003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b01042001200c360200200341046a210320002007490d000c080b0b200c41086a2200200941016a220e4103746a200020094103746a2200200c2f0106220120096b2212410374109b051a20002004370000200c41e0006a2009410c6c6a2200410c6a20002012410c6c109b051a200041086a200f28020036020020002002290328370200200c200141016a22003b010620094102742217200c41e4016a22016a41086a2001200e4102746a2212200041ffff03712201200e6b410274109b051a20122008360200200320014f0d00200c20176a41e8016a2100034020002802002203200941016a22093b01042003200c360200200041046a210020012009470d000b0b200241106a41086a2014280200220036020020112000360200200220022903382204370310200220043703000240200c28020022000d0020072108200a21040c050b200c2f010421122000210c200a2104200721080c000b0b41e40141041037000b41940241041037000b200020034103746a220941106a200941086a2209200120036b410374109b051a2009200437000020002003410c6c6a220141ec006a200141e0006a220920002f010620036b410c6c109b051a200141e8006a2007280200360200200920022903f001370200200020002f010641016a3b01060c010b200241d0026a410272410041da001099051a200241f0016a200241d0026a41dc00109a051a200241386a410041b4011099051a41940210282200450d0120004100360200200041046a200241f0016a41dc00109a051a200041e0006a200241386a41b401109a0521012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f01062203410c6c6a22012002290300370200200020034103746a41086a2004370000200141086a200241086a280200360200200041e4016a200341016a22034102746a2008360200200020033b0106200820033b0104200820003602000b200241b0036a24000f0b41940241041037000b8b0303017f017e027f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d00410021034100210103402002417f6a210202400240200120002f01064f0d00200141016a21010c010b02400240200028020022010d002003ad210441002105410021010c010b20003301044220862003ad842104410121050b2000102a2004a72103024002402004422088a7220620012f01064f0d00200121000c010b034002400240200128020022000d002003ad2104410021000c010b200541016a210520013301044220862003ad8421040b2001102a2004a72103200021012004422088a7220620002f01064f0d000b0b200641027420006a4198036a280200210002402005417f6a2201450d00034020002802940321002001417f6a22010d000b0b410021010b20020d000b0b0240200041f8b9c000460d00200028020021012000102a2001450d00200128020021002001102a2000450d00024020002802002201450d0003402000102a2001210020012802002203210120030d000b0b2000102a0b0be480010d067f017e017f027e0b7f017e027f017e017f017e067f017e127f230041e0026b22012400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020004180c20370450d00200141e8006a21020c010b20014190026a41086a22034200370300200142003703900241f490c600411420014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a001200141e8006a4110200141a0016a100621030240024020012802a0012204417f460d0020030d010b200141e8006a21020c010b024002400240024002400240024020044104490d00200328000021042003102a200141e8006a21022004450d0720014190026a41086a22034200370300200142003703900241a9a2c100410f20014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a001200141e8006a4110200141a0016a100621030240024020012802a0012205417f460d002003450d0020012005360294022001200336029002200141a0016a20014190026a107d20012802a0012206450d0320012902a40121072005450d012003102a0c010b41042106420021070b20014190026a41086a22034200370300200142003703900241b8a2c100411420014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141a0016a200141e8006a10be020240024020012802a8012208450d002007422088a720012902ac012209422088a76b20012903a001220a422088a7220b6a2105200aa721032009a7450d012008102a0c010b2007422088a721054100210b10980121030b200520044f0d020c030b41c4d1c3004133200141d8026a419cd9c3001038000b41c4d1c3004133200141d8026a419cd9c3001038000b0240200b20044f0d00200b20046b22032007422088a722056a220420034f0d032006200441246c6a28022021030c010b20014190026a41086a22044200370300200142003703900241dca2c100411420014190026a1008200141e8006a41086a2004290300370300200120012903900237036841002105200141003602a001200141e8006a4110200141a0016a10062104024020012802a001220b417f460d002004450d00200b4104490d02200428000021052004102a0b200520036a21030b200341ffc1036a220320034180c203706b210302402007a7450d002006102a0b20032000470d0320014190026a41086a22034200370300200142003703900241a9a2c100410f20014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a001200141e8006a4110200141a0016a1006210302400240024020012802a0012204417f460d002003450d0020012004360294022001200336029002200141a0016a20014190026a107d20012802a001220c450d0220012902a401210a2004450d012003102a0c010b4104210c4200210a0b20014190026a41086a22034200370300200142003703900241f490c600411420014190026a1008200141e8006a41086a200329030037030020012001290390023703684100210d200141003602a001200141e8006a4110200141a0016a100621030240024020012802a0012204417f460d002003450d0020044104490d012003280000210d2003102a0b109801210e02400240200a422088a7220f41246c2204450d00200c41206a280200200e4d0d010b4101210b41002105410021060c050b200141a0016a41186a2203200c41186a290200370300200141a0016a41106a2205200c41106a290200370300200141a0016a41086a2206200c41086a2902003703002001200c2902003703a001024041201028220b450d00200b20012903a001370000200b41186a2003290300370000200b41106a2005290300370000200b41086a20062903003700000240200c41246a2203200c20046a470d0041012105410121060c060b200c200f41246c6a211041202108410121044101210503400240200341206a280200200e4d0d00200421060c070b200141b8026a41186a2211200341186a290200370300200141b8026a41106a2212200341106a290200370300200141b8026a41086a2213200341086a290200370300200120032902003703b8020240024020052004460d00200421060c010b200441016a22062004490d1e200441017422142006201420064b1b220641ffffff3f712006470d1e200641057422144100480d1e0240024020040d0020141028210b0c010b200b20044105742014102c210b0b200b0d00201441011037000b200b20086a220420012903b802370000200441186a2011290300370000200441106a2012290300370000200441086a2013290300370000200841206a2108200541016a2105200621042010200341246a2203460d060c000b0b412041011037000b41c4d1c3004133200141d8026a419cd9c3001038000b41c4d1c3004133200141d8026a419cd9c3001038000b41c4d1c3004133200141d8026a419cd9c3001038000b41cca2c100200420051034000b024002400240024002400240024002400240200d200f20056b22044d0d0020014190026a41086a22034200370300200142003703900241f0a2c100411c20014190026a1008200141e8006a41086a2003290300370300200120012903900237036841002108200141003602a001200141e8006a4110200141a0016a10062103024020012802a0012211417f460d002003450d0020114104490d02200328000021082003102a0b20014190026a41086a22034200370300200142003703900241b8a2c100411420014190026a1008200141e8006a41086a20032903003703002001200129039002370368410810282203450d0220014288808080c0003702a401200120033602a00120032008200e6a3600000240024020012802a401220820012802a80122036b4104490d0020012802a00121080c010b200341046a22112003490d20200841017422032011200320114b1b22034100480d200240024020080d002003102821080c010b20012802a00120082003102c21080b2008450d04200120033602a401200120083602a00120012802a80121030b2001200341046a3602a801200820036a200d20046b22133600002005200141a0016a10b40102402005450d0020054105742104200b210303402003200141a0016a108f01200341206a2103200441606a22040d000b0b20012802a4012103200141e8006a411020012802a001220420012802a801100702402003450d002004102a0b02402006450d00200b102a0b200141a8026a4200370300200141a0026a420037030020014198026a42003703002001420037039002201341066a220ead42307e2207422088a70d172007a72203417f4c0d170240024020030d0041082110410821040c010b200310282210450d05201021040b200141a0016a41186a221120014190026a41186a290300370300200141a0016a41106a221220014190026a41106a290300370300200141a0016a41086a20014190026a41086a29030037030020012001290390023703a001200e4102490d05200d20056a200f6b41056a2105200421030340200141b8026a41186a22062011290300370300200141b8026a41106a220b2012290300370300200141b8026a41086a2208200141a0016a41086a290300370300200120012903a0013703b8022003420037030820034200370300200341106a20012903b802370300200341186a2008290300370300200341206a200b290300370300200341286a2006290300370300200341306a21032005417f6a22050d000b201341056a21050c060b2006450d07200b102a0c070b41c4d1c3004133200141d8026a419cd9c3001038000b410841011037000b200341011037000b200341081037000b4100210520042103200e450d010b2003420037030820034200370300200320012903a001370310200341186a200141a8016a290300370300200341206a200141b0016a290300370300200341286a200141a0016a41186a290300370300200541016a21050b20014190026a41086a220342003703002001420037039002418ca3c100411320014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a801200142013703a0012005200141a0016a10b40102402005450d002004200541306c6a210b0340200441086a2903002107200429030021090240024020012802a401220520012802a80122036b4110490d0020012802a00121050c010b200341106a22062003490d1a200541017422032006200320064b1b22034100480d1a0240024020050d002003102821050c010b20012802a00120052003102c21050b2005450d05200120033602a401200120053602a00120012802a80121030b200520036a22052007370008200520093700002001200341106a3602a801200441106a200141a0016a108f01200441306a2204200b470d000b0b20012802a4012103200141e8006a411020012802a001220420012802a801100702402003450d002004102a0b0240200e450d002010102a0b200141083a00a001200141a0016a41086a2013360200200141023a00a40141014100200141a0016a10cc010b200aa7450d00200c102a0b20014190026a41086a22034200370300200142003703900241b8a2c100411420014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141a0016a200210be0220012802a8012215450d1820012902ac01211620012802a0012000470d1720014190026a41086a22034200370300200142003703900241b8a2c100411420014190026a1008200141e8006a41086a220020032903003703002001200129039002370368200141a0016a200210be02024020012802a80122170d0002402016a7450d002015102a0b41d5a3c100410f100b41e4a3c1004135100b0c190b20024110100920012802a401211820012902ac012119200342003703002001420037039002418ca3c100411320014190026a1008200020032903003703002001200129039002370368200141003602a00120024110200141a0016a100621030240024020012802a0012200417f460d002003450d0020012000360294022001200336029002200141a0016a20014190026a107820012802a001221a450d0320012902a401211b02402000450d002003102a0b2002411010090c010b4200211b4108211a0b109801211c20014190026a41086a22034200370300200142003703900241dca2c100411420014190026a1008200141e8006a41086a200329030037030020012001290390023703684100211d200141003602a00120024110200141a0016a10062103024020012802a0012200417f460d002003450d0020004104490d032003280000211d2003102a0b201a201b422088a7221e41306c6a210e0240024020180d004100211341002106410021000c010b2018417f6a2106410021000240201e450d000240201a201e41306c6a220341506a220e290300200e41086a2903008450450d00410121130c020b20014190026a41186a200341606a220341186a29000037030020014190026a41106a200341106a29000037030020014190026a41086a200341086a2900003703002001200329000037039002410121000b410021130b200141a9016a20014190026a41086a290300370000200141b1016a20014190026a41106a290300370000200141b9016a20014190026a41186a290300370000200120003a00a00120012001290390023700a101200141a0016a41017221032000450d0a20034280809aa6eaafe301420010aa02200141e8006a41086a200341086a290000370300200141e8006a41106a200341106a290000370300200141e8006a41186a200341186a2900003703002001200329000037036820012d00a0014101470d0b41201028221f450d03201f2001290368370000201f41186a200141e8006a41186a290300370000201f41106a200141e8006a41106a290300370000201f41086a200141e8006a41086a290300370000200141a0016a4101722103410221054120210441012120410121210340024002400240024020060d00410021060c010b2006417f6a2106201341ff01710d000240201a200e470d00410021130c010b200e41506a220b290300200b41086a290300844200520d0141012113200b210e0b200320012903b802370000200341086a200141b8026a41086a290300370000200341106a200141b8026a41106a290300370000200341186a200141b8026a41186a29030037000041002100200141003a00a0010c010b200141b8026a41186a200e41606a220041186a2900002207370300200141b8026a41106a200041106a2900002209370300200141b8026a41086a200041086a290000220a3703002001200029000022223703b80220032022370000200341086a200a370000200341106a2009370000200341186a2007370000200141013a00a00120034280809aa6eaafe301420010aa024100211320012d00a0012100200b210e0b20014190026a41186a220b200341186a29000037030020014190026a41106a2208200341106a29000037030020014190026a41086a2211200341086a29000037030020012003290000370390020240200041ff0171450d00200141a0016a41186a2212200b290300370300200141a0016a41106a220b2008290300370300200141a0016a41086a2208201129030037030020012001290390023703a001024020202021470d00202041016a22002020490d1820052000200520004b1b222141ffffff3f712021470d18202141057422004100480d180240024020200d0020001028211f0c010b201f20042000102c211f0b201f450d0c0b201f20046a220020012903a001370000200041186a2012290300370000200041106a200b290300370000200041086a2008290300370000200541026a2105200441206a2104202041016a21200c010b0b201f20046a21232020450d0c200141a0016a41086a2104201f210f0340200141306a200f10bf02024020012802304101470d002001280238210520014190016a10c002200128029001212402402001280298012203450d00200341216c2100202441016a21032005410876210841012005411f7174212520054105764107712211417f732126034002402003417f6a2d00004101470d00200141a0016a41186a200341186a290000370300200141a0016a41106a200341106a2900003703002004200341086a290000370300200120032900003703a001200120083602c00120014190026a200141a0016a10c1020240201120012802980222054f0d00200520266a220620054f0d0a200128029002220b20064102746a28020020257121050240200128029402450d00200b102a0b2005450d01411310282205450d0b200541002900c2a34122073700002005410f6a41002800d1a341220c360000200541086a41002900caa341220937000020014293808080b0023702a401200120053602a0012003200141a0016a108f0120012802a801211220012802a0012113200141b8026a41186a22054200370300200141b8026a41106a22064200370300200141b8026a41086a220b4200370300200142003703b80220132012200141b8026a1000200141106a41186a22102005290300370300200141106a41106a220d2006290300370300200141106a41086a2214200b290300370300200120012903b802370310024020012802a401450d0020012802a001102a0b200141003602a001200141106a4120200141a0016a1006210e024020012802a0012213417f460d00200120133602bc022001200e3602b802200141a0016a200141b8026a10c20220012903a0014201510d0d20014190026a41206a2227200441206a222828020036020020014190026a41186a2229200441186a222a29030037030020014190026a41106a222b200441106a222c29030037030020014190026a41086a2212200441086a222d290300370300200120042903003703900220012802cc01212e02402013450d00200e102a0b200141e8006a41206a20272802002213360200200141c0006a41086a220e2012290300370300200141c0006a41106a2227202b290300370300200141c0006a41186a222b2029290300370300200141c0006a41206a222920133602002001200129039002370340201242003703002001420037039002418891c600411120014190026a1008200141e8006a41086a20122903003703002001200129039002370368200141003602a00120024110200141a0016a1006211202400240024020012802a0012213417f470d00410021130c010b20134104490d01201228000021132012102a0b20042001290340370300202d200e290300370300202c2027290300370300202a202b29030037030020282029280200360200200142013703a0012001201341016a3602cc01411310282212450d10201220073700002012410f6a200c360000201241086a200937000020014293808080b002370294022001201236029002200320014190026a108f01200128029802211220012802900221132005420037030020064200370300200b4200370300200142003703b80220132012200141b8026a100020102005290300370300200d20062903003703002014200b290300370300200120012903b8023703100240200128029402450d00200128029002102a0b20014120360294022001200141106a36029002200420014190026a10c3020c030b41c4d1c3004133200141d8026a419cd9c3001038000b20042001290340370300200441086a200141c0006a41086a290300370300200441106a200141c0006a41106a290300370300200441186a200141c0006a41186a290300370300200441206a200141c0006a41206a280200360200200142003703a0012001202e3602cc01411310282212450d0d201220073700002012410f6a200c360000201241086a200937000020014293808080b002370294022001201236029002200320014190026a108f01200128029802211220012802900221132005420037030020064200370300200b4200370300200142003703b80220132012200141b8026a100020102005290300370300200d20062903003703002014200b290300370300200120012903b8023703100240200128029402450d00200128029002102a0b200141106a412010090c010b200128029402450d00200128029002102a0b200341216a21032000415f6a22000d000b0b200128029401450d002024102a0b2023200f41206a220f470d000c0d0b0b200341011037000b41c4d1c3004133200141d8026a419cd9c3001038000b41c4d1c3004133200141d8026a419cd9c3001038000b412041011037000b41cca2c100200620051034000b411341011037000b41c4d1c3004133200141d8026a419cd9c3001038000b411341011037000b411341011037000b200041011037000b200141e8006a41186a200341186a290000370300200141e8006a41106a200341106a290000370300200141e8006a41086a200341086a290000370300200120032900003703680b41002121410121234101211f410021200b20014190026a41086a22034200370300200142003703900241a9a2c100410f20014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a00120024110200141a0016a10062103024002400240024002400240024020012802a0012200417f460d002003450d0020012000360294022001200336029002200141a0016a20014190026a107d20012802a0012225450d0220012902a40121072000450d012003102a0c010b42002107410421250b20252007422088a7220841246c6a210d02402019422088a722050d004100212f41012130410021310c050b410021314100212f4101213002402005200d20256b41246e2203200320054b1b2203450d00200341057422004100480d0e200010282230450d022003212f0b20252103200521042030210003400240200d20036b41ec004b0d00200d2003460d062025200841246c6a21114101210b0240034020002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a2900003700002004200b2206460d01200641016a210b200041206a21002011200341246a2203470d000b0b203120066a21310c060b20002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000024020044101470d00203141017221310c060b20002003290024370020200041386a2003413c6a290000370000200041306a200341346a290000370000200041286a2003412c6a29000037000020044102460d0420002003290048370040200041d8006a200341e0006a290000370000200041d0006a200341d8006a290000370000200041c8006a200341d0006a29000037000020044103460d032000200329006c370060200041f8006a20034184016a290000370000200041f0006a200341fc006a290000370000200041e8006a200341f4006a290000370000203141046a213120004180016a210020034190016a21032004417c6a22040d000c050b0b41c4d1c3004133200141d8026a419cd9c3001038000b200041011037000b203141037221310c010b203141027221310b201d201c6a21262007a721270240024002400240024002402005450d00202521032008450d03200541016a2100200841246c2104202521030340200141b8026a41186a200341186a290200370300200141b8026a41106a200341106a290200370300200141b8026a41086a200341086a290200370300200120032902003703b8022000417f6a2200450d02200341246a21032004415c6a22040d000b200d21030c030b202521032008450d02200141a0016a41186a202541186a290200370300200141a0016a41106a202541106a290200370300200141a0016a41086a202541086a290200370300200120252902003703a001202541246a2103202528022021060c010b200341206a2802002106200141a0016a41186a200141b8026a41186a290300370300200141a0016a41106a200141b8026a41106a290300370300200141a0016a41086a200141b8026a41086a290300370300200120012903b8023703a001200341246a21030b20014190026a41186a200141a0016a41186a2200290300220737030020014190026a41106a200141a0016a41106a2204290300220937030020014190026a41086a200141a0016a41086a2205290300220a370300200120012903a00122223703900220002007370300200420093703002005200a370300200120223703a001417f200d20036b41246d22002023201f6b4105766a220420042000491b21054100210b200141a0016a2100201f21040c010b0240201f2023470d0002402027450d002025102a0b4100211c410421284100212c0c020b201f41086a2900002107201f41106a2900002109201f290000210a20014190026a41186a201f41186a290000222237030020014190026a41106a200937030020014190026a41086a20073703002001200a37039002200141a0016a41186a2022370300200141a0016a41106a2009370300200141a0016a41086a20073703002001200a3703a0012023201f41206a22046b41057621054102210b200141a0016a2100202621060b417f200541016a220820082005491b221cad42247e2207422088a70d012007a72205417f4c0d010240024002400240024002400240024020050d00410421280c010b200510282228450d010b20282000290200370200202841186a200041186a290200370200202841106a200041106a290200370200202841086a200041086a290200370200202820063602200240200b450d00024020042023470d004101212c0c050b200441086a2900002107200441106a29000021092004290000210a20014190026a41186a200441186a29000037030020014190026a41106a200937030020014190026a41086a20073703002001200a37039002200441206a21040c020b0240200d2003460d00200141a0016a41186a200341186a2902002209370300200141a0016a41106a200341106a290200220a370300200141a0016a41086a200341086a29020022223703002003290200210720014190026a41086a202237030020014190026a41106a200a37030020014190026a41186a2009370300200120073703a0012001200737039002200328022021134100210b200341246a21030c030b024020042023460d00200441086a2900002107200441106a29000021092004290000210a20014190026a41186a200441186a29000037030020014190026a41106a200937030020014190026a41086a20073703002001200a37039002200441206a21040c020b4101212c0c030b200541041037000b4102210b202621130b4102210641022100412421050340200141a0016a41186a220820014190026a41186a220e290300370300200141a0016a41106a221120014190026a41106a220c290300370300200141a0016a41086a221220014190026a41086a221029030037030020012001290390023703a00102402000222c417f6a2200201c470d000240024002400240200b41ff01710e03010200010b202320046b41057621140c020b417f200d20036b41246d2214202320046b4105766a220f200f2014491b21140c010b200d20036b41246d21140b2000417f201441016a220f200f2014491b6a22142000490d0e20062014200620144b1b221cad42247e2207422088a70d0e2007a722004100480d0e02400240202c4101470d002000102821280c010b202820052000102c21280b2028450d030b202820056a220020012903a001370200200041186a2008290300370200200041106a2011290300370200200041086a2012290300370200200041206a20133602000240024002400240200b41ff01710e03010200010b20042023460d04200441086a2900002107200441106a29000021092004290000210a200e200441186a290000370300200c2009370300201020073703002001200a37039002200441206a2104410121084102210b202621130c020b0240200d2003460d002008200341186a29020022093703002011200341106a290200220a3703002012200341086a29020022223703002003290200210720102022370300200c200a370300200e2009370300200120073703a001200120073703900220032802202113410121084100210b200341246a21030c020b4102210b024020042023470d00410021080c020b200441086a2900002107200441106a29000021092004290000210a200e200441186a290000370300200c2009370300201020073703002001200a37039002200441206a210441012108202621130c010b200d2003460d02200e200341186a290200370300200c200341106a2902003703002010200341086a2902003703002001200329020037039002200328022021134101210b200341246a2103410121080b200641026a2106202c41016a2100200541246a210520080d000b0b02402027450d002025102a0b202c4115490d01202c4101762232ad42247e2207422088a70d032007a72203417f4c0d0302400240024020030d004104212e410421080c010b20031028222e450d01202e21080b2028415c6a2133202841b47f6a21344104210c410021244100212641002113202c2125034020252106410021254101210502402006417f6a221d450d000240024002400240024002402028201d41246c6a41206a280200200641246c221220286a41586a2802002203490d002006417e6a2111203420126a210441002125410021000340024020112000470d00200621050c080b200041016a21002003200428020022054f210b2004415c6a210420052103200b0d000b200041016a21052000417f7320066a21040c010b203420126a2100201d210402400340024020044101470d00410021040c020b2004417f6a210420032000280200220549210b2000415c6a210020052103200b0d000b0b20062004490d012006202c4b0d03200620046b2205410176220b450d00203320126a21032028200441246c6a21000340200141a0016a41206a2211200041206a2212280200360200200141a0016a41186a220e200041186a2210290200370300200141a0016a41106a220d200041106a2214290200370300200141a0016a41086a220f200041086a2225290200370300200120002902003703a001200341206a22272802002129200341186a222a2902002107200341106a222b2902002109200341086a222d290200210a200020032902003702002025200a37020020142009370200201020073702002012202936020020272011280200360200202a200e290300370200202b200d290300370200202d200f290300370200200320012903a0013702002003415c6a2103200041246a2100200b417f6a220b0d000b0b024020040d00200421250c050b0240200541094d0d00200421250c050b2006202c4b0d012028200441246c6a2111034020062004417f6a2225490d040240200620256b22054102490d002028200441246c6a220041206a22032802002028202541246c6a221241206a220b280200220e4f0d00200141b8026a41186a2210201241186a220d290200370300200141b8026a41106a2214201241106a220f290200370300200141b8026a41086a2227201241086a2229290200370300200120122902003703b802201220002902003702002029200041086a290200370200200f200041106a290200370200200d200041186a290200370200200b2003280200360200024020054103490d00201d210b20112103201241e8006a280200200e4f0d000340200341206a200341c4006a280200360200200341186a2003413c6a290200370200200341106a200341346a290200370200200341086a2003412c6a2902003702002003200341246a22002902003702002004200b417f6a220b460d01200341e8006a2112200021032012280200200e490d000b0b200020012903b8023702002000200e360220200041186a2010290300370200200041106a2014290300370200200041086a20272903003702000b2025450d052011415c6a2111202521042005410a4f0d050c000b0b200420061044000b20062004417f6a2225490d010b2006202c103c000b202520061044000b02400240024020132024470d00202441016a22032024490d10202441017422002003200020034b1b220341ffffffff01712003470d10200341037422004100480d100240024020240d0020001028210c0c010b200c20244103742000102c210c0b200c450d0120032124202621130b200c20134103746a2203200536020420032025360200202641016a2213212620134102490d01024003400240024002400240200c2013417f6a22264103746a2203280200450d002013410374200c6a220541746a2802002204200328020422004d0d000240201341024b0d0020132126410221130c080b200c2013417d6a22104103746a2802042203200020046a4d0d010240201341034b0d0020132126410321130c080b200541646a280200200320046a4d0d01201321260c070b20134103490d0120032802042100200c2013417d6a22104103746a28020421030b20032000490d010b2013417e6a21100b0240024002400240024002402013201041016a22274b2229450d00201320104b222a450d01200c20104103746a220d280204222b200d2802006a2203200c20274103746a2214280200220f490d022003202c4b0d032028200f41246c6a22122014280204220e41246c22006a2106200341246c21042003200f6b220b200e6b2203200e4f0d04202e2006200341246c2200109a051a200820006a210502400240200e4101480d00200341014e0d010b20062103200821000c060b203320046a210420062103034020042003415c6a220b2005415c6a22112005417c6a2802002003417c6a2802004922061b2200290200370200200441206a200041206a280200360200200441186a200041186a290200370200200441106a200041106a290200370200200441086a200041086a2902003702002005201120061b210502402012200b200320061b2203490d00200821000c070b2004415c6a21042008210020082005490d000c060b0b41b8dbc000202720131034000b41b8dbc000201020131034000b200f20031044000b2003202c103c000b202e20122000109a051a200820006a210502400240200e4101480d00200b200e4a0d010b20122103200821000c010b202820046a211120082100201221030340200320062000200641206a280200200041206a28020049220b1b2204290200370200200341206a200441206a280200360200200341186a200441186a290200370200200341106a200441106a290200370200200341086a200441086a2902003702002000200041246a200b1b2100200341246a2103200641246a2006200b1b220620114f0d01200520004b0d000b0b20032000200520006b220420044124706b109a051a0240202a450d00200d200f360200200d41046a202b200e6a3602002029450d022014201441086a20132027417f736a410374109b051a20262113202641014d0d040c010b0b41c8dbc000201020131034000b41b0b1c0001032000b200041041037000b20250d000b02402024450d00200c102a0b2032450d03202e102a0c030b200341041037000b200041041037000b202c4102490d00202c417f6a21042028202c41246c6a21064100210b0340024002400240202c20042203417f6a2204490d00202c20046b22004102490d022028200341246c6a220341206a22052802002028200441246c6a220841206a221228020022114f0d02200141b8026a41186a2213200841186a220e290200370300200141b8026a41106a220c200841106a2210290200370300200141b8026a41086a220d200841086a2214290200370300200120082902003703b802200820032902003702002014200341086a2902003702002010200341106a290200370200200e200341186a2902003702002012200528020036020020004103490d01200b210520062100200841e8006a28020020114f0d01034020002203415c6a22002003290200370200200041206a200341206a280200360200200041186a200341186a290200370200200041106a200341106a290200370200200041086a200341086a2902003702002005417f6a2205450d02200341246a2100200341c4006a28020020114f0d020c000b0b2004202c1044000b200320012903b80237020020032011360220200341186a2013290300370200200341106a200c290300370200200341086a200d2903003702000b200b41016a210b2006415c6a210620040d000b0b20014190026a41086a22034200370300200142003703900241a9a2c100410f20014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a801200142013703a001202c200141a0016a10b4010240202c450d002028202c41246c6a210b2028210003402000200141a0016a108f01200041206a28020021050240024020012802a401220420012802a80122036b4104490d0020012802a00121040c010b200341046a22062003490d0b200441017422032006200320064b1b22034100480d0b0240024020040d002003102821040c010b20012802a00120042003102c21040b2004450d04200120033602a401200120043602a00120012802a80121030b2001200341046a3602a801200420036a2005360000200b200041246a2200470d000b0b20012802a40121032002411020012802a001220020012802a801100702402003450d002000102a0b202c41246c220341246d2106410021040240024020030d004101210b410021060c010b200641ffffff3f712006470d09200641057422034100480d0920031028220b450d030b0240202c450d00202c41246c210541002104200b2103202821000340200041086a2900002107200041106a29000021092000290000210a200341186a200041186a290000370000200341106a2009370000200341086a20073700002003200a370000200441016a2104200341206a2103200041246a21002005415c6a22050d000b0b0240201c450d002028102a0b200b2004410041202004676b10c40220302031200b200410c50202402006450d00200b102a0b20014190026a41086a22034200370300200142003703900241b0a3c100411220014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a00120024110200141a0016a100621030240024020012802a0012200417f460d002003450d0020012000360294022001200336029002200141a0016a20014190026a106d20012802a0012208450d0520012902a401210a2000450d012003102a0c010b4200210a410121080b200141b8016a4200370300200141b0016a4200370300200141a8016a4200370300200142003703a001200a422088a7221041ffffff3f712010470d0020104105742203417f4c0d000240024020030d00410121060c010b200310282206450d050b200141b8026a41186a2204200141a0016a41186a290300370300200141b8026a41106a2205200141a0016a41106a290300370300200141b8026a41086a220b200141a0016a41086a290300370300200120012903a0013703b80220104102490d052010417f6a2100200621030340200320012903b802370000200341186a2004290300370000200341106a2005290300370000200341086a200b290300370000200341206a21032000417f6a22000d000b2010417f6a210c0c060b1036000b200341011037000b200341011037000b41c4d1c3004133200141d8026a419cd9c3001038000b200341011037000b4100210c200621032010450d010b200320012903b802370000200341186a200141b8026a41186a290300370000200341106a200141b8026a41106a290300370000200341086a200141b8026a41086a290300370000200c41016a210c0b201a201e41306c6a2103201ba7210e410021140c010b1031000b0240024002400240034002402018450d002003201a460d02200341506a2203290300200341086a29030084500d022018417f6a2200450d000340201a2003460d03200341506a2203290300200341086a29030084500d032000417f6a22000d000b0b2003201a460d0102400340200341506a22042903002107200441086a290300210920014190026a41186a2205200341606a220041186a29030037030020014190026a41106a220b200041106a29030037030020014190026a41086a2211200041086a29030037030020012000290300370390022007200984500d01200141a0016a41186a22002005290300370300200141a0016a41106a2205200b290300370300200141a0016a41086a220b201129030037030020012001290390023703a00120014190016a200141a0016a10bf02200141c0006a41186a22112000290300370300200141c0006a41106a22122005290300370300200141c0006a41086a2213200b290300370300200120012903a00137034002402001280290014101460d0020042103201a2004470d010c040b0b200141106a41086a220d2013290300370300200141106a41106a22132012290300370300200141106a41186a221220112903003703002001200129034022073703b8022001200737031020012802980121042000201229030037030020052013290300370300200b200d290300370300200120012903103703a001200c20044d0d03200341506a2103200620044105746a220420012903a001370000200441186a2000290300370000200441106a2005290300370000200441086a200b290300370000201441016a2114410021180c010b0b200141b8026a41086a200141e8006a41086a290300370300200141b8026a41106a200141e8006a41106a290300370300200141b8026a41186a200141e8006a41186a290300370300200120012903683703b8020b0240200e450d00201a102a0b200c201041ffffff3f7122032003200c4b1b2211450d022008210b410021050340024020082006460d002008200541057422036a2200200620036a4120109c05450d00411610282203450d0320034100290093a2413700002003410e6a41002900a1a241370000200341086a410029009ba24137000020014296808080e0023702a401200120033602a0012000200141a0016a108f0120012802a801210320012802a0012104200141b8026a41186a22124200370300200141b8026a41106a22134200370300200141b8026a41086a220e4200370300200142003703b80220042003200141b8026a1000200141106a41186a2012290300370300200141106a41106a2013290300370300200141106a41086a200e290300370300200120012903b802370310024020012802a401450d0020012802a001102a0b200141106a41201009201f210303400240202320036b41e0004b0d00024020032023460d000340200b2003460d04200320004120109c05450d042023200341206a2203470d000b0b200120004280809aa6eaafe3014200108202200129030021072001200141086a2903003703a801200120073703a0012001200141a0016a3602900220014190026a109d010c020b20002003460d01200320004120109c05450d01200341206a22042000460d01200420004120109c05450d01200341c0006a22042000460d01200420004120109c05450d01200341e0006a22042000460d0120034180016a2103200420004120109c050d000b0b200b41206a210b200541016a22052011490d000c030b0b41a0a3c1002004200c1034000b411641011037000b2006200c4105746a2103200c2111024002400240200c4104490d00200141a0016a41206a2112200141e0016a2113200141a0016a41e0006a210e200141a0026a210d200141b8016a2104200141b0016a2105200141a8016a210b20032100200c211103402004420037030020054200370300200b4200370300200142003703a001024020122000460d00200041606a200141a0016a4120109c05450d002011417f6a21000c030b2004420037030020054200370300200b4200370300200142003703a001024020132000460d00200041406a200141a0016a4120109c05450d002011417e6a21000c030b2004420037030020054200370300200b4200370300200142003703a0010240200e2000460d00200041a07f6a200141a0016a4120109c05450d002011417d6a21000c030b2004420037030020054200370300200b4200370300200142003703a001200041807f6a210302400240200d2000460d002003200141a0016a4120109c050d010b2011417c6a211120032100200320066b41e0004b0d010c020b0b2011417c6a21000c010b20032006460d012011417f6a2100200141a0016a41206a2104200141b8016a2105200141b0016a210b200141a8016a2111034020054200370300200b420037030020114200370300200142003703a001024020042003460d00200341606a200141a0016a4120109c050d020b2000417f6a21002006200341606a2203470d000c020b0b200041016a210c0b200141bc016a2031360200200141b8016a202f360200200141b4016a2030360200200141a0016a41106a2020360200200141ac016a2021360200200141083a00a001200141a0016a41086a201f360200200141033a00a40141014100200141a0016a10cc0120014190026a41086a22034200370300200142003703900241b0a3c100411220014190026a1008200141e8006a41086a20032903003703002001200129039002370368200141003602a801200142013703a001200c200141a0016a10b4010240200c450d00200c41057421002006210303402003200141a0016a108f01200341206a2103200041606a22000d000b0b20012802a40121032002411020012802a001220020012802a801100702402003450d002000102a0b02402010450d002006102a0b20014190026a41086a22034200370300200142003703900241bf91c600411620014190026a1008200141e8006a41086a220020032903003703002001200129039002370368200120143602a00120024110200141a0016a41041007200342003703002001420037039002418891c600411120014190026a1008200020032903003703002001200129039002370368200141003602a00120024110200141a0016a100621030240024020012802a0012200417f470d00410121030c010b024020030d00410121030c010b20004104490d03200328000021002003102a200041016a21030b20014190026a41086a220042003703002001420037039002418891c600411120014190026a1008200141e8006a41086a20002903003703002001200129039002370368200120033602a00120024110200141a0016a410410070240200aa7450d002008102a0b2019a7450d002017102a0b2016a7450d002015102a0b200141e0026a24000f0b41c4d1c3004133200141d8026a419cd9c3001038000bef0101047f230041206b220224002002410036021020014110200241106a10062101024002400240024020022802102203417f460d0020010d010b200041003602080c010b200220013602082002200336020c20034104490d012002200141046a36020820022003417c6a220436020c20044104490d01200128000021042002200341786a36020c2002200141086a36020820012800042103200241106a200241086a106d20022802102205450d012000200229021437020c2000200536020820002003360204200020043602002001102a0b200241206a24000f0b41c4d1c3004133200241106a419cd9c3001038000bb70201057f230041d0006b220224000240411610282203450d0020034100290093a2413700002003410e6a41002900a1a241370000200341086a410029009ba24137000020024296808080e002370224200220033602202001200241206a108f012002280228210320022802202101200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020012003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b200241306a2002412010c6020240024020022802304101460d00200041003602000c010b20002002290234370204200041013602000b200241d0006a24000f0b411641011037000ba50708027f017e047f027e017f017e037f017e230041d0006b220124000240024002400240024002400240410e10282202450d00200241066a41002900b2a441370000200241002900aca4413700002002410e411c102c2202450d012002410036000e42002103200141286a41186a22044200370300200141286a41106a22054200370300200141286a41086a220642003703002001420037032820024112200141286a1000200141186a2004290300370300200141106a2005290300370300200141086a2006290300370300200120012903283703002002102a2001410036022820014120200141286a100621040240024020012802282202417f470d00410121070c010b2001200236022420012004360220200141286a200141206a107420012802282207450d03200129022c21032002450d002004102a0b02400240410e10282202450d0041002900b2a441210841002900aca4412109410121040340200241066a2008370000200220093700002002410e411c102c2202450d062002200436000e200141286a41186a22054200370300200141286a41106a22064200370300200141286a41086a220a42003703002001420037032820024112200141286a1000200141186a2005290300370300200141106a2006290300370300200141086a200a290300370300200120012903283703002002102a2001410036022820014120200141286a100621060240024020012802282202417f470d00410121054200210b0c010b2001200236022420012006360220200141286a200141206a107420012802282205450d08200129022c210b2002450d002006102a0b200b422088a72206450d0202402003a7220a2003422088a722026b200641216c220c41216d22064f0d00200220066a220d2002490d0a200a410174220e200d200e200d4b1bad220342217e220f422088a70d0a200fa7220d4100480d0a02400240200a0d00200d102821070c010b2007200a41216c200d102c21070b2007450d090b2007200241216c6a2005200c109a051a200342ffffffff0f832103200220066aad422086210f0240200ba7450d002005102a0b200441016a21042003200f842103410e102822020d000b0b410e41011037000b0240200ba7450d002005102a0b2000200337020420002007360200200141d0006a24000f0b410e41011037000b411c41011037000b41c4d1c3004133200141c8006a419cd9c3001038000b411c41011037000b41c4d1c3004133200141c8006a419cd9c3001038000b200d41011037000b1031000bcc0402057f017e230041e0006b220224000240024002400240411310282203450d0020034100290099a4413700002003410f6a41002800a8a441360000200341086a41002900a1a44137000020024293808080b00237022c200220033602282001200241286a108f012001280220210402400240200228022c2201200228023022036b4104490d00200228022821010c010b200341046a22052003490d03200141017422032005200320054b1b22034100480d030240024020010d002003102821010c010b200228022820012003102c21010b2001450d022002200336022c20022001360228200228023021030b2002200341046a360230200120036a20043600002002280230210320022802282101200241386a41186a22044200370300200241386a41106a22054200370300200241386a41086a220642003703002002420037033820012003200241386a1000200241086a41186a2004290300370300200241086a41106a2005290300370300200241086a41086a2006290300370300200220022903383703080240200228022c450d002002280228102a0b20024100360238200241086a4120200241386a100621010240024020022802382203417f460d002002200336022c20022001360228200241386a200241286a10820120022802382204450d05200229023c210702402003450d002001102a0b20002007370204200020043602000c010b20004100360208200042043702000b200241e0006a24000f0b411341011037000b200341011037000b1031000b41c4d1c3004133200241d8006a419cd9c3001038000bf70103017e057f027e420121020240200128020422034104490d0020012802002204280000210520012003417c6a22063602042001200441046a360200200641034d0d00200428000421072001200341786a22063602042001200441086a36020020064110490d00200441106a2900002108200429000821092001200341686a22063602042001200441186a36020020064110490d0020002009370308200041186a2004290018370300200041106a20083703002000412c6a2007360200200041286a2005360200200041206a200441206a2900003703002001200341586a3602042001200441286a360200420021020b200020023703000bd30102027f027e200028022021020240024002400240410410282203450d002003200236000020002802242102200341044108102c2203450d0120032002360004200041086a290300210420002903002105200341084118102c2203450d0220032005370008200341106a2004370000200041186a290300210420002903102105200341184130102c2200450d0320002005370018200041206a2004370000200128020020012802042000412810072000102a0f0b410441011037000b410841011037000b411841011037000b413041011037000b942103157f037e077f230041c0026b220424000240024020014115490d0041012105410121060240024002400340200121072000210820052006714101732109024002400240024002400240034002400240024002402003450d00024020054101710d002000200110da032003417f6a21030b2001410276220a41036c210b200a410174210c4100210d024020014132490d00200a200a417f6a220d2000200a4105746a2000200d4105746a4120109c05220e410048220f1b2210200a41016a2211200d200a200f1b220a200020114105746a2000200a4105746a4120109c05220f4100481b220a2000200a4105746a200020104105746a4120109c0522104100481b210a200c200c417f6a220d2000200c4105746a2000200d4105746a4120109c05221141004822121b2213200c4101722214200d200c20121b220c200020144105746a2000200c4105746a4120109c0522124100481b220c2000200c4105746a200020134105746a4120109c0522134100481b210c200b200b417f6a220d2000200b4105746a2000200d4105746a4120109c05221441004822151b2216200b41016a2217200d200b20151b220b200020174105746a2000200b4105746a4120109c05220d4100481b220b2000200b4105746a200020164105746a4120109c0522154100481b210b200f411f76200e411f766a2010411f766a2011411f766a2012411f766a2013411f766a2014411f766a200d411f766a2015411f766a210d0b2000200c4105746a2000200a4105746a4120109c05220e411f76200d6a2000200b4105746a2000200a200c200e410048220e1b220f4105746a4120109c052210411f766a210d2000200b200f20104100481b220b4105746a2000200c200a200e1b22184105746a4120109c05417f4c0d01200b21180c020b2000200110db030c0f0b200d41016a220d410c490d0002402001410176220b450d00200020014105746a41606a210a2000210c0340200441206a41186a220d200c41186a220e290000370300200441206a41106a220f200c41106a2210290000370300200441206a41086a2211200c41086a22122900003703002004200c290000370320200a41086a22132900002119200a41106a2214290000211a200a41186a2215290000211b200c200a290000370000200e201b3700002010201a370000201220193700002015200d2903003700002014200f29030037000020132011290300370000200a2004290320370000200a41606a210a200c41206a210c200b417f6a220b0d000b0b20012018417f736a21184101210a0c010b200d45210a0b0240200a452009724101710d002000200110dc030d0d0b2002450d02201820014f0d0102402002200020184105746a220a4120109c0541004e0d0020002108200121070c040b200441206a41186a2212200041186a220f290000370300200441206a41106a2213200041106a2210290000370300200441206a41086a2214200041086a221129000037030020042000290000370320200a41086a220c2900002119200a41106a220b290000211a200a41186a220d290000211b2000200a290000370000200f201b3700002010201a37000020112019370000200d2012290300370000200b2013290300370000200c2014290300370000200a2004290320370000200441c0016a41186a2217200f290000370300200441c0016a41106a221c2010290000370300200441c0016a41086a22182011290000370300200420002900003703c001200041606a2115200041206a21164100210c2001210b03400240200c200b417f6a220d4f0d002016200c4105746a210a0340200441c0016a200a4120109c05417f4c0d01200a41206a210a200d200c41016a220c470d000b200d210c0b2015200b4105746a210a02400340200c200b417f6a220b4f0d01200441c0016a200a4120109c05210d200a41606a220e210a200d4100480d000b20122016200c4105746a220a41186a220d2900003703002013200a41106a221d2900003703002014200a41086a22062900003703002004200a290000370320200e41286a221e2900002119200e41306a221f290000211a200e41386a2220290000211b200a200e41206a220e290000370000200d201b370000201d201a3700002006201937000020202012290300370000201f2013290300370000201e2014290300370000200e2004290320370000200c41016a210c0c010b0b200020042903c001370000200f20172903003700002010201c2903003700002011201829030037000002402001200c41016a220a490d002000200a4105746a21002001200a6b220141154f0d010c0c0b0b200a20011044000b41a0cec300201820011034000b2007450d010b201820074f0d01200441206a41186a2216200841186a221e290000370300200441206a41106a2217200841106a221f290000370300200441206a41086a221c200841086a222029000037030020042008290000370320200820184105746a220a41086a220c2900002119200a41106a220b290000211a200a41186a220d290000211b2008200a290000370000201e201b370000201f201a37000020202019370000200d2016290300370000200b2017290300370000200c201c290300370000200a2004290320370000200441186a2205201e290000370300200441106a2209201f290000370300200441086a2221202029000037030020042008290000370300200841206a21014100211d2007417f6a220d450d022001210a0340200a20044120109c0541004e0d03200a41206a210a200d201d41016a221d470d000b200d211d0c020b4180cec300410041001034000b4190cec300201820071034000b200820074105746a210c200d210b02400340200c2100200b220a201d4d22060d01200a417f6a210b200041606a220c20044120109c05417f4a0d000b0b0240200a201d490d00200d200a490d0241800121144100210e410021124100210d4100211141800121152001201d4105746a2222210103400240200020016b220a419fc0004b22180d00200a410576220a41807f6a200a2012200e492011200d49220c72220b1b210a0240200b450d002015200a200c1b2115200a2014200c1b21140c010b200a200a41017622156b21140b02402011200d470d00024020150d00200441c0006a220d21110c010b4100210a200441c0006a2211210d2001210c0340200d200a3a0000200d200c20044120109c05417f73411f766a210d200c41206a210c2015200a41016a220a470d000b0b02402012200e470d00024020140d00200441c0016a220e21120c010b200041606a210a4100210c200441c0016a2212210e0340200e200c3a0000200e200a20044120109c05411f766a210e200a41606a210a2014200c41016a220c470d000b0b0240200e20126b220a200d20116b220c200c200a4b1b2213450d002016200120112d00004105746a220a41186a2900003703002017200a41106a290000370300201c200a41086a2900003703002004200a290000370320200120112d00004105746a220a200020122d0000417f734105746a220c290000370000200a41186a200c41186a290000370000200a41106a200c41106a290000370000200a41086a200c41086a290000370000024020134101460d004100210a034020002012200a6a220f2d0000417f734105746a220c20012011200a6a41016a22102d00004105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200120102d00004105746a220c2000200f41016a2d0000417f734105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200a41026a210c200a41016a220b210a200c2013490d000b2012200b6a21122011200b6a21110b200020122d0000417f734105746a220a2004290320370000200a41186a2016290300370000200a41106a2017290300370000200a41086a201c290300370000201241016a2112201141016a21110b200020144105746b20002012200e461b2100200120154105746a20012011200d461b210120180d000b024002402011200d4f0d002000210a034020162001200d417f6a220d2d00004105746a220c41186a220b2900003703002017200c41106a220e290000370300201c200c41086a22002900003703002004200c290000370320200a41606a220a41086a220f2900002119200a41106a2210290000211a200a41186a2212290000211b200c200a290000370000200b201b370000200e201a370000200020193700002012201629030037000020102017290300370000200f201c290300370000200a20042903203700002011200d490d000c020b0b2001210a2012200e4f0d000340200e417f6a220e2d0000210c2016200a41186a220b2900003703002017200a41106a220d290000370300201c200a41086a22012900003703002004200a2900003703202000200c417f734105746a220c41086a220f2900002119200c41106a2210290000211a200c41186a2211290000211b200a200c290000370000200b201b370000200d201a370000200120193700002011201629030037000020102017290300370000200f201c290300370000200c2004290320370000200a41206a210a2012200e490d000b0b20082004290300370000201e2005290300370000201f2009290300370000202020212903003700002007200a20226b410576201d6a22014d0d032016201e2900003703002017201f290000370300201c202029000037030020042008290000370320200820014105746a220a41086a220c2900002119200a41106a220b290000211a200a41186a220d290000211b2008200a290000370000201e201b370000201f201a37000020202019370000200d2016290300370000200b2017290300370000200c201c290300370000200a2004290320370000200720016b220c450d04200c20012001200c4b1b210b2007410376210d200a41206a2100024002402001200c417f6a220c490d002000200c200a200310c402200821000c010b200820012002200310c402200a2102200c21010b200b200d4f2105200141154f0d010c050b0b201d200a1044000b200a200d103c000b4190cec300200120071034000b41dc83c6001032000b20014102490d00200041406a210f410021104101210d0340200d410574210a200d417f6a210b200d41016a210d02402000200a6a220e2000200b4105746a220a4120109c05417f4a0d00200441c0016a41186a2211200e41186a220c290000370300200441c0016a41106a2212200e41106a2213290000370300200441c0016a41086a2214200e41086a22152900003703002004200e2900003703c001200e200a2900003700002015200a41086a2900003700002013200a41106a290000370000200c200a41186a29000037000002400240200b0d004100210b0c010b2010210c200f210a200441c0016a200e41406a4120109c05417f4a0d0002400340200a41d8006a200a41386a290000370000200a41d0006a200a41306a290000370000200a41c8006a200a41286a290000370000200a41c0006a200a41206a290000370000200c4101460d01200441c0016a200a4120109c05210e200c417f6a220b210c200a41606a210a200e4100480d000c020b0b4100210b0b2000200b4105746a220a20042903c001370000200a41186a2011290300370000200a41106a2012290300370000200a41086a20142903003700000b201041016a2110200f41206a210f200d2001470d000b0b200441c0026a24000bd9140a057f017e067f037e037f017e017f027e077f057e23002204210520044180026b4160712204240002400240200141ffffff3f712001470d0020014105742206417f4c0d0002400240024020060d00410121070c010b200610282207450d010b410021084100210602402001450d002001410574210820072106034020062000290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a290000370000200641206a2106200041206a2100200841606a22080d000b200141057441606a41057641016a2106200121080b20042006360218200420083602142004200736021020072006410041202006676b10c40242002109200441b0016a41086a22004200370300200442003703b001419896c300411d200441b0016a1008200441e0016a41086a2000290300370300200420042903b0013703e001200441003602b001200441e0016a4110200441b0016a1006210602400240024020042802b0012200417f460d0020042000360294012004200636029001200441b0016a20044190016a106d20042802b001220a450d0220042902b40121092000450d012006102a0c010b4101210a0b2009422088a72200450d032000410574210b200441e0016a410c6a210c200441e0016a411472210d200441e0016a410872210e200441c0006a410c72210f200a210002400340200041086a2900002110200041106a290000211120002900002112200441206a41186a2213200041186a290000370300200441206a41106a22142011370300200441206a41086a22152010370300200420123703200240024002400240411a10282206450d00200641002900b596432216370000200641186a41002f00cd964322173b0000200641106a41002900c596432218370000200641086a41002900bd964322193700002004429a808080a0033702b401200420063602b0012004200441b0016a3602e001200441206a200441e0016a10c80120042802b001210720042802b801211a200441e0016a41186a22014200370300200441e0016a41106a22064200370300200441e0016a41086a22084200370300200442003703e0012007201a200441e0016a100020044190016a41186a221b200129030037030020044190016a41106a221c200629030037030020044190016a41086a221a2008290300370300200420042903e00137039001024020042802b401450d0020042802b001102a0b200441003602e00120044190016a4120200441e0016a1006211d20042802e0012207417f460d02200420073602642004201d360260200441e0016a200441e0006a10b30320042802e801221e450d01200441b0016a41086a221f200c41086a290200370300200441b0016a41106a2220200c41106a2802003602002004200c2902003703b00120042903e001211002402007450d00201d102a0b200f20042903b00122113702002006202028020022073602002008201f2903002212370300200f41086a2012370200200f41106a2007360200200420113703e001200420103703400c030b411a41011037000b41c4d1c3004133200441d0016a419cd9c3001038000b2006200441b0016a41106a2802003602002008200441b0016a41086a290300370300200420042903b0013703e0014100211e0b2004201e360248200441003602e80120042903582112200420042903f801222137035820042903502122200420042903f001222337035020042903402124200420042903e001221137034020042903482110200420042903e80122253703482025a72107024002402010a7221d0d002025211020232122202121120c010b200420243703e001200420103703e801200420223703f001200420123703f8012004201d2022a74105746a3602bc012004201d3602b80120042010422088a73602b4012004201d3602b0012004200441106a3602c00120044190016a200441b0016a108401200e41086a201a280200360200200e20042903900137020020042022422088a7221d2012422088a74105746a3602bc012004201d3602b80120042012a73602b4012004201d3602b0012004200441106a3602c00120044190016a200441b0016a108401200d41086a201a280200360200200d20042903900137020020042903e801211020042903e001211120042903f801211220042903f001212202402007450d002021a7211d02402025422088a7450d002007102a0b201d450d002023422088a7102a0b200420113703402004201037034820042022370350200420123703582010a721070b2004201137036020042010370368200420223703702004201237037802400240024020070d00200441b0016a41186a2013290300370300200441b0016a41106a2014290300370300200441b0016a41086a2015290300370300200420042903203703b001411a10282207450d0220072016370000200741186a20173b0000200741106a2018370000200741086a20193700002004429a808080a0033702d401200420073602d0012004200441d0016a3602e001200441b0016a200441e0016a10c80120042802d001210720042802d801211d200142003703002006420037030020084200370300200442003703e0012007201d200441e0016a1000201b2001290300370300201c2006290300370300201a2008290300370300200420042903e00137039001024020042802d401450d0020042802d001102a0b20044190016a412010090c010b200441b0016a41186a2013290300370300200441b0016a41106a2014290300370300200441b0016a41086a2015290300370300200420042903203703b001411a10282207450d0320072016370000200741186a20173b0000200741106a2018370000200741086a20193700002004429a808080a0033702d401200420073602d0012004200441d0016a3602e001200441b0016a200441e0016a10c80120042802d001210720042802d801211d200142003703002006420037030020084200370300200442003703e0012007201d200441e0016a1000201b2001290300370300201c2006290300370300201a2008290300370300200420042903e00137039001024020042802d401450d0020042802d001102a0b200441203602e401200420044190016a3602e001200441e0006a200441e0016a10b4030b02402010a72206450d002012a7210802402010422088a7450d002006102a0b2008450d002022422088a7102a0b200041206a2100200b41606a220b0d010c060b0b411a41011037000b411a41011037000b41c4d1c3004133200441d0016a419cd9c3001038000b200641011037000b1036000b02402009a7450d00200a102a0b200441003602e801200442013703e0012003200441e0016a10b40102402003450d002003410574210003402002200441e0016a108f01200241206a2102200041606a22000d000b0b20042802e401210620042802e801210820042802e0012100200441b0016a41086a22014200370300200442003703b00141fbefc200411b200441b0016a1008200441e0016a41086a2001290300370300200420042903b0013703e001200441e0016a411020002008100702402006450d002000102a0b02402004280214450d002004280210102a0b200524000ba50101027f230041206b22032400410021042003410036021420012002200341146a100621010240024020032802142202417f460d002001450d002003410036020c20024104490d0120012800002104200341003602102002417c714104460d01200128000421022001102a200041086a200236020020002004360204410121040b20002004360200200341206a24000f0b41c4d1c3004133200341186a419cd9c3001038000b13002000410a36020420004188a5c1003602000b3400200041fecbc10036020420004100360200200041146a4110360200200041106a4188ccc100360200200041086a42073702000b3001017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241003600000b2201017f230041106b22022400200241003602002000200210ad02200241106a24000b13002000410b360204200041c0e5c1003602000b3101017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241c0003600000b3d01017f02404110102822020d00411041011037000b200242003700082002428080e983b1de16370000200042908080808002370204200020023602000b3201017f02404104102822020d00410441011037000b20004284808080c0003702042000200236020020024180c2033600000b3001017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241013600000b3001017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241063600000b3d01017f02404110102822020d00411041011037000b200242003700082002428080d287e2bc2d370000200042908080808002370204200020023602000b3e01017f02404110102822020d00411041011037000b2002420037000820024280809aa6eaafe301370000200042908080808002370204200020023602000b9f0a01047f230041206b220224000240024002400240024002400240024002400240024002400240024002402001280200417f6a220341094b0d0020030e0a0102030405060708090a010b41c4f7c1001032000b2001410c6a2802002203417f4c0d0a200128020421044101210502402003450d00200310282205450d0c0b200520042003109a0521052000410c6a2003360200200041086a20033602002000200536020420004101360200200041206a200141206a290300370300200041186a2001290318370300200041106a20012902103703000c090b2001410c6a2802002203417f4c0d09200128020421050240024020030d00410121040c010b200310282204450d0c0b200420052003109a0521052000410c6a2003360200200041086a20033602002000200536020420004102360200200041206a200141206a290300370300200041186a2001290318370300200041106a20012902103703000c080b200128020421054101210302400240200141086a22042d00004101460d002002411e6a200441036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220042f00013b011c2002200141106a2902003703002001410c6a2802002104410021030c010b2001410c6a28020021040b20002005360204200020022f011c3b0009200041086a20033a00002000410c6a2004360200200041106a20022903003702002000412c6a200129022c3702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a280200360200200041033602000c070b20004104360200200020012802043602040c060b20004105360200200020012802043602040c050b410121030240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021030c010b200141086a28020021050b200020033a0004200020022f011c3b0005200041306a2001290330370300200041086a20053602002000410c6a2002290300370200200041386a200141386a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602002001280228210120004106360200200041286a20013602000c040b20004107360200200020012802043602040c030b410121030240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030c010b200141086a28020021010b200020033a0004200020022f011c3b000520004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000c020b20004109360200200020012802043602040c010b2000410a360200200020012802043602040b200241206a24000f0b1036000b200341011037000b200341011037000bbf4305047f027e037f017e067f23004190026b22072400200741f0006a41086a220842003703002007420037037041b0a3c1004112200741f0006a1008200741a0016a41086a2008290300370300200720072903703703a0014100210920074100360270200741a0016a4110200741f0006a1006210802402007280270220a417f460d002008450d002007200a36027420072008360270200741306a200741f0006a106c0240024020072802300d00200728023421090c010b410021090b200a450d002008102a0b200741f0006a41086a220842003703002007420037037041b8a2c1004114200741f0006a1008200741a0016a41086a220a2008290300370300200720072903703703a001024002400240200741a0016a41104101410041001003417f460d0041effec1002108412e210a0c010b2008420037030020074200370370418891c6004111200741f0006a1008200a2008290300370300200720072903703703a00120074100360270200741a0016a4110200741f0006a1006210802400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402007280270220a417f470d004100210a0c010b024020080d004100210a0c010b200a4104490d012008280000210a2008102a0b0240200a2003460d00419dffc10021084114210a0c1e0b024020090d0041b1ffc100210841c100210a0c1e0b02402009200241086a2802004f0d0041f2ffc1002108413c210a0c1e0b02402005428080e983b1de165441002006501b450d0041ae80c20021084124210a0c1e0b200741206a2001109d02200741206a41086a290300210b2007290320210c411310282208450d01200c200554200b200654200b2006511b210a200841002900c2a3413700002008410f6a41002800d1a341360000200841086a41002900caa34137000020074293808080b002370274200720083602702001200741f0006a108f012007280278210820072802702109200741a0016a41186a220d4200370300200741a0016a41106a220e4200370300200741a0016a41086a220f4200370300200742003703a00120092008200741a0016a1000200741c0006a41186a200d290300370300200741c0006a41106a200e290300370300200741c0006a41086a200f290300370300200720072903a00137034002402007280274450d002007280270102a0b200b2006200a1b210b200c2005200a1b210620074100360270200741c0006a4120200741f0006a100621080240024002402007280270220a417f460d002008450d002007200a3602a401200720083602a001200741f0006a200741a0016a10c20220072903704201510d0520074180016a29030021052007290378210c0240200a450d002008102a0b410e10282208450d06200841066a41002900b2a441370000200841002900aca4413700002008410e411c102c2208450d072008200441067636000e200741a0016a41186a220a4200370300200741a0016a41106a22094200370300200741a0016a41086a220d4200370300200742003703a00120084112200741a0016a1000200741f0006a41186a200a290300370300200741f0006a41106a2009290300370300200741f0006a41086a200d290300370300200720072903a0013703702008102a200741003602a001200741f0006a4120200741a0016a1006210820072802a001220a417f460d1b2008450d1b2007200a3602dc01200720083602d801200741a0016a200741d8016a107420072802a001220d450d082004413f71210920072902a40121100240200a450d002008102a0b4100210420092010422088a7490d010c190b200741106a20011091012007290310428080e983b1de1656200741186a29030022054200522005501b0d0141e380c20021084134210a0c1f0b200d200941216c6a22082d00004101470d17200741da016a200841036a2d00003a0000200741a0016a41086a200841146a290000370300200741ad016a200841196a290000370000200720082f00013b01d80120072008410c6a2900003703a001200841086a280000210a200841046a2800002108410121040c180b410e10282208450d06200841066a41002900b2a441370000200841002900aca4413700002008410e411c102c2208450d0720082004410676220e36000e200741a0016a41186a220a4200370300200741a0016a41106a22094200370300200741a0016a41086a220d4200370300200742003703a00120084112200741a0016a1000200741c0006a41186a200a290300370300200741c0006a41106a2009290300370300200741c0006a41086a200d290300370300200720072903a0013703402008102a20074100360270200741c0006a4120200741f0006a1006210802402007280270220a417f460d002008450d002007200a3602a401200720083602a001200741f0006a200741a0016a10742007280270220d450d092004413f712109200729027421050240200a450d002008102a0b41002108024020092005422088a74f0d0041014102200d200941216c6a2d00001b21080b02402005a7450d00200d102a0b20084102490d00410e10282208450d0a200841066a41002900b2a441370000200841002900aca4413700002008410e411c102c2208450d0b2008200e36000e42002105200741a0016a41186a220a4200370300200741a0016a41106a22044200370300200741a0016a41086a220d4200370300200742003703a00120084112200741a0016a1000200741c0006a41186a200a290300370300200741c0006a41106a2004290300370300200741c0006a41086a200d290300370300200720072903a0013703402008102a20074100360270200741c0006a4120200741f0006a100621080240024020072802702204417f470d004101210a0c010b024020080d004101210a0c010b200720043602a401200720083602a001200741f0006a200741a0016a10742007280270220a450d0d200729027421052004450d002008102a0b200741c0006a41186a2204200141186a290000370300200741c0006a41106a220d200141106a290000370300200741c0006a41086a220f200141086a2900003703002007200129000037034020092005422088a722114f0d0d200a200941216c6a220841013a000020082007290340370001200841096a200f290300370000200841116a200d290300370000200841196a2004290300370000410e102821080240200a0d002008450d0f200841066a41002900b2a441370000200841002900aca4413700002008410e411c102c2208450d102008200e36000e200741a0016a41186a220a4200370300200741a0016a41106a22094200370300200741a0016a41086a22044200370300200742003703a00120084112200741a0016a1000200741c0006a41186a200a290300370300200741c0006a41106a2009290300370300200741c0006a41086a2004290300370300200720072903a0013703402008102a200741c0006a412010090c170b2008450d10200841066a41002900b2a441370000200841002900aca4413700002008410e411c102c2208450d112008200e36000e200741a0016a41186a22094200370300200741a0016a41106a22044200370300200741a0016a41086a220d4200370300200742003703a00120084112200741a0016a1000200741c0006a41186a2009290300370300200741c0006a41106a2004290300370300200741c0006a41086a200d290300370300200720072903a0013703402008102a200741203602742007200741c0006a360270200a2011200741f0006a10ab022005a7450d16200a102a0c160b200741f0006a41086a2208420037030020074200370370419991c6004114200741f0006a1008200741a0016a41086a2008290300370300200720072903703703a0014100210a20074100360270200741a0016a4110200741f0006a10062108024020072802702209417f460d002008450d0020094104490d122008280000210a2008102a0b410e10282208450d12200841066a41002900b2a441370000200841002900aca4413700002008410e411c102c2208450d132008200a36000e200741a0016a41186a22094200370300200741a0016a41106a22044200370300200741a0016a41086a220d4200370300200742003703a00120084112200741a0016a1000200741c0006a41186a2009290300370300200741c0006a41106a2004290300370300200741c0006a41086a200d290300370300200720072903a0013703402008102a20074100360270200741c0006a4120200741f0006a1006210802400240024020072802702209417f460d002008450d002007200936027420072008360270200741086a200741f0006a106c0240024020072802080d00200728020c210d410021040c010b4101210441b8aec600210d0b02402009450d002008102a0b20040d00200d413f460d01200d0d170b200741f0006a2001428080d287e2bc2d4200410810980220072802704101470d012007280278210a200728027421080c1f0b200741f0006a41086a2208420037030020074200370370419991c6004114200741f0006a1008200741a0016a41086a2008290300370300200720072903703703a0012007200a41016a360270200741a0016a4110200741f0006a410410070c150b20072903782105200720074180016a29030037037820072005370370200b2006428080aef89dc3527c2205200654ad7c427f7c210b2007200741f0006a3602a001200741a0016a109d01200521060c140b41c4d1c3004133200741c0016a419cd9c3001038000b411341011037000b41c4d1c3004133200741c0016a419cd9c3001038000b410e41011037000b411c41011037000b41c4d1c3004133200741c0016a419cd9c3001038000b410e41011037000b411c41011037000b41c4d1c3004133200741c0016a419cd9c3001038000b410e41011037000b411c41011037000b41c4d1c3004133200741c0016a419cd9c3001038000b41a0a3c100200920111034000b410e41011037000b411c41011037000b410e41011037000b411c41011037000b41c4d1c3004133200741c0016a419cd9c3001038000b410e41011037000b411c41011037000b200741f9006a200141086a29000037000020074181016a200141106a29000037000020074189016a200141186a290000370000200741013a00702007200129000037007102400240024002400240024002400240024002400240024002400240024002400240410e10282208450d00200841066a41002900b2a441370000200841002900aca4413700002008410e411c102c2208450d012008200a36000e200741a0016a41186a22094200370300200741a0016a41106a22044200370300200741a0016a41086a220d4200370300200742003703a00120084112200741a0016a1000200741c0006a41186a2009290300370300200741c0006a41106a2004290300370300200741c0006a41086a200d290300370300200720072903a0013703402008102a200741003602a001200741c0006a4120200741a0016a100621080240024020072802a0012204417f460d002004210920080d010b200741003602a801200742013703a0014100200741a0016a10b40120072802a801210920072802a401210420072802a00121080b200720093602682007200436026420072008360260024002402009450d00200741a0016a20082009410110d60220072802a0014101470d012007280264450d122007280260102a0c120b4101200741e0006a10b401024020072d00704101460d0002400240200728026420072802682208460d00200728026021090c010b200841016a22092008490d1b200841017422042009200420094b1b22044100480d1b0240024020080d002004102821090c010b200728026020082004102c21090b2009450d052007200436026420072009360260200728026821080b2007200841016a360268200920086a41003a00000c100b02400240200728026420072802682208460d00200728026021090c010b200841016a22092008490d1a200841017422042009200420094b1b22044100480d1a0240024020080d002004102821090c010b200728026020082004102c21090b2009450d052007200436026420072009360260200728026821080b2007200841016a360268200920086a41013a0000200741f0006a410172200741e0006a108f010c0f0b20072802a401210d0240200741ac016a2802002208200741a8016a2802002209460d002007280268200820096b6a220441216a220e417f4c0d0502400240200e0d004101210f0c010b200e1028220f450d070b2007200e3602c4012007200f3602c001200720043602c8012007200741c0016a3602a001200d200741a0016a200810d70120042008490d0720072802c801220d2004490d082007280268220d2009490d0920072802c001210e2007280260210f2007200420086b22043602d0012007200d20096b220d3602d4012004200d470d0a200e20086a200f20096a2004109a051a0240024020072d00704101460d000240024020072802c40120072802c8012208460d0020072802c00121090c010b200841016a22092008490d1c200841017422042009200420094b1b22044100480d1c0240024020080d002004102821090c010b20072802c00120082004102c21090b2009450d0e200720043602c401200720093602c00120072802c80121080b2007200841016a3602c801200920086a41003a00000c010b0240024020072802c40120072802c8012208460d0020072802c00121090c010b200841016a22092008490d1b200841017422042009200420094b1b22044100480d1b0240024020080d002004102821090c010b20072802c00120082004102c21090b2009450d0e200720043602c401200720093602c00120072802c80121080b2007200841016a3602c801200920086a41013a0000200741f0006a410172200741c0016a108f010b20072802c801210920072802c401210420072802c00121082007280264450d102007280260102a0c100b2007200741e0006a3602a001200d200741a0016a200910d701024020072d00704101460d0002400240200728026420072802682208460d00200728026021090c010b200841016a22092008490d1a200841017422042009200420094b1b22044100480d1a0240024020080d002004102821090c010b200728026020082004102c21090b2009450d0e2007200436026420072009360260200728026821080b2007200841016a360268200920086a41003a00000c0f0b02400240200728026420072802682208460d00200728026021090c010b200841016a22092008490d19200841017422042009200420094b1b22044100480d190240024020080d002004102821090c010b200728026020082004102c21090b2009450d0e2007200436026420072009360260200728026821080b2007200841016a360268200920086a41013a0000200741f0006a410172200741e0006a108f010c0e0b410e41011037000b411c41011037000b200441011037000b200441011037000b1036000b200e41011037000b200820041044000b2004200d103c000b2009200d1044000b200741f0016a41146a4108360200200741fc016a4125360200200741d8016a41146a4103360200200742033702dc01200741c8afc6003602d801200741253602f4012007200741d0016a360288022007200741d4016a36028c02200742043703b001200742013702a4012007419cb0c6003602a0012007200741f0016a3602e8012007200741a0016a3602800220072007418c026a3602f801200720074188026a3602f001200741d8016a41d8b0c600103e000b200441011037000b200441011037000b200441011037000b200441011037000b2007280268210920072802642104200728026021080b2008450d00200741c0006a41202008200910072004450d012008102a0c010b024002400240412110282208450d0041002109024020072d00704101470d00200741b8016a20074189016a290000370300200741b0016a20074181016a290000370300200741a8016a200741f9006a290000370300200720072900713703a001410121090b200820093a0000200820072903a001370001200841096a200741a8016a290300370000200841116a200741b0016a290300370000200841196a200741b8016a290300370000410e10282209450d01200941066a41002900b2a441370000200941002900aca4413700002009410e411c102c2209450d022009200a36000e200741a0016a41186a220a4200370300200741a0016a41106a22044200370300200741a0016a41086a220d4200370300200742003703a00120094112200741a0016a1000200741c0006a41186a200a290300370300200741c0006a41106a2004290300370300200741c0006a41086a200d290300370300200720072903a0013703402009102a200741203602a4012007200741c0006a3602a00120084101200741a0016a10ab022008102a0c030b412141011037000b410e41011037000b411c41011037000b20072001428080e983b1de164200108302024020072802002208450d002007280204210a0c080b200741f0006a41086a220842003703002007420037037041ad91c6004112200741f0006a1008200741a0016a41086a2008290300370300200720072903703703a0014100210a20074100360270200741a0016a4110200741f0006a100621080240024020072802702209417f460d002008450d0020094104490d012008280000210a2008102a0b4200210c200741f0006a41086a220842003703002007420037037041ad91c6004112200741f0006a1008200741a0016a41086a2008290300370300200720072903703703a0012007200a41016a360270200741a0016a4110200741f0006a41041007420021050c060b41c4d1c3004133200741c0016a419cd9c3001038000b0b02402010a7450d00200d102a2004450d010c020b20040d010b410121094113210a419781c20021080c010b200741c0016a41026a200741d8016a41026a2d00003a0000200741f0006a41086a200741a0016a41086a290300370300200741f0006a410d6a200741a0016a410d6a290000370000200720072f01d8013b01c001200720072903a001370370410021090b200741e0006a41026a2204200741c0016a41026a2d00003a0000200741f0016a41086a220d200741f0006a41086a290300370300200741f0016a41106a200741f0006a41106a290300370300200720072f01c0013b0160200720072903703703f00120090d02200741d3006a200d290300370000200741d8006a200741fd016a290000370000200720072f01603b01402007200a36004720072008360043200720072903f00137004b200720042d00003a0042200741c0006a2001460d00200741c0006a20014120109c05450d0041d280c20021084111210a0c020b200742f0f2bda9c6add9b1f400370338200741386a20012006200b417f410f10a902200741f0006a41186a200b3703002007200637038001200720053703782007200c370370200720033602940120072003360290010240024002400240411310282208450d00200841002900c2a3413700002008410f6a41002800d1a341360000200841086a41002900caa34137000020074293808080b0023702f401200720083602f0012001200741f0016a108f0120072802f801210820072802f001210a200741a0016a41186a22094200370300200741a0016a41106a22034200370300200741a0016a41086a22044200370300200742003703a001200a2008200741a0016a1000200741c0006a41186a2009290300370300200741c0006a41106a2003290300370300200741c0006a41086a2004290300370300200720072903a001370340024020072802f401450d0020072802f001102a0b200741203602a4012007200741c0006a3602a001200741f0006a200741a0016a10c3022002280204210f20022802002103024002400240200241086a280200220941057622120d0041042113410421140c010b2012410274220810282213450d01201321140b2009450d030240024020120d00410410282213450d0141012112201321140b201441003602002009417f6a210441012115410021084100210a024003402014200a4102746a2202200320086a2d00002008411f717420022802006a360200024002400240024020042008460d00200841016a2202411f710d0320152012470d02201541016a220d2015490d0c2015410174220e200d200e200d4b1b221241ffffffff03712012470d0c2012410274220d41004e0d010c0c0b0240200f450d002003102a0b41002116024002400240024003402015410820154108491b220a410274220f10282208450d0120082014200f109a052111200741f0006a41186a200141186a290000370300200741f0006a41106a200141106a290000370300200741f0006a41086a200141086a290000370300200720163602900120072001290000370370411310282208450d0220084100290099a4413700002008410f6a41002800a8a441360000200841086a41002900a1a44137000020074293808080b0023702f401200720083602f001200741f0006a200741f0016a108f0120072802900121090240024020072802f401220220072802f80122086b4104490d0020072802f00121020c010b200841046a22032008490d11200241017422082003200820034b1b22084100480d110240024020020d002008102821020c010b20072802f00120022008102c21020b2002450d04200720083602f401200720023602f00120072802f80121080b2007200841046a3602f801200220086a200936000020072802f801210820072802f0012102200741a0016a41186a22094200370300200741a0016a41106a22034200370300200741a0016a41086a22044200370300200742003703a00120022008200741a0016a1000200741c0006a41186a2009290300370300200741c0006a41106a2003290300370300200741c0006a41086a2004290300370300200720072903a001370340024020072802f401450d0020072802f001102a0b2015200a6b21152014200f6a2114410021082007410036027820074201370370200a200741f0006a10b4014100200728027822046b210a200728027421030340200420086a2109201120086a280200210d024002402003200a6a4104490d00200728027021020c010b200941046a22022009490d122003410174220e2002200e20024b1b220e4100480d120240024020030d00200e102821020c010b20072802702003200e102c21020b2002450d062007200e36027420072002360270200e21030b2007200941046a360278200220046a20086a200d360000200a417c6a210a200f200841046a2208470d000b200741c0006a41202002200420086a100702402003450d002002102a0b2011102a201641016a211620150d000b410021082012450d0e2013102a0c0e0b200f41041037000b411341011037000b200841011037000b200e41011037000b0240024020150d00200d102821130c010b20132015410274200d102c21130b2013450d03201321140b201420154102746a4100360200200a41016a210a201541016a21150b200920024d0d05200221082015200a4b0d000b41a0a3c100200a20151034000b200d41041037000b410441041037000b200841041037000b411341011037000b41cca2c100200841016a20091034000b0240200f450d002003102a0b410021080b0c020b1031000b200241046a280200450d002002280200102a0b2000200a3602042000200836020020074190026a24000b810f03037f017e097f23004190016b2202240002400240024002400240024002400240024002400240410e10282203450d00200341066a41002900b2a441370000200341002900aca4413700002003410e411c102c2203450d0120032001410676220436000e42002105200241f0006a41186a22064200370300200241f0006a41106a22074200370300200241f0006a41086a220842003703002002420037037020034112200241f0006a1000200241086a41186a2006290300370300200241086a41106a2007290300370300200241086a41086a2008290300370300200220022903703703082003102a20024100360238200241086a4120200241386a100621030240024020022802382207417f470d00410121060c010b024020030d00410121060c010b2002200736027420022003360270200241386a200241f0006a107420022802382206450d03200229023c21052007450d002003102a0b2001413f7122032005422088a722074f0d032006200341216c6a220341003a000020032002290038370001200341096a200241c0006a290000370000200341116a200241c8006a290000370000200341196a200241d0006a290000370000410e10282203450d04200341066a41002900b2a441370000200341002900aca4413700002003410e411c102c2203450d052003200436000e200241f0006a41186a22044200370300200241f0006a41106a22084200370300200241f0006a41086a220142003703002002420037037020034112200241f0006a1000200241086a41186a2004290300370300200241086a41106a2008290300370300200241086a41086a2001290300370300200220022903703703082003102a2002412036023c2002200241086a36023820062007200241386a10ab0202402005a7450d002006102a0b200241386a41086a220342003703002002420037033841ad91c6004112200241386a1008200120032903003703002002200229033837037020024100360238200241f0006a4110200241386a10062103417f2106024020022802382201417f460d002003450d0020014104490d07200328000021062003102a2006417f6a21060b200241386a41086a220442003703002002420037033841ad91c6004112200241386a1008200241f0006a41086a220720042903003703002002200229033837037020022006360238200241f0006a4110200241386a41041007200241386a41186a2208200041186a2209290000370300200241386a41106a220a200041106a220b2900003703002004200041086a220c2900003703002002410036025820022000290000370338200241286a200241386a10c10202402002280230450d0041012106034020082009290000370300200a200b2900003703002004200c29000037030020022006417f6a36025820022000290000370338411310282203450d0920034100290099a4413700002003410f6a41002800a8a441360000200341086a41002900a1a44137000020024293808080b00237026420022003360260200241386a200241e0006a108f012002280258210d0240024020022802642201200228026822036b4104490d00200228026021010c010b200341046a220e2003490d0c20014101742203200e2003200e4b1b22034100480d0c0240024020010d002003102821010c010b200228026020012003102c21010b2001450d0b2002200336026420022001360260200228026821030b2002200341046a360268200120036a200d3600002002280268210320022802602101200241f0006a41186a220d4200370300200241f0006a41106a220e4200370300200742003703002002420037037020012003200241f0006a1000200241086a41186a200d290300370300200241086a41106a200e290300370300200241086a41086a20072903003703002002200229037037030802402002280264450d002002280260102a0b200241086a412010090240200228022c450d002002280228102a0b20082009290000370300200a200b2900003703002004200c2900003703002002200029000037033820022006360258200641016a2106200241286a200241386a10c10220022802300d000b0b0240200228022c450d002002280228102a0b411310282203450d0a200341002900c2a3413700002003410f6a41002800d1a341360000200341086a41002900caa34137000020024293808080b00237023c200220033602382000200241386a108f012002280240210320022802382106200241f0006a41186a22014200370300200241f0006a41106a22004200370300200241f0006a41086a220442003703002002420037037020062003200241f0006a1000200241086a41186a2001290300370300200241086a41106a2000290300370300200241086a41086a2004290300370300200220022903703703080240200228023c450d002002280238102a0b200241086a4120100920024190016a24000f0b410e41011037000b411c41011037000b41c4d1c3004133200241e0006a419cd9c3001038000b41a0a3c100200320071034000b410e41011037000b411c41011037000b41c4d1c3004133200241e0006a419cd9c3001038000b411341011037000b200341011037000b1031000b411341011037000bd40201027f0240024002402002450d002002417f6a2104024020012d0000220241037122054103460d000240024020050e03040001040b2004450d0220012d0001410874200272220241ffff0371418002490d02200241fcff037141027621020c040b20044103490d0120012f0001200141036a2d000041107472410874200272220241808004490d01200241027621020c030b200241034b0d0020044104490d002001280001220241ffffffff034b0d020b200041013602000f0b200241027621020b0240200220036a220120024f0d00200041013602000f0b41012103410121050240200241c000490d0041022105200241808001490d00410441052002418080808004491b21050b0240200141c000490d0041022103200141808001490d00410441052001418080808004491b21030b20002001360204200041003602002000410c6a2003360200200041086a20053602000b130020004101360204200041f486c2003602000b3400200041f487c20036020420004100360200200041146a4107360200200041106a418488c200360200200041086a420f3702000b2201017f230041106b22022400200241003602002000200210da02200241106a24000bd60201037f0240024002400240024002400240024002400240024002400240024020012802000e0400010203000b41012102410110282201450d05200141003a0000410121030c040b410110282202450d05200241013a000020012802042103200241014105102c2202450d062002200336000120012802082104410a210320024105410a102c2201450d07200120043600050c020b41012102410110282201450d07200141023a0000410121030c020b410110282202450d07200241033a000020012802042103200241014105102c2202450d082002200336000120012802082104410a210320024105410a102c2201450d09200120043600050b410921020b2000200236020820002003360204200020013602000f0b410141011037000b410141011037000b410541011037000b410a41011037000b410141011037000b410141011037000b410541011037000b410a41011037000b130020004101360204200041cc92c2003602000b34002000419596c20036020420004100360200200041146a4107360200200041106a419c96c200360200200041086a42073702000b130020004101360204200041aca3c2003602000b890201057f230041106b22022400024002400240411110282203450d002002421137020420022003360200410d200210b4010240024020022802042204200228020822036b410d490d002003410d6a2105200228020021040c010b2003410d6a22052003490d03200441017422062005200620054b1b22064100480d030240024020040d002006102821040c010b200228020020042006102c21040b2004450d0220022006360204200220043602000b20022005360208200420036a22034100290082a542370000200341056a4100290087a54237000020002002290300370200200041086a2002280208360200200241106a24000f0b411141011037000b200641011037000b1031000bce04010b7f230041106b220324002003420037030820012002200341086a102720032003290308370300200120026a21040240024002400240200241086a220520024f0d00200341086a2106200321074100210841002105410121094100210a0340200841017421022006200741016a220b6b210c034020072d00002107024002400240024020082005470d00200c2105024002400240200a41ff01710e03010200010b200420016b21050c010b417f200c200420016b6a22052005200c491b21050b2008417f200541016a220d200d2005491b6a22052008490d0920022005200220054b1b22054100480d090240024020080d002005102821090c010b200920082005102c21090b2009450d010b200920086a20073a00000240024002400240200a41ff01710e03010300010b20042001460d010c050b0240200b2006460d004100210a0c040b20042001470d040b200841016a21080c070b4101210a200b2006470d01200841016a21080c060b200541011037000b200841016a2108200b21070c020b200841016a21084102210a200241026a21022001220741016a21010c000b0b0b4101210902402005450d0020054100480d03200510282209450d020b410021080340200920086a200320086a2d00003a0000200841016a22084108470d000b024020020d00410821080c010b200920086a210a410021080340200a20086a200120086a2d00003a00002002200841016a2208470d000b200420016b41086a21080b200020083602082000200536020420002009360200200341106a24000f0b200541011037000b1031000bc30401047f230041206b22022400024002400240024002400240410110282203450d00200320012d00003a0000200341014102102c2203450d01200320012d00013a0001200341024104102c2203450d02200320012d00023a0002200320012d00033a0003200341044108102c2203450d03200320012d00043a0004200320012d00053a0005200320012d00063a0006200320012d00073a0007200341084110102c2203450d04200320012d00083a0008200320012d00093a0009200320012d000a3a000a200320012d000b3a000b200320012d000c3a000c200320012d000d3a000d200320012d000e3a000e200320012d000f3a000f200341104120102c2203450d05200320012d00103a0010200320012d00113a0011200320012d00123a0012200320012d00133a0013200320012d00143a0014200320012d00153a0015200320012d00163a0016200320012d00173a0017200320012d00183a0018200320012d00193a0019200320012d001a3a001a200320012d001b3a001b200320012d001c3a001c200320012d001d3a001d200320012d001e3a001e200320012d001f3a001f200241186a22014200370300200241106a22044200370300200241086a22054200370300200242003703002003412020021000200041186a2001290300370000200041106a2004290300370000200041086a2005290300370000200020022903003700002003102a200241206a24000f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000bd40201087f230041206b2203240020034100360208200342013703002001200310b401024002400240024020010d002003280208210420032802042105200328020021060c010b200141246c210720032802042105200328020821010340200341106a200010ec012003280210210802400240200520016b20032802182209490d00200120096a2104200328020021060c010b200120096a22042001490d04200541017422062004200620044b1b220a4100480d040240024020050d00200a102821060c010b20032802002005200a102c21060b2006450d032003200a36020420032006360200200a21050b20032004360208200620016a20082009109a051a02402003280214450d002008102a0b200041246a2100200421012007415c6a22070d000b0b2002280200200228020420062004100702402005450d002006102a0b200341206a24000f0b200a41011037000b1031000b130020004103360204200041a0a5c2003602000b340020004185acc20036020420004100360200200041146a4103360200200041106a4190acc200360200200041086a42083702000b130020004104360204200041a8b0c2003602000b0b00200041a0c21e10e6020b3001017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200220013600000b3201017f02404104102822020d00410441011037000b20004284808080c0003702042000200236020020024180e1013600000b0b00200041d0860310e6020bdd0301047f230041d0026b2202240002400240024002400240411210282203450d00200341106a41002f008086423b0000200341086a41002900f88542370000200341002900f08542370000200341124124102c2203450d0120032001360012200241e8016a41186a22014200370300200241e8016a41106a22044200370300200241e8016a41086a22054200370300200242003703e80120034116200241e8016a1000200241e8006a41186a2001290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903e8013703682003102a200241003602e801200241e8006a4120200241e8016a1006210120022802e8012203417f460d032002200336020c20022001360208200241e8016a200241086a10810220022903e8014201510d0220024188016a200241e8016a41086a41e000109a051a02402003450d002001102a0b200241086a20024188016a41e000109a051a200241e8016a200241086a41e000109a051a20004201370300200041086a200241e8016a41e000109a051a0c040b411241011037000b412441011037000b41c4d1c300413320024188016a419cd9c3001038000b200241e8016a200241086a41e000109a051a200042003703000b200241d0026a24000bc06709017f017e017f027e157f017e037f017e037f230041a0056b2201240010eb020240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020004101460d0042002102200141206a41086a2200420037030020014200370320418efcc5004110200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a100621000240024002400240024002400240024002400240024020012802e8032203417f460d002000450d0020034108490d01200029000021022000102a0b42002104200141206a41086a220042003703002001420037032041dffbc500410f200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a10062100024020012802e8032203417f460d002000450d0020034108490d02200029000021042000102a0b42002105200141206a41086a220042003703002001420037032041fefbc5004110200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a10062100024020012802e8032203417f460d002000450d0020034108490d03200029000021052000102a0b420020022005200442c8017e7c7d220420042002561b42c801540d0a200141206a41086a2200420037030020014200370320419499c6004114200141206a100820014188036a41086a2000290300370300200120012903203703880341002106200141003602e80320014188036a4110200141e8036a10062100024020012802e8032203417f460d002000450d0020034104490d04200028000021062000102a0b200141206a41086a220042003703002001420037032041a899c6004115200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a100621000240024020012802e8032203417f470d00410221070c010b024020000d00410221070c010b2003450d0520002d000021072000102a0b10fb01210820014188036a41086a22004200370300200142003703880341c2e1c000410d20014188036a1008200141e8036a41086a200029030037030020012001290388033703e80320014100360220200141e8036a4110200141206a100621000240024020012802202203417f460d002000450d00200120033602a401200120003602a001200141206a200141a0016a107c20012802202209450d07200129022421052003450d012000102a0c010b41012109420021050b200141206a41086a220042003703002001420037032041c785c2004112200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a100621000240024020012802e8032203417f460d002000450d002001200336022420012000360220200141e8036a200141206a106d20012802e803220a450d0820012902ec0321042003450d012000102a0c010b4101210a420021040b02402004422088a722000d004108210b4100210c4100210d0c0a0b2000410574210e200141e8036a41206a210f4100210c4100210d4108210b41002103200a2100034020014188026a41186a2210200041186a29000037030020014188026a41106a2211200041106a29000037030020014188026a41086a2212200041086a2900003703002001200029000037038802200141e8036a2008200310fc0120012802e803221320012802f00341014100410010032114024020012802ec03450d002013102a0b02402014417f470d00200141206a41186a22142010290300370300200141206a41106a22132011290300370300200141206a41086a221520122903003703002001200129038802370320200141e8036a200141206a10ec02200128028804450d09200141206a41286a2216200141e8036a41286a290300370300200141206a41206a2217200f2903003703002014200141e8036a41186a22182903003703002013200141e8036a41106a22192903003703002015200141e8036a41086a221a290300370300200120012903e8033703202018201029030037030020192011290300370300201a201229030037030020012001290388023703e803200f2001290320370300200f41086a2015290300370300200f41106a2013290300370300200f41186a2014290300370300200f41206a2017290300370300200f41286a20162903003703000240200c200d470d00200c41016a2214200c490d26200c41017422102014201020144b1b220dad42d0007e2202422088a70d262002a722144100480d2602400240200c0d0020141028210b0c010b200b200c41d0006c2014102c210b0b200b450d0b0b200b200c41d0006c6a200141e8036a41d000109a051a200c41016a210c0b200341016a2103200041206a2100200e41606a220e450d0a0c000b0b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b41f187c1004192021050000b201441081037000b02402004a7450d00200a102a0b02400240200c450d002001410036022820014201370320200141f8036a200c360200200141f4036a200d3602002001200b3602f003200120054220883e02ec03200120083602e803200141206a200141e8036a10c5012005a7450d012009102a0c010b02402005a7450d002009102a0b200d450d00200b102a0b200141206a41086a220042003703002001420037032041f5b6c2004112200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a1006210b024002400240024002400240024002400240024002400240024002400240024002400240024020012802e8032216417f460d00200b450d00200120163602ac022001200b3602a802200141086a200141a8026a106c20012802080d2b20012802ac02220f41807f712200417f4c0d14200128020c211202400240200f41077622140d00410121150c010b200010282215450d100b02402012450d00200141e8036a41206a2113200141a0016a41017221084100210c0340200141003a00c001200c41016a210e4100210002400240024002400340200f2000460d01200141a0016a20006a20012802a80222032d00003a00002001200341016a3602a8022001200041016a22033a00c0012003210020034120470d000b20014188026a41086a2200200141a0016a41086a29030037030020014188026a41106a2210200141a0016a41106a29030037030020014188026a41186a2211200141a0016a41186a290300370300200120012903a001370388022001200f20036b3602ac02200141a0016a200141a8026a10e80120012d00a0014101460d01200141e8036a41186a2011290300370300200141e8036a41106a2010290300370300200141e8036a41086a200029030037030020012001290388023703e8032013200841e000109a051a200141206a200141e8036a418001109a051a2014200c470d03200c4101742200200e2000200e4b1b221441ffffff0f712014470d322014410774220041004e0d020c320b200141003602ac02200041ff0171450d00200141003a00c0010b2014450d2f2015102a0c2f0b02400240200c0d002000102821150c010b2015200c4107742000102c21150b2015450d050b2015200c4107746a200141206a418001109a051a200e2012460d0120012802ac02210f200e210c0c000b0b2015450d2b2012ad42208621022014ad210402402016450d00200b102a0b2002200484211b0c010b410121154200211b0b4100210002400240201b422088a72218410774220c0d004101211c4100211d0c010b200c41027622031028221c450d0d201841ffffff0f71211d0b200741ff0171210e02402018450d002018410774210f201c210020152103034020002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000200041206a210020034180016a2103200f41807f6a220f0d000b201841077441807f6a41077641016a21000b200e410247210f200141206a41086a220342003703002001420037032041c785c2004112200141206a100820014188036a41086a20032903003703002001200129032037038803200141003602f003200142013703e8032000200141e8036a10b40102402000450d0020004105742103201c210003402000200141e8036a108f01200041206a2100200341606a22030d000b0b2007200f71211a20012802ec03210020014188036a411020012802e803220320012802f003100702402000450d002003102a0b0240201a450d00200141206a41086a220042003703002001420037032041bd99c600411a200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a1006210020012802e8032203417f460d002000450d002001200336022420012000360220200141e8036a200141206a10820120012802e803220f450d0c20012902ec03210202402003450d002000102a0b20014188036a411010092002a7450d00200f102a0b200141106a200641026a10ed02024002402001280210221e0d00200141206a41086a220042003703002001420037032041c785c2004112200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a10062100024020012802e8032203417f460d002000450d002001200336022420012000360220200141e8036a200141206a106d20012802e803220d450d0d20012902ec03211f02402003450d002000102a0b410021200c020b410021204101210d4200211f0c010b410121202001290214211f201e210d0b200141206a41086a2200420037030020014200370320419499c6004114200141206a100820014188036a41086a20002903003703002001200129032037038803410121162001200641016a22063602e80320014188036a4110200141e8036a41041007200120203a001f20012015200c6a22073602ec04200120153602e8042001200141e8046a3602fc0420012001411f6a3602f8044100210e410021210240201f422088a722004105742203450d002003410575222141ffffff0f712021470d2b202141077422034100480d2b200310282216450d0a0b02402000450d002000410574210c200141206a410172210b200141e8036a41206a2108200141a8026a41c0006a2119200141a8026a41206a21174100210e20162114200d21000340200041086a2900002102200041106a29000021042000290000210520014188026a41186a2210200041186a29000037030020014188026a41106a2211200437030020014188026a41086a22122002370300200120053703880220014188056a20014188026a108b02200128029005210f2001280288052103200141003602202003200f200141206a1006210f0240024020012802202213417f460d00200f450d002001201336028c032001200f36028803200141206a20014188036a10e80120012d00204101460d0c200141a0016a200b41e000109a051a02402013450d00200f102a0b20014188036a200141a0016a41e000109a051a200141206a20014188036a41e000109a051a200141a0016a200141206a41e000109a051a4101210f0c010b200141206a20014188036a41e000109a051a4100210f0b0240200128028c05450d002003102a0b02400240200f0d00200141a8026a410041e0001099051a0c010b200141a8026a200141a0016a41e000109a051a0b024020012802f8042d00000d0020012802fc04220f2802002203200f280204460d00200f20034180016a36020002400240200141a8026a200341206a220f460d00200f200141a8026a4120109c050d010b02402017200341c0006a220f460d00200f20174120109c050d010b2019200341e0006a2203460d01200320194120109c05450d010b20012802f80441013a00000b200041206a2100200141e8036a41186a2010290300370300200141e8036a41106a2011290300370300200141e8036a41086a201229030037030020012001290388023703e8032008200141a8026a41e000109a051a200e41016a210e2014200141e8036a418001109a054180016a2114200c41606a220c0d000b0b0240201fa7450d00200d102a0b200e41ffffff0f71200e470d12200e4107742200417f4c0d1220012d001f21120240024020000d00410121110c010b200010282211450d080b410021000240200e450d002016200e4107746a2110200141e8036a41e0006a2103200141e8036a41c0006a210f200141e8036a41206a210c20112114201621000340200141e8036a41186a200041186a290000370300200141e8036a41106a200041106a290000370300200141e8036a41086a200041086a290000370300200120002900003703e803200c41186a200041386a290000370000200c41106a200041306a290000370000200c41086a200041286a290000370000200c200041206a290000370000200f41186a200041d8006a290000370000200f41106a200041d0006a290000370000200f41086a200041c8006a290000370000200f200041c0006a2900003700002003200041e0006a290000370000200341086a200041e8006a290000370000200341106a200041f0006a290000370000200341186a200041f8006a2900003700002014200141e8036a418001109a054180016a211420004180016a22002010470d000b200e41077441807f6a41077641016a21000b200141206a41086a220342003703002001420037032041f5b6c2004112200141206a100820014188036a41086a20032903003703002001200129032037038803200141003602f003200142013703e8032000200141e8036a10b40102402000450d00201120004107746a21032011210003402000200141e8036a108f01200041206a200141e8036a108f01200041c0006a200141e8036a108f01200041e0006a200141e8036a108f0120004180016a22002003470d000b0b20012802ec03210020014188036a411020012802e803220320012802f003100702402000450d002003102a0b0240200e450d002011102a0b200120123a00e803200141206a41086a220042003703002001420037032041a899c6004115200141206a100820014188036a41086a2000290300370300200120012903203703880320014188036a4110200141e8036a41011007200120063602ec03200141043a00e80341014100200141e8036a10cc01410810282203450d0620032007360204200320153602000240201a0d0042002102200141206a41086a220042003703002001420037032041e194c600411c200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a10062100024020012802e803220f417f460d002000450d00200f4108490d07200029000021022000102a0b200141206a41086a2200420037030020014200370320419499c6004114200141206a100820014188036a41086a200029030037030020012001290320370388034100210f200141003602e80320014188036a4110200141e8036a10062100024020012802e803220c417f460d002000450d00200c4104490d062000280000210f2000102a0b411c10282200450d04200041186a41002800959546360000200041106a410029008d9546370000200041086a41002900859546370000200041002900fd94463700002000411c4138102c2200450d032000200237001c20014188026a41186a220c420037030020014188026a41106a2214420037030020014188026a41086a2210420037030020014200370388022000412420014188026a1000200141e8036a41186a200c290300370300200141e8036a41106a2014290300370300200141e8036a41086a201029030037030020012001290388023703e8032000102a2001200f360220200141e8036a4120200141206a410410072003102a0c110b024002402018450d00200320154180016a2210360200200120152900223701ea032001201529002a3701f20320014188026a41086a220020012903f003370300200120152900323701fa0320014188026a41106a220f20012903f8033703002001201528003a36018204200120152f003e3b01860420014188026a41186a220c200129038004370300200141003a008804200120152d00213a00e903200120152d00203a00e803200120012903e8033703880220014188036a41186a2214200c29030037030020014188036a41106a220c200f29030037030020014188036a41086a220f2000290300370300200120012903880237038803200141206a41186a22002014290300370300200141206a41106a2214200c290300370300200141206a41086a220c200f290300370300200120012903880337032020150d010b2003102a4108211241002110410021000c100b200141a0016a41186a2000290300370300200141a0016a41106a2014290300370300200141a0016a41086a200c290300370300200120012903203703a001200720106b41077641016a220041286c220f417f4c0d12200f10282212450d01201220012903a00137030020124201370320201241186a200141a0016a41186a220a290300370300201241106a200141a0016a41106a2209290300370300201241086a200141a0016a41086a222229030037030002402003280200220f2003280204220d470d00410121100c0f0b2003200f4180016a22063602002001200f2900223701ea032001200f29002a3701f20320014188026a41086a221320012903f0033703002001200f2900323701fa0320014188026a41106a220820012903f8033703002001200f28003a360182042001200f2f003e3b01860420014188026a41186a220b200129038004370300200141003a0088042001200f2d00213a00e9032001200f2d00203a00e803200120012903e8033703880220014188036a41186a220f200b29030037030020014188036a41106a220c200829030037030020014188036a41086a22142013290300370300200120012903880237038803200141206a41186a2217200f290300370300200141206a41106a2218200c290300370300200141206a41086a2219201429030037030020012001290388033703204102211041c80021110340200a2017290300220237030020092018290300220437030020222019290300220537030020012001290320221f3703a001200f2002370300200c2004370300201420053703002001201f3703880302400240024002402010417f6a2000460d002000211a0c010b200d20066b41077620006a41016a221a2000490d2e2000410174220d201a200d201a4b1b221aad42287e2202422088a70d2e2002a7220d4100480d2e0240024020000d00200d102821120c010b2012200041286c200d102c21120b2012450d010b201220116a220d41606a220020012903880337030020142903002102200c2903002104200f2903002105200d4201370300200041186a2005370300200041106a2004370300200041086a2002370300200328020022002003280204220d470d01201a21000c110b200d41081037000b200320004180016a2206360200200120002900223701ea032001200029002a3701f203201320012903f003370300200120002900323701fa03200820012903f8033703002001200028003a36018204200120002f003e3b018604200b200129038004370300200141003a008804200120002d00213a00e903200120002d00203a00e803200120012903e80337038802200f200b290300370300200c2008290300370300201420132903003703002001200129038802370388032017200f2903003703002018200c290300370300201920142903003703002001200129038803370320201141286a2111201041016a2110201a21000c000b0b200041011037000b200f41081037000b413841011037000b411c41011037000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b410841041037000b200041011037000b41c4d1c300413320014198056a419cd9c3001038000b200341011037000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b200341011037000b200041011037000b2003102a0b200141206a41086a220342003703002001420037032041d985c2004117200141206a100820014188036a41086a20032903003703002001200129032037038803200141e8036a20014188036a411010c6020240024020012802e8034101460d00200120103602f003200120003602ec03200120123602e803200141e8036a41004100200110ee020c010b20014188036a4110100920012902ec032102200120103602f003200120003602ec03200120123602e803200141e8036a2002a741012002422088a710ee020b42002102200141206a41086a220042003703002001420037032041e194c600411c200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a10062100024020012802e8032203417f460d002000450d0020034108490d04200029000021022000102a0b200141206a41086a220042003703002001420037032041e194c600411c200141206a100820014188036a41086a2203200029030037030020012001290320370388032001200242017c22023703e80320014188036a4110200141e8036a410810072000420037030020014200370320419499c6004114200141206a100820032000290300370300200120012903203703880341002103200141003602e80320014188036a4110200141e8036a10062100024020012802e803220f417f460d002000450d00200f4104490d05200028000021032000102a0b411c10282200450d05200041186a41002800959546360000200041106a410029008d9546370000200041086a41002900859546370000200041002900fd94463700002000411c4138102c2200450d062000200237001c20014188026a41186a220f420037030020014188026a41106a220c420037030020014188026a41086a2214420037030020014200370388022000412420014188026a1000200141e8036a41186a200f290300370300200141e8036a41106a200c290300370300200141e8036a41086a201429030037030020012001290388023703e8032000102a20012003360220200141e8036a4120200141206a410410070b410810282200450d062000200736020420002015360200410810282219450d0720192016200e4107746a221a3602042019201636020042002102200141206a41086a220342003703002001420037032041dffbc500410f200141206a100820014188036a41086a20032903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a10062103024020012802e803220f417f460d002003450d00200f4108490d09200329000021022003102a0b200242017c22042002540d09200141206a41086a220342003703002001420037032041dffbc500410f200141206a100820014188036a41086a220f20032903003703002001200129032037038803200120043703e80320014188036a4110200141e8036a41081007200141e8046a20004188b7c20010880120012802ec04211020012802e804211420012802f0042100200342003703002001420037032041eefbc5004110200141206a1008200f20032903003703002001200129032037038803200141003602f003200142013703e8032000200141e8036a10b40102402000450d002014200041286c6a210e2014210303402003200141e8036a108f01200341206a29030021020240024020012802ec03220f20012802f00322006b4108490d0020012802e803210f0c010b200041086a220c2000490d1c200f4101742200200c2000200c4b1b22004100480d1c02400240200f0d0020001028210f0c010b20012802e803200f2000102c210f0b200f450d0d200120003602ec032001200f3602e80320012802f00321000b2001200041086a3602f003200f20006a2002370000200e200341286a2203470d000b0b20012802ec03210020014188036a411020012802e803220320012802f003100702402000450d002003102a0b02402010450d002014102a0b200442017c22022004540d0b200141206a41086a220042003703002001420037032041adfcc5004113200141206a100820014188036a41086a20002903003703002001200129032037038803200141e8036a20014188036a10ef0220012d00e803210020014188026a41186a220320014181046a29000037030020014188026a41106a220f200141f9036a29000037030020014188026a41086a220c200141f1036a290000370300200120012900e903370388020240024020004101460d00200141a0016a41186a4200370300200141a0016a41106a4200370300200141a0016a41086a4200370300200142003703a0010c010b200141a0016a41186a2003290300370300200141a0016a41106a200f290300370300200141a0016a41086a200c29030037030020012001290388023703a0010b200141206a41086a220042003703002001420037032041c0fcc5004111200141206a100820014188036a41086a2000290300370300200120012903203703880341002112200141003602e80320014188036a4110200141e8036a10062100024020012802e8032203417f460d002000450d0020034104490d0d200028000021122000102a0b200141206a41086a220042003703002001420037032041c0fcc5004111200141206a100820014188036a41086a20002903003703002001200129032037038803200141003602e80320014188036a4110200141e8036a41041007200141206a41186a200141a0016a41186a290300370300200141206a41106a200141a0016a41106a2903003703002000200141a0016a41086a290300370300200120012903a001370320417f201241016a220020002012491b410d74412872220b417f4c0d01200b10282208450d0d2008200129032037000020082002370020200841186a200141206a41186a290300370000200841106a200141206a41106a290300370000200841086a200141206a41086a2903003700004128211341002103410021004100211102400240024003400240024002400240024002402000450d00200f200c470d010b03402000210c200320124f0d02411610282200450d182000410e6a41002900dffc45370000200041086a41002900d9fc45370000200041002900d1fc4537000020004116412c102c2200450d192000200336001620014188026a41186a220f420037030020014188026a41106a220e420037030020014188026a41086a2214420037030020014200370388022000411a20014188026a100020014188036a41186a200f29030037030020014188036a41106a200e29030037030020014188036a41086a20142903003703002001200129038802370388032000102a200141003602a80220014188036a4120200141a8026a1006210e0240024020012802a802220f417f470d0041012100420021020c010b2001200f36028c022001200e36028802200141a8026a20014188026a107320012802a8022200450d1b20012902ac0221020240200f450d00200e102a0b20014188036a412010090b20002002422088a74105746a210f0240200c450d002010450d002011102a0b200341016a21032002a7211020002111200f2000460d000b200021112000210c0b200c41086a2900002102200c41106a2900002104200c2900002105200141e8036a41186a200c41186a290000221f370300200141e8036a41106a2004370300200141e8036a41086a2002370300200120053703e80320014188036a41186a2214201f37030020014188036a41106a2217200437030020014188036a41086a221820023703002001200537038803200b20136b411f4b0d03201341206a220e2013490d21200b410174220d200e200d200e4b1b220e4100480d21200b0d01200e102821080c020b0240200c450d002010450d002000102a0b20014188026a41186a2203420037030020014188026a41106a220f420037030020014188026a41086a220c420037030020014200370388022008201320014188026a1000200141e8036a41186a22142003290300370300200141e8036a41106a2210200f290300370300200141e8036a41086a2211200c29030037030020012001290388023703e8030240200b450d002008102a0b200141206a41086a220042003703002001420037032041adfcc5004113200141206a100820014188036a41086a220e2000290300370300200120012903203703880320014110360224200120014188036a360220200141e8036a200141206a10f002200141a8026a41186a200141a0016a41186a2903002202370300200141a8026a41106a200141a0016a41106a2903002204370300200141a8026a41086a200141a0016a41086a2903002205370300200120012903a001221f3703a8022014200237030020102004370300201120053703002001201f3703e8032000420037030020014200370320419efcc500410f200141206a1008200e2000290300370300200120012903203703880320014110360224200120014188036a360220200141e8036a200141206a10f002200141f8046a20194194b9c200108801200042003703002001420037032041adfcc5004113200141206a1008200e20002903003703002001200129032037038803200141e8036a20014188036a10ef0220012d00e8032100200320014181046a290000370300200f200141f9036a290000370300200c200141f1036a290000370300200120012900e9033703880220004101460d05200141a0036a420037030020014198036a420037030020014190036a420037030020014200370388030c060b2008200b200e102c21080b2008450d02200e210b0b200c41206a210c200820136a220e200129038803370000200e41186a2014290300370000200e41106a2017290300370000200e41086a2018290300370000201341206a21130c000b0b200e41011037000b20014188036a41186a20014188026a41186a29030037030020014188036a41106a20014188026a41106a29030037030020014188036a41086a20014188026a41086a2903003703002001200129038802370388030b200141206a41086a2200200141f8046a41086a280200360200200141206a41246a20014188036a41186a290300370200200141206a411c6a20014188036a41106a290300370200200141206a41146a20014188036a41086a290300370200200120012903f8042202370320200120012903880337022c20014194046a200141206a41286a280200360200200141e8036a41246a200141c0006a290300370200200141e8036a411c6a200141206a41186a290300370200200141e8036a41146a200141206a41106a290300370200200141f4036a220f2000290300370200200120023702ec03200141003602e803200141003602a801200142013703a001410110282200450d11200141013602a401200120012802a801220341016a3602a801200120003602a001200020036a41013a000020012802ec032103200f2802002200200141a0016a10b40102402000450d002003200041286c6a210e03402003200141a0016a108f01200341206a29030021020240024020012802a401220f20012802a80122006b4108490d0020012802a001210f0c010b200041086a220c2000490d1c200f4101742200200c2000200c4b1b22004100480d1c02400240200f0d0020001028210f0c010b20012802a001200f2000102c210f0b200f450d15200120003602a4012001200f3602a00120012802a80121000b2001200041086a3602a801200f20006a2002370000200e200341286a2203470d000b0b200141f8036a200141a0016a10f10220014193026a200141a0016a41086a280200360000200120012903a0012202370388052001200237008b02200141ac016a2001418f026a290000370000200141c28289aa043600a101200141023a00a00120012001290088023700a501200141a0016a10ce01024020012802e8030d00200141e8036a41086a280200450d0020012802ec03102a0b410810282203450d13200320073602042003201536020041081028220f450d14200f201a360204200f201636020010fb01210c411b10282200450d15200041176a41002800d89646360000200041106a41002900d19646370000200041086a41002900c99646370000200041002900c196463700002000411b4136102c2200450d162000200c36001b20014188026a41186a220c420037030020014188026a41106a220e420037030020014188026a41086a2214420037030020014200370388022000411f20014188026a100020014188036a41186a200c29030037030020014188036a41106a200e29030037030020014188036a41086a220c20142903003703002001200129038802370388032000102a20014188036a4120100e109801210e200141206a41086a2200420037030020014200370320419be1c0004111200141206a1008200c200029030037030020012001290320370388032001200e3602e80320014188036a4110200141e8036a41041007200141a0016a200341a0bbc200108301200042003703002001420037032041c2e1c000410d200141206a1008200c2000290300370300200120012903203703880320012802a001210c20012802a8012100200141003602f003200142013703e8032000200141e8036a10b40102402000450d0020004105742103200c210003402000200141e8036a108f01200041206a2100200341606a22030d000b0b20012802ec03210020014188036a411020012802e803220320012802f003100702402000450d002003102a0b024020012802a401450d00200c102a0b200f102a410810282200450d172000201a36020420002016360200200141a0016a200041acbdc200108301200141206a41086a2200420037030020014200370320419695c4004117200141206a1008200141e8036a41086a2000290300370300200120012903203703e80320012802a001210f20012802a801210020014100360228200142013703202000200141206a10b40102402000450d0020004105742103200f210003402000200141206a108f01200041206a2100200341606a22030d000b0b20012802242100200141e8036a4110200128022022032001280228100702402000450d002003102a0b024020012802a401450d00200f102a0b02402021450d002016102a0b02402020201e45720d002001280214450d00201e102a0b0240201d450d00201c102a0b201ba7450d002015102a0b200141a0056a24000f0b1036000b41c4d1c300413320014198056a419cd9c3001038000b41c4d1c300413320014198056a419cd9c3001038000b411c41011037000b413841011037000b410841041037000b410841041037000b41c4d1c300413320014198056a419cd9c3001038000b41c0c7c20041c9001050000b200041011037000b41c0c7c20041c9001050000b41c4d1c300413320014198056a419cd9c3001038000b200b41011037000b411641011037000b412c41011037000b41c4d1c300413320014198056a419cd9c3001038000b410141011037000b200041011037000b410841041037000b410841041037000b411b41011037000b413641011037000b410841041037000b41c4d1c300413320014198056a419cd9c3001038000b1031000bd11906047f017e037f027e027f037e23004190046b22002400200041e8036a41086a22014200370300200042003703e80341e7fcc5004110200041e8036a100820004188036a41086a2001290300370300200020002903e80337038803200041e0016a20004188036a109a03024002400240024002400240024020002d00e0014102470d00200041e0016a41086a22024200370300200042003703e00141b1f0c200410d200041e0016a100820012002290300370300200020002903e0013703e803200041003602e001200041e8036a4110200041e0016a1006210102400240024002400240024020002802e0012202417f460d002001450d002000200236027420002001360270200041e0016a200041f0006a107620002802e0012203450d0220002902e40121042002450d012001102a0c010b41042103420021040b20032004422088a7220541246c22066a2102200321010240200641ed00490d00200321010340024020012d00004101470d00200141016a2800002106200141086a28020021072000200141106a28020036020c20002007360208200641c28289aa04470d00200041e0016a200041086a10ba0220002d00e00122074102460d00200041e0016a2101200041f0006a21020c050b0240200141246a2d00004101470d00200141256a28000021062001412c6a28020021072000200141346a28020036020c20002007360208200641c28289aa04470d00200041e0016a200041086a10ba0220002d00e00122074102460d00200041e0016a2101200041f0006a21020c050b0240200141c8006a2d00004101470d00200141c9006a2800002106200141d0006a28020021072000200141d8006a28020036020c20002007360208200641c28289aa04470d00200041e0016a200041086a10ba0220002d00e00122074102460d00200041e0016a2101200041f0006a21020c050b0240200141ec006a2d00004101470d00200141ed006a2800002106200141f4006a28020021072000200141fc006a28020036020c20002007360208200641c28289aa04470d00200041e0016a200041086a10ba0220002d00e00122074102460d00200041e0016a2101200041f0006a21020c050b200220014190016a22016b41ec004b0d000b0b20012002460d012003200541246c6a21020340024020012d00004101470d00200141016a2800002106200141086a28020021072000200141106a28020036020c20002007360208200641c28289aa04470d00200041e0016a200041086a10ba0220002d00e00122074102460d00200041e0016a2101200041f0006a21020c040b2002200141246a2201460d020c000b0b41c4d1c3004133200041e8026a419cd9c3001038000b410221070c010b20002002200141016a41ef00109a0522012800003602602000200141036a28000036006320002900772108200041086a200041ff006a41d800109a051a20002900d70121090b02402005450d00200541246c21022003210103400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012002415c6a22020d000b0b02402004a7450d002003102a0b200020002802603602682000200028006336006b200041f0006a200041086a41d800109a051a41002101024020074102460d00200020002802683602e0022000200028006b3600e302200020083703d802200041e0016a200041f0006a41d800109a051a200020093703d002200041e8036a41086a22014200370300200042003703e80341fefbc5004110200041e8036a100820004188036a41086a2001290300370300200020002903e80337038803200041003602a80320004188036a4110200041a8036a100621010240024020002802a8032202417f460d002001450d0020024108490d04200129000021042001102a200450450d010b200041d8026a200041d0026a20074101461b2903002104200041e8036a41086a22014200370300200042003703e80341fefbc5004110200041e8036a100820004188036a41086a22022001290300370300200020002903e80337038803200020043703a80320004188036a4110200041a8036a4108100720014200370300200042003703e80341eefbc5004110200041e8036a100820022001290300370300200020002903e8033703880341002101200041003602a80320004188036a4110200041a8036a100621060240024020002802a8032202417f470d000c010b200020023602ec03200020063602e803200041a8036a200041e8036a107720002802a8032201450d0520002902ac0321042002450d002006102a0b200041e8036a41086a22024200370300200042003703e803419efcc500410f200041e8036a100820004188036a41086a22062002290300370300200020002903e80337038803200041a8036a20004188036a10ef0220002d00a8032103200041e8036a41186a220a200041c1036a290000370300200041e8036a41106a220b200041b9036a2900003703002002200041b1036a290000370300200020002900a9033703e8032001410820011b21050240024020034101460d0020004188036a41186a420037030020004188036a41106a42003703002006420037030020004200370388030c010b20004188036a41186a200a29030037030020004188036a41106a200b29030037030020062002290300370300200020002903e803370388030b200041e8026a41086a20004188036a41086a2903002209370300200041e8026a41106a20004188036a41106a290300220c370300200041e8026a41186a20004188036a41186a290300220d3703002000200029038803220e3703e802200041a8036a41086a2004420020011b370300200041a8036a41106a220a200e370300200041a8036a41186a2009370300200041c8036a200c370300200041a8036a41286a200d370300200020053602ac03200041003602a803200041003602f003200042013703e803410110282201450d05200041013602ec03200020002802f003220241016a3602f003200020013602e803200120026a41013a000020002802ac032102200041a8036a410c6a2802002201200041e8036a10b40102402001450d002002200141286c6a210503402002200041e8036a108f01200241206a29030021040240024020002802ec03220620002802f00322016b4108490d0020002802e80321060c010b200141086a22032001490d0a200641017422012003200120034b1b22014100480d0a0240024020060d002001102821060c010b20002802e80320062001102c21060b2006450d09200020013602ec03200020063602e80320002802f00321010b2000200141086a3602f003200620016a20043700002005200241286a2202470d000b0b200a200041e8036a10f10220004193036a200041f0036a280200360000200020002903e80322043703d8032000200437008b03200041e8036a410c6a2000418f036a290000370000200041c28289aa043600e903200041023a00e80320002000290088033700ed03200041e8036a10ce0120002802a8030d0020002802b003450d0020002802ac03102a0b200041d8026a200041d0026a20074101461b2903002104200041e8036a41086a22014200370300200042003703e803418efcc5004110200041e8036a100820004188036a41086a2001290300370300200020002903e80337038803200020043703a80320004188036a4110200041a8036a410810074100210120070d00200041a8036a41086a200041e0016a41086a290300370300200041a8036a41106a200041e0016a41106a2d00003a0000200020002800e3023600eb02200020002802e0023602e802200020002903e0013703a803410121010b200041e0016a41086a2008370300200041e0016a41106a20002903a803370300200041f8016a200041a8036a41086a29030037030020004180026a200041a8036a41106a2d00003a0000200020013a00e001200020002802e8023600e101200020002800eb023600e401200041e8036a41086a22024200370300200042003703e80341e7fcc5004110200041e8036a100820004188036a41086a2002290300370300200020002903e80337038803410110282202450d0620004201370274200020023602700240024020010d0020004101360278200241003a00000c010b20004101360278200241013a0000200041e0016a410172200041f0006a10f1020b2000280274210120004188036a411020002802702202200028027810072001450d002002102a0b20004190046a24000f0b41c4d1c3004133200041e8026a419cd9c3001038000b41c4d1c3004133200041e8026a419cd9c3001038000b410141011037000b200141011037000b1031000b410141011037000bec0501057f23004190016b2202240002400240410f10282203450d00200341002900edae44370000200341076a41002900f4ae443700002002428f808080f001370214200220033602102001200241106a108f012002280218210320022802102101200241e0006a41186a22044200370300200241e0006a41106a22054200370300200241e0006a41086a220642003703002002420037036020012003200241e0006a1000200241306a41186a2004290300370300200241306a41106a2005290300370300200241306a41086a20062903003703002002200229036037033002402002280214450d002002280210102a0b20024100360260200241306a4120200241e0006a100621040240024020022802602201417f470d00410021030c010b2002200136025420022004360250200241e0006a200241d0006a10d4012002280280012203450d02200241106a41186a200241e0006a41186a290300370300200241106a41106a200241e0006a41106a290300370300200241106a41086a200241e0006a41086a290300370300200241086a2002418c016a2802003602002002200229036037031020022002290284013703002001450d002004102a0b200241e0006a41086a2201200241106a41086a290300370300200241e0006a41106a2204200241106a41106a290300370300200241e0006a41186a2205200241106a41186a290300370300200241d0006a41086a2206200241086a2802003602002002200229031037036020022002290300370350024002402003450d002000200229036037030020002003360220200041246a2002290350370200200041186a2005290300370300200041106a2004290300370300200041086a20012903003703002000412c6a20062802003602000c010b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000b20024190016a24000f0b410f41011037000b41c4d1c3004133200241106a419cd9c3001038000b84fc0111067f017e037f017e027f017e047f017e037f017e017f0a7e017f027e017f0a7e2a7f230041a0196b22022400200241e00e6a41086a22034200370300200242003703e00e41cd9cc6004123200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f41002104200241003602f011200241900f6a4110200241f0116a10062103024002400240024002400240024002400240024020022802f0112205417f460d002003450d0020054104490d01200328000021042003102a0b2001417f6a2106200241e00e6a41086a22034200370300200242003703e00e418e9dc6004110200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a1006210302400240024020022802f0112201417f460d002003450d002001450d0220032d0000220141034f0d022003102a200141014b0d06024020010e020100010b200241e00e6a41086a22034200370300200242003703e00e418e9dc6004110200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241900f6a411010090c010b200620046b220320064b0d0520034106490d050b200241f0116a41086a22034200370300200242003703f01141c785c2004112200241f0116a1008200241e00e6a41086a2003290300370300200220022903f0113703e00e200241003602f011200241e00e6a4110200241f0116a1006210302400240024020022802f0112204417f460d002003450d00200220043602940f200220033602900f200241f0116a200241900f6a106d20022802f0112207450d0220022902f41121082004450d012003102a0c010b41012107420021080b410021090240024002402008422088a7220341057422010d004108210a4100210b0c010b2001410575220bad42d0007e220c422088a70d0c200ca722044100480d0c20041028220a450d010b2008a7210d02402003450d00200141606a210e200241f0116a41206a2103200a2105200721040340200441086a2900002108200441106a290000210c2004290000210f200241e00e6a41186a2210200441186a290000370300200241e00e6a41106a2211200c370300200241e00e6a41086a221220083703002002200f3703e00e200241900f6a200241e00e6a10ec02200241f0116a41186a2010290300370300200241f0116a41106a2011290300370300200241f0116a41086a2012290300370300200320022903900f370300200341086a200241900f6a41086a290300370300200341106a200241900f6a41106a290300370300200341186a200241900f6a41186a290300370300200341206a200241900f6a41206a290300370300200341286a200241900f6a41286a290300370300200220022903e00e3703f0112005200241f0116a41d000109a0541d0006a2105200441206a2104200141606a22010d000b200e41057641016a21090b0240200d450d002007102a0b200241e00e6a41086a22034200370300200242003703e00e41f09cc600411e200241e00e6a1008200241900f6a41086a22042003290300370300200220022903e00e3703900f200241f0116a200241900f6a10de030240024020022802f41122130d004104211342002114410021110c010b200241900f6a4110100920022802f011211120022903f81121140b10a003210820034200370300200242003703e00e41feadc4004117200241e00e6a100820042003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a1006210302400240024020022802f0112204417f470d004200210c0c010b024020030d004200210c0c010b20044108490d012003290000210c2003102a0b200241e00e6a41086a22154200370300200242003703e00e41feadc4004117200241e00e6a1008200241900f6a41086a22162015290300370300200220022903e00e3703900f200220083703f011200241900f6a4110200241f0116a41081007410021172008200c7d2218500d0620154200370300200242003703e00e41a5afc4004116200241e00e6a100820162015290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a1006210302400240024020022802f0112204417f460d002003450d00200220043602e40e200220033602e00e200241f0116a200241e00e6a106d20022802f0112219450d0220022902f411211a02402004450d002003102a0b201a422088a721040c010b410021044200211a410121190b4200210c200241e00e6a41086a22034200370300200242003703e00e4199fec4004111200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a1006210302400240024020022802f0112201417f470d004200210c4200211b0c010b024020030d004200211b0c010b20014110490d01200341086a290000211b2003290000210c2003102a0b200241800c6a10a102200241f00b6a20022903800c220f200241800c6a41086a2903002208428094ebdc03420010a005200241d00b6a200c201b2004ad4200109f05200241e00b6a20022903f00b221b200241f00b6a41086a290300221c4280ec94a37c427f109f052008200241d00b6a41086a290300221d20022903d00b221e200f56201d200856201d2008511b22031b2108200f201e20031b210c2018428086ebc7f5002018428086ebc7f500541b421f8042ffffffff0f83428094ebdc037e429880b5e50380211f200f20022903e00b7c210f410021034184c9c0002104024002400340024041accbc00020046b41184b0d000240200441accbc000460d000340200241c00b6a201b201c200435020022184200109f052003200c20022903c00b22202018200f7e428094ebdc038042ffffffff0f837c22185a2008200241c00b6a41086a2903002018202054ad7c22205a200820205122011b6a2103200c201854200820205420011b0d0441accbc000200441086a2204470d000b0b200241b00b6a201b201c42e8aafa0b4200109f05200241b80b6a29030020022903b00b220c200f42e8aafa0b7e428094ebdc038042ffffffff0f837c2208200c54ad7c210c0c030b200241a00b6a201b201c200435020022184200109f052003200c20022903a00b22202018200f7e428094ebdc038042ffffffff0f837c22185a2008200241a00b6a41086a2903002018202054ad7c22205a200820205122011b6a2103200c201854200820205420011b0d01200241900b6a201b201c200441086a35020022184200109f052003200c20022903900b22202018200f7e428094ebdc038042ffffffff0f837c22185a2008200241900b6a41086a2903002018202054ad7c22205a200820205122011b6a2103200c201854200820205420011b0d01200241800b6a201b201c200441106a35020022184200109f052003200c20022903800b22202018200f7e428094ebdc038042ffffffff0f837c22185a2008200241800b6a41086a2903002018202054ad7c22205a200820205122011b6a2103200c201854200820205420011b0d01200241f00a6a201b201c200441186a35020022184200109f052003200c20022903f00a22202018200f7e428094ebdc038042ffffffff0f837c22185a2008200241f00a6a41086a2903002018202054ad7c22205a200820205122011b6a2103200441206a2104200c201854200820205420011b450d000b0b02402003417f6a220420034d0d00200241f0096a201b201c42c0f0f50b4200109f05200241f8096a29030020022903f009220c200f42288042ffffffff0f837c2208200c54ad7c210c0c010b02400240200441244b0d00200241e00a6a201b201c200441037422014184c9c0006a2802002205ad22184200109f05200241c00a6a200c20022903e00a22202018200f7e428094ebdc038042ffffffff0f837c2218200c2018562008200241e00a6a41086a2903002018202054ad7c22205620082020511b22041b22212018200c20041b220c7d22182008202020041b2020200820041b7d2021200c54ad7d4100200341037422104184c9c0006a280200220320056b2205200520034b1b22034101200341014b1bad2208420010a005200241b00a6a20022903c00a220c200241c00a6a41086a290300222020084200109f05200241d00a6a201b201c20014188c9c0006a2802002203ad22214200109f05200241800a6a2020420020104188c9c0006a28020022012003200120034b22051b2003200120051b6bad221b4200109f05200241a00a6a200c4200201b4200109f05200241900a6a42004200200c4200109f05427f427f200241a00a6a41086a290300220c20022903800a20022903900a7c7c221c20022903880a20022903980a84420052201c200c547222051b221c427f20022903a00a20051b220c201820022903b00a7d201b7e2008807c2208200c542205ad7c221b2005201b201c542008200c5a1b22051b211c427f200820051b211b200241d00a6a41086a29030020022903d00a22082021200f7e428094ebdc038042ffffffff0f837c220c200854ad7c21082004200120034d730d0142002008201c7d200c201b54ad7d220f200c201b7d221b200c56200f200856200f2008511b22031b210c4200201b20031b21080c020b41acd9c300200441251034000b427f2008201c7c200c201b7c220f200c542203ad7c220c2003200c200854200c2008511b22031b210c427f200f20031b21080b42002122200241e0096a2008200c428094ebdc03420010a005200241d0096a20022903e009220c200241e0096a41086a290300220f4280ec94a37c427f109f05200241c0096a200c200f201f4200109f05201f200820022903d0097c7e428094ebdc038021080240201a422088a722030d00420021230c080b20132014422088a74102746a210e201920034105746a2124200241c0096a41086a29030020022903c009220c200842ffffffff0f837c2225200c54ad7c2126200241f0116a41086a2127200241900f6a41086a21122011ad21284200212242002123201321052019211003402005200e460d08024020052802002203450d00024002400240024002402011450d00200241b0096a202520262028420010a005200241a0096a20022903b0092208200241b0096a41086a290300220c20284200109f0520024190096a2008200c20112003200320114b1bad220f4200109f05202520022903a0097d200f7e2028802108200229039009210f20024190096a41086a290300211c411210282203450d01200341002900c1ae44370000200341106a41002f00d1ae443b0000200341086a41002900c9ae4437000020024292808080a0023702f411200220033602f0112010200241f0116a108f0120022802f811210320022802f0112104200241900c6a41186a22014200370300200241900c6a41106a22074200370300200241900c6a41086a220d4200370300200242003703900c20042003200241900c6a1000200241c00d6a41186a2001290300370300200241c00d6a41106a2007290300370300200241c00d6a41086a200d290300370300200220022903900c3703c00d024020022802f411450d0020022802f011102a0b200241003602f011200241c00d6a4120200241f0116a1006210320022802f0112204417f460d032003450d03200220043602f411200220033602f011200241f8086a200241f0116a109f0120022903f808a70d02200241f8086a41106a290300210c200229038009211b2004450d042003102a0c040b41acfec4001032000b411241011037000b41c4d1c300413320024198196a419cd9c3001038000b4200211b4200210c0b0240024002400240024002400240200f200842ffffffff0f837c2208201b2008201b200854200c201c2008200f54ad7c220f54200c200f511b22031b22297d222a200f200c200f20031b222b7d2008202954ad7d222c8450450d004200211f4200211c420021084200210c0c010b200241f0116a201010ec0220272903002208420020022903f011220c42015620084200522008501b22031b2108200c420120031b210f20022802901221070240024020022802981222030d004200211f200241f0076a200f2008428094ebdc03420010a005200241f0076a41086a290300212d20022903f007212e4200211c0c010b2007200341306c6a21014200211f200241e8086a200f2008428094ebdc03420010a005200241c8086a202a202c428094ebdc03420010a005200241d8086a202a202c428094ebdc03420010a105200241e8086a41086a290300222d420020022903e808222e420156202d420052202d501b22031b2118202e420120031b2120200241c8086a41086a290300212f20022903c808213020022903d80821314200211c200721030340200241b8086a200f2003290300220c200c200f56200341086a290300220c200856200c2008511b22041b2008200c20041b2020201810a00520022903b808221b428080808010544100200241b8086a41086a290300501b450d03200241a8086a200f20082020201810a00520022903a808220c428080808010544100200241a8086a41086a290300501b450d04024002400240200ca7450d0020024180086a2030202f201b42ffffffff0f83428094ebdc037e200c42ffffffff0f838042ffffffff0f83220c4200109f0520024190086a200341106a2203200229038008221b200c20317e428094ebdc038042ffffffff0f837c220c20024180086a41086a290300200c201b54ad7c10b404200229039008210c200229039808211b200241900f6a41106a20024190086a41106a29030022213703002002201b3703980f2002200c3703900f0240200ca74101470d00427f201c20217c201f201b7c221b201f542204ad7c220c2004200c201c54200c201c511b22041b211c427f201b20041b211f0c030b200c4201510d010c020b41acaac3001032000b200220123602e00e200241e00e6a109c010b200341206a22032001470d000b0b200241e0076a200f200229038012220c200c200f56200241f0116a41186a290300220c200856200c2008511b22031b2008200c20031b202e4201202e420156202d420052202d501b22031b220c202d420020031b221b10a00520022903e0072218428080808010544100200241e0076a41086a290300501b450d01200241d0076a200f2008200c201b10a00520022903d0072208428080808010544100200241d0076a41086a290300501b450d022008a7450d03200241c0076a202a202c428094ebdc03420010a005200241b0076a20022903c007220c200241c0076a41086a290300220f4280ec94a37c427f109f05200241a0076a200c200f201842ffffffff0f83428094ebdc037e200842ffffffff0f838042ffffffff0f8322084200109f0520022903a007220c2008202a20022903b0077c7e428094ebdc038042ffffffff0f837c2208200c54ad210c200241a0076a41086a290300210f0240200228029412450d002007102a0b200f200c7c210c0b20024188076a2010200820297c220f200c202b7c200f200854ad7c10b4042002290388072108200229039007210c200241f0116a41106a20024188076a41106a290300220f3703002002200c3703f811200220083703f01102402008a74101470d00427f201c200f7c201f200c7c220c201f542203ad7c220820032008201c542008201c511b22031b211c427f200c20031b211f0c050b20084201510d030c040b10d101000b10d201000b41acaac3001032000b200220273602900f200241900f6a109c010b427f2023201c7c2022201f7c220c2022542203ad7c22082003200820235420082023511b22031b2123427f200c20031b21220b200541046a2105201041206a22102024470d000c080b0b41c4d1c300413320024198196a419cd9c3001038000b41c4d1c300413320024198196a419cd9c3001038000b41c4d1c300413320024198196a419cd9c3001038000b200441081037000b41c4d1c300413320024198196a419cd9c3001038000b41c4d1c300413320024198196a419cd9c3001038000b41c4d1c300413320024198196a419cd9c3001038000b02402014a7450d002013102a0b20024188126a202337030020024180126a2022370300200241f8116a41003a0000200241033a00f0114101211741014100200241f0116a10cc01200220233703f811200220223703f0112002200241f0116a3602900f200241900f6a109c0102402022202384500d00201e201d84500d00200241f8066a10a10220022903f8062208201e7d220f200856200241f8066a41086a290300220c201d7d2008201e54ad7d2208200c562008200c511b0d00200241e8066a200f2008201e201d10a005200241b8066a200241e8066a41086a2903002208420020224200109f05200241c8066a2023420020022903e806220c4200109f05200241d8066a200c420020224200109f05200842005220234200527120022903c0064200527220022903d00642005272200241d8066a41086a290300220820022903b80620022903c8067c7c220f200854720d0020022903d806211b200241e00e6a41086a22034200370300200242003703e00e41ace1c0004116200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a100621030240024020022802f0112204417f460d002003450d00024020044110490d00200341086a290000210c200329000021082003102a0c020b41c4d1c300413320024198196a419cd9c3001038000b420021084200210c0b200241e00e6a41086a22034200370300200242003703e00e41ace1c0004116200241e00e6a1008200241900f6a41086a22042003290300370300200220022903e00e3703900f2002427f200c200f7c2008201b7c22182008542203ad7c221c2003201c200c54201c200c511b22031b3703f8112002427f201820031b3703f011200241900f6a4110200241f0116a41101007200241f0116a10d301200241a8066a200241f0116a2008427f85201b20031b2208200c427f85200f20031b220c10d001200241900f6a41106a200c200241a8066a41086a290300221b7d200820022903a806220f54ad7d201b200c7d200f200854ad7d200f200858201b200c58201b200c5122031b22011b37030020022008200f7d200f20087d20011b3703980f2002200f200856201b200c5620031b2203ad3703900f024020030d00200220043602e00e200241e00e6a109d010c010b200220043602e00e200241e00e6a109c010b201aa7450d002019102a0b20154200370300200242003703e00e41bb9cc6004112200241e00e6a100820162015290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a10062103024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802f0112204417f470d00410021270c010b024020030d00410021270c010b20044104490d01200328000021272003102a0b200241e00e6a41086a22034200370300200242003703e00e41bb9cc6004112200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f2002202741016a22163602f011200241900f6a4110200241f0116a41041007411710282203450d012003410f6a41002900d3fe44370000200341086a41002900ccfe44370000200341002900c4fe4437000020034117412e102c2203450d0220032027360017200241900c6a41186a22044200370300200241900c6a41106a22014200370300200241900c6a41086a22054200370300200242003703900c2003411b200241900c6a1000200241c00d6a41186a2004290300370300200241c00d6a41106a2001290300370300200241c00d6a41086a2005290300370300200220022903900c3703c00d2003102a200241c00d6a41201009200241e00e6a41086a22034200370300200242003703e00e41cd9cc6004123200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a10062103024020022802f0112204417f460d002003450d00200441034d0d042003102a0b200241e00e6a41086a22154200370300200242003703e00e41cd9cc6004123200241e00e6a1008200241900f6a41086a22192015290300370300200220022903e00e3703900f200220063602f011200241900f6a4110200241f0116a41041007201641a105490d0920154200370300200242003703e00e41b99dc6004112200241e00e6a100820192015290300370300200220022903e00e3703900f41002112200241003602f011200241900f6a4110200241f0116a100621320240024020022802f0112233417f470d000c010b024020320d000c010b200220333602f411200220323602f011200241a0066a200241f0116a106c20022802a0060d2e20022802f41122104178712203417f4c0d2020022802a406210e02400240201041037622070d00410421120c010b200310282212450d060b0240200e450d004100211141002105410021010340200241003602e00e02400240024020104104490d0020022010417c6a22103602f411200220022802f011220341046a3602f0112003280000210d200241003602e00e20104104490d00200141016a210420022010417c6a22103602f4112002200341086a3602f0112003280004210320012007470d0220112004201120044b1b220741ffffffff01712007470d342007410374222441004e0d010c340b2007450d322012102a0c320b0240024020010d002024102821120c010b201220052024102c21120b2012450d090b201220056a2201200d360200200141046a2003360200201141026a2111200541086a210520042101200e2004470d000b0b2012450d2e200ead4220862007ad8421082033450d002032102a0b2012410420121b210e02402008420020121b2208422088220ca722032008a7470d00200341016a22042003490d2f200ca722054101742201200420042001491b220441ffffffff01712004470d2f200441037422014100480d2f0240024020030d0020011028210e0c010b200e20054103742001102c210e0b200e450d072008422088a721032004ad21080b202741e17a6a2104200e20034103746a2201200636020420012016360200200e200341016a22114103746a2110410021030240201141044f0d00200e21010c080b200e2105024003402005220128020020044f0d0a0240200141086a2802002004490d00200341016a21030c0b0b0240200141106a2802002004490d00200341026a21030c0b0b200141186a28020020044f0d01200341046a21032010200141206a22056b41184b0d000b200141206a21010c080b200341036a21030c080b41c4d1c300413320024198196a419cd9c3001038000b411741011037000b412e41011037000b41c4d1c300413320024198196a419cd9c3001038000b200341041037000b202441041037000b200141041037000b20012010460d00200e20114103746a21050340200128020020044f0d01200341016a21032005200141086a2201470d000b0b20112003490d01200842ffffffff0f8321080240201120036b2207450d0002402003450d00200e200e20034103746a2007410374109b051a0b200e280204210d200241e00e6a41086a22124200370300200242003703e00e418199c6004113200241e00e6a1008200241900f6a41086a22242012290300370300200220022903e00e3703900f200241f0116a200241900f6a411010c6024101210320022902f411210c0240024020022802f01122044101460d00200441014621030c010b200c422088a72206200d200d20064b1b2211200ca72204490d000240201120044d0d000340411a10282203450d06200341186a41002f00e0bb403b0000200341106a41002900d8bb40370000200341086a41002900d0bb40370000200341002900c8bb403700002003411a4134102c2203450d072003200436001a200241900c6a41186a22014200370300200241900c6a41106a22054200370300200241900c6a41086a22104200370300200242003703900c2003411e200241900c6a1000200241b00c6a41186a2001290300370300200241b00c6a41106a2005290300370300200241b00c6a41086a2010290300370300200220022903900c3703b00c2003102a200241b00c6a41201009200441016a2203210420112003470d000b0b200d2006492103200c428080808070832011ad84210c0b20124200370300200242003703e00e418199c6004113200241e00e6a100820242012290300370300200220022903e00e3703900f0240024020030d00200241900f6a411010090c010b410810282203450d062003200c422088a73600042003200ca7360000200241900f6a41102003410810072003102a0b20082007ad4220868421080b200241e00e6a41086a22034200370300200242003703e00e41b99dc6004112200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f0240200e0d00200241900f6a411010090c010b200241003602f811200242013703f0112008422088a72203200241f0116a10b4010240024020030d0020022802f811210320022802f411210120022802f01121040c010b200e20034103746a2106410020022802f81122116b210520022802f4112101410021030340201120036a2110200e20036a2212280200210702400240200120056a4104490d0020022802f01121040c010b201041046a22042010490d282001410174220d2004200d20044b1b220d4100480d280240024020010d00200d102821040c010b20022802f0112001200d102c21040b2004450d082002200d3602f411200220043602f011200d21010b2002201041046a220d3602f811200420116a20036a2007360000201241046a28020021070240200120056a417c6a41034b0d00200d41046a2224200d490d282001410174220d2024200d20244b1b220d4100480d280240024020010d00200d102821040c010b20042001200d102c21040b2004450d092002200d3602f411200220043602f011200d21010b2002201041086a3602f811200420116a20036a41046a2007360000200541786a2105200341086a2103201241086a2006470d000b201120036a21030b2008a72105200241900f6a411020042003100702402001450d002004102a0b2005450d00200e102a0b20154200370300200242003703e00e41889cc6004116200241e00e6a100820192015290300370300200220022903e00e3703900f41002134200241003602f011200241900f6a4110200241f0116a10062103024020022802f0112204417f460d002003450d0020044104490d07200328000021342003102a0b200241e00e6a41086a22034200370300200242003703e00e419e9cc600411d200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a10062103024002400240024020022802f0112204417f460d0020030d010b410421040c010b20044104490d09200328000021042003102a41012115200441014d0d010b200421150b200241900c6a41186a22034200370300200241900c6a41106a22044200370300200241900c6a41086a22014200370300200242003703900c41d3aec400411a200241900c6a1000200241f0116a41186a2003290300370300200241f0116a41106a2004290300370300200241f0116a41086a2001290300370300200220022903900c3703f011200241900e6a200241f0116a412010fd01200241e00e6a41206a200241900e6a41206a2d00003a0000200241e00e6a41186a200241900e6a41186a290300370300200241e00e6a41106a200241900e6a41106a290300370300200241e00e6a41086a200241900e6a41086a290300370300200220022903900e3703e00e200241f0116a200241e00e6a10ab010240024020022903f0114201510d004101211141002105410021060c010b200220022f01f8113b01e00c2002200229008b123703d00c2002200241fa116a2d00003a00e20c2002200241f0116a41206a2900003700d50c200241fb116a2800002103200241ff116a280000210420024183126a280000210120024187126a2800002105412010282211450d09201120022f01e00c3b00002011200536000f2011200136000b2011200436000720112003360003201120022903d00c370013201141026a20022d00e20c3a0000201141186a20022900d50c370000200241900f6a41206a200241e00e6a41206a2d00003a0000200241900f6a41186a200241e00e6a41186a290300370300200241900f6a41106a200241e00e6a41106a290300370300200241900f6a41086a200241e00e6a41086a290300370300200220022903e00e3703900f200241f0116a200241900f6a10ab0141012105024020022903f0114201510d00410121060c010b200241f0116a41086a2103410221104120210141012105410121060340200241b00c6a41186a200341186a2903002208370300200241b00c6a41106a200341106a290300220c370300200241b00c6a41086a200341086a290300220f37030020022003290300221b3703b00c200241900c6a41186a22122008370300200241900c6a41106a2207200c370300200241900c6a41086a220d200f3703002002201b3703900c024020052006470d00200541016a22042005490d2720102004201020044b1b220641ffffff3f712006470d27200641057422044100480d270240024020050d002004102821110c010b201120012004102c21110b2011450d110b201120016a220420022903900c370000200441186a2012290300370000200441106a2007290300370000200441086a200d290300370000201041026a2110200141206a2101200541016a2105200241f0116a200241900f6a10ab0120022903f0114201510d000b0b200241900c6a41186a22034200370300200241900c6a41106a22044200370300200241900c6a41086a22014200370300200242003703900c41a7aec400411a200241900c6a1000200241f0116a41186a2003290300370300200241f0116a41106a2004290300370300200241f0116a41086a2001290300370300200220022903900c3703f011200241e00d6a200241f0116a412010fd01200241900e6a41206a200241e00d6a41206a2d00003a0000200241900e6a41186a200241e00d6a41186a290300370300200241900e6a41106a200241e00d6a41106a290300370300200241900e6a41086a200241e00d6a41086a290300370300200220022903e00d3703900e200241f0116a200241900e6a10ad01024002402002280290120d004104213541002104410021360c010b412c10282235450d0a203520022903f011370200203541286a200241f0116a41286a2212280200360200203541206a200241f0116a41206a2207290300370200203541186a200241f0116a41186a220d290300370200203541106a200241f0116a41106a220e290300370200203541086a200241f0116a41086a2224290300370200200241e00e6a41206a200241900e6a41206a2d00003a0000200241e00e6a41186a200241900e6a41186a290300370300200241e00e6a41106a200241900e6a41106a290300370300200241e00e6a41086a200241900e6a41086a290300370300200220022903900e3703e00e200241900f6a200241e00e6a10ad01024020022802b00f0d0041012104410121360c010b41022110412c2101410121044101213603402012200241900f6a41286a2802003602002007200241900f6a41206a290300370300200d200241900f6a41186a290300370300200e200241900f6a41106a2903003703002024200241900f6a41086a290300370300200220022903900f3703f011024020042036470d00200441016a22032004490d2720102003201020034b1b2236ad422c7e2208422088a70d272008a722034100480d270240024020040d002003102821350c010b203520012003102c21350b2035450d0d0b203520016a220320022903f011370200200341286a2012280200360200200341206a2007290300370200200341186a200d290300370200200341106a200e290300370200200341086a2024290300370200201041026a21102001412c6a2101200441016a2104200241900f6a200241e00e6a10ad0120022802b00f0d000b0b200242003702ec0c200241f8b9c0003602e80c200420056a2201ad42d0007e2208422088a70d152008a72203417f4c0d150240024020030d00410821100c010b200310282210450d0c0b200241003602c80e200220013602c40e200220103602c00e200241900e6a41206a200241e80c6a360200200241003602a80e200241a40e6a20024198196a36020020022011200541057422016a220d36029c0e200220113602980e200220063602940e200220113602900e2002200241c00e6a3602ac0e200220024198196a3602a00e410221244101210e0240024020050d00201121030c010b4200211b2011210302400340200341086a2900002108200341106a290000210c2003290000210f200241f0116a41186a2205200341186a290000370300200241f0116a41106a2210200c370300200241f0116a41086a221220083703002002200f3703f01120024190066a200241f0116a10b004200241b00c6a41086a22072012290300370300200241b00c6a41106a22122010290300370300200241b00c6a41186a22102005290300370300200220022903f0113703b00c20024190066a41086a290300210c200229039006210f20024180066a10a102200241f0056a20022903800620024180066a41086a290300427f420010a005200241e0056a200f200c20022903f005220842012008420156200241f0056a41086a29030022084200522008501b22051b2008420020051b10a005200241900c6a41086a2007290300370300200241900c6a41106a2012290300370300200241900c6a41186a2010290300370300200220022903b00c3703900c20022903e005220850450d01200341206a2103200141606a22010d000b2002200d3602980e200d21030c010b200220022f01900c3b01e00c200220022d00920c3a00e20c200220022900a30c3703d00c200220022800f80c3602b80d2002200341206a22033602980e2002200241a80c6a2900003700d50c2002200241fb0c6a2800003600bb0d20022800930c210120022800970c2112200228009b0c2110200228009f0c2105200220022d00e20c3a00a20d200220022f01e00c3b01a00d200220022900d50c3700f511200220022903d00c3703f011200220022800bb0d3600c30d200220022802b80d3602c00d200220022d00a20d3a00aa0d200220022f01a00d3b01a80d200220022900f5113700e50e200220022903f0113703e00e200220022800c30d3600b30d200220022802c00d3602b00d4100210e410021240b200220022f01a80d3b01c00d200220022d00aa0d3a00c20d200220022903e00e3703f011200220022900e50e3700f511200220022802b00d3602a00d200220022800b30d3600a30d024002400240200e450d00200241023a00d00f0c010b200220022d00c20d3a009a0d200220022f01c00d3b01980d200220022903f0113703e00d200220022900f5113700e50d200220022802a00d3602880d200220022800a30d36008b0d200241013602a80e200220022d009a0d3a00960d200220022f01980d3b01940d200220022900e50d3700d50e200220022903e00d3703d00e20024190126a201b37030020024188126a200837030020024180126a4200370300200241a7126a2005360000200241a3126a20103600002002419f126a20123600002002419b126a2001360000200242003703f811200242003703f01120024198126a20022f01940d3b01002002419a126a20022d00960d3a0000200241f0116a41c8006a20243a0000200241ab126a20022903d00e370000200241b0126a20022900d50e370000200241bc126a200228008b0d360000200241b9126a20022802880d360000200241900f6a200241ac0e6a200241f0116a10fb0220022d00d00f4102470d010b02402003200d460d002002200d20036b41606a41607120036a41206a3602980e0b410021372006450d142011102a0c140b41c80010282238450d0c2038200241900f6a41c800109a051a200241e00e6a41086a200241900e6a41086a2903002208370300200241e00e6a41206a200241900e6a41206a280200360200200241e00e6a41186a200241900e6a41186a290300370300200241e00e6a41106a200241900e6a41106a290300370300200220022903900e3703e00e410121102008a7220320022802ec0e2201460d10200241b9126a210e200241fc0e6a21274200211b02400340200341086a2900002108200341106a290000210c2003290000210f200241f0116a41186a2205200341186a290000370300200241f0116a41106a2211200c370300200241f0116a41086a221220083703002002200f3703f011200241d0056a200241f0116a10b004200241b00c6a41086a22072012290300370300200241b00c6a41106a22122011290300370300200241b00c6a41186a22112005290300370300200220022903f0113703b00c200241d0056a41086a290300210c20022903d005210f200241c0056a10a102200241b0056a20022903c005200241c0056a41086a290300427f420010a005200241a0056a200f200c20022903b005220842012008420156200241b0056a41086a29030022084200522008501b22051b2008420020051b10a005200241900c6a41086a2007290300370300200241900c6a41106a2012290300370300200241900c6a41186a2011290300370300200220022903b00c3703900c20022903a005220850450d012001200341206a2203470d000b200220013602e80e200121030c110b200220022f01900c3b01e00c200220022d00920c3a00e20c200220022900a30c3703d00c200220022800f80c3602b80d2002200341206a22033602e80e2002200241900c6a41186a220d2900003700d50c2002200241f80c6a41036a22392800003600bb0d20022800930c211120022800970c2112200228009b0c2107200228009f0c2116200220022d00e20c3a008a0d200220022f01e00c3b01880d200220022900d50c3700e50d200220022903d00c3703e00d200220022800bb0d3600b30d200220022802b80d3602b00d20024198126a2124200241a30c6a213a20022802f80e2105200241f0116a410472220641086a2133200641106a213b200241ab126a223c41056a213d41012110410121370340200220022d008a0d22193a00aa0d200220022f01880d22323b01a80d200220022903e00d3703c00d200220022900e50d3700c50d200220022802b00d3602a00d200220022800b30d3600a30d200220193a00960d200220323b01940d2002200541016a22193602f80e200220022900c50d3700d50e200220022903c00d3703d00e200241f0116a41206a201b3703002006420037020020334200370200203b41003602002002200837038812200220053602f011202420022f01940d3b0100202441026a20022d00960d3a0000200220163600a712200220073600a3122002201236009f122002201136009b12203c20022903d00e370000203d20022900d50e370000200241003a00b812200e41036a20022800a30d360000200e20022802a00d360000200241900f6a2027200241f0116a10fb02024020022d00d00f4102470d00203821110c140b200241f0116a200241900f6a41c800109a051a024020372010470d00201041016a22052010490d26201041017422112005201120054b1b2237ad42c8007e2208422088a70d262008a722054100480d260240024020100d002005102821380c010b2038201041c8006c2005102c21380b2038450d0f0b2038201041c8006c6a200241f0116a41c800109a051a201041016a2110024020032001470d00200121030c130b02400340200241f0116a41186a2205200341186a290000370300200241f0116a41106a2211200341106a290000370300200241f0116a41086a2212200341086a290000370300200220032900003703f01120024190056a200241f0116a10b004200241b00c6a41086a22072012290300370300200241b00c6a41106a22122011290300370300200241b00c6a41186a22112005290300370300200220022903f0113703b00c20024190056a41086a290300210c200229039005210f20024180056a10a1024200211b200241f0046a20022903800520024180056a41086a290300427f420010a005200241e0046a200f200c20022903f004220842012008420156200241f0046a41086a29030022084200522008501b22051b2008420020051b10a005200241900c6a41086a2007290300370300200241900c6a41106a2012290300370300200d2011290300370300200220022903b00c3703900c20022903e004220850450d012001200341206a2203460d120c000b0b200220022f01900c3b01e00c200220022d00920c3a00e20c200220022800f80c3602b80d2002200341206a22033602e80e2002203a2900003703d00c2002203a41056a2900003700d50c200220392800003600bb0d20022800930c211120022800970c2112200228009b0c2107200228009f0c2116200220022d00e20c3a008a0d200220022f01e00c3b01880d200220022900d50c3700e50d200220022903d00c3703e00d200220022800bb0d3600b30d200220022802b80d3602b00d201921050c000b0b41e4e8c5001032000b411a41011037000b413441011037000b410841011037000b200d41011037000b200d41011037000b41c4d1c300413320024198196a419cd9c3001038000b41c4d1c300413320024198196a419cd9c3001038000b412041011037000b412c41041037000b200341041037000b200341081037000b41c80041081037000b200541081037000b200441011037000b200220013602e80e200121030c010b410121370b20382111200241023a00d00f0b024020032001460d002002200120036b41606a41607120036a41206a3602e80e0b20022802e40e450d0120022802e00e102a0c010b4108213841082111410021100b0240024002400240024002400240024020102015490d000240024020022802c40e220320022802c80e223d6b2004412c6c2201412c6d2205490d0020022802c00e21030c010b203d20056a2205203d490d18200341017422122005201220054b1b2205ad42d0007e2208422088a70d182008a722124100480d180240024020030d002012102821030c010b20022802c00e200341d0006c2012102c21030b2003450d02200220053602c40e200220033602c00e20022802c80e213d0b203520016a213e024020040d002035213b0c070b2003203d41d0006c6a2133203521030340200241c00d6a41186a2204200341186a290200370300200241c00d6a41106a2201200341106a290200370300200241c00d6a41086a2205200341086a290200370300200220032902003703c00d2003412c6a213b2003280220223c450d07200341286a2802002124200341246a280200213a200241900f6a41186a22392004290300370300200241900f6a41106a223f2001290300370300200241900f6a41086a22402005290300370300200220022903c00d3703900f200241d0046a200241900f6a10b0042024ad42387e2208422088a70d092008a72203417f4c0d09200241d0046a41086a290300211c20022903d00421180240024020030d00410821150c010b200310282215450d040b0240024020240d0041002124410021060c010b203c20244105746a213241002106203c21070340200741086a2900002108200741106a290000210c2007290000210f200241f0116a41186a2227200741186a290000370300200241f0116a41106a2216200c370300200241f0116a41086a221920083703002002200f3703f011200741206a2107200241e80c6a210320022802ec0c210d024003402003280200221241086a210420122f0106220e4105742103410021010240024003402003450d01200241f0116a20044120109c052205450d02200341606a2103200141016a2101200441206a21042005417f4a0d000b2001417f6a210e0b200d450d02200d417f6a210d2012200e4102746a4194036a21030c010b0b2010201220014102746a41e8026a220328020022044d0d072011200441c8006c6a22042903102108200441186a290300210c200241c0046a10a102200241b0046a20022903c004200241c0046a41086a290300427f420010a0052010200328020022044d0d08200241a0046a2018201c20022903b004220f4201200f420156200241b0046a41086a290300220f420052200f501b22011b200f420020011b10a0052011200441c8006c6a220441186a427f200c200820022903a0047c220f2008542201ad7c221b2001201b200c54200f20085a1b22011b3703002004427f200f20011b370310200241900c6a41186a22042027290300370300200241900c6a41106a22012016290300370300200241900c6a41086a22052019290300370300200220022903f0113703900c200328020021120240024020062024460d00200621030c010b202441016a22032024490d1c2024410174220d2003200d20034b1b220dad42387e2208422088a70d1c2008a722034100480d1c0240024020240d002003102821150c010b2015202441386c2003102c21150b2015450d0a20242103200d21240b2015200341386c6a220342003703082003420037030020032012360210200320022903900c3702142003411c6a2005290300370200200341246a20012903003702002003412c6a2004290300370200200641016a21060b20072032470d000b0b0240203a450d00203c102a0b200241b00c6a41186a22032039290300370300200241b00c6a41106a2204203f290300370300200241b00c6a41086a22012040290300370300200220022903900f3703b00c20024190046a10a10220024180046a20022903900420024190046a41086a290300427f420010a005200241f0036a2018201c20022903800422084201200842015620024180046a41086a29030022084200522008501b22051b2008420020051b10a00520334200370308203320022903f00337030020334200370310203341186a4200370300203320063602282033202436022420332015360220203320022903b00c37022c203341346a20012903003702002033413c6a2004290300370200203341c4006a2003290300370200203d41016a213d203341d0006a2133203b2103203b203e470d000b2002203d3602c80e0c070b02402037450d002038102a0b024020022802c80e2203450d00200341d0006c210120022802c00e41206a210303400240200341046a280200450d002003280200102a0b200341d0006a2103200141b07f6a22010d000b0b024020022802c40e450d0020022802c00e102a0b20022802e80c20022802ec0c20022802f00c10bc0202402004450d002004412c6c2104203541206a210303400240200341046a280200450d002003280200102a0b2003412c6a2103200441546a22040d000b0b2036450d0f2035102a0c0f0b201241081037000b200341081037000b41a09ec400200420101034000b41b09ec400200420101034000b200341081037000b2002203d3602c80e203b203e460d000340203b41206a2802002204450d01203b412c6a21030240203b41246a280200450d002004102a0b2003213b203e2003470d000b0b02402036450d002035102a0b2034ad42307e2208422088a70d002008a72203417f4c0d00024002400240024020030d00410821060c010b200310282206450d010b2034412c6c2203417f4c0d0202400240024020030d004104213f0c010b20031028223f450d010b4100213602402010203420102034491b223b0d0020342141410021390c030b2011201041c8006c22356a2127200241f0116a41106a2132200241f0116a41086a213320112103203421164100213941002119034002402010450d002035210403400240200341c0006a2d00000d00200241e0036a427f427f200341106a290300220842012008420156200341186a29030022084200522008501b22011b2008420020011b10a0052003200241e0036a41086a290300370308200320022903e0033703000b200341c8006a2103200441b87f6a22040d000b0b20022802c00e220520022802c80e220e41d0006c6a211502400240024002400240200e450d00200521120340024020122802282203450d00200341386c2101201228022041106a210303402010200328020022044d0d0402402011200441c8006c6a22042d00400d002004290310220c200441186a290300220f84500d00200241d0036a2012290300220842004280808080104200109f05200241a0036a4200420020084200109f05200241c0036a427f20022903d003201241086a290300220842ffffffff0f8320085220022903a80342005272200241d0036a41086a290300221b200842208620022903a0037c7c2208201b547222071b427f200820071b200c200f10a005200241b0036a201241146a350200201241186a290300220842208684200842208820022903c003200241c0036a41086a290300109f052004427f2004290300220820022903b0037c220c200c2008542207200441086a220d2903002208200241b0036a41086a2903007c2007ad7c220c200854200c2008511b22071b370300200d427f200c20071b3703000b200341386a2103200141486a22010d000b0b201241d0006a22122015470d000b0b201941016a21192011201041c8006c6a21122035210420112103024003402003210102400240201220036b41d8014d0d00200141c0006a2d00000d01200141c8006a21030c070b0340024020040d00201621410c0c0b200441b87f6a2104200141c0006a2107200141c8006a2203210120072d00000d000b200341b87f6a21010c060b20014188016a2d0000450d01200141d0016a2d0000450d03200441e07d6a2104200141a0026a210320014198026a2d00000d000b410321040c030b20014190016a2103410121040c020b41bcc0c200200420101034000b200141d8016a2103410221040b2001200441c8006c6a21010b024020032012460d00200141086a29030021082001290300210c0340200341c8006a21040240200341c0006a2d00000d00200341086a290300220f2008200c2003290300221b562008200f562008200f511b22121b2108201b200c20121b210c2003200120121b21010b2004210320272004470d000b0b200141013a00400240200e450d002001410c6a210d200141206a210e0340200541d0006a2124024020052802282204450d0020052802202103200441386c2104034002400240200d2003460d00200341146a200e4120109c050d010b200541186a22122903002108200141086a2207290300210c20032001290300220f2005290310221b7d3703002003200c20087d200f201b54ad7d3703082001290300210820122007290300370300200520083703100b200341386a2103200441486a22040d000b0b2024210520242015470d000b0b200129031021082032200141306a2900003703002033200141286a290000370300200141186a290300210c200241f0116a41186a2203200141386a290000370300200220012900203703f01102400240024020392016460d00201621410c010b201641016a22042016490d15201641017422012004200120044b1b2241ad42307e220f422088a70d15200fa722044100480d150240024020160d002004102821060c010b2006201641306c2004102c21060b2006450d0120162139204121160b2033290300210f2032290300211b2003290300211c20022903f01121182006203941306c6a2203200837032020032018370300200341286a200c370300200341186a201c370300200341106a201b370300200341086a200f370300203941016a2139201121032019203b4f0d040c010b0b200441081037000b200341041037000b200341081037000b024020022802c80e2203450d0020022802c00e2235200341d0006c6a2140200641e0006a213b2006203941306c22036a210d200241900e6a41186a213c200241900e6a41106a213d200241900e6a41086a213a20034191014921334100213602400340203c203541c4006a290000370300203d2035413c6a290000370300203a203541346a2900003703002002203529002c3703900e024020352802282203450d0020352802202204200341386c6a21322035412c6a211641002127410821194100211503402006210302400240024020330d00203b2103024002400240200441146a2201200241f0116a46220e450d0020062903202108200641086a290300210c200641106a290300210f200641186a290300211b2006290300211c200241f0116a41286a200641286a290300370300200241f0116a41186a201b370300200241f0116a41106a200f370300200241f0116a41086a200c37030020022008370390122002201c3703f0110c010b024002400340200341406a22102903002108200341a07f6a2205290300210c200541086a290300210f200541106a290300211b200541186a290300211c200241f0116a41286a2205201041086a290300370300200241f0116a41186a2210201c370300200241f0116a41106a2211201b370300200241f0116a41086a2212200f37030020022008370390122002200c3703f011200241f0116a20014120109c05450d03200341706a22242903002108200341506a2207290300210c200741086a290300210f200741106a290300211b200741186a290300211c2005202441086a2903003703002010201c3703002011201b3703002012200f37030020022008370390122002200c3703f0110240200e0d00200241f0116a20014120109c05450d00200341206a2903002108200341086a290300210c200341106a290300210f200341186a290300211b2003290300211c2005200341286a2903003703002010201b3703002011200f3703002012200c37030020022008370390122002201c3703f011200e0d03200241f0116a20014120109c05450d03200341d0006a2903002108200341306a290300210c200341386a290300210f200341c0006a290300211b200341c8006a290300211c2005200341d8006a2903003703002010201c3703002011201b3703002012200f37030020022008370390122002200c3703f011200e0d02200241f0116a20014120109c05450d02200341e0006a2105200341c0016a2103200d20056b4190014d0d050c010b0b200241900f6a41286a2005290300370300200241900f6a41206a200241f0116a41206a290300370300200241900f6a41186a2010290300370300200241900f6a41106a2011290300370300200241900f6a41086a2012290300370300200220022903f0113703900f0c050b200241900f6a41286a2005290300370300200241900f6a41206a200241f0116a41206a290300370300200241900f6a41186a2010290300370300200241900f6a41106a2011290300370300200241900f6a41086a2012290300370300200220022903f0113703900f0c040b200241900f6a41286a2005290300370300200241900f6a41206a200241f0116a41206a290300370300200241900f6a41186a2010290300370300200241900f6a41106a2011290300370300200241900f6a41086a2012290300370300200220022903f0113703900f0c030b200241900f6a41286a200241f0116a41286a290300370300200241900f6a41206a200241f0116a41206a290300370300200241900f6a41186a200241f0116a41186a290300370300200241900f6a41106a200241f0116a41106a290300370300200241900f6a41086a200241f0116a41086a290300370300200220022903f0113703900f0c020b200341a07f6a21030b2003200d460d0102400240200441146a2201200241f0116a470d0020032903202108200341086a290300210c200341106a290300210f200341186a290300211b2003290300211c200241f0116a41286a200341286a290300370300200241f0116a41186a201b370300200241f0116a41106a200f370300200241f0116a41086a200c37030020022008370390122002201c3703f0110c010b0340200341206a2903002108200341086a290300210c200341106a290300210f200341186a290300211b2003290300211c200241f0116a41286a200341286a290300370300200241f0116a41186a201b370300200241f0116a41106a200f370300200241f0116a41086a200c37030020022008370390122002201c3703f011200241f0116a20014120109c05450d01200d200341306a2203470d000c030b0b200241900f6a41286a200241f0116a41286a290300370300200241900f6a41206a200241f0116a41206a290300370300200241900f6a41186a200241f0116a41186a290300370300200241900f6a41106a200241f0116a41106a290300370300200241900f6a41086a200241f0116a41086a290300370300200220022903f0113703900f0b200241e00e6a41286a200241900f6a41286a2903002208370300200241e00e6a41206a200241900f6a41206a290300220c370300200241e00e6a41186a200241900f6a41186a290300220f370300200241e00e6a41106a200241900f6a41106a290300221b370300200241e00e6a41086a200241900f6a41086a290300221c370300200220022903900f22183703e00e200241f0116a41286a2008370300200241f0116a41206a200c370300200241f0116a41186a200f370300200241f0116a41106a201b370300200241f0116a41086a201c370300200220183703f011200241f0116a2016460d00200241f0116a20164120109c05450d00024002402035290310221b2004290300220c85203541186a290300220f200441086a2903002208858450450d0042002108428080808010210c0c010b20024190036a200c42004280808080104200109f0520024180036a42004200200c4200109f050240200842ffffffff0f832008522002290388034200527220024190036a41086a290300221c20084220862002290380037c7c2218201c54724101470d000240201b422088200f42208684221b200f422088220f84500d00200241e0026a200c2008201b200f10a005200241e0026a41086a290300210820022903e002210c0c020b41dcc0c2001032000b200241f0026a2002290390032018201b4201201b420156200f420052200f501b22031b200f420020031b10a005200241f0026a41086a290300210820022903f002210c0b200220042f00143b01a00d2002200441166a2d00003a00a20d2002200441276a2900003703f80c20022004412c6a2900003700fd0c200441236a28000021012004411f6a28000021052004411b6a2800002110200441176a280000211102400240024020152027460d00201521030c010b202741016a22032027490d17202741017422122003201220034b1b2212ad42307e220f422088a70d17200fa722034100480d170240024020270d002003102821190c010b2019202741306c2003102c21190b2019450d0120272103201221270b20022d00a20d211220022f01a00d21072019200341306c6a2203200136000f2003200536000b2003201036000720032011360003200320073b0100200341026a20123a00002003200c370320200341286a2008370300200320022903f80c370013200341186a20022900fd0c370000201541016a21150c010b200341081037000b200441386a22042032470d000b024020150d002027450d012019102a0c010b02400240201541306c22040d00420021084200210c0c010b201941206a2103420021084200210c0340200341086a290300200c7c2003290300220c20087c2208200c54ad7c210c200341306a2103200441506a22040d000b0b200241d0026a420042808080801020087d220f200f428080808010564200200c200842808080801056ad7c7d22084200522008501b22031b221c4200200820031b22082015ad2218420010a00520022903d002210f0240201c20185441002008501b0d00200241d0026a41086a290300211b2015417f6a2110201941206a21034100210403402003427f20032903002208200f7c220c200c2008542201200341086a22052903002208201b7c2001ad7c220c200854200c2008511b22011b3703002005427f200c20011b37030020102004460d01200341306a21032015200441016a22044b0d000b41ccc0c200200420151034000b200241c0026a200f200820182008109f050240201c20022903c0027da72205450d004100210303402019200320157041306c6a2204427f2004290320220842017c220c200c2008542201200441286a2204290300220f2001ad7c221b200f54200c20085a1b22011b3703202004427f201b20011b370300200341016a22032005490d000b0b200241f0116a41186a2204203c290300370300200241f0116a41106a2201203d290300370300200241f0116a41086a2205203a290300370300200220022903900e3703f011024020362034470d00203441016a22032034490d14203441017422102003201020034b1b2210ad422c7e2208422088a70d142008a722034100480d140240024020340d0020031028213f0c010b203f2034412c6c2003102c213f0b203f450d0320342136201021340b203f2036412c6c6a220320022903f011370200200529030021082001290300210c2004290300210f200320153602282003202736022420032019360220200341186a200f370200200341106a200c370200200341086a2008370200203641016a21360b203541d0006a22352040470d000c020b0b200341041037000b02402037450d002038102a0b024020022802c80e2203450d00200341d0006c210420022802c00e41206a210303400240200341046a280200450d002003280200102a0b200341d0006a2103200441b07f6a22040d000b0b024020022802c40e450d0020022802c00e102a0b20022802e80c20022802ec0c20022802f00c10bc022006450d08203941306c220341306e21040240024020030d0041012142420021300c010b200441057422014100480d10200110282242450d072004ad21300b024002402006200620036a470d00410021190c010b203941306c2101410021192042210320062104034020032004290000370000200341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000201941016a2119200341206a2103200441306a2104200141506a22010d000b0b200242003702ec0c200241f8b9c0003602e80c024020194105742203450d00204220036a213b200241f0116a4102722143200241900c6a41136a213c200241b00c6a41136a2144204221070340200241b0026a200710b004200241b0026a41086a290300210c20022903b002210f200241a0026a10a10220024190026a20022903a002200241a0026a41086a290300427f420010a00520024180026a200f200c20022903900222084201200842015620024190026a41086a29030022084200522008501b22031b2008420020031b10a005200741086a2900002108200741106a290000210c2007290000210f200241e00e6a41186a220e200741186a290000370300200241e00e6a41106a2224200c370300200241e00e6a41086a221520083703002002200f3703e00e20022903800221080240024002400240024002400240024020022802e80c221041f8b9c000460d0020022802ec0c21110c010b200241900f6a410041e0021099051a200241f0116a41004190041099051a41f80610282210450d0141002111201041003b010620104100360200201041086a200241900f6a41e002109a051a201041e8026a200241f0116a419004109a051a200241003602ec0c200220103602e80c0b200741206a210702400340201041086a2104201041066a210d20102f01062212410574210341002101024003402003450d01200241e00e6a20044120109c052205450d03200341606a2103200141016a2101200441206a21042005417f4a0d000b2001417f6a21120b02402011450d002011417f6a2111201020124102746a41f8066a28020021100c010b0b200241c00d6a41186a2203200e290300370300200241c00d6a41106a2024290300220c370300200241c00d6a41086a2015290300220f370300200220022903e00e221b3703c00d200220022802f00c41016a3602f00c200241900e6a41106a2239200c370300200241900e6a41086a2240200f370300200241900e6a41186a223e20032903003703002002201b3703900e200d2f01002204410b490d04200241900f6a410041e0021099051a200241f0116a41004190041099051a41f80610282203450d02200341003b010620034100360200200341086a200241900f6a41e002109a052101200341e8026a200241f0116a419004109a052105200241b00c6a41086a2245201041d0016a290000370300200241b00c6a41106a2246201041d8016a290000370300200241b00c6a41186a2247201041e0016a290000370300200241f0116a41086a222720104190056a290300370300200241f0116a41106a221620104198056a290300370300200241f0116a41186a2232201041a0056a290300370300200241f0116a41206a2233201041a8056a290300370300200241f0116a41286a2235201041b0056a290300370300200220102900c8013703b00c20022010290388053703f0112001201041e8016a20102f010641796a2204410574109a0521012005201041b8056a200441306c109a052105201041063b0106200320043b0106200220022f01b00c3b01e00c200220022d00b20c3a00e20c200220442900003703d00c2002204441056a22482900003700d50c20022800b30c214920022800b70c214a20022800bb0c214b20022800bf0c214c200241900f6a41286a224d2035290300370300200241900f6a41206a224e2033290300370300200241900f6a41186a224f2032290300370300200241900f6a41106a22502016290300370300200241900f6a41086a22512027290300370300200220022903f0113703900f0240024020124107490d00201241057420016a41c07e6a2001201241796a22114105746a2201200441ffff037120116b410574109b051a200141186a203e290300370000200141106a2039290300370000200141086a2040290300370000200120022903900e370000201241306c20056a220441e07d6a200441b07d6a2204200341066a220d2f010020116b41306c109b051a200441186a4200370300200420083703102004420037030820042008370300200441286a4100360200200442083703200c010b201041086a20124105746a220441206a2004200d2f010020126b410574109b051a200441186a203e290300370000200441106a2039290300370000200441086a2040290300370000200420022903900e370000201041e8026a201241306c6a220441306a2004200d2f010020126b41306c109b051a200441186a4200370300200420083703102004420037030820042008370300200441286a4100360200200442083703200b200d200d2f010041016a3b0100200241d00e6a41026a220420022d00e20c3a00002015205129030037030020242050290300370300200e204f290300370300200241e00e6a41206a2238204e290300370300200241e00e6a41286a2237204d290300370300200220022f01e00c3b01d00e200220022903d00c3703900c200220022900d50c3700950c200220022903900f3703e00e200241e00d6a41286a22522037290300370300200241e00d6a41206a22532038290300370300200241e00d6a41186a2254200e290300370300200241e00d6a41106a22552024290300370300200241e00d6a41086a22562015290300370300200220022903e00e3703e00d200220022f01d00e3b01a00d200220042d00003a00a20d200220022903900c3703f80c200220022900950c3700fd0c0240201028020022110d00200241e80c6a2104200321010c060b20102f0104213d41002157200321580340200241b80d6a41026a225920022d00a20d3a0000200220022f01a00d3b01b80d200220022903f80c3703d00e200220022900fd0c3700d50e2037205229030037030020382053290300370300200e20542903003703002024205529030037030020152056290300370300200220022903e00d3703e00e203d41ffff0371211202400240024020112f01062203410b490d002043410041a2071099051a41a80710282205450d0720054100360200200541046a200241f0116a41a407109a051a2047201141e0016a2900003703002046201141d8016a2900003703002045201141d0016a290000370300200220112900c8013703b00c2035201141b0056a2903003703002033201141a8056a2903003703002032201141a0056a290300370300201620114198056a290300370300202720114190056a29030037030020022011290388053703f011200541086a201141e8016a20112f0106220441796a2203410574109a05215a200541e8026a201141b8056a200341306c109a05215b200541f8066a20114194076a2004417a6a220d410274109a05213a201141063b0106200520033b01060240200d450d0041002103203a210403402004280200220120033b010420012005360200200441046a2104200d200341016a2203470d000b0b204d2035290300370300204e2033290300370300204f20322903003703002050201629030037030020512027290300370300200220022903f0113703900f200220022f01b00c3b01e00c200220022d00b20c3a00e20c20022900b30c210820022900bb0c210c200220482900003700d50c200220442900003703d00c203c20022903d00c370000203c41056a220d20022900d50c370000200220022d00e20c3a00920c200220022f01e00c3b01900c2002200c37009b0c200220083700930c2035204d2903003703002033204e2903003703002032204f2903003703002016205029030037030020272051290300370300200220022903900f3703f011203d41ffff037122044107490d01205a2012417a6a22014105746a205a201241796a22034105746a220420052f010620036b410574109b051a200441186a20022900d50e3700002004204c36000f2004204b36000b2004204a36000720042049360003200441026a20592d00003a0000200420022f01b80d3b0000200420022903d00e370013201241306c205b6a220441e07d6a200441b07d6a220420052f0106223d20036b41306c109b051a200441286a2037290300370300200441206a2038290300370300200441186a200e290300370300200441106a2024290300370300200441086a2015290300370300200420022903e00e3703002005203d41016a22043b01062012410274223d203a6a416c6a203a20014102746a2212200441ffff037120016b410274109b051a20122058360200200120052f010622124b0d022005203d6a41e0066a2104034020042802002201200341016a22033b010420012005360200200441046a210420032012490d000c030b0b201141086a2204201241016a22014105746a200420124105746a2204200320126b2205410574109b051a2004204c36000f2004204b36000b2004204a36000720042049360003200441026a20592d00003a0000200420022f01b80d3b0000200420022903d00e370013200441186a20022900d50e3700002011201241306c6a22044198036a200441e8026a220d200541306c109b051a20044190036a203729030037030020044188036a203829030037030020044180036a200e290300370300200441f8026a2024290300370300200441f0026a2015290300370300200d20022903e00e3703002011200341016a22033b01062012410274201141f8066a22046a41086a200420014102746a2204200341ffff037120016b410274109b051a200420583602000240201220112f010622034f0d00205820013b010420582011360200200120034f0d002003417f6a210520112001417f6a22034102746a4180076a2104034020042802002201200341026a3b010420012011360200200441046a21042005200341016a2203470d000b0b41001a200241e80c6a1a20101a0c090b201141086a2203201241016a22014105746a200320124105746a220320112f0106223d20126b223a410574109b051a2003204c36000f2003204b36000b2003204a36000720032049360003200341026a20592d00003a0000200320022f01b80d3b0000200320022903d00e370013200341186a20022900d50e370000201141e8026a201241306c6a220341306a2003203a41306c109b051a200341286a2037290300370300200341206a2038290300370300200341186a200e290300370300200341106a2024290300370300200341086a2015290300370300200320022903e00e3703002011203d41016a22033b01062012410274223a201141f8066a223d6a41086a203d20014102746a223d200341ffff037120016b410274109b051a203d2058360200200420112f010622014f0d002011203a6a41fc066a2103034020032802002204201241016a22123b010420042011360200200341046a210320012012470d000b0b205741016a2112200241b00d6a41026a220320022d00920c3a00002040202729030037030020392016290300370300203e2032290300370300200241900e6a41206a22042033290300370300200241900e6a41286a22012035290300370300200220022f01900c3b01b00d200220022903f0113703900e2002203c2900003703c00e2002200d2900003700c50e20022800930c214920022800970c214a200228009b0c214b200228009f0c214c20522001290300370300205320042903003703002054203e2903003703002055203929030037030020562040290300370300200220022903900e3703e00d200220022f01b00d3b01a00d200220032d00003a00a20d200220022903c00e3703f80c200220022900c50e3700fd0c0240201128020022030d0020111a200241e80c6a22041a200521010c070b20112f0104213d200241e80c6a1a20111a2003211120052158201221570c000b0b2010200141306c6a22034180036a4200370300200341f8026a2008370300200341f0026a4200370300200341e8026a200837030020034190036a410036020020034188036a220128020021042003418c036a2802002103200142083703002004450d052003450d052004102a0c050b41f80641081037000b41f80641081037000b41a80741081037000b201020124105746a220341286a200341086a2201200420126b410574109b051a200341206a203e290300370000200341186a2039290300370000200341106a2040290300370000200120022903900e3700002010201241306c6a22034198036a200341e8026a220420102f010620126b41306c109b051a20034190036a410036020020034188036a420837030020034180036a4200370300200341f8026a2008370300200341f0026a420037030020042008370300201020102f010641016a3b01060c010b2043410041a2071099051a41a80710282203450d0820034100360200200341046a200241f0116a41a407109a051a2003200428020022053602f806200420033602002004200428020441016a360204200541003b010420052003360200200320032f010622054105746a220441086a20022f01a00d3b00002004410a6a20022d00a20d3a0000200441176a204c360000200441136a204b3600002004410f6a204a3600002004410b6a20493600002004411b6a20022903f80c370000200441206a20022900fd0c3700002003200541306c6a220441e8026a20022903e00d370300200441f0026a2056290300370300200441f8026a205529030037030020044180036a205429030037030020044188036a205329030037030020044190036a2052290300370300200341f8066a200541016a22044102746a2001360200200320043b0106200120043b01042001200336020020101a0b2007203b470d000b0b02402036412c6c2203450d00203f20036a2132203f210d03400240200d28022841306c2203450d00200d280220220e20036a21150340200241f0016a200d10b004200e221041286a2224290300210f20102903202108200241f0016a41086a290300211b20022903f001211c200241e0016a10a102200241d0016a20022903e001200241e0016a41086a290300427f420010a005200241c0016a201c201b20022903d001220c4201200c420156200241d0016a41086a290300220c420052200c501b22031b200c420020031b10a005200241a0016a200f420020022903c001220c4200109f05200241b0016a20084200200c4200109f0520024190016a4200420020084200109f0542ffffffff0f200241b0016a41086a290300220820022903a0012002290390017c7c220c42208820022903a80120022903980184420052200c2008547222031b2108427f20023502b401200c4220868420031b210c201041306a210e200241e80c6a210320022802ec0c21120240024003402003280200221141086a210420112f010622074105742103410021010240024003402003450d01201020044120109c052205450d02200341606a2103200141016a2101200441206a21042005417f4a0d000b2001417f6a21070b2012450d022012417f6a2112201120074102746a41f8066a21030c010b0b2011200141306c6a220341f8026a2204427f2004290300220f200c7c221b201b200f54220420034180036a2201290300220f20087c2004ad7c221b200f54201b200f511b22041b3703002001427f201b20041b370300200241f0116a41186a2211200d41186a290000370300200241f0116a41106a2212200d41106a290000370300200241f0116a41086a2207200d41086a2900003703002002200d2900003703f01120034188036a2105024020034190036a220128020022042003418c036a280200470d00200441016a22032004490d16200441017422272003202720034b1b2227ad42307e220f422088a70d16200fa722164100480d160240024020040d002016102821030c010b2005280200200441306c2016102c21030b2003450d0220052003360200200541046a2027360200200128020021040b2005280200200441306c6a220320022903f0113703002003200c370320200341186a2011290300370300200341106a2012290300370300200341086a2007290300370300200341286a20083703002001200128020041016a3602000b2010200c37032020242008370300200e2015460d020c010b0b201641081037000b200d412c6a220d2032470d000b0b200241e00e6a41086a22034200370300200242003703e00e41a5afc4004116200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a100621030240024020022802f0112204417f460d002003450d00200220043602e40e200220033602e00e200241f0116a200241e00e6a106d20022802f0112207450d0320022902f41121082004450d012003102a0c010b42002108410121070b02402007450d002008422088a72203450d0020034105742101200721040340410f10282203450d04200341002900edae44370000200341076a41002900f4ae443700002002428f808080f0013702f411200220033602f0112004200241f0116a108f0120022802f811210320022802f0112105200241900c6a41186a22104200370300200241900c6a41106a22114200370300200241900c6a41086a22124200370300200242003703900c20052003200241900c6a1000200241c00d6a41186a2010290300370300200241c00d6a41106a2011290300370300200241c00d6a41086a2012290300370300200220022903900c3703c00d024020022802f411450d0020022802f011102a0b200441206a2104200241c00d6a41201009200141606a22010d000b0b02402008a7450d002007102a0b20022802f00c211020022802e80c21030240024020022802ec0c22010d00200321040c010b2001210520032104034020042802f80621042005417f6a22050d000b0340200320032f01064102746a41f8066a28020021032001417f6a22010d000b0b200241ac0f6a20032f0106360200200241900f6a41186a4100360200200241a40f6a2003360200200220103602b00f200241003602a00f200242003703980f200220043602940f200241003602900f200241f0116a200241900f6a10b1020240200241b0126a223b280200220d0d00427f2120427f211c0c080b200241f0116a41106a2101200241a8126a2133200241f0116a41286a2135427f2120427f211c0340200241e00d6a41086a200241f0116a41086a22112903002208370300200241e00d6a41106a2001290300220c370300200241e00d6a41186a200241f0116a41186a2205290300220f370300200220022903f011221b3703e00d203329030021182035290300211f20022802b412212420022802b812210320022903a0122121200229039012212f200241900e6a41186a2215200f370300200241900e6a41106a2227200c370300200241900e6a41086a221620083703002002201b3703900e20024180016a10a102200241e0006a20022903800120024180016a41086a290300427f420010a005200241f0006a10a102200241c0006a2002290370200241f0006a41086a290300427f420010a005200241d0006a2002290360220842012008420156200241e0006a41086a29030022084200522008501b22041b2008420020041b202f201f109f05200241306a2002290340220842012008420156200241c0006a41086a29030022084200522008501b22041b2008420020041b20212018109f05200241d0006a41086a290300211f200241306a41086a290300211b4100211220022903502121200229033021184100210e410821070240200341306c2210450d00201041306d220ead42307e2208422088a70d112008a722044100480d11200410282207450d050b02402003450d00200341047441706a213220072103200d21040340200441286a290300210c200441206a290300210f2005200441186a2903003703002001200441106a2903003703002011200441086a290300370300200220042903003703f011200241206a10a102200241106a2002290320200241206a41086a290300427f420010a00520022002290310220842012008420156200241106a41086a29030022084200522008501b22121b2008420020121b200f200c109f052003200241086a29030037030820032002290300370300200341106a20022903f011370300200341186a2011290300370300200341206a2001290300370300200341286a2005290300370300200341306a2103200441306a2104201041506a22100d000b203241047641016a21120b02402024450d00200d102a0b2012ad42307e2208422088a70d012008a72203417f4c0d010240024020030d004108210d0c010b20031028220d450d060b0240024020120d00410021100c010b2007201241306c6a211141002110200d2103200721040340200320042903003703002003200441086a290300370308200341106a200441106a290300370300200341186a200441186a290300370300200341206a200441206a290300370300200341286a200441286a290300370300200341306a2103201041016a2110200441306a22042011470d000b0b2005201f3703002002202137038012200220183703f011200220103602981220022012360294122002200d360290122002201b3703f811200241e00e6a41186a2015290300370300200241e00e6a41106a2027290300370300200241e00e6a41086a2016290300370300200220022903900e3703e00e0240410f10282203450d00200341002900edae44370000200341076a41002900f4ae443700002002428f808080f0013702b40c200220033602b00c200241e00e6a200241b00c6a108f0120022802b80c210320022802b00c2104200241900c6a41186a22054200370300200241900c6a41106a22104200370300200241900c6a41086a22114200370300200242003703900c20042003200241900c6a1000200241c00d6a41186a2005290300370300200241c00d6a41106a2010290300370300200241c00d6a41086a2011290300370300200220022903900c3703c00d024020022802b40c450d0020022802b00c102a0b200241003602e80e200242013703e00e2002200241f0116a3602b00c200241b00c6a200241e00e6a10a301200220013602b00c200241b00c6a200241e00e6a10a30120022802901221032002280298122204200241e00e6a10b40102402004450d00200441306c21040340200341106a200241e00e6a108f01200220033602b00c200341306a2103200241b00c6a200241e00e6a10a301200441506a22040d000b0b20022802e40e2103200241c00d6a412020022802e00e220420022802e80e100702402003450d002004102a0b20182020542103201b201c512104201b201c5421050240200228029412450d00200228029012102a0b2003200520041b21030240200e450d002007102a0b201b201c20031b211c2018202020031b2120200241f0116a200241900f6a10b10220022802b012220d450d090c010b0b410f41011037000b1036000b41c4d1c300413320024198196a419cd9c3001038000b410f41011037000b200441081037000b200341081037000b41a80741081037000b200141011037000b200241f0116a200241900f6a10b1020240203b2802002203450d000340024020022802b412450d002003102a0b200241f0116a200241900f6a10b10220022802b01222030d000b0b024020022802940f220341f8b9c000460d00200328020021012003102a2001450d00200128020021042001102a2004450d00024020042802002203450d0003402004102a2003210420032802002201210320010d000b0b2004102a0b200241e00e6a41086a22034200370300200242003703e00e4199fec4004111200241e00e6a1008200241900f6a41086a22042003290300370300200220022903e00e3703900f2002201c3703f811200220203703f011200241900f6a4110200241f0116a4110100720034200370300200242003703e00e41a5afc4004116200241e00e6a100820042003290300370300200220022903e00e3703900f200241003602f811200242013703f0112019200241f0116a10b40102402019450d00201941057421042042210303402003200241f0116a108f01200341206a2103200441606a22040d000b0b20022802f4112103200241900f6a411020022802f011220420022802f811100702402003450d002004102a0b2019ad210802402036450d002036412c6c2104203f41206a210303400240200341046a280200450d002003280200102a0b2003412c6a2103200441546a22040d000b0b2008422086210802402034450d00203f102a0b203020088421082041450d012006102a0c010b200241e00e6a41086a22034200370300200242003703e00e4199fec4004111200241e00e6a1008200241900f6a41086a2003290300370300200220022903e00e3703900f200241003602f011200241900f6a4110200241f0116a10062103024020022802f0112204417f460d002004410f4d0d052003102a0b410021420b024020172014a745720d002013102a0b20420d0102402009450d00200941d0006c2104200a41c0006a210303400240200341046a280200450d002003280200102a0b200341d0006a2103200441b07f6a22040d000b0b200b450d00200a102a0b200041003602000c010b200020083702042000204236020002402009450d00200941d0006c2104200a41c0006a210303400240200341046a280200450d002003280200102a0b200341d0006a2103200441b07f6a22040d000b0b200b450d00200a102a0b200241a0196a24000f0b41c4d1c300413320024198196a419cd9c3001038000b41c4d1c300413320024198196a419cd9c3001038000b1031000baa0b02067f017e230041206b22042400200441106a41086a220542003703002004420037031041f9b5c200411d200441106a1008200441086a2005290300370300200420042903103703000240024002400240024002400240024002400240200441104101410041001003417f470d001098012106024002400240024020024101470d00200441106a41086a220542003703002004420037031041b8bfc200411a200441106a1008200441086a2005290300370300200420042903103703002004410036021020044110200441106a10062105024020042802102207417f460d002005450d0020074104490d06200528000021072005102a200720064b0d020b200441106a41086a220542003703002004420037031041b8bfc200411a200441106a1008200441086a2005290300370300200420042903103703002004200620014101746a36021020044110200441106a410410070b200028020821052000280204210820002802002109200441106a41086a220042003703002004420037031041f9b5c200411d200441106a1008200441086a2000290300370300200420042903103703002004410036021820044201370310410410282200450d052004410436021420042004280218220741046a36021820042000360210200020076a200636000020042802142206200428021822006b4104490d01200428021021060c020b200041046a280200450d0b2000280200102a0c0b0b200041046a22072000490d09200641017422002007200020074b1b22004100480d090240024020060d002000102821060c010b200428021020062000102c21060b2006450d042004200036021420042006360210200428021821000b2004200041046a360218200620006a20013600002005200441106a10b40102402005450d002009200541286c6a21072009210503402005200441106a108f01200541206a290300210a0240024020042802142201200428021822006b4108490d00200428021021010c010b200041086a22062000490d0b200141017422002006200020064b1b22004100480d0b0240024020010d002000102821010c010b200428021020012000102c21010b2001450d072004200036021420042001360210200428021821000b2004200041086a360218200120006a200a3700002007200541286a2205470d000b0b20042802142105200428021821000240024020024101460d000240024020052000460d00200428021021050c010b200041016a22052000490d0b200041017422012005200120054b1b22014100480d0b0240024020000d002001102821050c010b200428021020002001102c21050b2005450d082004200136021420042005360210200428021821000b2004200041016a360218200520006a41003a00000c010b0240024020052000460d00200428021021050c010b200041016a22052000490d0a200041017422012005200120054b1b22014100480d0a0240024020000d002001102821050c010b200428021020002001102c21050b2005450d082004200136021420042005360210200428021821000b2004200041016a360218200520006a41013a00000240024020042802142205200428021822006b4104490d00200428021021050c010b200041046a22012000490d0a200541017422002001200020014b1b22004100480d0a0240024020050d002000102821050c010b200428021020052000102c21050b2005450d092004200036021420042005360210200428021821000b2004200041046a360218200520006a20033600000b2004280214210020044110200428021022052004280218100702402000450d002005102a0b2008450d092009102a0c090b200041046a280200450d082000280200102a0c080b41c4d1c3004133200441106a419cd9c3001038000b410441011037000b200041011037000b200041011037000b200141011037000b200141011037000b200041011037000b1031000b200441206a24000bcb0201057f230041d0006b220224002002410036022820014110200241286a1006210302400240024020022802282204417f460d0020030d010b200041003a00000c010b41002101200241003a00480340024020042001470d000240200141ff0171450d00200241003a00480b41c4d1c3004133200241286a419cd9c3001038000b200241286a20016a200320016a2d00003a00002002200141016a22053a00482005210120054120470d000b200241086a41186a2201200241286a41186a290300370300200241086a41106a2205200241286a41106a290300370300200241086a41086a2206200241286a41086a2903003703002002200229032837030802402004450d002003102a0b20002002290308370001200041013a0000200041196a2001290300370000200041116a2005290300370000200041096a20062903003700000b200241d0006a24000bdf0301017f024002400240024002400240410110282202450d00200220002d00003a0000200241014102102c2202450d01200220002d00013a0001200241024104102c2202450d02200220002d00023a0002200220002d00033a0003200241044108102c2202450d03200220002d00043a0004200220002d00053a0005200220002d00063a0006200220002d00073a0007200241084110102c2202450d04200220002d00083a0008200220002d00093a0009200220002d000a3a000a200220002d000b3a000b200220002d000c3a000c200220002d000d3a000d200220002d000e3a000e200220002d000f3a000f200241104120102c2202450d05200220002d00103a0010200220002d00113a0011200220002d00123a0012200220002d00133a0013200220002d00143a0014200220002d00153a0015200220002d00163a0016200220002d00173a0017200220002d00183a0018200220002d00193a0019200220002d001a3a001a200220002d001b3a001b200220002d001c3a001c200220002d001d3a001d200220002d001e3a001e200220002d001f3a001f200128020020012802042002412010072002102a0f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000b952801057f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2202280200200141086a22032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0120012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00003a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0220012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00013a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0320012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00023a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0420012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00033a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0520012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00043a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0620012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00053a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0720012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00063a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0820012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00073a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0920012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00083a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0a20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00093a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000a3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0c20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000b3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0d20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000c3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0e20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000d3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d0f20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000e3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1020012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d000f3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1120012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00103a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1220012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00113a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1320012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00123a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1420012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00133a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1520012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00143a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1620012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00153a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1720012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00163a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1820012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00173a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1920012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00183a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1a20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d00193a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001a3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1c20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001b3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1d20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001c3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1e20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001d3a000002400240200228020020032802002204460d00200128020021050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102821050c010b200128020020042006102c21050b2005450d1f20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a20002d001e3a000002400240200228020020032802002202460d00200128020021040c010b200241016a22042002490d21200241017422052004200520044b1b22054100480d210240024020020d002005102821040c010b200128020020022005102c21040b2004450d2020012004360200200141046a2005360200200141086a28020021020b2003200241016a360200200420026a20002d001f3a00000f0b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200541011037000b1031000b02000ba50201057f230041d0006b21020240200128020022032001280204470d00200041003602000f0b200120034180016a3602002002200329006237012a2002200329006a370132200241086a41086a220120022903303703002002200329007237013a200241086a41106a220420022903383703002002200328007a360142200220032f007e3b0146200241086a41186a22052002290340370300200220032f00603b012820022002290328370308200241286a41186a22062005290300370300200241286a41106a22052004290300370300200241286a41086a220420012903003703002002200229030837032820002003360200200020022903283702042000410c6a2004290300370200200041146a20052903003702002000411c6a20062903003702000b280020004101360204200041086a200128020420012802006b4107762201360200200020013602000bb905020b7f047e23004190016b22032400024002402001280200220420012802042205460d00200120044180016a22063602002003200441e2006a29000037016a2003200441ea006a290000370172200341c8006a41086a220720032903703703002003200441f2006a29000037017a200341c8006a41106a220820032903783703002003200441fa006a280000360182012003200441fe006a2f00003b018601200341c8006a41186a22092003290380013703002003200441e0006a2f00003b016820032003290368370348200341286a41186a220a2009290300370300200341286a41106a220b2008290300370300200341286a41086a220c200729030037030020032003290348370328200541807f6a210d02400340200341086a41186a200a290300220e370300200341086a41106a200b290300220f370300200341086a41086a200c2903002210370300200320032903282211370308200341e8006a41186a200e370300200341e8006a41106a200f370300200341e8006a41086a2010370300200320113703682002450d01200d2004460d02200120064180016a22053602002003200641e2006a29000037016a2003200641ea006a290000370172200720032903703703002003200641f2006a29000037017a200820032903783703002003200641fa006a280000360182012003200641fe006a2f00003b01860120092003290380013703002003200641e0006a2f00003b016820032003290368370348200a2009290300370300200b2008290300370300200c20072903003703002003200329034837032820044180016a21042002417f6a2102200521060c000b0b20002004360200200020032903683702042000410c6a200341f0006a290300370200200041146a200341f8006a2903003702002000411c6a20034180016a2903003702000c010b200041003602000b20034190016a24000ba50201057f230041d0006b21020240200128020022032001280204470d00200041003602000f0b200120034180016a3602002002200329004237012a2002200329004a370132200241086a41086a220120022903303703002002200329005237013a200241086a41106a220420022903383703002002200328005a360142200220032f005e3b0146200241086a41186a22052002290340370300200220032f00403b012820022002290328370308200241286a41186a22062005290300370300200241286a41106a22052004290300370300200241286a41086a220420012903003703002002200229030837032820002003360200200020022903283702042000410c6a2004290300370200200041146a20052903003702002000411c6a20062903003702000bb905020b7f047e23004190016b22032400024002402001280200220420012802042205460d00200120044180016a22063602002003200441c2006a29000037016a2003200441ca006a290000370172200341c8006a41086a220720032903703703002003200441d2006a29000037017a200341c8006a41106a220820032903783703002003200441da006a280000360182012003200441de006a2f00003b018601200341c8006a41186a22092003290380013703002003200441c0006a2f00003b016820032003290368370348200341286a41186a220a2009290300370300200341286a41106a220b2008290300370300200341286a41086a220c200729030037030020032003290348370328200541807f6a210d02400340200341086a41186a200a290300220e370300200341086a41106a200b290300220f370300200341086a41086a200c2903002210370300200320032903282211370308200341e8006a41186a200e370300200341e8006a41106a200f370300200341e8006a41086a2010370300200320113703682002450d01200d2004460d02200120064180016a22053602002003200641c2006a29000037016a2003200641ca006a290000370172200720032903703703002003200641d2006a29000037017a200820032903783703002003200641da006a280000360182012003200641de006a2f00003b01860120092003290380013703002003200641c0006a2f00003b016820032003290368370348200a2009290300370300200b2008290300370300200c20072903003703002003200329034837032820044180016a21042002417f6a2102200521060c000b0b20002004360200200020032903683702042000410c6a200341f0006a290300370200200041146a200341f8006a2903003702002000411c6a20034180016a2903003702000c010b200041003602000b20034190016a24000be6880106147f027e077f017e027f017e230041d0046b22042400200441c0036a20012002200310f903200441c0036a41086a280200210520042802c40321060240024020042802c0034101470d002000200636020420004101360200200041086a20053602000c010b200441d4036a280200220741306c2108200441d8036a2802002109200441d0036a280200210a200441cc036a280200210b4100210c4100210102400340024020082001470d000c020b200b20016a2102200141306a220d210120022d00004102470d000b200441d0006a200b200d6a41546a10fa032004280250210c200428025421010b4100210e20014100200c1b210f200741306c2108200c4104200c1b21104100210102400340024020082001470d000c020b200b20016a2102200141306a220d210120022d00004108470d000b200441c8006a200b200d6a41546a10fa032004280248210e200428024c21010b4100211120014100200e1b2112200741306c2108200e4104200e1b210d4100210102400340024020082001470d000c020b200b20016a2102200141306a220c210120022d00004104470d000b200441c0006a200b200c6a41546a10fa0320042802402111200428024421010b4100210e2001410020111b2113200741306c21082011410420111b21114100210102400340024020082001470d000c020b200b20016a2102200141306a220c210120022d00004103470d000b200441386a200b200c6a41546a10fa032004280238210e200428023c21010b41002102024020014100200e1b2201450d00200141286c2108200e4104200e1b41186a2101410021020340200220012d0000456a2102200141286a2101200841586a22080d000b0b0240024020120d00411e2101200041b98dc6003602040c010b200d201241146c6a211241002114410021150240024002400340200d450d0141d78dc600210841382101200d41086a280200417c6a220e41024b0d02200d280200210c024002400240200e0e03000501000b41012115200c41af8dc600460d01200c28000041e3c2b1e306460d010c040b41012114200c41b38dc600460d00200c41b38dc6004106109c050d030b0240200d410c6a280200450d0041132101200041d58ec6003602040c050b0240200d41106a280200220120026b220c20014d0d00412a2101200041e88ec6003602040c050b41af8ec6002108412621012013200c4d0d022011200c4102746a220c450d02418f8ec600210841202101200f200c280200220c4d0d022010200c4104746a220c450d0241928fc6002108411f2101200c2802080d02200c2d000d220c41077141044b0d020240200c0e050003030300000b200d41146a220d2012470d000b0b41b18fc60041b98dc600201441017122021b2108411c411e20021b21012002450d002015410171450d00200741306c2108410021010c010b200020083602040c010b0240034020082001460d01200b20016a2102200141306a220d210120022d00004106470d000b200441306a200b200d6a41546a10fa032004280234450d00200041fd8ac600360204411f21010c010b200741306c21082003280268210c410021010240034020082001460d01200b20016a2102200141306a220d210120022d00004105470d000b200441286a200b200d6a41546a220110fa030240200428022c41014d0d00411821012000419c8bc6003602040c020b200441206a200110fa032004280224450d0020042802202201450d002001280200200c4d0d0041222101200041b48bc6003602040c010b200741306c2108410021010240034020082001460d01200b20016a2102200141306a220d210120022d00004107470d000b200441186a200b200d6a41546a10fa0320042802182201200428021c4104746a2108034020012008460d012001450d012001410c6a2102200141106a210120022d0000410271450d000b41322101200041c08cc6003602040c010b200741306c2108410021010240034020082001460d01200b20016a2102200141306a220d210120022d0000410c470d000b200b200d6a2201415c6a2802002202450d00200141546a280200220d200241186c6a210c0340200d220241186a210d2002280208410374210120022802002102024003402001450d01200141786a210120022d00042108200241086a21022008410271450d000b413121012000418f8cc6003602040c030b200d200c470d000b0b200741306c2108410021010240034020082001460d01200b20016a2102200141306a220d210120022d00004102470d000b200441106a200b200d6a41546a10fa0320042802142201450d002004280210220220014104746a211103402002450d01200241106a210e200420022d000d22083a00c0032002280200220120022802086a210c410021024100200441c0036a20084104461b210d024003400240024002400240200241ff01710e03000102000b2001200c460d014100210220012108200141016a21010c020b2001200c460d034101210220012108200141016a21010c010b200d450d0241022102200d21084100210d0b20082d0000410271450d000b41392101200041d68bc6003602040c030b200e2102200e2011470d000b0b200741306c21084100210c4100210102400340024020082001470d000c020b200b20016a2102200141306a220d210120022d00004102470d000b200441086a200b200d6a41546a10fa032004280208210c200428020c21010b4100210e20014100200c1b2110200741306c2108200c4104200c1b21124100210102400340024020082001470d000c020b200b20016a2102200141306a220d210120022d00004103470d000b2004200b200d6a41546a10fa032004280200210e200428020421010b200e4104200e1b220220014100200e1b41286c6a210d41002113024002400340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002200d460d00412d2101418e91c400210820022802084103470d2102402002280200220c41f8e2c500460d00200c41f8e2c5004103109c050d220b200241286a21114115210c418790c400210e4114210141fa90c400210802400240024020022d00180e0400240123000b4136210c41d18fc400210e2010200228021c22014d0d22201220014104746a220f450d222002280214210c200228020c210220092d00700d01200c410b470d014138210141c290c4002108200241ac81c600460d23200241ac81c600410b109c05450d230c210b412f210141bb91c400210820022802144106470d220240200228020c220c41cb8fc400460d00200c41cb8fc4004106109c050d230b02402013450d00411f2101200041ea91c4003602040c280b2002411c6a2113201121020c240b41262101419c90c4002108200c417d6a220c41134b0d2102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200c0e14003e3e3e0e043e073c0b0a120114111b103e0c19000b200241effec500460d3d200241effec5004103109c05450d3d41effec50020024103109c050d3d41011028220e450d1d200e41003a0000200f2d000c41e000460d010c3a0b200241f2fec500460d0141f2fec5002002410f109c05450d0120024181ffc500460d034181ffc5002002410f109c05450d03024020024198ffc500460d004198ffc5002002410f109c050d3d0b41071028220e450d20200e4100360003200e41013a0002200e41003b0000200f2d000c41e000460d060c380b200f2802084101470d380240200f2802002214200e460d0041002102034020024101460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d3a0c000b0b200f2d000d4104470d38200e102a201121020c3d0b41041028220e450d1b200e4100360000200f2d000c41e000470d35200f2802084104470d350240200f2802002214200e460d0041002102034020024104460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d370c000b0b200f2d000d4104470d35200e102a201121020c3c0b024020024190ffc500460d00200229000042e5f0d1fbb5ac98b6ec00520d3a0b41071028220e450d1c200e4100360003200e41013a0002200e41003b0000200f2d000c41e000460d010c330b41011028220e450d1a200e41003a0000200f2d000c41e000470d31200f2802084101470d31200f2802002214200e460d3041002102034020024101460d31200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d320c000b0b200f2802084107470d31200f2802002214200e460d2e41002102034020024107460d2f200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d320c000b0b200241a7ffc500460d0141a7ffc5002002410a109c05450d010240200241b1ffc500460d0041b1ffc5002002410a109c050d060b4126210c419c90c400210e200f2d000c41e000470d35200f2802080d3520112102200f2d000d4104460d380c350b200f2802084107470d31200f2802002214200e460d2b41002102034020024107460d2c200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d320c000b0b41021028220e450d19200e41003b0000200f2d000c41e000470d29200f2802084102470d290240200f2802002214200e460d0041002102034020024102460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d2b0c000b0b200f2d000d4104470d29200e102a201121020c360b0240200241c6ffc500460d0041c6ffc5002002410d109c050d340b4126210c419c90c400210e200f2d000c41e000470d32200f2802080d3220112102200f2d000d4104460d350c320b0240200241d3ffc500460d0041d3ffc5002002410c109c050d330b4126210c419c90c400210e200f2d000c41e000470d31200f2802080d3120112102200f2d000d4104460d340c310b0240200241eaffc500460d0041eaffc50020024115109c050d320b4126210c419c90c400210e200f2d000c41e000470d30200f2802080d3020112102200f2d000d4104460d330c300b0240200241ffffc500460d0041ffffc5002002410a109c050d310b41021028220e450d16200e41003b0000200f2d000c41e000460d010c240b02402002418980c600460d00418980c60020024107109c050d300b4126210c419c90c400210e200f2d000c41e000470d2e200f2802080d2e20112102200f2d000d4104460d310c2e0b200f2802084102470d220240200f2802002214200e460d0041002102034020024102460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d240c000b0b200f2d000d4104470d22200e102a201121020c300b02402002419080c600460d00419080c60020024113109c050d2e0b4126210c419c90c400210e200f2d000c41e000470d2c200f2802080d2c20112102200f2d000d4104460d2f0c2c0b200241a380c600460d0141a380c60020024111109c05450d01200241e280c600460d0641e280c60020024111109c05450d060240200241f380c600460d0041f380c60020024111109c050d2d0b41041028220e450d17200e4100360000200f2d000c41e000460d080c1f0b0240200241b480c600460d0041b480c6002002410e109c050d2c0b41081028220e450d13200e4200370000200f2d000c41e000460d020c1d0b41021028220e450d11200e41003b0000200f2d000c41e000470d1b200f2802084102470d1b0240200f2802002214200e460d0041002102034020024102460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d1d0c000b0b200f2d000d4104470d1b200e102a201121020c2c0b200241c280c600460d0141c280c60020024110109c05450d01200241d280c600460d0241d280c60020024110109c05450d020240200241b781c600460d0041b781c60020024110109c050d2a0b4126210c419c90c400210e200f2d000c41e000470d28200f2802080d2820112102200f2d000d4104460d2b0c280b200f2802084108470d1a0240200f2802002214200e460d0041002102034020024108460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d1c0c000b0b200f2d000d4104470d1a200e102a201121020c2a0b4126210c419c90c400210e200f2d000c41e000470d26200f2802080d26200f2d000d22014104460d2620112102200141fb0171450d290c260b41031028220e450d0f200e41003a0002200e41003b0000200f2d000c41e000470d16200f2802084103470d160240200f2802002214200e460d0041002102034020024103460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d180c000b0b200f2d000d4104470d16200e102a201121020c280b41021028220e450d0f200e41003b0000200f2d000c41e000470d14200f2802084102470d140240200f2802002214200e460d0041002102034020024102460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d160c000b0b200f2d000d4104470d14200e102a201121020c270b02402002418481c600460d00418481c60020024116109c050d250b41021028220e450d10200e41003b0000200f2d000c41e000460d020c120b200f2802084104470d160240200f2802002214200e460d0041002102034020024104460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d180c000b0b200f2d000d4104470d16200e102a201121020c250b02402002419a81c600460d00419a81c60020024112109c050d230b4126210c419c90c400210e200f2d000c41e000470d21200f2802080d2120112102200f2d000d4104460d240c210b200f2802084102470d0f0240200f2802002214200e460d0041002102034020024102460d01200e20026a2108201420026a210c200241016a2102200c2d000020082d0000470d110c000b0b200f2d000d4104470d0f200e102a201121020c230b024020130d0041002116410021170c0e0b024020132802040d002000418992c400360204413221010c260b024020132802002216201341086a28020022174d0d00200041bb92c40036020441c90021010c260b201720032802644d0d0d2000418493c40036020441c10021010c250b410141011037000b410441011037000b410141011037000b410741011037000b410741011037000b410241011037000b410241011037000b410241011037000b410841011037000b410341011037000b410241011037000b410441011037000b410241011037000b20092903082118200441c0036a41086a22024200370300200441f8b9c0003602c4032009290310211920042018a7417f2018428080808010541b3602d00320042019a7417f2019428080808010541b3602c003200441c0036a4104722201410d10fb032001410c10fb032001410710fb032001410f10fb03200441d8006a41106a20042802d003360200200441d8006a41086a2002290300370300200420042903c003370358200441c0036a41106a22082007360200200441c0036a410c6a200a3602002004200b3602c803200420053602c403200420063602c003200441f0006a200441c0036a10fc03024002400240410110282201450d00200141003a0000200420042f01c003220d3b01b002200841e0083b01002002428180808010370300200420013602c403200441013602c0032004200d3b01d203200441f0006a200441c0036a10fd03210c0240410310282202450d00200241026a41002d00fae2453a0000200241002f00f8e2453b00000240410310282208450d00200841026a41002d00f1fe453a0000200841002f00effe453b0000200441b0026a41026a200441c0036a41026a220b2d000022073a0000200420042f00c003220e3b01b00220044184016a280200210d200441f0006a41106a2802002101200b20073a00002004200e3b01c00302400240024002400240024002400240200d2001470d00200141016a220d2001490d012001410174220b200d200b200d4b1b220dad42287e2218422088a70d012018a7220b4100480d010240024020010d00200b102821010c010b200428027c200141286c200b102c21010b2001450d072004200d360280012004200136027c200428028401210d0b200428027c200d41286c6a220141003a00182001200836020c200142838080803037020420012002360200200141106a428380808030370200200141196a20042f01c0033b00002001411b6a200441c2036a2d00003a00002001411c6a200c360200200420042802840141016a36028401200441c0036a200441f0006a418c01109a051a20044180026a200441c0036a10fe0320044180026a41106a280200220e41306c2101200428028802220741546a210202400340410021082001450d01200141506a21012002412c6a210d200241306a220c2102200d2d00004103470d000b200c41086a2802002201450d00200141286c2102200c28020041186a2101410021080340200820012d0000456a2108200141286a2101200241586a22020d000b0b200e41306c2101200741546a21022008417f6a210d02400340410021082001450d01200141506a21012002412c6a210c200241306a220b2102200c2d00004103470d000b200b41086a2802002201450d00200141286c2102200b28020041186a2101410021080340200820012d0000456a2108200141286a2101200241586a22020d000b0b200e41306c21012007415c6a21020240034041002111024020010d00410021010c020b200141506a2101200241246a210c200241306a220b2102200c2d00004104470d000b200b28020021010b0240024002400240200e450d00200120086a211a2007200e41306c6a2112200441d8006a410472211b4100211c4100211d0340024020072d000041786a220141044b0d00024002400240024020010e050301020400030b200728020c2201450d032007280204220c200141186c6a211e201d210103402001211d0240200c22082802144104742202450d00200828020c21010340024020012d0000410b470d00200141046a220c280200220b200d490d00200c200b41016a3602000b200141106a2101200241706a22020d000b0b200442003703d00320044280808080c0003703c803200442043703c003024002400240411010282201450d0020042802c8032102200420013602c003200441013602c403200120024104746a22014200370200200141056a4200370000200420042802c80341016a3602c80302402008280214221f450d0041002106201f210103400240024002400240024002400240024002400240024002400240200620014f0d004110210c0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200828020c222020064104746a2d000022140eac010001020202020202020202020202020303030404050506060707080809090a0a0b0b0c0d0d0e0e0f0f1010111213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f2020212122222323242425252627272828292a2a2b2b2c2d2d2e2e2f2f303031313232333434353536363737383839393a3a3b3b3c3c3d3d3e3e3f3f40404141424243434444454546464747484a4a4a4a49494a4a4a4a4a4a4a4a4a4a4a4a4a4a4b4b4b4b000b4111210c0c4a0b4112210c0c490b410a210c0c480b4108210c0c470b4108210c0c460b4104210c0c450b4104210c0c440b4104210c0c430b4104210c0c420b4104210c0c410b4104210c0c400b4104210c0c3f0b4105210c0c3e0b4105210c0c3d0b4105210c0c3c0b4105210c0c3b0b4105210c0c3a0b4113210c0c390b4114210c0c380b4106210c0c370b4107210c0c360b410b210c0c350b410b210c0c340b410b210c0c330b410b210c0c320b410b210c0c310b410b210c0c300b410b210c0c2f0b410b210c0c2e0b410b210c0c2d0b410b210c0c2c0b410b210c0c2b0b410c210c0c2a0b410c210c0c290b410c210c0c280b410c210c0c270b410c210c0c260b410c210c0c250b4100210c0c240b4100210c0c230b4101210c0c220b4102210c0c210b4103210c0c200b4103210c0c1f0b4100210c0c1e0b4100210c0c1d0b4100210c0c1c0b4100210c0c1b0b4100210c0c1a0b4100210c0c190b4101210c0c180b4102210c0c170b4103210c0c160b4103210c0c150b4100210c0c140b4100210c0c130b4100210c0c120b4100210c0c110b410d210c0c100b410d210c0c0f0b410d210c0c0e0b410d210c0c0d0b410d210c0c0c0b410d210c0c0b0b410d210c0c0a0b410d210c0c090b410d210c0c080b410d210c0c070b410d210c0c060b410d210c0c050b410d210c0c040b410d210c0c030b410e210c0c020b410e210c0c010b410f210c0b200641016a210a2004280260210f201b2101024003402001280200221141086a210520112f0106210b41002102024002400340200b20022201460d01200141016a210202404100417f4101200520016a2d00002213200c4b1b2013200c461b41016a0e03000301000b0b2002417f6a210b0b0240200f0d00200441d8006a21020c030b200f417f6a210f2011200b4102746a41ec006a21010c010b0b200441d8006a21020240201120014103746a41146a22012802000e04010d0001010b200141046a21020b20022802002102024002400240024002400240024002402014417e6a220141084b0d0020010e09010302120405050607010b20042802c8032201417f6a220c20014f0d12200c20014b0d1220042802c003200c4104746a220c280208220120026a22022001490d12200c41086a20023602000c130b20042802c8032201417f6a220c20014f0d11200c20014b0d1120042802c003200c4104746a220c280208220120026a22022001490d11200c41086a200236020020042802c8032201417f6a220c20014f0d11200c20014b0d1120042802c0032202200c4104746a280204210c02400240200120042802c403460d002001210b0c010b200141016a220b2001490d2320014101742211200b2011200b4b1b220b41ffffffff0071200b470d23200b41047422114100480d23200220014104742011102c2202450d082004200b3602c403200420023602c00320042802c803210b0b2002200b4104746a2202200e3b000d200241003a000c2002200c360204200220013602002002410f6a200e4110763a0000200241086a4100360200200420042802c80341016a3602c8030c120b20042802c8032201417f6a220c20014f0d10200c20014b0d1020042802c003200c4104746a220c280208220120026a22022001490d10200c41086a200236020020042802c803220221010240200220042802c403470d00200241016a22012002490d222002410174220c2001200c20014b1b220141ffffffff00712001470d222001410474220b4100480d220240024020020d00200b1028210c0c010b20042802c0032002410474200b102c210c0b200c450d08200420013602c4032004200c3602c00320042802c80321010b20042802c00320014104746a2201200e3b000d200141003a000c2001200a360204200120023602002001410f6a200e4110763a0000200141086a4100360200200420042802c80341016a3602c8030c110b20042802c8032201417f6a220c20014f0d0f200c20014b0d0f20042802c003200c4104746a220c280208220120026a22022001490d0f200c41086a200236020020042802c803220221010240200220042802c403470d00200241016a22012002490d212002410174220c2001200c20014b1b220141ffffffff00712001470d212001410474220b4100480d210240024020020d00200b1028210c0c010b20042802c0032002410474200b102c210c0b200c450d08200420013602c4032004200c3602c00320042802c80321010b20042802c00320014104746a2201200e3b000d200141013a000c2001200a360204200120023602002001410f6a200e4110763a0000200141086a4100360200200420042802c80341016a3602c8030c100b200441c0036a200610ff030d0e20042802c8032202450d0e20042002417f6a22013602c80320042802c003220c20014104746a220b2d000c4102460d0e2001450d0f2002417e6a220220014f0d0e200c20024104746a220c200b2802002202200c280200220c200c20024b1b360200200220014f0d0f200441c0036a200610ff030d0e0c0f0b20042802c8032201417f6a220c20014f0d0d200c20014b0d0d20042802c003200c4104746a220c280208220120026a22022001490d0d202020064104746a41046a280200210b200c41086a200236020020042802c8032201417f6a220220014b0d0d2002200b6b220120024b0d0d200441c0036a200610ff030d0d20042802c803220220014d0d0d20042802c003220c20014104746a2d000c0d0e2002410474200c6a41706a2202200120022802002202200220014b1b3602000c0e0b20042802c8032201417f6a220c20014f0d0c200c20014b0d0c20042802c003200c4104746a220c280208220120026a22022001490d0c200c41086a200236020020042802c8032201417f6a220520014b0d0c202020064104746a41046a280200220128020021022001280204210c2004200520012802086b220b20054b22013a00b00220010d0c410410282213450d052013200b36020002400240200c4104490d00200520022802006b220f20054b0d08200241046a21010c010b0240200c0d0041012102410121110c0b0b200520022802006b220f20054b0d07200241046a21010b2002200c4102746a2120410121114104210c4102210b41022102034002402002417f6a22142011470d00201441016a22112014490d1f200b2011200b20114b1b221141ffffffff03712011470d1f201141027422144100480d1f0240024020024101470d002014102821130c010b2013200c2014102c21130b2013450d090b2013200c6a200f36020002400240202020016b410d490d000240200520012802006b220f20054b0d00200141046a21010c020b200441013a00b0020c0d0b20202001460d0b200520012802006b220f20054b0d0a200141046a21010b200b41026a210b200241016a2102200c41046a210c0c000b0b20042802c8032201417f6a220c20014f0d0b200c20014b0d0b20042802c003200c4104746a220c280208220120026a22022001490d0b200c41086a2002360200200441c0036a200610ff030d0b20042802c8032201450d0b20042802c00322022d000c0d0c200141047420026a41706a41003602000c0c0b41fce2c500200620011034000b201141041037000b200b41041037000b200b41041037000b410441041037000b41012111200441013a00b0020c030b201441041037000b200441013a00b0020c010b20042d00b0020d002013450d022002ad4220862011ad842118410121050240200441c0036a200610ff030d0002402018422088a72201450d002001410274210c20132101034020042802c803220b200128020022024d0d02024020042802c003221120024104746a2d000c0d00200b41047420116a41706a220b2002200b280200220b200b20024b1b3602000b200141046a2101200c417c6a220c0d000b0b410021050b02402018a7450d002013102a0b20050d020c030b2011450d012013102a0c010b200441c0036a200610ff03450d010b024020042802c403450d0020042802c003102a0b024020042802d003450d0020042802cc03102a0b4101211c0c0a0b200a201f460d0120082802142101200a21060c000b0b20042802cc0320042802d4032201410041202001676b10800420042903d003212120042802cc03211f024020042802c403450d0020042802c003102a0b0240201f0d004101211c0c080b0240200828021422022021422088a722114101746a220141ffffffff00712001470d002001410474220c417f4c0d00024002400240200c0d004108210b0c010b200c1028220b450d01200828021421020b20084100360214200828020c21222008200b36020c200841106a220b2802002123200b2001360200202220024104746a210f201f20114103746a212041022111024020020d00201f210a202221010c040b41002101201f210a4100210c20222102024002400340200241016a2f0000200241036a2d000041107472210e024020022d0000221341ac01470d00200241106a21010c070b200241086a2900002118200241046a280000210502400240024020114102470d000240200a2020470d00410021112020210a0c020b200a2902002219422088a721152019a7211041012111200a41086a210a0b20114101470d00200c2010470d0002402001200b280200470d00200141016a22112001490d15200141017422062011200620114b1b221141ffffffff00712011470d15201141047422064100480d150240024020010d002006102821010c010b200828020c20014104742006102c21010b2001450d022008200136020c200b2011360200200828021421010b200828020c20014104746a220120042f00c0033b00012001412d3a000020012015360204200141036a200441c0036a41026a2d00003a00002008200828021441016a220136021402402001200b280200470d00200141016a22112001490d15200141017422062011200620114b1b221141ffffffff00712011470d15201141047422064100480d150240024020010d002006102821010c010b200828020c20014104742006102c21010b2001450d042008200136020c200b2011360200200828021421010b200828020c20014104746a220120042f00c0033b00012001410b3a00002001200d36020441022111200141036a200441c0036a41026a2d00003a00002008200828021441016a2201360214200c21100b02402001200b280200470d00200141016a22062001490d14200141017422142006201420064b1b220641ffffffff00712006470d14200641047422144100480d140240024020010d002014102821010c010b200828020c20014104742014102c21010b2001450d042008200136020c200b2006360200200828021421010b200c41016a210c200828020c20014104746a22012018370308200120053602042001200e3b0001200120133a0000200141036a200e4110763a00002008200828021441016a2201360214200241106a2202200f470d010c080b0b200641081037000b200641081037000b201441081037000b200c41081037000b1036000b411041041037000b2001200f460d0003400240024020012d000022024109460d00200241ac01470d010c030b0240200141046a280200220228020441ffffffff0371450d002002280200102a0b2002102a0b200141106a2201200f470d000b0b2021a7210102402023450d002022102a0b200a202047201120114102461b210202402001450d00201f102a0b024020024101470d004101211c0c050b200841186a210c024002402004280268450d0020082802142202450d00200828020c210120024104742102410021080340024020012d0000412c470d002001410b3a0000200141046a201a360200200841016a21080b200141106a2101200241706a22020d000b4101210120080d010b201d21010b200c201e470d000b2001211d0c030b20072802042201200d490d022007200141016a3602040c020b200728020c2201450d012007280204220c2001411c6c6a210b0340200c2201411c6a210c024020012802182202450d0020012802102101200241027421020340024020012802002208200d490d002001200841016a3602000b200141046a21012002417c6a22020d000b0b200c200b460d020c000b0b200728020c2201450d00200141146c2102200728020441106a2101034002402001417c6a2802000d0020012802002208200d490d002001200841016a3602000b200141146a21012002416c6a22020d000b0b200741306a22072012470d000b201c4101710d02201d4101710d01200428029002211120042802880221070b2004418c026a280200210f20042802840221132004280280022105410021060c020b200441c0036a41106a20044180026a41106a280200360200200441c0036a41086a20044180026a41086a29030037030020042004290380023703c003200441b0026a200441c0036a10fc03411010282202450d07200241063a0000410110282201450d06200141003a000041011028220c450d05200c20012d00003a00002001102a411010282208450d04200841063a000041f00010282201450d03200141063a00602001412c3b01502001200d3602442001410b3a0040200141d8003a0030200120042802683602242001412d3a0020200141003602142001410f3a0010200141003602042001410f3a0000024020082d00004109470d0002402008280204220d28020441ffffffff0371450d00200d280200102a2008280204210d0b200d102a0b2008102a024020022d00004109470d0002402002280204220828020441ffffffff0371450d002008280200102a200228020421080b2008102a0b2002102a200441e4036a4287808080f000370200200441e0036a2001360200200441dc036a4100360200200441c0036a410c6a4281808080800c370200200441c8036a4101360200200441003602ec03200442043702d4032004200c3602c403200441013602c003200441b0026a200441c0036a108104200441c0036a200441b0026a418c01109a051a20044198026a200441c0036a10fe0320044198026a410c6a280200210f200441a8026a28020021112004280298022105200428029c02211320042802a0022107410021060c010b2004418c026a280200210f200428028802210702402004280290022211450d00201141306c21022007210103402001108204200141306a2101200241506a22020d000b0b41012106411a211341f28cc60021050240200f450d002007102a0b0b200441e4006a280200210e200428025c21080240200441e0006a2802002201450d000340200828026c21082001417f6a22010d000b0b4100210d4100210102400340200e450d0102400240200120082f01064f0d00200820014103746a41146a2902002118200141016a21010c010b02400240200828020022010d00200dad21184100210c410021010c010b2008330104422086200dad8421184101210c0b2008102a2018a7210d024002402018422088a7220b20012f01064f0d00200121020c010b034002400240200128020022020d00200dad2118410021020c010b200c41016a210c2001330104422086200dad8421180b2001102a2018a7210d200221012018422088a7220b20022f01064f0d000b0b200b41027420026a41f0006a28020021082002200b4103746a41146a29020021180240200c417f6a2201450d000340200828026c21082001417f6a22010d000b0b410021010b200e417f6a210e2018a74103470d000b0b0240200841f8b9c000460d00200828020021012008102a2001450d00200128020021022001102a2002450d00024020022802002201450d0003402002102a2001210220012802002208210120080d000b0b2002102a0b02402006450d002000200536020420004101360200200041086a20133602000c250b200441b0026a41106a2011360200200441b0026a410c6a200f360200200420073602b802200420133602b402200420053602b002200441c0036a200441b0026a2009280260108304024020042802c0034101470d000240200441c0036a41086a280200450d0020042802c403102a0b2000418c8dc60036020420004101360200200041086a41233602000c250b200441d4036a2802002102200441c0036a41106a280200210f200441c0036a410c6a2802002106200441c8036a280200210d20042802c403210820032802582110200441003602a002200442013703980202400240410410282201450d002004410436029c02200420042802a002220c41046a3602a00220042001360298022001200c6a200836000002400240200428029c02220820042802a00222016b4104490d0020042802980221080c010b200141046a220c2001490d0320084101742201200c2001200c4b1b22014100480d030240024020080d002001102821080c010b20042802980220082001102c21080b2008450d022004200136029c02200420083602980220042802a00221010b2004200141046a3602a002200820016a200d3600002006200241306c22016a210d024020020d00200621010c0e0b200141506a2111200441c0036a4101722102200441c0036a41276a210c200441c0036a41206a210b200441c0036a41186a2107200441c0036a41086a210e20062101034020012d00002108200c200141286a290000370000200b200141216a2900003703002007200141196a290000370300200441c0036a41106a2203200141116a290000370300200e200141096a2900003703002004200141016a2900003703c003024020084110470d00200141306a21010c0f0b200441b0026a41276a2213200c290000370000200441b0026a41206a2205200b290300370300200441b0026a41186a20072903002218370300200441b0026a41106a20032903002219370300200441b0026a41086a200e2903002221370300200420042903c00322243703b00220022024370000200241086a2021370000200241106a2019370000200241186a2018370000200241206a2005290300370000200241276a2013290000370000200420083a00c003200441f0006a200441c0036a20044198026a10840420042d00702208411f470d0d201141506a2111200141306a2201200d470d000b200d21010c0d0b410441011037000b200141011037000b1031000b41f00041081037000b411041081037000b410141011037000b410141011037000b411041081037000b200b41041037000b410341011037000b410341011037000b410141011037000b200428027421122004280278211002402011450d00200141306a2101200441c0036a4101722102200441c0036a41276a210b200441c0036a41206a2107200441c0036a41186a210e200441c0036a41086a2111034020012d0000210c200b200141286a2900003700002007200141216a290000370300200e200141196a290000370300200441c0036a41106a2203200141116a2900003703002011200141096a2900003703002004200141016a2900003703c003200c4110460d01200441b0026a41276a2213200b290000370000200441b0026a41206a22052007290300370300200441b0026a41186a200e2903002218370300200441b0026a41106a20032903002219370300200441b0026a41086a20112903002221370300200420042903c00322243703b00220022024370000200241086a2021370000200241106a2019370000200241186a2018370000200241206a2005290300370000200241276a20132900003700002004200c3a00c003200441c0036a108204200141306a2201200d470d000b0b0240200f450d002006102a0b0240200428029c02450d00200428029802102a0b024020084105470d002010450d002012102a0b200041cd8fc60036020420004101360200200041086a41253602000c190b02402001200d460d00200441c0036a4101722102200441c0036a41276a210c200441c0036a41206a210b200441c0036a41186a2107200441c0036a41086a210e034020012d00002108200c200141286a290000370000200b200141216a2900003703002007200141196a290000370300200441c0036a41106a2211200141116a290000370300200e200141096a2900003703002004200141016a2900003703c00320084110460d01200441b0026a41276a2203200c290000370000200441b0026a41206a2213200b290300370300200441b0026a41186a20072903002218370300200441b0026a41106a20112903002219370300200441b0026a41086a200e2903002221370300200420042903c00322243703b00220022024370000200241086a2021370000200241106a2019370000200241186a2018370000200241206a2013290300370000200241276a2003290000370000200420083a00c003200441c0036a108204200141306a2201200d470d000b0b0240200f450d002006102a0b2004280298022101200429029c0221182000411c6a41003a0000200041146a2018370200200041106a20013602002000410c6a2017360200200041086a2016360200200020103602042000411d6a20042f0080023b0000200041003602002000411f6a20044182026a2d00003a00000c180b200e102a2000419c90c4003602040c160b200e102a2000419c90c4003602040c150b200e102a2000419c90c4003602040c140b200e102a2000419c90c4003602040c130b200e102a2000419c90c4003602040c120b200e102a2000419c90c4003602040c110b200e102a2000419c90c4003602040c100b200e102a2000419c90c4003602040c0f0b200f2d000d22024104460d05200241fb01710d05200e102a201121020c0b0b200f2d000d22024104460d02200241fb01710d02200e102a201121020c0a0b200f2d000d22024104460d00200241fb01710d00200e102a201121020c090b200e102a2000419c90c4003602040c0b0b200e102a2000419c90c4003602040c0a0b200e102a2000419c90c4003602040c090b200e102a2000419c90c4003602040c080b200e102a2000419c90c4003602040c070b02400240200241bbffc500460d0041bbffc5002002410b109c050d010b4126210c419c90c400210e200f2d000c41e000470d01200f2802080d0120112102200f2d000d4104460d040c010b0240200241dfffc500460d0041dfffc5002002410b109c050d030b4126210c419c90c400210e200f2d000c41e000470d00200f2802080d0020112102200f2d000d4104460d030b200e2108200c21010b200020083602040c040b0240200241ac81c600460d0041ac81c6002002410b109c050d030b024041021028220c450d00200c41003b0000200f2d000c41e000470d02200f2802084102470d020240200f280200220e200c460d0041002101034020014102460d01200c20016a2102200e20016a2108200141016a210120082d000020022d0000470d040c000b0b200f2d000d4104470d02200c102a201121020c010b0b410241011037000b200c102a0b412621012000419c90c4003602040b20004101360200200041086a200136020002402007450d00200b200741306c6a2111200b210703402007220041306a21070240024020002d00002201410e4b0d00024002400240024002400240024002400240024002400240024020010e0f0001020304050607080e090e0a0b0c000b200041086a280200450d0d200041046a280200102a0c0d0b0240200041086a280200450d00200041046a280200102a0b200041146a280200450d0c200041106a280200102a0c0c0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200102a0b200141106a2101200241706a22020d000b0b200041086a280200450d0b2000280204102a0c0b0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101200241586a22020d000b0b200041086a280200450d0a2000280204102a0c0a0b200041086a280200450d09200041046a280200102a0c090b200041086a280200450d08200041046a280200102a0c080b200041086a280200450d07200041046a280200102a0c070b02402000410c6a2802002201450d00200041046a280200220c20014104746a210e03400240200c2802082202450d00200c2802002101200241047421020340024020012d00004109470d000240200141046a220d280200220828020441ffffffff0371450d002008280200102a200d28020021080b2008102a0b200141106a2101200241706a22020d000b0b200c41106a21010240200c41046a280200450d00200c280200102a0b2001210c2001200e470d000b0b200041086a280200450d062000280204102a0c060b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200102a0b200141146a21012002416c6a22020d000b0b200041086a280200450d052000280204102a0c050b02402000410c6a2802002201450d00200041046a280200220c2001411c6c6a210e03400240200c2802042201450d000240200c410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a220d280200220828020441ffffffff0371450d002008280200102a200d28020021080b2008102a0b200141106a2101200241706a22020d000b0b200c41086a280200450d00200c280204102a0b200c411c6a21010240200c41146a280200450d00200c280210102a0b2001210c2001200e470d000b0b200041086a280200450d042000280204102a0c040b02402000410c6a2802002201450d00200041046a280200220c200141186c6a210e03400240200c41046a280200450d00200c280200102a0b0240200c41146a2802002202450d00200c28020c2101200241047421020340024020012d00004109470d000240200141046a220d280200220828020441ffffffff0371450d002008280200102a200d28020021080b2008102a0b200141106a2101200241706a22020d000b0b200c41186a21010240200c41106a280200450d00200c28020c102a0b2001210c2001200e470d000b0b200041086a280200450d032000280204102a0c030b02402000410c6a2802002201450d00200041046a280200220c2001411c6c6a210e03400240200c2802042201450d000240200c410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a220d280200220828020441ffffffff0371450d002008280200102a200d28020021080b2008102a0b200141106a2101200241706a22020d000b0b200c41086a280200450d00200c280204102a0b200c411c6a21010240200c41146a280200450d00200c280210102a0b2001210c2001200e470d000b0b200041086a280200450d022000280204102a0c020b0240200041046a2802002201450d00200041086a280200450d002001102a0b0240200041146a2802002201450d0002402000411c6a2802002202450d002002410c6c21020340024020012802002208450d00200141046a280200450d002008102a0b2001410c6a2101200241746a22020d000b0b200041186a280200450d002000280214102a0b200041246a280200220c450d0102402000412c6a2802002201450d00200c20014104746a210e0340200c220d41106a210c0240200d2802042201450d000240200d410c6a2802002202450d002002410c6c21020340024020012802002208450d00200141046a280200450d002008102a0b2001410c6a2101200241746a22020d000b0b200d41086a280200450d00200d280204102a0b200c200e470d000b0b200041286a280200450d012000280224102a0c010b0240200041086a280200450d00200041046a280200102a0b0240200041146a2802002201450d00200041186a280200450d002001102a0b200041246a280200450d00200041206a280200102a0b20072011470d000b0b200a450d00200b102a0b200441d0046a24000ba20301067f230041106b2202240020024100360208200242013703002000200210a001200041046a200210a001200041086a200210a00120002d0018210302400240024002400240200228020420022802082204460d00200228020021050c010b200441016a22052004490d03200441017422062005200620054b1b22064100480d030240024020040d002006102821050c010b200228020020042006102c21050b2005450d0120022006360204200220053602000b2002200441016a360208200520046a20033a0000200028020c2106200041146a2802002204200210b4010240024020022802042203200228020822056b2004490d00200228020021000c010b200520046a22002005490d03200341017422072000200720004b1b22074100480d030240024020030d002007102821000c010b200228020020032007102c21000b2000450d022002200736020420022000360200200721030b200020056a20062004109a051a200128020020012802042000200520046a100702402003450d002000102a0b200241106a24000f0b200641011037000b200741011037000b1031000bd60801037f024002400240024002400240024002400240410110282202450d00200220002d00003a0000200241014102102c2202450d01200220002d00013a0001200241024104102c2202450d02200220002d00023a0002200220002d00033a0003200241044108102c2202450d03200220002d00043a0004200220002d00053a0005200220002d00063a0006200220002d00073a0007200241084110102c2202450d04200220002d00083a0008200220002d00093a0009200220002d000a3a000a200220002d000b3a000b200220002d000c3a000c200220002d000d3a000d200220002d000e3a000e200220002d000f3a000f200241104120102c2202450d05200220002d00103a0010200220002d00113a0011200220002d00123a0012200220002d00133a0013200220002d00143a0014200220002d00153a0015200220002d00163a0016200220002d00173a0017200220002d00183a0018200220002d00193a0019200220002d001a3a001a200220002d001b3a001b200220002d001c3a001c200220002d001d3a001d200220002d001e3a001e200220002d001f3a001f2002412041c000102c2202450d06200220002d00203a0020200220002d00213a0021200220002d00223a0022200220002d00233a0023200220002d00243a0024200220002d00253a0025200220002d00263a0026200220002d00273a0027200220002d00283a0028200220002d00293a0029200220002d002a3a002a200220002d002b3a002b200220002d002c3a002c200220002d002d3a002d200220002d002e3a002e200220002d002f3a002f200220002d00303a0030200220002d00313a0031200220002d00323a0032200220002d00333a0033200220002d00343a0034200220002d00353a0035200220002d00363a0036200220002d00373a0037200220002d00383a0038200220002d00393a0039200220002d003a3a003a200220002d003b3a003b200220002d003c3a003c200220002d003d3a003d200220002d003e3a003e200220002d003f3a003f024002402001280200220041046a2802002203200041086a28020022016b41c000490d00200028020021030c010b200141c0006a22042001490d09200341017422012004200120044b1b22014100480d090240024020030d002001102821030c010b200028020020032001102c21030b2003450d0820002003360200200041046a2001360200200041086a28020021010b200041086a200141c0006a360200200320016a220041386a200241386a290000370000200041306a200241306a290000370000200041286a200241286a290000370000200041206a200241206a290000370000200041186a200241186a290000370000200041106a200241106a290000370000200041086a200241086a290000370000200020022900003700002002102a0f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000b41c00041011037000b200141011037000b1031000bc32205017f057e097f047e0f7f230041c0056b22032400200241206a2903002104200241186a2903002105200241106a2903002106200241c8006a29030021072002290308210820022802002109200341086a41186a220a200241c0006a220b290300370300200341086a41106a220c200241386a220d290300370300200341086a41086a220e200241306a220f2903003703002003200241286a2202290300370308200341286a41186a2210200b290300370300200341286a41106a2211200d290300370300200341286a41086a220d200f290300370300200320022903003703282001280200210b20034180026a41186a2202200a29030037030020034180026a41106a220f200c29030037030020034180026a41086a220c200e2903003703002003200329030837038002024002400240024041381028220a450d00200a4200370308200a4200370300200a2009360210200a2003290328370214200a411c6a200d290300370200200a41246a2011290300370200200a412c6a2010290300370200200341d0016a41086a200c290300370300200341d0016a41106a200f290300370300200341d0016a41186a200229030037030020032003290380023703d001024002400240200b2802082202200b41046a280200470d00200241016a220c2002490d012002410174220d200c200d200c4b1b220cad42d0007e2212422088a70d012012a7220d4100480d010240024020020d00200d102821020c010b200b280200200241d0006c200d102c21020b2002450d02200b2002360200200b41046a200c360200200b28020821020b200b280200200241d0006c6a2202420037031020022004370308200220053703002002200a360220200220032903d00137022c200241186a4200370300200241246a428180808010370200200241346a200341d0016a41086a220a2903003702002002413c6a200341d0016a41106a220e290300370200200241c4006a200341d0016a41186a2202290300370200200b200b28020841016a3602082001280204210f20034190016a41186a200341286a41186a29030037030020034190016a41106a200341286a41106a29030037030020034190016a41086a200341286a41086a2903003703002003200329032837039001024002400240200f280200220c41f8b9c000460d00200f280204210d0c010b4100210d20034180026a410041e0021099051a200341f8016a220b4100360200200341f0016a2201420037030020024200370300200e4200370300200a4200370300200342003703d0014194031028220c450d01200c41003b0106200c4100360200200c41086a20034180026a41e002109a051a200c4190036a200b280200360200200c4188036a2001290300370200200c4180036a200341e8016a290300370200200c41f8026a200341e0016a290300370200200c41f0026a200341d0016a41086a290300370200200c20032903d0013702e802200f4100360204200f200c3602000b02400340200c41086a210a200c41066a2110200c2f0106220e41057421024100210b0240024003402002450d0120034190016a200a4120109c052201450d02200241606a2102200b41016a210b200a41206a210a2001417f4a0d000b200b417f6a210e0b200d450d02200d417f6a210d200c200e4102746a4194036a280200210c0c010b0b200c200b4102746a41e8026a20093602000c060b200341c8006a41186a20034190016a41186a22022903002212370300200341c8006a41106a20034190016a41106a220a2903002213370300200341c8006a41086a20034190016a41086a220b290300221437030020032003290390012215370348200f200f28020841016a36020820022012370300200a2013370300200b20143703002003201537039001024002400240024020102f0100220d410b490d0020034180026a410041e0021099051a200341f8016a22024100360200200341f0016a220a4200370300200341d0016a41186a4200370300200341d0016a41106a4200370300200341d0016a41086a4200370300200342003703d00141940310282211450d03201141003b010620114100360200201141086a20034180026a41e002109a05210b20114190036a200228020036020020114188036a200a29030037020020114180036a200341d0016a41186a290300370200201141f8026a200341d0016a41106a290300370200201141f0026a200341d0016a41086a290300370200201120032903d0013702e8022003200c2f00c8013b01cc012003200c41ca016a2d00003a00ce01200c41cb016a2800002116200c41cf016a2800002117200c41d3016a2800002118200c41d7016a28000021192003200c41e0016a2900003700bd012003200c2900db013703b801200c28028003211a200b200c41e8016a200c2f010641796a2202410574109a05210b201141e8026a200c4184036a2002410274109a052101200c41063b0106201120023b0106200320032f01cc013b01b401200320032d00ce013a00b601200320032903b8013703d001200320032900bd013700d501200e4107490d01201141066a2110200b200e417a6a220d4105746a200b200e41796a220a4105746a220b200241ffff0371200a6b410574109b051a200b41186a20034190016a41186a290300370000200b41106a20034190016a41106a290300370000200b41086a20034190016a41086a290300370000200b2003290390013700002001200d4102746a210b2001200a4102746a21020c020b200c41086a2201200e41016a220f4105746a2001200e4105746a2201200d200e6b410574109b051a200141186a2002290300370000200141106a200a290300370000200141086a200b2903003700002001200329039001370000200c41e8026a2202200f4102746a2002200e4102746a2202200c2f0106200e6b410274109b051a20022009360200200c200c2f010641016a3b01060c080b200c41086a2202200e41016a220a4105746a2002200e4105746a220220102f0100200e6b410574109b051a200241186a20034190016a41186a290300370000200241106a20034190016a41106a290300370000200241086a20034190016a41086a2903003700002002200329039001370000200c41e8026a220b200e4102746a2102200b200a4102746a210b200e210a0b200b200220102f0100200a6b410274109b051a20022009360200201020102f010041016a3b0100200341b0016a41026a221b20032d00b60122023a0000200341fc006a41026a221c20023a0000200320032900d50137008501200320032903d00137038001200320032f01b40122023b01b001200320032900850137006d2003200329038001370368200320023b017c200c280200220d450d05200c2f0104211020034180026a410272211d0340201b201c2d00003a0000200320032f017c3b01b00120032003290368370390012003200329006d37009501201041ffff0371210c02400240024002400240200d2f01062202410b490d00201d410041be031099051a41c40310282201450d0320014100360200200141046a20034180026a41c003109a051a2003200d2f00c8013b01cc012003200d41ca016a2d00003a00ce012003200d41db016a2900003703b8012003200d41e0016a2900003700bd01200d41cb016a280000211e200d41cf016a280000211f200d41d3016a2800002120200d41d7016a2800002121200d4180036a2802002122200141086a200d41e8016a200d2f0106220a41796a2202410574109a052123200141e8026a200d4184036a2002410274109a05212420014194036a200d41b0036a200a417a6a220e410274109a052109200d41063b0106200120023b01060240200e450d00410021022009210a0340200a280200220b20023b0104200b2001360200200a41046a210a200e200241016a2202470d000b0b200320032d00ce0122023a00b601200320032f01cc01220a3b01b401200320032903b8013703d001200320032900bd013700d50120034180016a41026a220e20023a00002003200a3b018001200320032903d00137038002200320032900d50137008502201041ffff0371220a4107490d012023200c417a6a220b4105746a2023200c41796a22024105746a220a20012f010620026b410574109b051a200a41186a200329009501370000200a201936000f200a201836000b200a2017360007200a2016360003200a41026a201b2d00003a0000200a20032f01b0013b0000200a2003290390013700132024200b410274220a6a202420024102746a221020012f0106221620026b410274109b051a2010201a3602002001201641016a22103b0106200c410274221620096a416c6a2009200a6a220a201041ffff0371220c200b6b410274109b051a200a2011360200200c200b490d02200120166a41fc026a210a0340200a280200220b200241016a22023b0104200b2001360200200a41046a210a2002200c490d000c030b0b200d41086a220a200c41016a220b4105746a200a200c4105746a220a2002200c6b410574109b051a200a41186a200329009501370000200a201936000f200a201836000b200a2017360007200a2016360003200a41026a200341b0016a41026a2d00003a0000200a20032f01b0013b0000200a200329039001370013200d41e8026a2202200b410274220a6a2002200c41027422016a2202200d2f0106220e200c6b410274109b051a2002201a360200200d200e41016a22023b01062001200d4194036a220c6a41086a200c200a6a220a200241ffff03712201200b6b410274109b051a200a2011360200201041ffff037120014f0d0b200d200b417f6a22024102746a4198036a210a0340200a280200220b200241016a22023b0104200b200d360200200a41046a210a20022001490d000c0c0b0b200d41086a2202200c41016a22104105746a2002200c4105746a2202200d2f0106200c6b410574109b051a200241186a2003290095013700002002201936000f2002201836000b2002201736000720022016360003200241026a201b2d00003a0000200220032f01b0013b00002002200329039001370013200d41e8026a220b201041027422096a200b200c41027422026a220b200d2f01062216200c6b410274109b051a200b201a360200200d201641016a220b3b01062002200d4194036a22166a41086a201620096a2209200b41ffff0371220b20106b410274109b051a20092011360200200a200b4f0d00200d20026a4198036a210203402002280200220a200c41016a220c3b0104200a200d360200200241046a2102200b200c470d000b0b201c200e2d00003a0000200320032f0180013b017c2003200329038002370368200320032900850237006d200d28020022020d01201e21162021211920202118201f2117200121112022211a0c080b41c40341041037000b200d2f01042110201e21162021211920202118201f21172002210d2022211a200121110c000b0b41940341041037000b41940341041037000b1031000b200d41081037000b413841081037000b20034180026a410272410041be031099051a41c40310282202450d0120024100360200200241046a20034180026a41c003109a051a2002200f280200220a36029403200f2002360200200f200f28020441016a360204200a41003b0104200a2002360200200220022f0106220b4105746a220a41086a20032f017c3b0000200a410a6a200341fc006a41026a2d00003a0000200a41176a2019360000200a41136a2018360000200a410f6a2017360000200a410b6a2016360000200a411b6a2003290368370000200a41206a200329006d37000020024194036a200b41016a220a4102746a20113602002002200b4102746a41e8026a201a3602002002200a3b01062011200a3b0104201120023602000b20002005370310200020083703002000200329032837032020002007370340200041186a200437030020002006370308200041286a200341306a290300370300200041306a200341386a290300370300200041386a200341286a41186a290300370300200341c0056a24000f0b41c40341041037000b0a0041c8c2c2001032000b5101027e024002402003450d002002280200450d010b41b698c40041f4031050000b2001280218220342002003290308220420023502047d2205200520045622021b37030820004105410420021b3602000bee0201047f024002400240024002402002417f4c0d000240024020020d00410121060c010b200210282206450d020b200620012002109a0521062004417f4c0d000240024020040d0041012101410021070c010b20042107200410282201450d030b200120032004109a052103024020002802082201200041046a280200470d00200141016a22082001490d05200141017422092008200920084b1b220841ffffff3f712008470d05200841057422094100480d050240024020010d002009102821010c010b200028020020014105742009102c21010b2001450d0420002001360200200041046a2008360200200028020821010b200028020020014105746a220141003602182001200336020c2001200236020820012002360204200120063602002001411c6a2005360200200141146a2004360200200141106a20073602002000200028020841016a3602080f0b1036000b200241011037000b200441011037000b200941041037000b1031000bf90e05047f027e027f017e027f230041c00c6b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042105200241246a2802002106200241346a280200210302400240200241146a2802002207450d004105210220012802002802182802402802bc012003490d010b200441286a4200370300200441206a4200370300200441186a420037030020012802182202420020022903082208427f20012802102903482209420586200942ffffffffffffffff07832009521b7d22092009200856220a1b3703082004420037031041052102200a0d000240024020012802142802082005200441106a4120101741026a220a41024b0d00200a0e03020001020b41a0fac5001032000b0240024020070d00410121034100210b0c010b2004200128021029034842002003ad220c4200109f052001280218220a4200200a2903082209427f200429030020042903084200521b7d22082008200956220a1b370308200a0d012003417f4c0d060240024020030d004101210b02402001280214280208200641014100101741026a220341024b0d0020030e03040002040b41a0fac5001032000b024002402003102e220b450d00024020012802142802082006200b2003101741026a220341024b0d0020030e03020003020b41a0fac5001032000b200341011037000b200b102a0c020b200c422086200c842109200b4521030b20012802002101200441306a41186a220a200441106a41186a290300370300200441306a41106a2205200441106a41106a290300370300200441306a41086a2206200441106a41086a2903003703002004200429031037033020012802182107024020030d0020072802402802bc012009422088a74f0d002009a7450d01200b102a0c010b200441d0006a41186a200a290300370300200441d0006a41106a2005290300370300200441d0006a41086a20062903003703002004200429033037035020072802180d062007417f360218200441a8016a200741e8006a290000370300200441a0016a200741e0006a29000037030020044198016a200741d8006a2900003703002004200729005037039001024002402007411c6a220d280200220a41f8b9c000460d00200741206a28020021060c010b41002106200441e0096a410041e0021099051a200441c0016a410041a0081099051a41880b1028220a450d08200a41003b0106200a4100360200200a41086a200441e0096a41e002109a051a200a41e8026a200441c0016a41a008109a051a200741206a41003602002007200a36021c0b024002400340200a2f0106220e4105742105410021024100210302400240034020052002460d0120044190016a200a20026a41086a4120109c052201450d02200241206a2102200341016a21032001417f4a0d000b2003417f6a210e0b2006450d022006417f6a2106200a200e4102746a41880b6a280200210a0c010b0b200741246a2101410121020c010b200441f0006a41186a20044190016a41186a290300370300200441f0006a41106a20044190016a41106a290300370300200441f0006a41086a20044190016a41086a2903003703002004200429039001370370200741246a210141002106200e2103410021020b0240024020020d00200441fc096a200441f0006a41086a290300370200200441840a6a200441f0006a41106a2903003702002004418c0a6a200441f0006a41186a290300370200200420013602f009200420033602ec092004200d3602e8092004200a3602e409200420063602e009200420042903703702f409200441e0016a20042903b001370300200441e8016a200441b0016a41086a290300370300200441f4016a4200370200200442003703d801200442003703c001200441f8b9c0003602f001200441003a00fc01200441fd016a20042900900137000020044185026a20044190016a41086a2900003700002004418d026a20044190016a41106a29000037000020044195026a20044190016a41186a290000370000200441003a009d02200441e0096a200441c0016a10b70121020c010b200441d8016a4200370300200441d4016a41f8b9c000360200200441003602e001200441003602d001200442003703c801200441f8b9c0003602c401200441003602c001200a200341e0006c6a41e8026a2102200441c0016a1095010b200441c0016a41186a200441d0006a41186a290300370300200441c0016a41106a200441d0006a41106a290300370300200441c0016a41086a200441d0006a41086a290300370300200420042903503703c00120042009370294012004200b36029001200441e0096a200241306a200441c0016a20044190016a10bd01024020042802e009450d0020042802e4092202450d00200441e8096a280200450d002002102a0b2007200728021841016a360218410421020b20002002360200200441c00c6a24000f0b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b1036000b41a8b8c0004110200441c0016a41d0b8c0001038000b41880b41081037000b900302017f027e230041c0006b22042400024002402003450d0020022802000d0020022802042103200441186a4200370300200441106a4200370300200441086a420037030020012802182202420020022903082205427f20012802102903482206420586200642ffffffffffffffff07832006521b7d2206200620055622021b3703082004420037030002400240024020020d00024002402001280214280208200320044120101741026a220241024b0d0020020e03020001020b41a0fac5001032000b200441206a2001280200280218220241186a200241d0006a2002410c6a4100200228020c1b200410a7012004280220450d01200441306a41086a2203200441206a41086a28020036020020042004290320370330200141046a21020240200141086a280200450d002002280200102a0b20022004290330370200200241086a2003280200360200410021010c020b200041053602000c030b2001410c6a4100360200410121010b20004100360200200020013602040c010b41b698c40041f4031050000b200441c0006a24000bae0f06017f017e057f027e037f027e230041d0016b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042103200241286a2903002105200241346a2802002106200241c4006a2802002107200241d4006a2802002108200241e4006a2802002109200441286a20012802102903484200200241146a280200220aad4200109f052001280218220242002002290308220b427f200429032820042903304200521b7d220c200c200b5622021b370308024020020d00200a417f4c0d0802400240024002400240200a0d004101210d02402001280214280208200341014100101741026a220241024b0d00200141146a210e20020e03060002060b41a0fac5001032000b0240200a102e220d450d00024020012802142802082003200d200a101741026a220241024b0d00200141146a210e20020e03030002030b41a0fac5001032000b200a41011037000b41002102200441003a00980102400340200a2002460d01200441f8006a20026a200d20026a2d00003a00002004200241016a22033a0098012003210220034120470d000b200441a0016a41186a2202200441f8006a41186a290300370300200441a0016a41106a2203200441f8006a41106a290300370300200441a0016a41086a220f200441f8006a41086a290300370300200420042903783703a0010240200a450d00200d102a0b200441386a41086a200f290300370300200441386a41106a2003290300370300200441386a41186a2002290300370300200420042903a001370338200441186a200128021029034842002007ad4200109f052001280218220242002002290308220b427f200429031820042903204200521b7d220c200c200b5622021b37030820020d042007417f4c0d0c20070d03200e280200280208200641014100101741026a220241024b0d0220020e03040204040b0240200241ff0171450d00200441003a0098010b200a450d030b200d102a0c020b41a0fac5001032000b0240024002402007102e2202450d000240200e280200280208200620022007101741026a220341024b0d0020030e03030002030b41a0fac5001032000b200741011037000b2007410f4d0d00200241086a2900002110200229000021112002102a200441086a200128021029034842002009ad4200109f052001280218220242002002290308220b427f200429030820042903104200521b7d220c200c200b5622021b37030820020d01200141046a210a0240024020092001410c6a220d28020022034b0d00200921020c010b02400240200141086a280200220220036b200920036b2206490d00200a2802002107200321020c010b200320066a22072003490d0d2002410174220e2007200e20074b1b220e4100480d0d0240024020020d00200e102821070c010b200a2802002002200e102c21070b2007450d0c20012007360204200141086a200e3602002001410c6a28020021020b200720026a210e0240024020064102490d00200e410020092003417f7322036a22061099051a2007200920026a20036a6a210e200620026a21020c010b2006450d010b200e41003a0000200241016a21020b200d2002360200024002402001280214280208200820012802042002101741026a220241024b0d0020020e03030001030b41a0fac5001032000b2001410c6a2202280200210720024100360200200141086a28020021032001280204210d2001420137020420012802182202290308220c210b024002402005500d002005210b200c2005540d010b2002200c200b7d3703082002290310210c200441a0016a41186a200241186a2903003703002004200b3703a8012004200b3703a0012004200c3703b001200128020041186a2802002106200441f8006a41186a200441386a41186a290300370300200441f8006a41106a200441386a41106a290300370300200441f8006a41086a200441386a41086a29030037030020042004290338370378200420073602c801200420033602c4012004200d3602c001200441d8006a2006200441f8006a20112010200441a0016a200441c0016a10c101410121090240024020042802584101460d00200441d8006a410472210d200441d8006a41106a2d00002107200441e4006a2802002106200441e0006a2802002103410021090c010b200441e4006a210d200441ec006a2802002106200441d8006a41106a2802002103410021070b200d280200210d200220042903a80120022903087c370308200141086a2802002102024020090d0002402002450d00200a280200102a0b200a200d3602000c0e0b2002450d00200a280200102a0b200a200d3602004180022107410021060c0c0b2002102a0b200041053602000c0b0b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b1036000b200e41011037000b1031000b2001410c6a2006360200200141086a200336020020004100360200200020073602040b200441d0016a24000bc71006017f017e057f027e037f027e230041e0016b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042103200241286a2903002105200241346a2802002106200241c4006a2802002107200241d4006a2802002108200241e4006a2802002109200441206a20012802102903484200200241146a280200220aad4200109f052001280218220242002002290308220b427f200429032020042903284200521b7d220c200c200b5622021b3703080240024020020d00200a417f4c0d0902400240024002400240200a0d004101210d02402001280214280208200341014100101741026a220241024b0d00200141146a210e20020e03060002060b41a0fac5001032000b0240200a102e220d450d00024020012802142802082003200d200a101741026a220241024b0d00200141146a210e20020e03030002030b41a0fac5001032000b200a41011037000b41002102200441003a00c80102400340200a2002460d01200441a8016a20026a200d20026a2d00003a00002004200241016a22033a00c8012003210220034120470d000b20044188016a41186a2202200441a8016a41186a29030037030020044188016a41106a2203200441a8016a41106a29030037030020044188016a41086a220f200441a8016a41086a290300370300200420042903a801370388010240200a450d00200d102a0b200441306a41086a200f290300370300200441306a41106a2003290300370300200441306a41186a20022903003703002004200429038801370330200441106a200128021029034842002007ad4200109f052001280218220242002002290308220b427f200429031020042903184200521b7d220c200c200b5622021b37030820020d042007417f4c0d0d20070d03200e280200280208200641014100101741026a220241024b0d0220020e03040204040b0240200241ff0171450d00200441003a00c8010b200a450d030b200d102a0c020b41a0fac5001032000b0240024002402007102e2202450d000240200e280200280208200620022007101741026a220341024b0d0020030e03030002030b41a0fac5001032000b200741011037000b2007410f4d0d00200241086a2900002110200229000021112002102a2004200128021029034842002009ad4200109f052001280218220242002002290308220b427f200429030020042903084200521b7d220c200c200b5622021b37030820020d01200141046a21070240024020092001410c6a220a28020022034b0d00200921020c010b02400240200141086a280200220220036b200920036b2206490d002007280200210d200321020c010b200320066a220d2003490d0e2002410174220e200d200e200d4b1b220e4100480d0e0240024020020d00200e1028210d0c010b20072802002002200e102c210d0b200d450d0d2001200d360204200141086a200e3602002001410c6a28020021020b200d20026a210e0240024020064102490d00200e410020092003417f7322036a22061099051a200d200920026a20036a6a210e200620026a21020c010b2006450d010b200e41003a0000200241016a21020b200a2002360200024002402001280214280208200820012802042002101741026a220241024b0d0020020e03030001030b41a0fac5001032000b2001410c6a2202280200210d20024100360200200141086a28020021032001280204210a2001420137020420012802182202290308220c210b0240024002402005500d002005210b200c2005540d010b2002200c200b7d3703082002290310210c20044188016a41186a200241186a2903003703002004200b370390012004200b370388012004200c37039801200128020041186a28020021062004200d360258200420033602542004200a360250200441a8016a20062011201020044188016a200441306a200441d0006a10b5014101210d0240024020042802a8014101460d00200441d0006a41086a200441a8016a41186a290300370300200441d0006a41106a200441c8016a2802003602002004200441a8016a41106a290300370350200441d8016a2d00002106200441d0016a2802002109200441cc016a2802002108200441b4016a280200210e200441a8016a41086a28020021034100210d20042802ac01210a0c010b200441bc016a280200210e200441b8016a2802002103200441b4016a280200210a410021060b200220042903900120022903087c370308200441f0006a41086a2202200441d0006a41086a290300370300200441f0006a41106a220f200441d0006a41106a280200360200200420042903503703700240200d0d00200441bc016a2002290300370200200441c4016a200f2802003602002004200e3602b001200420033602ac012004200a3602a801200420042903703702b4010240200141086a280200450d002007280200102a0b200120083602042001410c6a4100360200200141086a2009360200200641ff017122020d02200441a8016a2007108f010c020b200141086a280200450d002007280200102a0b2001200a3602042001410c6a4100360200200141086a200336020041800221020b20004100360200200020023602040c020b2002102a0b200041053602000b200441e0016a24000f0b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b1036000b200e41011037000b1031000b9d0503027f037e057f230041206b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441106a20012802102903184200200241146a2802002203ad22064200109f0520012802182202420020022903082207427f200429031020042903184200521b7d2208200820075622021b370308024020020d0020042001280210290348420020064200109f0520012802182202420020022903082207427f200429030020042903084200521b7d2208200820075622021b37030820020d000240024020032001410c6a2209280200220a4b0d00200321020c010b02400240200141086a2802002202200a6b2003200a6b220b490d002001280204210c200a21020c010b200a200b6a220c200a490d062002410174220d200c200d200c4b1b220d4100480d060240024020020d00200d1028210c0c010b20012802042002200d102c210c0b200c450d052001200c360204200141086a200d3602002001410c6a28020021020b200c20026a210d02400240200b4102490d00200d41002003200a417f73220a6a220b1099051a200c200320026a200a6a6a210d200b20026a21020c010b200b450d010b200d41003a0000200241016a21020b20092002360200024002402001280214280208200520012802042002101741026a220241024b0d0020020e03020001020b41a0fac5001032000b2001410c6a2202280200210320024100360200200141086a280200210220012802042105200142013702040240200128021c220a450d00200141206a280200450d00200a102a0b2001200536021c200141246a2003360200200141206a20023602000b20004105360200200441206a24000f0b41b698c40041f4031050000b41b698c40041f4031050000b200d41011037000b1031000b23002001410c6a4100360200200128020041206a200141046a108f01200041043602000b27002001410c6a4100360200200128020028021841d0006a200141046a108f01200041043602000bd50102027f027e410021042001410c6a41003602002001280218220541186a2903002106200529031021070240024002400240200141086a28020022054110490d00200128020421050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102821050c010b200128020420052004102c21050b2005450d0120012005360204200141086a20043602002001410c6a28020021040b2001410c6a200441106a360200200520046a2201200637000820012007370000200041043602000f0b200441011037000b1031000bc20103017f017e017f410021042001410c6a4100360200200128021829030821050240024002400240200141086a28020022064108490d00200128020421060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102821060c010b200128020420062004102c21060b2006450d0120012006360204200141086a20043602002001410c6a28020021040b2001410c6a200441086a360200200620046a2005370000200041043602000f0b200441011037000b1031000bb804020b7f027e230041206b220424002001410c6a41003602000240024002402001280200280218220528021841016a220641004c0d00200541d0006a2107200520063602182005411c6a2108200541206a28020021090240024003402008280200220a41086a210b200a2f0106220c41057421084100210d0240024003402008450d012007200b4120109c05220e450d02200841606a2108200d41016a210d200b41206a210b200e417f4a0d000b200d417f6a210c0b2009450d022009417f6a2109200a200c4102746a41880b6a21080c010b0b200a200d41e0006c6a220841c5036a310000200841e8026a290300220f200f50220b1ba7450d004200200841f8026a290300200b1b210f4200200841f0026a290300200b1b21100c010b200441086a200541286a28020020072005412c6a28020028021c110500200441106a290300210f20052802182106200429030821100b20052006417f6a36021802400240200141086a280200220b2001410c6a28020022086b4110490d002001280204210b0c010b200841106a220d2008490d03200b4101742208200d2008200d4b1b22084100480d0302400240200b0d0020081028210b0c010b2001280204200b2008102c210b0b200b450d022001200b360204200141086a20083602002001410c6a28020021080b2001410c6a200841106a360200200b20086a2208200f3700082008201037000020004104360200200441206a24000f0b41b8b8c0004118200441186a41e0b8c0001038000b200841011037000b1031000bd50102027f027e410021042001410c6a41003602002001280200220541086a2903002106200529030021070240024002400240200141086a28020022054110490d00200128020421050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102821050c010b200128020420052004102c21050b2005450d0120012005360204200141086a20043602002001410c6a28020021040b2001410c6a200441106a360200200520046a2201200637000820012007370000200041043602000f0b200441011037000b1031000b860302047f027e230041c0006b220424000240024002402003450d0020022802000d0020034101460d0120022802100d01410521050240200241146a28020022032001280210220628026c4b0d0020022802042107200441086a200629034842002003ad4200109f0520012802182202420020022903082208427f200429030820042903104200521b7d2209200920085622021b37030820020d002003417f4c0d0302400240024020030d004101210202402001280214280208200741014100101741026a220641024b0d0020060e03040002040b41a0fac5001032000b02402003102e2202450d0002402001280214280208200720022003101741026a220641024b0d0020060e03030002030b41a0fac5001032000b200341011037000b2001410c6a4100360200200441186a2002200310a803410421052004200141046a36023c200441186a2004413c6a10c8012003450d010b2002102a0b20002005360200200441c0006a24000f0b41b698c40041f4031050000b41b698c40041f4031050000b1036000bc20103017f017e017f410021042001410c6a4100360200200128020029031021050240024002400240200141086a28020022064108490d00200128020421060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102821060c010b200128020420062004102c21060b2006450d0120012006360204200141086a20043602002001410c6a28020021040b2001410c6a200441086a360200200620046a2005370000200041043602000f0b200441011037000b1031000bdc0102027f027e410021042001410c6a4100360200200128020028021828024022054180016a2903002106200529037821070240024002400240200141086a28020022054110490d00200128020421050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102821050c010b200128020420052004102c21050b2005450d0120012005360204200141086a20043602002001410c6a28020021040b2001410c6a200441106a360200200520046a2201200637000820012007370000200041043602000f0b200441011037000b1031000bb20803027f047e027f230041e0046b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802102903484200200241146a2802002202ad4200109f0520012802182203420020032903082206427f200429032820042903304200521b7d2207200720065622031b3703080240024020030d002002417f4c0d0402400240024020020d004101210302402001280214280208200541014100101741026a220541024b0d0020050e03040002040b41a0fac5001032000b02402002102e2203450d0002402001280214280208200520032002101741026a220541024b0d0020050e03030002030b41a0fac5001032000b200241011037000b2004200236023c20042003360238200441d0036a200441386a108101024020042802d00322054113460d00200441c8026a200441d0036a410472418401109a051a02402002450d002003102a0b200441c0016a200441c8026a418401109a051a20042005360238200441386a410472200441c0016a418401109a051a200441003602d803200442013703d003200441386a200441d0036a10eb0120042802d8032103024020042802d403450d0020042802d003102a0b200128021822022903102206200241186a2903002207844200510d07200441186a2003ad42004280c8afa0254200109f05200441086a200429031822084280a094a58d1d7c2209200441186a41086a2903002009200854ad7c2006200710a00520024200200229030822062004290308427f200441086a41086a290300501b7d220720072006561b37030820072006580d03200441386a106a0c020b2002450d010b2003102a0b410521020c070b20012802002102200441c8026a200441386a418801109a051a200441c0016a41086a2002280218220241d8006a290000370300200441d0016a2203200241e0006a290000370300200441d8016a2205200241e8006a290000370300200420022900503703c001200441d7036a200441c8026a418801109a051a02402002413c6a2802002201200241386a280200470d00200141016a220a2001490d062001410174220b200a200b200a4b1b220aad42b0017e2206422088a70d062006a7220b4100480d060240024020010d00200b102821010c010b2002280234200141b0016c200b102c21010b2001450d0520022001360234200241386a200a360200200228023c21010b2002280234200141b0016c6a220141013a0000200120042903c001370001200141096a200441c8016a290300370000200141116a2003290300370000200141196a2005290300370000200141216a200441d0036a418f01109a051a2002200228023c41016a36023c410421020c060b41b698c40041f4031050000b41b698c40041f4031050000b1036000b419cb7c0001032000b200b41081037000b1031000b20002002360200200441e0046a24000b8c1705087f027e037f027e047f230041a0026b22042400024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620034107460d0720022802700d0720022802042103200241246a2802002105200241346a2802002106200241c4006a2802002107200241d4006a2802002108200241e4006a2802002109200241f4006a280200210a200441206a20012802102903484200200241146a280200220bad4200109f052001280218220242002002290308220c427f200429032020042903284200521b7d220d200d200c5622021b3703080240024020020d00200b417f4c0d0a024002400240200b0d004101210e02402001280214280208200341014100101741026a220241024b0d00200141146a210f20020e03040002040b41a0fac5001032000b0240200b102e220e450d00024020012802142802082003200e200b101741026a220241024b0d00200141146a210f20020e03030002030b41a0fac5001032000b200b41011037000b41002102200441003a00f00102400340200b2002460d01200441d0016a20026a200e20026a2d00003a00002004200241016a22033a00f0012003210220034120470d000b20044180026a41086a2202200441d0016a41086a29030037030020044180026a41106a2203200441d0016a41106a29030037030020044180026a41186a2210200441d0016a41186a290300370300200420042903d001370380020240200b450d00200e102a0b200441306a41086a2002290300370300200441306a41106a2003290300370300200441306a41186a20102903003703002004200429038002370330200441106a200128021029034842002006ad4200109f052001280218220242002002290308220c427f200429031020042903184200521b7d220d200d200c5622021b3703082002450d030c100b0240200241ff0171450d00200441003a00f0010b200b450d010b200e102a0b200441f0006a41186a20044180026a41186a290300370300200441f0006a41106a20044180026a41106a290300370300200441f0006a41086a20044180026a41086a2903003703002004200429038002370370410521020c0e0b2006417f4c0d080240024002400240024020060d004101210b0240200f280200280208200541014100101741026a220241024b0d0020020e03120002120b41a0fac5001032000b02402006102e220b450d000240200f2802002802082005200b2006101741026a220241024b0d0020020e03030002030b41a0fac5001032000b200641011037000b41002102200441003a00f0010240034020062002460d01200441d0016a20026a200b20026a2d00003a00002004200241016a22033a00f0012003210220034120470d000b20044180026a41086a2202200441d0016a41086a29030037030020044180026a41106a2203200441d0016a41106a29030037030020044180026a41186a220e200441d0016a41186a290300370300200420042903d0013703800202402006450d00200b102a0b200441d0006a41086a2002290300370300200441d0006a41106a2003290300370300200441d0006a41186a200e29030037030020042004290380023703502004200128021029034842002008ad4200109f052001280218220242002002290308220c427f200429030020042903084200521b7d220d200d200c5622031b3703084105210220030d112008417f4c0d0c20080d03200f280200280208200741014100101741026a220341024b0d0220030e03110211110b0240200241ff0171450d00200441003a00f0010b2006450d0f0b200b102a410521020c0f0b41a0fac5001032000b024002400240024002402008102e2203450d000240200f280200280208200720032008101741026a220b41024b0d00200b0e03030002030b41a0fac5001032000b200841011037000b2008410f4d0d00200341086a2900002111200329000021122003102a024002400240200a0d00410121064100210b4100210e0c010b20044180026a41186a210320044180026a41106a210520044180026a41086a210841002110410021024100210b4100210e4101210603402003420037030020054200370300200842003703002001280218220742002007290308220d427f2001280210290348220c420586200c42ffffffffffffffff0783200c521b7d220c200c200d5622071b370308200442003703800220070d1102400240200f280200280208200920026a221320044180026a4120101741026a220741024b0d0020070e03130001130b41a0fac5001032000b200441d0016a41186a22142003290300370300200441d0016a41106a22152005290300370300200441d0016a41086a2216200829030037030020042004290380023703d0010240200b200e470d002010200b41016a220e2010200e4b1b220e41ffffff3f71200e470d03200e41057422074100480d0302400240200b0d002007102821060c010b200620022007102c21060b2006450d100b200620026a220720042903d001370000200741186a2014290300370000200741106a2015290300370000200741086a2016290300370000201341206a2013490d11201041026a2110200241206a2102200a200b41016a220b470d000b0b2001280200280218210320044190016a41086a200441306a41086a29030037030020044190016a41106a2201200441306a41106a29030037030020044190016a41186a2205200441306a41186a290300370300200441b0016a41086a200341d8006a290000370300200441b0016a41106a2208200341e0006a290000370300200441b0016a41186a2207200341e8006a2900003703002004200429033037039001200420032900503703b00120044180026a41186a220a200441d0006a41186a29030037030020044180026a41106a2209200441d0006a41106a29030037030020044180026a41086a200441d0006a41086a29030037030020042004290350370380022003413c6a2802002202200341386a280200470d03200241016a220f2002490d0020024101742210200f2010200f4b1b220fad42b0017e220c422088a70d00200ca7221041004e0d020b1031000b2003102a0c0f0b0240024020020d002010102821020c010b2003280234200241b0016c2010102c21020b2002450d0b20032002360234200341386a200f360200200328023c21020b2003280234200241b0016c6a220241023a0000200220042903b0013700012002200429039001370021200241096a200441b0016a41086a290300370000200241116a2008290300370000200241196a2007290300370000200241296a20044190016a41086a290300370000200241316a2001290300370000200241396a2005290300370000200220063600642002200e3600682002200b36006c20022012370370200241f8006a20113703002002200429038002370041200241c9006a20044180026a41086a290300370000200241d1006a2009290300370000200241d9006a200a290300370000200220042f00703b0061200241e3006a200441f0006a41026a2d00003a0000200220042903d0013703800120024188016a200441d0016a41086a29030037030020024190016a200441d0016a41106a29030037030020024198016a200441d0016a41186a290300370300200241a0016a200441f0016a290300370300200241a8016a200441f8016a2903003703002003200328023c41016a36023c410421020c0d0b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b1036000b200741011037000b201041081037000b41052102200e450d012006102a0c010b410521020b20002002360200200441a0026a24000b16002000410036020020002001410c6a2802003602040bab0202057f027e230041106b220424000240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d024105210302402001410c6a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128021029035042002005ad4200109f0520012802182202420020022903082209427f200429030020042903084200521b7d220a200a20095622021b37030820020d000240024020012802142802082007200820066a2005101841026a220241024b0d0020020e03020001020b41b0fbc5001032000b410421030b20002003360200200441106a24000f0b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000bf90303027f027e067f230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802102903484200200241146a2802002203ad4200109f0520012802182202420020022903082206427f200429030020042903084200521b7d2207200720065622021b37030841052108024020020d000240024020032001410c6a2209280200220a4b0d00200321020c010b02400240200141086a2802002202200a6b2003200a6b220b490d002001280204210c200a21020c010b200a200b6a220c200a490d062002410174220d200c200d200c4b1b220d4100480d060240024020020d00200d1028210c0c010b20012802042002200d102c210c0b200c450d052001200c360204200141086a200d3602002001410c6a28020021020b200c20026a210d02400240200b4102490d00200d41002003200a417f73220a6a220b1099051a200c200320026a200a6a6a210d200b20026a21020c010b200b450d010b200d41003a0000200241016a21020b20092002360200024002402001280214280208200520012802042002101741026a220141024b0d0020010e03020001020b41a0fac5001032000b410421080b20002008360200200441106a24000f0b41b698c40041f4031050000b41b698c40041f4031050000b200d41011037000b1031000bbb0b05047f027e037f017e037f230041e0016b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a280200210602400240024002400240200241146a2802002203450d0020022802042107200441306a200128021029034842002003ad4200109f0520012802182202420020022903082208427f200429033020042903384200521b7d22092009200856220a1b37030841052102200a0d0e2003417f4c0d092003102e220a450d0a024020012802142802082007200a2003101741026a220741024b0d0020070e03040002040b41a0fac5001032000b4101210b410021074100210c0c010b2004200336028c012004200a36028801200441c0006a20044188016a106d200429024421082004280240210b200a102a200b450d0c2008a7210c200128021028025c2008422088a72207490d0b0b200b2007410041202007676b10c402024020074102490d00200b21022007210303402002200241206a220a4120109c05450d0c200a21022003417f6a220341024f0d000b0b200441206a200128021029034842002006ad220d4200109f0520012802182202420020022903082208427f200429032020042903284200521b7d2209200920085622021b37030820020d0a2006417f4c0d060240024020060d004101210a02402001280214280208200541014100101741026a220241024b0d0020020e030d00020d0b41a0fac5001032000b024002402006102e220a450d00024020012802142802082005200a2006101741026a220241024b0d0020020e03020003020b41a0fac5001032000b200641011037000b200a102a0c0b0b20042001280210220329032842002007ad4200109f05200441106a20032903204200200d4200109f0520012802182102427f2109024020042903184200520d0020042903084200520d002004290310220820042903007c220d2008540d00427f200d20032903307c22082008200d541b21090b200242002002290308220820097d220920092008561b37030820092008580d012006450d0a200a102a0c0a0b200a102a0c0a0b200441b8016a41086a22052001280200280218220341d8006a290000370300200441b8016a41106a2201200341e0006a290000370300200441b8016a41186a220e200341e8006a290000370300200420032900503703b80102402003413c6a2802002202200341386a280200470d00200241016a220f2002490d0820024101742210200f2010200f4b1b2210ad42b0017e2208422088a70d082008a7220f4100480d080240024020020d00200f102821020c010b2003280234200241b0016c200f102c21020b2002450d0720032002360234200341386a2010360200200328023c21020b2003280234200241b0016c6a220241003a0000200220042f00dd013b0001200241053a00102002200736000c2002200c3600082002200b360004200220042903b801370011200241036a200441dd016a41026a2d00003a0000200241196a2005290300370000200241216a2001290300370000200241296a200e2903003700002002200a360034200220063600382002200636003c200220042f00b5013b0031200241336a200441b5016a41026a2d00003a00002002200429038801370340200241c8006a20044188016a41086a290300370300200241d0006a20044188016a41106a290300370300200241d8006a20044188016a41186a290300370300200241e0006a200441a8016a290300370300200241e8006a200441c0006a41c800109a051a2003200328023c41016a36023c410421020c090b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b41b698c40041f4031050000b1036000b200341011037000b200f41081037000b1031000b41052102200c450d00200b102a0b20002002360200200441e0016a24000b8e0a03027f027e057f230041e00b6b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802102903484200200241146a2802002202ad4200109f0520012802182203420020032903082206427f200429030020042903084200521b7d2207200720065622081b3703084105210320080d052002417f4c0d02024020020d0002402001280214280208200541014100101741026a220241024b0d0020020e03070007070b41a0fac5001032000b02400240024002402002102e2208450d0002402001280214280208200520082002101741026a220541024b0d0020050e03030002030b41a0fac5001032000b200241011037000b2002410f4b0d010b2008102a0c060b200841086a2900002106200829000021072008102a200128020028021822092802180d032009417f360218200441c8006a200941e8006a290000370300200441c0006a200941e0006a290000370300200441306a41086a200941d8006a29000037030020042009290050370330024002402009411c6a220a280200220841f8b9c000460d00200941206a280200210b0c010b4100210b20044180096a410041e0021099051a200441e0006a410041a0081099051a41880b10282208450d05200841003b010620084100360200200841086a20044180096a41e002109a051a200841e8026a200441e0006a41a008109a051a200941206a41003602002009200836021c0b02400240034020082f0106220c4105742105410021024100210102400240034020052002460d01200441306a200820026a41086a4120109c052203450d02200241206a2102200141016a21012003417f4a0d000b2001417f6a210c0b200b450d02200b417f6a210b2008200c4102746a41880b6a28020021080c010b0b200941246a2103410121020c010b200441106a41186a200441306a41186a290300370300200441106a41106a200441306a41106a290300370300200441106a41086a200441306a41086a29030037030020042004290330370310200941246a21034100210b200c2101410021020b0240024020020d002004419c096a200441106a41086a290300370200200441a4096a200441106a41106a290300370200200441ac096a200441106a41186a29030037020020042003360290092004200136028c092004200a3602880920042008360284092004200b36028009200420042903103702940920044180016a200429035037030020044188016a200441d0006a41086a29030037030020044194016a42003702002004420037037820044200370360200441f8b9c00036029001200441003a009c012004419d016a2004290030370000200441a5016a200441306a41086a290000370000200441ad016a200441306a41106a290000370000200441b5016a200441306a41186a290000370000200441003a00bd0120044180096a200441e0006a10b70121020c010b200441f8006a4200370300200441f4006a41f8b9c00036020020044100360280012004410036027020044200370368200441f8b9c000360264200441003602602008200141e0006c6a41e8026a2102200441e0006a1095010b200241286a2006370300200241206a2007370300200242013703182009200928021841016a360218410421030c050b41b698c40041f4031050000b41b698c40041f4031050000b1036000b41a8b8c0004110200441e0006a41d0b8c0001038000b41880b41081037000b20002003360200200441e00b6a24000ba30203037f027e027f230041206b220424002001410c6a22054100360200200441086a2001280200280218220641186a200641d0006a10a801200441086a41106a290300210720042802082106200429031021080240024002400240200141086a2802002209200528020022056b4110490d00200128020421090c010b200541106a220a2005490d0220094101742205200a2005200a4b1b22054100480d020240024020090d002005102821090c010b200128020420092005102c21090b2009450d0120012009360204200141086a20053602002001410c6a28020021050b2001410c6a200541106a360200200920056a22012007427f20061b37000820012008427f20061b37000020004104360200200441206a24000f0b200541011037000b1031000bee0203027f027e017f230041206b220424000240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802102903484200200241146a2802002202ad4200109f0520012802182203420020032903082206427f200429030020042903084200521b7d2207200720065622081b37030841052103024020080d002002417f4c0d0302400240024020020d004101210802402001280214280208200541014100101741026a220141024b0d0020010e03040002040b41a0fac5001032000b02402002102e2208450d0002402001280214280208200520082002101741026a220141024b0d0020010e03030002030b41a0fac5001032000b200241011037000b200441106a200820021054024020042802100d002004280214200441186a280200100b0b410421032002450d010b2008102a0b20002003360200200441206a24000f0b41b698c40041f4031050000b41b698c40041f4031050000b1036000bbe0101037f410021042001410c6a4100360200200128020028021c21050240024002400240200141086a28020022064104490d00200128020421060c010b200641017422044104200441044b1b22044100480d020240024020060d002004102821060c010b200128020420062004102c21060b2006450d0120012006360204200141086a20043602002001410c6a28020021040b2001410c6a200441046a360200200620046a2005360000200041043602000f0b200441011037000b1031000bc205020a7f017e230041c0006b220424002004200136020c20042000410120011b3602082004200441086a106c024020042802000d000240024002400240024002400240200428020c22014170712200417f4c0d002004280204210502400240200141047622060d00410821070c010b200010282207450d020b02402005450d00200441206a4104722108410021094100210a410021000340200441206a200441086a109803200441306a41086a220b200841086a2802003602002004200829020037033002402004280220220c4104470d002006450d0a2007102a0c0a0b200041016a2101200441106a41086a220d200b28020036020020042004290330370310024020002006470d0020092001200920014b1b220641ffffffff00712006470d062006410474220b4100480d060240024020000d00200b102821070c010b2007200a200b102c21070b2007450d050b2007200a6a2200200c360200200041046a20042903103702002000410c6a200d280200360200200941026a2109200a41106a210a2001210020052001470d000b0b2007450d07200441206a200220072005200311060020042802202100410110282201450d042004428180808010370234200420013602300240024020004105460d00200141003a0000200141014102102c2101024020004104470d002001450d08200141003a00012004428280808020370234200420013602304202210e0c020b2001450d08200141013a0001200442828080802037023420042001360230200441206a200441306a1099032004350238210e200428023021010c010b200141013a00004201210e0b2001ad422086200e84210e02402006450d002007102a0b200441c0006a2400200e0f0b1036000b200041081037000b200b41081037000b1031000b410141011037000b410241011037000b410241011037000b41b8c6c20041f000200441206a41c0c5c2001038000bde0202047f017e02400240024002400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a3602002004417f6a220441034b0d0520040e0401020304010b200041043602000f0b0240200541034b0d00200041043602000f0b200041003602002003280001210420012002417b6a3602042001200341056a360200200020043602040f0b024020054108490d0020004101360200200329000121062001200241776a3602042001200341096a360200200041086a20063703000f0b200041043602000f0b0240200541034b0d00200041043602000f0b200041023602002003280001210420012002417b6a3602042001200341056a360200200020043602040f0b024020054108490d0020004103360200200329000121062001200241776a3602042001200341096a360200200041086a20063703000f0b200041043602000f0b200041043602000b840b02037f017e024002400240024002400240024002400240024002400240024020002802000e0400010203000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0c200241017422042003200420034b1b22044100480d0c0240024020020d002004102821030c010b200128020020022004102c21030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0c200241017422002004200020044b1b22004100480d0c0240024020020d002000102821020c010b200128020020022000102c21020b2002450d0520012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0b200241017422042003200420034b1b22044100480d0b0240024020020d002004102821030c010b200128020020022004102c21030b2003450d0520012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d0b200241017422002003200020034b1b22004100480d0b0240024020020d002000102821020c010b200128020020022000102c21020b2002450d0620012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0a200241017422042003200420034b1b22044100480d0a0240024020020d002004102821030c010b200128020020022004102c21030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0a200241017422002004200020044b1b22004100480d0a0240024020020d002000102821020c010b200128020020022000102c21020b2002450d0720012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d09200241017422042003200420034b1b22044100480d090240024020020d002004102821030c010b200128020020022004102c21030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d09200241017422002003200020034b1b22004100480d090240024020020d002000102821020c010b200128020020022000102c21020b2002450d0820012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b200441011037000b200041011037000b200441011037000b200041011037000b200441011037000b200041011037000b200441011037000b200041011037000b1031000bfd0201057f230041d0006b220224002002410036022820014110200241286a10062103024002400240024020022802282204417f460d0020030d010b200041023a00000c010b2004450d0120032d0000220541014b0d01410021010240024020050e020100010b41002101200241003a00482004417f6a2105200341016a21060340024020052001470d00200141ff0171450d04200241003a00480c040b200241286a20016a200620016a2d00003a00002002200141016a22043a00482004210120044120470d000b200241086a41186a200241286a41186a290300370300200241086a41106a200241286a41106a290300370300200241086a41086a200241286a41086a29030037030020022002290328370308410121010b200020013a000020002002290308370001200041096a200241106a290300370000200041116a200241186a290300370000200041196a200241206a2903003700002003102a0b200241d0006a24000f0b41c4d1c3004133200241286a419cd9c3001038000b1300200041013602042000418cc8c2003602000b340020004195c9c20036020420004100360200200041146a4103360200200041106a41a0c9c200360200200041086a420a3702000b2f01017f02404101102822020d00410141011037000b200042818080801037020420002002360200200241003a00000b8b5606077f017e067f027e037f037e230041e0036b22012400200141d8006a41086a220242003703002001420037035841e7fcc5004110200141d8006a100820014190016a41086a20022903003703002001200129035837039001200141e8026a20014190016a109a0302400240024002400240024002400240024002400240024020012d00e80222024102470d00200141d8006a21030c010b20014190016a4110100920014188026a41086a200141f1026a29000037030020014188026a41106a200141e8026a41116a29000037030020014188026a41186a220420014181036a290000370300200120012900e90237038802200141d8006a21030240200241037122024103460d0020020e03010001010b200141a0016a41186a2004290300370300200141a0016a41106a20014188026a41106a290300370300200141a0016a41086a20014188026a41086a29030037030020012001290388023703a001200141d8006a41086a220242003703002001420037035841c0fcc5004111200141d8006a100820014190016a41086a2002290300370300200120012903583703900141002105200141003602e80220014190016a4110200141e8026a10062102024020012802e8022204417f460d002002450d0020044104490d02200228000021052002102a0b411610282202450d022002410e6a41002900dffc45370000200241086a41002900d9fc45370000200241002900d1fc4537000020024116412c102c2202450d0320022005360016200141d8006a41186a22044200370300200141d8006a41106a22064200370300200141d8006a41086a22074200370300200142003703582002411a200141d8006a1000200141e8026a41186a2004290300370300200141e8026a41106a2006290300370300200141e8026a41086a2007290300370300200120012903583703e8022002102a20014100360258200141e8026a4120200141d8006a1006210202400240024020012802582206417f460d002002450d0020012006360294012001200236029001200141d8006a20014190016a107320012802582204450d07200129025c210802402006450d002002102a0b200120043602782001200837027c2008a721022008422088a72206418002490d01412010282206450d08200620012903a001370000200641186a200141a0016a41186a290300370000200641106a200141a0016a41106a290300370000200641086a200141a0016a41086a29030037000020014281808080103702ec02200120063602e802200541016a2205200141e8026a109f032006102a200141d8006a41086a220642003703002001420037035841c0fcc5004111200141d8006a100820014190016a41086a20062903003703002001200129035837039001200120053602e80220014190016a4110200141e8026a410410070c020b4100210620014100360280012001420137037841012104410021020b200141e8026a41186a2209200141a0016a41186a290300370300200141e8026a41106a220a200141a0016a41106a290300370300200141e8026a41086a220b200141a0016a41086a290300370300200120012903a0013703e802024020062002470d00200241016a22072002490d0c2002410174220c2007200c20074b1b220741ffffff3f712007470d0c2007410574220c4100480d0c0240024020020d00200c102821040c010b20042002410574200c102c21040b2004450d082001200736027c20012004360278200721020b200420064105746a220720012903e802370000200741186a2009290300370000200741106a200a290300370000200741086a200b2903003700002001200641016a360280012005200141f8006a109f030b2002450d002004102a0b200141d8006a41086a220242003703002001420037035841d8a1c6004113200141d8006a1008200141e8026a41086a2002290300370300200120012903583703e802200141003602a001200141e8026a4110200141a0016a1006210202400240024020012802a0012204417f460d002002450d002004450d0120022d000021042002102a200141e8026a4110100920044102460d0020044101710d020b41c0acc3001032000b41c4d1c3004133200141d8036a419cd9c3001038000b200141d8006a41086a220242003703002001420037035841afc5c2004111200141d8006a100820014190016a41086a22042002290300370300200120012903583703900120014190016a41101009200242003703002001420037035841c8fbc5004117200141d8006a100820042002290300370300200120012903583703900120014190016a41101009200242003703002001420037035841feadc4004117200141d8006a1008200141e8026a41086a22042002290300370300200120012903583703e8020240200141e8026a41104101410041001003417f470d0010a0032108200242003703002001420037035841feadc4004117200141d8006a100820042002290300370300200120012903583703e802200120083703a001200141e8026a4110200141a0016a410810070b2002420037030020014200370358418194c1004110200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200141003602e802200141a0016a4110200141e8026a1006210220012802e8022204417f460d072002450d0720044104490d062002280000210d2002102a200141a0016a41101009410121090c080b41c4d1c3004133200141d8036a419cd9c3001038000b411641011037000b412c41011037000b41c4d1c3004133200141d8036a419cd9c3001038000b412041011037000b200c41011037000b41c4d1c3004133200141d8036a419cd9c3001038000b410021090b200141d8006a41086a220242003703002001420037035841d591c6004115200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200141003602e802200141a0016a4110200141e8026a10062102024002400240024002400240024002400240024002400240024020012802e8022204417f460d002002450d002004450d0b20022d000021042002102a20044102460d0020044101710d010b410410282204450d0120044100360200200141d8006a41086a2202420037030020014200370358419194c1004115200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200141003602f002200142013703e8024101200141e8026a10b401200428020021070240024020012802ec02220520012802f00222066b4104490d0020012802e80221020c010b200641046a22022006490d0d2005410174220a2002200a20024b1b220a4100480d0d0240024020050d00200a102821020c010b20012802e8022005200a102c21020b2002450d032001200a3602ec02200120023602e802200a21050b2001200641046a220a3602f002200220066a2007360000200141a0016a41102002200a100702402005450d002002102a0b2004102a410410282204450d0320044100360200200141d8006a41086a2202420037030020014200370358418898c1004116200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200141003602f002200142013703e8024101200141e8026a10b401200428020021070240024020012802ec02220520012802f00222066b4104490d0020012802e80221020c010b200641046a22022006490d0d2005410174220a2002200a20024b1b220a4100480d0d0240024020050d00200a102821020c010b20012802e8022005200a102c21020b2002450d052001200a3602ec02200120023602e802200a21050b2001200641046a220a3602f002200220066a2007360000200141a0016a41102002200a100702402005450d002002102a0b2004102a200141d8006a41086a2202420037030020014200370358419e98c1004110200141d8006a1008200141a0016a41086a22042002290300370300200120012903583703a001200141003602e802200141a0016a4110200141e8026a41041007200141013a00e802200242003703002001420037035841d591c6004115200141d8006a100820042002290300370300200120012903583703a001200141a0016a4110200141e8026a410110070b200141d8006a41086a2202420037030020014200370358419194c1004115200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200141003602e802200141a0016a4110200141e8026a100621020240024020012802e8022204417f460d002002450d002001200436028c022001200236028802200141e8026a20014188026a10820120012802e802220e450d0620012902ec02210f2004450d012002102a0c010b4104210e4200210f0b200141d8006a41086a2202420037030020014200370358418898c1004116200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200141003602e802200141a0016a4110200141e8026a100621020240024020012802e8022204417f460d002002450d002001200436028c022001200236028802200141e8026a20014188026a10820120012802e8022207450d0720012902ec02211002402004450d002002102a0b20012007360288022010422088a7210c0c010b4104210720014104360288024100210c420021100b200f422088a72111024020090d002011417f6a220220114f0d07200220114b0d07200e20024102746a280200210d0b41002011419c7f6a22022002201141016a4b1b221220114b0d07200e20124102746a21132012450d0a200cad2108200e210b0340200b2802002109024002400240024002402008a7220a41014b0d0041002102200a0e020201020b41002102200a2104034020022004410176220620026a22052009200720054102746a280200491b2102200420066b220441014b0d000b0b20092007200241027422046a2802002206460d022002200920064b6a21020c010b410021020b200120023602e80241d498c100412e200141e8026a418499c1001038000b20082002ad580d09200720046a2204200441046a2002417f73200a6a410274109b051a201042ffffffff0f83200a417f6a220cad422086842110200b41046a220b2013460d0b2008427f7c210820012802880221070c000b0b410441041037000b200a41011037000b410441041037000b200a41011037000b41c4d1c3004133200141d8036a419cd9c3001038000b41c4d1c3004133200141d8036a419cd9c3001038000b41ae98c10041261050000b41e4e8c5001032000b41b0b1c0001032000b41c4d1c3004133200141d8036a419cd9c3001038000b200f42ffffffff0f8321080240201120126b2202450d0002402012450d00200e20132002410274109b051a2010422088a7210c0b20082002ad4220868421080b2001280288022107410021020240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200c41014b0d00200c0e020201020b200c2104034020022004410176220620026a2205200d200720054102746a280200491b2102200420066b220441014b0d000b0b0240200d200720024102746a2802002204460d002002200d20044b6a21020b200c2002490d010b200c2010a7470d02200c41016a2204200c490d13200c41017422062004200620044b1b220441ffffffff03712004470d132004410274220641004e0d010c130b41f8b0c0001032000b02400240200c0d002006102821070c010b2007200c4102742006102c21070b2007450d0120012007360288022004ad21100b200720024102746a220441046a2004200c20026b410274109b051a2004200d36020002402008422088220fa722042008a7470d00200441016a22022004490d11200fa722054101742206200220022006491b220241ffffffff03712002470d11200241027422064100480d110240024020040d0020061028210e0c010b200e20054102742006102c210e0b200e450d022008422088a721042002ad21080b200e20044102746a200d3602000240200c41016a22130d00419499c1001032000b2013201341017622024d0d02200128028802220620024102746a280200210d024020134101710d0020132002417f6a22024d0d04200620024102746a280200200d6a410176210d0b200141d8006a41086a2202420037030020014200370358419194c1004115200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200141003602f002200142013703e802200441016a2211200141e8026a10b4010240024020110d0020012802f002210920012802ec02210720012802e80221040c010b410020012802f00222026b2106200441027441046a210a20012802ec022107200e210503402005280200210b02400240200720066a4104490d0020012802e80221040c010b200241046a22042002490d13200741017422092004200920044b1b22094100480d130240024020070d002009102821040c010b20012802e80220072009102c21040b2004450d07200120093602ec02200120043602e802200921070b200541046a21052001200241046a22093602f002200420026a200b3600002006417c6a210620092102200a417c6a220a0d000b0b2008a72102200141a0016a411020042009100702402007450d002004102a0b02402002450d00200e102a0b200128028802210e200141d8006a41086a2202420037030020014200370358418898c1004116200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a001200142013703e802200141003602f0022013200141e8026a10b401200c41027441046a2109410020012802f00222026b21062010a7210c20012802ec022107200e210503402005280200210b02400240200720066a4104490d0020012802e80221040c010b200241046a22042002490d122007410174220a2004200a20044b1b220a4100480d120240024020070d00200a102821040c010b20012802e8022007200a102c21040b2004450d072001200a3602ec02200120043602e802200a21070b200541046a21052001200241046a220a3602f002200420026a200b3600002006417c6a2106200a21022009417c6a22090d000b200141a0016a41102004200a100702402007450d002004102a0b0240200c450d00200e102a0b200141d8006a41086a2202420037030020014200370358419e98c1004110200141d8006a1008200141a0016a41086a2002290300370300200120012903583703a0012001200d3602e802200141a0016a4110200141e8026a410410070240201141e500470d00200d419a086a1098014b0d00200141d8006a41086a220442003703002001420037035841d985c2004117200141d8006a1008200141e8026a41086a2004290300370300200120012903583703e802410810282204450d072004200d360004200441e400360000200141e8026a41102004410810072004102a0b200242003703002001420037035841f9b5c200411d200141d8006a1008200141e8026a41086a2002290300370300200120012903583703e802200141003602a001200141e8026a4110200141a0016a10062102024020012802a0012204417f460d002002450d0020012002360288022001200436028c0220044104490d0c2001200241046a3602880220012004417c6a220636028c0220064104490d0c200228000021072001200441786a36028c022001200241086a360288022002280004210b200141a0016a20014188026a107720012802a001220a450d0c20012902a40121144100210502400240200128028c0222040d000c010b20012004417f6a220936028c022001200128028802220641016a36028802024020062d00004101460d000c010b20094104490d0020012004417b6a36028c022001200641056a360288022006280001210c410121050b2002102a2014422088a72109024020072000470d00024020050d002009ad42287e2208422088a70d0a2008a72202417f4c0d0a0240024020020d004108210c0c010b20021028220c450d0c0b4100210602402009450d00200941286c210541002106200c2102200a21040340200441086a2903002108200441106a2903002110200441186a290300210f20042903002115200241206a200441206a290300370300200241186a200f370300200241106a2010370300200241086a200837030020022015370300200241286a2102200641016a2106200441286a2104200541586a22050d000b0b200141b0016a200b360200200141a0016a410c6a2006360200200141a0016a41086a20093602002001200c3602a401200141003602a001200141e8026a200141a0016a10c30120014193026a200141e8026a41086a280200360000200120012903e80237008b02200141e8026a410c6a2001418f026a290000370000200141c6a4b9da043600e902200141023a00e80220012001290088023700ed02200141e8026a10ce012009450d01200c102a0c010b2009ad42287e2208422088a70d092008a72202417f4c0d090240024020020d00410821130c010b200210282213450d0c0b0240024020090d00410021060c010b200941286c21054100210620132102200a21040340200441086a2903002108200441106a2903002110200441186a290300210f20042903002115200241206a200441206a290300370300200241186a200f370300200241106a2010370300200241086a200837030020022015370300200241286a2102200641016a2106200441286a2104200541586a22050d000b0b200141b4016a200b360200200141b0016a2006360200200141a0016a410c6a2009360200200141a0016a41086a20133602002001200c3602a401200141013602a001200141e8026a200141a0016a10c30120014193026a200141e8026a41086a280200360000200120012903e80237008b02200141e8026a410c6a2001418f026a290000370000200141c6a4b9da043600e902200141023a00e80220012001290088023700ed02200141e8026a10ce012009450d002013102a0b2014a7210c0240200b20076a2000470d00200141d8006a41086a220242003703002001420037035841c694c600411b200141d8006a1008200141e8026a41086a2002290300370300200120012903583703e802200141003602a801200142013703a0012009200141a0016a10b40102402009450d00200a200941286c6a2107200a210403402004200141a0016a108f01200441206a29030021080240024020012802a401220620012802a80122026b4108490d0020012802a00121060c010b200241086a22052002490d15200641017422022005200220054b1b22024100480d150240024020060d002002102821060c010b20012802a00120062002102c21060b2006450d0f200120023602a401200120063602a00120012802a80121020b2001200241086a3602a801200620026a20083700002007200441286a2204470d000b0b20012802a4012102200141e8026a411020012802a001220420012802a801100702402002450d002004102a0b200141e8026a41106a2009360200200141f4026a200c360200200141e8026a41086a2202200a360200200141003602ec022001410a3a00e80241014100200141e8026a10cc01200141d8006a41086a220442003703002001420037035841f9b5c200411d200141d8006a100820022004290300370300200120012903583703e802200141e8026a411010090c010b200c450d00200a102a0b200141d8006a41086a22024200370300200142003703584196b6c2004115200141d8006a1008200141e8026a41086a2002290300370300200120012903583703e802200141003602a001200141e8026a4110200141a0016a1006210220012802a0012204417f460d0f2002450d0f2004450d0e20022d0000220641034b0d0e0240024020060e04010f0100010b2004417f6a41074b0d0d0c0f0b2002102a0c0f0b200641041037000b200641041037000b41ac99c100200220131034000b41ac99c100200220131034000b200941011037000b200a41011037000b410841011037000b1036000b200241081037000b200241081037000b200241011037000b41c4d1c3004133200141d8036a419cd9c3001038000b20022800052106200228000121042002102a024020042000470d00200141043602a001200120063602a401200141e8026a200141a0016a10c30120014193026a200141f0026a280200360000200120012903e80237008b02200141f4026a2001418f026a290000370000200141c6a4b9da043600e902200141023a00e80220012001290088023700ed02200141e8026a10ce010b200620046a2000470d022001410036028802200141d8006a41086a22024200370300200142003703584196b6c2004115200141d8006a1008200141e8026a41086a2002290300370300200120012903583703e802200141a0016a20014188026a10da02200141e8026a411020012802a001220220012802a8011007024020012802a401450d002002102a0b200141023602ec022001410a3a00e80241014100200141e8026a10cc010c020b2004417f6a4108490d0020022800052106200228000121042002102a024020042000470d00200141033602a001200120063602a401200141e8026a200141a0016a10c30120014193026a200141f0026a280200360000200120012903e80237008b02200141f4026a2001418f026a290000370000200141c6a4b9da043600e902200141023a00e80220012001290088023700ed02200141e8026a10ce010b200620046a2000470d012001410236028802200141d8006a41086a22024200370300200142003703584196b6c2004115200141d8006a1008200141e8026a41086a2002290300370300200120012903583703e802200141a0016a20014188026a10da02200141e8026a411020012802a001220220012802a8011007024020012802a401450d002002102a0b200141013602ec022001410a3a00e80241014100200141e8026a10cc010c010b41c4d1c3004133200141d8036a419cd9c3001038000b02400240024002400240024020004180e101700d00200141e8026a10d301200141c8006a200141e8026a1091012001200141c8006a41086a29030022083703800120012001290348221037037820014180036a2008370300200141e8026a41106a2010370300200141e8026a41086a220441013a00002001410b3a00e8024100210241014100200141e8026a10cc01200141003a008f012001420037039801200142003703900120044200370300200142003703e8024181a2c6004112200141e8026a1008200141a0016a41086a2004290300370300200120012903e8023703a001200141003602e802200141a0016a4110200141e8026a100621040240024020012802e8022206417f470d000c010b024020040d000c010b2001200636028c022001200436028802200141e8026a20014188026a10820120012802e8022202450d0620012902ec0221082006450d002004102a0b2002410420021b210c024002402008420020021b2214422088a722040d004100210b0c010b200141f1026a210d200141c8026a211320014188026a41206a210e200141a0016a41086a2109200141a0036a21114100210a4100210b41002102024003400240024002400240200b450d00200c20024102746a2106200c2002200a6a4102746a21050340200220044f0d02200141a0016a2006280200220710e90220012903a0014201520d0420014188026a200941e000109a051a2001290378220f200129038802221554200141f8006a41086a290300220820014188026a41086a29030022105420082010511b450d03200141013a008f010240200a20026a220720044f0d0020052006280200360200200641046a2106200541046a2105200241016a22022004490d010c070b0b41c4b2c000200720041034000b200c20024102746a21060340200220044f0d01200141a0016a2006280200220710e90220012903a0014201520d0320014188026a200941e000109a051a2001290378220f20012903880222155a200141f8006a41086a290300220820014188026a41086a29030022105a20082010511b0d02200641046a2106200141013a008f01200241016a22022004490d000b4100210b0c050b41e8b1c000200220041034000b2001200f20157d3703782001200820107d200f201554ad7d37038001411210282206450d05200641106a41002f008086423b0000200641086a41002900f88542370000200641002900f08542370000200641124124102c2206450d0620062007360012200341186a22054200370000200341106a22124200370000200341086a22004200370000200342003700002006411620031000200141e8026a41186a2005290000370300200141e8026a41106a2012290000370300200141e8026a41086a2000290000370300200120032900003703e8022006102a200141e8026a41201009200e20012903980220014188026a41186a29030010aa02200141386a201320012903880220014188026a41086a220629030010d00120014190016a41086a2205427f20052903002208200141386a41086a2903007c200129039001221020012903387c220f2010542205ad7c22102005201020085420102008511b22051b3703002001427f200f20051b37039001200129038802210820112006290300370300200d2013290000370000200d41086a201341086a290000370000200d41106a201341106a290000370000200d41186a201341186a2900003700002001200837039803200141023a00f0022001410b3a00e802200120073602940341014100200141e8026a10cc010b200a417f6a210a200b41016a210b200241016a22022004490d000b0b200b450d00200220044f0d00200c20024102746a2206200b4102746b2006200420026b410274109b051a0b200141e8026a41086a22024200370300200142003703e8024181a2c6004112200141e8026a1008200141a0016a41086a2002290300370300200120012903e8023703a00102400240200c0d00200141a0016a411010090c010b200141003602f002200142013703e8022004200b6b2204200141e8026a10b4010240024020040d0020012802f002210920012802ec02210720012802e80221040c010b410020012802f00222026b2106200c20044102746a210b20012802ec022107200c210503402005280200210a02400240200720066a4104490d0020012802e80221040c010b200241046a22042002490d0a200741017422092004200920044b1b22094100480d0a0240024020070d002009102821040c010b20012802e80220072009102c21040b2004450d07200120093602ec02200120043602e802200921070b2001200241046a22093602f002200420026a200a3600002006417c6a210620092102200b200541046a2205470d000b0b2014a72102200141a0016a411020042009100702402007450d002004102a0b2002450d00200c102a0b024020012d008f010d004200210f200141286a20012903782208200141f8006a41086a2202290300221042c0843d420010a005200141186a20012903282215200141286a41086a290300221442c0fb42427f109f05200141086a2015201442a0c21e4200109f05200220102010200141086a41086a29030020012903082215200820012903187c42018842ffffffff0f837c2214201554ad7c22152014200856201520105620152010511b22041b22157d20082008201420041b221054ad7d3703002001200820107d370378200141e8026a41086a22024200370300200142003703e80241ace1c0004116200141e8026a1008200141d8006a41086a2002290300370300200120012903e802370358200141003602e802200141d8006a4110200141e8026a100621020240024020012802e8022204417f470d00420021080c010b20044110490d06200241086a29000021082002290000210f2002102a0b200141e8026a41086a22044200370300200142003703e80241ace1c0004116200141e8026a1008200141d8006a41086a2004290300370300200120012903e80237035820014200200820157d200f201054ad7d2214200f20107d2216200f56201420085620142008511b22021b3703f00220014200201620021b3703e802200141d8006a4110200141e8026a4110100720014190016a41086a2206427f200629030022142008201520021b7c2001290390012208200f201020021b7c220f2008542202ad7c22082002200820145420082014511b22021b3703002001427f200f20021b3703900120014180036a2015370300200141e8026a41106a2010370300200441033a00002001410b3a00e80241014100200141e8026a10cc010b200141e8026a10d30120014188026a200141e8026a200129039001220820014190016a41086a29030022104102109802024002402001280288020d00200141a0016a41106a201020014188026a41106a29030022157d2008200129039002220f54ad7d201520107d200f200854ad7d200f2008582015201058201520105122021b22041b37030020012008200f7d200f20087d20041b3703a8012001200f200856201520105620021b2202ad3703a001200141a0016a41086a2104024020020d0020012004360258200141d8006a109c010c020b20012004360258200141d8006a109d010c010b41abb6c20041ca00100b200120103703a801200120083703a0012001200141a0016a3602880220014188026a109c010b2001290378210820014180036a200141f8006a41086a290300370300200141f8026a2008370300200141e8026a41086a41043a00002001410b3a00e80241014100200141e8026a10cc010b200141d8006a41086a220242003703002001420037035841affec5004111200141d8006a1008200141e8026a41086a2002290300370300200120012903583703e802200141e8026a41101009200141e0036a24000f0b411241011037000b412441011037000b200941011037000b41c4d1c3004133200141d8036a419cd9c3001038000b41c4d1c3004133200141d8036a419cd9c3001038000b1031000bf52901047f230041c0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240411610282203450d002003410e6a41002900dffc45370000200341086a41002900d9fc45370000200341002900d1fc4537000020034116412c102c2203450d0120032000360016200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a22054200370300200242003703202003411a200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002003102a200128020021032001280208210120024100360228200242013703202001200241206a10b40102402001450d00200320014105746a2105034002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d052002200436022420022000360220200228022821010b2002200141016a360228200020016a20032d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d062002200436022420022000360220200228022821010b2002200141016a360228200020016a200341016a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d072002200436022420022000360220200228022821010b2002200141016a360228200020016a200341026a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d082002200436022420022000360220200228022821010b2002200141016a360228200020016a200341036a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d092002200436022420022000360220200228022821010b2002200141016a360228200020016a200341046a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d0a2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341056a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d0b2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341066a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d0c2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341076a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d0d2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341086a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d0e2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341096a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d0f2002200436022420022000360220200228022821010b2002200141016a360228200020016a2003410a6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d102002200436022420022000360220200228022821010b2002200141016a360228200020016a2003410b6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d112002200436022420022000360220200228022821010b2002200141016a360228200020016a2003410c6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d122002200436022420022000360220200228022821010b2002200141016a360228200020016a2003410d6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d132002200436022420022000360220200228022821010b2002200141016a360228200020016a2003410e6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d142002200436022420022000360220200228022821010b2002200141016a360228200020016a2003410f6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d152002200436022420022000360220200228022821010b2002200141016a360228200020016a200341106a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d162002200436022420022000360220200228022821010b2002200141016a360228200020016a200341116a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d172002200436022420022000360220200228022821010b2002200141016a360228200020016a200341126a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d182002200436022420022000360220200228022821010b2002200141016a360228200020016a200341136a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d192002200436022420022000360220200228022821010b2002200141016a360228200020016a200341146a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d1a2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341156a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d1b2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341166a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d1c2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341176a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d1d2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341186a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d1e2002200436022420022000360220200228022821010b2002200141016a360228200020016a200341196a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d1f2002200436022420022000360220200228022821010b2002200141016a360228200020016a2003411a6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d202002200436022420022000360220200228022821010b2002200141016a360228200020016a2003411b6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d212002200436022420022000360220200228022821010b2002200141016a360228200020016a2003411c6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d222002200436022420022000360220200228022821010b2002200141016a360228200020016a2003411d6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d232002200436022420022000360220200228022821010b2002200141016a360228200020016a2003411e6a2d00003a000002400240200228022420022802282201460d00200228022021000c010b200141016a22002001490d25200141017422042000200420004b1b22044100480d250240024020010d002004102821000c010b200228022020012004102c21000b2000450d242002200436022420022000360220200228022821010b2002200141016a360228200020016a2003411f6a2d00003a0000200341206a22032005470d000b0b2002280224210320024120200228022022012002280228100702402003450d002001102a0b200241c0006a24000f0b411641011037000b412c41011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b200441011037000b1031000bab0103017f017e027f230041206b2200240042002101200041106a41086a220242003703002000420037031041feb3c300410d200041106a1008200041086a2002290300370300200020002903103703002000410036021020004110200041106a100621020240024020002802102203417f460d002002450d0020034108490d01200229000021012002102a0b200041206a240020010f0b41c4d1c3004133200041106a419cd9c3001038000b0a0041d0c5c2001032000b3400200041bfcec20036020420004100360200200041146a4109360200200041106a41c4cec200360200200041086a42043702000bcf0101017f024002400240024002400240410110282202450d00200241003a0000200241014102102c2202450d01200241003a0001200241024104102c2202450d02200241003b0002200241044108102c2202450d0320024100360004200241084110102c2202450d0420024200370008200241104120102c2202450d052002420037001820024200370010200042a08080808004370204200020023602000f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000b130020004102360204200041a0e1c2003602000b3101017f02404108102822020d00410841011037000b20004288808080800137020420002002360200200242b8173700000b3101017f02404108102822020d00410841011037000b20004288808080800137020420002002360200200242c8013700000bcb0201047f230041d0006b220324002003410036022820012002200341286a1006210402400240024020032802282205417f460d0020040d010b200041003a00000c010b41002101200341003a00480340024020052001470d000240200141ff0171450d00200341003a00480b41c4d1c3004133200341286a419cd9c3001038000b200341286a20016a200420016a2d00003a00002003200141016a22023a00482002210120024120470d000b200341086a41186a2201200341286a41186a290300370300200341086a41106a2202200341286a41106a290300370300200341086a41086a2206200341286a41086a2903003703002003200329032837030802402005450d002004102a0b20002003290308370001200041013a0000200041196a2001290300370000200041116a2002290300370000200041096a20062903003700000b200341d0006a24000bd31803017f017e2b7f230041b00d6b22032400200320023602042003200136020042002104200341086a41086a220142003703002003420037030841aef2c2004115200341086a1008200341900d6a41086a2001290300370300200320032903083703900d200341e80c6a200341900d6a10a903024002400240024020032802ec0c22050d00410121050c010b20032903f00c220442ffffffff0f560d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b20032802e80c2101200341086a410041e00c1099051a200541206a21062001411874411875210120052004422088a74105746a210741002108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f4100212041002121410021224100212341002124410021254100212641002127200521024100212841d1002129024003402028212a02400240024002402001450d0020072005460d01200141016a210103400240024020022007470d002006212b200621022005212c0c010b2002212c200241206a222b21020b2001417f6a22010d000c030b0b024020022007460d00200241206a212b2002212c0c030b2006212b2005212c20072005460d040c010b200141016a2101034020072002460d04200241206a21022001417f6a22010d000b200241606a212c2002212b0b202c450d020b202b21020240024002400240024002402003280204220141056a222b417f4c0d002003280200212d02400240202b450d00202b10282228450d034100212e200341003602980d2003202b3602940d200320283602900d0c010b200341003602980d2003202b3602940d200341013602900d410110282228450d03200341013602940d200320283602900d20032802980d212e0b2003202e41016a3602980d2028202e6a202a3a00002001200341900d6a10b4010240024020032802940d222e20032802980d222b6b2001490d0020032802900d212e0c010b202b20016a2228202b490d05202e410174222b2028202b20284b1b222b4100480d0502400240202e0d00202b1028212e0c010b20032802900d202e202b102c212e0b202e450d042003202b3602940d2003202e3602900d20032802980d212b0b2003202b20016a3602980d202e202b6a202d2001109a051a2003200341900d6a36028c0d202c2003418c0d6a10c80120032802940d212c20032802900d210120032802980d212b200341900d6a41186a222e4200370300200341900d6a41106a22284200370300200341900d6a41086a222d4200370300200342003703900d2001202b200341900d6a1000200341e80c6a41186a222b202e290300370300200341e80c6a41106a222e2028290300370300200341e80c6a41086a222f202d290300370300200320032903900d3703e80c0240202c450d002001102a0b2029417f6a2129202a41016a2128200341086a202a4103704105746a220120032903e80c370000200141186a202b290300370000200141106a202e290300370000200141086a202f2903003700004100212c0340202a202a41036e222b417d6c6a4102470d06200341086a202c6a220141df006a2d000022082001411f6a2d000022097120082009722001413f6a2d00007172211f200141de006a2d000022082001411e6a2d000022097120082009722001413e6a2d00007172211e200141dd006a2d000022082001411d6a2d000022097120082009722001413d6a2d00007172211d200141dc006a2d000022082001411c6a2d000022097120082009722001413c6a2d00007172211c200141db006a2d000022082001411b6a2d000022097120082009722001413b6a2d00007172211b200141da006a2d000022082001411a6a2d000022097120082009722001413a6a2d00007172211a200141d9006a2d00002208200141196a2d00002209712008200972200141396a2d000071722119200141d8006a2d00002208200141186a2d00002209712008200972200141386a2d000071722118200141d7006a2d00002208200141176a2d00002209712008200972200141376a2d000071722117200141d6006a2d00002208200141166a2d00002209712008200972200141366a2d000071722116200141d5006a2d00002208200141156a2d00002209712008200972200141356a2d000071722115200141d4006a2d00002208200141146a2d00002209712008200972200141346a2d000071722114200141d3006a2d00002208200141136a2d00002209712008200972200141336a2d000071722113200141d2006a2d00002208200141126a2d00002209712008200972200141326a2d000071722112200141d1006a2d00002208200141116a2d00002209712008200972200141316a2d000071722111200141d0006a2d00002208200141106a2d00002209712008200972200141306a2d000071722110200141cf006a2d000022082001410f6a2d000022097120082009722001412f6a2d00007172210f200141ce006a2d000022082001410e6a2d000022097120082009722001412e6a2d00007172210e200141cd006a2d000022082001410d6a2d000022097120082009722001412d6a2d00007172210d200141cc006a2d000022082001410c6a2d000022097120082009722001412c6a2d00007172210c200141cb006a2d000022082001410b6a2d000022097120082009722001412b6a2d00007172210b200141ca006a2d000022082001410a6a2d000022097120082009722001412a6a2d00007172210a200141c9006a2d00002208200141096a2d00002209712008200972200141296a2d000071722109200141c8006a2d00002208200141086a2d00002220712008202072200141286a2d000071722108200141c7006a2d00002220200141076a2d00002221712020202172200141276a2d000071722120200141c6006a2d00002221200141066a2d00002222712021202272200141266a2d000071722121200141c5006a2d00002222200141056a2d00002223712022202372200141256a2d000071722122200141c4006a2d00002223200141046a2d00002224712023202472200141246a2d000071722123200141c3006a2d00002224200141036a2d00002225712024202572200141236a2d000071722124200141c2006a2d00002225200141026a2d00002226712025202672200141226a2d000071722125200141c1006a2d00002226200141016a2d00002227712026202772200141216a2d000071722126200141c0006a2d0000222720012d0000222e712027202e72200141206a2d000071722127202c41800c460d06200341086a202c202b410574202a41096e41e0006c6b6a6a220141ff006a201f3a0000200141fe006a201e3a0000200141fd006a201d3a0000200141fc006a201c3a0000200141fb006a201b3a0000200141fa006a201a3a0000200141f9006a20193a0000200141f8006a20183a0000200141f7006a20173a0000200141f6006a20163a0000200141f5006a20153a0000200141f4006a20143a0000200141f3006a20133a0000200141f2006a20123a0000200141f1006a20113a0000200141f0006a20103a0000200141ef006a200f3a0000200141ee006a200e3a0000200141ed006a200d3a0000200141ec006a200c3a0000200141eb006a200b3a0000200141ea006a200a3a0000200141e9006a20093a0000200141e8006a20083a0000200141e7006a20203a0000200141e6006a20213a0000200141e5006a20223a0000200141e4006a20233a0000200141e3006a20243a0000200141e2006a20253a0000200141e1006a20263a0000200141e0006a20273a0000202b212a202c41e0006a222c41e00c470d000c060b0b1036000b202b41011037000b410141011037000b202b41011037000b1031000b4100210120290d000b0b2000201f3a001f2000201e3a001e2000201d3a001d2000201c3a001c2000201b3a001b2000201a3a001a200020193a0019200020183a0018200020173a0017200020163a0016200020153a0015200020143a0014200020133a0013200020123a0012200020113a0011200020103a00102000200f3a000f2000200e3a000e2000200d3a000d2000200c3a000c2000200b3a000b2000200a3a000a200020093a0009200020083a0008200020203a0007200020213a0006200020223a0005200020233a0004200020243a0003200020253a0002200020263a0001200020273a00000b02402004a7450d002005102a0b200341b00d6a24000bfd0102057f017e230041306b220224002002410036022020014110200241206a10062101024002400240024020022802202203417f460d0020010d010b200041003602040c010b20022003360214200220013602102003450d0120022003417f6a3602142002200141016a36021020012d00002103200241206a200241106a106d20022802202204450d012002410c6a41026a2002411d6a41026a2d000022053a0000200220022f001d22063b010c20022902242107200020033a0000200020063b0001200041036a20053a000020002007370208200020043602042001102a0b200241306a24000f0b41c4d1c3004133200241206a419cd9c3001038000bfb0401057f230041106b2202240002400240024002400240024020002802704101460d0002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102821040c010b200128020020032005102c21040b2004450d0320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280274210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d06200441017422032005200320054b1b22034100480d060240024020040d002003102821040c010b200128020020042003102c21040b2004450d0420012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102821040c010b200128020020032005102c21040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b2000200110f1012000280278210320004180016a2802002200200110b40102402000450d002000410574210003402002200136020c20032002410c6a10c801200341206a2103200041606a22000d000b0b200241106a24000f0b200541011037000b200341011037000b200541011037000b1031000b860201017f0240024020002d00002201410e4b0d00024002400240024020010e0f050505050500050501050205030505050b200041086a2d00004101470d04200041146a280200450d04200041106a280200102a0c040b200041046a2d00004103470d0302402000410c6a280200450d00200041086a280200102a0b200041186a280200450d03200041146a280200102a0c030b200041046a2802000d022000410c6a280200450d02200041086a280200102a0c020b200041086a2d00004105490d01200041306a280200450d012000412c6a280200102a0c010b200041086a280200450d00200041046a280200102a0b0240200041fc006a280200450d002000280278102a0b0b130020004106360204200041c8f3c2003602000b3400200041d3f9c20036020420004100360200200041146a410f360200200041106a41dcf9c200360200200041086a42063702000b5501017f230041206b22022400200241003602082002420837030020024100360218200242013703104100200241106a10b401200041086a20022802183602002000200229031037020020021072200241206a24000b7201017f230041306b22022400200241186a4200370300200241106a4200370300200241086a42003703002002420037030020024100360228200242013703202002200241206a36022c20022002412c6a10c801200041086a200228022836020020002002290320370200200241306a24000b5d01027f230041106b2202240002404101102822030d00410141011037000b200341003a00002002428180808010370204200220033602004100200210b401200041086a200228020836020020002002290300370200200241106a24000b0900200042043702000b851805047f017e027f047e017f23004190026b22012400200141a8016a41086a22024200370300200142003703a80141f99fc6004115200141a8016a1008200141d0016a41086a22032002290300370300200120012903a8013703d001200141d0016a4110100920024200370300200142003703a801418ea0c600411a200141a8016a100820032002290300370300200120012903a8013703d00141002102200141003602a801200141d0016a4110200141a8016a100621030240024002400240024002400240024020012802a8012204417f460d002003450d0020044104490d01200328000021022003102a0b200141a8016a41086a22034200370300200142003703a80141bfa0c600411b200141a8016a1008200141d0016a41086a22042003290300370300200120012903a8013703d001200141186a200141d0016a109f02200129032021052001280218210620034200370300200142003703a80141bfa0c600411b200141a8016a1008200141086a4180e59af700200220024180e59af7004922071b20024180e59af70020071b6b2207ad2208420020084200109f0520042003290300370300200120012903a8013703d0012005420020061b2105200842a8c30180210842ffffffffffffffffff00428080808080808080807f20071b2001290308220920012903102009423f87521b42808090bbbad6adf00d7f210902400240200241ffe49af7004b0d0042ffffffffffffffffff00428080808080808080807f2005200820097d22097d22084200531b20082005427f5522022009427f554720022008427f5547711b22084280ec94a37c20084280ec94a37c551b21080c010b42ffffffffffffffffff00428080808080808080807f2005200820097c22097c22084200531b20082005427f5522022009427f554620022008427f5547711b21080b200120083703a801200141d0016a4110200141a8016a41081007200141a8016a41086a22024200370300200142003703a801418ea0c600411a200141a8016a1008200141d0016a41086a22032002290300370300200120012903a8013703d001200141d0016a4110100920024200370300200142003703a80141a8a0c6004117200141a8016a100820032002290300370300200120012903a8013703d001200141d0016a4110100920024200370300200142003703a80141d9efc200410d200141a8016a100820032002290300370300200120012903a8013703d00141002106200141003602a801200141d0016a4110200141a8016a10062102024020012802a8012203417f460d002002450d0020034104490d02200228000021062002102a200141d0016a411010090b200141a8016a41086a22024200370300200142003703a801419df2c2004111200141a8016a1008200141d0016a41086a2002290300370300200120012903a8013703d001200141a8016a200141d0016a411010a7030240024020012d00a8014101460d00200141286a41086a4200370300200141286a41106a4200370300200141286a41186a4200370300200141f0016a41186a200141c1016a290000370300200141f0016a41106a200141a8016a41116a290000370300200141f0016a41086a200141b1016a290000370300200120012900a9013703f00120014200370328200141f0016a21020c010b200141d0016a41101009200141f0016a41186a200141c1016a2900002208370300200141f0016a41106a200141a8016a41116a2900002205370300200141f0016a41086a200141b1016a2900002209370300200141286a41086a2009370300200141286a41106a2005370300200141286a41186a2008370300200120012900a90122083703f00120012008370328200141f0016a21020b42002108200141a8016a41086a22034200370300200142003703a80141b1f0c200410d200141a8016a1008200141d0016a41086a2003290300370300200120012903a8013703d001200141003602a801200141d0016a4110200141a8016a100621040240024020012802a8012203417f470d00410421070c010b200120033602f401200120043602f001200141a8016a200141f0016a107620012802a8012207450d0320012902ac01210802402003450d002004102a0b200141d0016a411010090b200141a8016a41086a22034200370300200142003703a80141e6efc2004115200141a8016a1008200141d0016a41086a2003290300370300200120012903a8013703d001200141a8016a200141d0016a411010a7030240024020012d00a8014101460d00200220012900a901370000200141c8006a41086a4200370300200141c8006a41106a4200370300200141c8006a41186a4200370300200241186a200141c1016a290000370000200241106a200141b9016a290000370000200241086a200141b1016a290000370000200142003703480c010b200141d0016a41101009200241186a200141c1016a2900002205370000200241106a200141b9016a2900002209370000200241086a200141b1016a290000220a370000200220012900a901220b370000200141c8006a41086a200a370300200141c8006a41106a2009370300200141c8006a41186a20053703002001200b3703480b0240200641fb01490d00200641857e6a2203450d00411010282202450d04200241086a41002900c6f042370000200241002900bef042370000200241104120102c2202450d0520022003360010200141a8016a41186a22034200370300200141a8016a41106a22044200370300200141a8016a41086a220c4200370300200142003703a80120024114200141a8016a1000200141f0016a41186a2003290300370300200141f0016a41106a2004290300370300200141f0016a41086a200c290300370300200120012903a8013703f0012002102a200141f0016a412010090b200141a8016a41186a22024200370300200141a8016a41106a22034200370300200141a8016a41086a22044200370300200142003703a801200141a8016a1014200141e8006a41186a2002290300370300200141e8006a41106a2003290300370300200141e8006a41086a2004290300370300200120012903a801370368200141f0016a41186a200141286a41186a290300370300200141f0016a41106a200141286a41106a290300370300200141f0016a41086a200141286a41086a290300370300200120012903283703f001200242003703002003420037030020044200370300200142003703a8010240200141f0016a4120200141a8016a1015450d0020014188016a41086a2004290300220537030020014188016a41106a2003290300220937030020014188016a41186a2002290300220a370300200120012903a801220b3703880120042005370300200320093703002002200a3703002001200b3703a8010240024020084220882205a722022008a7460d00200821090c010b200241016a22032002490d082005a74101742204200320032004491bad220942247e2205422088a70d082005a722034100480d080240024020020d002003102821070c010b2007200241246c2003102c21070b2007450d0720084220882205a721020b2007200241246c6a220241003a0000200220012903a801370001200241096a200141b0016a290300370000200241116a200141b8016a290300370000200241196a200141c0016a290300370000200220012f00f0013b0021200241236a200141f2016a2d00003a00002005422086200942ffffffff0f83844280808080107c21080b200020012903283700102000200636020020002001290368370030200041286a200141286a41186a290300370000200041206a200141286a41106a290300370000200041186a200141286a41086a290300370000200041386a200141e8006a41086a290300370000200041c0006a200141e8006a41106a290300370000200041c8006a200141e8006a41186a290300370000200041086a200837020020002007360204200041e8006a200141c8006a41186a290300370000200041e0006a200141c8006a41106a290300370000200041d8006a200141c8006a41086a2903003700002000200129034837005020014190026a24000f0b41c4d1c3004133200141a8016a419cd9c3001038000b41c4d1c3004133200141a8016a419cd9c3001038000b41c4d1c3004133200141a8016a419cd9c3001038000b411041011037000b412041011037000b200341041037000b1031000bb40202067f017e230041206b220224000240024002400240200128020422034104490d0020012802002204280000210520012003417c6a22063602042001200441046a36020020064104490d01200428000421062001200341786a3602042001200441086a360200200241106a2001106d200228021022030d02200041003602080c030b200041003602080c020b200041003602080c010b200241106a41086a280200210720022802142104200241106a2001106d02402002280210450d00200241086a200241106a41086a2802002201360200200220022903102208370300200041106a20073602002000200436020c200020033602082000200636020420002005360200200041146a20083702002000411c6a20013602000c010b200041003602082004450d002003102a0b200241206a24000ba60301067f230041106b22022400200241003602082002420137030020002802002103024002400240410410282204450d0020024284808080c0003702042002200436020020042003360000200028020421050240024020022802042206200228020822046b4104490d00200441046a2103200228020021060c010b200441046a22032004490d03200641017422072003200720034b1b22074100480d030240024020060d002007102821060c010b200228020020062007102c21060b2006450d0220022007360204200220063602000b20022003360208200620046a200536000020002802082104200041106a2802002203200210b40102402003450d0020034105742103034020042002108f01200441206a2104200341606a22030d000b0b200028021421042000411c6a2802002203200210b40102402003450d0020034105742103034020042002108f01200441206a2104200341606a22030d000b0b2002280204210420012802002001280204200228020022032002280208100702402004450d002003102a0b200241106a24000f0b410441011037000b200741011037000b1031000b1300200041043602042000418897c3003602000b3400200041879fc30036020420004100360200200041146a4105360200200041106a41a0a2c300360200200041086a42133702000b34002000418ca2c30036020420004100360200200041146a4105360200200041106a41a0a2c300360200200041086a42133702000bf90101047f230041206b22032400200341106a41086a220442003703002003420037031041a8a0c6004117200341106a1008200341086a200429030037030020032003290310370300410021042003410036021020034110200341106a100621050240024020032802102206417f460d002005450d0020064104490d01200528000021042005102a0b02400240417f200420026a220520052004491b2204418080c002418080f00120011b4b0d00200041046a2004360200410021040c010b200041800c3b0001200041036a41003a0000410121040b200020043a0000200341206a24000f0b41c4d1c3004133200341106a419cd9c3001038000b850201047f230041206b22032400200341106a41086a2204420037030020034200370310418ea0c600411a200341106a1008200341086a200429030037030020032003290310370300410021042003410036021020034110200341106a100621050240024020032802102206417f460d002005450d0020064104490d01200528000021042005102a0b02400240417f2004418094ebdc034180afd0e50220021b2205200120052001491b6a220120012004491b220420054b0d00200041046a2004360200410021040c010b200041800c3b0001200041036a41003a0000410121040b200020043a0000200341206a24000f0b41c4d1c3004133200341106a419cd9c3001038000bef1a04057f017e037f017e230041e0016b220124000240024002400240024002400240024041880110282202450d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002802000e1500011402030405060708090a0b0c0d0e0f10111213000b0240024002400240024002400240200041086a280200417f6a220341054b0d004101210420030e06060102030405060b41e4f0c2001032000b200041146a2802002204417f4c0d1b2000410c6a28020021000240024020040d0020014200370360410121050c010b200410282205450d1d20014100360264200120043602600b20012004360264200520002004109a051a20012903602106410221040c040b200041106a2903002106410321040c030b200041146a2802002204417f4c0d192000410c6a28020021000240024020040d0020014200370360410121050c010b200410282205450d1c20014100360264200120043602600b20012004360264200520002004109a051a20012903602106410421040c020b200141e0006a2000410c6a106f2001290264210620012802602105410521040c010b200141e0006a2000410c6a10712001290264210620012802602105410621040b200220063703102002200536020c20022004360208200241003602000c140b10a103000b200141e0006a200041046a1070200241033602002002410c6a200141e8006a280200360200200220012903603702040c120b10bb03000b200141e0006a200041086a10ae02200241086a200141e0006a41e000109a051a200241053602000c100b200141e0006a200041086a10bc0320024106360200200241386a200141e0006a41306a290300370300200241306a200141e0006a41286a290300370300200241286a200141e0006a41206a290300370300200241206a200141e0006a41186a290300370300200241186a200141e0006a41106a290300370300200241106a200141e0006a41086a290300370300200220012903603703080c0f0b200141e0006a41186a200041286a290000370300200141e0006a41106a200041206a290000370300200141e8006a200041186a290000370300200141e0006a41286a200041386a290000370300200141e0006a41306a200041c0006a290000370300200141e0006a41386a200041c8006a290000370300200141e0006a41c8006a200041d8006a290000370300200141e0006a41d0006a200041e0006a290000370300200141e0006a41d8006a200041e8006a2900003703002001200041106a2900003703602001200041306a290000370380012001200041d0006a2900003703a0012000410c6a2802002205417f4c0d10200028020421030240024020050d0041012100410021040c010b20052104200510282200450d140b200020032005109a0521002001200141e0006a41e000109a0521032002200536020c2002200436020820022000360204200241106a200341e000109a051a200241073602000c0e0b200141e0006a200041086a10bd0320024108360200200241306a200141e0006a41286a290300370300200241286a200141e0006a41206a290300370300200241206a200141e0006a41186a290300370300200241186a200141e0006a41106a290300370300200241106a200141e0006a41086a290300370300200220012903603703080c0d0b02400240024002400240024020002d0004417f6a220541034b0d0020050e0401020304010b41c0f1c2001032000b200041106a280200220341ffffff3f712003470d1220034105742204417f4c0d12200041086a2802002100410121054101210702402004450d00200410282207450d170b024020030d0041002104410021030c040b2003410574210420072105034020052000290000370000200541186a200041186a290000370000200541106a200041106a290000370000200541086a200041086a290000370000200541206a2105200041206a2100200441606a22040d000b41012105200341057441606a41057641016a21040c030b200041086a10ba032107410221050c020b200041086a28020021072000410c6a10ba032103410321050c010b200141026a200041046a220541036a2d00003a0000200141e0006a41086a2000411c6a290000370300200141e0006a41106a200041246a2d00003a0000200120052f00013b01002001200041146a29000037036020002d00254100472108200041286a2802002109200041106a28000021042000410c6a2800002103200041086a2800002107410421050b200220053a0004200220012f01003b0005200220043602102002200336020c200220073602082002200129036037021420022009360228200220083a002520024109360200200241076a200141026a2d00003a00002002411c6a200141e8006a290300370200200241246a200141f0006a2d00003a00000c0c0b02400240024002400240024020002d0004417f6a220541034b0d0020050e0401020304010b41c0f1c2001032000b200041106a280200220341ffffff3f712003470d1120034105742204417f4c0d11200041086a2802002100410121054101210702402004450d00200410282207450d170b024020030d0041002104410021030c040b2003410574210420072105034020052000290000370000200541186a200041186a290000370000200541106a200041106a290000370000200541086a200041086a290000370000200541206a2105200041206a2100200441606a22040d000b41012105200341057441606a41057641016a21040c030b200041086a10ba032107410221050c020b200041086a28020021072000410c6a10ba032103410321050c010b200141026a200041046a220541036a2d00003a0000200141e0006a41086a2000411c6a290000370300200141e0006a41106a200041246a2d00003a0000200120052f00013b01002001200041146a29000037036020002d00254100472108200041286a2802002109200041106a28000021042000410c6a2800002103200041086a2800002107410421050b200220053a0004200220012f01003b0005200220043602102002200336020c200220073602082002200129036037021420022009360228200220083a00252002410a360200200241076a200141026a2d00003a00002002411c6a200141e8006a290300370200200241246a200141f0006a2d00003a00000c0b0b200141e0006a200041086a10d3022002410b360200200241c0006a200141e0006a41386a290300370300200241386a200141e0006a41306a290300370300200241306a200141e0006a41286a290300370300200241286a200141e0006a41206a290300370300200241206a200141e0006a41186a290300370300200241186a200141e0006a41106a290300370300200241106a200141e0006a41086a290300370300200220012903603703080c0a0b200141e0006a200041046a10be03200241046a200141e0006a41c400109a051a2002410c3602000c090b200028020421002002410d360200200220003602040c080b2000410c6a2802002205417f4c0d09200028020421030240024020050d0041012100410021040c010b20052104200510282200450d100b200020032005109a0521002002200536020c20022004360208200220003602042002410e3602000c070b024002400240024002400240200041086a280200417f6a220541024b0d0020050e03010203010b418486c2001032000b200041386a2903002106200041306a290300210a41012105024002402000410c6a2d00004101460d00200141e8006a2000411c6a290200370300200141e0006a41106a200041246a290200370300200141f8006a2000412c6a2d00003a00002001200041146a29020037036020002f000d2000410f6a2d0000411074722104200041106a2802002103410021050c010b200041106a28020021030b200141186a200141e0006a41186a280200360200200141106a200141e0006a41106a290300370300200141086a200141e0006a41086a29030037030020012001290360370300410121000c030b2000410c6a28020022054108762104410221000c010b2000410c6a28020022054108762104410321000b0b2002200a3703302002200336021020022000360208200220012903003702142002410f360200200241386a200637030020022004410874200541ff01717236020c2002411c6a200141086a290300370200200241246a200141106a2903003702002002412c6a200141186a2802003602000c060b200141e0006a200041086a10bf03200241086a200141e0006a418001109a051a200241103602000c050b200141e0006a200041046a10c003200241113602002002412c6a20014188016a280200360200200241246a20014180016a2903003702002002411c6a200141f8006a290300370200200241146a200141f0006a2903003702002002410c6a200141e8006a290300370200200220012903603702040c040b200141e0006a200041046a10af02200241046a200141e0006a41e400109a051a200241123602000c030b10c103000b10d501000b200041086a290300210620024102360200200220063703080b200141e0016a240020020f0b41880141081037000b1036000b200441011037000b200441011037000b200541011037000b200441011037000b200441011037000b200541011037000b0a0041acb4c3001032000b910c03047f017e057f230041206b2202240002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2203410c4b0d0020030e0d0102030405060708090a0b0c0d010b41e0ffc4001032000b4101210302400240200141046a2d00004101460d002002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030c010b200141086a28020021040b200041286a2001290328370300200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a28020036020020012d00012101200041013a0000200020013a00010c0c0b200041023a0000200041106a200141106a290300370300200041086a200141086a2903003703000c0b0b200041033a0000200041106a200141106a290300370300200041086a200141086a2903003703000c0a0b200041043a00000c090b200041053a0000200041106a200141106a290300370300200041086a200141086a2903003703000c080b2001410c6a2802002205ad42247e2206422088a70d082006a72204417f4c0d08200141046a28020021030240024020040d00410421070c010b200410282207450d0a0b0240024020050d00410021040c010b200541246c2108410021042002411e6a21092007210103400240024020032d00004101460d002009200341036a2d00003a0000200341046a280000210a200341016a2f0000210b200241086a200341106a290000370300200241106a200341186a290000370300200241186a200341206a2d00003a00002002200b3b011c2002200341086a2900003703004100210b0c010b200341046a280200210a4101210b0b200341246a21032001200b3a0000200141046a200a360200200141016a20022f011c3b0000200141036a20092d00003a0000200141086a2002290300370200200141106a200241086a290300370200200141186a200241106a290300370200200141206a200241186a280200360200200141246a2101200441016a21042008415c6a22080d000b0b200041063a00002000410c6a2004360200200041086a2005360200200041046a20073602000c070b200041073a00000c060b200041083a0000200020012d00013a00010c050b4101210302400240200141046a2d00004101460d002002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030c010b200141086a28020021010b200041093a0000200041046a20033a0000200041056a20022f011c3b0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000c040b2000410a3a0000200041046a200141046a2802003602000c030b2000410b3a00000c020b2000410c3a00000c010b2001410c6a280200220841ffffff3f712008470d0120084105742203417f4c0d01200141046a28020021010240024020030d004101210a0c010b20031028220a450d040b0240024020080d0041002108410021010c010b20084105742104200a2103034020032001290000370000200341186a200141186a290000370000200341106a200141106a290000370000200341086a200141086a290000370000200341206a2103200141206a2101200441606a22040d000b200841057441606a41057641016a21010b2000410d3a00002000410c6a2001360200200041086a2008360200200041046a200a3602000b200241206a24000f0b1036000b200441041037000b200341011037000bab0701017f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220241104b0d0020020e110102030405060708090a0b0c0d0e0f1011010b41e8d0c5001032000b41880110282202450d102002200141046a28020010cf03200041046a2002360200200041013a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b200041023a0000200041046a200141046a2802003602000f0b200041033a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041043a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041053a0000200041046a200141046a2802003602000f0b41880110282202450d0c2002200141046a28020010cf03200041063a0000200041046a20023602000f0b41880110282202450d0c2002200141046a28020010cf03200041073a0000200041046a20023602000f0b41880110282202450d0c2002200141046a28020010cf03200041083a0000200041046a20023602000f0b200041093a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a2902003702000f0b2000410a3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410b3a0000200041046a200141046a2802003602000f0b2000410c3a00002000410c6a2001410c6a280200360200200041046a200141046a2902003702000f0b2000410d3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410e3a00000f0b2000410f3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b200041103a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00000f0b200041113a00000f0b41880141081037000b41880141081037000b41880141081037000b41880141081037000bb60401047f0240024002400240024020012d0000417f6a220241034b0d0020020e0401020304010b4188b5c3001032000b200041013a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b200041023a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b200041033a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041216a200141216a290000370000200041296a200141296a290000370000200041316a200141316a290000370000200041396a200141396a2900003700000f0b024002402001410c6a280200220341ffffff3f712003470d0020034105742202417f4c0d00200141046a28020021010240024020020d00410121040c010b200210282204450d020b0240024020030d0041002103410021010c010b2003410574210520042102034020022001290000370000200241186a200141186a290000370000200241106a200141106a290000370000200241086a200141086a290000370000200241206a2102200141206a2101200541606a22050d000b200341057441606a41057641016a21010b200041043a00002000410c6a2001360200200041086a2003360200200041046a20043602000f0b1036000b200241011037000b8d0c07037f017e017f017e017f017e017f230041c0006b220224000240024002400240024002400240024002400240024020012d0000417f6a220341044b0d0020030e050102030405010b41d093c4001032000b200041f9006a2002280020360000200041086a200141086a290300370300200041fc006a200241236a280000360000200041106a200141106a290300370300200041186a200141186a290300370300200041206a200141206a290300370300200041286a200141286a290300370300200041306a200141306a290300370300200041386a200141386a290300370300200041c0006a200141c0006a290300370300200041c8006a200141c8006a290300370300200041d0006a200141d0006a290300370300200041d8006a200141d8006a290300370300200041e0006a200141e0006a290300370300200041e8006a200141e8006a290300370300200041f0006a200141f0006a290300370300200041f8006a200141f8006a2d00004100473a0000200041013a00000c040b2001410c6a2802002203417f4c0d04200141046a2802002104200141106a29030021050240024020030d0041002101410121060c010b20032101200310282206450d060b200620042003109a0521042000410c6a2003360200200041086a2001360200200041046a2004360200200041106a2005370300200041023a00000c030b4101210402400240200141046a2d00004101460d00200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002106410021040c010b200141086a28020021060b200141306a2802002203417f4c0d03200141c0006a29030021052001290338210720012802282108200129034821090240024020030d00410021014101210a0c010b2003210120031028220a450d060b200a20082003109a052108200041c0006a2005370300200041386a2007370300200041046a20043a0000200041086a2006360200200041c8006a2009370300200041306a20033602002000412c6a2001360200200041286a2008360200200041056a20022f01003b0000200041076a200241026a2d00003a00002000410c6a2002290320370200200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a00000c020b200141386a2903002105200141306a2903002107200141c0006a2903002109200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d02200141246a28020021010240024020030d0041012104410021060c010b20032106200310282204450d060b200420012003109a052101200041386a2005370300200041306a2007370300200041c0006a20093703002000412c6a2003360200200041286a2006360200200041246a2001360200200041043a000020002002290320370001200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a2903003700000c010b200241186a2204200141196a290000370300200241106a2206200141116a290000370300200241086a2208200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2004290300370000200041116a2006290300370000200041096a20082903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a00000b200241c0006a24000f0b1036000b200341011037000b200341011037000b200341011037000b920501047f230041206b2202240002400240024002400240024002402001280200417f6a220341024b0d0020030e03010203010b41dc9cc4001032000b41880110282203450d032003200128020410cf0320004101360200200020033602040c020b410121030240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030c010b200141086a28020021010b200020033a0004200020022f011c3b000520004102360200200041086a20013602002000410c6a2002290300370200200041076a2002411c6a41026a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000c010b410121040240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021040c010b200141086a28020021050b41880110282203450d022003200128022810cf03200020043a0004200041086a2005360200200041286a200336020020004103360200200020022f011c3b0005200041076a2002411e6a2d00003a00002000410c6a2002290300370200200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000b200241206a24000f0b41880141081037000b41880141081037000b0a0041b095c4001032000bad0301047f230041106b22022400024002400240024002400240024002400240024002402001280200417f6a220341054b0d0020030e06010203040506010b41e4f0c2001032000b200041013602000c050b2001410c6a2802002203417f4c0d05200128020421010240024020030d0041002104410121050c010b20032104200310282205450d070b200520012003109a0521012000410c6a2003360200200041086a200436020020002001360204200041023602000c040b20004103360200200041086a200141086a2903003703000c030b2001410c6a2802002203417f4c0d03200128020421010240024020030d0041012104410021050c010b20032105200310282204450d060b200420012003109a0521012000410c6a2003360200200041086a200536020020002001360204200041043602000c020b2002200141046a106f200041053602002000410c6a200241086a280200360200200020022903003702040c010b2002200141046a1071200041063602002000410c6a200241086a280200360200200020022903003702040b200241106a24000f0b1036000b200341011037000b200341011037000bdd0301047f024002400240024002400240024020012d0000417f6a220241034b0d0020020e0401020304010b41c0f1c2001032000b2001410c6a280200220341ffffff3f712003470d0320034105742202417f4c0d03200141046a28020021010240024020020d00410121040c010b200210282204450d050b0240024020030d0041002103410021010c010b2003410574210520042102034020022001290000370000200241186a200141186a290000370000200241106a200141106a290000370000200241086a200141086a290000370000200241206a2102200141206a2101200541606a22050d000b200341057441606a41057641016a21010b200041013a00002000410c6a2001360200200041086a2003360200200041046a20043602000f0b200141046a10ba032101200041023a0000200041046a20013602000f0b200141046a2802002102200041086a200141086a10ba03360200200041046a2002360200200041033a00000f0b200041043a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a280200360200200041216a200141216a2d00004100473a00000f0b1036000b200241011037000b3400200041c5b6c30036020420004100360200200041146a4102360200200041106a41ccb6c300360200200041086a42073702000be40201047f230041c0006b2202240002400240410f10282203450d00200341076a4100290092b4433700002003410029008bb4433700002003410f411e102c2203450d012003200036000f200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034113200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002003102a200128020021042001280208210320024100360228200242013703202003200241206a10b40102402003450d00200341057421002004210303402003200241206a108f01200341206a2103200041606a22000d000b0b2002280224210320024120200228022022002002280228100702402003450d002000102a0b0240200141046a280200450d002004102a0b200241c0006a24000f0b410f41011037000b411e41011037000b8a1401037f200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024002400240024002400240024020002d00004101460d000240024020022003460d00200128020021020c010b200341016a22022003490d11200341017422042002200420024b1b22044100480d110240024020030d002004102821020c010b200128020020032004102c21020b2002450d0220012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41003a00000240024002400240024002400240024020002d00010e080001020304050607000b02400240200141046a28020020042802002203460d00200128020021000c010b200341016a22002003490d18200341017422022000200220004b1b22024100480d180240024020030d002002102821000c010b200128020020032002102c21000b2000450d0a20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b02400240200141046a28020020042802002203460d00200128020021000c010b200341016a22002003490d17200341017422022000200220004b1b22024100480d170240024020030d002002102821000c010b200128020020032002102c21000b2000450d0a20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41013a00000f0b02400240200141046a28020020042802002203460d00200128020021000c010b200341016a22002003490d16200341017422022000200220004b1b22024100480d160240024020030d002002102821000c010b200128020020032002102c21000b2000450d0a20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41023a00000f0b02400240200141046a28020020042802002203460d00200128020021000c010b200341016a22002003490d15200341017422022000200220004b1b22024100480d150240024020030d002002102821000c010b200128020020032002102c21000b2000450d0a20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41033a00000f0b02400240200141046a28020020042802002203460d00200128020021000c010b200341016a22002003490d14200341017422022000200220004b1b22024100480d140240024020030d002002102821000c010b200128020020032002102c21000b2000450d0a20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41043a00000f0b02400240200141046a28020020042802002203460d00200128020021000c010b200341016a22002003490d13200341017422022000200220004b1b22024100480d130240024020030d002002102821000c010b200128020020032002102c21000b2000450d0a20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41053a00000f0b02400240200141046a28020020042802002203460d00200128020021000c010b200341016a22002003490d12200341017422022000200220004b1b22024100480d120240024020030d002002102821000c010b200128020020032002102c21000b2000450d0a20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41063a00000f0b02400240200141046a28020020042802002203460d00200128020021020c010b200341016a22022003490d11200341017422042002200420024b1b22044100480d110240024020030d002004102821020c010b200128020020032004102c21020b2002450d0a20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41073a000002400240200141046a28020020042802002203460d00200128020021020c010b200341016a22022003490d11200341017422042002200420024b1b22044100480d110240024020030d002004102821020c010b200128020020032004102c21020b2002450d0b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a20002d00023a00000f0b0240024020022003460d00200128020021020c010b200341016a22022003490d10200341017422042002200420024b1b22044100480d100240024020030d002004102821020c010b200128020020032004102c21020b2002450d0b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41013a0000024020002d0001220341024b0d0002400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d13200341017422022000200220004b1b22024100480d130240024020030d002002102821000c010b200128020020032002102c21000b2000450d0f20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b02400240200141046a280200200141086a2802002203460d00200128020021000c010b200341016a22002003490d12200341017422022000200220004b1b22024100480d120240024020030d002002102821000c010b200128020020032002102c21000b2000450d0f20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41013a00000f0b02400240200141046a280200200141086a2802002203460d00200128020021020c010b200341016a22022003490d11200341017422042002200420024b1b22044100480d110240024020030d002004102821020c010b200128020020032004102c21020b2002450d0f20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41023a000002400240200141046a28020020042802002203460d00200128020021020c010b200341016a22022003490d11200341017422042002200420024b1b22044100480d110240024020030d002004102821020c010b200128020020032004102c21020b2002450d1020012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a20002d00023a00000b0f0b200441011037000b200241011037000b200241011037000b200241011037000b200241011037000b200241011037000b200241011037000b200241011037000b200441011037000b200441011037000b200441011037000b200241011037000b200241011037000b200441011037000b200441011037000b1031000bac64070e7f017e047f017e047f0f7e087f230041900b6b220124004100210241002103410421040240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000410c6a28020041246c2205450d00200028020421064104210441002102410021030340024020062d00004101470d00200641106a2802002207417f4c0d1a200641086a2802002108200641016a28000021090240024020070d004101210a4100210b0c010b2007210b20071028220a450d040b200a20082007109a05210a20014188076a41026a220c200141f0056a41026a2d00003a0000200141a0086a41086a220d200141c0096a41086a290200370300200120012f00f0053b018807200120012902c0093703a008024020022003470d00200241016a22082002490d1d2002410174220e2008200e20084b1b2203ad42247e220f422088a70d1d200fa722084100480d1d0240024020020d002008102821040c010b2004200241246c2008102c21040b2004450d050b2004200241246c6a220841013a000020082009360001200820073600102008200b36000c2008200a360008200820012f0188073b0005200841076a200c2d00003a0000200820012903a0083702142008411c6a200d290300370200200241016a21020b200641246a21062005415c6a22050d000b0b200141003602a0084188e8c2004110200141a0086a4104100720014188076a41086a22064200370300200142003703880741d9efc200410d20014188076a1008200141f0056a41086a2208200629030037030020012001290388073703f0052001200028020022073602a008200141f0056a4110200141a0086a4104100720064200370300200142003703880741b1f0c200410d20014188076a10082008200629030037030020012001290388073703f005200141103602a4082001200141f0056a3602a00820042002200141a0086a10e102200642003703002001420037038807419df2c200411120014188076a10082008200629030037030020012001290388073703f005200141103602a4082001200141f0056a3602a008200041106a2205200141a0086a10f002411010282206450d02200641086a41002900c6f042370000200641002900bef042370000200641104120102c2208450d0320082007417f6a360010200141d8046a41186a22064200370300200141d8046a41106a22074200370300200141d8046a41086a22094200370300200142003703d80420084114200141d8046a100020014188076a41186a200629030037030020014188076a41106a200729030037030020014188076a41086a22062009290300370300200120012903d804370388072008102a200141203602a408200120014188076a3602a0082005200141a0086a10f00220064200370300200142003703880741e6efc200411520014188076a1008200141f0056a41086a2208200629030037030020012001290388073703f005200141103602a4082001200141f0056a3602a008200041d0006a200141a0086a10f00220064200370300200142003703880741aef2c200411520014188076a10082008200629030037030020012001290388073703f005200141a0086a200141f0056a10a903024020012802a40822070d00200141013602d804410021094100210641002105410021080c060b200120073602d804200141ac086a280200210620012802a008210920012802a8082105024020012903a808220f422088a741d1004f0d00200fa721080c060b200141a0086a41186a220a200041286a290000370300200141a0086a41106a220b200041206a290000370300200141a0086a41086a220c200041186a290000370300200120002900103703a00820062009411874220941187522084d0d04200720084105746a220820012903a008370000200841186a200a290300370000200841106a200b290300370000200841086a200c290300370000200941808080086a41187541d1006f21090c060b200741011037000b200841041037000b411041011037000b412041011037000b41c4f2c200200820061034000b200141a0086a41186a220a200041286a290000370300200141a0086a41106a220b200041206a290000370300200141a0086a41086a220c200041186a290000370300200120002900103703a008024020062008470d0020052006470d00200641016a22082006490d14200641017422072008200720084b1b220541ffffff3f712005470d14200541057422074100480d140240024020060d002007102821080c010b20012802d80420064105742007102c21080b2008450d02200120083602d8040b20012802d804220720064105746a220820012903a008370000200841086a200c290300370000200841106a200b290300370000200841186a200a290300370000200641016a21060b20014188076a41086a22084200370300200142003703880741aef2c200411520014188076a1008200141f0056a41086a200829030037030020012001290388073703f0050240024020070d00200141f0056a411010090c010b410110282208450d0220014281808080103702a408200120083602a008200820093a00002006200141a0086a10b40102402006450d00200641057421082007210603402001200141a0086a3602c0092006200141c0096a10c801200641206a2106200841606a22080d000b0b20012802a4082106200141f0056a411020012802a008220820012802a808100702402006450d002008102a0b2007450d002005450d002007102a0b20014188076a41086a22084200370300200142003703880741d4f2c200410d20014188076a1008200141f0056a41086a2206200829030037030020012001290388073703f005200141f0056a4110100920084200370300200142003703880741eea0c600411120014188076a10082006200829030037030020012001290388073703f005200141f0056a41101009411210282206450d02200641106a41002f00f1f2423b0000200641086a41002900e9f242370000200641002900e1f242370000200141d8046a41186a22074200370300200141d8046a41106a22054200370300200141d8046a41086a22094200370300200142003703d80420064112200141d8046a100020014188076a41186a200729030037030020014188076a41106a200529030037030020082009290300370300200120012903d804370388072006102a20014188076a4120100e2000280200211010eb0220104105490d07200141f0056a41086a22064200370300200142003703f0054193cdc2004111200141f0056a1008200141a0086a41086a2006290300370300200120012903f0053703a008200141003602c009200141a0086a4110200141c0096a100621060240024020012802c0092208417f460d002006450d002001200836028c072001200636028807200141c0096a20014188076a107b20012802c009220a450d0520012902c409210f2008450d012006102a0c010b4104210a4200210f0b2010417b6a2105200a200f422088a7220b41c4006c22066a21090240200641cd014f0d0041002106200a21080c060b200a41d0016a21084100210603400240200841b07e6a22072d00004101460d00200841b47e6a28020020054f0d080b0240200741c4006a2d00004101460d00200841f87e6a2802002005490d00200641016a21060c080b024020074188016a2d00004101460d00200841bc7f6a2802002005490d00200641026a21060c080b02400240200741cc016a2d00004101460d00200828020020054f0d010b20084190026a2108200641046a2106200920074190026a6b41cc014d0d060c010b0b200641036a21060c060b200741011037000b410141011037000b411241011037000b41c4d1c3004133200141f0056a419cd9c3001038000b200841b07e6a21080b20082009460d00200a200b41c4006c6a21070340024020082d00004101460d00200841046a28020020054f0d020b200641016a21062007200841c4006a2208470d000b0b2006200b4b0d01200f42ffffffff0f83210f0240200b20066b2208450d0002402006450d00200a200a200641c4006c6a200841c4006c109b051a0b2008ad422086200f84210f0b200141f0056a41086a22064200370300200142003703f0054193cdc2004111200141f0056a1008200141a0086a41086a2006290300370300200120012903f0053703a008200141c0096a200a200f422088a7109202200141a0086a411020012802c009220820012802c8091007200fa72106024020012802c409450d002008102a0b2006450d00200a102a0b200141003a00c009200141f0056a41086a22064200370300200142003703f00541c8fbc5004117200141f0056a1008200141a0086a41086a22082006290300370300200120012903f0053703a008200141a0086a4110200141c0096a41011007200141a0086a10f801412410282206450d01200620012903a00837000020064114360220200641186a200141a0086a41186a290300370000200641106a200141a0086a41106a290300370000200641086a200829030037000020014281808080103702c409200120063602c009200141c0096a10f901201010ea0202400240201041809c3170450d0020014188076a21110c010b200141f0056a41086a22064200370300200142003703f00541d590c600411f200141f0056a100820014188076a41086a2006290300370300200120012903f00537038807200141003602a00820014188076a4110200141a0086a1006210602400240024020012802a0082208417f460d002006450d002008450d0120062d000021082006102a20014188076a4110100920084102460d0020084101710d020b20014188076a2111201010c803450d02201010c9031a0c020b41c4d1c3004133200141f0056a419cd9c3001038000b20014188076a2111201010c903450d00201010c8031a0b200141f0056a41086a22064200370300200142003703f00541c290c6004113200141f0056a100820014188076a41086a2006290300370300200120012903f0053703880741002106200141003602a00820114110200141a0086a10062108024020012802a0082207417f460d002008450d0020074104490d03200828000021062008102a0b200141f0056a41086a22084200370300200142003703f00541a990c6004119200141f0056a100820014188076a41086a2008290300370300200120012903f0053703880741002108200141003602a00820114110200141a0086a10062107024020012802a0082205417f460d002007450d0020054104490d04200728000021082007102a0b02400240200620084f0d0002400340200141c0096a200610ca0320012802c00922074113470d012008200641016a2206470d000c020b0b20014188076a200141c0096a410472419401109a051a200141f0056a20014188076a419401109a051a200141d8046a200141f0056a419401109a051a200120073602a80820012006ad220f3703a008200141ac086a200141d8046a419401109a052105200141b0096a2802002010460d01200141a8086a106a0b4108211241002106410021130c080b200141c0036a2005419401109a051a200141a0086a200141c0036a419401109a051a41a00110282212450d04201220073602082012200f3703002012410c6a200141a0086a419401109a051a02400240200641016a220720084f0d000340200141c0096a200710ca0320012802c00922054113470d022008200741016a2207470d000b0b41012106410121130c080b20014188076a200141c0096a410472220c419401109a051a200141f0056a20014188076a419401109a051a200141d8046a200141f0056a419401109a051a200120053602a80820012007ad220f3703a008200141a0086a410c6a200141d8046a419401109a05210a41012106200141a8086a210b200141b0096a2802002010470d06200741016a2107200141c0036a200a419401109a051a41012106410121130340200141a0086a200141c0036a419401109a051a024020132006470d00200641016a22092006490d0c2006410174220d2009200d20094b1b2213ad42a0017e2214422088a70d0c2014a722094100480d0c024002402006450d002012200641a0016c2009102c21120c010b2009102821120b2012450d070b2012200641a0016c6a220920053602082009200f3703002009410c6a200141a0086a419401109a051a200641016a2106200720084f0d0802400340200141c0096a200710ca03024020012802c00922054113460d0020014188076a200c419401109a051a200141f0056a20014188076a419401109a051a200141d8046a200141f0056a419401109a051a200120053602a80820012007ad220f3703a008200a200141d8046a419401109a05210920012802b0092010470d02200741016a2107200141c0036a2009419401109a051a0c030b2008200741016a2207470d000c0a0b0b0b200b106a0c070b41e4e8c5001032000b412441041037000b41c4d1c3004133200141f0056a419cd9c3001038000b41c4d1c3004133200141f0056a419cd9c3001038000b41a00141081037000b200941081037000b200b106a410121130b2012200641a0016c6a2115024020060d00201221160c020b20014188076a4104722106200141a0086a410472211720014198026a41086a21182012211603402016280200210520162802082108200141a0086a2016410c6a419401109a051a201641a0016a211620084113460d02200141c0096a200141a0086a419401109a051a200120083602a0082017200141c0096a419401109a051a200141f0056a200510cb0320012802f005210b0240024020012802f80522080d00420021194200211a4200211b4200211c4200211d4200211e0c010b200841057421094200211d200b21084200211e4200211b4200211c420021194200211a034020014198036a2008109d0220014198036a41086a2903002114200129039803210f20062008290000370000200641086a200841086a290000370000200641106a200841106a290000370000200641186a200841186a290000370000200120053602880720014190036a20014188076a10cc0320012d00900341017121070240024020012d009103220a0d00200141d0026a200f2014420a420010a00520012903d002221f210f200141d0026a41086a290300222021140c010b200141f0026a20144200200aad221f4200109f0520014180036a200f4200201f4200109f05200141e0026a42004200200f4200109f05427f20014180036a41086a290300221f20012903f00220012903e0027c7c222020012903f80220012903e802844200522020201f5472220a1b2120427f200129038003200a1b211f0b200841206a21084200202020071b201c7c4200201f20071b2221201b7c221b202154ad7c211c2020420020071b201a7c201f420020071b221f20197c2219201f54ad7c211a2014201e7c200f201d7c221d200f54ad7c211e200941606a22090d000b0b024020012802f405450d00200b102a0b200141f0056a200510cb0320012802f00521000240024020012802f80522080d004200212142002122420021234200212442002120420021250c010b2008410574210942002120200021084200212542002123420021244200212142002122034020062008290000370000200641086a200841086a2207290000370000200641106a200841106a220a290000370000200641186a200841186a220b2900003700002001200536028807200141c8026a20014188076a10cc0320012d00c802210c20012d00c902210d20014188076a41186a200b29000037030020014188076a41106a200a29000037030020014188076a41086a20072900003703002001200829000037038807200141a8026a200520014188076a200d411010cd03200141a8026a41186a29030020257c20012903b802220f20207c2220200f54ad7c21254200200141a8026a41086a290300220f200c41017122071b20247c420020012903a802221420071b221f20237c2223201f54ad7c2124200f420020071b20227c2014420020071b220f20217c2221200f54ad7c2122200841206a2108200941606a22090d000b0b024020012802f405450d002000102a0b20014198026a10a1022018290300210f2001290398022114024002402020201d7c221f4202882025201e7c201f202054ad7c2220423e8684221d2020420288221e84500d00201d201f85201e20208584500d00410021080240034020014188026a201f2020200841046a41fe0071109e05200841026a2108200129038802221d20014188026a41086a290300221e84500d01201d201f85201e2020858450450d000b0b200141f8016a201f2020200841fe0071109e0520012903f801200141f8016a41086a29030084211d4200211e024020080d00201d420052ad211d0c020b201d420052ad211d0340200141d8016a201f202041002008417e6a2207200720084b1b220841ff0071109e05200141e8016a201d42018622264201842225201e420186201d423f8884221e2025201e109f052026202520012903e80120012903d80156200141e8016a41086a290300221d200141d8016a41086a290300222756201d2027511b1b211d20080d000c020b0b4200211e201f202084420052ad211d0b024002402014420288200f423e8684221f200f420288222084500d00201f2014852020200f8584500d004100210802400340200141c8016a2014200f200841046a41fe0071109e05200841026a210820012903c801221f200141c8016a41086a290300222084500d01201f2014852020200f858450450d000b0b200141b8016a2014200f200841fe0071109e0520012903b801200141b8016a41086a29030084211f42002120024020080d00201f420052ad211f0c020b201f420052ad211f034020014198016a2014200f41002008417e6a2207200720084b1b220841ff0071109e05200141a8016a201f420186222642018422252020420186201f423f8884222020252020109f052026202520012903a80120012903980156200141a8016a41086a290300221f20014198016a41086a290300222756201f2027511b1b211f20080d000c020b0b420021202014200f84420052ad211f0b02400240024002400240201d201e8450450d004100210b0c010b2024201c7c2023201b7c2214202354ad7c21232022201a7c202120197c220f202154ad7c212102400240024020012d00b0090e03010200010b200f201456202120235620212023511b210b0c020b0340200141c8006a20142023201d201e10a005201f22192020221a844200510d04200141c8006a41086a290300211f20012903482120200141386a200f20212019201a10a0054101210b20202001290338221b54201f200141386a41086a290300222554201f20255122081b0d020240201b2020542025201f5420081b450d004100210b0c030b200141286a2020201f201d201e109f05200141186a201b20252019201a109f050240200f2001290318221f7d22202021200141186a41086a2903007d200f201f54ad7d222584500d002023200141286a41086a2903007d211b20142001290328220f5421082014200f7d211f201d210f201e21212020211d2025211e20192114201a2123201f201b2008ad7d222084500d030c010b0b4100210b0c010b0340201e2125201d2119201f2020844200510d02200141f8006a200f20212019202510a00520014188016a20142023201f202010a0054101210b200129038801221a2001290378221b5420014188016a41086a290300221d200141f8006a41086a290300221e54201d201e5122081b0d010240201b201a54201e201d5420081b450d004100210b0c020b200141e8006a201a201d201f2020109f05200141d8006a201b201e20192025109f050240200f2001290358221d7d221e2021200141d8006a41086a2903007d200f201d54ad7d221a8450450d004100210b0c020b2023200141e8006a41086a2903007d211b20142001290368220f5421082014200f7d211d201f210f20202121201e211f201a21202019211420252123201d201b2008ad7d221e844200520d000b0b20014188076a200510cb032001280288072128200128028c0721292001280290072208450d0220282008410574222a6a212b2028210802400340200141f0056a41186a2207200841186a220c290000370300200141f0056a41106a2209200841106a220d290000370300200141f0056a41086a220a200841086a2200290000370300200120082900003703f0052008290000210f200641186a222c200c2900003700002006200f370000200641086a222d2000290000370000200641106a222e200d2900003700002001200536028807200141106a20014188076a10cc0320012d0011210e20012d0010212f20014188076a41186a220c200729030037030020014188076a41106a220d200929030037030020014188076a41086a2200200a290300370300200120012903f005370388070240200b202f41017145734101470d00200841206a21080c020b200841206a2108202a41606a222a0d000c040b0b0340200141d8046a41186a200c290300220f370300200141d8046a41106a200d2903002214370300200141d8046a41086a2000290300221f370300200120012903880722203703d804200c200f370300200d20143703002000201f370300200142e4cab5fbb6ccdcb0e3003703a8032001202037038807200141a8036a20014188076a200e41187441187541027441f48fc6006a2802004180de346c20106a10a8022008202b460d03024003402007200841186a220e2900003703002009200841106a222f290000370300200a200841086a222a290000370300200120082900003703f0052001200536028807202a290000210f202f29000021142008290000211f202c200e290000370000202e2014370000202d200f3700002006201f370000200141086a20014188076a10cc0320012d0009210e20012d0008212f200c2007290300370300200d20092903003703002000200a290300370300200120012903f00537038807200b202f41017145730d01202b200841206a2208470d000c050b0b200841206a21080c000b0b41f895c1001032000b41f895c1001032000b02402029450d002028102a0b200510ce0302400240200b0d00200141053a009007200141053a00880720012005360294074101410020014188076a10cc01200141f0056a41086a22084200370300200142003703f00541c290c6004113200141f0056a100820014188076a41086a2008290300370300200120012903f005370388072001200541016a3602f00520114110200141f0056a41041007200141a0086a106a0c010b2001200536029407200141043a009007200141053a0088074101410020014188076a10cc01024020012802ac092207450d00200141f0056a200141a0086a418801109a051a200120053602f80602400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240411710282208450d002008410f6a41002900918945220f370000200841086a410029008a89452214370000200841002900828945221f37000020084117412e102c2208450d012008200720106a2200360017200141d8046a41186a22074200370300200141d8046a41106a22094200370300200141d8046a41086a220a4200370300200142003703d8042008411b200141d8046a100020014188076a41186a220e200729030037030020014188076a41106a222f200929030037030020014188076a41086a220c200a290300370300200120012903d804370388072008102a200141003602d80420014188076a4120200141d8046a1006210b0240024020012802d8042208417f470d00200141003602e004200142013703d8044100200141d8046a10b40120012802e004210820012802dc04210d20012802d804210b0c010b2008210d0b200120083602b8032001200d3602b4032001200b3602b003024002400240024002402008450d00200141d8046a200b2008410110d60220012802d8044101460d0420012802dc04212a20012802e404220820012802e004220b460d0320012802b8032008200b6b6a220d4190016a222c417f4c0d1f202c0d014101212d0c020b4101200141b0036a10b40120012802b403210b20012802b8032108024020012802f0054113470d0002400240200b2008460d0020012802b003210b0c010b200841016a220b2008490d222008410174220d200b200d200b4b1b220d4100480d220240024020080d00200d1028210b0c010b20012802b0032008200d102c210b0b200b450d082001200d3602b4032001200b3602b00320012802b80321080b2001200841016a3602b803200b20086a41003a00000c150b02400240200b2008460d0020012802b003210b0c010b200841016a220b2008490d212008410174220d200b200d200b4b1b220d4100480d210240024020080d00200d1028210b0c010b20012802b0032008200d102c210b0b200b450d082001200d3602b4032001200b3602b00320012802b80321080b2001200841016a3602b803200b20086a41013a0000200141f0056a200141b0036a10eb01200141f0056a4188016a280200210d0240024020012802b403220b20012802b80322086b4104490d0020012802b003210b0c010b200841046a222a2008490d21200b4101742208202a2008202a4b1b22084100480d2102400240200b0d0020081028210b0c010b20012802b003200b2008102c210b0b200b450d09200120083602b4032001200b3602b00320012802b80321080b2001200841046a3602b803200b20086a200d3600000c140b202c1028222d450d080b2001202c3602dc0a2001202d3602d80a2001200d3602e00a2001200141d80a6a3602d804202a200141d8046a200810d701200d2008490d0820012802e00a222a200d490d0920012802b803222a200b490d0a20012802d80a212c20012802b003212d2001200d20086b220d3602e80a2001202a200b6b222a3602ec0a200d202a470d0b202c20086a202d200b6a200d109a051a20012802dc0a210b20012802e00a21080240024020012802f0054113470d0002400240200b2008460d0020012802d80a210b0c010b200841016a220b2008490d212008410174220d200b200d200b4b1b220d4100480d210240024020080d00200d1028210b0c010b20012802d80a2008200d102c210b0b200b450d0f2001200d3602dc0a2001200b3602d80a20012802e00a21080b2001200841016a3602e00a200b20086a41003a00000c010b02400240200b2008460d0020012802d80a210b0c010b200841016a220b2008490d202008410174220d200b200d200b4b1b220d4100480d200240024020080d00200d1028210b0c010b20012802d80a2008200d102c210b0b200b450d0f2001200d3602dc0a2001200b3602d80a20012802e00a21080b2001200841016a3602e00a200b20086a41013a0000200141f0056a200141d80a6a10eb01200141f0056a4188016a280200210d0240024020012802dc0a220b20012802e00a22086b4104490d0020012802d80a210b0c010b200841046a222a2008490d20200b4101742208202a2008202a4b1b22084100480d2002400240200b0d0020081028210b0c010b20012802d80a200b2008102c210b0b200b450d10200120083602dc0a2001200b3602d80a20012802e00a21080b2001200841046a3602e00a200b20086a200d3600000b20012802e00a210b20012802dc0a210d20012802d80a210820012802b403450d1320012802b003102a0c130b2001200141b0036a3602d804202a200141d8046a200b10d70120012802b403210b20012802b8032108024020012802f0054113470d0002400240200b2008460d0020012802b003210b0c010b200841016a220b2008490d1f2008410174220d200b200d200b4b1b220d4100480d1f0240024020080d00200d1028210b0c010b20012802b0032008200d102c210b0b200b450d102001200d3602b4032001200b3602b00320012802b80321080b2001200841016a3602b803200b20086a41003a00000c120b02400240200b2008460d0020012802b003210b0c010b200841016a220b2008490d1e2008410174220d200b200d200b4b1b220d4100480d1e0240024020080d00200d1028210b0c010b20012802b0032008200d102c210b0b200b450d102001200d3602b4032001200b3602b00320012802b80321080b2001200841016a3602b803200b20086a41013a0000200141f0056a200141b0036a10eb01200141f0056a4188016a280200210d0240024020012802b403220b20012802b80322086b4104490d0020012802b003210b0c010b200841046a222a2008490d1e200b4101742208202a2008202a4b1b22084100480d1e02400240200b0d0020081028210b0c010b20012802b003200b2008102c210b0b200b450d11200120083602b4032001200b3602b00320012802b80321080b2001200841046a3602b803200b20086a200d3600000c110b20012802b403450d1220012802b003102a0c120b411741011037000b412e41011037000b200d41011037000b200d41011037000b200841011037000b202c41011037000b2008200d1044000b200d202a103c000b200b202a1044000b200141c0036a41146a4108360200200141cc036a4125360200200141f00a6a41146a4103360200200142033702f40a200141c8afc6003602f00a200141253602c4032001200141e80a6a3602880b2001200141ec0a6a36028c0b200142043703e804200142013702dc042001419cb0c6003602d8042001200141c0036a3602800b2001200141d8046a3602d00320012001418c0b6a3602c8032001200141880b6a3602c003200141f00a6a41d8b0c600103e000b200d41011037000b200d41011037000b200841011037000b200d41011037000b200d41011037000b200841011037000b20012802b803210b20012802b403210d20012802b00321080b2008450d0020014188076a41202008200b1007200d450d012008102a0c010b41900110282208450d014113210b024020012802f0054113460d0020014188076a200141f0056a10cf032001200141f0056a4188016a28020036029008200128028807210b200141d8046a2006418c01109a051a0b2008200b360200200841046a200141d8046a418c01109a051a41171028220b450d02200b410f6a200f370000200b41086a2014370000200b201f370000200b4117412e102c220b450d03200b20003600172007420037030020094200370300200a4200370300200142003703d804200b411b200141d8046a1000200e2007290300370300202f2009290300370300200c200a290300370300200120012903d80437038807200b102a200141d8046a2008410110ac0220014188076a412020012802d804220720012802e0041007024020012802dc04450d002007102a0b024020082802004113460d002008106a0b2008102a0b024020012802f0054113460d00200141f0056a106a0b200141f0056a41086a22084200370300200142003703f00541c290c6004113200141f0056a1008200c2008290300370300200120012903f005370388072001200541016a3602f00520114110200141f0056a410410070c040b41900141081037000b411741011037000b412e41011037000b20014188076a200141a0086a418801109a051a200141003b01f005200141d8046a20014188076a200141f0056a10f401200120012d00e0044102463a009107200141073a009007200141053a00880720012005360294074101410020014188076a10cc01200141f0056a41086a22084200370300200142003703f00541c290c6004113200141f0056a100820014188076a41086a2008290300370300200120012903f005370388072001200541016a3602f00520114110200141f0056a410410070b20162015470d000b201521160c010b1036000b024020162015460d00200141a0086a41086a2108200141a0086a410c6a21070340201641086a28020021062016290300210f200141a0086a2016410c6a419401109a051a20064113460d01200141c0096a200141a0086a419401109a051a200120063602a8082001200f3703a0082007200141c0096a419401109a051a2008106a201641a0016a22162015470d000b0b02402013450d002012102a0b0240024002400240411710282206450d002006410f6a41002900918945370000200641086a410029008a894537000020064100290082894537000020064117412e102c2206450d01200620103600174200210f200141d8046a41186a22084200370300200141d8046a41106a22074200370300200141d8046a41086a22054200370300200142003703d8042006411b200141d8046a100020014188076a41186a200829030037030020014188076a41106a200729030037030020014188076a41086a2005290300370300200120012903d804370388072006102a200141003602a00820014188076a4120200141a0086a100621080240024020012802a0082206417f470d004108210b0c010b200120063602c409200120083602c009200141a0086a200141c0096a10800120012802a008220b450d0320012902a408210f02402006450d002008102a0b20014188076a412010090b200b200f422088a722084190016c22076a2105200b210602402008450d00200741f07e6a2107200141a0086a410472210a200b21060240034020062802002108200141c0096a200641046a418401109a051a20084114460d01200141a0086a200141c0096a418401109a051a02400240024020084113470d0020070d01200521060c050b20064188016a280200210920014188076a200141a0086a418401109a051a200120083602a008200a20014188076a418401109a051a200141003b01c009200141f0056a200141a0086a200141c0096a10f40120012d00f8052108200120093602ac08200120084102463a00a908200141073a00a808200141053a00a00841014100200141a0086a10cc012007450d010b20064190016a2106200741f07e6a21070c010b0b200521060c010b20064190016a21060b200fa7210920062005460d03200141a0086a4104722107034020062802002108200141a0086a200641046a418c01109a051a20084114460d04200141c0096a200141a0086a418c01109a051a200120083602a0082007200141c0096a418c01109a051a024020084113460d00200141a0086a106a0b20064190016a22062005470d000c040b0b411741011037000b412e41011037000b41c4d1c3004133200141f0056a419cd9c3001038000b02402009450d00200b102a0b201010bd0202402002450d00200241246c21082004210603400240024020062d0000220741034b0d0002400240024020070e0404000102040b2006410c6a280200450d03200641086a280200102a0c030b2006410c6a280200450d02200641086a280200102a0c020b2006410c6a280200450d01200641086a280200102a0c010b200641086a280200450d00200641046a280200102a0b200641246a21062008415c6a22080d000b0b02402003450d002004102a0b200141900b6a24000f0b1031000be80201067f230041b0026b2201240020014198016a41086a22024200370300200142003703980141988bc500411620014198016a100820014188016a41086a2203200229030037030020012001290398013703880120014198016a20014188016a10df030240024020012802980122044113470d0041ae8bc50021020c010b20014188016a41101009200141046a20014198016a4104722205418401109a051a200141a0026a2d00002106200141013a00af0220024200370300200142003703980141d590c600411f20014198016a10082003200229030037030020012001290398013703880120014188016a4110200141af026a41011007200241023a0000200141053a009801410021024101410020014198016a10cc0120012004360298012005200141046a418401109a051a20014188016a200041809c316a20014198016a20064180de3410b7042001280288014101470d00200128028c0121020b200141b0026a240020020bc01802117f187e230041f0056b22012400200141a0046a41086a22024200370300200142003703a00441ac89c5004115200141a0046a1008200141306a41086a2002290300370300200120012903a004370330200141003602a004200141306a4110200141a0046a10062103024002400240024002400240024002400240024020012802a0042204417f460d002003450d002001200436024420012003360240200141286a200141c0006a106c20012802280d09200128024441b0016e220541b0016c2202417f4c0d02200128022c21060240024020020d00410821070c010b200210282207450d040b02402006450d0020014198036a4104722108410021094100210a0340024002400240200128024422024104490d002001280240220b280000210c20012002417c6a3602442001200b41046a360240200141a0046a200141c0006a10810120012802a0044113460d00200a41016a210d20014198036a200141a0046a418801109a051a4100210b200141003a00e8052001280244417f6a2102024003402002417f460d01200141c8056a200b6a2001280240220e2d00003a00002001200e41016a3602402001200b41016a220e3a00e805200120023602442002417f6a2102200e210b200e4120470d000b200141a8056a41186a2202200141c8056a41186a290300370300200141a8056a41106a220e200141c8056a41106a290300370300200141a8056a41086a220f200141c8056a41086a290300370300200120012903c8053703a805200128029803210b20014190026a2008418401109a051a200141f0016a41086a2210200f290300370300200141f0016a41106a220f200e290300370300200141f0016a41186a220e2002290300370300200120012903a8053703f001200b4113460d01200141ec006a20014190026a418401109a051a200141c8006a41186a2211200e290300370300200141c8006a41106a220e200f290300370300200141c8006a41086a220f2010290300370300200120012903f0013703482005200a470d030240200a4101742202200d2002200d4b1b2205ad42b0017e2212422088a70d002012a7220241004e0d030b1031000b0240200b41ff0171450d00200141003a00e8050b20014198036a106a0b0240200a450d002007210203402002106a200241b0016a2102200941d07e6a22090d000b0b2005450d0d2007102a0c0d0b02400240200a0d002002102821070c010b2007200a41b0016c2002102c21070b2007450d070b2007200a41b0016c6a2202200b360200200241046a200141ec006a418401109a051a2002200c360288012002200129034837028c0120024194016a200f2903003702002002419c016a200e290300370200200241a4016a2011290300370200200941b0016a2109200d210a200d2006470d000b0b2007450d092006ad42208621122005ad211302402004450d002003102a0b201220138421140c010b41082107420021140b024002402014422088a72204450d00200141a0046a20072802880110b8040240024020012802b00422020d0042002115420021120c010b200141186a20012903a004200141a0046a41086a290300200141b8046a3502004200109f05200141186a41086a29030021122001290318211520012802b404450d002002102a0b4100210e20044101460d012007200441b0016c6a210a200741b0016a21024100210e200721034101210b0340200141a0046a20024188016a28020010b8040240024020012802b00422090d0042002116420021130c010b200141086a20012903a004200141a0046a41086a29030020013502b8044200109f05200141086a41086a29030021132001290308211620012802b404450d002009102a0b201220132015201656201220135620122013511b22091b21122015201620091b21152003200220091b2103200e200b20091b210e200b41016a210b200241b0016a2202200a470d000b20030d01200441b0016c21092007210203402002106a200241b0016a2102200941d07e6a22090d000b0b41e789c50021022014a7450d072007102a0c070b200e20044f0d0320072004417f6a220941b0016c6a22024180016a290300211320024188016a290300211520024190016a290300211620024198016a2903002117200241e0006a2903002118200241e8006a2903002119200241f0006a290300211a200241f8006a290300211b200241c0006a290300211c200241c8006a290300211d200241d0006a290300211e200241d8006a290300211f200241206a2903002120200241286a2903002121200241306a2903002122200241386a2903002123200229030021242002290308212520022903102126200241186a2903002127200241a0016a2903002112200141306a41086a220b200241a8016a29030022283703002007200e41b0016c6a220241186a220e2903002129200e2027370300200229031021272002202637031020022903082126200220253703082002290300212520022024370300200241386a220e2902002124200e2023370200200241306a220e2902002123200e2022370200200241286a220e2902002122200e2021370200200241206a220e2902002121200e2020370200200241d8006a220e2902002120200e201f370200200241d0006a220e290200211f200e201e370200200241c8006a220e290200211e200e201d370200200241c0006a220e290200211d200e201c370200200241f8006a220e290200211c200e201b370200200241f0006a220e290200211b200e201a370200200241e8006a220e290200211a200e2019370200200241e0006a220e2902002119200e201837020020024198016a201737020020024190016a201637020020024188016a2203280200210e2003201537020020024180016a220329020021152003201337020020012012370330200241a0016a2012370200200241a8016a202837020020014198036a41f8006a201c37030020014198036a41f0006a201b37030020014198036a41e8006a201a37030020014198036a41e0006a201937030020014198036a41d8006a202037030020014198036a41d0006a201f37030020014198036a41c8006a201e37030020014198036a41c0006a201d37030020014198036a41386a202437030020014198036a41306a202337030020014198036a41286a202237030020014198036a41206a202137030020014198036a41186a202937030020014198036a4180016a2015370300200120273703a803200120263703a0032001202537039803200141a0046a41086a22024200370300200142003703a00441ac89c5004115200141a0046a1008200b2002290300370300200120012903a004370330200141103602a4042001200141306a3602a00420072009200141a0046a10ef0102402009450d00200441b0016c41d07e6a21092007210203402002106a200241b0016a2102200941d07e6a22090d000b0b02402014a7450d002007102a0b411310282202450d042002410f6a41002800e38945360000200241086a41002900dc8945370000200241002900d48945370000200241134126102c2202450d052002200e360013200141a8056a41186a22094200370300200141a8056a41106a220b4200370300200141a8056a41086a22034200370300200142003703a80520024117200141a8056a100020014190026a41186a200929030037030020014190026a41106a200b29030037030020014190026a41086a2003290300370300200120012903a805370390022002102a200141a0046a20014190026a10e003024020012802b004220b450d0020014190026a412010090b02400240200b450d00200141a8046a290300211220012903a004211320012802b40421030240200141a0046a41186a280200220a4105742209450d00200b2102034020022013201210aa02200241206a2102200941606a22090d000b0b200141c8046a2012370300200141c0046a2013370300200141b8046a200a360200200141b4046a2003360200200141b0046a200b360200200141ac046a200e360200200141a8046a41013a0000200141053a00a00441014100200141a0046a10cc01200141a0046a20014198036a418801109a051a20014190026a200041809c316a200141a0046a41004180de3410b7042001280290024101470d0120012802940221020c080b20014198036a106a0b410021020c060b1036000b200241081037000b200241081037000b41c489c500200e20041034000b411341011037000b412641011037000b200141f0056a240020020f0b41c4d1c3004133200141a0046a419cd9c3001038000b810601067f230041d0026b2202240002400240024002400240411a10282203450d00200341186a41002f00ce88453b0000200341106a41002900c68845370000200341086a41002900be8845370000200341002900b688453700002003411a4134102c2203450d012003200136001a200241c0016a41186a22014200370300200241c0016a41106a22044200370300200241c0016a41086a22054200370300200242003703c0012003411e200241c0016a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903c0013703002003102a200241003602c00120024120200241c0016a1006210320022802c0012201417f460d032003450d03200220033602282002200136022c20014104490d022003280000210620022001417c6a36022c2002200341046a360228200241c0016a200241286a10810120022802c0014113460d02200241386a200241c0016a418801109a051a02400240200228022c2207450d00200228022822012d0000210420022007417f6a220536022c2002200141016a360228200441034f0d00200541034b0d01200241386a106a0c040b200241386a106a0c030b2001280001210520022007417b6a36022c2002200141056a36022820022802382101200241c0016a200241386a410472418401109a051a200220022800303602202002200241336a28000036002320014113460d02200241386a200241c0016a418401109a051a20022002280023360033200220022802203602302003102a0c040b411a41011037000b413441011037000b41c4d1c3004133200241c8026a419cd9c3001038000b411321010b200241c0016a200241386a418401109a051a2002200228003336002b200220022802303602280240024020014113470d00200041133602000c010b20002001360200200041046a200241c0016a418401109a051a20004190016a20043a00002000418c016a200536020020004188016a2006360200200020022802283600910120004194016a200228002b3600000b200241d0026a24000bfb0202047f017e230041d0006b22022400024002400240411310282203450d002003410f6a41002800a88945360000200341086a41002900a18945370000200341002900998945370000200341134126102c2203450d0120032001360013200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034117200241286a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903283703002003102a2002410036022820024120200241286a100621010240024020022802282203417f460d002002200336022420022001360220200241286a200241206a106d20022802282204450d04200229022c210602402003450d002001102a0b20002006370204200020043602000c010b20004100360208200042013702000b200241d0006a24000f0b411341011037000b412641011037000b41c4d1c3004133200241c8006a419cd9c3001038000ba40301057f230041d0006b22022400024002400240411010282203450d00200341002900a68845370000200341086a41002900ae88453700002002429080808080023702242002200336022020012802002104200341104120102c2203450d0120032004360010200242a0808080c00237022420022003360220200141046a200241206a108f012002280228210320022802202101200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a220642003703002002420037033020012003200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a20062903003703002002200229033037030002402002280224450d002002280220102a0b410021032002410036023020024120200241306a100621010240024020022802302204417f470d00410021010c010b2004450d0320012d0000220441ff0071220341074f0d032001102a200441077621010b200020033a0001200020013a0000200241d0006a24000f0b411041011037000b412041011037000b41c4d1c3004133200241306a419cd9c3001038000bf00b04017f047e117f087e23004190046b22052400024002400240024020040d00420021064200210742002108420021090c010b42002108200541f0036a41186a220a4200370300200541f0036a41106a220b4200370300200541f0036a41086a220c4200370300200542003703f00341e588c500411d200541f0036a100020054198036a41186a220d200a29030037030020054198036a41106a220e200b29030037030020054198036a41086a220f200c290300370300200520052903f0033703980320054198016a20054198036a412010fd01200541c0016a41206a20054198016a41206a2d00003a0000200541c0016a41186a20054198016a41186a290300370300200541c0016a41106a20054198016a41106a290300370300200541c0016a41086a20054198016a41086a29030037030020052005290398013703c001200541e8016a200541c0016a10af0142002109420021064200210720052d00a8024107460d002004417f6a2110200541b8036a4104722111200541f0026a2112200541b0026a41206a2113200541b0026a41186a211442002106420021074200210842002109034020142007370300200520063703c002200520083703b002200520093703b8022013200541e8016a41c100109a0521040240024020122002460d00201220024120109c050d010b20112004290200370200201141086a200441086a2215290200370200201141106a200441106a2216290200370200201141186a200441186a2217290200370200200520013602b803411010282218450d03201841002900a68845370000201841086a41002900ae88453700002005429080808080023702e403200520183602e00320052802b8032119201841104120102c2218450d04200541203602e403200520052802e803221a41046a3602e803200520183602e0032018201a6a20193600002011200541e0036a108f0120052802e803211820052802e0032119200a4200370300200b4200370300200c4200370300200542003703f00320192018200541f0036a1000200d200a290300370300200e200b290300370300200f200c290300370300200520052903f00337039803024020052802e403450d0020052802e003102a0b20054198036a41204101410041001003417f470d0020052d0090032118200a2017290000370300200b2016290000370300200c2015290000370300200520042900003703f00320054188016a200541f0036a109d0220054188016a41086a290300211b200529038801211c02400240201820032018200341ff0171491b220441ff01710d00200541086a201c201b420a420010a005200541b8036a41186a200a290300370300200541b8036a41106a200b290300370300200541b8036a41086a200c290300370300200520052903f0033703b803200541186a2001200541b8036a4100201010cd03200541186a41186a290300211d200541186a41086a290300211e2005290328211f2005290318212020052903082221211c200541086a41086a2903002222211b0c010b200541c8006a201b42002004ad42ff018322214200109f05200541d8006a201c420020214200109f05200541b8036a41186a200a290300370300200541b8036a41106a200b290300370300200541b8036a41086a200c290300370300200520052903f0033703b803200541e8006a2001200541b8036a2004201010cd03200541386a42004200201c4200109f05427f200541d8006a41086a2903002221200529034820052903387c7c221d2005290350200529034084420052201d2021547222041b2122427f200529035820041b2121200541e8006a41186a290300211d200541e8006a41086a290300211e2005290378211f200529036821200b201b20077c201c20067c2207201c54ad7c201d7c2007201f7c2206200754ad7c2107202220097c202120087c2209202154ad7c201e7c200920207c2208200954ad7c21090b200541e8016a200541c0016a10af0120052d00a8024107470d000b0b2000200637031020002008370300200041186a20073703002000200937030820054190046a24000f0b411041011037000b412041011037000be907030b7f047e027f230041a0016b22012400024002400240024002400240411a10282202450d00200241186a41002f00ce88453b0000200241106a41002900c68845370000200241086a41002900be8845370000200241002900b688453700002002411a4134102c2202450d012002200036001a20014180016a41186a2203420037030020014180016a41106a2204420037030020014180016a41086a2205420037030020014200370380012002411e20014180016a1000200141286a41186a2003290300370300200141286a41106a2004290300370300200141286a41086a200529030037030020012001290380013703282002102a200141286a41201009411310282202450d022002410f6a41002800a88945360000200241086a41002900a18945370000200241002900998945370000200241134126102c2202450d032002200036001320014180016a41186a2205420037030020014180016a41106a2206420037030020014180016a41086a2203420037030020014200370380012002411720014180016a1000200141286a41186a22072005290300370300200141286a41106a22082006290300370300200141286a41086a200329030037030020012001290380013703282002102a200141286a41201009200141c8006a200010cb03200128024c21092001280248210a024020012802502202450d002002410574210b200141c8006a4104722103200a21020340200141086a41186a200241186a290000220c370300200141086a41106a200241106a290000220d370300200141086a41086a200241086a290000220e37030020012002290000220f3703082003200f370200200341086a200e370200200341106a200d370200200341186a200c37020020012000360248411010282204450d06200441002900a68845370000200441086a41002900ae88453700002001429080808080023702742001200436027020012802482110200441104120102c2204450d072001412036027420012001280278221141046a36027820012004360270200420116a20103600002003200141f0006a108f012001280278210420012802702110200542003703002006420037030020014180016a41086a2211420037030020014200370380012010200420014180016a10002007200529030037030020082006290300370300200141286a41086a2011290300370300200120012903800137032802402001280274450d002001280270102a0b200241206a2102200141286a41201009200b41606a220b0d000b0b02402009450d00200a102a0b200141a0016a24000f0b411a41011037000b413441011037000b411341011037000b412641011037000b411041011037000b412041011037000b801102047f027e230041e0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e1514000102030405060708090a0b0c0d0e0f10111213140b10a103000b20004102360200200041086a200141086a2903003703000c130b200241e0006a200141046a1070200041033602002000410c6a200241e8006a280200360200200020022903603702040c120b10bb03000b200241e0006a200141086a10ae02200041086a200241e0006a41e000109a051a200041053602000c100b200241e0006a200141086a10bc0320004106360200200041386a200241e0006a41306a290300370300200041306a200241e0006a41286a290300370300200041286a200241e0006a41206a290300370300200041206a200241e0006a41186a290300370300200041186a200241e0006a41106a290300370300200041106a200241e0006a41086a290300370300200041086a20022903603703000c0f0b200241e0006a41186a200141286a290000370300200241e0006a41106a200141206a290000370300200241e8006a200141186a290000370300200241e0006a41286a200141386a290000370300200241e0006a41306a200141c0006a290000370300200241e0006a41386a200141c8006a290000370300200241e0006a41c8006a200141d8006a290000370300200241e0006a41d0006a200141e0006a290000370300200241e0006a41d8006a200141e8006a2900003703002002200141106a2900003703602002200141306a290000370380012002200141d0006a2900003703a0012001410c6a2802002203417f4c0d0f200128020421010240024020030d0041012104410021050c010b20032105200310282204450d110b200420012003109a0521012002200241e0006a41e000109a0521042000410c6a2003360200200041086a200536020020002001360204200041106a200441e000109a051a200041073602000c0e0b200241e0006a200141086a10bd0320004108360200200041306a200241e0006a41286a290300370300200041286a200241e0006a41206a290300370300200041206a200241e0006a41186a290300370300200041186a200241e0006a41106a290300370300200041106a200241e0006a41086a290300370300200041086a20022903603703000c0d0b200241e0006a200141046a10c30320004109360200200041246a20024180016a2903003702002000411c6a200241f8006a290300370200200041146a200241f0006a2903003702002000410c6a200241e8006a290300370200200020022903603702040c0c0b200241e0006a200141046a10c3032000410a360200200041246a20024180016a2903003702002000411c6a200241f8006a290300370200200041146a200241f0006a2903003702002000410c6a200241e8006a290300370200200020022903603702040c0b0b200241e0006a200141086a10d3022000410b360200200041c0006a200241e0006a41386a290300370300200041386a200241e0006a41306a290300370300200041306a200241e0006a41286a290300370300200041286a200241e0006a41206a290300370300200041206a200241e0006a41186a290300370300200041186a200241e0006a41106a290300370300200041106a200241e0006a41086a290300370300200041086a20022903603703000c0a0b200241e0006a200141046a10be03200041046a200241e0006a41c400109a051a2000410c3602000c090b2000410d360200200020012802043602040c080b2001410c6a2802002203417f4c0d08200128020421010240024020030d0041002104410121050c010b20032104200310282205450d0b0b200520012003109a0521012000410c6a2003360200200041086a2004360200200020013602042000410e3602000c070b024002400240024002400240200141086a280200417f6a220341024b0d0020030e03010203010b418486c2001032000b200141386a2903002106200141306a290300210741012103024002402001410c6a2d00004101460d00200241e8006a2001411c6a290200370300200241e0006a41106a200141246a290200370300200241f8006a2001412c6a2d00003a00002002200141146a29020037036020012f000d2001410f6a2d0000411074722104200141106a2802002105410021030c010b200141106a28020021050b200241186a200241e0006a41186a280200360200200241106a200241e0006a41106a290300370300200241086a200241e0006a41086a29030037030020022002290360370300410121010c030b2001410c6a28020022034108762104410221010c010b2001410c6a28020022034108762104410321010b0b2000410f360200200041386a2006370300200041306a2007370300200041106a2005360200200041086a2001360200200041146a20022903003702002000410c6a2004410874200341ff0171723602002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a2802003602000c060b200241e0006a200141086a10bf03200041086a200241e0006a418001109a051a200041103602000c050b200241e0006a200141046a10c003200041113602002000412c6a20024188016a280200360200200041246a20024180016a2903003702002000411c6a200241f8006a290300370200200041146a200241f0006a2903003702002000410c6a200241e8006a290300370200200020022903603702040c040b200241e0006a200141046a10af02200041046a200241e0006a41e400109a051a200041123602000c030b10c103000b10d501000b200241e0006a200141086a10c20320004100360200200041106a200241e0006a41086a290300370300200041086a20022903603703000b200241e0016a24000f0b1036000b200341011037000b200341011037000bfe1a03087f047e037f23004180076b22042400200441c8036a200141a002109a051a200441e8016a200441c8036a10d10341012105024002400240024002400240024020042d00e8014101470d00200020042f00e9013b0001200041013a0000200041036a20042d00eb013a000020032802002106410021000c010b200441106a200441e8016a41086a41d801109a051a0240024002400240024002400240024002400240024020032802002206450d00200341086a28020021072003280204210841002109200441003602c8034188e8c2004110200441c8036a10062101024020042802c8032205417f460d002001450d0020054104490d02200128000021092001102a0b411410282201450d0241002105200141106a41002800eaa046360000200141086a41002900e2a046370000200141002900daa046370000200141144128102c2201450d0320012009360014200441e8016a41186a22094200370300200441e8016a41106a220a4200370300200441e8016a41086a220b4200370300200442003703e80120014118200441e8016a1000200441c0066a41186a2009290300370300200441c0066a41106a200a290300370300200441c0066a41086a200b290300370300200420042903e8013703c0062001102a200441203602cc032004200441c0066a3602c80320062007200441c8036a10cb012008450d002006102a0b200441086a200441106a41d0006a10f3012004280208210720042d000c2108200441c8036a200441106a41d801109a051a4100210120042903e803220c4202510d0c20044198066a41186a200441c8036a41186a29030037030020044198066a41106a200441c8036a41106a29030037030020044198066a41086a200441c8036a41086a290300370300200420042903c8033703980620044188046a290300210d20044180046a290300210e20044190046a280200210920042903f003210f200441e8016a41086a22014200370300200442003703e80141d9efc200410d200441e8016a1008200441c0066a41086a2001290300370300200420042903e8013703c006200441003602e801200441c0066a4110200441e8016a10062101024020042802e801220a417f460d002001450d00200a41034d0d042001102a0b0240200c4201520d00200f4200510d050b411310282201450d05200141002900cef0423700002001410f6a41002800ddf042360000200141086a41002900d6f04237000020044293808080b0023702fc05200420013602f80520044198066a200441f8056a108f01200428028006210120042802f805210a200441e8016a41186a220b4200370300200441e8016a41106a22104200370300200441e8016a41086a22114200370300200442003703e801200a2001200441e8016a1000200441c0066a41186a200b290300370300200441c0066a41106a2010290300370300200441c0066a41086a2011290300370300200420042903e8013703c006024020042802fc05450d0020042802f805102a0b200441003602e801200441c0066a4120200441e8016a1006210a0240024020042802e8012201417f470d00410021010c010b0240200a0d00410021010c010b20014104490d07200a2800002101200a102a0b200441c8036a41d0006a210a024020012009470d00411310282201450d0820084101712108200941016a2109200141002900cef0423700002001410f6a41002800ddf042360000200141086a41002900d6f04237000020044293808080b0023702fc05200420013602f80520044198066a200441f8056a108f01200428028006210120042802f805210b200441e8016a41186a22104200370300200441e8016a41106a22114200370300200441e8016a41086a22124200370300200442003703e801200b2001200441e8016a1000200441c0066a41186a2010290300370300200441c0066a41106a2011290300370300200441c0066a41086a2012290300370300200420042903e8013703c006024020042802fc05450d0020042802f805102a0b200420093602e801200441c0066a4120200441e8016a41041007200441e8016a2008200210b803024020042903e801220ca741ff01714101460d00200441e8016a41086a22014200370300200442003703e80141a8a0c6004117200441e8016a1008200441c0066a41086a22092001290300370300200420042903e8013703c0062004200c4220883e02e801200441c0066a4110200441e8016a41041007200441e8016a2007200810b90320042903e801220ca741ff01714101460d0020014200370300200442003703e801418ea0c600411a200441e8016a100820092001290300370300200420042903e8013703c0062004200c4220883e02e801200441c0066a4110200441e8016a410410070c0a0b200c420888a7220941ff01714104460d09200c421088a721010c0a0b41034102200120094b1b2101410021090c090b41c4d1c3004133200441e8016a419cd9c3001038000b411441011037000b412841011037000b41c4d1c3004133200441e8016a419cd9c3001038000b41fcf8c5001032000b411341011037000b41c4d1c3004133200441e8016a419cd9c3001038000b411341011037000b200441e8016a200e200d20044198066a200720082002109e020240024020042d00e8014101460d0020044194026a280200210920044190026a280200210b2004418c026a280200210720044184026a280200211020044180026a2802002108024020044188026a2802002201450d002001410c6c21022008210103400240200141046a280200450d002001280200102a0b2001410c6a2101200241746a22020d000b0b02402010450d002008102a0b02402009450d002009410c6c21022007210103400240200141046a280200450d002001280200102a0b2001410c6a2101200241746a22020d000b0b200b450d012007102a0c010b20042f01ea01210120042d00e9012209417e6a220241024b0d0120020e03000100000b200441e8016a200a10d203024020042d00e8014101460d0020044194026a280200210920044190026a280200210a2004418c026a280200210720044184026a280200210b20044180026a2802002108024020044188026a2802002201450d002001410c6c21022008210103400240200141046a280200450d002001280200102a0b2001410c6a2101200241746a22020d000b0b0240200b450d002008102a0b02402009450d002009410c6c21022007210103400240200141046a280200450d002001280200102a0b2001410c6a2101200241746a22020d000b0b200a450d032007102a0c030b20042f01ea01210120042d00e9012209417e6a220241024b0d0020020e03020002020b200a106a200441f0056a41026a200441f4056a41026a2d00003a0000200420042f00f4053b01f005200041036a20014108763a000020002001410874200941ff0171723b0001200041013a000020054521000b20000d032006450d03200341046a2802000d020c030b200441e0066a41186a20044198066a41186a290300370300200441e0066a41106a20044198066a41106a290300370300200441e0066a41086a20044198066a41086a29030037030020042004290398063703e006410121010b200441f8056a41186a2208200441e0066a41186a2202290300370300200441f8056a41106a220a200441e0066a41106a2209290300370300200441f8056a41086a220b200441e0066a41086a2207290300370300200420042903e0063703f805200441e8016a200441c8036a41d0006a418801109a051a200220082903003703002009200a2903003703002007200b290300370300200420042903f8053703e0064102210802402001450d00200441c0066a41186a2002290300370300200441c0066a41106a2009290300370300200441c0066a41086a2007290300370300200420042903e0063703c006410121080b200441a2066a200441c0066a41086a290300370100200441aa066a200441c0066a41106a290300370100200441b2066a200441c0066a41186a290300370100200420083a009906200420042903c00637019a06200441003a009806200441e0066a200441e8016a20044198066a10f401200441e8016a41026a200441eb066a2d00003a0000200420042f00e9063b01e80120042903e006210c024020042d00e80622014102460d0020044198066a41026a200441e8016a41026a2d00003a0000200420042f01e8013b0198060b200441ec056a41026a220220044198066a41026a2d00003a0000200420042f0198063b01ec05024020014102460d00200441e8016a41026a20022d00003a0000200420042f01ec053b01e8010b200441d4036a20013a0000200441d5036a20042f01e8013b0000200441d7036a200441e8016a41026a2d00003a00002004200c3702cc03200441003a00c8034101210941014100200441c8036a10cc01200441003602c8034188e8c2004110200441c8036a10062102024020042802c8032207417f460d002002450d0020074104490d03200228000021092002102a200941016a21090b200420093602c8034188e8c2004110200441c8036a410410072000410c6a20013a0000200041046a200c3702002000410d6a20042f01ec053b00002000410f6a200441ee056a2d00003a0000200041003a00002006450d012005450d01200341046a280200450d010b2006102a0b20044180076a24000f0b41c4d1c3004133200441e8016a419cd9c3001038000bf41f05017f037e077f017e037f230041a00a6b22022400420221030240024002400240024002400240024002400240024002400240200129036822044202520d00200220014198016a418801109a051a0c010b20024188026a200141dc006a29000037030020024180026a200141d4006a290000370300200241f8016a200141cc006a290000370300200241d0016a41206a200141c4006a290000370300200241d0016a41186a2001413c6a290000370300200241d0016a41106a200141346a290000370300200241d0016a41086a2001412c6a290000370300200220012900243703d00120024190026a41086a20014188016a29030037030020024190026a41106a20014190016a290300370300200220014180016a29030037039002200141f8006a2903002103200129037021052001280204210620012d00002107200241800a6a41026a2208200141036a2d00003a0000200241c8026a41086a2209200141106a290200370300200241c8026a41106a220a200141186a290200370300200241c8026a41186a220b200141206a280200360200200220012f00013b01800a200220012902083703c80202400240024020074101460d00200241e0096a41026a20082d00003a0000200241b0066a41086a2009290300370300200241b0066a41106a200a290300370300200241b0066a41186a200b2d00003a0000200220022f01800a3b01e009200220022903c8023703b0060c010b200241c0076a200641067610fe0120022802c00721070240024020022802c8072006413f7122064b0d00410021080c010b200241e0096a41026a200720064105746a220641026a2d00003a0000200241b8066a2006410f6a290000370300200241c0066a200641176a290000370300200241c8066a2006411f6a2d00003a0000200220062f00003b01e009200220062900073703b00620062800032106410121080b024020022802c407450d002007102a0b20080d00410121070c010b200241c0076a41026a200241e0096a41026a2d00003a0000200241c8026a41086a200241b0066a41086a290300370300200241c8026a41106a200241b0066a41106a290300370300200241c8026a41186a200241b0066a41186a2d00003a0000200220022f01e0093b01c007200220022903b0063703c802410021070b200241c0096a41026a2208200241c0076a41026a2d00003a0000200241a0056a41086a2209200241c8026a41086a290300370300200241a0056a41106a220a200241c8026a41106a290300370300200241a0056a41186a220b200241c8026a41186a2d00003a0000200220022f01c0073b01c009200220022903c8023703a00502402007450d00200041013b0001200041013a0000200041036a41003a000020014198016a106a0c0c0b200241b7026a2009290300370000200241bf026a200a290300370000200241c7026a200b2d00003a0000200220022f01c0093b01a802200220063600ab02200220022903a0053700af02200220082d00003a00aa02200241c0076a20014198016a418801109a051a200241c8086a41106a20024190026a41106a290300370300200241c8086a41086a20024190026a41086a29030037030020022002290390023703c80841002107200241800a6a410010f701200241c0096a41086a2002418b0a6a290000370300200241c0096a41106a200241930a6a290000370300200241d5096a200241800a6a41186a290000370000200220022900830a3703c00920022f01800a210b20022d00820a210c200241800a6a41086a22014200370300200242003703800a41d9efc200410d200241800a6a1008200241e0096a41086a2001290300370300200220022903800a3703e009200241003602800a200241e0096a4110200241800a6a10062101024020022802800a2206417f460d002001450d0020064104490d02200128000021072001102a0b41002106024020044201520d0020054200510d03417f21062007ad220d20032003200d541b220d200d20037d2005827d220d42ffffffff0f560d00200da721060b411010282201450d03200141086a41002900c6f042370000200141002900bef042370000200141104120102c2201450d0420012006360010200241800a6a41186a22074200370300200241800a6a41106a22084200370300200241800a6a41086a22094200370300200242003703800a20014114200241800a6a1000200241e0096a41186a2007290300370300200241e0096a41106a220a2008290300370300200241e0096a41086a2009290300370300200220022903800a3703e0092001102a4101210102400240200241e0096a41204101410041001003417f470d000c010b200241800a6a200610f701200241a0096a41086a2002418b0a6a290000370300200241a0096a41106a200241930a6a290000370300200241a0096a41156a2007290000370000200241e0096a41086a200241c0096a41086a290300370300200a200241c0096a41106a290300370300200241e0096a41156a200241c0096a41156a290000370000200220022900830a3703a009200220022903c0093703e00920022f01800a20022d00820a411074722106410021010b20024180096a41156a2207200241e0096a41156a29000037000020024180096a41106a2208200241e0096a41106a29030037030020024180096a41086a2209200241e0096a41086a290300370300200241e0086a41086a220a200241a0096a41086a290300370300200241e0086a41106a220e200241a0096a41106a290300370300200241e0086a41156a220f200241a0096a41156a290000370000200220022903e00937038009200220022903a0093703e00802402001450d00200241c0076a106a200041036a41003a0000200041800a3b0001200041013a00000c0c0b200241e8046a41156a22012007290000370000200241e8046a41106a22072008290300370300200241e8046a41086a22082009290300370300200241c8046a41086a2209200a290300370300200241c8046a41106a220a200e290300370300200241c8046a41156a220e200f29000037000020022002290380093703e804200220022903e0083703c80420024188056a41106a220f200241c8086a41106a29030037030020024188056a41086a2210200241c8086a41086a290300370300200220022903c80837038805200241b0066a41046a200241c0076a418801109a051a200241a0056a200241b0066a418c01109a051a200241c8026a200241a0056a41046a418801109a051a20024186046a200b200c41107472220b4110763a000020024184046a220c200b3b0100200241e0036a2003370300200241d8036a2005370300200241e8036a220b200229038805370300200241f0036a2010290300370300200241f8036a2210200f29030037030020024187046a20022903e8043700002002418f046a200829030037000020024197046a20072903003700002002419c046a2001290000370000200220043703d003200241a30136028004200241a6046a20064110763a0000200241a4046a220720063b0100200241a7046a20022903c804370000200241af046a2009290300370000200241b7046a200a290300370000200241bc046a200e290000370000410410282201450d05200242043702b406200220013602b006200241c8026a200241b0066a10eb010240024020022903d0034201510d000240024020022802b40620022802b8062201460d0020022802b00621060c010b200141016a22062001490d0c200141017422082006200820064b1b22084100480d0c0240024020010d002008102821060c010b20022802b00620012008102c21060b2006450d09200220083602b406200220063602b00620022802b80621010b2002200141016a3602b806200620016a41003a00000c010b20022903e00320022903d8032203420c882204420120044201561b8021040240024020022802b406220620022802b80622016b4102490d0020022802b00621060c010b200141026a22082001490d0b200641017422012008200120084b1b22014100480d0b0240024020060d002001102821060c010b20022802b00620062001102c21060b2006450d09200220013602b406200220063602b00620022802b80621010b2002200141026a3602b806200620016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b2010200241b0066a10a0012002200b3602a005200241a0056a200241b0066a10a30120022802800421080240024020022802b406220620022802b80622016b4104490d0020022802b00621060c010b200141046a22092001490d0a200641017422012009200120094b1b22014100480d0a0240024020060d002001102821060c010b20022802b00620062001102c21060b2006450d09200220013602b406200220063602b00620022802b80621010b2002200141046a3602b806200620016a20083600002002200241b0066a3602a005200c200241a0056a10c8012002200241b0066a3602a0052007200241a0056a10c80120022802b006210120022802b40621060240024020022802b80622074180024b0d00200241d0016a20012007200241a8026a10dd0321070c010b200241800a6a41186a22084200370300200241800a6a41106a22094200370300200241800a6a41086a220a4200370300200242003703800a20012007200241800a6a1000200241e0096a41186a2008290300370300200241e0096a41106a2009290300370300200241e0096a41086a200a290300370300200220022903800a3703e009200241d0016a200241e0096a4120200241a8026a10dd0321070b02402006450d002001102a0b2007450d0a200241b0016a41086a200241a8026a41086a290300370300200241b0016a41106a200241a8026a41106a290300370300200241b0016a41186a200241a8026a41186a29030037030020024188016a41086a200241e0036a29030037030020024188016a41106a200241e8036a29030037030020024188016a41186a200241f0036a290300370300200241a8016a200241f8036a290300370300200220022903a8023703b0012002200241d8036a2903003703880120022903d00321032002200241c8026a418801109a051a0b200041086a20022903b001370300200041286a2003370300200041306a200229038801370300200041206a200241b0016a41186a290300370300200041186a200241b0016a41106a290300370300200041106a200241b0016a41086a290300370300200041386a20024188016a41086a290300370300200041c0006a20024188016a41106a290300370300200041c8006a20024188016a41186a290300370300200041d0006a20024188016a41206a290300370300200041d8006a2002418801109a051a200041003a0000200241a00a6a24000f0b41c4d1c3004133200241800a6a419cd9c3001038000b41fcf8c5001032000b411041011037000b412041011037000b410441011037000b200841011037000b200141011037000b200141011037000b1031000b20004180083b0001200041013a0000200041036a41003a0000200241c8026a106a0b200241a00a6a24000be00402037f017e230041306b220224000240024020012802004110460d00200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a42003703000c010b024002400240024002400240200141086a2d00000e06050402010004050b200141c8006a21030c020b200141d0006a21030c010b200141186a21030b200241086a41086a220142003703002002420037030841affec5004111200241086a1008200241206a41086a20012903003703002002200229030837032020024100360208200241206a4110200241086a1006210102400240024020022802082204417f470d004280ade20421050c010b024020010d004280ade20421050c010b20044108490d01200129000021052001102a4280ade20420057d21050b024020032903002005560d00200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a42003703000c040b200041800c3b0001200041013a0000200041036a41003a00000c030b41c4d1c3004133200241086a419cd9c3001038000b200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a42003703000c010b2002411c6a41013602002002420137020c200241ccd1c50036020820024104360224200241ccd0c3003602202002200241206a360218200241086a41f0d0c300103e000b200241306a24000ba60201037f412e210241f8f4c50021030240024002402001417e6a22044102200441ff01714102491b41ff01710e03020001020b4130210241c8f4c50021030c010b20014180feff07714108762104024020014101710d00411f210241b4f5c50021030240024002400240024002400240200441ff01710e080006010203040508000b4120210241baf7c50021030c070b4127210241daf6c50021030c060b4117210241c3f6c50021030c050b41a4f6c50021030c040b4126210241fef5c50021030c030b412b210241d3f5c50021030c020b413921024181f7c50021030c010b411f210241daf7c500210302400240200441ff01710e03000102000b41c100210241baf8c50021030c010b41c100210241f9f7c50021030b20002002360204200020033602000b13002000410136020420004188bcc3003602000b3400200041e7bfc30036020420004100360200200041146a4102360200200041106a41f0bfc300360200200041086a42093702000b130020004101360204200041bcc2c3003602000b3101017f02404108102822020d00410841011037000b20004288808080800137020420002002360200200242dc0b3700000b130020004104360204200041e0c5c3003602000b3400200041beccc30036020420004100360200200041146a4101360200200041106a41d4ccc300360200200041086a42133702000beb050a067f017e017f017e017f017e017f017e017f017e230041206b2202240002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d022001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c37000020052008370000024020032001490d00200321040c030b2006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c370000200520083700002003410172220420014f0d022006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a22012900002108200020054105746a220041086a2205290000210a200041106a2204290000210c200041186a2203290000210e20012000290000370000200141186a220629000021102006200e370000200141106a2206290000210e2006200c370000200141086a2201290000210c2001200a370000200320103700002004200e3700002005200c370000200020083700000b200241206a24000f0b4190cec300200520011034000b4180cec300200420011034000be90609067f017e017f017e017f027e017f017e027f230041206b22022400024020014101762203450d0003402003417f6a2203210402400240024003402004410174220541017221060240200541026a220520014f0d00200620014f0d0220052006200020064105746a200020054105746a4120109c054100481b21060b200620014f0d03200420014f0d02200020044105746a2204200020064105746a22054120109c0541004e0d03200541086a22072900002108200541106a2209290000210a200541186a220b290000210c2004290000210d20042005290000370000200441186a220e290000210f200e200c370000200441106a220e290000210c200e200a370000200441086a2204290000210a20042008370000200b200f3700002009200c3700002007200a3700002005200d370000200621040c000b0b41c8cfc300200620011034000b41d8cfc300200420011034000b20030d000b0b0240024020014102490d002001210703402007417f6a220720014f0d02200241186a2209200041186a2204290000370300200241106a220b200041106a2205290000370300200241086a220e200041086a2203290000370300200020074105746a220641086a2900002108200641106a290000210a200641186a290000210c2000290000210d200020062900003700002004200c3700002005200a370000200320083700002002200d37030041002105024002400240034020062002290300370000200641186a2009290300370000200641106a200b290300370000200641086a200e2903003700002005410174220641017221040240200641026a220620074f0d00200420074f0d0220062004200020044105746a200020064105746a4120109c054100481b21040b200420074f0d03200520074f0d02200020054105746a2205200020044105746a22064120109c0541004e0d032009200541186a2203290000370300200b200541106a2210290000370300200e200541086a2211290000370300200641086a2900002108200641106a290000210a200641186a290000210c2005290000210d200520062900003700002003200c3700002010200a370000201120083700002002200d370300200421050c000b0b41c8cfc300200420071034000b41d8cfc300200520071034000b200741014b0d000b0b200241206a24000f0b4190cec300200720011034000b9009030a7f017e0a7f230041c0006b22022400200041807f6a21032001417f6a2104200141324921054101210641002107024003400240024020062001490d00410021080c010b41012108200020064105746a2209200941606a4120109c054100480d0003404101210a20042006460d03200641016a2106200941206a220a20094120109c052108200a21092008417f4a0d000b200620014921080b2006200146210a20050d0120062001460d01024002400240024002402006417f6a220920014f0d002008450d0120002006410574220b6a220a290000210c200a200020094105746a22092900003700002009200c370000200a41086a220d290000210c200d200941086a22082900003700002008200c370000200a41106a220e290000210c200e200941106a220f290000370000200f200c370000200a41186a2210290000210c2010200941186a22112900003700002011200c37000020064102490d04200920002006417e6a22124105746a22134120109c05417f4a0d042009290000210c20092013290000370000200241206a41186a22142011290000370300200241206a41106a2215200f290000370300200241206a41086a221620082900003703002008201341086a290000370000200f201341106a2900003700002011201341186a2900003700002002200c370320024020120d00410021120c040b200241206a20002006417d6a22084105746a4120109c05417f4a0d032003200b6a21090340200941d8006a200941386a290000370000200941d0006a200941306a290000370000200941c8006a200941286a290000370000200941c0006a200941206a2900003700002008450d032008417f6a2108200241206a20094120109c05210f200941606a2109200f4100480d000b200841016a21120c030b4180cec300200920011034000b4190cec300200620011034000b410021120b200020124105746a22092002290320370000200941186a2014290300370000200941106a2015290300370000200941086a20162903003700000b200741016a21070240200120066b220f4102490d00200a41206a2209200a4120109c05417f4a0d00200a290000210c200a2009290000370000200241206a41186a22112010290000370300200241206a41106a2213200e290000370300200241206a41086a2212200d290000370300200d200941086a290000370000200e200941106a2900003700002010200941186a2900003700002002200c3703204101210d0240200f4103490d00200a41c0006a2209200241206a4120109c05417f4a0d00410321084102210e02400340200e410574200a6a41606a220d2009290000370000200d41186a200941186a290000370000200d41106a200941106a290000370000200d41086a200941086a2900003700002008200f4f0d0120084105742109200e210d2008210e200841016a2108200a20096a2209200241206a4120109c054100480d000c020b0b200e210d0b200a200d4105746a22092002290320370000200941186a2011290300370000200941106a2013290300370000200941086a20122903003700000b20074105470d000b4100210a0b200241c0006a2400200a0b8305010f7f230041a0026b22042400200441c0016a41386a2205200041386a2206290000370300200441c0016a41306a2207200041306a2208290000370300200441c0016a41286a2209200041286a220a290000370300200441c0016a41206a220b200041206a220c290000370300200441c0016a41186a220d200041186a220e290000370300200441c0016a41106a220f200041106a2210290000370300200441c0016a41086a2211200041086a2212290000370300200420002900003703c0010240024020012002200441c0016a2003100a0d00410121000c010b20052006290000370300200720082900003703002009200a290000370300200b200c290000370300200d200e290000370300200f20102900003703002011201229000037030020044188026a2205200341086a29000037030020044190026a2206200341106a29000037030020044198026a2207200341186a290000370300200420002900003703c00120042003290000370380022004200441c0016a41e000109a05220041c0016a200041e000109a051a200041e0006a41386a200041386a290000370300200041e0006a41306a200041306a290000370300200041e0006a41286a200041286a290000370300200041e0006a41206a200041206a290000370300200041e0006a41186a200041186a290000370300200041e0006a41106a200041106a290000370300200041e0006a41086a200041086a29000037030020002000290000370360200041a0016a41186a2007290300370300200041a0016a41106a2006290300370300200041a0016a41086a200529030037030020002000290380023703a00120012002200041e0006a200041a0016a10164521000b200441a0026a240020000bc50101037f230041206b220224002002410036021020014110200241106a10062101024002400240024020022802102203417f460d0020010d010b200041003602040c010b200220013602082002200336020c20034104490d0120022003417c6a36020c2002200141046a36020820012800002103200241106a200241086a10820120022802102204450d012000200229021437020820002004360204200020033602002001102a0b200241206a24000f0b41c4d1c3004133200241106a419cd9c3001038000be80201057f230041b0036b22022400200241003602a80220014110200241a8026a1006210302400240024020022802a8022201417f470d00200041133602000c010b20022001360294012002200336029001200241a8026a20024190016a10810120022802a8024113460d01200241a0016a200241a8026a418801109a051a024002402002280294012204450d0020022802900122052d0000210620022004417f6a360294012002200541016a3602900120064103490d010b200241a0016a106a0c020b20022802a00121042002410c6a200241a0016a410472418401109a051a2002200228009901360204200220024199016a41036a28000036000720044113460d0120002004360200200041046a2002410c6a418401109a051a20004188016a20063a000020002002280204360089012000418c016a20022800073600002001450d002003102a0b200241b0036a24000f0b41c4d1c3004133200241a8026a419cd9c3001038000bdb0102027f037e230041206b220224002002410036021020014120200241106a10062101024002400240024020022802102203417f460d0020010d010b200041003602100c010b200220013602082002200336020c20034110490d012002200341706a36020c2002200141106a360208200141086a290000210420012900002105200241106a200241086a106d20022802102203450d0120022902142106200020043703082000200537030020002006370214200020033602102001102a0b200241206a24000f0b41c4d1c3004133200241106a419cd9c3001038000bc40101037f230041206b220224002002410036021020014120200241106a10062101024002400240024020022802102203417f460d0020010d010b200041003602040c010b200220013602082002200336020c20034104490d0120022003417c6a36020c2002200141046a36020820012800002103200241106a200241086a106d20022802102204450d012000200229021437020820002004360204200020033602002001102a0b200241206a24000f0b41c4d1c3004133200241106a419cd9c3001038000bd20101037f230041106b22022400200241003602082002420137030020012d00002103410110282104024002400240024020034101460d002004450d02200242818080801037020420022004360200200441003a0000200141086a200210e3030c010b2004450d02200242818080801037020420022004360200200441013a00002002200236020c200141016a2002410c6a10c8010b2002280204210420004120200228020022012002280208100702402004450d002001102a0b200241106a24000f0b410141011037000b410141011037000ba60a02067f027e230041106b2202240020002802102103200041186a2802002204200110b4010240024002400240024002400240024002400240200141046a2802002205200141086a28020022066b2004490d00200128020021050c010b200620046a22072006490d08200541017422062007200620074b1b22064100480d080240024020050d002006102821050c010b200128020020052006102c21050b2005450d0120012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a20032004109a051a200028021c210502400240200141046a2802002206200728020022046b4104490d00200128020021060c010b200441046a22032004490d08200641017422042003200420034b1b22044100480d080240024020060d002004102821060c010b200128020020062004102c21060b2006450d0220012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a20053600002002200136020c2000412c6a2002410c6a10c801200041086a29030021082000290300210902400240200141046a2802002206200328020022046b4110490d00200128020021060c010b200441106a22052004490d08200641017422042005200420054b1b22044100480d080240024020060d002004102821060c010b200128020020062004102c21060b2006450d0320012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000280220210302400240200141046a2802002206200528020022046b4104490d00200128020021060c010b200441046a22052004490d08200641017422042005200420054b1b22044100480d080240024020060d002004102821060c010b200128020020062004102c21060b2006450d0420012006360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200620046a20033600000240024020002802244101460d0002400240200141046a28020020052802002200460d00200128020021040c010b200041016a22042000490d0a200041017422062004200620044b1b22064100480d0a0240024020000d002006102821040c010b200128020020002006102c21040b2004450d0720012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a00000c010b02400240200141046a28020020052802002204460d00200128020021060c010b200441016a22062004490d09200441017422052006200520064b1b22054100480d090240024020040d002005102821060c010b200128020020042005102c21060b2006450d0720012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a00002000280228210602400240200141046a2802002204200528020022006b4104490d00200128020021040c010b200041046a22052000490d09200441017422002005200020054b1b22004100480d090240024020040d002000102821040c010b200128020020042000102c21040b2004450d0820012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20063600000b200241106a24000f0b200641011037000b200441011037000b200441011037000b200441011037000b200641011037000b200541011037000b200041011037000b1031000b910101047f230041106b2201240041002102200141003602044188e8c2004110200141046a1006210302400240024020012802042204417f470d000c010b024020030d000c010b20044104490d01200328000021042003102a4188e8c20041101009410121020b2000200236020020002004360204200141106a24000f0b41c4d1c3004133200141086a419cd9c3001038000bfb0103017f017e027f230041206b2201240042002102200141106a41086a220342003703002001420037031041affec5004111200141106a1008200141086a2003290300370300200120012903103703002001410036021020014110200141106a100621030240024020012802102204417f460d002003450d0020044108490d01200329000021022003102a0b200141106a41086a220342003703002001420037031041affec5004111200141106a1008200141086a2003290300370300200120012903103703002001200220007c37031020014110200141106a41081007200141206a24000f0b41c4d1c3004133200141106a419cd9c3001038000b1300200041053602042000418cdac3003602000b3400200041a4d5c30036020420004100360200200041146a4107360200200041106a41e4ecc300360200200041086a42083702000b3701017f02404110102822020d00411041011037000b2002420037000820024201370000200042908080808002370204200020023602000bc70101017f23004190016b22022400200241003a00782002428080848080023703682002420137035820024201370350200242af0137034820024287013703402002420137033820024201370330200242013703282002420137032020024201370318200242013703102002420137030820024280808080c00037036020024280808180800437037020024100360288012002420137038001200241086a20024180016a10ee01200041086a200228028801360200200020022903800137020020024190016a24000b130020004110360204200041c0f6c3003602000b3301017f02404108102822020d00410841011037000b2000428880808080013702042000200236020020024280ade2043700000b3201017f02404104102822020d00410441011037000b20004284808080c000370204200020023602002002418080013600000b3101017f02404104102822020d00410441011037000b20004284808080c0003702042000200236020020024180083600000b3101017f02404108102822020d00410841011037000b20004288808080800137020420002002360200200242e8073700000b3c01017f02404110102822020d00411041011037000b2002420037000820024280a094a58d1d370000200042908080808002370204200020023602000b3b01017f02404110102822020d00411041011037000b2002420037000820024280c8afa025370000200042908080808002370204200020023602000b3e01017f02404110102822020d00411041011037000b20024200370008200242808086bdbacdd21a370000200042908080808002370204200020023602000b3f01017f02404110102822020d00411041011037000b200242003700082002428080a8ec85afd1b101370000200042908080808002370204200020023602000b3001017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241083600000b3001017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241023600000bc81603027f047e117f230041a0096b22072400200741e0006a41186a200141186a290000370300200741e0006a41106a200141106a290000370300200741e0006a41086a200141086a2900003703002007200129000037036020074180016a41186a200241186a29000037030020074180016a41106a200241106a29000037030020074180016a41086a200241086a2900003703002007200229000037038001200628020021012006280204210220062802082108200741d0006a10f6030240024002400240024020072903502209200741d0006a41086a290300220a8450450d004200210b4200210c0c010b200741306a200a420020054200109f05200741c0006a2009420020054200109f05200741206a4200420020094200109f0502402007290338200729032884420052200741c0006a41086a290300220b200729033020072903207c7c220c200b5472450d004127210641a6b5c00021080c020b2007290340210b0b200741c0016a200741e0006a200b200c41081098024101210d20072802c0014101470d0120072802c801210620072802c40121080b2000200836020420004101360200200041146a41003602002000410c6a4201370200200041086a20063602002002450d012001102a0c010b200741c0016a41106a290300210b20072903c801210c200741a0016a41186a220e200a370300200720093703b001200720053703a801200720053703a001200741c0016a10f703200741c0026a4200370300200741f0026a4200370300200741e0026a4200370300200741d0026a42003703002007428080e983b1de163703b80220074280a094a58d1d3703e80220074280a094a58d1d3703d80220074280a094a58d1d3703c802200742808880808080103703f8022007200741c0016a360280032007200741c0016a36028403200741d0056a41186a220f200741e0006a41186a290300370300200741d0056a41106a2206200741e0006a41106a290300370300200741d0056a41086a2210200741e0006a41086a290300370300200720072903603703d00510a00321051098012111200741c0036a4200370300200741b4036a41d0b5c000360200200741b0036a4101360200200741a8036a4200370300200741a4036a41f8b9c000360200200741e0036a2010290300370300200741e8036a2006290300370300200741f0036a200f29030037030020074200370390032007428080808080013703b803200741003602a003200720072903d0053703d803200720074184036a3602d003200720074180036a3602cc032007200741c0016a3602c803200720113602d4032007200537038803200f20074180016a41186a290300370300200620074180016a41106a290300370300201020074180016a41086a29030037030020072007290380013703d005200720083602a804200720023602a404200720013602a004200741f8036a20074188036a200741d0056a20032004200741a0016a200741a0046a10c101024020072802f8030d00200741f8036a41106a2d00000d00200741d0056a41086a200741a8036a290300370300200741a0046a41086a200741dc056a280200360200200720072903a0033703d005200720072902d4053703a00420074198096a200741a0046a1092014100210d0b200720072903b001200e29030020072903a80122054200109f0520072903a00120057d10e503200741106a200741e0006a2007290300200741086a29030010d0012006200b200741106a41086a29030022097d200c2007290310220554ad7d2009200b7d2005200c54ad7d2005200c582009200b582009200b5122021b22011b220a3703002007200c20057d2005200c7d20011b22033703d80520072005200c562009200b5620021b2202ad22053703d00541012101024020020d00200720033703a0042007200a3703a8042007200741a0046a3602e007200741e0076a109d014100210120072903d00521050b0240024020054200520d002001450d01200720103602a004200741a0046a109d010c010b200720103602a004200741a0046a109c010b20072802c403210120072802c0032106200720072802bc032202360298042007200636029404200720023602900420072002200141b0016c6a221236029c0402402001450d00200741e0076a410172211320074187076a2114200741e9076a210820074180076a4102722110200741d0056a41106a2115200741f8056a2116200741b4066a211720074191066a210f200741f1056a210e200741d0056a4101722118200741c8066a2119034020022d00002101200741a0046a200241016a41af01109a051a0240024020014103460d00200720013a00d0052018200741a0046a41af01109a052106024002400240024020010e03000102000b20072802d805211a20072802dc05210620072802d40521012014201541d800109a051a2007410c3a00e007201320074180076a41df00109a051a20012006200741e0076a10cc0141012106410021110240201a450d002001102a0b4100211a0c020b200741e8086a41186a2201200641186a2211290000370300200741e8086a41106a221a200641106a221b290000370300200741e8086a41086a221c200641086a221d290000370300200720062900003703e808200741e0076a2016418801109a051a20102006290000370000201041086a201d290000370000201041106a201b290000370000201041186a201129000037000020074180023b01800720074188096a200741e0076a20074180076a10f40120072d0090092106200820072903e808370000200841086a201c290300370000200841106a201a290300370000200841186a2001290300370000200741043a00e8072007410c3a00e007200720064102463a008908410021064101211141014100200741e0076a10cc014100211a0c010b2019290300210520072903c0062109200741e8086a41186a200641186a290000370300200741e8086a41106a200641106a290000370300200741e8086a41086a200641086a290000370300200720062900003703e80820074180076a41186a200e41186a29000037030020074180076a41106a200e41106a29000037030020074180076a41086a200e41086a2900003703002007200e29000037038007200741e0076a41186a200f41186a290000370300200741e0076a41106a200f41106a290000370300200741e0076a41086a200f41086a2900003703002007200f2900003703e00720074188096a41086a201741086a2802003602002007201729020037038809200741e8086a20074180076a200741e0076a2009200520074188096a10f80341012111410121064101211a0b024020072d00d005220141014b0d000240024020010e020001000b2011450d03024020072802d805450d0020072802d405102a0b20072d00e0054105490d03200728028806450d03200728028406102a0c030b2006450d022016106a0c020b201a20072802b80645720d0120072802b406102a0c010b2007200241b0016a360298040c020b200241b0016a22022012470d000b20072012360298040b20074190046a1069200041106a200741f8036a41106a290300370200200041086a200741f8036a41086a290300370200200020072903f80337020002402007280294032202450d0020074188036a41106a280200450d002002102a0b200d450d0020074188036a411c6a280200210220072802ac0321080240024020072802a80322060d00200221010c010b2006210020022101034020012802880b21012000417f6a22000d000b0340200220022f01064102746a41880b6a28020021022006417f6a22060d000b0b200741d0056a411c6a20022f0106360200200741e8056a4100360200200741e4056a2002360200200720083602f005200741003602e005200742003703d805200720013602d405200741003602d005200741d0056a109b010b200741a0096a24000bc70104017f017e027f017e230041206b2201240042002102200141106a41086a22034200370300200142003703104188d9c3004111200141106a1008200141086a2003290300370300200120012903103703002001410036021020014110200141106a1006210302400240024020012802102204417f470d00420121050c010b20044110490d01200341086a2900002102200329000021052003102a0b2000200537030020002002370308200141206a24000f0b41c4d1c3004133200141106a419cd9c3001038000be20301047f23004190026b2201240020014190016a41086a22024200370300200142003703900141c0fec500411820014190016a100820014180016a41086a2002290300370300200120012903900137038001200141003602900120014180016a411020014190016a100621030240024002402001280290012204417f470d00410221020c010b2001200436028c02200120033602880220014190016a20014188026a10ea0120012d00800222024102460d01200141106a20014190016a41f000109a051a200120014184026a28000036000b20012001280081023602082004450d002003102a0b20014190016a200141106a41f000109a051a2001200128000b3600830120012001280208360280010240024020024102470d002000428080818080043703682000428080848080023703602000420137035020004201370348200042af0137034020004287013703382000420137033020004201370328200042013703202000420137031820004201370310200042013703082000420137030020004280808080c000370358410021020c010b200020014190016a41f000109a05220441f4006a20012800830136000020042001280280013600710b200020023a007020014190026a24000f0b41c4d1c3004133200141106a419cd9c3001038000b891d01117f230041b0036b2206240020064190026a2000108c01410221070240024020062d00900222084102470d00410121094134210a410221080c010b20064190036a41086a2209200641a4026a29020037030020064190036a41106a220b200641ac026a29020037030020064190036a41186a220c200641b4026a290200370300200641e8026a41086a220d200641c8026a290300370300200641e8026a41106a220e200641d0026a290300370300200641e8026a41186a220f200641d8026a290300370300200641e8026a41206a2210200641e0026a29030037030020062006419c026a290200370390032006200641c0026a2903003703e80220064190026a41086a280200210a024020080d00200641bc026a2802002107200641e8016a41186a200c290300370300200641e8016a41106a200b290300370300200641e8016a41086a2009290300370300200641c0016a41086a200d290300370300200641c0016a41106a200e290300370300200641c0016a41186a200f290300370300200641c0016a41206a201029030037030020062006290390033703e801200620062903e8023703c0010b41022108024020074102470d00410121094134210a0c010b200641e8026a41186a200641e8016a41186a290300370300200641e8026a41106a200641e8016a41106a290300370300200641e8026a41086a200641e8016a41086a29030037030020064190026a41086a200641c0016a41086a29030037030020064190026a41106a200641c0016a41106a29030037030020064190026a41186a200641c0016a41186a29030037030020064190026a41206a200641c0016a41206a290300370300200620062903e8013703e802200620062903c0013703900241002109200721080b200641a0016a41086a2207200641e8026a41086a290300370300200641a0016a41106a220b200641e8026a41106a290300370300200641a0016a41186a220c200641e8026a41186a290300370300200641f8006a41086a220d20064190026a41086a290300370300200641f8006a41106a220e20064190026a41106a290300370300200641f8006a41186a220f20064190026a41186a290300370300200641f8006a41206a221020064190026a41206a290300370300200620062903e8023703a00120062006290390023703780240024020090d00200641d0006a22112006290378370300200641346a20072903003702002006413c6a200b290300370200200641c4006a200c290300370200200641d8006a200d290300370300200641e0006a200e290300370300200641e8006a200f290300370300200641f0006a20102903003703002006200a360228200620062903a00137022c2006200836024c41012109109801210d0240024020084101470d002011280200200d460d010b20064190026a2001108c010240024020062d009002220a4102470d00412e210a419d8fc400210b0c010b200641e8016a41026a20062d0093023a0000200641e8026a41086a2209200641a4026a280200360200200620062f0091023b01e80120062006419c026a2902003703e802200641ac026a2802002108200641a8026a28020021070240200a0d0041012109412e210a419d8fc400210b024020080d000c020b2007102a0c010b20064190026a41086a280200210a200628029402210b200641a0016a41026a200641e8016a41026a2d00003a0000200641c0016a41086a2009280200360200200620062f01e8013b01a001200620062903e8023703c001200641b0026a2d0000210c410021090b2006418c026a41026a200641a0016a41026a2d00003a000020064190036a41086a220e200641c0016a41086a280200360200200620062f01a0013b018c02200620062903c0013703900320090d002006418b016a200e280200360000200620062f018c023b01782006200a36007f2006200b36007b2006200629039003370083012006200c3a00970120062008360093012006200736008f0120062006418e026a2d00003a007a200628024c211220062802502113200620052802002211200541086a28020022144105746a3602940320062011360290032006200641286a3602980320064190026a20064190036a106802400240024002400240024002400240024002402006280290020d0041002109200641003602f001200642043703e801410421074100210a0c010b411010282207450d012007200629039002370200200741086a20064190026a41086a220b290300370200200641c0016a41086a20064190036a41086a28020036020020062006290390033703c001200641e8026a200641c0016a10680240024020062802e8020d00410121094101210a0c010b410121084101210a0340200b200641e8026a41086a290300370300200620062903e8023703900202400240200a2008460d00200841016a21090c010b200841016a22092008490d082008410174220a2009200a20094b1b220a41ffffffff0071200a470d08200a410474220c4100480d080240024020080d00200c102821070c010b20072008410474200c102c21070b2007450d050b200720084104746a2208200629039002370200200841086a200b290300370200200641e8026a200641c0016a10682009210820062802e8020d000b0b200620093602f0012006200a3602ec01200620073602e8010b200641286a41186a28020021082006280238210b2006410036029002200b200820064190026a100d2110200628029002220f417f460d02200641e8026a41186a200241186a290000370300200641e8026a41106a200241106a290000370300200641e8026a41086a200241086a290000370300200620022900003703e802200641003602980320064201370390032010200f20064190036a10b20202400240200628029403220e200628029803220c6b4120490d00200c41206a210b20062802900321080c010b200c41206a220b200c490d05200e4101742208200b2008200b4b1b22154100480d0502400240200e0d002015102821080c010b200628029003200e2015102c21080b2008450d04200620153602940320062008360290032015210e0b2006200b360298032008200c6a220c20062903e802370000200c41086a200641e8026a41086a290300370000200c41106a200641e8026a41106a290300370000200c41186a200641e8026a41186a29030037000020064190026a41186a220c420037030020064190026a41106a2215420037030020064190026a41086a2216420037030020064200370390022008200b20064190026a1000200641c0016a41186a200c290300370300200641c0016a41106a2015290300370300200641c0016a41086a201629030037030020062006290390023703c0010240200e450d002008102a0b0240200f450d002010102a0b0240200641c0016a200641f8006a4120109c050d000240024020090d004100210b0c010b2009410474210c2007410c6a21084100210b03402008280200200b6a210b200841106a2108200c41706a220c0d000b0b20062006280244200b6b360244411710282208450d06200d201320141b210f4101201220141b2110200641286a41106a210b200841002900f1d8433700002008410f6a4100290080d943370000200841086a41002900f9d84337000020064297808080f002370294032006200836029003200020064190036a108f012006280298032115200628029003211620064190026a41186a2208420037030020064190026a41106a220c420037030020064190026a41086a220e420037030020064200370390022016201520064190026a1000200641e8026a41186a2008290300370300200641e8026a41106a200c290300370300200641e8026a41086a200e29030037030020062006290390023703e8020240200628029403450d00200628029003102a0b200641e8026a41201009200c2004370300200641c0026a200f360200200641bc026a2010360200200641b8026a200d360200200641b4026a20062802443602002008200b29030037030020064190026a41206a200b41086a280200360200200641c4026a2002290000370200200641cc026a200241086a290000370200200641d4026a200241106a290000370200200641dc026a200241186a2900003702002006200337039802200641003a009002200120064190026a109a01200641186a2000109101200641186a41086a29030021032006290318210420064190026a200042004200109401024002402006290390024200520d002006200e3602e802200641e8026a109c010c010b2006200e3602e802200641e8026a109d010b200641086a20012004200310d0012006200641106a290300370398022006200629030837039002200620064190026a3602e802200641e8026a109c0102402009450d0020094104742109200741046a210803400240200841046a280200450d002008280200102a0b200841106a2108200941706a22090d000b0b0240200a450d002007102a0b200541046a280200450d0b2011102a0c0b0b200720094104746a2101200721082009450d0620072108034002402008280200220b0d00200841106a21080c080b200841046a2802002109200841086a28020021002008410c6a280200210c200628024021022006280238210d20064190026a41186a220e420037030020064190026a41106a220f420037030020064190026a41086a221042003703002006420037039002200b412020064190026a1000200641e8026a41186a200e290300370300200641e8026a41106a200f290300370300200641e8026a41086a201029030037030020062006290390023703e802200d2002200641e8026a41202009200c100502402000450d002009102a0b200841106a22082001470d000c080b0b411041041037000b200c41041037000b41eef3c50041381050000b201541011037000b1031000b411741011037000b20082001460d0003402008280200450d010240200841086a280200450d00200841046a280200102a0b200841106a22082001470d000b0b200a450d002007102a0b2006413c6a280200450d002006280238102a0b200541046a280200450d002005280200102a0b200641b0036a24000bf46504177f017e077f017e23004180036b2204240041002105200441003602f002200420023602ec02200420013602e8020240024002400240024002400240200241034b0d0041012106200441013a00d002200441ec016a4101360200200442013702dc01200441a4e2c5003602d801200441263602c4022004200441c0026a3602e8012004200441d0026a3602c00220044180016a200441d8016a10332004280280012107200428028401210820042802880121094105210a4100210b0c010b200441043602f002024020012800004180c2cdeb06460d004101210a410121060c010b024002402002417c714104460d00200241074b0d0141082002103c000b41012106200441013a00d002200441ec016a4101360200200442013702dc01200441a4e2c5003602d801200441263602c4022004200441c0026a3602e8012004200441d0026a3602c00220044180016a200441d8016a10332004280280012107200428028401210820042802880121094105210a410021054100210b0c010b200441083602f002410121060240200128000422074101460d004102210a0c010b200441d8016a200441e8026a10fa0402400240024020042802d8014101470d00410421084100210c410021090c010b200441d8016a410572210d41042108412c210a410021054100210c410021094100210b02400340200441d0026a41026a2201200d41026a2d00003a00002004200d2f00003b01d002200428028802210e200428028402210f200428028002211020042802fc01211120042802f801211220042802f401211320042802f001211420042802ec01211520042802e801211620042802e401211720042802e0012118024020042d00dc012206417e6a41ff0171410b4b0d0041002119024002400240024002400240024002400240024002400240024020060e100c0c000102030405060708090a0b0c0c0c0b410121190c0b0b410221190c0a0b410321190c090b410421190c080b410521190c070b410621190c060b410721190c050b410821190c040b410921190c030b410a21190c020b410b21190c010b410c21190b0240200b41ff0171221a20194d0d004113210a0c030b41002119024002400240024002400240024002400240024002400240024020060e100c0c000102030405060708090a0b0c0c0c0b410121190c0b0b410221190c0a0b410321190c090b410421190c080b410521190c070b410621190c060b410721190c050b410821190c040b410921190c030b410a21190c020b410b21190c010b410c21190b0240201a2019470d004114210a0c030b4100210b02400240024002400240024002400240024002400240024020060e100c0c000102030405060708090a0b0c0c0c0b4101210b0c0b0b4102210b0c0a0b4103210b0c090b4104210b0c080b4105210b0c070b4106210b0c060b4107210b0c050b4108210b0c040b4109210b0c030b410a210b0c020b410b210b0c010b410c210b0b20044180016a41026a221920012d00003a0000200420042f01d0023b01800102400240200c2009470d00200c41016a2201200c490d0720052001200520014b1b2209ad42307e221b422088a70d07201ba722014100480d0702400240200c0d002001102821080c010b2008200a41546a2001102c21080b2008450d010b2008200a6a220141546a20063a00002001200e3602002001417c6a200f360200200141786a2010360200200141746a2011360200200141706a20123602002001416c6a2013360200200141686a2014360200200141646a2015360200200141606a20163602002001415c6a2017360200200141586a2018360200200141556a220120042f0180013b0000200141026a20192d00003a0000200541026a2105200a41306a210a200c41016a210c200441d8016a200441e8026a10fa0420042802d8014101460d030c010b0b200141041037000b024002402006410e4b0d00024002400240024002400240024002400240024002400240024020060e0f0001020304050607080e090e0a0b0c000b2017450d0d2018102a0c0d0b02402017450d002018102a0b2014450d0c2015102a0c0c0b02402016450d00201641047421062018210103400240200141046a280200450d002001280200102a0b200141106a2101200641706a22060d000b0b2017450d0b2018102a0c0b0b02402016450d00201641286c21062018210103400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101200641586a22060d000b0b2017450d0a2018102a0c0a0b2017450d092018102a0c090b2017450d082018102a0c080b2017450d072018102a0c070b02402016450d00201820164104746a2114201821160340024020162802082206450d0020162802002101200641047421060340024020012d00004109470d000240200141046a220d280200220528020441ffffffff0371450d002005280200102a200d28020021050b2005102a0b200141106a2101200641706a22060d000b0b201641106a21010240201641046a280200450d002016280200102a0b2001211620012014470d000b0b2017450d062018102a0c060b02402016450d00201641146c21062018210103400240200141046a280200450d002001280200102a0b200141146a21012006416c6a22060d000b0b2017450d052018102a0c050b02402016450d0020182016411c6c6a2114201821160340024020162802042201450d0002402016410c6a2802002206450d00200641047421060340024020012d00004109470d000240200141046a220d280200220528020441ffffffff0371450d002005280200102a200d28020021050b2005102a0b200141106a2101200641706a22060d000b0b201641086a280200450d002016280204102a0b2016411c6a21010240201641146a280200450d002016280210102a0b2001211620012014470d000b0b2017450d042018102a0c040b02402016450d002018201641186c6a21142018211603400240201641046a280200450d002016280200102a0b0240201641146a2802002206450d00201628020c2101200641047421060340024020012d00004109470d000240200141046a220d280200220528020441ffffffff0371450d002005280200102a200d28020021050b2005102a0b200141106a2101200641706a22060d000b0b201641186a21010240201641106a280200450d00201628020c102a0b2001211620012014470d000b0b2017450d032018102a0c030b02402016450d0020182016411c6c6a2114201821160340024020162802042201450d0002402016410c6a2802002206450d00200641047421060340024020012d00004109470d000240200141046a220d280200220528020441ffffffff0371450d002005280200102a200d28020021050b2005102a0b200141106a2101200641706a22060d000b0b201641086a280200450d002016280204102a0b2016411c6a21010240201641146a280200450d002016280210102a0b2001211620012014470d000b0b2017450d022018102a0c020b02402018450d002017450d002018102a0b02402014450d0002402012450d002012410c6c2106201421010340024020012802002205450d00200141046a280200450d002005102a0b2001410c6a2101200641746a22060d000b0b2013450d002014102a0b2010450d010240200e450d002010200e4104746a21172010211803402018220d41106a21180240200d2802042201450d000240200d410c6a2802002206450d002006410c6c21060340024020012802002205450d00200141046a280200450d002005102a0b2001410c6a2101200641746a22060d000b0b200d41086a280200450d00200d280204102a0b20182017470d000b0b200f450d012010102a0c010b02402017450d002018102a0b02402014450d002013450d002014102a0b2010450d002011102a0b0c010b024020042d00dc010d002008200c41306c6a21062008210102400340024020062001470d004100210d0c020b20012d0000210a200141306a220b2101200a410c470d000b200b415c6a280200210d0b2008200c41306c6a210b20082101024003404100210a0240200b2001470d00410021010c020b20012d00002106200141306a2205210120064104470d000b200441f8006a200541546a10fa03200428027c21010b0240200d2001470d004101210741e100210b41f3da012105410021060c030b0240200c450d00200c41306c210a2008210103402001108204200141306a2101200a41506a220a0d000b0b41012106411a210a024020090d000c030b2008102a0c020b20042802dc01220a4110762105200a410876210b200441d8016a41106a280200210d200441e4016a2802002118200441d8016a41086a28020021070b0240200c450d00200c41306c21062008210103402001108204200141306a2101200641506a22060d000b0b4101210602402009450d002008102a0b200d2109201821080b02402006450d00200821060c040b20042802f0022002470d022005411074200b41ff017141087472200a41ff017172211c2008200c41306c6a210a200821010240024002400240024002400240024002400240024002400340200a2001460d0120012d00002102200141306a2206210120024102470d000b200441f0006a200641546a10fa034104211d02402004280274221e0d004100211e0c020b201e41047422014100480d0c2004280270210220011028221d450d0a201e410474210641002115201d21010340200241086a280200220a417f4c0d042002410c6a2d0000210b2002280200210502400240200a0d004101210d0c010b200a1028220d450d060b200d2005200a109a0521052001410d6a2002410d6a2d00003a00002001410c6a200b3a0000200141086a200a360200200141046a200a36020020012005360200200141106a2101201541016a2115200241106a2102200641706a22060d000b201d0d020b4100211e4104211d0b410021150b2008200c41306c6a210a2008210102400340410021174104210b0240200a2001470d0041042102410021010c020b20012d00002102200141306a2206210120024103470d000b200441e8006a200641546a10fa0341042102410021012004280268220a450d00200428026c2101200a21020b024020010d004101211a41002102410021184100210541002110410121124100210a4100211141042116410021064100211f410421134100210e0c090b200141286c210d2002411c6a21014104210b410021174101211a41002102410021184100210541002110410121124100210a4100211141042116410021064100211f410421134100210e0340024002400240024002402001417c6a2d00000e0400010203000b20012802002114024020022018470d00200241016a22182002490d0f2002410174220f2018200f20184b1b221841ffffffff03712018470d0f2018410274220f4100480d0f0240024020020d00200f1028210b0c010b200b2002410274200f102c210b0b200b450d080b200b20024102746a2014360200200241016a21020c030b200441d8016a41086a2214200141086a280200360200200420012902003703d8010240200a2011470d00200a41016a2211200a490d0e200a410174220f2011200f20114b1b2211ad420c7e221b422088a70d0e201ba7220f4100480d0e02400240200a0d00200f102821160c010b2016200a410c6c200f102c21160b2016450d080b2016200a410c6c6a220f20042903d801370200200f41086a2014280200360200200a41016a210a0c020b200441d8016a41086a2214200141086a280200360200200420012902003703d80102402006201f470d00200641016a220f2006490d0d20064101742219200f2019200f4b1b221fad420c7e221b422088a70d0d201ba7220f4100480d0d0240024020060d00200f102821130c010b20132006410c6c200f102c21130b2013450d080b20132006410c6c6a220f20042903d801370200200f41086a2014280200360200200641016a21060c010b2001417e6a22142d0000210f2001417d6a22192d00002120024020052010470d00200541016a22102005490d0c200541017422212010202120104b1b221020106a22222010490d0c20224100480d0c0240024020050d002022102821120c010b201220212022102c21120b2012450d080b201220054101746a2222200f4101713a0001202220203a000020142d0000211420192d0000210f02400240200e2017460d00200e21190c010b201741016a22192017490d0c201741017422222019202220194b1b222020206a22192020490d0c20194100480d0c0240024020170d0020191028211a0c010b201a20222019102c211a0b201a450d0920172119202021170b200541016a2105201a20194101746a221920144101713a00012019200f3a0000200e41016a210e0b200141286a2101200d41586a220d450d090c000b0b1036000b200a41011037000b200f41041037000b200f41041037000b200f41041037000b202241011037000b201941011037000b200141041037000b2008200c41306c6a21142008210102400240024002400240024002400240024002400240024002400240034020142001460d0120012d0000210d200141306a220f2101200d4104470d000b200441e0006a200f41546a10fa0320042802642201450d002004280260210d2001410274210f20024101742114200241027421010340200d2802002119024020022018470d00200241016a22182002490d1020142018201420184b1b221841ffffffff03712018470d10201841027422204100480d100240024020020d0020201028210b0c010b200b20012020102c210b0b200b450d030b200d41046a210d200b20016a2019360200201441026a2114200141046a2101200241016a2102200f417c6a220f0d000b0b2008200c41306c6a21142008210102400240034020142001460d0120012d0000210d200141306a220f2101200d4105470d000b200441d8006a200f41546a10fa03200428025c410c6c2219450d0020042802582101200a4101742114200a410c6c210d0340200141086a210f024002400240200141046a2802004101470d002004200f28020022203602c0022001280200222220204b0d010b20044100360280010c010b200441023602ec01200442023702dc01200441e8a7c6003602d801200441013602f402200441013602ec02200420223602d0022004200441e8026a3602e8012004200441d0026a3602f0022004200441c0026a3602e80220044180016a200441d8016a1033200428028001450d0020044180016a21010c0e0b2001290200211b200441d8016a41086a2220200f2802003602002004201b3703d8010240200a2011470d00200a41016a2211200a490d1120142011201420114b1b2211ad420c7e221b422088a70d11201ba7220f4100480d1102400240200a0d00200f102821160c010b2016200d200f102c21160b2016450d030b2001410c6a21012016200d6a220f20042903d801370200200f41086a2020280200360200201441026a2114200d410c6a210d200a41016a210a201941746a22190d000b0b2008200c41306c6a21142008210102400240034020142001460d0120012d0000210d200141306a220f2101200d4106470d000b200441d0006a200f41546a10fa032004280254220d450d0020042802502101200d410c6c210f200641017421142006410c6c210d0340200441d8016a2001108305024020042802d801450d00200441d8016a21010c0f0b2001290200211b200441d8016a41086a2219200141086a2802003602002004201b3703d80102402006201f470d00200641016a221f2006490d122014201f2014201f4b1b221fad420c7e221b422088a70d12201ba722204100480d120240024020060d002020102821130c010b2013200d2020102c21130b2013450d030b2001410c6a21012013200d6a222020042903d801370200202041086a2019280200360200201441026a2114200d410c6a210d200641016a2106200f41746a220f0d000b0b2008200c41306c6a21142008210102400240034020142001460d0120012d0000210d200141306a220f2101200d4107470d000b200441c8006a200f41546a10fa03200428024c220d450d0020042802482201200d4104746a21222005410174210d200441d8016a41047221200340200441d8016a2001201a200e10840502400240024020042d00d8014101460d00200420042d00d90122143a00c002024020142001410c6a2d0000220f470d0020044100360280010c030b200441023602ec01200442023702dc01200441fca8c6003602d801200441273602f402200441273602ec022004200f3a00d0022004200441e8026a3602e8012004200441c0026a3602f0022004200441d0026a3602e80220044180016a200441d8016a10330c010b20044180016a41086a202041086a28020036020020042020290200370380010b0240200428028001450d0020044180016a21010c110b2001410c6a2d000021140b2001410d6a2d0000210f024020052010470d00200541016a22102005490d13200d2010200d20104b1b221020106a22192010490d1320194100480d130240024020050d002019102821120c010b2012200d2019102c21120b2012450d030b2012200d6a221920143a0000201941016a200f4101713a0000200d41026a210d200541016a2105200141106a22012022470d000b0b200441b8016a2002360200200441b4016a2018360200200441ac016a2015360200200441a8016a201e360200200441a0016a20053602002004419c016a201036020020044194016a200a36020020044190016a20113602002004200b3602b0012004201d3602a40120042012360298012004201636028c0120042006360288012004201f3602840120042013360280012008200c41306c6a210a20082101024003400240200a2001470d004100210b0c020b20012d00002102200141306a2206210120024104470d000b200441c0006a200641546a10fa032004280244210b0b2004200b3602bc012008200c41306c6a210a20082101024003400240200a2001470d00410021010c020b20012d00002102200141306a220621012002410c470d000b2006415c6a28020021010b200420013602c001200b2001470d0a024002400240200b450d002008200c41306c6a210a200821010340200a2001460d0320012d00002102200141306a2206210120024104470d000b2008200c41306c6a210b200821010340200b2001460d0220012d00002102200141306a220a21012002410c470d000b200441386a200641546a10fa03200428023c2201450d002004280238220d20014102746a2114200a415c6a2118200a41546a211620044191026a210f410021050340200420053602c4012018280200210120162802002102200442013702dc012004418487c6003602d801200441013602d402200441013602ec012004200441d0026a3602e8012004200441c4016a3602d002200441e8026a200441d8016a103320042802e802210a20042902ec02211b200120054d0d100240201ba7450d00200a102a0b2004200d28020022013602c002024002400240024020042802ac0120014b0d00200441013602ec01200442023702dc0120044188acc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a103320042902ec02221b422088a7210120042802e8022106201ba721020c010b0240024002402002200541186c6a22022802142215450d0020042802a40120014104746a220a2d000d2110200a2802002111200228020c210120022802002113200a2802082212210602402002280208220e450d00200e410374210b201221022013210a034002402002200a2802006a220620024f0d0002404120102822060d00412041011037000b200641186a41002900e8ae46370000200641106a41002900e0ae46370000200641086a41002900d8ae46370000200641002900d0ae463700000c040b200a41086a210a20062102200b41786a220b0d000b0b0240410810282202450d0020022010ad42ff0183422886370200200441d0026a41026a220a200441e8026a41026a2d00003a0000200420042f00e8023b01d002200420103a00900220044180800136028c022004428180808010370284022004200236028002200442808080808080103703f801200442013703f001200420063602ec012004200e3602e801200420133602e401200420123602e001200420113602dc01200420044180016a3602d801200f20042f01d0023b0000200f41026a200a2d00003a00002015410474210a41002102034020042002360298022004200136029c02200441b0026a200441d8016a2001108505024020042802b002450d00200441c0026a41086a200441b0026a41086a280200360200200420042903b0023703c002200441033602e402200442033702d402200441e881c6003602d002200441283602fc02200441013602f402200441293602ec022004200441e8026a3602e0022004200441c0026a3602f802200420044198026a3602f00220042004419c026a3602e802200441a0026a200441d0026a1033024020042802c402450d0020042802c002102a0b20042802a0022206450d0020042902a402211b024020042802f401450d0020042802f001102a0b201b42208821230240200428028402450d00200428028002102a0b2023a72101201ba721020c070b200141106a2101200241016a2102200a41706a220a0d000b02402004280288020d00024020042802f401450d0020042802f001102a0b200428028402450d07200428028002102a0c070b418082c6001032000b410841041037000b412010282206450d01200641186a41002900df8146370000200641106a41002900d78146370000200641086a41002900cf8146370000200641002900c781463700000b41202102412021010c010b412041011037000b2006450d010b200420063602d00220042001ad4220862002ad843702d4022004200441d0026a3602c002200441023602ec01200442023702dc012004418c87c6003602d8012004412a3602f402200441013602ec022004200441e8026a3602e8012004200441c0026a3602f0022004200441c4016a3602e802200441c8016a200441d8016a1033024020042802d402450d0020042802d002102a0b20042802c801220a450d0020042902cc01211b0c110b200541016a2105200d41046a220d2014470d000b0b2008200c41306c6a210a200821010240024002400340200a2001460d0120012d00002102200141306a2206210120024109470d000b2004200641546a28020022013602b002024020042802b80120014b0d00200441ec016a4101360200200442023702dc01200441e4abc6003602d801200441013602d4022004200441d0026a3602e8012004200441b0026a3602d002200441e8026a200441d8016a10330c0c0b200420042802b00120014102746a28020022013602c002024020042802ac0120014b0d00200441ec016a4101360200200442023702dc0120044188acc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c0c0b20042802a40120014104746a220131000d4220862001350208844280808080c000510d00412d1028220a450d01200a41256a41002900c18746370000200a41206a41002900bc8746370000200a41186a41002900b48746370000200a41106a41002900ac8746370000200a41086a41002900a48746370000200a410029009c874637000042ad808080d005211b0c110b2008200c41306c6a210a200821010340200a2001460d0a20012d00002102200141306a2206210120024108470d000b200441306a200641546a221610fa03200428023021014100210a02400240200428023422020d004104210b410021180c010b200241ffffffff01712002470d15200241037422064100480d1520061028220b450d02200221180b02402002450d002001200241146c6a21062002410274417c6a2105200b210203402001280200210a200241046a200141086a2802003602002002200a360200200241086a2102200141146a22012006470d000b200541027641016a210a0b200b200a200441d8016a41004120200a676b10fd04200b200a4103746a2206200b460d084101210a200b2101200b2102034002400240200a450d00200620016b410376200a4d0d0b2001200a4103746a22010d010c0b0b20062001460d0a0b200420023602c00202400240200241046a280200220a200141046a280200470d00200228020022052001280200220d460d012005200d200a109c05450d010b200141086a21014100210a200241086a22022006470d010c0a0b0b200441ec016a4101360200200442013702dc01200441cc87c6003602d8012004412b3602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c0c0b412d41011037000b200641041037000b41ba86c60041c8001050000b419c86c600411e1050000b201941011037000b202041041037000b200f41041037000b202041041037000b200441286a201610fa030240200428022c2201450d00200141146c2102200428022841106a210102400340024002400240024002402001417c6a2802000e0400030201000b20042001280200220a3602b002024020042802b801200a4b0d00200441ec016a4101360200200442023702dc01200441e4abc6003602d801200441013602d4022004200441d0026a3602e8012004200441b0026a3602d002200441e8026a200441d8016a10330c0b0b200420042802b001200a4102746a280200220a3602c00220042802ac01200a4b0d03200441013602ec01200442023702dc0120044188acc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c0a0b20042001280200220a3602b002024020042802a001200a4b0d00200441ec016a4101360200200442023702dc01200441a8acc6003602d801200441013602d4022004200441d0026a3602e8012004200441b0026a3602d002200441e8026a200441d8016a10330c0a0b200428029801200a4101746a2d0001450d02200441ec016a4101360200200442023702dc01200441c8acc6003602d801200441013602d4022004200441d0026a3602e8012004200441b0026a3602d002200441e8026a200441d8016a10330c090b20042001280200220a3602c002200428028801200a4b0d01200441013602ec01200442023702dc0120044194abc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a103320042802e802220a0d090c010b20042001280200220a3602c002200428029401200a4d0d020b200141146a21012002416c6a22020d000c020b0b200441ec016a4101360200200442023702dc01200441c4abc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c040b2018450d00200b102a0b2008200c41306c6a210a2008210102400340200a2001460d0120012d00002102200141306a2206210120024103470d000b200441206a200641546a10fa0320042802242201450d0020042802202106200141286c210b41002101034002400240024002400240200620016a220241186a2d00000e0400030201000b20042002411c6a28020022023602c00220042802ac0120024b0d03200441ec016a4101360200200442023702dc0120044188acc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c060b2002411a6a2d0000450d022002410c6a2802002101200241146a2802002102200441d8016a41146a4101360200200420023602d402200420013602d002200441043602c402200442013702dc01200441d487c6003602d8012004200441d0026a3602c0022004200441c0026a3602e801200441e8026a200441d8016a10330c050b200441d8016a2002411c6a10830520042802d801220a450d0120042902dc01211b0c0a0b200241206a2802004101470d002002411c6a280200210a2004200241246a28020022023602b002200a20024d0d00200441023602ec01200442023702dc01200441e8a7c6003602d801200441013602f402200441013602ec022004200a3602c0022004200441e8026a3602e8012004200441c0026a3602f0022004200441b0026a3602e802200441d0026a200441d8016a103320042802d002220a0d080b200b200141286a2201470d000b0b02400240024002400240200428029401220141014b0d00200428028801220141014b0d012008200c41306c6a210a200821010240024002400240024002400340200a2001460d0120012d00002102200141306a220621012002410d470d000b200441186a200641546a10fa0320042802182201200428021c411c6c6a2106034020012006460d012004200128020022023602c002024020042802880120024b0d00200441013602ec01200442023702dc0120044194abc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a103320042802e802220a450d0020042902ec02211b0c130b200141046a2201280200450d02200441d8016a200120042802980120042802a00110840520042d00d8014101460d03200141186a210120042d00d901450d000b41201028220a450d08200a41186a41002900848846370000200a41106a41002900fc8746370000200a41086a41002900f48746370000200a41002900ec874637000042a08080808004211b0c110b2008200c41306c6a210a2008210102400340200a2001460d0120012d00002102200141306a220621012002410a470d000b200441106a200641546a10fa0320042802142201450d002004280210220b2001411c6c6a21050340200b450d012004200b28020022013602c00220042802940120014d0d04200b280204450d05200441d8016a200b41046a20042802980120042802a00110840520042d00d8014101460d0620042d00d9010d0d200441086a200b10cd0402400240200428020c2201450d00200428020821022001410274210a20042802b801210603402004200228020022013602b0020240200620014b0d00200441ec016a4101360200200442023702dc01200441e4abc6003602d801200441013602d4022004200441d0026a3602e8012004200441b0026a3602d002200441e8026a200441d8016a10330c100b200420042802b00120014102746a28020022013602c00220042802ac0120014d0d02200241046a2102200a417c6a220a0d000b0b200b411c6a220b2005460d020c010b0b200441013602ec01200442023702dc0120044188acc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c0b0b0240200428028401450d00200428028001102a0b0240200428029001450d00200428028c01102a0b0240200428029c01450d00200428029801102a0b024020042802ac012202450d0020042802a40121012002410474210203400240200141046a280200450d002001280200102a0b200141106a2101200241706a22020d000b0b024020042802a801450d0020042802a401102a0b024020042802b401450d0020042802b001102a0b2017450d13201a102a0c130b41291028220a450d07200a41286a41002d00b488463a0000200a41206a41002900ac8846370000200a41186a41002900a48846370000200a41106a410029009c8846370000200a41086a41002900948846370000200a410029008c884637000042a98080809005211b0c0f0b200441e0016a290300211b20042802dc01210a0c0e0b200441ec016a4101360200200442023702dc01200441c4abc6003602d801200441013602d4022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c070b412a1028220a450d05200a41286a41002f00dd88463b0000200a41206a41002900d58846370000200a41186a41002900cd8846370000200a41106a41002900c58846370000200a41086a41002900bd8846370000200a41002900b5884637000042aa808080a005211b0c0c0b200441e0016a290300211b20042802dc01210a0c0b0b200441ec016a4101360200200442013702dc01200441dc87c6003602d801200441013602d402200420013602c0022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c040b200441ec016a4101360200200442013702dc01200441e487c6003602d801200441013602d402200420013602c0022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10330c030b412041011037000b412941011037000b412a41011037000b20042802e802210a20042902ec02211b0c050b024041201028220a450d00200a41186a41002900848846370000200a41106a41002900fc8746370000200a41086a41002900f48746370000200a41002900ec874637000042a08080808004211b0c050b412041011037000b20042802e802210a0b20042902ec02211b2018450d02200b102a0c020b200441ec016a4102360200200441f4026a4101360200200442023702dc012004418c86c6003602d801200441013602ec022004200441e8026a3602e8012004200441c0016a3602f0022004200441bc016a3602e802200441d0026a200441d8016a103320042802d002210a0b20042902d402211b0b0240200428028401450d00200428028001102a0b0240200428029001450d00200428028c01102a0b0240200428029c01450d00200428029801102a0b024020042802ac012202450d0020042802a40121012002410474210203400240200141046a280200450d002001280200102a0b200141106a2101200241706a22020d000b0b024020042802a801450d0020042802a401102a0b024020042802b401450d0020042802b001102a0b2017450d01201a102a200a0d040c020b2001290204211b2001280200210a02402017450d00201a102a0b0240201f450d002013102a0b02402011450d002016102a0b02402010450d002012102a0b02402015450d0020154104742102201d210103400240200141046a280200450d002001280200102a0b200141106a2101200241706a22020d000b0b0240201e450d00201d102a0b2018450d00200b102a0b200a0d020b2000201c36020420004100360200200041186a2003360200200041146a200c360200200041106a20093602002000410c6a2008360200200041086a20073602000c040b1031000b0240201ba7450d00200a102a0b200041ea8ac60036020420004101360200200041086a41133602000240200c450d00200c41306c21022008210103402001108204200141306a2101200241506a22020d000b0b2009450d022008102a0c020b200441003a00d002200441ec016a4101360200200442013702dc01200441a4e2c5003602d801200441263602c4022004200441c0026a3602e8012004200441d0026a3602c00220044180016a200441d8016a1033200428028001210720042802840121060240200c450d00200c41306c21022008210103402001108204200141306a2101200241506a22020d000b0b4105210a2009450d002008102a0b02402006450d00200a41ff01714105470d002007102a0b200041d48ac60036020420004101360200200041086a41163602000b20044180036a24000b160020002001280208360204200020012802003602000bd21301177f23004190026b220224000240024002400240024002402000280200220341f8b9c000460d00200028020421040c010b41002104200241b8016a410041d8001099051a2002411f6a220542003700002002420037011a41ec0010282203450d0120034100360200200320022902183702042003410b6a2005290000370000200341136a200241b7016a41d900109a051a20004100360204200020033602000b200141ff0171210602400340200341066a210720032f01062108410c21094100210502400240034020082005460d01200320056a210a200941086a2109200541016a210502404100417f4101200a41086a2d0000220a20064b1b200a2006461b41016a0e03000301000b0b2005417f6a21080b2004450d022004417f6a2104200320084102746a41ec006a28020021030c010b0b200320096a42013702000c030b2000200028020841016a360208024002400240024020072f01002205410b490d00200241276a41016a410041d8001099051a200241003a001941ec001028220b450d03200b4100360200200b410036000f200b4200370007200b20022f01183b0005200b41136a200241276a41d900109a051a2003410e6a2d0000210c2003280248210d2003280244210e200b41086a2003410f6a20032f010641796a2205109a052109200b41146a200341cc006a2005410374109a052106200341063b0106200b20053b010620084107490d0120092008417a6a220a6a2009200841796a22086a2209200541ffff037120086b109b051a200920013a00002006200a4103746a200620084103746a2205200b41066a22072f010020086b410374109b051a2005410136020020072f010021050c020b200341086a2209200841016a22066a200920086a2209200520086b220a109b051a200920013a0000200341146a220920064103746a200920084103746a2209200a410374109b051a200941013602002003200541016a3b01060c050b200341086a2205200841016a22096a200520086a220620072f0100220520086b220a109b051a200620013a0000200341146a220620094103746a200620084103746a2209200a410374109b051a200941013602000b2007200541016a3b01002003280200220a450d02200341046a2105200241276a41016a210f200241a8016a2101200241a0016a211020024198016a211120024190016a211220024180016a41086a2113034020052f0100210602400240024002400240200a2f01062205410b490d00200f410041d8001099051a200241003a0019200220022f01183b0108200241b7016a200241276a41d900109a051a20014200370300201042003703002011420037030020124200370300201342003703002002420037038001419c0110282209450d03200941003602002009410036000f20094200370007200920022f01083b0005200941136a200241b7016a41d900109a051a20094194016a20012903003702002009418c016a201029030037020020094184016a2011290300370200200941fc006a2012290300370200200941f4006a2013290300370200200920022903800137026c200a41c8006a2802002114200a41c4006a2802002115200a410e6a2d00002116200941086a200a410f6a200a2f0106220341796a2205109a052117200941146a200a41cc006a2005410374109a052118200941ec006a200a4188016a2003417a6a2204410274109a052107200a41063b0106200920053b010602402004450d00410021052007210303402003280200220820053b010420082009360200200341046a21032004200541016a2205470d000b0b20064107490d0120172006417a6a22036a2017200641796a22056a220820092f010620056b109b051a2008200c3a0000201820034103746a201820054103746a220820092f010620056b410374109b051a2008200e3602002008200d360204200920092f010641016a22083b01062006410274220c20076a416c6a200720034102746a2204200841ffff0371220620036b410274109b051a2004200b36020020062003490d022009200c6a41d4006a2103034020032802002208200541016a22053b010420082009360200200341046a210320052006490d000c030b0b200a41086a2209200641016a22036a200920066a2209200520066b2208109b051a2009200c3a0000200a41146a220920034103746a200920064103746a22092008410374109b051a2009200e3602002009200d360204200a200541016a22053b01062006410274200a41ec006a22096a41086a200920034102746a2209200541ffff0371220820036b410274109b051a2009200b360200200620084f0d08200a2003417f6a22054102746a41f0006a2103034020032802002209200541016a22053b01042009200a360200200341046a210320052008490d000c090b0b200a41086a2203200641016a22056a200320066a2203200a2f0106220820066b2204109b051a2003200c3a0000200a41146a220320054103746a200320064103746a22032004410374109b051a2003200e3602002003200d360204200a200841016a22033b010620064102742207200a41ec006a22086a41086a200820054102746a2204200341ffff0371220820056b410274109b051a2004200b360200200620084f0d00200a20076a41f0006a2105034020052802002203200641016a22063b01042003200a360200200541046a210520082006470d000b0b200a28020022030d012009210b2014210d2015210e2016210c0c050b419c0141041037000b200a41046a21052003210a2016210c2015210e2014210d2009210b0c000b0b41ec0041041037000b41ec0041041037000b200241b7016a41016a410041d8001099051a2002411f6a220542003700002002420037011a200220022902183703082002200529000037000f200241276a200241b7016a41d900109a051a200241a8016a22034200370300200241a0016a2209420037030020024180016a41186a2208420037030020024190016a2206420037030020024180016a41086a220a42003703002002420037038001419c0110282205450d0120054100360200200520022903083702042005410b6a200229000f370000200541136a200241276a41d900109a051a20054194016a20032903003702002005418c016a200929030037020020054184016a2008290300370200200541fc006a2006290300370200200541f4006a200a290300370200200520022903800137026c20052000280200220336026c200020053602002000200028020441016a360204200341003b010420032005360200200520052f010622034103746a220941186a200d360200200941146a200e360200200520036a41086a200c3a0000200541ec006a200341016a22034102746a200b360200200520033b0106200b20033b0104200b20053602000b20024190026a24000f0b419c0141041037000b822701377f2001410c6a28020021022001280208210341002104024002400240200141106a28020022050d00410021064100210741002108410021094100210a4100210b4100210c4100210d4100210e410021050c010b410021044100210e4100210d4100210c4100210b4100210a4100210941002108410021074100210f4100211002400340200121112010210620032005417f6a220541306c6a220128002c2112200128002821132001280024211420012800202115200128001c2116200128001821172001280014211820012800102119200128000c211a2001280008211b2001280004211c41012110024002400240024002400240024020012d0000221d417e6a221e410e4d0d004101211f0c010b4101211f4101212041012121410121224101212341012124201c21010240024002400240024002400240024002400240024002400240024002400240024002400240201e0e0f00010203040506180717080917171a000b0240200f0d002006211020112101201c210f201b2125201a21260c180b02402026450d0020264104742110200f210103400240200141046a280200450d002001280200102a0b200141106a2101201041706a22100d000b0b4101211f410021102025450d11200f102a0c110b024020070d002006211020112101201c2107201b2127201a21280c170b02402028450d00202841286c21102007210103400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101201041586a22100d000b0b4100211f410121102027450d0f2007102a0c0f0b2029450d0d2008450d0d2008102a0c0d0b202a450d0b2009450d0b2009102a0c0b0b202b450d09200a450d09200a102a0c090b0240200b0d002006211020112101201c210b201b212c201a212d0c130b0240202d450d00200b202d4104746a2121200b21200340024020202802082210450d0020202802002101201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041106a21010240202041046a280200450d002020280200102a0b2001212020012021470d000b0b4100212041012110202c450d07200b102a0c070b0240200c0d002006211020112101201c210c201b212e201a212f0c120b0240202f450d00202f41146c2110200c210103400240200141046a280200450d002001280200102a0b200141146a21012010416c6a22100d000b0b4100212141012110202e450d05200c102a0c050b0240200d0d002006211020112101201c210d201b2130201a21310c110b02402031450d00200d2031411c6c6a2121200d21200340024020202802042201450d0002402020410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041086a280200450d002020280204102a0b2020411c6a21010240202041146a280200450d002020280210102a0b2001212020012021470d000b0b41002122410121102030450d03200d102a0c030b0240200e0d002006211020112101201c210e201b2132201a21330c100b02402033450d00200e203341186c6a2121200e212003400240202041046a280200450d002020280200102a0b0240202041146a2802002210450d00202028020c2101201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041186a21010240202041106a280200450d00202028020c102a0b2001212020012021470d000b0b41002123410121102032450d01200e102a0c010b024020040d002006211020112101201a2134201b2135201c21040c0f0b02402034450d0020042034411c6c6a2121200421200340024020202802042201450d0002402020410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041086a280200450d002020280204102a0b2020411c6a21010240202041146a280200450d002020280210102a0b2001212020012021470d000b0b410021244101211002402035450d002004102a0b201c2104201b2135201a21344101211f410121204101212141012122410121230c0d0b201a2133201b2132201c210e4101211f4101212041012121410121220c0b0b201a2131201b2130201c210d4101211f4101212041012121410121230c0a0b201a212f201b212e201c210c4101211f410121200c080b201a212d201b212c201c210b4101211f0c060b2006211020112101201c210a201b212b201a21360c090b2006211020112101201c2109201b212a201a21370c080b2006211020112101201c2108201b2129201a21380c070b201a2128201b2127201c21070c010b201a2126201b2125201c210f0b410121200b410121210b41012122410121230b410121240b024002400240201e410b4b0d000240024002400240024002400240024002400240201e0e0c000102030405060a070a0809000b2010450d0b0240201a450d00201a4104742110201c210103400240200141046a280200450d002001280200102a0b200141106a2101201041706a22100d000b0b201b450d0b0c0a0b201f450d0a0240201a450d00201a41286c2110201c210103400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101201041586a22100d000b0b201b0d090c0a0b41000d09201b0d080c090b41000d08201b0d070c080b41000d07201b0d060c070b2020450d060240201a450d00201c201a4104746a211e201c21200340024020202802082210450d0020202802002101201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041106a21010240202041046a280200450d002020280200102a0b200121202001201e470d000b0b201b0d050c060b2021450d050240201a450d00201a41146c2110201c210103400240200141046a280200450d002001280200102a0b200141146a21012010416c6a22100d000b0b201b0d040c050b2022450d040240201a450d00201c201a411c6c6a211e201c21200340024020202802042201450d0002402020410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041086a280200450d002020280204102a0b2020411c6a21010240202041146a280200450d002020280210102a0b200121202001201e470d000b0b201b0d030c040b2023450d030240201a450d00201c201a41186c6a211e201c212003400240202041046a280200450d002020280200102a0b0240202041146a2802002210450d00202028020c2101201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041186a21010240202041106a280200450d00202028020c102a0b200121202001201e470d000b0b201b0d020c030b2024450d020240201a450d00201c201a411c6c6a211e201c21200340024020202802042201450d0002402020410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041086a280200450d002020280204102a0b2020411c6a21010240202041146a280200450d002020280210102a0b200121202001201e470d000b0b201b0d010c020b0240201d410e4b0d00200621102011210102400240024002400240024002400240024002400240201d0e0f0001020304040405060e070e08090a000b201b0d0b0c0c0b0240201b450d00201c102a0b2018450d0b2019102a0c0b0b0240201a450d00201a4104742110201c210103400240200141046a280200450d002001280200102a0b200141106a2101201041706a22100d000b0b201b0d090c0a0b201a450d00201a41286c2110201c210103400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101201041586a22100d000b0b201b0d070c080b0240201a450d00201c201a4104746a211e201c21200340024020202802082210450d0020202802002101201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041106a21010240202041046a280200450d002020280200102a0b200121202001201e470d000b0b201b0d060c070b0240201a450d00201a41146c2110201c210103400240200141046a280200450d002001280200102a0b200141146a21012010416c6a22100d000b0b201b0d050c060b0240201a450d00201c201a411c6c6a211e201c21200340024020202802042201450d0002402020410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041086a280200450d002020280204102a0b2020411c6a21010240202041146a280200450d002020280210102a0b200121202001201e470d000b0b201b0d040c050b0240201a450d00201c201a41186c6a211e201c212003400240202041046a280200450d002020280200102a0b0240202041146a2802002210450d00202028020c2101201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041186a21010240202041106a280200450d00202028020c102a0b200121202001201e470d000b0b201b0d030c040b0240201a450d00201c201a411c6c6a211e201c21200340024020202802042201450d0002402020410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a221f280200222428020441ffffffff0371450d002024280200102a201f28020021240b2024102a0b200141106a2101201041706a22100d000b0b202041086a280200450d002020280204102a0b2020411c6a21010240202041146a280200450d002020280210102a0b200121202001201e470d000b0b201b0d020c030b0240201c450d00201b450d00201c102a0b02402018450d0002402016450d002016410c6c2110201821010340024020012802002224450d00200141046a280200450d002024102a0b2001410c6a2101201041746a22100d000b0b2017450d002018102a0b2014450d0202402012450d00201420124104746a211c2014212003402020221f41106a21200240201f2802042201450d000240201f410c6a2802002210450d002010410c6c21100340024020012802002224450d00200141046a280200450d002024102a0b2001410c6a2101201041746a22100d000b0b201f41086a280200450d00201f280204102a0b2020201c470d000b0b2013450d022014102a0c020b0240201b450d00201c102a0b02402018450d002017450d002018102a0b2014450d012015102a0c010b201c102a0b20062110201121010b20050d000b4100210520012111201021060b200f0d010b4104210f41002125410021260b20002003360280012000200636025420002026360208200020253602042000200f36020020004188016a200536020020004184016a2002360200200041fc006a2034410020041b360200200041f8006a2035410020041b36020020002004410420041b360274200041f0006a20334100200e1b360200200041ec006a20324100200e1b3602002000200e4104200e1b360268200041e4006a20314100200d1b360200200041e0006a20304100200d1b3602002000200d4104200d1b36025c200041d8006a2011360200200041d0006a202f4100200c1b360200200041cc006a202e4100200c1b3602002000200c4104200c1b360248200041c4006a202d4100200b1b360200200041c0006a202c4100200b1b3602002000200b4104200b1b36023c200041386a20364100200a1b360200200041346a202b4100200a1b3602002000200a4104200a1b3602302000412c6a2037410020091b360200200041286a202a410020091b36020020002009410420091b360224200041206a2038410020081b3602002000411c6a2029410020081b36020020002008410420081b360218200041146a2028410020071b360200200041106a2027410020071b36020020002007410420071b36020c0bb10a010e7f230041106b2202240002400240024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042108200241086a200010fa0320022802082201200228020c22094104746a210a4100210b20094104490d01200341ff0171210c02400340024020012d000c200c470d0020012802082004470d000240200128020022092008460d002004450d002004210d2008210e034020092d0000200e2d0000470d02200941016a2109200e41016a210e200d417f6a220d0d000b0b200741ff0171220941044720012d000d220e410446220d460d00200e2009460d0520094104460d05200d0d050b02400240024002402001411c6a2d0000200c470d00200141186a2802002004470d000240200128021022092008460d002004450d002004210d2008210e034020092d0000200e2d0000470d02200941016a2109200e41016a210e200d417f6a220d0d000b0b200741ff0171220941044720012d001d220e410446220d460d00200e2009460d0120094104460d01200d0d010b2001412c6a2d0000200c470d02200141286a2802002004470d02200128022022092008460d012004450d012004210d2008210e034020092d0000200e2d0000470d03200941016a2109200e41016a210e200d417f6a220d450d020c000b0b200b410172210b0c060b200741ff0171220941044720012d002d220e410446220d460d00200e2009460d0220094104460d02200d0d020b024002402001413c6a2d0000200c470d00200141386a2802002004470d000240200128023022092008460d002004450d002004210d2008210e034020092d0000200e2d0000470d02200941016a2109200e41016a210e200d417f6a220d0d000b0b200741ff0171220941044720012d003d220e410446220d460d00200e2009460d0120094104460d01200d0d010b200b41046a210b200a200141c0006a22016b41304d0d040c010b0b200b410372210b0c030b200b410272210b0c020b2001280204210b0c030b2001200a460d0102400240200741ff0171220f4104460d00200341ff0171210c0c010b200341ff0171210c0340024020012d000c200c470d0020012802082004470d000240200128020022092008460d002004450d002004210d2008210e034020092d0000200e2d0000470d02200941016a2109200e41016a210e200d417f6a220d0d000b0b20012d000d4104460d030b200b41016a210b200141106a2201200a470d000c030b0b0340024020012d000c200c470d0020012802082004470d000240200128020022092008460d002004450d002004210d2008210e034020092d0000200e2d0000470d02200941016a2109200e41016a210e200d417f6a220d0d000b0b20012d000d2209200f470d0020094104470d020b200b41016a210b200141106a2201200a460d020c000b0b2005450d012008102a0c010b024020002802082201200041046a280200470d0002400240200141016a22092001490d002001410174220e2009200e20094b1b220941ffffffff00712009470d002009410474220e41004e0d010b1031000b0240024020010d00200e102821010c010b20002802002001410474200e102c21010b2001450d0220002001360200200041046a2009360200200028020821010b200028020020014104746a220120063b010e200120073a000d200120033a000c2001200436020820012005360204200120083602002000200028020841016a3602082002200010fa032002280204417f6a210b0b200241106a2400200b0f0b200e41041037000bf722032d7f017e017f230041306b22022400200241043602002001280204210320012802002104410121050240024002400240024002400240024002400240024002400240024002400240200128020822060d0041002107410121080c010b413010282207450d012007200636000c200720033600082007200436000420022007360200200741023a000041002108410121070b200141106a2802002109200128020c210a02400240200141146a280200220b0d002007210c0c010b2007410174220d200741016a220c200d200c4b1b220c41306c210e0240024020070d00200e1028210d0c010b2002280200200741306c200e102c210d0b200d450d022002200d360200200d200741306c6a220d41033a0000200d20022f002d3b0001200d200b36000c200d2009360008200d200a360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021050b2001411c6a280200210f200128021821104100211102400240200141206a28020022120d00200c210e410021130c010b024002402007200c460d00200c210e0c010b41000d0e41000d0e200c410174220d200c41016a220e200d200e4b1b220ead42307ea722144100480d0e02400240200c0d0020141028210d0c010b2002280200200c41306c2014102c210d0b200d450d042002200d3602000b2002280200200741306c6a220d41043a0000200d20022f002d3b0001200d201236000c200d200f360008200d2010360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a29020037020041012113200741016a21070b200141286a280200211420012802242115024002402001412c6a28020022120d00200e210c0c010b024002402007200e460d00200e210c0c010b41000d0e41000d0e200e410174220d200e41016a220c200d200c4b1b220cad42307ea722114100480d0e02400240200e0d0020111028210d0c010b2002280200200e41306c2011102c210d0b200d450d052002200d3602000b2002280200200741306c6a220d41053a0000200d20022f002d3b0001200d201236000c200d2014360008200d2015360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a29020037020041012111200741016a21070b200141346a28020021162001280230211702400240200141386a280200220e0d00410021180c010b02402007200c470d0041000d0e41000d0e200c410174220d200c41016a2212200d20124b1b2212ad42307ea722194100480d0e02400240200c0d0020191028210d0c010b2002280200200c41306c2019102c210d0b200d450d062002200d3602002012210c0b2002280200200741306c6a220d41063a0000200d20022f002d3b0001200d200e36000c200d2016360008200d2017360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a29020037020041012118200741016a21070b200141c0006a280200211a200128023c211b4101211902400240200141c4006a280200221c0d00200c210e4101211d0c010b024002402007200c460d00200c210e0c010b41000d0e41000d0e200c410174220d200c41016a220e200d200e4b1b220ead42307ea722124100480d0e02400240200c0d0020121028210d0c010b2002280200200c41306c2012102c210d0b200d450d072002200d3602000b2002280200200741306c6a220d41073a0000200d20022f002d3b0001200d201c36000c200d201a360008200d201b360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a21074100211d0b200141cc006a280200211e2001280248211f02400240200141d0006a28020022200d00200e21120c010b024002402007200e460d00200e21120c010b41000d0e41000d0e200e410174220d200e41016a220c200d200c4b1b2212ad42307ea7220c4100480d0e02400240200e0d00200c1028210d0c010b2002280200200e41306c200c102c210d0b200d450d082002200d3602000b2002280200200741306c6a220d41083a0000200d20022f002d3b0001200d202036000c200d201e360008200d201f360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a200241046a41086a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021190b410121210240024020012802544101460d002012210c0c010b200141d8006a280200210e0240024020072012460d002012210c0c010b41000d0e41000d0e2012410174220d201241016a220c200d200c4b1b220cad42307ea722224100480d0e0240024020120d0020221028210d0c010b2002280200201241306c2022102c210d0b200d450d092002200d3602000b2002280200200741306c6a220d41093a0000200d20022f002d3b0001200d200e360204200d2002290204370208200d41036a2002412f6a2d00003a0000200d41106a2002410c6a290200370200200d41186a200241046a41106a290200370200200d41206a200241046a41186a290200370200200d41286a200241046a41206a290200370200200741016a21070b200141e0006a2802002123200128025c212402400240200141e4006a28020022250d00200c210e0c010b024002402007200c460d00200c210e0c010b41000d0e41000d0e200c410174220d200c41016a220e200d200e4b1b220ead42307ea722124100480d0e02400240200c0d0020121028210d0c010b2002280200200c41306c2012102c210d0b200d450d0a2002200d3602000b2002280200200741306c6a220d410a3a0000200d20022f002d3b0001200d202536000c200d2023360008200d2024360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021210b200141ec006a2802002126200128026821274101212202400240200141f0006a28020022280d00200e2112410121290c010b024002402007200e460d00200e21120c010b41000d0e41000d0e200e410174220d200e41016a220c200d200c4b1b2212ad42307ea7220c4100480d0e02400240200e0d00200c1028210d0c010b2002280200200e41306c200c102c210d0b200d450d0b2002200d3602000b2002280200200741306c6a220d410c3a0000200d20022f002d3b0001200d202836000c200d2026360008200d2027360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021290b200141f8006a280200212a2001280274212b02400240200141fc006a280200222c0d002012210c0c010b0240024020072012460d002012210c0c010b41000d0e41000d0e2012410174220d201241016a220c200d200c4b1b220cad42307ea7220e4100480d0e0240024020120d00200e1028210d0c010b2002280200201241306c200e102c210d0b200d450d0c2002200d3602000b2002280200200741306c6a220d410d3a0000200d20022f002d3b0001200d202c36000c200d202a360008200d202b360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021220b20014184016a2802002112200128028001210d02400240200c20076b20014188016a28020041306c222d41306d220e490d00200228020021010c010b2007200e6a22012007490d0d200c410174222e2001202e20014b1b222ead42307e222f422088a70d0d202fa722304100480d0d02400240200c0d002030102821010c010b2002280200200c41306c2030102c21010b2001450d0c20022001360200202e210c0b2001200741306c6a200d202d109a051a2007200e6a210702402012450d00200d102a0b2000200136020820004280c2cdeb16370200200041106a20073602002000410c6a200c3602002022450d0d0240202c450d00202b202c411c6c6a210e202b21000340024020002802042201450d0002402000410c6a2802002207450d00200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102a200c280200210d0b200d102a0b200141106a2101200741706a22070d000b0b200041086a280200450d002000280204102a0b2000411c6a21010240200041146a280200450d002000280210102a0b200121002001200e470d000b0b202a450d0d202b102a0c0d0b413041041037000b200e41041037000b201441041037000b201141041037000b201941041037000b201241041037000b200c41041037000b202241041037000b201241041037000b200c41041037000b200e41041037000b203041041037000b1031000b02402029450d0002402028450d002027202841186c6a210e2027210003400240200041046a280200450d002000280200102a0b0240200041146a2802002207450d00200028020c2101200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102a200c280200210d0b200d102a0b200141106a2101200741706a22070d000b0b200041186a21010240200041106a280200450d00200028020c102a0b200121002001200e470d000b0b2026450d002027102a0b02402021450d0002402025450d0020242025411c6c6a210e202421000340024020002802042201450d0002402000410c6a2802002207450d00200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102a200c280200210d0b200d102a0b200141106a2101200741706a22070d000b0b200041086a280200450d002000280204102a0b2000411c6a21010240200041146a280200450d002000280210102a0b200121002001200e470d000b0b2023450d002024102a0b02402019450d0002402020450d00202041146c2107201f210103400240200141046a280200450d002001280200102a0b200141146a21012007416c6a22070d000b0b201e450d00201f102a0b0240201d450d000240201c450d00201b201c4104746a210e201b21000340024020002802082207450d0020002802002101200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102a200c280200210d0b200d102a0b200141106a2101200741706a22070d000b0b200041106a21010240200041046a280200450d002000280200102a0b200121002001200e470d000b0b201a450d00201b102a0b02402016410047201841017371450d002017102a0b02402014410047201141017371450d002015102a0b0240200f410047201341017371450d002010102a0b02402005450d000240200b450d00200b41286c2107200a210103400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101200741586a22070d000b0b2009450d00200a102a0b02402008450d0002402006450d00200641047421072004210103400240200141046a280200450d002001280200102a0b200141106a2101200741706a22070d000b0b2003450d002004102a0b200241306a24000bee0203037f017e027f410121020240024002400240200041086a2802002203417f6a220420034f0d00200420034b0d00200028020020044104746a220329020421052003200141016aad3702042005a721012005422088a721030240200041086a28020022024101460d002002450d0220002802002002417e6a4104746a22022802042001470d002002200228020820036a36020841000f0b410021022003450d000240200041146a2802002204200041106a280200470d00200441016a22062004490d04200441017422072006200720064b1b220641ffffffff01712006470d04200641037422074100480d040240024020040d002007102821040c010b200028020c20044103742007102c21040b2004450d032000200436020c200041106a2006360200200028021421040b200028020c20044103746a22042003360204200420013602002000200028021441016a3602140b20020f0b41ede3c500413f1050000b200741041037000b1031000b8a1302147f027e23004180026b220424000240024020014115490d0041012105410121060240024002400340200121072000210820052006714101732109024002400240024002400240034002400240024002402003450d00024020054101710d002000200110de042003417f6a21030b2001410276220a41036c210b200a410174210c4100210d024020014132490d00200b200b417f6a220d2000200b4103746a280200220e2000200d4103746a280200220f4922101b2211200b41016a2212200d200b20101b200020124103746a280200220b200f200e20101b220d49220f1b200b200d200f1b200020114103746a2802004922131b210b200c200c417f6a220d2000200c4103746a28020022112000200d4103746a280200221249220e1b2214200c4101722206200d200c200e1b200020064103746a280200220c20122011200e1b220d4922111b200c200d20111b200020144103746a2802004922141b210c200a200a417f6a22122000200a4103746a2802002206200020124103746a280200221549220d1b2216200a41016a22172012200a200d1b200020174103746a280200220a20152006200d1b22064922121b200a200620121b200020164103746a2802004922061b210a41024101200d1b200d20121b20066a200e6a20116a20146a20106a200f6a20136a210d0b200d2000200c4103746a280200220e2000200a4103746a280200220f4922106a2000200b4103746a280200220d200f200e20101b221149220f6a210e200d2011200f1b2000200c200a20101b220d4103746a280200490d01200b200a200c20101b200f1b210d0c020b2000200110df040c0f0b200e41016a220e410c490d0002402001410176220b450d00200020014103746a41786a210a2000210c0340200c2902002118200c200a290200370200200a2018370200200c41086a210c200a41786a210a200b417f6a220b0d000b0b2001200d417f736a210d4101210a0c010b200e45210a0b0240200a452009724101710d002000200110e0040d0d0b2002450d02200d20014f0d01024020022802002000200d4103746a220a2802004f0d0020002108200121070c040b200029020021182000200a290200370200200a2018370200200041786a210f200041086a211120002902002218a721104100210c2001210b03400240200c200b417f6a220d4f0d002011200c4103746a210a0340200a28020020104b0d01200a41086a210a200d200c41016a220c470d000b200d210c0b200f200b4103746a210a02400340200c200b417f6a220b4f0d01200a280200210d200a41786a220e210a200d20104b0d000b2011200c4103746a220a2902002119200a200e41086a220d290200370200200d2019370200200c41016a210c0c010b0b2000201837020002402001200c41016a220a490d002000200a4103746a21002001200a6b220141154f0d010c0c0b0b200a20011044000b41b8e9c500200d20011034000b2007450d010b200d20074f0d012008290200211820082008200d4103746a220a290200370200200a2018370200200841086a210e20082902002219a72111410021142007417f6a2210450d02200e210a0340200a28020020114f0d03200a41086a210a2010201441016a2214470d000b201021140c020b4198e9c500410041001034000b41a8e9c500200d20071034000b200820074103746a210c2010210b02400340200c210d200b220a20144d22060d01200a417f6a210b200d41786a220c28020020114f0d000b0b0240200a2014490d002010200a490d0241800121054100210b410021014100210c4100210f4180012109200e20144103746a2215211003400240200d20106b220a4187104b22130d00200a410376220a41807f6a200a2001200b49200f200c49220e7222001b210a02402000450d002009200a200e1b2109200a2005200e1b21050c010b200a200a41017622096b21050b0240200f200c470d00024020090d002004220c210f0c010b4100210a2004220f210c2010210e0340200c200a3a0000200c200e28020020114f6a210c200e41086a210e2009200a41016a220a470d000b0b02402001200b470d00024020050d0020044180016a220b21010c010b200d41786a210a4100210e20044180016a2201210b0340200b200e3a0000200b200a2802002011496a210b200a41786a210a2005200e41016a220e470d000b0b0240200b20016b220a200c200f6b220e200e200a4b1b2212450d002010200f2d00004103746a220a2902002118200a200d20012d0000417f734103746a290200370200024020124101460d004100210a0340200d2001200a6a220e2d0000417f734103746a2010200f200a6a41016a22002d00004103746a290200370200201020002d00004103746a200d200e41016a2d0000417f734103746a290200370200200a41026a210e200a41016a2200210a200e2012490d000b200120006a2101200f20006a210f0b200d20012d0000417f734103746a2018370200200141016a2101200f41016a210f0b200d20054103746b200d2001200b461b210d201020094103746a2010200f200c461b211020130d000b02400240200f200c4f0d00200d210a03402010200c417f6a220c2d00004103746a220b2902002118200b200a41786a220a290200370200200a2018370200200f200c490d000c020b0b2010210a2001200b4f0d000340200a2902002118200a200d200b417f6a220b2d0000417f734103746a220c290200370200200c2018370200200a41086a210a2001200b490d000b0b200820193702002007200a20156b41037620146a22014d0d032008200820014103746a220a290200370200200a2019370200200720016b220c450d04200c20012001200c4b1b210b2007410376210d200a41086a2100024002402001200c417f6a220c490d002000200c200a2003108004200821000c010b2008200120022003108004200a2102200c21010b200b200d4f2105200141154f0d010c050b0b2014200a1044000b200a2010103c000b41a8e9c500200120071034000b41dc83c6001032000b20014102490d00200041786a21104100210e4101210b0340200b410374210c200b417f6a210a200b41016a210b02402000200c6a220d2802002000200a4103746a220f2802004f0d00200d2902002118200d200f2902003702000240200a450d00200e210c2010210a200d41706a2802002018a7220d4d0d00024002400340200a41086a200a290200370200200c4101460d01200c417f6a210c200a41786a220a280200200d4b0d000c020b0b4100210c0b2000200c4103746a210f0b200f20183702000b200e41016a210e201041086a2110200b2001470d000b0b20044180026a24000be00402097f017e230041306b22022400200241106a2203200141246a290200370300200241086a22042001411c6a29020037030020022001290214370300200241186a41106a2205200141106a280200360200200241186a41086a2206200141086a290200370300200220012902003703182000200241186a10fd0321070240024002400240200041206a28020022082000411c6a280200470d00200841016a22092008490d032008410174220a2009200a20094b1b220941ffffffff03712009470d032009410274220a4100480d030240024020080d00200a102821080c010b20002802182008410274200a102c21080b2008450d01200020083602182000411c6a2009360200200028022021080b200028021820084102746a20073602002000200028022041016a3602202005200329030037030020062004290300370300200220022903003703180240200041f0006a22032802002208200041ec006a280200470d00200841016a22042008490d03200841017422052004200520044b1b2204ad42187e220b422088a70d03200ba722054100480d030240024020080d002005102821080c010b2000280268200841186c2005102c21080b2008450d0220002008360268200041ec006a2004360200200041f0006a28020021080b2000280268200841186c6a22082002290318370200200841106a200241186a41106a290300370200200841086a200241186a41086a29030037020020032003280200220841016a360200024020012d002c450d0020004101360254200041d8006a20083602000b200241306a24000f0b200a41041037000b200541041037000b1031000bb20c01067f0240024020002d00002201410e4b0d00024002400240024002400240024002400240024002400240024020010e0f0001020304050607080e090e0a0b0c000b200041086a280200450d0d200041046a280200102a0f0b0240200041086a280200450d00200041046a280200102a0b200041146a280200450d0c200041106a280200102a0f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200102a0b200141106a2101200241706a22020d000b0b200041086a280200450d0b2000280204102a0f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101200241586a22020d000b0b200041086a280200450d0a2000280204102a0f0b200041086a280200450d09200041046a280200102a0f0b200041086a280200450d08200041046a280200102a0f0b200041086a280200450d07200041046a280200102a0f0b02402000410c6a2802002201450d00200041046a280200220320014104746a21040340024020032802082202450d0020032802002101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102a200528020021060b2006102a0b200141106a2101200241706a22020d000b0b200341106a21010240200341046a280200450d002003280200102a0b2001210320012004470d000b0b200041086a280200450d062000280204102a0f0b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200102a0b200141146a21012002416c6a22020d000b0b200041086a280200450d052000280204102a0f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a21040340024020032802042201450d0002402003410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102a200528020021060b2006102a0b200141106a2101200241706a22020d000b0b200341086a280200450d002003280204102a0b2003411c6a21010240200341146a280200450d002003280210102a0b2001210320012004470d000b0b200041086a280200450d042000280204102a0f0b02402000410c6a2802002201450d00200041046a2802002203200141186c6a210403400240200341046a280200450d002003280200102a0b0240200341146a2802002202450d00200328020c2101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102a200528020021060b2006102a0b200141106a2101200241706a22020d000b0b200341186a21010240200341106a280200450d00200328020c102a0b2001210320012004470d000b0b200041086a280200450d032000280204102a0f0b200041046a220110f904200041086a280200450d022001280200102a0f0b0240200041046a2802002201450d00200041086a280200450d002001102a0b0240200041146a2802002201450d0002402000411c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102a0b2001410c6a2101200241746a22020d000b0b200041186a280200450d002000280214102a0b200041246a2802002203450d0102402000412c6a2802002201450d00200320014104746a210403402003220541106a2103024020052802042201450d0002402005410c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102a0b2001410c6a2101200241746a22020d000b0b200541086a280200450d002005280204102a0b20032004470d000b0b200041286a280200450d012000280224102a0c010b0240200041086a280200450d00200041046a280200102a0b0240200041146a2802002201450d00200041186a280200450d002001102a0b200041246a280200450d00200041206a280200102a0f0b0bff7f05077f017e277f037e0f7f23002203210420034180096b4160712203240002400240024002400240024002400240024002400240411010282205450d00200541063a0000412010282206450d01200641063a001020064100360204200620032f00f0053b00012006412d3a0000200641036a200341f2056a2d00003a0000024020052d00004109470d0002402005280204220728020441ffffffff0371450d002007280200102a200528020421070b2007102a0b2005102a200141106a28020041306c2105200128020841546a210702400340024020050d00411010282207450d0520074180023b010c200742828080802037020420072006360200200720032f01d0033b010e0240200128021022052001410c6a280200470d00200541016a22082005490d0e200541017422092008200920084b1b2208ad42307e220a422088a70d0e200aa722094100480d0e0240024020050d002009102821050c010b2001280208200541306c2009102c21050b2005450d07200120053602082001410c6a2008360200200128021021050b2001280208200541306c6a220520032f00e0043b0001200541073a0000200542818080801037000820052007360004200520032902f005370210200541036a200341e2046a2d00003a0000200541186a200341f8056a290200370200200541206a20034180066a290200370200200541286a200341f0056a41186a2902003702002001200128021041016a220b3602104100210c0c020b200541506a21052007412c6a2108200741306a2209210720082d00004107470d000b200320032f01d0033b01f0050240200941086a22072802002205200941046a280200470d00200541016a22082005490d0c2005410174220d2008200d20084b1b220841ffffffff00712008470d0c2008410474220d4100480d0c0240024020050d00200d102821050c010b20092802002005410474200d102c21050b2005450d0620092005360200200941046a2008360200200941086a28020021050b200928020020054104746a22054180023b010c200542828080802037020420052006360200200520032f01f0053b010e2007200728020041016a360200200341c0006a200910fa032003280244417f6a210c2001280210210b0b200b41306c21052001280208220e41546a210702400340410021082005450d01200541506a21052007412c6a2109200741306a2206210720092d00004103470d000b200641086a2802002205450d00200541286c2107200628020041186a2105410021080340200820052d0000456a2108200541286a2105200741586a22070d000b0b200b41306c2105200e41546a210702400340410021092005450d01200541506a21052007412c6a2106200741306a220d210720062d00004103470d000b200d41086a2802002205450d00200541286c2107200d28020041186a2105410021090340200920052d0000456a2109200541286a2105200741586a22070d000b0b200b41306c2105200e415c6a2107024003404100210f024020050d00410021050c020b200541506a2105200741246a2106200741306a220d210720062d00004104470d000b200d28020021050b200341003602e0040240200520096a220b0d0041042110410021110c080b02402008450d00200342003703f005410021050c060b200341f0056a4100200110d60420032802f405210520032802f0054101470d05200341f8056a290300210a024020032802e0042207450d0020032802e404450d002007102a0b2003200a3702e404200320053602e00441002111410421104100210f0c060b411041081037000b412041081037000b411041041037000b200941041037000b200d41041037000b0240024002400240410410282210450d0020102005360200200b4102490d02024020084102490d00200342003703f0054100210d0c020b200341f0056a4101200110d60420032802f405210d20032802f0054101470d01200341f8056a290300210a024020032802e004450d0020032802e404450d0020032802e004102a0b2003200a3702e4042003200d3602e0040c020b410441041037000b410221064104210741012109410121110340200941016a210502400240024020092011470d0020062005200620054b1b221141ffffffff03712011470d0a2011410274220e4100480d0a20102007200e102c2210450d010b201020076a200d36020002402005200b4f0d000240200820054d0d00200342003703f0054100210d0c030b200341f0056a2005200110d60420032802f405210d20032802f0054101470d0220032903f805210a024020032802e004450d0020032802e404450d0020032802e004102a0b200941016a210f2003200a3702e4042003200d3602e0040c050b200941016a210f0c040b200e41041037000b200641026a2106200741046a2107200521090c000b0b4101210f410121110b20032802e00421050b2005450d0020032902e404210a02402011450d002010102a0b2000200536020420004101360200200041086a200a3702000c010b024020012802102205450d0020012802082212200541306c6a2113200341e0046a41146a2114200341e0076a211520034194066a2116200341a4066a2117200341b4066a2118200341c4066a2119200341d4066a211a200341e4066a211b200341f4066a211c20034184076a211d20034194076a211e200341a4076a211f200341b4076a2120200341c4076a2121200341d4076a212202400240024002400340024020122d0000410c470d00201228020c2205450d0020122802042206200541186c6a212303400240200641146a220e2802002205450d002006410c6a212441002109024002400340200920054f0d014101210502402024280200200941047422256a22072d0000410b470d002003200741046a22073602c00220072802002207200f4f0d03201020074102746a2802002208450d002003200c3602d407200341133a00d007200341d7003a00c007200320083602b4072003412d3a00b0072003200c3602a407200341123a00a00720032007360294072003410b3a009007200341063a008007200341003a00f00620034184083b01e006200341373a00d006200320023602c4062003412d3a00c0062003200c3602b406200341123a00b0062003200c3602a406200341133a00a006200341d6003a00900620032008360284062003412d3a0080062003200c3602f405200341123a00f005200e280200222620094d0d09200e2009360200200628020c2105200320153602f804200320243602f0042003200520256a220b41106a220d3602e8042003200941016a22273602e0042003202620276b22283602e40420032005202741047422296a222a3602ec042003200341f0056a3602f404200d21050240200b2d0000220841ac01460d004100210502400340200b20056a21070240200841ff01714109470d000240200741046a280200220828020441ffffffff0371450d002008280200102a0b2008102a0b2005450d012003200741206a3602e804200541106a2105200741106a2d0000220841ac01470d000b200b20056a41106a21050c010b200741106a21050b02402005202a460d0003402003200541106a22073602e80420052d0000220841ac01460d01024020084109470d000240200541046a280200220528020441ffffffff0371450d002005280200102a0b2005102a0b20072105200d2007470d000b0b02400240024002402028450d000240202720062802142205470d00200341f0056a21052015210b0c030b2025200541047422056b2108200628020c20056a2107200341f0056a21052015210d0340024002402005200d470d00410021050c010b2003200541106a3602f4040b200341d0036a200510d30420032d00d00341ac01460d04200720032903d003370300200741086a200341d0036a41086a2903003703002006200628021441016a3602142008450d02200741106a2107200841706a210820032802f804210d20032802f40421050c000b0b2024201410d7040c020b20032802f804210b20032802f40421050b0240200b20056b2207450d000240024020032802f004220d41046a222a280200222520266b20074104762208490d00200d28020021070c010b202620086a22072026490d12202541017422262007202620074b1b222641ffffffff00712026470d122026410474222b4100480d120240024020250d00202b102821070c010b200d2802002025410474202b102c21070b2007450d0d200d2007360200202a20263602000b2007202720086a22254104746a200720296a2028410474109b051a200320253602e0042025200d2802082207460d00200920086a410474200741047422076b2108200d28020020076a21070340024002402005200b470d00410021050c010b2003200541106a3602f4040b200341d0036a200510d30420032d00d00341ac01460d02200720032903d003370300200741086a200341d0036a41086a290300370300200d200d28020841016a3602082008450d01200741106a2107200841706a210820032802f804210b20032802f40421050c000b0b200341003602d803200342083703d003200341d0036a201410d70420032802d003222820032802d8032207410474220b6a210d20032802d40321292028210502402007450d000240024020032802f004222541046a222a280200220520032802e404222720032802e00422076a22266b200b4104752208490d00202528020021050c010b202620086a222b2026490d1220054101742226202b2026202b4b1b222641ffffffff00712026470d122026410474222b4100480d120240024020050d00202b102821050c010b20252802002005410474202b102c21050b2005450d0e20252005360200202a20263602000b2005200720086a220841047422266a200520074104746a2027410474109b051a200320083602e00420282105200820252802082207460d002025280200220520266a212a200520074104746a21082028210703400240200b0d00200d21050c020b200341d0036a41026a2205200741036a2d00003a0000200320072f00013b01d003024020072d0000222741ac01470d00200741106a21050c020b200741046a2802002126200741086a290300210a200820273a0000200841086a200a370300200841046a202636020020032f01d0032127200841036a20052d00003a0000200841016a20273b00002025202528020841016a360208200b41706a210b200741106a22052107200841106a2208202a470d000b0b02402005200d460d0003400240024020052d000022074109460d00200741ac01470d010c030b0240200541046a280200220728020441ffffffff0371450d002007280200102a0b2007102a0b200541106a2205200d470d000b0b2029450d002028102a0b024020032802e804220520032802ec04220d460d0003402003200541106a22073602e80420052d0000220841ac01460d01024020084109470d000240200541046a280200220528020441ffffffff0371450d002005280200102a0b2005102a0b20072105200d2007470d000b0b024020032802e4042205450d00024020032802e004220d20032802f004220b41086a22082802002207460d00200b280200220b20074104746a200b200d4104746a2005410474109b051a0b2008200520076a3602000b024020032d00f0054109470d00024020032802f405220528020441ffffffff0371450d002005280200102a20032802f40521050b2005102a0b024020032d0080064109470d000240200341f0056a41146a280200220528020441ffffffff0371450d002005280200102a20032802840621050b2005102a0b024020032d0090064109470d0002402016280200220528020441ffffffff0371450d002005280200102a20032802940621050b2005102a0b024020032d00a0064109470d0002402017280200220528020441ffffffff0371450d002005280200102a20032802a40621050b2005102a0b024020032d00b0064109470d0002402018280200220528020441ffffffff0371450d002005280200102a20032802b40621050b2005102a0b024020032d00c0064109470d0002402019280200220528020441ffffffff0371450d002005280200102a20032802c40621050b2005102a0b024020032d00d0064109470d000240201a280200220528020441ffffffff0371450d002005280200102a20032802d40621050b2005102a0b024020032d00e0064109470d000240201b280200220528020441ffffffff0371450d002005280200102a20032802e40621050b2005102a0b024020032d00f0064109470d000240201c280200220528020441ffffffff0371450d002005280200102a20032802f40621050b2005102a0b024020032d0080074109470d000240201d280200220528020441ffffffff0371450d002005280200102a20032802840721050b2005102a0b024020032d0090074109470d000240201e280200220528020441ffffffff0371450d002005280200102a20032802940721050b2005102a0b024020032d00a0074109470d000240201f280200220528020441ffffffff0371450d002005280200102a20032802a40721050b2005102a0b024020032d00b0074109470d0002402020280200220528020441ffffffff0371450d002005280200102a20032802b40721050b2005102a0b024020032d00c0074109470d0002402021280200220528020441ffffffff0371450d002005280200102a20032802c40721050b2005102a0b024020032d00d0074109470d0002402022280200220528020441ffffffff0371450d002005280200102a20032802d40721050b2005102a0b410f21050b200520096a2209200e2802002205490d000c030b0b41ace4c500200920051034000b2003410136028406200342013702f405200341bce4c5003602f0052003412c3602d4032003200341d0036a360280062003200341c0026a3602d003200341e0046a200341f0056a103320032802e00422050d040b200641186a22062023470d000b0b201241306a22122013470d000c050b0b20032902e404210a2000200536020420004101360200200041086a200a3702002011450d042010102a0c040b41e4e8c5001032000b202b41081037000b202b41081037000b200341c8006a41106a200141106a2802002220360200200341c8006a41086a200141086a290200220a37030020032001290200370348202041306c2105200aa7221241546a210702400340024020050d00410021080c020b200541506a21052007412c6a2108200741306a2209210720082d00004108470d000b200341386a200910fa0320032802382108200328023c21050b2005410020081b210d202041306c2105201241546a21072008410420081b210802400340024020050d00410021090c020b200541506a21052007412c6a2109200741306a2206210720092d0000410a470d000b200341306a200610fa0320032802302109200328023421050b2005410020091b210b202041306c2105201241546a21072009410420091b211702400340024020050d004100211c0c020b200541506a21052007412c6a2109200741306a2206210720092d00004109470d000b200628020021074101211c0b20034200370274200341f8b9c0003602702017200b411c6c6a211f2008200d41146c6a210d200341e0046a410272221b41266a2121201b41186a2122201b41086a212b4104211641002124410021264100211e4100211d410021140240024002400240410041ff01710e03000102000b410021050c020b410221050c010b410121050b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e03000104040b0240201441ff01710e03020300020b201e4101470d04410021050c0b0b201c450d0f4100211c410221284100212a200721050c1d0b034002400240024002400240200d200822056b413c4b0d002005200d470d01200521080c020b200528020c0d03200541146a2108200541106a28020021050c1f0b200541106a21090340200528020c450d02200941146a2109200541146a2205200d470d000b200d21080b201e4101470d07410021050c0a0b200941046a2108200928020021050c1c0b200541206a280200450d1a200541346a280200450d19200541d0006a2108200541c8006a280200450d180c000b0b0340024002400240200d200822056b413c4b0d00410121142005200d470d01200521080c2b0b200528020c0d01200541146a2108200541106a28020021050c180b200541106a210902400340200528020c450d01200941146a2109200541146a2205200d470d000b200d21080c2a0b200941046a2108200928020021050c170b200541206a280200450d15200541346a280200450d14200541d0006a2108200541c8006a280200450d130c000b0b024002400240201441ff01710e03010200010b201e4101470d03410021050c080b034002400240024002400240200d200822056b413c4b0d002005200d470d01200521080c020b200528020c0d03200541146a2108200541106a28020021050c160b200541106a21090340200528020c450d02200941146a2109200541146a2205200d470d000b200d21080b201e4101470d07410021050c080b200941046a2108200928020021050c130b200541206a280200450d11200541346a280200450d10200541d0006a2108200541c8006a280200450d0f0c000b0b0340024002400240200d200822056b413c4b0d002005200d460d10200541106a21090340200528020c450d02200941146a2109200541146a2205200d470d000c110b0b200528020c0d01200541146a2108200541106a28020021050c0e0b200941046a2108200928020021050c0d0b200541206a280200450d0b200541346a280200450d0a200541d0006a2108200541c8006a280200450d090c000b0b410121050c060b410121050c040b410121050c020b410121050b0340024002400240024020050e020001010b2029201d470d01410121050c030b2017201f460d0a200341206a201710cd0420032802202229450d0a2017411c6a2117202920032802244102746a211d0c010b2029450d09202928020021054101211e41022114202941046a2129410121280c160b410021050c000b0b0340024002400240024020050e020001010b2029201d470d014101211e2029211d410121050c030b410221142017201f460d22200341106a201710cd042017411c6a211720032802102205450d23200520032802144102746a211d200521290c010b202941046a2109024020290d00410221144101211e200921290c230b2029280200210541002128410221144101211e200921290c150b410021050c000b0b0340024002400240024020050e020001010b2029201d470d01410121050c030b2017201f460d08200341286a201710cd0420032802282229450d082017411c6a21172029200328022c4102746a211d0c010b2029450d07202928020021054101211e41022114202941046a2129410121280c140b410021050c000b0b0340024002400240024020050e020001010b2029201d470d014101211e2029211d410121050c030b410221142017201f460d20200341186a201710cd042017411c6a211720032802182205450d212005200328021c4102746a211d200521290c010b202941046a2109024020290d00410221144101211e200921290c210b2029280200210541002128410221144101211e200921290c130b410021050c000b0b200541cc006a28020021050c020b2005413c6a2108200541386a28020021050c010b200541286a2108200541246a28020021050b41012114410121280c0d0b200341e0006a41086a200341f0006a41086a280200360200200320032903703703602003280258220d41306c21052003280250220b41546a210702400340410021082005450d01200541506a21052007412c6a2109200741306a2206210720092d00004103470d000b200641086a2802002205450d00200541286c2107200628020041186a2105410021080340200820052d0000456a2108200541286a2105200741586a22070d000b0b200d41306c2105200b415c6a210702400340024020050d00410021050c020b200541506a2105200741246a2109200741306a2206210720092d00004104470d000b200628020021050b200341f0056a41106a2228200341c8006a41106a280200360200200341f0056a41086a200341c8006a41086a290300370300200320032903483703f005200341b0016a200341f0056a10fc0302402026450d00201620264102746a212a200520086a2125200341f0056a41e0016a210f200341f0056a41d0016a2115200341f0056a41c0016a2129200341f0056a41b0016a2114200341f0056a41a0016a2117200341f0056a4190016a2118200341f0056a4180016a2119200341f0056a41f0006a211a200341f0056a41e0006a211b200341f0056a41d0006a211c200341f0056a41c0006a211d200341f0056a41306a211e200341f0056a41206a211f200341e7046a212020034184066a212120034194066a2122200341b4066a212b200341c4066a2123200341d4066a2112200341e4066a2101200341f4066a211320034184076a212c20034194076a212d200341a4076a212e200341b4076a212f200341c4076a2130200341d4076a21312016212703402027220541046a212720052802002106200341e0006a21052003280264210b03402005280200220d41086a2107200d2f0106220e4102742105417f210802400340024020050d00200e21080c020b20072802002109200841016a21082005417c6a2105200741046a21070240417f2009200647200920064b1b41016a0e03020001020b0b200d41346a20084105746a220e2802182107200e28021c21052003200c3602d407200341133a00d007200341d7003a00c007200320053602b4072003412d3a00b0072003200c3602a407200341123a00a00720032007360294072003410b3a009007200341063a008007200341003a00f00620034184083b01e006200341373a00d006200320023602c4062003412d3a00c0062003200c3602b406200341123a00b0062003200c3602a406200341133a00a006200341d6003a00900620032005360284062003412d3a0080062003200c3602f405200341123a00f005200e280208220d41106a220541ffffffff00712005470d1220054104742207417f4c0d12200e41086a21260240024002400240024020070d00410821060c010b200710282206450d012026280200210d0b0240200d0d00410021080c030b41002109410021070340024020072005470d00200541016a22082005490d262005410174220b2008200b20084b1b220841ffffffff00712008470d262008410474220b4100480d260240024020050d00200b102821060c010b20062005410474200b102c21060b2006450d03200821050b200620096a2208410f3a0000200841046a2007360200200841016a20032f01d0033b0000200841036a200341d0036a41026a2d00003a0000200941106a2109200741016a22082107200d2008460d030c000b0b200741081037000b200b41081037000b02400240024002400240024002400240200520086b410e4d0d00200521090c010b2008410f6a22072008490d28200541017422092007200920074b1b220941ffffffff00712009470d28200941047422074100480d280240024020050d002007102821060c010b200620054104742007102c21060b2006450d010b200341e0046a200341f0056a10d904200620084104746a220520032903e004370300200541086a200341e0046a41086a2207290300370300200341e0046a202810d904200541186a2007290300370300200520032903e004370310200341e0046a201f10d904200541286a2007290300370300200541206a20032903e004370300200341e0046a201e10d904200541386a2007290300370300200541306a20032903e004370300200341e0046a201d10d904200541c8006a2007290300370300200541c0006a20032903e004370300200341e0046a201c10d904200541d8006a2007290300370300200541d0006a20032903e004370300200341e0046a201b10d904200541e8006a2007290300370300200541e0006a20032903e004370300200341e0046a201a10d904200541f8006a2007290300370300200541f0006a20032903e004370300200341e0046a201910d90420054188016a200729030037030020054180016a20032903e004370300200341e0046a201810d90420054198016a200729030037030020054190016a20032903e004370300200341e0046a201710d904200541a8016a2007290300370300200541a0016a20032903e004370300200341e0046a201410d904200541b8016a2007290300370300200541b0016a20032903e004370300200341e0046a202910d904200541c8016a2007290300370300200541c0016a20032903e004370300200341e0046a201510d904200541d8016a2007290300370300200541d0016a20032903e004370300200341e0046a200f10d904200541e8016a2007290300370300200541e0016a20032903e004370300024002402008410f6a22052009460d002009210d200521090c010b200941016a22052009490d28200941017422072005200720054b1b220d41ffffffff0071200d470d28200d41047422054100480d280240024020090d002005102821060c010b200620094104742005102c21060b2006450d020b200620094104746a220541063a0000200520032900e004370001200541086a2020290000370000200341e0046a200341b0016a418c01109a051a411010282207450d02200741063a0000200341d0036a200341e0046a418c01109a051a20262802002205417f4c0d18200e28020021090240024020050d004101210b410120092005109a05220920092005109a051a2005ad2132410021050c010b20051028220b450d04200b20092005109a05210920051028220b450d05200b20092005109a051a2009102a2005ad21320b200341e0046a200341d0036a418c01109a051a200e31000d2133200341d0036a200341e0046a418c01109a051a200341e0046a200341d0036a418c01109a051a200341c0026a200341e0046a418c01109a051a411010282209450d05200841106a2108200a428080808080804083220a2032842033422886844280808080800c842132200941063a00002009102a200341d0036a200341c0026a418c01109a051a200341e0046a200341d0036a418c01109a051a024020072d00004109470d0002402007280204220928020441ffffffff0371450d002009280200102a200728020421090b2009102a0b2007102a200341c0026a200341e0046a418c01109a051a200341e0046a200341c0026a418c01109a051a200341003602fc03200320083602f8032003200d3602f403200320063602f003200341003602ec03200342043702e403200320323702dc03200320053602d8032003200b3602d403200341013602d003200341e0046a200341d0036a108104200341b0016a200341e0046a418c01109a051a200e4101360210200e2025360214024020032d00f0054109470d00024020032802f405220528020441ffffffff0371450d002005280200102a20032802f40521050b2005102a0b024020032d0080064109470d0002402021280200220528020441ffffffff0371450d002005280200102a20032802840621050b2005102a0b024020032d0090064109470d0002402022280200220528020441ffffffff0371450d002005280200102a20032802940621050b2005102a0b024020032d00a0064109470d000240200341f0056a41346a280200220528020441ffffffff0371450d002005280200102a20032802a40621050b2005102a0b024020032d00b0064109470d000240202b280200220528020441ffffffff0371450d002005280200102a20032802b40621050b2005102a0b024020032d00c0064109470d0002402023280200220528020441ffffffff0371450d002005280200102a20032802c40621050b2005102a0b024020032d00d0064109470d0002402012280200220528020441ffffffff0371450d002005280200102a20032802d40621050b2005102a0b024020032d00e0064109470d0002402001280200220528020441ffffffff0371450d002005280200102a20032802e40621050b2005102a0b024020032d00f0064109470d0002402013280200220528020441ffffffff0371450d002005280200102a20032802f40621050b2005102a0b024020032d0080074109470d000240202c280200220528020441ffffffff0371450d002005280200102a20032802840721050b2005102a0b024020032d0090074109470d000240202d280200220528020441ffffffff0371450d002005280200102a20032802940721050b2005102a0b024020032d00a0074109470d000240202e280200220528020441ffffffff0371450d002005280200102a20032802a40721050b2005102a0b024020032d00b0074109470d000240202f280200220528020441ffffffff0371450d002005280200102a20032802b40721050b2005102a0b024020032d00c0074109470d0002402030280200220528020441ffffffff0371450d002005280200102a20032802c40721050b2005102a0b024020032d00d0074109470d0002402031280200220528020441ffffffff0371450d002005280200102a20032802d40721050b2005102a0b200a4280808080808c0184210a202541016a21252027202a470d080c090b200741081037000b200541081037000b411041081037000b200541011037000b200541011037000b411041081037000b0240200b450d00200b417f6a210b200d20084102746a4194036a21050c010b0b0b4198ebc5004180011050000b02402024450d002016102a0b200341f0056a200341b0016a418c01109a051a200341e0046a200341f0056a10fe030240200341e0046a41106a2802002205450d0020032802e8042228200541306c6a212a0340024020282d000041786a220541024b0d0002400240024020050e03000102000b202828020c2205450d0220282802042208200541146c6a210c03400240200828020c0d002008280210210d200341e0006a21052003280264210e03402005280200220b41086a2107200b2f010622244102742105417f210902400340024020050d00202421090c020b20072802002106200941016a21092005417c6a2105200741046a21070240417f2006200d472006200d4b1b41016a0e03020001020b0b0240200b41346a20094105746a2205280210450d00200820052802143602100c030b4198ecc50041351050000b200e450d01200e417f6a210e200b20094102746a4194036a21050c000b0b200841146a2208200c470d000c030b0b20282802042106200341e0006a21052003280264210b03402005280200220d41086a2107200d2f0106220e4102742105417f210802400340024020050d00200e21080c020b20072802002109200841016a21082005417c6a2105200741046a21070240417f2009200647200920064b1b41016a0e03020001020b0b0240200d41346a20084105746a2205280210450d00202820052802143602040c040b4198ecc50041351050000b200b450d02200b417f6a210b200d20084102746a4194036a21050c000b0b202828020c2205450d00202828020422272005411c6c6a21260340024020272802182205450d002027280210220e20054102746a21250340200e220c41046a210e200c2802002106200341e0006a21052003280264210b03402005280200220d41086a2107200d2f010622244102742105417f2108024002400340024020050d00202421080c020b20072802002109200841016a21082005417c6a2105200741046a21070240417f2009200647200920064b1b41016a0e03020001020b0b0240200d41346a20084105746a2205280210450d00200c20052802143602000c020b4198ecc50041351050000b200b450d00200b417f6a210b200d20084102746a4194036a21050c010b0b200e2025470d000b0b2027411c6a22272026470d000b0b202841306a2228202a470d000b0b200341ec046a290200210a20032802e004210520032902e404213220032802602003280264200328026810da04200041106a200a370200200041086a203237020020002005360204200041003602002011450d1c2010102a200424000f0b200541cc006a28020021050c020b2005413c6a2108200541386a28020021050c010b200541286a2108200541246a28020021050b41012128410021140c080b200541cc006a28020021050c020b2005413c6a2108200541386a28020021050c010b200541286a2108200541246a28020021050b41002128410121140c040b200541cc006a28020021050c020b2005413c6a2108200541386a28020021050c010b200541286a2108200541246a28020021050b41002114410021280b2007212a0b2003200536027c02402005200f490d002003410136028406200342023702f40520034188ebc5003602f005200341013602d4032003200341d0036a360280062003200341fc006a3602d003200341e0046a200341f0056a103320032902e404220a422088a7210820032802e0042125200aa7211a0c0a0b201020054102746a2802002207450d050240024020262024460d0020242115202621240c010b202441016a22092024490d10202441017422062009200620094b1b221541ffffffff03712015470d10201541027422094100480d100240024020240d002009102821160c010b201620244102742009102c21160b2016450d020b201620244102746a2005360200200341f0056a200328027c220b200341c8006a10db0420032802f805211a20032802f4052125024020032802f00522194101470d0020032802fc052108201521240c0a0b20252802082205417f4c0d002025280200210920252d000c210602400240024020050d004100210e410121240c010b2005210e200510282224450d010b202420092005109a05210920032005360288012003200e360284012003200936028001200320063a008c01200320252d000d3a008d0120034100360290012003200328027c360298012003200736029c010240024002402003280270220741f8b9c000460d00200328027421270c010b20214200370100201b41206a420037010020224200370100201b41106a4200370100202b4200370100201b4200370100200341f0056a410041e0021099051a41940310282207450d014100212720074100360200200720032903e0043702042007410c6a200341e0046a41086a290300370200200741146a200341e0046a41106a2903003702002007411c6a200341e0046a41186a290300370200200741246a200341e0046a41206a2903003702002007412c6a200341e0046a41286a290300370200200741346a200341f0056a41e002109a051a20034100360274200320073602700b202641016a2126034020072f0106221841027421244100210541142106417f210902400340024020242005470d00201821090c020b200720056a210e200941016a2109200641206a2106200541046a21050240417f200e41086a280200220e200b47200e200b4b1b41016a0e03020001020b0b200720066a2205290200210a2005200329038001370200200541186a200329039801370200200541106a220729020021322007200329039001370200200541086a200329038801370200203242ffffffff0f83420285500d08200a42808080807083500d08200aa7102a0c080b02402027450d002027417f6a2127200720094102746a4194036a28020021070c010b0b2003200328027841016a360278200329039801210a20032903900121322003290388012133200329038001213420072f01062206410b490d0420214200370100201b41206a2235420037010020224200370100201b41106a22364200370100202b4200370100201b4200370100200341f0056a410041e0021099051a024041940310282205450d0020054100360200200520032903e0043702042005410c6a200341e0046a41086a222c290300370200200541146a200341e0046a41106a222d2903003702002005411c6a200341e0046a41186a222e290300370200200541246a200341e0046a41206a22372903003702002005412c6a200341e0046a41286a2238290300370200200541346a200341f0056a41e002109a05210e200341f0056a41086a2227200741fc016a290200370300200341f0056a41106a221820074184026a290200370300200341f0056a41186a22232007418c026a290200370300200320072902f4013703f00520072802202139200541086a200741246a20072f010641796a2206410274109a052124200e20074194026a2006410574109a05210e200741063b0106200520063b0106202e2023290300370300202d2018290300370300202c2027290300370300200320032903f0053703e0040240024020094107490d0020242009417a6a22134102746a2024200941796a22014102746a2209200641ffff037120016b410274109b051a2009200b360200200e20134105746a200e20014105746a2209200541066a22062f010020016b410574109b051a200941186a200a37020020092032370210200920333702082009203437020020062f0100210e0c010b200741086a2206200941016a22244102746a200620094102746a2201200741066a22062f0100220e20096b2213410274109b051a2001200b360200200741346a220b20244105746a200b20094105746a22092013410574109b051a200941186a200a3702002009203237021020092033370208200920343702000b2006200e41016a3b0100200341d0036a41186a222f202e290300220a370300200341d0036a41106a2230202d2903002232370300200341d0036a41086a2231202c2903002233370300200341b0016a41186a223a200a370300200341b0016a41106a223b2032370300200341b0016a41086a223c2033370300200320032903e004220a3703d0032003200a3703b00102402007280200220e0d00200521090c070b20072f010421012005213d0340200341c0026a41186a223e203a290300370300200341c0026a41106a223f203b290300370300200341c0026a41086a2240203c290300370300200320032903b0013703c002200141ffff0371210b02400240024002400240200e2f01062205410b490d0020214200370100203542003701002022420037010020364200370100202b4200370100201b42003701002031202c2903003703002030202d290300370300202f202e290300370300200341d0036a41206a22052037290300370300200341d0036a41286a22072038290300370300200320032903e0043703d003200341f0056a41004190031099051a41c40310282209450d0320094100360200200920032903d0033702042009410c6a2031290300370200200941146a20302903003702002009411c6a202f290300370200200941246a20052903003702002009412c6a2007290300370200200941346a200341f0056a419003109a052107200e41206a28020021412023200e418c026a2902003703002018200e4184026a2902003703002027200e41fc016a2902003703002003200e41f4016a2902003703f005200941086a200e41246a200e2f0106220641796a2205410274109a0521422007200e4194026a2005410574109a05214320094194036a200e41b0036a2006417a6a2224410274109a052113200e41063b0106200920053b010602402024450d00410021052013210703402007280200220620053b010420062009360200200741046a21072024200541016a2205470d000b0b202e2023290300220a370300202d20182903002232370300202c20272903002233370300200320032903f00522343703e0042023200a3703002018203237030020272033370300200320343703f005200141ffff037122074107490d012042200b417a6a220641027422246a2042200b41796a22054102746a220720092f010620056b410274109b051a20072039360200204320064105746a204320054105746a220720092f010620056b410574109b051a200741186a203e290300370200200741106a203f290300370200200741086a2040290300370200200720032903c002370200200920092f010641016a22073b0106200b410274220120136a416c6a201320246a2224200741ffff0371220b20066b410274109b051a2024203d360200200b2006490d02200920016a41fc026a2107034020072802002206200541016a22053b010420062009360200200741046a21072005200b490d000c030b0b200e41086a2207200b41016a220941027422066a2007200b41027422246a22072005200b6b2227410274109b051a20072039360200200e41346a220720094105746a2007200b4105746a22072027410574109b051a200741186a203e290300370200200741106a203f290300370200200741086a2040290300370200200720032903c002370200200e200541016a22053b01062024200e4194036a22076a41086a200720066a2207200541ffff0371220620096b410274109b051a2007203d360200200b20064f0d0c200e2009417f6a22054102746a4198036a2107034020072802002209200541016a22053b01042009200e360200200741046a210720052006490d000c0d0b0b200e41086a2205200b41016a222441027422066a2005200b41027422016a2205200e2f01062213200b6b2242410274109b051a20052039360200200e41346a220520244105746a2005200b4105746a22052042410574109b051a200541186a203e290300370200200541106a203f290300370200200541086a2040290300370200200520032903c002370200200e201341016a22053b01062001200e4194036a22136a41086a201320066a2213200541ffff0371220620246b410274109b051a2013203d360200200720064f0d00200e20016a4198036a2105034020052802002207200b41016a220b3b01042007200e360200200541046a21052006200b470d000b0b203a2023290300370300203b2018290300370300203c2027290300370300200320032903f0053703b001200e28020022050d01204121390c090b41c40341041037000b200e2f010421012005210e204121392009213d0c000b0b41940341041037000b41940341041037000b200541011037000b1036000b200941041037000b200741086a2205200941016a220e4102746a200520094102746a2205200620096b2224410274109b051a2005200b360200200741346a2205200e4105746a200520094105746a22052024410574109b051a200541186a200a3702002005203237021020052033370208200520343702002007200641016a3b01060c010b20214200370100203542003701002022420037010020364200370100202b4200370100201b42003701002031202c2903003703002030202d290300370300202f202e290300370300200341d0036a41206a22072037290300370300200341d0036a41286a22062038290300370300200320032903e0043703d003200341f0056a41004190031099051a41c40310282205450d0220054100360200200520032903d0033702042005410c6a2031290300370200200541146a20302903003702002005411c6a202f290300370200200541246a20072903003702002005412c6a2006290300370200200541346a200341f0056a419003109a05210b20052003280270220736029403200320053602702003200328027441016a36027420072005360200200741003b0104200b20052f010622064105746a220720032903b001370200200741186a203a290300370200200741106a203b290300370200200741086a203c290300370200200520064102746a41086a203936020020054194036a200641016a22074102746a2009360200200520073b0106200920073b0104200920053602000b02402019450d00201a450d002025102a0b201521240b202a2107202841ff01710e03010205010b41c40341041037000b410021050c040b410221050c030b20032802702003280274200328027810da0402402024450d002016102a0b02402020450d00202041306c2107201221050340200510dc04200541306a2105200741506a22070d000b0b0240200341d4006a280200450d002012102a0b2000202536020420004101360200200041086a2008ad422086201aad843702002011450d042010102a200424000f0b201f21170b410121050c000b0b024020012802102205450d0020012802082103200541306c21050340200310dc04200341306a2103200541506a22050d000b0b2001410c6a280200450d002001280208102a0b200424000f0b1031000bfc8c0204117f017e0b7f017e230041e0006b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e100100021817161514130d0b0c09080706010b200141186a2802002104200141146a2802002105200141106a28020021062001410c6a2802002107200141086a2802002108200141046a28020021090240200241046a280200200241086a280200220a460d002002280200210b0c1e0b200a41016a220b200a490d1a200a410174220c200b200c200b4b1b220c4100480d1a02400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d042002200b360200200241046a200c360200200241086a280200210a0c1d0b2001410c6a280200210b200141086a2802002105200141046a280200210420012d0001210d02400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d1a200a4101742206200c2006200c4b1b22064100480d1a02400240200a0d0020061028210c0c010b2002280200200a2006102c210c0b200c450d032002200c360200200241046a2006360200200241086a280200210a0b200241086a2206200a41016a360200200c200a6a200d3a000002400240200241046a280200220c2006280200220a6b200b490d002002280200210c0c010b200a200b6a220d200a490d1a200c410174220a200d200a200d4b1b220a4100480d1a02400240200c0d00200a1028210c0c010b2002280200200c200a102c210c0b200c450d022002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2004200b109a051a4100210b4101210d024020050d004101210c0c270b2004102a4101210c0c260b2001410c6a2802002106200141086a280200210e200141046a280200210f024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d1a200a410174220c200b200c200b4b1b220c4100480d1a02400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41013a0000200f20064104746a21104100210c4100210b41002105410121042006210a024003400240200b2005470d00200c200b41016a220d200c200d4b1b22054100480d1c02400240200c0d002005102821040c010b2004200b2005102c21040b2004450d020b2004200b6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41026a210c200b41016a210b200d210a200d0d000b024020060d00200f21080c190b200f210a02400340200a41106a2108200a2d000d22114105460d1a200a2d000c210c200a2802082109200a2802042112200a28020021130240024002400240024002402005200b470d00200b41016a220a200b490d22200b410174220d200a200d200a4b1b22054100480d2202400240200b0d002005102821040c010b2004200b2005102c21040b2004450d010b2004200b6a200c3a0000200b41016a210a200b410174220b41046a2107200b41026a210c2009210b0340200721060240200a2005470d00200a41016a220d200a490d23200c200d200c200d4b1b22054100480d2302400240200a0d002005102821040c010b2004200a2005102c21040b2004450d030b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200641026a2107200c41026a210c200a41016a210a200d210b200d0d000b0240024020090d00200a210b0c010b4100210c0340200a200c6a210b41fc00210d02400240024002402013200c6a2d00000e050200010305020b41fe00210d0c020b41fd00210d0c010b41ff00210d0b0240200b2005470d00200b41016a2205200b490d2420062005200620054b1b22054100480d2402400240200b0d002005102821040c010b2004200b2005102c21040b2004450d050b2004200a6a200c6a200d3a0000200641026a21062009200c41016a220c470d000b200a200c6a210b0b20120d030c040b200541011037000b200541011037000b200541011037000b2013102a0b4100210a0240024020114104460d0002402005200b470d00200b41016a220a200b490d1f200b410174220c200a200c200a4b1b22054100480d1f02400240200b0d002005102821040c010b2004200b2005102c21040b2004450d020b2004200b6a41013a0000200b41016a210b201141077141ff0073210a0b02402005200b470d00200b41016a220c200b490d1e200b410174220d200c200d200c4b1b22054100480d1e02400240200b0d002005102821040c010b2004200b2005102c21040b2004450d030b2004200b6a200a3a0000200b41016a210b2008210a20082010470d010c1c0b0b200541011037000b200541011037000b200541011037000b200c41011037000b200a41011037000b200641011037000b200c41011037000b200141286a2802002113200141246a280200210f200141206a28020021082001411c6a2802002107200141186a2802002112200141146a28020021092001410c6a2902002114200141086a2802002110200141046a28020021110240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d27200a410174220c200b200c200b4b1b220c4100480d2702400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41003a0000200341dc006a410036020020034201370254200320023602502014422088a7210d4100210a4100210b2014a72206210c034002400240200a200b460d002003280254210a0c010b200a41016a2204200a490d28200a41017422052004200520044b1b22044100480d2802400240200a0d0020041028210a0c010b2003280254200a2004102c210a0b200a450d03200320043602582003200a3602540b2003200b41016a36025c200a200b6a200c41807f72200c41ff0071200c41077622041b3a00002003280258210a200328025c210b2004210c20040d000b02400240200a200b6b2006490d00200328025421040c010b200b20066a220c200b490d27200a4101742204200c2004200c4b1b220c4100480d2702400240200a0d00200c102821040c010b2003280254200a200c102c21040b2004450d032003200c36025820032004360254200c210a0b2003200b20066a220c36025c2004200b6a20112006109a051a02402010450d002011102a0b034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d28200a4101742204200b2004200b4b1b220b4100480d2802400240200a0d00200b1028210a0c010b2003280254200a200b102c210a0b200a450d052003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220b1b3a00000240200b450d002003280258210a200328025c210c200b210d0c010b0b4101211102402009450d002007210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d29200a410174220d200c200d200c4b1b220d4100480d2902400240200a0d00200d1028210c0c010b2003280254200a200d102c210c0b200c450d072003200d3602582003200c3602540b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280258220b200328025c220a6b2007490d002003280254210b0c010b200a20076a220c200a490d28200b410174220d200c200d200c4b1b220c4100480d2802400240200b0d00200c1028210b0c010b2003280254200b200c102c210b0b200b450d072003200c3602582003200b3602540b2003200a20076a36025c200b200a6a20092007109a051a410021112012450d002009102a0b200820134104746a21062013210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d28200a410174220d200c200d200c4b1b220d4100480d2802400240200a0d00200d1028210c0c010b2003280254200a200d102c210c0b200c450d082003200d3602582003200c3602540b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b2008210402402013450d00411021072008210403402004220b41106a2104200b280200220c4108460d01200b410c6a2802002102200b41086a280200210a200b280204210b024002400240024002400240024002400240200c0e080001020304050607000b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d31200c4101742205200d2005200d4b1b22054100480d3102400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d12200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41003a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d32200c4101742205200d2005200d4b1b22054100480d3202400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d14200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d32200b410174220d200c200d200c4b1b220d4100480d3202400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d152003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c080b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d30200c4101742205200d2005200d4b1b22054100480d3002400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d14200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41013a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d31200c4101742205200d2005200d4b1b22054100480d3102400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d16200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d31200b410174220d200c200d200c4b1b220d4100480d3102400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d172003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c070b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2f200c4101742205200d2005200d4b1b22054100480d2f02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d16200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41023a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d30200c4101742205200d2005200d4b1b22054100480d3002400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d18200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d30200b410174220d200c200d200c4b1b220d4100480d3002400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d192003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c060b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2e200c4101742205200d2005200d4b1b22054100480d2e02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d18200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41033a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2f200c4101742205200d2005200d4b1b22054100480d2f02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d1a200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d2f200b410174220d200c200d200c4b1b220d4100480d2f02400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d1b2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b20032002200341d0006a10eb0420032d0000220a411f460d0420032f000120032d000341107472210d0c280b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2d200c4101742205200d2005200d4b1b22054100480d2d02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d1a200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41043a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2e200c4101742205200d2005200d4b1b22054100480d2e02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d1c200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d2e200b410174220d200c200d200c4b1b220d4100480d2e02400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d1d2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b20032002200341d0006a10eb0420032d0000220a411f460d0320032f000120032d000341107472210d0c270b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2c200c4101742205200d2005200d4b1b22054100480d2c02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d1c200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41053a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2d200c4101742205200d2005200d4b1b22054100480d2d02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d1e200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d2d200b410174220d200c200d200c4b1b220d4100480d2d02400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d1f2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b20032002200341d0006a10eb0420032d0000220a411f460d0220032f000120032d000341107472210d0c260b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2b200c4101742205200d2005200d4b1b22054100480d2b02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d1e200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41063a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2c200c4101742205200d2005200d4b1b22054100480d2c02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d20200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d2c200b410174220d200c200d200c4b1b220d4100480d2c02400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d212003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c020b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2a200c4101742205200d2005200d4b1b22054100480d2a02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d20200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41073a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2b200c4101742205200d2005200d4b1b22054100480d2b02400240200c0d0020051028210d0c010b2003280254200c2005102c210d0b200d450d22200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d2b200b410174220d200c200d200c4b1b220d4100480d2b02400240200b0d00200d1028210c0c010b2003280254200b200d102c210c0b200c450d232003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b0b200741106a210720042006470d000b200621040b0240034020062004460d012004280200210a200441106a2104200a4108470d000b0b0240200f450d002008102a0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d28200a4101742206200c2006200c4b1b22064100480d2802400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d212004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d27200b410174220a200c200a200c4b1b220a4100480d2702400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d212004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021104101210d2009450d222011450d222012450d222009102a0c220b200c41011037000b200441011037000b200c41011037000b200b41011037000b200d41011037000b200c41011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200541011037000b200541011037000b200d41011037000b200641011037000b200a41011037000b20032903082114200328020421042013410474210c02400340200c2007460d01200820076a210b200741106a2107200b2802004108470d000b0b0240200f450d002008102a0b02402003280258450d002003280254102a0b02402009450d002011450d002012450d002009102a0b200a411f470d17410021104101210d0b4101210b4101210c410121044101210641012105410121074101210241012112410121084101210941012113410121110c3a0b2001412c6a280200210e200141286a2802002115200141246a2802002111200141206a28020021162001411c6a2802002117200141186a2802002118200141146a28020021102001410c6a2902002114200141086a2802002119200141046a28020021120240024002400240024002400240024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d14200a410174220c200b200c200b4b1b220c4100480d1402400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b4101210d200241086a200a41016a36020041002109200b200a6a41003a0000024041041028220f450d00200f41eec2b5ab063600000240024002400240024020120d00410021044100211a0c010b410121074100210a410021062014a72209210b034002400240200a2006460d00200a21082006210c0c010b200a41016a220c200a490d1a200a410174220d200c200d200c4b1b22084100480d1a02400240200a0d002008102821070c010b2007200a2008102c21070b02402007450d00200a210c2008210a0c010b200841011037000b2007200c6a200b41807f72200b41ff0071200b410776220d1b3a0000200c41016a2106200d210b200d0d000b02400240024002400240200820066b20094f0d00200620096a220a2006490d1d2008410174220b200a200b200a4b1b220a4100480d1d0240024020080d00200a102821070c010b20072008200a102c21070b2007450d01200a21080b200720066a20122009109a051a02402019450d002012102a0b41011028220d450d07200d41003a0000410221054101210a41012104200620096a2213210b03400240200a2004470d002005200a41016a2204200520044b1b22044100480d1e200d200a2004102c220d450d080b200d200a6a200b41807f72200b41ff0071200b41077622061b3a0000200541026a2105200a41016a210a2006210b20060d000b2004200a6b20134f0d03200a20136a220b200a490d1c20044101742205200b2005200b4b1b220b4100480d1c20040d01200b1028210d0c020b200a41011037000b200d2004200b102c210d0b200d450d02200b21040b200d200a6a20072013109a051a4101211a2009200c6a200a6a41016a21092008450d002007102a0b0240024002400240024020100d004101211b0c010b4100211b20034100360240200342013703382003410c6a2017360200200341086a201836020020032010360204200320144220883e0200200341d0006a2003200341386a10f104024020032d00502213411f460d0020032f005120032d0053411074722108200341d0006a41086a290300211420032802542116200328023c0d140c150b024020042009470d00200941016a220a2009490d1c2009410174220b200a200b200a4b1b22044100480d1c0240024020090d0020041028210d0c010b200d20092004102c210d0b200d450d040b200d20096a41013a0000200941016a210a200941017441026a210c20032802402206210b03400240200a2004470d00200a41016a2204200a490d1d200c2004200c20044b1b22044100480d1d02400240200a0d0020041028210d0c010b200d200a2004102c210d0b200d450d040b200d200a6a200b41807f72200b41ff0071200b41077622051b3a0000200c41026a210c200a41016a210a2005210b20050d000b2003280238210b02402004200a6b20064f0d00200a20066a220c200a490d1c20044101742205200c2005200c4b1b220c4100480d1c0240024020040d00200c1028210d0c010b200d2004200c102c210d0b200d450d02200c21040b200d200a6a200b2006109a051a0240200328023c450d00200b102a0b2006200a6a21094100211b0b024020110d00410021050c0e0b2003410036024020034201370338410121064100210c4100210a2016210b024003400240200a200c470d00200c41016a2205200c490d1d200c41017422072005200720054b1b22054100480d1d02400240200c0d002005102821060c010b2006200c2005102c21060b2006450d022003200536023c200320063602382005210c0b2003200a41016a22073602402006200a6a200b41807f72200b41ff0071200b41077622051b3a00002007210a2005210b20050d000b2011200e4104746a21080240200e0d00201121050c0c0b201121052016450d0b200841706a211c4100210a2011211d0340201d210502400340200541046a28020022130d01200a41016a210a2008200541106a2205470d000c0f0b0b200541106a211d200a41016a211e2016417f6a2116200541086a29020021142005280200211f200328023c210c2003280240210b02400240034002400240200b200c460d00200328023821060c010b200c41016a2206200c490d20200c41017422072006200720064b1b22074100480d2002400240200c0d002007102821060c010b2003280238200c2007102c21060b2006450d022003200736023c200320063602382007210c0b2003200b41016a22073602402006200b6a200a41807f72200a41ff0071200a41077622061b3a00002007210b2006210a20060d000b20032014370308200320133602042003201f360200200341d0006a2003200341386a10f10420032d00502213411f460d010c0c0b200741011037000b201c2005460d0b201e210a20160d000c0b0b0b200541011037000b200c41011037000b200441011037000b200441011037000b200b41011037000b200441011037000b410141011037000b410441011037000b200c41011037000b20032d0053211d20032f0051211f20032802542116200329035821140240200841706a2005460d00200541106a210503402005220a41106a21050240200a2802042206450d00200a28020821070240200a410c6a280200220a450d00200a410c6c210b2006210a03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b2007450d002006102a0b20052008470d000b0b02402015450d002011102a0b2013411f460d03201f201d41107472210841012105200328023c450d0b2003280238102a0c0b0b200541106a21050b20052008460d0003402005220a41106a21050240200a2802042206450d00200a28020821070240200a410c6a280200220a450d00200a410c6c210b2006210a03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b2007450d002006102a0b20052008470d000b0b2015450d002011102a0b024020042009470d00200941016a220a2009490d0e2009410174220b200a200b200a4b1b22044100480d0e0240024020090d0020041028210d0c010b200d20092004102c210d0b200d450d020b200d20096a41023a0000200941016a210a200941017441026a210c20032802402206210b03400240200a2004470d00200a41016a2204200a490d0f200c2004200c20044b1b22044100480d0f02400240200a0d0020041028210d0c010b200d200a2004102c210d0b200d450d040b200d200a6a200b41807f72200b41ff0071200b41077622051b3a0000200c41026a210c200a41016a210a2005210b20050d000b2003280238210b02402004200a6b20064f0d00200a20066a220c200a490d0e20044101742205200c2005200c4b1b220c4100480d0e0240024020040d00200c1028210d0c010b200d2004200c102c210d0b200d450d04200c21040b200d200a6a200b2006109a051a0240200328023c450d00200b102a0b2006200a6a2109410121050b201a201245720d032019450d032012102a0c030b200441011037000b200441011037000b200c41011037000b02402010450d00201b4101730d0002402017450d002017410c6c210b2010210a03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b2018450d002010102a0b2011452005720d030240200e450d002011200e4104746a21072011210603402006220541106a210602402005280204220a450d0002402005410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b200541086a280200450d002005280204102a0b20062007470d000b0b2015450d032011102a0c030b2003280238102a0b410021050b0240201a201245720d002019450d002012102a0b02402010450d00201b4101730d0002402017450d002017410c6c210b2010210a03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b2018450d002010102a0b02402005201145720d000240200e450d002011200e4104746a21072011210603402006220541106a210602402005280204220a450d0002402005410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b200541086a280200450d002005280204102a0b20062007470d000b0b2015450d002011102a0b2013411f460d002008410874201372210a02402004450d00200d102a0b2000200a360200200041086a2014370200200041046a2016360200200f102a0c010b200341146a2009360200200341106a20043602002003200d36020c20034284808080c0003702042003200f360200200341d0006a2003200210f504200320032900513703382003200341d0006a41086a29000037003f20032d0050220a411f460d012000200a3a000020002003290338370001200041086a200329003f3700000b410021084101210d4101210c4101210b4101210441012105410121064101210741012102410121090c1f0b410021114101210d4101210b4101210c4101210441012106410121054101210741012102410121124101210841012109410121130c380b2001410c6a2802002105200141086a2802002107200141046a28020021060240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d04200a410174220c200b200c200b4b1b220c4100480d0402400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a410b3a0000200341c4006a41003602002003420137023c2003200236023820062005411c6c6a21114100210a4100210b2005210c0240034002400240200a200b460d00200328023c210a0c010b200a41016a220d200a490d06200a4101742204200d2004200d4b1b220d4100480d0602400240200a0d00200d1028210a0c010b200328023c200a200d102c210a0b200a450d022003200d3602402003200a36023c0b2003200b41016a360244200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280240210a2003280244210b200c210c0c010b0b2003201136025c2003200636025820032007360254200320063602502005450d02034020032006220a411c6a2206360258200a2802102207450d03200a410c6a2802002102200a41086a2802002108200a2802042105200a41146a2902002114200a280200210b024002400240024003400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d0b200a410174220d200c200d200c4b1b220d4100480d0b02400240200a0d00200d1028210c0c010b200328023c200a200d102c210c0b200c450d022003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002400240024020050d00410121130c010b200320023602302003200836022c200320053602282003200341286a200341386a10e80420032d0000220a411f470d01410021130b2014a721092014422088a72204210b03400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d0d200a410174220d200c200d200c4b1b220d4100480d0d02400240200a0d00200d1028210c0c010b200328023c200a200d102c210c0b200c450d052003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280240220b2003280244220a6b2004490d00200328023c210b0c010b200a20046a220c200a490d0c200b410174220a200c200a200c4b1b220a4100480d0c02400240200b0d00200a1028210b0c010b200328023c200b200a102c210b0b200b450d052003200a3602402003200b36023c2003280244210a0b2003200a20046a360244200b200a6a20072004109a051a02402009450d002007102a0b2005450d0520130d010c050b20032d0003411074210b20032f0001210c200329030821202003280204210d02402014a7450d002007102a0b200c200b72210b200341d0006a10f60402402003280240450d00200328023c102a0b2000200b3b00012000200a3a0000200041036a200b4110763a0000200041086a2020370000200041046a200d360000410021024101210d4101210c4101210b410121044101210541012106410121070c250b02402002450d002002410474210b2005210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b2008450d032005102a0c030b200d41011037000b200d41011037000b200a41011037000b20062011470d000c030b0b200d41011037000b200c41011037000b200341d0006a10f60420032802402108200328023c21022003280238220441086a210d200441046a210520032802442207210b024002400340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d05200a4101742206200c2006200c4b1b22064100480d0502400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d04200b410174220a200c200a200c4b1b220a4100480d0402400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021134101210d4101210b4101210c4101210441012106410121054101210741012102410121124101210841012109410121110c390b200641011037000b200a41011037000b2001410c6a2802002106200141086a2802002107200141046a280200210d0240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d14200a410174220c200b200c200b4b1b220c4100480d1402400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a410a3a0000200341246a41003602002003420137021c20032002360218200d200641186c6a210f4100210a4100210b2006210c0240034002400240200a200b460d00200328021c210a0c010b200a41016a2204200a490d16200a41017422052004200520044b1b22044100480d1602400240200a0d0020041028210a0c010b200328021c200a2004102c210a0b200a450d02200320043602202003200a36021c0b2003200b41016a360224200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280220210a2003280224210b200c210c0c010b0b2003200f3602342003200d3602302003200736022c2003200d3602282006450d0220034101722102200341026a2107024003402003200d41186a2213360230200d2802002208450d04200d41146a2802002111200d41106a2802002110200d28020c2109200d280208210c200d28020421124100210b200341003602442003420137023c2008200c4103746a21062003200341186a3602384100210a02400240034002400240200b200a460d00200328023c210b0c010b200b41016a220a200b490d1a200b410174220d200a200d200a4b1b220a4100480d1a02400240200b0d00200a1028210b0c010b200328023c200b200a102c210b0b200b450d022003200a3602402003200b36023c2003280244210a0b2003200a41016a360244200b200a6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280240210b2003280244210a200c210c0c010b0b024020062008470d00200821040c020b2008210a0340200a41086a2104200a2902002214422088a7220a41ff01714104460d02200a41187441187521052014a7210b02400240024003400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d0d200a410174220d200c200d200c4b1b220d4100480d0d02400240200a0d00200d1028210c0c010b200328023c200a200d102c210c0b200c450d022003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024020032802402003280244220a460d00200328023c210b0c030b200a41016a220b200a490d0b200a410174220c200b200c200b4b1b220c4100480d0b02400240200a0d00200c1028210b0c010b200328023c200a200c102c210b0b200b450d012003200c3602402003200b36023c2003280244210a0c020b200d41011037000b200c41011037000b2003200a41016a360244200b200a6a2005417f73220a413f7141c00072200a2005417f4a1b3a00002004210a20042006470d000b200621040c010b200a41011037000b0240034020062004460d0120042d0004210a200441086a2104200a4104470d000b0b02402012450d002008102a0b20092011410474220a6a210c0240024002400240024020110d002009210a0c010b200a41706a210d2009210a0340200a2d0000210b2007200a41036a2d00003a00002003200a41016a2f00003b01000240200b41ac01470d00200a41106a210a0c020b200341cc006a41026a20072d000022043a0000200320032f010022053b014c200a41046a2802002106200a41086a2903002114200220053b0000200241026a20043a00002003200b3a00002003201437030820032006360204200341d0006a2003200341386a10f004024020032d00502204411f46220b450d00200d41706a210d200a41106a220a200c470d010c030b0b20032d0053210520032f0051210620032802542108200329035821140240200d450d00200a41106a210a034002400240200a2d0000220d4109460d00200d41ac01470d010c030b0240200a41046a280200220d28020441ffffffff0371450d00200d280200102a0b200d102a0b200a41106a220a200c470d000b0b02402010450d002009102a0b02402003280240450d00200328023c102a0b200b0d022006200541107472210a200341286a10f70402402003280220450d00200328021c102a0b2000200a3b0001200020043a0000200041036a200a4110763a0000200041086a2014370000200041046a2008360000410021074101210d4101210c4101210b4101210441012105410121060c230b200a200c460d00034002400240200a2d0000220b4109460d00200b41ac01470d010c030b0240200a41046a280200220b28020441ffffffff0371450d00200b280200102a0b200b102a0b200a41106a220a200c470d000b0b02402010450d002009102a0b20032802402111200328023c21092003280238210c20032802442208210b034002400240200c41086a2205280200200c410c6a2204280200220a460d00200c280204210d0c010b200a41016a220d200a490d09200a4101742206200d2006200d4b1b22064100480d0902400240200a0d0020061028210d0c010b200c280204200a2006102c210d0b200d450d03200c200d360204200520063602002004280200210a0b2004200a41016a360200200d200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402005280200220b2004280200220a6b2008490d00200c280204210b0c010b200a20086a220d200a490d08200b410174220a200d200a200d4b1b220a4100480d0802400240200b0d00200a1028210b0c010b200c280204200b200a102c210b0b200b450d04200c200b3602042005200a3602002004280200210a0b2004200a20086a360200200b200a6a20092008109a051a2011450d002009102a0b2013210d2013200f470d010c050b0b200641011037000b200a41011037000b200441011037000b200c41011037000b200341286a10f70420032802202108200328021c21022003280218220441086a210d200441046a210520032802242207210b024002400340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d04200a4101742206200c2006200c4b1b22064100480d0402400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d03200b410174220a200c200a200c4b1b220a4100480d0302400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021094101210d4101210b4101210c410121044101210641012105410121074101210241012112410121080c280b200641011037000b200a41011037000b1031000b2001410c6a2802002105200141086a2802002106200141046a28020021080240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d12200a410174220c200b200c200b4b1b220c4100480d1202400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41093a0000200341c4006a41003602002003420137023c2003200236023820082005411c6c6a21124100210a4100210b2005210c0240034002400240200a200b460d00200328023c210a0c010b200a41016a220d200a490d14200a4101742204200d2004200d4b1b220d4100480d1402400240200a0d00200d1028210a0c010b200328023c200a200d102c210a0b200a450d022003200d3602402003200a36023c0b2003200b41016a360244200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280240210a2003280244210b200c210c0c010b0b2003201236025c2003200836025820032006360254200320083602502005450d02034020032008220a411c6a2208360258200a2802102206450d03200a410c6a2802002102200a41086a2802002109200a2802042107200a41146a2902002114200a280200210b024002400240024003400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d19200a410174220d200c200d200c4b1b220d4100480d1902400240200a0d00200d1028210c0c010b200328023c200a200d102c210c0b200c450d022003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002400240024020070d00410121110c010b200320023602302003200936022c200320073602282003200341286a200341386a10e80420032d0000220a411f470d01410021110b20062014422088a7220b4102746a21052014a7211303400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d1b200a410174220d200c200d200c4b1b220d4100480d1b02400240200a0d00200d1028210c0c010b200328023c200a200d102c210c0b200c450d052003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024020052006460d002006210403402004280200210b03400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d1d200a410174220d200c200d200c4b1b220d4100480d1d02400240200a0d00200d1028210c0c010b200328023c200a200d102c210c0b200c450d082003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b200441046a22042005470d000b0b02402013450d002006102a0b2007450d0520110d010c050b20032d0003411074210b20032f0001210c200329030821202003280204210d02402014a7450d002006102a0b200c200b72210b200341d0006a10f80402402003280240450d00200328023c102a0b2000200b3b00012000200a3a0000200041036a200b4110763a0000200041086a2020370000200041046a200d360000410021064101210d4101210c4101210b41012104410121050c200b02402002450d002002410474210b2007210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b2009450d032007102a0c030b200d41011037000b200d41011037000b200d41011037000b20082012470d000c030b0b200d41011037000b200c41011037000b200341d0006a10f80420032802402108200328023c21022003280238220441086a210d200441046a210520032802442207210b024002400340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d13200a4101742206200c2006200c4b1b22064100480d1302400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d12200b410174220a200c200a200c4b1b220a4100480d1202400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021084101210d4101210b4101210c4101210441012106410121054101210741012102410121120c250b200641011037000b200a41011037000b200141046a280200210a024002400240024002400240200241046a280200200241086a280200220b460d002002280200210c0c010b200b41016a220c200b490d13200b410174220d200c200d200c4b1b220d4100480d1302400240200b0d00200d1028210c0c010b2002280200200b200d102c210c0b200c450d012002200c360200200241046a200d360200200241086a280200210b0b200241086a200b41016a360200200c200b6a410c3a00004100210c4100210b410021064101210503400240200b2006470d00200c200b41016a220d200c200d4b1b22064100480d1402400240200c0d002006102821050c010b2005200b2006102c21050b2005450d030b2005200b6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41026a210c200b41016a210b200d210a200d0d000b200b417f6a2109200241086a2104200241046a2107200b210c03400240024020072802002004280200220a460d002002280200210d0c010b200a41016a220d200a490d14200a4101742208200d2008200d4b1b22084100480d1402400240200a0d0020081028210d0c010b2002280200200a2008102c210d0b200d450d042002200d360200200720083602002004280200210a0b2004200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200241046a280200220c200241086a280200220a6b20094d0d002002280200210c0c010b200a200b6a220d200a490d13200c410174220a200d200a200d4b1b220a4100480d1302400240200c0d00200a1028210c0c010b2002280200200c200a102c210c0b200c450d042002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2005200b109a051a4101210d2006450d052005102a0c050b200d41011037000b200641011037000b200841011037000b200a41011037000b200141046a280200210a02400240200241046a280200200241086a280200220b460d002002280200210c0c010b200b41016a220c200b490d0e200b410174220d200c200d200c4b1b220d4100480d0e02400240200b0d00200d1028210c0c010b2002280200200b200d102c210c0b200c450d022002200c360200200241046a200d360200200241086a280200210b0b200241086a200b41016a360200200c200b6a41083a00004100210c4100210b410021064101210503400240200b2006470d00200c200b41016a220d200c200d4b1b22064100480d0f02400240200c0d002006102821050c010b2005200b2006102c21050b2005450d040b2005200b6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41026a210c200b41016a210b200d210a200d0d000b200b417f6a2109200241086a2104200241046a2107200b210c03400240024020072802002004280200220a460d002002280200210d0c010b200a41016a220d200a490d0f200a4101742208200d2008200d4b1b22084100480d0f02400240200a0d0020081028210d0c010b2002280200200a2008102c210d0b200d450d052002200d360200200720083602002004280200210a0b2004200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200241046a280200220c200241086a280200220a6b20094d0d002002280200210c0c010b200a200b6a220d200a490d0e200c410174220a200d200a200d4b1b220a4100480d0e02400240200c0d00200a1028210c0c010b2002280200200c200a102c210c0b200c450d052002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2005200b109a051a4101210d2006450d002005102a0b4101210b4101210c0c190b200d41011037000b200641011037000b200841011037000b200a41011037000b2001410c6a2802002106200141086a280200210f200141046a28020021100240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d10200a410174220c200b200c200b4b1b220c4100480d1002400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41073a00002010200641146c6a2112410021044100210a4100210c4101210b2006210d03400240200a200c470d002004200a41016a220c2004200c4b1b220c4100480d110240024020040d00200c1028210b0c010b200b200a200c102c210b0b200b450d030b200b200a6a200d41807f72200d41ff0071200d41077622051b3a0000200441026a2104200a41016a210a2005210d20050d000b024020060d00201021080c070b201021040340200441146a2108200428020c22134104460d072004280204211120042802002109200a4101742105200441106a280200210d20042802082207210403400240200a200c470d00200a41016a220c200a490d122005200c2005200c4b1b220c4100480d1202400240200a0d00200c1028210b0c010b200b200a200c102c210b0b200b450d050b200b200a6a200441807f72200441ff0071200441077622061b3a0000200541026a2105200a41016a210a2006210420060d000b02400240200c200a6b2007490d00200c21040c010b200a20076a2204200a490d11200c41017422052004200520044b1b22044100480d1102400240200c0d0020041028210b0c010b200b200c2004102c210b0b200b450d050b200b200a6a20092007109a051a200720046b200a6a210c02402011450d002009102a0b02400240200c450d002004210c0c010b200441016a220c2004490d1120044101742205200c2005200c4b1b220c4100480d110240024020040d00200c1028210b0c010b200b2004200c102c210b0b200b450d060b200b20076a200a6a20133a00002007200a6a41016a210a03400240200a200c470d00200a41016a220c200a490d12200a4101742204200c2004200c4b1b220c4100480d1202400240200a0d00200c1028210b0c010b200b200a200c102c210b0b200b450d080b200b200a6a200d41807f72200d41ff0071200d41077622041b3a0000200a41016a210a2004210d20040d000b2008210420082012470d000c080b0b200c41011037000b200c41011037000b200c41011037000b200441011037000b200c41011037000b200c41011037000b20082012460d0003402008410c6a2802004104460d010240200841046a280200450d002008280200102a0b200841146a22082012470d000b0b0240200f450d002010102a0b200241086a2106200241046a2107200a210402400240024003400240024020072802002006280200220d460d00200228020021050c010b200d41016a2205200d490d0c200d41017422082005200820054b1b22084100480d0c02400240200d0d002008102821050c010b2002280200200d2008102c21050b2005450d0220022005360200200720083602002006280200210d0b2006200d41016a3602002005200d6a200441807f72200441ff00712004410776220d1b3a0000200d2104200d0d000b02400240200241046a2802002204200241086a280200220d6b200a490d00200228020021040c010b200d200a6a2205200d490d0b2004410174220d2005200d20054b1b220d4100480d0b0240024020040d00200d102821040c010b20022802002004200d102c21040b2004450d0220022004360200200241046a200d360200200241086a280200210d0b200241086a200d200a6a3602002004200d6a200b200a109a051a410021124101210d200c450d02200b102a0c020b200841011037000b200d41011037000b4101210b4101210c41012104410121064101210541012107410121020c1a0b2001410c6a2802002105200141086a2802002112200141046a2802002108024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d0e200a410174220c200b200c200b4b1b220c4100480d0e02400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41063a0000200341dc006a41003602002003420137025420032002360250200820054104746a21134100210a4100210b2005210c034002400240200a200b460d002003280254210a0c010b200a41016a220d200a490d0f200a4101742204200d2004200d4b1b220d4100480d0f02400240200a0d00200d1028210a0c010b2003280254200a200d102c210a0b200a450d032003200d3602582003200a3602540b2003200b41016a36025c200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280258210a200328025c210b200c210c0c010b0b200821042005450d05200541047421114100210c034002402008200c6a220b410d6a2d000022044102470d00200b41106a21040c070b200b2802002105200b41086a2802002106200b41046a2802002107200b410c6a2d00002102024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d0f200a4101742209200d2009200d4b1b22094100480d0f02400240200a0d0020091028210d0c010b2003280254200a2009102c210d0b200d450d04200320093602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200241ff00733a0000024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d0f200a4101742202200d2002200d4b1b22024100480d0f02400240200a0d0020021028210d0c010b2003280254200a2002102c210d0b200d450d05200320023602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a20043a0000200320063602402003200736023c200320053602382003200341386a200341d0006a10e80420032d00002205411f470d052011200c41106a220c470d000c070b0b200c41011037000b200d41011037000b200941011037000b200241011037000b20032d0003210220032f0001210920032802042111200329030821140240200b41106a2013460d00200b41106a210403402004410d6a2d00004102460d01200428020421072004280200210602402004280208220a450d00200a410474210b2006210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441106a210402402007450d002006102a0b20042013470d000b0b2002411074210a02402012450d002008102a0b2009200a72210a02402003280258450d002003280254102a0b2000200a3b0001200020053a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021054101210d4101210c4101210b410121040c0f0b20042013460d0003402004410d6a2d00004102460d01200428020421062004280200210502402004280208220a450d00200a410474210b2005210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441106a210402402006450d002005102a0b20042013470d000b0b02402012450d002008102a0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b024002400340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d0a200a4101742206200c2006200c4b1b22064100480d0a02400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d09200b410174220a200c200a200c4b1b220a4100480d0902400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021024101210d4101210b4101210c410121044101210641012105410121070c1a0b200641011037000b200a41011037000b2001410c6a2802002107200141086a2802002108200141046a280200210602400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d09200a410174220c200b200c200b4b1b220c4100480d0902400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41053a0000200341d0006a410c6a4100360200200342013702542003200236025020062007410c6c6a2102410121044100210c4100210a2007210b03400240200a200c470d00200c41016a220d200c490d0a200c4101742205200d2005200d4b1b220d4100480d0a02400240200c0d00200d102821040c010b2004200c200d102c21040b2004450d04200d210c0b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200a41016a210a200d210b200d0d000b2003200c3602582003200a36025c200320043602542006210a2007450d012007410c6c210d4100210b0340024002402006200b6a220a41046a280200220c4102460d002003200a280200200c200a41086a280200200341d0006a10f20420032d00002204411f460d0120032f000120032d00034110747221052003290308211420032802042107200a410c6a210c200d200b6b41746a210a02400340200a450d01200a41746a210a200c280204210b200c410c6a210c200b4102470d000b0b02402008450d002006102a0b02402003280258450d002003280254102a0b200020053b0001200020043a0000200041036a20054110763a0000200041086a2014370000200041046a2007360000410021044101210d4101210c4101210b0c110b200a410c6a210a0c030b200d200b410c6a220b470d000b2002210a0c010b200c41011037000b200a410020076b410c6c6a210b024003402006200b460d01200b410c6a210b200a280204210c200a410c6a210a200c4102470d000b0b02402008450d002006102a0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b024002400340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d0a200a4101742206200c2006200c4b1b22064100480d0a02400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d09200b410174220a200c200a200c4b1b220a4100480d0902400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021074101210d4101210b4101210c4101210441012106410121050c190b200641011037000b200a41011037000b200d41011037000b2001410c6a2802002109200141086a2802002113200141046a2802002106024002400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d09200a410174220c200b200c200b4b1b220c4100480d0902400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41043a0000200341d0006a410c6a4100360200200342013702542003200236025020062009410c6c6a2111410121044100210c4100210a2009210b03400240200a200c470d00200c41016a220d200c490d0a200c4101742205200d2005200d4b1b220d4100480d0a02400240200c0d00200d102821040c010b2004200c200d102c21040b2004450d05200d210c0b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200a41016a210a200d210b200d0d000b2003200c3602582003200a36025c200320043602542006210a2009450d022009410c6c21084100210c03400240024002402006200c6a220b41046a28020022044102460d00200b2802002105200b41086a28020021072003280258200328025c220a460d012003280254210d0c020b200b410c6a210a0c050b200a41016a220d200a490d0a200a4101742202200d2002200d4b1b22024100480d0a02400240200a0d0020021028210d0c010b2003280254200a2002102c210d0b200d450d03200320023602582003200d3602540b2003200a41016a36025c200d200a6a41f0003a00002003200520042007200341d0006a10f204024020032d0000220d411f460d0020032f000120032d00034110747221042003290308211420032802042105200b410c6a210b2008200c6b41746a210a02400340200a450d01200a41746a210a200b280204210c200b410c6a210b200c4102470d000b0b02402013450d002006102a0b02402003280258450d002003280254102a0b200020043b00012000200d3a0000200041036a20044110763a0000200041086a2014370000200041046a20053600004100210b4101210d4101210c0c0f0b2008200c410c6a220c470d000b2011210a0c020b200c41011037000b200241011037000b200a410020096b410c6c6a210b024003402006200b460d01200b410c6a210b200a280204210c200a410c6a210a200c4102470d000b0b02402013450d002006102a0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b024002400340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d09200a4101742206200c2006200c4b1b22064100480d0902400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d08200b410174220a200c200a200c4b1b220a4100480d0802400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021054101210d4101210b4101210c41012104410121060c170b200641011037000b200a41011037000b200d41011037000b2001410c6a2802002106200141086a2802002109200141046a280200210802400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d0a200a410174220c200b200c200b4b1b220c4100480d0a02400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41033a0000200820064102746a21074100210c4100210a41002105410121042006210b03400240200a2005470d00200c200a41016a220d200c200d4b1b22054100480d0b02400240200c0d002005102821040c010b2004200a2005102c21040b2004450d030b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200c41026a210c200a41016a210a200d210b200d0d000b02402006450d00200821060340200a410174210c2006280200210b03400240200a2005470d00200a41016a220d200a490d0d200c200d200c200d4b1b22054100480d0d02400240200a0d002005102821040c010b2004200a2005102c21040b2004450d060b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200c41026a210c200a41016a210a200d210b200d0d000b200641046a22062007470d000b0b02402009450d002008102a0b200241086a2106200241046a2107200a210c03400240024020072802002006280200220b460d002002280200210d0c010b200b41016a220d200b490d0b200b4101742208200d2008200d4b1b22084100480d0b02400240200b0d0020081028210d0c010b2002280200200b2008102c210d0b200d450d052002200d360200200720083602002006280200210b0b2006200b41016a360200200d200b6a200c41807f72200c41ff0071200c410776220b1b3a0000200b210c200b0d000b02400240200241046a280200220c200241086a280200220b6b200a490d002002280200210c0c010b200b200a6a220d200b490d0a200c410174220b200d200b200d4b1b220b4100480d0a02400240200c0d00200b1028210c0c010b2002280200200c200b102c210c0b200c450d052002200c360200200241046a200b360200200241086a280200210b0b200241086a200b200a6a360200200c200b6a2004200a109a051a410021064101210d2005450d052004102a0c050b200c41011037000b200541011037000b200541011037000b200841011037000b200b41011037000b4101210b4101210c410121040c120b2001410c6a2802002106200141086a2802002117200141046a280200210e0240024002400240024002400240024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d14200a410174220c200b200c200b4b1b220c4100480d1402400240200a0d00200c1028210b0c010b2002280200200a200c102c210b0b200b450d012002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41023a0000200341dc006a41003602002003420137025420032002360250200e200641286c6a21094100210a4100210b2006210c034002400240200a200b460d002003280254210a0c010b200a41016a220d200a490d15200a4101742204200d2004200d4b1b220d4100480d1502400240200a0d00200d1028210a0c010b2003280254200a200d102c210a0b200a450d032003200d3602582003200a3602540b2003200b41016a36025c200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280258210a200328025c210b200c210c0c010b0b200e21052006450d0f200e210503402005220a41286a2105200a2d001822134104460d10200a41206a2900002114200a411c6a2800002104200a411a6a2d0000210f200a41196a2c00002110200a41146a2802002106200a41106a2802002111200a28020c2102200a2802042112200a2802002108200a2802082207210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d16200a410174220d200c200d200c4b1b220d4100480d1602400240200a0d00200d1028210c0c010b2003280254200a200d102c210c0b200c450d052003200d3602582003200c360254200328025c210a0b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280258220b200328025c220a6b2007490d002003280254210b0c010b200a20076a220c200a490d15200b410174220a200c200a200c4b1b220a4100480d1502400240200b0d00200a1028210b0c010b2003280254200b200a102c210b0b200b450d052003200a3602582003200b360254200328025c210a0b2003200a20076a36025c200b200a6a20082007109a051a02402012450d002008102a0b2006210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d16200a410174220d200c200d200c4b1b220d4100480d1602400240200a0d00200d1028210c0c010b2003280254200a200d102c210c0b200c450d072003200d3602582003200c360254200328025c210a0b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280258220b200328025c220a6b2006490d002003280254210b0c010b200a20066a220c200a490d15200b410174220a200c200a200c4b1b220a4100480d1502400240200b0d00200a1028210b0c010b2003280254200b200a102c210b0b200b450d072003200a3602582003200b360254200328025c210a0b2003200a20066a36025c200b200a6a20022006109a051a02402011450d002002102a0b0240024002400240024020130e0400010203000b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d19200a410174220c200b200c200b4b1b220c4100480d1902400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d0c2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41003a00000340024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d1a200a410174220c200b200c200b4b1b220c4100480d1a02400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d0e2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a200441807f72200441ff00712004410776220a1b3a0000200a2104200a0d000c040b0b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d18200a410174220c200b200c200b4b1b220c4100480d1802400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d0d2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41013a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d18200a410174220c200b200c200b4b1b220c4100480d1802400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d0e2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41f0003a0000200320042014a72014422088a7200341d0006a10f20420032d0000220a411f460d0220032f000120032d000341107472210d0c120b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d17200a410174220c200b200c200b4b1b220c4100480d1702400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d0e2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41023a0000200320042014a72014422088a7200341d0006a10f20420032d0000220a411f460d0120032f000120032d000341107472210d0c110b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d16200a410174220c200b200c200b4b1b220c4100480d1602400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d0e2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41033a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d16200a410174220c200b200c200b4b1b220c4100480d1602400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d0f2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a2010417f73220a413f7141c00072200a2010417f4a1b3a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d16200a410174220c200b200c200b4b1b220c4100480d1602400240200a0d00200c1028210b0c010b2003280254200a200c102c210b0b200b450d102003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a200f41ff01714100473a00000b20052009470d000c110b0b200c41011037000b200d41011037000b200d41011037000b200a41011037000b200d41011037000b200a41011037000b200c41011037000b200c41011037000b200c41011037000b200c41011037000b200c41011037000b200c41011037000b200c41011037000b200c41011037000b2003290308211420032802042104024020052009460d000340200541186a2d00004104460d01200541106a280200210b2005410c6a280200210c0240200541046a280200450d002005280200102a0b0240200b450d00200c102a0b200541286a22052009470d000b0b02402017450d00200e102a0b02402003280258450d002003280254102a0b2000200d3b00012000200a3a0000200041036a200d4110763a0000200041086a2014370000200041046a20043600004100210c4101210d0c080b20052009460d000340200541186a2d00004104460d01200541106a280200210a2005410c6a280200210b0240200541046a280200450d002005280200102a0b0240200a450d00200b102a0b200541286a22052009470d000b0b02402017450d00200e102a0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b024002400340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d06200a4101742206200c2006200c4b1b22064100480d0602400240200a0d0020061028210c0c010b2004280200200a2006102c210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d05200b410174220a200c200a200c4b1b220a4100480d0502400240200b0d00200a1028210b0c010b2004280200200b200a102c210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a20022007109a051a02402008450d002002102a0b410021044101210d4101210b4101210c0c120b200641011037000b200a41011037000b20082010460d0003402008410d6a2d00004105460d010240200841046a280200450d002008280200102a0b200841106a22082010470d000b0b0240200e450d00200f102a0b200241086a2106200241046a2107200b210c0240024003400240024020072802002006280200220a460d002002280200210d0c010b200a41016a220d200a490d04200a4101742208200d2008200d4b1b22084100480d0402400240200a0d0020081028210d0c010b2002280200200a2008102c210d0b200d450d022002200d360200200720083602002006280200210a0b2006200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200241046a280200220c200241086a280200220a6b200b490d002002280200210c0c010b200a200b6a220d200a490d03200c410174220a200d200a200d4b1b220a4100480d0302400240200c0d00200a1028210c0c010b2002280200200c200a102c210c0b200c450d022002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2004200b109a051a4100210c4101210d2005450d032004102a0c030b200841011037000b200a41011037000b1031000b4101210b0c0b0b2000200d3b00012000200a3a0000200041036a200d4110763a0000200041086a2014370000200041046a2004360000410021094101210d4101210c4101210b4101210441012105410121064101210741012102410121080c080b4101210c200241086a200a41016a3602004100210d200b200a6a41003a0000200341146a2004360200200341106a20053602002003200636020c200320073602082003200836020420032009360200200341d0006a2003200210f504200320032900513703382003200341d0006a41086a29000037003f20032d0050220a411f460d082000200a3a000020002003290338370001200041086a200329003f3700000b4101210b0b410121040b410121050b410121060b410121070b410121020b41012108410121090b20012d0000220a410f4b0d18200a0e100a0b0c0d0e0f101112181318141516170a0b4101210b4100210d4101210c0b410121040b410121060b410121050b410121070b410121020b410121120b410121080b410121090b41012113410121110c0f0b200141086a280200450d10200141046a280200102a0c100b200d450d0f0240200141086a280200450d00200141046a280200102a0b200141146a280200450d0f200141106a280200102a0c0f0b02402001410c6a280200220b450d00200141046a280200210a200b410474210b03400240200a41046a280200450d00200a280200102a0b200a41106a210a200b41706a220b0d000b0b200141086a280200450d0e2001280204102a0c0e0b200c450d0d02402001410c6a280200220b450d00200141046a280200210a200b41286c210b03400240200a41046a280200450d00200a280200102a0b0240200a41106a280200450d00200a410c6a280200102a0b200a41286a210a200b41586a220b0d000b0b200141086a280200450d0d2001280204102a0c0d0b200141086a280200450d0c200141046a280200102a0c0c0b200b450d0b200141086a280200450d0b200141046a280200102a0c0b0b2004450d0a200141086a280200450d0a200141046a280200102a0c0a0b2005450d0902402001410c6a280200220a450d00200141046a2802002204200a4104746a2105034002402004280208220b450d002004280200210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441106a210a0240200441046a280200450d002004280200102a0b200a2104200a2005470d000b0b200141086a280200450d092001280204102a0c090b02402001410c6a280200220b450d00200141046a280200210a200b41146c210b03400240200a41046a280200450d00200a280200102a0b200a41146a210a200b416c6a220b0d000b0b200141086a280200450d082001280204102a0c080b2006450d0702402001410c6a280200220a450d00200141046a2802002204200a411c6c6a2105034002402004280204220a450d0002402004410c6a280200220b450d00200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441086a280200450d002004280204102a0b2004411c6a210a0240200441146a280200450d002004280210102a0b200a2104200a2005470d000b0b200141086a280200450d072001280204102a0c070b2007450d0602402001410c6a280200220a450d00200141046a2802002204200a41186c6a210503400240200441046a280200450d002004280200102a0b0240200441146a280200220b450d00200428020c210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441186a210a0240200441106a280200450d00200428020c102a0b200a2104200a2005470d000b0b200141086a280200450d062001280204102a0c060b2002450d05200141046a220a10f904200141086a280200450d05200a280200102a0c050b2008450d040240200141046a280200220a450d00200141086a280200450d00200a102a0b0240200141146a280200220a450d0002402001411c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b200141186a280200450d002001280214102a0b200141246a2802002204450d0402402001412c6a280200220a450d002004200a4104746a210503402004220d41106a21040240200d280204220a450d000240200d410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b200d41086a280200450d00200d280204102a0b20042005470d000b0b200141286a280200450d042001280224102a0c040b2009450d030240200141086a280200450d00200141046a280200102a0b0240200141146a280200220a450d00200141186a280200450d00200a102a0b200141246a280200450d03200141206a280200102a0c030b20011082040c020b410121100b2000411f3a0000024020012d0000220a410f4b0d0002400240024002400240024002400240024002400240024002400240200a0e100001020304050607080e090e0a0b0c0d000b200b450d0e200141086a280200450d0e200141046a280200102a0c0e0b200d450d0d0240200141086a280200450d00200141046a280200102a0b200141146a280200450d0d200141106a280200102a0c0d0b200c450d0c02402001410c6a280200220b450d00200141046a280200210a200b410474210b03400240200a41046a280200450d00200a280200102a0b200a41106a210a200b41706a220b0d000b0b200141086a280200450d0c2001280204102a0c0c0b2004450d0b02402001410c6a280200220b450d00200141046a280200210a200b41286c210b03400240200a41046a280200450d00200a280200102a0b0240200a41106a280200450d00200a410c6a280200102a0b200a41286a210a200b41586a220b0d000b0b200141086a280200450d0b2001280204102a0c0b0b2006450d0a200141086a280200450d0a200141046a280200102a0c0a0b2005450d09200141086a280200450d09200141046a280200102a0c090b2007450d08200141086a280200450d08200141046a280200102a0c080b2002450d0702402001410c6a280200220a450d00200141046a2802002204200a4104746a2105034002402004280208220b450d002004280200210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441106a210a0240200441046a280200450d002004280200102a0b200a2104200a2005470d000b0b200141086a280200450d072001280204102a0c070b2012450d0602402001410c6a280200220b450d00200141046a280200210a200b41146c210b03400240200a41046a280200450d00200a280200102a0b200a41146a210a200b416c6a220b0d000b0b200141086a280200450d062001280204102a0c060b2008450d0502402001410c6a280200220a450d00200141046a2802002204200a411c6c6a2105034002402004280204220a450d0002402004410c6a280200220b450d00200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441086a280200450d002004280204102a0b2004411c6a210a0240200441146a280200450d002004280210102a0b200a2104200a2005470d000b0b200141086a280200450d052001280204102a0c050b2009450d0402402001410c6a280200220a450d00200141046a2802002204200a41186c6a210503400240200441046a280200450d002004280200102a0b0240200441146a280200220b450d00200428020c210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102a200d280200210c0b200c102a0b200a41106a210a200b41706a220b0d000b0b200441186a210a0240200441106a280200450d00200428020c102a0b200a2104200a2005470d000b0b200141086a280200450d042001280204102a0c040b2013450d03200141046a220a10f904200141086a280200450d03200a280200102a0c030b2011450d020240200141046a280200220a450d00200141086a280200450d00200a102a0b0240200141146a280200220a450d0002402001411c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b200141186a280200450d002001280214102a0b200141246a2802002204450d0202402001412c6a280200220a450d002004200a4104746a210503402004220d41106a21040240200d280204220a450d000240200d410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102a0b200a410c6a210a200b41746a220b0d000b0b200d41086a280200450d00200d280204102a0b20042005470d000b0b200141286a280200450d022001280224102a0c020b2010450d010240200141086a280200450d00200141046a280200102a0b0240200141146a280200220a450d00200141186a280200450d00200a102a0b200141246a280200450d01200141206a280200102a0c010b20011082040b200341e0006a24000bb309010a7f230041b0016b2202240041002103024020012802102204450d0020012802082205200128020c460d00200128021421062001200541246a360208200241c4006a41026a2207200541036a2d00003a0000200241286a41086a2208200541106a290000370300200241286a41106a2209200541186a290000370300200241286a41186a220a200541206a280000360200200220052f00013b01442002200541086a29000037032820052d0000220b4102460d00200541046a280000210520012004417f6a360210200241086a41026a20072d00003a000020024190016a41086a200829030037030020024190016a41106a200929030037030020024190016a41186a200a280200360200200220022f01443b01082002200229032837039001024002400240200b4101460d002002418c016a41026a200241086a41026a2d00003a0000200241f0006a41086a20024190016a41086a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41186a20024190016a41186a2d00003a0000200220022f01083b018c0120022002290390013703700c010b200241c8006a200541067610fe01200228024821040240024020022802502005413f7122014b0d00410021010c010b2002418c016a41026a200420014105746a220141026a2d00003a0000200241f8006a2001410f6a29000037030020024180016a200141176a29000037030020024188016a2001411f6a2d00003a0000200220012f00003b018c012002200129000737037020012800032105410121010b0240200228024c450d002004102a0b20010d00410121010c010b200241ec006a41026a2002418c016a41026a2d00003a000020024190016a41086a200241f0006a41086a29030037030020024190016a41106a200241f0006a41106a29030037030020024190016a41186a200241f0006a41186a2d00003a0000200220022f018c013b016c2002200229037037039001410021010b200241e8006a41026a2204200241ec006a41026a2d00003a0000200241c8006a41086a220720024190016a41086a290300370300200241c8006a41106a220820024190016a41106a290300370300200241c8006a41186a220920024190016a41186a2d00003a0000200220022f016c3b016820022002290390013703480240024020010d002002418c016a41026a20042d00003a0000200241f0006a41086a2007290300370300200241f0006a41106a2008290300370300200241f0006a41186a20092d00003a0000200220022f01683b018c0120022002290348370370410121010c010b200641013a0000410021010b200241246a41026a22042002418c016a41026a2d00003a0000200241086a41086a2207200241f0006a41086a290300370300200241086a41106a2208200241f0006a41106a290300370300200241086a41186a2209200241f0006a41186a2d00003a0000200220022f018c013b0124200220022903703703082001450d00200020022f01243b0001200041046a2005360000200041086a2002290308370000200041036a20042d00003a0000200041106a2007290300370000200041186a2008290300370000200041206a20092d00003a0000410121030b200020033a0000200241b0016a24000bd50505067f017e047f017e027f23004180026b22022400024002400240024002402000280200220320002802044f0d00200028020c2104200141086a2105200241a0016a4102722106024003402000200341016a360200200241186a20002802082802002207109b0220022d00184101460d0120022900192108200241086a2007106c20022802080d012007280204200228020c2203490d012003417f4c0d0302400240024020030d00410121090c010b2003102e2209450d0820072802042003490d01200920072802002003109a051a2007280204220a2003490d062007200a20036b3602042007200728020020036a3602000b20022008370310024002402001280200220b41f8b9c000460d002001280204210c0c010b2006410041da001099051a200241186a41004184011099051a41e4011028220b450d074100210c200b4100360200200b41046a200241a0016a41dc00109a051a200b41e0006a200241186a418401109a051a200141003602042001200b3602000b2003ad220d422086200d84210d024002400340200b41086a2107200b2f0106220e41037421034100210a024003402003450d01200241106a20074108109c05220f450d03200341786a2103200a41016a210a200741086a2107200f417f4a0d000b200a417f6a210e0b0240200c450d00200c417f6a210c200b200e4102746a41e4016a280200210b0c010b0b2002200837022c200220053602282002200e360224200220013602202002200b36021c200241003602182002200d3702a401200220093602a001200241186a200241a0016a10bb020c010b200b200a410c6c6a220341e4006a2207280200210a2007200d370200200341e0006a22072802002103200720093602002003450d00200a450d002003102a0b200028020022032000280204490d010c030b0b2009102a0b200441013a00000b20024180026a24000f0b1036000b2003200a1044000b41e40141041037000b200341011037000bfd0e03047f027e087f230041206b2202240002400240024002400240024002400240024002400240024002400240024041a20210282203450d00200241a20236020420022003360200200341003b0000200241023602080240024020012903684202520d00024020022802044102470d00200228020041024104102c2203450d0420024104360204200220033602000b200228020041033a00022002200228020841016a3602080c010b024020022802044102470d00200228020041024104102c2203450d0420024104360204200220033602000b20022802004183013a00022002200228020841016a3602082001200210a60120022002360210200141246a200241106a10fa020240024020012903684201510d0002400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102821040c010b200228020020032005102c21040b2004450d072002200536020420022004360200200228020821030b2002200341016a360208200420036a41003a00000c010b200141f8006a29030020012903702206420c882207420120074201561b8021070240024020022802042204200228020822036b4102490d00200228020021040c010b200341026a22052003490d11200441017422032005200320054b1b22034100480d110240024020040d002003102821040c010b200228020020042003102c21040b2004450d072002200336020420022004360200200228020821030b2002200341026a360208200420036a2007a741047420067aa7417f6a22034101200341014b1b2203410f2003410f491b723b00000b20014190016a200210a001200220014180016a360210200241106a200210a3010b20014198016a200210eb012002280208210120024100360218200242013703102001417e6a200241106a10b4012002280208220341014d0d052002280218210520022802142108200228021021092002410036020820022802002101024002402003417e6a220a450d004102210b2005450d0d200120092d00003a00004101210c2002200228020841016a36020820054101460d0d200920056a210d200120092d00013a00012002200228020841016a3602084102210b200941026a21042005417e6a220e0d014100210e0c0b0b0240024002402002280204220320054f0d00200341017422042005200420054b1b22044100480d120240024020030d002004102821010c010b200120032004102c21010b2001450d0a20022004360204200220013602002002280208210b0c010b4100210b2005450d010b2001200b6a220320092d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2104200941016a2101200341016a21030340200320012d00003a0000200341016a2103200141016a21012004417f6a22040d000b200b20056a210b0b2002200b3602084102210b0c0b0b024002402002280204220120036b200e490d00200228020021010c010b2003200e6a220b2003490d0f20014101742203200b2003200b4b1b22034100480d0f0240024020010d002003102821010c010b200228020020012003102c21010b2001450d0820022003360204200220013602000b200120056a200141026a200a109b051a0240200520022802082201460d00200520016b210b2005417e6a2103200228020020016a210c410021010340024020032001470d002005210b0c0d0b200c20016a20042d00003a00002002200228020841016a360208200441016a2104200b200141016a2201470d000b200d20046b220e0d004100210e4101210c0c090b200e4100480d0e200e1028220c0d08200e41011037000b41a20241011037000b410441011037000b410441011037000b200541011037000b200341011037000b41e4e8c5001032000b200441011037000b200341011037000b2005210b0b0240200d2004460d00200c20042d00003a00004101210f02400240200441016a2201200d470d00200c41016a21050c010b200c41016a21032009200520046b6a21040340200320012d00003a0000200341016a2103200d200141016a2201470d000b2004450d01200c20046a21052004210f0b0240024020022802042201200a200b6a22036b200f490d00200228020021010c010b2003200f6a22042003490d06200141017422032004200320044b1b22034100480d060240024020010d002003102821010c010b200228020020012003102c21010b2001450d0520022003360204200220013602000b2001200b200f6a220d6a2001200b6a200a109b051a0240200d20022802082201460d00200228020020016a2103200b200f6a20016b2104200c2101034020052001460d01200320012d00003a00002002200228020841016a360208200141016a2101200341016a21032004417f6a22040d000b0b200d210b0b200e450d00200c102a0b200a450d010b0240200b20022802082201460d002002280200220320016a2003200b6a200a109b051a0b2002200a20016a3602080b02402008450d002009102a0b20002002290300370200200041086a200241086a280200360200200241206a24000f0b200341011037000b1031000b130020004103360204200041889fc4003602000b340020004196a6c40036020420004100360200200041146a4101360200200041106a419ca6c400360200200041086a42043702000b4001017f230041206b22022400200241186a4200370300200241106a4200370300200241086a42003703002002420037030020002002108b04200241206a24000bde0301017f024002400240024002400240410110282202450d00200220012d00003a0000200241014102102c2202450d01200220012d00013a0001200241024104102c2202450d02200220012d00023a0002200220012d00033a0003200241044108102c2202450d03200220012d00043a0004200220012d00053a0005200220012d00063a0006200220012d00073a0007200241084110102c2202450d04200220012d00083a0008200220012d00093a0009200220012d000a3a000a200220012d000b3a000b200220012d000c3a000c200220012d000d3a000d200220012d000e3a000e200220012d000f3a000f200241104120102c2202450d05200220012d00103a0010200220012d00113a0011200220012d00123a0012200220012d00133a0013200220012d00143a0014200220012d00153a0015200220012d00163a0016200220012d00173a0017200220012d00183a0018200220012d00193a0019200220012d001a3a001a200220012d001b3a001b200220012d001c3a001c200220012d001d3a001d200220012d001e3a001e200220012d001f3a001f200042a08080808004370204200020023602000f0b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000bb31102077f027e230041106b2202240020024100360208200242013703004104200210b4010240024002400240024002400240024002400240024002400240024002400240024020022802042203200228020822046b4104490d00200441046a2105200228020021030c010b200441046a22052004490d0f200341017422062005200620054b1b22064100480d0f0240024020030d002006102821030c010b200228020020032006102c21030b2003450d0120022006360204200220033602000b20022005360208200320046a41eede91ab06360000410e200210b4010240024020022802042203200228020822066b410e490d002006410e6a2104200228020021050c010b2006410e6a22042006490d0f200341017422052004200520044b1b22074100480d0f0240024020030d002007102821050c010b200228020020032007102c21050b2005450d022002200736020420022005360200200721030b20022004360208200520066a220641002900e4c740370000200641066a41002900eac7403700000240200320046b41034b0d00200441046a22062004490d0f200341017422072006200720064b1b22064100480d0f0240024020030d002006102821050c010b200520032006102c21050b2005450d0320022006360204200220053602000b2002200441046a360208200520046a410a3600000240024020022802042205200228020822046b4104490d00200228020021050c010b200441046a22032004490d0f200541017422062003200620034b1b22034100480d0f0240024020050d002003102821050c010b200228020020052003102c21050b2005450d0420022003360204200220053602000b2002200441046a360208200520046a41a3013600000240024020022802042205200228020822046b4104490d00200228020021050c010b200441046a22032004490d0f200541017422062003200620034b1b22034100480d0f0240024020050d002003102821050c010b200228020020052003102c21050b2005450d0520022003360204200220053602000b2002200441046a360208200520046a41a301360000410b200210b40141f4c7c0002104034002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0720022006360204200220033602000b2002200541016a360208200320056a20042d00003a000002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0820022006360204200220033602000b2002200541016a360208200320056a200441016a2d00003a000002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0920022006360204200220033602000b2002200541016a360208200320056a200441026a2d00003a000002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0a20022006360204200220033602000b2002200541016a360208200320056a200441036a2d00003a000002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0b20022006360204200220033602000b2002200541016a360208200320056a200441046a2d00003a000002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0c20022006360204200220033602000b2002200541016a360208200320056a200441056a2d00003a000002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0d20022006360204200220033602000b2002200541016a360208200320056a200441066a2d00003a000002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d10200541017422062003200620034b1b22064100480d100240024020050d002006102821030c010b200228020020052006102c21030b2003450d0e20022006360204200220033602000b2002200541016a360208200320056a200441076a2d00003a0000200441086a28020021060240024020022802042203200228020822056b4104490d00200228020021030c010b200541046a22072005490d10200341017422082007200820074b1b22074100480d100240024020030d002007102821030c010b200228020020032007102c21030b2003450d0f20022007360204200220033602000b2002200541046a360208200320056a20063600002004410c6a220441f8c8c000470d000b200235020821092002350200210a200241106a2400200a2009422086840f0b200641011037000b200741011037000b200641011037000b200341011037000b200341011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200741011037000b1031000b961b04057f017e037f017e230041800a6b22022400024002402001450d00200220003602180c010b200241013602180b2002200136021c200241e0076a200241186a107f024020022802e4072203450d00200241e0076a410c6a280200210120022802e807210420022802e0072100200241b0046a200241e0076a41106a41e000109a051a200241e0076a200241186a1079024020022802e007450d0020024180036a41086a2205200241e0076a41086a280200360200200220022903e00737038003200241e0076a200241b0046a41e000109a051a200241306a200241e0076a41e000109a051a200241206a41086a22062005280200360200200220022903800337032020024190016a410c6a200136020020024190016a41086a20043602002002200336029401200220003602900120024190016a41106a200241306a41e000109a05210120024188026a2006280200360200200220022903203703800220024190016a10c703024002402002280290012200450d00200241e0076a2000417f6a10f701200241e0076a20014120109c050d000240024020024188026a28020022030d004100210341042104410021010c010b024002402003ad420c7e2207422088a70d002007a722014100480d0020022802800221002001102822040d01200141041037000b1031000b200341a0026c210520034105742106200421010340200241e0076a2000108704200141086a200241e0076a41086a280200360200200120022903e0073702002001410c6a2101200041a0026a2100200541e07d6a22050d000b200641606a41057641016a21010b200220013602b804200220033602b404200220043602b004200241e0076a200241b0046a108e040240200241e0016a2201200241e0076a4120109c05450d004190fac500410e100b200141201019200241e0076a412010190b02402001200241e0076a4120109c050d0020024184026a28020021082002280280022109200228028802210520024190026a20024190016a41f000109a051a2009200541a0026c6a2100200228029002210a20092101024002402005450d00200241b0046a41f0006a21042009210102400340200241f8066a200141e800109a051a200141e8006a290300210720024180036a200141f0006a41b001109a051a20074203510d01200241b0046a200241f8066a41e800109a051a2002200737039805200420024180036a41b001109a051a200241e0076a200241b0046a10870420022802e8072105024020022802e407450d0020022802e007102a0b200241e0076a200241b0046a41a002109a051a200241003602e006200241d0066a200241e0076a2005200241e0066a10d00320022d00d0064101460d03024020022d00dc0622054102460d0020023100de06210720023100dd06210b20022802d806210620022802d406210341f19ec600410d100b02402005450d00200b100c0b2007100c2003450d0020032006100b0b200141a0026a22012000470d000b200021010c010b200141a0026a21010b20012000460d03200241f8086a2105200241e0076a41f0006a2103034020024180036a200141e800109a051a200141e8006a2903002107200241e0076a200141f0006a41b001109a051a20074203510d04200241f8066a20024180036a41e800109a051a200241b0046a200241e0076a41b001109a051a200241e0076a200241f8066a41e800109a051a200220073703c8082003200241b0046a41b001109a051a2005106a200141a0026a22012000470d000c040b0b200241106a20022f00d10620022d00d3064110747210d30320022903102107200241ec076a42c4808080d01b370200200241323602f407200241b8b9c3003602e807200220073703e007200241e0076a1032000b41a0b9c3001032000b4188b9c3001032000b02402008450d002009102a0b200241086a10e403200228020c210120022802082100200241e0076a41086a22054200370300200242003703e00741f99fc6004115200241e0076a1008200241b0046a41086a2005290300370300200220022903e0073703b00420022001410020001b3602e007200241b0046a4110200241e0076a41041007200a109e03200241e0076a10b203200220024190026a410c6a28020022033602f00620022802940221062002200241e0076a410c6a28020022013602f406024020032001470d0002402003450d0020022802e407210941002105034002400240024002400240024002400240200620056a22012d00002204200920056a22002d0000470d000240024002400240024020040e050001020304000b20012000460d09200141016a200041016a4120109c050d040c090b024020012000460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002208200041086a280200220a460d072008200a2004109c050d030c070b024020012000460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002208200041086a280200220a460d052008200a2004109c050d020c050b024020012000460d00200141016a280000200041016a280000470d020b200141106a2802002204200041106a280200470d01200141086a2802002208200041086a280200220a460d032008200a2004109c050d010c030b2001410c6a28020022042000410c6a280200470d00200141046a2802002208200041046a280200220a460d012008200a2004109c05450d010b41df86c2004114100b200241b0046a200110ec0120022802b004220420022802b8041019024020022802b404450d002004102a0b200241b0046a200010ec0120022802b004220420022802b8041019024020022802b404450d002004102a0b20012d000020002d00002204470d0520040e050403020100040b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d05200120002004109c050d040c050b024020012000460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002201200041086a2802002200460d04200120002004109c05450d040c030b024020012000460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002201200041086a2802002200460d03200120002004109c050d020c030b024020012000460d00200141016a280000200041016a280000470d020b200141106a2802002204200041106a280200470d01200141086a2802002201200041086a2802002200460d02200120002004109c050d010c020b20012000460d01200141016a200041016a4120109c05450d010b4194bac3001032000b200541246a21052003417f6a22030d000b0b024020024190026a41306a2201200241e0076a41306a22004120109c05450d004190fac500410e100b2001412010192000412010190b0240200120004120109c05450d0041acbac3001032000b024020022802ec072200450d0020022802e4072101200041246c210003400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b0240200241e8076a280200450d0020022802e407102a0b0240200228029c022200450d002002280294022101200041246c210003400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b024020024198026a280200450d00200228029402102a0b200241800a6a240042010f0b20024180036a41146a410836020020024180036a410c6a4125360200200241f8066a41146a4103360200200242033702fc06200241c8afc6003602f80620024125360284032002200241f0066a3602e0062002200241f4066a3602d006200242043703c004200242013702b404200241fcb9c3003602b004200220024180036a360288072002200241b0046a360290032002200241d0066a360288032002200241e0066a36028003200241f8066a4184bac300103e000b02402001450d00200141246c21002003210103400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b2004450d002003102a0b200241f4076a4102360200200241bc046a4104360200200242023702e407200241bca7c4003602e007200241043602b404200241b4a7c4003602b0042002410036028403200241b8aec600360280032002200241b0046a3602f007200220024180036a3602b804200241e0076a41cca7c400103e000b8d05030b7f017e037f230041206b220224002001280200220320012802082204410c6c6a21052001280204210602400240024020040d00410421074100210841012109410021014100210a200321040c010b41012109410021084100210441042107410021014100210a2003210b0240024003400240200b280200220c0d00200b410c6a21040c040b024002400240200820046b200b41046a290200220d422088a7220e490d002004200e6a210f0c010b2004200e6a220f2004490d0420084101742210200f2010200f4b1b22104100480d040240024020080d002010102821090c010b200920082010102c21090b2009450d01201021080b200920046a200c200e109a051a02400240200a2001460d0020012110200a21010c010b200141016a22042001490d04200141017422102004201020044b1b221041ffffffff03712010470d04201041027422044100480d040240024020010d002004102821070c010b200720014102742004102c21070b2007450d030b200720014102746a200e3602000240200da7450d00200c102a0b200a41016a210a200f210420102101200b410c6a220b2005470d010c050b0b201041011037000b200441041037000b1031000b024020042005460d0003402004280200220b450d010240200441046a280200450d00200b102a0b2004410c6a22042005470d000b0b200121100b02402006450d002003102a0b200241186a22014200370300200241106a22044200370300200241086a220b42003703002002420037030020092007200a20021023200041186a2001290300370000200041106a2004290300370000200041086a200b2903003700002000200229030037000002402010450d002007102a0b02402008450d002009102a0b200241206a24000ba10301027f23004180026b22022400024002402001450d00200220003602000c010b200241013602000b20022001360204200241f8006a2002107f0240200228027c450d00200241086a200241f8006a41f000109a051a200241086a10c7030240200241086a410c6a2802002200450d00200228020c2101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b0240200241106a280200450d00200228020c102a0b20024180026a240042010f0b200241f4016a41043602002002411c6a41023602002002420237020c200241bca7c400360208200241043602ec01200241c8a8c4003602e801200241003602fc01200241b8aec6003602f8012002200241e8016a3602182002200241f8016a3602f001200241086a41cca7c400103e000be328010b7f230041d0006b220224002002410036022820024201370320024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240410410282203450d0020024284808080c00037022420022003360220200341edcad18b0636000002400240200228022420022802282203460d00200228022021040c010b200341016a22042003490d1b200341017422052004200520044b1b22054100480d1b0240024020030d002005102821040c010b200228022020032005102c21040b2004450d0220022005360224200220043602200b2002200341016a360228200420036a41073a00004115200241206a10b40141accbc000210603402006280204210720062802082203200241206a10b4010240024020022802242205200228022822046b2003490d00200228022021050c010b200420036a22082004490d1c200541017422042008200420084b1b22044100480d1c0240024020050d002004102821050c010b200228022020052004102c21050b2005450d042002200436022420022005360220200228022821040b2002200420036a360228200520046a20072003109a051a200228022421042002280228210302400240200628020c4102470d000240024020042003460d00200228022021040c010b200341016a22042003490d1e200341017422052004200520044b1b22054100480d1e0240024020030d002005102821040c010b200228022020032005102c21040b2004450d072002200536022420022004360220200228022821030b2002200341016a360228200420036a41003a00000c010b0240024020042003460d00200228022021040c010b200341016a22042003490d1d200341017422052004200520044b1b22054100480d1d0240024020030d002005102821040c010b200228022020032005102c21040b2004450d072002200536022420022004360220200228022821030b2002200341016a360228200420036a41013a00000240200628020c4101460d00200241306a20062802101103002002280234210720022802382203200241206a10b4010240024020022802242205200228022822046b2003490d00200228022021050c010b200420036a22082004490d1e200541017422042008200420084b1b22044100480d1e0240024020050d002004102821050c010b200228022020052004102c21050b2005450d092002200436022420022005360220200228022821040b2002200420036a360228200520046a20072003109a051a200228024021050240200228023c4101460d0020052002280244200241206a1091040c020b200520022802482203200241206a10910402402003450d00200341d8006c21074100210403400240200520046a220341346a280200450d002003413c6a280200450d00200341386a280200102a0b0240200341c4006a280200450d00200341cc006a280200450d00200341c8006a280200102a0b2007200441d8006a2204470d000b0b2002280244450d012005102a0c010b2006280214210720062802182203200241206a10b4010240024020022802242205200228022822046b2003490d00200228022021050c010b200420036a22082004490d1d200541017422042008200420084b1b22044100480d1d0240024020050d002004102821050c010b200228022020052004102c21050b2005450d092002200436022420022005360220200228022821040b2002200420036a360228200520046a20072003109a051a200628022021030240200628021c4101460d002003200641246a280200200241206a1091040c010b20032006280228200241206a1091040b200228022421042002280228210302400240200628022c4102470d000240024020042003460d00200228022021040c010b200341016a22042003490d1e200341017422052004200520044b1b22054100480d1e0240024020030d002005102821040c010b200228022020032005102c21040b2004450d0b2002200536022420022004360220200228022821030b2002200341016a360228200420036a41003a00000c010b0240024020042003460d00200228022021040c010b200341016a22042003490d1d200341017422052004200520044b1b22054100480d1d0240024020030d002005102821040c010b200228022020032005102c21040b2004450d0b2002200536022420022004360220200228022821030b2002200341016a360228200420036a41013a00000240200628022c4101460d00200241186a200628023011030020022802182104200228021c2203200241206a10b4012003450d012003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10b4010240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d1f20074101742205200a2005200a4b1b22054100480d1f0240024020070d002005102821070c010b200228022020072005102c21070b2007450d0e2002200536022420022007360220200228022821050b2002200520046a360228200720056a20092004109a051a200341706a200241206a1092042003200241206a1093042003412c6a2103200841546a22080d000c020b0b2006280230210420062802382203200241206a10b4012003450d002003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10b4010240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d1e20074101742205200a2005200a4b1b22054100480d1e0240024020070d002005102821070c010b200228022020072005102c21070b2007450d0e2002200536022420022007360220200228022821050b2002200520046a360228200720056a20092004109a051a200341706a200241206a1092042003200241206a1093042003412c6a2103200841546a22080d000b0b200228022421042002280228210302400240200628023c4102470d000240024020042003460d00200228022021040c010b200341016a22042003490d1e200341017422052004200520044b1b22054100480d1e0240024020030d002005102821040c010b200228022020032005102c21040b2004450d0f2002200536022420022004360220200228022821030b2002200341016a360228200420036a41003a00000c010b0240024020042003460d00200228022021040c010b200341016a22042003490d1d200341017422052004200520044b1b22054100480d1d0240024020030d002005102821040c010b200228022020032005102c21040b2004450d0f2002200536022420022004360220200228022821030b2002200341016a360228200420036a41013a00000240200628023c4101460d00200241106a20062802401103002002280210210420022802142203200241206a10b4012003450d012003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10b4010240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d1f20074101742205200a2005200a4b1b22054100480d1f0240024020070d002005102821070c010b200228022020072005102c21070b2007450d122002200536022420022007360220200228022821050b2002200520046a360228200720056a20092004109a051a200341706a200241206a1093042003200241206a1093042003412c6a2103200841546a22080d000c020b0b2006280240210420062802482203200241206a10b4012003450d002003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10b4010240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d1e20074101742205200a2005200a4b1b22054100480d1e0240024020070d002005102821070c010b200228022020072005102c21070b2007450d122002200536022420022007360220200228022821050b2002200520046a360228200720056a20092004109a051a200341706a200241206a1093042003200241206a1093042003412c6a2103200841546a22080d000b0b02400240200628024c4101460d00200241086a20062802501103002002280208210b200228020c2203200241206a10b4012003450d01200341386c210c410021070340200b20076a220341046a2802002109200341086a2802002204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d1f20084101742205200a2005200a4b1b22054100480d1f0240024020080d002005102821080c010b200228022020082005102c21080b2008450d142002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a200341106a2802002109200341146a2802002204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d1f20084101742205200a2005200a4b1b22054100480d1f0240024020080d002005102821080c010b200228022020082005102c21080b2008450d152002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a02400240200341186a2802004101460d00200241306a2003411c6a280200200341206a28020028020c1102002002280230210920022802382204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d2120084101742205200a2005200a4b1b22054100480d210240024020080d002005102821080c010b200228022020082005102c21080b2008450d182002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a2002280234450d012009102a0c010b2003411c6a2802002109200341246a2802002204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d2020084101742205200a2005200a4b1b22054100480d200240024020080d002005102821080c010b200228022020082005102c21080b2008450d182002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a0b200341286a200241206a109304200c200741386a2207470d000c020b0b2006280250210b20062802582203200241206a10b4012003450d00200341386c210c410021070340200b20076a220341046a2802002109200341086a2802002204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d1e20084101742205200a2005200a4b1b22054100480d1e0240024020080d002005102821080c010b200228022020082005102c21080b2008450d172002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a200341106a2802002109200341146a2802002204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d1e20084101742205200a2005200a4b1b22054100480d1e0240024020080d002005102821080c010b200228022020082005102c21080b2008450d182002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a02400240200341186a2802004101460d00200241306a2003411c6a280200200341206a28020028020c1102002002280230210920022802382204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d2020084101742205200a2005200a4b1b22054100480d200240024020080d002005102821080c010b200228022020082005102c21080b2008450d1b2002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a2002280234450d012009102a0c010b2003411c6a2802002109200341246a2802002204200241206a10b4010240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d1f20084101742205200a2005200a4b1b22054100480d1f0240024020080d002005102821080c010b200228022020082005102c21080b2008450d1b2002200536022420022008360220200228022821050b2002200520046a360228200820056a20092004109a051a0b200341286a200241206a109304200c200741386a2207470d000b0b200641dc006a220641b8dac000470d000b2002280228220341046a2204417f4c0d1720022802242108200228022021070240024020040d00410121050c010b200410282205450d190b2002410036023820022004360234200220053602302003200241306a10b4010240024020022802342205200228023822046b2003490d00200228023021050c010b200420036a22092004490d1b2005410174220a2009200a20094b1b22094100480d1b0240024020050d002009102821050c010b200228023020052009102c21050b2005450d1a20022009360234200220053602300b200520046a20072003109a051a200420036a210302402008450d002007102a0b200241d0006a24002003ad4220862005ad840f0b410441011037000b200541011037000b200441011037000b200541011037000b200541011037000b200441011037000b200441011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b200541011037000b1036000b200441011037000b200941011037000b1031000b9c1d010a7f230041106b220324002001200210b401024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001450d00200141d8006c2104410021050340200020056a220641046a2802002107200641086a2802002208200210b40102400240200241046a2209280200220a200241086a2201280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d18200a410174220b200c200b200c4b1b220b4100480d1802400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d032002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a200641d4006a2d0000210a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1820084101742207200b2007200b4b1b22074100480d180240024020080d0020071028210b0c010b200228020020082007102c210b0b200b450d042002200b36020020092007360200200128020021080b2001200841016a360200200b20086a200a3a000002402006410c6a2d0000220841024b0d0002400240024020080e03000102000b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1b2008410174220a200b200a200b4b1b220a4100480d1b0240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d082002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41003a0000200641146a2802002107200641186a2802002208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d1b200a410174220b200c200b200c4b1b220b4100480d1b02400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d092002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a0c020b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1a2008410174220a200b200a200b4b1b220a4100480d1a0240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d092002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41013a00002006410d6a2d0000210a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1a20084101742207200b2007200b4b1b22074100480d1a0240024020080d0020071028210b0c010b200228020020082007102c210b0b200b450d0a2002200b36020020092007360200200128020021080b2001200841016a360200200b20086a200a3a0000200641146a2802002107200641186a2802002208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d1a200a410174220b200c200b200c4b1b220b4100480d1a02400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d0b2002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a200641206a2802002107200641246a2802002208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d1a200a410174220b200c200b200c4b1b220b4100480d1a02400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d0c2002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1a2008410174220a200b200a200b4b1b220a4100480d1a0240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d0d2002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a2006410e6a2d00003a00000c010b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d192008410174220a200b200a200b4b1b220a4100480d190240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d0d2002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41023a00002006410d6a2d0000210a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1920084101742207200b2007200b4b1b22074100480d190240024020080d0020071028210b0c010b200228020020082007102c210b0b200b450d0e2002200b36020020092007360200200128020021080b2001200841016a360200200b20086a200a3a0000200641146a2802002107200641186a2802002208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d19200a410174220b200c200b200c4b1b220b4100480d1902400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d0f2002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a200641206a2802002107200641246a2802002208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d19200a410174220b200c200b200c4b1b220b4100480d1902400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d102002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a2006412c6a2802002107200641306a2802002208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d19200a410174220b200c200b200c4b1b220b4100480d1902400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d112002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a2006410e6a2d0000220841044b0d000240024002400240024020080e050001020304000b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1d2008410174220a200b200a200b4b1b220a4100480d1d0240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d162002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41003a00000c040b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1c2008410174220a200b200a200b4b1b220a4100480d1c0240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d162002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41013a00000c030b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1b2008410174220a200b200a200b4b1b220a4100480d1b0240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d162002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41023a00000c020b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d1a2008410174220a200b200a200b4b1b220a4100480d1a0240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d162002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41033a00000c010b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d192008410174220a200b200a200b4b1b220a4100480d190240024020080d00200a1028210b0c010b20022802002008200a102c210b0b200b450d162002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41043a00000b02400240200641346a2802004101460d002003200641386a2802002006413c6a28020028020c1102002003280200210720032802082208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d1a200a410174220b200c200b200c4b1b220b4100480d1a02400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d182002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a2003280204450d012007102a0c010b200641386a2802002107200641c0006a2802002208200210b401024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d19200a410174220b200c200b200c4b1b220b4100480d1902400240200a0d00200b1028210a0c010b2002280200200a200b102c210a0b200a450d182002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a20072008109a051a0b200641c4006a20021093042004200541d8006a2205470d000b0b200341106a24000f0b200b41011037000b200741011037000b200a41011037000b200b41011037000b200a41011037000b200741011037000b200b41011037000b200b41011037000b200a41011037000b200a41011037000b200741011037000b200b41011037000b200b41011037000b200b41011037000b200a41011037000b200a41011037000b200a41011037000b200a41011037000b200a41011037000b200b41011037000b200b41011037000b1031000b840701087f20002802042102024002400240024002400240024020002802004101460d00200041086a2802002200200110b4012000450d01200041186c2103200241146a2100200141086a2102200141046a21040340200041706a2802002105200041746a2802002206200110b4010240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d08200741017422082009200820094b1b22084100480d080240024020070d002008102821070c010b200128020020072008102c21070b2007450d042001200736020020042008360200200228020021080b2002200820066a360200200720086a20052006109a051a2000417c6a280200210520002802002206200110b4010240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d08200741017422082009200820094b1b22084100480d080240024020070d002008102821070c010b200128020020072008102c21070b2007450d052001200736020020042008360200200228020021080b2002200820066a360200200720086a20052006109a051a200041186a2100200341686a22030d000c020b0b2000410c6a2802002200200110b4012000450d00200041186c2103200241146a2100200141086a2102200141046a21040340200041706a2802002105200041746a2802002206200110b4010240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d07200741017422082009200820094b1b22084100480d070240024020070d002008102821070c010b200128020020072008102c21070b2007450d052001200736020020042008360200200228020021080b2002200820066a360200200720086a20052006109a051a2000417c6a280200210520002802002206200110b4010240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d07200741017422082009200820094b1b22084100480d070240024020070d002008102821070c010b200128020020072008102c21070b2007450d062001200736020020042008360200200228020021080b2002200820066a360200200720086a20052006109a051a200041186a2100200341686a22030d000b0b0f0b200841011037000b200841011037000b200841011037000b200841011037000b1031000b840401087f200028020421020240024002400240024020002802004101460d00200041086a2802002200200110b40120004103742200450d01200220006a2103200141086a2104034020022802002105200241046a2802002200200110b40102400240200141046a22062802002207200428020022086b2000490d00200128020021070c010b200820006a22092008490d06200741017422082009200820094b1b22084100480d060240024020070d002008102821070c010b200128020020072008102c21070b2007450d042001200736020020062008360200200428020021080b2004200820006a360200200720086a20052000109a051a200241086a22022003470d000c020b0b2000410c6a2802002200200110b40120004103742200450d00200220006a2103200141086a2104034020022802002105200241046a2802002200200110b40102400240200141046a22062802002207200428020022086b2000490d00200128020021070c010b200820006a22092008490d05200741017422082009200820094b1b22084100480d050240024020070d002008102821070c010b200128020020072008102c21070b2007450d042001200736020020062008360200200428020021080b2004200820006a360200200720086a20052000109a051a200241086a22022003470d000b0b0f0b200841011037000b200841011037000b1031000bd10f02037f027e230041a0076b22022400024002402001450d00200220003602080c010b200241013602080b2002200136020c200241f0046a200241086a107a02400240024002400240024002400240024002400240024020022903d8054203510d00200241106a200241f0046a41a002109a051a200241c0026a200241106a41a002109a051a200241e0046a200241c0026a10870420022802e8042101200241f0046a200241c0026a41a002109a051a20024198076a20022802e804360200200220022903e00437039007200241b0026a200241f0046a200120024190076a10d0034101410220022d00b00241014622001b220310282201450d01200241003602f804200220033602f404200220013602f0040240024020000d00200241013602f804200141003a000020022802f404210020022802f80421010240200241bc026a2d000022034102470d000240024020002001460d0020022802f00421000c010b200141016a22002001490d0f200141017422032000200320004b1b22034100480d0f0240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d06200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a41003a00000c020b0240024020002001460d0020022802f00421000c010b200141016a22002001490d0e200141017422042000200420004b1b22044100480d0e0240024020010d002004102821000c010b20022802f00420012004102c21000b2000450d06200220043602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a41013a00000240024020034101460d000240024020022802f40420022802f8042201460d0020022802f00421000c010b200141016a22002001490d10200141017422032000200320004b1b22034100480d100240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d09200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a41003a00000c010b0240024020022802f40420022802f8042201460d0020022802f00421000c010b200141016a22002001490d0f200141017422032000200320004b1b22034100480d0f0240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d09200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a41013a00000240024020022802f40420022802f8042201460d0020022802f00421000c010b200141016a22002001490d0f200141017422032000200320004b1b22034100480d0f0240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d0a200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a20022d00bd023a00000b0240024020022802f40420022802f8042201460d0020022802f00421000c010b200141016a22002001490d0e200141017422032000200320004b1b22034100480d0e0240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d0a200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a20022d00be023a00000c010b200241013602f804200141013a000020022d00b102417e6a22014102200141ff01714102491b41ff0171220141024b0d0002400240024020010e03000102000b0240024020022802f40420022802f8042201460d0020022802f00421000c010b200141016a22002001490d0f200141017422032000200320004b1b22034100480d0f0240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d0c200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a41003a00000c020b0240024020022802f40420022802f8042201460d0020022802f00421000c010b200141016a22002001490d0e200141017422032000200320004b1b22034100480d0e0240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d0c200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a41013a00000c010b0240024020022802f40420022802f8042201460d0020022802f00421000c010b200141016a22002001490d0d200141017422032000200320004b1b22034100480d0d0240024020010d002003102821000c010b20022802f00420012003102c21000b2000450d0c200220033602f404200220003602f00420022802f80421010b2002200141016a3602f804200020016a41023a0000200241b0026a410172200241f0046a10c6030b20023502f804210520023502f0042106200241a0076a240020062005422086840f0b2002411c6a4104360200200241d4026a4102360200200242023702c402200241bca7c4003602c00220024104360214200241e0a8c400360210200241003602b402200241b8aec6003602b0022002200241106a3602d0022002200241b0026a360218200241c0026a41cca7c400103e000b200341011037000b200341011037000b200441011037000b200341011037000b200341011037000b200341011037000b200341011037000b200341011037000b200341011037000b200341011037000b1031000baf0d04067f017e057f017e230041c0016b22022400200241086a10e403200228020c21032002280208210420024180016a41086a22054200370300200242003703800141f99fc600411520024180016a1008200241106a41086a2005290300370300200220022903800137031020022003410020041b3602a001200241106a4110200241a0016a41041007109801109e0320054200370300200242003703800141f99fc600411520024180016a100820024190016a41086a20052903003703002002200229038001370390012002410036021020024190016a4110200241106a1006210502400240024002400240024020022802102203417f460d002005450d00200341034d0d05200528000021062005102a20060d010b41042107410021060c010b2006ad420c7e2208422088a70d012008a722054100480d01200510282207450d022007210341002104034002400240024002400240411410282205450d00200541106a41002800eaa046360000200541086a41002900e2a046370000200541002900daa046370000200541144128102c2205450d0120052004360014200241106a41186a22094200370300200241106a41106a220a4200370300200241106a41086a220b42003703002002420037031020054118200241106a1000200241a0016a41186a2009290300370300200241a0016a41106a200a290300370300200241a0016a41086a200b290300370300200220022903103703a0012005102a20024100360210200241a0016a4120200241106a1006210a2002280210220b417f460d03200a450d032002200b3602142002200a3602102002200241106a106c02400240024020022802000d002002280214220c20022802042209490d002009417f4c0d050240024020090d00410121050c010b2009102e2205450d0220052002280210220d2009109a051a2002200c20096b3602142002200d20096a3602100b20050d020b41c4d1c300413320024180016a419cd9c3001038000b200941011037000b2009ad2208422086210e0240200b450d00200a102a0b200e2008842108200241a0016a412010090c040b411441011037000b412841011037000b1036000b41012105420021080b20032005360200200341046a20083702002003410c6a21032006200441016a2204470d000b0b200220063602182002200636021420022007360210200241a0016a200241106a108e04200241106a41186a200241a0016a41186a290300370300200241106a41106a2205200241a0016a41106a290300370300200241106a41086a200241a0016a41086a290300370300200220022903a00137031020024180016a41086a22034200370300200242003703800141e6efc200411520024180016a100820024190016a41086a20032903003703002002200229038001370390012002411036028401200220024190016a36028001200241106a20024180016a10f002200241106a10b20320024100360298012002420137039001200220024190016a3602a0012005200241a0016a10c801200241106a20024190016a10a001200220024190016a3602a001200241c0006a200241a0016a10c801200220024190016a3602a001200241e0006a200241a0016a10c801200228021421042002411c6a280200220520024190016a10b401024002402005450d00200541246c210b0340200241a0016a200410ec0120022802a001210a02400240200228029401220920022802980122056b20022802a8012203490d0020022802900121090c010b200520036a22062005490d04200941017422052006200520064b1b22054100480d040240024020090d002005102821090c010b20022802900120092005102c21090b2009450d032002200536029401200220093602900120022802980121050b2002200520036a36029801200920056a200a2003109a051a024020022802a401450d00200a102a0b200441246a2104200b415c6a220b0d000b0b200235029801210820022802900121090240200228021c2203450d0020022802142105200341246c210303400240024020052d0000220441034b0d0002400240024020040e0404000102040b2005410c6a280200450d03200541086a280200102a0c030b2005410c6a280200450d02200541086a280200102a0c020b2005410c6a280200450d01200541086a280200102a0c010b200541086a280200450d00200541046a280200102a0b200541246a21052003415c6a22030d000b0b0240200241186a280200450d002002280214102a0b200241c0016a240020084220862009ad840f0b200541011037000b1031000b200541041037000b41c4d1c300413320024180016a419cd9c3001038000bee2605017f027e0d7f027e067f230041b0036b22022400024002402001450d00200220003602080c010b200241013602080b2002200136020c2002200241086a106c024020022802000d00200228020421012002200241086a36029801200241003a0090032002420037028402200241f8b9c000360280022002200136022420024100360220200220024190036a36022c200220024198016a360228200241206a20024180026a10860420022802800221012002290284022103024020022d009003450d0020012003a72003422088a710b0020c010b2001450d002002200337021420022001360210200241206a200241106a1097040240024002400240024002400240024002400240024020022802204101460d00200241206a41086a2201290300210342002104200142003703002002420037032041feb3c300410d200241206a100820024180026a41086a200129030037030020022002290320370380022002410036022020024180026a4110200241206a100621010240024020022802202200417f460d002001450d0020004108490d01200129000021042001102a0b024041a00210282205450d0020054102360298012005420237036820052003200442dc0b7c220420032004561b3703a001200241106a21012002280214210603402001280200220741086a210020072f010622084103742101410021090240024003402001450d0141bee6c20020004108109c05220a450d02200141786a2101200941016a2109200041086a2100200a417f4a0d000b2009417f6a21080b024020060d004101210b0c080b2006417f6a2106200720084102746a41e4016a21010c010b0b200220072009410c6c6a220141e8006a280200360284022002200141e0006a28020036028002200241206a20024180026a107e02402002280220220c0d004101210b0c060b2002280224210d200241206a41086a22012802002208450d0320014200370300200242003703204193cdc2004111200241206a100820024180026a41086a200129030037030020022002290320370380022002410036022020024180026a4110200241206a1006210102400240024020022802202200417f460d002001450d002002200036029c012002200136029801200241206a20024198016a107b20022802202206450d02200229022421032000450d012001102a0c010b42002103410421060b2003a7210b2006210020062101024002400240024002402003422088a7220e450d002006200e41c4006c6a21004100210902400340200620096a22012d0000210a200241206a200141016a41c300109a051a200a4102460d0120024180026a41186a200241206a41186a29000037030020024180026a41106a200241206a41106a29000037030020024180026a41086a200241206a41086a2900003703002002200229002037038002200a4101460d03200941c4006a2109200141c4006a2000470d000b200021010c010b200141c4006a21010b0240034020002001460d0120012d00002109200141c4006a210120094102470d000b0b410121074100210f0240200b0d00410021100c020b2006102a410021100c010b20024198016a41086a220a20024180026a41086a29030037030020024198016a41106a220f20024180026a41106a29030037030020024198016a41186a221120024180026a41186a290300370300200220022903800222033703f0022002200337039801412010282207450d022007200229039801370000200741186a2011290300370000200741106a200f290300370000200741086a200a2903003700004101210f024002400240200e41c4006c41bc7f6a2009470d00410121100c010b200141c4006a2d00002109200241206a200141c5006a41c300109a051a20014188016a210a024020094102470d0041012110200a21010c020b4101210f410121100340200a21010240034020024180026a41186a220a200241206a41186a29000037030020024180026a41106a220e200241206a41106a29000037030020024180026a41086a2211200241206a41086a2900003703002002200229002037038002200941ff01714101460d0120002001460d0320012d00002109200241206a200141016a41c300109a051a200141c4006a210120094102460d040c000b0b20024198016a41086a2011290300220337030020024198016a41106a200e290300220437030020024198016a41186a200a29030022123703002002200229038002221337039801200241f0026a41186a220a2012370300200241f0026a41106a220e2004370300200241f0026a41086a22112003370300200220133703f00202402010200f470d00200f41016a2209200f490d14200f41017422142009201420094b1b221041ffffff3f712010470d14201041057422094100480d1402400240200f0d002009102821070c010b2007200f4105742009102c21070b2007450d050b2007200f4105746a220920022903f002370000200941186a200a290300370000200941106a200e290300370000200941086a2011290300370000200f41016a210f20002001460d0120012d00002109200241206a200141016a41c300109a051a200141c4006a210a20094102470d000b200141c4006a21010c010b200021010b0240034020002001460d0120012d00002109200141c4006a210120094102470d000b0b200b450d002006102a0b200c200841f0006c6a210820024180026a41106a211520024180026a41086a21144200210341042116200c210a02400340200a2802042101200a2802002100200241206a200a41086a41e800109a051a200a41f0006a210a024020010d00200a2008460d0a0340200a2802042206450d0b200a41086a280200210b0240200a410c6a2802002201450d00200141246c21002006210103400240024020012d0000220941034b0d0002400240024020090e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b200a41f0006a210a0240200b450d002006102a0b200a2008470d000c0b0b0b20024198016a200241206a41e800109a051a20022001360284022002200036028002201420024198016a41e800109a051a109801210120024190036a20024180026a10f6010240024002400240200228028002417f6a220020014f0d00200241206a200010f701200241206a20154120109c050d00200228028002221741002001417b6a2200200020014b1b490d0020024190036a20076b220641606a210e200641406a2111200641a07f6a21182007200f41057422096a210b410021010240024002400340024002400240200b200720016a22006b41e0004b0d00200f4105742001470d01410021000c060b024020062001470d0020024190036a21000c060b200020024190036a4120109c05450d05200e2001470d0120024190036a21000c050b0340024020024190036a2000470d0020024190036a21000c060b200020024190036a4120109c05450d05200041206a2100200941606a22090d000b410021000c040b200041206a221920024190036a4120109c05450d02024020112001470d0020024190036a21000c040b200041c0006a221920024190036a4120109c05450d01024020182001470d0020024190036a21000c040b200941807f6a210920014180016a2101200041e0006a20024190036a4120109c050d000b200720016a41606a21000c020b201921000c010b201921000b200241206a201710f701200241206a20024190036a4120109c05210120000d0020010d010b0240200228028c022200450d002002280284022101200041246c210003400240024020012d0000220941034b0d0002400240024020090e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b200228028802450d01200228028402102a0c010b20024190036a20024180026a10f601200241206a20024180026a41f000109a051a0240024020034220882204a722012003a7460d00200121000c010b200141016a22092001490d142004a722004101742206200920092006491bad220342f0007e2204422088a70d142004a722094100480d140240024020010d002009102821160c010b2016200141f0006c2009102c21160b2016450d020b2016200041f0006c6a200241206a41f000109a051a200241206a41186a220920024190036a41186a290300370300200241206a41106a220620024190036a41106a290300370300200241206a41086a220b20024190036a41086a29030037030020022002290390033703200240200f2010470d00200f41016a2201200f490d14200f410174220e2001200e20014b1b221041ffffff3f712010470d14201041057422014100480d1402400240200f0d002001102821070c010b2007200f4105742001102c21070b2007450d040b200342ffffffff0f83200041016aad4220868421032007200f4105746a22012002290320370000200141186a2009290300370000200141106a2006290300370000200141086a200b290300370000200f41016a210f0b200a2008470d010c0a0b0b200941041037000b200141011037000b200941011037000b412041011037000b41c4d1c300413320024190036a419cd9c3001038000b41a00241081037000b41c4d1c300413320024190036a419cd9c3001038000b2002200229022437038002419db6c300412820024180026a419cb4c3001038000b4101210b200d450d01200c102a0c010b0240200d450d00200c102a0b02402010450d002007102a0b0240200342ffffffff0f560d004101210b2003a7450d012016102a0c010b024020160d004101210b0c010b200541a00241c004102c2205450d01200541a0026a20024180026a41e800109a051a2005420237038803200520033703c003200520163602bc03200541033602b80320052002290398013703900320054198036a200241a0016a290300370300200541a0036a200241a8016a290300370300200541a8036a200241b0016a290300370300200541b0036a200241b8016a290300370300200541c8036a200241206a41f800109a051a4102210b0b200241106a210120022802142106024003402001280200220741086a210020072f010622084103742101410021090240024003402001450d0141a7c5c20020004108109c05220a450d02200141786a2101200941016a2109200041086a2100200a417f4a0d000b2009417f6a21080b2006450d022006417f6a2106200720084102746a41e4016a21010c010b0b200741e0006a2009410c6c6a22012802084104490d002001280200280000210742002103200241206a41086a2201420037030020024200370320419194c1004115200241206a100820024180026a41086a200129030037030020022002290320370380022002410036022020024180026a4110200241206a100621000240024020022802202201417f460d002002200136029c012002200036029801200241206a20024198016a10820120022802202209450d04200229022421032001450d012000102a0c010b410421090b4100210002402003422088a72201417f6a220a20014b0d00200a20014f0d002009200a4102746a2201450d00200128020020074721000b02402003a7450d002009102a0b20000d030b200b210f0c030b41c00441081037000b41c4d1c300413320024190036a419cd9c3001038000b2005200b41a0026c2201200b4101742200200b41016a220f2000200f4b1b41a0026c2200102c2205450d01200520016a20024180026a41e800109a05220142023703682001200229039801370370200141f8006a200241a0016a29030037030020014180016a200241a8016a29030037030020014188016a200241b0016a29030037030020014190016a200241b8016a2903003703002001419c016a20073602002001410d36029801200141a8016a200241206a41f800109a051a0b20022802102002280214200228021810b00220024100360288022002420137038002200f20024180026a10b401200f41a0026c210b20022802840221062002280288022101200521090340200241206a20091087042002280220210802400240200620016b20022802282207490d00200120076a2100200228028002210a0c010b200120076a22002001490d042006410174220a2000200a20004b1b220e4100480d040240024020060d00200e1028210a0c010b2002280280022006200e102c210a0b200a450d032002200e360284022002200a36028002200e21060b2002200036028802200a20016a20082007109a051a02402002280224450d002008102a0b200941a0026a210920002101200b41e07d6a220b0d000b200f41a0026c210920054198016a210103402001106a200141a0026a2101200941e07d6a22090d000b2005102a200241b0036a24002000ad422086200aad840f0b200041081037000b200e41011037000b1031000b2002418c026a4104360200200241346a410236020020024202370224200241bca7c4003602202002410436028402200241f8a8c400360280022002410036029c01200241b8aec60036029801200220024180026a360230200220024198016a36028802200241206a41cca7c400103e000bf00101067f2001280204210202400240024003402001280200220341086a210420032f01062205410374210141002106024003402001450d0141ffa0c60020044108109c052207450d03200141786a2101200641016a2106200441086a21042007417f4a0d000b2006417f6a21050b02402002450d002002417f6a2102200320054102746a41e4016a21010c010b0b20004187a1c600360204200041086a41283602000c010b200341e0006a2006410c6c6a220128020841074b0d01200041afa1c600360204200041086a41293602000b200041013602000f0b200041086a2001280200290000370300200041003602000be92c06087f017e097f027e017f027e230041b0026b22022400024002402001450d00200220003602100c010b200241013602100b20022001360214200241c8006a200241106a107f02400240200228024c2203450d00200241d4006a280200210420022802502105200241c8006a200241106a1079200228024822060d0102402004450d00200441246c21002003210103400240024020012d0000220741034b0d0002400240024020070e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b2005450d002003102a0b200241dc016a4104360200200241dc006a41023602002002420237024c200241bca7c400360248200241043602d40120024194a9c4003602d0012002410036022c200241b8aec6003602282002200241d0016a3602582002200241286a3602d801200241c8006a41cca7c400103e000b200241d0006a2802002108200228024c2109200241086a200241106a106c0240024020022802080d00200228020c21012002200241106a360228200241003a0038200242003702d401200241f8b9c0003602d0012002200136024c200241003602482002200241386a3602542002200241286a360250200241c8006a200241d0016a10860420022802d001210120022902d401210a024020022d0038450d002001200aa7200a422088a710b0020c010b20010d010b200241dc016a4104360200200241dc006a41023602002002420237024c200241bca7c400360248200241043602d40120024194a9c4003602d0012002410036022c200241b8aec6003602282002200241d0016a3602582002200241286a3602d801200241c8006a41cca7c400103e000b2002200a37021c20022001360218200241013b01342002420037022c200241f8b9c000360228200241286a41086a210b024002400240024002402008450d002006200841a0026c6a210c200241d0016a410272210d2006210e024002400240024002400240024002400340200e41e8006a2903004202520d0902400240200e28029801410247220f0d00200e2903a001210a200241186a2101200228021c211002400240024002400240024002400240024002400240024002400240024002400240024003402001280200221141086a210020112f010622124103742101410021070240024003402001450d0141f7fcc50020004108109c052213450d02200141786a2101200741016a2107200041086a21002013417f4a0d000b2007417f6a21120b2010450d022010417f6a2110201120124102746a41e4016a21010c010b0b0240201141e0006a2007410c6c6a220128020841074b0d00201442808080807083422984210a41fffcc50021120c020b200a42b8178020012802002900002214510d0341c6e6c2002112413121100c020b201442808080807083421c84210a41a8fdc50021120b200aa721100b024002400240024020022d0035450d004131210141f7e6c20021000c010b2002280228200228022c200228023010b0022002420037022c200241f8b9c000360228200242e2c289abb68edbb7f400370338200241d0016a410272410041da001099051a200241c8006a41004184011099051a41e40110282213450d0420134100360200201341046a200241d0016a41dc00109a051a201341e0006a200241c8006a418401109a051a2002410036022c2002201336022820132f0106220e4103742111417f210041002101024002400340024020112001470d00200e21000c020b200241386a201320016a41086a4108109c052207450d02200141086a2101200041016a2100200741004e0d000b0b200242e2c289abb68edbb7f40037025c2002200b360258200220003602542002201336024c200241003602482002200241286a360250201041046a2200417f4c0d062000450d02200010282201450d07200241003602ac02200220013602d0012010413f4b0d03200120104102743a0000410121070c1b0b412d210141a8e7c20021000b2002200136024c2002200036024841d5e7c2004122200241c8006a41f8e7c2001038000b200241003602ac0241012100200241013602d001410110282201450d05200141033a0000200241013602ac02200220013602d001410521070c130b201041808001490d162010418080808004490d150c100b200f0d0e200e2903a0012115200241c8006a200241186a10970402400240024020022802484101470d002002350250210a200228024c21160c010b2002290350210a200241c8006a41086a220142003703002002420037034841feb3c300410d200241c8006a1008200241d0016a41086a2001290300370300200220022903483703d00120024100360248200241d0016a4110200241c8006a100621010240024020022802482200417f470d00420021170c010b024020010d00420021170c010b200041074d0d07200129000021172001102a0b02402015200a423c7c560d004100210f2015201742dc0b7c220a540d020c110b201842808080807083422584210a41f8b5c30021160b4101210f0b024020022d0035450d004131210141f7e6c20021000c080b0240200f450d002002280228200228022c200228023010b0022002420037022c200241f8b9c000360228200242f4d2b59bc7ae98b8303703380c060b20022802282111200242f4d2b59bc7ae98b830370338201141f8b9c000460d05200228022c21100c060b41e40141041037000b1036000b200041011037000b410141011037000b41c4d1c3004133200241c8006a419cd9c3001038000b200d410041da001099051a200241c8006a41004184011099051a41e40110282211450d034100211020114100360200201141046a200241d0016a41dc00109a051a201141e0006a200241c8006a418401109a051a2002410036022c200220113602280b0340201141086a210020112f010622124103742101410021070240024003402001450d01200241386a20004108109c052213450d02200141786a2101200741016a2107200041086a21002013417f4a0d000b2007417f6a21120b2010450d032010417f6a2110201120124102746a41e4016a28020021110c010b0b412d210141a8e7c20021000b2002200136024c2002200036024841d5e7c2004122200241c8006a41f8e7c2001038000b200242f4d2b59bc7ae98b83037025c2002200b360258200220123602542002201136024c200241003602482002200241286a360250200241003602d801200242013703d00141011028210102400240200f0d002001450d03200141003a000020024281808080103702d401200220013602d001200141014109102c2201450d042001200a3700012002428980808090013702d401200220013602d0010c010b2001450d04200141013a000020024281808080103702d401200220013602d001200aa72201200241d0016a10b4010240024020022802d401220720022802d80122006b2001490d0020022802d00121070c010b200020016a22132000490d14200741017422112013201120134b1b22134100480d140240024020070d002013102821070c010b20022802d00120072013102c21070b2007450d06200220133602d401200220073602d0010b2002200020016a3602d801200720006a20162001109a051a0b200241386a41086a200241d0016a41086a280200360200200220022903d001370338200241c8006a200241386a10bb022002200f3a0035200241003a0034200a2118200f450d05200241d0016a41086a200241286a41086a290300370300200220022903283703d0010c110b41e40141041037000b410141011037000b410941011037000b410141011037000b201341011037000b200e41a0026a220e200c470d010c0a0b0b200141033a0000200241013602ac022000417f6a41034b0d01200041017422074105200741054b1b22074100480d0a0b200120002007102c2201450d01200220013602d001200721000b20012010360001410521070c030b200741011037000b02400240200041034b0d00200041017422074104200741044b1b22074100480d08200120002007102c2201450d01200220013602d001200721000b20012010410274410272360000410421070c020b200741011037000b0240200041014b0d0020012000200041017422074102200741024b1b2207102c2201450d02200220013602d001200721000b41022107200120104102744101723b00000b200220073602ac0202400240200020076b2010490d00200021130c010b200720106a22132007490d05200041017422112013201120134b1b22134100480d05200120002013102c2201450d02200220013602d0010b2002200720106a3602ac02200120076a20122010109a051a2002201336023c200220022802d001360238200220022802ac02360240200241c8006a200241386a10bb0220024180023b0134200241d0016a41086a200241286a41086a290300370300200220022903283703d0010c030b200741011037000b201341011037000b200241d0016a41086a200b290300370300200220022903283703d0010b2002280218200228021c200228022010b00202402004450d00200441246c21002003210103400240024020012d0000220741034b0d0002400240024020070e0404000102040b2001410c6a280200450d03200141086a280200102a0c030b2001410c6a280200450d02200141086a280200102a0c020b2001410c6a280200450d01200141086a280200102a0c010b200141086a280200450d00200141046a280200102a0b200141246a21012000415c6a22000d000b0b02402005450d002003102a0b02402008450d00200841a0026c210020064198016a210103402001106a200141a0026a2101200041e07d6a22000d000b0b02402009450d002006102a0b2002410036025020024201370348410110282201450d022002410136024c20022002280250220041016a36025020022001360248200120006a20022d00dc013a000002400240200228024c20022802502201460d00200228024821000c010b200141016a22002001490d01200141017422072000200720004b1b22074100480d010240024020010d002007102821000c010b200228024820012007102c21000b2000450d022002200736024c20022000360248200228025021010b2002200141016a360250200020016a20022d00dd013a000020022802d801200241c8006a10b40120022802d00122072100024020022802d4012213450d002013210120072100034020002802e40121002001417f6a22010d000b0b0240024002400240024002400240024002400240024020022802d80122120d00410021010c010b200241d0016a210f41002113034002400240201320002f01064f0d0020002013410c6c6a41e0006a2111200020134103746a41086a2101201341016a21130c010b02400240200028020022010d00201542808080807083200fad84211541002107410021010c010b2000330104422086200fad842115410121070b201521142015210a02402015422088a7220020012f0106490d000340200a221442ffffffff0f83210a200741016a210720012f01042200200128020022012f01064f0d000b0b20012000410c6c6a2113200120004103746a2110200041027420016a41e8016a28020021002014a7210f02402007417f6a2201450d00034020002802e40121002001417f6a22010d000b0b201341e0006a2111201041086a2101410021130b02400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d032002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00003a000002400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d042002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00013a000002400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d052002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00023a000002400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d062002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00033a000002400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d072002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00043a000002400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d082002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00053a000002400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d092002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00063a000002400240200228024c20022802502207460d00200228024821100c010b200741016a22102007490d0c2007410174220e2010200e20104b1b220e4100480d0c0240024020070d00200e102821100c010b20022802482007200e102c21100b2010450d0a2002200e36024c20022010360248200228025021070b2002200741016a360250201020076a20012d00073a00002011280200211020112802082201200241c8006a10b40102400240200228024c2211200228025022076b2001490d00200228024821110c010b200720016a220e2007490d0c20114101742207200e2007200e4b1b22074100480d0c0240024020110d002007102821110c010b200228024820112007102c21110b2011450d0b2002200736024c20022011360248200228025021070b2002200720016a360250201120076a20102001109a051a2012417f6a22120d000b20022802d801210120022802d401211320022802d00121070b2002350248210a2002350250211420072013200110b002200241b0026a2400200a2014422086840f0b200e41011037000b200e41011037000b200e41011037000b200e41011037000b200e41011037000b200e41011037000b200e41011037000b200e41011037000b200741011037000b1031000b200741011037000b410141011037000b5702017f027e230041306b2202240020024101410010a80320024100360228200242013703202002200241206a36022c20022002412c6a10c8012002350228210320023502202104200241306a240020042003422086840bba48030b7f047e017f230041d00c6b22022400024002402001450d00200220003602100c010b200241013602100b20022001360214200241f0066a200241106a107a024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903d8074203510d00200241186a200241f0066a41a002109a051a200241f0026a200241186a41a002109a051a200241f0066a200241f0026a10870420022802f8062103024020022802f406450d0020022802f006102a0b200241f0066a200241f0026a41a002109a051a20024190056a200241f0066a10d10341012100024020022d0090054101470d00200220022d0093053a00bb02200220022f0091053b00b902200241013a00b8020c180b200241f0066a20024190056a41086a41d801109a051a200241086a200241c0076a220410f301024002402002290390074202520d00200241b8026a41206a22014200370300200241b8026a41186a22004280808080c000370300200241013a00e002200242043703c8022002427f3703c002200242003703b80220024190056a41206a2203420037030020024190056a41186a22054280808080c000370300200241013a00b805200242043703a0052002427f370398052002420037039005200241c8096a200241b8026a20024190056a109b04200241b8026a41286a2206200241c8096a41286a2903003703002001200241c8096a41206a2903003703002000200241c8096a41186a290300370300200241b8026a41106a2207200241c8096a41106a290300370300200241b8026a41086a2208200241c8096a41086a290300370300200220022903c8093703b8022003420037030020054280808080c000370300200241013a00b805200242043703a0052002427f370398052002420037039005200241f8096a200241b8026a20024190056a109b042006200241f8096a41286a2903003703002001200241f8096a41206a2903003703002000200241f8096a41186a2903003703002007200241f8096a41106a2903003703002008200241f8096a41086a290300370300200220022903f8093703b8022003420037030020054280808080c000370300200241013a00b805200242043703a0052002427f370398052002420037039005200241a80a6a200241b8026a20024190056a109b042006200241a80a6a41286a2903003703002001200241a80a6a41206a2903003703002000200241a80a6a41186a2903003703002007200241a80a6a41106a2903003703002008200241a80a6a41086a290300370300200220022903a80a3703b8022003420037030020054280808080c000370300200241013a00b805200242043703a0052002427f370398052002420037039005200241d80a6a200241b8026a20024190056a109b042006200241d80a6a41286a2903003703002001200241d80a6a41206a2903003703002000200241d80a6a41186a2903003703002007200241d80a6a41106a2903003703002008200241d80a6a41086a290300370300200220022903d80a3703b8022003420037030020054280808080c000370300200241013a00b805200242043703a0052002427f370398052002420037039005200241880b6a200241b8026a20024190056a109b042006200241880b6a41286a2903003703002001200241880b6a41206a2903003703002000200241880b6a41186a2903003703002007200241880b6a41106a2903003703002008200241880b6a41086a290300370300200220022903880b3703b8022003420037030020054280808080c000370300200241013a00b805200242043703a0052002427f370398052002420037039005200241b80b6a200241b8026a20024190056a109b04200241980c6a41286a2203200241b80b6a41286a290300370300200241980c6a41206a2206200241b80b6a41206a290300370300200241980c6a41186a2205200241b80b6a41186a290300370300200241980c6a41106a2207200241b80b6a41106a290300370300200241980c6a41086a2208200241b80b6a41086a290300370300200220022903b80b3703980c2001420037030020004280808080c000370300200241013a00e002200242043703c8022002427f3703c002200242003703b802200241e80b6a200241980c6a200241b8026a109b042002419c056a2201200241e80b6a41086a290300370200200241a4056a2200200241e80b6a41106a290300370200200241ac056a2209200241e80b6a41186a290300370200200241b4056a220a200241e80b6a41206a290300370200200241bc056a220b200241e80b6a41286a290300370200200220022903e80b3702940520024198096a41286a220c200b29020037030020024198096a41206a220b200a29020037030020024198096a41186a220a200929020037030020024198096a41106a2209200029020037030020024198096a41086a220020012902003703002002200229029405370398092003200c2903003703002006200b2903003703002005200a290300370300200720092903003703002008200029030037030020022002290398093703980c418102210120022802c0074112460d010c170b20022d000c210b20022802082108200241b8026a41206a22014200370300200241b8026a41186a22004280808080c000370300200241013a00e002200242043703c8022002427f3703c002200242003703b80220024190056a41206a2205420037030020024190056a41186a22064280808080c000370300200241013a00b805200242043703a0052002427f37039805200242003703900520024198096a200241b8026a20024190056a109b04200241b8026a41286a220720024198096a41286a290300370300200120024198096a41206a290300370300200020024198096a41186a290300370300200241b8026a41106a220920024198096a41106a290300370300200241b8026a41086a220a20024198096a41086a29030037030020022002290398093703b8022005420037030020064280808080c000370300200241013a00b805200242043703a0052002427f370398052002420037039005200241c8096a200241b8026a20024190056a109b042007200241c8096a41286a2903003703002001200241c8096a41206a2903003703002000200241c8096a41186a2903003703002009200241c8096a41106a290300370300200a200241c8096a41086a290300370300200220022903c8093703b802200241b80b6a41086a22014200370300200242003703b80b41d9efc200410d200241b80b6a1008200241880b6a41086a2001290300370300200220022903b80b3703880b410021002002410036029005200241880b6a411020024190056a1006210102402002280290052205417f460d002001450d0020054104490d03200128000021002001102a0b2000ad210d427f210e02402002290390074201520d00200229039807220e4200510d04200d200241a0076a290300220f200f200d541b2210200e7c2010200f7d200e827d210e0b20024190056a41206a420037030020024190056a41186a4280808080c000370300200241bc056a2002419b0c6a280000360000200241013a00b805200242043703a0052002420037039005200220022800980c3600b90520024200200e200d7d220d200d200e561b37039805200241f8096a200241b8026a20024190056a109b04200241980c6a41286a200241f8096a41286a290300370300200241980c6a41206a200241f8096a41206a290300370300200241980c6a41186a200241f8096a41186a290300370300200241980c6a41106a200241f8096a41106a290300370300200241980c6a41086a200241f8096a41086a290300370300200220022903f8093703980c20022802b8072100411310282201450d04200141002900cef0423700002001410f6a41002800ddf042360000200141086a41002900d6f04237000020024293808080b0023702bc0b200220013602b80b200241f0066a200241b80b6a108f0120022802c00b210120022802b80b2105200241b8026a41186a22064200370300200241b8026a41106a22074200370300200241b8026a41086a22094200370300200242003703b80220052001200241b8026a1000200241e80b6a41186a2006290300370300200241e80b6a41106a2007290300370300200241e80b6a41086a2009290300370300200220022903b8023703e80b024020022802bc0b450d0020022802b80b102a0b200241003602b802200241e80b6a4120200241b8026a100621010240024020022802b8022205417f460d002001450d00024020054104490d00200128000021092001102a200920004d0d02200220022800880b3602900920022002418b0b6a28000036009309200241003a00bb0220024180063b00b902200241013a00b80220022802a80c21030240200241b00c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b0240200241ac0c6a280200450d002003102a0b20022802b40c21030240200241bc0c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b200241b80c6a280200450d1a2003102a0c1a0b41c4d1c3004133200241c80c6a419cd9c3001038000b410021090b410c10282205450d05410410282201450d06200242043702bc02200220013602b802200241f0066a200241b8026a108f010240024020022802bc02220620022802c00222016b4104490d0020022802b80221070c010b200141046a22072001490d1a200641017422012007200120074b1b22014100480d1a0240024020060d002001102821070c010b20022802b80220062001102c21070b2007450d08200220013602bc02200220073602b80220022802c00221010b410421062002200141046a3602c002200720016a2000360000200241e80b6a41086a20022802c0022201360200200220022903b802220e3703e80b200541086a20013602002005200e370200410021010240200920004f0d00410c10282206450d09410410282201450d0a200242043702bc02200220013602b802200241f0066a200241b8026a108f010240024020022802bc02220720022802c00222016b4104490d0020022802b80221070c010b200141046a22092001490d1b200741017422012009200120094b1b22014100480d1b0240024020070d002001102821070c010b20022802b80220072001102c21070b2007450d0c200220013602bc02200220073602b80220022802c00221010b2002200141046a3602c002200720016a2000417f6a360000200241e80b6a41086a20022802c0022201360200200220022903b802220e3703e80b200641086a20013602002006200e370200410121010b20024190056a41206a42818080801037030020024190056a41186a2001360200200241a4056a2001360200200220022800880b3602900920022002418b0b6a28000036009309200241bc056a200228009309360000200241013a00b805200220053602ac05200220063602a0052002427f3703980520022008ad220e3703900520022002280290093600b905200241a80a6a200241980c6a20024190056a109b04200241980c6a41286a200241a80a6a41286a290300370300200241980c6a41206a200241a80a6a41206a290300370300200241980c6a41186a200241a80a6a41186a290300370300200241980c6a41106a200241a80a6a41106a290300370300200241980c6a41086a200241a80a6a41086a290300370300200220022903a80a3703980c200241b8026a200b4101712201200310b80320022d00b8020d14200241b8026a2008200110b90320022d00b802450d1320022f00b90220022d00bb024110747221010c150b200241e4076a2802002100200241b8026a10fb01200010fc0120022802b802220120022802c00241014100410010032103024020022802bc02450d002001102a0b41800621012003417f470d1510fb01220c200241e0076a280200470d15200241b80b6a41086a22014200370300200242003703b80b41c2e1c000410d200241b80b6a1008200241880b6a41086a2001290300370300200220022903b80b3703880b200241003602b802200241880b6a4110200241b8026a100621010240024020022802b8022203417f460d002001450d00200220033602bc0b200220013602b80b200241b8026a200241b80b6a107c20022802b802220b450d0c20022902bc02210e2003450d012001102a0c010b4101210b4200210e20022802e40721000b024002402000200e422088a74f0d00200b20004105746a2211450d00200241003602c002200242013703b802200241c4076a2802002100410410282201450d0d20024284808080c0003702bc02200220013602b80220012000360000200241c8076a2802002106200241d0076a2802002201200241b8026a10b4010240024020022802bc02220320022802c00222006b2001490d0020022802b80221030c010b200020016a22072000490d1b200341017422082007200820074b1b22074100480d1b0240024020030d002007102821030c010b20022802b80220032007102c21030b2003450d0f200220073602bc02200220033602b8020b2002200020016a3602c002200320006a20062001109a051a200241d4076a2802002100200241dc076a2802002201200241b8026a10b4010240024020010d0020022802bc02210620022802c00221090c010b20002001410c6c6a210a034020002802002108200041086a2802002201200241b8026a10b4010240024020022802bc02220620022802c00222036b2001490d0020022802b80221070c010b200320016a22072003490d1d200641017422092007200920074b1b22094100480d1d0240024020060d002009102821070c010b20022802b80220062009102c21070b2007450d12200220093602bc02200220073602b802200921060b2002200320016a22093602c002200720036a20082001109a051a2000410c6a2200200a470d000b0b20022802e007210302400240200620096b4104490d0020022802b80221010c010b200941046a22012009490d1b200641017422002001200020014b1b22004100480d1b0240024020060d002000102821010c010b20022802b80220062000102c21010b2001450d11200220003602bc02200220013602b802200021060b2002200941046a22003602c002200120096a200336000020022802e407210702400240200620006b41034d0d00200621030c010b200041046a22032000490d1b200641017422082003200820034b1b22034100480d1b0240024020060d002003102821010c010b200120062003102c21010b2001450d12200220033602bc02200220013602b8020b200120006a20073600002001200941086a200241e8076a2011100a210002402003450d002001102a0b2000450d010b4180082101200ea7450d16200b102a0c160b410c10282201450d10410410282200450d1120024284808080c0003702bc02200220003602b8022000200c3600002011200241b8026a108f01200241b80b6a41086a20022802c0022200360200200220022903b802220d3703b80b200141086a20003602002001200d370200200220022800880b3602d80a20022002418b0b6a2800003600db0a0240200ea7450d00200b102a0b20024190056a41206a42818080801037030020024190056a41186a4100360200200241bc056a20022800db0a360000200241013a00b805200220013602ac05200242043703a0052002427f370398052002420037039005200220022802d80a3600b905200241e80b6a200241980c6a20024190056a109b04200241b8026a41086a20022903e80b370300200241b8026a41106a200241e80b6a41086a290300370300200241b8026a41186a200241e80b6a41106a290300370300200241b8026a41206a200241e80b6a41186a290300370300200241b8026a41286a200241e80b6a41206a290300370300200241e8026a200241e80b6a41286a290300370300200241003a00b8020c160b200241246a410436020020024184036a4102360200200242023702f402200241bca7c4003602f0022002410436021c200241aca9c4003602182002410036029405200241b8aec600360290052002200241186a36028003200220024190056a360220200241f0026a41cca7c400103e000b41c4d1c3004133200241c80c6a419cd9c3001038000b41fcf8c5001032000b411341011037000b410c41041037000b410441011037000b200141011037000b410c41041037000b410441011037000b200141011037000b41c4d1c3004133200241c80c6a419cd9c3001038000b410441011037000b200741011037000b200941011037000b200041011037000b200341011037000b410c41041037000b410441011037000b20024190056a41206a2205420037030020024190056a41186a22064280808080c000370300200220022800880b3602e80b20022002418b0b6a2800003600eb0b200241bc056a20022800eb0b360000200242043703a0052002427f370398052002427f200e20011b37039005200220022802e80b3600b905200241013a00b805200241d80a6a200241980c6a20024190056a109b04200241e80b6a41286a2207200241d80a6a41286a290300370300200241e80b6a41206a2209200241d80a6a41206a290300370300200241e80b6a41186a2200200241d80a6a41186a290300370300200241e80b6a41106a220a200241d80a6a41106a290300370300200241e80b6a41086a220b200241d80a6a41086a290300370300200220022903d80a3703e80b20024190056a20022903a807200241b0076a290300200241f0066a200820012003109e02024020022d0090054101470d00200220022d0093053a00bb02200220022f0091053b00b902200241013a00b80220022802f80b2103024020002802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b0240200241fc0b6a280200450d002003102a0b20022802840c210302402002418c0c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b200241880c6a280200450d042003102a0c040b200241980c6a41286a20024190056a41306a2201290300370300200241980c6a41206a20024190056a41286a290300370300200241980c6a41186a2005290300370300200241980c6a41106a2006290300370300200241980c6a41086a20024190056a41106a29030037030020022002290398053703980c200241880b6a200241e80b6a200241980c6a109b042007200241880b6a41286a2903003703002009200241880b6a41206a2903003703002000200241880b6a41186a290300370300200a200241880b6a41106a290300370300200b200241880b6a41086a290300370300200220022903880b3703e80b20024190056a200410d203024020022d0090054101470d00200220022d0093053a00bb02200220022f0091053b00b902200241013a00b80220022802f80b21030240200241800c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b0240200241fc0b6a280200450d002003102a0b20022802840c210302402002418c0c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b200241880c6a280200450d042003102a0c040b200241980c6a41286a2001290300370300200241980c6a41206a20024190056a41286a290300370300200241980c6a41186a20024190056a41206a290300370300200241980c6a41106a20024190056a41186a290300370300200241980c6a41086a20024190056a41106a29030037030020022002290398053703980c200241b80b6a200241e80b6a200241980c6a109b04200241b8026a41086a20022903b80b370300200241b8026a41106a200241b80b6a41086a290300370300200241b8026a41186a200241b80b6a41106a290300370300200241b8026a41206a200241b80b6a41186a290300370300200241b8026a41286a200241b80b6a41206a290300370300200241b8026a41306a200241b80b6a41286a290300370300200241003a00b8020c030b20022f00b90220022d00bb024110747221010b200220022800880b3602e80b20022002418b0b6a2800003600eb0b200241013a00b802200220013b00b902200220014110763a00bb0220022802a80c21030240200241b00c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b0240200241ac0c6a280200450d002003102a0b20022802b40c21030240200241bc0c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b200241b80c6a280200450d012003102a0c010b200241003a00bb02200220013b00b902200241013a00b80220022802a80c2103024020052802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b0240200241ac0c6a280200450d002003102a0b20022802b40c21030240200241bc0c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b200241b80c6a280200450d002003102a0b2004106a20022d00b80221000b024002400240024002400240410110282201450d00200242013702f406200220013602f00602400240200041ff01714101460d00200241013602f806200141003a0000200241c0026a290300210e024020022802f4062200417f6a41074b0d00200041017422034109200341094b1b22034100480d09200120002003102c2201450d04200220033602f406200220013602f0060b200241093602f8062001200e370001200241d0026a2802002100200241d8026a2802002201200241f0066a10b40102402001450d0020002001410c6c6a2108034020002802002106200041086a2802002201200241f0066a10b4010240024020022802f406220520022802f80622036b2001490d0020022802f00621050c010b200320016a22072003490d0b200541017422042007200420074b1b22074100480d0b0240024020050d002007102821050c010b20022802f00620052007102c21050b2005450d07200220073602f406200220053602f0060b2002200320016a3602f806200520036a20062001109a051a2000410c6a22002008470d000b0b200241dc026a2802002100200241e4026a2802002201200241f0066a10b4010240024020010d0020022802f406210620022802f80621080c010b20002001410c6c6a2104034020002802002107200041086a2802002201200241f0066a10b4010240024020022802f406220620022802f80622036b2001490d0020022802f00621050c010b200320016a22052003490d0b200641017422082005200820054b1b22084100480d0b0240024020060d002008102821050c010b20022802f00620062008102c21050b2005450d08200220083602f406200220053602f006200821060b2002200320016a22083602f806200520036a20072001109a051a2000410c6a22002004470d000b0b200241c8026a290300210e02400240200620086b4108490d0020022802f00621030c010b200841086a22012008490d09200641017422002001200020014b1b22014100480d090240024020060d002001102821030c010b20022802f00620062001102c21030b2003450d07200220013602f406200220033602f0060b2002200841086a3602f806200320086a200e370000024020022802f40620022802f8062201470d00200141016a22002001490d09200141017422052000200520004b1b22004100480d090240024020010d002000102821030c010b200320012000102c21030b2003450d08200220003602f406200220033602f0060b2002200141016a22053602f806200320016a20022d00e8023a00000c010b200241013602f806200141013a0000200241b8026a410172200241f0066a10c60320022802f806210520022802f00621030b024020022d00b8020d000240200241d8026a2802002200450d00200241d0026a28020021012000410c6c210003400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b0240200241d4026a280200450d0020022802d002102a0b0240200241e4026a2802002200450d00200241dc026a28020021012000410c6c210003400240200141046a280200450d002001280200102a0b2001410c6a2101200041746a22000d000b0b200241e0026a280200450d0020022802dc02102a0b200241d00c6a24002005ad4220862003ad840f0b410141011037000b200341011037000b200741011037000b200841011037000b200141011037000b200041011037000b1031000bd40505017f027e077f017e017f230041206b220324002002290300210420012903002105200141106a2106200228021021070240024002400240024002400240200141146a2802002208200141186a28020022096b200241186a280200220a490d00200628020021080c010b2009200a6a220b2009490d032008410174220c200b200c200b4b1b220bad420c7e220d422088a70d03200da7220c4100480d030240024020080d00200c102821080c010b20062802002008410c6c200c102c21080b2008450d0120012008360210200141146a200b3602000b20082009410c6c6a2007200a410c6c109a051a200141186a2009200a6a36020020024100360218200341086a200641086a280200360200200320062902003703002001411c6a2106200228021c210b02400240200141206a2802002208200141246a28020022096b200241246a280200220a490d00200628020021080c010b2009200a6a220c2009490d032008410174220e200c200e200c4b1b220cad420c7e220d422088a70d03200da7220e4100480d030240024020080d00200e102821080c010b20062802002008410c6c200e102c21080b2008450d022001200836021c200141206a200c3602000b427f200520047c220420042005541b210520082009410c6c6a200b200a410c6c109a051a200141246a2009200a6a36020020024100360224200341106a41086a200641086a28020036020020032006290200370310200229030822042001290308220d200d2004561b210420012d0028450d034101210120022d0028450d030c040b200c41041037000b200e41041037000b1031000b410021010b20002005370300200020032903003702102000200329031037021c200020013a002820002004370308200041186a200341086a280200360200200041246a200341106a41086a2802003602000240200241146a280200450d002007102a0b0240200241206a280200450d00200b102a0b200341206a24000ba13507037f017e037f017e147f027e107f230041d0036b2202240002400240024002400240024002400240024020014104490d0020002800002103101a4101470d07200241a8016a41086a22004200370300200242003703a801419be1c0004111200241a8016a1008200241e8006a41086a2000290300370300200220022903a80137036841002101200241003602a801200241e8006a4110200241a8016a100621000240024020022802a8012204417f460d002000450d0020044104490d01200028000021012000102a0b200241003602a801410141838ac100411c200241a8016a101b2100024002400240024020022802a8012204417f470d00410121040c010b2004ad22054220862005842105200045210420000d010b41002100410121060c010b2005422088a74105490d04200028000121070240024020002d00000d0020072003460d0141002106200720034f0d02410121060c020b4101210620072001490d010b410021060b200120034f0d022006450d020240410110282201450d00200141003a00000240200141014105102c2201450d0020012003360001410141838ac100411c4100200020041b22062005422088a7417f20061b20014105101c21062001102a024020042005a745720d002000102a0b20060d0a200241a8016a41086a22004200370300200242003703a80141c2e1c000410d200241a8016a1008200241e8006a41086a2000290300370300200220022903a801370368200241003602a801200241e8006a4110200241a8016a1006210002400240024020022802a8012201417f460d002000450d002002200136022c20022000360228200241a8016a200241286a107c20022802a8012208450d0220022902ac0121092001450d012000102a0c010b42002109410121080b200241186a109d042002280218210a2002280220220b4115490d07200b410176220c41ffffff3f71200c470d09200c4105742200417f4c0d094101210d024002402000450d0020001028220d450d010b200a41606a210e200a41a07f6a210f41002110410021114104211241002113200b211403400240024020142215417f6a22040d0041012107410021140c010b024002400240024002400240200a20044105746a20154105742216200a6a41406a4120109c054100480d002015417e6a2106200f20166a210041002114410021010340024020062001470d00201521070c080b200141016a2101200041206a20004120109c052104200041606a21002004417f4a0d000b200141016a21072001417f7320156a21040c010b200f20166a210002400340024020044101470d00410021040c020b2004417f6a2104200041206a20004120109c052101200041606a210020014100480d000b0b20152004490d012015200b4b0d03201520046b22074101762206450d00200e20166a2100200a20044105746a21010340200241a8016a41186a2216200141186a2217290000370300200241a8016a41106a2218200141106a2219290000370300200241a8016a41086a221a200141086a221b290000370300200220012900003703a801200041086a221c2900002105200041106a221d290000211e200041186a2214290000211f200120002900003700002017201f3700002019201e370000201b200537000020142016290300370000201d2018290300370000201c201a290300370000200020022903a801370000200041606a2100200141206a21012006417f6a22060d000b0b024020040d00200421140c050b0240200741094d0d00200421140c050b2015200b4b0d01201520046b2106200a20044105746a2116034020152004417f6a2214490d040240201520146b22074102490d00200a20044105746a2200200a20144105746a22044120109c05417f4a0d002004290000210520042000290000370000200241a8016a41186a221a200441186a2201290000370300200241a8016a41106a221b200441106a2217290000370300200241a8016a41086a221c200441086a22182900003703002018200041086a2900003700002017200041106a2900003700002001200041186a290000370000200220053703a80141012119024020074103490d00200441c0006a200241a8016a4120109c05417f4a0d00410221012016210002400340200041186a200041386a290000370000200041106a200041306a290000370000200041086a200041286a2900003700002000200041206a221729000037000020062001460d01200041c0006a21182001211920172100200141016a21012018200241a8016a4120109c05417f4a0d020c000b0b200121190b200420194105746a220020022903a801370000200041186a201a290300370000200041106a201b290300370000200041086a201c2903003700000b2014450d05201641606a2116200641016a2106201421042007410a4f0d050c000b0b200420151044000b20152004417f6a2214490d010b2015200b103c000b201420151044000b02400240024020132011470d00201141016a22002011490d11201141017422012000200120004b1b220041ffffffff01712000470d11200041037422014100480d110240024020110d002001102821120c010b201220114103742001102c21120b2012450d0120002111201021130b201220134103746a2200200736020420002014360200201041016a2213211020134102490d0102400340024002400240024020122013417f6a22104103746a2200280200450d00201341037420126a220641746a2802002204200028020422014d0d000240201341024b0d0020132110410221130c080b20122013417d6a221a4103746a2802042200200120046a4d0d010240201341034b0d0020132110410321130c080b200641646a280200200020046a4d0d01201321100c070b20134103490d012000280204210120122013417d6a221a4103746a28020421000b20002001490d010b2013417e6a211a0b0240024002400240024002402013201a41016a22204b2221450d002013201a4b2222450d012012201a4103746a221b2802042223201b2802006a2200201220204103746a221c280200221d490d022000200b4b0d03200a201d4105746a2218201c280204221941057422016a2106200041057421042000201d6b221520196b220020194f0d04200d200620004105742201109a05221720016a21070240024020194101480d00200041014e0d010b20062100201721010c060b200e20046a21042006210003402004200041606a2206200741606a2215201520064120109c0541004822161b2201290000370000200441186a200141186a290000370000200441106a200141106a290000370000200441086a200141086a2900003700002007201520161b2107024020182006200020161b2200490d00201721010c070b200441606a21042017210120172007490d000c060b0b41b8dbc000202020131034000b41b8dbc000201a20131034000b201d20001044000b2000200b103c000b200d20182001109a05221720016a21070240024020194101480d00201520194a0d010b20182100201721010c010b200a20046a211620172101201821000340200020062001200620014120109c0541004822151b2204290000370000200041186a200441186a290000370000200041106a200441106a290000370000200041086a200441086a2900003700002001200141206a20151b2101200041206a2100200641206a200620151b220620164f0d01200720014b0d000b0b20002001200720016b416071109a051a02402022450d00201b201d360200201b41046a202320196a3602002021450d02201c201c41086a20132020417f736a410374109b051a20102113201041014d0d040c010b0b41c8dbc000201a20131034000b41b0b1c0001032000b200141041037000b20140d000b02402011450d002012102a0b200c450d09200d102a0c090b200041011037000b41c4d1c3004133200241186a419cd9c3001038000b410541011037000b410141011037000b41c4d1c3004133200241186a419cd9c3001038000b200241f4006a4104360200200241bc016a4102360200200242023702ac01200241bca7c4003602a8012002410436026c200241c8a9c4003602682002410036022c200241b8aec6003602282002200241e8006a3602b8012002200241286a360270200241a8016a41cca7c400103e000b20042005a745720d052000102a0c050b02402005a7450d002000102a0b41e695c600412d100b0c040b200b4102490d00200a200b417f6a22014105746a21074101210403400240024002400240200b20012200417f6a2201490d00200b20016b22154102490d03200a20004105746a2200200a20014105746a22064120109c05417f4a0d032006290000210520062000290000370000200241a8016a41186a2213200641186a2216290000370300200241a8016a41106a2219200641106a2217290000370300200241a8016a41086a2212200641086a22182900003703002018200041086a2900003700002017200041106a2900003700002016200041186a290000370000200220053703a8014101210020154103490d02200641c0006a200241a8016a4120109c05417f4a0d0241002115200721000340200041186a200041386a290000370000200041106a200041306a290000370000200041086a200041286a2900003700002000200041206a2217290000370000200420152216460d022016417f6a2115200041c0006a2118201721002018200241a8016a4120109c05417f4a0d020c000b0b2001200b1044000b410220166b21000b200620004105746a220020022903a801370000200041186a2013290300370000200041106a2019290300370000200041086a20122903003700000b200741606a21072004417f6a210420010d000b0b2009a721102009422088a72200450d01200820004105746a2118200241a8016a41016a211a200241c0026a2124200241e9026a211b200241e0016a2125200241a8016a41306a2126200241a8016a41286a212741002115200821070240024002400240024002400340024002400240200b41014b0d000240200b0e020c000c0b0340200241a8016a41186a200741186a290000370300200241a8016a41106a200741106a290000370300200241a8016a41086a200741086a290000370300200220072900003703a801200a200241a8016a4120109c05450d02201541016a21152018200741206a2207470d000c0c0b0b0340200241a8016a41186a200741186a290000370300200241a8016a41106a200741106a290000370300200241a8016a41086a200741086a290000370300200220072900003703a801200741206a21070240200b450d0041002100200b210103402001410176220420006a22062000200a20064105746a200241a8016a4120109c054101481b2100200120046b220141014b0d000b200a20004105746a200241a8016a4120109c05450d030b201541016a211520072018460d0b0c000b0b200741206a2107410021000b0240024002400240024002400240200b20004d0d0020024100360268200241e8006a101d2104024020022802682201417f470d00410221060c0a0b200220013602ac01200220043602a8012001450d0320042d0000210620022001417f6a3602ac012002200441016a3602a801200641014b0d030240024020060e020100010b410021202021210c2012211c2019211420132128201721292016211d2021212a2012212b2019212c2013212d2017212e2016212f0c060b200241106a200241a8016a106c20022802100d0320022802ac0122062002280214222b490d03202b417f4c0d0e02400240202b0d004101212041010d010c050b202b102e2220450d02202020022802a801221c202b109a05211d20022006202b6b3602ac012002201c202b6a3602a801201d450d040b200241086a200241a8016a106c20022802080d0220022802ac01410c6e222e410c6c2206417f4c0d0e200228020c212f0240024002400240024020060d004104212d0c010b20061028222d450d010b024002400240202f0d00202d212c0c010b4100210c4100211c41002114202d212c03402002200241a8016a106c20022802000d0220022802ac01221d20022802042206490d022006417f4c0d140240024020060d00410121290c010b2006102e2229450d05202920022802a80122282006109a051a2002201d20066b3602ac012002202820066a3602a8010b201441016a211d02402014202e470d00200c201d200c201d4b1b222ead420c7e2205422088a70d182005a722284100480d180240024020140d0020281028212d0c010b202d201c2028102c212d0b202d450d06202d212c0b202c201c6a22142029360200201441046a2006ad2205422086200584370200200c41026a210c201c410c6a211c201d2114202f201d470d000b0b202c450d06202b212a202f211d202e2129202d2128202c2114202b211c202b210c20200d080c070b02402014450d004100210603400240202c20066a221d41046a280200450d00201d280200102a0b201c2006410c6a2206470d000b0b202e450d05202d102a0c050b200641041037000b200641011037000b202841041037000b41a08ac1002000200b1034000b202b41011037000b202b450d002020102a0b410021202016212f2017212e2013212d2019212c2012212b2021212a2022211d20232129200d212820112114200e211c200f210c0b2001450d010b2004102a0b024020200d00410221060c030b10fb012121200241003602b001200242013703a80102400240024002400240410410282201450d0020024284808080c0003702ac01200220013602a80120012003360000201c200241a8016a10b4010240024020022802ac01220420022802b00122016b201c490d0020022802a80121040c010b2001201c6a22062001490d10200441017422162006201620064b1b22064100480d100240024020040d002006102821040c010b20022802a80120042006102c21040b2004450d02200220063602ac01200220043602a8010b20022001201c6a3602b001200420016a2020201c109a051a201d200241a8016a10b401201d450d022014201d410c6c6a211220142104034020042802002113200441086a2802002201200241a8016a10b4010240024020022802ac01221620022802b00122066b2001490d0020022802a80121170c010b200620016a22172006490d11201641017422192017201920174b1b22194100480d110240024020160d002019102821170c010b20022802a80120162019102c21170b2017450d05200220193602ac01200220173602a801201921160b2002200620016a22193602b001201720066a20132001109a051a2004410c6a22042012470d000c050b0b410441011037000b200641011037000b20022802ac01211620022802b00121190c010b201941011037000b02400240201620196b4104490d0020022802a80121010c010b201941046a22012019490d0b201641017422042001200420014b1b22044100480d0b0240024020160d002004102821010c010b20022802a80120162004102c21010b2001450d04200220043602ac01200220013602a801200421160b2002201941046a22043602b001200120196a202136000002400240201620046b41034d0d00201621060c010b200441046a22062004490d0b201641017422172006201720064b1b22064100480d0b0240024020160d002006102821010c010b200120162006102c21010b2001450d05200220063602ac01200220013602a8010b200120046a2015360000200241e9dabdf3063602cc03202542003703002026420037030020274200370300200241a8016a41206a4200370300200241a8016a41186a4200370300200241a8016a41106a4200370300200241a8016a41086a4200370300200242003703a8010240200241cc036a200a20004105746a2001201941086a200241a8016a101e0d00200241e8006a41086a2200201a41086a290000370300200241e8006a41106a2204201a41106a290000370300200241e8006a41186a2216201a41186a290000370300200241e8006a41206a2217201a41206a290000370300200241e8006a41286a2213201a41286a290000370300200241e8006a41306a2219201a41306a290000370300200241e8006a41376a2212201a41376a2900003700002002201a29000037036820022d00a8012122200241286a41086a22232000290300370300200241286a41106a22002004290300370300200241286a41186a22042016290300370300200241286a41206a22162017290300370300200241286a41286a22172013290300370300200241286a41306a22132019290300370300200241286a41376a221920122900003700002002200229036837032802402006450d002001102a0b201b2002290328370000201b41086a2023290300370000201b41106a2000290300370000201b41186a2004290300370000201b41206a2016290300370000201b41286a2017290300370000201b41306a2013290300370000201b41376a2019290000370000200220223a00e802200220153602e402200220213602e0022002201d3602dc02200220293602d802200220283602d4022002201c3602d0022002200c3602cc02200220203602c802200220033602c402200241123602c0022002420237039002200241e8006a200241a8016a108704200228026c2100200228026822042002280270101f210102402000450d002004102a0b2024106a20010d02410110282200450d06200041013a0000200041014105102c2200450d07201541016a211520002003360001410141838ac100411c2000410510202000102a202f2116202e2117202d2113202c2119202b2112202a2121201d2122202921232028210d20142111201c210e200c210f20072018470d010c090b0b02402006450d002001102a0b0240200c450d002020102a0b0240201d450d00201d410c6c210003400240201441046a280200450d002014280200102a0b2014410c6a2114200041746a22000d000b0b410121062029450d012028102a0c010b410321060b02402010450d002008102a0b0240200228021c450d00200a102a0b412e2104419396c6002100200241186a2101024002400240024020060e0400010203000b412d210441e695c6002100200241286a21010c020b411f210441c795c6002100200241e8006a21010c010b419995c6002100200241a8016a21010b200120043602042001200036020020002004100b0c060b200441011037000b200641011037000b410141011037000b410541011037000b1036000b02402010450d002008102a0b200228021c450d00200a102a0b200241d0036a240042010f0b1031000bcb06020d7f037e230041e0006b22012400200141e9dabdf306360208410021022001410036020c200141086a2001410c6a102621032001200128020c360214200120033602102001200141106a106c2001280204210441002105024002400240024020012802000d00200128021422034160712206417f4c0d0202400240200341057622070d00410121050c010b200610282205450d020b2004450d0041002108034020032109200141003a00582008220a41016a2108410021030240024002400240034020092003460d01200141386a20036a200128021022062d00003a00002001200641016a3602102001200341016a22063a00582006210320064120470d000b200141186a41186a220b200141386a41186a290300370300200141186a41106a220c200141386a41106a290300370300200141186a41086a220d200141386a41086a290300370300200120012903383703182007200a470d03200a41017422032008200320084b1b220741ffffff3f712007470d082007410574220341004e0d010c080b200141003602140240200341ff0171450d00200141003a00580b2007450d012005102a0c010b02400240200a0d002003102821050c010b2005200a4105742003102c21050b20050d01200341011037000b410021050c020b200920066b21032005200a4105746a220a2001290318370000200a41186a200b290300370000200a41106a200c290300370000200a41086a200d29030037000020082004470d000b2001200920066b3602140b4101210a2005410120051b21084100210302402004410020051b2206450d0020064105742203410575220241ffffff3f712002470d03200241057422094100480d03024020091028220a0d00200941011037000b200820036a210420064105742109200a2103200821060340200641086a290000210e200641106a290000210f20062900002110200341186a200641186a290000370000200341106a200f370000200341086a200e37000020032010370000200341206a2103200641206a2106200941606a22090d000b200420086b41606a41057641016a21030b02402005450d002007450d002008102a0b20002003360208200020023602042000200a360200200141e0006a24000f0b200641011037000b1036000b1031000bf80303047f027e037f230041306b22022400200241106a41086a220342003703002002420037031041c694c600411b200241106a1008200241086a200329030037030020022002290310370300410021032002410036021020024110200241106a100621040240024002400240024020022802102205417f470d000c010b2002200536022420022004360220200241106a200241206a107720022802102203450d01200229021421062005450d002004102a0b20024100360218200242013703102006420020031b2207422088a72205200241106a10b4012003410820031b210802402005450d002008200541286c6a21092008210503402005200241106a108f01200541206a29030021060240024020022802142204200228021822036b4108490d00200228021021040c010b200341086a220a2003490d0520044101742203200a2003200a4b1b22034100480d050240024020040d002003102821040c010b200228021020042003102c21040b2004450d042002200336021420022004360210200228021821030b2002200341086a360218200420036a20063700002009200541286a2205470d000b0b200235021821062002280210210302402007a7450d002008102a0b200241306a240020064220862003ad840f0b41c4d1c3004133200241286a419cd9c3001038000b200341011037000b1031000b9d0d04047f017e027f017e230041c0016b22022400200241086a41086a220342003703002002420037030841eefbc5004110200241086a1008200241a0016a41086a2003290300370300200220022903083703a0014100210320024100360208200241a0016a4110200241086a10062104024002400240024002400240024002400240024020022802082205417f470d000c010b024020040d000c010b2002200536027c20022004360278200241086a200241f8006a107720022802082203450d01200229020c21062005450d002004102a0b200241086a41086a2205420037030020024200370308419efcc500410f200241086a1008200241a0016a41086a22042005290300370300200220022903083703a001200241f8006a200241a0016a10ef0220022d00782105200241a0016a41186a220720024191016a290000370300200241a0016a41106a220820024189016a290000370300200420024181016a290000370300200220022900793703a0012006420020031b21062003410820031b21030240024020054101460d00200241d8006a41186a4200370300200241d8006a41106a4200370300200241d8006a41086a4200370300200242003703580c010b200241d8006a41186a2007290300370300200241d8006a41106a2008290300370300200241d8006a41086a2004290300370300200220022903a0013703580b2002412c6a2006370200200241086a41186a42043703002002413c6a200241d8006a41086a290300370200200241c4006a200241e8006a290300370200200241cc006a200241d8006a41186a2903003702002002200336022820024201370318200242c801370310200242b81737030820022002290358370234200241013a0054200241003602800120024201370378410810282203450d012002410836027c2002200228028001220441086a3602800120022003360278200320046a42b8173700002002290310210602400240200228027c220420022802800122036b4108490d00200228027821040c010b200341086a22052003490d08200441017422032005200320054b1b22034100480d080240024020040d002003102821040c010b200228027820042003102c21040b2004450d032002200336027c2002200436027820022802800121030b2002200341086a36028001200420036a20063700002002290318210602400240200228027c220420022802800122036b4108490d00200228027821040c010b200341086a22052003490d08200441017422032005200320054b1b22034100480d080240024020040d002003102821040c010b200228027820042003102c21040b2004450d042002200336027c2002200436027820022802800121030b2002200341086a36028001200420036a20063700002002290320210602400240200228027c220420022802800122036b4108490d00200228027821040c010b200341086a22052003490d08200441017422032005200320054b1b22034100480d080240024020040d002003102821040c010b200228027820042003102c21040b2004450d052002200336027c2002200436027820022802800121030b2002200341086a36028001200420036a200637000020022802282104200241086a41286a2802002203200241f8006a10b40102402003450d002004200341286c6a210803402004200241f8006a108f01200441206a290300210602400240200228027c220520022802800122036b4108490d00200228027821050c010b200341086a22072003490d0a200541017422032007200320074b1b22034100480d0a0240024020050d002003102821050c010b200228027820052003102c21050b2005450d082002200336027c2002200536027820022802800121030b2002200341086a36028001200520036a20063700002008200441286a2204470d000b0b200241346a200241f8006a10f10202400240200228027c2002280280012203460d00200228027821040c010b200341016a22042003490d08200341017422052004200520044b1b22054100480d080240024020030d002005102821040c010b200228027820032005102c21040b2004450d072002200536027c2002200436027820022802800121030b2002200341016a36028001200420036a20022d00543a00002002350280012106200235027821090240200228022c450d002002280228102a0b200241c0016a240020064220862009840f0b41c4d1c3004133200241d8006a419cd9c3001038000b410841011037000b200341011037000b200341011037000b200341011037000b200341011037000b200541011037000b1031000baa0607017f017e077f017e027f017e027f230041c0006b2202240042002103200241086a2204420037030020024200370300419695c400411720021008200241206a41086a20042903003703002002200229030037032020024100360200200241206a411020021006210502400240024002400240024020022802002204417f460d0020022004360234200220053602302002200241306a107c20022802002206450d02200229020421032004450d012005102a0c010b410121060b41002107024002402003422088a7220441057422080d00410421094100210a0c010b2008410575220aad420c7e220b422088a70d04200ba722054100480d04200510282209450d020b2003a7210c02402004450d00200841606a210d20092105200621040340200441086a2900002103200441106a290000210b2004290000210e200241186a200441186a290000370300200241106a200b370300200241086a20033703002002200e370300200241206a2002108b04200541086a200241206a41086a280200360200200520022903203702002005410c6a2105200441206a2104200841606a22080d000b200d41057641016a21070b0240200c450d002006102a0b20024100360208200242013703002007200210b4010240024020070d002002280208210d200228020021060c010b20092007410c6c6a210f2009210503402005280200210c200541086a2802002204200210b4010240024020022802042206200228020822086b2004490d00200228020021060c010b200820046a220d2008490d0620064101742210200d2010200d4b1b220d4100480d060240024020060d00200d102821060c010b20022802002006200d102c21060b2006450d052002200d360204200220063602000b2002200820046a220d360208200620086a200c2004109a051a2005410c6a2205200f470d000b2007410c6c21052009210403400240200441046a280200450d002004280200102a0b2004410c6a2104200541746a22050d000b0b0240200a450d002009102a0b200241c0006a2400200dad4220862006ad840f0b41c4d1c3004133200241386a419cd9c3001038000b200541041037000b200d41011037000b1031000baf1905047f017e057f037e3c7f230041d0016b22022400024002402001450d00200220003602100c010b200241013602100b20022001360214200241086a200241106a106c024002400240024002400240024002400240024002400240024020022802080d0020022802142201200228020c2200490d002000417f4c0d010240024020000d00410121030c010b2000102e2203450d032003200228021022042000109a051a2002200120006b3602142002200420006a3602100b2003450d0020024188016a41086a220142003703002002420037038801419695c400411720024188016a1008200241e8006a41086a200129030037030020022002290388013703682002410036028801200241e8006a411020024188016a10062101024002402002280288012204417f460d002001450d002002200436025c2002200136025820024188016a200241d8006a107c2002280288012205450d05200229028c0121062004450d012001102a0c010b41012105420021060b200241d8006a109d044100210702402006422088a72201450d00200520014105746a21082002280258220920022802604105746a210a2005210b0340200b41086a290000210c200b41106a290000210d200b290000210e20024188016a41186a200b41186a29000037030020024188016a41106a200d37030020024188016a41086a200c3703002002200e37038801200b41206a210b20092101024003400240200a20016b41e0004b0d0002402001200a460d00034020024188016a2001460d04200120024188016a4120109c05450d04200a200141206a2201470d000b0b200b2008470d030c040b200120024188016a460d01200120024188016a4120109c05450d01200141206a220420024188016a460d01200420024188016a4120109c05450d01200141c0006a220420024188016a460d01200420024188016a4120109c05450d01200141e0006a220420024188016a460d0120014180016a2101200420024188016a4120109c050d000b0b0b200241e8006a41186a20024188016a41186a290300220c370300200241386a41086a20024188016a41086a290300370300200241386a41106a20024188016a41106a290300370300200241386a41186a200c3703002002200229038801370338410121070b2006a721010240200228025c450d002002280258102a0b02402001450d002005102a0b200241e8006a41186a2201200241386a41186a290300370300200241e8006a41106a2204200241386a41106a290300370300200241e8006a41086a220b200241386a41086a290300370300200220022903383703682007450d0b200241186a41186a2001290300370300200241186a41106a2004290300370300200241186a41086a200b29030037030020022002290368370318200241e9dabdf306360268200241c0016a4200370300200241b8016a4200370300200241b0016a4200370300200241a8016a420037030020024188016a41186a420037030020024188016a41106a420037030020024188016a41086a4200370300200242003703880102400240200241e8006a200241186a2003200020024188016a101e450d00410021010c010b4101210120022d00c701210f20022d00c601211020022d00c501211120022d00c401211220022d00c301211320022d00c201211420022d00c101211520022d00c001211620022d00bf01211720022d00be01211820022d00bd01211920022d00bc01211a20022d00bb01211b20022d00ba01211c20022d00b901211d20022d00b801211e20022d00b701211f20022d00b601212020022d00b501212120022d00b401212220022d00b301212320022d00b201212420022d00b101212520022d00b001212620022d00af01212720022d00ae01212820022d00ad01212920022d00ac01212a20022d00ab01212b20022d00aa01212c20022d00a901212d20022d00a801212e20022d00a701212f20022d00a601213020022d00a501213120022d00a401213220022d00a301213320022d00a201213420022d00a101213520022d00a001213620022d009f01213720022d009e01213820022d009d01213920022d009c01213a20022d009b01213b20022d009a01213c20022d009901213d20022d009801213e20022d009701213f20022d009601214020022d009501214120022d009401214220022d009301214320022d009201214420022d009101214520022d009001214620022d008f01214720022d008e01214820022d008d01214920022d008c01214a20022d008b01210820022d008a01210920022d008901210720022d00880121050b20024188016a41186a2204200241186a41186a29030037030020024188016a41106a220b200241186a41106a29030037030020024188016a41086a220a200241186a41086a29030037030020022002290318370388012001450d0b200241e8006a41186a20042903002206370300200241e8006a41106a200b290300220c370300200241e8006a41086a200a290300220d3703002002200229038801220e37036820042006370300200b200c370300200a200d3703002002200e37038801410110282201450d04200120053a0000200141014102102c2201450d05200120073a0001200141024104102c2201450d06200120083a0003200120093a0002200141044108102c2201450d07200120473a0007200120483a0006200120493a00052001204a3a0004200141084110102c2201450d082001203f3a000f200120403a000e200120413a000d200120423a000c200120433a000b200120443a000a200120453a0009200120463a0008200141104120102c2201450d092001202f3a001f200120303a001e200120313a001d200120323a001c200120333a001b200120343a001a200120353a0019200120363a0018200120373a0017200120383a0016200120393a00152001203a3a00142001203b3a00132001203c3a00122001203d3a00112001203e3a00102001412041c000102c2201450d0a2001200f3a003f200120103a003e200120113a003d200120123a003c200120133a003b200120143a003a200120153a0039200120163a0038200120173a0037200120183a0036200120193a00352001201a3a00342001201b3a00332001201c3a00322001201d3a00312001201e3a00302001201f3a002f200120203a002e200120213a002d200120223a002c200120233a002b200120243a002a200120253a0029200120263a0028200120273a0027200120283a0026200120293a00252001202a3a00242001202b3a00232001202c3a00222001202d3a00212001202e3a0020200241386a20024188016a108b042002280240210b200228023c2109200228023821050c0c0b200241f4006a41043602002002419c016a41023602002002420237028c01200241bca7c400360288012002410436026c200241e0a9c4003602682002410036023c200241b8aec6003602382002200241e8006a360298012002200241386a36027020024188016a41cca7c400103e000b1036000b200041011037000b41c4d1c3004133200241c8016a419cd9c3001038000b410141011037000b410241011037000b410441011037000b410841011037000b411041011037000b412041011037000b41c00041011037000b410021010b0240024002400240410110282204450d00200242818080801037028c0120022004360288010240024020010d00200441003a000042808080801021060c010b200441013a000041c00020024188016a10b40102400240200228028c01220720022802900122046b41c000490d00200441c0006a210a20022802880121070c010b200441c0006a220a2004490d0520074101742208200a2008200a4b1b22084100480d050240024020070d002008102821070c010b20022802880120072008102c21070b2007450d032002200836028c0120022007360288010b200720046a220441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a290000370000200441206a200141206a290000370000200441286a200141286a290000370000200441306a200141306a290000370000200441386a200141386a2900003700002002200a3602900120042001290000370000200b20024188016a10b40102400240200228028c012204200228029001220a6b200b490d0020022802880121040c010b200a200b6a2207200a490d05200441017422082007200820074b1b22074100480d050240024020040d002007102821040c010b20022802880120042007102c21040b2004450d042002200736028c0120022004360288010b2002200a200b6a2207360290012004200a6a2005200b109a051a2001102a2007ad42208621062009450d002005102a0b02402000450d002003102a0b200241d0016a240020062004ad840f0b410141011037000b200841011037000b200741011037000b1031000baf0e04077f027e047f077e23004190026b22022400024002402001450d00200220003602200c010b200241013602200b20022001360224200241186a200241206a106c024002400240024020022802180d0020022802242201200228021c2203490d000240024002402003417f4c0d000240024020030d00410121040c010b2003102e2204450d022004200228022022002003109a051a2002200120036b3602242002200020036a3602200b2004450d03200241106a200241206a106c20022802100d052002280224220120022802142200490d052000417f4c0d000240024020000d00410121050c010b2000102e2205450d032005200228022022062000109a051a2002200120006b3602242002200620006a3602200b2005450d05200241086a200241206a106c024020022802080d0020022802242206200228020c2201490d002001417f4c0d010240024020010d00410121070c010b2001102e2207450d062007200228022022082001109a051a2002200620016b3602242002200820016a3602200b2007450d002001ad2209422086200984210941002101200241003a00c8012000ad220a422086200a84220a422088a72108200521000240024002400240034020082001460d0120024188016a20016a20002d00003a00002002200141016a22063a00c801200041016a210020062101200641c000470d000b200241d0016a41386a220120024188016a41386a290300370300200241d0016a41306a220020024188016a41306a290300370300200241d0016a41286a220820024188016a41286a290300370300200241d0016a41206a220b20024188016a41206a290300370300200241d0016a41186a220c20024188016a41186a290300370300200241d0016a41106a220d20024188016a41106a290300370300200241d0016a41086a220e20024188016a41086a29030037030020022002290388013703d001200641ff017141c000490d02200241c8006a41386a22062001290300370300200241c8006a41306a2000290300220f370300200241c8006a41286a20082903002210370300200241c8006a41206a200b2903002211370300200241c8006a41186a200c2903002212370300200241c8006a41106a200d2903002213370300200241c8006a41086a200e2903002214370300200220022903d00122153703482000200f37030020082010370300200b2011370300200c2012370300200d2013370300200e201437030020012006290300370300200220153703d00141002101200241003a00a8012009422088a7210820072100034020082001460d0220024188016a20016a20002d00003a00002002200141016a22063a00a801200041016a21002006210120064120470d000b200241286a41186a220120024188016a41186a2200290300370300200241286a41106a220620024188016a41106a2208290300370300200241286a41086a220b20024188016a41086a220c290300370300200220022903880137032820024188016a41386a200241d0016a41386a29030037030020024188016a41306a200241d0016a41306a29030037030020024188016a41286a200241d0016a41286a29030037030020024188016a41206a200241d0016a41206a2903003703002000200241d0016a41186a2903003703002008200241d0016a41106a290300370300200c200241d0016a41086a290300370300200220022903d00137038801200241c8006a41186a2001290300370300200241c8006a41106a2006290300370300200241c8006a41086a200b290300370300200220022903283703482004200320024188016a200241c8006a100a4521000c030b200141ff0171450d01200241003a00c8010c010b200141ff0171450d00200241003a00a8010b410021000b410110282201450d07200120003a000002402009a7450d002007102a0b0240200aa7450d002005102a0b02402003450d002004102a0b20024190026a24002001ad428080808010840f0b200241dc016a41043602002002419c016a41023602002002420237028c01200241bca7c40036028801200241043602d401200241eca9c4003602d0012002410036024c200241b8aec6003602482002200241d0016a360298012002200241c8006a3602d80120024188016a41cca7c400103e000b1036000b200341011037000b200041011037000b200241dc016a41043602002002419c016a41023602002002420237028c01200241bca7c40036028801200241043602d401200241eca9c4003602d0012002410036024c200241b8aec6003602482002200241d0016a360298012002200241c8006a3602d80120024188016a41cca7c400103e000b200141011037000b200241dc016a41043602002002419c016a41023602002002420237028c01200241bca7c40036028801200241043602d401200241eca9c4003602d0012002410036024c200241b8aec6003602482002200241d0016a360298012002200241c8006a3602d80120024188016a41cca7c400103e000b410141011037000be30503037f047e017f230041a0016b2202240041002103200241003a00482000410120011b2104024002400240024002400240034020012003460d01200241286a20036a200420036a2d00003a00002002200341016a22003a00482000210320004120470d000b200241086a41186a200241286a41186a22002903002205370300200241086a41106a200241286a41106a22012903002206370300200241086a41086a200241286a41086a22042903002207370300200220022903282208370308200241d0006a41186a2005370300200241d0006a41106a2006370300200241d0006a41086a200737030020022008370350411310282203450d03200341002900cef0423700002003410f6a41002800ddf042360000200341086a41002900d6f04237000020024293808080b002370294012002200336029001200241d0006a20024190016a108f01200228029801210320022802900121092000420037030020014200370300200442003703002002420037032820092003200241286a1000200241f0006a41186a2000290300370300200241f0006a41106a2001290300370300200241f0006a41086a2004290300370300200220022903283703700240200228029401450d00200228029001102a0b20024100360228200241f0006a4120200241286a1006210320022802282200417f470d01410021000c020b0240200341ff0171450d00200241003a00480b2002413c6a4102360200200241fc006a41043602002002420237022c200241bca7c40036022820024104360274200241fca9c40036027020024100360254200241b8aec6003602502002200241f0006a3602382002200241d0006a360278200241286a41cca7c400103e000b024020030d00410021000c010b20004104490d02200328000021002003102a0b410410282203450d0220032000360000200241a0016a24002003ad4280808080c000840f0b411341011037000b41c4d1c3004133200241286a419cd9c3001038000b410441011037000b880f03057f037e017f230041c0016b22022400024020010d00410121000b200220003602082002200136020c41002103200241003a00702001417f6a21040340024020012003470d000240200341ff0171450d00200241003a00700b200241e4006a41023602002002419c016a410436020020024202370254200241bca7c400360250200241043602940120024194aac4003602900120024100360234200241b8aec600360230200220024190016a3602602002200241306a36029801200241d0006a41cca7c400103e000b200241d0006a20036a200020036a22052d00003a00002002200541016a3602082002200341016a22053a00702002200436020c2004417f6a21042005210320054120470d000b200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a2903003703002002200229035037031041002103200241003a0070200120056b2106200020056a2100417f21010340024020062003470d000240200341ff0171450d00200241003a00700b200241e4006a41023602002002419c016a410436020020024202370254200241bca7c400360250200241043602940120024194aac4003602900120024100360234200241b8aec600360230200220024190016a3602602002200241306a36029801200241d0006a41cca7c400103e000b200241d0006a20036a200020036a22052d00003a00002002200420036b36020c2002200541016a3602082002200341016a22053a00702001417f6a21012005210320054120470d000b200241306a41086a200241d0006a41086a290300370300200241306a41106a200241d0006a41106a290300370300200241306a41186a200241d0006a41186a290300370300200220022903503703300240024002400240024002400240024002400240024002400240200420056b220441016a4110490d002002200020056a220341106a3602082002200441716a220536020c20054108490d0220032900002107200341086a29000021082002200441696a36020c2002200341186a360208200341106a29000021092002200241086a106c20022802000d0c200228020c2205200228020422034f0d010c0c0b2002419c016a4104360200200241e4006a410236020020024202370254200241bca7c400360250200241043602940120024194aac400360290012002410036027c200241b8aec600360278200220024190016a3602602002200241f8006a36029801200241d0006a41cca7c400103e000b2003417f4c0d0302400240024020030d00410121044101450d0d0c010b2003102e2204450d012004200228020822012003109a0521002002200520036b36020c2002200120036a3602082000450d0c0b20024190016a41186a200241106a41186a29030037030020024190016a41106a200241106a41106a29030037030020024190016a41086a200241106a41086a2903003703002002200229031037039001200241d0006a41186a200241306a41186a290300370300200241d0006a41106a200241306a41106a290300370300200241d0006a41086a200241306a41086a29030037030020022002290330370350200220033602b801200220033602b401200220043602b001200241f8006a20024190016a200241d0006a200720082009200241b0016a10f50320022802784101460d0220024184016a2802002104200241f8006a41086a2802002100200228027c210520022d00880121010c030b200341011037000b2002419c016a4104360200200241e4006a410236020020024202370254200241bca7c400360250200241043602940120024194aac400360290012002410036027c200241b8aec600360278200220024190016a3602602002200241f8006a36029801200241d0006a41cca7c400103e000b0240200228028801450d0020024184016a280200102a0b410021050b200241003602582002420137035041011028210302402005450d002003450d02200242818080801037025420022003360250200341003a0000200341014102102c2203450d03200242828080802037025420022003360250200320013a00012004200241d0006a10b401024020022802542203200228025822016b2004490d00200228025021030c070b0240200120046a22062001490d002003410174220a2006200a20064b1b22064100480d000240024020030d002006102821030c010b200228025020032006102c21030b2003450d0520022006360254200220033602500c070b1031000b2003450d04200242818080801037025420022003360250200341013a000042808080801021070c060b1036000b410141011037000b410241011037000b200641011037000b410141011037000b2002200120046a2206360258200320016a20052004109a051a2006ad42208621072005450d002000450d002005102a0b200241c0016a240020072003ad840f0b2002419c016a4104360200200241e4006a410236020020024202370254200241bca7c400360250200241043602940120024194aac400360290012002410036027c200241b8aec600360278200220024190016a3602602002200241f8006a36029801200241d0006a41cca7c400103e000bc00c03047f017e067f23004180026b220224000240024020010d002002200136020c200241013602080c010b20022001417f6a36020c410121032002200041016a36020820002d0000220141014b0d0041002104410021000240024002400240024002400240024020010e020100010b2002200241086a106c20022802000d07200228020c220120022802042200490d072000417f4c0d010240024020000d00410121040c010b2000102e2204450d032004200228020822052000109a051a2002200120006b36020c2002200520006a3602080b2004450d07200241106a20042000ad22064220862006842206422088a7105420022802104101460d03200241186a280200210520022802142100410021030b2002200536021420022000360210200241e7e485f3063602b001200241d0016a41186a22074200370300200241d0016a41106a22084200370300200241d0016a41086a22094200370300200242003703d00141002101200241106a410020001b210a0240024020000d004100210b0c010b200a41046a280200210c200a280200210b0b200241b0016a200b4101200b1b200c4100200b1b200241d0016a1021200241f0006a41186a2007290300370300200241f0006a41106a2008290300370300200241f0006a41086a2009290300370300200220022903d0013703702002200536021420022000360210200241e2c289ab063602b001200742003703002008420037030020094200370300200242003703d0010240024020000d000c010b200a41046a280200210b200a28020021010b200241b0016a2001410120011b200b410020011b200241d0016a102220024190016a41186a2207200241d0016a41186a220129030037030020024190016a41106a2208200241d0016a41106a220b29030037030020024190016a41086a2209200241d0016a41086a220a290300370300200220022903d00137039001200220053602fc01200220003602f801200241e9dabdf3063602f40120014200370300200b4200370300200a4200370300200242003703d0010240024020000d00410021000c010b200241f8016a410020001b220041046a2802002105200028020021000b200241f4016a2000410120001b2005410020001b200241d0016a1022200241b0016a41186a22002001290300370300200241b0016a41106a2201200b290300370300200241b0016a41086a2205200a290300370300200241106a41086a200241f0006a41086a290300370300200241106a41106a200241f0006a41106a290300370300200241106a41186a200241f0006a41186a290300370300200220022903d0013703b00120022002290370370310200241c8006a2007290300370300200241c0006a2008290300370300200241386a20092903003703002002200229039001370330200241e8006a2000290300370300200241e0006a2001290300370300200241d8006a2005290300370300200220022903b001370350200241003602d801200242013703d001200241106a200241d0016a108f01200241306a200241d0016a108f01200241d0006a200241d0016a108f0120022802d801210020022802d401210a20022802d001210b024020032006a745720d002004102a0b200041046a2201417f4c0d000240024020010d00410121050c010b200110282205450d040b2002410036021820022001360214200220053602102000200241106a10b4010240024020022802142205200228021822016b2000490d00200228021021050c010b200120006a22042001490d06200541017422072004200720044b1b22044100480d060240024020050d002004102821050c010b200228021020052004102c21050b2005450d0520022004360214200220053602100b200520016a200b2000109a051a200120006a21000240200a450d00200b102a0b20024180026a24002000ad4220862005ad840f0b1036000b200041011037000b200220022902143703d001419fdbc0004116200241d0016a41d4c7c0001038000b200141011037000b200441011037000b1031000b200241dc016a4104360200200241246a410236020020024202370214200241bca7c400360210200241043602d4012002419caac4003602d001200241003602b401200241b8aec6003602b0012002200241d0016a3602202002200241b0016a3602d801200241106a41cca7c400103e000b823305087f017e067f037e037f23004180066b220124000240024002400240411210282202450d00200241002900c1ae44370000200241106a41002f00d1ae443b0000200241086a41002900c9ae4437000020014292808080a0023702e404200120023602e0042000200141e0046a108f0120012802e804210220012802e0042100200141a0046a41186a22034200370300200141a0046a41106a22044200370300200141a0046a41086a22054200370300200142003703a00420002002200141a0046a1000200141c8006a41186a2003290300370300200141c8006a41106a2004290300370300200141c8006a41086a2005290300370300200120012903a004370348024020012802e404450d0020012802e004102a0b200141003602e004200141c8006a4120200141e0046a1006210620012802e0042207417f460d022006450d02200120073602e405200120063602e005200141306a200141e0056a109f0120012802300d0120012802e4052202450d0120012002417f6a22033602e405200120012802e005220541016a22043602e00520052d0000220241014b0d01410021080240024020020e020100010b41002102200141003a0080050340024020032002470d00200141003602e405200241ff0171450d04200141003a0080050c040b200141e0046a20026a200520026a220041016a2d00003a00002001200041026a3602e0052001200241016a22003a0080052000210220004120470d000b200141a0046a41086a200141e0046a41086a2903002209370300200141e8016a41186a200141e0046a41186a290300370300200141e8016a41106a200141e0046a41106a290300370300200141e8016a41086a20093703002001200320006b22033602e405200120012903e00422093703a004200120093703e80141012108200520006a41016a21040b20014180046a41186a200141e8016a41186a29030037030020014180046a41106a200141e8016a41106a29030037030020014180046a41086a200141e8016a41086a290300370300200120012903e801370380042003450d0120012003417f6a22033602e4052001200441016a3602e00520042d0000220041014b0d01410021020240024020000e020100010b41002102200141003a0080050340024020032002470d00200141003602e405200241ff0171450d04200141003a0080050c040b200141e0046a20026a200420026a220041016a2d00003a00002001200041026a3602e0052001200241016a22003a0080052000210220004120470d000b200141c0046a41086a200141e0046a41086a2903002209370300200141e8016a41186a200141e0046a41186a290300370300200141e8016a41106a200141e0046a41106a290300370300200141e8016a41086a20093703002001200320006b3602e405200120012903e00422093703c004200120093703e801410121020b200141c0036a41186a2205200141e8016a41186a2200290300370300200141c0036a41106a220a200141e8016a41106a2203290300370300200141c0036a41086a220b200141e8016a41086a2204290300370300200141e0036a41086a220c20014180046a41086a290300370300200141e0036a41106a220d20014180046a41106a290300370300200141e0036a41186a220e20014180046a41186a290300370300200120012903e8013703c00320012001290380043703e003200141a0036a41186a220f200e290300370300200141a0036a41106a220e200d290300370300200141a0036a41086a220d200c290300370300200120012903e0033703a00320014180036a41186a220c200529030037030020014180036a41106a2205200a29030037030020014180036a41086a220a200b290300370300200120012903c00337038003200141e0046a41186a220b200f290300370300200141e0046a41106a220f200e290300370300200141e0046a41086a220e200d290300370300200120012903a0033703e0042000200c290300370300200320052903003703002004200a29030037030020012001290380033703e801200141c0056a41046a2205200141fa026a41046a2f01003b0100200120012801fa023602c00520084102460d01200141d8026a41186a200b290300370300200141d8026a41106a200f290300370300200141d8026a41086a200e290300370300200141b8026a41086a2004290300370300200141b8026a41106a2003290300370300200141b8026a41186a2000290300370300200141b0026a41046a20052f01003b0100200120012903e0043703d802200120012903e8013703b802200120012802c0053602b00202402007450d002006102a0b200141c8006a412010090c030b411241011037000b41c4d1c3004133200141a0046a419cd9c3001038000b410221080b20014188016a41186a2200200141d8026a41186a29030037030020014188016a41106a2203200141d8026a41106a29030037030020014188016a41086a2204200141d8026a41086a290300370300200141e8006a41086a2205200141b8026a41086a290300370300200141e8006a41106a2206200141b8026a41106a290300370300200141e8006a41186a2207200141b8026a41186a290300370300200120012903d80237038801200120012903b802370368200141c8016a41086a220a2004290300370300200141c8016a41106a22042003290300370300200141c8016a41186a2203200029030037030020012001290388013703c801200141a8016a41086a22002005290300370300200141a8016a41106a22052006290300370300200141a8016a41186a22062007290300370300200120012903683703a8010240024020084102460d002001418a026a220720012903a801370100200141f1016a200a290300370000200141f9016a200429030037000020014181026a200329030037000020014192026a20002903003701002001419a026a2005290300370100200141a2026a2006290300370100200120083a00e801200120012903c8013700e901200120023a0089024100210602400240024002400240024002400240200241ff01714101470d00200141e0046a200710ac01200141e0056a41186a200141e0046a41186a22022900002209370300200141e0056a41106a200141e0046a41106a22002900002210370300200141e0056a41086a200141e0046a41086a22032900002211370300200120012900e00422123703e005200220093703002000201037030020032011370300200120123703e004412010282206450d01200620012903e004370000200641186a2002290300370000200641106a2000290300370000200641086a200329030037000020012d00e80121080b0240200841ff01714101460d0020012d0089024101460d03200141c0056a41186a22024200370300200141c0056a41106a22004200370300200141c0056a41086a22034200370300200142003703c00541d3aec400411a200141c0056a1000200141e0046a41186a2002290300370300200141e0046a41106a2000290300370300200141e0046a41086a2003290300370300200120012903c0053703e004200141e0046a412010090c060b200141e0046a200141e8016a41017210ac01200141e0056a41186a200141e0046a41186a22022903002209370300200141e0056a41106a200141e0046a41106a22002903002210370300200141e0056a41086a200141e0046a41086a22032903002211370300200120012903e00422123703e005200220093703002000201037030020032011370300200120123703e004412010282208450d01200820012903e004370000200841186a2002290300370000200841106a2000290300370000200841086a2003290300370000200141003602e00420084120200141e0046a1006210720012802e004220b417f460d032007450d032001200b360284042001200736028004200141186a20014180046a109f012001290318a70d042001280284042202450d04200141286a29030021092001290320211020012002417f6a2203360284042001200128028004220541016a22043602800420052d0000220241014b0d044100210a0240024020020e020100010b41002102200141003a0080050340024020032002470d002001410036028404200241ff0171450d07200141003a0080050c070b200141e0046a20026a200520026a220041016a2d00003a00002001200041026a360280042001200241016a22003a0080052000210220004120470d000b200141e0056a41086a200141e0046a41086a290300370300200141e0056a41106a200141e0046a41106a290300370300200141e0056a41186a200141e0046a41186a290300370300200120012903e0043703e0052001200320006b2203360284044101210a200520006a41016a21040b200141c0056a41186a200141e0056a41186a290300370300200141c0056a41106a200141e0056a41106a290300370300200141c0056a41086a200141e0056a41086a290300370300200120012903e0053703c0052003450d0420012003417f6a2203360284042001200441016a3602800420042d0000220241014b0d040240024020020e020100010b41002102200141003a0080050340024020032002470d002001410036028404200241ff0171450d07200141003a0080050c070b200141e0046a20026a200420026a220041016a2d00003a00002001200041026a360280042001200241016a22003a0080052000210220004120470d000b200141a0046a41086a200141e0046a41086a2903002211370300200141e0056a41186a200141e0046a41186a290300370300200141e0056a41106a200141e0046a41106a290300370300200141e0056a41086a20113703002001200320006b36028404200120012903e00422113703a004200120113703e0050b200141c0036a41186a2202200141e0056a41186a2200290300370300200141c0036a41106a2203200141e0056a41106a2204290300370300200141c0036a41086a2205200141e0056a41086a220c290300370300200141e0036a41086a220d200141c0056a41086a290300370300200141e0036a41106a220e200141c0056a41106a290300370300200141e0036a41186a220f200141c0056a41186a290300370300200120012903e0053703c003200120012903c0053703e003200141a0036a41186a2213200f290300370300200141a0036a41106a220f200e290300370300200141a0036a41086a220e200d290300370300200120012903e0033703a00320014180036a41186a200229030037030020014180036a41106a200329030037030020014180036a41086a2005290300370300200120012903c00337038003200141e0046a41186a22032013290300370300200141e0046a41106a2205200f290300370300200141e0046a41086a220d200e290300370300200120012903a0033703e004200141c0056a41046a220e200141fa026a41046a2f01003b0100200120012801fa023602c005200a4102460d0420014189026a21022000200329030037030020042005290300370300200c200d290300370300200141c0046a41046a200e2f01003b0100200120012903e0043703e005200120012802c0053602c0040240200b450d002007102a0b200141f1046a20012903e005370000200141f9046a200141e0056a41086a29030037000020014181056a200141e0056a41106a29030037000020014189056a200141e0056a41186a290300370000200141b6056a200141c4046a2f01003b0100200120103703e0042001200a3a00f004200120012802c0043601b205200120093703e80420014191056a200229000037000020014199056a200241086a290000370000200141a1056a200241106a290000370000200141a9056a200241186a290000370000200141b1056a200241206a2d00003a0000200141003602e805200142013703e0052001200141e0046a3602c005200141c0056a200141e0056a10a301200141e0046a41106a200141e0056a10a90120012802e40521022008412020012802e005220020012802e805100702402002450d002000102a0b2008102a4101210a0c060b412041011037000b412041011037000b200141c0056a41186a22024200370300200141c0056a41106a22004200370300200141c0056a41086a22034200370300200142003703c00541d3aec400411a200141c0056a1000200141e0046a41186a2002290300370300200141e0046a41106a2000290300370300200141e0046a41086a2003290300370300200120012903c0053703e004200141203602e4052001200141e0046a3602e0052007200141e0056a10ff010c020b41e2bbc00041d8001050000b41c4d1c3004133200141a0046a419cd9c3001038000b410021084100210a0b0240024002400240024020060d00410021020c010b200141003602e00420064120200141e0046a1006210720012802e004220b417f460d012007450d012001200b3602bc05200120073602b8052001200141b8056a109f012001290300a70d0520012802bc052202450d05200141106a29030021092001290308211020012002417f6a22033602bc05200120012802b805220541016a22043602b80520052d0000220241014b0d054100210c0240024020020e020100010b41002102200141003a0080050340024020032002470d00200141003602bc05200241ff0171450d08200141003a0080050c080b200141e0046a20026a200520026a220041016a2d00003a00002001200041026a3602b8052001200241016a22003a0080052000210220004120470d000b20014180046a41106a200141e0046a41106a2903002211370300200141e0056a41086a200141e0046a41086a290300370300200141e0056a41106a2011370300200141e0056a41186a200141e0046a41186a2903003703002001200320006b22033602bc05200120012903e0043703e0054101210c200520006a41016a21040b200141c0056a41186a200141e0056a41186a290300370300200141c0056a41106a200141e0056a41106a290300370300200141c0056a41086a200141e0056a41086a290300370300200120012903e0053703c0052003450d0520012003417f6a22033602bc052001200441016a3602b80520042d0000220241014b0d05410021050240024020020e020100010b41002102200141003a0080050340024020032002470d00200141003602bc05200241ff0171450d08200141003a0080050c080b200141e0046a20026a200420026a220041016a2d00003a00002001200041026a3602b8052001200241016a22003a0080052000210220004120470d000b200141c0046a41086a200141e0046a41086a2903002211370300200141e0056a41186a200141e0046a41186a290300370300200141e0056a41106a200141e0046a41106a290300370300200141e0056a41086a20113703002001200320006b3602bc05200120012903e00422113703c004200120113703e005410121050b200141c0036a41186a2204200141e0056a41186a2202290300370300200141c0036a41106a220d200141e0056a41106a2200290300370300200141c0036a41086a220e200141e0056a41086a2203290300370300200141e0036a41086a220f200141c0056a41086a290300370300200141e0036a41106a2213200141c0056a41106a290300370300200141e0036a41186a2214200141c0056a41186a290300370300200120012903e0053703c003200120012903c0053703e003200141a0036a41186a22152014290300370300200141a0036a41106a22142013290300370300200141a0036a41086a2213200f290300370300200120012903e0033703a00320014180036a41186a220f200429030037030020014180036a41106a2204200d29030037030020014180036a41086a220d200e290300370300200120012903c00337038003200141e0046a41186a220e2015290300370300200141e0046a41106a22152014290300370300200141e0046a41086a22142013290300370300200120012903a0033703e0042002200f290300370300200020042903003703002003200d29030037030020012001290380033703e005200141c0056a41046a2204200141fa026a41046a2f01003b0100200120012801fa023602c005200c4102460d05200141d8026a41186a200e290300370300200141d8026a41106a2015290300370300200141d8026a41086a2014290300370300200141b8026a41086a2003290300370300200141b8026a41106a2000290300370300200141b8026a41186a2002290300370300200141b0026a41046a20042f01003b0100200120012903e0043703d802200120012903e0053703b802200120012802c0053602b0020240200b450d002007102a0b20014191056a20053a000020014192056a20012903b8023701002001419a056a200141b8026a41086a290300370100200141a2056a200141b8026a41106a290300370100200141aa056a200141b8026a41186a290300370100200141b6056a200141b4026a2f01003b0100200120103703e004200120012802b0023601b205200120093703e80420014190056a200141e8016a41206a2d00003a000020014188056a200141e8016a41186a290300370300200141e0046a41206a200141e8016a41106a290300370300200141e0046a41186a200141e8016a41086a290300370300200120012903e8013703f004200141003602e805200142013703e0052001200141e0046a3602c005200141c0056a200141e0056a10a301200141e0046a41106a200141e0056a10a90120012802e40521022006412020012802e005220020012802e805100702402002450d002000102a0b2006102a410121020b200a20084572450d010c020b41e2bbc00041d8001050000b2008102a0b2006452002720d002006102a0b20014180066a24000f0b41c4d1c3004133200141a0046a419cd9c3001038000bde3305097f017e077f037e057f230041a0056b22012400024002400240024002400240411210282202450d0020024100290095ae44370000200241106a41002f00a5ae443b0000200241086a410029009dae4437000020014292808080a00237028c042001200236028804200020014188046a108f0120012802900421022001280288042100200141c8036a41186a22034200370300200141c8036a41106a22044200370300200141c8036a41086a22054200370300200142003703c80320002002200141c8036a1000200141186a2003290300370300200141106a2004290300370300200141086a2005290300370300200120012903c8033703000240200128028c04450d00200128028804102a0b20014100360288042001412020014188046a100621032001280288042204417f460d042003450d04200120043602e404200120033602e00420014180056a200141e0046a106d2001280280052206450d02200128028405210720012802e4042202450d0120012002417f6a22053602e404200120012802e004220841016a22093602e00420082d0000220041014b0d01410021020240024020000e020100010b41002102200141003a00a8040340024020052002470d00200141003602e404200241ff0171450d04200141003a00a8040c040b20014188046a20026a200820026a220041016a2d00003a00002001200041026a3602e0042001200241016a22003a00a8042000210220004120470d000b200141c8036a41086a20014188046a41086a290300220a370300200141a0016a41186a20014188046a41186a290300370300200141a0016a41106a20014188046a41106a290300370300200141a0016a41086a200a3703002001200520006b22053602e4042001200129038804220a3703c8032001200a3703a00141012102200820006a41016a21090b200141a8036a41186a200141a0016a41186a290300370300200141a8036a41106a200141a0016a41106a290300370300200141a8036a41086a200141a0016a41086a290300370300200120012903a0013703a8032005450d0120012005417f6a22083602e4042001200941016a3602e00420092d0000220541014b0d01410021000240024020050e020100010b41002100200141003a00a8040340024020082000470d00200141003602e404200041ff0171450d04200141003a00a8040c040b20014188046a20006a200920006a220541016a2d00003a00002001200541026a3602e0042001200041016a22053a00a8042005210020054120470d000b200141e8036a41086a20014188046a41086a290300220a370300200141a0016a41186a20014188046a41186a290300370300200141a0016a41106a20014188046a41106a290300370300200141a0016a41086a200a3703002001200820056b3602e4042001200129038804220a3703e8032001200a3703a001410121000b200141e8026a41186a2205200141a0016a41186a2208290300370300200141e8026a41106a2209200141a0016a41106a220b290300370300200141e8026a41086a220c200141a0016a41086a220d29030037030020014188036a41086a220e200141a8036a41086a29030037030020014188036a41106a220f200141a8036a41106a29030037030020014188036a41186a2210200141a8036a41186a290300370300200120012903a0013703e802200120012903a80337038803200141c8026a41186a22112010290300370300200141c8026a41106a2210200f290300370300200141c8026a41086a220f200e29030037030020012001290388033703c802200141a8026a41186a220e2005290300370300200141a8026a41106a22052009290300370300200141a8026a41086a2209200c290300370300200120012903e8023703a80220014188046a41186a201129030037030020014188046a41106a201029030037030020014188046a41086a200f290300370300200120012903c802370388042008200e290300370300200b2005290300370300200d2009290300370300200120012903a8023703a0010c030b411241011037000b2007450d002006102a0b410221020b024020024102460d0020014188026a41186a20014188046a41186a29030037030020014188026a41106a20014188046a41106a29030037030020014188026a41086a20014188046a41086a290300370300200141e8016a41086a200141a0016a41086a290300370300200141e8016a41106a200141a0016a41106a290300370300200141e8016a41186a200141a0016a41186a290300370300200120012903880437038802200120012903a0013703e801200120012f0180053b01e60102402004450d002003102a0b2001412010090c020b41c4d1c3004133200141a8036a419cd9c3001038000b410221020b200141c0006a41186a220320014188026a41186a290300370300200141c0006a41106a220420014188026a41106a290300370300200141c0006a41086a220520014188026a41086a290300370300200141206a41086a2208200141e8016a41086a290300370300200141206a41106a2209200141e8016a41106a290300370300200141206a41186a220b200141e8016a41186a2903003703002001200129038802370340200120012903e80137032020014180016a41086a220c200529030037030020014180016a41106a2205200429030037030020014180016a41186a220420032903003703002001200129034037038001200141e0006a41086a22032008290300370300200141e0006a41106a22082009290300370300200141e0006a41186a2209200b29030037030020012001290320370360024020024102460d00200141c2016a220b2001290360370100200141a9016a200c290300370000200141b1016a2005290300370000200141b9016a2004290300370000200141ca016a2003290300370100200141d2016a2008290300370100200141da016a2009290300370100200120023a00a00120012001290380013700a101200120003a00c101410021030240024002400240024002400240024002400240200041ff01714101470d0020014188046a200b10ae0120014180056a41186a20014188046a41186a2202290000220a37030020014180056a41106a20014188046a41106a2200290000221237030020014180056a41086a20014188046a41086a2204290000221337030020012001290088042214370380052002200a37030020002012370300200420133703002001201437038804412010282203450d012003200129038804370000200341186a2002290300370000200341106a2000290300370000200341086a200429030037000020012d00a00121020b0240200241ff01714101460d0020012d00c1014101460d03200141e0046a41186a22024200370300200141e0046a41106a22004200370300200141e0046a41086a22044200370300200142003703e00441a7aec400411a200141e0046a100020014188046a41186a200229030037030020014188046a41106a200029030037030020014188046a41086a2004290300370300200120012903e0043703880420014188046a412010090c080b20014188046a200141a0016a41017210ae0120014180056a41186a20014188046a41186a2202290300220a37030020014180056a41106a20014188046a41106a2200290300221237030020014180056a41086a20014188046a41086a2205290300221337030020012001290388042214370380052002200a37030020002012370300200520133703002001201437038804412010282204450d012004200129038804370000200441186a2002290300370000200441106a2000290300370000200441086a200529030037000020014100360288042004412020014188046a10062109200128028804220d417f460d032009450d032001200d3602cc03200120093602c803200141e8036a200141c8036a106d20012802e8032202450d0520012802ec03210c20012802cc032200450d04200141f0036a280200210820012000417f6a220e3602cc03200120012802c803220f41016a22103602c803200f2d0000220041014b0d044100210b0240024020000e020100010b41002100200141003a00a80403400240200e2000470d00200141003602cc03200041ff0171450d07200141003a00a8040c070b20014188046a20006a200f20006a220541016a2d00003a00002001200541026a3602c8032001200041016a22053a00a8042005210020054120470d000b20014180056a41086a20014188046a41086a29030037030020014180056a41106a20014188046a41106a29030037030020014180056a41186a20014188046a41186a2903003703002001200129038804370380052001200e20056b220e3602cc034101210b200f20056a41016a21100b200141e0046a41186a20014180056a41186a290300370300200141e0046a41106a20014180056a41106a290300370300200141e0046a41086a20014180056a41086a29030037030020012001290380053703e004200e450d042001200e417f6a220e3602cc032001201041016a3602c80320102d0000220041014b0d040240024020000e020100010b41002100200141003a00a80403400240200e2000470d00200141003602cc03200041ff0171450d07200141003a00a8040c070b20014188046a20006a201020006a220541016a2d00003a00002001200541026a3602c8032001200041016a22053a00a8042005210020054120470d000b200141a8036a41106a20014188046a41106a290300220a37030020014180056a41086a20014188046a41086a29030037030020014180056a41106a200a37030020014180056a41186a20014188046a41186a2903003703002001200e20056b3602cc032001200129038804370380050b200141e8026a41186a220020014180056a41186a290300370300200141e8026a41106a220520014180056a41106a290300370300200141e8026a41086a220e20014180056a41086a29030037030020014188036a41086a220f200141e0046a41086a29030037030020014188036a41106a2210200141e0046a41106a29030037030020014188036a41186a2211200141e0046a41186a29030037030020012001290380053703e802200120012903e00437038803200141c8026a41186a22152011290300370300200141c8026a41106a22112010290300370300200141c8026a41086a2210200f29030037030020012001290388033703c802200141a8026a41186a2000290300370300200141a8026a41106a2005290300370300200141a8026a41086a200e290300370300200120012903e8023703a80220014188046a41186a201529030037030020014188046a41106a201129030037030020014188046a41086a2010290300370300200120012903c802370388040c060b412041011037000b412041011037000b200141e0046a41186a22024200370300200141e0046a41106a22004200370300200141e0046a41086a22044200370300200142003703e00441a7aec400411a200141e0046a100020014188046a41186a200229030037030020014188046a41106a200029030037030020014188046a41086a2004290300370300200120012903e004370388042001412036028405200120014188046a36028005200b20014180056a10ff010c040b41e2bbc00041d8001050000b200c450d002002102a0b4102210b0b0240200b4102460d00200141c1016a210020014180056a41186a220520014188046a41186a29030037030020014180056a41106a220e20014188046a41106a29030037030020014180056a41086a220f20014188046a41086a290300370300200120012903880437038005200120012f01e0043b01e8030240200d450d002009102a0b20014195046a2001290380053700002001419d046a200f290300370000200141a5046a200e290300370000200141ad046a20052903003700002001200b3a00940420012008360290042001200c36028c042001200236028804200120012f01e8033b01d604200141b5046a2000290000370000200141bd046a200041086a290000370000200141c5046a200041106a290000370000200141cd046a200041186a290000370000200141d5046a200041206a2d00003a000020014100360288052001420137038005200820014180056a10b40120014194046a210502402008450d00200841057421000340200220014180056a108f01200241206a2102200041606a22000d000b0b200520014180056a10a9012001280284052102200441202001280280052200200128028805100702402002450d002000102a0b0240200128028c04450d00200128028804102a0b2004102a410121090c020b41c4d1c3004133200141a8036a419cd9c3001038000b41002104410021090b0240024002400240024020030d00410021020c010b20014100360288042003412020014188046a100621080240024002400240200128028804220b417f460d002008450d002001200b3602dc04200120083602d804200141a8036a200141d8046a106d4200211220012802a8032202450d0220012802ac03211020012802dc042200450d01200141b0036a350200210a20012000417f6a220c3602dc04200120012802d804220d41016a220f3602d804200d2d0000220041014b0d014100210e0240024020000e020100010b41002100200141003a00a80403400240200c2000470d00200141003602dc04200041ff0171450d04200141003a00a8040c040b20014188046a20006a200d20006a220541016a2d00003a00002001200541026a3602d8042001200041016a22053a00a8042005210020054120470d000b200141c8036a41086a20014188046a41086a290300221337030020014180056a41186a20014188046a41186a29030037030020014180056a41106a20014188046a41106a29030037030020014180056a41086a20133703002001200c20056b220c3602dc04200120012903880422133703c80320012013370380054101210e200d20056a41016a210f0b200141e0046a41186a20014180056a41186a290300370300200141e0046a41106a20014180056a41106a290300370300200141e0046a41086a20014180056a41086a29030037030020012001290380053703e004200c450d012001200c417f6a220c3602dc042001200f41016a3602d804200f2d0000220541014b0d01410021000240024020050e020100010b41002100200141003a00a80403400240200c2000470d00200141003602dc04200041ff0171450d04200141003a00a8040c040b20014188046a20006a200f20006a220541016a2d00003a00002001200541026a3602d8042001200041016a22053a00a8042005210020054120470d000b200141e8036a41086a20014188046a41086a290300221237030020014180056a41186a20014188046a41186a29030037030020014180056a41106a20014188046a41106a29030037030020014180056a41086a20123703002001200c20056b3602dc04200120012903880422123703e8032001201237038005410121000b200141e8026a41186a220520014180056a41186a220c290300370300200141e8026a41106a220d20014180056a41106a220f290300370300200141e8026a41086a221120014180056a41086a221529030037030020014188036a41086a2216200141e0046a41086a29030037030020014188036a41106a2217200141e0046a41106a29030037030020014188036a41186a2218200141e0046a41186a29030037030020012001290380053703e802200120012903e00437038803200141c8026a41186a22192018290300370300200141c8026a41106a22182017290300370300200141c8026a41086a2217201629030037030020012001290388033703c802200141a8026a41186a22162005290300370300200141a8026a41106a2205200d290300370300200141a8026a41086a220d2011290300370300200120012903e8023703a80220014188046a41186a201929030037030020014188046a41106a201829030037030020014188046a41086a2017290300370300200120012903c80237038804200c2016290300370300200f20052903003703002015200d290300370300200120012903a80237038005200a422086210a2010ad21120c030b41e2bbc00041d8001050000b2010450d002002102a0b4102210e4200210a0b200e4102460d0120014188026a41186a20014188046a41186a29030037030020014188026a41106a20014188046a41106a29030037030020014188026a41086a20014188046a41086a290300370300200141e8016a41086a220520014180056a41086a290300370300200141e8016a41106a220c20014180056a41106a290300370300200141e8016a41186a220d20014180056a41186a29030037030020012001290388043703880220012001290380053703e801200120012f01e0043b01e601200a20128421120240200b450d002008102a0b200141b5046a20003a0000200141b6046a20012903e801370100200141be046a2005290300370100200141c6046a200c290300370100200141ce046a200d2903003701002001419c046a200141a0016a41086a290300370200200141a4046a200141a0016a41106a290300370200200141ac046a200141a0016a41186a290300370200200141b4046a200141a0016a41206a2d00003a00002001201237028c042001200236028804200120012f01e6013b01d604200120012903a0013702940420014100360288052001420137038005200a422088a7220020014180056a10b40120014194046a210502402000450d00200041057421000340200220014180056a108f01200241206a2102200041606a22000d000b0b200520014180056a10a9012001280284052102200341202001280280052200200128028805100702402002450d002000102a0b0240200128028c04450d00200128028804102a0b2003102a410121020b200920044572450d010c020b41c4d1c3004133200141a8036a419cd9c3001038000b2004102a0b02402003452002720d002003102a0b2006450d002007450d002006102a0b200141a0056a24000b13002000410d360204200041bcafc4003602000b3400200041d9dbc40036020420004100360200200041146a4113360200200041106a41e0dbc400360200200041086a42073702000b09002000410010e6020b6c01027f230041106b22022400200241003602082002420137030002404104102822030d00410441011037000b2003410036000020024284808080c000370204200220033602004100200210b401200041086a200228020836020020002002290300370200200241106a24000b3001017f02404108102822020d00410841011037000b20004288808080800137020420002002360200200242003700000b8e0201037f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10a3012002200336023c2002413c6a200241306a10a3012002280220210320042802002204200241306a10b40102402004450d00200441306c21040340200341106a200241306a108f012002200336023c200341306a21032002413c6a200241306a10a301200441506a22040d000b0b20002002290330370200200041086a200241306a41086a28020036020002402002280224450d002002280220102a0b200241c0006a24000b7001027f230041306b2202240020024200370310200242003703082002200241086a36021c02404101102822030d00410141011037000b20024201370224200220033602202002411c6a200241206a10a301200041086a200228022836020020002002290320370200200241306a24000b3001017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241043600000b9c0402057f027e230041d0016b220224002002200110b1040240024020022d00004101470d00200241286a41186a200241196a290000370300200241286a41106a200241116a290000370300200241286a41086a200241096a2900003703002002200229000137032802400240410e10282201450d002001410029008aaf44370000200141066a4100290090af443700002002428e808080e00137026c20022001360268200241286a200241e8006a108f012002280270210120022802682103200241f8006a41186a22044200370300200241f8006a41106a22054200370300200241f8006a41086a220642003703002002420037037820032001200241f8006a1000200241c8006a41186a2004290300370300200241c8006a41106a2005290300370300200241c8006a41086a2006290300370300200220022903783703480240200228026c450d002002280268102a0b20024100360278200241c8006a4120200241f8006a100621040240024020022802782203417f470d00410021010c010b2002200336026c20022004360268200241f8006a200241e8006a108a022002280298012201450d0220024190016a29030021072002290388012108200228029c0121052003450d002004102a0b2001450d022005450d032001102a0c030b410e41011037000b41c4d1c3004133200241c8016a419cd9c3001038000b42002108420021070b2000200837030020002007370308200241d0016a24000bb70301057f230041f0006b220224000240410e10282203450d00200341002900fcae44370000200341066a4100290082af443700002002428e808080e001370254200220033602502001200241d0006a108f012002280258210320022802502101200241086a41186a22044200370300200241086a41106a22054200370300200241086a41086a220642003703002002420037030820012003200241086a1000200241306a41186a2004290300370300200241306a41106a2005290300370300200241306a41086a20062903003703002002200229030837033002402002280254450d002002280250102a0b200241086a200241306a412010fd01200241d0006a41086a200241086a41096a290000370300200241d0006a41106a200241086a41116a290000370300200241d0006a41186a200241086a41196a290000370300200220022900093703500240024020022d00084101460d00200041003a00000c010b200041013a000020002002290350370001200041096a200241d8006a290300370000200041116a200241e0006a290300370000200041196a200241e8006a2903003700000b200241f0006a24000f0b410e41011037000b13002000410236020420004184fcc4003602000b3101017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241a0053600000bdf14030d7f077e0b7f23004180046b22042400024002400240024002400240410d10282205450d0020054100290098af44370000200541056a410029009daf443700002004428d808080d0013702ec02200420053602e8022001200441e8026a108f0120042802f002210520042802e8022106200441a8036a41186a22074200370300200441a8036a41106a22084200370300200441a8036a41086a22094200370300200442003703a80320062005200441a8036a100020044198016a41186a200729030037030020044198016a41106a200829030037030020044198016a41086a2009290300370300200420042903a80337039801024020042802ec02450d0020042802e802102a0b200441003602a80320044198016a4120200441a8036a1006210502400240024020042802a8032206417f460d002005450d002006450d0420052d0000220641034f0d042005102a20060e03000201000b200441f0006a200110b10420042d00704101470d06200441b8016a41186a20044189016a290000370300200441b8016a41106a20044181016a290000370300200441b8016a41086a200441f9006a290000370300200420042900713703b801410e10282205450d042005410029008aaf44370000200541066a4100290090af443700002004428e808080e0013702ec02200420053602e802200441b8016a200441e8026a108f0120042802f002210520042802e8022106200441a8036a41186a22074200370300200441a8036a41106a22084200370300200441a8036a41086a22094200370300200442003703a80320062005200441a8036a100020044198016a41186a200729030037030020044198016a41106a200829030037030020044198016a41086a2009290300370300200420042903a80337039801024020042802ec02450d0020042802e802102a0b200441003602a80320044198016a4120200441a8036a100621070240024020042802a8032206417f470d00410021050c010b200420063602cc02200420073602c802200441a8036a200441c8026a108a0220042802c8032205450d06200441a8026a41186a200441a8036a41186a290300370300200441a8026a41106a200441a8036a41106a290300370300200441a8026a41086a200441a8036a41086a290300370300200441e8026a41086a200441d4036a290200370300200441e8026a41106a200441dc036a290200370300200441e8026a41186a200441e4036a29020037030020044188036a200441ec036a29020037030020044190036a200441f4036a280200360200200420042903a8033703a802200420042902cc033703e8022006450d002007102a0b200441c8026a41086a2209200441a8026a41086a290300370300200441c8026a41106a220a200441a8026a41106a290300370300200441c8026a41186a220b200441a8026a41186a290300370300200441a8036a41086a220c200441e8026a41086a2206290300370300200441a8036a41106a220d200441e8026a41106a2207290300370300200441a8036a41186a220e200441e8026a41186a2208290300370300200441a8036a41206a220f200441e8026a41206a290300370300200441a8036a41286a2210200441e8026a41286a280200360200200420042903a8023703c802200420042903e8023703a80302402005450d0020044188026a41186a200b29030037030020044188026a41106a200a29030037030020044188026a41086a2009290300370300200441d8016a41086a200c290300370300200441d8016a41106a200d290300370300200441d8016a41186a200e290300370300200441d8016a41206a200f290300370300200441d8016a41286a2010280200360200200420042903c80237038802200420042903a8033703d8010b2008200441b8016a41186a2903003703002007200441b8016a41106a2903003703002006200441b8016a41086a290300370300200420042903b8013703e8022005450d06200441306a41206a220c2004290388022211370300200441a8036a41186a2206200441e8026a41186a220d2903002212370300200441a8036a41106a2207200441e8026a41106a220e2903002213370300200441a8036a41086a2208200441e8026a41086a220f2903002214370300200441a8036a41286a20044188026a41086a2903002215370300200441a8036a41306a20044188026a41106a2903002216370300200441a8036a41386a20044188026a41186a2903002217370300200441306a41386a22102017370300200441306a41306a22182016370300200441306a41286a22192015370300200441306a41186a22092012370300200441306a41106a220a2013370300200441306a41086a220b2014370300200420042903e80222123703a803200420113703c80320042012370330200441286a221a200441d8016a41286a280200360200200441206a221b200441d8016a41206a290300370300200441186a221c200441d8016a41186a221d290300370300200441106a221e200441d8016a41106a221f290300370300200441086a2220200441d8016a41086a2221290300370300200420042903d801370300200441e8026a41386a22222010290300370300200441e8026a41306a22102018290300370300200441e8026a41286a22182019290300370300200441e8026a41206a2219200c290300370300200d2009290300370300200e200a290300370300200f200b290300370300200420042903303703e802201d2009290300370300201f200a2903003703002021200b290300370300200420042903303703d801200620222903003703002007201029030037030020082018290300370300200420053602c803200420192903003703a803200441cc036a22052004290300370200200441d4036a2020290300370200200441dc036a201e290300370200200441e4036a201c290300370200200441ec036a201b290300370200200441f4036a201a2802003602002006290300211120072007290300221220027c22133703002006201120037c2013201254ad7c37030020082903002111200420042903a803221220027c22133703a8032008201120037c2013201254ad7c370300200441f0006a20012002200310a50220043502702102200441f0006a41106a2903002111200441f0006a41086a2903002103200441d8016a200441a8036a10b50402402005280200450d0020042802c803102a0b200242018521020c070b200441a8036a200110b10420042d00a8034101470d0520044180036a200441c1036a290000370300200441e8026a41106a200441b9036a290000370300200441e8026a41086a200441b1036a290000370300200420042900a9033703e802200441306a200441e8026a2002200310a50220043502304201852102200441306a41106a2903002111200441306a41086a29030021030c060b200441a8036a20012002200310a50220043502a8034201852102200441b8036a2903002111200441b0036a29030021030c050b410d41011037000b41c4d1c3004133200441f8036a419cd9c3001038000b410e41011037000b41c4d1c3004133200441f8036a419cd9c3001038000b420021020b2000200337030820002002370300200041106a201137030020044180046a24000bc80201057f230041e0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300417f410f10a9020240410e10282203450d002003410029008aaf44370000200341066a4100290090af443700002002428e808080e001370234200220033602302000200241306a108f012002280238210320022802302100200241c0006a41186a22044200370300200241c0006a41106a22054200370300200241c0006a41086a220642003703002002420037034020002003200241c0006a1000200241106a41186a2004290300370300200241106a41106a2005290300370300200241106a41086a20062903003703002002200229034037031002402002280234450d002002280230102a0b200241203602442002200241106a3602402001200241c0006a10b604200241e0006a24000f0b410e41011037000bce0101027f230041106b2202240020024100360208200242013703002000412c6a2002108f012002200036020c2002410c6a200210a3012002200041106a36020c2002410c6a200210a30120002802202103200041286a2802002200200210b40102402000450d002003200041186c6a210003402002200336020c2002410c6a200210a301200341106a200210a0012000200341186a2203470d000b0b2002280204210320012802002001280204200228020022002002280208100702402003450d002000102a0b200241106a24000bf30901047f230041e0026b22052400200541a0016a41086a22064200370300200542003703a00141a990c6004119200541a0016a1008200541086a41086a2006290300370300200520052903a00137030841002106200541003602a001200541086a4110200541a0016a10062107024002400240024020052802a0012208417f460d002007450d0020084104490d01200728000021062007102a0b02402006417f6a220720064d0d00200541133602080c020b200541086a200710ca0320052802084113460d01200541a0016a200541086a419801109a051a20052802a8022107200541a0016a106a200720014d0d01200041828ac50036020420004101360200200041086a41c7003602002002106a0c020b41c4d1c3004133200541a0016a419cd9c3001038000b200541a0016a41086a22074200370300200542003703a00141a990c6004119200541a0016a1008200541086a41086a2007290300370300200520052903a0013703082005200641016a3602a001200541086a4110200541a0016a41041007200541a0016a2002418801109a051a200520033a00b002200520043602ac02200520013602a802024002400240024002400240411a10282207450d00200741186a41002f00ce88453b0000200741106a41002900c68845370000200741086a41002900be8845370000200741002900b688453700002007411a4134102c2207450d012007200636001a200541086a41186a22014200370300200541086a41106a22024200370300200541086a41086a22044200370300200542003703082007411e200541086a1000200541b8026a41186a2001290300370300200541b8026a41106a2002290300370300200541b8026a41086a2004290300370300200520052903083703b8022007102a200541003602102005420137030820052802a8022101410410282207450d022005410436020c20052005280210220241046a36021020052007360208200720026a2001360000200541a0016a200541086a10eb01024020052d00b002220741024b0d00024002400240024020070e03000102000b410021010c020b410121010c010b410221010b200520013a00df0202400240200528020c20052802102207460d00200528020821020c010b200741016a22022007490d07200741017422042002200420024b1b22044100480d070240024020070d002004102821020c010b200528020820072004102c21020b2002450d052005200436020c20052002360208200528021021070b2005200741016a360210200220076a20013a00000b20052802ac02210202400240200528020c2201200528021022076b4104490d00200528020821010c010b200741046a22042007490d06200141017422072004200720044b1b22074100480d060240024020010d002007102821010c010b200528020820012007102c21010b2001450d052005200736020c20052001360208200528021021070b2005200741046a360210200120076a2002360000200528020c2107200541b8026a4120200528020822012005280210100702402007450d002001102a0b200541a0016a106a200541ac016a2006360200200541a9016a20033a0000200541a8016a41033a0000200541053a00a00141014100200541a0016a10cc0120004100360200200020063602040c060b411a41011037000b413441011037000b410441011037000b200441011037000b200741011037000b1031000b200541e0026a24000bfe0201047f230041e0006b2202240002400240411310282203450d002003410f6a41002800e38945360000200341086a41002900dc8945370000200341002900d48945370000200341134126102c2203450d0120032001360013200241c0006a41186a22044200370300200241c0006a41106a22054200370300200241c0006a41086a220142003703002002420037034020034117200241c0006a1000200241186a2004290300370300200241106a2005290300370300200241086a2001290300370300200220022903403703002003102a200241c0006a200210e003200241306a41086a2001290300370300200241206a41086a200241c0006a411c6a2802003602002002200229034037033020022002290254370320024020022802502203450d002000200229033037030020002002290320370214200041086a200241306a41086a2903003703002000411c6a200241206a41086a2802003602000b20002003360210200241e0006a24000f0b411341011037000b412641011037000b130020004111360204200041cc8bc5003602000b3400200041f9aac50036020420004100360200200041146a410f360200200041106a4184abc500360200200041086a42093702000b4f01027f230041106b2202240002404101102822030d00410141011037000b200341003a0000200041086a4101360200200241013602042002200336020020002002290300370200200241106a24000b5b01027f23004190016b22022400200241133602000240410110282203450d00200341003a0000200042818080801037020420002003360200024020022802004113460d002002106a0b20024190016a24000f0b410141011037000bfd0201057f230041c0006b22022400200241206a4200370300200241186a4200370300200241086a41086a4200370300200241003a0028200242003703082002410036023820024201370330200241086a200241306a108f0102400240024020022d0028220341064b0d000240024002400240024002400240024020030e0700010203040506000b410021040c060b410121040c050b410221040c040b410321040c030b410421040c020b410521040c010b410621040b200220043a003f02400240200228023420022802382203460d00200228023021050c010b200341016a22052003490d03200341017422062005200620054b1b22064100480d030240024020030d002006102821050c010b200228023020032006102c21050b2005450d022002200636023420022005360230200228023821030b2002200341016a360238200520036a20043a00000b20002002290330370200200041086a200241306a41086a280200360200200241c0006a24000f0b200641011037000b1031000b4001017f230041106b2202240020024100360208200242013703004100200210b401200041086a200228020836020020002002290300370200200241106a24000b130020004106360204200041acc7c5003602000b3201017f02404104102822020d00410441011037000b20004284808080c00037020420002002360200200241809c313600000b3201017f02404104102822020d00410441011037000b20004284808080c0003702042000200236020020024180a3053600000b3e01017f02404110102822020d00411041011037000b20024200370008200242808084fea6dee111370000200042908080808002370204200020023602000b3201017f02404104102822020d00410441011037000b20004284808080c0003702042000200236020020024180de343600000ba30301047f230041c0006b22022400024002400240411310282203450d002003410f6a41002800e38945360000200341086a41002900dc8945370000200341002900d48945370000200341134126102c2203450d0120032000360013200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034117200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002003102a411010282203450d02200320012903003700002003200141086a2903003700082002429080808080023702242002200336022020012802102104200141186a2802002203200241206a10b40102402003450d00200341057421002004210303402003200241206a108f01200341206a2103200041606a22000d000b0b2002280224210320024120200228022022002002280228100702402003450d002000102a0b0240200141146a280200450d002004102a0b200241c0006a24000f0b411341011037000b412641011037000b411041011037000bc01401077f230041d0016b2204240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240411a10282205450d00200541186a41002f00ce88453b0000200541106a41002900c68845370000200541086a41002900be8845370000200541002900b688453700002005411a4134102c2205450d012005200136001a200441e0006a41186a22064200370300200441e0006a41106a22074200370300200441e0006a41086a22084200370300200442003703602005411e200441e0006a1000200441306a41186a2006290300370300200441306a41106a2007290300370300200441306a41086a2008290300370300200420042903603703302005102a0240200441306a41204101410041001003417f470d0041b7d5c50021000c110b200441146a200041086a2900003702002004411c6a200041106a290000370200200441246a200041186a290000370200200420013602082004200029000037020c411010282205450d02200541002900a68845370000200541086a41002900ae88453700002004429080808080023702b401200420053602b001200541104120102c2205450d03200441203602b401200420042802b801220641046a3602b801200420053602b001200520066a2001360000200441086a410472200441b0016a108f0120042802b801210520042802b0012106200441e0006a41186a22074200370300200441e0006a41106a22084200370300200441e0006a41086a220942003703002004420037036020062005200441e0006a1000200441306a41186a2007290300370300200441306a41106a2008290300370300200441306a41086a200929030037030020042004290360370330024020042802b401450d0020042802b001102a0b200441306a41204101410041001003417f470d0f200441086a41186a200041186a290000370300200441086a41106a200041106a290000370300200441086a41086a200041086a29000037030020042000290000370308411310282205450d042005410f6a41002800a88945360000200541086a41002900a18945370000200541002900998945370000200541134126102c2205450d0520052001360013200441e0006a41186a22064200370300200441e0006a41106a22074200370300200441e0006a41086a220842003703002004420037036020054117200441e0006a1000200441306a41186a2006290300370300200441306a41106a2007290300370300200441306a41086a2008290300370300200420042903603703302005102a20044100360260200441306a4120200441e0006a100621050240024020042802602207417f460d002007210620050d010b20044100360268200442013703604100200441e0006a10b4012004280268210620042802642107200428026021050b200420063602582004200736025420042005360250024002402006450d00200441e0006a20052006410110d60220042802604101470d012004280254450d102004280250102a0c100b4101200441d0006a10b401200441086a200441d0006a108f010c0d0b200428026421080240200441ec006a2802002205200441e8006a2802002206460d002004280258200520066b6a220741206a2209417f4c0d070240024020090d004101210a0c010b20091028220a450d090b20042009360284012004200a360280012004200736028801200420044180016a3602602008200441e0006a200510d70120072005490d0920042802880122082007490d0a200428025822082006490d0b20042802800121092004280250210a2004200720056b2207360290012004200820066b22083602940120072008470d0c200920056a200a20066a2007109a051a200441086a20044180016a108f012004280288012106200428028401210720042802800121052004280254450d0e2004280250102a0c0e0b2004200441d0006a3602602008200441e0006a200610d701200441086a200441d0006a108f010c0c0b411a41011037000b413441011037000b411041011037000b412041011037000b411341011037000b412641011037000b1036000b200941011037000b200520071044000b20072008103c000b200620081044000b200441b0016a41146a4108360200200441bc016a412536020020044198016a41146a41033602002004420337029c01200441c8afc60036029801200441253602b401200420044190016a3602c801200420044194016a3602cc0120044204370370200442013702642004419cb0c6003602602004200441b0016a3602a8012004200441e0006a3602c0012004200441cc016a3602b8012004200441c8016a3602b00120044198016a41d8b0c600103e000b2004280258210620042802542107200428025021050b2005450d00200441306a41202005200610072007450d012005102a0c010b412010282206450d0220062004290308370000200641186a200441086a41186a290300370000200641106a200441086a41106a290300370000200641086a200441086a41086a290300370000411310282207450d03410021052007410f6a41002800a88945360000200741086a41002900a18945370000200741002900998945370000200741134126102c2207450d0420072001360013200441e0006a41186a22084200370300200441e0006a41106a22094200370300200441e0006a41086a220a42003703002004420037036020074117200441e0006a1000200441306a41186a2008290300370300200441306a41106a2009290300370300200441306a41086a200a290300370300200420042903603703302007102a20044100360268200442013703604101200441e0006a10b4010340200620056a200441e0006a108f014120200541206a2205470d000b20042802642105200441306a4120200428026022072004280268100702402005450d002007102a0b2006102a0b200441146a200041086a2900003702002004411c6a200041106a290000370200200441246a200041186a290000370200200420013602082004200029000037020c411010282205450d04200541002900a68845370000200541086a41002900ae88453700002004429080808080023702b401200420053602b001200541104120102c2205450d05200441203602b401200420042802b801220041046a3602b801200420053602b001200520006a2001360000200441086a410472200441b0016a108f0120042802b801210520042802b0012100200441e0006a41186a22064200370300200441e0006a41106a22014200370300200441e0006a41086a220742003703002004420037036020002005200441e0006a1000200441306a41186a2006290300370300200441306a41106a2001290300370300200441306a41086a200729030037030020042004290360370330024020042802b401450d0020042802b001102a0b410110282205450d0641002100200541807f410020021b2003723a0000200441306a41202005410110072005102a0b200441d0016a240020000f0b412041011037000b411341011037000b412641011037000b411041011037000b412041011037000b410141011037000bc76501037f230041206b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00000eac010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab0100010b2002200128021841dfd6c50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000cab010b2002200128021841f0d6c500410b2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000caa010b2002200128021841fbd6c50041032001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca9010b2002200128021841fed6c50041052001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a4184d7c500105d21000ca8010b200220012802184194d7c50041042001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a4184d7c500105d21000ca7010b200220012802184198d7c50041022001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a4184d7c500105d21000ca6010b20022001280218419ad7c50041042001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca5010b20022001280218419ed7c50041032001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca4010b2002200128021841a1d7c50041022001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000ca3010b2002200128021841a3d7c50041042001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000ca2010b2002200128021841a7d7c50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41b0d7c500105d21000ca1010b2002200128021841c0d7c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca0010b2002200128021841c6d7c50041042001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000c9f010b2002200128021841cad7c500410c2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041016a36020c20012002410c6a41d8d7c500105d21000c9e010b2002200128021841e8d7c50041042001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c9d010b2002200128021841ecd7c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c9c010b2002200128021841f2d7c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000c9b010b2002200128021841fad7c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000c9a010b200220012802184182d8c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000c99010b20022001280218418ad8c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000c98010b200220012802184193d8c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000c97010b20022001280218419cd8c50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c96010b2002200128021841a3d8c50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c95010b2002200128021841aad8c50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c94010b2002200128021841b1d8c50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c93010b2002200128021841b8d8c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c92010b2002200128021841c1d8c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c91010b2002200128021841cad8c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c90010b2002200128021841d4d8c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c8f010b2002200128021841ded8c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c8e010b2002200128021841e7d8c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c8d010b2002200128021841f0d8c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c8c010b2002200128021841fad8c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c8b010b200220012802184184d9c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c8a010b20022001280218418ed9c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c89010b200220012802184198d9c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c88010b2002200128021841a0d9c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c87010b2002200128021841a8d9c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c86010b2002200128021841b0d9c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c85010b2002200128021841b8d9c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c84010b2002200128021841c1d9c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c83010b2002200128021841cbd9c50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c82010b2002200128021841d4d9c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c81010b2002200128021841ded9c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21012002200041086a36020c20012002410c6a41a8d6c500105d21000c80010b2002200128021841e8d9c500410d2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41d8d7c500105d21000c7f0b2002200128021841f5d9c500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41d8d7c500105d21000c7e0b2002200128021841ffd9c50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a4188dac500105d21000c7d0b200220012802184198dac50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41a0dac500105d21000c7c0b2002200128021841b0dac50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41a8d6c500105d21000c7b0b2002200128021841b8dac50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41c0dac500105d21000c7a0b2002200128021841d0dac50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c790b2002200128021841d6dac50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c780b2002200128021841dbdac50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c770b2002200128021841e0dac50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c760b2002200128021841e6dac50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c750b2002200128021841ecdac50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c740b2002200128021841f2dac50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c730b2002200128021841f8dac50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c720b2002200128021841fedac50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c710b200220012802184184dbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c700b20022001280218418adbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6f0b200220012802184190dbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6e0b200220012802184196dbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6d0b20022001280218419bdbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6c0b2002200128021841a0dbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6b0b2002200128021841a6dbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6a0b2002200128021841acdbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c690b2002200128021841b2dbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c680b2002200128021841b8dbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c670b2002200128021841bedbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c660b2002200128021841c4dbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c650b2002200128021841cadbc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c640b2002200128021841d0dbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c630b2002200128021841d5dbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c620b2002200128021841dadbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c610b2002200128021841dfdbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c600b2002200128021841e4dbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5f0b2002200128021841e9dbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5e0b2002200128021841eedbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5d0b2002200128021841f3dbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5c0b2002200128021841f8dbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5b0b2002200128021841fddbc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5a0b200220012802184182dcc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c590b200220012802184187dcc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c580b20022001280218418cdcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c570b200220012802184192dcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c560b200220012802184198dcc50041092001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c550b2002200128021841a1dcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c540b2002200128021841a7dcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c530b2002200128021841addcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c520b2002200128021841b3dcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c510b2002200128021841badcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c500b2002200128021841c1dcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4f0b2002200128021841c8dcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4e0b2002200128021841cfdcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4d0b2002200128021841d5dcc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4c0b2002200128021841dadcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4b0b2002200128021841e0dcc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4a0b2002200128021841e6dcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c490b2002200128021841eddcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c480b2002200128021841f4dcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c470b2002200128021841fbdcc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c460b200220012802184182ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c450b200220012802184188ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c440b20022001280218418eddc50041092001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c430b200220012802184197ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c420b20022001280218419dddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c410b2002200128021841a3ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c400b2002200128021841a9ddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3f0b2002200128021841b0ddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3e0b2002200128021841b7ddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3d0b2002200128021841beddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3c0b2002200128021841c5ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3b0b2002200128021841cbddc50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3a0b2002200128021841d0ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c390b2002200128021841d6ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c380b2002200128021841dcddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c370b2002200128021841e3ddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c360b2002200128021841eaddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c350b2002200128021841f1ddc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c340b2002200128021841f8ddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c330b2002200128021841feddc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c320b200220012802184184dec50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c310b20022001280218418bdec50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c300b200220012802184193dec50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2f0b20022001280218419bdec500410a2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2e0b2002200128021841a5dec50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2d0b2002200128021841acdec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2c0b2002200128021841b2dec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2b0b2002200128021841b8dec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2a0b2002200128021841bedec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c290b2002200128021841c4dec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c280b2002200128021841cadec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c270b2002200128021841d0dec500410b2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c260b2002200128021841dbdec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c250b2002200128021841e1dec50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c240b2002200128021841e7dec50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c230b2002200128021841eedec50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c220b2002200128021841f6dec50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c210b2002200128021841fedec500410a2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c200b200220012802184188dfc50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1f0b20022001280218418fdfc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1e0b200220012802184195dfc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1d0b20022001280218419bdfc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1c0b2002200128021841a1dfc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1b0b2002200128021841a7dfc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1a0b2002200128021841addfc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c190b2002200128021841b3dfc500410b2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c180b2002200128021841bedfc500410a2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c170b2002200128021841c8dfc500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c160b2002200128021841d4dfc500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c150b2002200128021841e0dfc500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c140b2002200128021841ecdfc500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c130b2002200128021841f8dfc500410d2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c120b200220012802184185e0c500410d2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c110b200220012802184192e0c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c100b20022001280218419ee0c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0f0b2002200128021841aae0c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0e0b2002200128021841b6e0c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0d0b2002200128021841c2e0c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0c0b2002200128021841d0e0c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0b0b2002200128021841dee0c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0a0b2002200128021841ece0c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c090b2002200128021841fae0c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c080b200220012802184186e1c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c070b200220012802184194e1c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c060b2002200128021841a2e1c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c050b2002200128021841b0e1c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c040b2002200128021841bee1c500410d2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c030b2002200128021841cbe1c50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c020b2002200128021841dce1c50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c010b2002200128021841ede1c50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000b20002d00082101024020002802042203450d00200141ff0171210441012101024020040d00024020034101470d0020002d0009450d00200028020022042d00004104710d0041012101200428021841f4afc00041012004411c6a28020028020c1100000d010b2000280200220128021841c8a4c60041012001411c6a28020028020c11000021010b200020013a00080b200241206a2400200141ff01714100470bcd0203027f017e017f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210020034120710d012000ac22042004423f8722047c2004852000417f73411f762001103f21000c020b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d0220014101419087c0004102200220036a4180016a410020036b104221000b20024180016a240020000f0b20034180011044000b20004180011044000bcd0202027f027e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f552001103f21000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000b20024180016a240020000f0b20034180011044000b20034180011044000bc00201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff018341012001103f21000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d0220014101419087c0004102200220006a4180016a410020006b104221000b20024180016a240020000f0b20044180011044000b20044180011044000bd30101017f230041106b22022400024002400240024020002d00000e03010200010b2002200128021841fee1c500410b2001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c020b200220012802184189e2c500410c2001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b200220012802184195e2c500410d2001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040b200241106a240020000b8a0201027f230041106b2202240020002802002802002100200128021841b8d6c500410b2001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200036020c200241c3d6c50041052002410c6a41c8d6c500105c21012002200041086a36020c200141d8d6c50041072002410c6a41a8d6c500105c1a20022d00042101024020022d0005450d00200141ff0171210041012101024020000d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d00200341eeafc0004102200011000021010c010b200341f0afc0004101200011000021010b200220013a00040b200241106a2400200141ff01714100470b890501047f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841adafc00041012001411c6a28020028020c110000210502402003450d0020022000360204024020050d00024020012d0000410471450d0041012104200128021841afafc0004101200128021c28020c1100000d012001280200210541012104200241013a001720022005360218200241b0afc00036023420022001290218370308200220012d00303a00482002200128020436021c200220012902283703402002200129022037033820022001290210370328200220012902083703202002200241176a3602102002200241086a360230200241046a200241186a10d8010d01200228023041c8afc0004102200228023428020c11000021040c010b200241046a200110d80121040b024020034101470d00200421050c010b200041046a21002003410274417c6a210320042105034020022000360204200541ff0171210441012105024020040d00024020012802002204410471450d00200241013a001720022004360218200241b0afc00036023420022001290218370308200220012d00303a00482002200128020436021c200220012902283703402002200129022037033820022001290210370328200220012902083703202002200241176a3602102002200241086a360230200241046a200241186a10d8010d01200228023041c8afc0004102200228023428020c11000021050c010b200128021841caafc0004102200128021c28020c1100000d00200241046a200110d80121050b200041046a21002003417c6a22030d000b0b41012100024020050d00200128021841aeafc0004101200128021c28020c11000021000b200241d0006a240020000b19002000200141186a280200360204200020012802103602000bc50201037f230041206b2202240002400240200028020022002d00004104470d002002200128021841b7e2c50041082001411c6a28020028020c11000022003a001820022001360210200241003a0019200241003602140c010b2002200128021841bfe2c50041052001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41c4e2c500105d210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841f4afc00041012004411c6a28020028020c1100000d010b2001280200220028021841c8a4c60041012000411c6a28020028020c11000021000b200120003a00080b200241206a2400200041ff01714100470b0c002000280200200110d0040b8f0201017f230041106b220224000240024002400240024020002d00000e0401020300010b2002200128021841d4e2c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c030b2002200128021841d7e2c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c020b2002200128021841dae2c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b2002200128021841dde2c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040b200241106a240020000bc00201037f230041206b220224000240024020002d00004104470d002002200128021841b7e2c50041082001411c6a28020028020c11000022003a001820022001360210200241003a0019200241003602140c010b2002200128021841bfe2c50041052001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41c4e2c500105d210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841f4afc00041012004411c6a28020028020c1100000d010b2001280200220028021841c8a4c60041012000411c6a28020028020c11000021000b200120003a00080b200241206a2400200041ff01714100470b0c002000280200200110c6040bed0902067f017e024020010d00200041ac013a00000f0b024002400240024002400240024020012d00002202414f6a41fb004f0d000c010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e312c2c0001022c2c0304052c06072c2c08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292c0b20012d00012103410221020c2b0b20012d00012103410321020c2a0b20012d00012103410421020c290b200141046a2802002104410721020c270b200141046a2802002104410821020c260b200141046a2802002105410c10282204450d272005280204220641ffffffff03712006470d2820064102742201417f4c0d280240024020010d00410421070c010b200110282207450d2a0b02402006450d00200528020021012006410274210320072102034020022001280200360200200241046a2102200141046a21012003417c6a22030d000b0b200420063602042004200736020020042005280208360208410921020c250b200141046a2802002104410b21020c240b200141046a280200210420012d00012103410c21020c240b200141046a2802002104410f21020c220b200141046a2802002104411021020c210b200141046a2802002104411121020c200b200141046a2802002104411221020c1f0b200141046a2802002104411321020c1e0b200141046a280200210420013502082108411421020c1d0b200141046a280200210420013502082108411521020c1c0b200141046a280200210420013502082108411621020c1b0b200141046a280200210420013502082108411721020c1a0b200141046a280200210420013502082108411821020c190b200141046a280200210420013502082108411921020c180b200141046a280200210420013502082108411a21020c170b200141046a280200210420013502082108411b21020c160b200141046a280200210420013502082108411c21020c150b200141046a280200210420013502082108411d21020c140b200141046a280200210420013502082108411e21020c130b200141046a280200210420013502082108411f21020c120b200141046a280200210420013502082108412021020c110b200141046a280200210420013502082108412121020c100b200141046a280200210420013502082108412221020c0f0b200141046a280200210420013502082108412321020c0e0b200141046a280200210420013502082108412421020c0d0b200141046a280200210420013502082108412521020c0c0b200141046a280200210420013502082108412621020c0b0b200141046a280200210420013502082108412721020c0a0b200141046a280200210420013502082108412821020c090b200141046a280200210420013502082108412921020c080b200141046a280200210420013502082108412a21020c070b20012d00012103412b21020c070b20012d00012103412c21020c060b200141046a2802002104412d21020c040b20012903082108412e21020c020b200141046a2802002104412f21020c020b20012903082108413021020b0b0b200020033a0001200020023a0000200041086a2008370300200041046a20043602000f0b410c41041037000b1036000b200141041037000bba0201037f230041106b220224000240024020002802000d002002200128021841e0e2c50041042001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b2002200128021841e4e2c50041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41e8e2c500105d210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841f4afc00041012004411c6a28020028020c1100000d010b2001280200220028021841c8a4c60041012000411c6a28020028020c11000021000b200120003a00080b200241106a2400200041ff01714100470b22002001419daec0004198aec00020002802002d000022001b4104410520001b10450bd60501087f230041106b220324002002280208220441546a2105200241106a280200220641306c210702400340410021082007450d01200741506a21072005412c6a2109200541306a220a210520092d00004103470d000b200a41086a2802002207450d00200741286c2105200a28020041186a2107410021080340200820072d0000456a2108200741286a2107200541586a22050d000b0b02400240024002400240024002400240200120086b220a20014b0d00200641306c2107200441546a210503402007450d02200741506a21072005412c6a2108200541306a2209210520082d0000410c470d000b200941086a280200200a4b0d02411e102822070d05411e41011037000b412c102822070d02412c41011037000b412c102822070d02412c41011037000b2009280200200a41186c6a28020821072003200a200210dd0420032802004101460d0320032802042105200041003602002000200520076a3602040c040b2000200736020420004101360200200741286a41002800fee545360000200741206a41002900f6e545370000200741186a41002900eee545370000200741106a41002900e6e545370000200741086a41002900dee545370000200741002900d6e545370000200041086a42ac808080c0053702000c030b2000200736020420004101360200200741286a41002800aae645360000200741206a41002900a2e645370000200741186a410029009ae645370000200741106a4100290092e645370000200741086a410029008ae64537000020074100290082e645370000200041086a42ac808080c0053702000c020b2000200736020420004101360200200741166a41002900c4e645370000200741106a41002900bee645370000200741086a41002900b6e645370000200741002900aee645370000200041086a429e808080e0033702000c010b20002003290204370204200041013602002000410c6a2003410c6a2802003602000b200341106a24000b8d0301067f230041106b220224000240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b4104762207490d00200028020021030c010b200420076a22062004490d02200341017422052006200520064b1b220641ffffffff00712006470d02200641047422054100480d020240024020030d002005102821030c010b200028020020034104742005102c21030b2003450d0120002003360200200041046a2006360200200041086a280200210420012802042105200128020021060b0240024020062005470d00410021060c010b2001200641106a3602000b2002200610d304024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a29030037030002400240200128020022052001280204470d00410021050c010b2001200541106a3602000b200441016a2104200641106a21062002200510d30420022d000041ac01470d000b0b200041086a2004360200200241106a24000f0b200541081037000b1031000b1000200028020035020041012001103f0be00a01067f024002400240024020012d00002202414f6a41fb00490d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e312a2a0001022a2a0304052a06072a2a08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a0b200020012d00013a0001200041023a00000f0b200020012d00013a0001200041033a00000f0b200020012d00013a0001200041043a00000f0b200041046a200141046a280200360200200041073a00000f0b200041046a200141046a280200360200200041083a00000f0b200141046a2802002103410c10282204450d252003280204220541ffffffff03712005470d2620054102742201417f4c0d260240024020010d00410421060c010b200110282206450d280b02402005450d00200328020021012005410274210720062102034020022001280200360200200241046a2102200141046a21012007417c6a22070d000b0b200420053602042004200636020020042003280208360208200041046a2004360200200041093a00000f0b200041046a200141046a2802003602002000410b3a00000f0b200020012d00013a0001200041046a200141046a2802003602002000410c3a00000f0b200041046a200141046a2802003602002000410f3a00000f0b200041046a200141046a280200360200200041103a00000f0b200041046a200141046a280200360200200041113a00000f0b200041046a200141046a280200360200200041123a00000f0b200041046a200141046a280200360200200041133a00000f0b200041046a200141046a290200370200200041143a00000f0b200041046a200141046a290200370200200041153a00000f0b200041046a200141046a290200370200200041163a00000f0b200041046a200141046a290200370200200041173a00000f0b200041046a200141046a290200370200200041183a00000f0b200041046a200141046a290200370200200041193a00000f0b200041046a200141046a2902003702002000411a3a00000f0b200041046a200141046a2902003702002000411b3a00000f0b200041046a200141046a2902003702002000411c3a00000f0b200041046a200141046a2902003702002000411d3a00000f0b200041046a200141046a2902003702002000411e3a00000f0b200041046a200141046a2902003702002000411f3a00000f0b200041046a200141046a290200370200200041203a00000f0b200041046a200141046a290200370200200041213a00000f0b200041046a200141046a290200370200200041223a00000f0b200041046a200141046a290200370200200041233a00000f0b200041046a200141046a290200370200200041243a00000f0b200041046a200141046a290200370200200041253a00000f0b200041046a200141046a290200370200200041263a00000f0b200041046a200141046a290200370200200041273a00000f0b200041046a200141046a290200370200200041283a00000f0b200041046a200141046a290200370200200041293a00000f0b200041046a200141046a2902003702002000412a3a00000f0b200020012d00013a00012000412b3a00000f0b200020012d00013a00012000412c3a00000f0b200041046a200141046a2802003602002000412d3a00000f0b200041086a200141086a2903003703002000412e3a00000f0b200041046a200141046a2802003602002000412f3a00000f0b200041086a200141086a290300370300413021020b200020023a00000f0b410c41041037000b1036000b200141041037000bea0302057f017e02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441c4006a2802002105200441386a2802002106200441346a2802002107200141016a21010c010b02400240200028020022010d002003ad210841002104410021010c010b20003301044220862003ad842108410121040b2000102a2008a72103024002402008422088a7220620012f01064f0d00200121050c010b034002400240200128020022050d002003ad2108410021050c010b200441016a210420013301044220862003ad8421080b2001102a2008a72103200521012008422088a7220620052f01064f0d000b0b200641027420056a4198036a2802002100200520064105746a220141c4006a2802002105200141386a2802002106200141346a280200210702402004417f6a2201450d00034020002802940321002001417f6a22010d000b0b410021010b20054102460d012002417f6a210202402006450d002007102a0b20020d000b0b0240200041f8b9c000460d00200028020021012000102a2001450d00200128020021052001102a2005450d00024020052802002201450d0003402005102a2001210520012802002200210120000d000b0b2005102a0b0bba09010b7f230041e0006b22032400200320013602202002280208220441546a2105200241106a280200220641306c210202400340024020020d00410021070c020b200241506a21022005412c6a2107200541306a2208210520072d00004102470d000b200341186a200810fa0320032802182107200328021c21020b2002410020071b2109200641306c2102200441546a21052007410420071b210a02400340024020020d004100210b0c020b200241506a21022005412c6a2107200541306a2208210520072d00004104470d000b200341106a200810fa032003280210210b2003280214210c0b200641306c2102200441546a2105200b4104200b1b210d02400240024002400240024003402002450d01200241506a21022005412c6a2107200541306a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d01200641306c2102200441546a2105024003402002450d01200241506a21022005412c6a2107200541306a2208210520072d00004103470d000b200341086a200810fa0320032802082202200328020c41286c6a21070240024002400340024002400240200720026b41f8004b0d0020022007460d0d2002411c6a2105034020022d0018450d02200541286a2105200241286a22022007470d000c0e0b0b20022d00180d01200241186a2105200241286a21080c040b2005410c6a21080c040b200241c0006a22052d0000450d010240200241e8006a22052d0000450d0020024190016a2105200241a0016a2208210220052d00000d010c030b0b200241f8006a21080c010b200241d0006a21080b200541046a21050b2001450d0303402001417f6a210120082102024002400340024002400240200720026b41f8004b0d0020022007460d0d2002411c6a2105034020022d0018450d02200541286a2105200241286a22022007460d0e0c000b0b20022d00180d01200241186a2105200241286a21080c040b2005410c6a210820010d040c080b200241c0006a22052d0000450d010240200241e8006a22052d0000450d0020024190016a2105200241a0016a2208210220052d00000d010c030b0b200241f8006a21080c010b200241d0006a21080b20010d000b200541046a21050c030b41cce6c50041c2001050000b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d010b200341cc006a41013602002003420237023c200341ece7c5003602382003410136022c2003200341286a3602482003200341206a360228200341d0006a200341386a1033200341d0006a21020c010b2003200528020022023602240240200920024d0d00200a20024104746a2202450d0020002002360204410021020c020b200341cc006a4102360200200341dc006a41013602002003420337023c200341fce7c500360238200341013602542003200341d0006a3602482003200341206a3602582003200341246a360250200341286a200341386a1033200341286a21020b20022802002105200041086a200229020437020020002005360204410121020b20002002360200200341e0006a24000f0b418ee7c50041dd001050000bf80d01067f0240024020002d00002201410e4b0d00024002400240024002400240024002400240024002400240024020010e0f0001020304050607080e090e0a0b0c000b200041086a280200450d0d200041046a280200102a0f0b0240200041086a280200450d00200041046a280200102a0b200041146a280200450d0c200041106a280200102a0f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200102a0b200141106a2101200241706a22020d000b0b200041086a280200450d0b2000280204102a0f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101200241586a22020d000b0b200041086a280200450d0a2000280204102a0f0b200041086a280200450d09200041046a280200102a0f0b200041086a280200450d08200041046a280200102a0f0b200041086a280200450d07200041046a280200102a0f0b02402000410c6a2802002201450d00200041046a280200220320014104746a21040340024020032802082202450d0020032802002101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102a200528020021060b2006102a0b200141106a2101200241706a22020d000b0b200341106a21010240200341046a280200450d002003280200102a0b2001210320012004470d000b0b200041086a280200450d062000280204102a0f0b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200102a0b200141146a21012002416c6a22020d000b0b200041086a280200450d052000280204102a0f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a21040340024020032802042201450d0002402003410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102a200528020021060b2006102a0b200141106a2101200241706a22020d000b0b200341086a280200450d002003280204102a0b2003411c6a21010240200341146a280200450d002003280210102a0b2001210320012004470d000b0b200041086a280200450d042000280204102a0f0b02402000410c6a2802002201450d00200041046a2802002203200141186c6a210403400240200341046a280200450d002003280200102a0b0240200341146a2802002202450d00200328020c2101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102a200528020021060b2006102a0b200141106a2101200241706a22020d000b0b200341186a21010240200341106a280200450d00200328020c102a0b2001210320012004470d000b0b200041086a280200450d032000280204102a0f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a21040340024020032802042201450d0002402003410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102a200528020021060b2006102a0b200141106a2101200241706a22020d000b0b200341086a280200450d002003280204102a0b2003411c6a21010240200341146a280200450d002003280210102a0b2001210320012004470d000b0b200041086a280200450d022000280204102a0f0b0240200041046a2802002201450d00200041086a280200450d002001102a0b0240200041146a2802002201450d0002402000411c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102a0b2001410c6a2101200241746a22020d000b0b200041186a280200450d002000280214102a0b200041246a2802002203450d0102402000412c6a2802002201450d00200320014104746a210403402003220541106a2103024020052802042201450d0002402005410c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102a0b2001410c6a2101200241746a22020d000b0b200541086a280200450d002005280204102a0b20032004470d000b0b200041286a280200450d012000280224102a0c010b0240200041086a280200450d00200041046a280200102a0b0240200041146a2802002201450d00200041186a280200450d002001102a0b200041246a280200450d00200041206a280200102a0f0b0bd65e010c7f23004190016b220324002003200136021c2002280208220441546a2105200241106a280200220641306c21010240024002400240024002400240024002400240024002400240024003402001450d01200141506a21012005412c6a2107200541306a2208210520072d00004104470d000b200641306c2101200441546a210503402001450d02200141506a21012005412c6a2107200541306a2209210520072d0000410c470d000b200641306c2101200441546a210503402001450d03200141506a21012005412c6a2107200541306a2204210520072d00004102470d000b02404100280280b1464105490d002003410136023c20032003411c6a3602384100280284b146210120034188016a41980136020020034180016a42ed80808010370300200341f8006a4125360200200341f0006a4101360200200341e0006a4201370300200341d8006a410a360200200341fcf0c50036027c200341d7f0c500360274200341ec006a200341386a360200200341f8edc50036025c200341cdf0c500360254200341053602504188b1c60041b8aec600200141024622011b200341d0006a41c8b0c00041e0b0c00020011b2802101102000b200341106a200810fa032003280214200328021c22014d0d03200328021020014102746a2201450d03200341086a200410fa030240200328020c200128020022014d0d00200328020820014104746a22010d050b412510282201450d052001411d6a410029009dee45370000200141186a4100290098ee45370000200141106a4100290090ee45370000200141086a4100290088ee4537000020014100290080ee45370000200041086a42a5808080d00437020020002001360204200041013602000c0d0b411310282201450d082001410f6a41002800d3ed45360000200141086a41002900cced45370000200141002900c4ed45370000200041086a4293808080b00237020020002001360204200041013602000c0c0b410f10282201450d06200141076a41002900deed45370000200141002900d7ed45370000200041086a428f808080f00137020020002001360204200041013602000c0b0b410f10282201450d04200141076a41002900eded45370000200141002900e6ed45370000200041086a428f808080f00137020020002001360204200041013602000c0a0b412510282201450d022001411d6a410029009dee45370000200141186a4100290098ee45370000200141106a4100290090ee45370000200141086a4100290088ee4537000020014100290080ee45370000200041086a42a5808080d00437020020002001360204200041013602000c090b02400240200941086a280200200328021c22054b0d00412710282201450d012001411f6a41002900c4ee45370000200141186a41002900bdee45370000200141106a41002900b5ee45370000200141086a41002900adee45370000200141002900a5ee45370000200041086a42a7808080f00437020020002001360204200041013602000c0a0b20092802002109200341206a41086a420037030020034280808080c00037032020012d000d2107410021012003410036024020032007410447220a36023c2003200a360238200341003a0044024002400240024002404100280280b14641044b0d00200341d0006a41086a200341386a41086a29030037030020032003290338370350200341206a410472210b200341d0006a21070c010b2003412d36024c2003200341386a3602484100280284b146210120034188016a41cb0036020020034180016a42ed80808010370300200341f8006a4125360200200341f0006a4101360200200341e0006a4201370300200341d0006a41086a2207410a360200200341fcf0c50036027c200341d7f0c500360274200341ec006a200341c8006a360200200341cceec50036025c200341cdf0c500360254200341053602504188b1c60041b8aec600200141024622011b200341d0006a41c8b0c00041e0b0c00020011b280210110200200328022c2108200328022821012007200341386a41086a29030037030020032003290338370350200341206a410472210b200341d0006a210720082001470d010b200141016a22082001490d01200141017422062008200620084b1b220841ffffffff00712008470d01200841047422064100480d010240024020010d002006102821010c010b200b28020020014104742006102c21010b2001450d02200b200136020020032008360228200328022c21080b200b28020020084104746a22012007290200370200200141086a200741086a2902003702002003200328022c41016a36022c410021072009200541186c6a2201280214450d092009200541186c6a410c6a2109200141146a2108200341d0006a410472210c410021074100210103400240200328022020074d0d00200341d0006a200341206a410010e304024020032802504101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c0d0b2007200328022020032802542d000c1b21070b02400240024002400240024002402001200828020022054f0d002003200928020020014104746a220536023402404100280280b1464105490d002003412936023c2003200341346a3602384100280284b1462105200341c90136028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341b0aec60036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328023421050b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052d000022060eac0102220000002201030405060708090a0b0c0d0e0f1010101010101010101010101010111111111111111111121314141414151616161616161616161615161616161616161616161616161616161616161616161717171818181818181818181818181818181717171818181818181818181818181818181717171717171718181818181818171717171717171818181818181819191919191919191919191919191919191919191919191919020b20052d00012105200320032802203602402003200541044722053602382003200641034720057136023c200341003a004402404100280280b1464105490d002003412d36024c2003200341386a3602484100280284b1462105200341cb0036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341cceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341c8006a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b2802101102000b200341d0006a41086a2206200341386a41086a290300370300200320032903383703500240200328022c22052003280228470d00200541016a220d2005490d242005410174220e200d200e200d4b1b220d41ffffffff0071200d470d24200d410474220e4100480d240240024020050d00200e102821050c010b200b2802002005410474200e102c21050b2005450d1d200b20053602002003200d360228200328022c21050b200b28020020054104746a22052003290350370200200541086a20062903003702002003200328022c41016a36022c0c210b4100210502404100280280b1464105490d000240200328022c2206417f6a220d20064b0d00200b280200200d4104746a4100200d2006491b21050b2003412e36024c200320053602382003200341386a3602484100280284b1462105200341d30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341d4eec50036025c2003410a360258200341cdf0c500360254200341053602502003200341c8006a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b2802101102000b0240200328022c2205450d0020032005417f6a220536022c200b28020020054104746a22052d000c4102470d1a0b411710282201450d1c2001410f6a41002900ebee45370000200141086a41002900e4ee45370000200141002900dcee45370000200041086a4297808080f00237020020002001360204200041013602000c2c0b02404100280280b1464105490d004100280284b1462105200341c10036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003420437026c20034201370360200341f4eec50036025c2003410a360258200341cdf0c500360254200341053602504188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b2802101102000b0240200328022c2205417f6a220620054f0d00200620054d0d180b411710282201450d1e2001410f6a41002900ebee45370000200141086a41002900e4ee45370000200141002900dcee45370000200041086a4297808080f00237020020002001360204200041013602000c2b0b200341d0006a200341206a200541046a28020010e304024020032802504101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c2b0b200341d0006a200341206a200328025428020410e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c2b0b02404100280280b1464105490d004100280284b1462105200341c10036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003420437026c20034201370360200341f4eec50036025c2003410a360258200341cdf0c500360254200341053602504188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b2802101102000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102822010d01411741011037000b200b28020020064104746a41013a000c0c1f0b2001410f6a41002900ebee45370000200141086a41002900e4ee45370000200141002900dcee45370000200041086a4297808080f00237020020002001360204200041013602000c2a0b200341d0006a200341206a200541046a28020010e304024020032802504101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c2a0b200341d0006a200341206a2003280254280204220510e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c2a0b200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c2a0b2003200536024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c1e0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c290b200341d0006a200341206a200541046a28020028020810e304024020032802504101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c290b2003280254280204210d2005280204220628020441027421052006280200210602400340024020050d00200341d0006a200341206a200d10e4042003280250450d0220002003290350370204200041013602002000410c6a200341d8006a2802003602000c2b0b200341d0006a200341206a200628020010e304024020032802504101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c2b0b2005417c6a2105200641046a21062003280254280204200d460d000b412710282201450d1a2001411f6a41002900b1ef45370000200141186a41002900aaef45370000200141106a41002900a2ef45370000200141086a410029009aef4537000020014100290092ef45370000200041086a42a7808080f00437020020002001360204200041013602000c290b02404100280280b1464105490d004100280284b1462105200341c10036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003420437026c20034201370360200341f4eec50036025c2003410a360258200341cdf0c500360254200341053602504188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b2802101102000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102822010d01411741011037000b200b28020020064104746a41013a000c0c1d0b2001410f6a41002900ebee45370000200141086a41002900e4ee45370000200141002900dcee45370000200041086a4297808080f00237020020002001360204200041013602000c280b200341d0006a200341206a200a10e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c280b02404100280280b1464105490d004100280284b1462105200341c10036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003420437026c20034201370360200341f4eec50036025c2003410a360258200341cdf0c500360254200341053602504188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b2802101102000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102822010d01411741011037000b200b28020020064104746a41013a000c0c1c0b2001410f6a41002900ebee45370000200141086a41002900e4ee45370000200141002900dcee45370000200041086a4297808080f00237020020002001360204200041013602000c270b200341d0006a200541046a280200200210db04024020032802504101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c270b200341d0006a200341206a2003280254220528020810e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c270b200320052d000d410447220536024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c1b0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c260b2003200410fa03024002402003280204200541046a28020022054d0d002003280200220620054104746a220d0d010b410e10282201450d18200141066a41002900bfef45370000200141002900b9ef45370000200041086a428e808080e00137020020002001360204200041013602000c260b200341d0006a200341206a200620054104746a28020810e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c260b2003200d2d000d410447220536024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c1a0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c250b200341d0006a200341206a410110e4042003280250450d1820002003290350370204200041013602002000410c6a200341d8006a2802003602000c240b200341d0006a200341206a410210e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c240b41012105200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c240b2003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c180b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c230b410121052003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c170b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c220b200341d0006a200341206a410110e4042003280250450d1520002003290350370204200041013602002000410c6a200341d8006a2802003602000c210b41012105200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c210b2003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c150b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c200b410121052003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c140b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c1f0b200341d0006a200341206a410110e4042003280250450d1220002003290350370204200041013602002000410c6a200341d8006a2802003602000c1e0b41012105200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1e0b2003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c120b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c1d0b200341d0006a200341206a410210e4042003280250450d1020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1c0b410121052003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c100b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c1b0b41012105200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1b0b2003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c0f0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c1a0b410121052003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c0e0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c190b41012105200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c190b2003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c0d0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c180b200341d0006a200341206a410210e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c180b410121052003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c0c0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c170b41012105200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c170b2003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c0b0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c160b200341d0006a200341206a410210e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c160b410121052003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c0a0b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c150b41012105200341d0006a200341206a410110e40402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c150b2003410136024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328024821050b024002402003280220220620056a220520064f0d00410e102822010d01410e41011037000b200320053602200c090b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c140b200b28020020064104746a41013a000c0c070b2005280200210620032005280208220536023802404100280280b1464105490d002003410136024c2003200341386a3602484100280284b1462105200341db0036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341c8efc50036025c2003410a360258200341cdf0c500360254200341053602502003200341c8006a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b280210110200200328023821050b200320053602202003200636024802404100280280b1464105490d002003410136023c2003200341c8006a3602384100280284b1462105200341e30036028801200342ed8080801037038001200341fcf0c50036027c20034125360278200341d7f0c5003602742003410136027020034201370360200341fceec50036025c2003410a360258200341cdf0c500360254200341053602502003200341386a36026c4188b1c60041b8aec600200541024622051b200341d0006a41c8b0c00041e0b0c00020051b28021011020020032802202105200328024821060b0240200520066a220620054f0d00410e102822010d11410e41011037000b200320063602200c060b41d0efc500200120051034000b200e41041037000b411741011037000b412741011037000b410e41011037000b411741011037000b200141016a22012008280200490d000c0a0b0b1031000b200641041037000b412741011037000b412541011037000b412541011037000b410f41011037000b410f41011037000b411341011037000b200141066a410029008aef4537000020014100290084ef45370000200041086a428e808080e00137020020002001360204200041013602000c010b20004100360200200020073602042003280228450d01200b280200102a0c010b2003280228450d00200b280200102a0b20034190016a24000bf50202057f017e02400240024020014108490d00200141017641feffffff07712202417f6a220320014f0d022001410d74200173220441117620047322044105742004732205417f2001417f6a677622067122044100200120042001491b6b220420014f0d01200020034103746a220329020021072003200020044103746a220429020037020020042007370200024020022001490d00200221030c030b2005410d7420057322044111762004732204410574200473220520067122044100200120042001491b6b220420014f0d01200020024103746a220329020021072003200020044103746a2204290200370200200420073702002002410172220320014f0d022005410d742005732204411176200473220441057420047320067122044100200120042001491b6b220420014f0d01200020034103746a220129020021072001200020044103746a2200290200370200200020073702000b0f0b41a8e9c500200420011034000b4198e9c500200320011034000bd50302047f017e024020014101762202450d0003402002417f6a2202210302400240024003402003410174220441017221050240200441026a220420014f0d00200520014f0d0220042005200020054103746a280200200020044103746a280200491b21050b200520014f0d03200320014f0d02200020034103746a2203280200200020054103746a22042802004f0d03200329020021062003200429020037020020042006370200200521030c000b0b41e8eac500200520011034000b41f8eac500200320011034000b20020d000b0b0240024020014102490d002001210403402004417f6a220420014f0d02200029020021062000200020044103746a2205290200370200200520063702004100210302400240024003402003410174220241017221050240200241026a220220044f0d00200520044f0d0220022005200020054103746a280200200020024103746a280200491b21050b200520044f0d03200320044f0d02200020034103746a2203280200200020054103746a22022802004f0d03200329020021062003200229020037020020022006370200200521030c000b0b41e8eac500200520041034000b41f8eac500200320041034000b200441014b0d000b0b0f0b41a8e9c500200420011034000bea04050a7f017e017f017e027f200041686a21022001417f6a2103200041086a2104410021052001413249210641012107024003400240024020072001490d00410021080c010b410121082000200741037422096a220a280200220b200a41786a280200490d00200420096a210803404101210a20032007460d03200741016a21072008280200220a200b4f2109200841086a2108200a210b20090d000b200720014921080b2007200146210a20060d0120072001460d010240024002400240024002402007417f6a220b20014f0d002008450d012000200b4103746a220b290200210c200b20002007410374220d6a2208290200220e3702002008200c37020020074102490d0520002007417e6a220a4103746a220f280200200ea722094d0d05200b200f290200370200200a450d0420002007417d6a220a4103746a28020020094d0d042002200d6a210b0340200b41086a200b290200370200200a450d03200a417f6a210a200b41786a220b28020020094b0d000b200a41016a210b0c030b4198e9c500200b20011034000b41a8e9c500200720011034000b4100210b0b2000200b4103746a210f0b200f200e3702000b200541016a21050240200120076b220a4102490d00200828020820082802004f0d002008290200210c20082008290208370200200841086a210f0240200a4103490d002008280210200ca722104f0d00200841106a21094103210b4102210d0340200d41037420086a220f41786a2009290200370200200b200a4f0d01200b4103742109200b210d200b41016a210b200820096a22092802002010490d000b0b200f200c3702000b20054105470d000b4100210a0b200a0bcc0201027f230041106b2202240020002802002802002100200128021841ebecc50041052001411c6a28020028020c1100002103200241003a0005200220033a00042002200136020020022000410c6a36020c200241f0ecc500410e2002410c6a4180edc500105c21012002200036020c20014190edc50041092002410c6a419cedc500105c21012002200041046a36020c200141acedc500410c2002410c6a419cedc500105c21012002200041086a36020c200141b8edc500410c2002410c6a419cedc500105c1a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d00200341eeafc0004102200111000021000c010b200341f0afc0004101200111000021000b200220003a00040b200241106a2400200041ff01714100470bc20201027f230041106b22022400200128021841ebecc50041052001411c6a28020028020c1100002103200241003a0005200220033a00042002200136020020022000410c6a36020c200241f0ecc500410e2002410c6a4180edc500105c21012002200036020c20014190edc50041092002410c6a419cedc500105c21012002200041046a36020c200141acedc500410c2002410c6a419cedc500105c21012002200041086a36020c200141b8edc500410c2002410c6a419cedc500105c1a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d00200341eeafc0004102200111000021000c010b200341f0afc0004101200111000021000b200220003a00040b200241106a2400200041ff01714100470b9b0201027f024002400240024002402001410c6a2802002203417f6a220420034d0d00411610282201450d01200020013602042001410e6a41002900ddf245370000200141086a41002900d7f245370000200141002900cff245370000200041086a4296808080e0023702000c040b0240200420026b220220044d0d00411b10282201450d0220002001360204200141176a41002800fcf245360000200141106a41002900f5f245370000200141086a41002900edf245370000200141002900e5f245370000200041086a429b808080b0033702000c040b200320024d0d022000200128020420024104746a360204200041003602000f0b411641011037000b411b41011037000b4180f3c500200220031034000b200041013602000bc50401027f230041d0006b220324002003200236020402404100280280b1464105490d002003410136020c2003200341046a3602084100280284b1462102200341c8006a41ef00360200200341c0006a42ed80808010370300200341386a4125360200200341306a4101360200200341206a4201370300200341186a410a360200200341fcf0c50036023c200341d7f0c5003602342003412c6a200341086a360200200341f8f1c50036021c200341cdf0c500360214200341053602104188b1c60041b8aec600200241024622021b200341106a41c8b0c00041e0b0c00020021b280210110200200328020421020b0240024002402002450d00200341106a2001410010e30420032802104101470d012000200341106a4104722202290200370200200041086a200241086a2802003602000c020b200041003602000c010b02400240024002402001280200220220032802142204280208460d00200220032802046b220420024d0d02410f102822020d01410f41011037000b024020042d000c0d00412510282202450d03200042a5808080d004370204200020023602002002411d6a410029009df245370000200241186a4100290098f245370000200241106a4100290090f245370000200241086a4100290088f24537000020024100290080f2453700000c040b200041003602000c030b2000428f808080f00137020420002002360200200241076a41002900acf245370000200241002900a5f2453700000c020b20004100360200200120043602000c010b412541011037000b200341d0006a24000bac0301047f230041c0006b2202240020002802002100410121030240200128021841baaec000410c2001411c6a28020028020c1100000d0002400240200028020822030d0020002802002203200028020428020c11070042e4aec285979ba58811520d012002200336020c2002412b36021420022002410c6a36021020012802182104200128021c2105410121032002413c6a41013602002002420237022c200241c8aec0003602282002200241106a36023820042005200241286a10350d020c010b2002200336020c2002412f36021420022002410c6a36021020012802182104200128021c2105410121032002413c6a41013602002002420237022c200241c8aec0003602282002200241106a36023820042005200241286a10350d010b200241106a41146a4101360200200241106a410c6a4101360200200241043602142002200041186a3602202002200041146a36021820022000410c6a36021020012802182100200128021c2101200241286a41146a41033602002002420337022c200241d8aec0003602282002200241106a36023820002001200241286a103521030b200241c0006a240020030b1500200120002802002200280200200028020410450b080020002001100b0bbe04020d7f017e230041c0006b22032400200128020022042001280208220541047422066a210720012802042108200421010240024002402005450d00200641706a2109200341306a410172210a200341306a41026a2106200341206a410172220b41076a210c20042101034020012d000021052006200141036a2d00003a00002003200141016a2f00003b01300240200541ac01470d00200141106a21010c020b2003410c6a41026a20062d0000220d3a0000200320032f0130220e3b010c200141046a280200210f200141086a2903002110200a200e3b0000200a41026a200d3a0000200320053a0030200320103703382003200f360234200341206a200341306a200210e9042003200b2900003703102003200c290000370017024020032d00202205411f470d00200941706a2109200141106a22012007470d010c030b0b200020053a000020002003290310370001200041086a200329001737000002402009450d00200141106a210103400240024020012d000022054109460d00200541ac01470d010c030b0240200141046a280200220528020441ffffffff0371450d002005280200102a0b2005102a0b200141106a22012007470d000b0b2008450d022004102a0c020b20012007460d0003400240024020012d000022054109460d00200541ac01470d010c030b0240200141046a280200220528020441ffffffff0371450d002005280200102a0b2005102a0b200141106a22012007470d000b0b02402008450d002004102a0b2000411f3a00000b200341c0006a24000bcbd60202097f017e230041106b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df501200441017422082005200820054b1b22084100480df5010240024020040d002008102821050c010b200628020020042008102c21050b2005450dad0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df501200441017422082005200820054b1b22084100480df5010240024020040d002008102821050c010b200628020020042008102c21050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df401200441017422082005200820054b1b22084100480df4010240024020040d002008102821050c010b200628020020042008102c21050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df401200441017422082005200820054b1b22084100480df4010240024020040d002008102821050c010b200628020020042008102c21050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df301200441017422082005200820054b1b22084100480df3010240024020040d002008102821050c010b200628020020042008102c21050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df301200441017422082005200820054b1b22084100480df3010240024020040d002008102821050c010b200628020020042008102c21050b2005450db00120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490df001200441017422072006200720064b1b22074100480df0010240024020040d002007102821060c010b200928020020042007102c21060b2006450db00120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df1012004410174220a2006200a20064b1b220a4100480df1010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490def01200441017422072006200720064b1b22074100480def010240024020040d002007102821060c010b200928020020042007102c21060b2006450db10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df0012004410174220a2006200a20064b1b220a4100480df0010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210902400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490dee01200441017422062005200620054b1b22064100480dee010240024020040d002006102821050c010b200928020020042006102c21050b2005450db20120022005360204200241086a20063602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a410e3a0000200320012802042204280204220520042802002204200420054102746a200210ea042003210420032d0000411f470d930320012802042802082105200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490def012004410174220a2006200a20064b1b220a4100480def010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db401200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca3010b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490ded01200441017422062005200620054b1b22064100480ded010240024020040d002006102821050c010b200228020420042006102c21050b2005450db30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490dec01200441017422072006200720064b1b22074100480dec010240024020040d002007102821060c010b200928020020042007102c21060b2006450db30120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490ded012004410174220a2006200a20064b1b220a4100480ded010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490deb01200441017422072006200720064b1b22074100480deb010240024020040d002007102821060c010b200928020020042007102c21060b2006450db40120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490dec012004410174220a2006200a20064b1b220a4100480dec010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490deb01200441017422062005200620054b1b22064100480deb010240024020040d002006102821050c010b200928020020042006102c21050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dea01200441017422062005200620054b1b22064100480dea010240024020040d002006102821050c010b200228020420042006102c21050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490de901200441017422062005200620054b1b22064100480de9010240024020040d002006102821050c010b200228020420042006102c21050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de801200441017422072006200720064b1b22074100480de8010240024020040d002007102821060c010b200928020020042007102c21060b2006450db60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de9012004410174220a2006200a20064b1b220a4100480de9010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db801200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de701200441017422072006200720064b1b22074100480de7010240024020040d002007102821060c010b200928020020042007102c21060b2006450db70120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de8012004410174220a2006200a20064b1b220a4100480de8010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db901200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de601200441017422072006200720064b1b22074100480de6010240024020040d002007102821060c010b200928020020042007102c21060b2006450db80120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de7012004410174220a2006200a20064b1b220a4100480de7010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450dba01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de501200441017422072006200720064b1b22074100480de5010240024020040d002007102821060c010b200928020020042007102c21060b2006450db90120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de6012004410174220a2006200a20064b1b220a4100480de6010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450dbb01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de401200441017422072006200720064b1b22074100480de4010240024020040d002007102821060c010b200928020020042007102c21060b2006450dba0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de5012004410174220a2006200a20064b1b220a4100480de5010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450dbc01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de301200441017422082007200820074b1b22084100480de3010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dbb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de4012004410174220b2007200b20074b1b220b4100480de4010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dbd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de401200441017422092006200920064b1b22094100480de4010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dbe012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de201200441017422082007200820074b1b22084100480de2010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dbd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de3012004410174220b2007200b20074b1b220b4100480de3010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dbf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de301200441017422092006200920064b1b22094100480de3010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de101200441017422082007200820074b1b22084100480de1010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dbf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de2012004410174220b2007200b20074b1b220b4100480de2010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de201200441017422092006200920064b1b22094100480de2010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de001200441017422082007200820074b1b22084100480de0010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de1012004410174220b2007200b20074b1b220b4100480de1010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de101200441017422092006200920064b1b22094100480de1010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddf01200441017422082007200820074b1b22084100480ddf010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de0012004410174220b2007200b20074b1b220b4100480de0010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de001200441017422092006200920064b1b22094100480de0010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dde01200441017422082007200820074b1b22084100480dde010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddf012004410174220b2007200b20074b1b220b4100480ddf010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddf01200441017422092006200920064b1b22094100480ddf010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc8012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c93010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddd01200441017422082007200820074b1b22084100480ddd010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc70120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dde012004410174220b2007200b20074b1b220b4100480dde010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dde01200441017422092006200920064b1b22094100480dde010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dca012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddc01200441017422082007200820074b1b22084100480ddc010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc90120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddd012004410174220b2007200b20074b1b220b4100480ddd010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dcb01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddd01200441017422092006200920064b1b22094100480ddd010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dcc012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddb01200441017422082007200820074b1b22084100480ddb010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dcb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddc012004410174220b2007200b20074b1b220b4100480ddc010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dcd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddc01200441017422092006200920064b1b22094100480ddc010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dce012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dda01200441017422082007200820074b1b22084100480dda010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dcd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddb012004410174220b2007200b20074b1b220b4100480ddb010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dcf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddb01200441017422092006200920064b1b22094100480ddb010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8f010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd901200441017422082007200820074b1b22084100480dd9010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dcf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dda012004410174220b2007200b20074b1b220b4100480dda010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dda01200441017422092006200920064b1b22094100480dda010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd801200441017422082007200820074b1b22084100480dd8010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd9012004410174220b2007200b20074b1b220b4100480dd9010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd901200441017422092006200920064b1b22094100480dd9010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd701200441017422082007200820074b1b22084100480dd7010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd8012004410174220b2007200b20074b1b220b4100480dd8010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd801200441017422092006200920064b1b22094100480dd8010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd601200441017422082007200820074b1b22084100480dd6010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da3022004410174220b2007200b20074b1b220b4100480da3020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da302200441017422092006200920064b1b22094100480da3020240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da102200441017422082007200820074b1b22084100480da1020240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da2022004410174220b2007200b20074b1b220b4100480da2020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dda01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da202200441017422092006200920064b1b22094100480da2020240024020040d002009102821060c010b200a28020020042009102c21060b2006450ddb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da002200441017422082007200820074b1b22084100480da0020240024020040d002008102821070c010b200a28020020042008102c21070b2007450dda0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da1022004410174220b2007200b20074b1b220b4100480da1020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450ddc01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da102200441017422092006200920064b1b22094100480da1020240024020040d002009102821060c010b200a28020020042009102c21060b2006450ddd012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9f02200441017422082007200820074b1b22084100480d9f020240024020040d002008102821070c010b200a28020020042008102c21070b2007450ddc0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da0022004410174220b2007200b20074b1b220b4100480da0020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dde01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da002200441017422092006200920064b1b22094100480da0020240024020040d002009102821060c010b200a28020020042009102c21060b2006450ddf012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9e02200441017422082007200820074b1b22084100480d9e020240024020040d002008102821070c010b200a28020020042008102c21070b2007450dde0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9f022004410174220b2007200b20074b1b220b4100480d9f020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9f02200441017422092006200920064b1b22094100480d9f020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de1012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c87010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9d02200441017422082007200820074b1b22084100480d9d020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de00120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9e022004410174220b2007200b20074b1b220b4100480d9e020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9e02200441017422092006200920064b1b22094100480d9e020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de3012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9c02200441017422082007200820074b1b22084100480d9c020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de20120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9d022004410174220b2007200b20074b1b220b4100480d9d020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9d02200441017422092006200920064b1b22094100480d9d020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de5012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9b02200441017422082007200820074b1b22084100480d9b020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de40120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9c022004410174220b2007200b20074b1b220b4100480d9c020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9c02200441017422092005200920054b1b22094100480d9c020240024020040d002009102821050c010b200a28020020042009102c21050b2005450de7012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a02200441017422082007200820074b1b22084100480d9a020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de60120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b022004410174220b2007200b20074b1b220b4100480d9b020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b02200441017422092006200920064b1b22094100480d9b020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9902200441017422082007200820074b1b22084100480d99020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a022004410174220b2007200b20074b1b220b4100480d9a020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dea01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a02200441017422092006200920064b1b22094100480d9a020240024020040d002009102821060c010b200a28020020042009102c21060b2006450deb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9802200441017422082005200820054b1b22084100480d98020240024020040d002008102821050c010b200628020020042008102c21050b2005450dea0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d9802200441017422082005200820054b1b22084100480d98020240024020040d002008102821050c010b200628020020042008102c21050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9702200441017422082005200820054b1b22084100480d97020240024020040d002008102821050c010b200628020020042008102c21050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d9702200441017422082005200820054b1b22084100480d97020240024020040d002008102821050c010b200628020020042008102c21050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9602200441017422072005200720054b1b22074100480d96020240024020040d002007102821050c010b200228020420042007102c21050b2005450dec0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210eb042003210420032d0000411f470def020c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9502200441017422062005200620054b1b22064100480d95020240024020040d002006102821050c010b200228020420042006102c21050b2005450dec0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c200210ec042003210420032d0000411f470dee020c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9402200441017422082005200820054b1b22084100480d94020240024020040d002008102821050c010b200628020020042008102c21050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d9402200541017422042008200420084b1b22044100480d94020240024020050d002004102821050c010b200628020020052004102c21050b2005450ded0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9302200441017422072005200720054b1b22074100480d93020240024020040d002007102821050c010b200628020020042007102c21050b2005450ded0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d9302200541017422042007200420074b1b22044100480d93020240024020050d002004102821050c010b200628020020052004102c21050b2005450dee0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9202200441017422062005200620054b1b22064100480d92020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9102200441017422062005200620054b1b22064100480d91020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9002200441017422062005200620054b1b22064100480d90020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f02200441017422062005200620054b1b22064100480d8f020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e02200441017422062005200620054b1b22064100480d8e020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d02200441017422062005200620054b1b22064100480d8d020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c02200441017422062005200620054b1b22064100480d8c020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b02200441017422062005200620054b1b22064100480d8b020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a02200441017422062005200620054b1b22064100480d8a020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8902200441017422062005200620054b1b22064100480d89020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8802200441017422062005200620054b1b22064100480d88020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8702200441017422062005200620054b1b22064100480d87020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8602200441017422062005200620054b1b22064100480d86020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8502200441017422062005200620054b1b22064100480d85020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8402200441017422062005200620054b1b22064100480d84020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8302200441017422062005200620054b1b22064100480d83020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8202200441017422062005200620054b1b22064100480d82020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8102200441017422062005200620054b1b22064100480d81020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8002200441017422062005200620054b1b22064100480d80020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff01200441017422062005200620054b1b22064100480dff010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe01200441017422062005200620054b1b22064100480dfe010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd01200441017422062005200620054b1b22064100480dfd010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc01200441017422062005200620054b1b22064100480dfc010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb01200441017422062005200620054b1b22064100480dfb010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa01200441017422062005200620054b1b22064100480dfa010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df901200441017422062005200620054b1b22064100480df9010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df801200441017422062005200620054b1b22064100480df8010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df501200441017422062005200620054b1b22064100480df5010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df401200441017422062005200620054b1b22064100480df4010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df301200441017422062005200620054b1b22064100480df3010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df001200441017422062005200620054b1b22064100480df0010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490def01200441017422062005200620054b1b22064100480def010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dba02200441017422062005200620054b1b22064100480dba020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db902200441017422062005200620054b1b22064100480db9020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db802200441017422062005200620054b1b22064100480db8020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db702200441017422062005200620054b1b22064100480db7020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db602200441017422062005200620054b1b22064100480db6020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db502200441017422062005200620054b1b22064100480db5020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db402200441017422062005200620054b1b22064100480db4020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db302200441017422062005200620054b1b22064100480db3020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db202200441017422062005200620054b1b22064100480db2020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db102200441017422062005200620054b1b22064100480db1020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db002200441017422062005200620054b1b22064100480db0020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daf02200441017422062005200620054b1b22064100480daf020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae02200441017422062005200620054b1b22064100480dae020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad02200441017422062005200620054b1b22064100480dad020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dac02200441017422062005200620054b1b22064100480dac020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dab02200441017422062005200620054b1b22064100480dab020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daa02200441017422062005200620054b1b22064100480daa020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da902200441017422062005200620054b1b22064100480da9020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da802200441017422062005200620054b1b22064100480da8020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da702200441017422062005200620054b1b22064100480da7020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da602200441017422062005200620054b1b22064100480da6020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da502200441017422062005200620054b1b22064100480da5020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da402200441017422062005200620054b1b22064100480da4020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da302200441017422062005200620054b1b22064100480da3020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da202200441017422062005200620054b1b22064100480da2020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da102200441017422062005200620054b1b22064100480da1020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da002200441017422062005200620054b1b22064100480da0020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9f02200441017422062005200620054b1b22064100480d9f020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9e02200441017422062005200620054b1b22064100480d9e020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9d02200441017422062005200620054b1b22064100480d9d020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9c02200441017422062005200620054b1b22064100480d9c020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9b02200441017422062005200620054b1b22064100480d9b020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9a02200441017422062005200620054b1b22064100480d9a020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9902200441017422062005200620054b1b22064100480d99020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9802200441017422062005200620054b1b22064100480d98020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9702200441017422062005200620054b1b22064100480d97020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9602200441017422062005200620054b1b22064100480d96020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9502200441017422062005200620054b1b22064100480d95020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9402200441017422062005200620054b1b22064100480d94020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9302200441017422062005200620054b1b22064100480d93020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9202200441017422062005200620054b1b22064100480d92020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9102200441017422062005200620054b1b22064100480d91020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9002200441017422062005200620054b1b22064100480d90020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f02200441017422062005200620054b1b22064100480d8f020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e02200441017422062005200620054b1b22064100480d8e020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d02200441017422062005200620054b1b22064100480d8d020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c02200441017422062005200620054b1b22064100480d8c020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b02200441017422062005200620054b1b22064100480d8b020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a02200441017422062005200620054b1b22064100480d8a020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8902200441017422062005200620054b1b22064100480d89020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8802200441017422062005200620054b1b22064100480d88020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8702200441017422062005200620054b1b22064100480d87020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8602200441017422062005200620054b1b22064100480d86020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8502200441017422062005200620054b1b22064100480d85020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8402200441017422062005200620054b1b22064100480d84020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8302200441017422062005200620054b1b22064100480d83020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8202200441017422062005200620054b1b22064100480d82020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8102200441017422062005200620054b1b22064100480d81020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8002200441017422062005200620054b1b22064100480d80020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff01200441017422062005200620054b1b22064100480dff010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe01200441017422062005200620054b1b22064100480dfe010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd01200441017422062005200620054b1b22064100480dfd010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc01200441017422062005200620054b1b22064100480dfc010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb01200441017422062005200620054b1b22064100480dfb010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa01200441017422062005200620054b1b22064100480dfa010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df901200441017422062005200620054b1b22064100480df9010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df801200441017422062005200620054b1b22064100480df8010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df501200441017422062005200620054b1b22064100480df5010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df401200441017422062005200620054b1b22064100480df4010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df301200441017422062005200620054b1b22064100480df3010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df001200441017422062005200620054b1b22064100480df0010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc01200441017422062005200620054b1b22064100480dfc010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb01200441017422062005200620054b1b22064100480dfb010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa01200441017422062005200620054b1b22064100480dfa010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df901200441017422062005200620054b1b22064100480df9010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df801200441017422062005200620054b1b22064100480df8010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df501200441017422062005200620054b1b22064100480df5010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df401200441017422062005200620054b1b22064100480df4010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df301200441017422062005200620054b1b22064100480df3010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411f3a000020012d00004109470df1010240200141046a280200220228020441ffffffff0371450d002002280200102a200128020421020b2002102a0cf1010b200641011037000b200641011037000b200841011037000b200841011037000b200841011037000b200841011037000b200841011037000b200841011037000b200641011037000b200641011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200641011037000b200a41011037000b200641011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200641011037000b200641011037000b200641011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b1031000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200841011037000b200841011037000b200841011037000b200741011037000b200641011037000b200841011037000b200441011037000b200741011037000b200441011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b1031000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b1031000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b1031000b20002004290200370200200041086a200441086a29020037020020012d00004109470d000240200141046a280200220228020441ffffffff0371450d002002280200102a200128020421020b2002102a0b200341106a24000bb60301057f2004410c6a2105200441086a2106024002400240034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d04200741017422092008200920084b1b22094100480d040240024020070d002009102821080c010b200428020420072009102c21080b2008450d022004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b024020022003460d002004410c6a2105200441086a2106034020022802002101034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d06200741017422092008200920084b1b22094100480d060240024020070d002009102821080c010b200428020420072009102c21080b2008450d052004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b200241046a22022003470d000b0b2000411f3a00000f0b200941011037000b200941011037000b1031000baf0301067f024002400240024020014107752203200141c00071220472452003417f4720044572460d002002410c6a2105200241086a2106034002400240200628020020052802002204460d00200228020421070c010b200441016a22072004490d05200441017422082007200820074b1b22084100480d050240024020040d002008102821070c010b200228020420042008102c21070b2007450d032002200736020420062008360200200528020021040b2005200441016a360200200720046a200141807f723a0000200341c000712104200321012003410775220721032007200472452007417f4720044572470d000b0b02400240200241086a2802002002410c6a2802002204460d00200228020421030c010b200441016a22032004490d03200441017422072003200720034b1b22074100480d030240024020040d002007102821030c010b200228020420042007102c21030b2003450d0220022003360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200320046a200141ff00713a00002000411f3a00000f0b200841011037000b200741011037000b1031000bb30302017e067f024002400240024020014207872203502001a7220441c00071452205712003427f52200572460d002002410c6a2106200241086a2107034002400240200728020020062802002205460d00200228020421080c010b200541016a22082005490d05200541017422092008200920084b1b22094100480d050240024020050d002009102821080c010b200228020420052009102c21080b2008450d032002200836020420072009360200200628020021050b2006200541016a360200200820056a200441807f723a00002003a72104200342078722012103200150200441c00071452205712001427f52200572470d000b0b02400240200241086a2802002002410c6a2802002205460d00200228020421080c010b200541016a22082005490d03200541017422062008200620084b1b22064100480d030240024020050d002006102821080c010b200228020420052006102c21080b2008450d0220022008360204200241086a20063602002002410c6a28020021050b2002410c6a200541016a360200200820056a200441ff00713a00002000411f3a00000f0b200941011037000b200641011037000b1031000be103010a7f230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a200110ee04024020022802184101470d002000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d000240200741046a220a280200220528020441ffffffff0371450d002005280200102a200a28020021050b2005102a0b200741106a2107200641706a22060d000b0b2008450d042009102a0c040b200220032900003703082002200429000037000f20022d0020210a2002200229000f37001f200220022903083703180240024020072008470d00200741016a220b2007490d032005200b2005200b4b1b220841ffffffff00712008470d032008410474220b4100480d030240024020070d00200b102821090c010b20092006200b102c21090b2009450d010b200920066a220b200a3a0000200b41016a2002290318370000200b41086a200229001f370000200541026a2105200641106a2106200741016a2107200a41ff01714106460d030c010b0b200b41081037000b1031000b20002009360204200041003602002000410c6a2007360200200041086a20083602000b200241306a24000b80b601020b7f017e230041f0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d02200320054f0d0120052003103c000b200241013a0048200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1033200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c640b2001280200220620046a2d000021072001410c6a2208200536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d0020070ec001b902b902010203b90200000000000405060708090a00000000000000000b0c000000000d0e0f101100000012131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901b9020b2000410b3a000420004101360200200041056a20073a00000cbc020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da302200620056a2c00002101200820093602004100210a0240200141004e0d00411921090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410221070cbf020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a1033200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbf020b4102210a410221070cba020b4103210a410221070cb9020b4101210a0b410221070cb7020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da302200620056a2c00002101200820093602004100210a0240200141004e0d00411921090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410321070cbe020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a1033200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbe020b4102210a410321070cb9020b4103210a410321070cb8020b4101210a0b410321070cb6020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da302200620056a2c00002101200820093602004100210a0240200141004e0d00411921090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410421070cbd020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a1033200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbd020b4102210a410421070cb8020b4103210a410421070cb7020b4101210a0b410421070cb5020b410621070cb4020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb8020b410721070cb3020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb7020b410821070cb2020b200241d8006a200110ef044104210a200228025822074101460da201200241e0006a280200210b41002106200228025c210c02400240200241e4006a280200220941027422050d00410021040c010b2005410275220441ffffffff03712004470dda01200441027422034100480dda0120031028220a450dd9010b02402009450d00200941027421032005417c6a2106200a2109200c2105034020092005280200360200200941046a2109200541046a21052003417c6a22030d000b200641027641016a21060b0240200b450d00200c102a0b20022d005c4105470db0022007450db00220022802640da3010cb0020b410a21070cb0020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb4020b410b21070caf020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22044f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b20014120490d01410d210120074110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb3020b0240024020032004460d00200441016a22012004490ddb01200320014f0d0120012003103c000b200241013a0048200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1033200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000cb3020b200620046a2d0000210520082001360200024020050d00410c21074100210a0caf020b200041163a000420004101360200200041056a20053a00000cb2020b410d21070cad020b410e21070cac020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddc012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb0020b410f21070cab020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddc012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000caf020b411021070caa020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddc012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cae020b411121070ca9020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddc012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cad020b411221070ca8020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddc012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cac020b411321070ca7020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddd01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000cab020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9c010b20032001460d9a012001417f460dd9012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9b010b200aad210d411421070ca6020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dde01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000caa020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9d010b20032001460d9b012001417f460dda012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9c010b200aad210d411521070ca5020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddf01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca9020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9e010b20032001460d9c012001417f460ddb012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9d010b200aad210d411621070ca4020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de001200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca8020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9f010b20032001460d9d012001417f460ddc012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9e010b200aad210d411721070ca3020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de101200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca7020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca0010b20032001460d9e012001417f460ddd012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9f010b200aad210d411821070ca2020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de201200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca6020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca1010b20032001460d9f012001417f460dde012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da0010b200aad210d411921070ca1020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de301200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca5020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca2010b20032001460da0012001417f460ddf012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da1010b200aad210d411a21070ca0020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de401200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca4020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca3010b20032001460da1012001417f460de0012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da2010b200aad210d411b21070c9f020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de501200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca3020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca4010b20032001460da2012001417f460de1012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da3010b200aad210d411c21070c9e020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de601200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca2020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca5010b20032001460da3012001417f460de2012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da4010b200aad210d411d21070c9d020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de701200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca1020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca6010b20032001460da4012001417f460de3012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da5010b200aad210d411e21070c9c020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de801200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca0020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca7010b20032001460da5012001417f460de4012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da6010b200aad210d411f21070c9b020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de901200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9f020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca8010b20032001460da6012001417f460de5012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b41202107024020054120490d00410d21012004410f4b0da7010b200aad210d0c9a020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dea01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9e020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca9010b20032001460da7012001417f460de6012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da8010b200aad210d412121070c99020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450deb01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9d020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caa010b20032001460da8012001417f460de7012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da9010b200aad210d412221070c98020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dec01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9c020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cab010b20032001460da9012001417f460de8012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daa010b200aad210d412321070c97020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ded01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9b020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cac010b20032001460daa012001417f460de9012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dab010b200aad210d412421070c96020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dee01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9a020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cad010b20032001460dab012001417f460dea012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dac010b200aad210d412521070c95020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450def01200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c99020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cae010b20032001460dac012001417f460deb012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dad010b200aad210d412621070c94020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df001200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c98020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caf010b20032001460dad012001417f460dec012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dae010b200aad210d412721070c93020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df101200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c97020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb0010b20032001460dae012001417f460ded012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daf010b200aad210d412821070c92020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df201200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c96020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb1010b20032001460daf012001417f460dee012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db0010b200aad210d412921070c91020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df301200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c95020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb2010b20032001460db0012001417f460def012003200141016a2207490d8f02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db1010b200aad210d412a21070c90020b0240024020032005460d00200441026a21012005417f460df001200320014f0d0120012003103c000b200241013a0048200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1033200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c94020b200620056a2d0000210920082001360200024020090d00412b21074100210a0c90020b200041153a000420004101360200200041056a20093a00000c93020b0240024020032005460d00200441026a21012005417f460df001200320014f0d0120012003103c000b200241013a0048200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1033200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c93020b200620056a2d0000210920082001360200024020090d00412c21074100210a0c8f020b200041153a000420004101360200200041056a20093a00000c92020b41002101410021090240024002400340410d210a2001411f4b0d010240024020032005460d002005417f460df4012003200541016a22074f0d01200541016a2003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a10334105210a0c020b200620056a2c0000210420082007360200200441ff00712001411f71742009722109200141076a21012007210520044100480d000b200441c00071210502402001411f4b0d0020050d020b0240024020014120490d0020050d010b200441ff01714108490d0320014120490d032005450d010c030b20044180017241ff017141f7014b0d020b2000200a36020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c93020b2009417f2001411f71747221090b412d21070c8d020b4200210d4100210102400240024002400340410e21072001413f4b0d010240024020032005460d002005417f460df5012003200541016a22094f0d01200541016a2003103c000b200241013a0008200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241086a360238200241286a200241d8006a10332002290328210d20022802302101410521070c030b200620056a2d0000210420082009360200200441ff0071220aad2001413f71ad86200d84210d200141076a210120092105200441187441187522094100480d000b200941c00071210502402001413f4b0d0020050d030b02400240200141c000490d0020050d010b200141c000490d0420090d010c040b200a41ff00460d030b0b200020073a0004200020022f00183b000520004101360200200041106a2001360200200041086a200d370200200041076a2002411a6a2d00003a00000c92020b200d427f2001413f71ad8684210d0b412e21070c8c020b02400240200320056b4104490d00200441056a21012005417b4b0df001200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a103320004281808080d000370300200041086a2002290228370200200041106a200241286a41086a2802003602000c90020b200620056a280000210920082001360200412f21070c8b020b02400240200320056b4108490d00200441096a2101200541774b0df001200320014f0d0120012003103c000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a10332002290328210d200041106a2002280230360200200041086a200d37020020004281808080d0003703000c8f020b200620056a290000210d20082001360200413021070c8a020b413121070c89020b413221070c88020b413321070c87020b413421070c86020b413521070c85020b413621070c84020b413721070c83020b413821070c82020b413921070c81020b413a21070c80020b413b21070cff010b413c21070cfe010b413d21070cfd010b413e21070cfc010b413f21070cfb010b41c00021070cfa010b41c10021070cf9010b41c20021070cf8010b41c30021070cf7010b41c40021070cf6010b41c50021070cf5010b41c60021070cf4010b41c70021070cf3010b41c80021070cf2010b41c90021070cf1010b41ca0021070cf0010b41cb0021070cef010b41cc0021070cee010b41cd0021070ced010b41ce0021070cec010b41cf0021070ceb010b41d00021070cea010b41d10021070ce9010b41d20021070ce8010b41d30021070ce7010b41d40021070ce6010b41d50021070ce5010b41d60021070ce4010b41d70021070ce3010b41d80021070ce2010b41d90021070ce1010b41da0021070ce0010b41db0021070cdf010b41dc0021070cde010b41dd0021070cdd010b41de0021070cdc010b41df0021070cdb010b41e00021070cda010b41e10021070cd9010b41e20021070cd8010b41e30021070cd7010b41e40021070cd6010b41e50021070cd5010b41e60021070cd4010b41e70021070cd3010b41e80021070cd2010b41e90021070cd1010b41ea0021070cd0010b41eb0021070ccf010b41ec0021070cce010b41ed0021070ccd010b41ee0021070ccc010b41ef0021070ccb010b41f00021070cca010b41f10021070cc9010b41f20021070cc8010b41f30021070cc7010b41f40021070cc6010b41f50021070cc5010b41f60021070cc4010b41f70021070cc3010b41f80021070cc2010b41f90021070cc1010b41fa0021070cc0010b41fb0021070cbf010b41fc0021070cbe010b41fd0021070cbd010b41fe0021070cbc010b41ff0021070cbb010b41800121070cba010b41810121070cb9010b41820121070cb8010b41830121070cb7010b41840121070cb6010b41850121070cb5010b41860121070cb4010b41870121070cb3010b41880121070cb2010b41890121070cb1010b418a0121070cb0010b418b0121070caf010b418c0121070cae010b418d0121070cad010b418e0121070cac010b418f0121070cab010b41900121070caa010b41910121070ca9010b41920121070ca8010b41930121070ca7010b41940121070ca6010b41950121070ca5010b41960121070ca4010b41970121070ca3010b41980121070ca2010b41990121070ca1010b419a0121070ca0010b419b0121070c9f010b419c0121070c9e010b419d0121070c9d010b419e0121070c9c010b419f0121070c9b010b41a00121070c9a010b41a10121070c99010b41a20121070c98010b41a30121070c97010b41a40121070c96010b41a50121070c95010b41a60121070c94010b41a70121070c93010b41a80121070c92010b41a90121070c91010b41aa0121070c90010b41ab0121070c8f010b200041013602002000200241d8006a41047222012902003702042000410c6a200141086a2902003702000c92010b2002280260102a0c8c010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c8f010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c8d010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c8b010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c89010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c87010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c85010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c83010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c81010b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7f0b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7d0b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7b0b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c790b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c770b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c750b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c730b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c710b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6f0b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6d0b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6b0b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c690b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c670b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c650b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c630b417f20051044000b417f20091044000b417f20091044000b417f20091044000b417f200541016a1044000b417f200541016a1044000b200341041037000b1031000b417f200541016a1044000b417f200541016a1044000b417f20011044000b417f200541016a1044000b417f200541016a1044000b417f200541016a1044000b417f200541016a1044000b417f200541016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f200141016a1044000b417f20011044000b417f20011044000b417f200541016a1044000b417f200541016a1044000b200520011044000b200520011044000b20092003103c000b20092003103c000b20092003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b200141016a2003103c000b02400240024002400240024020042006460d0020042006490d01024020060d00024020040d004104210a0c020b200a102a4104210a0c010b200a200441027420064102742209102c220a450d020b4100210941002104034002402009411f4d0d00410f21010c0a0b20012802082207200128020c2205460d08200541016a22032005490d0320072003490d04200128020020056a2d0000210520082003360200200541ff00712009411f71742004722104200941076a21092005418001710d000b20094120490d04410d21012005410f4b0d080c040b41dcfdc5001032000b200941041037000b417f20031044000b20032007103c000b410c10282209450d0120092004360208200920063602042009200a360200410921070b20004100360200200041106a200d3703002000410c6a2009360200200041096a200a3a0000200041086a20073a00000c030b410c41041037000b200241013a0018200241ec006a41013602002002420137025c200241a4e2c5003602582002412636023c2002200241386a3602682002200241186a360238200241286a200241d8006a1033410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a280200360200200641ffffffff0371450d00200a102a0b200241f0006a24000bd60703067f017e067f230041d0006b220224004100210341002104024002400240024002400240024002400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005103c000b200241013a0027200241cc006a41013602002002420137023c200241a4e2c5003602382002412636021c2002200241186a3602482002200241276a360218200241286a200241386a1033410521030c020b200128020020066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b200241086a41086a200241286a41086a280200220136020020022002290228220837030820002003360204200041086a2008370200200041106a2001360200200041013602000c0a0b20024100360210200242043703082004450d0841042109410021034100210a03402003210b200a220c41016a210a410021034100210503402003411f4b0d04024002402001280208220d200128020c2206460d00200641016a22072006490d05200d20074f0d012007200d103c000b2002200b36020c2002200c360210200241013a0027200241cc006a41013602002002420137023c200241a4e2c5003602382002412636021c2002200241186a3602482002200241276a360218200241286a200241386a103320022802282103200228022c2106200228023021074100210e410521010c090b200128020020066a2d000021062001200736020c200641ff00712003411f71742005722105200341076a21032006418001710d000b024020034120490d002006410f4d0d002002200b36020c2002200c360210410d21010c070b02400240200c200b460d00200b2103200c210b0c010b200b41016a2203200b490d06200b41017422062003200620034b1b220341ffffffff03712003470d06200341027422064100480d0602400240200b0d002006102821090c010b2009200b4102742006102c21090b2009450d05200220093602080b2005410876210e2009200b4102746a2005360200200a2004460d080c000b0b417f20071044000b417f20071044000b2002200b36020c2002200c360210410f21010c020b200641041037000b1031000b0b20004101360200200041106a20073602002000410c6a2006360200200041086a20033602002000200e410874200172360204200b450d022009102a0c020b2002200336020c2002200a3602100b20002002290308370204200041003602002000410c6a200241106a2802003602000b200241d0006a24000bcbd60202097f017e230041106b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df501200441017422082005200820054b1b22084100480df5010240024020040d002008102821050c010b200628020020042008102c21050b2005450dad0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df501200441017422082005200820054b1b22084100480df5010240024020040d002008102821050c010b200628020020042008102c21050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df401200441017422082005200820054b1b22084100480df4010240024020040d002008102821050c010b200628020020042008102c21050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df401200441017422082005200820054b1b22084100480df4010240024020040d002008102821050c010b200628020020042008102c21050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df301200441017422082005200820054b1b22084100480df3010240024020040d002008102821050c010b200628020020042008102c21050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df301200441017422082005200820054b1b22084100480df3010240024020040d002008102821050c010b200628020020042008102c21050b2005450db00120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490df001200441017422072006200720064b1b22074100480df0010240024020040d002007102821060c010b200928020020042007102c21060b2006450db00120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df1012004410174220a2006200a20064b1b220a4100480df1010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490def01200441017422072006200720064b1b22074100480def010240024020040d002007102821060c010b200928020020042007102c21060b2006450db10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df0012004410174220a2006200a20064b1b220a4100480df0010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210902400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490dee01200441017422062005200620054b1b22064100480dee010240024020040d002006102821050c010b200928020020042006102c21050b2005450db20120022005360204200241086a20063602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a410e3a0000200320012802042204280204220520042802002204200420054102746a200210ea042003210420032d0000411f470d930320012802042802082105200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490def012004410174220a2006200a20064b1b220a4100480def010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db401200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca3010b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490ded01200441017422062005200620054b1b22064100480ded010240024020040d002006102821050c010b200228020420042006102c21050b2005450db30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490dec01200441017422072006200720064b1b22074100480dec010240024020040d002007102821060c010b200928020020042007102c21060b2006450db30120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490ded012004410174220a2006200a20064b1b220a4100480ded010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490deb01200441017422072006200720064b1b22074100480deb010240024020040d002007102821060c010b200928020020042007102c21060b2006450db40120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490dec012004410174220a2006200a20064b1b220a4100480dec010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490deb01200441017422062005200620054b1b22064100480deb010240024020040d002006102821050c010b200928020020042006102c21050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dea01200441017422062005200620054b1b22064100480dea010240024020040d002006102821050c010b200228020420042006102c21050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490de901200441017422062005200620054b1b22064100480de9010240024020040d002006102821050c010b200228020420042006102c21050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de801200441017422072006200720064b1b22074100480de8010240024020040d002007102821060c010b200928020020042007102c21060b2006450db60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de9012004410174220a2006200a20064b1b220a4100480de9010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db801200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de701200441017422072006200720064b1b22074100480de7010240024020040d002007102821060c010b200928020020042007102c21060b2006450db70120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de8012004410174220a2006200a20064b1b220a4100480de8010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450db901200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de601200441017422072006200720064b1b22074100480de6010240024020040d002007102821060c010b200928020020042007102c21060b2006450db80120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de7012004410174220a2006200a20064b1b220a4100480de7010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450dba01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de501200441017422072006200720064b1b22074100480de5010240024020040d002007102821060c010b200928020020042007102c21060b2006450db90120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de6012004410174220a2006200a20064b1b220a4100480de6010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450dbb01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de401200441017422072006200720064b1b22074100480de4010240024020040d002007102821060c010b200928020020042007102c21060b2006450dba0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de5012004410174220a2006200a20064b1b220a4100480de5010240024020040d00200a102821060c010b20092802002004200a102c21060b2006450dbc01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de301200441017422082007200820074b1b22084100480de3010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dbb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de4012004410174220b2007200b20074b1b220b4100480de4010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dbd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de401200441017422092006200920064b1b22094100480de4010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dbe012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de201200441017422082007200820074b1b22084100480de2010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dbd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de3012004410174220b2007200b20074b1b220b4100480de3010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dbf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de301200441017422092006200920064b1b22094100480de3010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de101200441017422082007200820074b1b22084100480de1010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dbf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de2012004410174220b2007200b20074b1b220b4100480de2010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de201200441017422092006200920064b1b22094100480de2010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de001200441017422082007200820074b1b22084100480de0010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de1012004410174220b2007200b20074b1b220b4100480de1010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de101200441017422092006200920064b1b22094100480de1010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddf01200441017422082007200820074b1b22084100480ddf010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de0012004410174220b2007200b20074b1b220b4100480de0010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de001200441017422092006200920064b1b22094100480de0010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dde01200441017422082007200820074b1b22084100480dde010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddf012004410174220b2007200b20074b1b220b4100480ddf010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddf01200441017422092006200920064b1b22094100480ddf010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dc8012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c93010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddd01200441017422082007200820074b1b22084100480ddd010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc70120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dde012004410174220b2007200b20074b1b220b4100480dde010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dc901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dde01200441017422092006200920064b1b22094100480dde010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dca012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddc01200441017422082007200820074b1b22084100480ddc010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dc90120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddd012004410174220b2007200b20074b1b220b4100480ddd010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dcb01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddd01200441017422092006200920064b1b22094100480ddd010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dcc012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddb01200441017422082007200820074b1b22084100480ddb010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dcb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddc012004410174220b2007200b20074b1b220b4100480ddc010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dcd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddc01200441017422092006200920064b1b22094100480ddc010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dce012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dda01200441017422082007200820074b1b22084100480dda010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dcd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddb012004410174220b2007200b20074b1b220b4100480ddb010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dcf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddb01200441017422092006200920064b1b22094100480ddb010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8f010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd901200441017422082007200820074b1b22084100480dd9010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dcf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dda012004410174220b2007200b20074b1b220b4100480dda010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dda01200441017422092006200920064b1b22094100480dda010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd801200441017422082007200820074b1b22084100480dd8010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd9012004410174220b2007200b20074b1b220b4100480dd9010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd901200441017422092006200920064b1b22094100480dd9010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd701200441017422082007200820074b1b22084100480dd7010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd8012004410174220b2007200b20074b1b220b4100480dd8010240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd801200441017422092006200920064b1b22094100480dd8010240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd601200441017422082007200820074b1b22084100480dd6010240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da3022004410174220b2007200b20074b1b220b4100480da3020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dd801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da302200441017422092006200920064b1b22094100480da3020240024020040d002009102821060c010b200a28020020042009102c21060b2006450dd9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da102200441017422082007200820074b1b22084100480da1020240024020040d002008102821070c010b200a28020020042008102c21070b2007450dd80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da2022004410174220b2007200b20074b1b220b4100480da2020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dda01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da202200441017422092006200920064b1b22094100480da2020240024020040d002009102821060c010b200a28020020042009102c21060b2006450ddb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da002200441017422082007200820074b1b22084100480da0020240024020040d002008102821070c010b200a28020020042008102c21070b2007450dda0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da1022004410174220b2007200b20074b1b220b4100480da1020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450ddc01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da102200441017422092006200920064b1b22094100480da1020240024020040d002009102821060c010b200a28020020042009102c21060b2006450ddd012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9f02200441017422082007200820074b1b22084100480d9f020240024020040d002008102821070c010b200a28020020042008102c21070b2007450ddc0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da0022004410174220b2007200b20074b1b220b4100480da0020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dde01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da002200441017422092006200920064b1b22094100480da0020240024020040d002009102821060c010b200a28020020042009102c21060b2006450ddf012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9e02200441017422082007200820074b1b22084100480d9e020240024020040d002008102821070c010b200a28020020042008102c21070b2007450dde0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9f022004410174220b2007200b20074b1b220b4100480d9f020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9f02200441017422092006200920064b1b22094100480d9f020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de1012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c87010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9d02200441017422082007200820074b1b22084100480d9d020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de00120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9e022004410174220b2007200b20074b1b220b4100480d9e020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9e02200441017422092006200920064b1b22094100480d9e020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de3012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9c02200441017422082007200820074b1b22084100480d9c020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de20120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9d022004410174220b2007200b20074b1b220b4100480d9d020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9d02200441017422092006200920064b1b22094100480d9d020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de5012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9b02200441017422082007200820074b1b22084100480d9b020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de40120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9c022004410174220b2007200b20074b1b220b4100480d9c020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9c02200441017422092005200920054b1b22094100480d9c020240024020040d002009102821050c010b200a28020020042009102c21050b2005450de7012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a02200441017422082007200820074b1b22084100480d9a020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de60120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b022004410174220b2007200b20074b1b220b4100480d9b020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450de801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b02200441017422092006200920064b1b22094100480d9b020240024020040d002009102821060c010b200a28020020042009102c21060b2006450de9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9902200441017422082007200820074b1b22084100480d99020240024020040d002008102821070c010b200a28020020042008102c21070b2007450de80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a022004410174220b2007200b20074b1b220b4100480d9a020240024020040d00200b102821070c010b200a2802002004200b102c21070b2007450dea01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a02200441017422092006200920064b1b22094100480d9a020240024020040d002009102821060c010b200a28020020042009102c21060b2006450deb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9802200441017422082005200820054b1b22084100480d98020240024020040d002008102821050c010b200628020020042008102c21050b2005450dea0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d9802200441017422082005200820054b1b22084100480d98020240024020040d002008102821050c010b200628020020042008102c21050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9702200441017422082005200820054b1b22084100480d97020240024020040d002008102821050c010b200628020020042008102c21050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d9702200441017422082005200820054b1b22084100480d97020240024020040d002008102821050c010b200628020020042008102c21050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9602200441017422072005200720054b1b22074100480d96020240024020040d002007102821050c010b200228020420042007102c21050b2005450dec0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210eb042003210420032d0000411f470def020c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9502200441017422062005200620054b1b22064100480d95020240024020040d002006102821050c010b200228020420042006102c21050b2005450dec0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c200210ec042003210420032d0000411f470dee020c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9402200441017422082005200820054b1b22084100480d94020240024020040d002008102821050c010b200628020020042008102c21050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d9402200541017422042008200420084b1b22044100480d94020240024020050d002004102821050c010b200628020020052004102c21050b2005450ded0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d9302200441017422072005200720054b1b22074100480d93020240024020040d002007102821050c010b200628020020042007102c21050b2005450ded0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d9302200541017422042007200420074b1b22044100480d93020240024020050d002004102821050c010b200628020020052004102c21050b2005450dee0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9202200441017422062005200620054b1b22064100480d92020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9102200441017422062005200620054b1b22064100480d91020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9002200441017422062005200620054b1b22064100480d90020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f02200441017422062005200620054b1b22064100480d8f020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e02200441017422062005200620054b1b22064100480d8e020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d02200441017422062005200620054b1b22064100480d8d020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c02200441017422062005200620054b1b22064100480d8c020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b02200441017422062005200620054b1b22064100480d8b020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a02200441017422062005200620054b1b22064100480d8a020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8902200441017422062005200620054b1b22064100480d89020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8802200441017422062005200620054b1b22064100480d88020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8702200441017422062005200620054b1b22064100480d87020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8602200441017422062005200620054b1b22064100480d86020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8502200441017422062005200620054b1b22064100480d85020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8402200441017422062005200620054b1b22064100480d84020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8302200441017422062005200620054b1b22064100480d83020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8202200441017422062005200620054b1b22064100480d82020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8102200441017422062005200620054b1b22064100480d81020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8002200441017422062005200620054b1b22064100480d80020240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff01200441017422062005200620054b1b22064100480dff010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe01200441017422062005200620054b1b22064100480dfe010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd01200441017422062005200620054b1b22064100480dfd010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc01200441017422062005200620054b1b22064100480dfc010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb01200441017422062005200620054b1b22064100480dfb010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa01200441017422062005200620054b1b22064100480dfa010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df901200441017422062005200620054b1b22064100480df9010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df801200441017422062005200620054b1b22064100480df8010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df501200441017422062005200620054b1b22064100480df5010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df401200441017422062005200620054b1b22064100480df4010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df301200441017422062005200620054b1b22064100480df3010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df001200441017422062005200620054b1b22064100480df0010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490def01200441017422062005200620054b1b22064100480def010240024020040d002006102821050c010b200228020420042006102c21050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dba02200441017422062005200620054b1b22064100480dba020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db902200441017422062005200620054b1b22064100480db9020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db802200441017422062005200620054b1b22064100480db8020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db702200441017422062005200620054b1b22064100480db7020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db602200441017422062005200620054b1b22064100480db6020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db502200441017422062005200620054b1b22064100480db5020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db402200441017422062005200620054b1b22064100480db4020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db302200441017422062005200620054b1b22064100480db3020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db202200441017422062005200620054b1b22064100480db2020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db102200441017422062005200620054b1b22064100480db1020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db002200441017422062005200620054b1b22064100480db0020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daf02200441017422062005200620054b1b22064100480daf020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae02200441017422062005200620054b1b22064100480dae020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad02200441017422062005200620054b1b22064100480dad020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dac02200441017422062005200620054b1b22064100480dac020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dab02200441017422062005200620054b1b22064100480dab020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daa02200441017422062005200620054b1b22064100480daa020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da902200441017422062005200620054b1b22064100480da9020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da802200441017422062005200620054b1b22064100480da8020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da702200441017422062005200620054b1b22064100480da7020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da602200441017422062005200620054b1b22064100480da6020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da502200441017422062005200620054b1b22064100480da5020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da402200441017422062005200620054b1b22064100480da4020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da302200441017422062005200620054b1b22064100480da3020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da202200441017422062005200620054b1b22064100480da2020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da102200441017422062005200620054b1b22064100480da1020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da002200441017422062005200620054b1b22064100480da0020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9f02200441017422062005200620054b1b22064100480d9f020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9e02200441017422062005200620054b1b22064100480d9e020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9d02200441017422062005200620054b1b22064100480d9d020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9c02200441017422062005200620054b1b22064100480d9c020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9b02200441017422062005200620054b1b22064100480d9b020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9a02200441017422062005200620054b1b22064100480d9a020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9902200441017422062005200620054b1b22064100480d99020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9802200441017422062005200620054b1b22064100480d98020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9702200441017422062005200620054b1b22064100480d97020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9602200441017422062005200620054b1b22064100480d96020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9502200441017422062005200620054b1b22064100480d95020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9402200441017422062005200620054b1b22064100480d94020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9302200441017422062005200620054b1b22064100480d93020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9202200441017422062005200620054b1b22064100480d92020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9102200441017422062005200620054b1b22064100480d91020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9002200441017422062005200620054b1b22064100480d90020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f02200441017422062005200620054b1b22064100480d8f020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e02200441017422062005200620054b1b22064100480d8e020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d02200441017422062005200620054b1b22064100480d8d020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c02200441017422062005200620054b1b22064100480d8c020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b02200441017422062005200620054b1b22064100480d8b020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a02200441017422062005200620054b1b22064100480d8a020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8902200441017422062005200620054b1b22064100480d89020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8802200441017422062005200620054b1b22064100480d88020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8702200441017422062005200620054b1b22064100480d87020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8602200441017422062005200620054b1b22064100480d86020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8502200441017422062005200620054b1b22064100480d85020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8402200441017422062005200620054b1b22064100480d84020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8302200441017422062005200620054b1b22064100480d83020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8202200441017422062005200620054b1b22064100480d82020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8102200441017422062005200620054b1b22064100480d81020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8002200441017422062005200620054b1b22064100480d80020240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff01200441017422062005200620054b1b22064100480dff010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe01200441017422062005200620054b1b22064100480dfe010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd01200441017422062005200620054b1b22064100480dfd010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc01200441017422062005200620054b1b22064100480dfc010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb01200441017422062005200620054b1b22064100480dfb010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa01200441017422062005200620054b1b22064100480dfa010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df901200441017422062005200620054b1b22064100480df9010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df801200441017422062005200620054b1b22064100480df8010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df501200441017422062005200620054b1b22064100480df5010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df401200441017422062005200620054b1b22064100480df4010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df301200441017422062005200620054b1b22064100480df3010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df001200441017422062005200620054b1b22064100480df0010240024020040d002006102821050c010b200228020420042006102c21050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc01200441017422062005200620054b1b22064100480dfc010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb01200441017422062005200620054b1b22064100480dfb010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa01200441017422062005200620054b1b22064100480dfa010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df901200441017422062005200620054b1b22064100480df9010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df801200441017422062005200620054b1b22064100480df8010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df701200441017422062005200620054b1b22064100480df7010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df601200441017422062005200620054b1b22064100480df6010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df501200441017422062005200620054b1b22064100480df5010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df401200441017422062005200620054b1b22064100480df4010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df301200441017422062005200620054b1b22064100480df3010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df201200441017422062005200620054b1b22064100480df2010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df101200441017422062005200620054b1b22064100480df1010240024020040d002006102821050c010b200228020420042006102c21050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411f3a000020012d00004109470df1010240200141046a280200220228020441ffffffff0371450d002002280200102a200128020421020b2002102a0cf1010b200641011037000b200641011037000b200841011037000b200841011037000b200841011037000b200841011037000b200841011037000b200841011037000b200641011037000b200641011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200641011037000b200a41011037000b200641011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200641011037000b200641011037000b200641011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200741011037000b200a41011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b1031000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200b41011037000b200941011037000b200841011037000b200841011037000b200841011037000b200841011037000b200741011037000b200641011037000b200841011037000b200441011037000b200741011037000b200441011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b1031000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b1031000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b200641011037000b1031000b20002004290200370200200041086a200441086a29020037020020012d00004109470d000240200141046a280200220228020441ffffffff0371450d002002280200102a200128020421020b2002102a0b200341106a24000bfb07030e7f017e017f200241086a2103200241046a210420012802002205210602400240024002400240034002400240200428020020032802002207460d00200228020021080c010b200741016a22082007490d02200741017422092008200920084b1b22094100480d020240024020070d002009102821080c010b200228020020072009102c21080b2008450d032002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a21072006450d03200a21072005450d03200b41746a210d200241086a210841002107200a210e02400340200e2103024003402003280200220f0d01200741016a2107200b2003410c6a2203470d000c080b0b2003410c6a210e200741016a21102005417f6a2105200341046a290200211102400240034002400240200241046a220428020020082802002206460d00200228020021090c010b200641016a22092006490d06200641017422012009200120094b1b22014100480d060240024020060d002001102821090c010b200228020020062001102c21090b2009450d022002200936020020042001360200200828020021060b2008200641016a360200200920066a200741807f72200741ff0071200741077622061b3a0000200621072006450d020c000b0b200141011037000b2011422088a7221221060240034002400240200428020020082802002207460d00200228020021090c010b200741016a22092007490d05200741017422012009200120094b1b22014100480d050240024020070d002001102821090c010b200228020020072001102c21090b2009450d022002200936020020042001360200200828020021070b2008200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b0240024020042802002206200828020022076b2012490d00200228020021060c010b200720126a22092007490d04200641017422072009200720094b1b22074100480d040240024020060d002007102821060c010b200228020020062007102c21060b2006450d032002200636020020042007360200200828020021070b2008200720126a360200200620076a200f2012109a051a02402011a7450d00200f102a0b200d2003460d052010210720050d010c050b0b200141011037000b200741011037000b1031000b200941011037000b2003410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d002006102a0b2007410c6a2207200b470d000b0b0240200c450d00200a102a0b2000411f3a00000bcb0401067f200441046a2105024002400240024002400240200441086a2802002004410c6a2802002206460d00200528020021070c010b200641016a22072006490d04200641017422082007200820074b1b22084100480d040240024020060d002008102821070c010b200528020020062008102c21070b2007450d0120042007360204200441086a20083602002004410c6a28020021060b2004410c6a2208200641016a360200200720066a20024101463a0000200441086a2109034002400240200928020020082802002206460d00200528020021070c010b200641016a22072006490d052006410174220a2007200a20074b1b220a4100480d050240024020060d00200a102821070c010b20052802002006200a102c21070b2007450d03200420073602042009200a360200200828020021060b2008200641016a360200200720066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2107200441086a2108034002400240200828020020072802002206460d00200528020021010c010b200641016a22012006490d06200641017422092001200920014b1b22094100480d060240024020060d002009102821010c010b200528020020062009102c21010b2001450d052004200136020420082009360200200728020021060b2007200641016a360200200120066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411f3a00000f0b200841011037000b200a41011037000b200941011037000b1031000bb007010a7f230041d0006b2202240002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d02200320054f0d0120052003103c000b200241013a001f200241cc006a41013602002002420137023c200241a4e2c500360238200241263602342002200241306a36024820022002411f6a360230200241206a200241386a10332002411b6a200241286a28020036000020022002290320370013200220022900103703002002200241176a290000370007200041053a0004200020022903003700052000410c6a2002290007370000200041013602000c040b2001280200220620046a2d000021072001200536020c024020074102490d00200041173a000420004101360200200041056a20073a00000c040b410120036b2108200441026a2104410021054100210902400240034002402005411f4d0d00410f21050c020b02400240200820046a4102460d002004450d06200320044f0d0120042003103c000b200241013a0000200241cc006a41013602002002420137023c200241a4e2c500360238200241263602342002200241306a36024820022002360230200241106a200241386a1033410521050c020b200620046a417f6a2d0000210a2001200436020c200a41ff00712005411f71742009722109200441016a2104200541076a2105200a418001710d000b20054120490d01410d2105200a4110490d010b2000200536020420004101360200200041086a2002290210370200200041106a200241106a41086a2802003602000c040b4100210502402007410171450d002004417f6a2104410021054100210b02400240034002402005411f4d0d00410f21040c020b0240024020032004460d002004417f460d082003200441016a22084f0d01200441016a2003103c000b200241013a0000200241cc006a41013602002002420137023c200241a4e2c500360238200241263602342002200241306a36024820022002360230200241106a200241386a1033410521040c020b200620046a2d0000210a2001200836020c200a41ff00712005411f7174200b72210b200541076a210520082104200a418001710d000b20054120490d01410d2104200a4110490d010b2000200436020420004101360200200041086a2002290210370200200041106a200241106a41086a2802003602000c050b410121050b20002009360204200041003602002000410c6a200b360200200041086a20053602000c030b417f20051044000b417f20041044000b417f200441016a1044000b200241d0006a24000bee0201067f230041c0006b2202240041002103410021040240024003400240024002402003411f4b0d002001280204220520012802082206460d01200641016a22072006490d04200520074f0d0220072005103c000b200041013602002000410f3a00040c040b200241013a000f200241346a410136020020024201370224200241a4e2c5003602202002412636023c2002200241386a36023020022002410f6a360238200241106a200241206a10332002410b6a200241186a28020036000020022002290310370003200041053a0004200020022900003700052000410c6a200241076a290000370000200041013602000c030b200128020020066a2d0000210620012007360208200641ff00712003411f71742004722104200341076a21032006418001710d000b0240024020034120490d002006410f4b0d010b20004100360200200020043602040c020b200041013602002000410d3a00040c010b417f20071044000b200241c0006a24000bd806010a7f20012802042103200128020021044100210541002106410021074101210820012802082209210a02400240024002400340024020062007470d002005200641016a220b2005200b4b1b22074100480d050240024020060d002007102821080c010b200820062007102c21080b2008450d020b200820066a200a41807f72200a41ff0071200a410776220b1b3a0000200541026a2105200641016a2106200b210a200b0d000b0240200720066b20094f0d00200620096a220a2006490d0420074101742205200a2005200a4b1b220a4100480d040240024020070d00200a102821080c010b20082007200a102c21080b2008450d02200a21070b200820066a20042009109a051a02402003450d002004102a0b200128020c210c0240200720096b20066b200141146a280200220a490d002009200a6a20066a21030c030b200920066a2205200a6a22032005490d03200741017422052003200520034b1b22054100480d030240024020070d002005102821080c010b200820072005102c21080b02402008450d00200521070c030b200541011037000b200741011037000b200a41011037000b200820096a20066a200c200a109a051a200241086a210b200241046a21092003210a024002400340024002402009280200200b2802002206460d00200228020021050c010b200641016a22052006490d04200641017422042005200420054b1b22044100480d040240024020060d002004102821050c010b200228020020062004102c21050b2005450d022002200536020020092004360200200b28020021060b200b200641016a360200200520066a200a41807f72200a41ff0071200a41077622061b3a00002006210a20060d000b02400240200241046a280200220a200241086a28020022066b2003490d002002280200210a0c010b200620036a22052006490d03200a41017422062005200620054b1b22064100480d0302400240200a0d0020061028210a0c010b2002280200200a2006102c210a0b200a450d022002200a360200200241046a2006360200200241086a28020021060b200241086a200620036a360200200a20066a20082003109a051a02402007450d002008102a0b2000411f3a00000240200141106a280200450d00200c102a0b0f0b200441011037000b200641011037000b1031000bf20103027f017e057f024020002802082201200028020c460d00034020002001411c6a36020820012802102202450d01200141146a2902002103024020012802042204450d00200141086a280200210502402001410c6a2802002201450d0020014104742106200421010340024020012d00004109470d000240200141046a2207280200220828020441ffffffff0371450d002008280200102a200728020021080b2008102a0b200141106a2101200641706a22060d000b0b2005450d002004102a0b02402003a7450d002002102a0b20002802082201200028020c470d000b0b02402000280204450d002000280200102a0b0be50101067f024020002802082201200028020c460d0003402000200141186a36020820012802002202450d01200141146a2802002103200141106a2802002104200128020c210502402001280204450d002002102a0b02402003450d0020034104742103200521010340024020012d00004109470d000240200141046a2206280200220228020441ffffffff0371450d002002280200102a200628020021020b2002102a0b200141106a2101200341706a22030d000b0b02402004450d002005102a0b20002802082201200028020c470d000b0b02402000280204450d002000280200102a0b0bf20103027f017e057f024020002802082201200028020c460d00034020002001411c6a36020820012802102202450d01200141146a2902002103024020012802042204450d00200141086a280200210502402001410c6a2802002201450d0020014104742106200421010340024020012d00004109470d000240200141046a2207280200220828020441ffffffff0371450d002008280200102a200728020021080b2008102a0b200141106a2101200641706a22060d000b0b2005450d002004102a0b02402003a7450d002002102a0b20002802082201200028020c470d000b0b02402000280204450d002000280200102a0b0bce0101057f024020002802082201450d00200028020022022001411c6c6a21030340024020022802042200450d0002402002410c6a2802002201450d00200141047421010340024020002d00004109470d000240200041046a2204280200220528020441ffffffff0371450d002005280200102a200428020021050b2005102a0b200041106a2100200141706a22010d000b0b200241086a280200450d002002280204102a0b2002411c6a21000240200241146a280200450d002002280210102a0b2000210220002003470d000b0b0b90d20106067f017e057f017e117f027e2300419081046b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280204220320012802082204460d00200441016a22052004490d02200320054f0d0120052003103c000b200241013a0030200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103320022802f88004210420022802fc8004210120004101360200200041003a00042001450d2b2004102a0c2b0b200128020020046a2d00002104200120053602082004410c4b0d03024002400240024020040e0d0001161514131211060d0c0b05000b200241e8006a200110f40441012106200228026c2107024020022802684101470d0020074108762101200241f8006a2802002104200241e8006a41086a29030021080c270b41002109200241e8006a4100418080011099051a410021034100210a2007450d20410021054100210a410121064100210b0340024002402001280204220c200128020822036b2007200b6b220441808001200441808001491b2204490d00200320046a220d2003490d05200c200d4f0d01200d200c103c000b200241013a00e880042002418c81046a4101360200200242013702fc8004200241a4e2c5003602f880042002412636021c2002200241186a36028881042002200241e880046a360218200241306a200241f880046a10332002290330210820022802382104410521070240200a450d002006102a0b0c280b200241e8006a200128020020036a2004109a051a2001200d36020802400240200a20056b2004490d00200520046a21030c010b200520046a22032005490d23200a410174220d2003200d20034b1b220d4100480d2302400240200a0d00200d102821060c010b2006200a200d102c21060b2006450d03200d210a0b200620056a200241e8006a2004109a051a2003210520072004200b6a220b4b0d000c210b0b200241e8006a200110fb04024020022802684101470d00200228026c22044108762105200241e8006a41086a2903002208422088210e200241f8006a28020021030c1f0b200241fc006a280200210f200241f8006a2802002101200241f4006a2802002103200241f0006a2802002110200228026c210b4100210441002109024002400240034002402004411f4d0d00410f21040c020b0240024020032001460d002001417f460d052003200141016a22054f0d01200141016a2003103c000b200241013a0030200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241c8006a200241e8006a1033410521040c020b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200521012006418001710d000b20044120490d01410d210420064110490d010b200241f880046a41086a200241c8006a41086a28020022033602002002200229034822083703f880042008422088a721092008a721060c1f0b200241003602602002420437035802400240024020090d00410421010c010b410020036b2111200b41026a2112410120036b21134100210a410421014100211441002115410021160340201621170240024020032005460d000240200541016a22042005490d000240024020032004490d000240200b20056a2d0000220441e000460d00411821050c250b201741016a211641022118200541026a210441002106410321192012211a4100211b024002400340201a21072019210c2018210d02402006411f4d0d00410f21050c020b02400240201320046a4102460d002004450d06200320044f0d0120042003103c000b200241013a00302002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1033200241206a41086a200241f880046a41086a280200360200200220022903f88004370320410521050c020b200b20046a417f6a2d0000221c41ff00712006411f7174201b72211b200d41016a2118200c41016a2119200741016a211a200441016a2104200641076a2106201c418001710d000b20064120490d01201c4110490d01410d21050b200241e880046a41086a200241206a41086a28020022033602002002200229032022083703e880042008a721064100210420022802ec800421090c240b41002118200241003602382002420137033002400240201b0d002004417f6a21064101211c4100211a4100211d0c010b201120056a211e410021194101211c4100211a034002400240024002400240201e200d6a450d002005200c6a2204450d02200320044f0d0120042003103c000b200220193602342002201a3602382002201c360230200241013a00e880042002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103320022802f88004210620022802fc80042109200228028081042103410521050c280b200720056a2c000022044100480d0102400240200441c00071450d00200441807f72220441ff017141fb014b0d010b200220193602342002201a3602382002201c360230410621050c270b0240201a2019460d002019211d201a21060c030b201941016a22062019490d2e2019410174221d2006201d20064b1b221d4100480d2e0240024020190d00201d1028211c0c010b201c2019201d102c211c0b0240201c450d0020192106201d21190c030b201d41011037000b417f20041044000b200220193602342002201a3602382002201c360230411921050c240b201c20066a2004417f733a0000200d41016a210d200c41016a210c200741016a2107201b201a41016a221a470d000b2002201d3602342002201a3602382002201c3602302005200d6a21060b201c411076411074221b201c41087641ff0171410874221972201c41ff0171221c72210c4100210d024003404100210402402018411f4d0d00410f21050c230b0240024020032006460d002006417f460d032003200641016a22054f0d01200641016a2003103c000b200241013a00302002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103320022802f88004210620022802fc8004210920022d00808104210320022d00818104210720022f01828104210d410521050c230b200b20066a2d0000220741ff00712018411f7174200d72210d201841076a2118200521062007418001710d000b20184120490d052007410f4d0d05410d21050c210b417f200641016a1044000b20042003103c000b417f20041044000b417f20041044000b200241013a00302002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103320022802f88004210620022802fc8004210920022d00808104210320022d00818104210720022f01828104210d410521050c200b0240200d41014d0d004104210541e885c6002106412421090c1b0b024002400240200d0e020001000b410421060c010b20032005460d1a024002400240200541016a220d2005490d002003200d490d010240200b20056a2c0000220441004e0d00411921050c200b41062105200441c00071450d02200441807f72220441ff017141fb014d0d022004417f732106200d21050c030b417f200541016a1044000b200541016a2003103c000b0c1c0b024020172015470d00024020142015460d00201421150c010b201441016a22042014490d252014410174220d2004200d20044b1b221541ffffffff00712015470d25201541047422044100480d250240024020140d002004102821010c010b200120144104742004102c21010b2001450d032002201536025c20022001360258201521140b200120174104746a2204201f4180807c71200641ff01714108747241e00072221f36020c2004201a3602082004201d36020420042019201c72201b72360200200a41106a210a2002201636026020162009470d000b0b2005200f462104200229025c2208422088210e02402010450d00200b102a0b200ea721052008a721092004450d1e2005ad4220862009ad842108410221030c2a0b200441041037000b417f200141016a1044000b200d41011037000b2003200d1044000b417f20051044000b200241e8006a200110fb04024020022802684101470d00200041013602002000200241e8006a41047222012902003702042000410c6a200141086a2902003702000c290b200241fc006a280200210d200241f8006a2802002104200241f4006a2802002105200241f0006a280200210a200228026c210b410021034100210102400240034002402003411f4d0d00410f21040c080b20052004460d062004417f460d012005200441016a2206490d02200b20046a2d0000220941ff00712003411f71742001722101200341076a2103200621042009418001710d000b20034120490d04410d21042009410f4b0d060c040b417f200441016a1044000b200441016a2005103c000b200241e8006a200110fb04024020022802684101470d00200041013602002000200241e8006a41047222012902003702042000410c6a200141086a2902003702000c280b200241fc006a280200210d200241f8006a2802002104200241f4006a2802002105200241f0006a280200210a200228026c210b410021034100210102400240034002402003411f4d0d00410f21040c0d0b20052004460d0b2004417f460d012005200441016a2206490d02200b20046a2d0000220941ff00712003411f71742001722101200341076a2103200621042009418001710d000b20034120490d09410d21042009410f4b0d0b0c090b417f200441016a1044000b200441016a2005103c000b200041123a000420004101360200200041056a20043a00000c260b200d20064621040240200a450d00200b102a0b02402004450d00410b21030c220b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a10332002418381046a200241386a280200360000200220022903303700fb8004200041053a0004200020022900f880043700052000410c6a200241ff80046a290000370000200041013602000c250b200241013a0030200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1033410521040b2000200436020420004101360200200041086a20022902f88004370200200041106a200241f880046a41086a280200360200200a450d23200b102a0c230b200241e8006a200110fb040240024020022802684101470d00200228026c22014108762106200241e8006a41086a2903002208422088210e200241f8006a280200210b0c010b200241c0006a200241fc006a280200360200200241386a200241f4006a2902003703002002200229026c37033041002101410021050240024002400240024002400240034002402001411f4d0d00410f210d0c020b0240024020022802382209200228023c2204460d00200441016a22032004490d05200920034f0d0120032009103c000b200241013a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241c8006a200241e8006a10334105210d0c020b200228023020046a2d000021042002200336023c200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210d20044110490d010b200241f880046a41086a200241c8006a41086a280200220b3602002002200229034822083703f880042008422088a721072008a7210c410021060c040b200241003602502002420437034802400240024020050d00410421010c010b4100210d0340200d41016a210d41002101410021090240024002400240024002400240034002402001411f4d0d00410f210d0c030b20022802382206200228023c2204460d01200441016a22032004490d0420062003490d06200228023020046a2d000021042002200336023c200441ff00712001411f71742009722109200141076a21012004418001710d000b20014120490d022004410f4d0d02410d210d0c010b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241f880046a200241e8006a1033200241e880046a41086a200241f880046a41086a280200360200200220022903f8800422083703e880042008a7210c4105210d0b20022802f08004210b20022802ec80042107410021060c0a0b200241e8006a200241306a10ed04024020022802684101470d00200228026c220d41087621062002280278210b200228027421072002280270210c0c0a0b200228027421192002280270211c200228026c211a410021044100210b02400240034002402004411f4d0d00410f210d0c020b0240024020022802382206200228023c2203460d00200341016a22012003490d06200620014f0d0120012006103c000b200241013a00e880042002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a1033200241206a41086a200241f880046a41086a280200360200200220022903f8800422083703202008a7210c4105210d0c030b2002280230220a20036a2d000021032002200136023c200341ff00712004411f7174200b72210b200441076a21042003418001710d000b20044120490d0520034110490d05410d210d0b0b2002280228210b200228022421070c080b417f20031044000b417f20011044000b20032006103c000b4100211b200241e8006a4100418080041099051a02400240200b0d00410121184100210c0c010b4100211b41012118410021034100210702400240034002400240200620016b200b20076b220441808004200441808004491b2204490d00200120046a220c2001490d032006200c4f0d01200c2006103c000b200241013a00202002410136028c8104200242013702fc8004200241a4e2c5003602f880042002412636021c2002200241186a36028881042002200241206a360218200241e880046a200241f880046a103320022802e88004210c20022802ec8004210720022802f08004210b4105210d201b450d092018102a0c090b200241e8006a200a20016a2004109a051a2002200c36023c02400240201b20036b2004490d00200320046a210c0c010b200320046a220c2003490d24201b4101742201200c2001200c4b1b22014100480d2402400240201b0d002001102821180c010b2018201b2001102c21180b2018450d032001211b0b201820036a200241e8006a2004109a051a200b200420076a22074d0d03200228023c2101200228023821062002280230210a200c21030c000b0b2001200c1044000b200141011037000b024020022802502203200228024c470d00200341016a22012003490d20200341017422042001200420014b1b2204ad421c7e2208422088a70d202008a722064100480d200240024020030d002006102821010c010b20022802482003411c6c2006102c21010b2001450d032002200436024c200220013602480b200228024822012003411c6c6a2204200941087622063b0001200420183602102004201a360204200420093a0000200441036a20064110763a0000200441186a200c360200200441146a201b3602002004410c6a2019360200200441086a201c3602002002200341016a360250200d2005470d000b0b200228023c2002280240462104200229024c2208422088210e02402002280234450d002002280230102a0b20014108762105200ea721032008a7210a2004450d052005410874200141ff01717221012003ad422086200aad842108410d21030c250b200641041037000b417f20031044000b02402019450d0020194104742104201a21010340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b41002106201c450d00201a102a0b2002280248211b024020022802502201450d00201b2001411c6c6a210a201b21090340024020092802042201450d0002402009410c6a2802002204450d00200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b200941086a280200450d002009280204102a0b2009411c6a21010240200941146a280200450d002009280210102a0b200121092001200a470d000b0b200228024c450d00201b102a0b2006410874200d41ff01717221012007ad220e422086200cad8421082002280234450d012002280230102a0c010b2005410874200141ff017172210d20024103410220041b3a00e88004200241e8006a41146a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103320022903f88004210820022802808104210b02402003450d00200d2003411c6c6a2106200d21090340024020092802042201450d0002402009410c6a2802002204450d00200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b200941086a280200450d002009280204102a0b2009411c6a21010240200941146a280200450d002009280210102a0b2001210920012006470d000b0b2008422088210e4105210141002106200a450d00200d102a0b20004101360200200041106a200b360200200041086a200e422086200842ffffffff0f838437020020002006410874200141ff0171723602040c220b200241e8006a200110fb040240024020022802684101470d00200228026c220a4108762104200241e8006a41086a2903002208422088210e200241f8006a280200210d0c010b200241fc006a280200211b200241f8006a2802002101200241f4006a2802002105200241f0006a2802002107200228026c210b410021044100210902400240024002400240024002400240024002400240034002402004411f4d0d00410f210a0c020b0240024020052001460d002001417f460d052005200141016a22034f0d01200141016a2005103c000b200241013a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a10334105210a0c020b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200321012006418001710d000b20044120490d01410d210a20064110490d010b200241306a41086a200241f880046a41086a280200220d360200200220022902f8800422083703302008422088a7210c2008a7211b0c080b2002410036026020024204370358024002400240024020090d00410421010c010b200241f1006a21104100211c0340201c41016a211c410021014100210602400240024002400240024002400240024002400240024002400240034002402001411f4d0d00410f210a0c020b0240024020052003460d002003417f460d062005200341016a22044f0d01200341016a2005103c000b200241013a00f880042002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241f880046a360218200241c8006a200241e8006a10334105210a2002280248211b0c030b200b20036a2d0000220a41ff00712001411f71742006722106200141076a210120042103200a418001710d000b20014120490d02200a4110490d02410d210a0b0b2002280250210d200228024c210c0c160b4100210c200241e8006a4100418080011099051a410121180240024020060d00200421034100211a4100210a0c010b4100210d4100211a41002119034002400240200520046b200620196b220141808001200141808001491b2201490d00200420016a22032004490d05200520034f0d0120032005103c000b200241013a00482002410136028c8104200242013702fc8004200241a4e2c5003602f880042002412636021c2002200241186a36028881042002200241c8006a360218200241e880046a200241f880046a103320022802e88004211b20022802ec8004210c20022802f08004210d4105210a201a450d182018102a0c180b200241e8006a200b20046a2001109a051a02400240201a200d6b2001490d00200d20016a210a0c010b200d20016a220a200d490d31201a4101742204200a2004200a4b1b22044100480d3102400240201a0d002004102821180c010b2018201a2004102c21180b2018450d052004211a0b2018200d6a200241e8006a2001109a051a20032104200a210d2006200120196a22194b0d000b0b2002200a3602402002410036023c2002200a3602382002201aad4220862018ad84370330410021014100210d02400240034002402001411f4d0d00410f210a0c020b02400240200a200c460d00200c417f460d08200a200c41016a22064f0d01200c41016a200a103c000b200241013a00482002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241f880046a200241e8006a1033200241206a41086a200241f880046a41086a280200360200200220022903f880043703204105210a0c020b2018200c6a2d000021042002200636023c200441ff00712001411f7174200d72210d200141076a21012006210c2004418001710d000b20014120490d0120044110490d01410d210a0b200241e880046a41086a200241206a41086a280200220d3602002002200229032022083703e880042008a7211b20022802ec8004210c0c150b41002119200241003602f08004200242043703e8800402400240200d0d004104210f41002118410021160c010b410021184104210f410021160340201821172016221d41016a2116410021014100210c024002400240034002402001411f4d0d00410f21040c020b0240024020022802382218200228023c2204460d00200441016a22062004490d0c201820064f0d0120062018103c000b200241013a00f880042002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241f880046a360218200241c8006a200241e8006a1033410521042002280248211b0c030b2002280230221a20046a2d0000210a2002200636023c200a41ff00712001411f7174200c72210c200141076a2101200a418001710d000b20014120490d02200a4110490d02410d21040b0b2002280250210d200228024c210c410021010c0c0b02400240024020182006460d00200441026a21042006417f460d0a20182004490d0c201a20066a2c000021012002200436023c0240200141004e0d00411921040c0f0b41062104200141c00071450d0d200141807f72220141ff017141fb014d0d0d201d2017460d0120172118201d21170c020b200241013a00482002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241f880046a200241e8006a103320022802f88004211b20022802fc8004210c20022802808104210d410521040c0d0b201741016a22042017490d31201741017422062004200620044b1b221841ffffffff01712018470d31201841037422044100480d310240024020170d0020041028210f0c010b200f20174103742004102c210f0b200f450d092002200f3602e880040b200f20174103746a2204201341807e712001417f7341ff01717222133a00042004200c3602002016200d470d000b200220183602ec8004200220163602f080040b200f20164103746a210d200f2101200f210602400340200d20066b41184d0d01201920012802006a22042019490d132004200141086a2802006a22062004490d132006200141106a2802006a22042006490d13200141186a210a200141206a220621012004200a2802006a22192004490d130c000b0b0340200d2001460d0b201920012802006a22042019492106200141086a21012004211920060d120c000b0b417f200341016a1044000b200420031044000b200441011037000b417f200c41016a1044000b417f20061044000b417f20041044000b200441041037000b20042018103c000b0b200220173602ec80042002201d3602f08004200141ff0171410874200472210a20170d090c0a0b4101210a410021044108211a410021060340200241e8006a200241306a10ee04024020022802684101470d002002280278210d2002280274210c2002280270211b200228026c210a0c070b200241f880046a41026a2201201041026a2d00003a0000200220102f00003b01f8800420022802742117200229037821080240024002400240024020022d0070220d4106470d00200a417f6a210a0c010b200d417e6a41034f0d00200a41016a220c200a4f2119200c210a20190d004115210c41c4fdc500211b4104210a200d4109460d010c0a0b200241e8006a41026a220c20012d00003a0000200220022f01f880043b016820062004460d01200421190c020b0240201728020441ffffffff0371450d002017280200102a0b2017102a0c080b200441016a22012004490d25200441017422062001200620014b1b221941ffffffff00712019470d25201941047422014100480d250240024020040d0020011028211a0c010b201a20044104742001102c211a0b201a450d0420042106201921040b201a20064104746a2201200d3a00002001200837030820012017360204200120022f01683b0001200141036a200c2d00003a0000200641016a2106200a0d000b200228023c200228024046210102402002280234450d002002280230102a0b0240024002402001450d002002280260220a200228025c470d02200a41016a2201200a490d26200a41017422042001200420014b1b220dad42187e2208422088a70d262008a7220441004e0d010c260b20024103410220011b3a00e880042002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103320022802f88004211b20022802fc8004210c20022802808104210d02402006450d0020064104742104201a21010340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b02402019450d00201a102a0b4105210a2018450d0c200f102a0c0c0b02400240200a0d002004102821010c010b2002280258200a41186c2004102c21010b2001450d042002200d36025c200220013602580b20022802582201200a41186c6a2204201a36020c20042016360208200420183602042004200f360200200441146a2006360200200441106a20193602002002200a41016a360260201c2009470d000b0b2003201b462104200229025c2208422088210e02402007450d00200b102a0b200ea721032008a721072004450d0a2003ad4220862007ad842108410c21030c290b200141081037000b200441041037000b417f200141016a1044000b02402006450d0020064104742103201a21010340024020012d00004109470d000240200141046a2209280200220528020441ffffffff0371450d002005280200102a200928020021050b2005102a0b200141106a2101200341706a22030d000b0b2004450d01201a102a0c010b20022802808104210d20022802fc8004210c411c210a0b2018450d010b200f102a0b2002280234450d002002280230102a0b20022802582118024020022802602201450d002018200141186c6a21062018210903400240200941046a280200450d002009280200102a0b0240200941146a2802002204450d00200928020c2101200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b200941186a21010240200941106a280200450d00200928020c102a0b2001210920012006470d000b0b200228025c450d002018102a0b200a4108762104200cad220e422086201bad8421082007450d01200b102a0c010b20024103410220041b3a0030200241e8006a41146a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103320022903f88004210820022802808104210d02402003450d002001200341186c6a210b2001210603400240200641046a280200450d002006280200102a0b0240200641146a2802002203450d00200628020c2104200341047421030340024020042d00004109470d000240200441046a2209280200220528020441ffffffff0371450d002005280200102a200928020021050b2005102a0b200441106a2104200341706a22030d000b0b200641186a21040240200641106a280200450d00200628020c102a0b200421062004200b470d000b0b2008422088210e4105210a410021042007450d002001102a0b20004101360200200041106a200d360200200041086a200e422086200842ffffffff0f838437020020002004410874200a41ff0171723602040c210b200241e8006a200110fb040240024020022802684101470d00200228026c22044108762106200241e8006a41086a2903002208422088210e200241f8006a280200210b0c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a2902003703002002200229026c3703f880044100210141002105024002400240024002400240024002400240034002402001411f4d0d00410f210d0c020b02400240200228028081042209200228028481042204460d00200441016a22032004490d05200920034f0d0120032009103c000b200241013a0058200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200241e880046a41086a200241306a41086a280200360200200220022903303703e880044105210d0c020b20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210d20044110490d010b200241c8006a41086a200241e880046a41086a280200220b360200200220022903e8800422083703482008422088a721072008a7210c410021060c060b200241003602f08004200242043703e880040240024020050d00410421010c010b4100210b0340200b41016a210b410021014100210902400240024002400240034002402001411f4d0d00410f210d0c030b200228028081042206200228028481042204460d01200441016a22032004490d0920062003490d0c20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742009722109200141076a21012004418001710d000b20014120490d022004410f4d0d02410d210d0c010b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200241206a41086a200241306a41086a2802003602002002200229033022083703202008a7210c4105210d0b2002280228210b20022802242107410021060c010b200241e8006a200241f880046a10ed04024020022802684101470d00200228026c220d41087621062002280278210b200228027421072002280270210c0c010b2002280274211b20022802702119200228026c2118200241e8006a200241f880046a10ef0420022802684101470d01200228026c210d2002280278210b200228027421072002280270210c0240201b450d00201b4104742104201821010340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b200d41087621062019450d002018102a0b20022802e88004211b024020022802f080042201450d00201b2001411c6c6a210a201b21090340024020092802042201450d0002402009410c6a2802002204450d00200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b200941086a280200450d002009280204102a0b2009411c6a21010240200941146a280200450d002009280210102a0b200121092001200a470d000b0b20022802ec8004450d08201b102a0c080b4100210a2002280270210c200228026c2107024002402002280274220141027422030d004104210d410021060c010b2003410275220641ffffffff03712006470d1f200641027422044100480d1f20041028220d450d050b02402001450d002003417c6a210a200d210120072104034020012004280200360200200141046a2101200441046a21042003417c6a22030d000b200a41027641016a210a0b0240200c450d002007102a0b024020022802f08004220320022802ec8004470d00200341016a22012003490d1f200341017422042001200420014b1b2204ad421c7e2208422088a70d1f2008a722074100480d1f0240024020030d002007102821010c010b20022802e880042003411c6c2007102c21010b2001450d06200220043602ec8004200220013602e880040b20022802e8800422012003411c6c6a2204200941087622073b00012004200d36021020042018360204200420093a0000200441036a20074110763a0000200441186a200a360200200441146a20063602002004410c6a201b360200200441086a20193602002002200341016a3602f08004200b2005470d000b0b200228028481042002280288810446210420022902ec80042208422088210e024020022802fc8004450d0020022802f88004102a0b200ea721032008a7210d2004450d062003ad422086200dad842108410a21030c240b417f20031044000b417f20031044000b200441041037000b200741041037000b20032006103c000b2006410874200d41ff01717221042007ad220e422086200cad84210820022802fc8004450d0120022802f88004102a0c010b20024103410220041b3a00e88004200241e8006a41146a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a1033200229033021082002280238210b02402003450d0020012003411c6c6a210a200121060340024020062802042204450d0002402006410c6a2802002203450d00200341047421030340024020042d00004109470d000240200441046a2209280200220528020441ffffffff0371450d002005280200102a200928020021050b2005102a0b200441106a2104200341706a22030d000b0b200641086a280200450d002006280204102a0b2006411c6a21040240200641146a280200450d002006280210102a0b200421062004200a470d000b0b2008422088210e4105210441002106200d450d002001102a0b20004101360200200041106a200b360200200041086a200e422086200842ffffffff0f838437020020002006410874200441ff0171723602040c200b200d20064621040240200a450d00200b102a0b02402004450d00410921030c1c0b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a10332002418381046a200241386a280200360000200220022903303700fb8004200041053a0004200020022900f880043700052000410c6a200241ff80046a290000370000200041013602000c1f0b200241013a0030200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1033410521040b2000200436020420004101360200200041086a20022902f88004370200200041106a200241f880046a41086a280200360200200a450d1d200b102a0c1d0b200241e8006a200110fb040240024020022802684101470d00200228026c22034108762104200241e8006a41086a2903002208422088210e200241f8006a28020021090c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a2902003703002002200229026c3703f880044100210141002105024002400240024002400240024002400240024002400240024002400240024002400240034002402001411f4d0d00410f21030c020b02400240200228028081042209200228028481042204460d00200441016a22032004490d05200920034f0d0120032009103c000b200241013a0058200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200241206a41086a200241306a41086a28020036020020022002290330370320410521030c020b20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210320044110490d010b200241e880046a41086a200241206a41086a28020022093602002002200229032022083703e880042008422088a721062008a7210b0c100b20024100360260200242043703584104210102402005450d004100211b4100210c4100211a0340200241e8006a200241f880046a10fc04024020022802684101470d002002200229027422083703e880042002280270210b200228026c21032008a721060c100b20022802702118200228026c211902400240200228028081042203200228028481042209460d00200941016a22042009490d05200320044f0d0120042003103c000b200241013a00482002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10330c0d0b2002280274211c20022802f88004220620096a2d000021072002200436028481040240200741034d0d00410a21040c0f0b0240024002400240024020070e0400010203000b410021074100210b4100210903400240200b411f4d0d00410f21040c140b20032004460d122004417f460d092003200441016a220d490d0e200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41002107200b4120490d03200a410f4d0d03410d21040c120b4100210b410021090340200b411f4b0d0f0240024020032004460d002004417f460d0b2003200441016a220d4f0d01200441016a2003103c000b200241013a00482002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10330c110b200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41012107200b4120490d02200a410f4d0d020c0d0b4100210b410021090340200b411f4b0d0e0240024020032004460d002004417f460d0b2003200441016a220d4f0d01200441016a2003103c000b200241013a00482002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10330c100b200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41022107200b4120490d01200a410f4b0d0c0c010b4100210b410021090340200b411f4b0d0d0240024020032004460d002004417f460d0b2003200441016a220d4f0d01200441016a2003103c000b200241013a00482002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10330c0f0b200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41032107200b4120490d00200a410f4b0d0b0b200220093602f08004200220073602ec800420022902ec8004210802400240200c201b460d00201b21030c010b201b41016a2204201b490d24201b41017422032004200320044b1b2203ad42147e220e422088a70d24200ea722044100480d2402400240201b0d002004102821010c010b2001201b41146c2004102c21010b2001450d0920022001360258201b210c2003211b0b2001200c41146c6a2204200837020c2004201c3602082004201836020420042019360200200c41016a210c201a41016a221a2005470d000b2002200336025c2002200c3602600b2002280284810420022802888104462104200229025c2208422088210e024020022802fc8004450d0020022802f88004102a0b200ea721032008a721052004450d0e2003ad4220862005ad842108410821030c290b417f20031044000b417f20041044000b417f200441016a1044000b417f200441016a1044000b417f200441016a1044000b417f200441016a1044000b200441041037000b200441016a2003103c000b410d2104410021070c030b410f2104410021070c020b2002280230210b2002290234210841052104410021070c010b200241013a00482002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10332002280230210b20022902342108410521040b20074108742004722103200220083703e880042008a721062018450d002019102a0b2002200c3602602002201b36025c20022802ec800421090240200c450d00200c41146c21052001210403400240200441046a280200450d002004280200102a0b200441146a21042005416c6a22050d000b0b201b450d012001102a0c010b20024103410220041b3a00e88004200241e8006a41146a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a1033200229033021082002280238210902402003450d00200341146c21032001210403400240200441046a280200450d002004280200102a0b200441146a21042003416c6a22030d000b0b2008422088210e41052103410021042005450d012001102a0c010b200341087621042006ad220e422086200bad84210820022802fc8004450d0020022802f88004102a0b20004101360200200041106a2009360200200041086a200e422086200842ffffffff0f838437020020002004410874200341ff0171723602040c1c0b200241e8006a200110fb040240024020022802684101470d00200228026c220b4108762104200241e8006a41086a2903002208422088210e200241f8006a28020021060c010b200241c0006a200241fc006a280200360200200241386a200241f4006a2902003703002002200229026c37033041002101410021090240024002400240024002400240024002400240024002400240034002402001411f4d0d00410f210b0c020b0240024020022802382205200228023c2204460d00200441016a22032004490d05200520034f0d0120032005103c000b200241013a0058200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241f880046a200241e8006a1033200241206a41086a200241f880046a41086a280200360200200220022903f880043703204105210b0c020b2002280230220620046a2d000021042002200336023c200441ff00712001411f71742009722109200141076a21012004418001710d000b20014120490d01410d210b20044110490d010b200241e880046a41086a200241206a41086a28020022063602002002200229032022083703e880042008422088a721072008a7210d0c0b0b20024100360260200242043703580240024020090d00410421010c010b2009417f6a211b4104210141042110410421094104211c4104211a4100210a4100210c03400240024020052003460d00200341016a220b2003490d052005200b4f0d01200b2005103c000b2002200a36025c2002200c360260200241013a0048200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241e880046a200241e8006a103320022802e88004210d20022802ec8004210720022802f080042106410521010c090b200620036a2c000021042002200b36023c20044100480d0402400240200441c00071450d00200441807f72220441ff017141fb014b0d010b2002200a36025c2002200c360260410621010c080b024002400240024002402005200b460d00200341026a210d200b417f460d0a2005200d4f0d01200d2005103c000b2002200a36025c2002200c360260200241013a0048200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241c8006a360218200241e880046a200241e8006a103320022802e88004210d20022802ec8004210720022802f080042106410521010c010b2006200b6a2d000021032002200d36023c0240200341014b0d004100210520030e020302030b2002200a36025c2002200c360260410c21010b2002418881046a20063602002002418481046a20073602002002418081046a200d360200200220033a00fd8004200220013a00fc80040c0b0b41800221050b200241e8006a200241306a10ed04200228027421072002280270210d200228026c210b024020022802684101470d002002200a36025c2002200c360260200241f8006a28020021060c0b0b02400240200c200a460d00200a2118200c210a0c010b200a41016a2201200a490d1e200a41017422032001200320014b1b221841ffffffff00712018470d1e201841047422034100480d1e02400240200a0d002003102821010c010b201c200a4104742003102c21010b2001450d072002200136025820012110200121092001211c2001211a0b201a200a4104746a220320194180807c712004417f7341ff017172200572221936020c200320073602082003200d3602042003200b360200200a41016a210c0240201b450d00201b417f6a211b200228023c210320022802382105200228023021062018210a0c010b0b2002201836025c2002200c3602600b200228023c2002280240462104200229025c2208422088210e02402002280234450d002002280230102a0b200ea721032008a7210d2004450d092003ad422086200dad842108410721030c230b417f20031044000b417f200b1044000b2002200a36025c2002200c360260411921010c020b417f200d1044000b200341041037000b0b2002418881046a20063602002002418481046a20073602002002418081046a200d360200200220043a00fd8004200220013a00fc80040b200241013a00f8800420022802fc8004210b0b0240200c450d002009200c4104746a210c0340024020092802082204450d0020092802002101200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102a200528020021030b2003102a0b200141106a2101200441706a22040d000b0b200941106a21010240200941046a280200450d002009280200102a0b200121092001200c470d000b0b200a450d012010102a0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103320022903f88004210820022802808104210602402003450d00200120034104746a210a2001210b03400240200b2802082203450d00200b2802002104200341047421030340024020042d00004109470d000240200441046a2209280200220528020441ffffffff0371450d002005280200102a200928020021050b2005102a0b200441106a2104200341706a22030d000b0b200b41106a21040240200b41046a280200450d00200b280200102a0b2004210b2004200a470d000b0b2008422088210e4105210b41002104200d450d012001102a0c010b200b41087621042007ad220e422086200dad8421082002280234450d002002280230102a0b20004101360200200041106a2006360200200041086a200e422086200842ffffffff0f838437020020002004410874200b41ff0171723602040c1b0b200241e8006a200110fb040240024020022802684101470d00200228026c22034108762105200241e8006a41086a2903002208422088210e200241f8006a28020021040c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a29020022083703002002200229026c220e3703f88004200ea7210b2008a7210541002104200228028481042101410021030240024002400240024002400240024003402004411f4b0d010240024020052001460d002001417f460d072005200141016a22094f0d01200141016a2005103c000b200220053602848104200241013a0058200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200241206a41086a200241306a41086a280200360200200220022903303703204105210b0c030b200b20016a2d0000220641ff00712004411f71742003722103200441076a2104200921012006418001710d000b200220093602848104024020044120490d00410d210b2006410f4b0d020b200241003602382002420437033020030d02410421010c030b200220013602848104410f210b0b200241e880046a41086a200241206a41086a28020022043602002002200229032022083703e880042008422088a7210a2008a7210d410021090c040b4104210141002105410021060340200241e8006a200241f880046a10f30420022f006d20022d006f4110747221092002280274210a2002280270210d20022d006c210b024020022802684101470d002002200536023420022006360238200241f8006a28020021042005450d052001102a0c050b0240024020062005460d0020052107200621040c010b200541016a22042005490d16200541017422072004200720044b1b2207ad420c7e2208422088a70d162008a722044100480d160240024020050d002004102821010c010b20012005410c6c2004102c21010b2001450d042002200136023020052104200721050b20012004410c6c6a220420093b00012004200d3602042004200b3a0000200441036a20094110763a0000200441086a200a3602002003200641016a2206470d000b20022007360234200220063602380b200228028481042002280288810446210420022902342108024020022802fc8004450d0020022802f88004102a0b2008a721092004450d032008422088a7ad4220862009ad842108410621030c1b0b417f200141016a1044000b200441041037000b200941ffffff07712205410874200b41ff0171722103200aad220e422086200dad84210820022802fc8004450d0120022802f88004102a0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a103320022903302208422088210e2002280238210441052103410021052009450d002001102a0b20004101360200200041106a2004360200200041086a200e422086200842ffffffff0f838437020020002005410874200341ff0171723602040c1a0b200241e8006a200110fb040240024020022802684101470d00200228026c22034108762105200241e8006a41086a2903002208422088210e200241f8006a28020021040c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a29020022083703002002200229026c220e3703f88004200ea7210b2008a721034100210420022802848104210141002109024002400240024002400240024002400240024003402004411f4b0d010240024020032001460d002001417f460d072003200141016a22054f0d01200141016a2003103c000b200220033602848104200241013a0058200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200241206a41086a200241306a41086a280200360200200220022903303703204105210a0c030b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200521012006418001710d000b200220053602848104024020044120490d00410d210a2006410f4b0d020b41002107200241003602f08004200242043703e8800420090d02410421014100210d0c030b200220013602848104410f210a0b200241e880046a41086a200241206a41086a28020022043602002002200229032022083703e880042008a7210b4100210320022802ec8004210d0c060b4104210141012107410021060340024002400240024020032005460d00200541016a22042005490d0720032004490d09200b20056a2c000021032002200436028481040240200341004e0d004119210a0c020b4107210a0240200341c000710d000c020b200341807f7222034170470d02200241e8006a200241f880046a10f30420022f006d20022d006f41107472210320022d006c210a20022802684101470d0320034180feff07714108762105200228027821042002280274210d2002280270210b0c020b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a10332002280230210b2002280234210d200228023821044105210a0b0b200220063602ec800420022007417f6a3602f080042005410874200341ff01717221032006450d072001102a0c070b200228027421052002280270210b024002402007417f6a22042006460d002006210d200421060c010b200641016a22042006490d172006410174220d2004200d20044b1b220dad420c7e2208422088a70d172008a722044100480d170240024020060d002004102821010c010b20012006410c6c2004102c21010b2001450d05200220013602e880040b20012006410c6c6a220420033b0001200420053602082004200b3602042004200a3a0000200441036a20034110763a0000024020092007460d00200741016a210720022802848104210520022802808104210320022802f88004210b200d21060c010b0b2002200d3602ec8004200220073602f080040b2002280284810420022802888104462104024020022802fc8004450d0020022802f88004102a0b2004450d052007ad422086200dad842108410521030c1c0b417f200141016a1044000b417f20041044000b200441041037000b20042003103c000b200341ffffff07712205410874200a41ff0171722103200dad220e422086200bad84210820022802fc8004450d0120022802f88004102a0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a103320022903302208422088210e200228023821044105210341002105200d450d002001102a0b20004101360200200041106a2004360200200041086a200e422086200842ffffffff0f838437020020002005410874200341ff0171723602040c190b200241e8006a200110fb040240024020022802684101470d00200228026c22044108762105200241e8006a41086a2903002208422088210e200241f8006a28020021030c010b200241fc006a280200210c200241f8006a2802002101200241f4006a2802002103200241f0006a2802002107200228026c210b41002104410021090240024002400240024002400240024002400240034002402004411f4d0d00410f21040c020b0240024020032001460d002001417f460d052003200141016a22054f0d01200141016a2003103c000b200241013a0030200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1033200241206a41086a200241f880046a41086a280200360200200220022903f88004370320410521040c020b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200521012006418001710d000b20044120490d01410d210420064110490d010b200241e880046a41086a200241206a41086a28020022033602002002200229032022083703e880042008a7210520022802ec800421090c070b4100211b20024100360238200242043703300240024020090d0041042101410021060c010b41042101410021064100211b034020062118201b221941016a211b20052104410021064100210a03402006411f4b0d050240024020032004460d002004417f460d062003200441016a22054f0d01200441016a2003103c000b2002201836023420022019360238200241013a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103320022802f88004210520022802fc80042109200228028081042103410521040c090b200b20046a2d0000220d41ff00712006411f7174200a72210a200641076a210620052104200d418001710d000b024020064120490d00200d410f4d0d002002201836023420022019360238410d21040c070b0240024020192018460d0020182106201921180c010b201841016a22042018490d18201841017422062004200620044b1b220641ffffffff03712006470d18200641027422044100480d180240024020180d002004102821010c010b200120184102742004102c21010b2001450d06200220013602300b200120184102746a200a360200201b2009470d000b200220063602342002201b3602380b2005200c46210402402007450d00200b102a0b2004450d07201bad4220862006ad842108410421030c1d0b417f200141016a1044000b417f200441016a1044000b2002201836023420022019360238410f21040c010b200441041037000b0b2018450d002001102a0b2009ad220e4220862005ad842108410021052007450d01200b102a0c010b20024103410220041b3a0030200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103320022903f880042208422088210e20022802808104210341052104410021052006450d002001102a0b20004101360200200041106a2003360200200041086a200e422086200842ffffffff0f838437020020002005410874200441ff0171723602040c180b200241e8006a200110fb040240024020022802684101470d00200228026c22034108762105200241e8006a41086a2903002208422088210e200241f8006a28020021040c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a2902003703002002200229026c3703f8800441002101410021050240024002400240024002400240024002400240034002402001411f4d0d00410f21030c020b02400240200228028081042209200228028481042204460d00200441016a22032004490d05200920034f0d0120032009103c000b200241013a0058200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200241206a41086a200241306a41086a28020036020020022002290330370320410521030c020b20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210320044110490d010b200241e880046a41086a200241206a41086a28020022043602002002200229032022083703e880042008422088a721092008a721060c080b200241003602f08004200242043703e8800402400240024020050d00410421010c010b20022802ec8004210720022802f08004210d410021100340200241e8006a200241f880046a10fc042002280274210920022802702118200228026c211a024020022802684101470d002002280278210420182106201a21030c090b200241e8006a200241f880046a10fc042002280274211320022802702119200228026c211c024020022802684101470d00200228027821042019210620132109201c21030c080b0240024002400240024002400240024002400240024002400240024002400240200228028081042203200228028481042206460d00200641016a22012006490d02200320014f0d0120012003103c000b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200228023021062002290234210e4105210a4100211b410021030c150b20022802f88004220c20066a2d000021042002200136028481044100211b0240200441034d0d004109210a410021030c150b024002400240024020040e0400010203000b4100211b410021044100210a034002402004411f4d0d00410f210a0c170b0240024020032001460d002001417f460d072003200141016a220b4f0d01200141016a2003103c000b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200228023021062002290234210e4105210a4100211b0c180b200c20016a2d000021062002200b3602848104200641ff00712004411f7174200a72210a200441076a2104200b21012006418001710d000b4100211b20044120490d0f2006410f4d0d0f410d210a0c150b0240024020032001460d00200641026a21042001417f460d0620032004490d07200c20016a2c0000210120022004360284810402402001417f4a0d00411921030c0e0b200141c000710d010c0c0b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a10332002290330210820022802382104410521030c0c0b200141807f7222014170470d0a200241e8006a200241f880046a10f30420022903702108200228026c210a024020022802684101470d00200228027821040c0d0b4101211b0c0f0b200241e8006a200241f880046a10f30420022903702108200228026c210a024020022802684101460d004102211b0c0f0b20022002280278360270200a418080807871211b200a4180807c712103200a41087621040c0c0b0240024020032001460d00200641026a210b2001417f460d062003200b490d08200c20016a2c000021042002200b36028481040240200441004e0d004119210a410021030c170b200441c000710d010c090b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a10334105210a2002290234210e20022802302106410021030c150b200441807f72220441ff017141fc01490d07024002402003200b460d00200641036a2101200b417f460d07200320014f0d0120012003103c000b200241013a00582002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1033200228023021062002290234210e4105210a410021030c150b200c200b6a2d0000210b200220013602848104410021030240200b41014d0d00410c210a4100211b200b21040c150b2004417f7321064103211b0240200b0e020e000e0b410121030c0d0b417f20011044000b417f200141016a1044000b417f20041044000b20042003103c000b417f200b1044000b417f20011044000b200b2003103c000b4106210a410021030c0c0b410721030b200141ff0171410874200372210a0b20022004360270200a418080807871211b200a4180807c712103200a41087621040b20022008370368200229026c210e2008a721060c080b0b02400240200d2007460d002007210b0c010b200741016a22012007490d18200741017422042001200420014b1b220bad42287e220e422088a70d18200ea722044100480d180240024020070d002004102821010c010b20022802e88004200741286c2004102c21010b2001450d03200220013602e880042007210d200b21070b20022802e880042201200d41286c6a2204201c36020c20042009360208200420183602042004201a360200200441206a20083702002004411c6a200a3602002004411a6a20033a0000200441196a20063a0000200441186a201b3a0000200441146a2013360200200441106a2019360200200d41016a210d201041016a22102005470d000b2002200b3602ec80042002200d3602f080040b200228028481042002280288810446210420022902ec80042208422088210e024020022802fc8004450d0020022802f88004102a0b200ea721032008a721092004450d072003ad4220862009ad842108410321030c1d0b200441041037000b417f20031044000b0b41002103410021040b200a41ff0171200441ff0171410874722003418080fc077172201b722103200e422088a72104200ea721092019450d00201c102a0b2018450d00201a102a0b200220073602ec80042002200d3602f0800420022802e88004210b0240200d450d00200d41286c2105200b210103400240200141046a280200450d002001280200102a0b0240200141106a280200450d002001410c6a280200102a0b200141286a2101200541586a22050d000b0b2007450d01200b102a0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a1033200229033021082002280238210402402003450d00200341286c21052001210303400240200341046a280200450d002003280200102a0b0240200341106a280200450d002003410c6a280200102a0b200341286a2103200541586a22050d000b0b2008422088210e41052103410021052009450d012001102a0c010b200341087621052009ad220e4220862006ad84210820022802fc8004450d0020022802f88004102a0b20004101360200200041106a2004360200200041086a200e422086200842ffffffff0f838437020020002005410874200341ff0171723602040c170b200241013a00302002410136027c2002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103320022802f88004210620022802fc8004210920022d00808104210320022d00818104210720022f01828104210d410521050b0b201d450d03200c102a0c030b0b2019450d00201c102a0b2003411076210d200341087621070b200741ff0171410874200341ff0171722103200d411074210d200441ff0171410874210702402017450d002001210403400240200441046a280200450d002004280200102a0b200441106a2104200a41706a220a0d000b0b2003200d722103200720057221042014450d012001102a0c010b20024103410220041b3a0030200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103320022903f88004210820022802808104210302402005450d00200541047421052001210403400240200441046a280200450d002004280200102a0b200441106a2104200541706a22050d000b0b2008422088210e41052104410021052009450d012001102a0c010b200441087621052009ad220e4220862006ad8421082010450d00200b102a0b20004101360200200041106a2003360200200041086a200e422086200842ffffffff0f838437020020002005410874200441ff0171723602040c0d0b41002101410021040240024002400340024020094105470d00410f21070c020b0240024020032009460d00200320094b0d01200941016a2003103c000b200241013a00f88004200241fc006a41013602002002420137026c200241a4e2c5003602682002412636021c2002200241186a3602782002200241f880046a360218200241206a200241e8006a103341052107200229032021080c030b200620096a2d0000220541ff00712001411f71742004722104200141076a2101200941016a220b21092005418001710d000b20014120490d0220054110490d02410d21070b0b2008422088a72109200228022821042008a7210d0c050b024020040d00410021054101211b410021094100210d0c080b200241e8006a41004180081099051a410021054100210d4101211b410021070340024002402003200b6b200420076b22014180082001418008491b2201490d00200b20016a220c200b490d042003200c4f0d01200c2003103c000b200241013a00e880042002418c81046a4101360200200242013702fc8004200241a4e2c5003602f880042002412636021c2002200241186a36028881042002200241e880046a360218200241306a200241f880046a103320022903302208422088a72109200228023821042008a72101410521070240200d450d00201b102a0b2001210d0c060b200241e8006a2006200b6a2001109a051a02400240200d20056b2001490d00200520016a21090c010b200520016a22092005490d02200d410174220b2009200b20094b1b220b4100480d0202400240200d0d00200b1028211b0c010b201b200d200b102c211b0b201b450d04200b210d0b201b20056a200241e8006a2001109a051a20092105200c210b2004200120076a22074d0d040c000b0b1031000b200b200c1044000b200b41011037000b200241e8006a201b2009105420022802684101470d02410821070240200d450d00201b102a0b0b2009ad422086200dad84210841002101200a450d002006102a0b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff0171723602040c060b201b4108762105200c210b0b2003200b490d012003200b6b2201417f4c0d020240024020010d00410121040c010b200110282204450d040b2009ad4220862108200dad210e20042006200b6a2001109a051a2001ad222042208621210240200a450d002006102a0b2008200e8421082021202084210e2005410874201b41ff0171722101410121030b200020033a000420004100360200200041056a20022f00153b0000200041186a200e370200200041146a20043602002000410c6a2008370200200041086a2001360200200041206a2002290200370200200041076a200241176a2d00003a0000200041286a200241086a290200370200200041306a200241106a2802003602000c030b200b20031044000b1036000b200141011037000b2002419081046a24000bf304010b7f230041c080016b220224002002200110f404410121030240024020022802004101470d0020002002290204370204200041013602002000410c6a2002410c6a2902003702000c010b2002280204210420024100418080011099052105410021064100210702400240024002402004450d00410021084100210641012103410021090340024002402001280204220a200128020822076b200420096b220b41808001200b41808001491b220b490d002007200b6a220c2007490d04200a200c4f0d01200c200a103c000b200541013a008f8001200541b480016a4101360200200542013702a48001200541a4e2c5003602a08001200541263602bc80012005200541b880016a3602b0800120052005418f80016a3602b880012005419080016a200541a080016a10332005418b80016a2005419880016a2802003600002005200529039080013700838001200041053a00042000200529008080013700052000410c6a2005418780016a290000370000200041013602002006450d062003102a0c060b2005200128020020076a200b109a05210a2001200c36020802400240200620086b200b490d002008200b6a21070c010b2008200b6a22072008490d052006410174220c2007200c20074b1b220c4100480d050240024020060d00200c102821030c010b20032006200c102c21030b2003450d04200c21060b200320086a200a200b109a051a200721082004200b20096a22094b0d000b0b2000200336020420004100360200200041146a2007360200200041106a41003602002000410c6a2007360200200041086a20063602000c030b2007200c1044000b200c41011037000b1031000b200241c080016a24000b8607010b7f230041d0086b22022400410021034100210402400240024002400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005103c000b200241013a0089082002411c6a41013602002002420137020c200241a4e2c5003602082002412636029c08200220024198086a360218200220024189086a36029808200241b8086a200241086a1033410521030c020b2001280200220820066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b2000200336020420004101360200200041086a20022902b808370200200041106a200241b8086a41086a2802003602000c060b024020040d002000428080808010370200200041086a42003702000c060b200241086a41004180081099051a41002106410021094101210a4100210b034002400240200520076b2004200b6b22034180082003418008491b2203490d00200720036a220c2007490d042005200c4f0d01200c2005103c000b200241013a00a708200241cc086a4101360200200242013702bc08200241a4e2c5003602b8082002412636029c08200220024198086a3602c8082002200241a7086a36029808200241a8086a200241b8086a103320024194086a200241b0086a280200360000200220022903a80837008c08200041053a000420002002290089083700052000410c6a20024190086a290000370000200041013602002009450d07200a102a0c070b200241086a200820076a2003109a051a2001200c36020c02400240200920066b2003490d00200620036a210c0c010b200620036a220c2006490d0520094101742207200c2007200c4b1b22074100480d050240024020090d0020071028210a0c010b200a20092007102c210a0b200a450d04200721090b200a20066a200241086a2003109a051a20042003200b6a220b4d0d05200128020c21072001280208210520012802002108200c21060c000b0b417f20071044000b2007200c1044000b200741011037000b1031000b200241086a200a200c1054024020022802084101470d0002402009450d00200a102a0b200041083a0004200041013602000c010b2000200a3602042000410c6a200c360200200041086a2009360200200041003602000b200241d0086a24000b881f03127f017e037f23004180026b220524000240024020014115490d00410121064101210702400240034020012108200021092006200771410173210a024002400240034002400240024002402004450d00024020064101710d002000200110fe042004417f6a21040b2001410276220741036c210b2007410174210c4100210d20014132490d03200741016a210e200020074103746a220f28020020002007417f6a220d4103746a2210280200201041046a2802002210200f41046a280200220f200f20104b1b109c052211450d01417f410120114100481b21100c020b2000200110ff040c0b0b417f200f201047200f2010491b21100b2007200d2010417f4622101b210f024002402000200e4103746a22112802002000200d200720101b22124103746a2207280200200741046a2802002207201141046a280200220d200d20074b1b109c052211450d00417f410120114100481b21070c010b417f200d200747200d2007491b21070b4102410120101b20102007417f4622071b210d024002402000200e201220071b22114103746a22102802002000200f4103746a2207280200200741046a2802002207201041046a2802002210201020074b1b109c05220e450d00417f4101200e4100481b21100c010b417f201020074720102007491b21100b200c4101722107200d2010417f4622126a2113024002402000200c4103746a220d2802002000200c417f6a22104103746a220e280200200e41046a280200220e200d41046a280200220d200d200e4b1b109c052214450d00417f410120144100481b210e0c010b417f200d200e47200d200e491b210e0b200c2010200e417f46220e1b210d2013200e6a211302400240200020074103746a221428020020002010200c200e1b220e4103746a220c280200200c41046a280200220c201441046a28020022102010200c4b1b109c052214450d00417f410120144100481b210c0c010b417f2010200c472010200c491b210c0b2013200c417f46220c6a21100240024020002007200e200c1b22134103746a220c2802002000200d4103746a2207280200200741046a2802002207200c41046a280200220c200c20074b1b109c05220e450d00417f4101200e4100481b210c0c010b417f200c200747200c2007491b210c0b200b41016a21072010200c417f4622146a2115024002402000200b4103746a220e2802002000200b417f6a220c4103746a2210280200201041046a2802002210200e41046a280200220e200e20104b1b109c052216450d00417f410120164100481b21100c010b417f200e201047200e2010491b21100b200b200c2010417f4622101b210e201520106a211502400240200020074103746a22162802002000200c200b20101b22104103746a220c280200200c41046a280200220c201641046a280200220b200b200c4b1b109c052216450d00417f410120164100481b210c0c010b417f200b200c47200b200c491b210c0b2015200c417f46220c6a211502400240200020072010200c1b220b4103746a220c2802002000200e4103746a2207280200200741046a2802002207200c41046a280200220c200c20074b1b109c052210450d00417f410120104100481b21100c010b417f200c200747200c2007491b21100b200f201120121b2107200d201320141b210c200e200b2010417f4622101b210b201520106a210d0b024002402000200c4103746a220e280200200020074103746a2210280200201041046a2802002210200e41046a280200220e200e20104b1b109c05220f450d00417f4101200f4100481b21100c010b417f200e201047200e2010491b21100b200c20072010417f46220e1b2110200d200e6a210d024002402000200b4103746a220f28020020002007200c200e1b220e4103746a2207280200200741046a2802002207200f41046a280200220c200c20074b1b109c05220f450d00417f4101200f4100481b21070c010b417f200c200747200c2007491b21070b200d2007417f46220c6a2107024002400240024002402000200b200e200c1b220d4103746a220b280200200020104103746a220c280200200c41046a280200220c200b41046a280200220b200b200c4b1b109c05220e450d00200e4100480d010c020b200b200c4f0d010b200741016a2207410c490d0102402001410176220b450d00200020014103746a41786a21072000210c0340200c2902002117200c200729020037020020072017370200200c41086a210c200741786a2107200b417f6a220b0d000b0b20012010417f736a2110410121070c020b200d21100b20074521070b0240200745200a724101710d00200020011080050d090b2003450d010240201020014f0d00024002402003280200200020104103746a2207280200200741046a280200220c200341046a280200220b200b200c4b1b109c05220e450d00200e41004e0d010c050b200b200c490d040b200029020021172000200729020037020020072017370200200041786a21122000410c6a2113200041086a2114200028020421072000280200210d4100210b2001210e0340024002400240200b200e417f6a22114f0d002013200b4103746a210c034002400240200d200c417c6a280200200c28020022102007200720104b1b109c05220f450d00200f4100480d030c010b20072010490d020b200c41086a210c2011200b41016a220b470d000c020b0b0240200b20114f0d002012200e4103746a210c2011210e034002400240200d200c280200200c41046a28020022102007200720104b1b109c05220f450d00200f4100480d010c050b200720104f0d040b200c41786a210c200b200e417f6a220e490d000b0b200b21110b200020073602042000200d36020002402001201141016a2207490d00200020074103746a2100200120076b220141154f0d040c0b0b200720011044000b2014200b4103746a221029020021172010200c290200370200200c2017370200200b41016a210b0c000b0b0b41f483c600201020011034000b20080d0141bc83c600410041001034000b20002109200121080b201020084f0d02200929020021172009200920104103746a2207290200370200200720173702002009280204210c2009280200211241002100410021184100211902402008417f6a220e450d002009410c6a21074100211803400240024002402007417c6a2802002012200c2007280200220b200b200c4b1b109c052210450d00201041004e0d010c020b200b200c490d010b200e21190240200e20184d0d00200920084103746a41786a2107200e211903400240024020072802002012200c200741046a280200220b200b200c4b1b109c052210450d00201041004e0d010c030b200b200c490d020b200741786a21072019417f6a221920184b0d000b0b0240024020192018490d00200e2019490d010c040b201820191044000b2019200e103c000b200741086a2107200e201841016a2218470d000b200e2118200e21190b200941086a220720194103746a210e41800121144100211141002110410021014180012106200720184103746a221a210d03400240200e200d6b22074187104b220a0d002007410376220741807f6a200720112000492001201049220b72220f1b21070240200f450d0020062007200b1b210620072014200b1b21140c010b2007200741017622066b21140b024020012010470d00024020060d002005221021010c010b4100210720052110200d210b0340201020073a0000200741016a210702400240200b2802002012200c200b41046a280200220f200f200c4b1b109c052201450d00417f410120014100481b210f0c010b417f200f200c47200f200c491b210f0b200b41086a210b2010200f417f476a211020062007470d000b200521010b024020112000470d00024020140d0020054180016a220021110c010b200e41786a21074100210b20054180016a210003402000200b3a0000200b41016a210b0240024020072802002012200c200741046a280200220f200f200c4b1b109c052211450d00417f410120114100481b210f0c010b417f200f200c47200f200c491b210f0b200741786a21072000200f417f466a21002014200b470d000b20054180016a21110b0240200020116b2207201020016b220b200b20074b1b2213450d00200d20012d00004103746a22072802042115200728020021162007200e20112d0000417f734103746a290200370200024020134101460d00410021070340200e201120076a220b2d0000417f734103746a200d200120076a41016a220f2d00004103746a290200370200200d200f2d00004103746a200e200b41016a2d0000417f734103746a290200370200200741026a210b200741016a220f2107200b2013490d000b2011200f6a21112001200f6a21010b200e20112d0000417f734103746a2207201536020420072016360200201141016a2111200141016a21010b200e20144103746b200e20112000461b210e200d20064103746a200d20012010461b210d200a0d000b02400240200120104f0d00200e21070340200d2010417f6a22102d00004103746a220b2902002117200b200741786a22072902003702002007201737020020012010490d000c020b0b200d2107201120004f0d000340200729020021172007200e2000417f6a22002d0000417f734103746a220b290200370200200b2017370200200741086a210720112000490d000b0b2009200c36020420092012360200024020082007201a6b41037620186a22014d0d00200929020021172009200920014103746a220729020037020020072017370200200820016b220c450d02200c20012001200c4b1b210b20084103762110200741086a2100024002402001200c417f6a220c490d002000200c20022007200410fd04200921000c010b2009200120022003200410fd0420072103200c21010b200b20104f2106201920184d2107200141154f0d010c040b0b41cc83c600200120081034000b41dc83c6001032000b41cc83c600201020081034000b20014102490d00200041786a211341002114410121120340201241037421072012417f6a2110201241016a2112024002400240200020076a22072802002211200020104103746a220f280200200f41046a280200220c200741046a280200220b200b200c4b1b109c05220e450d00200e4100480d010c020b200b200c4f0d010b2007200f29020037020002402010450d002014210c20132107024003400240024020112007280200200741046a280200220e200b200b200e4b1b109c05220d450d00200d4100480d010c030b200b200e4f0d030b20002010417f6a22104103746a210f200741086a2007290200370200200741786a2107200c41016a220e200c49210d200e210c200d450d000b0b200741086a210f0b200f200b360204200f20113602000b2014417f6a2114201341086a211320122001470d000b0b20054180026a24000bf50202057f017e02400240024020014108490d00200141017641feffffff07712202417f6a220320014f0d022001410d74200173220441117620047322044105742004732205417f2001417f6a677622067122044100200120042001491b6b220420014f0d01200020034103746a220329020021072003200020044103746a220429020037020020042007370200024020022001490d00200221030c030b2005410d7420057322044111762004732204410574200473220520067122044100200120042001491b6b220420014f0d01200020024103746a220329020021072003200020044103746a2204290200370200200420073702002002410172220320014f0d022005410d742005732204411176200473220441057420047320067122044100200120042001491b6b220420014f0d01200020034103746a220129020021072001200020044103746a2200290200370200200020073702000b0f0b41cc83c600200420011034000b41bc83c600200320011034000bb20102037f017e024020014101762202450d00200020012002417f6a1081052002417e6a210203402002417f460d012000200120021081052002417f6a21020c000b0b0240024020014102490d00200141037420006a41786a21022001210303402003417f6a220420014f0d02200029020021052000200229020037020020022005370200200020044100108105200241786a210220042103200441014b0d000b0b0f0b41cc83c6002003417f6a20011034000b9a06050a7f017e017f017e037f200041686a2102200041786a2103200141324921044101210541002106024003400240024020052001490d00410021070c010b200320054103746a210841012107034002400240200841086a22092802002008280200200841046a280200220a2008410c6a28020022082008200a4b1b109c05220b450d00200b4100480d030c010b2008200a490d020b4101210a200541016a220520014921072009210820012005470d000c030b0b2005200146210a20040d0120052001460d01024002400240024002402005417f6a220820014f0d002007410171450d01200020084103746a2208290200210c200820002005410374220d6a220b290200220e370200200b200c37020020054102490d0402400240200ea7220f20002005417e6a220a4103746a2210280200201041046a2802002207200841046a2802002209200920074b1b109c052211450d0020114100480d010c060b200920074f0d050b20082010290200370200200a450d032002200d6a2108034002400240200f2008280200200841046a28020022072009200920074b1b109c05220d450d00200d4100480d010c050b200920074f0d050b2000200a417f6a220a4103746a2110200841086a2008290200370200200841786a2108200a0d000c030b0b41bc83c600200820011034000b41cc83c600200520011034000b200841086a21100b201020093602042010200f3602000b200641016a21060240200120056b220d4102490d0002400240200b280208200b280200220f200b41046a2802002209200b410c6a2802002208200820094b1b109c05220a450d00200a4100480d010c020b200820094f0d010b200b41086a2111200b200b2902083702000240200d4103490d004103210a41022107034002400240200b20074103746a2208280200200f2009200841046a2802002207200720094b1b109c052210450d00201041004e0d030c010b200720094f0d020b200841786a20082902003702000240200a200d4f0d00200a2107200a41016a210a200821110c010b0b200821110b2011200f360200201120093602040b20064105470d000b4100210a0b200a0bb60202057f017e03402002410174220341017221040240024002400240200341026a220320014f0d00200420014f0d0102400240200020044103746a2205280200200020034103746a2206280200200641046a2802002206200541046a2802002205200520064b1b109c052207450d00417f410120074100481b21060c010b417f200520064720052006491b21060b200320042006417f461b21040b0240200420014f0d00200220014f0d020240200020024103746a2202280200200020044103746a2203280200200341046a2802002206200241046a2802002205200520064b1b109c052207450d00200741004e0d010c040b20052006490d030b0f0b41c885c600200420011034000b41d885c600200220011034000b200229020021082002200329020037020020032008370200200421020c000b0b1500200120002802002200280200200028020810450bf30201037f230041c0006b22022400200141086a2802002103200128020421042002200128020022013602100240024002402001418080044b0d0002402004450d0020022003360214200120034b0d022003418080044d0d002002413c6a41013602002002420237022c200241f8a7c6003602282002410136021c200241d4a7c6003602182002200241186a3602382002200241286a10330c030b200241003602000c020b2002413c6a41013602002002420237022c200241d8a7c6003602282002410136021c200241d4a7c6003602182002200241186a3602382002200241286a10330c010b200241246a41013602002002413c6a41023602002002420237022c200241e8a7c6003602282002410136021c2002200241186a3602382002200241106a3602202002200241146a3602182002200241286a10330b024002402002280200450d0020002002290300370200200041086a200241086a2802003602000c010b200041003602000b200241c0006a24000bf80501037f230041f0006b2204240002400240024002400240024020012802084102460d00412e10282201450d01200041013a0000200141266a41002900eca946370000200141206a41002900e6a946370000200141186a41002900dea946370000200141106a41002900d6a946370000200141086a41002900cea946370000200141002900c6a946370000200041086a42ae808080e005370200200041046a20013602000c050b02400240024002400240200128020022052d0000416e6a2201411e4b0d004100210620010e1f03000000000000000000000000000000000000000000000000000008040102030b412010282201450d05200041013a0000200141186a410029008caa46370000200141106a4100290084aa46370000200141086a41002900fca946370000200141002900f4a946370000200041086a42a08080808004370200200041046a20013602000c080b410221060c060b410321060c050b20042005280204220136020c0240024020012003490d004194aac6002105200441e8006a2103200441d0006a2101200441c0006a21020c010b200220014101746a22012d0001450d0441a4aac6002105200441386a2103200441206a2101200441106a21020b20034101360204200141146a410136020020012003360210200142023702042001200536020020032004410c6a360200200220011033200041013a00002000410c6a200241086a280200360200200041046a20022902003702000c050b410121060c030b412e41011037000b412041011037000b20012d000021060b0240200541106a2d00004106470d00200041003a0000200020063a00010c010b0240412910282201450d00200041013a0000200141286a41002d00dcaa463a0000200141206a41002900d4aa46370000200141186a41002900ccaa46370000200141106a41002900c4aa46370000200141086a41002900bcaa46370000200141002900b4aa46370000200041086a42a98080809005370200200041046a20013602000c010b412941011037000b200441f0006a24000b86c30103087f027e017f230041f0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00000eac0100e1010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01000b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810282200450dab012003421837025c20032000360258200341d8006a4100411810870520032003280260220041186a3602602000200328025822016a41184196adc60041181088052003200329025c37025c200320013602584193a2c600413b200341d8006a41d0a2c6001038000b02400240200128022820044103746a22052802002204200141206a220628020022024b0d00200421010c010b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490de0012007410174220a2009200a20094b1b22094100480de0010240024020070d002009102821070c010b200128021820072009102c21070b2007450dad01200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a22021099051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060ce0010b0240200141306a2802002204200141346a22052802004f0d002002310001210b200141206a350200210c024020042001412c6a280200470d00200441016a22022004490ddf01200441017422052002200520024b1b220241ffffffff01712002470ddf01200241037422054100480ddf010240024020040d002005102821040c010b200128022820044103742005102c21040b2004450dad01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200b422886200c84370200200141306a2201200128020041016a3602000ce0010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450ddf012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450ddf012000200329023c370204200020013602000ce0010b0240200141306a2802002204200141346a22052802004f0d002002310001210b200141206a350200210c024020042001412c6a280200470d00200441016a22022004490dde01200441017422052002200520024b1b220241ffffffff01712002470dde01200241037422054100480dde010240024020040d002005102821040c010b200128022820044103742005102c21040b2004450dad01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200b422886200c8442808080803084370200200141306a2201200128020041016a3602000cdf010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450dde012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450dde012000200329023c370204200020013602000cdf010b2002310001210b200341d8006a200141186a200141286a22044100108905024020032d00584101470d002000200329025c370200200041086a200341e4006a2802003602000cdf010b0240200141306a2802002202200141346a22052802004f0d00200141206a350200210c024020022001412c6a280200470d00200241016a22052002490ddd01200241017422062005200620054b1b220541ffffffff01712005470ddd01200541037422064100480ddd010240024020020d002006102821020c010b200428020020024103742006102c21020b2002450dad01200120023602282001412c6a2005360200200141306a28020021020b200128022820024103746a200b422886200c8442808080801084370200200141306a2201200128020041016a3602000cde010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450ddd012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450ddd012000200329023c370204200020013602000cde010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810282200450dac012003421837025c20032000360258200341d8006a4100411810870520032003280260220041186a3602602000200328025822016a41184196adc60041181088052003200329025c37025c2003200136025841e0a2c6004134200341d8006a41d0a2c6001038000b02400240200141286a220228020020044103746a22042d00044101470d002004310005210b200341d8006a200141186a2002108a052003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cdf010b411a10282201450dad01200141186a41002f00aca3463b0000200141106a41002900a4a346370000200141086a410029009ca34637000020014100290094a3463700002000429a808080a003370204200020013602000cde010b0240200141306a2802002204200141346a22052802004f0d00200141206a350200210c024020042001412c6a280200470d00200441016a22052004490ddc01200441017422062005200620054b1b220541ffffffff01712005470ddc01200541037422064100480ddc010240024020040d002006102821020c010b200228020020044103742006102c21020b2002450daf01200120023602282001412c6a2005360200200141306a28020021040b200128022820044103746a200b422886200c8442808080802084370200200141306a2201200128020041016a3602000cdd010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450ddc012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450ddc012000200329023c370204200020013602000cdd010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810282200450dae012003421837025c20032000360258200341d8006a4100411810870520032003280260220041186a3602602000200328025822016a41184196adc60041181088052003200329025c37025c2003200136025841e0a2c6004134200341d8006a41d0a2c6001038000b200141286a220628020020044103746a22042d00052105024020042d00044101470d00200541ff01714104470daf010b0240024020024101460d00200341d8006a200141186a22022006108a052003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cde010b20012d003822024104460ddb01200341d8006a200141186a2205200620021089050240024020032d00584101460d000240200141206a2802002204200141246a22072802004f0d00024020042001411c6a280200470d00200441016a22072004490dde01200441017422082007200820074b1b22074100480dde010240024020040d002007102821040c010b200528020020042007102c21040b2004450db401200120043602182001411c6a2007360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cde010b200341ec006a220241013602002003420137025c20034190aec600360258200341013602042003200736020020032003360268200341106a200341d8006a103320032802102204450ddd012003200329021437021420032004360210200241013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382202450ddd01200329023c210b0c010b200328025c2202450ddc01200341e0006a290300210b0b2000200b370204200020023602000cdd010b200541ff01714104460ddb010240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490ddb01200441017422072006200720064b1b22064100480ddb010240024020040d002006102821020c010b200228020020042006102c21020b2002450db201200120023602182001411c6a2006360200200141206a28020021040b200128021820046a20053a0000200141206a2201200128020041016a3602000cdc010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200636020020032003360268200341106a200341d8006a103320032802102202450ddb012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450ddb012000200329023c370204200020013602000cdc010b2003200241046a280200220236024802400240200141306a280200220420024d0d0020042002417f736a22022004490d0141f2adc600411d1050000b200341ec006a220241023602002003411c6a41013602002003420237025c200341b0adc60036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1033200328023821042003200329023c37021420032004360210200241013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a10332003280214450dd1012003280210102a0cd1010b200141286a220428020020024103746a22022d00044103460dd10120022d0005220241ff01714104460dd101200341d8006a200141186a220520042002108905024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490ddb01200441017422072006200720064b1b22064100480ddb010240024020040d002006102821040c010b200528020020042006102c21040b2004450db301200120043602182001411c6a2006360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cd3010b200341ec006a220241013602002003420137025c20034190aec600360258200341013602042003200636020020032003360268200341106a200341d8006a103320032802102204450dd2012003200329021437021420032004360210200241013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a10332003280214450dd1012003280210102a0cd1010b200328025c2202450dd101200341e0006a290300210b0cd2010b200241046a2802002102200341d8006a200141186a2206200141286a220541001089050240024020032d00584101470d00200341e0006a290300210b200328025c22010d010cdb010b200141306a28020021042003200236024802400240200420024d0d0020042002417f736a22022004490d0141f2adc600411d1050000b200341ec006a220141023602002003411c6a41013602002003420237025c200341b0adc60036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1033200328023821022003200329023c37021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b200329023c210b200328023822010d010cdb010b200528020020024103746a22022d00044103460dda0120022d0005220241ff01714104460dda01200341d8006a200620052002108905024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490ddb01200441017422072005200720054b1b22054100480ddb010240024020040d002005102821040c010b200628020020042005102c21040b2004450db401200120043602182001411c6a2005360200200141206a28020021040b200128021820046a20023a0000200141206a2201200128020041016a3602000cdc010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450ddb012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450ddb01200329023c210b0c010b200328025c2201450dda01200341e0006a290300210b0b2000200b370204200020013602000cda010b200241046a280200220228020421062002280200210420032002280208220536024802400240200141306a280200220220054d0d0020022005417f736a22052002490d0141f2adc600411d1050000b200341ec006a220441023602002003411c6a41013602002003420237025c200341b0adc60036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1033200328023821022003200329023c37021420032002360210200441013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b2003200329023c370204200320032802383602000ccd010b410421090240200141286a220d280200220720054103746a22052d00044103460d0020052d000521090b200320093a00302006450dc801200941ff0171220a4104460dc701200641027421060340200320042802002205360248200220054d0dca0120022005417f736a220520024f0dce01200720054103746a22052d00044103460dcb0120052d000522084104460dcb01200a2008470dcb01200441046a21042006417c6a22060d000cc9010b0b20012d003822024104460dc501200341d8006a200141186a2205200141286a20021089050240024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490dd901200441017422072006200720064b1b22064100480dd9010240024020040d002006102821040c010b200528020020042006102c21040b2004450db301200120043602182001411c6a2006360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cc8010b200341ec006a220241013602002003420137025c20034190aec600360258200341013602042003200636020020032003360268200341106a200341d8006a103320032802102204450dc7012003200329021437021420032004360210200241013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382202450dc701200329023c210b0c010b200328025c2202450dc601200341e0006a290300210b0b2000200b370204200020023602000cd8010b200128020021042003200241046a2802002202360254024002400240200441386a28020020024b0d00200341ec006a41013602002003420237025c200341e4abc600360258200341013602342003200341306a3602682003200341d4006a360230200341386a200341d8006a1033200341186a200329023c370300200341013602102003200328023822043602140c010b2003200428023020024102746a2802002202360200024002402004412c6a28020020024b0d0041012105200341ec006a41013602002003420237025c20034188acc6003602582003410136024c2003200341c8006a36026820032003360248200341386a200341d8006a1033200341186a200329023c220b370300200b422088a7210720032802382104200ba721020c010b2003411c6a200428022420024104746a22042d000d22073a0000200341186a2004280208220236020020042802002104410021050b20032005360210200320043602142005450d010b200341186a21010cc3010b02402002450d002004417f6a2104200141286a2105200141186a21060340200341d8006a20062005200420026a2d0000108905024020032d00584101470d00200341e0006a2101200328025c21040cc5010b2002417f6a22020d000b0b200741ff01714104460dd6010240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490dd601200241017422052004200520044b1b22044100480dd6010240024020020d002004102821020c010b200128021820022004102c21020b2002450db101200120023602182001411c6a2004360200200141206a28020021020b200128021820026a20073a0000200141206a2201200128020041016a3602000cd7010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200436020020032003360268200341106a200341d8006a103320032802102202450dd6012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382204450dd601200329023c210b0cc3010b200241046a28020021062001280200210220034100360238024002400240200241146a2802000d00200341d8006a41146a41013602002003420237025c200341c4abc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10330c010b200341d8006a200141186a2204200141286a22054100108905024020032d00584101470d00200341e0006a290300210b0cc2010b20012802002207412c6a280200210220032006360238200220064b0d01200341ec006a41013602002003420237025c20034188acc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10330b2003290214210b200328021022010dc1010cd6010b200728022420064104746a22062d000d2107024020062802082202450d002006280200417f6a21060340200341d8006a20042005200620026a2d0000108905024020032d00584101470d00200341e0006a290300210b0cc2010b2002417f6a22020d000b0b200741ff01714104460dd5010240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490dd501200241017422062005200620054b1b22054100480dd5010240024020020d002005102821020c010b200428020020022005102c21020b2002450db101200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20073a0000200141206a2201200128020041016a3602000cd6010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450dd5012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450dd501200329023c210b0cc0010b200341d8006a200141186a200141286a410410890520032d00584101470dd401200328025c2201450dd4012000200341e0006a290300370204200020013602000cd5010b200341d8006a200141186a2204200141286a22054100108905200341d8006a21020240024020032d00584101460d00200341d8006a200420054104108905200341d8006a210220032d00584101460d00200341d8006a2004200520032d00592206108905200341d8006a210220032d00584101460d000240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490dd501200241017422072005200720054b1b22054100480dd5010240024020020d002005102821020c010b200428020020022005102c21020b2002450db201200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20063a0000200141206a2201200128020041016a3602000cd6010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450dd5012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450dd501200329023c210b0c010b200241046a2802002201450dd401200241086a290200210b0b2000200b370204200020013602000cd4010b200341d8006a200141046a200241046a280200108b050240024020032d00584101460d000240200141206a2802002202200141246a22042802004f0d0020032d00592104024020022001411c6a280200470d00200241016a22052002490dd401200241017422062005200620054b1b22054100480dd4010240024020020d002005102821020c010b200128021820022005102c21020b2002450db201200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cd5010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200436020020032003360268200341106a200341d8006a103320032802102202450dd4012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450dd401200329023c210b0c010b200328025c2201450dd301200341e0006a290300210b0b2000200b370204200020013602000cd3010b2003200241046a2802002202360200200341d8006a200141046a2002108b05024020032d00584101470d002003200328025c22013602382003200341e0006a290300220b37023c0cbb010b200320032d005922023a0030200341d8006a200141186a200141286a4104108905024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380cba010b200320032d005922013a004820014104460dd101200241ff01712001460dd101200341106a41146a41303602002003411c6a4127360200200341d8006a41146a41033602002003420337025c200341d0a3c600360258200341013602142003200341106a3602682003200341c8006a3602202003200341306a36021820032003360210200341386a200341d8006a10330cb9010b200341d8006a200141046a200241046a280200108b050240024020032d00584101460d00200341d8006a200141186a2205200141286a20032d00592204108905024020032d00584101460d000240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490dd301200241017422072006200720064b1b22064100480dd3010240024020020d002006102821020c010b200528020020022006102c21020b2002450db201200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cd4010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200636020020032003360268200341106a200341d8006a103320032802102202450dd3012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450dd301200329023c210b0c020b200328025c2201450dd201200341e0006a290300210b0c010b200328025c2201450dd101200341e0006a290300210b0b2000200b370204200020013602000cd1010b200128020021042003200241046a280200220236023802400240200441206a28020020024d0d000240200141206a2802002205200141246a22062802004f0d00200428021820024101746a2d00002102024020052001411c6a280200470d00200541016a22042005490dd101200541017422062004200620044b1b22044100480dd1010240024020050d002004102821050c010b200128021820052004102c21050b2005450db101200120053602182001411c6a2004360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000cd2010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200636020020032003360268200341106a200341d8006a103320032802102202450dd1012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450dd101200329023c210b0c010b200341ec006a41013602002003420237025c200341a8acc6003602582003410136024c2003200341c8006a3602682003200341386a360248200341106a200341d8006a103320032802102201450dd0012003290214210b0b2000200b370204200020013602000cd0010b2003200241046a28020022023602282001280200210420032002360254024002400240200441206a28020020024b0d00200341ec006a41013602002003420237025c200341a8acc6003602582003410136024c2003200341c8006a3602682003200341d4006a360248200341106a200341d8006a10330c010b200428021820024101746a22022d00010d01200341ec006a41013602002003420237025c200341b8acc60036025820034101360204200320033602682003200341d4006a360200200341106a200341d8006a10330b2003280210210120032003290214220b37023c200320013602380cb6010b200320022d000022023a002f200341d8006a200141186a200141286a4104108905024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380cb5010b200320032d005922013a00002001200241ff0171460dce0120014104460dce01200341106a41146a41303602002003411c6a4130360200200341d8006a41146a41033602002003420337025c200341e8a3c600360258200341013602142003200341106a3602682003200336022020032003412f6a3602182003200341286a360210200341386a200341d8006a10330cb4010b200341d8006a2001200241046a28020041044100108d052003280258450dcd0120002003290358370200200041086a200341d8006a41086a2802003602000cce010b200341d8006a2001200241046a28020041084101108d052003280258450dcc0120002003290358370200200041086a200341d8006a41086a2802003602000ccd010b200341d8006a2001200241046a28020041044102108d052003280258450dcb0120002003290358370200200041086a200341d8006a41086a2802003602000ccc010b200341d8006a2001200241046a28020041084103108d052003280258450dca0120002003290358370200200041086a200341d8006a41086a2802003602000ccb010b200341d8006a2001200241046a28020041014100108d052003280258450dc90120002003290358370200200041086a200341d8006a41086a2802003602000cca010b200341d8006a2001200241046a28020041014100108d052003280258450dc80120002003290358370200200041086a200341d8006a41086a2802003602000cc9010b200341d8006a2001200241046a28020041024100108d052003280258450dc70120002003290358370200200041086a200341d8006a41086a2802003602000cc8010b200341d8006a2001200241046a28020041024100108d052003280258450dc60120002003290358370200200041086a200341d8006a41086a2802003602000cc7010b200341d8006a2001200241046a28020041014101108d052003280258450dc50120002003290358370200200041086a200341d8006a41086a2802003602000cc6010b200341d8006a2001200241046a28020041014101108d052003280258450dc40120002003290358370200200041086a200341d8006a41086a2802003602000cc5010b200341d8006a2001200241046a28020041024101108d052003280258450dc30120002003290358370200200041086a200341d8006a41086a2802003602000cc4010b200341d8006a2001200241046a28020041024101108d052003280258450dc20120002003290358370200200041086a200341d8006a41086a2802003602000cc3010b200341d8006a2001200241046a28020041044101108d052003280258450dc10120002003290358370200200041086a200341d8006a41086a2802003602000cc2010b200341d8006a2001200241046a28020041044101108d052003280258450dc00120002003290358370200200041086a200341d8006a41086a2802003602000cc1010b200341d8006a2001200241046a28020041044100108e052003280258450dbf0120002003290358370200200041086a200341d8006a41086a2802003602000cc0010b200341d8006a2001200241046a28020041084101108e052003280258450dbe0120002003290358370200200041086a200341d8006a41086a2802003602000cbf010b200341d8006a2001200241046a28020041044102108e052003280258450dbd0120002003290358370200200041086a200341d8006a41086a2802003602000cbe010b200341d8006a2001200241046a28020041084103108e052003280258450dbc0120002003290358370200200041086a200341d8006a41086a2802003602000cbd010b200341d8006a2001200241046a28020041014100108e052003280258450dbb0120002003290358370200200041086a200341d8006a41086a2802003602000cbc010b200341d8006a2001200241046a28020041024100108e052003280258450dba0120002003290358370200200041086a200341d8006a41086a2802003602000cbb010b200341d8006a2001200241046a28020041014101108e052003280258450db90120002003290358370200200041086a200341d8006a41086a2802003602000cba010b200341d8006a2001200241046a28020041024101108e052003280258450db80120002003290358370200200041086a200341d8006a41086a2802003602000cb9010b200341d8006a2001200241046a28020041044101108e052003280258450db70120002003290358370200200041086a200341d8006a41086a2802003602000cb8010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c20034194abc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a103320032802102202450d002003290214210b0c010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db701200241017422052004200520044b1b22044100480db7010240024020020d002004102821020c010b200128021820022004102c21020b2002450d9801200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb8010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200436020020032003360268200341106a200341d8006a103320032802102202450db7012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382202450db701200329023c210b0b2000200b370204200020023602000cb7010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c20034194abc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a103320032802102202450d002003290214210b0c010b200341d8006a200141186a2204200141286a4100108905024020032d00584101460d000240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490db701200241017422062005200620054b1b22054100480db7010240024020020d002005102821020c010b200428020020022005102c21020b2002450d9901200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb8010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102202450db7012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382202450db701200329023c210b0c010b200328025c2202450db601200341e0006a290300210b0b2000200b370204200020023602000cb6010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db401200241017422052004200520044b1b22044100480db4010240024020020d002004102821020c010b200128021820022004102c21020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb5010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200436020020032003360268200341106a200341d8006a103320032802102202450db4012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450db4012000200329023c370204200020013602000cb5010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db301200241017422052004200520044b1b22044100480db3010240024020020d002004102821020c010b200128021820022004102c21020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41013a0000200141206a2201200128020041016a3602000cb4010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200436020020032003360268200341106a200341d8006a103320032802102202450db3012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450db3012000200329023c370204200020013602000cb4010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db201200241017422052004200520044b1b22044100480db2010240024020020d002004102821020c010b200128021820022004102c21020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41023a0000200141206a2201200128020041016a3602000cb3010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200436020020032003360268200341106a200341d8006a103320032802102202450db2012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450db2012000200329023c370204200020013602000cb3010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db101200241017422052004200520044b1b22044100480db1010240024020020d002004102821020c010b200128021820022004102c21020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41033a0000200141206a2201200128020041016a3602000cb2010b200341ec006a220141013602002003420137025c20034190aec600360258200341013602042003200436020020032003360268200341106a200341d8006a103320032802102202450db1012003200329021437021420032002360210200141013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382201450db1012000200329023c370204200020013602000cb2010b200341d8006a20014100108f052003280258450db00120002003290358370200200041086a200341d8006a41086a2802003602000cb1010b200341d8006a200141001090052003280258450daf0120002003290358370200200041086a200341d8006a41086a2802003602000cb0010b200341d8006a200141001090052003280258450dae0120002003290358370200200041086a200341d8006a41086a2802003602000caf010b200341d8006a200141001090052003280258450dad0120002003290358370200200041086a200341d8006a41086a2802003602000cae010b200341d8006a200141001090052003280258450dac0120002003290358370200200041086a200341d8006a41086a2802003602000cad010b200341d8006a200141001090052003280258450dab0120002003290358370200200041086a200341d8006a41086a2802003602000cac010b200341d8006a200141001090052003280258450daa0120002003290358370200200041086a200341d8006a41086a2802003602000cab010b200341d8006a200141001090052003280258450da90120002003290358370200200041086a200341d8006a41086a2802003602000caa010b200341d8006a200141001090052003280258450da80120002003290358370200200041086a200341d8006a41086a2802003602000ca9010b200341d8006a200141001090052003280258450da70120002003290358370200200041086a200341d8006a41086a2802003602000ca8010b200341d8006a200141001090052003280258450da60120002003290358370200200041086a200341d8006a41086a2802003602000ca7010b200341d8006a20014101108f052003280258450da50120002003290358370200200041086a200341d8006a41086a2802003602000ca6010b200341d8006a200141011090052003280258450da40120002003290358370200200041086a200341d8006a41086a2802003602000ca5010b200341d8006a200141011090052003280258450da30120002003290358370200200041086a200341d8006a41086a2802003602000ca4010b200341d8006a200141011090052003280258450da20120002003290358370200200041086a200341d8006a41086a2802003602000ca3010b200341d8006a200141011090052003280258450da10120002003290358370200200041086a200341d8006a41086a2802003602000ca2010b200341d8006a200141011090052003280258450da00120002003290358370200200041086a200341d8006a41086a2802003602000ca1010b200341d8006a200141011090052003280258450d9f0120002003290358370200200041086a200341d8006a41086a2802003602000ca0010b200341d8006a200141011090052003280258450d9e0120002003290358370200200041086a200341d8006a41086a2802003602000c9f010b200341d8006a200141011090052003280258450d9d0120002003290358370200200041086a200341d8006a41086a2802003602000c9e010b200341d8006a200141011090052003280258450d9c0120002003290358370200200041086a200341d8006a41086a2802003602000c9d010b200341d8006a200141011090052003280258450d9b0120002003290358370200200041086a200341d8006a41086a2802003602000c9c010b200341d8006a200141021090052003280258450d9a0120002003290358370200200041086a200341d8006a41086a2802003602000c9b010b200341d8006a200141021090052003280258450d990120002003290358370200200041086a200341d8006a41086a2802003602000c9a010b200341d8006a200141021090052003280258450d980120002003290358370200200041086a200341d8006a41086a2802003602000c99010b200341d8006a200141021090052003280258450d970120002003290358370200200041086a200341d8006a41086a2802003602000c98010b200341d8006a200141021090052003280258450d960120002003290358370200200041086a200341d8006a41086a2802003602000c97010b200341d8006a200141021090052003280258450d950120002003290358370200200041086a200341d8006a41086a2802003602000c96010b200341d8006a200141031090052003280258450d940120002003290358370200200041086a200341d8006a41086a2802003602000c95010b200341d8006a200141031090052003280258450d930120002003290358370200200041086a200341d8006a41086a2802003602000c94010b200341d8006a200141031090052003280258450d920120002003290358370200200041086a200341d8006a41086a2802003602000c93010b200341d8006a200141031090052003280258450d910120002003290358370200200041086a200341d8006a41086a2802003602000c92010b200341d8006a200141031090052003280258450d900120002003290358370200200041086a200341d8006a41086a2802003602000c91010b200341d8006a200141031090052003280258450d8f0120002003290358370200200041086a200341d8006a41086a2802003602000c90010b200341d8006a200141001091052003280258450d8e0120002003290358370200200041086a200341d8006a41086a2802003602000c8f010b200341d8006a200141001091052003280258450d8d0120002003290358370200200041086a200341d8006a41086a2802003602000c8e010b200341d8006a200141001091052003280258450d8c0120002003290358370200200041086a200341d8006a41086a2802003602000c8d010b200341d8006a200141001092052003280258450d8b0120002003290358370200200041086a200341d8006a41086a2802003602000c8c010b200341d8006a200141001092052003280258450d8a0120002003290358370200200041086a200341d8006a41086a2802003602000c8b010b200341d8006a200141001092052003280258450d890120002003290358370200200041086a200341d8006a41086a2802003602000c8a010b200341d8006a200141001092052003280258450d880120002003290358370200200041086a200341d8006a41086a2802003602000c89010b200341d8006a200141001092052003280258450d870120002003290358370200200041086a200341d8006a41086a2802003602000c88010b200341d8006a200141001092052003280258450d860120002003290358370200200041086a200341d8006a41086a2802003602000c87010b200341d8006a200141001092052003280258450d850120002003290358370200200041086a200341d8006a41086a2802003602000c86010b200341d8006a200141001092052003280258450d840120002003290358370200200041086a200341d8006a41086a2802003602000c85010b200341d8006a200141001092052003280258450d830120002003290358370200200041086a200341d8006a41086a2802003602000c84010b200341d8006a200141001092052003280258450d820120002003290358370200200041086a200341d8006a41086a2802003602000c83010b200341d8006a200141001092052003280258450d810120002003290358370200200041086a200341d8006a41086a2802003602000c82010b200341d8006a200141001092052003280258450d800120002003290358370200200041086a200341d8006a41086a2802003602000c81010b200341d8006a200141001092052003280258450d7f20002003290358370200200041086a200341d8006a41086a2802003602000c80010b200341d8006a200141001092052003280258450d7e20002003290358370200200041086a200341d8006a41086a2802003602000c7f0b200341d8006a200141001092052003280258450d7d20002003290358370200200041086a200341d8006a41086a2802003602000c7e0b200341d8006a200141011091052003280258450d7c20002003290358370200200041086a200341d8006a41086a2802003602000c7d0b200341d8006a200141011091052003280258450d7b20002003290358370200200041086a200341d8006a41086a2802003602000c7c0b200341d8006a200141011091052003280258450d7a20002003290358370200200041086a200341d8006a41086a2802003602000c7b0b200341d8006a200141011092052003280258450d7920002003290358370200200041086a200341d8006a41086a2802003602000c7a0b200341d8006a200141011092052003280258450d7820002003290358370200200041086a200341d8006a41086a2802003602000c790b200341d8006a200141011092052003280258450d7720002003290358370200200041086a200341d8006a41086a2802003602000c780b200341d8006a200141011092052003280258450d7620002003290358370200200041086a200341d8006a41086a2802003602000c770b200341d8006a200141011092052003280258450d7520002003290358370200200041086a200341d8006a41086a2802003602000c760b200341d8006a200141011092052003280258450d7420002003290358370200200041086a200341d8006a41086a2802003602000c750b200341d8006a200141011092052003280258450d7320002003290358370200200041086a200341d8006a41086a2802003602000c740b200341d8006a200141011092052003280258450d7220002003290358370200200041086a200341d8006a41086a2802003602000c730b200341d8006a200141011092052003280258450d7120002003290358370200200041086a200341d8006a41086a2802003602000c720b200341d8006a200141011092052003280258450d7020002003290358370200200041086a200341d8006a41086a2802003602000c710b200341d8006a200141011092052003280258450d6f20002003290358370200200041086a200341d8006a41086a2802003602000c700b200341d8006a200141011092052003280258450d6e20002003290358370200200041086a200341d8006a41086a2802003602000c6f0b200341d8006a200141011092052003280258450d6d20002003290358370200200041086a200341d8006a41086a2802003602000c6e0b200341d8006a200141011092052003280258450d6c20002003290358370200200041086a200341d8006a41086a2802003602000c6d0b200341d8006a200141011092052003280258450d6b20002003290358370200200041086a200341d8006a41086a2802003602000c6c0b200341d8006a200141021091052003280258450d6a20002003290358370200200041086a200341d8006a41086a2802003602000c6b0b200341d8006a200141021091052003280258450d6920002003290358370200200041086a200341d8006a41086a2802003602000c6a0b200341d8006a200141021091052003280258450d6820002003290358370200200041086a200341d8006a41086a2802003602000c690b200341d8006a200141021091052003280258450d6720002003290358370200200041086a200341d8006a41086a2802003602000c680b200341d8006a200141021091052003280258450d6620002003290358370200200041086a200341d8006a41086a2802003602000c670b200341d8006a200141021091052003280258450d6520002003290358370200200041086a200341d8006a41086a2802003602000c660b200341d8006a200141021091052003280258450d6420002003290358370200200041086a200341d8006a41086a2802003602000c650b200341d8006a200141021092052003280258450d6320002003290358370200200041086a200341d8006a41086a2802003602000c640b200341d8006a200141021092052003280258450d6220002003290358370200200041086a200341d8006a41086a2802003602000c630b200341d8006a200141021092052003280258450d6120002003290358370200200041086a200341d8006a41086a2802003602000c620b200341d8006a200141021092052003280258450d6020002003290358370200200041086a200341d8006a41086a2802003602000c610b200341d8006a200141021092052003280258450d5f20002003290358370200200041086a200341d8006a41086a2802003602000c600b200341d8006a200141021092052003280258450d5e20002003290358370200200041086a200341d8006a41086a2802003602000c5f0b200341d8006a200141021092052003280258450d5d20002003290358370200200041086a200341d8006a41086a2802003602000c5e0b200341d8006a200141031091052003280258450d5c20002003290358370200200041086a200341d8006a41086a2802003602000c5d0b200341d8006a200141031091052003280258450d5b20002003290358370200200041086a200341d8006a41086a2802003602000c5c0b200341d8006a200141031091052003280258450d5a20002003290358370200200041086a200341d8006a41086a2802003602000c5b0b200341d8006a200141031091052003280258450d5920002003290358370200200041086a200341d8006a41086a2802003602000c5a0b200341d8006a200141031091052003280258450d5820002003290358370200200041086a200341d8006a41086a2802003602000c590b200341d8006a200141031091052003280258450d5720002003290358370200200041086a200341d8006a41086a2802003602000c580b200341d8006a200141031091052003280258450d5620002003290358370200200041086a200341d8006a41086a2802003602000c570b200341d8006a200141031092052003280258450d5520002003290358370200200041086a200341d8006a41086a2802003602000c560b200341d8006a200141031092052003280258450d5420002003290358370200200041086a200341d8006a41086a2802003602000c550b200341d8006a200141031092052003280258450d5320002003290358370200200041086a200341d8006a41086a2802003602000c540b200341d8006a200141031092052003280258450d5220002003290358370200200041086a200341d8006a41086a2802003602000c530b200341d8006a200141031092052003280258450d5120002003290358370200200041086a200341d8006a41086a2802003602000c520b200341d8006a200141031092052003280258450d5020002003290358370200200041086a200341d8006a41086a2802003602000c510b200341d8006a200141031092052003280258450d4f20002003290358370200200041086a200341d8006a41086a2802003602000c500b200341d8006a2001410141001093052003280258450d4e20002003290358370200200041086a200341d8006a41086a2802003602000c4f0b200341d8006a2001410241001093052003280258450d4d20002003290358370200200041086a200341d8006a41086a2802003602000c4e0b200341d8006a2001410241001093052003280258450d4c20002003290358370200200041086a200341d8006a41086a2802003602000c4d0b200341d8006a2001410341001093052003280258450d4b20002003290358370200200041086a200341d8006a41086a2802003602000c4c0b200341d8006a2001410341001093052003280258450d4a20002003290358370200200041086a200341d8006a41086a2802003602000c4b0b200341d8006a2001410041011093052003280258450d4920002003290358370200200041086a200341d8006a41086a2802003602000c4a0b200341d8006a2001410041011093052003280258450d4820002003290358370200200041086a200341d8006a41086a2802003602000c490b200341d8006a2001410241011093052003280258450d4720002003290358370200200041086a200341d8006a41086a2802003602000c480b200341d8006a2001410241011093052003280258450d4620002003290358370200200041086a200341d8006a41086a2802003602000c470b200341d8006a2001410341011093052003280258450d4520002003290358370200200041086a200341d8006a41086a2802003602000c460b200341d8006a2001410341011093052003280258450d4420002003290358370200200041086a200341d8006a41086a2802003602000c450b200341d8006a2001410041021093052003280258450d4320002003290358370200200041086a200341d8006a41086a2802003602000c440b200341d8006a2001410041021093052003280258450d4220002003290358370200200041086a200341d8006a41086a2802003602000c430b200341d8006a2001410141021093052003280258450d4120002003290358370200200041086a200341d8006a41086a2802003602000c420b200341d8006a2001410141021093052003280258450d4020002003290358370200200041086a200341d8006a41086a2802003602000c410b200341d8006a2001410341021093052003280258450d3f20002003290358370200200041086a200341d8006a41086a2802003602000c400b200341d8006a2001410041031093052003280258450d3e20002003290358370200200041086a200341d8006a41086a2802003602000c3f0b200341d8006a2001410041031093052003280258450d3d20002003290358370200200041086a200341d8006a41086a2802003602000c3e0b200341d8006a2001410141031093052003280258450d3c20002003290358370200200041086a200341d8006a41086a2802003602000c3d0b200341d8006a2001410141031093052003280258450d3b20002003290358370200200041086a200341d8006a41086a2802003602000c3c0b200341d8006a2001410241031093052003280258450d3a20002003290358370200200041086a200341d8006a41086a2802003602000c3b0b200341d8006a2001410241001093052003280258450d3920002003290358370200200041086a200341d8006a41086a2802003602000c3a0b200341d8006a2001410341011093052003280258450d3820002003290358370200200041086a200341d8006a41086a2802003602000c390b200341d8006a2001410041021093052003280258450d3720002003290358370200200041086a200341d8006a41086a2802003602000c380b200341d8006a20014101410310930520032802580d1b0c360b411841011037000b200941011037000b200541041037000b200541041037000b200641041037000b411841011037000b411a41011037000b200641041037000b411841011037000b200341ec006a41013602002003420237025c200341b0a3c6003602582003413136023c2003200441056a3602382003200341386a360268200341106a200341d8006a1033200041086a200341106a41086a280200360200200020032903103702000c2d0b200741011037000b200641011037000b200641011037000b200541011037000b200641011037000b200441011037000b200541011037000b200541011037000b200541011037000b200641011037000b200441011037000b200441011037000b200541011037000b200441011037000b200441011037000b200441011037000b200441011037000b20002003290358370200200041086a200341d8006a41086a2802003602000c1b0b200329023c210b200328023821010b2001450d182000200b370204200020013602000c190b200329023c210b200328023821010b2001450d162000200b370204200020013602000c170b200328025c2201450d150b2000200b370204200020013602000c150b2004450d132001290200210b0b2000200b370204200020043602000c130b02400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d00200128022820044103746a22052802002204200141206a220628020022024b0d01200421010c020b411810282200450d022003421837025c20032000360258200341d8006a4100411810870520032003280260220041186a3602602000200328025822016a41184196adc60041181088052003200329025c37025c200320013602584193a2c600413b200341d8006a41d0a2c6001038000b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490d132007410174220a2009200a20094b1b22094100480d130240024020070d002009102821070c010b200128021820072009102c21070b2007450d03200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a22021099051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060c130b411841011037000b200941011037000b200641027421060340200320042802002205360248200220054d0d0220022005417f736a220520024f0d060240200720054103746a22052d00044103460d0020052d00054104470d040b200441046a21042006417c6a22060d000b410421090b200341d8006a200141186a2202200d410010890520032d00584101470d02200341086a200341e4006a2802003602002003200329025c3703000c030b200341ec006a220441023602002003411c6a41013602002003420237025c200341b0adc60036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1033200328023821022003200329023c37021420032002360210200441013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b2003200329023c370204200320032802383602000c020b2003411c6a4131360200200341ec006a41023602002003420237025c200341c0a3c6003602582003200541056a360218200341313602142003200341106a3602682003200341306a3602102003200341d8006a10330c010b0240200941ff01714104460d00200341d8006a2002200d200910890502400240024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490d10200441017422062005200620054b1b22054100480d100240024020040d002005102821020c010b200228020020042005102c21020b2002450d04200120023602182001411c6a2005360200200141206a28020021040b200128021820046a20093a0000200141206a2202200228020041016a3602000c040b200341ec006a220241013602002003420137025c20034190aec600360258200341013602042003200536020020032003360268200341106a200341d8006a103320032802102204450d032003200329021437021420032004360210200241013602002003420137025c200341c4a7c60036025820034128360204200320033602682003200341106a360200200341386a200341d8006a103302402003280214450d002003280210102a0b20032802382202450d03200329023c210b0c010b200328025c2202450d02200341e0006a290300210b0b2003200b370204200320023602000c020b200541011037000b200341003602000b024020032802002202450d0020002003290204370204200020023602000c0d0b0240024002400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810282200450d012003421837025c20032000360258200341d8006a4100411810870520032003280260220041186a3602602000200328025822016a41184196adc60041181088052003200329025c37025c200320013602584193a2c600413b200341d8006a41d0a2c6001038000b02400240200128022820044103746a22052802002204200141206a220628020022024b0d00200421010c010b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490d0d2007410174220a2009200a20094b1b22094100480d0d0240024020070d002009102821070c010b200128021820072009102c21070b2007450d03200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a22021099051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060c0d0b411841011037000b200941011037000b41f2adc600411d1050000b20032802382202450d00200329023c210b0c010b200141306a2802002202417f6a220420024f0d01200420024b0d01200128022820044103746a22052802002204200141206a220628020022024b0d02200421010c030b2000200b370204200020023602000c080b411810282200450d022003421837025c20032000360258200341d8006a4100411810870520032003280260220041186a3602602000200328025822016a41184196adc60041181088052003200329025c37025c200320013602584193a2c600413b200341d8006a41d0a2c6001038000b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490d042007410174220a2009200a20094b1b22094100480d040240024020070d002009102821070c010b200128021820072009102c21070b2007450d03200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a22021099051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060c040b411841011037000b200941011037000b1031000b200341d8006a200141186a2006108a052003280258450d0020002003290358370200200041086a200341d8006a41086a2802003602000c010b200041003602000b200341f0006a24000b6401017f230041206b2202240020024132360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241b0aec6003602082002200236021820012000200241086a10352101200241206a240020010b810101017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014100480d020240024020030d002001102821020c010b200028020020032001102c21020b2002450d0120002002360200200041046a20013602000b0f0b200141011037000b1031000bd90101017f230041e0006b22042400200420013602082004200336020c024020012003470d00200020022001109a051a200441e0006a24000f0b200441286a41146a4108360200200441346a4125360200200441106a41146a410336020020044203370214200441c8afc6003602102004412536022c2004200441086a36024020042004410c6a360244200442043703582004420137024c2004419cb0c6003602482004200441286a3602202004200441c8006a3602382004200441c4006a3602302004200441c0006a360228200441106a41d8b0c600103e000bb90601037f230041d0006b22042400200420033a000f0240024002400240024020022802082205417f6a220620054f0d00200620054d0d010b411810282202450d012004421837023420042002360230200441306a4100411810870520042004280238220241186a3602382002200428023022056a41184196adc6004118108805200420042902343702342004200536023041e0a2c6004134200441306a41d0a2c6001038000b200141086a2802002105200228020020064103746a2206280200210202400240024020062d0006450d0020052002460d010b024002400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d00002205417c6a220241014b0d02024020020e020400040b4118102822020d01411841011037000b412b10282202450d05200041013a0000200241276a41002800fea646360000200241206a41002900f7a646370000200241186a41002900efa646370000200241106a41002900e7a646370000200241086a41002900dfa646370000200241002900d7a646370000200041086a42ab808080b005370200200041046a20023602000c060b200241106a41002900a6ad46370000200241086a410029009ead4637000020024100290096ad4637000020044298808080800337022420042002360220200441c4006a410136020020044201370234200441c4a7c6003602302004412836024c2004200441c8006a3602402004200441206a360248200441106a200441306a103302402004280224450d002004280220102a0b200041013a0000200041046a20042903103702002000410c6a200441106a41086a2802003602000c050b0240200341ff017122024104460d0020052002470d020b200041003a0000200020053a00010c040b20004180083b01000c030b200420053a0048200441c4006a4102360200200441206a410c6a41303602002004420237023420044184a7c600360230200441303602242004200441206a3602402004200441c8006a36022820042004410f6a360220200441106a200441306a10332000410c6a200441186a280200360200200041046a2004290310370200200041013a00000c020b411841011037000b412b41011037000b200441d0006a24000bbd0502047f017e230041d0006b22032400024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044d0d010b411810282202450d01200241106a41002900a6ad46370000200241086a410029009ead4637000020024100290096ad4637000020034298808080800337022420032002360220200341cc006a41013602002003420137023c200341c4a7c600360238200341283602142003200341106a3602482003200341206a3602102000200341386a10332003280224450d042003280220102a0c040b0240024002402002280200220620054103746a2d000522054104460d00200341386a200120022005108905024020032d00384101470d002000200329023c370200200041086a200341c4006a2802003602000c070b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d010b411810282202450d02200241106a41002900a6ad46370000200241086a410029009ead4637000020024100290096ad4637000020034298808080800337022420032002360220200341cc006a41013602002003420137023c200341c4a7c600360238200341283602142003200341106a3602482003200341206a3602102000200341386a10332003280224450d042003280220102a0c040b200141086a28020021022003200737030820022007a7470d02200041003602000c030b411841011037000b411841011037000b200341cc006a41023602002003412c6a41013602002003420237023c200341a4a6c60036023820034101360224200320023602342003200341206a3602482003200341086a3602282003200341346a360220200341106a200341386a1033200041086a200341106a41086a280200360200200020032903103702000b200341d0006a24000bac0301057f230041c0006b2203240020032002360200024002402001280204220420024b0d002001280208417c6a21052001410c6a280200410374210102400340024020010d00200320043602042003412c6a4102360200200341306a410c6a41013602002003420337021c200341f0aec600360218200341013602342003200341306a3602282003200341046a36023820032003360230200341086a200341186a10332000410c6a200341106a280200360200200041046a2003290308370200200041013a00000c040b02402004200541046a2802006a220620044f0d00412010282204450d02200041013a0000200441186a41002900e8ae46370000200441106a41002900e0ae46370000200441086a41002900d8ae46370000200441002900d0ae46370000200041086a42a08080808004370200200041046a20043602000c040b200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a00010c020b412041011037000b200041003a00002000200128020020026a2d00003a00010b200341c0006a24000bbd0201037f230041106b220224000240024020002d00004104470d00200220012802184181a5c60041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b200220012802184184a5c60041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a418ca5c600105d210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841f4afc00041012004411c6a28020028020c1100000d010b2001280200220028021841c8a4c60041012000411c6a28020028020c11000021000b200120003a00080b200241106a2400200041ff01714100470bfe0501037f230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200541386a200141186a2203200141286a410010890520052d00384101470d012000200529023c370200200041086a200541c4006a2802003602000c020b200541cc006a41023602002005411c6a41013602002005420337023c20054180a4c600360238200541013602142005200541106a36024820052005410c6a3602182005200541086a360210200541206a200541386a1033200041086a200541206a41086a280200360200200020052903203702000c010b2001280200210220054100360220024020022802080d00200541cc006a41013602002005420237023c20054194abc600360238200541013602342005200541306a3602482005200541206a360230200541106a200541386a103320052802102202450d0020002005290214370204200020023602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d03200241017422072006200720064b1b22064100480d030240024020020d002006102821020c010b200328020020022006102c21020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2202200228020041016a3602000c030b200541cc006a220241013602002005420137023c20054190aec60036023820054101360234200520063602302005200541306a360248200541106a200541386a103320052802102201450d022005200529021437021420052001360210200241013602002005420137023c200541c4a7c600360238200541283602342005200541306a3602482005200541106a360230200541206a200541386a103302402005280214450d002005280210102a0b20052802202202450d0220002005290224370204200020023602000c030b200641011037000b1031000b200041003602000b200541d0006a24000bae0301017f230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200128020021022005410036023420022802080d01200541cc006a41013602002005420237023c20054194abc600360238200541013602142005200541106a3602482005200541346a360210200541206a200541386a103320052802202202450d0120002005290224370204200020023602000c020b200541cc006a41023602002005412c6a41013602002005420337023c20054180a4c600360238200541013602242005200541206a36024820052005410c6a3602282005200541086a360220200541106a200541386a1033200041086a200541106a41086a280200360200200020052903103702000c010b200541386a200141186a2202200141286a22032004108905024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200541386a200220034100108905024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200041003602000b200541d0006a24000be50301047f230041c0006b22032400200341286a200141186a2204200141286a20021089050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d03200241017422062005200620054b1b22054100480d030240024020020d002005102821020c010b200428020020022005102c21020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c20034190aec60036022820034101360214200320053602102003200341106a360238200341186a200341286a103320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341c4a7c600360228200341283602142003200341106a3602382003200341186a3602102003200341286a10330240200328021c450d002003280218102a0b20032802002201450d0220002003290204370204200020013602000c030b200541011037000b1031000b200041003602000b200341c0006a24000b9e0401047f230041c0006b22032400200341286a200141186a2204200141286a220520021089050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a200420052002108905024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d03200241017422062005200620054b1b22054100480d030240024020020d002005102821020c010b200428020020022005102c21020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c20034190aec60036022820034101360214200320053602102003200341106a360238200341186a200341286a103320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341c4a7c600360228200341283602142003200341106a3602382003200341186a3602102003200341286a10330240200328021c450d002003280218102a0b20032802002201450d0220002003290204370204200020013602000c030b200541011037000b1031000b200041003602000b200341c0006a24000be50301057f230041c0006b22032400200341286a200141186a2204200141286a20021089050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d03200541017422072006200720064b1b22064100480d030240024020050d002006102821050c010b200428020020052006102c21050b2005450d02200120053602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c20034190aec60036022820034101360214200320063602102003200341106a360238200341186a200341286a103320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341c4a7c600360228200341283602142003200341106a3602382003200341186a3602102003200341286a10330240200328021c450d002003280218102a0b20032802002201450d0220002003290204370204200020013602000c030b200641011037000b1031000b200041003602000b200341c0006a24000b9e0401057f230041c0006b22032400200341286a200141186a2204200141286a220520021089050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a200420052002108905024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d03200541017422072006200720064b1b22064100480d030240024020050d002006102821040c010b200428020020052006102c21040b2004450d02200120043602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c20034190aec60036022820034101360214200320063602102003200341106a360238200341186a200341286a103320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341c4a7c600360228200341283602142003200341106a3602382003200341186a3602102003200341286a10330240200328021c450d002003280218102a0b20032802002201450d0220002003290204370204200020013602000c030b200641011037000b1031000b200041003602000b200341c0006a24000be50301047f230041c0006b22042400200441286a200141186a2205200141286a20021089050240024020042d00284101470d002000200429022c370200200041086a200441346a2802003602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d03200241017422072006200720064b1b22064100480d030240024020020d002006102821020c010b200528020020022006102c21020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20033a0000200141206a2201200128020041016a3602000c030b2004413c6a220141013602002004420137022c20044190aec60036022820044101360214200420063602102004200441106a360238200441186a200441286a103320042802182202450d022004200429021c37021c20042002360218200141013602002004420137022c200441c4a7c600360228200441283602142004200441106a3602382004200441186a3602102004200441286a10330240200428021c450d002004280218102a0b20042802002201450d0220002004290204370204200020013602000c030b200641011037000b1031000b200041003602000b200441c0006a24000b02000b17000240200041046a280200450d002000280200102a0b0b15002000280200220028020020002802082001105f0b100020012000280200200028020810450bfb0101027f230041106b220224002002200128021841b8aec60041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0aec600105d1a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841f4afc00041012000411c6a28020028020c1100000d010b2002280200220128021841c8a4c60041012001411c6a28020028020c11000021010b200220013a00080b200241106a2400200141ff01714100470b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f0240024020012000490d002002450d01200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000c020b0b2002450d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200141016a2101200041016a21002002417f6a2202450d020c000b0b200420056b21030b20030b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b3e01017f230041106b2205240020052001200220032004410010a205200529030021012000200541086a29030037030820002001370300200541106a24000b4c01017f230041206b22052400200542003703182005420037031020052001200220032004200541106a10a205200529031021012000200529031837030820002001370300200541206a24000be20502037f067e230041306b2206240002400240024002400240024002400240024002402002500d002003500d012004500d02200479a7200279a76b2207413f4b0d0341ff0020076b2108200741016a21070c080b02402004500d0020050d040c060b024002402005450d0020034200510d0620054200370308200520012003823703000c010b20034200510d050b200120038021010c060b2004500d030240024002402001500d0020047b4201510d01200479a7200279a76b2207413e4b0d0241ff0020076b2108200741016a21070c090b02402005450d0020054200370300200520022004823703080b200220048021010c070b02402005450d002005200137030020052004427f7c2002833703080b200220047a423f838821010c060b2005450d040c020b024020037b4201510d0041bf7f200379a7200279a76b22076b2108200741c1006a21070c060b02402005450d002005420037030820052003427f7c2001833703000b20034201510d06200641206a2001200220037aa7109e05200641286a2903002102200629032021010c060b2005450d020b2005200137030020052002370308420021010c020b00000b420021010b420021020c010b200620012002200841ff0071109d05200641106a20012002200741ff0071109e05200641086a2903002102200641106a41086a2903002109200629030021012006290310210a0240024020070d004200210b4200210c0c010b4200210c4200210d03402009420186200a423f8884220b200b427f8520047c200a4201862002423f8884220a427f85220b20037c200b54ad7c423f87220b2004837d200a200b200383220e54ad7d2109200a200e7d210a420020024201862001423f8884842102200d2001420186842101200b420183220b210d2007417f6a22070d000b0b02402005450d002005200a370300200520093703080b200c20024201862001423f8884842102200b20014201868421010b2000200137030020002002370308200641306a24000b0b9bb1060200418080c0000b80b1061800100011000000187f11001700000009030000050000006361706163697479206f766572666c6f77000000a00010004600000063010000130000003300000004000000040000003400000035000000360000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72003700000000000000010000003800000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f666d742f6d6f642e72730101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020202020202020202020202020202020202020202020202020202020202030303030303030303030303030303030404040404000000000000000000000000000802100020000000280210001200000037000000000000000100000039000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e646578206973203030303130323033303430353036303730383039313031313132313331343135313631373138313932303231323232333234323532363237323832393330333133323333333433353336333733383339343034313432343334343435343634373438343935303531353235333534353535363537353835393630363136323633363436353636363736383639373037313732373337343735373637373738373938303831383238333834383538363837383838393930393139323933393439353936393739383939000024031000060000002a031000220000006898110018000000170a000005000000696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e677468206c03100016000000820310000d00000068981100180000001d0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d00560410000b00000002171000160000008f0310000100000040041000160000000308000009000000e01610000e000000ee16100004000000f2161000100000008f0310000100000040041000160000000708000005000000a01610002b000000cb161000150000007a01000015000000560410000b000000610410002600000087041000080000008f041000060000008f03100001000000400410001600000014080000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060000000d604100002000000c0041000160000006204000011000000c00410001600000056040000280000007372632f6c6962636f72652f666d742f6d6f642e72732e2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20801010004a000000d012100000020000d01410003a00000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e0d0f0410031212130916011705180219031a071c021d011f1620032b042c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f747596972f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b030740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880c73035040a06380846080c06740b1e035a0459098083181c0a16094808808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b02100111041205131114021502170219041c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f906fa020c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1ca8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d00c72a3a4cbcc6e6f5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a808617094e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b602048080a80a65e22450b0a060d1339070a362c041080c03c64530c0180a0451b4808531d398107460a1d03474937030e080a0639070a81361980c7320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140041c97f80882f3a50d811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a0d035d033d391d0d2c040907020e06809a83d60a0d030b05740c59070c140c0438080a0628081e527703310380a60c14040305030d06856a000000601010002000000027000000190000006010100020000000280000002000000060101000200000002a0000001900000060101000200000002b0000001800000060101000200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21f003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000f0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c833000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d0000000000001e1f202100000000002200230024252600000000270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829000000000000000000000000000000002a2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000002d2e00002f0000000000000000000000000000000000000000000000000000000000003031320000000000000000000000000000000000000000003300000029000000000000340000000000000000000000000000000000000000000000350036000000000000000000000000000000000000000000000000000037380000383838390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff060000f00c01000000fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f0000800000000000000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db0700000000000000f0000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f66206066616c736574727565426f72726f774572726f72426f72726f774d75744572726f7270616e69636b6564206174200000711710000100000072171000030000003897110000000000701710000100000070171000010000003a27272c20000000cb16100015000000a60400000500000098171000150000008d040000050000007372632f6c6962636f72652f726573756c742e72735b5d0a3a0000000c000000040000003b0000003c0000003d0000002c0a2c203300000004000000040000003e0000003f0000004000000020202020207b20207b0a207d7d28280a2c0000003300000004000000040000004100000033000000040000000400000042000000557466384572726f7276616c69645f75705f746f6572726f725f6c656e00000033000000040000000400000043000000370000000000000001000000440000004500000046000000370000000000000001000000440000004500000046000000901810001e0000005074110013000000b903000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e0000c81810001d0000005074110013000000e103000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e0000000019100043000000f60a00003000000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962616c6c6f632f7665632e7273000019100043000000020b00002c0000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d312e302e352f7372632f636f6d706163742e72736865616420697320736574207768656e20666972737420656c656d656e7420697320696e7365727465640a090909090909616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a0909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b2071656470726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b0a090909090909776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165646f766572666c6f77206d756c7469706c79696e6720676173206c696d69742062792070726963650000003700000000000000010000004700000048000000490000004a0000004b0000004c0000000c1b1000330000003f1b10004b000000f600000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f6163636f756e745f64622e72734f6666656e636573205265706f7274730000c01b100019000000e01b100048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f6f70732f61726974682e7273616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f7765643700000000000000010000004d0000003700000000000000010000004e000000387d110028000000881c10004300000055000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6f6666656e6365732f7372632f6c69622e727300881c1000430000005500000001000000551d10003600000054191000630000005e01000005000000000000000000000000000000181d10003d00000054191000630000006501000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b2071656400551d10003600000054191000630000008a0100000500000000000000000000000000000000000000000000005419100063000000910100000500000053657373696f6e20486973746f726963616c53657373696f6e734c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b0a0909090909697420616c7761797320706f696e747320746f206578697374696e67206b6579733b20716564000000000000441f10000700000001010000000000004b1f10000d00000000000000581f10003400000000000000000000000000000000000000389711008c1f100000000000000000009c1f100001000000000000000000000000000000a41f10001600000002010100000000006f8c11000400000000000000738c11000e00000000000000ba1f1000120000000000000038971100cc1f10000000000000000000dc1f100001000000000000000100000000000000e41f10001200000001010000000000006f8c11000400000000000000e7ea1000070000000000000000000000000000000000000038971100f81f10000000000000000000082010000600000000000000010000005265706f7274735265706f727449644f663c543e4f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e3700000000000000010000004f000000a121100052000000436f6e63757272656e745265706f727473496e6465785665633c5265706f727449644f663c543e3e37000000000000000100000050000000572110004a0000005265706f72747342794b696e64496e646578000037000000000000000100000051000000382010004400000038971100000000007c2010002f0000003897110000000000ab20100052000000fd2010005a00000020456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f6620646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e20546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e72656163686564206d6178696d756d2064657074682c2063616e6e6f7420696e7374616e7469617465520000001800000004000000530000005400000055000000560000005700000058000000696e73756666696369656e742072656d61696e696e672062616c616e6365416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c7265616479206578697374736e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665656e6f7420656e6f7567682067617320746f20706179207472616e736665722066656572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c20666565636f6e747261637420686173206265656e2065766963746564636f6e74726163742063616e6e6f742062652064657374726f79656420647572696e672072656375727369766520657865637574696f6e61206e657374656420657865637574696f6e20636f6e74657874206d7573742068617665206120706172656e743b20716564696d2d6f6e6c696e653a6f66666c696e4f6666656e63657320436f6e63757272656e745265706f727473496e6465780000005900000008000000040000005a0000007375627374726174652d6e6f64650000df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000cbca25e39f14238701000000687ad44ad37f03c201000000bc9d89904f5b923f0100000068b66ba122c93fa701000000ab3c0572291feb8b010000006772616e62616265696d6f6e0000000040787d010065cd1d00e1f505d85aae1ec0542205b0508f1f38e4750488467020d853e903603c5121d0bf760338323222a8591903402013236039cd02480ef423a82a8f0268f8d42470955c02b8dab525c05a3302d8c4962648bd1102e0b27727a855f601e8a05828e8fedf0180773929c0cacd01586d1a2af8f1be019053fb2a50d8b201d00edc2be0fca80138edbc2c48f2a001e06d9d2d80669a01c80d7e2e500f9501c0575e2f08b6900140323f30e0278d0148202031b0418a0108a3ff3120e8870120bedf32f0fb85013856c03398698401f0fda03478218301b8d87f35d8178201d8c26036183d8101b8223e37508d800188d21c38c8fc7f0168b5f93898877f01a829d139d8297f0120d6ab3ab8db7e0168ae803b389d7e0100ca9a3b68957e0100000000d3bc100006000000000000005b000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000003fa7100004000000000000005f000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000020000000000000000000000000000000000000060000000000000000000000000000000e7df10000900000000000000610000000000000000000000000000000000000000000000000000000000000062000000000000000000000002000000000000000000000000000000000000006300000000000000000000000000000095a410000a00000000000000640000000000000000000000000000000000000000000000000000000000000065000000000000000000000002000000000000000000000000000000000000005e00000000000000000000000000000045db1000070000000000000066000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000670000000000000000000000000000005e000000000000000000000000000000b239100008000000000000006800000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b000000000000000000000000000000d92d110007000000000000006c000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f000000000000000000000000000000158b1000070000000000000070000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000072000000000000000000000000000000730000000000000000000000000000007955110009000000000000007400000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000007600000000000000000000000000000077000000000000000000000000000000fe65100007000000000000007800000000000000000000000000000000000000000000000000000000000000790000000000000000000000000000007a0000000000000000000000000000005e000000000000000000000000000000382d100012000000000000007b00000000000000000000000000000000000000000000000000000000000000790000000000000000000000000000007a0000000000000000000000000000005e0000000000000000000000000000004a2d100009000000000000007c000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000007e0000000000000000000000000000007f000000000000000000000000000000532d10001300000000000000800000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000820000000000000000000000000000005e000000000000000000000000000000662d10000f000000020000000000000000000000000000000000000000000000000000000000000000000000830000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000752d10000700000000000000850000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000870000000000000000000000000000005e0000000000000000000000000000000596100008000000000000008800000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000008a0000000000000000000000000000008b0000000000000000000000000000007c2d100009000000000000008c000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000008e0000000000000000000000000000008f000000000000000000000000000000161311000400000000000000900000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000920000000000000000000000000000005e000000000000000000000000000000314610000800000000000000930000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000950000000000000000000000000000005e000000000000000000000000000000852d1000120000000200000000000000000000000000000000000000000000000000000000000000000000005e000000000000000000000002000000000000000000000000000000000000005e000000000000000000000000000000972d1000080000000000000096000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000970000000000000000000000000000005e0000000000000000000000546563686e6963616c436f6d6d6974746565456c656374696f6e73546563686e6963616c4d656d6265727368697046696e616c697479547261636b65724772616e647061436f6e747261637473417574686f72697479446973636f766572794f6666656e6365735365656420697320616e207574663820737472696e67000000e02d1000480000009b0a00000a000000e02d100048000000a10a00000e00000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000ac2e10000a00000000000000e0151100020000000000000000000000b82e1000010000000000000000000000c02e10000d00000000000000a8431100010000000000000000000000d02e100001000000000000000000000000ea10000800000000000000d82e1000040000000000000000000000f82e100001000000000000004e65774163636f756e740000432f10001b0000005265617065644163636f756e740000002c2f100017000000d043110009000000d04311000900000011441100070000001144110007000000002f10002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e740000000000003c3010001100000000000000503010000100000000000000000000005830100001000000000000004865617274626561745265636569766564000000903010000b00000060301000300000002041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460417574686f726974794964496d4f6e6c696e6520476f73736970417442616c616e63657320546f74616c49737375616e6365496d4f6e6c696e65204b65797342616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636542616c616e636573204c6f636b7342616c616e6365732056657374696e6700000000000000a03110000800000000000000a8311000020000000000000000000000d8311000170000000000000000000000903210000b000000000000009c321000030000000000000000000000e43210000d00000000000000000000004c3310000e000000000000005c331000030000000000000000000000a433100002000000000000007472616e736665720000000046f1100004000000000000004b22110023000000000000005f55110005000000000000001934100013000000ed35100036000000389711000000000023361000420000006536100048000000ad36100045000000f23610002d00000038971100000000001f371000460000003897110000000000c54d11000b000000653710004c000000b137100033000000e43710005a00000038971100000000003e3810001300000038971100000000005138100054000000a53810004b000000f03810003500000025391000370000005c391000560000003897110000000000d84d11000c0000007365745f62616c616e636500000000005712110003000000000000004b2211002300000000000000d93510000800000000000000193410001300000000000000e13510000c0000000000000019341000130000002c34100025000000389711000000000051341000480000009934100042000000db34100046000000213510003a00000038971100000000005b3510002d0000003897110000000000c54d11000b0000008835100020000000a835100031000000d84d11000c000000666f7263655f7472616e736665720000000000001334100006000000000000004b221100230000000000000046f1100004000000000000004b22110023000000000000005f55110005000000000000001934100013000000b433100054000000083410000b0000002045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265207370656369666965642e736f75726365436f6d706163743c543a3a42616c616e63653e20536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f667265656e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e42616c616e636573000000000000743b10000d0000000000000000000000813b10000a0000000000000000000000000000000000000000000000000000000000000038971100543c100000000000000000008c3b100001000000000000000100000000000000943b10000700000001010000000000000b4e11000c000000000000009b3b10002b0000000000000000000000000000000000000038971100c83b10000000000000000000d83b100001000000000000000000000000000000e03b10000b00000001010000000000000b4e11000c00000000000000813b10000a0000000000000000000000000000000000000038971100543c10000000000000000000ec3b10000b000000000000000100000000000000443c10000f00000001010000000000000b4e11000c00000000000000813b10000a0000000000000000000000000000000000000038971100543c10000000000000000000643c10000b000000000000000100000000000000bc3c10000500000001010000000000000b4e11000c00000000000000c13c10002c0000000000000000000000000000000000000038971100f03c10000000000000000000003d1000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e636500314210002600000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e00003700000000000000010000004f000000fb411000360000004672656542616c616e636500813f1000270000003897110000000000a83f100050000000f83f10005d0000005540100055000000aa4010004f000000f9401000510000004a4110001500000038971100000000005f41100057000000b641100045000000526573657276656442616c616e63650037000000000000000100000098000000363d10005d000000933d1000270000003897110000000000ba3d10005b000000153e10004900000038971100000000005e3e10005d000000bb3e10002d0000003897110000000000e83e1000530000003b3f1000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00000037000000000000000100000050000000083d10002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e0000000000704310001200000000000000813b10000a000000000000003897110084431000000000000000000094431000010000000000000000000000000011000b00000000000000813b10000a00000000000000389711009c43100000000000000000000c001100010000000000000000000000140011000b00000000000000813b10000a00000000000000389711009c431000000000000000000020001100010000000000000000000000280011001200000000000000813b10000a00000000000000389711009c43100000000000000000003c001100010000000000000000000000440011001200000000000000813b10000a0000000000000038971100ac43100000000000000000006800110001000000000000004578697374656e7469616c4465706f736974000037000000000000000100000099000000bc431000350000003700000000000000010000009a0000003700000000000000010000009b00000020546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e776520676f74207468652076616c696461746f725f69642066726f6d2063757272656e745f76616c696461746f72733b0a09090909090963757272656e745f76616c696461746f727320697320736574206f662063757272656e746c7920616374696e672076616c696461746f72733b0a090909090909746865206d617070696e67206265747765656e207468652076616c696461746f7220696420616e64206974732066756c6c206964656e74696669636174696f6e2073686f756c642062652076616c69643b0a09090909090974687573206046756c6c4964656e74696669636174696f6e4f663a3a636f6e76657274602063616e27742072657475726e20604e6f6e65603b0a09090909090971656473726d6c2f696d2d6f6e6c696e652d776f726b65722d7374617475730030451000480000009b0a00000a0000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000a44510000900000000000000b045100002000000000000000000000038971100000000000000000068656172746265617400000000000000a44510000900000000000000e04510001900000000000000f94510000900000000000000024610002f0000004865617274626561743c543a3a426c6f636b4e756d6265723e7369676e61747572653c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e6174757265496d4f6e6c696e650000000000000044471000080000000000000000000000925111000e00000000000000000000000000000000000000000000000000000000000000389711004c47100000000000000000005c4710000100000000000000010000000000000064471000040000000000000000000000684710001300000000000000000000000000000000000000000000000000000000000000389711007c47100000000000000000008c47100001000000000000000100000000000000944710001200000002010100000000009f8d11000c00000000000000a64710000900000000000000e7ea1000070000000000000038971100b04710000000000000000000c0471000020000000000000001000000476f7373697041743700000000000000010000009c00000061481000280000004b6579735665633c543a3a417574686f7269747949643e00370000000000000001000000500000002d4810003400000052656365697665644865617274626561747341757468496e6465780037000000000000000100000051000000d04710003a0000000a4810002300000020466f7220656163682073657373696f6e20696e646578207765206b6565702061206d617070696e67206f662060417574686f7269747949646020746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e2054686520626c6f636b206e756d626572207768656e2077652073686f756c6420676f737369702e6e6f7420656e6f75676820667265652066756e64730000387d110028000000b84810004300000096010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e72734f75746461746564206865617274626561742072656365697665642e496e76616c696420686561727462656174207369676e61747572652e4475706c696361746564206865617274626561742e4e6f6e206578697374656e74207075626c6963206b65792eb8481000430000009601000001000000676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756562616c616e636520746f6f206c6f7720746f2073656e642076616c756564657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7454696d657374616d702055706461746554696d657374616d7020526563656e7448696e74730000404a100031000000714a10004b0000007d0000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e7273d44a100023000000714a10004b0000007e0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d62657200104b100019000000304b100048000000bb0100002d000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f6f70732f61726974682e7273576974686472617720686173206265656e20636865636b65642061626f76653b0a090909647565735f6c696d69746564203c2072656e745f627564676574203c2062616c616e6365202d2073756273697374656e6365203c2062616c616e6365202d206578697374656e7469616c5f6465706f7369743b0a09090971656400005900000008000000040000009d00000054696d657374616d70204f72646572656448696e747354696d657374616d70204d656469616e616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400003300000004000000040000009e000000084d100043000000714a10004b000000b600000004000000c04c1000480000009b0a00000a000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e72737072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b207165640000000000784d10000a00000000000000844d10000100000000000000000000009c4d1000020000000000000066696e616c5f68696e74000000000000f26510000400000000000000de4e110017000000ac4d10003d000000e94d10001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e00000000744e10000a00000000000000925111000e0000000000000038971100804e10000000000000000000904e1000010000000000000000000000984e10000d00000000000000925111000e0000000000000038971100a84e10000000000000000000b84e1000010000000000000057696e646f7753697a6500003700000000000000010000009f000000074f1000460000005265706f72744c6174656e6379000000370000000000000001000000a0000000c04e100047000000205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e20546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e00000000000000005010000b000000000000008c4311000200000000000000000000000c501000010000000000000000000000145010001000000000000000a8431100010000000000000000000000245010000100000000000000000000002c5010000c0000000000000068ea100001000000000000000000000038501000010000000000000000000000405010000e0000000000000050501000020000000000000000000000605010000100000000000000566f74657252656170656400fe50100015000000426164526561706572536c6173686564ef5010000f00000054616c6c7953746172746564ba5010003500000054616c6c7946696e616c697a65640000184411000e000000184411000e000000685010005200000020412074616c6c792028666f7220617070726f76616c20766f746573206f662073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e20412074616c6c792028666f7220617070726f76616c20766f746573206f662073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572436f756e63696c205265676973746572496e666f4f66436f756e63696c204d656d62657273436f756e63696c204e65787446696e616c697a6540521000480000009b0a00000a000000436f756e63696c205465726d4475726174696f6e436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c204c6561646572626f617264004052100048000000a10a00000e000000436f756e63696c2043616e64696461746573436f756e63696c20566f746572496e666f4f6647757275206d656469746174696f6e66696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e436f756e63696c20417070726f76616c734f66436f756e63696c20566f746572730000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000405410000d0000000000000050541000040000000000000000000000b05410001800000000000000000000007055100013000000000000005054100004000000000000000000000084551000060000000000000000000000b45510001300000000000000c8551000040000000000000000000000285610000c0000000000000000000000885610000d0000000000000098561000010000000000000000000000b05610000a000000000000000000000000571000100000000000000010571000010000000000000000000000285710000d0000000000000000000000905710000e00000000000000a0571000030000000000000000000000e8571000090000000000000000000000305810001100000000000000445810000100000000000000000000005c581000030000000000000000000000cce310000d00000000000000745810000100000000000000000000008c581000040000000000000000000000ac5810001900000000000000c8581000010000000000000000000000e0581000020000000000000000000000f05810001100000000000000c85810000100000000000000000000000459100002000000000000007365745f617070726f76616c7300000000000000e46510000500000000000000e96510000900000000000000e4cd10000500000000000000ac5c10001200000000000000f26510000400000000000000f665100008000000000000005f55110005000000000000007a6511000c0000009161100058000000e9611000100000003897110000000000f9611000530000004c6210003000000038971100000000007c62100035000000b162100055000000066310002a00000030631000530000008363100057000000da631000510000002b6410003b0000006664100057000000bd641000370000003897110000000000f46410005400000048651000340000003897110000000000c54d11000b000000d04d1100080000007c65100027000000a365100041000000d84d11000c00000070726f78795f7365745f617070726f76616c7300e060100059000000396110001c0000003897110000000000c54d11000b000000556110003c000000d84d11000c000000726561705f696e6163746976655f766f7465720000000000b76010000e00000000000000fa4e11000c000000000000005712110003000000000000004b2211002300000000000000c56010000900000000000000fa4e11000c00000000000000ce6010001200000000000000ac5c100012000000565f100058000000ae5f100056000000046010002e00000038971100000000003260100045000000389711000000000077601000400000003897110000000000c54d11000b000000d04d1100080000002f5f100027000000d84d11000c000000726574726163745f766f74657200000000000000e4cd10000500000000000000fa4e11000c000000535e10004b00000038971100000000009e5e1000420000003897110000000000e05e10004f0000003897110000000000c54d11000b000000d04d1100080000002f5f100027000000d84d11000c0000007375626d69745f63616e646964616379000000004f5e10000400000000000000fa4e11000c000000be5c10001e0000003897110000000000dc5c1000440000003897110000000000205d100048000000685d100051000000b95d10004c000000055e10001e0000003897110000000000c54d11000b000000235e1000180000003b5e100014000000d84d11000c00000070726573656e745f77696e6e65720000000000009e5c100009000000000000004b2211002300000000000000a75c10000500000000000000645511001500000000000000e4cd10000500000000000000ac5c1000120000007b5b100058000000d35b1000580000002b5c100057000000825c1000070000003897110000000000c54d11000b000000895c100015000000b712110011000000d84d11000c0000007365745f646573697265645f736561747300000000000000d65910000500000000000000fa4e11000c000000bb5a100059000000145b100052000000665b100015000000000000005712110003000000000000004b22110023000000db591000480000003897110000000000235a1000480000006b5a1000500000007365745f70726573656e746174696f6e5f6475726174696f6e00000000000000d65910000500000000000000de4e110017000000805910005600000068591000180000007365745f7465726d5f6475726174696f6e0000001459100054000000685910001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c792e204e6f74653a20412074616c6c792073686f756c642068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d2074686174206063616e64696461746560206973206f6e65206f662074686520746f70206063617272795f636f756e74202b20646573697265645f7365617473602063616e646964617465732e204f6e6c7920776f726b7320696666207468652070726573656e746174696f6e20706572696f64206973206163746976652e206063616e646964617465602073686f756c642068617665206174206c6561737420636f6c6c656374656420736f6d65206e6f6e2d7a65726f2060746f74616c6020766f74657320616e6420606f726967696e60206d757374206861766520656e6f7567682066756e647320746f2070617920666f72206120706f74656e7469616c20736c6173682e202d204f28766f746572732920636f6d707574652e63616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e204e4f54453a20696620606f726967696e602068617320616c72656164792061737369676e656420617070726f76616c7320766961205b607365745f617070726f76616c73605d2c2069742077696c6c204e4f54206861766520616e7920757361626c652066756e647320746f20706173732063616e64696461637920626f6e6420616e64206d75737420666972737420726574726163742e204e6f746520746861742073657474696e6720617070726f76616c732077696c6c206c6f636b2074686520656e746972652062616c616e6365206f662074686520766f74657220756e74696c2072657472616374696f6e206f72206265696e67207265706f727465642e202d20496e646570656e64656e74206f6620696e7075742e202d205468726565204442206368616e6765732e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2054686520696e646578206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e20416c736f2072656d6f76657320746865206c6f636b206f6e207468652062616c616e6365206f662074686520766f7465722e20536565205b60646f5f7365745f617070726f76616c732829605d2e202d2054776f20666577657220444220656e74726965732c206f6e65204442206368616e67652e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e20426f746820696e6469636573206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e202d2053616d6520617320607365745f617070726f76616c73602077697468206f6e65206164646974696f6e616c2073746f7261676520726561642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e204c6f636b73206076616c7565602066726f6d207468652062616c616e6365206f6620606f726967696e6020696e646566696e6974656c792e204f6e6c79205b60726574726163745f766f746572605d206f72205b60726561705f696e6163746976655f766f746572605d2063616e20756e6c6f636b207468652062616c616e63652e206068696e746020617267756d656e7420697320696e74657270726574656420646966666572656e746c79206261736564206f6e3a202d20696620606f726967696e602069732073657474696e6720617070726f76616c7320666f72207468652066697273742074696d653a2054686520696e6465782077696c6c20626520636865636b656420666f722020206265696e6720612076616c6964205f686f6c655f20696e2074686520766f746572206c6973742e2020202d206966207468652068696e7420697320636f72726563746c7920706f696e74696e6720746f206120686f6c652c206e6f206665652069732064656475637465642066726f6d20606f726967696e602e2020202d204f74686572776973652c207468652063616c6c2077696c6c2073756363656564206275742074686520696e6465782069732069676e6f72656420616e642073696d706c792061207075736820746f2074686520202020206c617374206368756e6b207769746820667265652073706163652068617070656e732e20496620746865206e65772070757368206361757365732061206e6577206368756e6b20746f2062652020202020637265617465642c20612066656520696e64696361746564206279205b60566f74696e67466565605d2069732064656475637465642e202d20696620606f726967696e6020697320616c7265616479206120766f7465723a2074686520696e646578205f5f6d7573745f5f2062652076616c696420616e6420706f696e7420746f2074686520636f7272656374202020706f736974696f6e206f662074686520606f726967696e6020696e207468652063757272656e7420766f74657273206c6973742e204e6f7465207468617420616e7920747261696c696e67206066616c73656020766f74657320696e2060766f746573602069732069676e6f7265643b20496e20617070726f76616c20766f74696e672c206e6f7420766f74696e6720666f7220612063616e64696461746520616e6420766f74696e672066616c73652c2061726520657175616c2e202d2054776f20657874726120444220656e74726965732c206f6e65204442206368616e67652e202d20417267756d656e742060766f74657360206973206c696d6974656420696e206c656e67746820746f206e756d626572206f662063616e646964617465732e766f7465735665633c626f6f6c3e68696e74536574496e646578436f756e63696c00000000000000886b1000140000000000000000000000925111000e00000000000000000000000000000000000000000000000000000000000000389711008c76100000000000000000009c6b100001000000000000000100000000000000a46b10000c0000000000000000000000925111000e00000000000000000000000000000000000000000000000000000000000000389711008c7610000000000000000000b06b100001000000000000000100000000000000b86b10000c0000000000000000000000763411000300000000000000000000000000000000000000000000000000000000000000389711008c7610000000000000000000c46b100001000000000000000100000000000000ace61000070000000000000000000000cc6b1000230000000000000000000000000000000000000000000000000000000000000038971100386d10000000000000000000f06b100004000000000000000100000000000000106c1000090000000000000000000000196c10000900000000000000000000000000000000000000000000000000000000000000389711008c7610000000000000000000246c1000010000000000000001000000000000002c6c10000b0000000101000000000000376c100018000000000000004f6c1000110000000000000000000000000000000000000038971100386d100000000000000000003897110000000000000000000100000000000000606c10000e00000001010000000000000b4e11000c000000000000006e6c1000100000000000000000000000000000000000000038971100806c10000000000000000000906c100002000000000000000000000000000000a06c10000b00000001010000000000000b4e11000c00000000000000ab6c1000170000000000000000000000000000000000000038971100c46c10000000000000000000d46c100001000000000000000000000000000000dc6c1000060000000101000000000000f66510000800000000000000e26c1000190000000000000000000000000000000000000038971100386d10000000000000000000fc6c100001000000000000000100000000000000046d10000c0000000000000000000000f66510000800000000000000000000000000000000000000000000000000000000000000389711008c7610000000000000000000106d100001000000000000000100000000000000186d10000a0000000000000000000000f66510000800000000000000000000000000000000000000000000000000000000000000389711008c7610000000000000000000246d1000010000000000000001000000000000002c6d10000a0000000000000000000000255c1100110000000000000000000000000000000000000000000000000000000000000038971100386d10000000000000000000486d100001000000000000000100000000000000506d10000e0000000000000000000000763411000300000000000000000000000000000000000000000000000000000000000000389711008c7610000000000000000000606d100001000000000000000100000000000000686d10000c0000000000000000000000746d10002800000000000000000000000000000000000000000000000000000000000000389711009c6d10000000000000000000ac6d100001000000000000000000000000000000b46d10000b0000000000000000000000bf6d1000210000000000000000000000000000000000000000000000000000000000000038971100e06d10000000000000000000f06d100003000000000000000000000000000000a85c11000500000001010000000000000b4e11000c000000000000000b4e11000c0000000000000000000000000000000000000038971100086e10000000000000000000c05c110002000000000000000000000050726573656e746174696f6e4475726174696f6e6f7210004f0000005465726d4475726174696f6e49721000260000004465736972656453656174730f7210003a0000005665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e00e37010005500000038711000550000008d71100054000000e17110002e000000566f7465436f756e74566f7465496e64657800009c70100047000000417070726f76616c734f6628543a3a4163636f756e7449642c20536574496e646578295665633c417070726f76616c466c61673e5265676973746572496e666f4f6628566f7465496e6465782c20753332290000370000000000000001000000a100000027701000570000007e7010001e000000566f746572496e666f4f66566f746572496e666f3c42616c616e63654f663c543e3e00003700000000000000010000004f0000000670100021000000566f746572735665633c4f7074696f6e3c543a3a4163636f756e7449643e3e00c36f1000430000004e657874566f746572536574846f10003f000000566f746572436f756e7400006a6f10001a00000043616e646964617465730000370000000000000001000000500000004e6f10001c00000043616e646964617465436f756e7400002a6f1000240000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29370000000000000001000000a2000000e26e1000480000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e3700000000000000010000004f000000186e100058000000706e100059000000c96e1000190000003700000000000000010000004f0000002047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e2054686520666972737420656c656d656e742069732074686520776569676874206f66206561636820656e7472793b204974206d617920626520746865206469726563742073756d6d656420617070726f76616c207374616b65732c206f7220612077656967687465642076657273696f6e206f662069742e20536f727465642066726f6d206c6f7720746f20686967682e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e2043757272656e74206e756d626572206f66206163746976652063616e64696461746573205468652070726573656e742063616e646964617465206c6973742e2043757272656e74206e756d626572206f6620566f746572732e20746865206e65787420667265652073657420746f2073746f7265206120766f74657220696e2e20546869732077696c6c206b6565702067726f77696e672e205468652070726573656e7420766f746572206c69737420286368756e6b656420616e6420636170706564206174205b60564f5445525f5345545f53495a45605d292e20426173696320696e666f726d6174696f6e2061626f7574206120766f7465722e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e20205468652063757272656e74206d656d626572736869702e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f722020657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b20746861742020746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c6420636f6e737469747574652074686520636f6c6c6563746976652e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e000000000000287510000d000000000000007a6511000c000000000000003897110038751000000000000000000048751000020000000000000000000000587510000a000000000000007a6511000c0000000000000038971100687610000000000000000000647510000100000000000000000000006c75100009000000000000007a6511000c0000000000000038971100787510000000000000000000887510000200000000000000000000009875100014000000000000007a6511000c0000000000000038971100ac7510000000000000000000bc751000020000000000000000000000cc7510000a0000000000000076341100030000000000000038971100d87510000000000000000000e8751000020000000000000000000000f87510001300000000000000196c10000900000000000000389711000c76100000000000000000001c761000030000000000000000000000586511000c00000000000000925111000e0000000000000038971100347610000000000000000000447610000200000000000000000000005476100011000000000000007a6511000c000000000000003897110068761000000000000000000078761000010000000000000000000000807610000a00000000000000763411000300000000000000389711008c76100000000000000000009c761000050000000000000000000000c47610000e0000000000000076341100030000000000000038971100d47610000000000000000000e4761000010000000000000000000000ec76100011000000000000007634110003000000000000003897110000771000000000000000000010771000010000000000000043616e646964616379426f6e64000000370000000000000001000000a30000005f7b10004e000000ad7b100014000000566f74696e67426f6e6400001d7b100042000000566f74696e67466565000000370000000000000001000000a4000000b67a10004a000000007b10001d00000050726573656e74536c617368506572566f7465723700000000000000010000009a000000527a100045000000977a10001f0000004361727279436f756e740000370000000000000001000000a5000000e4791000470000002b7a100027000000496e6163746976654772616365506572696f6400370000000000000001000000a6000000477910004c000000937910004b000000de79100006000000370000000000000001000000a7000000f5781000490000003e791000090000004d696e696d756d566f74696e674c6f636b00000037000000000000000100000099000000b67810003f0000004465636179526174696f00003700000000000000010000009c000000637710004d000000b077100041000000f177100047000000387810004a0000008278100034000000564f5445525f5345545f53495a450000370000000000000001000000a80000003f77100024000000415050524f56414c5f5345545f53495a45000000370000000000000001000000a9000000187710002700000020546865206368756e6b2073697a65206f662074686520617070726f76616c20766563746f722e20546865206368756e6b2073697a65206f662074686520766f74657220766563746f722e20446563617920666163746f72206f6620776569676874207768656e206265696e6720616363756d756c617465642e2049742073686f756c64207479706963616c6c792062652073657420746f205f5f6174206c656173745f5f20606d656d626572736869705f73697a65202d316020746f206b6565702074686520636f6c6c656374697665207365637572652e205768656e2073657420746f20604e602c20697420696e64696361746573206028312f4e295e7460206f66207374616b656420697320646563617965642061742077656967687420696e6372656d656e742073746570206074602e20302077696c6c20726573756c7420696e206e6f20776569676874206265696e6720616464656420617420616c6c20286e6f726d616c20617070726f76616c20766f74696e67292e204120726561736f6e61626c652064656661756c742076616c75652069732032342e204d696e696d756d2061626f757420746861742063616e206265207573656420617320746865206c6f636b65642076616c756520666f7220766f74696e672e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e204120726561736f6e61626c652064656661756c742076616c756520697320313030302e20486f77206d616e7920766f746520696e6469636573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e204120726561736f6e61626c652064656661756c742076616c756520697320312e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e204120726561736f6e61626c652064656661756c742076616c756520697320322e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e204120726561736f6e61626c652064656661756c742076616c756520697320312e2054686520616d6f756e74206f662066656520706169642075706f6e206561636820766f7465207375626d697373696f6e2c20756e6c6573732069662074686579207375626d69742061205f686f6c655f20696e64657820616e64207265706c6163652069742e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e204120726561736f6e61626c652064656661756c742076616c756520697320392e000000387d110028000000dc7b1000440000000e010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f656c656374696f6e732f7372632f6c69622e7273dc7b1000440000000e01000001000000436f756e63696c2050726f787963616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f64766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d757374206265206163746976657265706f72746572206d757374206265206120766f746572696e76616c6964207265706f7274657220696e646578696e76616c69642074617267657420696e646578626164207265706f7274657220696e6465786261642074617267657420696e64657872657472616374696f6e20696e64657820696e76616c696472657472616374696f6e20696e646578206d69736d6174636863616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f7465726475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e647363616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e747374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f6c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647370726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c65637465646475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c6e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e646964617465736c6f636b65642076616c7565206d757374206265206d6f7265207468616e206c696d697477726f6e6720766f74657220696e6465786e657720766f746572206d75737420686176652073756666696369656e742066756e647320746f207061792074686520626f6e64696e76616c696420766f74657220696e646578000000000000e442110008000000000000008881100001000000000000000000000090811000010000000000000000000000988110000800000000000000c8151100010000000000000000000000a0811000010000000000000000000000a88110000700000000000000b0811000030000000000000000000000c8811000010000000000000000000000d08110000500000000000000c8151100010000000000000000000000d8811000010000000000000000000000e08110000800000000000000c8151100010000000000000000000000e88110000100000000000000ccb710000d000000b98210000e0000005370656e64696e677f8210003a0000004177617264656400ccb710000d0000001144110007000000d0431100090000005f821000200000004275726e740000003c82100023000000526f6c6c6f766572f08110004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e53657373696f6e2056616c696461746f72734772616e64706146696e616c697479205374616c6c656454726561737572792050726f706f73616c730000387d1100280000001c831000430000007f000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e72734469676573744974656d206e6f7420657175616c0000000000a08310001200000000000000b4831000010000000000000000000000cc83100001000000000000007265706f72745f6d69736265686176696f72000000000000ed8310000700000000000000e7ea100007000000d483100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c697479000000000070aa10000b0000000000000000000000238a11002300000000000000000000000000000000000000000000000000000000000000389711008897100000000000000000006c8610000100000000000000010000000000000074861000050000000000000000000000798610001b0000000000000000000000000000000000000000000000000000000000000038971100948610000000000000000000a486100001000000000000000100000000000000ac8610000d0000000000000000000000b9861000230000000000000000000000000000000000000000000000000000000000000038971100b48e10000000000000000000dc86100001000000000000000000000000000000e48610000a0000000000000000000000925111000e0000000000000000000000000000000000000000000000000000000000000038971100788710000000000000000000f086100001000000000000000000000000000000f8861000070000000000000000000000ff8610002000000000000000000000000000000000000000000000000000000000000000389711002087100000000000000000003087100001000000000000000000000000000000388710000c0000000000000000000000448710000500000000000000000000000000000000000000000000000000000000000000389711004c87100000000000000000005c871000020000000000000001000000000000006c8710000c00000001010000000000004487100005000000000000009f8d11000c000000000000000000000000000000000000003897110078871000000000000000000088871000010000000000000000000000308910001b000000537461746553746f72656453746174653c543a3a426c6f636b4e756d6265723e370000000000000001000000aa0000000c8910002400000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723edb881000310000004e657874466f726365640000ac8810002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d6265722900370000000000000001000000a1000000888810002400000043757272656e7453657449645365744964000000370000000000000001000000ab00000000881000570000005788100031000000536574496453657373696f6e3700000000000000010000004f00000090871000700000002041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e20546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c69746965732920696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e20607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205374617465206f66207468652063757272656e7420617574686f72697479207365742e205468652063757272656e7420617574686f72697479207365742e000000000078891000080000000000000080891000020000000000000000000000b08910000a000000000000007365745f6b65797300000000dabb10000400000000000000098b10000700000000000000108b10000500000000000000e7ea100007000000008a100039000000398a100048000000818a1000310000003897110000000000b28a1000350000003897110000000000c54d11000b000000e78a100022000000f34d110016000000d84d11000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e543a3a4b65797370726f6f6653657373696f6e00000000543511000a0000000000000000000000848d1000130000000000000000000000000000000000000000000000000000000000000038971100889710000000000000000000988d100001000000000000000100000000000000a08d10000c00000000000000000000009f8d11000c0000000000000000000000000000000000000000000000000000000000000038971100189710000000000000000000ac8d100001000000000000000100000000000000b48d10000d0000000000000000000000f7431100040000000000000000000000000000000000000000000000000000000000000038971100c48d10000000000000000000d48d100002000000000000000100000000000000e48d10000a0000000000000000000000ee8d10001e00000000000000000000000000000000000000000000000000000000000000389711008897100000000000000000000c8e1000020000000000000001000000000000001c8e10001200000000000000000000002e8e1000080000000000000000000000000000000000000000000000000000000000000038971100889710000000000000000000388e100003000000000000000100000000000000508e1000080000000204010000000000e7ea10000700000000000000588e10000e00000000000000098b1000070000000000000038971100688e10000000000000000000788e100004000000000000000000000000000000988e1000080000000204010000000000e7ea10000700000000000000a08e10001400000000000000588e10000e0000000000000038971100b48e10000000000000000000c48e10000400000000000000000000005665633c543a3a56616c696461746f7249643e008b9110001f00000043757272656e74496e6465786d9110001e0000005175657565644368616e6765640000003700000000000000010000004f000000f69010004e00000044911000290000005175657565644b6579735665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e6f9010004f000000be9010003800000044697361626c656456616c696461746f72735665633c7533323e000002901000200000003897110000000000229010004d0000004e6578744b657973543a3a56616c696461746f72496400003700000000000000010000004f000000db8f10002700000038971100000000002d8f100056000000838f1000580000004b65794f776e6572284b65795479706549642c205665633c75383e293700000000000000010000004f000000e48e10004900000038971100000000002d8f100056000000838f10005800000020546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e20546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f662074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e20496e6469636573206f662064697361626c65642076616c696461746f72732e205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e2054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b6579732077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e20547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f727320686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e000000000000e49110001000000000000000f4911000050000000000000038971100fc91100000000000000000000c921000020000000000000044454455505f4b45595f505245464958265b75385d000000370000000000000001000000ac0000001c92100059000000759210000d0000002055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e6368206f662074686520747269652e3a73657373696f6e3a6b65797353657373696f6e204e6578744b6579730000000000249310000d000000000000003493100002000000000000000000000064931000090000000000000000000000ac9310000f00000000000000bc931000010000000000000000000000d49310000700000000000000000000000c9410001000000000000000bc9310000100000000000000000000001c941000080000000000000070726f706f73655f7370656e64000000000000005f5511000500000000000000645511001500000000000000fa9510000b000000000000004b22110023000000289510004b000000739510004d000000c0951000150000003897110000000000c54d11000b000000d04d110008000000f111110019000000d595100025000000d84d11000c00000072656a6563745f70726f706f73616c00000000001d9510000b00000000000000e9cd100016000000de9410003f0000003897110000000000c54d11000b000000d04d110008000000f111110019000000514e110010000000d84d11000c000000617070726f76655f70726f706f73616c5c94100057000000b39410002b0000003897110000000000c54d11000b000000d04d110008000000f111110019000000b712110011000000d84d11000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f69642050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e62656e656669636961727954726561737572790000000000000008d010000d0000000000000000000000ccb710000d000000000000000000000000000000000000000000000000000000000000003897110018971000000000000000000028971000010000000000000001000000000000009acf1000090000000101000000000000ccb710000d000000000000003097100024000000000000000000000000000000000000003897110054971000000000000000000064971000010000000000000000000000000000006c97100009000000000000000000000075971000120000000000000000000000000000000000000000000000000000000000000038971100889710000000000000000000989710000100000000000000010000003700000000000000010000009c000000fd9710002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3700000000000000010000004f000000de9710001f000000417070726f76616c735665633c50726f706f73616c496e6465783e0037000000000000000100000050000000a09710003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e000000000000089910000c00000000000000149910000700000000000000389711001c99100000000000000000002c9910000200000000000000000000003c99100013000000000000007a6511000c000000000000003897110050991000000000000000000060991000010000000000000000000000689910000b00000000000000925111000e0000000000000038971100749910000000000000000000849910000100000000000000000000008c991000040000000000000014991000070000000000000038971100909910000000000000000000a0991000010000000000000050726f706f73616c426f6e645065726d696c6c00370000000000000001000000ad000000609a100055000000b59a10004400000050726f706f73616c426f6e644d696e696d756d00370000000000000001000000990000000e9a1000520000005370656e64506572696f6400370000000000000001000000ae000000ec991000220000004275726e370000000000000001000000af000000a8991000440000002050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479205374617465496e636f6e73697374656e74207374617465202d20636f756c646e277420736574746c6520696d62616c616e636520666f722066756e6473207370656e7420627920747265617375727953657373696f6e205175657565644b65797300590000000800000004000000b0000000b10000000000000000000000b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000590000000800000004000000b0000000b10000000000000000000000b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000590000000800000004000000b3000000b10000000000000000000000b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000590000000800000004000000b3000000b10000000000000000000000b400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004772616e64706146696e616c697479204e657874466f72636564636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f646553657373696f6e204b65794f776e6572000000f0a0100048000000a10a00000e000000f0a01000480000009b0a00000a00000080a0100019000000a0a01000430000003401000009000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f70687261676d656e2f7372632f6c69622e7273000000000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e72733897110000000000391411000200000060a110007c000000dca11000490000007900000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f7761736d2f6d6f642e72736e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e72656769737465726564206475706c6963617465206b65791c831000430000007f0000000100000050726f706f73657227732062616c616e636520746f6f206c6f774e6f2070726f706f73616c206174207468617420696e64657866696e616c6e756d417574686f727368697020417574686f7237000000000000000100000038000000387d110028000000e8a210003f000000bf000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f626162652f7372632f6c69622e727300e8a210003f000000bf0000000100000073657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a090909716564387d110028000000607d110050000000370100000900000065706f636820696e64696365732077696c6c206e6576657220726561636820325e3634206265666f726520746865206465617468206f662074686520756e6976657273653b207165640000000000000038a410000a0000000000000044a410000100000000000000000000005ca4100001000000000000007365745f756e636c65730000000000007da410000a0000000000000087a410000e00000064a41000190000002050726f76696465206120736574206f6620756e636c65732e6e65775f756e636c65735665633c543a3a4865616465723e417574686f72736869700000000000a8a51000060000000000000000000000aea510003a0000000000000000000000000000000000000000000000000000000000000038971100e8a510000000000000000000f8a510000100000000000000010000000000000000a610000600000000000000000000000b4e11000c000000000000000000000000000000000000000000000000000000000000003897110008a61000000000000000000018a610000100000000000000000000000000000020a610000c0000000000000000000000f74311000400000000000000000000000000000000000000000000000000000000000000389711002ca6100000000000000000003ca61000010000000000000001000000556e636c65735665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e370000000000000001000000500000008ca6100007000000417574686f7200003700000000000000010000004f00000073a6100019000000446964536574556e636c65733700000000000000010000004f00000044a610002f000000205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e20417574686f72206f662063757272656e7420626c6f636b2e20556e636c6573417574686f727368697020556e636c6573556e636c657320616c72656164792073657420696e20626c6f636b2e756e636c6520616c726561647920696e636c75646564756e636c652069732067656e65736973756e636c6520697320746f6f206869676820696e20636861696e756e636c6520706172656e74206e6f7420696e20636861696e756e636c65206e6f7420726563656e7420656e6f75676820746f20626520696e636c756465644261626500000000005caa10000a000000000000000000000076f91000030000000000000000000000000000000000000000000000000000000000000038971100e4aa1000000000000000000068aa10000100000000000000010000000000000070aa10000b00000000000000000000007baa1000270000000000000000000000000000000000000000000000000000000000000038971100a4aa10000000000000000000b4aa100001000000000000000100000000000000bcaa10000b000000000000000000000076f91000030000000000000000000000000000000000000000000000000000000000000038971100e4aa10000000000000000000c8aa100002000000000000000100000000000000d8aa10000b000000000000000000000076f91000030000000000000000000000000000000000000000000000000000000000000038971100e4aa10000000000000000000f4aa100001000000000000000100000000000000fcaa10000a000000000000000000000006ab100008000000000000000000000000000000000000000000000000000000000000003897110070ab1000000000000000000010ab10000a00000000000000010000000000000060ab10000e000000000000000000000006ab100008000000000000000000000000000000000000000000000000000000000000003897110070ab1000000000000000000080ab10000100000000000000010000000000000088ab10000c00000000000000000000007634110003000000000000000000000000000000000000000000000000000000000000003897110094ab10000000000000000000a4ab100009000000000000000100000000000000ecab1000110000000101000000000000763411000300000000000000fdab10000d00000000000000000000000000000000000000389711000cac1000000000000000000038971100000000000000000001000000000000001cac10000b000000000000000000000027ac100008000000000000000000000000000000000000000000000000000000000000003897110030ac1000000000000000000040ac100002000000000000000000000045706f6368496e64657800008bb0100015000000417574686f7269746965735665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e00003700000000000000010000005000000070b010001b00000047656e65736973536c6f74000eb010003e0000004cb010002400000043757272656e74536c6f7400370000000000000001000000ab000000f9af10001500000052616e646f6d6e6573735b75383b2033325d000033ae10002e000000389711000000000061ae10000b00000038971100000000006cae100041000000adae10003e000000ebae10004500000030af10004500000075af100041000000b6af1000430000004e65787452616e646f6d6e6573730000370000000000000001000000b50000001cae1000170000005365676d656e74496e6465783700000000000000010000009c000000d7ac10001f0000003897110000000000f6ac10003d00000033ad10004000000073ad100025000000389711000000000098ad10003b000000d3ad10004200000015ae100007000000556e646572436f6e737472756374696f6e5665633c5b75383b2033325d3e000037000000000000000100000050000000496e697469616c697a65644d61796265567266003700000000000000010000004f00000050ac10004000000090ac1000470000002054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d6560206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e2057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f2060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e20576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572792065706f63682e204e6578742065706f63682072616e646f6d6e6573732e205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e20232053656375726974792054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e792063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d626572732074686174207468697320286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e20626520757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e2043757272656e7420736c6f74206e756d6265722e2054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e2054686973206973203020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2043757272656e742065706f636820617574686f7269746965732e2043757272656e742065706f636820696e6465782e0000000010b110000d0000000000000076f9100003000000000000003897110020b11000000000000000000030b1100002000000000000000000000040b110001100000000000000a3e0100009000000000000003897110054b11000000000000000000064b11000050000000000000045706f63684475726174696f6e000000370000000000000001000000b6000000bcb2100043000000ffb210003f0000004578706563746564426c6f636b54696d65000000370000000000000001000000b70000008cb1100041000000cdb110004400000011b210004100000052b210004200000094b210002800000020546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e6720626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f7574207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f74206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e20546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746f2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e756e636c6573303074696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c4e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f7221496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473215468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564005900000008000000040000009d0000003a65787472696e7369635f696e64657800000000e4421100080000000000000020b5100004000000000000000000000040b5100002000000000000000000000050b51000050000000000000058b5100005000000000000000000000080b5100002000000000000000000000090b51000080000000000000048ea100001000000000000000000000098b51000010000000000000000000000a0b510000b0000000000000048ea1000010000000000000000000000acb51000010000000000000000000000664311000800000000000000b4b51000020000000000000000000000c4b51000010000000000000000000000ccb510000e00000000000000b4b51000020000000000000000000000dcb510000100000000000000d043110009000000ccb710000d000000d9431100040000005eb710000b00000069b7100053000000bcb7100010000000566f746564000000d043110009000000d943110004000000f7431100040000005eb710000b0000005eb710000b000000d6b610004200000018b7100046000000417070726f766564a5b6100031000000446973617070726f7665640070b6100035000000d943110004000000f7431100040000002fb61000410000004d656d62657245786563757465640000e4b510004b00000020412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e64657853797374656d204e756d62657253797374656d2045787472696e73696373526f6f74496e7374616e636531436f6c6c656374697665204d656d62657273496e7374616e636532436f6c6c656374697665204d656d6265727353797374656d2044696765737453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e6365000000387d1100280000007cb8100041000000e9000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73797374656d2f7372632f6c69622e7273000000387d110028000000d8b810004500000083000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6c6c6563746976652f7372632f6c69622e727353797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0080b9100048000000a10a00000e00000053797374656d204576656e747353797374656d204576656e74546f70696373000000000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000d0ba10000a0000000000000038971100000000000000000000000000dcba1000010000000000000000000000e4ba10000600000000000000ecba100001000000000000000000000004bb10000100000000000000000000000cbb10000e000000000000001cbb100001000000000000000000000034bb10000100000000000000000000003cbb1000080000000000000044bb10000100000000000000000000005cbb100001000000000000000000000064bb10000b0000000000000070bb100001000000000000000000000088bb100001000000000000000000000090bb10000c000000000000009cbb1000010000000000000000000000b4bb1000010000000000000066696c6c5f626c6f636b00008bbc10004800000072656d61726b00000000000084bc10000700000000000000e7ea10000700000069bc10001b0000007365745f686561705f706167657300000000000064bc1000050000000000000076f910000300000025bc10003f0000007365745f636f646500000000fc2011000300000000000000e7ea10000700000013bc1000120000007365745f73746f72616765000000000001bc1000050000000000000006bc10000d000000e6bb10001b0000006b696c6c5f73746f7261676500000000dabb10000400000000000000debb100008000000bcbb10001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b20412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e53797374656d0000000000000004c210000c00000001010000000000000b4e11000c0000000000000010c21000080000000000000000000000000000000000000038971100e8d21000000000000000000018c210000100000000000000010000000000000020c210000e0000000000000000000000763411000300000000000000000000000000000000000000000000000000000000000000389711006cc21000000000000000000030c210000100000000000000000000000000000038c210001300000000000000000000004bc210000600000000000000000000000000000000000000000000000000000000000000389711006cc21000000000000000000054c21000010000000000000000000000000000005cc21000100000000000000000000000763411000300000000000000000000000000000000000000000000000000000000000000389711006cc2100000000000000000007cc210000100000000000000000000000000000084c2100014000000000000000000000098c21000100000000000000000000000000000000000000000000000000000000000000038971100a8c210000000000000000000b8c2100002000000000000000100000000000000c8c21000090000000101000000000000925111000e000000000000007c4f110007000000000000000000000000000000000000003897110078c310000000000000000000d4c2100001000000000000000100000000000000dcc210000d0000000101000000000000763411000300000000000000e7ea1000070000000000000000000000000000000000000038971100ecc210000000000000000000fcc210000100000000000000010000000000000004c310000e000000000000000000000012c3100012000000000000000000000000000000000000000000000000000000000000003897110024c31000000000000000000034c310000200000000000000010000000000000044c31000060000000000000000000000925111000e0000000000000000000000000000000000000000000000000000000000000038971100e8d2100000000000000000004cc310000100000000000000010000000000000054c310000a00000000000000000000007c4f110007000000000000000000000000000000000000000000000000000000000000003897110078c31000000000000000000060c310000100000000000000010000000000000068c310000e00000000000000000000007c4f110007000000000000000000000000000000000000000000000000000000000000003897110078c31000000000000000000088c310000100000000000000010000000000000090c3100006000000000000000000000096c310000b0000000000000000000000000000000000000000000000000000000000000038971100a4c310000000000000000000b4c3100001000000000000000100000000000000bcc31000060000000000000000000000c2c31000230000000000000000000000000000000000000000000000000000000000000038971100e8c310000000000000000000f8c310000100000000000000010000000000000000c410000a00000000000000000000000ac410000a0000000000000000000000000000000000000000000000000000000000000038971100e8d21000000000000000000014c41000010000000000000001000000000000001cc410000b000000020101000000000027c4100002000000000000007c4f1100070000000000000029c41000210000000000000038971100f8d2100000000000000000004cc410000d00000000000000010000004163636f756e744e6f6e6365543a3a496e646578f9ca10001f00000045787472696e736963436f756e740000cbca10002e000000416c6c45787472696e7369637357656967687457656967687400000086ca100045000000416c6c45787472696e736963734c656e3700000000000000010000004f00000036ca1000500000004e6578745765696768744d756c7469706c6965725765696768744d756c7469706c696572370000000000000001000000ab000000c2c91000590000001bca10001b000000426c6f636b486173680000009cc910002600000045787472696e73696344617461000000370000000000000001000000510000004dc910004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e29370000000000000001000000b800000090c8100069000000f9c81000540000004e756d62657200004ec8100042000000506172656e7448617368000032c810001c00000045787472696e73696373526f6f740000370000000000000001000000b9000000edc71000450000004469676573744469676573744f663c543e00000037000000000000000100000050000000b1c710003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e000000370000000000000001000000ba00000089c71000280000004576656e74436f756e744576656e74496e6465785bc710002e0000004576656e74546f7069637328295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e0000b4c4100049000000fdc4100025000000389711000000000022c510004b0000006dc510002a000000389711000000000097c5100054000000ebc51000510000003cc6100039000000389711000000000075c6100053000000c8c61000530000001bc7100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546865206e65787420776569676874206d756c7469706c6965722e20546869732073686f756c6420626520757064617465642061742074686520656e64206f66206561636820626c6f636b206261736564206f6e207468652073617475726174696f6e206c6576656c2028776569676874292e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e496e7374616e636531436f6c6c6563746976652050726f706f73616c73496e7374616e636531436f6c6c65637469766520566f74696e67496e7374616e636532436f6c6c6563746976652050726f706f73616c73496e7374616e636532436f6c6c65637469766520566f74696e6700000000000038cc10000b0000000000000044cc10000100000000000000000000005ccc10000400000000000000000000007ccc1000070000000000000084cc10000100000000000000000000009ccc1000030000000000000000000000b84811000700000000000000b4cc1000020000000000000000000000e4cc100004000000000000000000000070491100040000000000000004cd10000300000000000000000000004ccd100004000000000000007365745f6d656d6265727300000000007ccf10000b00000000000000255c110011000000fbce1000540000004fcf100017000000389711000000000066cf10001600000065786563757465000000000058531100080000000000000075ce10001e00000093ce10003d0000003897110000000000d0ce10002b0000000000000058ce1000090000000000000061ce1000140000000000000058531100080000000000000075ce10001e000000c54d11000b00000006ce1000240000002ace10002e000000d84d11000c000000000000005853110008000000000000007c4f11000700000000000000e4cd10000500000000000000e9cd10001600000000000000ffcd10000700000000000000f743110004000000c54d11000b0000006ccd1000230000008fcd100055000000d84d11000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e7468726573686f6c64436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e642070726f76696465206974207072652d736f727465642e20526571756972657320726f6f74206f726967696e2e6e65775f6d656d62657273496e7374616e636531436f6c6c65637469766550726f706f73616c735665633c543a3a486173683e00e8d010002400000050726f706f73616c4f663c542061732054726169743c493e3e3a3a50726f706f73616c00b5d0100033000000566f74696e67566f7465733c543a3a4163636f756e7449643e00000088d010002d00000050726f706f73616c436f756e7400000076d010001200000028d010004e000000205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e2050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e496e7374616e636532436f6c6c65637469766500000000009acf1000090000000000000000000000a3cf10000c0000000000000000000000000000000000000000000000000000000000000038971100f8d210000000000000000000b0cf100001000000000000000100000000000000b8cf10000a00000001010000000000007c4f11000700000000000000c2cf1000190000000000000000000000000000000000000038971100d8d210000000000000000000dccf100001000000000000000000000000000000e4cf10000600000001010000000000007c4f11000700000000000000eacf1000130000000000000000000000000000000000000038971100d8d21000000000000000000000d010000100000000000000000000000000000008d010000d000000000000000000000076341100030000000000000000000000000000000000000000000000000000000000000038971100e8d21000000000000000000018d0100001000000000000000100000000000000ace61000070000000000000000000000255c1100110000000000000000000000000000000000000000000000000000000000000038971100f8d21000000000000000000020d010000100000000000000010000003700000000000000010000004f0000003700000000000000010000009c000000370000000000000001000000500000007cb8100041000000e9000000010000003a6865617070616765733a636f646500d8b8100045000000830000000100000070726f706f736572206e6f742061206d656d6265726475706c69636174652070726f706f73616c73206e6f7420616c6c6f776564496e7374616e636531436f6c6c6563746976652050726f706f73616c4f66496e7374616e636531436f6c6c6563746976652050726f706f73616c436f756e7470726f706f73616c206d757374206578697374766f746572206e6f742061206d656d6265726d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f726564496e7374616e636532436f6c6c6563746976652050726f706f73616c4f66496e7374616e636532436f6c6c6563746976652050726f706f73616c436f756e740000000000000064d410000f0000000000000074d4100002000000000000000000000084d4100004000000000000004e65774163636f756e74496e64657800d0431100090000001fd510000c000000a4d41000220000003897110000000000c6d410004100000007d51000180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e6465780050d510001900000070d5100048000000230100000e000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e7273d0d510000e000000ded5100048000000220100004a0000006578706c696369742070616e69632f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e72730000d0d510000e000000ded5100048000000210100004a00000058d610002b00000083d6100044000000ef0000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e727300e0d610003000000083d6100044000000e30000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b28d710004e00000083d6100044000000e40000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7300000000000054d810000b000000000000003897110000000000000000000000000060d8100001000000000000000000000068d810000d000000000000003897110000000000000000000000000078d8100001000000000000000000000080d810000e000000000000003897110000000000000000000000000090d8100001000000000000000000000098d810000c0000000000000038971100000000000000000000000000a4d81000010000000000000000000000acd810000500000000000000b4d81000010000000000000000000000bcd8100001000000000000004d656d626572416464656400c5d91000390000004d656d62657252656d6f7665640000008ad910003b0000004d656d6265727353776170706564000053d91000370000004d656d6265727352657365740dd910004600000044756d6d79000000e0d810002d000000c4d810001c000000205068616e746f6d206d656d6265722c206e6576657220757365642e727374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e20546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e2054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e54696d657374616d70204e6f77496e646963657320456e756d53657400005900000008000000040000009d000000387d11002800000044da1000420000004a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e72730000387d110028000000a0da1000450000005c000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6d656d626572736869702f7372632f6c69622e727300000044da1000420000004a0000000100000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e742064617461496e646963657300000000fcdb10000b000000000000000000000007dc10000f000000000000000000000000000000000000000000000000000000000000003897110018dc1000000000000000000028dc10000100000000000000010000000000000030dc100007000000010100000000000007dc10000f00000000000000255c1100110000000000000000000000000000000000000038971100b4e61000000000000000000038dc10000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e64657800003700000000000000010000009c00000056dc10001f000000456e756d5365740040dc1000160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d536574e9dd10001c000000b8dc1000440000009e00000003000000c5dd100024000000b8dc100044000000a7000000030000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e727393dd100032000000b8dc10004400000001010000030000006cdd100027000000b8dc100044000000090100000400000044dd100028000000b8dc1000440000000f0100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e5472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e0000000000000034de1000030000000000000038de100001000000000000000000000050de100009000000000000007365740000000000d2df10000300000000000000d5df10001200000098de1000160000003897110000000000aede10005600000004df10003600000038971100000000003adf1000510000008bdf10001100000038971100000000009cdf10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920604d696e696d756d506572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d7000000000a0e01000030000000000000000000000a3e01000090000000000000000000000000000000000000000000000000000000000000038971100ace010000000000000000000bce0100001000000000000000100000000000000c4e01000090000000000000000000000f7431100040000000000000000000000000000000000000000000000000000000000000038971100d0e010000000000000000000e0e010000100000000000000010000004e6f77543a3a4d6f6d656e74370000000000000001000000ab00000015e11000240000004469645570646174650000003700000000000000010000004f000000e8e010002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e0000000000000074e110000d00000000000000a3e0100009000000000000003897110084e11000000000000000000094e1100004000000000000004d696e696d756d506572696f64000000370000000000000001000000bb000000b4e110005a0000000ee210005a00000068e2100059000000c1e210001c00000020546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e0000000000000090e310000a000000000000009ce31000010000000000000000000000b4e31000030000000000000000000000cce310000d000000000000009ce31000010000000000000000000000dce31000030000000000000000000000f4e310000b0000000000000000e4100002000000000000000000000030e4100003000000000000000000000048e410000d0000000000000058e4100001000000000000000000000070e4100004000000000000006164645f6d656d6265720000000000005712110003000000000000000b4e11000c000000f2e510001f000000389711000000000011e610002d00000072656d6f76655f6d656d6265720000009ee51000240000003897110000000000c2e5100030000000737761705f6d656d626572000000000095e5100006000000000000000b4e11000c000000000000009be5100003000000000000000b4e11000c00000037e5100030000000389711000000000067e510002e00000072657365745f6d656d626572730000000000000030e510000700000000000000255c11001100000090e4100056000000e6e410001b000000389711000000000001e510002f000000204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64207061737320606d656d6265727360207072652d736f727465642e204d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e6d656d626572732053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e204d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e72656d6f76656164642052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e204164642061206d656d626572206077686f6020746f20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e496e7374616e6365314d656d6265727368697000000000000000ace61000070000000000000000000000255c1100110000000000000000000000000000000000000000000000000000000000000038971100b4e610000000000000000000c4e610000100000000000000010000004d656d626572730037000000000000000100000050000000cce6100032000000205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e000080e7100048000000b10100002300000080e7100048000000b20100002300000030e7100049000000870200001d0000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f736f72742e7273000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e727330e71000490000009d0000003a00000030e7100049000000a400000030000000a0da1000450000005c00000001000000496e7374616e6365314d656d62657273686970204d656d62657273616c72656164792061206d656d626572626164206f726967696e6e6f742061206d656d62657200000080e7100048000000a10a00000e00000054e810001c00000056617269616e74206973206e6576657220636f6e737472756374656480e81000440000000a040000220000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f6c69622e727373746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c69642074797065000000000000ea1000080000000000000008ea100003000000000000000000000020ea100001000000000000000000000028ea10000c000000000000008c43110002000000000000000000000034ea10000100000000000000000000003cea10000a0000000000000048ea100001000000000000000000000050ea100001000000000000000000000058ea10000f0000000000000068ea100001000000000000000000000070ea100001000000000000000000000078ea10000a0000000000000084ea100002000000000000000000000094ea1000020000000000000000000000a4ea10000800000000000000acea1000020000000000000000000000bcea100001000000000000005472616e73666572d043110009000000d0431100090000001144110007000000eeeb10005a000000496e7374616e746961746564b7eb100037000000436f646553746f7265640000d94311000400000089eb10002e0000005363686564756c655570646174656400763411000300000059eb100030000000446973706174636865640000d043110009000000f743110004000000eeea10004e0000003ceb10001d000000436f6e7472616374d043110009000000e7ea100007000000c4ea10002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e5665633c75383e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060696e7374616e7469617465602e436f6e7472616374205072697374696e65436f6465436f6e747261637420436f646553746f72616765436f6e747261637420436f6e7472616374496e666f4f66436f6e747261637420476173507269636500000037000000000000000100000038000000c0ec10004a0000003200000006000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f63757276652e7273000000000000e8ed10000f00000000000000f8ed100001000000000000000000000010ee100003000000000000000000000028ee1000080000000000000030ee100002000000000000000000000060ee1000020000000000000000000000af861100040000000000000070ee1000040000000000000000000000d0ee100007000000000000000000000008ef10000b0000000000000014ef100004000000000000000000000074ef10000a0000000000000000000000c4ef10000f00000000000000d4ef100002000000000000000000000004f0100005000000000000007570646174655f7363686564756c65000000000054f6100008000000000000005cf6100008000000e4f510002d000000389711000000000011f61000430000007075745f636f64650000000092f3100009000000000000009bf310000c00000000000000e0f510000400000000000000e7ea10000700000054f5100057000000abf51000350000000000000046f1100004000000000000004b22110023000000000000005f551100050000000000000064551100150000000000000092f3100009000000000000009bf310000c00000000000000bbf310000400000000000000e7ea100007000000bff3100042000000389711000000000001f410004a0000004bf410002c00000077f4100046000000bdf41000520000000ff5100045000000696e7374616e7469617465000000000089f31000090000000000000064551100150000000000000092f3100009000000000000009bf310000c00000000000000a7f310000900000000000000b0f310000b00000000000000bbf310000400000000000000e7ea10000700000068f110006f0000003897110000000000d7f11000260000003897110000000000fdf11000500000004df21000410000008ef210005b000000e9f210005700000040f310002a0000006af310001f000000636c61696d5f737572636861726765000000000046f1100004000000000000000b4e11000c000000000000004af110000a0000000000000054f11000140000002cf010005c00000088f01000450000003897110000000000cdf010004e0000001bf110002b00000020416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e646573746175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20496e7374616e7469617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e20496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c4761733e636f64655f68617368436f6465486173683c543e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c6500000000ccf81000080000000000000000000000d4f810000300000000000000000000000000000000000000000000000000000000000000389711007cf910000000000000000000d8f8100001000000000000000100000000000000e0f810000f00000000000000000000005cf61000080000000000000000000000000000000000000000000000000000000000000038971100f0f81000000000000000000000f910000100000000000000010000000000000008f910000c0000000101000000000000b0f310000b00000000000000e7ea100007000000000000000000000000000000000000003897110014f91000000000000000000024f91000010000000000000000000000000000002cf910000b0000000101000000000000b0f310000b0000000000000037f9100016000000000000000000000000000000000000003897110050f91000000000000000000060f910000100000000000000000000000000000068f910000e000000000000000000000076f910000300000000000000000000000000000000000000000000000000000000000000389711007cf9100000000000000000008cf910000100000000000000010000000000000094f910000e00000001010000000000000b4e11000c00000000000000a2f910000f0000000000000000000000000000000000000038971100b4f910000000000000000000c4f9100001000000000000000000000000000000ccf910000800000000000000000000007a6511000c0000000000000000000000000000000000000000000000000000000000000038971100d4f910000000000000000000e4f910000100000000000000010000004761735370656e744761730020fb10002000000043757272656e745363686564756c6500370000000000000001000000bc000000fbfa1000250000005072697374696e65436f64653700000000000000010000004f000000a2fa100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c650000003700000000000000010000004f00000049fa1000590000004163636f756e74436f756e746572753634000000370000000000000001000000ab00000034fa100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e0000003700000000000000010000004f0000000afa10002a0000004761735072696365370000000000000001000000bd000000ecf910001e00000020546865207072696365206f66206f6e6520756e6974206f66206761732e2054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e00000000c0fe10001300000000000000925111000e0000000000000038971100d4fe10000000000000000000e4fe100004000000000000000000000004ff100010000000000000007a6511000c00000000000000389711005cff1000000000000000000014ff10000100000000000000000000001cff100011000000000000007634110003000000000000003897110030ff1000000000000000000040ff100002000000000000000000000050ff10000b000000000000007a6511000c00000000000000389711005cff100000000000000000006cff100001000000000000000000000074ff100011000000000000007a6511000c000000000000003897110088ff1000000000000000000098ff1000070000000000000000000000d0ff10000f000000000000007a6511000c0000000000000038971100e0ff10000000000000000000f0ff1000020000000000000000000000000011000b000000000000007a6511000c00000000000000389711007c00110000000000000000000c001100010000000000000000000000140011000b000000000000007a6511000c00000000000000389711007c0011000000000000000000200011000100000000000000000000002800110012000000000000007a6511000c00000000000000389711007c00110000000000000000003c0011000100000000000000000000004400110012000000000000007a6511000c000000000000003897110058001100000000000000000068001100010000000000000000000000700011000b000000000000007a6511000c00000000000000389711007c00110000000000000000008c0011000200000000000000000000009c0011000b00000000000000d4f81000030000000000000038971100cc0011000000000000000000a8001100020000000000000000000000b80011001200000000000000d4f81000030000000000000038971100cc0011000000000000000000dc001100020000000000000000000000ec001100080000000000000076341100030000000000000038971100f4001100000000000000000004011100020000000000000000000000140111000c000000000000007634110003000000000000003897110020011100000000000000000030011100010000000000000000000000380111000d00000000000000d4f810000300000000000000389711004801110000000000000000005801110002000000000000005369676e6564436c61696d48616e646963617000370000000000000001000000be000000080711003800000038971100000000004007110043000000830711001a000000546f6d6273746f6e654465706f736974d30611003500000053746f7261676553697a654f6666736574000000370000000000000001000000a90000005606110054000000aa0611002900000052656e74427974654665650037000000000000000100000099000000090611004d00000052656e744465706f7369744f6666736574000000370000000000000001000000bf0000009104110041000000d2041100160000003897110000000000e80411005a00000042051100560000009805110053000000eb0511001e00000053757263686172676552657761726400370000000000000001000000c00000003e04110039000000770411001a0000005472616e736665724665650019041100250000004372656174696f6e46656500f2031100270000005472616e73616374696f6e426173654665650000bb031100370000005472616e73616374696f6e4279746546656500003700000000000000010000009b0000007803110043000000436f6e7472616374466565003700000000000000010000009a0000002103110050000000710311000700000043616c6c4261736546656500cc02110047000000130311000e000000496e7374616e7469617465426173654665650000370000000000000001000000c1000000760211004e000000c4021100080000004d61784465707468370000000000000001000000c20000001c0211004c000000680211000e0000004d617856616c756553697a65370000000000000001000000c3000000ce0111004e000000426c6f636b4761734c696d6974000000370000000000000001000000c40000006801110049000000b10111001d00000020546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e204120726561736f6e61626c652064656661756c742076616c75652069732031305f3030305f3030302e20546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f696e7374616e746961746520737461636b2e204120726561736f6e61626c652064656661756c742076616c7565206973203130302e20546865206261736520666565206368617267656420666f7220696e7374616e74696174696e67206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203137352e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203133352e205468652066656520726571756972656420746f20696e7374616e7469617465206120636f6e747261637420696e7374616e63652e204120726561736f6e61626c652064656661756c742076616c75652069732032312e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f6620696e7374616e746961696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c617943616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e74726163746d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e65644d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e52657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e64656661756c743a000000387d11002800000080e8100044000000c80100000100000080e8100044000000c8010000010000006e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e74417574686f72697479446973636f76657279204b657973000000387d110028000000c80a11004e00000034000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617574686f726974792d646973636f766572792f7372632f6c69622e72730000c80a11004e000000340000000100000000000000ac0b11000500000000000000b40b1100010000000000000000000000bc0b1100010000000000000000000000c40b11000a00000000000000a8431100010000000000000000000000d00b1100010000000000000000000000d80b11000a00000000000000b40b1100010000000000000000000000bc0b110001000000000000005375646964000000f7431100040000001e0c1100180000004b65794368616e6765640000e20b11003c0000005375646f4173446f6e6520546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090972657475726e2074797065206572726f7276616c69646174696f6e206572726f72647572696e6720657865637574696f6e00387d110028000000740e11003f00000068000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e727300740e11003f00000068000000010000006f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f5375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b657900400f1100480000009b0a00000a000000400f110048000000a10a00000e0000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e7273000000000c1011000400000000000000684a1100010000000000000000000000101011000a00000000000000000000006010110007000000000000006810110001000000000000000000000080101100090000000000000000000000c81011000700000000000000d0101100020000000000000000000000001111000b000000000000007375646fc81211004e0000003897110000000000bd111100340000003897110000000000c54d11000b000000d04d110008000000f1111100190000000a121100180000002212110035000000d84d11000c0000007365745f6b65790000000000fc20110003000000000000004b221100230000005a1211005d0000003897110000000000bd111100340000003897110000000000c54d11000b000000d04d110008000000f111110019000000b712110011000000d84d11000c0000007375646f5f617300000000005712110003000000000000004b221100230000000000000058531100080000000000000060531100100000005811110054000000ac111100110000003897110000000000bd111100340000003897110000000000c54d11000b000000d04d110008000000f1111100190000000a121100180000002212110035000000d84d11000c0000002041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d206120676976656e206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e202d204c696d697465642073746f726167652072656164732e202d204f6e6520444220777269746520286576656e74292e202d20556e6b6e6f776e20776569676874206f662064657269766174697665206070726f706f73616c6020657865637574696f6e2e77686f2041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e202d204f6e65204442206368616e67652e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e5375646f000000000000741311000300000000000000000000000b4e11000c0000000000000000000000000000000000000000000000000000000000000038971100781311000000000000000000881311000100000000000000010000004b657900370000000000000001000000c500000090131100210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e0000003b1411000d0000001e1411001b0000003914110002000000dc131100420000001f020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f203a20657865637574655f626c6f636b5014110010000000696e697469616c697a655f626c6f636b681411000f0000006170706c795f65787472696e736963008014110013000000696e686572656e745f65787472696e73696373009c1411000f000000636865636b5f696e686572656e747300b41411001400000076616c69646174655f7472616e73616374696f6ed01411000f0000006f6666636861696e5f776f726b657200e8141100040000007369676ef4141100060000007665726966790000041511000d0000006163636f756e745f6e6f6e6365000000af86110004000000241511001500000067656e65726174655f73657373696f6e5f6b65797300000000000000c01511000600000000000000c8151100010000000000000000000000d0151100010000000000000000000000d81511000500000000000000e0151100020000000000000000000000f0151100010000000000000000000000f81511001a00000000000000108d110001000000000000000000000014161100020000000000000052657761726400001144110007000000c616110038000000536c617368000000d04311000900000011441100070000007d161100490000004f6c64536c617368696e675265706f7274446973636172646564000024161100470000006b1611001200000020416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c64206e6f742062652070726f6365737365642e204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e672043757272656e7445726153746172745374616b696e67204e6f6d696e61746f727368656164206f66205374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f727368656164206f66205374616b696e672056616c696461746f72735374616b696e67205374616b6572735374616b696e6720426f6e6465645374616b696e67204c65646765725374616b696e672050617965655374616b696e672043757272656e74456c65637465640000000000f81911000400000000000000fc191100030000000000000000000000441a11000f0000000000000000000000bc1a11000a00000000000000c81a1100010000000000000000000000e01a11000e0000000000000000000000501b11000600000000000000581b1100010000000000000000000000701b1100170000000000000000000000281c11001100000000000000389711000000000000000000000000003c1c1100100000000000000000000000bc1c11000800000000000000c41c1100010000000000000000000000dc1c11000b0000000000000000000000341d110008000000000000003c1d1100010000000000000000000000541d11000b0000000000000000000000ac1d1100050000000000000038971100000000000000000000000000b41d11000b00000000000000000000000c1e11000900000000000000181e1100010000000000000000000000301e11000b0000000000000000000000881e11000e00000000000000981e1100010000000000000000000000b01e11000b0000000000000000000000081f110013000000000000001c1f1100010000000000000000000000341f11000100000000000000000000003c1f11000d00000000000000389711000000000000000000000000004c1f1100050000000000000000000000741f11000d0000000000000038971100000000000000000000000000841f1100060000000000000000000000b41f11001100000000000000c81f1100010000000000000000000000e01f11000100000000000000626f6e6400000000412211000a000000000000004b22110023000000000000005f5511000500000000000000645511001500000000000000f12211000500000000000000f622110011000000d72b110059000000302c1100210000003897110000000000512c11004c00000038971100000000009d2c1100490000003897110000000000c54d11000b000000e62c110035000000d04d1100080000001b2d11001a0000003897110000000000352d11005b000000902d110049000000d84d11000c000000626f6e645f6578747261000000000000c92b11000e000000000000006455110015000000a32a110059000000fc2a11000d0000003897110000000000092b1100540000005d2b110059000000b62b11001300000038971100000000005a211100550000003897110000000000c54d11000b000000af2111003a000000d04d1100080000001d55110010000000d84d11000c000000756e626f6e640000000000005f55110005000000000000006455110015000000c8261100550000001d271100400000005d271100490000003897110000000000a627110052000000f8271100300000003897110000000000282811004f000000772811004f000000c62811003f00000038971100000000009c22110055000000389711000000000005291100260000003897110000000000c54d11000b0000002b29110050000000e9211100260000007b29110059000000d42911005c000000302a1100690000001d55110010000000992a11000a00000077697468647261775f756e626f6e646564000000c12411004b00000038971100000000000c2511004d000000592511001300000038971100000000009c2211005500000038971100000000006c2511001b0000003897110000000000c54d11000b0000008725110055000000dc251100510000002d2611003d0000006a2611005e0000000f22110032000000d84d11000c00000076616c696461746500000000a02411000500000000000000a52411001c000000662411003a0000003897110000000000232111003700000038971100000000009c221100550000003897110000000000c54d11000b000000af2111003a000000e9211100260000000f22110032000000d84d11000c0000006e6f6d696e617465000000003724110007000000000000003e241100280000004e231100440000003897110000000000232111003700000038971100000000009c221100550000003897110000000000c54d11000b0000009223110049000000db231100260000000124110036000000d84d11000c0000006368696c6c00000007231100320000003897110000000000232111003700000038971100000000009c221100550000003897110000000000c54d11000b000000af2111003a00000039231100150000000f22110032000000d84d11000c0000007365745f706179656500000000000000f12211000500000000000000f6221100110000006e2211002e0000003897110000000000232111003700000038971100000000009c221100550000003897110000000000c54d11000b000000af2111003a000000e9211100260000000f22110032000000d84d11000c0000007365745f636f6e74726f6c6c6572000000000000412211000a000000000000004b22110023000000ff201100240000003897110000000000232111003700000038971100000000005a211100550000003897110000000000c54d11000b000000af2111003a000000e9211100260000000f22110032000000d84d11000c0000007365745f76616c696461746f725f636f756e740000000000fc2011000300000000000000fa4e11000c000000dc20110020000000666f7263655f6e6f5f65726173000000b02011002c0000003897110000000000c54d11000b000000a020110010000000d84d11000c000000666f7263655f6e65775f657261000000252011005300000078201100280000003897110000000000c54d11000b000000a020110010000000d84d11000c0000007365745f696e76756c6e657261626c6573000000000000001b2011000a00000000000000255c110011000000e81f11003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f727320466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c20626520726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e202d204e6f20617267756d656e74732e20466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e2054686520696465616c206e756d626572206f662076616c696461746f72732e6e6577202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c65723c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e2020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c2077686963682069732020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e203c2f7765696768743e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e20556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e5374616b696e6700000000683411000e0000000000000000000000763411000300000000000000000000000000000000000000000000000000000000000000389711006c36110000000000000000007c3411000100000000000000010000000000000084341100150000000000000000000000763411000300000000000000000000000000000000000000000000000000000000000000389711009c3411000000000000000000ac34110001000000000000000100000000000000b43411000d0000000000000000000000255c1100110000000000000000000000000000000000000000000000000000000000000038971100d03711000000000000000000c434110003000000000000000100000000000000dc3411000600000001010000000000000b4e11000c000000000000000b4e11000c00000000000000000000000000000000000000389711001c3511000000000000000000e434110001000000000000000000000000000000ec3411000600000001010000000000000b4e11000c00000000000000f23411002900000000000000000000000000000000000000389711001c35110000000000000000002c35110001000000000000000000000000000000343511000500000001010000000000000b4e11000c00000000000000f62211001100000000000000000000000000000000000000389711003c35110000000000000000004c35110001000000000000000100000000000000543511000a00000001010100000000000b4e11000c00000000000000a52411001c00000000000000000000000000000000000000389711006035110000000000000000007035110001000000000000000100000000000000783511000a00000001010100000000000b4e11000c00000000000000255c1100110000000000000000000000000000000000000038971100d0371100000000000000000084351100010000000000000001000000000000008c3511000700000001010000000000000b4e11000c0000000000000093351100240000000000000000000000000000000000000038971100b83511000000000000000000c835110004000000000000000100000000000000e83511000e0000000000000000000000255c1100110000000000000000000000000000000000000000000000000000000000000038971100d03711000000000000000000f835110001000000000000000100000000000000003611000a00000000000000000000000a3611000800000000000000000000000000000000000000000000000000000000000000389711006c361100000000000000000014361100010000000000000001000000000000001c3611000f00000000000000000000002b3611000b00000000000000000000000000000000000000000000000000000000000000389711003836110000000000000000004836110001000000000000000100000000000000503611001b00000000000000000000009f8d11000c00000000000000000000000000000000000000000000000000000000000000389711006c36110000000000000000007c36110001000000000000000100000000000000843611001600000000000000000000009a361100090000000000000000000000000000000000000000000000000000000000000038971100a43611000000000000000000b436110001000000000000000100000000000000bc3611000900000000000000000000007a6511000c0000000000000000000000000000000000000000000000000000000000000038971100c83611000000000000000000d836110003000000000000000100000000000000f0361100080000000000000000000000f83611000700000000000000000000000000000000000000000000000000000000000000389711000037110000000000000000001037110001000000000000000100000000000000183711001300000000000000000000002b37110007000000000000000000000000000000000000000000000000000000000000003897110034371100000000000000000044371100030000000000000001000000000000005c3711000a0000000000000000000000663711001d0000000000000000000000000000000000000000000000000000000000000038971100d0371100000000000000000084371100010000000000000001000000000000008c3711000f00000001010000000000000a36110008000000000000009b371100320000000000000000000000000000000000000038971100d03711000000000000000000e037110001000000000000000100000056616c696461746f72436f756e74753332000000da3d11002a0000004d696e696d756d56616c696461746f72436f756e74000000370000000000000001000000c60000008a3d110050000000496e76756c6e657261626c6573000000b63c1100560000000c3d1100530000005f3d11002b000000426f6e6465640000763c1100400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e003700000000000000010000004f000000253c11005100000050617965650000003700000000000000010000004f000000ec3b11003900000056616c696461746f72730000370000000000000001000000c70000009b3b1100510000004e6f6d696e61746f72730000423b1100590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e00370000000000000001000000c8000000853a110053000000d83a11004600000038971100000000001e3b11002400000043757272656e74456c65637465640000463a11003f00000043757272656e74457261457261496e64657800002f3a11001700000043757272656e7445726153746172744d6f6d656e744f663c543e0000370000000000000001000000ab000000113a11001e00000043757272656e74457261537461727453657373696f6e496e646578003700000000000000010000009c000000dd3911003400000043757272656e74457261506f696e74734561726e6564457261506f696e747300370000000000000001000000c90000009a39110043000000536c6f745374616b65000000370000000000000001000000980000001e3911004c00000038971100000000006a39110030000000466f726365457261466f7263696e67003700000000000000010000004f000000d738110047000000536c6173685265776172644672616374696f6e50657262696c6c0000370000000000000001000000ca000000603811003e00000038971100000000009e38110039000000426f6e646564457261735665633c28457261496e6465782c2053657373696f6e496e646578293e001738110049000000457261536c6173684a6f75726e616c5665633c536c6173684a6f75726e616c456e7472793c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00000037000000000000000100000050000000e83711002f00000020416c6c20736c617368657320746861742068617665206f6363757272656420696e206120676976656e206572612e2041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e20546865207374617274206f66207468652063757272656e74206572612e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e00000000743e11000e000000000000009f8d11000c0000000000000038971100843e11000000000000000000943e11000100000000000000000000009c3e11000f000000000000000a361100080000000000000038971100ac3e11000000000000000000bc3e1100010000000000000053657373696f6e735065724572610000370000000000000001000000a5000000fd3e11001c000000426f6e64696e674475726174696f6e00370000000000000001000000cb000000c43e110039000000204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e204e756d626572206f662073657373696f6e7320706572206572612e5374616b696e6720536c6f745374616b650000603f110019000000803f110048000000bb0100002d0000005374616b696e6720457261536c6173684a6f75726e616c0000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f6f70732f61726974682e72735374616b696e6720496e76756c6e657261626c6573000000387d110028000000f83f1100420000009c020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e72730000f83f1100420000009c02000001000000636f6e74726f6c6c657220616c72656164792070616972656463616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e6365737461736820616c726561647920626f6e6465646e6f7420612073746173686e6f74206120636f6e74726f6c6c657263616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b73746172676574732063616e6e6f7420626520656d7074790000000000e44211000800000000000000ec42110002000000000000000000000038971100000000000000000000000000fc421100060000000000000004431100030000000000000000000000389711000000000000000000000000001c4311000e0000000000000038971100000000000000000000000000389711000000000000000000000000002a431100070000000000000034431100020000000000000000000000389711000000000000000000000000004443110006000000000000004c431100010000000000000000000000389711000000000000000000000000005443110009000000000000004c431100010000000000000000000000389711000000000000000000000000005d43110009000000000000004c4311000100000000000000000000003897110000000000000000000000000066431100080000000000000070431100020000000000000000000000389711000000000000000000000000008043110009000000000000008c431100020000000000000000000000389711000000000000000000000000009c4311000b00000000000000a843110001000000000000000000000038971100000000000000000000000000b04311000600000000000000b843110003000000000000000000000038971100000000000000000050726f706f736564084411000900000011441100070000005461626c6564000008441100090000001144110007000000184411000e00000045787465726e616c5461626c656453746172746564000000e84311000f000000fb4311000d0000005061737365640000e84311000f0000004e6f7450617373656443616e63656c6c656445786563757465640000e84311000f000000f74311000400000044656c656761746564000000d043110009000000d043110009000000556e64656c65676174656400d0431100090000005665746f65640000d043110009000000d943110004000000dd4311000b0000004163636f756e74496448617368426c6f636b4e756d6265725265666572656e64756d496e646578626f6f6c566f74655468726573686f6c6450726f70496e64657842616c616e63655665633c4163636f756e7449643e44656d6f637261637920566f74654f6644656d6f6372616379205265666572656e64756d496e666f4f6644656d6f63726163792044656c65676174696f6e7368656164206f662044656d6f63726163792044656c65676174696f6e7344656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7244656d6f6372616379205075626c696350726f70730000005045110048000000a10a00000e00000044656d6f6372616379204465706f7369744f664e6f207075626c69632070726f706f73616c732077616974696e6743616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e727344656d6f6372616379204e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e67000000000000b84811000700000000000000c0481100020000000000000000000000f0481100060000000000000000000000204911000600000000000000284911000100000000000000000000004049110006000000000000000000000070491100040000000000000074491100020000000000000000000000a4491100070000000000000000000000dc4911000a0000000000000074491100020000000000000000000000e8491100070000000000000000000000204a11001000000000000000304a1100010000000000000000000000484a1100020000000000000000000000584a11001000000000000000684a1100010000000000000000000000804a1100020000000000000000000000904a11001900000000000000684a1100010000000000000000000000ac4a1100050000000000000000000000d44a11001800000000000000684a1100010000000000000000000000ec4a1100050000000000000000000000144b11000a00000000000000204b1100030000000000000000000000684b1100080000000000000000000000a84b11000d00000000000000b84b1100010000000000000000000000d04b1100010000000000000000000000d84b11001100000000000000ec4b1100010000000000000000000000044c11000100000000000000000000000c4c11000d000000000000001c4c1100030000000000000000000000644c11000100000000000000000000006c4c11000900000000000000784c1100010000000000000000000000904c1100050000000000000000000000b84c11000c0000000000000038971100000000000000000000000000c44c1100050000000000000000000000ec4c11000c00000000000000784c1100010000000000000000000000f84c1100050000000000000000000000204d11000800000000000000284d1100020000000000000000000000584d1100050000000000000000000000804d11000a00000000000000389711000000000000000000000000008c4d1100050000000000000070726f706f736500000000005853110008000000000000006053110010000000000000005f55110005000000000000006455110015000000f5541100280000003897110000000000c54d11000b000000d04d1100080000003f55110020000000d84d11000c0000007365636f6e640000000000005853110008000000000000002d55110012000000f5541100280000003897110000000000c54d11000b000000d04d1100080000001d55110010000000d84d11000c000000766f746500000000374f110009000000000000000a4f11001800000000000000704911000400000000000000f154110004000000755411004d000000c25411002f0000003897110000000000c54d11000b000000d04d110008000000565411001f000000d84d11000c00000070726f78795f766f74650000c453110054000000185411003e0000003897110000000000c54d11000b000000d04d110008000000565411001f000000d84d11000c000000656d657267656e63795f63616e63656c00000000374f11000900000000000000e84311000f00000070531100540000004c5311000c00000065787465726e616c5f70726f706f7365000000005853110008000000000000006053110010000000005311004c0000004c5311000c00000065787465726e616c5f70726f706f73655f6d616a6f726974790000009252110056000000e852110018000000389711000000000018521100530000006b5211002700000065787465726e616c5f70726f706f73655f64656661756c74a551110052000000f751110021000000389711000000000018521100530000006b52110027000000666173745f747261636b0000000000006f4f11000d000000000000007c4f11000700000000000000855111000d00000000000000925111000e00000000000000a05111000500000000000000925111000e000000834f110054000000d74f110059000000305011003b00000038971100000000006b5011003e000000a95011004b000000f450110055000000495111003c0000007665746f5f65787465726e616c000000000000006f4f11000d000000000000007c4f110007000000404f11002f00000063616e63656c5f7265666572656e64756d00000000000000374f110009000000000000000a4f110018000000224f11001500000063616e63656c5f71756575656400000000000000da4e11000400000000000000de4e11001700000000000000f54e11000500000000000000fa4e11000c00000000000000064f110004000000000000000a4f110018000000b24e1100280000007365745f70726f787900000000000000ad4e110005000000000000000b4e11000c000000874e1100260000003897110000000000c54d11000b000000f34d110016000000d84d11000c00000072657369676e5f70726f7879614e1100260000003897110000000000c54d11000b000000514e110010000000d84d11000c00000072656d6f76655f70726f78792b4e1100260000003897110000000000c54d11000b000000514e110010000000d84d11000c00000064656c656761746500000000094e110002000000000000000b4e11000c00000000000000174e11000a00000000000000214e11000a000000e44d11000f0000003897110000000000c54d11000b000000f34d110016000000d84d11000c000000756e64656c65676174650000b44d1100110000003897110000000000c54d11000b000000d04d110008000000d84d11000c00000020556e64656c656761746520766f74652e2023203c7765696768743e202d204f2831292e2023203c2f7765696768743e2044656c656761746520766f74652e202d204f6e6520657874726120444220656e7472792e746f543a3a4163636f756e744964636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e202d204f6e6520444220636c6561722e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e436f6d706163743c543a3a426c6f636b4e756d6265723e7768696368436f6d706163743c7533323e77686174436f6d706163743c5265666572656e64756d496e6465783e2052656d6f76652061207265666572656e64756d2e7265665f696e646578205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e70726f706f73616c5f68617368543a3a48617368205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c656420696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e6520627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265202020656e61637465642e20496e6372656173656420746f2060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e766f74696e675f706572696f64543a3a426c6f636b4e756d62657264656c6179205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e20556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e70726f706f73616c426f783c543a3a50726f706f73616c3e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6520566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e202d204f6e6520444220656e7472792e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e76616c7565436f6d706163743c42616c616e63654f663c543e3e44656d6f6372616379000000000000ac5a11000f0000000000000000000000084411000900000000000000000000000000000000000000000000000000000000000000389711006c5b11000000000000000000bc5a110001000000000000000100000000000000c45a11000b0000000000000000000000cf5a11002b0000000000000000000000000000000000000000000000000000000000000038971100385c11000000000000000000fc5a110001000000000000000100000000000000045b11000900000001010000000000000844110009000000000000000d5b1100210000000000000000000000000000000000000038971100305b11000000000000000000405b110001000000000000000000000000000000485b11000f0000000000000000000000e84311000f00000000000000000000000000000000000000000000000000000000000000389711006c5b11000000000000000000585b110001000000000000000100000000000000605b1100090000000000000000000000e84311000f00000000000000000000000000000000000000000000000000000000000000389711006c5b110000000000000000007c5b110001000000000000000100000000000000845b1100100000000101000000000000e84311000f00000000000000945b11002d0000000000000000000000000000000000000038971100b05c11000000000000000000c45b110001000000000000000000000000000000cc5b11000d0000000101000000000000925111000e00000000000000d95b11002b0000000000000000000000000000000000000038971100045c11000000000000000000145c1100010000000000000001000000000000001c5c1100090000000101000000000000e84311000f00000000000000255c1100110000000000000000000000000000000000000038971100385c11000000000000000000485c110001000000000000000100000000000000505c1100060000000101000000000000565c11001f00000000000000f1541100040000000000000000000000000000000000000038971100785c11000000000000000000885c110004000000000000000100000000000000a85c11000500000001010000000000000b4e11000c000000000000000b4e11000c0000000000000000000000000000000000000038971100b05c11000000000000000000c05c110002000000000000000000000000000000d05c11000b00000001010100000000000b4e11000c00000000000000db5c11001a0000000000000000000000000000000000000038971100f85c11000000000000000000085d110001000000000000000100000000000000105d1100150000000000000000000000f7431100040000000000000000000000000000000000000000000000000000000000000038971100ec5d11000000000000000000285d110002000000000000000100000000000000385d11000c0000000000000000000000445d11001c0000000000000000000000000000000000000000000000000000000000000038971100605d11000000000000000000705d110004000000000000000000000000000000905d11000900000001010000000000007c4f11000700000000000000995d1100230000000000000000000000000000000000000038971100bc5d11000000000000000000cc5d110002000000000000000000000000000000dc5d11000d00000001010000000000007c4f11000700000000000000f7431100040000000000000000000000000000000000000038971100ec5d11000000000000000000fc5d11000100000000000000010000005075626c696350726f70436f756e74006c6311003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e00004c631100200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290000370000000000000001000000a20000002b631100210000005265666572656e64756d436f756e7400df6211004c0000004e65787454616c6c790000003700000000000000010000009c000000ad621100320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000806211002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e370000000000000001000000500000005062110030000000566f74657273466f725665633c543a3a4163636f756e7449643e0000370000000000000001000000500000002762110029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e744964290000003700000000000000010000004f000000e86011005800000040611100530000009361110057000000ea6111003d00000050726f78790000003700000000000000010000004f0000007a6011004c000000c66011002200000044656c65676174696f6e7328543a3a4163636f756e7449642c20436f6e76696374696f6e29000000370000000000000001000000cc0000002a601100500000004c6173745461626c656457617345787465726e616c000000ca5f110056000000206011000a0000004e65787445787465726e616c28543a3a50726f706f73616c2c20566f74655468726573686f6c6429370000000000000001000000cd000000dc5e110056000000325f110055000000875f110029000000b05f11001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e29370000000000000001000000a20000004e5e110054000000a25e11003a00000043616e63656c6c6174696f6e730000003700000000000000010000004f000000045e11004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e00000000000000fc6411000f00000000000000925111000e00000000000000389711000c65110000000000000000001c651100050000000000000000000000446511000c00000000000000925111000e0000000000000038971100e0651100000000000000000050651100010000000000000000000000586511000c00000000000000925111000e0000000000000038971100e06511000000000000000000646511000100000000000000000000006c6511000e000000000000007a6511000c000000000000003897110088651100000000000000000098651100010000000000000000000000a06511001500000000000000925111000e0000000000000038971100b86511000000000000000000c8651100010000000000000000000000d06511000d00000000000000925111000e0000000000000038971100e06511000000000000000000f06511000100000000000000456e6163746d656e74506572696f6400370000000000000001000000ce0000003f6711005c00000038971100000000009b6711004c000000e76711005a00000041681100270000004c61756e6368506572696f640667110039000000566f74696e67506572696f64d86611002e0000004d696e696d756d4465706f73697442616c616e63654f663c543e0000370000000000000001000000cf0000008b6611004d000000456d657267656e6379566f74696e67506572696f64000000370000000000000001000000d0000000506611003b000000436f6f6c6f6666506572696f64000000370000000000000001000000d1000000f86511005800000020506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e20546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e2049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e73757265207468617420766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e387d11002800000080681100440000004f010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e7273036b110023000000d96a11002a00000080681100440000004f0100000100000076616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7763616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f7744656d6f63726163792050726f78796e6f7420612070726f787944656d6f63726163792043616e63656c6c6174696f6e7370726f706f73616c207374696c6c20626c61636b6c697374656470726f706f73616c20616c7265616479206d61646544656d6f637261637920426c61636b6c697374696e76616c696420686173686e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974796e6f2070726f706f73616c206d616465756e6b6e6f776e2070726f706f73616c6e6f2065787465726e616c2070726f706f73616c6964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365616c726561647920612070726f787977726f6e672070726f78796e6f742064656c656761746564756e6b6e6f776e20696e64657863616e6e6f742063616e63656c207468652073616d652070726f706f73616c20747769636570726f706f73616c206e6f7420666f756e64766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e00003300000004000000040000002500000042725461626c65446174617461626c65330000000400000004000000d200000064656661756c744636345265696e74657270726574493634556e726561636861626c654e6f70426c6f636b00330000000400000004000000d30000004c6f6f704966456c7365456e6442724272496642725461626c650000330000000400000004000000d400000052657475726e43616c6c43616c6c496e6469726563740000330000000400000004000000d500000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e737400330000000400000004000000d6000000493634436f6e7374330000000400000004000000d7000000463332436f6e7374463634436f6e73743300000004000000040000000900000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e74657270726574493332496e76616c696444617461547261696c696e6744617461556e6578706563746564456f6600002c7111000b000000492f4f204572726f723a204e6f526573756c7456616c7565330000000400000004000000d80000004636344933324936344633324e6f6e65536f6d65330000000400000004000000d9000000656e7600907111005d0000001201000016000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e31312e302f7372632f6761732f6d6f642e72736c6173745f696e6465782069732067726561746572207468616e20303b206c6173745f696e64657820697320737461636b2073697a65202d20313b2071656470721100660000001001000017000000447211002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a20000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e31312e302f7372632f737461636b5f6865696768742f6d6f642e7273546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e647366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a0909090971656400f495110012000000417411000f000000147411000a0000001e74110014000000327411000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e6564206973206e6f7420646566696e65647372632f6c6962616c6c6f632f7665632e7273007c7411001c0000005074110013000000cc04000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656e2075110048000000b1010000230000002075110048000000b201000023000000d074110049000000870200001d00000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f736f72742e7273000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e7273d0741100490000009d0000003a000000d074110049000000a4000000300000004d761100120000005f7611000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644672616d6569735f706f6c796d6f72706869630000330000000400000004000000da000000656e645f6172697479000000330000000400000004000000250000006272616e63685f617269747973746172745f6865696768744e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e000000e47911000a00000046756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64d87911000c000000447911000b000000737461636b206d757374206265206e6f6e2d656d70747900397911000b000000f078110006000000737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e6400e978110007000000e07711006d000000c8000000110000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e31312e302f7372632f737461636b5f6865696768742f6d61785f6865696768742e72736d61785f686569676874707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768742f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e31312e302f7372632f737461636b5f6865696768742f6d61785f6865696768742e72737472756e633a20707573683a2000003479110005000000747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77706f703a20756e726561636861626c65706f705f6672616d653a20636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e647390791100480000009b0a00000a0000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e7273707573685f6672616d653a2066756e635f6964783a206578745f6368696c645f73746f726167655f726f6f74206e657665722072657475726e73207533323a3a6d61785f76616c75653b2071656452756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6753797374656d2073746174652063757272656e746c792070726576656e74732074686973207472616e73616374696f6e5472616e73616374696f6e20646f6573206e6f742068617665207265717569726564207065726d697373696f6e73496e76616c6964206f726967696e496e76616c69645472616e73616374696f6e20637573746f6d206572726f725472616e73616374696f6e20776f756c642065786861757374732074686520626c6f636b206c696d6974735472616e73616374696f6e2068617320616e20616e6369656e7420626972746820626c6f636b5472616e73616374696f6e20686173206120626164207369676e61747572655472616e73616374696f6e206973206f757464617465645472616e73616374696f6e2077696c6c2062652076616c696420696e2074686520667574757265496e6162696c69747920746f2070617920736f6d6520666565732028652e672e206163636f756e742062616c616e636520746f6f206c6f77295472616e73616374696f6e2063616c6c206973206e6f74206578706563746564556e6b6e6f776e5472616e73616374696f6e20637573746f6d206572726f72436f756c64206e6f742066696e6420616e20756e7369676e65642076616c696461746f7220666f722074686520756e7369676e6564207472616e73616374696f6e436f756c64206e6f74206c6f6f6b757020696e666f726d6174696f6e20726571756972656420746f2076616c696461746520746865207472616e73616374696f6e00a07c110019000000c07c1100500000005800000022000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e727348617368206e6f7420657175616c0000387d110028000000607d1100500000008700000009000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e7273387d110028000000607d1100500000009000000009000000417574686f727368697020446964536574556e636c6573426162652045706f6368496e6465784261626520417574686f726974696573426162652047656e65736973536c6f74426162652043757272656e74536c6f74426162652052616e646f6d6e65737342616265204e65787452616e646f6d6e65737342616265205365676d656e74496e6465784261626520556e646572436f6e737472756374696f6e4261626520496e697469616c697a656462616265736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214241424520696e686572656e742064617461206e6f7420666f756e64746f6f206d616e7920696e737472756374696f6e73000000f47e110024000000187f1100170000005d02000009000000547269656420746f20736872696e6b20746f2061206c61726765722063617061636974797372632f6c6962616c6c6f632f7261775f7665632e7273436f6e7472616374204761735370656e74436f6e74726163742043757272656e745363686564756c65436f6e7472616374204163636f756e74436f756e7465726761736578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f696e7374616e74696174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f6d696e696d756d5f62616c616e63656578745f64697370617463685f63616c6c6578745f726573746f72655f746f6578745f736372617463685f73697a656578745f736372617463685f726561646578745f736372617463685f77726974656578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6578745f626c6f636b5f6e756d6265724e6f6e2d656d7074792066756e6374696f6e20626f647920657870656374656400a68111000f000000b581110002000000b7811100030000001881110030000000488111005e0000007a00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e322e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2000008082110048000000b1010000230000008082110048000000b201000023000000598211001c0000006898110018000000e50300000d0000001082110049000000870200001d0000000000000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e00000000000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e727310821100490000009d0000003a0000001082110049000000a40000003000000052657475726e207479706573206c656e6774682073686f756c642062652030206f722031178511001e000000358511001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b207165640000fd8411001a000000d88411000a000000e28411001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d000000c784110011000000a78411002000000087841100200000005f841100280000007365676d656e74206f66667365742073686f756c642072657475726e2049333270617373697665206d656d6f7279207365676d656e747320617265206e6f7420737570706f727465647061737369766520656c656d656e74207365676d656e747320617265206e6f7420737570706f72746564746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f72742046756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e2069732043616e2774206465636f6465207761736d20636f64654d6f64756c65206973206e6f742076616c69646d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72796d756c7469706c65207461626c6573206465636c617265647461626c652065786365656473206d6178696d756d2073697a6520616c6c6f776564757365206f6620666c6f6174696e6720706f696e74207479706520696e2066756e6374696f6e20747970657320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e206c6f63616c7320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e20676c6f62616c7320697320666f7262696464656e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c656463616c6c6465706c6f796465706c6f792066756e6374696f6e2069736e2774206578706f72746564756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e7366756e6374696f6e206861732061206e6f6e2d6578697374656e7420747970656578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e617475726563616c6c2066756e6374696f6e2069736e2774206578706f727465646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6500000000000001000000020000000400000008000000100000002000000044656d6f6372616379205075626c696350726f70436f756e7444656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204e65787454616c6c7944656d6f6372616379204c6173745461626c656457617345787465726e616c436f756e63696c20446573697265645365617473436f756e63696c20566f7465436f756e74436f756e63696c204e657874566f746572536574436f756e63696c20566f746572436f756e74436f756e63696c2043616e646964617465436f756e7454696d657374616d7020496e697469616c697a6564000000000000708911000e0000000000000080891100010000000000000000000000888911000100000000000000000000009089110006000000000000003897110000000000000000000000000098891100010000000000000000000000a0891100070000000000000038971100000000000000000000000000a889110001000000000000004e6577417574686f7269746965730000238a110023000000ff891100240000005061757365640000d889110027000000526573756d656400b0891100280000002043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c28417574686f7269747949642c20417574686f72697479576569676874293e4772616e64706146696e616c69747920417574686f7269746965734772616e64706146696e616c6974792043757272656e7453657449644772616e64706146696e616c69747920536574496453657373696f6e4f6666636861696e206572726f723a206665746368696e67206e6574776f726b207374617465206661696c6564214f6666636861696e206572726f723a207369676e696e67206661696c6564214f6666636861696e206572726f723a206465636f64696e6720576f726b6572537461747573206661696c6564214f6666636861696e206572726f723a207375626d697474696e67207472616e73616374696f6e206661696c656421496d4f6e6c696e65205265636569766564486561727462656174734f6666656e636573205265706f72747342794b696e64496e6465780000000000a48b11000700000000000000ac8b1100020000000000000000000000bc8b110002000000000000004f6666656e6365006f8c110004000000738c11000e000000cc8b110055000000218c11004e00000020546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e6420286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e4b696e644f706171756554696d65536c6f7453657373696f6e2053746f72656452616e676553657373696f6e2043757272656e74496e64657853657373696f6e205175657565644368616e67656453657373696f6e2044697361626c656456616c696461746f72730000000000048d11000a00000000000000108d1100010000000000000000000000188d110002000000000000004e657753657373696f6e00009f8d11000c000000288d1100550000007d8d110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e64657800c08d110048000000a10a00000e000000000000002f72757374632f316464313838343839313633366430656235313135376431333732333030373662636632303632372f7372632f6c6962636f72652f736c6963652f6d6f642e72735374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e745374616b696e672043757272656e744572615374616b696e672043757272656e74457261537461727453657373696f6e496e6465785374616b696e672043757272656e74457261506f696e74734561726e65645374616b696e6720466f7263654572615374616b696e6720536c6173685265776172644672616374696f6e5374616b696e6720426f6e646564457261730000000000248f1100100000000000000038971100000000000000000000000000348f11000100000000000000000000003c8f11000f000000000000004c8f1100010000000000000000000000548f1100010000000000000045787472696e736963537563636573737e8f11002500000045787472696e7369634661696c656400718f11000d0000005c8f11001500000020416e2065787472696e736963206661696c65642e44697370617463684572726f7220416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e52657175697265526f6f744f726967696e526571756972655369676e65644f726967696e426c6f636b46756c6c4261645369676e617475726543616e206e6f74206c6f6f6b7570526571756972654e6f4f726967696e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e7369637357656967687453797374656d20416c6c45787472696e736963734c656e53797374656d204e6578745765696768744d756c7469706c69657253797374656d2045787472696e7369634461746153797374656d204576656e74436f756e7474696d737461703054696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d702044696455706461746554726561737572792050726f706f73616c436f756e74547265617375727920417070726f76616c736d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b0000db0000000c00000004000000dc000000746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000d8921100470000001f931100050000009c92110037000000d3921100050000006a921100170000006192110009000000b29411001400000049921100180000006192110009000000b294110014000000189211001d00000035921100130000004892110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f73742029547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e795370656369666963330000000400000004000000d80000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e204275742069742068617320207479706534931100180000004c9311000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e00009493110017000000ab9311001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000cc93110007000000537461636b3a20000000010056941100240000002c94110006000000329411000e000000409411001600000008941100240000002c941100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f73742000008c94110026000000b294110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e67746820324e6f6e20636f6e7374616e74206f70636f646520696e20696e697420657870725d951100070000006f951100220000005d95110007000000649511000b00000045787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c20206973206d757461626c6520646f65736e277420657869737473206f72206e6f742079657420646566696e6564000000a495110010000000b49511000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300d49511000f000000b49511000f0000005461626c6520617420696e6465782000f495110012000000b49511000f00000046756e6374696f6e20617420696e646578200000189611000e000000b49511000f0000005479706520617420696e6465782000008696110010000000b49511000f0000005896110010000000789611000e00000058961100100000006896110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b2065787065637465640000c096110020000000e096110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f7665001897110015000000657863656564656420737461636b206c696d69742000000038971100000000004572726f72000000330000000400000004000000dd0000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e67658897110022000000aa97110015000000bf97110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c730000e09711002d0000000d9811000c0000001998110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20249811003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e67746873689811001800000058080000090000007372632f6c6962636f72652f736c6963652f6d6f642e7273004180b1c6000b08000000000000000000bfbb03046e616d6501b6bb03a305000e6578745f626c616b65325f323536011f6578745f6765745f616c6c6f63617465645f6368696c645f73746f7261676502176578745f636c6561725f6368696c645f73746f7261676503146578745f6765745f73746f726167655f696e746f04166578745f6b696c6c5f6368696c645f73746f7261676505156578745f7365745f6368696c645f73746f7261676506196578745f6765745f616c6c6f63617465645f73746f72616765070f6578745f7365745f73746f72616765080c6578745f74776f785f31323809116578745f636c6561725f73746f726167650a126578745f737232353531395f7665726966790b0e6578745f7072696e745f757466380c0d6578745f7072696e745f6e756d0d166578745f6368696c645f73746f726167655f726f6f740e106578745f636c6561725f7072656669780f166578745f73616e64626f785f6d656d6f72795f6e6577101b6578745f73616e64626f785f6d656d6f72795f74656172646f776e11176578745f73616e64626f785f696e7374616e746961746512126578745f73616e64626f785f696e766f6b65131d6578745f73616e64626f785f696e7374616e63655f74656172646f776e14106578745f73746f726167655f726f6f7415186578745f73746f726167655f6368616e6765735f726f6f7416126578745f656432353531395f76657269667917166578745f73616e64626f785f6d656d6f72795f67657418166578745f73616e64626f785f6d656d6f72795f736574190d6578745f7072696e745f6865781a106578745f69735f76616c696461746f721b156578745f6c6f63616c5f73746f726167655f6765741c216578745f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365741d116578745f6e6574776f726b5f73746174651e106578745f737232353531395f7369676e1f166578745f7375626d69745f7472616e73616374696f6e20156578745f6c6f63616c5f73746f726167655f73657421146578745f656432353531395f67656e657261746522146578745f737232353531395f67656e657261746523236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74240a6578745f6d616c6c6f6325086578745f6672656526176578745f737232353531395f7075626c69635f6b657973270b6578745f74776f785f3634280c5f5f727573745f616c6c6f63290a5f5f72675f616c6c6f632a0e5f5f727573745f6465616c6c6f632b0c5f5f72675f6465616c6c6f632c0e5f5f727573745f7265616c6c6f632d0c5f5f72675f7265616c6c6f632e135f5f727573745f616c6c6f635f7a65726f65642f115f5f72675f616c6c6f635f7a65726f65643009686173685f746573743134616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68636164633139656466653965313035353229636f72653a3a70616e69636b696e673a3a70616e69633a3a68613237623135356231613762656131643325616c6c6f633a3a666d743a3a666f726d61743a3a68373139333337636638383237333534323436636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68613834643033333136663462356666613523636f72653a3a666d743a3a77726974653a3a68373639626232616366663461376638613648616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303032666333346665303731316264303708727573745f6f6f6d382e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6864623133323335353631653632346136393a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68633133653134623932623865333434343a3b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68373137336662316338303332343364353b3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68613062616630316338386562366162373c34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68656632663938626564366266373533643d4e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a68303438303937613766373038326163303e2d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68346637396263373939663330393733323f2f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68383932326134393263623337346536624011727573745f626567696e5f756e77696e6441313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a68303837626662333038396434323234304235636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68313538353734313262386634366265634343636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a68363936303565363538343765653566304436636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a6835353833396665343434333633396662452c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6862663133663132313734343633363530462e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a686237366535353838326633366137346647323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830303136373764333333316431623262484a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686339373033363631643132393261316649323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68303731343665363835653563656332624a3d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a68616234336463613764383766373731634b49636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68373032373631646266343866333635364c34636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a68303764326632623133316361643036374d453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68326433626561393162376638333331354e483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68383634373335313833373766363262364f323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6836323735643962386134343631633938502e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a683163333163613936623063653034653051303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864396534343966646163316334353532522e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6839323166353536393537323230396564538001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68376561353565643561313134353233665427636f72653a3a7374723a3a66726f6d5f757466383a3a68393936353463313839323463653036345530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683566363963313432356330613037353356533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6865393736373038366566313830663239572f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6835376138336636353030656231663365582e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a6835616339306139346131333230656233593a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68306138363933663139633766366666665a3b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68636638393338356535396637623637615b3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68383637616663663734396563326230325c3a636f72653a3a666d743a3a6275696c646572733a3a44656275675374727563743a3a6669656c643a3a68646430303731316136373965613430345d39636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68393065333464346262613566643437365e443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68626634386164393337636464313931615f313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686637313733623038663233376563326360303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686530393630373933333765373636363961303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683931653862363165666339613332346262423c636f72653a3a7374723a3a557466384572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686166363337373838663261376137313063303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833396433666631363039386537383237643e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686464366234323235356566653732333065383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a686365346336373635363834626464353866343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a686463373536653930643966306231373167363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a683533303838393235643430663439313868693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6838653863316664626539333838346163694b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68663530663164396638316533336133346a30636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68323434346236303933336133646533306b7d7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c205230293e3a3a6465636f64653a3a68333464663538646264396436366233626c6b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68323661353531326466306130366630326d543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68376638333330366130393338636466636e2d616c6c6f633a3a7665633a3a5665633c543e3a3a72657461696e3a3a68356638643836666366306661623534356f443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683032363437663936366662386566376170443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683339393163366632303237333937323471443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a686566656166643264633364616137393472463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683162353632313133646564343136383473543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683039636136373637663535386430666574543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683134393565336533346436663466623675543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683136303731343633646432653861656276543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683262653166343131363934633333326577543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683266353961316562306564306263356578543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683266666136396263346264313332613379543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68343634633337336136666331646362347a9f013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383962656633636262333533326338617b543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68353335363332653631633034346136637c543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383862356330343234613539346162647d543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68393130613036323863303037356534637e543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68613962383762393439623233386535347f753c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68316665643862623861336335356666388001543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686337333532366633613336356262663281017f6e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a68333130306265306638643432366337618201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68646332643431646231373737373966618301513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68333930383730653562343365626334618401513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68346235353034353038313230323761658501693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864386638303832353262313639643938860168636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743c413e20666f7220266d757420463e3a3a63616c6c5f6d75743a3a68616338303437376531623137353030658701513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68376163313434383630363561393861358801513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6838646539353166376338633363373834890130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303032396532383461626336653161348a01793c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a68346366353833643730356531323330398b017b3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a68373233336337366666386563623337638c017273726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a68633632613631323832356230656538308d0180013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a68363336343837393532646263326661308e017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a68626433333036616562666336626362358f01463c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68653566313862323833376430363465349001793c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6834396339306230636239366136303838910185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a68383966356130363566393565373865319201743c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a68643530643334363435306561343137639301723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683833306434623064366665663163303194018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a68386234623564326136633936643835629501613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683131363062303861386164636233646296017573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6866633362376362623662393231306232970191013c73726d6c5f636f6e7472616374733a3a54726965496446726f6d506172656e74436f756e7465723c543e2061732073726d6c5f636f6e7472616374733a3a54726965496447656e657261746f723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a747269655f69643a3a686161356339313864623663376232333398013773726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f6e756d6265723a3a68653533383938356333383936373334639901723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68363064383435646236353836623862669a017573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a68383232653933386530363765323330359b01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68373635323739333664343963626361349c017773726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6d75746174653a3a68363839653731333562643437646538339d017773726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6d75746174653a3a68323138376639326134336161343632319e016b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68616238326334383138373537326534309f016c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830386561633136356661396637393538a001713c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864653530373162386130653734333633a101713c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6835653932376533663634393764666562a201303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836633166636332326337613565393130a301723c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865323831616332613336303138303565a401303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6861393633376463316164363838343137a501783c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837313537343363326237386233626138a6017b3c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6832626663373164323632393930636138a7017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6839346337326433373239326630393437a80184013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6838626464373063336465333638653932a901cd0173726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a5f494d504c5f454e434f44455f464f525f4c696e6b6167653a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4c696e6b6167653c4b65793e3e3a3a656e636f64655f746f3a3a6835333330396563306462363039336239aa01cd0173726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a5f494d504c5f454e434f44455f464f525f4c696e6b6167653a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4c696e6b6167653c4b65793e3e3a3a656e636f64655f746f3a3a6865393330353763396263376337323461ab0184013c73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e756d657261746f723c4b2c562c473e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6838643238373730663035386262636565ac016f73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a53746f726167654c696e6b65644d61703a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f6b65793a3a6838383431306663323634343831633764ad0184013c73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e756d657261746f723c4b2c562c473e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6865386566633638356136363861353930ae016f73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a53746f726167654c696e6b65644d61703a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f6b65793a3a6835313634396637613236326262653938af0184013c73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e756d657261746f723c4b2c562c473e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6866396432363165633964396131623766b0016f73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a53746f726167654c696e6b65644d61703a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f6b65793a3a6835356235363734623230613437653865b1017d7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c205230293e3a3a6465636f64653a3a6865373864623462383164613762393330b2013d73726d6c5f6f6666656e6365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6836363030663338636433666133303631b301743c73726d6c5f6f6666656e6365733a3a5f5f476574427974655374727563745265706f72747342794b696e64496e6465783c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831636238373936303566366365663164b4016c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6832333939613538336430656438336234b5014d73726d6c5f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6836623966633736373531646261363534b60181013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6836616130363564356539663732313132b7014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6861613261623366303331336232356636b8013173726d6c5f636f6e7472616374733a3a657865633a3a7472616e736665723a3a6837373362356236396662646161313137b9013973726d6c5f636f6e7472616374733a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6866323337613535386232383836373039ba01593c73726d6c5f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732073726d6c5f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a6831333937356561393739303766376236bb01783c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6836616339326635393738306465653137bc018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a6839626535636564373733626261363035bd0148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6832343561663334383230376130353433be0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6835323765316362333634383130643564bf017f3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6866353465663532326365346138316461c0017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6831313131303862313035626263336366c1014673726d6c5f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6839353866323730643039323832636563c2014273726d6c5f636f6e7472616374733a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6863336336633731646632616562646432c3013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6864633565333763353634646262616336c4013f7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64655f746f3a3a6831613165646131353962323138616264c501c7013c73726d6c5f6f6666656e6365733a3a4d6f64756c653c543e2061732073725f7374616b696e675f7072696d6974697665733a3a6f6666656e63653a3a5265706f72744f6666656e63653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f6f6666656e6365733a3a54726169743e3a3a4964656e74696669636174696f6e5475706c652c4f3e3e3a3a7265706f72745f6f6666656e63653a3a6832383939313265386363346166666539c6014b3c5b543b205f5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6832633136623336633063663237386639c7016f73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6838636333303466313030626264666365c801437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861623165653031323634626232353937c90141616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a6834353339376134376233366633383934ca01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6863623836653530643234616238333461cb01437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6831633062376138643436393335636534cc014073726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a6834313461616236326136396366376638cd0134636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6863616665643431346630633236373166ce013673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6865613866373434663735656363653135cf017e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6866643562376165396361393035363832d00189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a6836373839333262303737623239363337d1015373725f7072696d6974697665733a3a50657262696c6c3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a7b7b636c6f737572657d7d3a3a6838323439353335646130363233616166d2015373725f7072696d6974697665733a3a50657262696c6c3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a7b7b636c6f737572657d7d3a3a6833333938303938366437323438633665d3014b73725f7072696d6974697665733a3a7472616974733a3a4163636f756e744964436f6e76657273696f6e3a3a696e746f5f6163636f756e743a3a6839633438346130663064333336626130d4019a0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f4578706f737572653a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a4578706f737572653c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6837393935333333636162333938616263d501483c73726d6c5f6f6666656e6365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837303239393466376333643337643031d6015c3c73726d6c5f6f6666656e6365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6832386366306335363565653635396665d701703c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6830373463363933373136623438643830d801303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830313735343962623362373765363161d901406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6838353435663263626138613161386365da01416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6839656632383931386338356161373231db01426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6835613762623764323431326363363930dc01416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a6861386530623037316263646566366661dd01416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6837336536323763303639326138663139de01436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a6863633261336536646130336365323230df014e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6c6c6563746976655f496e7374616e6365313a3a6836656163653863306136333236353131e001436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f656c656374696f6e733a3a6832623263323461633638353163356334e1014e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6d656d626572736869705f496e7374616e6365313a3a6863616165316234326264323238666536e201416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6834613630316463343234393033386164e301426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a6863333761653137623166353232663861e401436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e7472616374733a3a6865343131326666386464386131633438e5013e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6861316434653964343230393738353039e601436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696d5f6f6e6c696e653a3a6836356133633932336635663033326535e701426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6f6666656e6365733a3a6862633937306433383331323331343235e8018d016e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f53657373696f6e4b6579733a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a53657373696f6e4b6579733e3a3a6465636f64653a3a6834616339333937656166633633346665e9018a0173726d6c5f636f6c6c6563746976653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a6465636f64653a3a6831333130353934363139353131333335ea018b0173726d6c5f636f6e7472616374733a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e7472616374733a3a5363686564756c653e3a3a6465636f64653a3a6834396636343234393334303165366132eb0182016e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a6832373361383431636330393135346263ec01723c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6830376364313565343730393839633137ed018d0173726d6c5f636f6c6c6563746976653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a656e636f64655f746f3a3a6835626138363964316265616430313464ee018e0173726d6c5f636f6e7472616374733a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e7472616374733a3a5363686564756c653e3a3a656e636f64655f746f3a3a6866346132356361353138616335333261ef01437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6834306664363130326135353165306162f0012b616c6c6f633a3a736c6963653a3a6d657267655f736f72743a3a6833316161333833653836616137363032f10184016e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6836643335653535356638613331303163f201a20173726d6c5f636f6c6c6563746976653a3a5f494d504c5f454e434f44455f464f525f5261774576656e743a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6c6c6563746976653a3a5261774576656e743c486173682c4163636f756e7449642c493e3e3a3a656e636f64655f746f3a3a6834343930633836383033333235343464f301653c6e6f64655f72756e74696d653a3a43616c6c2061732073725f7072696d6974697665733a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6830343764353632386132636561316131f401583c6e6f64655f72756e74696d653a3a43616c6c2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6838336539363263643433313230313431f501583c73726d6c5f626162653a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6830613865393037323432653436316137f601437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862373562336361323964663636363363f7017273726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a6836313935643964653537363138303536f8013573726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a617574686f723a3a6837616231333433646161623761326263f9013973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7265776172645f62795f6964733a3a6834663135326364303734323563613964fa01673c73726d6c5f617574686f726974795f646973636f766572793a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6862373861323639343666653063343330fb013973726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63757272656e745f696e6465783a3a6862643032343430373930666636353431fc016f73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6863323531613265623837643836373037fd013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6865363039313833643065313763373335fe013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6834626439326135376534613539343639ff014a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a683331333837306130366564383137366380025d3c73726d6c5f636f6e7472616374733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a683337653735393432376661653439323181029c0173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6862653536383862356333373963656531820291013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a683935323531313561306238396239363483028a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6835373538346635383335346464633662840295013c73726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6368616e67655f6d656d626572735f736f727465643a3a686361376465303135316236633762653285024a73726d6c5f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733a3a7365745f6d656d626572735f736f727465643a3a683538373630336262373262373332656386025d3c73726d6c5f656c656374696f6e733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a68343237636433356333343061653264318702603c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a68613438353966393862646662343236348802603c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a683732373531613862373434313363383089025d3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a68653734393864343238613132313430328a02a40173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a68323763626335363133383261626464638b026f73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68316232373866353234623633623030388c026f73726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68643338646665333337366133616133618d025b3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a68326662643138643966363865313162638e0281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7472616e736665723a3a68393839356531356133343461393931338f023f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a686338383364396561623864346264333390024373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a686434313335333537336630653135303591025b3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a683836643831653663633431313261616292023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a683235616265373531383235343639656293027f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a683233616438626236666435383861326194023873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a686461366639373031343963386135303795023673726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6b696c6c5f73746173683a3a683130383536663739323263306461306596023773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a686634613737393939303031643038636297027573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6837383737326333616663356337353965980281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a683562396534326566383633636534646199023e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a68626238373339643133333535626236339a023473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a68333638393134633832333539393965379b02483c5b543b205f5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68353835323237626435376637343932309c027573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a68633038636165316435373833636636349d0286013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68643763643637643234383134613861659e02653c73726d6c5f62616c616e6365733a3a54616b65466565733c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a68376236613935643336393266623835389f023773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6830653936393331313632366135383439a0023d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6862323666653064306530393634336432a1023d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a746f74616c5f69737375616e63653a3a6862373662663765313663613336633032a2023f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6835653663653264363439656133316565a3026f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744672656542616c616e63653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861383137633863343936663239343566a4024873726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6834313966353063313539363139383666a5028e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6830386464613432346263363434343536a6023c73726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862663230666535343038633831396532a7023e73726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6861643765666566376438653664313064a8028c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6862363338363539643233333631623664a90289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6836396238393930643162313061313162aa028c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6832313164383839393835333764303834ab02437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830666563303961653439666334326261ac023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6864663432393736333738383031613830ad023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6862353065623633303432396164376434ae024a3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865353039326631653139383330613864af02493c73726d6c5f696d5f6f6e6c696e653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831666134356231303637653363663366b002613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6835313936613536623066393933653735b102723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832366232363063316563313961636339b202437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6833353837313637353866383936316335b3027573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6839613865636263363866646163613530b402303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832336661343463613531383764656463b5024d636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68373032373631646266343866333635362e323334b6024373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837323862643265653064663338323230b7024e73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863643962646630323731313235383765b8029f013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5265706f72744c6174656e637944656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865613333313236376432326439396637b9029c013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a57696e646f7753697a6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865373839396264363034313435393935ba02d5017375627374726174655f636f6e73656e7375735f626162655f7072696d6974697665733a3a6469676573743a3a5f494d504c5f4445434f44455f464f525f526177426162655072654469676573743a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f636f6e73656e7375735f626162655f7072696d6974697665733a3a6469676573743a3a526177426162655072654469676573743e3a3a6465636f64653a3a6831633662323537393730353733386134bb024b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6831626132303333613836643063323539bc02613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6830346361333431346265366331306336bd028c013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6830613231343334363663376138326632be023773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831396564393438326431653338623932bf024073726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6831373937623930333666633766346466c0023873726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a616c6c5f766f746572733a3a6861316534646265623437323035653037c1023a73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a6832306234303633356262643638613261c202960173726d6c5f656c656374696f6e733a3a5f494d504c5f4445434f44455f464f525f566f746572496e666f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f656c656374696f6e733a3a566f746572496e666f3c42616c616e63653e3e3a3a6465636f64653a3a6830316262336439643662306561626533c3024a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6836306436643261353030666463656265c4022d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a6835643130393431636331373563363639c50295013c73726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6368616e67655f6d656d626572735f736f727465643a3a6864653264326333356566393630353236c6023773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835393066393834646333383132663735c7023c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831343362643439666263383664393238c8023e73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6866653130333861666166393439343565c902713c73726d6c5f656c656374696f6e733a3a5f5f4765744279746553747275637443616e646964617465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834643433333035643361333633333334ca02713c73726d6c5f656c656374696f6e733a3a5f5f476574427974655374727563745265676973746572496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837363362656236383261363832343365cb024773726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6862376137636130316332323031333132cc0299013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a564f5445525f5345545f53495a4544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866366135363965663662643639346637cd0295013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e67426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838613264656532666338373233633965ce0297013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e67506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863653338613432616462313537383438cf029e013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a496e6163746976654772616365506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866363330386163656461376137343234d00295013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4361727279436f756e7444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833653330626135303162636236366136d10294013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e6746656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864333434393535393035313936363639d20298013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616e646964616379426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839393639666163356137666662626663d302493c73726d6c5f656c656374696f6e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6838393533343563316230373032343266d4023e73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a6830356233326237643335643433376531d5023a73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a6864343234646366303966313037613632d602497061726974795f7363616c655f636f6465633a3a656e636f64655f617070656e643a3a657874726163745f6c656e6774685f646174613a3a6866643865656134353734643132643761d7023a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830316131646133303365313665336564d8023c73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6864313433326339303364323232303332d902663c73726d6c5f6772616e6470613a3a5f5f4765744279746553747275637453746174653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861633430666337353837316663386439da023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6866613262363366396564623731643938db023a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839336165366236373664623230343535dc023c73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6835383233613635353036306435633137dd024573726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864363061643832333262393932383237de0299013c73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a44454455505f4b45595f50524546495844656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861626566343565663162336261356236df02763c73726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a54776f783634436f6e6361742061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a53746f726167654861736865723e3a3a686173683a3a6830336164393834343263623061383436e002437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6866396638336564633862303663363035e102437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839623462623063373566323965326431e2023b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864623530656536616665326164663166e3023d73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6866303933303965666331326462656261e4024673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6865616232643963386538373037313930e5028e013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4275726e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862376133356263656433663732633433e602870173725f7072696d6974697665733a3a5f494d504c5f454e434f44455f464f525f50657262696c6c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073725f7072696d6974697665733a3a50657262696c6c3e3a3a656e636f64653a3a6830306536383731383739316332643562e70295013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5370656e64506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864653636393366366136366337323939e80296013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f706f73616c426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830656261613063366636366431356332e9023673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6863663030323230323662663936306562ea028a013c73726d6c5f73657373696f6e3a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6835333934366339396564396363636432eb023673726d6c5f626162653a3a4d6f64756c653c543e3a3a646f5f696e697469616c697a653a3a6832613837383633353631643739633635ec023373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a6861393931653433343637656664343439ed0286013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e2061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e456e64696e673c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f73657373696f6e5f656e64696e673a3a6831616537633337663639326237646539ee023b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6863663437383934313665623338366464ef023773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864313234373039313533353736666336f002437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6837383364333039663738623432326336f1024b3c5b543b205f5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6832333063333531613138336135356361f20230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6835363637303838653535663233666638f302633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832303361323762636366356561396333f402683c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a73697a655f68696e743a3a6832346639626639393362356461613335f5023e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6833383534363563373835376562323363f602633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6835333163646162346661313032336566f7023e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6830656136623430363665613539646464f8024273726d6c5f636f6e7472616374733a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6836323964316235366163326233306638f9024a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6833663662373961343438356135623362fa02437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839303831646161613832616561363963fb026a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6833313938663239346337633037623537fc02663c73726d6c5f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732073726d6c5f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6832326566363933396635303938656631fd027d3c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a6832623037396439643933646632663439fe025273725f73616e64626f783a3a696d703a3a456e7669726f6e6d656e74446566696e6974696f6e4275696c6465723c543e3a3a6164645f686f73745f66756e633a3a6837613337346132656234333561666165ff0289013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a6833316361656264633564353264303138800389013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a6831306431663335653165616632636130810382013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a6862623530306664353561356239323037820389013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7374616e74696174653a3a6832616439353630656131333639626339830384013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a6861636564646338343232366335616233840384013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a6834636231663539323330323861356630850385013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a6833613661303262393533303630646139860387013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a6864376232663834643362623864393663870386013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a6861373962343335303839303935373465880385013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a686339306131366437336261366433336589038f013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68336165393265656438623133313066658a0384013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a68643635336131613637663332626464368b0381013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a68616461313738623139303562636263618c038d013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6d696e696d756d5f62616c616e63653a3a68613038303466373261376563343666378d038b013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a68383035303832366164303961386335628e0388013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f726573746f72655f746f3a3a68633132333439626561366435393336308f038a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a683538306530613263333566306331646490038a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f726561643a3a683663373534623336306337633265613991038b013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f77726974653a3a683632343433353932626339633736616592038b013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6838306238323039323537373365616633930390013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a683466323433313333626532356363666194038c013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a6839363463323461623138626436633334950385013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a686637366431396430353439356163373596038a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f626c6f636b5f6e756d6265723a3a686433623536316436376666623763643497033273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a68386536656133346363343135383566389803ad017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a68363636646563623130363065303136389903b0017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a68366638396436616535373364656261659a033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68656566626338616663316366666162389b033d73726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68613865633662663666313730656535339c033f73726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68323836393939663633396233306133669d03703c73726d6c5f617574686f72736869703a3a5f5f47657442797465537472756374446964536574556e636c65733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68356131666536346139393034343766639e038a033c285475706c65456c656d656e74302c205475706c65456c656d656e74312c205475706c65456c656d656e74322c205475706c65456c656d656e74332c205475706c65456c656d656e74342c205475706c65456c656d656e74352c205475706c65456c656d656e74362c205475706c65456c656d656e74372c205475706c65456c656d656e74382c205475706c65456c656d656e74392c205475706c65456c656d656e7431302c205475706c65456c656d656e7431312c205475706c65456c656d656e7431322c205475706c65456c656d656e7431332c205475706c65456c656d656e7431342c205475706c65456c656d656e7431352c205475706c65456c656d656e7431362c205475706c65456c656d656e7431372c205475706c65456c656d656e7431382c205475706c65456c656d656e743139292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68326334616136396565373634306235359f037573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6835326236326535373661623038396433a0033173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a6e6f773a3a6834363532613662336165366264626163a103443c73726d6c5f626162653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835316562616163646438636565393939a2033973726d6c5f626162653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838626464366437316663366336386133a303683c73726d6c5f626162653a3a5f5f4765744279746553747275637452616e646f6d6e6573733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831646266336432303235653433663633a4034273726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6832653030663433376237636334623732a50397013c73726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578706563746564426c6f636b54696d6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834383432303533646236336462623264a60393013c73726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45706f63684475726174696f6e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866373362303132363134623132356364a7033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837346264393230333636623666316562a8033173726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d3a3a6836306461326464656333373364646436a9033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861623464373335663864656363386661aa03930173726d6c5f73797374656d3a3a5f494d504c5f454e434f44455f464f525f4576656e745265636f72643a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f73797374656d3a3a4576656e745265636f72643c452c543e3e3a3a656e636f64655f746f3a3a6831323131373037393638613835333637ab0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6836616262343766373764373233383832ac033973726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839396533616666666131613734653864ad033b73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838613435343333313564303062363733ae03663c73726d6c5f73797374656d3a3a5f5f476574427974655374727563744576656e74733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837643032313739653635613738326563af03693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831343962353364336363646564316439b0036e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838346564373366313834376166366434b1034473726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6834613439316239383530666636343565b2033373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6861336164316265613362353165373663b303920173726d6c5f636f6c6c6563746976653a3a5f494d504c5f4445434f44455f464f525f566f7465733a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6c6c6563746976653a3a566f7465733c4163636f756e7449643e3e3a3a6465636f64653a3a6831666334646262316561653233396639b4034a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6865373436613266666630383837623565b5033f73726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6866373435383836616563616334393835b6034173726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6831336536643135376135613433613432b7034173726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6834353831653732656334363130393330b8034273726d6c5f73797374656d3a3a436865636b5765696768743c543e3a3a636865636b5f626c6f636b5f6c656e6774683a3a6837666561303334346333386136616365b9033c73726d6c5f73797374656d3a3a436865636b5765696768743c543e3a3a636865636b5f7765696768743a3a6834326632643563336464616539323165ba03463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831393764386331333362343930343066bb03473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831303562663766353932313861333062bc03473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831396539646437656462396264616366bd03493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836636635383139356236626464353231be034c3c73726d6c5f6d656d626572736869703a3a43616c6c3c542c493e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837323735633464666230386236643532bf03493c73726d6c5f636f6e7472616374733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862373936623731343832366162363138c003443c73726d6c5f7375646f3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865393938653136373161363737386139c103533c73726d6c5f617574686f726974795f646973636f766572793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837346565386530313939376239383937c203463c73726d6c5f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6833626664323638333734663362376338c3034c3c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837663834326331386439383539653138c4033c73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6837303666626537316539373135376665c5037573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6862383665646132366239376363326534c603d80173725f7072696d6974697665733a3a7472616e73616374696f6e5f76616c69646974793a3a5f494d504c5f454e434f44455f464f525f5472616e73616374696f6e56616c69646974794572726f723a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073725f7072696d6974697665733a3a7472616e73616374696f6e5f76616c69646974793a3a5472616e73616374696f6e56616c69646974794572726f723e3a3a656e636f64655f746f3a3a6831626165383133323764396564653362c7037173726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a6834626664366136356235623930656539c8033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a6862613562643931393264343264353735c9033b73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6864623438343534306330333732386561ca033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6833333765323135653936613163383731cb033873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f746572735f666f723a3a6837306138346438373431306364346230cc033573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6831613037316366663431353331376631cd033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a6832663566356266663563303233643636ce033e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6866666637373262613837616630303565cf03443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6832616531373964653035366164666439d0037973726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6830363363313039363438386337343964d103a5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a6835353432373336616466623430333761d2036e3c73726d6c5f636f6e7472616374733a3a436865636b426c6f636b4761734c696d69743c543e2061732073725f7072696d6974697665733a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a6834613539353938646632343262313836d303363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6832653964376331393038323734626436d4033c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6836356634343632646235343435393338d5033e73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865636431373939313835396165306236d6034773726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864353861656165393464373762386164d70398013c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864623734353962613435343235656461d8033f73726d6c5f6d656d626572736869703a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6861613637353666646431666439393661d9034173726d6c5f6d656d626572736869703a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6838656137343163663931396330333264da0334636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a6861613934663035386431333531633466db032e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a6834333461393733383437303165333236dc033c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a6835653664306564386338306561613034dd03593c73725f7072696d6974697665733a3a416e795369676e61747572652061732073725f7072696d6974697665733a3a7472616974733a3a5665726966793e3a3a7665726966793a3a6865653661376232666164623063306337de033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831313330393632353863393833353939df033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831333135303466353262396465616136e0033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861656430393864653237386637643631e1033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861666432643465663565656365613936e2033773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6838333637626463333564323039376438e303c40173726d6c5f636f6e7472616374733a3a5f494d504c5f454e434f44455f464f525f526177416c697665436f6e7472616374496e666f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e7472616374733a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6837343039376637333530333664356132e4033873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6839643530626664316331393964383432e5037773726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6d75746174653a3a6833393630323862623831616532396435e6033c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865373235383163383635373736343031e7033e73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838353138373039636366353134386634e8036b3c73726d6c5f636f6e7472616374733a3a5f5f4765744279746553747275637447617350726963653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837646161333630313731323962626161e903723c73726d6c5f636f6e7472616374733a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830613432353664383239653035616630ea034773726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6839373030323763326334383864663966eb0398013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b4761734c696d697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835326264363965373737633864653839ec0397013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d617856616c756553697a6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863653266336335666664386535346666ed0393013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178446570746844656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839373239663263633533653864316636ee0396013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616c6c4261736546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830613062653632333537663633303232ef0396013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a436f6e747261637446656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836643062623334363530643336623765f0039d013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5472616e73616374696f6e4279746546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861653066326564313066333062336431f1039a013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53757263686172676552657761726444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835643765346164343430313363316363f2039c013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a52656e744465706f7369744f666673657444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830653366346264376531366535323031f3039c013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53746f7261676553697a654f666673657444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836666162343733336233653630636665f4039e013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5369676e6564436c61696d48616e646963617044656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832363431363262343562363133336365f5033773726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a626172655f63616c6c3a3a6862393261343137333037323335353038f6033773726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6761735f70726963653a3a6861353534306331613131336131343632f7033e73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a63757272656e745f7363686564756c653a3a6835393231353035363931356330383436f8033873726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a726573746f72655f746f3a3a6863613537313665383565633061613434f9034573726d6c5f636f6e7472616374733a3a7761736d3a3a707265706172653a3a436f6e74726163744d6f64756c653a3a6e65773a3a6838326533383933383863653766636635fa03467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6864393864326364313131613035613531fb0348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6865373064323632373339343561313363fc033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6834643832616331306433343833336233fd03537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6861643034326537313830333035313963fe03a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6836643231633062653130613035343964ff0344707761736d5f7574696c733a3a6761733a3a436f756e7465723a3a66696e616c697a655f6d6574657265645f626c6f636b3a3a686362636565306234333463346631643080042d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68656165383561343031313132353734348104507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6865396131343838383163653163323132820430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a686464633764633436363333376535353783043c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a686635333865316430386135653339666384046b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683633316637353930306465663336646285046b3c636f72653a3a697465723a3a61646170746572733a3a526573756c745368756e743c492c453e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a686536383437396137393936386537646686046f3c636f72653a3a697465723a3a61646170746572733a3a526573756c745368756e743c492c453e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a686631323333633761626466646630306287049f013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a686661623762663862623438396439613888043773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683535306364366435376331373164303289043973726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68303362303139613732626139303138328a04613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68383731363333663133333061636665378b04a5017375627374726174655f7072696d6974697665733a3a737232353531393a3a5f494d504c5f454e434f44455f464f525f5075626c69633a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a737232353531393a3a5075626c69633e3a3a656e636f64653a3a68613163366230616563303734343431648c040c436f72655f76657273696f6e8d0412436f72655f657865637574655f626c6f636b8e04693c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a6f7264657265645f747269655f726f6f743a3a68373739373939656532646161363861618f0415436f72655f696e697469616c697a655f626c6f636b9004114d657461646174615f6d657461646174619104483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68666533386331353361356163326164389204683c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68393131356662623533323965303964399304683c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683930613566666362353464373266346694041c426c6f636b4275696c6465725f6170706c795f65787472696e73696395041b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b960420426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637397043873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a686362316436643834626362643035333698041c426c6f636b4275696c6465725f636865636b5f696e686572656e7473990418426c6f636b4275696c6465725f72616e646f6d5f736565649a042b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e9b045673725f7072696d6974697665733a3a7472616e73616374696f6e5f76616c69646974793a3a56616c69645472616e73616374696f6e3a3a636f6d62696e655f776974683a3a68353736346238623566396161613662309c04214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b65729d0480013c73726d6c5f696d5f6f6e6c696e653a3a737232353531393a3a6170705f737232353531393a3a5075626c6963206173207375627374726174655f6170706c69636174696f6e5f63727970746f3a3a7472616974733a3a52756e74696d654170705075626c69633e3a3a616c6c3a3a68613834343166646339353935386136399e041e4772616e6470614170695f6772616e6470615f617574686f7269746965739f0415426162654170695f636f6e66696775726174696f6ea00421417574686f72697479446973636f766572794170695f617574686f726974696573a1041a417574686f72697479446973636f766572794170695f7369676ea2041c417574686f72697479446973636f766572794170695f766572696679a3041d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e6365a40411436f6e7472616374734170695f63616c6ca5042153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b657973a604820173726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654c696e6b65644d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6838663434353163653739313862313333a704820173726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654c696e6b65644d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6861663431626330376265363732653261a8043a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832383266383039373163393635623735a9043c73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6830613933393034626364613731633464aa04743c73726d6c5f7374616b696e673a3a5f5f47657442797465537472756374536c6173685265776172644672616374696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830373539636563383531333663626462ab04773c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637443757272656e74457261506f696e74734561726e65643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863346466393062396266616466383466ac04703c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637443757272656e7445726153746172743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861346332306237316637343535343862ad04683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834653030616266353365363433633733ae046b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839633736316334353032636466336536af04763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861336434623962346538633532666237b0044073726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a736c61736861626c655f62616c616e63655f6f663a3a6861636135383433363936353265613265b1043273726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a626f6e6465643a3a6830636562393635626631386363616232b2044573726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6837306665313036376639643939383935b30498013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426f6e64696e674475726174696f6e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832623535646136383130626464303061b4043773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a6832376631663237613230333735323861b5043973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6832376563613564613530643864656139b6044a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6866633236366266623663653230323433b7043f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a6866346266323835623039613038383533b8043873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6833636363393431363966326232643635b9043c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831646437343931353664623131643533ba043e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838336233383939373363343862666435bb046c3c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374426c61636b6c6973743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838623533343432616361336431616461bc046f3c73726d6c5f64656d6f63726163793a3a5f5f476574427974655374727563744e65787445787465726e616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837643466363231333432643433663038bd046e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833626665323435333261616465653139be04703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835356135336235653738653362353537bf044773726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864666466353637383338323064313530c00497013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4c61756e6368506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865623830643136316665383833373935c104a0013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a456d657267656e6379566f74696e67506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833316232323132653732363163316232c20499013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d4465706f73697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832363265623533316566353366303065c3049a013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a456e6163746d656e74506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838343565333534353965616136613466c4047573726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c2073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6832623431383266303634326531386431c5043573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6834376438626636343531373064396363c604553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832333130333466623262396161316637c704303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830376539663164633463383837333064c804303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833613863363935663762313962666661c904303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862343766326134326533363431363234ca04443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836656663396633373739323336343738cb04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863373733386638313465306262636138cc04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6865336235353835366335366563383866cd04457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6861333366626161653136643036353336ce04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831613930373663633036623361623965cf04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835653364383861646633663531633032d004553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832333362653833316563653732373563d104553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838376433336131303565663737663430d204303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839343630376237663435333334613836d30433636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a6833336430666462656635333766383862d404453c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834643038393932373338626235366665d504303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839626562663532613237376634306665d60440707761736d5f7574696c733a3a737461636b5f6865696768743a3a636f6d707574655f737461636b5f636f73743a3a6832656332613464616131633336616664d704533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6833663135373864636638623165303366d804323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6833333964366132336633616239353839d904593c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6832303531346563626537613764663764da04613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6865646336386533623863393232303938db043f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6835666661376165643139363735653632dc0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6834383364613531306533653334653735dd0441707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6830646665316537373831363437623164de0434636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a6835353237373135663731363338343330df042e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a6833386430383365613239326630376635e0043c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a6833396131373737326563303238336633e104303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830316234393736623730636366393962e2045a3c707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a4672616d6520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837373362393934386530363033303234e30446707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6838653765623332646462333937343230e4044b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6837613665336661633565303837386131e504323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6839353333633564346536303161336562e604323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6838333065633835663931653437646439e7044e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6831316330336538356431303265376435e804683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6833643262383038376431613430623032e9046b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6861376364656439653336396133323630ea047d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6835653237663566326461333132313031eb046f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6833356432333232326631633463663837ec046f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6836666134636162356466656233633936ed046c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6861353061613066336466316663643961ee046f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6838663538373638626466643663363436ef04793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6830326534363637616133663639633832f0046b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6866616531383734653335636562616238f104713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6837353163336164613534326365643464f204783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6866653634336337356161613937393331f3047c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6834643135366137643832646366653437f404743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6862396165303366373735323163303237f504713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6864383435613264366361663338313736f6044b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833303831373966353539376166373962f7044b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6862636562656465393336303030353930f8044b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6864356438333636626133356134666363f904463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6830393432356365343637643235646564fa046f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835373532633363323332363061333635fb04457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6866656161316461386338643835366362fc0486017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6832303434366565303237346466653739fd042d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a6862353339623432353939316562373937fe0434636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a6866623631656536316166636362646537ff042e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a683038653936383835383561383932643480053c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a683631623461353636613537323964363781053b636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a7b7b636c6f737572657d7d3a3a68343831336137356561636161653734378205323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68663961303537303266333235643366618305397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a68386330623261323731393065373038328405347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a683232363566313162343233326265373685054a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a68353864303463346465383638653431658605473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6837353566373166363063653234393764870537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a683462396237323936623436336634353588053b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a68383832353431646433666436326537318905347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a68656337393434626366663764623131668a05347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a68326336353735376131376361383336338b05407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a68383162303837636564666462346434388c05543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68633739643161663136313838663435368d05537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a68366138333538613164613464626566308e05547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a68636564333562656564653636653562628f05557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a68616533303233333361636330633266319005547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a68376534356165623939363562643230379105537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a68313765386433643566626361383862399205547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a68333830663663353461613061383264399305547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6835353663323836383738376336363661940530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830363931663361393762336664333466950530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68613966613837316265643663366635309605303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68393761376132643963636263616632399705453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683630376665306161343865353334636298054c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68653966363833643036366338313166359905066d656d7365749a05066d656d6370799b05076d656d6d6f76659c05066d656d636d709d05095f5f6173686c7469339e05095f5f6c7368727469339f05085f5f6d756c746933a005095f5f75646976746933a105095f5f756d6f64746933a2050c5f5f756469766d6f6474693400550970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d62790105727573746325312e33392e302d6e696768746c79202831646431383834383920323031392d30392d323229", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b6579730cd914acf7b89329ae59e8f7e3b8f1ee7a4f5f68d4749cca82814f2f5b1d6bbb": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", - "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", - "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", - "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b6579737f325c981c2b001f5fe8c51cc7b89e50ebb1f60feb7ab3fa3bc79d6ab71d45cb": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993326e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f91066e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", - "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", - "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", - "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0ff6ffc06ff286230ff6ffc06ff2862300", - "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0x3ae31af9a378162eb2736f26855c9ad8": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797346c8960f8387b17441ee2be48a0896e48d3580e922c6e1cd8f53a621370c1e49": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", - "0x7e6064dc0e78ffebb59b3053826a9467": "0x109c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797301dd273832961ca94116fd224019ea1370c0e3d27bebb1041b35651146d17832": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", - "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0ff6ffc06ff286230ff6ffc06ff2862300", - "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff0f", - "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", - "0x121725e2f949944d00a8c011c0db54ae07b84a6ca772adf3c65417345d91522d": "0x0000c16ff28623000000000000000000", - "0x9c16fd03b96712dc0751bb0d63bc05aa": "0x00e1f505", - "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973d1ae046d940202772415992434f839d8c546542e3055143c430f7eec87f7cb69": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0ff6ffc06ff286230ff6ffc06ff2862300", - "0x886726f904d8372fdabb7707870c2fad": "0x1000299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f43780100000000000000482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a0100000000000000482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e01000000000000006e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f91060100000000000000", - "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff0f", - "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0xdfa1667c116b77971ada377f9bd9c485a0566b8e477ae01969120423f2f124ea": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", - "0xb2029f8665aac509629f2d28cea790a3": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26633919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f437800299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d655633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde787932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d129becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993326e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f91066e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", - "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b657973e54094c2d5af8ae10b91e1288f4f59f2946d7738f2c509b7effd909e5e9ba0ad": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a", - "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", - "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff0f", - "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", - "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b65797394f72a73893fbd00b11fcce65a014cc5b9ff5066ec15aa6be068b4cabfe67fdb": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f437800299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378", - "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", - "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276" - }, - {} - ] - } -} + "name": "Flaming Fir", + "id": "flamingfir5", + "bootNodes": [ + "/ip4/35.246.224.91/tcp/30333/p2p/QmaGKGpdm2iLiVCAnEcwrAhHxrcjMdGao4UubJxq7AF77n", + "/ip4/35.246.224.91/tcp/30334/ws/p2p/QmaGKGpdm2iLiVCAnEcwrAhHxrcjMdGao4UubJxq7AF77n", + "/ip4/35.246.210.11/tcp/30333/p2p/QmbS1xrmWyP5h4xsPwAS7CJEJNStsuAUDUzhggqDJtLpou", + "/ip4/35.246.210.11/tcp/30334/ws/p2p/QmbS1xrmWyP5h4xsPwAS7CJEJNStsuAUDUzhggqDJtLpou", + "/ip4/35.198.110.45/tcp/30333/p2p/QmdSHZLmwEL5Axz5JvWNE2mmxU7qyd7xHBFpyUfktgAdg7", + "/ip4/35.198.110.45/tcp/30334/ws/p2p/QmdSHZLmwEL5Axz5JvWNE2mmxU7qyd7xHBFpyUfktgAdg7", + "/ip4/35.198.114.154/tcp/30333/p2p/Qmeo7it7YGbhGZqkDGpgnR3xMRFSp6AutA9oTDZPQyny8h", + "/ip4/35.198.114.154/tcp/30334/ws/p2p/Qmeo7it7YGbhGZqkDGpgnR3xMRFSp6AutA9oTDZPQyny8h" + ], + "telemetryEndpoints": [ + [ + "wss://telemetry.polkadot.io/submit/", + 0 + ] + ], + "protocolId": "fir5", + "properties": { + "tokenDecimals": 15, + "tokenSymbol": "FIR" + }, + "fork_blocks": null, + "consensusEngine": null, + "genesis": { + "raw": { + "top": { + "0x2371e21684d2fae99bcb4d579242f74a8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x10cafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367e23578cbc267982cfc0bf7be54cd952fa3c07631850880ca88e395e25f4812c7c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479f417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e297e8a1b8e637a062656eff12dc94bbbc3e254d9bb93bd44972f0a96c7fdde5b4de225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41ee225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41ee225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41e2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b227615202d3e9c3bf075b44615f9ac4c28b8627079a219ff66e01655487c3bde52eb8e410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86ce410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86ce410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86cdc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3af6e62e9231c0424c1b747ffb5ccaedcb9fd6fddc2bfcb2db963c02db74c0c84dfe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310afe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310afe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310a", + "0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe7085268962a32b3f1cffce32ce1e5f6d6d3d633f7e21fd4e659402a2c62cab64ca": "0xfe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310a", + "0x3a636f6465": "0x0061736d010000000193033860037f7f7f017f60027f7f017f60027f7f0060017f0060037f7f7f0060057f7f7f7f7f0060047f7f7f7f0060017f017e60037f7e7e0060027e7e0060017e017f60017e017e60017e0060037e7e7f0060047e7e7f7e017e60047e7e7f7e0060057e7e7f7e7e0060037f7e7f017f60047f7e7e7f017f60067f7e7e7f7f7f017f6000017f60027f7e017e60047f7e7e7e017f60027f7e017f6000017e60047f7f7f7f017f60037f7f7e017e60027f7f017e60017f017f60037e7e7f017e60000060037e7f7f017f60067f7f7f7f7f7f017f60057f7f7f7f7f017f60027f7e0060067f7f7f7f7f7f0060047f7f7e7e0060057f7f7e7e7f0060057f7f7f7e7e0060027e7f0060067f7f7e7e7f7f0060067f7f7f7e7e7f0060077f7e7e7e7e7e7e0060087e7e7e7e7e7e7e7e017f60047f7e7e7e0060067f7f7f7f7e7e0060077f7f7e7e7f7f7f0060087f7f7f7f7f7e7e7f0060077f7f7f7e7e7f7f0060047f7f7f7f017e60077f7f7f7e7e7e7f0060057f7e7e7f7f0060037f7e7f0060047f7e7e7f0060057f7e7e7e7e0060067f7e7e7e7e7f0002ad0d2a03656e76196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31000803656e76196578745f73746f726167655f7365745f76657273696f6e5f31000903656e761e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31000a03656e76196578745f73746f726167655f6765745f76657273696f6e5f31000b03656e761d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31000c03656e761b6578745f73746f726167655f636c6561725f76657273696f6e5f31000c03656e76206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31000a03656e76286578745f73746f726167655f6368696c645f73746f726167655f6b696c6c5f76657273696f6e5f31000d03656e761f6578745f73746f726167655f6368696c645f6765745f76657273696f6e5f31000e03656e76216578745f73746f726167655f6368696c645f636c6561725f76657273696f6e5f31000f03656e761f6578745f73746f726167655f6368696c645f7365745f76657273696f6e5f31001003656e76236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f31001103656e76236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f31001103656e76226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31000c03656e761c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f31000c03656e76206578745f73746f726167655f6368696c645f726f6f745f76657273696f6e5f31000b03656e76206578745f73616e64626f785f6d656d6f72795f6e65775f76657273696f6e5f31000103656e76256578745f73616e64626f785f6d656d6f72795f74656172646f776e5f76657273696f6e5f31000303656e76216578745f73616e64626f785f696e7374616e74696174655f76657273696f6e5f31001203656e761c6578745f73616e64626f785f696e766f6b655f76657273696f6e5f31001303656e76276578745f73616e64626f785f696e7374616e63655f74656172646f776e5f76657273696f6e5f31000303656e761c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31000c03656e76236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f31001403656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f31001503656e76346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f31001603656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f31000803656e76256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f31001703656e761a6578745f73746f726167655f726f6f745f76657273696f6e5f31001803656e76226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f31000b03656e761d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31000a03656e76206578745f73616e64626f785f6d656d6f72795f6765745f76657273696f6e5f31001903656e76206578745f73616e64626f785f6d656d6f72795f7365745f76657273696f6e5f31001903656e76256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f31001703656e76296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f31000b03656e76246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f31001803656e76286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f31000703656e76216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f31001a03656e76376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31001b03656e761e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31001c03656e761c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31000303656e761a6578745f73746f726167655f726561645f76657273696f6e5f31001d03656e762a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31000a03bc05ba051c1c030300001c1c1b1e1e1e040204001e060001010201021f030720190200060101011c0101010101010201060304030001010001012100000100010202040201020001010102030303020202021c020201020302020202020204020202020202020322010203020402041c022302020404082404022403081e030402040209080325260202020227060202040224030302020428242624080303020303020202020229081e040203040204022a2b010406050603031e1e02020202020403030304050402010402022a03020302020304050401040201062c040203030203021c02020202020202030202192403030302020202041c0402020202021c1c020202032d0303020409030303020202042a02030303040302040202010103030401030303030303030303030303030303030303032e2f04230330060202030202020202020202040204040602060404040204030302020202030302020904020306020201060202011e06230606060606060606060606060606060606060606060606060631021b1b0203020602031b1b1b021b0204021b04021b1b1b0402021b020201030501001b1b1b1b1b321b1b1b040406020303030202020302040402040402021c040404020404040403030302020302020203060303030303020303030203020204040202020224020202330202031e0302040202020203020205042602020302030302030202020203030302020203020202020202020202022904011c061c020202050302031c0202030203020202030202020219040203000101030302020606060303020102020302020201020106020404030303010104040504340202020402010502020404030303030205020201040206010401020101010101010402020104040302040102010301010401040304041c01010208010105040606040401050504040404060301010101000000003535363636370407017001f001f00105030100120619037f01418080c0000b7f0041e8a1c6000b7f0041e8a1c6000b078f0518066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000a5f5f646174615f656e6403010b5f5f686561705f62617365030209686173685f7465737400320c436f72655f76657273696f6e00af0312436f72655f657865637574655f626c6f636b00b00315436f72655f696e697469616c697a655f626c6f636b00b703114d657461646174615f6d6574616461746100b8031c426c6f636b4275696c6465725f6170706c795f65787472696e73696300b9031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00bb0320426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300bf031c426c6f636b4275696c6465725f636865636b5f696e686572656e747300c20318426c6f636b4275696c6465725f72616e646f6d5f7365656400c3032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00c403214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200c8031e4772616e6470614170695f6772616e6470615f617574686f72697469657300d00315426162654170695f636f6e66696775726174696f6e00d10321417574686f72697479446973636f766572794170695f617574686f72697469657300d2031d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e636500d30311436f6e7472616374734170695f63616c6c00d40318436f6e7472616374734170695f6765745f73746f7261676500d603205472616e73616374696f6e5061796d656e744170695f71756572795f696e666f00d7032153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b65797300d80309c503010041010bef01404f554ac6054b4c5263c5028e01c9027bc40292039403950396039703980399039a039b039c039d039e039f03a003a103a203a303a403a503a603a703a803a903aa03ab03ac03ad03ce03f204a105a30583058f0553ae05cd05a605d805b905bb05b7053c3d3e83046544595a5b5c5d5e5f6a6b716c6d6e6f708803b501b401b601bc01e203bb01c501da04b304c004c8015150890287029d029c029b029a02b702b602b502c104ec01ed01f001ef01eb01f101df03de03ca02ab02fa03b504cb0281038203f603f503f703cc02cd02fe03ce02c401c301cf02c601bb02bc029c049a04d002a304ab0486028502d1028802d804d604d202dc0482048004d302810498029702d4029902c702c602d502e804e904ba01b901d602b302b202d702b402bf02b704b604d802bb04f004ef04d902820581058005da02c701db02bd02ae04ad04dc02b004e102fb01fc01fe01fd01fa01ff01f10484038303c205c505e103e003f803a204a104a0049f049d04a504a404af04b204b104ba04b904b804c504c404c304c204bf04be04bd04bc04db04d904e004df04de04dd04e504e604e704c804eb04ea04aa05a505a905a805a705d605b405b805d505d905d7050a98b646ba0506002000102b0b0600200010260b06002000102d0b0600200010270b0a00200020012002102f0b2801017f0240200210262203450d002003200020022001200120024b1b10db051a200010270b20030b0600200010310b1c01017f0240200010262201450d0020014100200010da051a0b20010bff0202017f037e230041206b220224002001ad42adfed5e4d485fda8d8007e42b9e0007c210302400240024002400240200141084b0d00200141014b0d0120010d02420021040c030b0240200141104b0d00200241106a2000290000200385420042adfed5e4d485fda8d800420010e005200241186a29030020022903107c200120006a41786a2900008521040c040b200120006a41786a2900002105200321040340200029000020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e2003852103200041086a2100200442cf829ebbefefde82147c2104200141786a220141084b0d000b200320058521040c030b0240200141034b0d00200120006a417e6a33000042108620003300008420038521040c030b200120006a417c6a35000042208620003500008420038521040c020b200031000021040b200420038521040b20022004420042adfed5e4d485fda8d800420010e005200241086a290300210420022903002103200241206a2400200420037c42c300850b05001034000b2400410041988cc600ad4280808080f00084419f8cc600ad4280808080a00484100000000b1100418080c0004111419480c0001036000b3a01017f230041206b2203240020034204370310200342013702042003200136021c200320003602182003200341186a360200200320021041000b830301067f230041306b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b024002400240024002400240200141146a2802000d00200621070c010b024020040d0041bc80c000410041001038000b024002402006410f4b0d002003280204450d010b200620066a220720064f0d010b4101210541002107200241086a21060c010b2007417f4c0d01200241086a2106024020070d0041012105410021070c010b2007102a2205450d020b200241003602102002200736020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a29020037030020022001290200370318200241146a41cc80c000200241186a10390d0220002006290200370200200041086a200641086a280200360200200241306a24000f0b103a000b1033000b41e480c0004133200241186a419881c000103b000b6c01017f230041306b2203240020032002360204200320013602002003411c6a41023602002003412c6a41013602002003420237020c200341f083c000360208200341013602242003200341206a360218200320033602282003200341046a360220200341086a20001041000bc40801087f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a36020020034280808080800437030820032000360220410021062003410036021820034100360210200320053602302003200536022802400240024002400240200228020822070d0020022802002108200228020422092004200420094b1b220a450d0141012104200020082802002008280204200128020c1100000d04200841086a210241012106034002402005280200200341086a200541046a280200110100450d00410121040c060b2006200a4f0d02200241046a210020022802002101200541086a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110000450d000c050b0b20022802002108200228020422092002410c6a2802002205200520094b1b220a450d0041012104200020082802002008280204200128020c1100000d03200741106a2105200841086a21024101210603402003200541786a28020036020c2003200541106a2d00003a003820032005417c6a28020036020841002101410021000240024002400240200541086a2802000e0400010203000b2005410c6a2802002104410121000c020b02402005410c6a2802002207200328023422044f0d0041002100200328023020074103746a22072802044102470d0220072802002802002104410121000c020b41e489c000200720041038000b4100210020032802282207200328022c460d002003200741086a3602284100210020072802044102470d0020072802002802002104410121000b2003200436021420032000360210024002400240024002400240024020052802000e0404010006040b20032802282200200328022c470d010c050b200541046a2802002200200328023422044f0d01200328023020004103746a22002802044102470d04200028020028020021040c030b2003200041086a36022820002802044102470d03200028020028020021040c020b41e489c000200020041038000b200541046a28020021040b410121010b2003200436021c2003200136021802400240200541706a2802004101460d0020032802282204200328022c460d042003200441086a3602280c010b200541746a2802002204200328023422004f0d04200328023020044103746a21040b02402004280200200341086a200441046a280200110100450d00410121040c050b2006200a4f0d01200241046a210020022802002101200541246a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110000450d000c040b0b0240200920064d0d00410121042003280220200820064103746a22052802002005280204200328022428020c1100000d030b410021040c020b419088c000412b41bc88c0001036000b41f489c000200420001038000b200341c0006a240020040b05001035000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004412c6a41023602002004413c6a41033602002004420237021c2004419cafc000360218200441043602342004200441306a3602282004200441106a3602382004200441086a360230200441186a41acafc0001041000bad0101037f0240024002400240200028020022002802042203200028020822046b2002490d00200028020021030c010b200420026a22052004490d02200341017422042005200420054b1b22044100480d020240024020030d002004102a21030c010b200028020020032004102e21030b2003450d012000200436020420002003360200200028020821040b2000200420026a360208200320046a2001200210db051a41000f0b1033000b1035000b970401047f230041106b22022400200028020021000240024002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b0240200028020822032000280204470d00200341016a22042003490d05200341017422052004200520044b1b22044100480d050240024020030d002004102a21030c010b200028020020032004102e21030b2003450d042000200436020420002003360200200028020821030b200028020020036a20013a00002000200028020841016a3602080c020b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b0240024020002802042204200028020822036b2001490d00200028020021040c010b200320016a22052003490d03200441017422032005200320054b1b22034100480d030240024020040d002003102a21040c010b200028020020042003102e21040b2004450d022000200336020420002004360200200028020821030b2000200320016a360208200420036a2002410c6a200110db051a0b200241106a240041000f0b1033000b1035000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41cc80c000200241086a10392101200241206a240020010b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c2002418c86c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a419c86c0001041000b0d0020003502004101200110420b3101017f230041106b220224002002200136020c200220003602082002418084c0003602042002410136020020021043000bd40203027f017e037f230041306b22032400412721040240024020004290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a200020004290ce0080220542f0b17f7e7ca7220741ffff037141e4006e220841017441c284c0006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441c284c0006a2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b02402005a7220641e3004c0d00200341096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441c284c0006a2f00003b00000b024002402006410a480d00200341096a2004417e6a22046a200641017441c284c0006a2f00003b00000c010b200341096a2004417f6a22046a200641306a3a00000b2002200141dc9ec6004100200341096a20046a412720046b10452104200341306a240020040b6f01017f230041c0006b220124002001200036020c200141346a410136020020014201370224200141d49ec6003602202001410536023c2001200141386a36023020012001410c6a360238200141106a200141206a1037410141988cc60041072001280210200128021810c70500000b0c004283e1a2baf1cbc4f0370be40501057f024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21080c010b200541016a210820002802002106412d21070b0240024020064104710d00410021020c010b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21080b410121010240024020002802084101460d00200020072002200310460d012000280218200420052000411c6a28020028020c1100000f0b02402000410c6a280200220920084b0d00200020072002200310460d012000280218200420052000411c6a28020028020c1100000f0b0240024020064108710d0041002101200920086b22092108024002400240410120002d0030220a200a4103461b0e0402010001020b20094101762101200941016a41017621080c010b41002108200921010b200141016a210103402001417f6a2201450d0220002802182000280204200028021c280210110100450d000b41010f0b41012101200041013a003020004130360204200020072002200310460d0141002101200920086b220a2103024002400240410120002d0030220920094103461b0e0402010001020b200a4101762101200a41016a41017621030c010b41002103200a21010b200141016a2101024003402001417f6a2201450d0120002802182000280204200028021c280210110100450d000b41010f0b2000280204210a41012101200028021820042005200028021c28020c1100000d01200341016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110100450d000c020b0b2000280204210a41012101200020072002200310460d00200028021820042005200028021c28020c1100000d00200841016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110100450d000b0b20010b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101101000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11000021040b20040b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c200241ec86c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41fc86c0001041000b8507010c7f200028021021030240024002400240200028020822044101460d0020030d012000280218200120022000411c6a28020028020c11000021030c030b2003450d010b0240024020020d00410021020c010b200120026a2105200041146a28020041016a21064100210720012103200121080340200341016a210902400240024020032c0000220a417f4a0d000240024020092005470d004100210b200521030c010b20032d0001413f71210b200341026a220921030b200a411f71210c0240200a41ff0171220a41df014b0d00200b200c41067472210a0c020b0240024020032005470d004100210d2005210e0c010b20032d0000413f71210d200341016a2209210e0b200d200b41067472210b0240200a41f0014f0d00200b200c410c7472210a0c020b02400240200e2005470d004100210a200921030c010b200e41016a2103200e2d0000413f71210a0b200b410674200c411274418080f0007172200a72220a418080c400470d020c040b200a41ff0171210a0b200921030b02402006417f6a2206450d00200720086b20036a21072003210820052003470d010c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20040d002000280218200120022000411c6a28020028020c1100000f0b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b0240200220096b200028020c2206490d002000280218200120022000411c6a28020028020c1100000f0b410021074100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2209210a024002400240410020002d0030220320034103461b0e0402010001020b20094101762107200941016a410176210a0c010b4100210a200921070b200741016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110100450d000b41010f0b2000280204210941012103200028021820012002200028021c28020c1100000d00200a41016a2103200028021c210a20002802182100034002402003417f6a22030d0041000f0b20002009200a280210110100450d000b41010f0b20030bd40801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b2107418002210803400240200820014f0d00200020086a2c000041bf7f4c0d0041002105200821060c020b2008417f6a21064100210520084101460d01200720086a21092006210820094101470d000b0b200420063602142004200036021020044100410520051b36021c200441dc9ec60041b287c00020051b3602180240024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b200420023602202002450d0220022001460d02200141016a210903400240200220014f0d00200020026a2c000041404e0d040b2002417f6a210820024101460d0420092002462106200821022006450d000c040b0b20042002200320081b360228200441306a41146a4103360200200441c8006a41146a4104360200200441d4006a410436020020044203370234200441b887c0003602302004410136024c2004200441c8006a3602402004200441186a3602582004200441106a3602502004200441286a360248200441306a41d087c0001041000b200441e4006a4104360200200441c8006a41146a4104360200200441d4006a4101360200200441306a41146a410436020020044204370234200441e087c0003602302004410136024c2004200441c8006a3602402004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a360248200441306a418088c0001041000b200221080b024020082001460d00410121060240024002400240200020086a22092c00002202417f4a0d0041002105200020016a220621010240200941016a2006460d00200941026a210120092d0001413f7121050b2002411f712109200241ff017141df014b0d01200520094106747221010c020b2004200241ff0171360224200441286a21020c020b4100210020062107024020012006460d00200141016a210720012d0000413f7121000b200020054106747221010240200241ff017141f0014f0d0020012009410c747221010c010b41002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d020b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441306a41146a4105360200200441ec006a4104360200200441e4006a4104360200200441c8006a41146a4106360200200441d4006a410736020020044205370234200441cc88c000360230200420023602582004410136024c2004200441c8006a3602402004200441186a3602682004200441106a3602602004200441246a3602502004200441206a360248200441306a41f488c0001041000b419088c000412b41bc88c0001036000b100020012000280200200028020410480b6f01037f230041206b22022400024020002802002001104e0d002001411c6a280200210320012802182104200242043703182002420137020c200241dc89c00036020820042003200241086a10390d0020002802042001104e2101200241206a240020010f0b200241206a240041010be70a02077f017e410121020240200128021841272001411c6a2802002802101101000d0041022103024002400240024002402000280200220241776a2200411e4d0d00200241dc00470d010c020b41f40021040240024020000e1f05010202000202020202020202020202020202020202020202030202020203050b41f20021040c040b41ee0021040c030b02400240024002400240024002402002104d0d00024002400240024002400240200241808004490d00200241808008490d0120024190fc476a4190fc0b490d0a200241e28b746a41e28d2c490d0a2002419fa8746a419f18490d0a200241dee2746a410e490d0a200241feffff0071419ef00a460d0a200241a9b2756a4129490d0a200241cb91756a410a4d0d0a410121030c0e0b20024180fe03714108762105419896c000210041002106200241ff017121040340200041026a2107200620002d000122036a2108024020002d000022002005460d00200020054b0d092008210620072100200741ea96c000470d010c090b20082006490d02200841a5024b0d03200641ea96c0006a2100024003402003450d012003417f6a210320002d00002106200041016a210020062004470d000c0c0b0b2008210620072100200741ea96c000470d000c080b0b20024180fe0371410876210541c99bc000210041002106200241ff017121040340200041026a2107200620002d000122036a2108024020002d000022002005460d00200020054b0d0720082106200721002007418f9cc000470d010c070b20082006490d03200841a6014b0d042006418f9cc0006a2100024003402003450d012003417f6a210320002d00002106200041016a210020062004470d000c0b0b0b20082106200721002007418f9cc000470d000c060b0b200620081047000b200841a502103f000b200620081047000b200841a601103f000b200241017267410276410773ad4280808080d0008421090c040b200241ffff0371210441b59dc00021034101210002400340200341016a21080240024020032d0000220641187441187522074100480d00200821030c010b200841cda0c000460d02200741ff007141087420032d0001722106200341026a21030b200420066b22044100480d0320004101732100200341cda0c000470d000c030b0b419088c000412b41bc88c0001036000b200241ffff03712104418f99c0002103410121000340200341016a21080240024020032d0000220641187441187522074100480d00200821030c010b200841c99bc000460d05200741ff007141087420032d0001722106200341026a21030b200420066b22044100480d0120004101732100200341c99bc000470d000b0b4101210320004101710d030b200241017267410276410773ad4280808080d0008421090b410321030c020b419088c000412b41bc88c0001036000b0b200221040b03402003210641dc0021004101210241012103024002400240024020060e0401020300010b024002400240024002402009422088a741ff01710e06050403020100050b200942ffffffff8f60834280808080c000842109410321030c060b200942ffffffff8f608342808080803084210941f5002100410321030c050b200942ffffffff8f608342808080802084210941fb002100410321030c040b20042009a72206410274411c7176410f712203413072200341d7006a2003410a491b210002402006450d002009427f7c42ffffffff0f83200942808080807083842109410321030c040b200942ffffffff8f6083428080808010842109410321030c030b200942ffffffff8f6083210941fd002100410321030c020b20012802184127200128021c2802101101000f0b41002103200421000b20012802182000200128021c280210110100450d000b0b20020b950201017f024002402000418010490d00024002400240024002400240200041808004490d002000410c7641706a2201418002490d0141f0a0c00020014180021038000b200041067641606a220141df074b0d01200141b88cc0006a2d0000220141c9004b0d02200141037441c0a1c0006a21010c060b2001419894c0006a2d00004106742000410676413f7172220141ff034b0d0220014190a6c0006a2d0000220141394b0d0320014103744190aac0006a21010c050b41d0a0c000200141e0071038000b41e0a0c000200141ca001038000b4180a1c00020014180041038000b4190a1c0002001413a1038000b200041037641f8ffffff017141a08ac0006a21010b200129030042012000413f71ad86834200520ba10201037f23004180016b2202240002400240024002400240200128020022034110710d0020034120710d012000ad41012001104221000c020b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141b087c0004102200220036a4180016a410020036b104521000c010b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141b087c0004102200220036a4180016a410020036b104521000b20024180016a240020000f0b20004180011047000b20004180011047000b0d0020003502004101200110420b1c00200128021841b6aec000410b2001411c6a28020028020c1100000b1c00200128021841c1aec000410e2001411c6a28020028020c1100000b6901037f230041206b220224002001411c6a280200210320012802182104200241086a41106a2000280200220141106a290200370300200241086a41086a200141086a2902003703002002200129020037030820042003200241086a10392101200241206a240020010b1500200120002802002200280200200028020410480b5e01017f230041306b220224002002200136020c20022000360208200241246a410136020020024201370214200241d49ec6003602102002410436022c2002200241286a3602202002200241086a360228200241106a418cafc0001041000b140020002802002001200028020428020c1101000bf30201067f410021040240024020024103712205450d00410420056b2205450d0020032005200520034b1b210441002105200141ff01712106034020042005460d01200220056a2107200541016a210520072d000022072006470d000b410121032007200141ff01714641016a41017120056a417f6a21050c010b200141ff017121060240024020034108490d002004200341786a22084b0d00200641818284086c210502400340200220046a220741046a2802002005732209417f73200941fffdfb776a7120072802002005732207417f73200741fffdfb776a7172418081828478710d01200441086a220420084d0d000b0b200420034b0d010b200220046a2109200320046b210241002103410021050240034020022005460d01200920056a2107200541016a210520072d000022072006470d000b410121032007200141ff01714641016a41017120056a417f6a21050b200520046a21050c010b200420031047000b20002005360204200020033602000b2601017f200028020022012802002001280204200028020428020020002802082802001049000b850804057f017e017f017e02400240024002402002450d00410020016b410020014103711b2103200241796a4100200241074b1b210441002105034002400240200120056a2d000022064118744118752207417f4a0d0042808080801021080240200641ee81c0006a2d0000417e6a220941024d0d0042808080808020210a0c070b0240024002400240024020090e03000102000b200541016a22062002490d024200210a0c090b4200210a200541016a220920024f0d08200120096a2d0000210902400240200641a07e6a2206410d4b0d000240024020060e0e0002020202020202020202020201000b200941e0017141a001460d0242808080808020210a0c0c0b02402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141a001490d0142808080808020210a0c0b0b02402007411f6a41ff0171410b4b0d0002402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141c001490d0142808080808020210a0c0b0b0240200941ff017141bf014d0d0042808080808020210a0c0b0b0240200741fe017141ee01460d0042808080808020210a0c0b0b2009411874411875417f4c0d0042808080808020210a0c0a0b42002108200541026a220620024f0d09200120066a2d000041c00171418001460d020c070b4200210a200541016a220920024f0d07200120096a2d0000210902400240200641907e6a220641044b0d000240024020060e050002020201000b200941f0006a41ff01714130490d0242808080808020210a0c0b0b02402009411874411875417f4c0d0042808080808020210a0c0b0b200941ff0171419001490d0142808080808020210a0c0a0b0240200941ff017141bf014d0d0042808080808020210a0c0a0b02402007410f6a41ff017141024d0d0042808080808020210a0c0a0b2009411874411875417f4c0d0042808080808020210a0c090b200541026a220620024f0d07200120066a2d000041c00171418001470d0642002108200541036a220620024f0d08200120066a2d000041c00171418001460d01428080808080e000210a42808080801021080c080b42808080808020210a4280808080102108200120066a2d000041c00171418001470d070b200641016a21050c010b0240200320056b4103710d000240200520044f0d000340200120056a220641046a280200200628020072418081828478710d01200541086a22052004490d000b0b200520024f0d010340200120056a2c00004100480d022002200541016a2205470d000c040b0b200541016a21050b20052002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210a42808080801021080c010b420021080b2000200a2008842005ad84370204200041013602000b02000ba20401077f230041306b220324000240024020020d00410021040c010b200341286a210502400240024002400340024020002802082d0000450d0020002802004188b0c0004104200028020428020c1100000d050b2003410a3602282003428a808080103703202003200236021c200341003602182003200236021420032001360210200341086a410a200120021056024002400240024020032802084101470d00200328020c210403402003200420032802186a41016a2204360218024002402004200328022422064f0d00200328021421070c010b200328021422072004490d00200641054f0d072003280210200420066b22086a22092005460d0420092005200610dd05450d040b200328021c22092004490d0220072009490d0220032006200341106a6a41176a2d0000200328021020046a200920046b10562003280204210420032802004101460d000b0b2003200328021c3602180b200028020841003a0000200221040c010b200028020841013a0000200841016a21040b2000280204210920002802002106024020044520022004467222070d00200220044d0d03200120046a2c000041bf7f4c0d030b200620012004200928020c1100000d04024020070d00200220044d0d04200120046a2c000041bf7f4c0d040b200120046a2101200220046b22020d000b410021040c040b20064104103f000b20012002410020041049000b20012002200420021049000b410121040b200341306a240020040bf90101017f230041106b220224002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a2001105a2101200241106a240020010b6001017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41f0afc000200241086a10392101200241206a240020010b0d00200028020020012002105a0b800201017f230041106b22022400200028020021002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a2001105a2101200241106a240020010b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41f0afc000200241086a10392101200241206a240020010bdb0302047f057e230041d0006b2205240041012106024020002d00040d0020002d000521070240200028020022082d00004104710d0041012106200828021841eeafc000418cb0c000200741ff017122071b4102410320071b2008411c6a28020028020c1100000d014101210620002802002208280218200120022008411c6a28020028020c1100000d01410121062000280200220828021841f5adc20041022008411c6a28020028020c1100000d0120032000280200200428020c11010021060c010b0240200741ff01710d00410121062008280218418fb0c00041032008411c6a28020028020c1100000d01200028020021080b41012106200541013a00172005200541176a360210200829020821092008290210210a200541346a41d4afc000360200200520082902183703082008290220210b2008290228210c200520082d00303a00482008290200210d2005200c3703402005200b3703382005200a370328200520093703202005200d3703182005200541086a360230200541086a20012002105a0d00200541086a41f5adc2004102105a0d002003200541186a200428020c1101000d00200528023041ecafc0004102200528023428020c11000021060b200041013a0005200020063a0004200541d0006a240020000bf30202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d0041012104200628021841eeafc0004195b0c00020051b4102410120051b2006411c6a28020028020c1100000d0120012000280200200228020c11010021040c010b024020050d004101210420062802184196b0c00041022006411c6a28020028020c1100000d01200028020021060b41012104200341013a00172003200341176a3602102006290208210720062902102108200341346a41d4afc00036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b2003200a3703402003200937033820032008370328200320073703202003200b3703182003200341086a3602302001200341186a200228020c1101000d00200328023041ecafc0004102200328023428020c11000021040b200020043a00082000200028020441016a360204200341d0006a240020000bf40202037f057e230041d0006b2203240041012104024020002d00040d0020002d000521040240200028020022052d00004104710d000240200441ff0171450d0041012104200528021841eeafc00041022005411c6a28020028020c1100000d02200028020021050b20012005200228020c11010021040c010b0240200441ff01710d0041012104200528021841d3afc00041012005411c6a28020028020c1100000d01200028020021050b41012104200341013a00172003200341176a3602102005290208210620052902102107200341346a41d4afc000360200200320052902183703082005290220210820052902282109200320052d00303a00482005290200210a200320093703402003200837033820032007370328200320063703202003200a3703182003200341086a3602302001200341186a200228020c1101000d00200328023041ecafc0004102200328023428020c11000021040b200041013a0005200020043a0004200341d0006a240020000b6401027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10392100200241206a240020000bc30f020d7f017e230041206b220324004101210402400240200228021841222002411c6a2802002802101101000d000240024020010d00410021050c010b200020016a21062000210741002105410021080240034020072109200741016a210a02400240024020072c0000220b417f4a0d0002400240200a2006470d004100210c200621070c010b20072d0001413f71210c200741026a220a21070b200b411f7121040240200b41ff0171220b41df014b0d00200c200441067472210b0c020b0240024020072006470d004100210d2006210e0c010b20072d0000413f71210d200741016a220a210e0b200d200c41067472210c0240200b41f0014f0d00200c2004410c7472210b0c020b02400240200e2006470d004100210b200a21070c010b200e41016a2107200e2d0000413f71210b0b200c4106742004411274418080f0007172200b72220b418080c400470d020c040b200b41ff0171210b0b200a21070b4102210a024002400240024002400240200b41776a220c411e4d0d00200b41dc00470d010c020b41f400210e02400240200c0e1f05010202000202020202020202020202020202020202020202030202020203050b41f200210e0c040b41ee00210e0c030b02400240200b104d0d00024002400240024002400240024002400240200b41808004490d00200b41808008490d01200b4190fc476a4190fc0b490d09200b41e28b746a41e28d2c490d09200b419fa8746a419f18490d09200b41dee2746a410e490d09200b41feffff0071419ef00a460d09200b41a9b2756a4129490d09200b41cb91756a410a4d0d090c0e0b200b4180fe0371410876210f419896c000210c410021040340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d08200e2104200d210c200d41ea96c000470d010c080b200e2004490d02200e41a5024b0d03200441ea96c0006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c0b0b0b200e2104200d210c200d41ea96c000470d000c070b0b200b4180fe0371410876210f41c99bc000210c410021040340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d06200e2104200d210c200d418f9cc000470d010c060b200e2004490d03200e41a6014b0d042004418f9cc0006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c0a0b0b200e2104200d210c200d418f9cc000470d000c050b0b2004200e1047000b200e41a502103f000b2004200e1047000b200e41a601103f000b200b41ffff0371210e41b59dc000210a4101210c02400340200a41016a210d02400240200a2d00002204411874411875220f4100480d00200d210a0c010b200d41cda0c000460d02200f41ff0071410874200a2d0001722104200a41026a210a0b200e20046b220e4100480d03200c410173210c200a41cda0c000470d000c030b0b419088c000412b41bc88c0001036000b200b41ffff0371210e418f99c000210a4101210c0340200a41016a210d02400240200a2d00002204411874411875220f4100480d00200d210a0c010b200d41c99bc000460d04200f41ff0071410874200a2d0001722104200a41026a210a0b200e20046b220e4100480d01200c410173210c200a41c99bc000470d000b0b200c4101710d050b200b41017267410276410773ad4280808080d0008421104103210a0c020b419088c000412b41bc88c0001036000b0b200b210e0b2003200136020420032000360200200320053602082003200836020c0240024020082005490d0002402005450d0020052001460d00200520014f0d01200020056a2c000041bf7f4c0d010b02402008450d0020082001460d00200820014f0d01200020086a2c000041bf7f4c0d010b2002280218200020056a200820056b200228021c28020c110000450d01410121040c060b20032003410c6a3602182003200341086a36021420032003360210200341106a1057000b0340200a210c4101210441dc0021054101210a024002400240024002400240200c0e0402010500020b02400240024002402010422088a741ff01710e06050302010006050b201042ffffffff8f60834280808080308421104103210a41f50021050c070b201042ffffffff8f60834280808080208421104103210a41fb0021050c060b200e2010a7220c410274411c7176410f71220a413072200a41d7006a200a410a491b21050240200c450d002010427f7c42ffffffff0f832010428080808070838421100c050b201042ffffffff8f60834280808080108421100c040b201042ffffffff8f608321104103210a41fd0021050c040b4100210a200e21050c030b4101210a0240200b418001490d004102210a200b418010490d0041034104200b41808004491b210a0b200a20086a21050c040b201042ffffffff8f60834280808080c0008421100b4103210a0b20022802182005200228021c2802101101000d050c000b0b200820096b20076a210820062007470d000b0b2005450d0020052001460d00200520014f0d02200020056a2c000041bf7f4c0d020b410121042002280218200020056a200120056b200228021c28020c1100000d0020022802184122200228021c28021011010021040b200341206a240020040f0b20002001200520011049000b1c00200128021841dc9ec60041052001411c6a28020028020c1100000bf20301087f20002802042102024002400240024020002802004101460d00200041086a28020022002001106720004103742200450d01200220006a2103200141086a2104034020022802002105200241046a28020022002001106702400240200141046a22062802002207200428020022086b2000490d00200128020021070c010b200820006a22092008490d05200741017422082009200820094b1b22084100480d050240024020070d002008102a21070c010b200128020020072008102e21070b2007450d042001200736020020062008360200200428020021080b2004200820006a360200200720086a2005200010db051a200241086a22022003470d000c020b0b2000410c6a28020022002001106720004103742200450d00200220006a2103200141086a2104034020022802002105200241046a28020022002001106702400240200141046a22062802002207200428020022086b2000490d00200128020021070c010b200820006a22092008490d04200741017422082009200820094b1b22084100480d040240024020070d002008102a21070c010b200128020020072008102e21070b2007450d032001200736020020062008360200200428020021080b2004200820006a360200200720086a2005200010db051a200241086a22022003470d000b0b0f0b1033000b1035000be10601037f0240024002402000413f4b0d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d03200241017422042003200420034b1b22044100480d030240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000f0b0240200041808001490d0002402000418080808004490d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d04200241017422042003200420034b1b22044100480d040240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0320012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a000002400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d04200341017422022004200220044b1b22024100480d040240024020030d002002102a21030c010b200128020020032002102e21030b2003450d0320012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b02400240200141046a2802002203200141086a28020022026b4104490d00200128020021030c010b200241046a22042002490d03200341017422022004200220044b1b22024100480d030240024020030d002002102a21030c010b200128020020032002102e21030b2003450d0220012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b02400240200141046a2802002203200141086a28020022026b4102490d00200128020021030c010b200241026a22042002490d02200341017422022004200220044b1b22024100480d020240024020030d002002102a21030c010b200128020020032002102e21030b2003450d0120012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b1033000b1035000bc91b010a7f230041106b220324002001200210670240024002402001450d00200141d8006c2104410021050340200020056a220641046a2802002107200641086a28020022082002106702400240200241046a2209280200220a200241086a2201280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d04200a410174220b200c200b200c4b1b220b4100480d0402400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d032002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a200641d4006a2d0000210a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d0420084101742207200b2007200b4b1b22074100480d040240024020080d002007102a210b0c010b200228020020082007102e210b0b200b450d032002200b36020020092007360200200128020021080b2001200841016a360200200b20086a200a3a000002402006410c6a2d0000220841024b0d0002400240024020080e03000102000b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d072008410174220a200b200a200b4b1b220a4100480d070240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d062002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41003a0000200641146a2802002107200641186a280200220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d07200a410174220b200c200b200c4b1b220b4100480d0702400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d062002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a0c020b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d062008410174220a200b200a200b4b1b220a4100480d060240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d052002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41013a00002006410d6a2d0000210a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d0620084101742207200b2007200b4b1b22074100480d060240024020080d002007102a210b0c010b200228020020082007102e210b0b200b450d052002200b36020020092007360200200128020021080b2001200841016a360200200b20086a200a3a0000200641146a2802002107200641186a280200220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d06200a410174220b200c200b200c4b1b220b4100480d0602400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d052002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a200641206a2802002107200641246a280200220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d06200a410174220b200c200b200c4b1b220b4100480d0602400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d052002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a2006410e6a2d0000210a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d0620084101742207200b2007200b4b1b22074100480d060240024020080d002007102a210b0c010b200228020020082007102e210b0b200b450d052002200b36020020092007360200200128020021080b2001200841016a360200200b20086a200a3a00000c010b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d052008410174220a200b200a200b4b1b220a4100480d050240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d042002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41023a00002006410d6a2d0000210a02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d0520084101742207200b2007200b4b1b22074100480d050240024020080d002007102a210b0c010b200228020020082007102e210b0b200b450d042002200b36020020092007360200200128020021080b2001200841016a360200200b20086a200a3a0000200641146a2802002107200641186a280200220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d05200a410174220b200c200b200c4b1b220b4100480d0502400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d042002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a200641206a2802002107200641246a280200220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d05200a410174220b200c200b200c4b1b220b4100480d0502400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d042002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a2006412c6a2802002107200641306a280200220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d05200a410174220b200c200b200c4b1b220b4100480d0502400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d042002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a2006410e6a2d0000220841044b0d000240024002400240024020080e050001020304000b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d092008410174220a200b200a200b4b1b220a4100480d090240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d082002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41003a00000c040b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d082008410174220a200b200a200b4b1b220a4100480d080240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d072002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41013a00000c030b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d072008410174220a200b200a200b4b1b220a4100480d070240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d062002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41023a00000c020b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d062008410174220a200b200a200b4b1b220a4100480d060240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d052002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41033a00000c010b02400240200928020020012802002208460d002002280200210b0c010b200841016a220b2008490d052008410174220a200b200a200b4b1b220a4100480d050240024020080d00200a102a210b0c010b20022802002008200a102e210b0b200b450d042002200b3602002009200a360200200128020021080b2001200841016a360200200b20086a41043a00000b02400240200641346a2802004101460d002003200641386a2802002006413c6a28020028020c110200200328020021072003280208220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d06200a410174220b200c200b200c4b1b220b4100480d0602400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d052002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a2003280204450d012007102c0c010b200641386a2802002107200641c0006a280200220820021067024002402009280200220a2001280200220b6b2008490d002002280200210a0c010b200b20086a220c200b490d05200a410174220b200c200b200c4b1b220b4100480d0502400240200a0d00200b102a210a0c010b2002280200200a200b102e210a0b200a450d042002200a3602002009200b3602002001280200210b0b2001200b20086a360200200a200b6a2007200810db051a0b200641c4006a200210662004200541d8006a2205470d000b0b200341106a24000f0b1033000b1035000bdc0601087f20002802042102024002400240024020002802004101460d00200041086a2802002200200110672000450d01200041186c2103200241146a2100200141086a2102200141046a21040340200041706a2802002105200041746a2802002206200110670240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d05200741017422082009200820094b1b22084100480d050240024020070d002008102a21070c010b200128020020072008102e21070b2007450d042001200736020020042008360200200228020021080b2002200820066a360200200720086a2005200610db051a2000417c6a280200210520002802002206200110670240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d05200741017422082009200820094b1b22084100480d050240024020070d002008102a21070c010b200128020020072008102e21070b2007450d042001200736020020042008360200200228020021080b2002200820066a360200200720086a2005200610db051a200041186a2100200341686a22030d000c020b0b2000410c6a2802002200200110672000450d00200041186c2103200241146a2100200141086a2102200141046a21040340200041706a2802002105200041746a2802002206200110670240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d04200741017422082009200820094b1b22084100480d040240024020070d002008102a21070c010b200128020020072008102e21070b2007450d032001200736020020042008360200200228020021080b2002200820066a360200200720086a2005200610db051a2000417c6a280200210520002802002206200110670240024020042802002207200228020022086b2006490d00200128020021070c010b200820066a22092008490d04200741017422082009200820094b1b22084100480d040240024020070d002008102a21070c010b200128020020072008102e21070b2007450d032001200736020020042008360200200228020021080b2002200820066a360200200720086a2005200610db051a200041186a2100200341686a22030d000b0b0f0b1033000b1035000b040041010bb60101017f230041c0006b2202240020024100360210200242013703082002410836021c20022001410c6a3602202002200241206a3602182002200241086a3602242002413c6a41013602002002420137022c200241d49ec6003602282002200241186a360238200241246a41b4b0c000200241286a10391a20012d0000417f6a41ff0171200141046a290200200235021042208620023502088410000240200228020c450d002002280208102c0b200241c0006a24000bbc0101037f02400240024002402000280200220041046a2802002203200041086a28020022046b2002490d00200028020021030c010b200420026a22052004490d02200341017422042005200420054b1b22044100480d020240024020030d002004102a21030c010b200028020020032004102e21030b2003450d0120002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a2001200210db051a41000f0b1033000b1035000ba70301047f230041106b22022400200028020021002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b0240024002400240200041046a2802002203200041086a28020022046b2001490d00200028020021030c010b200420016a22052004490d02200341017422042005200420054b1b22044100480d020240024020030d002004102a21030c010b200028020020032004102e21030b2003450d0120002003360200200041046a2004360200200041086a28020021040b200041086a200420016a360200200320046a2002410c6a200110db051a200241106a240041000f0b1033000b1035000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41b4b0c000200241086a10392101200241206a240020010b040041000b02000b02000b950201057f230041f0026b22012400024020002802082202200028020c460d00200141b8016a4101722103200141e0016a210403402000200241b8016a36020820022d00002105200141b8016a200241016a41b70110db051a20054103460d01200141016a200141b8016a41b70110db051a200120053a00b8012003200141016a41b70110db051a02400240200541014b0d000240024020050e020001000b024020012802c001450d0020012802bc01102c0b20012d00c8014105490d0220012802f001450d0220012802ec01102c0c020b200410730c010b20012802a002450d00200128029c02102c0b20002802082202200028020c470d000b0b02402000280204450d002000280200102c0b200141f0026a24000bad0c01057f024002402000280200220141164b0d000240024002400240024002400240024002400240024002400240024020010e1700010f0f020f0f030405060708090f0a0f0b0c0d0f0f0f000b0240200041086a280200220141064b0d00024002400240024020010e0713130013010203130b200041106a280200450d122000410c6a280200102c0f0b200041106a280200450d112000410c6a280200102c0f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141186a2101200241686a22020d000b0b200041106a280200450d10200028020c102c0f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041106a280200450d0f200028020c102c0f0b200041106a280200450d0e2000410c6a280200102c0f0b02402000410c6a2802002202450d002000280204210120024190016c210203402001107320014190016a2101200241f07e6a22020d000b0b200041086a280200450d0d2000280204102c0f0b02402000410c6a2802002201450d0020002802042203200141f0006c6a2104034002402003410c6a2802002202450d0020032802042101200241246c210203400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012002415c6a22020d000b0b200341f0006a21010240200341086a280200450d002003280204102c0b2001210320012004470d000b0b200041086a280200450d0c2000280204102c0f0b0240200041086a2d00002201410f4b0d00410120017441bfbf03710d0c024020014106470d00200041106a280200450d0d2000410c6a280200102c0f0b200041106a280200450d0c2000410c6a280200102c0f0b200041146a280200450d0b200041106a280200102c0f0b200041086a280200450d0a2000280204102c0f0b200041086a2d0000416d6a220141014b0d090240024020010e020001000b200041106a280200450d0a2000410c6a280200102c0f0b200041106a280200450d092000410c6a280200102c0f0b20002d0004417f6a220141024b0d0802400240024020010e03000102000b2000410c6a280200450d0a200041086a280200102c0f0b200041086a220128020010732001280200102c0f0b2000410c6a220128020010732001280200102c0f0b20002d0004417f6a220141024b0d0702400240024020010e03000102000b2000410c6a280200450d09200041086a280200102c0f0b200041086a220128020010732001280200102c0f0b2000410c6a220128020010732001280200102c0f0b200041086a2802004101470d06200041106a280200450d062000410c6a280200102c0f0b20002d00044104470d052000410c6a280200450d05200041086a280200102c0f0b200041086a280200450d042000280204102c0f0b200041086a2d0000417e6a220141024b0d0302400240024020010e03000102000b200041106a280200450d052000410c6a280200102c0f0b200041346a280200450d04200041306a280200102c0f0b200041306a280200450d032000412c6a280200102c0f0b02402000280204220141024b0d00024020010e03040004040b200041086a220128020010732001280200102c0f0b2000412c6a220128020010732001280200102c0f0b02402000410c6a280200450d00200041086a280200102c0b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041186a280200450d012000280214102c0c010b02402000280204220141034b0d00024020010e0402000202020b2000410c6a280200450d01200041086a280200102c0f0b200041306a280200450d002000412c6a280200102c0f0b0ba205020c7f047e230041f0006b22022400200220011075024002400240024020022802000d00200128020441286e220341286c2204417f4c0d02200228020421050240024020040d00410821060c010b2004102a2206450d040b02402005450d00410021070340200241003a00682007220841016a210720012802042109417f210a410021040240024002400240034020092004460d01200241c8006a20046a2001280200220b2d00003a000020012009200a6a3602042001200b41016a3602002002200441016a220c3a0068200a417f6a210a200c2104200c4120470d000b200241286a41186a2204200241c8006a41186a290300370300200241286a41106a220a200241c8006a41106a290300370300200241286a41086a220d200241c8006a41086a290300370300200220022903483703282009200c6b220c4108490d01200b290001210e2001200b41096a3602002001200c41786a360204200241086a41086a220c200d290300370300200241086a41106a2209200a290300370300200241086a41186a220a20042903003703002002200229032837030820032008470d030240200841017422042007200420074b1b2203ad42287e220f422088a70d00200fa7220441004e0d030b1035000b200441ff0171450d00200241003a00680b200041003602002003450d052006102c0c050b0240024020080d002004102a21060c010b2006200841286c2004102e21060b2006450d060b2006200841286c6a22042002290308370300200c290300210f20092903002110200a29030021112004200e370320200441186a2011370300200441106a2010370300200441086a200f37030020072005470d000b0b2000200336020420002006360200200041086a20053602000c010b200041003602000b200241f0006a24000f0b103a000b1033000bcf0201067f0240024020012802042202450d00200128020022032d0000210420012002417f6a2205360204410121062001200341016a3602000240200441037122074103460d0002400240024020070e03000102000b20044102762107410021060c040b41012106024020050d000c040b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d03200141fcff03714102762107410021060c030b20054103490d01200341036a2d0000210620032f0001210720012002417c6a3602042001200341046a3602002007200641107472410874200472220141808004492106200141027621070c020b0240200441034d0d000c020b20054104490d012003280001210720012002417b6a3602042001200341056a36020020074180808080044921060c010b410121060b20002007360204200020063602000b800201077f230041106b2202240002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a3602002006450d0020042d0001210720012003417e6a22063602042001200441026a3602002006450d0020042d0002210820012003417d6a22063602042001200441036a3602002006450d0020042d0003210620012003417c6a3602042001200441046a3602002002200110772002280200450d01200020022903003702042000410c6a200241086a280200360200200020074108742005722008411074722006411874723602000c020b200041003602040c010b200041003602040b200241106a24000be70101047f230041106b22022400200241086a20011075024002400240024020022802080d0002402001280204200228020c22034f0d00200041003602000c020b2003417f4c0d02024002400240024020030d00410121040c010b200310302204450d0120012802042003490d0220042001280200200310db051a200128020422052003490d062001200520036b3602042001200128020020036a3602000b2000200336020420002004360200200041086a20033602000c030b1033000b200041003602002004102c0c010b200041003602000b200241106a24000f0b103a000b200320051047000bcf0101067f024002402000280208220141ffffff3f712001470d0020014105742202417f4c0d00200028020021030240024020020d00410121040c010b2002102a2204450d020b024020010d0041000f0b20014105742105410021000340200420006a2202200320006a2206290000370000200241186a200641186a290000370000200241106a200641106a290000370000200241086a200641086a2900003700002005200041206a2200470d000b2001410574410575210002402001450d002004102c0b20000f0b103a000b1033000bbf0302077f027e230041106b220224000240024002402000280208220341146a2204417f4c0d000240024020040d00410121050c010b2004102a2205450d02200028020821030b200241003602082002200436020420022005360200200028020021062003200210670240024020022802042205200228020822076b2003490d00200228020021040c010b200720036a22042007490d03200541017422082004200820044b1b22084100480d030240024020050d002008102a21040c010b200228020020052008102e21040b2004450d022002200836020420022004360200200821050b2002200720036a2208360208200420076a2006200310db051a200041186a29030021092000290310210a02400240200520086b4110490d00200841106a21030c010b200841106a22032008490d03200541017422002003200020034b1b22004100480d030240024020050d002000102a21040c010b200420052000102e21040b2004450d022002200036020420022004360200200021050b200420086a220020093700082000200a37000020012902002003ad4220862004ad84100102402005450d002004102c0b200241106a24000f0b103a000b1033000b1035000b9203010a7f200041086a220228020021034100210420024100360200024002402003450d004100210541002106410021044100210702400340024002402004450d00200741057421080340200720034f0d062001200028020022096b2008460d02200920086a220a2001412010dd05450d020240200620076a220b20034f0d00200920056a20086a2209200a290000370000200941186a200a41186a290000370000200941106a200a41106a290000370000200941086a200a41086a290000370000200841206a2108200741016a22072003490d010c050b0b41fcb4c000200b20031038000b200028020020074105746a21080340200720034f0d0520012008460d0120082001412010dd05450d01200841206a2108200741016a22072003490d000b410021040c030b200541606a21052006417f6a2106200441016a2104200741016a22072003490d000b0b2004450d00200320074d0d00200028020020074105746a220820044105746b2008200320076b41057410dc051a0b2002200320046b3602000f0b41a8b4c000200720031038000bbd0101047f230041106b22022400200028020821032000280200210041012104200128021841d1afc00041012001411c6a28020028020c1100002105200241003a0005200220053a00042002200136020002402003450d0003402002200036020c20022002410c6a41dc9ac50010621a200041016a21002003417f6a22030d000b20022d000421050b0240200541ff01710d002002280200220028021841d2afc00041012000411c6a28020028020c11000021040b200241106a240020040bf70405027f017e0a7f037e037f230041206b220224000240024020012802082203ad42d0007e2204422088a70d002004a72205417f4c0d00200128020021060240024020050d00410821070c010b2005102a2207450d020b0240024020030d00410021080c010b2006200341d0006c6a2109410021082007210a0340200241186a220b200641186a290300370300200241106a220c200641106a290300370300200241086a220d200641086a29030037030020022006290300370300200641c8006a280200220ead42307e2204422088a70d022004a72205417f4c0d02200641386a2903002104200641306a290300210f200641286a2903002110200641c0006a2802002101200629032021110240024020050d00410821120c010b2005102a2212450d040b200641d0006a210602400240200e0d00410021130c010b2001200e41306c6a211441002113201221050340200520012903003703002005200141086a290300370308200541106a200141106a290300370300200541186a200141186a290300370300200541206a200141206a290300370300200541286a200141286a290300370300200541306a2105201341016a2113200141306a22012014470d000b0b200a2011370320200a2002290300370300200a41386a2004370300200a41306a200f370300200a41286a2010370300200a41c8006a2013360200200a41c4006a200e360200200a41c0006a2012360200200a41186a200b290300370300200a41106a200c290300370300200a41086a200d290300370300200841016a2108200a41d0006a210a20062009470d000b0b200020083602082000200336020420002007360200200241206a24000f0b103a000b1033000bb10301037f024020002802082201450d002000280200220020014198016c6a21020340024020002d0000417f6a2201410f4b0d00024002400240024002400240024020010e1000070707070107070207030704070506000b200041086a280200450d06200041046a280200102c0c060b200041086a2d00004101470d05200041146a280200450d05200041106a280200102c0c050b200041046a2d00000d042000410c6a280200450d04200041086a280200102c0c040b200041046a2802000d032000410c6a280200450d03200041086a280200102c0c030b200041086a2d00004105490d02200041306a280200450d022000412c6a280200102c0c020b200041046a2d00004102490d010240200041106a2802002201450d00200141d0006c2103200041086a28020041c0006a210103400240200141046a280200450d002001280200102c0b200141d0006a2101200341b07f6a22030d000b0b2000410c6a280200450d012000280208102c0c010b200041086a280200450d00200041046a280200102c0b20004198016a210102402000418c016a280200450d00200028028801102c0b2001210020012002470d000b0b0be802010b7f230041106b22022400200241086a20011075024002400240024020022802080d0020012802042203417c712204417f4c0d02200228020c210502400240200341027622060d00410421070c010b2004102a2207450d040b02402005450d0041002108410021094100210403400240024002402001280204220a4104490d00200441016a21032001280200220b280000210c2001200a417c6a3602042001200b41046a36020020042006470d02024020082003200820034b1b220641ffffffff03712006470d002006410274220a41004e0d020b1035000b200041003602002006450d052007102c0c050b0240024020040d00200a102a21070c010b20072009200a102e21070b2007450d060b200720096a200c360200200841026a2108200941046a21092003210420052003470d000b0b2000200636020420002007360200200041086a20053602000c010b200041003602000b200241106a24000f0b103a000b1033000bba05020c7f067e230041f0006b22022400200220011075024002400240024020022802000d00200128020441306e220341306c2204417f4c0d02200228020421050240024020040d00410821060c010b2004102a2206450d040b02402005450d00410021070340200241003a00682007220841016a210720012802042109417f210a410021040240024002400240034020092004460d01200241c8006a20046a2001280200220b2d00003a000020012009200a6a3602042001200b41016a3602002002200441016a220c3a0068200a417f6a210a200c2104200c4120470d000b200241286a41186a2204200241c8006a41186a290300370300200241286a41106a220a200241c8006a41106a290300370300200241286a41086a220d200241c8006a41086a290300370300200220022903483703282009200c6b220c4110490d01200b41096a290000210e200b290001210f2001200c41706a3602042001200b41116a360200200241086a41086a220c200d290300370300200241086a41106a2209200a290300370300200241086a41186a220a20042903003703002002200229032837030820032008470d030240200841017422042007200420074b1b2203ad42307e2210422088a70d002010a7220441004e0d030b1035000b200441ff0171450d00200241003a00680b200041003602002003450d052006102c0c050b0240024020080d002004102a21060c010b2006200841306c2004102e21060b2006450d060b200c290300211020092903002111200a2903002112200229030821132006200841306c6a2204200f37032020042013370300200441286a200e370300200441186a2012370300200441106a2011370300200441086a201037030020072005470d000b0b2000200336020420002006360200200041086a20053602000c010b200041003602000b200241f0006a24000f0b103a000b1033000bd90403087f017e017f230041f0016b22022400200241086a200110750240024002400240024020022802080d00200128020441f0006e220341f0006c2204417f4c0d02200228020c21050240024020040d00410421060c010b2004102a2206450d040b024002402005450d00410021074100210841002109034020024180016a2001108101200228028401450d02200941016a2104200241106a20024180016a41f00010db051a024020092003470d0020072004200720044b1b2203ad42f0007e220a422088a70d08200aa7220b4100480d080240024020090d00200b102a21060c010b20062008200b102e21060b2006450d070b200620086a200241106a41f00010db051a200741026a2107200841f0006a21082004210920052004470d000b0b2000200336020420002006360200200041086a20053602000c020b2000410036020002402009450d00200620086a210120062107034002402007410c6a2802002209450d0020072802042104200941246c210903400240024020042d0000220841034b0d0002400240024020080e0404000102040b2004410c6a280200450d03200441086a280200102c0c030b2004410c6a280200450d02200441086a280200102c0c020b2004410c6a280200450d01200441086a280200102c0c010b200441086a280200450d00200441046a280200102c0b200441246a21042009415c6a22090d000b0b200741f0006a21040240200741086a280200450d002007280204102c0b2004210720012004470d000b0b2003450d012006102c0c010b200041003602000b200241f0016a24000f0b103a000b1033000b1035000ba00a03077f037e057f230041d0026b2202240041002103200241003a00c8022001280204417f6a210402400240024003402004417f460d01200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241e8006a41086a200241a8026a41086a290300370300200241e8006a41106a200241a8026a41106a290300370300200241e8006a41186a200241a8026a41186a290300370300200220022903a8023703682002200110752002280200450d01200041003602040c020b0240200341ff0171450d00200241003a00c8020b200041003602040c010b2002280204210641002104200241003a00c80220012802042107417f21030240034020072004460d01200241a8026a20046a200128020022082d00003a00002001200720036a3602042001200841016a3602002002200441016a22053a00c8022003417f6a21032005210420054120470d000b200241a8016a41086a200241a8026a41086a2903002209370300200241a8016a41106a200241a8026a41106a290300220a370300200241a8016a41186a200241a8026a41186a290300220b37030020024188016a41086a200937030020024188016a41106a200a37030020024188016a41186a200b370300200220022903a80222093703a801200220093703880141002104200241003a00c802200720056b210c200720036a210303400240200c2004470d000240200441ff0171450d00200241003a00c8020b200041003602040c030b200241a8026a20046a200820046a220541016a2d00003a0000200120033602042001200541026a3602002002200441016a22053a00c8022003417f6a21032005210420054120470d000b200241e8016a41086a200241a8026a41086a2903002209370300200241e8016a41106a200241a8026a41106a290300220a370300200241e8016a41186a200241a8026a41186a290300220b370300200241c8016a41086a22042009370300200241c8016a41106a2203200a370300200241c8016a41186a2205200b370300200220022903a80222093703e801200220093703c801200241a8026a2001108301024020022802a8022201450d00200241c8006a41086a2208200241e8006a41086a290300370300200241c8006a41106a2207200241e8006a41106a290300370300200241c8006a41186a220c200241e8006a41186a290300370300200241286a41086a220d20024188016a41086a290300370300200241286a41106a220e20024188016a41106a290300370300200241286a41186a220f20024188016a41186a29030037030020022002290368370348200220022903880137032820022902ac022109200241086a41186a22102005290300370300200241086a41106a22052003290300370300200241086a41086a22032004290300370300200220022903c801370308200020093702082000200136020420002006360200200041106a2002290348370200200041186a2008290300370200200041206a2007290300370200200041286a200c290300370200200041306a2002290328370200200041386a200d290300370200200041c0006a200e290300370200200041c8006a200f290300370200200041e8006a2010290300370200200041e0006a2005290300370200200041d8006a2003290300370200200041d0006a20022903083702000c020b200041003602040c010b0240200441ff0171450d00200241003a00c8020b200041003602040b200241d0026a24000ba104010a7f230041d0006b22022400200220011075024002400240024020022802000d00200128020422034160712204417f4c0d022002280204210502400240200341057622060d00410121070c010b2004102a2207450d040b02402005450d00410021080340200241003a00482008220941016a21082001280204417f6a21034100210402400240024003402003417f460d01200241286a20046a2001280200220a2d00003a0000200120033602042001200a41016a3602002002200441016a220a3a00482003417f6a2103200a2104200a4120470d000b200241086a41186a2204200241286a41186a290300370300200241086a41106a220a200241286a41106a290300370300200241086a41086a220b200241286a41086a2903003703002002200229032837030820062009470d020240200941017422032008200320084b1b220641ffffff3f712006470d002006410574220341004e0d020b1035000b0240200441ff0171450d00200241003a00480b200041003602002006450d052007102c0c050b0240024020090d002003102a21070c010b200720094105742003102e21070b2007450d060b200720094105746a22032002290308370000200341186a2004290300370000200341106a200a290300370000200341086a200b29030037000020082005470d000b0b2000200636020420002007360200200041086a20053602000c010b200041003602000b200241d0006a24000f0b103a000b1033000b990b03117f017e037f23004180016b2202240020022001107502400240024002400240024020022802000d00200128020441246e220341246c2204417f4c0d01200228020421050240024020040d00410421060c010b2004102a2206450d030b0240024020050d00410021040c010b200241286a411c6a2107200241d8006a4104722108200241db006a2109200241336a210a200241c8006a410172220b41076a210c4100210d4100210e03402001280204220f450d06200128020022102d000021042001200f417f6a22113602042001201041016a360200200441064b0d0602400240024002400240024020040e07040c000c020301040b41002104200241003a0078200f417e6a210f0340024020112004470d00200441ff0171450d0d200241003a00780c0d0b200241d8006a20046a201020046a221241016a2d00003a00002001200f3602042001201241026a3602002002200441016a22123a0078200f417f6a210f2012210420124120470d000b200241286a41086a200841086a290000370300200241286a41106a200841106a290000370300200241286a41186a200841186a280000360200200220082900003703282002280258210f200741026a200241c8006a41026a2d00003a0000200720022f00483b0000410021120c040b200241d8006a20011076200228025c450d0a200241c8006a41086a200841086a28020022043602002002200829020022133703482002280258210f200941086a200436000020092013370000200220022900583703282002200241d8006a41076a29000037002f410121120c030b200241d8006a20011076200228025c450d09200241c8006a41086a200841086a28020022043602002002200829020022133703482002280258210f200941086a200436000020092013370000200220022900583703282002200241d8006a41076a29000037002f410221120c020b200241d8006a20011076200228025c450d08200241c8006a41086a200841086a28020022043602002002200829020022133703482002280258210f200941086a200436000020092013370000200220022900583703282002200241d8006a41076a29000037002f410321120c010b200241c8006a2001107720022802482204450d07200a2002290258370000200a41086a200241d8006a41086a290200370000200a41106a200241d8006a41106a2802003600002002200b2900003703282002200c28000036002f41042112201441ffffff07712004411874722214210f0b200241086a41176a2210200241286a41176a290000370000200241086a41106a2211200241286a41106a290300370300200241086a41086a2215200241286a41086a290300370300200220022903283703080240200e2003470d00200341016a22042003490d06200341017422162004201620044b1b2216ad42247e2213422088a70d062013a722044100480d060240024020030d002004102a21060c010b2006200341246c2004102e21060b2006450d05201621030b2006200e41246c6a2204200f360001200420123a0000200420022903083700052004410d6a2015290300370000200441156a20112903003700002004411c6a2010290000370000200d41246a210d200e41016a2204210e20042005470d000b0b2000200336020420002006360200200041086a20043602000c050b200041003602000c040b103a000b1033000b1035000b200041003602000240200e450d002006210403400240024020042d0000220141034b0d0002400240024020010e0404000102040b2004410c6a280200450d03200441086a280200102c0c030b2004410c6a280200450d02200441086a280200102c0c020b2004410c6a280200450d01200441086a280200102c0c010b200441086a280200450d00200441046a280200102c0b200441246a2104200d415c6a220d0d000b0b2003450d002006102c0b20024180016a24000bdf0704067f017e0a7f027e230041f0006b22032400200341206a2001200228020c22041102000240024020032802200d002000410036020820004208370200200120022802001103002002280204450d012001102c0c010b200341c8006a41106a200341206a41106a290300370300200341c8006a41086a200341206a41086a290300370300200341c8006a41186a200341206a41186a290300370300200341c8006a41206a200341206a41206a280200360200200341086a200341d4006a290200370300200341106a200341dc006a290200370300200341186a200341e4006a290200370300200320032903203703482003200329024c370300200341c8006a200120022802102205110200024002400240417f2003280248220641016a220720072006491b2208ad42287e2209422088a70d002009a72206417f4c0d000240024020060d004108210a4108210b0c010b2006102a220a450d02200a210b0b200a2003290300370300200a41186a200341186a220c290300370300200a41106a200341106a220d290300370300200a41086a200341086a290300370300200b4201370320200341206a200120041102000240024020032802200d004101210e0c010b200341c8006a410472210641c800210f4101210e0340200341c8006a41206a200341206a41206a280200360200200341c8006a41186a2210200341206a41186a290300370300200341c8006a41106a2211200341206a41106a290300370300200341c8006a41086a2212200341206a41086a29030037030020032003290320370348200341086a2207200641086a290200370300200d200641106a290200370300200c200641186a290200370300200320062902003703002010200c2903003703002011200d29030037030020122007290300370300200320032903003703480240200e2008470d00200341206a200120051102002008417f2003280220220741016a221320132007491b6a22072008490d05200841017422132007201320074b1b2207ad42287e2209422088a70d052009a722134100480d050240024020080d002013102a210a0c010b200a200841286c2013102e210a0b200a450d04200a210b200721080b200b200f6a221341606a2207200329034837030020122903002109201129030021142010290300211520134201370300200741186a2015370300200741106a2014370300200741086a2009370300200341206a20012004110200200f41286a210f200e41016a210e20032802200d000b0b2001200228020011030002402002280204450d002001102c0b2000200e360208200020083602042000200b3602000c030b103a000b1033000b1035000b200341f0006a24000ba308040c7f017e057f037e23004180016b22022400024002400240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014b210903402003200441206a220a360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a29000037030020022004290000370360410021040240024020090d0020080e020401040b2008210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a412010dd054101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a412010dd050d02200a2104200a2005470d000b0b20004100360208200042013702002001280204450d012001280200102c0c010b200241c0006a41086a2204200241e0006a41086a290300370300200241c0006a41106a220b200241e0006a41106a290300370300200241c0006a41186a220c200241e0006a41186a29030037030020022002290360220e3703002002200e370340024002404120102a220f450d00200f2002290340370000200f41186a200c290300370000200f41106a200b290300370000200f41086a2004290300370000200128020421102001280200211102400240200a2005470d0041012112410121130c010b41012112410121130340200628020821032006280200210702400340200241e0006a41186a2208200a41186a290000370300200241e0006a41106a2209200a41106a290000370300200241e0006a41086a2201200a41086a2900003703002002200a290000370360200a41206a210a4100210402400240200341014b0d0020030e020301030b2003210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a412010dd054101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a412010dd050d01200a2005470d000c030b0b200241c0006a41086a2001290300220e370300200241c0006a41106a20092903002214370300200241c0006a41186a20082903002215370300200220022903602216370340200241186a220b2015370300200241106a220c2014370300200241086a220d200e37030020022016370300024020132012470d00201241016a22042012490d04201241017422072004200720044b1b221341ffffff3f712013470d04201341057422044100480d040240024020120d002004102a210f0c010b200f20124105742004102e210f0b200f450d030b200f20124105746a22042002290300370000200441186a200b290300370000200441106a200c290300370000200441086a200d290300370000201241016a2112200a2005470d000b0b02402010450d002011102c0b20002012360208200020133602042000200f3602000c020b1033000b1035000b20024180016a24000ba20705077f037e097f017e017f23004180016b22022400024002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f4006a2107034020032004220841206a2204360200200841086a2903002109200841106a290300210a2008290300210b200241e0006a41186a200841186a290300370300200241e0006a41106a200a370300200241e0006a41086a20093703002002200b3703600240200aa720062802004d0d002001280214220c2007460d002007290000200c290000520d030b20052004470d000b0b20004100360208200042083702002001280204450d012001280200102c0c010b200241086a2204200241e0006a41086a290300370300200241106a2203200241e0006a41106a290300370300200241186a2207200241e0006a41186a29030037030020022002290360220a3703202002200a37030002400240024002404120102a220d450d00200d2002290300370300200d41186a2007290300370300200d41106a2003290300370300200d41086a20042903003703002001280204210e2001280200210f200541606a2008460d02200841206a2110200541606a2111200241f4006a21014101211241012113200d21140340200c2001460d032010210802400340200241e0006a41186a2204200841186a290300370300200241e0006a41106a2203200841106a290300220a370300200241e0006a41086a2207200841086a290300370300200220082903003703600240200aa720062802004d0d002001290000200c290000520d020b2005200841206a2208470d000c060b0b200241206a41086a2007290300220a370300200241206a41106a20032903002209370300200241206a41186a2004290300220b3703002002200229036022153703202004200b370300200320093703002007200a37030020022015370360024020132012470d00201241016a22132012490d03201241017422102013201020134b1b221341ffffff3f712013470d03201341057422104100480d030240024020120d002010102a21140c010b201420124105742010102e21140b2014450d020b200841206a2110201420124105746a22162002290360370300201641186a2004290300370300201641106a2003290300370300201641086a2007290300370300201241016a211220112008470d000c040b0b1033000b1035000b4101211241012113200d21140b0240200e450d00200f102c0b2000201236020820002013360204200020143602000b20024180016a24000bfe1503077f027e057f230041206b2202240002400240024041aa02102a2203450d00200241aa0236020420022003360200200341003b00002002410236020802400240200128020022042903684202520d00024020022802044102470d00200228020041024104102e2203450d0320024104360204200220033602000b200228020041043a00022002200228020841016a3602080c010b024020022802044102470d00200228020041024104102e2203450d0220024104360204200220033602000b20022802004184013a00022002200228020841016a36020820042002108801024020042d0024220341024b0d0002400240024020030e03000102000b02400240200228020420022802082203460d00200228020021010c010b200341016a22012003490d07200341017422052001200520014b1b22054100480d070240024020030d002005102a21010c010b200228020020032005102e21010b2001450d052002200536020420022001360200200228020821030b2002200341016a360208200120036a41003a0000200441256a2106410021010340200620016a2d0000210702400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d08200341017422082005200820054b1b22084100480d080240024020030d002008102a21050c010b200228020020032008102e21050b2005450d062002200836020420022005360200200228020821030b2002200341016a360208200520036a20073a0000200141016a220141c000470d000c030b0b02400240200228020420022802082203460d00200228020021010c010b200341016a22012003490d06200341017422052001200520014b1b22054100480d060240024020030d002005102a21010c010b200228020020032005102e21010b2001450d042002200536020420022001360200200228020821030b2002200341016a360208200120036a41013a0000200441256a2106410021010340200620016a2d0000210702400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d07200341017422082005200820054b1b22084100480d070240024020030d002008102a21050c010b200228020020032008102e21050b2005450d052002200836020420022005360200200228020821030b2002200341016a360208200520036a20073a0000200141016a220141c000470d000c020b0b02400240200228020420022802082203460d00200228020021010c010b200341016a22012003490d05200341017422052001200520014b1b22054100480d050240024020030d002005102a21010c010b200228020020032005102e21010b2001450d032002200536020420022001360200200228020821030b2002200341016a360208200120036a41023a0000412521010340200420016a2d0000210702400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d06200341017422082005200820054b1b22084100480d060240024020030d002008102a21050c010b200228020020032008102e21050b2005450d042002200836020420022005360200200228020821030b2002200341016a360208200520036a20073a0000200141016a220141e600470d000b0b0240024020042903684201510d0002400240200228020420022802082203460d00200228020021010c010b200341016a22012003490d06200341017422052001200520014b1b22054100480d060240024020030d002005102a21010c010b200228020020032005102e21010b2001450d042002200536020420022001360200200228020821030b2002200341016a360208200120036a41003a00000c010b200441f8006a29030020042903702209420c88220a4201200a4201561b80210a0240024020022802042201200228020822036b4102490d00200228020021010c010b200341026a22052003490d05200141017422032005200320054b1b22034100480d050240024020010d002003102a21010c010b200228020020012003102e21010b2001450d032002200336020420022001360200200228020821030b2002200341026a360208200120036a200aa741047420097aa7417f6a22034101200341014b1b2203410f2003410f491b723b00000b20044190016a2002108901200220044180016a360210200241106a2002108a010b20044198016a2002108b012002280208210320024100360218200242013703102003417e6a200241106a10672002280208220141014d0d01200228021821042002280214210b2002280210210720024100360208200228020021030240024002400240024002402001417e6a2208450d00410221062004450d04200320072d00003a00004101210c2002200228020841016a36020820044101460d04200720046a210d200320072d00013a00012002200228020841016a36020841022106200741026a21052004417e6a220e0d014100210e0c020b0240024002402002280204220120044f0d00200141017422052004200520044b1b22054100480d0a0240024020010d002005102a21030c010b200320012005102e21030b2003450d082002200536020420022003360200200228020821060c010b410021062004450d010b200320066a220120072d00003a0000024020044101470d00200641016a21060c010b2004417f6a2105200741016a2103200141016a21010340200120032d00003a0000200141016a2101200341016a21032005417f6a22050d000b200620046a21060b20022006360208410221060c020b024002402002280204220320016b200e490d00200228020021030c010b2001200e6a22062001490d07200341017422012006200120064b1b22014100480d070240024020030d002001102a21030c010b200228020020032001102e21030b2003450d0520022001360204200220033602000b200320046a200341026a200810dc051a0240200420022802082203460d00200420036b21062004417e6a2101200228020020036a210c410021030340024020012003470d00200421060c040b200c20036a20052d00003a00002002200228020841016a360208200541016a21052006200341016a2203470d000b200d20056b220e0d004100210e4101210c200421060c010b200e4100480d0620042106200e102a220c450d040b0240200d2005460d00200c20052d00003a00004101210f02400240200541016a2203200d470d00200c41016a21040c010b200c41016a21012007200420056b6a21050340200120032d00003a0000200141016a2101200d200341016a2203470d000b2005450d01200c20056a21042005210f0b0240024020022802042203200820066a22016b200f490d00200228020021030c010b2001200f6a22052001490d07200341017422012005200120054b1b22014100480d070240024020030d002001102a21030c010b200228020020032001102e21030b2003450d0520022001360204200220033602000b20032006200f6a220d6a200320066a200810dc051a0240200d20022802082203460d00200228020020036a21012006200f6a20036b2105200c2103034020042003460d01200120032d00003a00002002200228020841016a360208200341016a2103200141016a21012005417f6a22050d000b0b200d21060b200e450d00200c102c0b2008450d010b0240200620022802082203460d002002280200220120036a200120066a200810dc051a0b2002200820036a3602080b0240200b450d002007102c0b20002002290300370200200041086a200241086a280200360200200241206a24000f0b1033000b41dafec500411c41acfec5001036000b1035000bfd0701037f02400240024020002d00004101460d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d03200241017422042003200420034b1b22044100480d030240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41ff013a0000200041016a20011091010f0b0240024002400240200041046a280200220241ffff034b0d00200241ef014b0d03200141046a280200200141086a2802002200460d01200128020021030c020b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d05200041017422042003200420034b1b22044100480d050240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0420012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a000002400240200141046a2802002203200428020022006b4104490d00200128020021030c010b200041046a22042000490d05200341017422002004200020044b1b22004100480d050240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0420012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000f0b200041016a22032000490d03200041017422042003200420034b1b22044100480d030240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0220012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d02200041017422042003200420034b1b22044100480d020240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a000002400240200141046a2802002203200428020022006b4102490d00200128020021030c010b200041026a22042000490d02200341017422002004200020044b1b22004100480d020240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b1033000b1035000bed0601037f02400240024020002802002202413f4b0d0002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d03200041017422042003200420034b1b22044100480d030240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0220012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000f0b0240200241808001490d0002402002418080808004490d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d04200241017422042003200420034b1b22044100480d040240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0320012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280200210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d04200241017422002004200020044b1b22004100480d040240024020020d002000102a21020c010b200128020020022000102e21020b2002450d0320012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a2802002203200141086a28020022006b4104490d00200128020021030c010b200041046a22042000490d03200341017422002004200020044b1b22004100480d030240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0220012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b02400240200141046a2802002203200141086a28020022006b4102490d00200128020021030c010b200041026a22042000490d02200341017422002004200020044b1b22004100480d020240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b1033000b1035000bd50903017f027e057f230041e0006b220224000240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d0002400240200141046a280200200141086a2802002200460d00200128020021050c010b200041016a22052000490d04200041017422062005200620054b1b22064100480d040240024020000d002006102a21050c010b200128020020002006102e21050b2005450d0320012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a00000c010b024020034280800154410020051b0d000240200342808080800454410020051b0d000240411020047920037942c0007c20044200521ba741037622066b4104490d0002400240200141046a280200200141086a2802002205460d00200128020021070c010b200541016a22082005490d06200541017422072008200720084b1b22084100480d060240024020050d002008102a21070c010b200128020020052008102e21070b2007450d0520012007360200200141046a2008360200200141086a28020021050b200141086a2208200541016a360200200720056a413320064102746b3a0000200029030021032002200041086a290300220437030820022003370300200641706a2105200141046a2107034002400240200728020020082802002200460d00200128020021060c010b200041016a22062000490d07200041017422092006200920064b1b22094100480d070240024020000d002009102a21060c010b200128020020002009102e21060b2006450d062001200636020020072009360200200828020021000b2008200041016a360200200620006a2003a73a00002003420888200442388684210320044208882104200541016a22002005492106200021052006450d000b20022003370300200220043703082003200484500d03200241286a41146a4109360200200241346a410a360200200241106a41146a410336020020022002360240200241a0e2c10036024420024203370214200241ec9fc6003602102002410a36022c200242043703582002420137024c200241d8e1c1003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a4184c5c5001041000b4196e1c100413641acfec5001036000b02400240200141046a2802002205200141086a28020022006b4104490d00200128020021050c010b200041046a22062000490d04200541017422002006200020064b1b22004100480d040240024020050d002000102a21050c010b200128020020052000102e21050b2005450d0320012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a74102744102723600000c010b02400240200141046a2802002205200141086a28020022006b4102490d00200128020021050c010b200041026a22062000490d03200541017422002006200020064b1b22004100480d030240024020050d002000102a21050c010b200128020020052000102e21050b2005450d0220012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b00000b200241e0006a24000f0b1033000b1035000bdeca0103057f017e067f230041206b22022400024002400240024002402000280200220341174b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e18000102030405060708090a0b0c0d0e0f1011121314151617000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d1a200341017422052004200520044b1b22054100480d1a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000280208417f6a220341064b0d17024002400240024002400240024020030e0700010203040506000b200241003a001402400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d20200041017422042003200420034b1b22044100480d200240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1f20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a00000c1d0b200241013a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d1f200341017422052004200520044b1b22054100480d1f0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200028020c2106200041146a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d1f200441017422032005200320054b1b22034100480d1f0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1e20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c1c0b200241023a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d1e200341017422052004200520044b1b22054100480d1e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000290310210702400240200141046a2802002203200528020022006b4108490d00200128020021030c010b200041086a22042000490d1e200341017422002004200020044b1b22004100480d1e0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1d20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a20073700000c1b0b200241033a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d1d200341017422052004200520044b1b22054100480d1d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c2106200041146a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d1d200441017422032005200320054b1b22034100480d1d0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1c20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c1a0b200141086a2802002103200241043a0014024002402003200141046a280200460d00200128020021050c010b200341016a22042003490d1c200341017422052004200520044b1b22044100480d1c0240024020030d002004102a21050c010b200128020020032004102e21050b2005450d1b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41043a0000200028020c2103200041146a2802002200200110672000450d192003200041186c6a2108200141046a2106034020032802002109200341086a280200220020011067024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d1d200a4101742205200b2005200b4b1b22054100480d1d02400240200a0d002005102a210a0c010b2001280200200a2005102e210a0b200a450d1c2001200a36020020062005360200200428020021050b2004200520006a360200200a20056a2009200010db051a2003410c6a2802002109200341146a280200220020011067024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d1d200a4101742205200b2005200b4b1b22054100480d1d02400240200a0d002005102a210a0c010b2001280200200a2005102e210a0b200a450d1c2001200a36020020062005360200200428020021050b2004200520006a360200200a20056a2009200010db051a200341186a22032008470d000c1a0b0b200241053a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d1b200341017422052004200520044b1b22054100480d1b0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1a20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41053a0000200028020c2104200041146a2802002200200110672000450d1820042000410c6c6a2108200141046a210903402004280200210a200441086a2802002200200110670240024020092802002205200628020022036b2000490d00200128020021050c010b200320006a220b2003490d1c20054101742203200b2003200b4b1b22034100480d1c0240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1b2001200536020020092003360200200628020021030b2006200320006a360200200520036a200a200010db051a2004410c6a22042008470d000c190b0b200241063a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d1a200341017422052004200520044b1b22054100480d1a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a0000200028020c2106200041146a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d1a200441017422032005200320054b1b22034100480d1a0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1920012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c170b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d19200341017422052004200520044b1b22054100480d190240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d19200341017422052004200520044b1b22054100480d190240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200028020421032000410c6a2802002200200110672000450d1620004190016c2100034020032001108b0120034190016a2103200041f07e6a22000d000c170b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d18200041017422042003200420034b1b22044100480d180240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1720012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a0000200110e6020c150b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d17200341017422052004200520044b1b22054100480d170240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d17200341017422052004200520044b1b22054100480d170240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110c3020c140b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d16200341017422052004200520044b1b22054100480d160240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d16200341017422052004200520044b1b22054100480d160240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1520012004360200200141046a2005360200200141086a28020021030b200141086a220a200341016a360200200420036a41003a00002000280204210c2000410c6a2802002200200110672000450d13200c200041f0006c6a210d200141046a210b034020022001360200200c41106a2002109402200c200110890120022001360200200c41306a200210940220022001360200200c41d0006a2002109402200c2802042104200c28020c22002001106702402000450d00200041246c210903402002200410e7022002280200210602400240200b2802002205200a28020022006b20022802082203490d00200128020021050c010b200020036a22082000490d19200541017422002008200020084b1b22004100480d190240024020050d002000102a21050c010b200128020020052000102e21050b2005450d1820012005360200200b2000360200200a28020021000b200a200020036a360200200520006a2006200310db051a02402002280204450d002006102c0b200441246a21042009415c6a22090d000b0b200c41f0006a220c200d470d000c140b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d15200041017422042003200420034b1b22044100480d150240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1420012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41053a0000200110e6020c120b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d14200341017422052004200520044b1b22054100480d140240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000280208417f6a220341034b0d110240024002400240024020030e0400010203000b200241003a001402400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22032004490d18200441017422052003200520034b1b22034100480d180240024020040d002003102a21050c010b200128020020042003102e21050b2005450d1720012005360200200141046a2003360200200141086a28020021040b200041306a2103200141086a200441016a360200200520046a41003a00002000410c6a2001108801200241106a21000c030b200241013a001402400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22032004490d17200441017422052003200520034b1b22034100480d170240024020040d002003102a21050c010b200128020020042003102e21050b2005450d1620012005360200200141046a2003360200200141086a28020021040b200041c0006a2103200141086a200441016a360200200520046a41013a00002000410c6a20011088012002200041306a360214200241146a2001108a01200241186a21000c020b200241023a001402400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22032004490d16200441017422052003200520034b1b22034100480d160240024020040d002003102a21050c010b200128020020042003102e21050b2005450d1520012005360200200141046a2003360200200141086a28020021040b200041d8006a2103200141086a200441016a360200200520046a41023a00002000410c6a2001108801200041306a20011088012002411c6a21000c010b200241033a001402400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22032004490d15200441017422052003200520034b1b22034100480d150240024020040d002003102a21050c010b200128020020042003102e21050b2005450d1420012005360200200141046a2003360200200141086a28020021040b200041306a2103200141086a200441016a360200200520046a41033a00002000410c6a2001108801200221000b2000200336020020002001108a010c110b02400240200141046a2206280200200141086a22032802002204460d00200128020021050c010b200441016a22052004490d132004410174220a2005200a20054b1b220a4100480d130240024020040d00200a102a21050c010b20012802002004200a102e21050b2005450d1220012005360200200141046a200a360200200141086a28020021040b2003200441016a360200200520046a41073a0000200041086a22052d0000417f6a2204410f4b0d10024002400240024002400240024002400240024002400240024002400240024020040e10000102030405060708090a0b0c0d0e0f000b200241003a001402400240200628020020032802002204460d002001280200210a0c010b200441016a220a2004490d2220044101742209200a2009200a4b1b22094100480d220240024020040d002009102a210a0c010b200128020020042009102e210a0b200a450d212001200a360200200141046a2009360200200141086a28020021040b200141086a200441016a360200200a20046a41003a00002000410c6a20011088012002200041306a36020020022001108a0120052d0001220041024b0d1f02400240024020000e03000102000b200241003a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d24200041017422052004200520044b1b22054100480d240240024020000d002005102a21040c010b200128020020002005102e21040b2004450d2320012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41003a00000c210b200241013a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d23200041017422052004200520044b1b22054100480d230240024020000d002005102a21040c010b200128020020002005102e21040b2004450d2220012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41013a00000c200b200241023a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d22200041017422052004200520044b1b22054100480d220240024020000d002005102a21040c010b200128020020002005102e21040b2004450d2120012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41023a00000c1f0b200241013a001402400240200628020020032802002203460d00200128020021040c010b200341016a22042003490d21200341017422052004200520044b1b22054100480d210240024020030d002005102a21040c010b200128020020032005102e21040b2004450d2020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020020022001108a010c1e0b200241023a001402400240200628020020032802002203460d00200128020021040c010b200341016a22042003490d20200341017422052004200520044b1b22054100480d200240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020020022001108a010c1d0b200241033a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d1f200041017422052004200520044b1b22054100480d1f0240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1e20012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41033a00000c1c0b200241043a001402400240200628020020032802002203460d00200128020021040c010b200341016a22042003490d1e200341017422052004200520044b1b22054100480d1e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011089010c1b0b200241053a001402400240200628020020032802002203460d00200128020021040c010b200341016a22042003490d1d200341017422052004200520044b1b22054100480d1d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a0000200028020c2103200041146a2802002200200110672000450d1a200041246c2100034020032001108801200341246a21032000415c6a22000d000c1b0b0b200241063a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d1c200041017422052004200520044b1b22054100480d1c0240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1b20012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41063a00000c190b200241073a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d1b2000410174220a2004200a20044b1b220a4100480d1b0240024020000d00200a102a21040c010b20012802002000200a102e21040b2004450d1a20012004360200200141046a200a360200200141086a28020021000b2003200041016a360200200420006a41073a000020052d0001220041024b0d1802400240024020000e03000102000b200241003a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d1d200041017422052004200520044b1b22054100480d1d0240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1c20012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41003a00000c1a0b200241013a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d1c200041017422052004200520044b1b22054100480d1c0240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1b20012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41013a00000c190b200241023a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d1b200041017422052004200520044b1b22054100480d1b0240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1a20012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a41023a00000c180b200241083a001402400240200628020020032802002203460d00200128020021040c010b200341016a22042003490d1a200341017422052004200520044b1b22054100480d1a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a20011088010c170b200241093a001402400240200628020020032802002203460d00200128020021040c010b200341016a22042003490d19200341017422052004200520044b1b22054100480d190240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011089010c160b2002410a3a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d18200041017422052004200520044b1b22054100480d180240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1720012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a410a3a00000c150b2002410b3a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d17200041017422052004200520044b1b22054100480d170240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1620012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a410b3a00000c140b2002410c3a001402400240200628020020032802002203460d00200128020021040c010b200341016a22042003490d16200341017422052004200520044b1b22054100480d160240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200028020c2103200041146a2802002200200110672000450d1320004105742100034020032001109101200341206a2103200041606a22000d000c140b0b2002410d3a001402400240200628020020032802002200460d00200128020021030c010b200041016a22032000490d15200041017422042003200420034b1b22044100480d150240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1420012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a410d3a0000200541016a20011091010c120b2002410e3a001402400240200628020020032802002200460d00200128020021040c010b200041016a22042000490d14200041017422052004200520044b1b22054100480d140240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1320012004360200200141046a2005360200200141086a28020021000b2003200041016a360200200420006a410e3a00000c110b2002410f3a001402400240200628020020032802002204460d00200128020021050c010b200441016a22052004490d132004410174220a2005200a20054b1b220a4100480d130240024020040d00200a102a21050c010b20012802002004200a102e21050b2005450d1220012005360200200141046a200a360200200141086a28020021040b2003200441016a360200200520046a410f3a0000200028020c210a0240024020062802002205200328020022046b4104490d00200128020021050c010b200441046a22092004490d13200541017422042009200420094b1b22044100480d130240024020050d002004102a21050c010b200128020020052004102e21050b2005450d1220012005360200200141046a2004360200200141086a28020021040b200141086a2208200441046a360200200520046a200a36000020002802102104200041186a2802002200200110672000450d102000410274210a0340200428020021090240024020062802002205200328020022006b4104490d00200128020021050c010b200041046a220b2000490d1420054101742200200b2000200b4b1b22004100480d140240024020050d002000102a21050c010b200128020020052000102e21050b2005450d1320012005360200200141046a2000360200200828020021000b200441046a21042003200041046a360200200520006a2009360000200a417c6a220a0d000c110b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041106a2001109101200041306a2001109101200041d0006a2001109101200041f0006a2001109101200028020421062000410c6a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d12200441017422032005200320054b1b22034100480d120240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1120012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c0f0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d112003410174220a2005200a20054b1b220a4100480d110240024020030d00200a102a21050c010b20012802002003200a102e21050b2005450d1020012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41093a0000200041086a22052d0000417f6a220341144b0d0e02400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e15000102030405060708090a0b0c0d0e0f1011121314000b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d25200341017422062004200620044b1b22064100480d250240024020030d002006102a21040c010b200128020020032006102e21040b2004450d2420012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a000020022001360200200541016a20021094022002200041306a36020020022001108a010c220b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d24200341017422052004200520044b1b22054100480d240240024020030d002005102a21040c010b200128020020032005102e21040b2004450d2320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011089010c210b02400240200628020020042802002203460d00200128020021060c010b200341016a22062003490d232003410174220a2006200a20064b1b220a4100480d230240024020030d00200a102a21060c010b20012802002003200a102e21060b2006450d2220012006360200200141046a200a360200200141086a28020021030b200141086a220a200341016a360200200620036a41023a00002000410c6a200110890120052d00012106200541026a2d0000210502400240200141046a280200200a2802002200460d00200128020021030c010b200041016a22032000490d232000410174220a2003200a20034b1b220a4100480d230240024020000d00200a102a21030c010b20012802002000200a102e21030b2003450d2220012003360200200141046a200a360200200141086a28020021000b2004200041016a360200200320006a20064100474107742005723a00000c200b02400240200628020020042802002203460d00200128020021060c010b200341016a22062003490d222003410174220a2006200a20064b1b220a4100480d220240024020030d00200a102a21060c010b20012802002003200a102e21060b2006450d2120012006360200200141046a200a360200200141086a28020021030b200141086a220a200341016a360200200620036a41033a00002000410c6a200110890120052d00012106200541026a2d0000210502400240200141046a280200200a2802002200460d00200128020021030c010b200041016a22032000490d222000410174220a2003200a20034b1b220a4100480d220240024020000d00200a102a21030c010b20012802002000200a102e21030b2003450d2120012003360200200141046a200a360200200141086a28020021000b2004200041016a360200200320006a20064100474107742005723a00000c1f0b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d212003410174220a2005200a20054b1b220a4100480d210240024020030d00200a102a21050c010b20012802002003200a102e21050b2005450d2020012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41043a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d21200341017422002006200020064b1b22004100480d210240024020030d002000102a21030c010b200128020020032000102e21030b2003450d2020012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c1e0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d20200041017422042003200420034b1b22044100480d200240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1f20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41053a000020022001360200200541016a20021094020c1d0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1f200041017422042003200420034b1b22044100480d1f0240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1e20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41063a000020022001360200200541016a20021094020c1c0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1e200041017422042003200420034b1b22044100480d1e0240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1d20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41073a000020022001360200200541016a20021094020c1b0b02400240200628020020042802002203460d002001280200210a0c010b200341016a220a2003490d1d20034101742209200a2009200a4b1b22094100480d1d0240024020030d002009102a210a0c010b200128020020032009102e210a0b200a450d1c2001200a360200200141046a2009360200200141086a28020021030b200141086a2209200341016a360200200a20036a41083a000020022001360200200541016a2002109402200028022c210a02400240200141046a2802002205200928020022036b4104490d00200128020021050c010b200341046a22092003490d1d200541017422032009200320094b1b22034100480d1d0240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1c20012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200a360000200028023021050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d1d200341017422002006200020064b1b22004100480d1d0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1c20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c1a0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1c200041017422042003200420034b1b22044100480d1c0240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41093a000020022001360200200541016a20021094020c190b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d1b200341017422052004200520044b1b22054100480d1b0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a00002000410c6a20011089010c180b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d1a2003410174220a2005200a20054b1b220a4100480d1a0240024020030d00200a102a21050c010b20012802002003200a102e21050b2005450d1920012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a410b3a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d1c200341017422002006200020064b1b22004100480d1c0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1b20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c170b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1b200041017422042003200420034b1b22044100480d1b0240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1a20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a410c3a0000200541016a20011091010c160b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1a200041017422052003200520034b1b22054100480d1a0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1920012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410d3a00000c150b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d19200041017422042003200420034b1b22044100480d190240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1820012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a410e3a0000200541016a20011091010c140b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d182000410174220a2003200a20034b1b220a4100480d180240024020000d00200a102a21030c010b20012802002000200a102e21030b2003450d1720012003360200200141046a200a360200200141086a28020021000b200141086a200041016a360200200320006a410f3a0000200541016a200110910120052d0021220041064b0d130240024002400240024002400240024020000e0700010203040506000b410021030c060b410121030c050b410221030c040b410321030c030b410421030c020b410521030c010b410621030b200220033a001402400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d18200041017422062005200620054b1b22064100480d180240024020000d002006102a21050c010b200128020020002006102e21050b2005450d1720012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a20033a00000c130b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d17200041017422052003200520034b1b22054100480d170240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1620012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41103a00000c120b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d16200041017422052003200520034b1b22054100480d160240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1520012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41113a00000c110b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d15200341017422062005200620054b1b22064100480d150240024020030d002006102a21050c010b200128020020032006102e21050b2005450d1420012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41123a0000200028020c210a200041146a28020022002001106702400240200141046a2802002205200628020022036b2000490d00200128020021050c010b200320006a22062003490d15200541017422032006200320064b1b22034100480d150240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1420012005360200200141046a2003360200200141086a28020021030b2004200320006a360200200520036a200a200010db051a0c100b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d14200341017422062005200620054b1b22064100480d140240024020030d002006102a21050c010b200128020020032006102e21050b2005450d1320012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41133a0000200028020c210a200041146a28020022002001106702400240200141046a2802002205200628020022036b2000490d00200128020021050c010b200320006a22062003490d14200541017422032006200320064b1b22034100480d140240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1320012005360200200141046a2003360200200141086a28020021030b2004200320006a360200200520036a200a200010db051a0c0f0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d13200041017422042003200420034b1b22044100480d130240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1220012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41143a000020022001360200200541016a20021094020c0e0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041046a200110e8020c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d11200341017422052004200520044b1b22054100480d110240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a0000200041046a200110e8020c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d10200341017422052004200520044b1b22054100480d100240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a00002000280208417f6a220341054b0d0b02400240024002400240024020030e06000102030405000b200241003a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d15200341017422052004200520044b1b22054100480d150240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1420012004360200200141046a2005360200200141086a28020021030b200041186a2105200141086a200341016a360200200420036a41003a0000200028020c2103200041146a28020022002001106702402000450d0020004105742100034020032001109101200341206a2103200041606a22000d000b0b2002200536020020022001108a010c100b200241013a001402400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d14200041017422042003200420034b1b22044100480d140240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1320012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c0f0b200241023a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d13200341017422052004200520044b1b22054100480d130240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011088010c0e0b200241033a001402400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d12200041017422042003200420034b1b22044100480d120240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1120012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41033a00000c0d0b200141086a2802002100200241043a0014024002402000200141046a280200460d00200128020021030c010b200041016a22032000490d11200041017422042003200420034b1b22044100480d110240024020000d002004102a21030c010b200128020020002004102e21030b2003450d1020012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41043a00000c0c0b200241053a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d10200341017422052004200520044b1b22054100480d100240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a20011088010c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410d3a0000200041046a22032d0000417f6a220441044b0d0a0240024002400240024020040e050001020304000b200241003a001402400240200141046a280200200141086a2802002200460d00200128020021040c010b200041016a22042000490d13200041017422052004200520044b1b22054100480d130240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1220012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a41003a0000200341016a20011091010c0e0b200141086a2802002100200141046a2802002104200241013a00140240024020042000460d00200128020021040c010b200041016a22042000490d12200041017422052004200520044b1b22054100480d120240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a41013a0000200341016a20011091010c0d0b200241023a001402400240200141046a280200200141086a2802002200460d00200128020021040c010b200041016a22042000490d11200041017422052004200520044b1b22054100480d110240024020000d002005102a21040c010b200128020020002005102e21040b2004450d1020012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a41023a0000200341016a2001109101200341216a20011091010c0c0b200241033a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d10200341017422052004200520044b1b22054100480d100240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a000020002802082103200041106a2802002200200110672000450d0b20004105742100034020032001109101200341206a2103200041606a22000d000c0c0b0b200141086a2802002100200241043a0014024002402000200141046a280200460d00200128020021040c010b200041016a22042000490d0f200041017422052004200520044b1b22054100480d0f0240024020000d002005102a21040c010b200128020020002005102e21040b2004450d0e20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a41043a0000200341016a20011091010c0a0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041046a20011089010c090b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410f3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200028020421062000410c6a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d0d200441017422032005200320054b1b22034100480d0d0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0c20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c200341017422052004200520044b1b22054100480d0c0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41103a00002000280208417f6a220341024b0d0702400240024020030e03000102000b200241003a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020020022001108a012000410c6a20011088010c090b200241013a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011089010c080b200241023a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c200341017422052004200520044b1b22054100480d0c0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011089010c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0b200341017422052004200520044b1b22054100480d0b0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41113a0000200041086a22042d0000417f6a220341044b0d060240024002400240024020030e050001020304000b200241003a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a200110e9020c0a0b200241013a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a200110c302200028020c2106200041146a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d0e200441017422032005200320054b1b22034100480d0e0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0d20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c090b200241023a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a20011088012002200041c0006a36020020022001108a01200041d0006a200110c30220002802302106200041386a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d0d200441017422032005200320054b1b22034100480d0d0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0c20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c080b200241033a001402400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22052003490d0c200341017422062005200620054b1b22064100480d0c0240024020030d002006102a21050c010b200128020020032006102e21050b2005450d0b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41033a00002002200041386a36020020022001108a01200041c8006a200110c30220022001360200200441016a2002109402200028022c2105200041346a28020022002001106702400240200141046a2802002204200628020022036b2000490d00200128020021040c010b200320006a22062003490d0c200441017422032006200320064b1b22034100480d0c0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2005200010db051a0c070b200141086a2802002100200241043a0014024002402000200141046a280200460d00200128020021030c010b200041016a22032000490d0b200041017422052003200520034b1b22054100480d0b0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0a20012003360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200320006a41043a0000200441016a2001109101024020042d00214101460d00200241003a001402400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d0c200041017422042003200420034b1b22044100480d0c0240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a00000c070b200241013a001402400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d0b200041017422052003200520034b1b22054100480d0b0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0a20012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a41013a0000200441226a20011091010c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a200341017422052004200520044b1b22054100480d0a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41123a00002000280204417f6a220341024b0d0502400240024020030e03000102000b200241003a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c200341017422052004200520044b1b22054100480d0c0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a000020002802082001108b010c070b200241013a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0b200341017422052004200520044b1b22054100480d0b0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a20011088010c060b200241023a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a200341017422052004200520044b1b22054100480d0a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041086a2001108801200028022c2001108b010c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41133a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d09200441017422032005200320054b1b22034100480d090240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0820012004360200200141046a2003360200200141086a28020021030b200141086a220a200341046a360200200420036a2006360000200041086a2802002106200041106a28020022032001106702400240200141046a2802002205200a28020022046b2003490d00200128020021050c010b200420036a220a2004490d0920054101742204200a2004200a4b1b22044100480d090240024020050d002004102a21050c010b200128020020052004102e21050b2005450d0820012005360200200141046a2004360200200141086a28020021040b200141086a220a200420036a360200200520046a2006200310db051a200041146a28020021052000411c6a28020022032001106702402003450d0020052003410c6c6a210c200141046a210b034020052802002109200541086a28020022032001106702400240200b2802002206200a28020022046b2003490d00200128020021060c010b200420036a22082004490d0b200641017422042008200420084b1b22044100480d0b0240024020060d002004102a21060c010b200128020020062004102e21060b2006450d0a20012006360200200b2004360200200a28020021040b200a200420036a360200200620046a2009200310db051a2005410c6a2205200c470d000b0b200041206a280200210502400240200141046a2802002204200a28020022036b4104490d00200128020021040c010b200341046a22062003490d09200441017422032006200320064b1b22034100480d090240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0820012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041246a280200210a02400240200141046a2802002204200628020022036b4104490d00200128020021040c010b200341046a22052003490d09200441017422032005200320054b1b22034100480d090240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0820012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200a360000200041286a210b4100210303402002200b20036a2d000022063a001402400240200141046a220a28020020052802002200460d00200128020021040c010b200041016a22042000490d0a200041017422092004200920044b1b22094100480d0a0240024020000d002009102a21040c010b200128020020002009102e21040b2004450d0920012004360200200a2009360200200528020021000b2005200041016a360200200420006a20063a0000200341016a220341c000470d000c050b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d08200041017422042003200420034b1b22044100480d080240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0720012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41143a0000200110e6020c030b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d07200041017422042003200420034b1b22044100480d070240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41153a0000200110e6020c020b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d06200041017422042003200420034b1b22044100480d060240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0520012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41163a0000200110e6020c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41173a00002000280204417f6a220341034b0d00024002400240024020030e0400010203000b200241003a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d08200341017422052004200520044b1b22054100480d080240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000020002802082106200041106a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d08200441017422032005200320054b1b22034100480d080240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0720012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c030b200241013a001402400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d07200041017422042003200420034b1b22044100480d070240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c020b200241023a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041086a20011088010c010b200241033a001402400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a2001108801200028022c2106200041346a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d05200441017422032005200320054b1b22034100480d050240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0420012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0b200241206a24000f0b1033000b1035000b1033000b1035000ba67b05057f037e077f037e037f230041a0036b22012400200141e0006a41186a4200370300200141e0006a41106a22024200370300200141e0006a41086a220342003703002001420037036020014180026a41086a220441e0d9c500ad4280808080f001841002220541086a29000037030020012005290000370380022005102c20032004290300370300200120012903800222063703a00220012006370360200441beb9c000ad4280808080d001841002220541086a29000037030020012005290000370380022005102c20022001290380022206370300200141f0026a41086a2003290300370300200141f0026a41106a2006370300200141f0026a41186a2004290300370300200120063703a002200120012903603703f002200141203602e4012001200141f0026a3602e00120014180026a200141f0026aad2207428080808080048422081003108d010240024020012802800222030d0041022104200141023602e4020c010b20012802840221052001200428020022043602f401200120033602f0010240024020044104490d002001200341046a3602f00120012004417c6a22093602f40120094104490d00200328000021092001200441786a3602f4012001200341086a3602f0012003280004210a200141e0006a200141f0016a10742001280260220b450d002001290264210641002104200141003a00a00202400240024020012802f401220c450d002001200c417f6a220d3602f401200120012802f001220e41016a3602f001200e2d00004101460d010b0c010b200d4104490d002001200c417b6a3602f4012001200e41056a3602f001200e280001210f410121040b2001200f3602e802200120063702dc022001200b3602d8022001200a3602d402200120093602d0020c010b200141003602b802200142013703b0022001410b3602a4022001200141e0016a3602a0022001200141b0026a36029003200141f4006a410136020020014201370264200141d0b0c2003602602001200141a0026a36027020014190036a41c49ac500200141e0006a10391a20013502b80242208620013502b002841004024020012802b402450d0020012802b002102c0b410221040b200120043602e4022005450d002003102c0b200141e0006a41106a2203200141d0026a41106a2205280200360200200141e0006a41086a2209200141d0026a41086a220a290300370300200120012903d002370360024002400240024002400240024002400240024020044102460d00200141b0026a41106a20032802002203360200200141b0026a41086a200929030022103703002001200129036022063703b00220052003360200200a2010370300200141e8026a200f360200200120063703d002200120043602e40202402006a722032000470d000240024020044101460d00200141e0026a280200220fad42287e2206422088a70d042006a72203417f4c0d0420012802d802210420012802d402210b0240024020030d004108210a0c010b2003102a220a450d090b410021050240200f450d00200f41286c210941002105200a21030340200441086a2903002106200441106a2903002110200441186a290300211120042903002112200341206a200441206a290300370300200341186a2011370300200341106a2010370300200341086a200637030020032012370300200341286a2103200541016a2105200441286a2104200941586a22090d000b0b20014180036a200b360200200141f0026a410c6a2005360200200141f0026a41086a200f3602002001200a3602f402200141003602f002200141e0006a200141f0026a108f012001418b026a200141e0006a41086a2802003600002001200129036037008302200141e0006a410c6a20014187026a290000370000200141c6a4b9da04360061200141023a00602001200129008002370065200141e0006a109001200f450d01200a102c0c010b200141e0026a280200220aad42287e2206422088a70d032006a72203417f4c0d0320012802d802210420012802d402210c0240024020030d004108210b0c010b2003102a220b450d080b02400240200a0d00410021050c010b200a41286c210941002105200b21030340200441086a2903002106200441106a2903002110200441186a290300211120042903002112200341206a200441206a290300370300200341186a2011370300200341106a2010370300200341086a200637030020032012370300200341286a2103200541016a2105200441286a2104200941586a22090d000b0b20014184036a200c36020020014180036a2005360200200141f0026a410c6a200a360200200141f0026a41086a200b3602002001200f3602f402200141013602f002200141e0006a200141f0026a108f012001418b026a200141e0006a41086a2802003600002001200129036037008302200141e0006a410c6a20014187026a290000370000200141c6a4b9da04360061200141023a00602001200129008002370065200141e0006a109001200a450d00200b102c0b20012802d00221030b024020012802d40220036a2000470d004101102a2204450d06200142013702642001200436026020014101360268200141013a00a002200441013a000020012802d8022103200141e0026a2802002204200141e0006a106702402004450d002003200441286c6a210f03402003200141e0006a109101200341206a29030021060240024020012802642205200128026822046b4108490d00200128026021050c010b200441086a22092004490d0d200541017422042009200420094b1b22044100480d0d0240024020050d002004102a21050c010b200128026020052004102e21050b2005450d092001200436026420012005360260200128026821040b2001200441086a360268200520046a2006370000200f200341286a2203470d000b0b200141d8026a21032001280264210441b5b5c000ad4280808080c00284200135026842208620012802602205ad84100102402004450d002005102c0b200141e0006a41086a22042003290000370300200141e0006a41106a2205200341086a280000360200200141003602642001410b3a006041014100200141e0006a109201200141e0006a41186a220f420037030020054200370300200442003703002001420037036020014180026a41086a220341e0d9c500ad4280808080f001841002220941086a29000037030020012009290000370380022009102c20042003290300370300200120012903800222063703a00220012006370360200341beb9c000ad4280808080d001841002220941086a29000037030020012009290000370380022009102c200141a0026a41086a20032903002206370300200120012903800222103703a00220022010370000200241086a2006370000200141f0026a41086a2004290300370300200141f0026a41106a2005290300370300200141f0026a41186a200f290300370300200120012903603703f002200810050c010b200141dc026a280200450d0020012802d802102c0b200141e0006a41186a22094200370300200141e0006a41106a220f4200370300200141e0006a41086a220342003703002001420037036020014180026a41086a220441e0d9c500ad4280808080f001841002220541086a29000037030020012005290000370380022005102c20032004290300370300200120012903800222063703a00220012006370360200441cbb9c000ad4280808080d000841002220541086a29000037030020012005290000370380022005102c200141a0026a41086a20042903002206370300200120012903800222103703a00220022010370000200241086a2006370000200141f0026a41086a2003290300370300200141f0026a41106a200f290300370300200141f0026a41186a2009290300370300200120012903603703f00220014120360284022001200141f0026a36028002200141b0026a20081003108d0120012802b0022204450d03200141b0026a41086a280200210520012802b402210941002103200141003a00a0020240024002402005450d0020042d0000220f41034b0d00024002400240200f0e0405000102050b2005417f6a4108490d0220042900012106410121030c040b410221030c020b2005417f6a4108490d0020042900012106410321030c020b200141003602d802200142013703d0022001410b3602a402200120014180026a3602a0022001200141d0026a3602f001200141f4006a410136020020014201370264200141d0b0c2003602602001200141a0026a360270200141f0016a41c49ac500200141e0006a10391a20013502d80242208620013502d002841004024020012802d402450d0020012802d002102c0b410421030b0b02402009450d002004102c0b2003417f6a220441024b0d0320040e03020301020b103a000b2006422088a7210402402006a722032000470d00200141043602f002200120043602f402200141e0006a200141f0026a108f012001418b026a200141e8006a2802003600002001200129036037008302200141ec006a20014187026a290000370000200141c6a4b9da04360061200141023a00602001200129008002370065200141e0006a1090010b200420036a2000470d01200141003602d002200141e0006a41186a22094200370300200141e0006a41106a220f4200370300200141e0006a41086a220342003703002001420037036020014180026a41086a220441e0d9c500ad4280808080f001841002220541086a29000037030020012005290000370380022005102c20032004290300370300200120012903800222063703a00220012006370360200441cbb9c000ad4280808080d000841002220541086a29000037030020012005290000370380022005102c200141a0026a41086a20042903002206370300200120012903800222103703a00220022010370000200241086a2006370000200141f0026a41086a2003290300370300200141f0026a41106a200f290300370300200141f0026a41186a2009290300370300200120012903603703f002200141e0006a200141d0026a1093012008200135026842208620012802602204ad84100102402001280264450d002004102c0b200141023602642001410b3a006041014100200141e0006a1092010c010b2006422088a7210402402006a722032000470d00200141033602f002200120043602f402200141e0006a200141f0026a108f012001418b026a200141e8006a2802003600002001200129036037008302200141ec006a20014187026a290000370000200141c6a4b9da04360061200141023a00602001200129008002370065200141e0006a1090010b200420036a2000470d00200141023602d002200141e0006a41186a22094200370300200141e0006a41106a220f4200370300200141e0006a41086a220342003703002001420037036020014180026a41086a220441e0d9c500ad4280808080f001841002220541086a29000037030020012005290000370380022005102c20032004290300370300200120012903800222063703a00220012006370360200441cbb9c000ad4280808080d000841002220541086a29000037030020012005290000370380022005102c200141a0026a41086a20042903002206370300200120012903800222103703a00220022010370000200241086a2006370000200141f0026a41086a2003290300370300200141f0026a41106a200f290300370300200141f0026a41186a2009290300370300200120012903603703f002200141e0006a200141d0026a1093012008200135026842208620012802602204ad84100102402001280264450d002004102c0b200141013602642001410b3a006041014100200141e0006a1092010b200141e0006a41186a22054200370300200141e0006a41106a220e4200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441f9e8c500ad428080808090018422101002220941086a290000370300200120092900003703e0012009102c20032004290300370300200120012903e001370360200441de99c500ad4280808080e000841002220941086a290000370300200120092900003703e0012009102c200e20012903e0012206370300200141f0026a41086a220f2003290300370300200141f0026a41106a22022006370300200141f0026a41186a22002004290300370300200120063703d002200120012903603703f002200141d8006a200141f0026a4120109401200128025c210d02402001280258220a4101470d002007428080808080048410050b20054200370300200e42003703002003420037030020014200370360200420101002220941086a290000370300200120092900003703e0012009102c20032004290300370300200120012903e00137036020044183d7c500ad4280808080b001841002220941086a290000370300200120092900003703e0012009102c200141d0026a41086a20042903002206370300200120012903e00122103703d002200e2010370000200e41086a2006370000200f20032903003703002002200e29030037030020002005290300370300200120012903603703f00202400240200141f0026a109501220441ff01714102460d0020044101710d010b4104102a2203450d0120034100360200200141e0006a41186a220f4200370300200141e0006a41106a22024200370300200141e0006a41086a2205420037030020014200370360200141e0016a41086a220441f9e8c500ad42808080809001841002220941086a290000370300200120092900003703e0012009102c20052004290300370300200120012903e001370360200441e499c500ad4280808080b001841002220941086a290000370300200120092900003703e0012009102c200141d0026a41086a20042903002206370300200120012903e00122103703d002200e2010370000200e41086a2006370000200141f0026a41086a2005290300370300200141f0026a41106a2002290300370300200141f0026a41186a200f290300370300200120012903603703f00220014100360268200142013703604101200141e0006a10672003280200210f0240024020012802642209200128026822056b4104490d00200128026021040c010b200541046a22042005490d06200941017422022004200220044b1b22024100480d060240024020090d002002102a21040c010b200128026020092002102e21040b2004450d022001200236026420012004360260200221090b2001200541046a2202360268200420056a200f3600002007428080808080048422062002ad4220862004ad84100102402009450d002004102c0b2003102c4104102a2203450d0120034100360200200141e0006a41186a220f4200370300200141e0006a41106a22024200370300200141e0006a41086a2205420037030020014200370360200141e0016a41086a220441f9e8c500ad42808080809001841002220941086a290000370300200120092900003703e0012009102c20052004290300370300200120012903e001370360200441ec9ac500ad4280808080c001841002220941086a290000370300200120092900003703e0012009102c200141d0026a41086a20042903002210370300200120012903e00122113703d002200e2011370000200e41086a2010370000200141f0026a41086a2005290300370300200141f0026a41106a2002290300370300200141f0026a41186a200f290300370300200120012903603703f00220014100360268200142013703604101200141e0006a10672003280200210f0240024020012802642209200128026822056b4104490d00200128026021040c010b200541046a22042005490d06200941017422022004200220044b1b22024100480d060240024020090d002002102a21040c010b200128026020092002102e21040b2004450d022001200236026420012004360260200221090b2001200541046a2202360268200420056a200f36000020062002ad4220862004ad84100102402009450d002004102c0b2003102c200141e0006a41186a22054200370300200141e0006a41106a22094200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441f9e8c500ad428080808090018422101002220f41086a2900003703002001200f2900003703e001200f102c20032004290300370300200120012903e001370360200441f89ac500ad4280808080e000841002220f41086a2900003703002001200f2900003703e001200f102c200141d0026a41086a220220042903002211370300200120012903e00122123703d002200e2012370000200e41086a22002011370000200141f0026a41086a220b2003290300370300200141f0026a41106a220c2009290300370300200141f0026a41186a22132005290300370300200120012903603703f002200141003602602006200141e0006aad4280808080c00084100120054200370300200942003703002003420037030020014200370360200420101002220f41086a2900003703002001200f2900003703e001200f102c20032004290300370300200120012903e00137036020044183d7c500ad4280808080b001841002220f41086a2900003703002001200f2900003703e001200f102c200220042903002210370300200120012903e00122113703d002200e201137000020002010370000200b2003290300370300200c200929030037030020132005290300370300200120012903603703f002200141013a00a0022006200141a0026aad4280808080108410010b200141e0006a41186a22054200370300200141e0006a41106a22094200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441f9e8c500ad428080808090018422061002220f41086a2900003703002001200f2900003703e001200f102c20032004290300370300200120012903e001370360200441e499c500ad4280808080b001841002220f41086a2900003703002001200f2900003703e001200f102c200141d0026a41086a220220042903002210370300200120012903e00122113703d002200e2011370000200e41086a22002010370000200141f0026a41086a220b2003290300370300200141f0026a41106a220c2009290300370300200141f0026a41186a22142005290300370300200120012903603703f002200141e0006a200141f0026a10960102400240200128026022130d004104211341002115420021110c010b20012902642211422088a721150b20054200370300200942003703002003420037030020014200370360200420061002220f41086a2900003703002001200f2900003703e001200f102c20032004290300370300200120012903e001370360200441ec9ac500ad4280808080c001841002220f41086a2900003703002001200f2900003703e001200f102c200220042903002206370300200120012903e00122103703d002200e201037000020002006370000200b2003290300370300200c200929030037030020142005290300370300200120012903603703f002200141e0006a200141f0026a109601024002402001280260220f450d002001200f3602b00220012902642210422088a7210b0c010b4104210f200141043602b0024100210b420021100b02400240024002400240200a0d002015417f6a220420154f0d01200420154b0d01201320044102746a280200210d0b201541002015419c7f6a22042004201541016a4b1b2214490d012014450d03201320144102746a210c200bad21062013210a0340200a2802002102024002400240024002402006a7220041014b0d004100210420000e020201020b4100210420002103034020042003410176220520046a22092002200f20094102746a280200491b2104200320056b220341014b0d000b0b2002200f200441027422036a2802002205460d022004200220054b6a21040c010b410021040b2001200436026041a49bc500412e200141e0006a41d49bc500103b000b20062004ad580d03200f20036a2203200341046a2004417f7320006a41027410dc051a201042ffffffff0f832000417f6a220bad422086842110200a41046a220a200c460d042006427f7c210620012802b002210f0c000b0b41fe9ac50041261054000b41dafec500411c41acfec5001036000b418ab4c000411d41acfec5001036000b201142ffffffff0f8321060240201520146b2204450d0002402014450d002013201320144102746a200441027410dc051a2010422088a7210b0b20062004ad4220868421060b20012802b002210f41002104024002400240024002400240200b41014b0d00200b0e020201020b200b2103034020042003410176220520046a2209200d200f20094102746a280200491b2104200320056b220341014b0d000b0b0240200d200f20044102746a2802002203460d002004200d20034b6a21040b200b2004490d010b200b2010a7470d02200b41016a2203200b490d07200b41017422052003200520034b1b220341ffffffff03712003470d072003410274220541004e0d010c070b41ecb3c000411e41acfec5001036000b02400240200b0d002005102a210f0c010b200f200b4102742005102e210f0b200f450d012001200f3602b0022003ad21100b200f20044102746a220341046a2003200b20046b41027410dc051a2003200d360200024020064220882211a722032006a7470d00200341016a22042003490d052011a722094101742205200420042005491b220441ffffffff03712004470d05200441027422054100480d050240024020030d002005102a21130c010b201320094102742005102e21130b2013450d012006422088a721032004ad21060b201320034102746a200d3602000240200b41016a220c0d0041e49bc50041c30041acfec5001036000b200c200c41017622044d0d0120012802b002220520044102746a280200210d0240200c4101710d00200c2004417f6a22044d0d03200520044102746a280200200d6a410176210d0b200141e0006a41186a220f4200370300200141e0006a41106a22024200370300200141e0006a41086a2205420037030020014200370360200141e0016a41086a220441f9e8c500ad42808080809001841002220941086a290000370300200120092900003703e0012009102c20052004290300370300200120012903e001370360200441e499c500ad4280808080b001841002220941086a290000370300200120092900003703e0012009102c200141d0026a41086a20042903002211370300200120012903e00122123703d002200e2012370000200e41086a2011370000200141f0026a41086a2005290300370300200141f0026a41106a2002290300370300200141f0026a41186a200f290300370300200120012903603703f0022001410036026820014201370360200341016a2215200141e0006a10670240024020150d00200128026821022001280264210f200128026021030c010b4100200128026822046b2105200341027441046a21002001280264210f2013210903402009280200210a02400240200f20056a4104490d00200128026021030c010b200441046a22032004490d07200f41017422022003200220034b1b22024100480d0702400240200f0d002002102a21030c010b2001280260200f2002102e21030b2003450d0320012002360264200120033602602002210f0b200941046a21092001200441046a2202360268200320046a200a3600002005417c6a2105200221042000417c6a22000d000b0b2006a721042007428080808080048422062002ad4220862003ad8410010240200f450d002003102c0b02402004450d002013102c0b20012802b0022113200141e0006a41186a22094200370300200141e0006a41106a220f4200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441f9e8c500ad42808080809001841002220541086a290000370300200120052900003703e0012005102c20032004290300370300200120012903e001370360200441ec9ac500ad4280808080c001841002220541086a290000370300200120052900003703e0012005102c200141d0026a41086a20042903002211370300200120012903e00122123703d002200e2012370000200e41086a2011370000200141f0026a41086a2003290300370300200141f0026a41106a200f290300370300200141f0026a41186a2009290300370300200120012903603703f0022001420137036020014100360268200c200141e0006a1067200b41027441046a21024100200128026822046b21052010a7210b2001280264210f2013210903402009280200210a02400240200f20056a4104490d00200128026021030c010b200441046a22032004490d06200f41017422002003200020034b1b22004100480d0602400240200f0d002000102a21030c010b2001280260200f2000102e21030b2003450d0220012000360264200120033602602000210f0b200941046a21092001200441046a2200360268200320046a200a3600002005417c6a2105200021042002417c6a22020d000b20062000ad4220862003ad8410010240200f450d002003102c0b0240200b450d002013102c0b200141e0006a41186a22094200370300200141e0006a41106a22034200370300200141e0006a41086a2204420037030020014200370360200141e0016a41086a220541f9e8c500ad42808080809001841002220f41086a2900003703002001200f2900003703e001200f102c20042005290300370300200120012903e001370360200541f89ac500ad4280808080e000841002220f41086a2900003703002001200f2900003703e001200f102c200141d0026a41086a20052903002210370300200120012903e00122113703d002200e2011370000200e41086a2010370000200141f0026a41086a220f2004290300370300200141f0026a41106a22022003290300370300200141f0026a41186a22002009290300370300200120012903603703f0022001200d3602602006200141e0006aad22114280808080c0008410010240201541e500470d002009420037030020034200370300200442003703002001420037036020054191b0c200ad4280808080e000841002220a41086a2900003703002001200a2900003703e001200a102c20042005290300370300200120012903e001370360200541acb0c200ad4280808080e000841002220a41086a2900003703002001200a2900003703e001200a102c200320012903e0012206370300200f20042903003703002002200637030020002005290300370300200120063703d002200120012903603703f002200141d0006a200141f0026a4120109401200d419a086a2001280254410020012802501b4b0d00200141e0006a41186a220c4200370300200141e0006a41106a220e4200370300200141e0006a41086a220a420037030020014200370360200141e0016a41086a220541e0d9c500ad4280808080f001841002220b41086a2900003703002001200b2900003703e001200b102c200a2005290300370300200120012903e001370360200541aeb5c000ad4280808080f000841002220b41086a2900003703002001200b2900003703e001200b102c200141d0026a41086a20052903002206370300200120012903e00122103703d00220032010370000200341086a2006370000200141f0026a41086a200a290300370300200141f0026a41106a200e290300370300200141f0026a41186a200c290300370300200120012903603703f0024108102a2205450d012005200d360004200541e400360000200742808080808004842005ad428080808080018410012005102c0b2009420037030020034200370300200442003703002001420037036020014180026a41086a22054196e0c500ad4280808080f0008422101002220941086a29000037030020012009290000370380022009102c20042005290300370300200120012903800222063703d00220012006370360200541e6f8c200ad4280808080f0018422121002220941086a29000037030020012009290000370380022009102c20032001290380022206370300200f20042903003703002002200637030020002005290300370300200120063703d002200120012903603703f002200141c8006a200141f0026a4120410141004100109701024020012802484101460d00200141e0006a41186a220f4200370300200141e0006a41106a22094200370300200141e0006a41086a220542003703002001420037036020014180026a41086a220441f9e8c500ad42808080809001841002220241086a29000037030020012002290000370380022002102c2005200429030037030020012001290380023703602004419db1c200ad428080808030841002220241086a29000037030020012002290000370380022002102c20092001290380022206370300200141f0026a41086a22002005290300370300200141f0026a41106a220a2006370300200141f0026a41186a220b2004290300370300200120063703d002200120012903603703f002200141386a200141f0026a109801200129034021062001280238210c200f4200370300200942003703002005420037030020014200370360200420101002220241086a29000037030020012002290000370380022002102c20052004290300370300200120012903800222103703d00220012010370360200420121002220241086a29000037030020012002290000370380022002102c200141d0026a41086a20042903002210370300200120012903800222123703d00220032012370000200341086a201037000020002005290300370300200a2009290300370300200b200f290300370300200120012903603703f002200120064200200c1b370360200742808080808004842011428080808080018410010b200141e0006a41186a22024200370300200141e0006a41106a22034200370300200141e0006a41086a2205420037030020014200370360200141f0016a41086a2204418be9c500ad42808080808001841002220941086a290000370300200120092900003703f0012009102c20052004290300370300200120012903f00122063703d0022001200637036020044193e9c500ad42808080809002841002220941086a290000370300200120092900003703f0012009102c200320012903f0012206370300200141f0026a41086a2005290300370300200141f0026a41106a2006370300200141f0026a41186a2004290300370300200120063703d002200120012903603703f002200141286a200141f0026a109801200129033021102001280228210020014180026a41186a420037030020014180026a41106a220a420037030020014180026a41086a22094200370300200142003703800220044191b0c200ad4280808080e000841002220f41086a2900003703002001200f2900003703f001200f102c20092004290300370300200120012903f00137038002200441e0c2c200ad4280808080b002841002220f41086a2900003703002001200f2900003703f001200f102c200a20012903f0012206370300200520092903003703002003200637030020022004290300370300200120063703a0022001200129038002370360200141206a200141e0006a4120109401200141106a2001280224410020012802201b22044180e59af70020044180e59af7004b22051b4180e59af700200420051b6bad220642002006420010e005200642a8c3018021122010420020001b210642092001290310221042808090bbbad6adf00d7f20012903182010423f87521b211002400240200441ffe49af7004b0d0042ffffffffffffffffff00428080808080808080807f2006201220107d22127d22104200531b20102006427f5522042012427f554720042010427f5547711b22064280ec94a37c20064280ec94a37c551b21060c010b42ffffffffffffffffff00428080808080808080807f2006201220107c22127c22104200531b20102006427f5522042012427f554620042010427f5547711b21060b200141e0006a41186a22094200370300200141e0006a41106a22054200370300200141e0006a41086a2204420037030020014200370360200141f0016a41086a220f418be9c500ad42808080808001841002220241086a290000370300200120022900003703f0012002102c2004200f290300370300200120012903f00122103703d00220012010370360200f4193e9c500ad42808080809002841002220241086a290000370300200120022900003703f0012002102c200141d0026a41086a200f2903002210370300200120012903f00122123703d00220032012370000200341086a2010370000200141f0026a41086a220f2004290300370300200141f0026a41106a22022005290300370300200141f0026a41186a22002009290300370300200120012903603703f0022001200637036020074280808080800484220620114280808080800184100120094200370300200542003703002004420037030020014200370360200141a0026a41086a220341a4c6c500ad4280808080a0018422121002220a41086a2900003703002001200a2900003703a002200a102c20042003290300370300200120012903a00222103703d00220012010370360200341baecc100ad4280808080e000841002220a41086a2900003703002001200a2900003703a002200a102c200520012903a0022210370300200f20042903003703002002201037030020002003290300370300200120103703d002200120012903603703f0022006100520094200370300200542003703002004420037030020014200370360200320121002220a41086a2900003703002001200a2900003703a002200a102c20042003290300370300200120012903a00222103703d00220012010370360200341aec6c500ad4280808080c001841002220a41086a2900003703002001200a2900003703a002200a102c200920032903002210370300200f2004290300370300200220012903a002221237030020002010370300200120123703d002200120012903603703f0022006100520094200370300200542003703002004420037030020014200370360200141e0016a41086a220341f9e8c500ad42808080809001841002220941086a290000370300200120092900003703e0012009102c20042003290300370300200120012903e00137036020034182e9c500ad42808080809001841002220941086a290000370300200120092900003703e0012009102c200520012903e0012210370300200f200429030037030020022010370300200020032903003703002001201037038002200120012903603703f002200141f0026a109501220441ff01714102460d03200610052004410171450d03200141e0006a41186a4200370300200141e0006a41106a22094200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441bac6c500ad4280808080c000841002220541086a290000370300200120052900003703e0012005102c20032004290300370300200120012903e0012206370380022001200637036020044183d7c500ad4280808080b001841002220541086a290000370300200120052900003703e0012005102c200920012903e0012206370300200141f0026a41086a2003290300370300200141f0026a41106a2006370300200141f0026a41186a2004290300370300200120063703a002200120012903603703f002200141e0006a200141f0026a109901024020012d006022044102460d00200742808080808004841005200141b0026a41086a200141e9006a290000370300200141b0026a41106a200141f1006a290000370300200141b0026a41186a200141f9006a290000370300200120012900613703b0020240200441037122044103460d0020040e03010001010b200141d0026a41186a200141b0026a41186a290300370300200141d0026a41106a200141b0026a41106a290300370300200141d0026a41086a200141b0026a41086a290300370300200120012903b0023703d002200141e0006a41186a22054200370300200141e0006a41106a220f4200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441bac6c500ad4280808080c0008422061002220241086a290000370300200120022900003703e0012002102c20032004290300370300200120012903e0012210370380022001201037036020044181c7c500ad4280808080c001841002220241086a290000370300200120022900003703e0012002102c200141a0026a41086a220220042903002210370300200120012903e00122123703a00220092012370000200941086a2010370000200141f0026a41086a2003290300370300200141f0026a41106a200f290300370300200141f0026a41186a2005290300370300200120012903603703f002200141086a200141f0026a4120109401200128020c210a2001280208210b200420061002220041086a290000370300200120002900003703e0012000102c200141f0016a41086a220c2004290300370300200120012903e0013703f0012004418dc7c500ad42808080809002841002220041086a290000370300200120002900003703e0012000102c20022004290300370300200120012903e0013703a0022001200a4100200b1b22003602f00220014180026a41186a220a20074280808080c000841006220441186a29000037030020014180026a41106a220b200441106a29000037030020014180026a41086a220e200441086a29000037030020012004290000370380022004102c2005200a290300370300200f200b2903003703002003200e290300370300200120012903800237036041c000102a2204450d01200420012903f001370000200441086a200c290300370000200420012903a002370010200441186a200229030037000020042001290360370020200441286a2003290300370000200441306a200f290300370000200441386a2005290300370000200141e0006a200441c000109a010240024020012802602203450d002001200129026422063702940320012003360290032006422088a721052006a7210f0c010b4100210520014100360298032001420137039003410121034100210f0b2004102c024002402005418002490d004120102a2203450d03200320012903d002370000200341186a200141d0026a41186a290300370000200341106a200141d0026a41106a290300370000200341086a200141d0026a41086a290300370000200141e0016a41086a220441bac6c500ad4280808080c000841002220541086a290000370300200120052900003703e0012005102c200141f0016a41086a220f2004290300370300200120012903e0013703f0012004418dc7c500ad42808080809002841002220541086a290000370300200120052900003703e0012005102c200141a0026a41086a22052004290300370300200120012903e0013703a0022001200041016a22023602f00220014180026a41186a220020074280808080c000841006220441186a29000037030020014180026a41106a220a200441106a29000037030020014180026a41086a220b200441086a29000037030020012004290000370380022004102c200141e0006a41186a220c2000290300370300200141e0006a41106a2200200a290300370300200141e0006a41086a220a200b290300370300200120012903800237036041c000102a2204450d03200420012903f001370000200441086a200f290300370000200420012903a002370010200441186a200529030037000020042001290360370020200441286a200a290300370000200441306a2000290300370000200441386a200c290300370000200141e0006a20034101109b012004ad4280808080800884200135026842208620012802602205ad84100102402001280264450d002005102c0b2004102c2003102c200141e0006a41186a220f4200370300200141e0006a41106a22004200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441bac6c500ad4280808080c000841002220541086a290000370300200120052900003703e0012005102c20032004290300370300200120012903e0012206370380022001200637036020044181c7c500ad4280808080c001841002220541086a290000370300200120052900003703e0012005102c200141a0026a41086a20042903002206370300200120012903e00122103703a00220092010370000200941086a2006370000200141f0026a41086a2003290300370300200141f0026a41106a2000290300370300200141f0026a41186a200f290300370300200120012903603703f002200120023602602007428080808080048420114280808080c0008410010c010b200141e0006a41186a2209200141d0026a41186a290300370300200141e0006a41106a2202200141d0026a41106a290300370300200141e0006a41086a220a200141d0026a41086a290300370300200120012903d00237036002402005200f470d00200f41016a2204200f490d07200f410174220b2004200b20044b1b220441ffffff3f712004470d072004410574220b4100480d0702400240200f0d00200b102a21030c010b2003200f410574200b102e21030b2003450d03200120043602940320012003360290030b200320054105746a22042001290360370000200441186a2009290300370000200441106a2002290300370000200441086a200a2903003700002001200541016a220f36029803200141e0016a41086a220441bac6c500ad4280808080c000841002220541086a290000370300200120052900003703e0012005102c200141f0016a41086a2004290300370300200120012903e0013703f0012004418dc7c500ad42808080809002841002220541086a290000370300200120052900003703e0012005102c200141a0026a41086a2004290300370300200120012903e0013703a002200120003602f00220014180026a41186a220520074280808080c000841006220441186a29000037030020014180026a41106a2200200441106a29000037030020014180026a41086a220b200441086a29000037030020012004290000370380022004102c2009200529030037030020022000290300370300200a200b290300370300200120012903800237036041c000102a2204450d02200420012903f001370000200441086a200141f0016a41086a290300370000200420012903a002370010200441186a200141a0026a41086a29030037000020042001290360370020200441286a200141e0006a41086a290300370000200441306a200141f0006a290300370000200441386a200141e0006a41186a290300370000200141e0006a2003200f109b012004ad4280808080800884200135026842208620012802602203ad84100102402001280264450d002003102c0b2004102c0b200128029403450d00200128029003102c0b200141a0036a24000f0b1033000b41d087c6002004200c1038000b41d087c6002004200c1038000b41f2b0c200412b41acfec5001036000b1035000ba60101047f230041206b2202240020022001a7220336020820022001422088a7220436020c02402004450d0020032d0000210520022004417f6a36020c2002200341016a360208200541014b0d00410021030240024020050e020100010b200241106a200241086a107720022802102203450d01200229021421010b2000200137020420002003360200200241206a24000f0b41d88bc600412e200241106a41888cc600103b000bbd0101047f230041106b22022400200028020421032000280200210041012104200128021841d1afc00041012001411c6a28020028020c1100002105200241003a0005200220053a00042002200136020002402003450d0003402002200036020c20022002410c6a41dc9ac50010621a200041016a21002003417f6a22030d000b20022d000421050b0240200541ff01710d002002280200220028021841d2afc00041012000411c6a28020028020c11000021040b200241106a240020040be40c03047f017e027f230041106b2202240020024100360208200242013703000240024002402001280200220341044b0d000240024002400240024020030e050001020304000b4101102a2203450d05200242818080801037020420022003360200200341013a0000200128020421042001410c6a28020022032002106702402003450d002004200341286c6a2105034020042002109101200441206a29030021060240024020022802042207200228020822036b4108490d00200228020021070c010b200341086a22082003490d09200741017422032008200320084b1b22034100480d090240024020070d002003102a21070c010b200228020020072003102e21070b2007450d082002200336020420022007360200200228020821030b2002200341086a360208200720036a20063700002005200441286a2204470d000b0b200141106a28020021070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d07200441017422032008200320084b1b22034100480d070240024020040d002003102a21040c010b200228020020042003102e21040b2004450d062002200336020420022004360200200228020821030b2002200341046a360208200420036a20073600000c040b4101102a2203450d04200242818080801037020420022003360200200341023a0000200128020421070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d06200441017422052008200520084b1b22084100480d060240024020040d002008102a21040c010b200228020020042008102e21040b2004450d0520022008360204200220043602000b2002200341046a360208200420036a200736000020012802082104200141106a28020022032002106702402003450d002004200341286c6a2105034020042002109101200441206a29030021060240024020022802042207200228020822036b4108490d00200228020021070c010b200341086a22082003490d08200741017422032008200320084b1b22034100480d080240024020070d002003102a21070c010b200228020020072003102e21070b2007450d072002200336020420022007360200200228020821030b2002200341086a360208200720036a20063700002005200441286a2204470d000b0b200141146a28020021070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d06200441017422032008200320084b1b22034100480d060240024020040d002003102a21040c010b200228020020042003102e21040b2004450d052002200336020420022004360200200228020821030b2002200341046a360208200420036a20073600000c030b4101102a2203450d03200242818080801037020420022003360200200341033a0000200141086a29030021060240024020022802042207200228020822036b4108490d00200341086a2104200228020021070c010b200341086a22042003490d05200741017422082004200820044b1b22084100480d050240024020070d002008102a21070c010b200228020020072008102e21070b2007450d0420022008360204200220073602000b20022004360208200720036a20063700000c020b4101102a2203450d02200242818080801037020420022003360200200341043a0000200128020421070240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22082003490d04200441017422012008200120084b1b22084100480d040240024020040d002008102a21040c010b200228020020042008102e21040b2004450d0320022008360204200220043602000b2002200341046a360208200420036a20073600000c010b4101102a2203450d01200242818080801037020420022003360200200341053a0000200128020421080240024020022802042207200228020822036b4104490d00200341046a2104200228020021070c010b200341046a22042003490d03200741017422012004200120044b1b22014100480d030240024020070d002001102a21070c010b200228020020072001102e21070b2007450d0220022001360204200220073602000b20022004360208200720036a20083600000b20002002290300370200200041086a200241086a280200360200200241106a24000f0b1033000b1035000beb0807017f017e057f017e017f017e027f230041f0006b2201240042002102200141386a41186a22034200370300200141386a41106a22044200370300200141386a41086a2205420037030020014200370338200141e0006a41086a22064191b0c200ad4280808080e000841002220741086a290000370300200120072900003703602007102c2005200629030037030020012001290360220837032820012008370338200641cab0c200ad4280808080e000841002220741086a290000370300200120072900003703602007102c200420012903602208370300200141086a41086a2005290300370300200141086a41106a2008370300200141086a41186a20062903003703002001200837032820012001290338370308200141386a200141086a10e40202400240200128023822070d004104210741002106410021090c010b200129023c2202422088a721062002a721090b200141386a41206a200041206a2802003602002003200041186a2902003703002004200041106a2902003703002005200041086a2902003703002001200029020037033802400240024020062009470d00024020062002a7470d00200641016a22002006490d03200641017422052000200520004b1bad220842247e220a422088a70d03200aa722004100480d030240024020060d002000102a21070c010b2007200641246c2000102e21070b2007450d0220024280808080708320088421020b2002422088a721060b2007200641246c220b6a22002001290338370200200041206a200141386a41206a280200360200200041186a200141386a41186a2203290300370200200041106a200141386a41106a2209290300370200200041086a200141386a41086a220029030037020020034200370300200942003703002000420037030020014200370338200141e0006a41086a22054191b0c200ad4280808080e000841002220c41086a2900003703002001200c290000370360200c102c2000200529030037030020012001290360220837032820012008370338200541cab0c200ad4280808080e000841002220c41086a2900003703002001200c290000370360200c102c200141286a41086a2005290300220837030020012001290360220a3703282004200a370000200441086a2008370000200141086a41086a2000290300370300200141086a41106a2009290300370300200141086a41186a2003290300370300200120012903383703082001412036023c2001200141086a3602382007200641016a2200200141386a10da03024020002006490d00200b41246a21002007210603400240024020062d0000220441034b0d0002400240024020040e0404000102040b2006410c6a280200450d03200641086a280200102c0c030b2006410c6a280200450d02200641086a280200102c0c020b2006410c6a280200450d01200641086a280200102c0c010b200641086a280200450d00200641046a280200102c0b200641246a21062000415c6a22000d000b0b02402002a7450d002007102c0b200141f0006a24000f0b1033000b1035000bdb2601067f20002d000021020240024002400240200141046a2203280200200141086a22042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0001210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0002210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0003210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0004210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0005210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0006210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0007210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0008210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0009210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000a210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000b210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000c210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000d210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000e210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000f210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0010210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0011210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0012210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0013210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0014210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0015210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0016210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0017210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0018210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0019210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001a210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001b210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001c210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001d210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001e210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001f210502400240200328020020042802002200460d00200128020021030c010b200041016a22032000490d02200041017422062003200620034b1b22064100480d020240024020000d002006102a21030c010b200128020020002006102e21030b2003450d0120012003360200200141046a2006360200200141086a28020021000b2004200041016a360200200320006a20053a00000f0b1033000b1035000be32303087f037e097f23004180046b22032400200341186a4181b0c2004110109401200328021c21042003280218210541012106410021074100210802400240024002402001450d00200141057422074100480d022007102a2206450d012001410574220941606a410576210a20062107200021080340200841086a290000210b200841106a290000210c200841186a290000210d20072008290000370000200741186a200d370000200741106a200c370000200741086a200b370000200741206a2107200841206a2108200941606a22090d000b200a41016a2108200121070b200341a4016a200436020020032005453602a001200341206a200241800110db051a200341b0016a2008360200200341ac016a2007360200200320063602a80120034180036a41186a2206420037030020034180036a41106a2209420037030020034180036a41086a220842003703002003420037038003200341e0036a41086a22074191b0c200ad4280808080e00084220c1002220241086a290000370300200320022900003703e0032002102c20082007290300370300200320032903e003220b3703f0022003200b37038003200741e4c4c200ad4280808080a00184220d1002220241086a290000370300200320022900003703e0032002102c200920032903e003220b370300200341d0026a41086a22022008290300370300200341d0026a41106a200b370300200341d0026a41186a220420072903003703002003200b3703c80320032003290380033703d002200341106a200341d0026a412010940102400240024002400240024002400240024002402003280214410020032802101b220541016a220e2005490d002006420037030020034180036a41106a220a42003703002008420037030020034200370380032007200c1002220f41086a2900003703002003200f2900003703e003200f102c20082007290300370300200320032903e003220b3703f0022003200b370380032007200d1002220f41086a2900003703002003200f2900003703e003200f102c200341c8036a41086a220f2007290300220b370300200320032903e003220d3703c8032009200d370000200941086a2210200b37000020022008290300370300200341d0026a41106a2211200a2903003703002004200629030037030020032003290380033703d0022003200e3602b801200341d0026aad4280808080800484220b200341b8016aad4280808080c000841001200341b8016a200341206a41980110db051a20064200370300200a42003703002008420037030020034200370380032007200c1002220e41086a2900003703002003200e2900003703e003200e102c20082007290300370300200320032903e003220c3703f0022003200c37038003200741fdb1c200ad4280808080e000841002220e41086a2900003703002003200e2900003703e003200e102c200f2007290300220c370300200320032903e003220d3703c8032009200d3700002010200c370000200220082903003703002011200a2903003703002004200629030037030020032003290380033703d002200341c8036a200b1003108d010240024020032802c803450d00200341a0036a41086a200341c8036a41086a280200360200200320032903c8033703a0030c010b200341003602e803200342083703e00320034100360288032003420137038003410020034180036a1067200341a8036a20032802880336020020032003290380033703a003200341e0036a107d0b200341b0036a41086a200341a0036a41086a2802002207360200200320032903a0033703b003024002402007450d0020034180036a20032802b0032007410110db032003280280034101470d0120032802b403450d0920032802b003102c0c090b4101200341b0036a1067200341b8016a200341b0036a10dc030c060b200328028403210202402003418c036a280200220720034180036a41086a2802002208460d0020032802b803200720086b6a220641046a2204417f4c0d0d0240024020040d004101210a0c010b2004102a220a450d0c0b200320043602f4022003200a3602f002200320063602f8022003200341f0026a36028003200220034180036a200710c80220062007490d0220032802f80222022006490d0320032802b80322022008490d0420032802f002210420032802b003210a2003200620076b22063602c0032003200220086b22023602c40320062002470d05200420076a200a20086a200610db051a200341b8016a200341f0026a10dc0320032802f802210820032802f402210620032802f002210720032802b403450d0720032802b003102c0c070b2003200341b0036a36028003200220034180036a200810c802200341b8016a200341b0036a10dc030c050b200341206a10dd030c080b200720061047000b20062002103f000b200820021047000b200341e0036a41146a4109360200200341ec036a410c360200200341c8036a41146a4103360200200342033702cc03200341ec9fc6003602c8032003410c3602e4032003200341c0036a3602f8032003200341c4036a3602fc0320034204370390032003420137028403200341c0a0c600360280032003200341e0036a3602d803200320034180036a3602f0032003200341fc036a3602e8032003200341f8036a3602e003200341c8036a41fca0c6001041000b20032802b803210820032802b403210620032802b00321070b20070d010b200341b8016a10dd030c010b200b2008ad4220862007ad84100102402006450d002007102c0b200341b8016a10dd0320034180036a41186a2202420037030020034180036a41106a2204420037030020034180036a41086a220642003703002003420037038003200341e0036a41086a22084191b0c200ad4280808080e00084220c1002220741086a290000370300200320072900003703e0032007102c20062008290300370300200320032903e003220b3703f0022003200b37038003200841acb0c200ad4280808080e000841002220741086a290000370300200320072900003703e0032007102c200341c8036a41086a220a2008290300220b370300200320032903e003220d3703c8032009200d370000200941086a200b370000200341d0026a41086a22112006290300370300200341d0026a41106a22122004290300370300200341d0026a41186a2213200229030037030020032003290380033703d002200341086a200341d0026a41201094012001450d00200328020c410020032802081b21142001410574211003402008200c1002220741086a290000370300200320072900003703e0032007102c200341f0026a41086a22092008290300370300200320032903e0033703f00220084183b2c200ad4280808080b001841002220741086a290000370300200320072900003703e0032007102c200a2008290300370300200320032903e0033703c803200341b8016a41186a220142011006220741186a290000370300200341b8016a41106a220e200741106a290000370300200341b8016a41086a220f200741086a290000370300200320072900003703b8012007102c200220012903003703002004200e2903003703002006200f290300370300200320032903b8013703800341c000102a2207450d02200720032903f002370000200720032903c8033700102007200329038003370020200741086a2009290300370000200741186a200a290300370000200741286a2006290300370000200741306a2004290300370000200741386a2002290300370000200341d0026a2000109f01200741c000418001102e2207450d02200720032903d002370040200741d8006a2013290300370000200741d0006a2012290300370000200741c8006a201129030037000020034180036a2007ad4280808080800c84220b1003108d01024002402003280280032201450d002003280288032109200328028403210e0c010b200341003602c001200342013703b8014100200341b8016a106720032802c001210920032802bc01210e20032802b80121010b200320093602d0032003200e3602cc03200320013602c8030240024002400240024002400240024002400240024002402009450d00200341b8016a20012009410110db0320032802b8014101460d0420032802bc01210f20032802c401220920032802c0012201460d0320032802d003200920016b6a220e41046a2215417f4c0d1020150d01410121160c020b4101200341c8036a10670240024020032802cc03220120032802d00322096b4104490d0020032802c80321010c010b200941046a220e2009490d0f20014101742209200e2009200e4b1b22094100480d0f0240024020010d002009102a21010c010b20032802c80320012009102e21010b2001450d0e200320093602cc03200320013602c80320032802d00321090b2003200941046a3602d003200120096a20143600000240024020032802cc03220120032802d00322096b4104490d0020032802c80321010c010b200941046a220e2009490d0f20014101742209200e2009200e4b1b22094100480d0f0240024020010d002009102a21010c010b20032802c80320012009102e21010b2001450d0e200320093602cc03200320013602c80320032802d00321090b2003200941046a3602d003200120096a20053600000c080b2015102a2216450d0c0b200320153602d402200320163602d0022003200e3602d8022003200341d0026a3602b801200f200341b8016a200910c802200e2009490d0220032802d802220f200e490d0320032802d003220f2001490d0420032802d002211520032802c80321162003200e20096b220e3602fc032003200f20016b220f3602a003200e200f470d05201520096a201620016a200e10db051a0240024020032802d402220120032802d80222096b4104490d0020032802d00221010c010b200941046a220e2009490d0d20014101742209200e2009200e4b1b22094100480d0d0240024020010d002009102a21010c010b20032802d00220012009102e21010b2001450d0c200320093602d402200320013602d00220032802d80221090b2003200941046a3602d802200120096a20143600000240024020032802d402220120032802d80222096b4104490d0020032802d00221010c010b200941046a220e2009490d0d20014101742209200e2009200e4b1b22094100480d0d0240024020010d002009102a21010c010b20032802d00220012009102e21010b2001450d0c200320093602d402200320013602d00220032802d80221090b2003200941046a3602d802200120096a200536000020032802d802210120032802d402210e20032802d002210920032802cc03450d0720032802c803102c0c070b2003200341c8036a3602b801200f200341b8016a200110c8020240024020032802cc03220120032802d00322096b4104490d0020032802c80321010c010b200941046a220e2009490d0c20014101742209200e2009200e4b1b22094100480d0c0240024020010d002009102a21010c010b20032802c80320012009102e21010b2001450d0b200320093602cc03200320013602c80320032802d00321090b2003200941046a3602d003200120096a20143600000240024020032802cc03220120032802d00322096b4104490d0020032802c80321010c010b200941046a220e2009490d0c20014101742209200e2009200e4b1b22094100480d0c0240024020010d002009102a21010c010b20032802c80320012009102e21010b2001450d0b200320093602cc03200320013602c80320032802d00321090b2003200941046a3602d003200120096a20053600000c050b20032802cc03450d0620032802c803102c0c060b2009200e1047000b200e200f103f000b2001200f1047000b200341e0036a41146a4109360200200341ec036a410c36020020034180036a41146a41033602002003420337028403200341ec9fc600360280032003410c3602e4032003200341fc036a3602b0032003200341a0036a3602f002200342043703c801200342013702bc01200341c0a0c6003602b8012003200341e0036a360290032003200341b8016a3602f0032003200341f0026a3602e8032003200341b0036a3602e00320034180036a41fca0c6001041000b20032802d003210120032802cc03210e20032802c80321090b2009450d00200b2001ad4220862009ad8410010240200e450d002009102c0b200041206a21002007102c201041606a22100d010c020b0b2007102c0b20034180046a24000f0b1033000b1035000b103a000b8c0201037f024002400240024002400240024020012802000e0400010203000b410121024101102a2201450d05200141003a0000410121030c040b4101102a2202450d04200241013a000020012802042103200241014105102e2202450d042002200336000120012802082104410a210320024105410a102e2201450d04200120043600050c020b410121024101102a2201450d03200141023a0000410121030c020b4101102a2202450d02200241033a000020012802042103200241014105102e2202450d022002200336000120012802082104410a210320024105410a102e2201450d02200120043600050b410921020b2000200236020820002003360204200020013602000f0b1033000b8f0201037f230041d0006b220324002003200236020420032001360200200341086a2002ad4220862001ad841003108d0102400240200328020822040d00410021010c010b200328020c210502400240200341106a2802004104490d0020042800002102410121010c010b4100210120034100360220200342013703182003410b36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341d0b0c2003602382003200341286a360248200341346a41c49ac500200341386a10391a200335022042208620033502188410040240200328021c450d002003280218102c0b0b2005450d002004102c0b2000200236020420002001360200200341d0006a24000b950201047f230041d0006b220124002001412036020420012000360200200141086a2000ad42808080808004841003108d0102400240200128020822020d00410221000c010b200128020c210302400240200141106a280200450d0020022d0000220441014b0d0041002100024020040e020200020b410121000c010b20014100360220200142013703182001410b36022c200120013602282001200141186a360234200141cc006a41013602002001420137023c200141d0b0c2003602382001200141286a360248200141346a41c49ac500200141386a10391a200135022042208620013502188410040240200128021c450d002001280218102c0b410221000b2003450d002002102c0b200141d0006a240020000bbc0201027f230041e0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a107e024002402002280248450d0020002002290348370200200041086a200241c8006a41086a2802003602000c010b20024100360230200242013703282002410b36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241d0b0c2003602482002200241386a360258200241c4006a41c49ac500200241c8006a10391a2002350230422086200235022884100420004100360200200228022c450d002002280228102c0b2003450d002001102c0b200241e0006a24000b940102017f017e230041106b2206240002402002ad4220862001ad842004ad4220862003ad84200510282207422088a72203450d002007a722042d0000220241014b0d00410021050240024020020e020100010b2003417f6a4104490d0120042800012101410121050b2000200136020420002005360200200641106a24000f0b41d88bc600412e200641086a41888cc600103b000b990204017f017e017f017e230041d0006b220224002002412036020420022001360200200241086a2001ad42808080808004841003108d0102400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004108490d0020012900002105420121030c010b20024100360220200242013703182002410b36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241d0b0c2003602382002200241286a360248200241346a41c49ac500200241386a10391a200235022042208620023502188410040240200228021c450d002002280218102c0b420021030b2004450d002001102c0b2000200537030820002003370300200241d0006a24000bd80402067f047e230041f0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022030d00200041023a00000c010b2002280214210402400240200241186a2802002205450d0020032d0000220641014b0d00410021010240024020060e020100010b41002101200241003a0068200341016a21072005417f6a21060340024020062001470d00200141ff0171450d03200241003a00680c030b200241c8006a20016a200720016a2d00003a00002002200141016a22053a00682005210120054120470d000b200241206a41186a200241c8006a41186a290300370300200241206a41106a200241c8006a41106a290300370300200241206a41086a200241c8006a41086a29030037030020022002290348370320410121010b200241c8006a41186a200241206a41186a2903002208370300200241c8006a41106a200241206a41106a2903002209370300200241c8006a41086a200241206a41086a290300220a37030020022002290320220b370348200041196a2008370000200041116a2009370000200041096a200a3700002000200b3700010c010b20024100360228200242013703202002410b3602442002200241086a3602402002200241206a36026c200241dc006a41013602002002420137024c200241d0b0c2003602482002200241c0006a360258200241ec006a41c49ac500200241c8006a10391a2002350228422086200235022084100402402002280224450d002002280220102c0b410221010b200020013a00002004450d002003102c0b200241f0006a24000bdf06010c7f23004190016b220324002003200236021420032001360210200341186a2002ad4220862001ad841003108d0102400240200328021822040d00200041003602000c010b200328021c21052003200341206a28020036023c20032004360238200341086a200341386a1075024002400240024020032802080d0002400240200328023c22014160712202417f4c0d00200328020c210602400240200141057622070d00410121080c010b2002102a2208450d020b02402006450d004100210903402001210a200341003a0088012009220b41016a2109410021010240024002400340200a2001460d01200341e8006a20016a200328023822022d00003a00002003200241016a3602382003200141016a22023a0088012002210120024120470d000b200341c8006a41186a220c200341e8006a41186a290300370300200341c8006a41106a220d200341e8006a41106a290300370300200341c8006a41086a220e200341e8006a41086a290300370300200320032903683703482007200b470d020240200b41017422012009200120094b1b220741ffffff3f712007470d002007410574220141004e0d020b1035000b2003410036023c0240200141ff0171450d00200341003a0088010b200341003602282007450d072008102c0c070b02400240200b0d002001102a21080c010b2008200b4105742001102e21080b2008450d040b200a20026b21012008200b4105746a220b2003290348370000200b41186a200c290300370000200b41106a200d290300370000200b41086a200e29030037000020092006470d000b200341306a20063602002003200736022c200320083602282003200a20026b36023c0c050b200341306a20063602002003200736022c2003200836022820080d040c030b103a000b1033000b200341003602280b20034100360250200342013703482003410b36022c2003200341106a3602282003200341c8006a360244200341fc006a41013602002003420137026c200341d0b0c2003602682003200341286a360278200341c4006a41c49ac500200341e8006a10391a2003350250422086200335024884100420004100360200200328024c450d012003280248102c0c010b20002003290328370200200041086a200341286a41086a2802003602000b2005450d002004102c0b20034190016a24000bed2401057f230041106b2203240020034100360208200342013703002002200310670240024002402002450d00200120024105746a2104034020012d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141016a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141026a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141036a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141046a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141056a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141066a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141076a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141086a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141096a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001410a6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001410b6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001410c6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001410d6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001410e6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001410f6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141106a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141116a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141126a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141136a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141146a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141156a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141166a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141176a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141186a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141196a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001411a6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001411b6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001411c6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001411d6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001411e6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a00002001411f6a2d0000210502400240200328020420032802082202460d00200328020021060c010b200241016a22062002490d04200241017422072006200720064b1b22074100480d040240024020020d002007102a21060c010b200328020020022007102e21060b2006450d0320032007360204200320063602000b2003200241016a360208200620026a20053a0000200141206a22012004470d000b0b20002003290300370200200041086a200341086a280200360200200341106a24000f0b1033000b1035000b9a0808017f027e037f017e017f027e047f037e23004190016b22032400200341206a200020012002109d01200341206a41086a290300210420032903202105200341d0006a41186a22064200370300200341d0006a41106a22074200370300200341d0006a41086a220842003703002003420037035020034180016a41086a2200418be9c500ad428080808080018422091002220a41086a2900003703002003200a29000037038001200a102c200820002903003703002003200329038001220b3703702003200b370350200041c9b5c000ad4280808080d00184220c1002220a41086a2900003703002003200a29000037038001200a102c2007200329038001220b370300200341306a41086a220a2008290300370300200341306a41106a220d200b370300200341306a41186a220e20002903003703002003200b37037020032003290350370330200341086a200341306a4120109e01200120057d200520017d200520015820042002582004200251220f1b22101b2111200220047d2001200554ad7d200420027d2005200154ad7d20101b2112200341086a41106a2903004200200328020822101b210b2003290310420020101b21130240024020052001562004200256200f1b0d0020064200370300200742003703002008420037030020034200370350200020091002220f41086a2900003703002003200f29000037038001200f102c2008200029030037030020032003290380012201370370200320013703502000200c1002220f41086a2900003703002003200f29000037038001200f102c200341f0006a41086a200029030022013703002003200329038001220237037020072002370000200741086a2001370000200a2008290300370300200d2007290300370300200e20062903003703002003200329035037033020034200200b20127d2013201154ad7d2201201320117d22022013562001200b562001200b511b22001b37035820034200200220001b370350200341d0006a21000c010b20064200370300200742003703002008420037030020034200370350200020091002220f41086a2900003703002003200f29000037038001200f102c2008200029030037030020032003290380012201370370200320013703502000200c1002220f41086a2900003703002003200f29000037038001200f102c200341f0006a41086a200029030022013703002003200329038001220237037020072002370000200741086a2001370000200a2008290300370300200d2007290300370300200e2006290300370300200320032903503703302003427f200b20127c201320117c22022013542200ad7c220120002001200b542001200b511b22001b3703582003427f200220001b370350200341d0006a21000b200341306aad42808080808004842000ad4280808080800284100120034190016a24000b950804057f047e037f017e23004190016b2204240020044180016a41086a2205418be9c500ad42808080808001841002220641086a29000037030020042006290000370380012006102c200441f0006a41086a220720052903003703002004200429038001370370200541d6b5c000ad4280808080b001841002220641086a29000037030020042006290000370380012006102c200441306a41086a220620052903003703002004200429038001370330200441d0006a2001109f010240024041c000102a2205450d00200520042903703700002005200429033037001020052004290050370020200541086a2007290300370000200541186a2006290300370000200541286a200441d0006a41086a290000370000200541306a200441d0006a41106a2206290000370000200541386a200441d0006a41186a2208290000370000200441186a200541c000109e01200441186a41106a29030021092004290320210a200428021821072005102c4200210b200441d0006a2001200a420020071b220a20027c22022009420020071b20037c2002200a54ad7c10a0012006290300210220042903582103024020042903504200520d002003210b0c020b2008420037030020064200370300200441d0006a41086a220142003703002004420037035020044180016a41086a2205418be9c500ad4280808080800184220a1002220741086a29000037030020042007290000370380012007102c200120052903003703002004200429038001220937037020042009370350200541c9b5c000ad4280808080d00184220c1002220741086a29000037030020042007290000370380012007102c20062004290380012209370300200441306a41086a220d2001290300370300200441306a41106a220e2009370300200441306a41186a220f200529030037030020042009370370200420042903503703302004200441306a4120109e01200441106a29030021092004290308211020042802002107200842003703002006420037030020014200370300200442003703502005200a1002220641086a29000037030020042006290000370380012006102c200120052903003703002004200429038001220a3703702004200a3703502005200c1002220641086a29000037030020042006290000370380012006102c20082005290300220a370300200d2001290300370300200e200429038001220c370300200f200a3703002004200c37037020042004290350370330200442002009420020071b220920027d2010420020071b2202200354ad7d220a200220037d2203200256200a200956200a2009511b22051b37035820044200200320051b370350200441306aad4280808080800484200441d0006aad42808080808002841001420021020c010b1033000b2000200b3703002000200237030820044190016a24000ba80202017f037e230041d0006b220324002003200236020420032001360200200341086a2002ad4220862001ad841003108d0102400240200328020822010d00420021040c010b200328020c210202400240200341086a41086a2802004110490d00200141086a290000210520012900002106420121040c010b20034100360220200342013703182003410b36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341d0b0c2003602382003200341286a360248200341346a41c49ac500200341386a10391a200335022042208620033502188410040240200328021c450d002003280218102c0b420021040b2002450d002001102c0b2000200637030820002004370300200041106a2005370300200341d0006a24000bc30401057f230041206b2202240020012d0000210302404101102a2204450d00200420033a000020012d00012103200441014102102e2204450d00200420033a000120012d00022103200441024104102e2204450d00200420033a0002200420012d00033a000320012d00042103200441044108102e2204450d00200420033a0004200420012d00053a0005200420012d00063a0006200420012d00073a000720012d00082103200441084110102e2204450d00200420033a0008200420012d00093a0009200420012d000a3a000a200420012d000b3a000b200420012d000c3a000c200420012d000d3a000d200420012d000e3a000e200420012d000f3a000f20012d00102103200441104120102e2204450d00200420033a0010200420012d00113a0011200420012d00123a0012200420012d00133a0013200420012d00143a0014200420012d00153a0015200420012d00163a0016200420012d00173a0017200420012d00183a0018200420012d00193a0019200420012d001a3a001a200420012d001b3a001b200420012d001c3a001c200420012d001d3a001d200420012d001e3a001e200420012d001f3a001f200241186a22032004ad42808080808004841006220141186a290000370300200241106a2205200141106a290000370300200241086a2206200141086a290000370300200220012900003703002001102c200041186a2003290300370000200041106a2005290300370000200041086a2006290300370000200020022903003700002004102c200241206a24000f0b1033000b800802057f037e230041c0016b22042400200441c0006a41086a2205418be9c500ad42808080808001841002220641086a290000370300200420062900003703402006102c200441206a41086a2207200529030037030020042004290340370320200541d6b5c000ad4280808080b001841002220641086a290000370300200420062900003703402006102c200441306a41086a2208200529030037030020042004290340370330200441c0006a2001109f010240024041c000102a2206450d00200620042903203700002006200429033037001020062004290040370020200641086a2007290300370000200641186a2008290300370000200641286a2005290000370000200641306a200441c0006a41106a290000370000200641386a200441c0006a41186a290000370000200441086a200641c000109e01200441086a41106a29030021092004290310210a200428020821052006102c2009420020051b210b200a420020051b21090240200242ffffe883b1de1656200342005220035022061b0d002009200b844200520d0020004200370300200041013a0018200041106a4200370300200041086a42003703000c020b4101210502402002428080e983b1de1654410020061b0d00200441c0006a41086a2205418be9c500ad42808080808001841002220641086a290000370300200420062900003703402006102c200441206a41086a2207200529030037030020042004290340370320200541d6b5c000ad4280808080b001841002220641086a290000370300200420062900003703402006102c200441306a41086a2208200529030037030020042004290340370330200441c0006a2001109f0141c000102a2206450d01200620042903203700002006200429033037001020062004290040370020200641086a2007290300370000200641186a2008290300370000200641286a2005290000370000200641306a200441c0006a41106a290000370000200641386a200441c0006a41186a290000370000410021052004200641c000410141004100109701200428020021072006102c20074101460d00200110a101200441c0006a41386a2003370300200441c0006a41306a200237030041002105200441c0006a41086a41003a0000200441c9006a2001290000370000200441d1006a200141086a290000370000200441d9006a200141106a290000370000200441e1006a200141186a290000370000200441033a004041014100200441c0006a1092010b20012002200310a201200041106a200b20037d2009200254ad7d2003200b7d2002200954ad7d2009200256200b200356200b2003511b22061b3703002000200920027d200220097d20061b370308200020053a001820002006ad3703000c010b1033000b200441c0016a24000bbb0e05057f017e027f027e027f230041f0016b22012400200141e0006a41186a4200370300200141e0006a41106a22024200370300200141e0006a41086a2203420037030020014200370360200141e0016a41086a220441b5e5c200ad4280808080f000841002220541086a290000370300200120052900003703e0012005102c20032004290300370300200120012903e001220637035020012006370360200441bce5c200ad4280808080b001841002220541086a290000370300200120052900003703e0012005102c200220012903e0012206370300200141306a41086a2003290300370300200141306a41106a2006370300200141306a41186a20042903003703002001200637035020012001290360370330200141186a200141306a412010940120012802182107200128021c210820002d000021030240024002404101102a2204450d00200420033a000020002d00012103200441014102102e2204450d00200420033a000120002d00022103200441024104102e2204450d00200420033a0002200420002d00033a000320002d00042103200441044108102e2204450d00200420033a0004200420002d00053a0005200420002d00063a0006200420002d00073a000720002d00082103200441084110102e2204450d00200420033a0008200420002d00093a0009200420002d000a3a000a200420002d000b3a000b200420002d000c3a000c200420002d000d3a000d200420002d000e3a000e200420002d000f3a000f20002d00102103200441104120102e2204450d00200420033a0010200420002d00113a0011200420002d00123a0012200420002d00133a0013200420002d00143a0014200420002d00153a0015200420002d00163a0016200420002d00173a0017200420002d00183a0018200420002d00193a0019200420002d001a3a001a200420002d001b3a001b200420002d001c3a001c200420002d001d3a001d200420002d001e3a001e200420002d001f3a001f20042d0000210320042d000121052004102c200141306a2003200541087472410676220510910202402003413f71220420012802384f0d00200141086a200128023020044105746a220410b1012001290308200141086a41086a290300844200520d00200041086a2900002106200041106a2900002109200041186a290000210a20042000290000370000200441186a200a370000200441106a2009370000200441086a2006370000200141e0006a41086a200141306a41086a280200360200200120012903303703602005200141e0006a10fc030c030b2008410020071b210402402001280234450d002001280230102c0b200141e0006a20041091020240200128026841c000490d000340200441016a210402402001280264450d002001280260102c0b200141e0006a20041091022001280268413f4b0d000b0b200141206a41086a200141e0006a41086a2207280200220336020020012001290360370320200141e0006a41186a2208200041186a290000370300200141e0006a41106a220b200041106a2900003703002007200041086a29000037030020012000290000370360024020032001280224470d00200341016a22052003490d022003410174220c2005200c20054b1b220541ffffff3f712005470d022005410574220c4100480d020240024020030d00200c102a210c0c010b20012802202003410574200c102e210c0b200c450d01200120053602242001200c3602200b200320044106746a210c200128022020034105746a22052001290360370000200541086a2007290300370000200541106a200b290300370000200541186a20082903003700002001200341016a22033602280240200341c000470d00200141e0006a41186a22084200370300200141e0006a41106a220b4200370300200141e0006a41086a2205420037030020014200370360200141e0016a41086a220341b5e5c200ad4280808080f000841002220741086a290000370300200120072900003703e0012007102c20052003290300370300200120012903e001220637035020012006370360200341bce5c200ad4280808080b001841002220741086a290000370300200120072900003703e0012007102c200141d0006a41086a20032903002206370300200120012903e001220937035020022009370000200241086a2006370000200141306a41086a2005290300370300200141306a41106a200b290300370300200141306a41186a2008290300370300200120012903603703302001200441016a360260200141306aad4280808080800484200141e0006aad4280808080c0008410010b200141e0006a41086a2203200141206a41086a280200360200200120012903203703602004200141e0006a10fc0320032000290000370300200141e0006a41106a200041086a290000370300200141e0006a41186a200041106a29000037030020014180016a200041186a2900003703002001200c360264200141023a006041014100200141e0006a1092010c020b1033000b1035000b200141f0016a24000bb11403057f037e027f230041d0036b22032400200341c8026a41086a2204418be9c500ad42808080808001841002220541086a290000370300200320052900003703c8022005102c200341386a41086a22062004290300370300200320032903c802370338200441d6b5c000ad4280808080b001841002220541086a290000370300200320052900003703c8022005102c200341b8016a41086a22072004290300370300200320032903c8023703b801200341c8026a2000109f010240024041c000102a2205450d0020052003290338370000200520032903b801370010200520032900c802370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341d8026a290000370000200541386a200341c8026a41186a290000370000200320013703c802200320023703d0022005ad4280808080800884200341c8026aad428080808080028410012005102c0240200142ffffe883b1de165620024200522002501b0d00200341c8026a41086a2204418be9c500ad42808080808001841002220541086a290000370300200320052900003703c8022005102c200341386a41086a22062004290300370300200320032903c802370338200441d6b5c000ad4280808080b001841002220541086a290000370300200320052900003703c8022005102c200341b8016a41086a22072004290300370300200320032903c8023703b801200341c8026a2000109f0141c000102a2205450d0120052003290338370000200520032903b801370010200520032900c802370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341c8026a41106a290000370000200541386a200341c8026a41186a290000370000200341206a200541c000109e01200341206a41106a29030021082003290328210902402003290320220a4201520d002005ad428080808080088410050b2005102c200341c8026a41086a2204418be9c500ad42808080808001841002220541086a290000370300200320052900003703c8022005102c200341386a41086a22062004290300370300200320032903c802370338200441f0b5c000ad4280808080d000841002220541086a290000370300200320052900003703c8022005102c200341b8016a41086a22072004290300370300200320032903c8023703b801200341c8026a2000109f0141c000102a2205450d0120052003290338370000200520032903b801370010200520032900c802370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341d8026a220b290000370000200541386a200341c8026a41186a220c2900003700002005ad428080808080088410052005102c10a301200010a401200441e4d2c500ad42808080808001841002220541086a290000370300200320052900003703c8022005102c20062004290300370300200320032903c802370338200441a9e4c300ad4280808080e001841002220541086a290000370300200320052900003703c8022005102c20072004290300370300200320032903c8023703b801200341c8026a2000109f0141c000102a2205450d0120052003290338370000200520032903b801370010200520032900c802370020200541086a200341386a41086a290300370000200541186a200341b8016a41086a290300370000200541286a200341c8026a41086a290000370000200541306a200b290000370000200541386a200c290000370000200341c8026a200541c00010a501024020032d00c80222044102460d002005ad428080808080088410050b200341e8026a2802002107200341e4026a280200210b200341e0026a28020021062005102c0240024002400240200441037122054103460d0020050e03010003010b20040d02200b0d010c020b200741164d0d042007ad4220862006ad84200741696aad422086200641176aad8441011007200b450d010b2006102c0b200341b8026a200010a601200341c8026a20032802b802220520032802c002220610a701024020032d00c80241014722040d002006ad4220862005ad8410050b200341b8016a200341c8026a41017241800110db051a200341c8026a200341b8016a41800110db051a0240024020040d00200341386a200341c8026a41800110db051a024020032802bc02450d002005102c0b200341c8026a200341386a41800110db051a200341c0016a4120360200200341e7e485f3063602b8012003200341c8026a3602bc01200341b8026a200341b8016a10a80120033502c00242208620032802b8022205ad841005024020032802bc02450d002005102c0b200341e2c289ab063602b801200341203602c0012003200341c8026a41206a3602bc01200341b8026a200341b8016a10a80120033502c00242208620032802b8022205ad841005024020032802bc02450d002005102c0b200341203602c001200320034188036a3602bc01200341e9dabdf3063602b801200341b8026a200341b8016a10a80120033502c00242208620032802b8022205ad841005024020032802bc02450d002005102c0b200341203602c0012003200341a8036a3602bc01200341e1ea91cb063602b801200341b8026a200341b8016a10a80120033502c00242208620032802b8022205ad84100520032802bc02450d012005102c0c010b20032802bc02450d002005102c0b200341c8026a41086a2204418be9c500ad42808080808001841002220541086a290000370300200320052900003703c8022005102c200341386a41086a22062004290300370300200320032903c802370338200441e1b5c000ad4280808080f001841002220541086a290000370300200320052900003703c8022005102c200341b8016a41086a22072004290300370300200320032903c8023703b801200341c8026a2000109f0141c000102a2205450d0120052003290338370000200520032903b801370010200520032900c802370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341c8026a41106a290000370000200541386a200341c8026a41186a290000370000200341086a200541c000109e01200341086a41106a290300210220032903102101200328020821042005102c2002420020041b21022001420020041b2101024020094200200aa722051b22092008420020051b220884500d000240200142ffffe883b1de165620024200522002501b0d002009200810a9010c010b2000200120097c220a200220087c200a200154ad7c220210aa01200a21010b20012002844200520d00200010ab0120034180036a2008370300200341f8026a2009370300200341c8026a41086a41013a0000200341d1026a2000290000370000200341d9026a200041086a290000370000200341e1026a200041106a290000370000200341e9026a200041186a290000370000200341033a00c80241014100200341c8026a1092010b200341d0036a24000f0b1033000b411720071047000b8f2105057f017e047f017e127f230041c0046b2200240020004188026a41186a420037030020004188026a41106a2201420037030020004188026a41086a220242003703002000420037038802200041186a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200020042900003703182004102c200220032903003703002000200029031822053703a004200020053703880220034193e1c500ad4280808080e001841002220441086a290000370300200020042900003703182004102c200120002903182205370300200041e0026a41086a2002290300370300200041e0026a41106a2005370300200041e0026a41186a2003290300370300200020053703a00420002000290388023703e002200041106a200041e0026a412010940141012106024002402000280214410020002802101b220341014d0d00200321060c010b024020030e020001000b20004188026a41186a420037030020004188026a41106a2206420037030020004188026a41086a22024200370300200042003703880220004180046a41086a22034196e0c500ad4280808080f000841002220441086a29000037030020002004290000370380042004102c200220032903003703002000200029038004370388022003419de0c500ad4280808080a001841002220441086a29000037030020002004290000370380042004102c20062000290380042205370300200041e0026a41086a2002290300370300200041e0026a41106a2005370300200041e0026a41186a2003290300370300200020053703a00420002000290388023703e002200041086a200041e0026a4120109401200028020c210420002802082107200041e0026a10840420004188026a20002802e002220320002802e80210d301024020002802e402450d002003102c0b410121030240024020002d0088024101460d00200041a0046a41186a200041e0026a41186a290000370300200041a0046a41106a200041e0026a41106a290000370300200041a0046a41086a200041e0026a41086a290000370300200020002900e0023703a004410021020c010b200041a8046a20004192026a290100370300200041b0046a2000419a026a290100370300200041b7046a200041a1026a2900003700002000200029018a023703a0044100210320002d00890221020b20004180046a41086a2206200041a0046a41086a29030037030020004180046a41106a2208200041a0046a41106a29030037030020004180046a41186a200041a0046a41186a290300370300200020002903a004370380040240024020030d00200041286a41176a220320004180046a41176a290000370000200041286a41106a22092008290300370300200041286a41086a2208200629030022053703002000200029038004220a370328200041e8006a41096a2005370000200041e8006a41116a2009290300370000200041e8006a41186a2003290000370000200020023a00682000200a370069200020023a00880220004188026a41096a200829030037000020004188026a41116a200929030037000020004188026a41186a20032900003700002000200029032837008902200041e0026a10840420002802e0022103200020002802e8023602a404200020033602a00420004188026a200041a0046a10a102024020002802e402450d002003102c0b20004180046a41086a22024196e0c500ad4280808080f0008422051002220341086a29000037030020002003290000370380042003102c200041e0036a41086a2206200229030037030020002000290380043703e003200241aff8c200ad4280808080a00184220a1002220341086a29000037030020002003290000370380042003102c200041186a41086a220b2002290300370300200020002903800437031820004180046a200041e8006a109f01024041c000102a2203450d002004410020071b210c200041aa026a210d20004188026a410172210e200041b6026a210f20004195026a21104100211120004180046a41106a21120340200320002903e003370000200320002903183700102003200029008004370020200341086a2006290300370000200341186a200b290300370000200341286a2002290000370000200341306a2012290000370000200341386a20004180046a41186a221329000037000020004188026a200341c00010a002024020002d00940222044102460d002003ad428080808080088410050b200041a8016a41086a2207201041086a290000370300200041a8016a41106a2208201041106a290000370300200041a8016a41186a2209201041186a29000037030020004188016a41086a2214200f41086a29010037030020004188016a41106a2215200f41106a29010037030020004188016a41186a2216200f41186a290100370300200020102900003703a8012000200f29010037038801024020044102470d0002402011410171450d00200041a0046a41186a200041c8006a41186a290300370300200041a0046a41106a200041c8006a41106a290300370300200041a0046a41086a200041c8006a41086a290300370300200020002903483703a00420004180046a41086a22044196e0c500ad4280808080f000841002220241086a29000037030020002002290000370380042002102c200041e0036a41086a2206200429030037030020002000290380043703e003200441aff8c200ad4280808080a001841002220241086a29000037030020002002290000370380042002102c200041186a41086a22072004290300370300200020002903800437031820004180046a200041a0046a109f0141c000102a2202450d03200220002903e003370000200220002903183700102002200029038004370020200241086a2006290300370000200241186a2007290300370000200241286a2004290300370000200241306a20004180046a41106a290300370000200241386a20004180046a41186a29030037000020004188026a200241c00010ee03024020002d0098024102460d0020004180046a41106a20004188026a41106a28020036020020004180046a41086a20004188026a41086a290300370300200020002903880237038004200041e0026a2000419c026a41c20010db051a200041003a0081032000200041e0026a3602ac03200020004180046a3602a803200041c0003602e403200020023602e003200041a8036a200041e0036a108504200028028404450d00200028028004102c0b2002102c0b2003102c418ae3c300ad4280808080a0078410040c040b2000280290022111200028028c022117200028028802211820002d00b5022119200041e8016a41086a221a2007290300370300200041e8016a41106a221b2008290300370300200041e8016a41186a221c2009290300370300200041c8016a41086a22072014290300370300200041c8016a41106a22082015290300370300200041c8016a41186a22092016290300370300200020002903a8013703e80120002000290388013703c80141002114410021150240201941ff017141014722160d00200041a8036a41186a2009290300370300200041a8036a41106a2008290300370300200041a8036a41086a2007290300370300200020002903c8013703a803410121150b200041003a00d8032000200c3602d403200020113602d003200020173602cc03200020183602c803200041e0036a41186a22112009290300370300200041e0036a41106a2217200829030037030020062007290300370300200020002903c8013703e003200041e0026a41186a2207201c290300370300200041e0026a41106a2208201b290300370300200041e0026a41086a2209201a290300370300200020002903e8013703e002024020044101470d00200041a0046a41186a2007290300370300200041a0046a41106a2008290300370300200041a0046a41086a2009290300370300200020002903e0023703a004410121140b201320112903003703002012201729030037030020022006290300370300200020002903e0033703800441002104024020160d0020072013290300370300200820122903003703002009200229030037030020002000290380043703e002410121040b200e20002903a004370000200d20002903e002370000200e41086a200041a0046a41086a290300370000200e41106a200041a0046a41106a290300370000200e41186a200041a0046a41186a290300370000200d41086a2009290300370000200d41106a2008290300370000200d41186a2007290300370000200020143a008802200020043a00a9022007200041e8006a41186a22142903003703002008200041e8006a41106a22162903003703002009200041e8006a41086a2211290300370300200020002903683703e002200220051002220441086a29000037030020002004290000370380042004102c2006200229030037030020002000290380043703e0032002200a1002220441086a29000037030020002004290000370380042004102c200b2002290300370300200020002903800437031820004180046a200041e0026a109f0141c000102a2204450d01200420002903e003370000200420002903183700102004200029038004370020200441086a2006290300370000200441186a200b290300370000200441286a2002290300370000200441306a2012290300370000200441386a2013290300370000200020004188026a360284042000200041c8036a36028004200041c0003602a404200020043602a00420004180046a200041a0046a108504024020150d002004102c024020002802cc03450d0020002802c803102c0b2003102c0c040b200041c8006a41186a2007290300370300200041c8006a41106a2008290300370300200041c8006a41086a20092903003703002011200041a8036a41086a2903003703002016200041a8036a41106a2903003703002014200041a8036a41186a290300370300200020002903e002370348200020002903a8033703682004102c024020002802cc03450d0020002802c803102c0b2003102c200220051002220341086a29000037030020002003290000370380042003102c2006200229030037030020002000290380043703e0032002200a1002220341086a29000037030020002003290000370380042003102c200b2002290300370300200020002903800437031820004180046a200041e8006a109f014101211141c000102a22030d000b0b1033000b200241ff017122034102460d00418ae3c300ad4280808080a00784100420034101460d0041c4e3c300ad4280808080d0048410040b41e9e3c300ad42808080809005841004410121060b20004188026a41186a2207420037030020004188026a41106a2208420037030020004188026a41086a220242003703002000420037038802200041186a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200020042900003703182004102c200220032903003703002000200029031822053703a004200020053703880220034193e1c500ad4280808080e001841002220441086a290000370300200020042900003703182004102c200041a0046a41086a2003290300220537030020002000290318220a3703a0042001200a370000200141086a2005370000200041e0026a41086a2002290300370300200041e0026a41106a2008290300370300200041e0026a41186a200729030037030020002000290388023703e0022000200636028802200041e0026aad428080808080048420004188026aad4280808080c000841001200041c0046a24000bf50d03057f017e077f23004190016b22012400200141e8006a41086a22024196e0c500ad4280808080f000841002220341086a290000370300200120032900003703682003102c200141c8006a41086a2204200229030037030020012001290368370348200241d3f8c200ad4280808080e000841002220341086a290000370300200120032900003703682003102c200141d8006a41086a2205200229030037030020012001290368370358200141e8006a2000109f0102400240024002400240024041c000102a2203450d00200320012903483700002003200129035837001020032001290068370020200341086a2004290300370000200341186a2005290300370000200341286a2002290000370000200341306a200141e8006a41106a290000370000200341386a200141e8006a41186a290000370000200141e8006a200341c00010d3010240024020012d00684101470d002003ad42808080808008841005200141086a41186a220220014181016a290000370300200141086a41106a2204200141f9006a290000370300200141086a41086a2205200141f1006a290000370300200120012900693703082003102c200141286a41186a2002290300370300200141286a41106a2004290300370300200141286a41086a200529030037030020012001290308370328200141e8006a41086a22024196e0c500ad4280808080f000841002220341086a290000370300200120032900003703682003102c200141c8006a41086a2204200229030037030020012001290368370348200241d9f8c200ad4280808080e000841002220341086a290000370300200120032900003703682003102c200141d8006a41086a2205200229030037030020012001290368370358200141e8006a200141286a109f0141c000102a2203450d02200320012903483700002003200129035837001020032001290068370020200341086a2004290300370000200341186a2005290300370000200341286a2002290000370000200341306a200141f8006a290000370000200341386a200141e8006a41186a2900003700002003ad428080808080088410052003102c0c010b2003102c0b200141e8006a41086a22024196e0c500ad4280808080f0008422061002220341086a290000370300200120032900003703682003102c200141c8006a41086a2204200229030037030020012001290368370348200241b5fdc200ad4280808080d000841002220341086a290000370300200120032900003703682003102c200141d8006a41086a2205200229030037030020012001290368370358200141e8006a2000109f0141c000102a2203450d00200320012903483700002003200129035837001020032001290068370020200341086a2004290300370000200341186a2005290300370000200341286a2002290000370000200341306a200141f8006a2204290000370000200341386a200141e8006a41186a22052900003700002003ad428080808080088410052003102c20001086042000108704200220061002220341086a290000370300200120032900003703682003102c200141086a41086a2002290300370300200120012903683703082002419bf9c200ad4280808080d001841002220341086a290000370300200120032900003703682003102c200141286a41086a200229030037030020012001290368370328200141e8006a2000109f0141c000102a2203450d00200320012903083700002003200129032837001020032001290068370020200341086a200141086a41086a290300370000200341186a200141286a41086a290300370000200341286a200141e8006a41086a2207290000370000200341306a2004290000370000200341386a2005290000370000200141e8006a200341c00010f1030240200128027022080d002003102c0c060b2003ad4280808080800884100520012802682109200129027421062003102c20082006422088a74102746a210a2006a7210b2009210c2008210441002105410041ff01710e03010203010b1033000b410121030c020b410221030c010b410021030b0340024002400240024002400240024020030e03000102020b2004200a460d03200441046a210441022103200c417f6a2202210c0c020b41002103024020054102460d0041022105200921020c020b2004200a460d02200441046a210441022105200c417f6a2202210c410221030c010b2005410247210d410121034102210520092102200d450d010b200141e8006a41186a200041186a290000370300200141e8006a41106a200041106a2900003703002007200041086a290000370300200120023602880120012000290000370368200141e8006a1088040240200341ff01710e03000203000b410121030c030b200b450d032008102c0c030b410221030c010b410021030c000b0b20014190016a24000ba40b030b7f047e047f23004180016b220324002003200236020420032001360200200341086a2002ad4220862001ad841003108d0102400240200328020822040d00200041023a00000c010b200328020c21052003200341106a280200220236022c20032004360228024002402002450d0020042d0000210120032002417f6a36022c2003200441016a360228200141014b0d0002400240024002400240024020010e020001000b200341d8006a200341286a107720032802582206450d05200328025c2107200328022c22084104490d03200341e0006a28020021092003280228220a280000210b20032008417c6a220c36022c2003200a41046a36022841002101200341003a0078417b21020c010b41002101200341003a00782002417f6a21082002417e6a21020340024020082001470d00200141ff0171450d06200341003a00780c060b200341d8006a20016a200420016a220d41016a2d00003a00002003200d41026a3602282003200141016a220d3a00782003200236022c2002417f6a2102200d2101200d4120470d000b2003200328005b3600332003200328025836023020032003280033360043200320032802303602402003200328024036025020032003280043360053200341e7006a290000210e200329005f210f200328006f21062003280073210720032d0077210920032003280053360023200320032802503602202003200341cc006a28000036001b20032003280049360218410121010c010b03400240200c2001470d000240200141ff0171450d00200341003a00780b20070d040c050b200341d8006a20016a200a20016a220d41046a2d00003a00002003200820026a36022c2003200d41056a3602282003200141016a220d3a00782002417f6a2102200d2101200d4120470d000b2003200328005b36003320032003280258360230200320032802303602402003200328003336004302400240024002402008200d6b2201417c6a4110490d00200341e7006a2900002110200329005f2111200328006f21022003280073210c20032d007721122003200a200d6a221341146a221436022820032001416c6a220a36022c200a4104490d002013410c6a290000210e201341046a290000210f2014280000210a2003200141686a36022c2003201341186a2214360228200841686a200d460d0320142d000021142003200141676a221536022c2003201341196a360228201441014b0d034100210d20140e020201020b20070d050c060b20154104490d01201341196a28000021082003200141636a36022c20032013411d6a3602284101210d0b2003200328004336005320032003280240360250200320032802503602182003200328005336001b200320032800493602202003200341cc006a280000360023410021010c010b2007450d030c020b2003200328002336005b20032003280220360258200320032802183602302003200328001b360033200041106a200e370000200041086a200f370000200041046a200328005b36000020002003280258360001200041306a20083600002000412c6a200d360000200041286a200a360000200041246a200b360000200041206a20093600002000411c6a2007360000200041186a2006360000200041c3006a20103700002000413b6a2011370000200041d3006a20123a0000200041cf006a200c360000200041cb006a2002360000200041346a2003280230360000200041376a20032800333600000c030b2007450d010b2006102c0b20034100360238200342013703302003410b360244200320033602402003200341306a360250200341ec006a41013602002003420137025c200341d0b0c2003602582003200341c0006a360268200341d0006a41c49ac500200341d8006a10391a2003350238422086200335023084100402402003280234450d002003280230102c0b410221010b200020013a00002005450d002004102c0b20034180016a24000bbc0501087f230041c0006b22022400200241086a220341ecddc500ad4280808080f000841002220441086a290000370300200220042900003703002004102c200241206a41086a200329030037030020022002290300370320200341c3fbc000ad42808080808001841002220441086a290000370300200220042900003703002004102c200241306a41086a200329030037030020022002290300370330200241b6fbc000410d1083020240024002400240024002402002280208220541206a2204417f4c0d0020022802002106024002402004450d002004102a2203450d062004410f4d0d01200421070c050b200441017422034110200341104b1b2207102a21030c030b200441017422084110200841104b1b220741004e0d010c050b103a000b200320042007102e21030b2003450d010b20032002290320370000200341086a200241206a41086a2903003700000240024020074170714110460d00200721080c010b200741017422084120200841204b1b22084100480d02200320072008102e2203450d010b20032002290330370010200341186a200241306a41086a29030037000002400240200841606a2005490d00200821070c010b200541206a22072005490d02200841017422092007200920074b1b22074100480d02200320082007102e2203450d010b200341206a2006200510db051a02402002280204450d002006102c0b20022001109f0102400240200720046b411f4d0d00200721080c010b200441206a22082004490d02200741017422062008200620084b1b22084100480d02200320072008102e2203450d010b200320046a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002000200541c0006a3602082000200836020420002003360200200241c0006a24000f0b1033000b1035000bd60201027f230041c0026b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003a00000c010b200328021421042003200341186a2802003602ac02200320013602a802200341a0016a200341a8026a10e201410121020240024020032d00a0014101460d00200341206a200341a0016a41017241800110db051a200041016a200341206a41800110db051a0c010b4100210220034100360228200342013703202003410b3602b4022003200341086a3602b0022003200341206a3602bc02200341b4016a4101360200200342013702a401200341d0b0c2003602a0012003200341b0026a3602b001200341bc026a41c49ac500200341a0016a10391a200335022842208620033502208410042003280224450d002003280220102c0b200020023a00002004450d002001102c0b200341c0026a24000bcf0b010d7f230041d0006b22022400200241306a41086a220341ecddc500ad4280808080f000841002220441086a290000370300200220042900003703302004102c200241206a41086a200329030037030020022002290330370320200341cbfbc000ad42808080808001841002220441086a290000370300200220042900003703302004102c200241086a200329030037030020022002290330370300200241306a41b6fbc000410d1083020240024002402002280238220541206a2206417f4c0d002002280230210702400240024002402006450d002006102a2203450d052006410f4d0d01200621080c030b200641017422034110200341104b1b2208102a21030c010b200641017422044110200441104b1b22084100480d04200320062008102e21030b2003450d020b20032002290320370000200341086a200241206a41086a2903003700000240024020084170714110460d00200821040c010b200841017422044120200441204b1b22044100480d03200320082004102e2203450d020b20032002290300370010200341186a200241086a29030037000002400240200441606a2005490d00200421090c010b200541206a22082005490d032004410174220a2008200a20084b1b22094100480d03200320042009102e2203450d020b200341206a2007200510db051a02402002280234450d002007102c0b200141086a280200220a41046a2208417f4c0d000240024020080d00410121040c010b2008102a2204450d020b20024100360238200220083602342002200436023020012d00002107024020080d004101102a2204450d0220024101360234200220043602300b20024101360238200420073a000020012d0001210b02402002280234220720022802382208470d00200841016a22072008490d032008410174220c2007200c20074b1b22074100480d030240024020080d002007102a21040c010b200420082007102e21040b2004450d0220022007360234200220043602300b2002200841016a220c360238200420086a200b3a000020012d0002210d024002402007200c460d002007210b0c010b200741016a220b2007490d032007410174220e200b200e200b4b1b220b4100480d030240024020070d00200b102a21040c010b20042007200b102e21040b2004450d022002200b360234200220043602300b2002200841026a22073602382004200c6a200d3a000020012d0003210c0240200b2007470d00200b41016a220d200b490d03200b410174220e200d200e200d4b1b220d4100480d0302400240200b0d00200d102a21040c010b2004200b200d102e21040b2004450d022002200d360234200220043602300b2002200841036a360238200420076a200c3a000020012802042107200a200241306a10670240024020022802342201200228023822046b200a490d00200228023021080c010b2004200a6a22082004490d032001410174220b2008200b20084b1b220b4100480d030240024020010d00200b102a21080c010b20022802302001200b102e21080b2008450d022002200b36023420022008360230200b21010b200820046a2007200a10db051a200241306a41186a22072004200a6aad4220862008ad841006220441186a290000370300200241306a41106a220a200441106a290000370300200241306a41086a220b200441086a290000370300200220042900003703302004102c200241186a2007290300370300200241106a200a290300370300200241086a200b2903003703002002200229033037030002402001450d002008102c0b02400240200920066b411f4d0d00200921080c010b200641206a22042006490d03200941017422082004200820044b1b22084100480d03200320092008102e2203450d020b200320066a22042002290300370000200441186a200241186a290300370000200441106a200241106a290300370000200441086a200241086a2903003700002000200541c0006a3602082000200836020420002003360200200241d0006a24000f0b103a000b1033000b1035000b890a08017f017e047f017e017f017e037f017e230041b0016b22022400200241386a2000200110ce01200241386a41106a29030021012002290340210002400240024020022903382203a7450d00200241f0006a41186a22044200370300200241f0006a41106a22054200370300200241f0006a41086a2206420037030020024200370370200241a0016a41086a2207418be9c500ad428080808080018422081002220941086a290000370300200220092900003703a0012009102c20062007290300370300200220022903a00122033703900120022003370370200741c9b5c000ad4280808080d00184220a1002220941086a290000370300200220092900003703a0012009102c200520022903a0012203370300200241d0006a41086a220b2006290300370300200241d0006a41106a220c2003370300200241d0006a41186a220d2007290300370300200220033703900120022002290370370350200241206a200241d0006a4120109e01200241206a41106a29030021032002290328210e2002280220210920044200370300200542003703002006420037030020024200370370200720081002220541086a290000370300200220052900003703a0012005102c20062007290300370300200220022903a001220837039001200220083703702007200a1002220541086a290000370300200220052900003703a0012005102c200420072903002208370300200b2006290300370300200c20022903a001220a370300200d20083703002002200a3703900120022002290370370350200242002003420020091b220320017d200e420020091b2201200054ad7d2208200120007d2200200156200820035620082003511b22071b37037820024200200020071b370370200241f0006a2107200241d0006a21060c010b2003500d01200241f0006a41186a22044200370300200241f0006a41106a22054200370300200241f0006a41086a2206420037030020024200370370200241a0016a41086a2207418be9c500ad428080808080018422081002220941086a290000370300200220092900003703a0012009102c20062007290300370300200220022903a00122033703900120022003370370200741c9b5c000ad4280808080d00184220a1002220941086a290000370300200220092900003703a0012009102c200520022903a0012203370300200241d0006a41086a220b2006290300370300200241d0006a41106a220c2003370300200241d0006a41186a220d2007290300370300200220033703900120022002290370370350200241086a200241d0006a4120109e01200241086a41106a29030021032002290310210e2002280208210920044200370300200542003703002006420037030020024200370370200720081002220541086a290000370300200220052900003703a0012005102c20062007290300370300200220022903a001220837039001200220083703702007200a1002220541086a290000370300200220052900003703a0012005102c200420072903002208370300200b2006290300370300200c20022903a001220a370300200d20083703002002200a3703900120022002290370370350200242002003420020091b220320017d200e420020091b2201200054ad7d2208200120007d2200200156200820035620082003511b22071b37037820024200200020071b370370200241f0006a2107200241d0006a21060b2006ad42808080808004842007ad428080808080028410010b200241b0016a24000b8e0a02057f037e230041d0016b22032400200341d0006a41086a2204418be9c500ad42808080808001841002220541086a290000370300200320052900003703502005102c200341306a41086a2206200429030037030020032003290350370330200441e1b5c000ad4280808080f001841002220541086a290000370300200320052900003703502005102c200341c0006a41086a2207200429030037030020032003290350370340200341d0006a2000109f01024041c000102a2205450d00200520032903303700002005200329034037001020052003290050370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341e0006a290000370000200541386a200341d0006a41186a29000037000020032001370350200320023703582005ad4280808080800884200341d0006aad428080808080028410012005102c0240200142ffffe883b1de165620024200522002501b0d00200341d0006a41086a2204418be9c500ad42808080808001841002220541086a290000370300200320052900003703502005102c200341306a41086a2206200429030037030020032003290350370330200441e1b5c000ad4280808080f001841002220541086a290000370300200320052900003703502005102c200341c0006a41086a2207200429030037030020032003290350370340200341d0006a2000109f0141c000102a2205450d01200520032903303700002005200329034037001020052003290050370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341d0006a41106a290000370000200541386a200341d0006a41186a290000370000200341186a200541c000109e01200341186a41106a29030021082003290320210902402003290318220a4201520d002005ad428080808080088410050b2005102c200341d0006a41086a2204418be9c500ad42808080808001841002220541086a290000370300200320052900003703502005102c200341306a41086a2206200429030037030020032003290350370330200441d6b5c000ad4280808080b001841002220541086a290000370300200320052900003703502005102c200341c0006a41086a2207200429030037030020032003290350370340200341d0006a2000109f0141c000102a2205450d01200520032903303700002005200329034037001020052003290050370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341d0006a41106a290000370000200541386a200341d0006a41186a2900003700002003200541c000109e01200341106a290300210220032903082101200328020021042005102c2002420020041b21022001420020041b2101024020094200200aa722051b22092008420020051b220884500d000240200142ffffe883b1de165620024200522002501b0d002009200810a9010c010b2000200120097c220a200220087c200a200154ad7c220210a201200a21010b20012002844200520d00200010ab0120034188016a200837030020034180016a2009370300200341d0006a41086a41013a0000200341d9006a2000290000370000200341e1006a200041086a290000370000200341e9006a200041106a290000370000200341f1006a200041186a290000370000200341033a005041014100200341d0006a1092010b200341d0016a24000f0b1033000bbb0201057f230041c0006b22012400200141206a41086a22024191b0c200ad4280808080e000841002220341086a290000370300200120032900003703202003102c200141086a220420022903003703002001200129032037030020024197b0c200ad4280808080c001841002220341086a290000370300200120032900003703202003102c200141106a41086a2205200229030037030020012001290320370310200141206a2000109f01024041c000102a22030d001033000b200320012903003700002003200129031037001020032001290020370020200341086a2004290300370000200341186a2005290300370000200341286a2002290000370000200341306a200141306a290000370000200341386a200141206a41186a2900003700002003ad428080808080088410052003102c200141c0006a24000bdb0402057f047e230041e0006b22052400200541c0006a41086a2206418be9c500ad42808080808001841002220741086a290000370300200520072900003703402007102c200541206a41086a2208200629030037030020052005290340370320200641d6b5c000ad4280808080b001841002220741086a290000370300200520072900003703402007102c200541306a41086a2209200629030037030020052005290340370330200541c0006a2001109f01024002400240024041c000102a2207450d00200720052903203700002007200529033037001020072005290040370020200741086a2008290300370000200741186a2009290300370000200741286a2006290000370000200741306a200541c0006a41106a290000370000200741386a200541c0006a41186a290000370000200541086a200741c000109e01200541086a41106a290300210a2005290310210b200528020821062007102c410121070240200b420020061b220b20027d220c200b56200a420020061b220a20037d200b200254ad7d220d200a56200d200a511b4101470d00200041d0b9c000360204200041086a411d3602000c040b0240200b428080e983b1de16544100200a501b0d00200c42ffffe883b1de1656200d420052200d501b0d00200041edb9c000360204200041086a411a3602000c030b200520012004200c200d10ad01200528020022070d012001200c200d10a201200041106a2003370300200041086a2002370300410021070c030b1033000b2005280204210620002007360204200041086a20063602000b410121070b20002007360200200541e0006a24000bd40f08047f017e017f047e037f027e017f017e230041d0016b22052400024002400240024002402002410671450d00200541b8016a41086a2206418be9c500ad42808080808001841002220741086a290000370300200520072900003703b8012007102c200541a8016a41086a22082006290300370300200520052903b8013703a80120064187bac000ad4280808080f000841002220741086a290000370300200520072900003703b8012007102c200541e8006a41086a22072006290300370300200520052903b80137036820054188016a2001109f0141c000102a2206450d01200620052903a801370000200620052903683700102006200529008801370020200641086a2008290300370000200641186a2007290300370000200641286a20054188016a41086a290000370000200641306a20054188016a41106a290000370000200641386a20054188016a41186a290000370000200541c00036025c20052006360258200541b8016a2006ad42808080808008841003108d010240024020052802b80122070d00420021090c010b20052802bc01210802400240200541b8016a41086a280200220a4110490d00200a4170714110460d00200a417c714120460d00200741086a290000210b2007290000210c200741186a290000210d2007290010210e2007280020210f420121090c010b20054100360270200542013703682005410b3602ac012005200541d8006a3602a8012005200541e8006a3602cc012005419c016a41013602002005420137028c01200541d0b0c200360288012005200541a8016a36029801200541cc016a41c49ac50020054188016a10391a200535027042208620053502688410040240200528026c450d002005280268102c0b420021090b2008450d002007102c0b2006102c2009500d00200541b8016a41086a2207418be9c500ad42808080808001841002220641086a290000370300200520062900003703b8012006102c200541a8016a41086a22082007290300370300200520052903b8013703a801200741d6b5c000ad4280808080b001841002220641086a290000370300200520062900003703b8012006102c200541e8006a41086a220a2007290300370300200520052903b80137036820054188016a2001109f0141c000102a2206450d01200620052903a801370000200620052903683700102006200529008801370020200641086a2008290300370000200641186a200a290300370000200641286a20054188016a41086a2208290000370000200641306a20054188016a41106a2210290000370000200641386a20054188016a41186a2211290000370000200541c0006a200641c000109e01200541c0006a41106a290300211220052903482113200528024021142006102c42002115201142003703002010420037030020084200370300200542003703880120074191b0c200ad4280808080e000841002220641086a290000370300200520062900003703b8012006102c20082007290300370300200520052903b80137038801200741acb0c200ad4280808080e000841002220641086a290000370300200520062900003703b8012006102c201020052903b8012209370300200a2008290300370300200541e8006a41106a2009370300200541e8006a41186a2007290300370300200520093703a8012005200529038801370368200541386a200541e8006a4120109401200541186a200d42004100200528023c410020052802381b2206200f6b2207200720064b1bad2209420010e005200541286a20094200200e420010e005200541086a42004200200e420010e0052012420020141b210e2013420020141b210d4200210902402005290310200529032084420052200541286a41086a2903002213200529030820052903187c7c2212201354720d00200b2012200c2005290328221556200b201256200b2012511b22061b20127d200c201520061b220b201554ad7d2109200b20157d21150b2015200d200d201556200e200956200e2009511b22061b2003562009200e20061b220920045620092004511b450d0041bfbac0002106412621010c040b200541d8006a200110ae01200528026022080d0141002106200528025c450d022005280258102c0c020b1033000b20054188016a41186a420037030020054188016a41106a220a420037030020054188016a41086a220142003703002005420037038801200541b8016a41086a22064191b0c200ad4280808080e000841002220741086a290000370300200520072900003703b8012007102c20012006290300370300200520052903b80137038801200641acb0c200ad4280808080e000841002220741086a290000370300200520072900003703b8012007102c200a20052903b8012209370300200541e8006a41086a2001290300370300200541e8006a41106a2009370300200541e8006a41186a2006290300370300200520093703a80120052005290388013703682005200541e8006a41201094012005280204410020052802001b210720084105742101200528025c21082005280258220a21060240034002402007200641106a2802004f0d002006290300200358200641086a290300220920045820092004511b0d002006411c6a2d000020027141ff01710d020b200641206a2106200141606a22010d000b410021062008450d01200a102c0c010b418ebac00021062008450d00200a102c0b413121010b2000200136020420002006360200200541d0016a24000bac09030c7f037e037f230041f0006b22022400200241286a41086a2203418be9c500ad42808080808001841002220441086a290000370300200220042900003703282004102c200241086a41086a2205200329030037030020022002290328370308200341f0b5c000ad4280808080d000841002220441086a290000370300200220042900003703282004102c200241186a41086a2206200329030037030020022002290328370318200241286a2001109f0102400240024041c000102a2204450d00200420022903083700002004200229031837001020042002290028370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241386a290000370000200441386a200241286a41186a290000370000200241c00036024c20022004360248200241086a2004ad42808080808008841003108d010240024020022802082207450d00200228020c21082002200241106a280200360254200220073602502002200241d0006a107502400240024020022802000d00200228025422034160712201417f4c0d0620022802042109024002402003410576220a0d00410821010c010b2001102a2201450d060b02402009450d00411d210b4100210c4100210d0340200241186a200241d0006a10af010240024020022d00184101460d00200228025422054110490d002002290019210e20022002280250220341106a3602502002200541706a220636025420064104490d00200341086a290000210f2003290000211020022005416c6a22063602542002200341146a36025020060d010b20024100360228200a450d042001102c0c040b200d41016a210620032800102111200241ec006a41026a200241d8006a41026a2d000022123a0000200241e8006a41026a221320123a000020022005416b6a3602542002200341156a360250200220022f005822053b016c200220053b016820032d001421050240200d200a470d00200c2006200c20064b1b220a41ffffff3f71200a470d0a200a41057422034100480d0a02400240200d0d002003102a21010c010b2001200b41636a2003102e21010b2001450d080b2001200b6a2203417f6a20053a0000200341636a2205200f37030820052010370300200341776a200e370200200341736a2011360200200320022f01683b0000200341026a20132d00003a0000200c41026a210c200b41206a210b2006210d20092006470d000b200241306a20093602002002200a36022c20022001360228200229022c210e0c030b200241306a20093602002002200a36022c200220013602282001450d01200229022c210e0c020b200241003602280b4100210120024100360220200242013703182002410b36025c2002200241c8006a3602582002200241186a3602642002413c6a41013602002002420137022c200241d0b0c2003602282002200241d8006a360238200241e4006a41c49ac500200241286a10391a200235022042208620023502188410040240200228021c450d002002280218102c0b0b02402008450d002007102c0b2001450d002000200e370204200020013602000c010b20004100360208200042083702000b2004102c200241f0006a24000f0b1033000b103a000b1035000bf00204027f017e017f077e0240024020012802042202450d0020012802002203310000210420012002417f6a22053602042001200341016a3602002005450d012003310001210620012002417e6a22053602042001200341026a3602002005450d012003310002210720012002417d6a22053602042001200341036a3602002005450d012003310003210820012002417c6a22053602042001200341046a3602002005450d012003310004210920012002417b6a22053602042001200341056a3602002005450d012003310005210a20012002417a6a22053602042001200341066a3602002005450d012003310006210b2001200241796a22053602042001200341076a3602002005450d01200041003a00002003310007210c2001200241786a3602042001200341086a3602002000200c423886200b42308684200a422886842009422086842008421886842007421086842006420886842004843700010f0b200041013a00000f0b200041013a00000b831003097f027e037f230041c0006b22022400200241206a41086a2203418be9c500ad42808080808001841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341f0b5c000ad4280808080d000841002220441086a290000370300200220042900003703202004102c200241106a41086a2204200329030037030020022002290320370310200241206a2000109f010240024041c000102a2206450d00200620022903003700002006200229031037001020062002290020370020200641086a2005290300370000200641186a2004290300370000200641286a2003290000370000200641306a200241206a41106a290000370000200641386a200241206a41186a290000370000200128020021072001280208210320024100360228200242013703202003200241206a106702402003450d0020034105742108410021090340200720096a220341146a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a0000200341156a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a0000200341166a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a0000200341176a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a0000200341186a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a0000200341196a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a00002003411a6a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a00002003411b6a2d0000210502400240200228022420022802282204460d00200228022021000c010b200441016a22002004490d042004410174220a2000200a20004b1b220a4100480d040240024020040d00200a102a21000c010b20022802202004200a102e21000b2000450d032002200a360224200220003602200b2002200441016a360228200020046a20053a0000200341086a290300210b2003290300210c0240024020022802242200200228022822056b4110490d00200228022021040c010b200541106a22042005490d042000410174220a2004200a20044b1b220a4100480d040240024020000d00200a102a21040c010b20022802202000200a102e21040b2004450d032002200a36022420022004360220200a21000b200420056a220a200b370008200a200c3700002002200541106a220a360228200341106a280200210d02402000200a6b41034b0d00200a41046a220e200a490d042000410174220f200e200f200e4b1b220e4100480d040240024020000d00200e102a21040c010b20042000200e102e21040b2004450d032002200e360224200220043602200b2002200541146a3602282004200a6a200d3600002003411c6a2d0000210002400240200228022420022802282203460d00200228022021040c010b200341016a22042003490d04200341017422052004200520044b1b22054100480d040240024020030d002005102a21040c010b200228022020032005102e21040b2004450d0320022005360224200220043602200b2002200341016a360228200420036a20003a00002008200941206a2209470d000b0b200228022421032006ad4280808080800884200235022842208620022802202204ad84100102402003450d002004102c0b2006102c0240200141046a280200450d002007102c0b200241c0006a24000f0b1033000b1035000bc50504027f017e057f047e230041f0006b22022400200241d0006a41086a2203418be9c500ad428080808080018422041002220541086a290000370300200220052900003703502005102c200241306a41086a2206200329030037030020022002290350370330200341d6b5c000ad4280808080b001841002220541086a290000370300200220052900003703502005102c200241c0006a41086a2207200329030037030020022002290350370340200241d0006a2001109f01024041c000102a2205450d00200520022903303700002005200229034037001020052002290050370020200541086a2006290300370000200541186a2007290300370000200541286a2003290000370000200541306a200241d0006a41106a2208290000370000200541386a200241d0006a41186a2209290000370000200241186a200541c000109e01200241186a41106a290300210a2002290320210b2002290318210c2005102c200320041002220541086a290000370300200220052900003703502005102c2006200329030037030020022002290350370330200341e1b5c000ad4280808080f001841002220541086a290000370300200220052900003703502005102c2007200329030037030020022002290350370340200241d0006a2001109f0141c000102a2205450d00200520022903303700002005200229034037001020052002290050370020200541086a200241306a41086a290300370000200541186a200241c0006a41086a290300370000200541286a200241d0006a41086a290000370000200541306a2008290000370000200541386a20092900003700002002200541c000109e01200241106a29030021042002290308210d200228020021032005102c2000200d420020031b220d200b4200200ca722051b7c220b37030020002004420020031b200a420020051b7c200b200d54ad7c370308200241f0006a24000f0b1033000be10301077f230041f0006b22022400200241d0006a41086a220341e0d9c500ad4280808080f001841002220441086a290000370300200220042900003703502004102c200241086a41086a2205200329030037030020022002290350370308200341efd9c500ad4280808080c001841002220441086a290000370300200220042900003703502004102c200241186a41086a220620032903003703002002200229035037031820022000370348200241d0006a41186a2207200241c8006aad42808080808001841006220441186a290000370300200241d0006a41106a2208200441106a2900003703002003200441086a290000370300200220042900003703502004102c200241286a41186a22042007290300370300200241286a41106a22072008290300370300200241286a41086a2208200329030037030020022002290350370328024041c000102a22030d001033000b200320022903083700002003200229031837001020032002290328370020200341086a2005290300370000200341186a2006290300370000200341286a2008290300370000200341306a2007290300370000200341386a2004290300370000200220013602502003ad4280808080800884200241d0006aad4280808080c0008410012003102c200241f0006a24000b861305067f017e027f037e057f23004180016b22042400200441c0006a41186a22054200370300200441c0006a41106a22064200370300200441c0006a41086a2207420037030020044200370340200441f0006a41086a220841e0d9c500ad4280808080f001841002220941086a290000370300200420092900003703702009102c2007200829030037030020042004290370220a3703602004200a370340200841beb9c000ad4280808080d001841002220941086a290000370300200420092900003703702009102c20062004290370220a370300200441206a41086a22092007290300370300200441206a41106a220b200a370300200441206a41186a220c20082903003703002004200a37036020042004290340370320200441186a200441206a4120410141004100109701024002400240024020042802184101460d002005420037030020064200370300200742003703002004420037034020084191b0c200ad4280808080e000841002220541086a290000370300200420052900003703702005102c2007200829030037030020042004290370370340200841acb0c200ad4280808080e000841002220541086a290000370300200420052900003703702005102c20062004290370220a37030020092007290300370300200b200a370300200c20082903003703002004200a37036020042004290340370320200441106a200441206a41201094012004280214410020042802101b2109024020024101460d00200441206a210c0c020b200441c0006a41186a22054200370300200441c0006a41106a220b4200370300200441c0006a41086a2207420037030020044200370340200441f0006a41086a220841e0d9c500ad4280808080f00184220d1002220c41086a2900003703002004200c290000370370200c102c2007200829030037030020042004290370220a3703602004200a37034020084180bfc000ad4280808080a00184220e1002220c41086a2900003703002004200c290000370370200c102c200441e0006a41086a220c2008290300220a37030020042004290370220f3703602006200f370000200641086a2210200a370000200441206a41086a22112007290300370300200441206a41106a2212200b290300370300200441206a41186a2213200529030037030020042004290340370320200441086a200441206a4120109401024002402004280208450d00200428020c20094b0d010b20054200370300200b420037030020074200370300200442003703402008200d1002221441086a290000370300200420142900003703702014102c2007200829030037030020042004290370220a3703602004200a3703402008200e1002221441086a290000370300200420142900003703702014102c200c2008290300220a37030020042004290370220f3703602006200f3700002010200a370000201120072903003703002012200b29030037030020132005290300370300200420042903403703202004200920014101746a360240200441206aad4280808080800484200441c0006aad4280808080c000841001200441206a210c0c020b200041046a280200450d022000280200102c0c020b200041046a280200450d012000280200102c0c010b20002802082107200028020421102000280200210b200441c0006a41186a22114200370300200441c0006a41106a22124200370300200441c0006a41086a2200420037030020044200370340200441f0006a41086a220841e0d9c500ad4280808080f001841002220541086a290000370300200420052900003703702005102c2000200829030037030020042004290370220a3703602004200a370340200841beb9c000ad4280808080d001841002220541086a290000370300200420052900003703702005102c200441e0006a41086a2008290300220a37030020042004290370220f3703602006200f370000200641086a200a370000200441206a41086a2000290300370300200441206a41106a2012290300370300200441206a41186a20112903003703002004200429034037032020044100360248200442013703404104102a2208450d012004410436024420042004280248220641046a36024820042008360240200820066a200936000002400240024020042802442206200428024822086b4104490d00200428024021060c010b200841046a22002008490d01200641017422082000200820004b1b22084100480d010240024020060d002008102a21060c010b200428024020062008102e21060b2006450d032004200836024420042006360240200428024821080b2004200841046a360248200620086a20013600002007200441c0006a106702402007450d00200b200741286c6a2109200b210703402007200441c0006a109101200741206a290300210a0240024020042802442206200428024822086b4108490d00200428024021060c010b200841086a22002008490d03200641017422082000200820004b1b22084100480d030240024020060d002008102a21060c010b200428024020062008102e21060b2006450d052004200836024420042006360240200428024821080b2004200841086a360248200620086a200a3700002009200741286a2207470d000b0b20042802442107200428024821080240024020024101460d000240024020072008460d00200428024021070c010b200841016a22072008490d03200841017422062007200620074b1b22064100480d030240024020080d002006102a21070c010b200428024020082006102e21070b2007450d052004200636024420042007360240200428024821080b2004200841016a360248200720086a41003a00000c010b0240024020072008460d00200428024021070c010b200841016a22072008490d02200841017422062007200620074b1b22064100480d020240024020080d002006102a21070c010b200428024020082006102e21070b2007450d042004200636024420042007360240200428024821080b2004200841016a360248200720086a41013a00000240024020042802442207200428024822086b4104490d00200428024021070c010b200841046a22062008490d02200741017422082006200820064b1b22084100480d020240024020070d002008102a21070c010b200428024020072008102e21070b2007450d042004200836024420042007360240200428024821080b2004200841046a360248200720086a20033600000b20042802442108200cad4280808080800484200435024842208620042802402207ad84100102402008450d002007102c0b2010450d01200b102c0c010b1035000b20044180016a24000f0b1033000b290020004101360204200041086a200128020420012802006b41a0016e2201360200200020013602000bf40101047f230041d0006b21020240200128020022032001280204470d00200041003602000f0b2001200341a0016a3602002002200341c2006a29000037012a2002200341ca006a290000370132200241106a220120022903303703002002200341d2006a29000037013a200241186a220420022903383703002002200341da006a2800003601422002200341de006a2f00003b0146200241206a220520022903403703002002200341c0006a2f00003b01282002200229032837030820002003360200200020022903083700042000410c6a2001290300370000200041146a20042903003700002000411c6a20052903003700000bb905020b7f047e23004190016b22032400024002402001280200220420012802042205460d002001200441a0016a22063602002003200441c2006a29000037016a2003200441ca006a290000370172200341c8006a41086a220720032903703703002003200441d2006a29000037017a200341c8006a41106a220820032903783703002003200441da006a280000360182012003200441de006a2f00003b018601200341c8006a41186a22092003290380013703002003200441c0006a2f00003b016820032003290368370348200341286a41186a220a2009290300370300200341286a41106a220b2008290300370300200341286a41086a220c200729030037030020032003290348370328200541e07e6a210d02400340200341086a41186a200a290300220e370300200341086a41106a200b290300220f370300200341086a41086a200c2903002210370300200320032903282211370308200341e8006a41186a200e370300200341e8006a41106a200f370300200341e8006a41086a2010370300200320113703682002450d01200d2004460d022001200641a0016a22053602002003200641c2006a29000037016a2003200641ca006a290000370172200720032903703703002003200641d2006a29000037017a200820032903783703002003200641da006a280000360182012003200641de006a2f00003b01860120092003290380013703002003200641c0006a2f00003b016820032003290368370348200a2009290300370300200b2008290300370300200c200729030037030020032003290348370328200441a0016a21042002417f6a2102200521060c000b0b20002004360200200020032903683702042000410c6a200341f0006a290300370200200041146a200341f8006a2903003702002000411c6a20034180016a2903003702000c010b200041003602000b20034190016a24000bfa0202057f027e230041e0006b22022400200241c0006a41086a2203418be9c500ad42808080808001841002220441086a290000370300200220042900003703402004102c200241206a41086a2205200329030037030020022002290340370320200341d6b5c000ad4280808080b001841002220441086a290000370300200220042900003703402004102c200241306a41086a2206200329030037030020022002290340370330200241c0006a2001109f01024041c000102a22040d001033000b200420022903203700002004200229033037001020042002290040370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241c0006a41106a290000370000200441386a200241c0006a41186a290000370000200241086a200441c000109e01200241086a41106a290300210720022903102108200228020821032004102c20002007420020031b37030820002008420020031b370300200241e0006a24000bf60302037f037e230041f0006b22042400200441206a200110b1010240024002402004290320200441206a41086a29030084500d00200441d0006a41086a2205418be9c500ad42808080808001841002220641086a290000370300200420062900003703502006102c200441306a41086a200529030037030020042004290350370330200541d6b5c000ad4280808080b001841002220641086a290000370300200420062900003703502006102c200441c0006a41086a200529030037030020042004290350370340200441d0006a2001109f0141c000102a2205450d02200520042903303700002005200429034037001020052004290050370020200541086a200441306a41086a290300370000200541186a200441c0006a41086a290300370000200541286a200441d0006a41086a290000370000200541306a200441d0006a41106a290000370000200541386a200441d0006a41186a290000370000200441086a200541c000109e01200441086a41106a290300210720042903102108200428020821062005102c20012008420020061b220820027c22092007420020061b20037c2009200854ad7c10a201200041106a2003370300200041086a2002370300410021050c010b2000418cb5c000360204200041086a4122360200410121050b20002005360200200441f0006a24000f0b1033000b1300200041013602042000418cbfc0003602000b3400200041e0d9c50036020420004100360200200041146a4107360200200041106a418cc0c000360200200041086a420f3702000b2c01017f02404108102a22020d001033000b20004288808080800137020420002002360200200242003700000b2201017f230041106b220224002002410036020020002002109301200241106a24000beb0c0b077f017e017f017e067f027e017f027e027f017e017f230041f0006b22032400200341d0006a41186a22044200370300200341d0006a41106a2205420037030041082106200341d0006a41086a2207420037030020034200370350200341386a41086a22084191b0c200ad4280808080e000841002220941086a290000370300200320092900003703382009102c2007200829030037030020032003290338370350200841acb0c200ad4280808080e000841002220941086a290000370300200320092900003703382009102c20052003290338220a370300200341086a41086a2007290300370300200341086a41106a200a370300200341086a41186a20082903003703002003200a370328200320032903503703082003200341086a412010940120032802042108200328020021092000280000210b2000350004210c200341d0006a200110ae014100210d2003280250210e2003280254210f02400240024002400240024002400240024020032802582210450d002008410020091b2111200e201041057422106a2112200341e4006a2109200e21080340200841086a290300210a200841106a2903002113200829030021142004200841186a290300370300200520133703002007200a3703002003201437035020092000460d0220092900002000290000510d0202402003280260221520114d0d002003410a6a200341ef006a2d00003a0000200320032f006d3b0108200341d8006a2903002114427f2113200329035021164201210a20032d006c2109200329026421170c040b200841206a2108201041606a22100d000b0b200f450d02200e102c0c020b200328026022092002200920024b1b211520032d006c4102722109427f21164200211341002102200329026421174200210a4100210b427f21140b200341cc006a41026a220d200341086a41026a2d00003a0000200320032f01083b014c4120102a2206450d0420062016370300200620093a001c2006201737021420062015360210200620032f014c3b001d200620143703082006411f6a200d2d00003a00000240024020104120470d004101210d20132114410121070c010b200841206a2104201241606a2118200341ed006a2119200341e4006a2109201321144101210d41012107034020042108024002400340200341d0006a41186a200841186a290300370300200341d0006a41106a200841106a290300370300200341d0006a41086a2210200841086a290300370300200320082903003703500240024020092000460d0020092900002000290000510d002003280260220520114d0d01200341086a41026a201941026a2d00003a0000200320192f00003b0108201029030021162003290350211720032d006c21152003290264211a0c040b200a4201510d024200211341002102420021144200210a4100210b0b2012200841206a2208470d000c040b0b2010290300220a201420032903502217201356200a201456200a2014511b22101b21162017201320101b2117200328026022102002201020024b1b210520032d006c410272211542002113410021022003290264211a420021144200210a4100210b0b200341286a41026a200341086a41026a2d000022103a0000200320032f010822043b0128200341d0006a41026a221b20103a0000200320043b015002402007200d470d00200d41016a2210200d490d08200d41017422072010200720104b1b220741ffffff3f712007470d08200741057422104100480d0802400240200d0d002010102a21060c010b2006200d4105742010102e21060b2006450d070b200841206a21042006200d4105746a221020153a001c20102016370308201020173703002010201a37021420102005360210201020032f01503b001d2010411f6a201b2d00003a0000200d41016a210d20182008470d000b0b0240200f450d00200e102c0b200a4201520d03200d2007470d020c010b427f2113427f21140b200d41016a2208200d490d03200d41017422002008200020084b1b220741ffffff3f712007470d03200741057422084100480d0302400240200d0d002008102a21060c010b2006200d4105742008102e21060b2006450d020b2006200d4105746a22082014370308200820133703002008200b36021420082002360210200841186a200c42808080802084370300200d41016a210d0b2003200d36025820032007360254200320063602502001200341d0006a10b001200341f0006a24000f0b1033000b1035000be20c06077f027e017f017e037f0b7e23002206210720064180016b41607122062400200641e0006a41186a22084200370300200641e0006a41106a22094200370300200641e0006a41086a220a420037030020064200370360200641d0006a41086a220b4191b0c200ad4280808080e000841002220c41086a2900003703002006200c290000370350200c102c200a200b29030037030020062006290350370360200b41acb0c200ad4280808080e000841002220c41086a2900003703002006200c290000370350200c102c20092006290350220d370300200641206a41086a200a290300370300200641206a41106a200d370300200641206a41186a200b2903003703002006200d37034020062006290360370320200641186a200641206a4120109401200628021c210b2006280218210c2006200337033020062002370328200620043602384201210e200642013703202006200028000036023c2000350004210d200641e0006a200110ae014100210f200d2005ad42ff0183422086842110200628026021112006280264211202400240024002400240024020062802682205450d00200b4100200c1b210420112005410574220c6a2113200641f4006a21052006290320220e21022006290328221421152006290330221621172006290338221821192011210b0340200b41086a290300210d200b41106a2903002103200b290300211a2008200b41186a29030037030020092003370300200a200d3703002006201a3703600240024020052000460d0020052900002000290000510d000240200628027020044b0d002002210d420021020c020b2009290300211b2006290368211c2006290360211d2006290378211e2002210d420121020c010b4200210e4200211442002116420021184200210d2010211e2015211d2017211c2019211b0b20024201510d02200b41206a210b200d2102200c41606a220c0d000b2006200e3703202006201437032820062016370330200620183703380b2012450d012011102c0c010b2006200d3703202006201537032820062017370330200620193703384120102a2205450d022005201e3703182005201d3703002005201c370308200541106a201b37030002400240200c4120470d004101210f200d210e4101210a0c010b200b41206a210b200641f4006a2109200d210e4101210f4101210a03400240024020092000460d00200d21020340200641e0006a41186a200b41186a290300370300200641e0006a41106a220c200b41106a290300370300200641e0006a41086a200b41086a2903003703002006200b2903003703600240024020092900002000290000510d000240200628027020044b0d002002210d420021020c020b200c290300211e2006290368211a200629036021032006290378211d2002210d420121020c010b4200210e200642003703204200210d201521032017211a2019211e2010211d0b024020024201510d00200d21022013200b41206a220b470d010c050b0b200b41206a210b0c010b0240034020064200370320200d4201510d014200210d2013200b41206a220b470d000b4200210e0c030b200b41206a210b4200210e4200210d201521032017211a2019211e2010211d0b0240200a200f470d00200f41016a220c200f490d06200f410174220a200c200a200c4b1b220a41ffffff3f71200a470d06200a410574220c4100480d0602400240200f0d00200c102a21050c010b2005200f410574200c102e21050b2005450d050b2005200f4105746a220c201a370308200c2003370300200c41106a201e370300200c41186a201d370300200f41016a210f200b2013470d000b0b2012450d012011102c0c010b4100210a410821050b0240200e4201520d00200641e0006a41106a2200200641206a410872220b41106a290300370300200641e0006a41086a220c200b41086a2903003703002006200b2903003703600240200f200a470d00200f41016a220b200f490d03200f4101742209200b2009200b4b1b220a41ffffff3f71200a470d03200a410574220b4100480d0302400240200f0d00200b102a21050c010b2005200f410574200b102e21050b2005450d020b2005200f4105746a220b2006290360370300200b41106a2000290300370300200b41086a200c290300370300200b41186a2010370300200f41016a210f0b2006200f3602682006200a360264200620053602602001200641e0006a10b001200724000f0b1033000b1035000bb20302057f027e230041e0006b22042400200441c0006a41086a2205418be9c500ad42808080808001841002220641086a290000370300200420062900003703402006102c200441206a41086a2207200529030037030020042004290340370320200541e1b5c000ad4280808080f001841002220641086a290000370300200420062900003703402006102c200441306a41086a2208200529030037030020042004290340370330200441c0006a2001109f01024041c000102a22060d001033000b200620042903203700002006200429033037001020062004290040370020200641086a2007290300370000200641186a2008290300370000200641286a2005290000370000200641306a200441c0006a41106a290000370000200641386a200441c0006a41186a290000370000200441086a200641c000109e01200441086a41106a29030021092004290310210a200428020821052006102c2001200a420020051b220a2002200a200a2002562009420020051b220920035620092003511b22061b22027d20092003200920061b22037d200a200254ad7d10aa012000200337030820002002370300200441e0006a24000be70606027f017e057f027e017f037e23004180016b22052400200541306a200210b1010240024002402005290330200541306a41086a29030084500d00200541e0006a41086a2206418be9c500ad428080808080018422071002220841086a290000370300200520082900003703602008102c200541c0006a41086a200629030037030020052005290360370340200641e1b5c000ad4280808080f001841002220841086a290000370300200520082900003703602008102c200541d0006a41086a200629030037030020052005290360370350200541e0006a2001109f0141c000102a2206450d02200620052903403700002006200529035037001020062005290060370020200641086a200541c0006a41086a2209290300370000200641186a200541d0006a41086a220a290300370000200641286a200541e0006a41086a2208290000370000200641306a200541e0006a41106a220b290000370000200641386a200541e0006a41186a220c290000370000200541186a200641c000109e01200541186a41106a290300210d2005290320210e2005280218210f2006102c200820071002220641086a290000370300200520062900003703602006102c2009200829030037030020052005290360370340200841d6b5c000ad4280808080b001841002220641086a290000370300200520062900003703602006102c200a200829030037030020052005290360370350200541e0006a2002109f0141c000102a2206450d02200620052903403700002006200529035037001020062005290060370020200641086a2009290300370000200641186a200a290300370000200641286a2008290000370000200641306a200b290000370000200641386a200c2900003700002005200641c000109e01200541106a290300211020052903082107200528020021082006102c20022007420020081b22112003200e4200200f1b220e200e200356200d4200200f1b220d200456200d2004511b22061b22077c22122010420020081b2004200d20061b22107c2012201154ad7c10a2012001200e20077d200d20107d200e200754ad7d10aa01200041106a200420107d2003200754ad7d370300200041086a200320077d370300410021060c010b2000418cb5c000360204200041086a4122360200410121060b2000200636020020054180016a24000f0b1033000bd40602057f047e23004180016b22042400200441e0006a41086a2205418be9c500ad42808080808001841002220641086a290000370300200420062900003703602006102c200441c0006a41086a2207200529030037030020042004290360370340200541d6b5c000ad4280808080b001841002220641086a290000370300200420062900003703602006102c200441d0006a41086a2208200529030037030020042004290360370350200441e0006a2001109f0102400240024041c000102a2206450d00200620042903403700002006200429035037001020062004290060370020200641086a2007290300370000200641186a2008290300370000200641286a2005290000370000200641306a200441e0006a41106a290000370000200641386a200441e0006a41186a290000370000200441286a200641c000109e01200441286a41106a29030021092004290330210a200428022821052006102c0240200a420020051b220a20025422062009420020051b220920035420092003511b450d00419ccbc0002106411521050c030b200441206a20014104200a20027d220a200920037d2006ad7d220910ad01200428022022060d01200441e0006a41086a2205418be9c500ad42808080808001841002220641086a290000370300200420062900003703602006102c200441c0006a41086a2207200529030037030020042004290360370340200541e1b5c000ad4280808080f001841002220641086a290000370300200420062900003703602006102c200441d0006a41086a2208200529030037030020042004290360370350200441e0006a2001109f0141c000102a2206450d00200620042903403700002006200429035037001020062004290060370020200641086a2007290300370000200641186a2008290300370000200641286a2005290000370000200641306a200441e0006a41106a290000370000200641386a200441e0006a41186a290000370000200441086a200641c000109e01200441086a41106a290300210b2004290310210c200428020821052006102c2001200c420020051b220c20027c2202200b420020051b20037c2002200c54ad7c10aa012001200a200910a201410021060c020b1033000b200428022421050b200020053602042000200636020020044180016a24000bf90506027f017e057f027e017f027e230041f0006b22032400200341d0006a41086a2204418be9c500ad428080808080018422051002220641086a290000370300200320062900003703502006102c200341306a41086a2207200429030037030020032003290350370330200441e1b5c000ad4280808080f001841002220641086a290000370300200320062900003703502006102c200341c0006a41086a2208200429030037030020032003290350370340200341d0006a2000109f01024041c000102a2206450d00200620032903303700002006200329034037001020062003290050370020200641086a2007290300370000200641186a2008290300370000200641286a2004290000370000200641306a200341d0006a41106a2209290000370000200641386a200341d0006a41186a220a290000370000200341186a200641c000109e01200341186a41106a290300210b2003290320210c2003280218210d2006102c200420051002220641086a290000370300200320062900003703502006102c2007200429030037030020032003290350370330200441d6b5c000ad4280808080b001841002220641086a290000370300200320062900003703502006102c2008200429030037030020032003290350370340200341d0006a2000109f0141c000102a2206450d00200620032903303700002006200329034037001020062003290050370020200641086a200341306a41086a290300370000200641186a200341c0006a41086a290300370000200641286a200341d0006a41086a290000370000200641306a2009290000370000200641386a200a2900003700002003200641c000109e01200341106a290300210e20032903082105200328020021042006102c20002005420020041b220f2001200c4200200d1b22052005200156200b4200200d1b220b200256200b2002511b22061b22017c220c200e420020041b2002200b20061b22027c200c200f54ad7c10a2012000200520017d200b20027d2005200154ad7d10aa01200341f0006a24000f0b1033000b130020004104360204200041b4cbc0003602000b34002000418be9c50036020420004100360200200041146a4105360200200041106a41a4e0c000360200200041086a42083702000b3301017f02404110102a22020d001033000b2002420037000820024200370000200042908080808002370204200020023602000b13002000410336020420004194f1c0003602000b3400200041bddbc50036020420004100360200200041146a4103360200200041106a41b0f3c000360200200041086a42083702000b4d01027f230041106b2202240002404104102a22030d001033000b2002420437020420022003360200410020021067200041086a200228020836020020002002290300370200200241106a24000b8c0601077f230041d0006b22022400200241306a41086a220341bddbc500ad42808080808001841002220441086a290000370300200220042900003703302004102c200241206a41086a220520032903003703002002200229033037032020034194f6c000ad4280808080e002841002220441086a290000370300200220042900003703302004102c200241086a2206200329030037030020022002290330370300200241306a41cffac00010ca01024002400240024041c000102a2204450d00200420022903203700002004200229030037001020042002290030370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241c0006a290000370000200441386a200241306a41186a2900003700002001280208220341046a2205417f4c0d01200128020021070240024020050d00410121010c010b2005102a2201450d010b2002410036023820022005360234200220013602302003200241306a10670240024020022802342206200228023822016b2003490d00200228023021050c010b200120036a22052001490d03200641017422082005200820054b1b22084100480d030240024020060d002008102a21050c010b200228023020062008102e21050b2005450d012002200836023420022005360230200821060b200520016a2007200310db051a200241306a41186a2207200120036aad4220862005ad841006220341186a290000370300200241306a41106a2201200341106a290000370300200241306a41086a2208200341086a290000370300200220032900003703302003102c200241186a2007290300370300200241106a2001290300370300200241086a20082903003703002002200229033037030002402006450d002005102c0b200441c000418001102e22040d030b1033000b103a000b1035000b20042002290300370040200441d8006a200241186a290300370000200441d0006a200241106a290300370000200441c8006a200241086a29030037000020004280818080800c37020420002004360200200241d0006a24000b920301057f230041206b2202240020012d0000210302404101102a2204450d00200420033a000020012d00012103200441014102102e2204450d00200420033a000120012d00022103200441024104102e2204450d00200420033a0002200420012d00033a000320012d00042103200441044108102e2204450d00200420033a0004200420012d00053a0005200420012d00063a0006200420012d00073a000720012d00082103200441084110102e2204450d00200420033a0008200420012d00093a0009200420012d000a3a000a200420012d000b3a000b200420012d000c3a000c200420012d000d3a000d200420012d000e3a000e200420012d000f3a000f200241186a22032004ad42808080808002841006220141186a290000370300200241106a2205200141106a290000370300200241086a2206200141086a290000370300200220012900003703002001102c200041186a2003290300370000200041106a2005290300370000200041086a2006290300370000200020022903003700002004102c200241206a24000f0b1033000bb00e030e7f017e037f230041d0026b22022400200241f0016a41086a220341bddbc500ad42808080808001841002220441086a290000370300200220042900003703f0012004102c200241e8006a41086a22052003290300370300200220022903f001370368200341b7b9c000ad4280808080f000841002220441086a290000370300200220042900003703f0012004102c200241b0016a41086a22042003290300370300200220022903f0013703b001200241f0016a2001109f01024041c000102a2201450d0020012002290368370000200120022903b001370010200120022900f001370020200141086a2005290300370000200141186a2004290300370000200141286a2003290000370000200141306a200241f0016a41106a2206290000370000200141386a200241f0016a41186a2207290000370000200241c00036024420022001360240200241c8006a2001ad42808080808008841003108d0102400240200228024822050d00410021030c010b200228024c21082002200241d0006a28020022093602ac01200220053602a80141002103200241003a00200240024002400340024020092003470d00200241003602ac01200341ff0171450d02200241003a00200c020b200220036a200520036a22042d00003a00002002200441016a3602a8012002200341016a22043a00202004210320044120470d000b200241b0026a41086a220a200241086a220b290300370300200241b0026a41106a220c200241106a220d290300370300200241b0026a41186a220e200241186a220f290300370300200220022903003703b0022002200920046b3602ac012002200241a8016a10cc0120022802202203450d00200241f0016a41186a2209200e290300370300200241f0016a41106a220e200c290300370300200241f0016a41086a220c200a290300370300200241f0016a41286a220a200b290300370300200241f0016a41306a220b200d290300370300200241f0016a41386a220d200f290300370300200220022903b0023703f0012002200229030037039002200241246a2802002104200241286a220f2903002110200241b0016a41086a200c290300370300200241b0016a41106a200e290300370300200241b0016a41186a2009290300370300200241b0016a41206a2209200229039002370300200241b0016a41286a220c200a290300370300200241b0016a41306a220a200b290300370300200241b0016a41386a220b200d290300370300200220022903f0013703b001200241f0016a200241a8016a10820120022802f0010d012004450d002003102c0b41002103200241003602b801200242013703b0012002410b36026c2002200241c0006a3602682002200241b0016a36020020024184026a4101360200200242013702f401200241d0b0c2003602f0012002200241e8006a36028002200241c49ac500200241f0016a10391a20023502b80142208620023502b001841004024020022802b401450d0020022802b001102c0b0c010b200241d8006a41086a220d200241f0016a41086a280200360200200241e8006a41086a220e200241b0016a41086a290300370300200241e8006a41106a2211200241b0016a41106a290300370300200241e8006a41186a2212200241b0016a41186a290300370300200241e8006a41206a22132009290300370300200241e8006a41286a2209200c290300370300200241e8006a41306a220c200a290300370300200241e8006a41386a220a200b290300370300200220022903f001370358200220022903b001370368200241386a200a290300370300200241306a200c290300370300200f2009290300370300200241206a2013290300370300200241186a2012290300370300200241106a2011290300370300200241086a200e290300370300200241b0026a41086a200d28020036020020022002290368370300200220022903583703b0020b2008450d002005102c0b200241f0016a41086a2205200241086a2903003703002006200241106a2903003703002007200241186a290300370300200241f0016a41206a2209200241206a290300370300200241f0016a41286a200241286a290300370300200241f0016a41306a200241306a290300370300200241f0016a41386a200241386a290300370300200220022903003703f001200241b0016a41086a2206200241b0026a41086a280200360200200220022903b0023703b00102402003450d00200020022903f00137030020002004360244200041c8006a2010370200200041386a200241f0016a41386a290300370300200041306a200241f0016a41306a290300370300200041286a200241f0016a41286a290300370300200041206a2009290300370300200041186a200241f0016a41186a290300370300200041106a200241f0016a41106a290300370300200041086a2005290300370300200041d8006a2006280200360200200041d0006a20022903b0013702000b200020033602402001102c200241d0026a24000f0b1033000b860705017f047e087f057e017f23004180026b22022400200241c0006a2001108e02024002402002290340a7450d00200041003602200c010b200241c0006a41106a290300210320022903482104200241286a2001108e0202402002290328a7450d00200041003602200c010b200241286a41106a290300210520022903302106200241206a20011075024002400240024020022802200d00200128020441306e220741306c2208417f4c0d02200228022421090240024020080d004108210a0c010b2008102a220a450d040b02402009450d004100210b0340200241003a00f801200b220c41016a210b2001280204417f6a21084100210d024002400240024003402008417f460d01200241d8016a200d6a2001280200220e2d00003a0000200120083602042001200e41016a3602002002200d41016a220e3a00f8012008417f6a2108200e210d200e4120470d000b200241b8016a41186a2208200241d8016a41186a290300370300200241b8016a41106a220d200241d8016a41106a290300370300200241b8016a41086a220e200241d8016a41086a290300370300200220022903d8013703b801200241086a2001108e022002290308a70d01200241086a41106a290300210f20022903102110200241f8006a41086a200e2903002211370300200241f8006a41106a200d2903002212370300200241f8006a41186a20082903002213370300200241d8006a41086a220d2011370300200241d8006a41106a220e2012370300200241d8006a41186a22142013370300200220022903b8012211370378200220113703582007200c470d030240200c4101742208200b2008200b4b1b2207ad42307e2211422088a70d002011a7220841004e0d030b1035000b200d41ff0171450d00200241003a00f8010b200241f8006a41086a20024198016a41086a2903003703002007450d04200a102c0c040b02400240200c0d002008102a210a0c010b200a200c41306c2008102e210a0b200a450d060b200a200c41306c6a2208200f3703082008201037030020082002290358370310200841186a200d290300370300200841206a200e290300370300200841286a2014290300370300200b2009470d000b0b200a0d010b200041003602200c030b20002004370300200020073602242000200a3602202000200637031020002003370308200041286a2009360200200041186a20053703000c020b103a000b1033000b20024180026a24000bb90d08027f017e027f017e047f027e017f037e230041e0016b22062400200641e0006a41086a2207418be9c500ad428080808080018422081002220941086a290000370300200620092900003703602009102c200641c0006a41086a220a200729030037030020062006290360370340200741d6b5c000ad4280808080b00184220b1002220941086a290000370300200620092900003703602009102c200641d0006a41086a220c200729030037030020062006290360370350200641e0006a2001109f010240024041c000102a2209450d00200920062903403700002009200629035037001020092006290060370020200941086a200a290300370000200941186a200c2903003700004128210d200941286a2007290000370000200941306a200641e0006a41106a220e290000370000200941386a200641e0006a41186a220f290000370000200641286a200941c000109e01200641286a41106a290300211020062903302111200628022821122009102c200720081002220941086a290000370300200620092900003703602009102c200a2007290300370300200620062903603703402007200b1002220941086a290000370300200620092900003703602009102c200c200729030037030020062006290360370350200641e0006a2002109f0141c000102a2209450d00200920062903403700002009200629035037001020092006290060370020200941086a200641c0006a41086a290300370000200941186a200641d0006a41086a290300370000200941286a200641e0006a41086a290000370000200941306a200e290000370000200941386a200f290000370000200641106a200941c000109e01200641106a41106a2903002113200629031821142006280210210a2009102c41dffac000210920034280a094a58d1d7c2208200354220720042007ad7c220b200454200820035a1b0d0102402011420020121b221120087d22152011562010420020121b2210200b7d2011200854ad7d220820105620082010511b4101470d0041868dc2002109411d210d0c020b20134200200a1b210b20144200200a1b21100240200342ffffe883b1de165620044200522004501b0d002010200b8450450d0041a38dc2002109411f210d0c020b200641086a200141022015200810ad01024020062802082209450d00200628020c210d0c020b0240201020037c22112010542209200b20047c2009ad7c2210200b542010200b511b450d0041c28dc2002109412d210d0c020b41002109024020012002470d000c020b024020012002412010dd050d000c020b0240201542ffffe883b1de165620084200522008501b0d0020050d004187fbc0002109411b210d0c020b20012015200810a201200641e0006a41086a2209418be9c500ad42808080808001841002220741086a290000370300200620072900003703602007102c200641c0006a41086a220a200929030037030020062006290360370340200941d6b5c000ad4280808080b001841002220741086a290000370300200620072900003703602007102c200641d0006a41086a220c200929030037030020062006290360370350200641e0006a2002109f0141c000102a2207450d00200720062903403700002007200629035037001020072006290060370020200741086a200a290300370000200741186a200c290300370000200741286a2009290000370000200741306a200641e0006a41106a290000370000200741386a200641e0006a41186a290000370000410021092006200741c0004101410041001097012006280200210a2007102c0240200a4101460d00200210a101200641e0006a41386a2010370300200641e0006a41306a2011370300200641e0006a41086a41003a0000200641e9006a2002290000370000200641f1006a200241086a290000370000200641f9006a200241106a29000037000020064181016a200241186a290000370000200641033a006041014100200641e0006a1092010b200641c8016a4200370300200641c0016a4280a094a58d1d370300200641b8016a2004370300200641b0016a2003370300200641e0006a41086a41023a0000200641e9006a200129000037000020064189016a2002290000370000200641f1006a200141086a290000370000200641f9006a200141106a29000037000020064181016a200141186a29000037000020064191016a200241086a29000037000020064199016a200241106a290000370000200641a1016a200241186a290000370000200641033a006041014100200641e0006a10920120022011201010a2014280a094a58d1d420010a9010c010b1033000b2000200d36020420002009360200200641e0016a24000be90408027f017e037f017e017f027e037f017e23004180016b2203240020012002844200522204ad2105024020040d00200341c0006a41186a22064200370300200341c0006a41106a22074200370300200341c0006a41086a2208420037030020034200370340200341f0006a41086a2204418be9c500ad428080808080018422091002220a41086a2900003703002003200a290000370370200a102c2008200429030037030020032003290370220b3703602003200b370340200441c9b5c000ad4280808080d00184220c1002220a41086a2900003703002003200a290000370370200a102c20072003290370220b370300200341206a41086a220d2008290300370300200341206a41106a220e200b370300200341206a41186a220f20042903003703002003200b37036020032003290340370320200341086a200341206a4120109e01200341086a41106a290300210b200329031021102003280208210a20064200370300200742003703002008420037030020034200370340200420091002220741086a290000370300200320072900003703702007102c20082004290300370300200320032903702209370360200320093703402004200c1002220741086a290000370300200320072900003703702007102c200620042903002209370300200d2008290300370300200e2003290370220c370300200f20093703002003200c370360200320032903403703202003200b4200200a1b370348200320104200200a1b370340200341206aad4280808080800484200341c0006aad428080808080028410010b2000200137030820002005370300200041106a200237030020034180016a24000bb3ac010f017f017e047f017e077f017e027f017e027f017e027f017e157f027e0e7f230041f0056b2200240042002101200041b0036a41186a4200370300200041b0036a41106a22024200370300200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b0043703b0032004419883c100ad4280808080a001841002220541086a290000370300200020052900003703b0042005102c200220002903b0042206370300200041c0056a41086a2003290300370300200041c0056a41106a2006370300200041c0056a41186a20042903003703002000200637038803200020002903b0033703c005200041b0036a200041c0056a412010d0010240024020002802b00322070d0041012107410021080c010b20002902b4032201422088a721080b0240024002400240200841ffffff3f712008470d0020084105742204417f4c0d000240024020040d00410121090c010b2004102a2209450d020b4100210a4100210b4100210c02402008450d00200841057421052009210420072103034020042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200441206a2104200341206a2103200541606a22050d000b200841057441606a41057641016a210c2008210b0b200041b0036a41186a22084200370300200041b0036a41106a220d4200370300200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b0043703b003200441eae5c200ad4280808080f000841002220541086a290000370300200020052900003703b0042005102c20004188036a41086a20042903002206370300200020002903b004220e370388032002200e370000200241086a2006370000200041c0056a41086a2003290300370300200041c0056a41106a200d290300370300200041c0056a41186a2008290300370300200020002903b0033703c005200041b0036a200041c0056a10d10120002902b403420020002802b00322031b2206422088a7220541306c220841306d21040240024020080d004101210f0c010b200441ffffff3f712004470d04200441057422084100480d042008102a220f450d022004210a0b2006a721102003410820031b210d0240024020050d00410021080c010b200541306c210541002108200f2104200d21030340200341086a2900002106200341106a290000210e20032900002111200441186a200341186a290000370000200441106a200e370000200441086a200637000020042011370000200841016a2108200441206a2104200341306a2103200541506a22050d000b0b02402010450d00200d102c0b02402001a722042001422088a7220d6b20084f0d00200d20086a2203200d490d04200441017422052003200520034b1b220341ffffff3f712003470d04200341057422054100480d040240024020040d002005102a21070c010b200720044105742005102e21070b2007450d022001422088a7210d2003ad21010b2007200d4105746a200f200841057410db051a0240200a450d00200f102c0b200041b0036a41186a220f4200370300200041b0036a41106a220a4200370300200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b0043703b003200441a283c100ad42808080809001841002220541086a290000370300200020052900003703b0042005102c20004188036a41086a20042903002206370300200020002903b004220e370388032002200e370000200241086a2006370000200041c0056a41086a2003290300370300200041c0056a41106a200a290300370300200041c0056a41186a200f290300370300200020002903b0033703c005200041b0036a200041c0056a10d10120002902b403420020002802b00322041b2206422088a7220341306c220241306d210f410021050240024020020d004101210a4100210f0c010b200f41ffffff3f71200f470d04200f41057422024100480d042002102a220a450d020b2006a721122004410820041b211002402003450d00200341306c210241002105200a2104201021030340200341086a2900002106200341106a290000210e20032900002111200441186a200341186a290000370000200441106a200e370000200441086a200637000020042011370000200541016a2105200441206a2104200341306a2103200241506a22020d000b0b200d20086a211302402012450d002010102c0b024002402001a7220420136b2005490d00200142ffffffff0f8321140c010b201320056a22032013490d04200441017422082003200820034b1b220341ffffff3f712003470d04200341057422084100480d040240024020040d002008102a21070c010b200720044105742008102e21070b2007450d022003ad21140b200720134105746a200a200541057410db051a0240200f450d00200a102c0b200041c0056a10d201200041b0036a20002802c005220420002802c80510d301024020002802c405450d002004102c0b200041e0026a41086a200041b0036a41086a22032903002206370300200041e0026a41106a200041b0036a41106a2208290300220e370300200041e0026a41186a200041b0036a41186a22022903002211370300200041e0026a41206a200041b0036a41206a2d000022043a0000200020002903b00322013703e00220004188036a41206a20043a000020004188036a41186a201137030020004188036a41106a200e37030020004188036a41086a20063703002000200137038803200041b0036a20004188036a10d4010240024020002802d00322040d004104211541002108410021160c010b200041c0056a41186a2002290300370300200041c0056a41106a2008290300370300200041c0056a41086a2003290300370300200020002903b0033703c00520002902d4032106412c102a2215450d02201520002903c0053702002015200637022420152004360220201541186a200041c0056a41186a2204290300370200201541106a200041c0056a41106a2203290300370200201541086a200041c0056a41086a2208290300370200200041c0056a41206a20004188036a41206a2d00003a0000200420004188036a41186a290300370300200320004188036a41106a290300370300200820004188036a41086a29030037030020002000290388033703c005200041b0036a200041c0056a10d401024020002802d003220d0d0041012108410121160c010b41022102412c210341012108410121160340200041c0046a41186a200041b0036a41186a2903002206370300200041c0046a41106a200041b0036a41106a290300220e370300200041c0046a41086a200041b0036a41086a2903002211370300200020002903b00322013703c00420002902d4032117200041e0046a41186a220f2006370300200041e0046a41106a220a200e370300200041e0046a41086a22102011370300200020013703e004024020082016470d00200841016a22042008490d0620022004200220044b1b2216ad422c7e2206422088a70d062006a722044100480d060240024020080d002004102a21150c010b201520032004102e21150b2015450d040b201520036a220420002903e004370200200441186a200f290300370200200441106a200a290300370200200441086a2010290300370200200441246a2017370200200441206a200d360200200241026a21022003412c6a2103200841016a2108200041b0036a200041c0056a10d40120002802d003220d0d000b0b2000420037028405200041d0e1c100360280052008201320056a22046a2218ad42e0007e2206422088a70d002006a72219417f4c0d00410821120240024020190d004108211a4108211b0c010b2019102a221a450d02201a211b0b410021134100211c024020044105742202450d002002410575221cad42d8007e2206422088a70d042006a722034100480d042003102a2212450d020b02402004450d00200241606a211d200041e0036a2103200041d8036a211e2012210d41002105200721040340200041e0026a41186a220f200441186a220a290000370300200041e0026a41106a2210200441106a2213290000370300200041e0026a41086a221f200441086a2220290000370300200020042900003703e002200041c0056a41186a200a290000370300200041c0056a41106a2013290000370300200041c0056a41086a2020290000370300200020042900003703c00520004180056a200041c0056a200510d501200041b0036a41086a4200370300200041b0036a41106a4200370300200041b0036a41186a4200370300200041b0036a41206a4200370300201e4200370300200341186a200f290300370000200341106a2010290300370000200341086a201f290300370000200320002903e002370000200042003703b003200d200041b0036a41d00010db05220d41d0006a41003a0000200d41d8006a210d200441206a2104200541016a2105200241606a22020d000b201d41057641016a21130b02402014500d002007102c0b0240024020182008412c6c2204412c6d2203490d00201821210c010b201841017422052003200520034b1b2221ad42e0007e2206422088a70d042006a722034100480d040240024020180d002003102a211a0c010b201a20192003102e211a0b201a450d02201a211b0b201520046a212202400240024020080d0041002123201521240c010b200041e0046a41106a211f20152104201a21254100212302400340200041c0046a41186a2203200441186a290200370300200041c0046a41106a2205200441106a290200370300200041c0046a41086a2208200441086a290200370300200020042902003703c0042004412c6a212420042802202226450d02200441286a2802002110200441246a2802002127200041e0026a41186a22282003290300370300200041e0026a41106a22292005290300370300200041e0026a41086a222a2008290300370300200020002903c0043703e002200041d0026a200041e0026a10d6012010ad42c8007e2206422088a70d042006a72204417f4c0d04200041d0026a41086a290300211720002903d00221140240024020040d004108211e0c010b2004102a221e450d060b02400240024020100d0041002110410021200c010b202620104105746a211d410021202026210d0340200d41086a2900002106200d41106a290000210e200d2900002111200041b0036a41186a2207200d41186a290000370300200041b0036a41106a2218200e370300200041b0036a41086a22192006370300200020113703b003200d41206a210d20004180056a2104200028028405210f024003402004280200220241086a210320022f0106220a4105742104410021050240024003402004450d01200041b0036a2003412010dd052208450d02200441606a2104200541016a2105200341206a21032008417f4a0d000b2005417f6a210a0b200f450d02200f417f6a210f2002200a4102746a4194036a21040c010b0b2013200220054102746a41e8026a220328020022044d0d032012200441d8006c6a22042903202106200441286a290300210e200041e0046a41186a22024200370300201f4200370300200041e0046a41086a22054200370300200042003703e004200041b0046a41086a2204418be9c500ad42808080808001841002220841086a290000370300200020082900003703b0042008102c20052004290300370300200020002903b0043703e004200441c9b5c000ad4280808080d001841002220841086a290000370300200020082900003703b0042008102c200041b0056a41086a20042903002211370300200020002903b00422013703b005201f2001370000201f41086a2011370000200041c0056a41086a2005290300370300200041c0056a41106a201f290300370300200041c0056a41186a2002290300370300200020002903e0043703c005200041b8026a200041c0056a4120109e01200041a8026a20002903c002200041b8026a41106a290300427f420010e1052013200328020022044d0d0520004198026a2014201720002903a802420020002802b80222051b221142012011420156200041a8026a41086a290300420020051b22114200522011501b22051b2011420020051b10e1052012200441d8006c6a220441286a427f200e20062000290398027c22112006542205ad7c220120052001200e54201120065a1b22051b3703002004427f201120051b37032020004188036a41186a2205200729030037030020004188036a41106a2208201829030037030020004188036a41086a22022019290300370300200020002903b00337038803200328020021030240024020202010460d00202021040c010b201041016a22042010490d0c2010410174220f2004200f20044b1b220fad42c8007e2206422088a70d0c2006a722044100480d0c0240024020100d002004102a211e0c010b201e201041c8006c2004102e211e0b201e450d0a20102104200f21100b201e200441c8006c6a2204420037030020042003360220200441186a4200370300200441106a4200370300200441086a420037030020042000290388033702242004412c6a2002290300370200200441346a20082903003702002004413c6a2005290300370200202041016a21200b200d201d470d000b0b02402027450d002026102c0b20004190056a41186a2208202829030037030020004190056a41106a2202202929030037030020004190056a41086a220d202a290300370300200020002903e00237039005200041e0046a41186a220f4200370300201f4200370300200041e0046a41086a22034200370300200042003703e004200041b0046a41086a2204418be9c500ad42808080808001841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b0043703e004200441c9b5c000ad4280808080d001841002220541086a290000370300200020052900003703b0042005102c200041b0056a41086a20042903002206370300200020002903b004220e3703b005201f200e370000201f41086a2006370000200041c0056a41086a2003290300370300200041c0056a41106a201f290300370300200041c0056a41186a200f290300370300200020002903e0043703c00520004180026a200041c0056a4120109e01200041f0016a20002903880220004180026a41106a290300427f420010e105200041e0016a2014201720002903f001420020002802800222041b220642012006420156200041f0016a41086a290300420020041b22064200522006501b22041b2006420020041b10e10520254200370308202520002903e00137030020254200370310202541186a4200370300202541286a42003703002025420137032020252020360238202520103602342025201e360230202520002903900537023c202541c4006a200d290300370200202541cc006a2002290300370200202541d4006a2008290300370200202341016a2123202541e0006a21252024210420242022470d010c040b0b41d087c600200420131038000b41a888c600200420131038000b20242022460d000340202441206a2802002203450d012024412c6a21040240202441246a280200450d002003102c0b2004212420222004470d000b0b02402016450d002015102c0b41c007102a2207450d0141f006102a222b450d014100212841142129024002402013411420134114491b222a0d004114212c410021150c010b201241a87f6a2126201341d8006c2124201b202341e0006c6a21184114211d200041b0036a41186a2116200041b0036a41106a211e200041b0036a41086a21274100211541002125034002402013450d00202421032012210403400240200441d0006a2d00000d0002400240200441206a290300220e200441286a29030022118450450d0042002106427f210e427f21110c010b427f2106200041d0016a427f427f200e201110e105200041d0016a41086a290300211120002903d001210e0b2004200e37030020042011370308200441106a2006370300200441186a20063703000b200441d8006a2104200341a87f6a22030d000b0b201b210802402023450d0002400340024020082802382204450d00200441c8006c2105200828023041206a210403402013200428020022034d0d0302402012200341d8006c6a22032d00500d0020032903202206200341286a290300220e84500d00200041b0036a2008290310200841186a2903002008290300200841086a2903002006200e10d701200320032903002206427f2006427f20002903b80320002802b00341014622021b22117c220e200e200654220d200341086a220f2903002206427f201e29030020021b22017c200dad7c220e200654200e2006511b22021b201120018450220d1b370300200f2006427f200e20021b200d1b3703000b200441c8006a2104200541b87f6a22050d000b0b200841e0006a22082018460d020c000b0b41a888c600200320131038000b202541016a21252024210420262103201221050340024020040d00201d212c0c030b200441a87f6a2104200341d8006a2103200541d0006a2108200541d8006a2202210520082d00000d000b02402004450d00200341086a2903002106200341186a290300210e200341106a2903002111200329030021014100210503400240200220056a220841d0006a2d00000d00200841086a29030022172006200120062011200e200829030022142017200841106a290300222d200841186a290300222e10d80141ff0171410146220d1b210620142001200d1b2101202e200e200d1b210e202d2011200d1b211120082003200d1b21030b2004200541d8006a2205470d000b20030d00201d212c0c020b200341013a005002402023450d002003410c6a211f200341306a2120201b21050340200541e0006a2119024020052802382208450d0020052802302104200841c8006c2108034002400240201f2004460d00200441246a2020412010dd050d010b200541186a22022903002101200341086a220d2903002106200529031021112003290300210e20032903102117200441186a200341186a220f290300370300200441106a2017370300200420064200200620017d200e201154ad7d2217200e20117d2214200e56201720065620172006511b220a1b20112001845022101b3703082004200e42002014200a1b20101b370300200d2903002106200f290300210e2003290300211120052003290310370320200541286a200e37030020052011370310200220063703000b200441c8006a2104200841b87f6a22080d000b0b2019210520192018470d000b0b2016200341c8006a290000370300201e200341c0006a2900003703002027200341386a290000370300200020032900303703b003200341286a29030021062003290320210e024002402015201d460d00201d212c0c010b201d41016a2204201d490d06201d41017422032004200320044b1b222cad42307e2211422088a70d062011a722044100480d0602400240201d0d002004102a21070c010b2007201d41306c2004102e21070b2007450d04201d2115202c211d0b20272903002111201e29030021012016290300211720002903b00321142007201541306c6a2204200e37032020042014370300200441286a2006370300200441186a2017370300200441106a2001370300200441086a2011370300201541016a21152025202a490d000b0b02402023450d00201b202341e0006c6a2124201541306c211841142129200041c0056a41186a2119200041c0056a41106a211d200041c0056a41086a212541002128201b211f03402019201f41d4006a290000370300201d201f41cc006a2900003703002025201f41c4006a2900003703002000201f29003c3703c0050240201f2802382204450d00201f280230220a200441c8006c6a2120201f41106a211e41002110410421134100210f0340200a220d41246a2105200d41c8006a210a410021082018210320072104024003402003450d01024020052004460d0020042005412010dd052102200841016a2108200341506a2103200441306a210420020d010b0b418094ebdc0321040240201e200d10d9010d00410021030240200d290310201f29032085200d41186a290300201f41286a29030085844200520d00200041b0036a428094ebdc034200200d290300200d41086a290300201e290300201e41086a29030010d70120002802b0034101460d0120002903b803220e42ff93ebdc0356200041b0036a41106a29030022064200522006501b0d01200ea721030b200321040b200020043602b0032000418094ebdc033602b403200041b0036a2004418094ebdc034b4102746a2802002103200041b0036a41186a2205200d413c6a290000370300200041b0036a41106a2208200d41346a290000370300200041b0036a41086a2202200d412c6a2900003703002000200d2900243703b00302400240200f2010460d00200f21040c010b201041016a22042010490d092010410174220d2004200d20044b1b220dad42247e2206422088a70d092006a722044100480d090240024020100d002004102a21130c010b2013201041246c2004102e21130b2013450d0720102104200d21100b2013200441246c6a220420002903b003370200200229030021062008290300210e2005290300211120042003360220200441186a2011370200200441106a200e370200200441086a2006370200200f41016a210f0b200a2020470d000b024002400240200f450d0002400240200f41246c22050d00410021030c010b201341206a2104410021030340200428020020036a2103200441246a21042005415c6a22050d000b0b02404100418094ebdc0320036b22042004418094ebdc034b1b220d200f6e2204418094ebdc032004418094ebdc03491b2202450d00201341206a2104410021030340200f2003460d032000417f2004280200220520026a220820082005491b22053602b0032000418094ebdc033602b4032004200041b0036a2005418094ebdc034b4102746a280200360200200441246a2104200f200341016a2203470d000b0b0240200d2002200f6c6b2202450d00410021040340200f2004200f7022034d0d042000417f2013200341246c6a2203280220220541016a220820082005491b22053602b0032000418094ebdc033602b4032003200041b0036a2005418094ebdc034b4102746a280200360220200441016a22042002490d000b0b200041b0036a41186a22032019290300370300200041b0036a41106a2205201d290300370300200041b0036a41086a22082025290300370300200020002903c0053703b003024020282029470d00202941016a22042029490d0a202941017422022004200220044b1b2204ad422c7e2206422088a70d0a2006a722024100480d0a0240024020290d002002102a212b0c010b202b2029412c6c2002102e212b0b202b450d0820292128200421290b202b2028412c6c6a220420002903b003370200200829030021062005290300210e200329030021112004200f3602282004201036022420042013360220200441186a2011370200200441106a200e370200200441086a2006370200202841016a21280c030b2010450d022013102c0c020b41d087c6002003200f1038000b41d087c6002003200f1038000b201f41e0006a221f2024470d000b0b0240201c450d002012102c0b02402023450d00202341e0006c2103201b41306a210403400240200441046a280200450d002004280200102c0b200441e0006a2104200341a07f6a22030d000b0b02402021450d00201a102c0b20002802800520002802840520002802880510da010240024020070d0041012113200041013a00b403200041093a00b00341014100200041b0036a109201200041c0056a21020c010b42002106200041b0036a41186a4200370300200041b0036a41106a222f420037030041082108200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b004220e370388032000200e3703b003200441eae5c200ad4280808080f000841002220541086a290000370300200020052900003703b0042005102c202f20002903b004220e370300200041c0056a41086a2003290300370300200041c0056a41106a200e370300200041c0056a41186a20042903003703002000200e37038803200020002903b0033703c005200041b0036a200041c0056a10d101024020002802b0032204450d00200041c0056aad4280808080800484100520002902b4032106200421080b2006422088a7220441306c220341306d2130410021220240024020030d0041012131410021300c010b203041ffffff3f712030470d05203041057422034100480d052003102a2231450d030b2006a7210202402004450d00200441306c21054100212220312104200821030340200341086a2900002106200341106a290000210e20032900002111200441186a200341186a290000370000200441106a200e370000200441086a200637000020042011370000202241016a2122200441206a2104200341306a2103200541506a22050d000b0b02402002450d002008102c0b42002106200041b0036a41186a22024200370300200041b0036a41106a220d420037030041082108200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b004220e370388032000200e3703b003200441a283c100ad42808080809001841002220541086a290000370300200020052900003703b0042005102c20004188036a41086a2004290300220e370300200020002903b004221137038803202f2011370000202f41086a200e370000200041c0056a41086a2003290300370300200041c0056a41106a200d290300370300200041c0056a41186a2002290300370300200020002903b0033703c005200041b0036a200041c0056a10d101024020002802b0032204450d00200041c0056aad4280808080800484100520002902b4032106200421080b2006422088a7220441306c220341306d21324100211b0240024020030d0041012133410021320c010b203241ffffff3f712032470d05203241057422034100480d052003102a2233450d030b2006a7210202402004450d00200441306c21054100211b20332104200821030340200341086a2900002106200341106a290000210e20032900002111200441186a200341186a290000370000200441106a200e370000200441086a200637000020042011370000201b41016a211b200441206a2104200341306a2103200541506a22050d000b0b02402002450d002008102c0b024002400240201541306c2203450d00200721040340200441286a2903002106200441206a290300210e200041e0046a41186a200441186a290200370300200041e0046a41106a200441106a290200370300200041e0046a41086a200441086a290200370300200020042902003703e004200e2006844200520d02200441306a2104200341506a22030d000b0b410121184100211e0240202c0d00410021190c020b2007102c410021190c010b200041e0026a41086a2205200041e0046a41086a290300370300200041e0026a41106a2208200041e0046a41106a290300370300200041e0026a41186a2202200041e0046a41186a290300370300200020002903e004220637039005200020063703e0024120102a2218450d03201820002903e002370000201841186a2002290300370000201841106a2008290300370000201841086a20052903003700000240024020034130470d004101211e410121190c010b200441306a21052007201541306c6a220241506a210d4101211e4101211903402005210402400340200441286a2903002106200441206a290300210e200041e0046a41186a2203200441186a290200370300200041e0046a41106a2205200441106a290200370300200041e0046a41086a2208200441086a290200370300200020042902003703e004200e2006844200520d012002200441306a2204470d000c030b0b200041c0056a41086a20082903002206370300200041c0056a41106a2005290300220e370300200041c0056a41186a20032903002211370300200020002903e00422013703c00520004190056a41186a2208201137030020004190056a41106a220f200e37030020004190056a41086a220a2006370300200020013703900502402019201e470d00201e41016a2203201e490d08201e41017422052003200520034b1b221941ffffff3f712019470d08201941057422034100480d0802400240201e0d002003102a21180c010b2018201e4105742003102e21180b2018450d060b200441306a21052018201e4105746a2203200029039005370000200341186a2008290300370000200341106a200f290300370000200341086a200a290300370000201e41016a211e200d2004470d000b0b202c450d002007102c0b200042003702e402200041d0e1c1003602e0020240201e450d00201e410574210320182104034020004188036a41186a200441186a29000037030020004188036a41106a200441106a29000037030020004188036a41086a200441086a2900003703002000200429000037038803200041b0036a41186a4200370300200041b0036a41106a4200370300200041b0036a41086a4200370300200042003703b003200041003602d803200042083703d003200041c0056a200041e0026a20004188036a200041b0036a10db01024020002802e0052205450d0020002802e405450d002005102c0b200441206a2104200341606a22030d000b0b02402028412c6c2204450d00202b20046a2120200041e0046a41106a2113418be9c500ad42808080808001842117202b211003400240201028022841246c2204450d002010280220221220046a211f0340200041c0016a201010d601200041c0016a41086a290300210e20002903c0012111200041e0046a41186a2208420037030020134200370300200041e0046a41086a22034200370300200042003703e004200041b0046a41086a220420171002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b0043703e004200441c9b5c000ad4280808080d001841002220541086a290000370300200020052900003703b0042005102c200041b0056a41086a20042903002206370300200020002903b00422013703b00520132001370000201341086a2006370000200041c0056a41086a2003290300370300200041c0056a41106a2013290300370300200041c0056a41186a2008290300370300200020002903e0043703c005200041a8016a200041c0056a4120109e0120004198016a20002903b001200041a8016a41106a290300427f420010e10520004188016a2011200e200029039801420020002802a80122041b22064201200642015620004198016a41086a290300420020041b22064200522006501b22041b2006420020041b10e105200041f8006a2000290388012206428094ebdc0380220e4200201222023502202211420010e005200041f8006a41086a2903002000290378220120112006200e4280ec94a37c7e7c7e22062006428094ebdc038022064280ec94a37c7e7c4280cab5ee01562006a76aad7c2206200154ad7c210e200241246a2112200041e0026a210420002802e402210f024003402004280200220d41086a2103200d2f0106220a4105742104410021050240024003402004450d0120022003412010dd052208450d02200441606a2104200541016a2105200341206a21032008417f4a0d000b2005417f6a210a0b200f450d02200f417f6a210f200d200a4102746a41f8066a21040c010b0b200d41e8026a200541306c6a2104024020022010460d0020022010412010dd05450d002004427f2004290310221120067c220120012011542203200441186a22052903002211200e7c2003ad7c220120115420012011511b22031b3703102005427f200120031b37030020004188036a41186a2202201041186a29000037030020004188036a41106a220d201041106a29000037030020004188036a41086a220f201041086a2900003703002000201029000037038803200441286a2105200441206a2108024020042802282203200441246a280200470d00200341016a22042003490d0b2003410174220a2004200a20044b1b220aad42307e2211422088a70d0b2011a722044100480d0b0240024020030d002004102a21040c010b2008280200200341306c2004102e21040b2004450d0920082004360200200841046a200a360200200528020021030b2008280200200341306c6a220420002903880337030020042006370320200441186a2002290300370300200441106a200d290300370300200441086a200f290300370300200441286a200e3703002005200528020041016a3602000c010b2004427f2004290300221120067c220120012011542203200441086a22052903002211200e7c2003ad7c220120115420012011511b22031b3703002005427f200120031b3703002004427f2004290310221120067c220620062011542203200441186a22052903002206200e7c2003ad7c220e200654200e2006511b22031b3703102005427f200e20031b3703000b2012201f470d000b0b2010412c6a22102020470d000b0b4108213420004190056a41086a200041e0026a41086a280200360200200020002903e0023703900502400240201e0d00410021354100212a0c010b201e41057422044105752235ad42307e2206422088a70d052006a722034100480d052003102a2234450d03201820046a211e200041e0046a41106a21134100212a418be9c500ad428080808080018421172034210d2018210f0340200f41086a2900002106200f41106a290000210e200f2900002111200041b0036a41186a2212200f41186a290000370300200041b0036a41106a221f200e370300200041b0036a41086a22202006370300200020113703b003200f41206a210f20004190056a2104200028029405210a024003402004280200220241086a210320022f01062210410574210441002105024003402004450d01200041b0036a2003412010dd052208450d03200441606a2104200541016a2105200341206a21032008417f4a0d000b2005417f6a21100b0240200a450d00200a417f6a210a200220104102746a41f8066a21040c010b0b41cec4c10041da001054000b20004188036a41186a2208201229030037030020004188036a41106a220a201f29030037030020004188036a41086a22102020290300370300200020002903b003370388032002200541306c6a22044180036a290300210e200441f8026a2903002111200041e0046a41186a2202420037030020134200370300200041e0046a41086a22034200370300200042003703e004200041b0046a41086a220420171002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b0043703e004200441c9b5c000ad4280808080d001841002220541086a290000370300200020052900003703b0042005102c200041b0056a41086a20042903002206370300200020002903b00422013703b00520132001370000201341086a2006370000200041c0056a41086a2003290300370300200041c0056a41106a2013290300370300200041c0056a41186a2002290300370300200020002903e0043703c005200041e0006a200041c0056a4120109e01200041d0006a2000290368200041e0006a41106a290300427f420010e105200041c0006a20002903504200200028026022041b220642012006420156200041d0006a41086a290300420020041b22064200522006501b22041b2006420020041b2011200e10e005200d41186a2008290300370300200d41106a200a290300370300200d41086a2010290300370300200d200029038803370300200d41286a200041c0006a41086a290300370300200d2000290340370320202a41016a212a200d41306a210d200f201e470d000b0b02402019450d002018102c0b4100213602400240202a410d202a410d491b22370d004108211341002126410021230c010b203741306c2204102a2213450d03024020040d0041002126203721230c010b203741306c210841002105410021260340203420056a22042903002106200441086a290300210e200441106a2903002111200441186a2903002101201320056a220341286a200441286a290300370300200341206a200441206a290300370300200341186a2001370300200341106a2011370300200341086a200e37030020032006370300202641016a21262008200541306a2205470d000b0240024020264115490d0020264101762238ad42307e2206422088a70d042006a72204417f4c0d040240024020040d00410821394108210a0c010b2004102a2239450d062039210a0b201341506a213a201341f07e6a213b410421204100213c41002124410021122026212503402025210d41002125410121020240200d417f6a2205450d000240024002400240024002402013200541306c6a200d41306c220f20136a41a07f6a412010dd054100480d00200d417e6a2108203b200f6a210441002125410021030340024020082003470d00200d21020c080b200341016a2103200441306a2004412010dd052105200441506a21042005417f4a0d000b200341016a21022003417f73200d6a21050c010b203b200f6a210402400340024020054101470d00410021050c020b2005417f6a2105200441306a2004412010dd052103200441506a210420034100480d000b0b200d2005490d01200d20264b0d03200d20056b22024101762208450d00203a200f6a21042013200541306c6a21030340200041b0036a41286a220f200341286a2210290300370300200041b0036a41206a221f200341206a221e290300370300200041b0036a41186a2218200341186a2219290300370300200041b0036a41106a221d200341106a2225290300370300200041b0036a41086a2215200341086a2223290300370300200020032903003703b003200441086a22162903002106200441106a2227290300210e200441186a221a2903002111200441206a221c2903002101200441286a222129030021172003200429030037030020102017370300201e2001370300201920113703002025200e370300202320063703002021200f290300370300201c201f290300370300201a20182903003703002027201d29030037030020162015290300370300200420002903b003370300200441506a2104200341306a21032008417f6a22080d000b0b024020050d00200521250c050b0240200241094d0d00200521250c050b200d20264b0d01200d20056b21082013200541306c6a210f0340200d2005417f6a2225490d040240200d20256b22024102490d002013200541306c6a22042013202541306c6a2205412010dd05417f4a0d002005290300210620052004290300370300200041b0036a41286a2218200541286a2203290300370300200041b0036a41206a2219200541206a2210290300370300200041b0036a41186a221d200541186a221f290300370300200041b0036a41106a2215200541106a221e290300370300200041b0036a41086a2223200541086a22162903003703002016200441086a290300370300201e200441106a290300370300201f200441186a2903003703002010200441206a2903003703002003200441286a290300370300200020063703b0034101211e024020024103490d00200541e0006a200041b0036a412010dd05417f4a0d0041022103200f210402400340200441286a200441d8006a290300370300200441206a200441d0006a290300370300200441186a200441c8006a290300370300200441106a200441c0006a290300370300200441086a200441386a2903003703002004200441306a221029030037030020082003460d01200441e0006a211f2003211e20102104200341016a2103201f200041b0036a412010dd05417f4a0d020c000b0b2003211e0b2005201e41306c6a220420002903b003370300200441286a2018290300370300200441206a2019290300370300200441186a201d290300370300200441106a2015290300370300200441086a20232903003703000b2025450d05200f41506a210f200841016a2108202521052002410a4f0d050c000b0b2005200d1047000b200d2005417f6a2225490d010b200d2026103f000b2025200d1047000b02402012203c470d00203c41016a2204203c490d09203c41017422032004200320044b1b220441ffffffff01712004470d09200441037422034100480d0902400240203c0d002003102a21200c010b2020203c4103742003102e21200b2020450d072004213c202421120b202020124103746a2204200236020420042025360200202441016a221221240240024020124102490d0002400340024002400240024020202012417f6a22244103746a2204280200450d00201241037420206a220841746a2802002205200428020422034d0d000240201241024b0d0020122124410221122025450d080c090b20202012417d6a221e4103746a2802042204200320056a4d0d010240201241034b0d0020122124410321122025450d080c090b200841646a280200200420056a4d0d01201221240c060b20124103490d012004280204210320202012417d6a221e4103746a28020421040b20042003490d010b2012417e6a211e0b0240024002400240024002402012201e41016a22154b2223450d002012201e4b2216450d012020201e4103746a2218280204222720182802006a2204202020154103746a2219280200221d490d02200420264b0d032013201d41306c6a22102019280204221f41306c22036a2108200441306c21052004201d6b220d201f6b2204201f4f0d0420392008200441306c220310db051a200a20036a210202400240201f4101480d00200441014e0d010b20082104200a21050c060b203a20056a21032008210403402003200441506a2208200241506a220d200d2008412010dd05410048220f1b2205290300370300200341286a200541286a290300370300200341206a200541206a290300370300200341186a200541186a290300370300200341106a200541106a290300370300200341086a200541086a2903003703002002200d200f1b21020240201020082004200f1b2204490d00200a21050c070b200341506a2103200a2105200a2002490d000c060b0b41d087c600201520121038000b41d087c600201e20121038000b201d20041047000b20042026103f000b20392010200310db051a200a20036a210202400240201f4101480d00200d201f4a0d010b20102104200a21050c010b201320056a210f200a210520102104034020042008200520082005412010dd05410048220d1b2203290300370300200441286a200341286a290300370300200441206a200341206a290300370300200441186a200341186a290300370300200441106a200341106a290300370300200441086a200341086a2903003703002005200541306a200d1b2105200441306a2104200841306a2008200d1b2208200f4f0d01200220054b0d000b0b20042005200220056b220320034130706b10db051a02402016450d002018201d360200201841046a2027201f6a3602002023450d022019201941086a20122015417f736a41037410dc051a20242112202441014d0d030c010b0b41a888c600201e20121038000b418ab4c000411d41acfec5001036000b20250d010b0b0240203c450d002020102c0b2038450d012039102c0c010b20264102490d002026417f6a2103202641306c20136a41506a21024101210503400240024002400240202620032204417f6a2203490d00202620036b220d4102490d032013200441306c6a22042013200341306c6a2208412010dd05417f4a0d032008290300210620082004290300370300200041b0036a41286a2212200841286a220f290300370300200041b0036a41206a221f200841206a220a290300370300200041b0036a41186a2220200841186a2210290300370300200041b0036a41106a221e200841106a2218290300370300200041b0036a41086a2219200841086a221d290300370300201d200441086a2903003703002018200441106a2903003703002010200441186a290300370300200a200441206a290300370300200f200441286a290300370300200020063703b00341012104200d4103490d02200841e0006a200041b0036a412010dd05417f4a0d024100210d200221040340200441286a200441d8006a290300370300200441206a200441d0006a290300370300200441186a200441c8006a290300370300200441106a200441c0006a290300370300200441086a200441386a2903003703002004200441306a220a2903003703002005200d220f460d02200f417f6a210d200441e0006a2110200a21042010200041b0036a412010dd05417f4a0d020c000b0b200320261047000b4102200f6b21040b2008200441306c6a220420002903b003370300200441286a2012290300370300200441206a201f290300370300200441186a2020290300370300200441106a201e290300370300200441086a20192903003703000b200241506a21022005417f6a210520030d000b0b203721230b2013202641306c6a221220136b220341306e21040240024020030d004101211d0c010b200441057422034100480d052003102a221d450d03200421360b0240024020132012470d00410021050c010b2013202641306c6a210841002105201d210420132103034020042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200541016a2105200441206a21042008200341306a2203470d000b0b024002402034202a41306c6a2034203741306c6a6b22040d0041082118410021160c010b200441306e211620044100480d052004102a2218450d030b02400240202a410d4b0d00410121274100210a2018210f410121100c010b203741306c202a41306c22046b2108200420346a41506a21044100210a201821030340200441086a2903002106200441106a290300210e200441186a290300211120042903002101200341286a200441286a290300370300200341206a200441206a290300370300200341186a2011370300200341106a200e370300200341086a200637030020032001370300200341306a2103200441506a2104200a41016a210a200841306a22080d000b200a41ffffff3f71200a470d05200a41057422044100480d052004102a2210450d032018200a41306c6a210f410021270b024002402018200f470d00410021080c010b410021082010210420182103034020042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200841016a2108200441206a2104200f200341306a2203470d000b0b200041b0036a201d20052031202210dc01200041c4036a280200220d41ffffff3f71200d470d01200d410574221f417f4c0d01200041c0036a280200212a20002802bc03211520002802b403212220002802b003211a02400240201f0d00410121200c010b201f102a2220450d030b02400240200d0d0041002104410021030c010b200d41057421022020210420152103034020042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200441206a2104200341206a2103200241606a22020d000b200d41057441606a41057641016a2103200d21040b20202003201d200510dd0102402004450d002020102c0b02400240201f0d00410121190c010b201f102a2219450d030b02400240200d0d004100210d410021040c010b200d41057421052019210420152103034020042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200441206a2104200341206a2103200541606a22050d000b200d41057441606a41057641016a21040b200041b0036a201020082033201b10dc01200041c4036a2802002105200041c0036a280200210220002802bc032103024020002802b403450d0020002802b003102c0b02400240200d20046b20054105742205410575221f490d002004201f6a2125200d21240c010b2004201f6a22252004490d05200d410174221f2025201f20254b1b222441ffffff3f712024470d052024410574221f4100480d0502400240200d0d00201f102a21190c010b2019200d410574201f102e21190b2019450d030b201920044105746a2003200510db051a02402002450d002003102c0b0240200c450d002009200c4105746a211f024020260d0020084105742102200921080340200841086a2900002106200841106a290000210e20082900002111200041c0056a41186a200841186a290000370300200041c0056a41106a200e370300200041c0056a41086a2006370300200020113703c005200841206a210820022103201021040240024003402003450d01200041c0056a2004460d02200341606a21032004200041c0056a412010dd052105200441206a210420050d000c020b0b200041206a200041c0056a4280809aa6eaafe301420010bf012000290320200041206a41086a29030010a9010b2008201f470d000c020b0b200841057421202026410146211e2009210d0340200d41086a2900002106200d41106a290000210e200d2900002111200041c0056a41186a200d41186a290000370300200041c0056a41106a200e370300200041c0056a41086a2006370300200020113703c005410021030240201e0d0041002103202621050340200041b0036a41186a20132005410176220820036a220241306c6a220441186a290000370300200041b0036a41106a200441106a290000370300200041b0036a41086a200441086a290000370300200020042900003703b00320022003200041b0036a200041c0056a412010dd054101481b2103200520086b220541014b0d000b0b200d41206a210d200041b0036a41186a2013200341306c6a220441186a290000370300200041b0036a41106a200441106a290000370300200041b0036a41086a200441086a290000370300200020042900003703b00320202103201021040240200041b0036a200041c0056a412010dd05450d00024003402003450d01200041c0056a2004460d02200341606a21032004200041c0056a412010dd052105200441206a210420050d000c020b0b200041306a200041c0056a4280809aa6eaafe301420010bf012000290330200041306a41086a29030010a9010b200d201f470d000b0b0240200b450d002009102c0b02402025450d0020254105742103201921040340200441086a2900002106200441106a290000210e20042900002111200041b0036a41186a200441186a290000370300200041b0036a41106a200e370300200041b0036a41086a2006370300200020113703b003200041106a200041b0036a4280809aa6eaafe301420010bf012000290310200041106a41086a29030010a901200441206a2104200341606a22030d000b0b02402024450d002019102c0b200041b0036a41186a22084200370300200041b0036a41106a22024200370300200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b004220637038803200020063703b003200441eae5c200ad4280808080f000841002220541086a290000370300200020052900003703b0042005102c20004188036a41086a20042903002206370300200020002903b004220e37038803202f200e370000202f41086a2006370000200041c0056a41086a2003290300370300200041c0056a41106a2002290300370300200041c0056a41186a2008290300370300200020002903b0033703c005200041003602b803200042013703b0032026200041b0036a1067024002402026450d002013210403402004200041b0036a109101200441286a2903002106200441206a290300210e0240024020002802b403220820002802b80322036b4110490d0020002802b00321050c010b200341106a22052003490d08200841017422032005200320054b1b22024100480d080240024020080d002002102a21050c010b20002802b00320082002102e21050b2005450d06200020023602b403200020053602b00320002802b8032103200221080b200520036a220220063700082002200e3700002000200341106a22033602b8032012200441306a2204470d000c020b0b20002802b803210320002802b403210820002802b00321050b200041c0056aad428080808080048422112003ad4220862005ad84100102402008450d002005102c0b200041b0036a41186a22084200370300200041b0036a41106a22024200370300200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200020052900003703b0042005102c20032004290300370300200020002903b004220637038803200020063703b003200441a283c100ad42808080809001841002220541086a290000370300200020052900003703b0042005102c20004188036a41086a20042903002206370300200020002903b004220e37038803202f200e370000202f41086a2006370000200041c0056a41086a2003290300370300200041c0056a41106a2002290300370300200041c0056a41186a2008290300370300200020002903b0033703c005200041003602b803200042013703b003200a200041b0036a1067024002402027450d0020002802b803210320002802b403210820002802b00321050c010b2018210403402004200041b0036a109101200441286a2903002106200441206a290300210e0240024020002802b403220820002802b80322036b4110490d0020002802b00321050c010b200341106a22052003490d07200841017422032005200320054b1b22024100480d070240024020080d002002102a21050c010b20002802b00320082002102e21050b2005450d05200020023602b403200020053602b00320002802b8032103200221080b200520036a220220063700082002200e3700002000200341106a22033602b803200f200441306a2204470d000b0b20112003ad4220862005ad84100102402008450d002005102c0b2026ad42307e2206422088a70d012006a72204417f4c0d010240024020040d004108210d0c010b2004102a220d450d030b0240024020122013470d00410021050c010b2013202641306c6a210841002105200d2104201321030340200341086a2903002106200341106a290300210e200341186a290300211120032903002101200441286a200341286a290300370300200441206a200341206a290300370300200441186a2011370300200441106a200e370300200441086a200637030020042001370300200441306a2104200541016a21052008200341306a2203470d000b0b2005ad42307e2206422088a70d012006a72204417f4c0d010240024020040d004108210f0c010b2004102a220f450d030b410021080240200541306c2202450d0041002108200f2104200d21030340200341086a2903002106200341106a290300210e200341186a290300211120032903002101200441286a200341286a290300370300200441206a200341206a290300370300200441186a2011370300200441106a200e370300200441086a200637030020042001370300200441306a2104200841016a2108200341306a2103200241506a22020d000b0b200041c0036a2008360200200041bc036a2005360200200041b8036a200f360200200041003a00b403200041093a00b003200020002f00c0053b00b5032000200041c2056a2d00003a00b70341014100200041b0036a10920102402026450d00200d102c0b0240202a450d002015102c0b02402022450d00201a102c0b0240200a450d002010102c0b02402016450d002018102c0b02402036450d00201d102c0b02402023450d002013102c0b02402035450d002034102c0b200028029805210220002802900521040240024020002802940522050d00200421030c010b2005210820042103034020032802f80621032008417f6a22080d000b0340200420042f01064102746a41f8066a28020021042005417f6a22050d000b0b200041cc036a20042f0106360200200041c8036a4100360200200041c4036a2004360200200020023602d003200041003602c003200042003703b803200020033602b403200041003602b003200041b0036a10de0102402032450d002033102c0b02402030450d002031102c0b02402028450d002028412c6c2103202b41206a210403400240200441046a280200450d002004280200102c0b2004412c6a2104200341546a22030d000b0b41002113200041c0056a21022029450d00202b102c0b200041b0036a41186a22054200370300200041b0036a41106a22084200370300200041b0036a41086a22034200370300200042003703b003200041b0046a41086a220441e5d6c500ad428080808080028422061002220d41086a2900003703002000200d2900003703b004200d102c20032004290300370300200020002903b004220e370388032000200e3703b0032004419883c100ad4280808080a001841002220d41086a2900003703002000200d2900003703b004200d102c200820002903b004220e370300200041c0056a41086a220d2003290300370300200041c0056a41106a220f200e370300200041c0056a41186a220a20042903003703002000200e37038803200020002903b0033703c0052002ad4280808080800484220e1005200542003703002008420037030020034200370300200042003703b003200420061002221041086a290000370300200020102900003703b0042010102c20032004290300370300200020002903b004221137038803200020113703b003200441f5d6c500ad4280808080e0018422111002221041086a290000370300200020102900003703b0042010102c200520042903002201370300200d2003290300370300200f20002903b0042217370300200a20013703002000201737038803200020002903b0033703c005200041086a2002412010940120002802082102200028020c2110200542003703002008420037030020034200370300200042003703b003200420061002220841086a290000370300200020082900003703b0042008102c20032004290300370300200020002903b004220637038803200020063703b003200420111002220841086a290000370300200020082900003703b0042008102c200520042903002206370300200d2003290300370300200f20002903b0042211370300200a20063703002000201137038803200020002903b0033703c0052000201041016a410120021b3602b003200e200041b0036aad4280808080c0008410010240024020070d00200b450d042013410173450d010c040b2013450d030240202c450d002007102c0b02402028450d002028412c6c2103202b41206a210403400240200441046a280200450d002004280200102c0b2004412c6a2104200341546a22030d000b0b02402029450d00202b102c0b200b450d030b2009102c0c020b103a000b1033000b200041f0056a24000f0b1035000bbc0201017f230041e0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036022420032001360220200341c8006a200341206a108201024002402003280248450d0020002003290348370200200041086a200341c8006a41086a2802003602000c010b20034100360230200342013703282003410b36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341d0b0c2003602482003200341386a360258200341c4006a41c49ac500200341c8006a10391a2003350230422086200335022884100420004100360200200328022c450d002003280228102c0b2002450d002001102c0b200341e0006a24000bbc0201027f230041e0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a107f024002402002280248450d0020002002290348370200200041086a200241c8006a41086a2802003602000c010b20024100360230200242013703282002410b36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241d0b0c2003602482002200241386a360258200241c4006a41c49ac500200241c8006a10391a2002350230422086200235022884100420004100360200200228022c450d002002280228102c0b2003450d002001102c0b200241e0006a24000bb30303047f017e017f230041d0006b22012400200141c0006a41086a220241e5d6c500ad42808080808002841002220341086a290000370300200120032900003703402003102c200141206a41086a2204200229030037030020012001290340370320200241a2fbc000ad4280808080d001841002220341086a290000370300200120032900003703402003102c200141306a41086a20022903002205370300200141086a2004290300370300200141186a20053703002001200129034022053703302001200129032037030020012005370310024002404101450d004120210402400240024002404120450d004120102a22020d010c050b411021044110102a2202450d04200141106a210320022001290300370000200241086a200141086a2903003700000c010b20022001290300370000200241086a200141086a290300370000200141106a21034120210641204110470d010b20022004200441017422064120200641204b1b2206102e2202450d020b20022003290000370010200241186a200341086a290000370000200041203602082000200636020420002002360200200141d0006a24000f0b103a000b1033000bd50302047f047e230041f0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022040d00200041003a00000c010b200341186a28020021052003280214210641002101200341003a006802400340024020052001470d000240200141ff0171450d00200341003a00680b4100210120034100360228200342013703202003410b3602442003200341086a3602402003200341206a36026c200341dc006a41013602002003420137024c200341d0b0c2003602482003200341c0006a360258200341ec006a41c49ac500200341c8006a10391a200335022842208620033502208410042003280224450d022003280220102c0c020b200341c8006a20016a200420016a2d00003a00002003200141016a22023a00682002210120024120470d000b200341206a41186a200341c8006a41186a2903002207370300200341206a41106a200341c8006a41106a2903002208370300200341206a41086a200341c8006a41086a290300220937030020032003290348220a370320200041196a2007370000200041116a2008370000200041096a20093700002000200a370001410121010b200020013a00002006450d002004102c0b200341f0006a24000bbe0703037f047e037f23002202210320024180036b41607122022400200141186a22042900002105200420022903f80137000020012900102106200120022903f00137001020012900082107200120022903e801370008200241003a00e00120012900002108200120022903e0013700002002200537039801200220063703900120022007370388012002200837038001200141206a2d00002104200241e0016a41176a22092005370000200241e0016a41106a220a200229009101370300200241e0016a41086a220b20022900890137030020022002290081013703e001024002402008a741ff01714101460d00200041003602200c010b200241186a41176a2009290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e001370318200220043a0037200241d0016a200241186a108402200241e0016a20022802d001220420022802d80110a002024020022d00ec014102470d00200241003602c802200242013703c002200241d0026a41146a410d360200200241dc026a410b360200200241103602ec02200241e5d6c5003602e8022002410b3602d402200241073602f402200241affbc0003602f0022002200241d0016a3602e0022002200241f0026a3602d8022002200241e8026a3602d0022002200241c0026a3602fc02200241386a41146a41033602002002420337023c200241a89cc5003602382002200241d0026a360248200241fc026a41c49ac500200241386a10391a20023502c80242208620023502c00284100420004100360220024020022802c402450d0020022802c002102c0b20022802d401450d0120022802d001102c200324000f0b20024180016a200241e0016a41d00010db051a024020022802d401450d002004102c0b200241d0026a41086a220420024180016a41086a28020036020020022002290380013703d002200241386a2002418c016a41c20010db051a200141206a200241f9006a2d00003a0000200141186a200241f1006a290000370000200141106a200241e9006a290000370000200141086a200241e1006a29000037000020012002290059370000200241e0016a41186a200241186a41186a2903002205370300200241e0016a41106a200241186a41106a2903002208370300200241e0016a41086a200241186a41086a2903002206370300200020022903182207370200200041086a2006370200200041106a2008370200200041186a2005370200200220073703e001200041206a20022903d002370200200041286a2004280200360200200324000f0b200324000bac1b03087f047e107f23004180056b22032400200341d0006a41186a200141186a290000370300200341d0006a41106a200141106a290000370300200341d0006a41086a200141086a290000370300200320012900003703500240024002402000280200220441d0e1c100460d00200028020421050c010b41002105200341c0016a410041e00210da051a200341b8016a22014100360200200341b0016a2206420037030020034190016a41186a420037030020034190016a41106a420037030020034190016a41086a42003703002003420037039001419403102a2204450d01200441003b010620044100360200200441086a200341c0016a41e00210db051a20044190036a200128020036020020044188036a200629030037020020044180036a200341a8016a290300370200200441f8026a200341a0016a290300370200200441f0026a20034190016a41086a29030037020020042003290390013702e80220004100360204200020043602000b024002400340200441086a2106200441066a210720042f010622084105742101410021090240024003402001450d01200341d0006a2006412010dd05220a450d02200141606a2101200941016a2109200641206a2106200a417f4a0d000b2009417f6a21080b2005450d022005417f6a2105200420084102746a4194036a28020021040c010b0b200420094102746a41e8026a20023602000c010b200341086a41186a200341d0006a41186a2201290300220b370300200341086a41106a200341d0006a41106a2206290300220c370300200341086a41086a200341d0006a41086a2209290300220d37030020032003290350220e3703082000200028020841016a3602082001200b3703002006200c3703002009200d3703002003200e37035002400240024020072f01002205410b490d00200341c0016a410041e00210da051a200341b8016a22014100360200200341b0016a2206420037030020034190016a41186a420037030020034190016a41106a420037030020034190016a41086a42003703002003420037039001419403102a220f450d04200f41003b0106200f4100360200200f41086a200341c0016a41e00210db052109200f4190036a2001280200360200200f4188036a2006290300370200200f4180036a20034190016a41186a290300370200200f41f8026a20034190016a41106a290300370200200f41f0026a20034190016a41086a290300370200200f2003290390013702e802200320042f00c8013b018c012003200441ca016a2d00003a008e01200441cb016a2800002110200441cf016a2800002111200441d3016a2800002112200441d7016a28000021132003200441e0016a29000037007d200320042900db0137037820042802800321142009200441e8016a20042f010641796a220141057410db052109200f41e8026a20044184036a200141027410db05210a200441063b0106200f20013b0106200320032f018c013b0174200320032d008e013a007620032003290378370390012003200329007d3700950120084107490d01200f41066a210720092008417a6a22054105746a2009200841796a22064105746a2209200141ffff037120066b41057410dc051a200941186a200341d0006a41186a290300370000200941106a200341d0006a41106a290300370000200941086a200341d0006a41086a29030037000020092003290350370000200a20054102746a2109200a20064102746a21010c020b200441086a220a200841016a22004105746a200a20084105746a220a200520086b41057410dc051a200a41186a2001290300370000200a41106a2006290300370000200a41086a2009290300370000200a2003290350370000200441e8026a220120004102746a200120084102746a220120042f010620086b41027410dc051a20012002360200200420042f010641016a3b01060c020b200441086a2201200841016a22064105746a200120084105746a220120072f010020086b41057410dc051a200141186a200341d0006a41186a290300370000200141106a200341d0006a41106a290300370000200141086a200341d0006a41086a29030037000020012003290350370000200441e8026a220920084102746a2101200920064102746a2109200821060b2009200120072f010020066b41027410dc051a20012002360200200720072f010041016a3b0100200341f0006a41026a221520032d007622013a00002003413c6a41026a221620013a000020032003290095013700452003200329039001370340200320032f017422013b01702003200329004537002d20032003290340370328200320013b013c024020042802002205450d0020042f01042107200341c0016a41027221170340201520162d00003a0000200320032f013c3b0170200320032903283703502003200329002d370055200741ffff0371210402400240024020052f01062201410b490d002017410041be0310da051a41c403102a220a450d06200a4100360200200a41046a200341c0016a41c00310db051a200320052f00c8013b018c012003200541ca016a2d00003a008e012003200541db016a2900003703782003200541e0016a29000037007d200541cb016a2800002118200541cf016a2800002119200541d3016a280000211a200541d7016a280000211b20054180036a280200211c200a41086a200541e8016a20052f0106220641796a220141057410db05211d200a41e8026a20054184036a200141027410db05211e200a4194036a200541b0036a2006417a6a220841027410db052102200541063b0106200a20013b010602402008450d00410021012002210603402006280200220920013b01042009200a360200200641046a21062008200141016a2201470d000b0b200320032d008e0122013a0076200320032f018c0122063b017420032003290378370390012003200329007d37009501200341c0006a41026a220820013a0000200320063b014020032003290390013703c00120032003290095013700c501200741ffff037122064107490d01201d2004417a6a22094105746a201d200441796a22014105746a2206200a2f010620016b41057410dc051a200641186a20032900553700002006201336000f2006201236000b2006201136000720062010360003200641026a20152d00003a0000200620032f01703b000020062003290350370013201e200941027422066a201e20014102746a2207200a2f0106221020016b41027410dc051a20072014360200200a201041016a22073b01062004410274221020026a416c6a200220066a2206200741ffff0371220420096b41027410dc051a2006200f36020020042009490d02200a20106a41fc026a2106034020062802002209200141016a22013b01042009200a360200200641046a210620012004490d000c030b0b200541086a2206200441016a22094105746a200620044105746a2206200120046b41057410dc051a200641186a20032900553700002006201336000f2006201236000b2006201136000720062010360003200641026a200341f0006a41026a2d00003a0000200620032f01703b000020062003290350370013200541e8026a2201200941027422066a20012004410274220a6a220120052f0106220820046b41027410dc051a200120143602002005200841016a22013b0106200a20054194036a22046a41086a200420066a2206200141ffff0371220a20096b41027410dc051a2006200f360200200741ffff0371200a4f0d0420052009417f6a22014102746a4198036a2106034020062802002209200141016a22013b010420092005360200200641046a21062001200a490d000c050b0b200541086a2201200441016a22074105746a200120044105746a220120052f010620046b41057410dc051a200141186a20032900553700002001201336000f2001201236000b2001201136000720012010360003200141026a20152d00003a0000200120032f01703b000020012003290350370013200541e8026a2209200741027422026a2009200441027422016a220920052f0106221020046b41027410dc051a200920143602002005201041016a22093b0106200120054194036a22106a41086a201020026a2202200941ffff0371220920076b41027410dc051a2002200f360200200620094f0d00200520016a4198036a2101034020012802002206200441016a22043b010420062005360200200141046a210120092004470d000b0b201620082d00003a0000200320032f01403b013c200320032903c001370328200320032900c50137002d0240200528020022010d0020182110201b2113201a211220192111200a210f201c21140c020b20052f0104210720182110201b2113201a21122019211120012105201c2114200a210f0c000b0b200341c0016a410272410041be0310da051a41c403102a2201450d0120014100360200200141046a200341c0016a41c00310db051a20012000280200220636029403200020013602002000200028020441016a360204200641003b010420062001360200200120012f010622094105746a220641086a20032f013c3b00002006410a6a2003413c6a41026a2d00003a0000200641176a2013360000200641136a20123600002006410f6a20113600002006410b6a20103600002006411b6a2003290328370000200641206a200329002d37000020014194036a200941016a22064102746a200f360200200120094102746a41e8026a2014360200200120063b0106200f20063b0104200f20013602000b20034180056a24000f0b1033000bfa0202057f027e230041e0006b22022400200241c0006a41086a220341e5d6c500ad42808080808002841002220441086a290000370300200220042900003703402004102c200241206a41086a2205200329030037030020022002290340370320200341fdfbc000ad4280808080f000841002220441086a290000370300200220042900003703402004102c200241306a41086a2206200329030037030020022002290340370330200241c0006a2001109f01024041c000102a22040d001033000b200420022903203700002004200229033037001020042002290040370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241c0006a41106a290000370000200441386a200241c0006a41186a290000370000200241086a200441c000109e01200241086a41106a290300210720022903102108200228020821032004102c20002007420020031b37030820002008420020031b370300200241e0006a24000b852d07017f017e017f027e017f027e187f23004180036b2207240002400240024002402001200284500d002003200484500d004201210820074198016a200320012003200156200420025620042002511b22091b220a2004200220091b220b20054201200542015620064200522006501b220c1b220520064200200c1b220610e10520074188016a200729039801220d20074198016a41086a290300220e2005200610e0052002200420091b21022001200320091b2104200a20072903880185200b20074188016a41086a290300858450450d01200d210a200e210b420021060c020b20004100360200200041106a4200370300200041086a42003703000c020b200741f8006a200420022005200610e105200741e8006a20072903782201200741f8006a41086a29030022032005200610e0054200200620042007290368852002200741e8006a41086a29030085845022091b21064201200520091b21082003200220091b21022001200420091b21040b200741386a200b42002004420010e005200741c8006a20024200200a420010e005200741d8006a200a42002004420010e005024002400240024002400240024002400240024002400240024002400240200b420052200242005271200729034042005272200729035042005272200741d8006a41086a2903002201200729033820072903487c7c2203200154724101470d004110102a2209450d0d2009200a3e020c2009200a4220883e02082009200b3e02042009200b4220883e020020074284808080c00037029c02200720093602980220074198026a10bd05200741a8016a41086a20072802a00236020020072007290398023703a8014110102a2209450d0d200920043e020c200920044220883e0208200920023e0204200920024220883e020020074284808080c00037029c02200720093602980220074198026a10bd05200741b8016a41086a20072802a00236020020072007290398023703b8014110102a2209450d0d20092008a7220f36020c200920084220883e0208200920063e0204200920064220883e020020074284808080c00037029c02200720093602980220074198026a10bd0520072802a0022110200728029c0221112007280298022112200741f0026a41086a200741b8016a41086a280200360200200720072903b8013703f00220074198026a41086a200741a8016a41086a280200360200200720072903a80137039802200741c8016a20074198026a200741f0026a10bf05024020072802f402450d0020072802f002102c0b200741c8016a10bd0520104101460d0120072802cc01211320072802c80121142010450d0a2012280200450d0a024020072802d0012215450d002014280200450d0b201520104d0d0b200720103602d401201520106b221641016a22174101201741014b1b221841ffffffff03712018470d0320184102742209417f4c0d030240024020090d00410421190c010b200910302219450d0f0b201041ffffffff03712010470d032010410274221a417f4c0d0302400240201a0d004104211b0c010b201a1030221b450d0f0b410221094101210f2012280200220c67221c211d0240200c41ffffffff034b0d0041022109201c210c4101210f034020094101200c4101711b200f6c210f200c41034b211e200920096c2109200c410176221d210c201e0d000b0b200720153602f802200720133602f402200720143602f0024104102a220c450d0e200c20094101201d4101461b200f6c220f360200200742818080801037029c022007200c36029802200741d8016a200741f0026a20074198026a10bf05200c102c02400240201a0d00410421090c010b201a102a2209450d0f0b20092012201041027410db052109200720103602f802200720103602f402200720093602f0024104102a2209450d0e2009200f360200200742818080801037029c022007200936029802200741e8016a200741f0026a20074198026a10bf052009102c0240024020072802d40120176a220920072802e001220c4d0d00024002402009200c6b22090d004104210f410021090c010b200941ffffffff03712009470d022009410274220f4100480d02200f102a220f450d11200f4100200941027410da051a0b20072802d801211d2009211e0240200c450d002009200c6a221e2009490d0220094101742214201e2014201e4b1b221e41ffffffff0371201e470d02201e41027422144100480d020240024020090d002014102a210f0c010b200f20094102742014102e210f0b200f450d110b200f20094102746a201d200c41027410db051a2009200c6a2109024020072802dc01450d00201d102c0b200720093602e0012007201e3602dc012007200f3602d8010b200741e8016a10bd050240024002400240024002400240024002400240034020072016221f3602f401024020072802e001220920072802d401220c201f6a220f417f736a221e2009490d0041d087c600201e20091038000b0240024002400240024002400240024002400240024002400240024020092009200f6b220f4d0d0020072802f00122092009200c6b220c4d0d0120072802e801200c4102746a35020022024200510d02201f201f4100476b211620072802d8012209201e4102746a35020021012009200f4102746a3502002104200741003602f80120072004200142208684200280220137038002200741003602880220072004200120027e7d42ffffffff0f83370390022007200741f4016a3602ac022007200741d8016a3602a8022007200741d4016a3602a4022007200741e8016a3602a002200720074188026a36029c022007200741f8016a3602980220074198026a10c0051a034020072802880241016a41004c0d04024020072903900242ffffffff0f560d0020074198026a10c0050d010b0b2007290380022102200720072802d40120072802f40122096a3602f402200720093602f0022007200741d8016a3602fc02200741023a00f802200741b0026a200741f0026a10c30520072802f001220941ffffffff03712009470d1d2009410274220c417f4c0d1d20072802e801210f02400240200c0d004104211e0c010b200c102a221e450d290b201e200f200c10db05210c200720093602e802200720093602e4022007200c3602e0024108102a2209450d2820092002a72220360204200920024220883e020020074282808080203702f402200720093602f002200741c0026a200741e0026a200741f0026a10bf052009102c20072802b802222120072802c8022222202120224b1b22144101201441014b1b220c41ffffffff0371200c470d1d200c410274220f417f4c0d1d20072802b402212320072802b002212402400240200f0d00410421250c010b200f10302225450d290b2014450d062022417f6a221a20224b211520072802c00221262021417f6a221720214b0d04200c417f6a21092025200f6a417c6a211d4100210f4200210203404100211e024020212017200f6b22134d0d004100211e201320174b0d00202420134102746a280200211e0b201ead21044100211e024020150d002022201a200f6b22134d0d002013201a4b0d00202620134102746a280200211e0b024002402004201ead22037d22012004560d00200120027d220a2001560d00200a42ffffffff0f832104420021020c010b20044280808080108420027d20037d2104420121020b200c20094d0d09201d20043e0200201d417c6a211d2009417f6a2109200f41016a220f2014490d000c060b0b41d087c600200f20091038000b41d087c600200c20091038000b419089c600411941b888c6001036000b41c689c6004118200741f0026a41e089c600103b000b200c417f6a21092025200f6a417c6a211e4100211d4200210203404100210f024020150d004100210f2022201a201d6b22134d0d004100210f2013201a4b0d00202620134102746a280200210f0b024002404200200fad22017d22044200520d00200420027d22032004560d00200342ffffffff0f832104420021020c010b428080808010200220017c7d2104420121020b200c20094d0d04201e20043e0200201e417c6a211e2009417f6a2109201d41016a221d2014490d000b0b41012113200250450d010b410021130b02402023450d002024102c0b20072802d401221e20072802f401220f6a2215201e490d05200f20154f0d01200f417f7321090340200c200c200f6a20096a221d4d0d03200920072802e00122146a220f20094f0d0420072802d801200f4102746a2025201d4102746a2802003602002009417f6a210920072802f401210f201e417f6a221e0d000c050b0b41a888c6002009200c1038000b201e450d020c030b41d087c60020222021202220214b1b22074101200741014b1b200f6a20096a200c1038000b41a888c600200f20141038000b200c200c2015417f7322096a200f6a220f4d0d0220072802e001220c20096a2209200c4f0d0320072802d80120094102746a2025200f4102746a28020036020020072802f401210f0b2018200f417f736a220920184f0d03201920094102746a202036020002402013450d00201820072802f401417f736a220920184f0d05201920094102746a22092009280200417f6a36020020072802f401210920072802d401210c200741023a00f8022007200c20096a3602f402200720093602f0022007200741d8016a3602fc02200741d0026a200741f0026a10c30520072802f001220941ffffffff03712009470d102009410274220c417f4c0d1020072802e801210f02400240200c0d004104211e0c010b200c102a221e450d1c0b201e200f200c10db05210c200720093602f802200720093602f4022007200c3602f002200741e0026a200741f0026a200741d0026a10be05024020072802d401220920072802f40122146a220c2009490d00024002402014200c4f0d00200c417f73210920072802e002211320072802e802210f2014211e0340200f200f201e6a20096a221e4d0d0a200920072802e00122156a221d20094f0d0b20072802d801201d4102746a2013201e4102746a280200360200200941016a210920072802f401211e2014200c417f6a220c490d000c020b0b20090d0120072802e802210f2014211e0b201e2014417f7322096a220c200f6a221e200c4f0d0920072802e001220c20096a2209200c4f0d0a20072802d80120094102746a20072802e002201e4102746a2802003602000b024020072802e402450d0020072802e002102c0b20072802d402450d0020072802d002102c0b2025102c024020072802c402450d0020072802c002102c0b201f0d000b0240201c450d004101210920072802d401220c4101460d134100200c6b2114201c411f7121134100201c6b411f7121152010410274201b6a417c6a210c417f210903400240200920072802e001221e6a220f2009490d0041d087c600200f201e1038000b201e200f417f6a221d4d0d0a201020096a221e20104f0d0b200c20072802d801221e201d4102746a280200201574201e200f4102746a28020020137672360200200c417c6a210c20142009417f6a2209460d130c000b0b20072802e001211020072802dc01210f20072802d801211e201b102c410021090c130b41d087c600200f200c1038000b41a888c6002009200c1038000b41a888c600200920181038000b41d087c600200920181038000b41d087c600201e200f1038000b41a888c600201d20151038000b41d087c600201e200f1038000b41a888c6002009200c1038000b41d087c600200f417f6a201e1038000b41a888c600201e20101038000b1035000b41d087c600410041001038000b200741286a200729035820032008200610e10520004100360200200041106a200741286a41086a290300370300200041086a20072903283703000c0e0b20074198026a41086a200741c8016a41086a280200221d360200200720072903c80137039802201d4101201d41014b1b221e41ffffffff0371201e470d00201e4102742209417f4c0d000240024020090d004104211a0c010b20091030221a450d0c0b201d450d02201d417f6a2114201a201e201d6b22134102746a210c200f4101200f41014b1bad21024200210441002109200728029802210f0340201e201320096a22154d0d02200c2004422086200f35020084220420028022013e020020142009460d03200c41046a210c200f41046a210f2004200120027e7d2104201d200941016a22094b0d000b41d087c6002009201d1038000b103a000b41a888c6002015201e1038000b2007201e3602f8022007201e3602f4022007201a3602f002200728029c02450d07200728029802102c0c070b20072802d40121090b20072802e001220c200c20096b220f4d0d012010201020096b22094d0d02201b20094102746a20072802d801200f4102746a280200201c411f7176360200410121092010210f201b211e0b024020072802ec01450d0020072802e801102c0b2009450d0320072802dc01450d0320072802d801102c0c030b41d087c600200f200c1038000b41a888c600200920101038000b4100211902402013450d002014102c0b0b4104102a2209450d01200941003602004104102a220c450d01200c41003602004101211d0240024020190d002009211941012118200c211e4101210f410121100c010b2009102c200c102c0b2007201836028002200720183602fc01200720193602f801200720103602a0022007200f36029c022007201e3602980220074198026a10bd05420021020240024020072802a00222094105744180014d0d00421d21040c010b4100211d024020090d00420021040c010b200728029802220c200941027422096a417c6a220f280200211e0240200c200f470d00201ead21040c010b200c41786a210f201ead2104200741206a211e4120210c420021020340200741186a200f20096a3502004200200c41e0007110de05201e29030020027c2007290318220220047c2204200254ad7c2102200c41206a210c2009417c6a22094104470d000b0b0240200728029c02450d00200728029802102c0b201d0d020240200420084201882006423f8684562002200642018822045620022004511b450d0020074188026a41086a200741f8016a41086a280200360200200720072903f801370388024110102a2209450d0220094280808080103702082009420037020020074284808080c00037029c02200720093602980220074198026a10bd05200741f0026a41086a20072802a00236020020072007290398023703f002200741f8016a20074188026a200741f0026a10be0520072802f402450d0020072802f002102c0b200741f0026a41086a200741f8016a41086a280200360200200720072903f8013703f0020b200741f0026a10bd0520074198026a41086a2209200741f0026a41086a280200360200200720072903f0023703980220074198026a10bd054200210202400240200928020022094105744180014d0d00421d21044101211d0c010b4100211d024020090d00420021040c010b200728029802220c200941027422096a417c6a220f280200211e0240200c200f470d00201ead21040c010b200c41786a210f201ead2104200741106a211e4120210c420021020340200741086a200f20096a3502004200200c41e0007110de05201e29030020027c2007290308220220047c2204200254ad7c2102200c41206a210c2009417c6a22094104470d000b0b0240200728029c02450d00200728029802102c0b02400240201d0d00200041106a2002370300200041086a2004370300410021090c010b200041d08ac600360204200041086a4119360200410121090b200020093602002011450d022012102c0c020b1033000b200720043e029c02200741a989c6003602980241908ac600412f20074198026a41c08ac600103b000b20074180036a24000bd30201037f230041d0006b220824000240024002402002200685200320078584500d00200220038450450d01410121090c020b417f20002004852001200585844200522000200454200120055420012005511b1b21090c010b0240200620078450450d0041ff0121090c010b200841206a2000200110c405200841306a2006200710c405200841c0006a41086a2209200841206a41086a220a280200360200200820082903203703402008200841c0006a200841306a10bf0502402008280234450d002008280230102c0b200841206a2004200510c405200841306a2002200310c4052009200a28020036020020082008290320370340200841106a200841c0006a200841306a10bf0502402008280234450d002008280230102c0b2008200841106a10c105210902402008280214450d002008280210102c0b2008280204450d002008280200102c0b200841d0006a240020090beb0203017f047e017f230041d0006b2202240002400240200029031022032001290310220485200041186a2903002205200141186a29030022068584500d00200241206a2000290300200041086a29030010c405200241306a2004200610c405200241c0006a41086a2200200241206a41086a2207280200360200200220022903203703402002200241c0006a200241306a10bf0502402002280234450d002002280230102c0b200241206a2001290300200141086a29030010c405200241306a2003200510c4052000200728020036020020022002290320370340200241106a200241c0006a200241306a10bf0502402002280234450d002002280230102c0b2002200241106a10c105210002402002280214450d002002280210102c0b200041ff0171210002402002280204450d002002280200102c0b20004521000c010b2000290300200129030085200041086a290300200141086a29030085845021000b200241d0006a240020000b8b0303017f017e027f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d00410021034100210103402002417f6a210202400240200120002f01064f0d00200141016a21010c010b02400240200028020022010d002003ad210441002105410021010c010b20003301044220862003ad842104410121050b2000102c2004a72103024002402004422088a7220620012f01064f0d00200121000c010b034002400240200128020022000d002003ad2104410021000c010b200541016a210520013301044220862003ad8421040b2001102c2004a72103200021012004422088a7220620002f01064f0d000b0b200641027420006a4198036a280200210002402005417f6a2201450d00034020002802940321002001417f6a22010d000b0b410021010b20020d000b0b0240200041d0e1c100460d00200028020021012000102c2001450d00200128020021002001102c2000450d00024020002802002201450d0003402000102c2001210020012802002203210120030d000b0b2000102c0b0bf62803087f057e277f230041d00c6b22042400200441e0016a41186a200241186a290000370300200441e0016a41106a200241106a290000370300200441e0016a41086a200241086a290000370300200420022900003703e0010240024002402001280200220541d0e1c100460d00200128020421060c010b41002106200441c0026a410041e00210da051a200441a8056a410041900410da051a41f806102a2205450d01200541003b010620054100360200200541086a200441c0026a41e00210db051a200541e8026a200441a8056a41900410db051a20014100360204200120053602000b024002400340200541086a2107200541066a210820052f0106220941057421024100210a0240024003402002450d01200441e0016a2007412010dd05220b450d02200241606a2102200a41016a210a200741206a2107200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200520094102746a41f8066a28020021050c010b0b2005200a41306c6a22024180036a2207290300210c2003290300210d2003290308210e2003290310210f2007200341186a290300370300200241f8026a220729030021102007200f370300200241f0026a2207290300210f2007200e370300200241e8026a2207290300210e2007200d370300200441a8056a41086a220720024190036a220a290300370300200420024188036a22022903003703a80520022003290320370300200a200341286a290300370300200441c0026a41086a22022007290300370300200420042903a805220d3703c002200041186a200c370300200020103703102000200f3703082000200e3703002000200d370320200041286a20022903003703000c010b200441186a2202200441e0016a41186a2207290300370300200441106a200441e0016a41106a220a290300220c370300200441086a200441e0016a41086a220b290300220d370300200420042903e001220e3703002001200128020841016a360208200441f8006a41106a2206200c370300200441f8006a41086a2211200d370300200441f8006a41186a221220022903003703002004200e370378200441e0016a41286a2213200341286a290300370300200441e0016a41206a2214200341206a2903003703002007200341186a290300370300200a200341106a290300370300200b200341086a290300370300200420032903003703e00102400240024020082f01002203410b490d00200441c0026a410041e00210da051a200441a8056a410041900410da051a41f806102a2215450d04201541003b010620154100360200201541086a200441c0026a41e00210db052107201541e8026a200441a8056a41900410db05210a200441a8056a41086a220b20054190056a290300370300200441a8056a41106a220320054198056a290300370300200441a8056a41186a2206200541a0056a290300370300200441a8056a41206a2211200541a8056a290300370300200441a8056a41286a2212200541b0056a290300370300200420052900db013703a8022004200541e0016a2900003700ad0220042005290388053703a805200420052f00c8013b01bc022004200541ca016a2d00003a00be02200541cb016a2800002116200541cf016a2800002117200541d3016a2800002118200541d7016a28000021192007200541e8016a20052f010641796a220241057410db052107200a200541b8056a200241306c10db05210a200541063b0106201520023b0106200420042f01bc023b01a402200420042d00be023a00a602200420042903a80237039002200420042900ad0237009502200441c0026a41286a2012290300370300200441c0026a41206a2011290300370300200441c0026a41186a2006290300370300200441c0026a41106a2003290300370300200441c0026a41086a200b290300370300200420042903a8053703c0020240024020094107490d00200941057420076a41c07e6a2007200941796a220b4105746a2207200241ffff0371200b6b41057410dc051a200741186a200441f8006a41186a290300370000200741106a200441f8006a41106a290300370000200741086a200441f8006a41086a29030037000020072004290378370000200941306c200a6a220241e07d6a200241b07d6a2202201541066a22082f0100200b6b41306c10dc051a200241286a200441e0016a41286a290300370300200241206a200441e0016a41206a290300370300200241186a200441e0016a41186a290300370300200241106a200441e0016a41106a290300370300200241086a200441e0016a41086a290300370300200220042903e0013703000c010b200541086a20094105746a220241206a200220082f010020096b41057410dc051a200241186a200441f8006a41186a290300370000200241106a200441f8006a41106a290300370000200241086a200441f8006a41086a29030037000020022004290378370000200541e8026a200941306c6a220241306a200220082f010020096b41306c10dc051a200241286a200441e0016a41286a290300370300200241206a200441e0016a41206a290300370300200241186a200441e0016a41186a290300370300200241106a200441e0016a41106a290300370300200241086a200441e0016a41086a290300370300200220042903e0013703000b200820082f010041016a3b0100200441c8016a41026a220220042d00a6023a000020044198016a41086a221a200441c0026a41086a221b29030037030020044198016a41106a221c200441c0026a41106a221d29030037030020044198016a41186a221e200441c0026a41186a221f29030037030020044198016a41206a2220200441c0026a41206a222129030037030020044198016a41286a2222200441c0026a41286a2223290300370300200420042f01a4023b01c8012004200429039002370368200420042900950237006d200420042903c00237039801200441386a41286a22242022290300370300200441386a41206a22252020290300370300200441386a41186a2226201e290300370300200441386a41106a2227201c290300370300200441386a41086a2228201a290300370300200441346a41026a222920022d00003a00002004200429039801370338200420042903683703202004200429006d370025200420042f01c8013b013420052802002203450d0120052f01042114200441a8056a410272212a0340200441dc016a41026a222b20292d00003a0000200420042f01343b01dc01200420042903203703682004200429002537006d200441e0016a41286a222c2024290300370300200441e0016a41206a222d2025290300370300200441e0016a41186a222e2026290300370300200441e0016a41106a222f2027290300370300200441e0016a41086a22302028290300370300200420042903383703e001201441ffff0371210502400240024020032f01062202410b490d00202a410041a20710da051a41a807102a220b450d08200b4100360200200b41046a200441a8056a41a40710db051a200420032f00c8013b01bc022004200341ca016a2d00003a00be02200420032900db013703a8022004200341e0016a2900003700ad02200341cb016a2800002131200341cf016a2800002132200341d3016a2800002133200341d7016a2800002134200441a8056a41286a2209200341b0056a290300370300200441a8056a41206a2208200341a8056a290300370300200441a8056a41186a2211200341a0056a290300370300200441a8056a41106a221220034198056a290300370300200441a8056a41086a221320034190056a29030037030020042003290388053703a805200b41086a200341e8016a20032f0106220741796a220241057410db052135200b41e8026a200341b8056a200241306c10db052136200b41f8066a20034194076a2007417a6a220641027410db052137200341063b0106200b20023b010602402006450d00410021022037210703402007280200220a20023b0104200a200b360200200741046a21072006200241016a2202470d000b0b2023200929030037030020212008290300370300201f2011290300370300201d2012290300370300201b2013290300370300200420042903a8053703c002200420042f01bc023b01a402200420042d00be023a00a602200420042903a80237039002200420042900ad0237009502200441a4056a41026a220620042d00a6023a0000200420042f01a4023b01a4052004200429039002370378200420042900950237007d20092023290300370300200820212903003703002011201f2903003703002012201d2903003703002013201b290300370300200420042903c0023703a805201441ffff037122074107490d0120352005417a6a220a4105746a2035200541796a22024105746a2207200b2f010620026b41057410dc051a200741186a200429006d3700002007201936000f2007201836000b2007201736000720072016360003200741026a202b2d00003a0000200720042f01dc013b000020072004290368370013200541306c20366a220741e07d6a200741b07d6a2207200b2f0106221420026b41306c10dc051a200741286a202c290300370300200741206a202d290300370300200741186a202e290300370300200741106a202f290300370300200741086a2030290300370300200720042903e001370300200b201441016a22073b01062005410274221620376a416c6a2037200a4102746a2214200741ffff03712205200a6b41027410dc051a201420153602002005200a490d02200b20166a41e0066a210703402007280200220a200241016a22023b0104200a200b360200200741046a210720022005490d000c030b0b200341086a2207200541016a220a4105746a200720054105746a2207200220056b220b41057410dc051a2007201936000f2007201836000b2007201736000720072016360003200741026a200441dc016a41026a2d00003a0000200720042f01dc013b000020072004290368370013200741186a200429006d3700002003200541306c6a22074198036a200741e8026a2206200b41306c10dc051a20074190036a20044188026a29030037030020074188036a20044180026a29030037030020074180036a200441e0016a41186a290300370300200741f8026a200441f0016a290300370300200741f0026a200441e0016a41086a290300370300200620042903e0013703002003200241016a22023b01062005410274200341f8066a22076a41086a2007200a4102746a2207200241ffff0371200a6b41027410dc051a20072015360200201441ffff037120032f010622024f0d052015200a3b010420152003360200200a20024f0d052002417f6a210b2003200a417f6a22024102746a4180076a210703402007280200220a200241026a3b0104200a2003360200200741046a2107200b200241016a2202470d000c060b0b200341086a2202200541016a220a4105746a200220054105746a220220032f0106221420056b223741057410dc051a2002201936000f2002201836000b2002201736000720022016360003200241026a202b2d00003a0000200220042f01dc013b000020022004290368370013200241186a200429006d370000200341e8026a200541306c6a220241306a2002203741306c10dc051a200241286a202c290300370300200241206a202d290300370300200241186a202e290300370300200241106a202f290300370300200241086a2030290300370300200220042903e0013703002003201441016a22023b010620054102742237200341f8066a22146a41086a2014200a4102746a2214200241ffff0371200a6b41027410dc051a20142015360200200720032f0106220a4f0d00200320376a41fc066a2102034020022802002207200541016a22053b010420072003360200200241046a2102200a2005470d000b0b200441d8016a41026a220220062d00003a0000201a2013290300370300201c2012290300370300201e20112903003703002020200829030037030020222009290300370300200420042f01a4053b01d801200420042903783703c8012004200429007d3700cd01200420042903a8053703980120242022290300370300202520202903003703002026201e2903003703002027201c2903003703002028201a290300370300202920022d00003a00002004200429039801370338200420042903c801370320200420042900cd01370025200420042f01d8013b01340240200328020022020d0020312116203421192033211820322117200b21150c030b20032f010421142031211620342119203321182032211720022103200b21150c000b0b200520094105746a220241286a200241086a2201200320096b41057410dc051a200241206a2012290300370000200241186a2006290300370000200241106a2011290300370000200120042903783700002005200941306c6a22024198036a200241e8026a220320052f010620096b41306c10dc051a20024190036a201329030037030020024188036a201429030037030020024180036a2007290300370300200241f8026a200a290300370300200241f0026a200b290300370300200320042903e001370300200520052f010641016a3b01060c010b200441a8056a410272410041a20710da051a41a807102a2202450d0220024100360200200241046a200441a8056a41a40710db051a2002200128020022073602f806200120023602002001200128020441016a360204200741003b010420072002360200200220022f0106220a4105746a220741086a20042f01343b00002007410a6a200441346a41026a2d00003a0000200741176a2019360000200741136a20183600002007410f6a20173600002007410b6a20163600002007411b6a2004290320370000200741206a20042900253700002002200a41306c6a220741e8026a2004290338370300200741f0026a200441386a41086a290300370300200741f8026a200441c8006a29030037030020074180036a200441d0006a29030037030020074188036a200441386a41206a29030037030020074190036a200441e0006a290300370300200241f8066a200a41016a22074102746a2015360200200220073b010620152002360200201520073b01040b200041003602200b200441d00c6a24000f0b1033000bac0901157f230041206b220524002003410020041b21062001410020021b2107200341206a200320041b2108200141206a200120021b2109200120024105746a210a200320044105746a210b4100210c4100210d4101210e4100210f410021104101211102400340200c4101742112200c41057421130240024002400340024020060d0020082114200e2115200d2116200c21020c020b2006210120082103200e2115200d2116200c2102201321042012211702400340024002402007450d0020012007460d0320012007412010dd052214450d032014417f4c0d01200321082015210e2016210d2002210c200121060c060b200541186a2203200641186a290000370300200541106a2202200641106a290000370300200541086a2207200641086a290000370300200520062900003703000240200c200d470d00200c41016a2201200c490d09200c41017422042001200420014b1b220d41ffffff3f71200d470d09200d41057422014100480d0902400240200c0d002001102a210e0c010b200e200c4105742001102e210e0b200e450d070b200e200c4105746a22012005290300370000200141186a2003290300370000200141106a2002290300370000200141086a200729030037000041002107410020082008200b4622011b2106201241026a2112201341206a2113200c41016a210c2008200841206a20011b21080c030b200541186a2214200141186a290000370300200541106a2218200141106a290000370300200541086a2219200141086a29000037030020052001290000370300024020022016470d00200241016a22012002490d0820172001201720014b1b221641ffffff3f712016470d08201641057422014100480d080240024020020d002001102a21150c010b201520042001102e21150b2015450d060b201520046a22012005290300370000200141186a2014290300370000200141106a2018290300370000200141086a2019290300370000410020032003200b4622141b2101201741026a2117200441206a2104200241016a21022003200341206a20141b221421032001450d030c000b0b0b2015210e2016210d2002210c2003200341206a2003200b4622011b2108410020092009200a4622021b21074100200320011b21062009200941206a20021b21090c030b41002106024020070d002000201536020c2000200f3602082000201036020420002011360200200041146a2002360200200041106a2016360200200541206a24000f0b201421082015210e2016210d2002210c0b200541186a2203200741186a290000370300200541106a2202200741106a290000370300200541086a2204200741086a290000370300200520072900003703000240200f2010470d00200f41016a2201200f490d03200f41017422072001200720014b1b221041ffffff3f712010470d03201041057422014100480d0302400240200f0d002001102a21110c010b2011200f4105742001102e21110b2011450d010b2011200f4105746a22012005290300370000200141186a2003290300370000200141106a2002290300370000200141086a2004290300370000410020092009200a4622011b2107200f41016a210f2009200941206a20011b21090c010b0b1033000b1035000b901008087f027e047f017e057f027e017f057e230022042105200441a0016b41607122042400024002400240200141ffffff3f712001470d0020014105742206417f4c0d000240024020060d00410121070c010b2006102a2207450d020b410021084100210602402001450d002001410574210820072106034020062000290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a290000370000200641206a2106200041206a2100200841606a22080d000b200141057441606a41057641016a2106200121080b200420063602102004200836020c2004200736020820072006410041202006676b108903200441e0006a41186a22094200370300200441e0006a41106a220a4200370300200441e0006a41086a220b420037030020044200370360200441286a41086a220841fde7c200ad4280808080b00284220c1002220041086a290000370300200420002900003703282000102c200b200829030037030020042004290328370360200841e1e5c200ad42808080809001841002220041086a290000370300200420002900003703282000102c200a2004290328220d370300200441c0006a41086a220e200b290300370300200441c0006a41106a220f200d370300200441c0006a41186a221020082903003703002004200d3703900120042004290360370340200441e0006a200441c0006a412010d00120042802602200410120001b21112004290264420020001b2212422088a72200450d0220004105742113200441e0006a4114722114200441e0006a4108722115200441c0006a410c722116200441e0006a410c6a2117201121060340200641086a290000210d200641106a2900002118200629000021192009200641186a290000370300200a2018370300200b200d370300200420193703602008200c1002220041086a290000370300200420002900003703282000102c200441186a41086a2201200829030037030020042004290328370318200841f1e5c200ad4280808080e000841002220041086a290000370300200420002900003703282000102c20044190016a41086a220720082903003703002004200429032837039001200441c0006a200441e0006a109f0141c000102a2200450d0220002004290318370000200020042903900137001020002004290040370020200041086a2001290300370000200041186a2007290300370000200041286a200e290000370000200041306a200f290000370000200041386a2010290000370000200441e0006a200041c00010e5032008201741086a290200370300200441286a41106a221a201741106a28020036020020042017290200370328024020042802682201450d002004290360210d20162004290328370200201641086a2008290300370200201641106a201a2802003602002004200d3703400b20042001360248200441003602682004290358211920042004290378221b3703582004290350211c20042004290370221d3703502004290340211e2004200429036022183703402004290348210d20042004290368221f370348201fa7210102400240200da7221a0d00201f210d201d211c201b21190c010b2004201e3703602004200d3703682004201c370370200420193703782004201a201ca74105746a3602342004201a3602302004200d422088a736022c2004201a3602282004200441086a36023820044190016a200441286a108501201541086a200728020036020020152004290390013702002004201c422088a7221a2019422088a74105746a3602342004201a36023020042019a736022c2004201a3602282004200441086a36023820044190016a200441286a108501201441086a200728020036020020142004290390013702002004290368210d20042903602118200429037821192004290370211c02402001450d00201ba721070240201f422088a7450d002001102c0b2007450d00201d422088a7102c0b200420183703402004200d3703482004201c37035020042019370358200da721010b200420183703602004200d3703682004201c370370200da72107200420193703780240024020010d002000ad428080808080088410050c010b200441c00036022c20042000360228200441e0006a200441286a10fd030b02402007450d002019a721010240200d422088a7450d002007102c0b2001450d00201c422088a7102c0b200641206a21062000102c201341606a22130d000c030b0b103a000b1033000b02402012a7450d002011102c0b200441c0006a41186a4200370300200441c0006a41106a22014200370300200441c0006a41086a2206420037030020044200370340200441286a41086a220041fde7c200ad4280808080b002841002220841086a290000370300200420082900003703282008102c2006200029030037030020042004290328220d3703182004200d370340200041eae5c200ad4280808080f000841002220841086a290000370300200420082900003703282008102c20012004290328220d370300200441e0006a41086a2006290300370300200441e0006a41106a200d370300200441e0006a41186a20002903003703002004200d370390012004200429034037036020044100360248200442013703402003200441c0006a106702402003450d002003410574210003402002200441c0006a109101200241206a2102200041606a22000d000b0b20042802442100200441e0006aad4280808080800484200435024842208620042802402206ad84100102402000450d002006102c0b0240200428020c450d002004280208102c0b200524000bab0101037f230041d0006b220124002001200010fb030240200141c0006a2802002202450d00034002402001280244450d002002102c0b2001200010fb03200128024022020d000b0b02402000280204220241d0e1c100460d00200228020021032002102c2003450d00200328020021002003102c2000450d00024020002802002202450d0003402000102c2002210020022802002203210220030d000b0b2000102c0b200141d0006a24000bd0700c057f017e017f017e047f027e0b7f017e087f017e047f017e23004180076b2201240010e001024002400240024002400240024020004101470d0010a3010c010b200141d0046a41186a22024200370300200141d0046a41106a22034200370300200141d0046a41086a22044200370300200142003703d004200141b0036a41086a220541bac6c500ad4280808080c0008422061002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b00322083703d003200120083703d004200541dec6c500ad4280808080b001841002220741086a290000370300200120072900003703b0032007102c200320012903b0032208370300200141e0056a41086a22072004290300370300200141e0056a41106a22092008370300200141e0056a41186a220a20052903003703002001200837038801200120012903d0043703e005200141e8006a200141e0056a109801200129037021082001280268210b200242003703002003420037030020044200370300200142003703d004200520061002220c41086a2900003703002001200c2900003703b003200c102c20042005290300370300200120012903b003220d3703d0032001200d3703d004200541bec6c500ad4280808080a001841002220c41086a2900003703002001200c2900003703b003200c102c20022005290300220d37030020072004290300370300200920012903b003220e370300200a200d3703002001200e37038801200120012903d0043703e005200141d8006a200141e0056a1098012001280258210f2001290360210d200242003703002003420037030020044200370300200142003703d004200520061002220c41086a2900003703002001200c2900003703b003200c102c20042005290300370300200120012903b00322063703d003200120063703d004200541d3c6c500ad4280808080b001841002220c41086a2900003703002001200c2900003703b003200c102c20022005290300220637030020072004290300370300200920012903b003220e370300200a20063703002001200e37038801200120012903d0043703e005200141c8006a200141e0056a1098010240420020084200200b1b22062001290350420020012802481b200d42c8017e4200200f1b7c7d220820082006561b42c801540d00200a42003703002009420037030020074200370300200142003703e005200541ecddc500ad4280808080f0008422061002220441086a290000370300200120042900003703b0032004102c20072005290300370300200120012903b003220837038801200120083703e005200541f3ddc500ad4280808080c001841002220441086a290000370300200120042900003703b0032004102c200920012903b0032208370300200141d0036a41086a22042007290300370300200141d0036a41106a22022008370300200141d0036a41186a220c20052903003703002001200837038801200120012903e0053703d003200141c0006a200141d0036a41201094012001280244211020012802402111200a42003703002009420037030020074200370300200142003703e005200520061002220b41086a2900003703002001200b2900003703b003200b102c20072005290300370300200120012903b003220837038801200120083703e005200541ffddc500ad4280808080d001841002220b41086a2900003703002001200b2900003703b003200b102c200a2005290300220837030020042007290300370300200220012903b003220d370300200c20083703002001200d37038801200120012903e0053703d003200141d0036a109501210b10e101200a42003703002009420037030020074200370300200142003703e005200520061002220f41086a2900003703002001200f2900003703b003200f102c20072005290300370300200120012903b003220637038801200120063703e005200541ab83c100ad4280808080a001841002220f41086a2900003703002001200f2900003703b003200f102c200a2005290300220637030020042007290300370300200220012903b0032208370300200c20063703002001200837038801200120012903e0053703d0032001412036027c2001200141d0036a360278200141d0056a200141d0036aad4280808080800484220e1003108d014100211202400240024002400240024020012802d00522020d004100210a0c010b20012802d405210c2001200141d8056a280200360284012001200236028001200141386a20014180016a107502400240024020012802380d00200128028401220741a0016e221341a0016c2205417f4c0d04200128023c21140240024020050d004101210a0c010b2005102a220a450d0d0b02402014450d00200141e0056a41206a2115200141a8026a41017221164100210f0340200141003a00c802200f41016a21174100210502400240024002400340200141003a00af0320072005460d01200141a8026a20056a20012802800122042d00003a00002001200441016a360280012001200541016a22043a00c8022004210520044120470d000b200141d0046a41086a2205200141a8026a41086a290300370300200141d0046a41106a2218200141a8026a41106a290300370300200141d0046a41186a2219200141a8026a41186a290300370300200120012903a8023703d0042001200720046b36028401200141a8026a20014180016a10e20120012d00a8024101460d01200141e0056a41186a2019290300370300200141e0056a41106a2018290300370300200141e0056a41086a2005290300370300200120012903d0043703e0052015201641800110db051a20014188016a200141e0056a41a00110db051a2013200f470d03200f41017422052017200520174b1b2213ad42a0017e2206422088a70d142006a7220541004e0d020c140b2001410036028401200541ff0171450d00200141003a00c8020b200141003602b0032013450d05200a102c0c050b02400240200f0d002005102a210a0c010b200a200f41a0016c2005102e210a0b200a450d0f0b200a200f41a0016c6a20014188016a41a00110db051a20172014460d0120012802840121072017210f0c000b0b200141b8036a2014360200200120133602b4032001200a3602b003200a450d0120012902b40321060c020b200141003602b0030b4100210a200141003602900120014201370388012001410b3602ac022001200141f8006a3602a802200120014188016a3602d004200141f4056a4101360200200142013702e405200141d0b0c2003602e0052001200141a8026a3602f005200141d0046a41c49ac500200141e0056a10391a2001350290014220862001350288018410040240200128028c01450d00200128028801102c0b0b200c450d002002102c0b20064200200a1b221a422088a7221b41a0016c220241a0016e21054101211c02402002450d002005410574102a221c450d09200521120b200b41ff0171210c200a4101200a1b2115410021070240201b450d00201b41a0016c210a41002107201c210520152104034020052004290000370000200541186a200441186a290000370000200541106a200441106a290000370000200541086a200441086a290000370000200741016a2107200541206a2105200441a0016a2104200a41e07e6a220a0d000b0b200c410247210c200141e0056a41186a220f4200370300200141e0056a41106a22144200370300200141e0056a41086a22044200370300200142003703e005200141b0036a41086a220541ecddc500ad4280808080f000841002220a41086a2900003703002001200a2900003703b003200a102c20042005290300370300200120012903b003220637038801200120063703e005200541c9f8c200ad4280808080a001841002220a41086a2900003703002001200a2900003703b003200a102c20014188016a41086a20052903002206370300200120012903b00322083703880120092008370000200941086a2006370000200141d0036a41086a2004290300370300200141d0036a41106a2014290300370300200141d0036a41186a200f290300370300200120012903e0053703d003200141003602e805200142013703e0052007200141e0056a106702402007450d0020074105742104201c210503402005200141e0056a109101200541206a2105200441606a22040d000b0b200b200c71211820012802e4052105200e20013502e80542208620012802e0052204ad84100102402005450d002004102c0b02402018450d00200141e0056a41186a220a4200370300200141e0056a41106a220c4200370300200141e0056a41086a22044200370300200142003703e005200141b0036a41086a220541ecddc500ad4280808080f000841002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b003220637038801200120063703e0052005418cdec500ad4280808080a002841002220741086a290000370300200120072900003703b0032007102c20014188016a41086a20052903002206370300200120012903b00322083703880120092008370000200941086a2006370000200141d0036a41086a2004290300370300200141d0036a41106a200c290300370300200141d0036a41186a200a290300370300200120012903e0053703d003200141e0056a200141d0036a10960120012802e0052205450d00200e100520012802e405450d002005102c0b201520026a21174101211d10a301200141e0056a201041016a410120111b221e10e3010240024020012802e005221f0d00200141e0056a41186a4200370300200141e0056a41106a220a4200370300200141e0056a41086a22044200370300200142003703e005200141b0036a41086a220541ecddc500ad4280808080f000841002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b0033703e005200541c9f8c200ad4280808080a001841002220741086a290000370300200120072900003703b0032007102c200a20012903b003220637030020014188016a41086a200429030037030020014188016a41106a200637030020014188016a41186a2005290300370300200120063703a802200120012903e00537038801200141e0056a20014188016a412010d00120012902e405420020012802e00522051b21062005410120051b21204100211f410021210c010b200141e8056a3502002106200141f0056a280200210a200141ec056a280200210720012802e40521220240200141f4056a2802002205450d00200541d0006c2104200741c0006a210503400240200541046a280200450d002005280200102c0b200541d0006a2105200441b07f6a22040d000b0b0240200a450d002007102c0b20064220862022ad842106410121214100211d201f21200b200141e0056a41186a220a4200370300200141e0056a41106a22024200370300200141e0056a41086a22044200370300200142003703e005200141b0036a41086a220541ecddc500ad4280808080f000841002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b003220837038801200120083703e005200541f3ddc500ad4280808080c001841002220741086a290000370300200120072900003703b0032007102c20014188016a41086a20052903002208370300200120012903b003220d370388012009200d370000200941086a2008370000200141d0036a41086a2004290300370300200141d0036a41106a2002290300370300200141d0036a41186a200a290300370300200120012903e0053703d0032001201e3602e005200e200141e0056aad22234280808080c000841001200120213a00af032001201736027c200120153602782001200141f8006a360284012001200141af036a3602800141002113024002402006422088a7220541057422040d0041012116410021240c010b20044105752224ad42a0017e2208422088a70d0b2008a722044100480d0b2004102a2216450d090b2006a7212502402005450d002005410574220741606a410576212620014188016a4101722111200141e0056a41206a2114200141d0036a41e0006a2127200141d0036a41c0006a2119200141d0036a41206a21132016210a202021050340200541086a2900002106200541106a29000021082005290000210d200141b0036a41186a2202200541186a290000370300200141b0036a41106a220c2008370300200141b0036a41086a220b20063703002001200d3703b003200141d0056a200141b0036a10a60120014188016a20012802d005221020012802d80510a70120012d008801210f200141a8026a201141800110db051a410021040240200f4101470d00200141d0046a200141a8026a41800110db051a410121040b024020012802d405450d002010102c0b024002402004450d00200141d0036a200141d0046a41800110db051a0c010b200141d0036a410041800110da051a0b02402001280280012d00000d00200128028401220f2802002204200f280204460d00200f200441a0016a36020002400240200141d0036a200441206a220f460d00200f200141d0036a412010dd050d010b02402013200441c0006a220f460d00200f2013412010dd050d010b02402019200441e0006a220f460d00200f2019412010dd050d010b202720044180016a2204460d0120042027412010dd05450d010b20012802800141013a00000b200541206a2105200141e0056a41186a2002290300370300200141e0056a41106a200c290300370300200141e0056a41086a200b290300370300200120012903b0033703e0052014200141d0036a41800110db051a200a200141e0056a41a00110db0541a0016a210a200741606a22070d000b202641016a21130b02402025450d002020102c0b2013ad42a0017e2206422088a70d002006a72205417f4c0d0020012d00af0321110240024020050d00410121100c010b2005102a2210450d090b4100210c02402013450d002016201341a0016c6a210f200141e0056a4180016a2104200141e0056a41e0006a2107200141e0056a41c0006a210a200141e0056a41206a21024100210c2010210b201621050340200141e0056a41186a200541186a290000370300200141e0056a41106a200541106a290000370300200141e0056a41086a200541086a290000370300200120052900003703e005200241186a200541386a290000370000200241106a200541306a290000370000200241086a200541286a2900003700002002200541206a290000370000200a200541c0006a290000370000200a41086a200541c8006a290000370000200a41106a200541d0006a290000370000200a41186a200541d8006a2900003700002007200541e0006a290000370000200741086a200541e8006a290000370000200741106a200541f0006a290000370000200741186a200541f8006a290000370000200420054180016a290000370000200441086a20054188016a290000370000200441106a20054190016a290000370000200441186a20054198016a290000370000200c41016a210c200b200141e0056a41a00110db0541a0016a210b200541a0016a2205200f470d000b0b200141e0056a41186a220a4200370300200141e0056a41106a22024200370300200141e0056a41086a22044200370300200142003703e005200141b0036a41086a220541ecddc500ad4280808080f000841002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b003220637038801200120063703e005200541ab83c100ad4280808080a001841002220741086a290000370300200120072900003703b0032007102c20014188016a41086a20052903002206370300200120012903b00322083703880120092008370000200941086a2006370000200141d0036a41086a2004290300370300200141d0036a41106a2002290300370300200141d0036a41186a200a290300370300200120012903e0053703d003200141003602e805200142013703e005200c200141e0056a10670240200c450d002010200c41a0016c6a21042010210503402005200141e0056a109101200541206a200141e0056a109101200541c0006a200141e0056a109101200541e0006a200141e0056a10910120054180016a200141e0056a109101200541a0016a22052004470d000b0b20012802e4052105200e20013502e80542208620012802e0052204ad84100102402005450d002004102c0b02402013450d002010102c0b200141e0056a41186a220a4200370300200141e0056a41106a22024200370300200141e0056a41086a22044200370300200142003703e005200141b0036a41086a220541ecddc500ad4280808080f000841002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b003220637038801200120063703e005200541ffddc500ad4280808080d001841002220741086a290000370300200120072900003703b0032007102c20014188016a41086a20052903002206370300200120012903b00322083703880120092008370000200941086a2006370000200141d0036a41086a2004290300370300200141d0036a41106a2002290300370300200141d0036a41186a200a290300370300200120012903e0053703d003200120113a00e005200e20234280808080108410012001201e3602e405200141053a00e00541014100200141e0056a1092014108102a2207450d082007201736020420072015360200024020180d00200141e0056a41186a220c4200370300200141e0056a41106a220a4200370300200141e0056a41086a22044200370300200142003703e005200141d0036a41086a220541e0d9c500ad4280808080f001841002220241086a290000370300200120022900003703d0032002102c20042005290300370300200120012903d00322063703a802200120063703e005200541d4d9c500ad4280808080c001841002220241086a290000370300200120022900003703d0032002102c200a20012903d003220637030020014188016a41086a220b200429030037030020014188016a41106a220f200637030020014188016a41186a22102005290300370300200120063703a802200120012903e00537038801200141286a20014188016a1098012001290330210820012802282111200c4200370300200a420037030020044200370300200142003703e005200541ecddc500ad4280808080f000841002220241086a290000370300200120022900003703d0032002102c20042005290300370300200120012903d0033703e005200541f3ddc500ad4280808080c001841002220241086a290000370300200120022900003703d0032002102c200a20012903d0032206370300200b2004290300370300200f200637030020102005290300370300200120063703a802200120012903e00537038801200141206a20014188016a41201094012008420020111b2001280224410020012802201b10b2012007102c0c040b02400240201b450d002007201541a0016a220a360200200141003a008006201541206a2104410021050340200141003a00af03200141e0056a20056a200420056a2d00003a00002001200541016a22053a00800620054120470d000b20014188016a41086a2205200141e0056a41086a29030037030020014188016a41106a2204200141e0056a41106a29030037030020014188016a41186a2202200141e0056a41186a290300370300200120012903e0053703880120150d010b2007102c4108210f4100210a410021050c030b200141a8026a41186a2002290300370300200141a8026a41106a2004290300370300200141a8026a41086a200529030037030020012001290388013703a8022017200a6b41a0016e41016a220541286c2204417f4c0d002004102a220f450d08200f20012903a802370300200f4201370320200f41186a200141a8026a41186a290300370300200f41106a200141a8026a41106a290300370300200f41086a200141a8026a41086a2903003703000240200728020022042007280204470d004101210a0c020b2007200441a0016a360200200141003a008006200441206a210a410021040340200141003a00af03200141e0056a20046a200a20046a2d00003a00002001200441016a22043a00800620044120470d000b200141d0046a41186a2219200141e0056a41186a2202290300220637030020014188016a41086a2210200141e0056a41086a220c29030037030020014188016a41106a2211200141e0056a41106a220b29030037030020014188016a41186a22142006370300200120012903e005370388014101210a0340200141a8026a41186a20142903002206370300200141a8026a41106a20112903002208370300200141a8026a41086a2010290300220d3703002001200129038801220e3703a80220022006370300200b2008370300200c200d3703002001200e3703e005024002402005200a460d00200521090c010b200728020420072802006b41a0016e20056a41016a22042005490d0c200541017422092004200920044b1b2209ad42287e2206422088a70d0c2006a722044100480d0c0240024020050d002004102a210f0c010b200f200541286c2004102e210f0b200f450d0a0b200f200a41286c6a220520012903e005370300200c2903002106200b29030021082002290300210d20054201370320200541186a200d370300200541106a2008370300200541086a2006370300200a41016a210a0240200728020022042007280204470d00200921050c030b2007200441a0016a36020041002105200141003a008006200441206a21040340200141003a00af03200141e0056a20056a200420056a2d00003a00002001200541016a22053a00800620054120470d000b2019200229030022063703002010200c2903003703002011200b29030037030020142006370300200120012903e00537038801200921050c000b0b103a000b2007102c0b200141e0056a41186a4200370300200141e0056a41106a22024200370300200141e0056a41086a22074200370300200142003703e005200141d0036a41086a220441e0d9c500ad4280808080f001841002220c41086a2900003703002001200c2900003703d003200c102c20072004290300370300200120012903d00322063703a802200120063703e005200441aeb5c000ad4280808080f000841002220c41086a2900003703002001200c2900003703d003200c102c200220012903d003220637030020014188016a41086a200729030037030020014188016a41106a200637030020014188016a41186a2004290300370300200120063703a802200120012903e00537038801200141e0056a20014188016a10e4010240024020012802e0054101460d002001200a3602e805200120053602e4052001200f3602e005200141e0056a41004100200110b30120014188016aad428080808080048421060c010b20014188016aad42808080808004842206100520012902e40521082001200a3602e805200120053602e4052001200f3602e005200141e0056a2008a741012008422088a710b3010b200141e0056a41186a220a4200370300200141e0056a41106a22074200370300200141e0056a41086a22044200370300200142003703e005200141d0036a41086a220541e0d9c500ad4280808080f0018422081002220c41086a2900003703002001200c2900003703d003200c102c20042005290300370300200120012903d003220d3703a8022001200d3703e005200541d4d9c500ad4280808080c00184220d1002220c41086a2900003703002001200c2900003703d003200c102c200141a8026a41086a22112005290300220e370300200120012903d00322283703a80220022028370000200241086a2214200e37000020014188016a41086a220c200429030037030020014188016a41106a220b200729030037030020014188016a41186a220f200a290300370300200120012903e00537038801200141106a20014188016a109801200128021021092001290318210e200a42003703002007420037030020044200370300200142003703e005200520081002221041086a290000370300200120102900003703d0032010102c20042005290300370300200120012903d00322083703a802200120083703e0052005200d1002221041086a290000370300200120102900003703d0032010102c201120052903002208370300200120012903d003220d3703a8022002200d37000020142008370000200c2004290300370300200b2007290300370300200f200a290300370300200120012903e005370388012001200e42017c420120091b22083703e0052006202342808080808001841001200a42003703002007420037030020044200370300200142003703e005200541ecddc500ad4280808080f000841002220a41086a2900003703002001200a2900003703d003200a102c20042005290300370300200120012903d0033703e005200541f3ddc500ad4280808080c001841002220a41086a2900003703002001200a2900003703d003200a102c200720012903d0032206370300200c2004290300370300200b2006370300200f2005290300370300200120063703a802200120012903e00537038801200141086a20014188016a41201094012008200128020c410020012802081b10b2010b4108102a2205450d0420052017360204200520153602004108102a2204450d0420042016201341a0016c6a221e360204200420163602002005200410e5014108102a2207450d0420072017360204200720153602004108102a2219450d042019201e36020420192016360200200141e0056a41186a220c4200370300200141e0056a41106a221b4200370300200141e0056a41086a22044200370300200142003703e005200141d0036a41086a22054191b0c200ad4280808080e000841002220a41086a2900003703002001200a2900003703d003200a102c20042005290300370300200120012903d0033703e005200541acb0c200ad4280808080e000841002220a41086a2900003703002001200a2900003703d003200a102c201b20012903d003220637030020014188016a41086a200429030037030020014188016a41106a200637030020014188016a41186a2005290300370300200120063703a802200120012903e00537038801200120014188016a41201094012001280200210b2001280204210f200141d0046a41186a22104200370300200141d0046a41106a22114200370300200141d0046a41086a220a4200370300200142003703d004200541a3dbc500ad42808080808001841002220241086a290000370300200120022900003703d0032002102c200a2005290300370300200120012903d003220637038801200120063703d00420054187a6c500ad42808080808001841002220241086a290000370300200120022900003703d0032002102c200141b0036a41086a20052903002206370300200120012903d00322083703b00320032008370000200341086a20063700002004200a290300370300201b2011290300370300200c2010290300370300200120012903d0043703e0052001200f41e4006a41e400200b1b3602880120234280808080800484222320014188016aad22284280808080c0008410010240024002402007280200220520072802042202460d002007200541a0016a220c360200200141003a008006200541e0006a2104410021050340200141003a00af03200141e0056a20056a200420056a2d00003a00002001200541016a22053a00800620054120470d000b200141a8026a41086a2205200141e0056a41086a290300370300200141a8026a41106a220b200141e0056a41106a290300370300200141a8026a41186a220f200141e0056a41186a290300370300200120012903e005220637038801200120063703a8024101210a2002200c6b41a0016e41016a2204410574102a2210450d07201020012903a802370000201041186a200f290300370000201041106a200b290300370000201041086a2005290300370000200728020022052007280204460d012007200541a0016a360200200141003a008006200541e0006a210a410021050340200141003a00af03200141e0056a20056a200a20056a2d00003a00002001200541016a22053a00800620054120470d000b200141d0046a41186a2213200141e0056a41186a2202290300220637030020014188016a41086a2211200141e0056a41086a220c29030037030020014188016a41106a2214200141e0056a41106a220b29030037030020014188016a41186a22092006370300200120012903e005370388014101210a0340200141a8026a41186a20092903002206370300200141a8026a41106a20142903002208370300200141a8026a41086a2011290300220d3703002001200129038801220e3703a80220022006370300200b2008370300200c200d3703002001200e3703e005024002402004200a460d002004210f0c010b200728020420072802006b41a0016e20046a41016a22052004490d0b2004410174220f2005200f20054b1b220f41ffffff3f71200f470d0b200f41057422054100480d0b0240024020040d002005102a21100c010b201020044105742005102e21100b2010450d090b2010200a4105746a220520012903e005370000200541186a2002290300370000200541106a200b290300370000200541086a200c290300370000200a41016a210a0240200728020022042007280204470d00200f21040c030b2007200441a0016a36020041002105200141003a008006200441e0006a21040340200141003a00af03200141e0056a20056a200420056a2d00003a00002001200541016a22053a00800620054120470d000b2013200229030022063703002011200c2903003703002014200b29030037030020092006370300200120012903e00537038801200f21040c000b0b2007102c41002104410121104100210a0c010b2007102c0b200141d0046a41186a220c4200370300200141d0046a41106a220b4200370300200141d0046a41086a22074200370300200142003703d004200141d0036a41086a220541a3dbc500ad42808080808001841002220241086a290000370300200120022900003703d0032002102c20072005290300370300200120012903d003220637038801200120063703d004200541a0c6c500ad4280808080c000841002220241086a290000370300200120022900003703d0032002102c200141b0036a41086a20052903002206370300200120012903d00322083703b00320032008370000200341086a2006370000200141e0056a41086a2007290300370300200141e0056a41106a200b290300370300200141e0056a41186a200c290300370300200120012903d0043703e00520014100360290012001420137038801200a20014188016a10670240200a450d00200a4105742107201021050340200520014188016a109101200541206a2105200741606a22070d000b0b200128028c01210520232001350290014220862001280288012207ad84100102402005450d002007102c0b02402004450d002010102c0b2019102c4108102a220a450d04200a2017360204200a20153602004108102a2219450d042019201e36020420192016360200024002400240024002402018450d00200a2802002205200a2802042202460d01200a200541a0016a220c360200200141003a00800620054180016a2104410021050340200141003a00af03200141e0056a20056a200420056a2d00003a00002001200541016a22053a00800620054120470d000b200141a8026a41086a2205200141e0056a41086a290300370300200141a8026a41106a220b200141e0056a41106a290300370300200141a8026a41186a220f200141e0056a41186a290300370300200120012903e005220637038801200120063703a802410121072002200c6b41a0016e41016a2204410574102a2210450d09201020012903a802370000201041186a200f290300370000201041106a200b290300370000201041086a2005290300370000200a2802002205200a2802042213460d02200a200541a0016a2217360200200141003a00800620054180016a2107410021050340200141003a00af03200141e0056a20056a200720056a2d00003a00002001200541016a22053a00800620054120470d000b200141d0046a41186a2218200141e0056a41186a2202290300220637030020014188016a41086a2211200141e0056a41086a220c29030037030020014188016a41106a2214200141e0056a41106a220b29030037030020014188016a41186a22092006370300200120012903e00537038801410121070340200141a8026a41186a20092903002206370300200141a8026a41106a20142903002208370300200141a8026a41086a2011290300220d3703002001200129038801220e3703a80220022006370300200b2008370300200c200d3703002001200e3703e0050240024020042007460d002004210f0c010b201320176b41a0016e20046a41016a22052004490d0d2004410174220f2005200f20054b1b220f41ffffff3f71200f470d0d200f41057422054100480d0d0240024020040d002005102a21100c010b201020044105742005102e21100b2010450d0b0b201020074105746a220520012903e005370000200541186a2002290300370000200541106a200b290300370000200541086a200c290300370000200741016a21070240200a2802002204200a2802042213470d00200f21040c040b200a200441a0016a221736020041002105200141003a00800620044180016a21040340200141003a00af03200141e0056a20056a200420056a2d00003a00002001200541016a22053a00800620054120470d000b2018200229030022063703002011200c2903003703002014200b29030037030020092006370300200120012903e00537038801200f21040c000b0b2019102c200a102c0c030b200a102c4101211041002107410021040c010b200a102c0b200141e0056a41186a220c4200370300200141e0056a41106a220b4200370300200141e0056a41086a220a4200370300200142003703e005200141d0036a41086a2205418ec6c500ad4280808080a002841002220241086a290000370300200120022900003703d0032002102c200a2005290300370300200120012903d0033703e005200541a0c6c500ad4280808080c000841002220241086a290000370300200120022900003703d0032002102c200141a8026a41086a20052903002206370300200120012903d00322083703a802201b2008370000201b41086a200637000020014188016a41086a200a29030037030020014188016a41106a200b29030037030020014188016a41186a200c290300370300200120012903e00537038801200141003602e805200142013703e0052007200141e0056a106702402007450d00200741057421072010210503402005200141e0056a109101200541206a2105200741606a22070d000b0b20012802e40521052028428080808080048420013502e80542208620012802e0052207ad84100102402005450d002007102c0b02402004450d002010102c0b2019102c0b02402024450d002016102c0b02402022450d00201d2021720d00201f102c0b02402012450d00201c102c0b201aa7450d002015102c0b10a301200041044b0d010b200141e0056a210c0c010b200141d0046a41186a220a4200370300200141d0046a41106a22024200370300200141d0046a41086a22044200370300200142003703d004200141b0036a41086a220541a4c6c500ad4280808080a001841002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b0033703d004200541f889c200ad4280808080e000841002220741086a290000370300200120072900003703b0032007102c20014188016a41086a20052903002206370300200120012903b00322083703880120032008370000200341086a2006370000200141e0056a41086a2004290300370300200141e0056a41106a2002290300370300200141e0056a41186a200a290300370300200120012903d0043703e00520014188016a200141e0056a10e6012001280288012205410420051b210202400240200129028c01420020051b2206422088a7220c41c4006c22050d00410021040c010b2000417b6a210a200220056a2107410021042002210502400340024020052d00004101460d00200541046a280200200a4f0d020b200441016a21042007200541c4006a2205470d000b0b2004200c4b0d030b200642ffffffff0f8321060240200c20046b2205450d0002402004450d0020022002200441c4006c6a200541c4006c10dc051a0b2005ad42208620068421060b200141d0046a41186a4200370300200141d0046a41106a220a4200370300200141d0046a41086a22044200370300200142003703d004200141b0036a41086a220541a4c6c500ad4280808080a001841002220741086a290000370300200120072900003703b0032007102c20042005290300370300200120012903b00322083703a802200120083703d004200541f889c200ad4280808080e000841002220741086a290000370300200120072900003703b0032007102c200a20012903b0032208370300200141e0056a41086a2004290300370300200141e0056a41106a2008370300200141e0056a41186a2005290300370300200120083703d003200120012903d0043703e00520014188016a20022006422088a710e701200141e0056aad42808080808004842001350290014220862001280288012204ad8410012006a721050240200128028c01450d002004102c0b200141e0056a210c2005450d002002102c0b200141d0046a41186a220a4200370300200141d0046a41106a22074200370300200141d0046a41086a22044200370300200142003703d004200141b0036a41086a220541a4c6c500ad4280808080a001841002220241086a290000370300200120022900003703b0032002102c20042005290300370300200120012903b00322063703a802200120063703d004200541aec6c500ad4280808080c001841002220241086a290000370300200120022900003703b0032002102c200720012903b0032206370300200141e0056a41086a22022004290300370300200141e0056a41106a220b2006370300200141e0056a41186a220f2005290300370300200120063703d003200120012903d0043703e005200141003a00af03200cad4280808080800484200141af036aad42808080801084100120014188016a10e801200a20014188016a41186a220c290300370300200720014188016a41106a2210290300370300200420014188016a41086a221129030037030020012001290388013703d0044124102a2205450d00200520012903d00437000020054114360220200541186a200a290300370000200541106a2007290300370000200541086a200429030037000020014281808080103702e405200120053602e005200141e0056a10e901200f200c290300370300200b20102903003703002002201129030037030020012001290388013703e005200141e0056a10ea0110e00120014180076a24000f0b1033000b41dafec500411c41acfec5001036000b1035000b8a1e0a057f017e037f017e017f027e017f017e047f027e23004190046b22002400200041b8036a41186a4200370300200041b8036a41106a22014200370300200041b8036a41086a22024200370300200042003703b803200041f8026a41086a220341bac6c500ad4280808080c000841002220441086a290000370300200020042900003703f8022004102c20022003290300370300200020002903f80222053703e001200020053703b80320034183d7c500ad4280808080b001841002220441086a290000370300200020042900003703f8022004102c200120002903f8022205370300200041e8036a41086a2002290300370300200041e8036a41106a2005370300200041e8036a41186a2003290300370300200020053703e001200020002903b8033703e803200041f0016a200041e8036a1099010240024020002d00f0014102470d00200041f0016a41186a4200370300200041f0016a41106a22064200370300200041f0016a41086a22024200370300200042003703f00120034191b0c200ad4280808080e000841002220441086a290000370300200020042900003703f8022004102c20022003290300370300200020002903f8023703f001200341cab0c200ad4280808080e000841002220441086a290000370300200020042900003703f8022004102c200620002903f802220537030020004180016a41086a200229030037030020004180016a41106a200537030020004180016a41186a200329030037030020002005370318200020002903f00137038001200041b8036a20004180016a10e4020240024020002802b80322030d0041002107200041003602880120004204370380014102210620004180016a21080c010b200020002902bc0322053702840120002003360280012005a7210720004180016a210802402005422088a72202450d00200241246c210202400340024020032d00004101470d00200341016a2800002104200341086a28020021062000200341106a2802003602bc03200020063602b803200441c28289aa04470d00200041f0016a200041b8036a10e50220002d00f00122064102470d020b200341246a21032002415c6a2202450d020c000b0b200020002800f401360073200020002800f101360270200041f8016a2903002105200041186a20004180026a41d80010db051a200041d8026a29030021090c010b410221060b2008280200210a024020082802082203450d00200341246c2102200a210303400240024020032d0000220441034b0d0002400240024020040e0404000102040b2003410c6a280200450d03200341086a280200102c0c030b2003410c6a280200450d02200341086a280200102c0c020b2003410c6a280200450d01200341086a280200102c0c010b200341086a280200450d00200341046a280200102c0b200341246a21032002415c6a22020d000b0b02402007450d00200a102c0b200020002802703602d801200020002800733600db0120004180016a200041186a41d80010db051a0240024020064102470d0041002102200041e8036a21080c010b200020002802d8013602f002200020002800db013600f302200020053703e802200041f0016a20004180016a41d80010db051a200020093703e002200041b8036a41186a22044200370300200041b8036a41106a22084200370300200041b8036a41086a22024200370300200042003703b803200041f8026a41086a220341bac6c500ad4280808080c0008422091002220a41086a2900003703002000200a2900003703f802200a102c20022003290300370300200020002903f802220b3703e0012000200b3703b803200341d3c6c500ad4280808080b00184220c1002220a41086a2900003703002000200a2900003703f802200a102c200041e0016a41086a220d2003290300220b370300200020002903f802220e3703e0012001200e370000200141086a220f200b370000200041e8036a41086a220a2002290300370300200041e8036a41106a22072008290300370300200041e8036a41186a22102004290300370300200020002903b8033703e803200041086a200041e8036a109801024002402000280208450d002000290310500d00200041e8036aad4280808080800484210b200041e8036a21080c010b200041e8026a200041e0026a20064101461b290300210b200442003703002008420037030020024200370300200042003703b803200320091002221141086a290000370300200020112900003703f8022011102c20022003290300370300200020002903f802220e3703e0012000200e3703b8032003200c1002221141086a290000370300200020112900003703f8022011102c200d2003290300220e370300200020002903f802220c3703e0012001200c370000200f200e370000200a20022903003703002007200829030037030020102004290300370300200020002903b8033703e8032000200b3703b803200041e8036aad4280808080800484220b200041b8036aad42808080808001841001200442003703002008420037030020024200370300200042003703b803200320091002221141086a290000370300200020112900003703f8022011102c20022003290300370300200020002903f802220e3703e0012000200e3703b803200341c8c6c500ad4280808080b001841002221141086a290000370300200020112900003703f8022011102c200d2003290300220e370300200020002903f802220c3703e0012001200c370000200f200e370000200a20022903003703002007200829030037030020102004290300370300200020002903b8033703e803200041b8036a200041e8036a10ff0220002902bc03210e20002802b8032111200442003703002008420037030020024200370300200042003703b803200320091002221241086a290000370300200020122900003703f8022012102c20022003290300370300200020002903f80222093703e001200020093703b803200341e9c6c500ad4280808080a001841002221241086a290000370300200020122900003703f8022012102c200d20032903002209370300200020002903f802220c3703e0012001200c370000200f2009370000200a20022903003703002007200829030037030020102004290300370300200020002903b8033703e803200041b8036a200041e8036a10800320002d00b80321032010200041d1036a2900003703002007200041c9036a290000370300200a200041c1036a290000370300200020002900b9033703e8032011410820111b21020240024020034101460d00200041b0036a4200370300200041a8036a4200370300200041a0036a420037030020004200370398030c010b20004198036a41186a200041e8036a41186a29030037030020004198036a41106a200041e8036a41106a29030037030020004198036a41086a200041e8036a41086a290300370300200020002903e803370398030b200041f8026a41086a20004198036a41086a2903002209370300200041f8026a41106a20004198036a41106a290300220c370300200041f8026a41186a20004198036a41186a2903002213370300200020002903980322143703f802200041b8036a41086a2203200e420020111b370300200041b8036a41106a2014370300200041b8036a41186a2009370300200041d8036a200c370300200041e0036a2013370300200020023602bc03200041003602b803200041e8036a200041b8036a108b02200041a3036a200041e8036a41086a280200360000200020002903e80337009b03200041f4036a2000419f036a290000370000200041c28289aa043600e903200041023a00e80320002000290098033700ed03200041e8036a109001024020002802b8030d002003280200450d0020002802bc03102c0b200041e8036a21080b200041e8026a200041e0026a20064101461b2903002109200041b8036a41186a220a4200370300200041b8036a41106a22074200370300200041b8036a41086a22024200370300200042003703b803200041f8026a41086a220341bac6c500ad4280808080c000841002220441086a290000370300200020042900003703f8022004102c20022003290300370300200020002903f802220e3703e0012000200e3703b803200341dec6c500ad4280808080b001841002220441086a290000370300200020042900003703f8022004102c200041e0016a41086a2003290300220e370300200020002903f802220c3703e0012001200c370000200141086a200e370000200041e8036a41086a2002290300370300200041e8036a41106a2007290300370300200041e8036a41186a200a290300370300200020002903b8033703e803200020093703b803200b200041b8036aad428080808080018410014100210220060d0020004198036a41086a200041f0016a41086a29030037030020004198036a41106a200041f0016a41106a2d00003a0000200020002800f30236007b200020002802f002360278200020002903f00137039803410121020b200041f0016a41086a2005370300200041f0016a41106a200029039803370300200041f0016a41186a20004198036a41086a29030037030020004190026a20004198036a41106a2d00003a0000200020023a00f001200020002802783600f1012000200028007b3600f401200041b8036a41186a220a4200370300200041b8036a41106a22074200370300200041b8036a41086a22044200370300200042003703b803200041f8026a41086a220341bac6c500ad4280808080c000841002220641086a290000370300200020062900003703f8022006102c20042003290300370300200020002903f80222053703e001200020053703b80320034183d7c500ad4280808080b001841002220641086a290000370300200020062900003703f8022006102c200041e0016a41086a20032903002205370300200020002903f80222093703e00120012009370000200141086a2005370000200041e8036a41086a2004290300370300200041e8036a41106a2007290300370300200041e8036a41186a200a290300370300200020002903b8033703e8034101102a2203450d01200042013702840120002003360280010240024020020d002000410136028801200341003a00000c010b2000410136028801200341013a0000200041f0016a41017220004180016a10ba020b20002802840121032008ad42808080808004842000350288014220862000280280012202ad8410012003450d002002102c0b20004190046a24000f0b1033000b83790d067f017e017f017e057f017e017f017e0a7f017e167f037e057f23004180066b2200240020004180056a41186a2201420037030020004180056a41106a220242003703004108210320004180056a41086a220442003703002000420037038005200041b0026a41086a220541ecddc500ad4280808080f0008422061002220741086a290000370300200020072900003703b0022007102c20042005290300370300200020002903b00237038005200541f3ddc500ad4280808080c001841002220741086a290000370300200020072900003703b0022007102c200220002903b0022208370300200041b0046a41086a22092004290300370300200041b0046a41106a220a2008370300200041b0046a41186a220b2005290300370300200020083703e00320002000290380053703b004200041286a200041b0046a4120109401200028022c210c2000280228210d2001420037030020024200370300200442003703002000420037038005200541a3dbc500ad42808080808001841002220741086a290000370300200020072900003703b0022007102c20042005290300370300200020002903b00237038005200541a0c6c500ad4280808080c000841002220741086a290000370300200020072900003703b0022007102c20012005290300220837030020092004290300370300200a20002903b002220e370300200b20083703002000200e3703e00320002000290380053703b00420004180056a200041b0046a10f002200028028005210f20002902840521102001420037030020024200370300200442003703002000420037038005200520061002220741086a290000370300200020072900003703b0022007102c20042005290300370300200020002903b00237038005200541c9f8c200ad4280808080a001841002220741086a290000370300200020072900003703b0022007102c20012005290300220837030020092004290300370300200a20002903b0022206370300200b2008370300200020063703e00320002000290380053703b00420004180056a200041b0046a412010d0012000280280052207410120071b2111200029028405420020071b2208a72112024002400240024002400240024002402008422088a72207450d002011200741057422136a2114200041c4036a211520004180056a41206a2116200041f8026a4104722117200041d0026a410472211841022107410021190340200041e0016a41186a201120196a221a41186a2900002208370300200041e0016a41106a201a41106a2900002206370300200041e0016a41086a201a41086a290000220e3703002000201a290000221b3703e0012018201b370200201841086a200e370200201841106a2006370200201841186a200837020020002007417e6a221c3602d0024100211d0240201c201810cb030d00200041f8026a41206a200041d0026a41206a280200360200200041f8026a41186a200041d0026a41186a290300370300200041f8026a41106a200041d0026a41106a290300370300200041f8026a41086a200041d0026a41086a290300370300200020002903d0023703f80220004190026a41186a221d201741186a221c29000037030020004190026a41106a221e201741106a221f29000037030020004190026a41086a2220201741086a222129000037030020002017290000370390022001201c2900003703002002201f290000370300200420212900003703002000201729000037038005200041a0036a20004180056a109204200041b0026a41186a221c201d290300370300200041b0026a41106a221f201e2903003703002005202029030037030020002000290390023703b00220002802c003221d450d00201620002903a003370300201641186a200041a0036a41186a290300370300201641106a200041a0036a41106a290300370300201641086a200041a0036a41086a2903003703002001201c2903003703002002201f2903003703002004200529030037030020004180026a41086a221c201541086a280200360200200020002903b002370380052000201529020037038002200041b0046a41386a221e20004180056a41386a290300370300200041b0046a41306a221f20004180056a41306a290300370300200041b0046a41286a222020004180056a41286a290300370300200041b0046a41206a22212016290300370300200b2001290300370300200a20022903003703002009200429030037030020002000290380053703b004200041e0036a41386a201e290300370300200041e0036a41306a201f290300370300200041e0036a41286a2020290300370300200041e0036a41206a2021290300370300200041e0036a41186a200b290300370300200041e0036a41106a200a290300370300200041e0036a41086a2009290300370300200020002903b0043703e003200041d0036a41086a201c28020036020020002000290380023703d0030b200041a0016a41086a200041e0036a41086a290300370300200041a0016a41106a200041e0036a41106a290300370300200041a0016a41186a200041e0036a41186a290300370300200041a0016a41206a200041e0036a41206a290300370300200041a0016a41286a200041e0036a41286a290300370300200041a0016a41306a200041e0036a41306a290300370300200041a0016a41386a200041e0036a41386a29030037030020004190016a41086a200041d0036a41086a280200360200200020002903e0033703a001200020002903d00337039001201d0d02200741016a21072013201941206a2219470d000b0b410021222000410036029801200042083703900102402012450d002011102c0b4100211d0c010b200041c0006a41386a2218200041a0016a41386a290300370300200041c0006a41306a2217200041a0016a41306a290300370300200041c0006a41286a2204200041a0016a41286a290300370300200041c0006a41206a221c200041a0016a41206a290300370300200041c0006a41186a2205200041a0016a41186a290300370300200041c0006a41106a2201200041a0016a41106a290300370300200041c0006a41086a221e200041a0016a41086a29030037030020004180016a41086a221f20004190016a41086a280200360200200020002903a001370340200020002903900137038001200041306a41086a2220201f280200360200200020002903800137033020004180056a41086a221f201e29030037030020004180056a41106a221e200129030037030020004180056a41186a2201200529030037030020004180056a41206a2205201c29030037030020004180056a41286a221c200429030037030020004180056a41306a2204201729030037030020004180056a41386a221720182903003703002000200029034037038005200041b0046a41086a22182020280200360200200020002903303703b00441d000102a2203450d0120032000290380053703002003201d360240200320002903b004370244200341386a2017290300370300200341306a2004290300370300200341286a201c290300370300200341206a2005290300370300200341186a2001290300370300200341106a201e290300370300200341086a201f290300370300200341cc006a20182802003602000240024002400240201341606a2019470d004101211d0c010b201a41206a2118201320196b41606a2105200041c4036a2120200041f8026a4104722117200041d0026a410472211a0340200041e0016a41186a201841186a2219290000370300200041e0016a41106a201841106a221d290000370300200041e0016a41086a201841086a2204290000370300200020182900003703e00120002007417f6a221c3602d00220042900002108201d29000021062018290000210e201a41186a2019290000370000201a41106a2006370000201a41086a2008370000201a200e370000410021190240201c201a10cb030d00200041f8026a41206a200041d0026a41206a280200360200200041f8026a41186a200041d0026a41186a290300370300200041f8026a41106a200041d0026a41106a290300370300200041f8026a41086a200041d0026a41086a290300370300200020002903d0023703f80220004190026a41186a2219201741186a220429000037030020004190026a41106a2201201741106a221c29000037030020004190026a41086a2213201741086a221e290000370300200020172900003703900220004180056a41186a221d200429000037030020004180056a41106a2204201c29000037030020004180056a41086a221c201e2900003703002000201729000037038005200041a0036a20004180056a109204200041b0026a41186a221e2019290300370300200041b0026a41106a221f2001290300370300200041b0026a41086a2201201329030037030020002000290390023703b00220002802c0032219450d00201620002903a003370300201641186a200041a0036a41186a290300370300201641106a200041a0036a41106a290300370300201641086a200041a0036a41086a290300370300201d201e2903003703002004201f290300370300201c200129030037030020004180026a41086a2201202041086a280200360200200020002903b002370380052000202029020037038002200041b0046a41386a221320004180056a41386a290300370300200041b0046a41306a221e20004180056a41306a290300370300200041b0046a41286a221f20004180056a41286a290300370300200041b0046a41206a222120004180056a41206a290300370300200041b0046a41186a2209201d290300370300200041b0046a41106a221d2004290300370300200041b0046a41086a2204201c29030037030020002000290380053703b004200041e0036a41386a2013290300370300200041e0036a41306a201e290300370300200041e0036a41286a201f290300370300200041e0036a41206a2021290300370300200041e0036a41186a2009290300370300200041e0036a41106a201d290300370300200041e0036a41086a2004290300370300200020002903b0043703e003200041d0036a41086a200128020036020020002000290380023703d0030b200041a0016a41086a200041e0036a41086a290300370300200041a0016a41106a200041e0036a41106a290300370300200041a0016a41186a200041e0036a41186a290300370300200041a0016a41206a200041e0036a41206a290300370300200041a0016a41286a200041e0036a41286a290300370300200041a0016a41306a200041e0036a41306a290300370300200041a0016a41386a200041e0036a41386a29030037030020004190016a41086a200041d0036a41086a280200360200200020002903e0033703a001200020002903d0033703900120190d02201841206a21184101211d200741016a2107200541606a22050d000b0b410121220c010b200041c0006a41386a2223200041a0016a41386a221e290300370300200041c0006a41306a2224200041a0016a41306a221f290300370300200041c0006a41286a2225200041a0016a41286a2220290300370300200041c0006a41206a2226200041a0016a41206a2221290300370300200041c0006a41186a2227200041a0016a41186a2209290300370300200041c0006a41106a2228200041a0016a41106a220a290300370300200041c0006a41086a2229200041a0016a41086a220b29030037030020004180016a41086a222a20004190016a41086a2215280200360200200020002903a001370340200020002903900137038001200041306a41086a222b202a2802003602002000200029038001370330201841206a2118200041c4036a212c200041f8026a4104722117200041d0026a410472211a4101211d41012122034020004180056a41086a2205202929030037030020004180056a41106a2201202829030037030020004180056a41186a2213202729030037030020004180056a41206a222d202629030037030020004180056a41286a222e202529030037030020004180056a41306a222f202429030037030020004180056a41386a223020232903003703002000200029034037038005200041b0046a41086a2231202b280200360200200020002903303703b00402402022201d470d00201d41016a2204201d490d08201d410174221c2004201c20044b1b2222ad42d0007e2208422088a70d082008a722044100480d0802400240201d0d002004102a21030c010b2003201d41d0006c2004102e21030b2003450d040b2003201d41d0006c6a22042000290380053703002001290300210820132903002106202d290300210e202e290300211b202f2903002132203029030021332005290300213420042019360240200441086a2034370300200441386a2033370300200441306a2032370300200441286a201b370300200441206a200e370300200441186a2006370300200441106a2008370300200420002903b004370244200441cc006a2031280200360200201d41016a211d20182014460d010340200041e0016a41186a201841186a2219290000370300200041e0016a41106a201841106a2204290000370300200041e0016a41086a201841086a221c290000370300200020182900003703e001200020073602d002201c2900002108200429000021062018290000210e201a41186a2019290000370000201a41106a2006370000201a41086a2008370000201a200e3700004100211902402007201a10cb030d00200041f8026a41206a200041d0026a41206a280200360200200041f8026a41186a200041d0026a41186a290300370300200041f8026a41106a200041d0026a41106a290300370300200041f8026a41086a200041d0026a41086a290300370300200020002903d0023703f80220004190026a41186a2219201741186a220429000037030020004190026a41106a221c201741106a223529000037030020004190026a41086a2236201741086a223729000037030020002017290000370390022013200429000037030020012035290000370300200520372900003703002000201729000037038005200041a0036a20004180056a109204200041b0026a41186a22042019290300370300200041b0026a41106a2235201c290300370300200041b0026a41086a221c203629030037030020002000290390023703b00220002802c0032219450d00201620002903a003370300201641186a200041a0036a41186a290300370300201641106a200041a0036a41106a290300370300201641086a200041a0036a41086a29030037030020132004290300370300200120352903003703002005201c29030037030020004180026a41086a2204202c41086a280200360200200020002903b002370380052000202c29020037038002200041b0046a41386a221c2030290300370300200041b0046a41306a2235202f290300370300200041b0046a41286a2236202e290300370300200041b0046a41206a2237202d290300370300200041b0046a41186a22382013290300370300200041b0046a41106a223920012903003703002031200529030037030020002000290380053703b004200041e0036a41386a201c290300370300200041e0036a41306a2035290300370300200041e0036a41286a2036290300370300200041e0036a41206a2037290300370300200041e0036a41186a2038290300370300200041e0036a41106a2039290300370300200041e0036a41086a2031290300370300200020002903b0043703e003200041d0036a41086a200428020036020020002000290380023703d0030b200b200041e0036a41086a290300370300200a200041e0036a41106a2903003703002009200041e0036a41186a2903003703002021200041e0036a41206a2903003703002020200041e0036a41286a290300370300201f200041e0036a41306a290300370300201e200041e0036a41386a2903003703002015200041d0036a41086a280200360200200020002903e0033703a001200020002903d00337039001024020190d00200741016a21072014201841206a2218460d030c010b0b2023201e2903003703002024201f2903003703002025202029030037030020262021290300370300202720092903003703002028200a2903003703002029200b290300370300202a2015280200360200200020002903a001370340200020002903900137038001202b202a2802003602002000200029038001370330201841206a2118200741016a21070c000b0b02402012450d002011102c0b2000201d36029801200020223602940120002003360290010b20004180056a41186a2219420037030020004180056a41106a2217420037030020004180056a41086a221a42003703002000420037038005200041b0026a41086a220741ecddc500ad4280808080f0008422081002221841086a290000370300200020182900003703b0022018102c201a2007290300370300200020002903b00237038005200741f3ddc500ad4280808080c0018422061002221841086a290000370300200020182900003703b0022018102c200041e0036a41086a22162007290300220e370300200020002903b002221b3703e0032002201b370000200241086a2201200e370000200041b0046a41086a2204201a290300370300200041b0046a41106a22112017290300370300200041b0046a41186a2213201929030037030020002000290380053703b004200041206a200041b0046a41201094012000280224211c20002802202105200741a3dbc500ad4280808080800184220e1002221841086a290000370300200020182900003703b0022018102c20162007290300370300200020002903b0023703e003200741abdbc500ad4280808080a002841002221841086a290000370300200020182900003703b0022018102c20042007290300370300200020002903b0023703b0042000201c410020051b3602a001200041b0026a41186a221c200041a0016aad4280808080c00084221b1006221841186a290000370300200041b0026a41106a2205201841106a2900003703002007201841086a290000370300200020182900003703b0022018102c2019201c29030037030020172005290300370300201a2007290300370300200020002903b0023703800541c000102a2218450d00201820002903e003370000201820002903b0043700102018200029038005370020201841086a2016290300370000201841186a2004290300370000201841286a201a290300370000201841306a2017290300370000201841386a20192903003700002018ad4280808080800884100d2018102c2019420037030020174200370300201a42003703002000420037038005200720081002221841086a290000370300200020182900003703b0022018102c201a2007290300370300200020002903b00237038005200720061002221841086a290000370300200020182900003703b0022018102c201620072903002208370300200020002903b00222063703e00320022006370000200120083700002004201a290300370300201120172903003703002013201929030037030020002000290380053703b004200041186a200041b0046a4120109401200028021c2102200028021821012007200e1002221841086a290000370300200020182900003703b0022018102c20162007290300370300200020002903b0023703e00320074182aac500ad4280808080e001841002221841086a290000370300200020182900003703b0022018102c20042007290300370300200020002903b0023703b00420002002410020011b3602a001201c201b1006221841186a2900003703002005201841106a2900003703002007201841086a290000370300200020182900003703b0022018102c2019201c29030037030020172005290300370300201a2007290300370300200020002903b0023703800541c000102a2207450d0020104200200f1b210e200720002903e003370000200720002903b0043700102007200029038005370020200741086a200041e0036a41086a290300370000200741186a200041b0046a41086a290300370000200741286a20004180056a41086a2218290300370000200741306a20004180056a41106a290300370000200741386a20004180056a41186a2903003700002007ad4280808080800884100d2007102c0240024002400240201d450d0020004180056a20004190016a107c200041bb046a201828020036000020002000290380053700b3042000418c056a200041b7046a290000370000200041023a0084052000410f3a008005200020002900b004370085054101410020004180056a109201200041f8026a41106a20004190016a41086a2802003602002000200e422088a722393602fc022000200c4100200d1b22173602f802200020002903900137038003200041d0036a200041f8026a41086a107c20002802d803211c20002802d403213820002802d00321224104102a2212450d042012201736000020004284808080c0003702a401200020123602a001200041b0026a41086a220741bddbc500ad42808080808001841002221841086a290000370300200020182900003703b0022018102c200041e0036a41086a221a2007290300370300200020002903b0023703e003200741c5dbc500ad4280808080a002841002221841086a290000370300200020182900003703b0022018102c200041b0046a41086a22182007290300370300200020002903b0023703b00420004190026a41cffac00010ca0141c000102a2207450d04200720002903e003370000200720002903b0043700102007200029039002370020200741086a201a290300370000200741186a2018290300370000200741286a20004190026a41086a290300370000200741306a200041a0026a290300370000200741386a20004190026a41186a29030037000020004180056a200741c00010bd03200029028405210820002802800521182007102c20002008420020181b22064220883e02b40420002018410120181b22053602b004200041106a200041b0046a1075200028021421044100211620002802100d0320002802b404220741246e221d41246c2218417f4c0d010240024020180d00410421160c010b2018102a2216450d050b2004450d0341002102034020074104490d03200241016a210120002007417c6a221a3602b404200020002802b004221941046a3602b0042019280000211141002107200041003a00a00503400240201a2007470d00200041003602b404200741ff0171450d05200041003a00a0050c050b20004180056a20076a201920076a221841046a2d00003a00002000201841056a3602b0042000200741016a22183a00a0052018210720184120470d000b200041b0026a41086a221920004180056a41086a290300370300200041b0026a41106a221320004180056a41106a290300370300200041b0026a41186a221e20004180056a41186a29030037030020002000290380053703b0022000201a20186b22073602b4040240201d2002470d00200241017422182001201820014b1b221dad42247e2208422088a70d0a2008a722184100480d0a0240024020020d002018102a21160c010b2016200241246c2018102e21160b2016450d060b2016200241246c6a22182011360200201820002903b0023702042018410c6a2019290300370200201841146a20132903003702002018411c6a201e2903003702002001210220012004470d000c040b0b200041013a0084052000410f3a0080054101410020004180056a1092012022450d062003102c0c060b103a000b0240201d0d00410021160c010b2016102c410021160b20004180056a200041a0016a10c901200041b0046a200028028005221820002802880510d00120002802b004210720002902b40421080240200028028405450d002018102c0b2008420020071b210802402006a7450d002005102c0b201d410020161b21312016410420161b211d2007410120071b21362008a721350240024002400240024002400240201c450d002004410020161b21042008422088a721012022201c41d0006c6a210320004180056a410c6a211120004180056a41306a211e20004180056a41206a211f200041e0036a41c4006a210a200041a8046a21374100212c20222116034020004180056a41386a22182016220741386a290300370300201e200741306a29030037030020004180056a41286a221a200741286a290300370300201f200741206a29030037030020004180056a41186a221c200741186a29030037030020004180056a41106a2205200741106a29030037030020004180056a41086a2202200741086a29030037030020004180026a41086a2219200741cc006a28020036020020002007290300370380052000200741c4006a29020037038002200741d0006a2116200741c0006a2802002207450d02200041c0006a41386a22132018290300370300200041c0006a41306a2218201e290300370300200041c0006a41286a2220201a290300370300200041c0006a41206a221a201f290300370300200041c0006a41186a2221201c290300370300200041c0006a41106a22092005290300370300200041c0006a41086a220b200229030037030020004180016a41086a221520192802003602002000200029038005370340200020002903800237038001200041e0036a41386a2013290300370300200041e0036a41306a22192018290300370300200041e0036a41286a2020290300370300200041e0036a41206a2213201a290300370300200041e0036a41186a2021290300370300200041e0036a41106a2009290300370300200041e0036a41086a200b290300370300200020002903403703e003200020073602a004200a200029038001370200200a41086a20152802003602004104102a221a450d08201a2017360000201141002900cffa40370000201141086a41002900d7fa4037000020004284808080c000370284052000201a360280052000200041e0036a36029c054108102a2207450d08200042083702b404200020073602b0042011200041b0046a10ec024104200041b0046a10670240024020002802b404221820002802b80422076b4104490d0020002802b00421180c010b200741046a22202007490d0d201841017422072020200720204b1b22074100480d0d0240024020180d002007102a21180c010b20002802b00420182007102e21180b2018450d09200020073602b404200020183602b00420002802b80421070b2000200741046a3602b804201820076a201a280000360000200041e0036a200041b0046a109101200020133602a003200041a0036a200041b0046a108a01200020193602a003200041a0036a200041b0046a108a0120002802a004210720372802002218200041b0046a106702402018450d00201841306c21180340200741106a200041b0046a109101200020073602a003200741306a2107200041a0036a200041b0046a108a01201841506a22180d000b0b20002802b4042119200041b0026a41186a221320003502b80442208620002802b0042221ad841006220741186a290000370300200041b0026a41106a2220200741106a290000370300200041b0026a41086a2218200741086a290000370300200020072900003703b0022007102c200041a0016a41186a220b2013290300370300200041a0016a41106a22152020290300370300200041a0016a41086a22142018290300370300200020002903b0023703a00102402019450d002021102c0b201a102c201841bddbc500ad428080808080018422081002220741086a290000370300200020072900003703b0022007102c200041d0026a41086a22192018290300370300200020002903b0023703d002201841b7b9c000ad4280808080f0008422061002220741086a290000370300200020072900003703b0022007102c200041a0036a41086a22132018290300370300200020002903b0023703a003200041b0046a200041a0016a109f0141c000102a2207450d08200720002903d002370000200720002903a003370010200720002900b004370020200741086a2019290300370000200741186a2013290300370000200741286a200041b0046a41086a2220290000370000200741306a200041b0046a41106a2221290000370000200741386a200041b0046a41186a2209290000370000200041086a200741c0004101410041001097012000280208211a2007102c02400240201a4101470d0020002802a404450d0120002802a004102c0c010b200041b0046a200041e0036a41d00010db051a20004180056a200041b0046a41d00010db051a200041003602d805200042013703d005201820081002220741086a290000370300200020072900003703b0022007102c20192018290300370300200020002903b0023703d002201820061002220741086a290000370300200020072900003703b0022007102c20132018290300370300200020002903b0023703a003200041b0046a200041a0016a109f0141c000102a221a450d09201a20002903d002370000201a20002903a003370010201a20002900b004370020201a41086a2019290300370000201a41186a2013290300370000201a41286a2020290000370000201a41306a2021290000370000201a41386a2009290000370000200041003602b804200042013703b00420004180056a200041b0046a1091012000201f3602a003200041a0036a200041b0046a108a012000201e3602a003200041a0036a200041b0046a108a0120002802c005210720002802c8052218200041b0046a106702402018450d00201841306c21180340200741106a200041b0046a109101200020073602a003200741306a2107200041a0036a200041b0046a108a01201841506a22180d000b0b20002802d005210720002802d8052218200041b0046a106702402018450d002018410574211803402007200041b0046a109101200741206a2107201841606a22180d000b0b20002802b4042107201aad428080808080088420003502b80442208620002802b0042218ad84100102402007450d002018102c0b201a102c024020002802c405450d0020002802c005102c0b024020002802d405450d0020002802d005102c0b201c200b2903003703002005201529030037030020022014290300370300200020002903a0013703800541002107024002400240200441014b0d00024020040e020002000b200041e0016a41186a201c290300370300200041e0016a41106a2005290300370300200041e0016a41086a200229030037030020002000290380053703e001410021070c020b20042118034020072018410176221a20076a2219201d201941246c6a28020020174b1b21072018201a6b221841014b0d000b0b0240201d200741246c6a28020022182017460d00200720182017496a21070b200041e0016a41186a201c290300370300200041e0016a41106a2005290300370300200041e0016a41086a200229030037030020002000290380053703e001200420074f0d0041ecb3c000411e41acfec5001036000b024020042031470d00200441016a22182004490d0e2004410174221a2018201a20184b1b2231ad42247e2208422088a70d0e2008a722184100480d0e0240024020040d002018102a211d0c010b201d200441246c2018102e211d0b201d450d0a0b201d200741246c6a221841246a2018200420076b41246c10dc051a201820173602002018411c6a200041e0016a41186a290300370200201841146a200041e0016a41106a2903003702002018410c6a200041e0016a41086a290300370200201820002903e0013702042009201c290300370300202120052903003703002020200229030037030020002000290380053703b004024020012035470d00200141016a22072001490d0e200141017422182007201820074b1b223541ffffff3f712035470d0e203541057422074100480d0e0240024020010d002007102a21360c010b203620014105742007102e21360b2036450d0a0b200441016a2104203620014105746a220720002903b004370000200741186a2009290300370000200741106a2021290300370000200741086a20202903003700004101212c200141016a21010b20162003470d000b200321160c010b2038450d012022102c0c010b024020162003460d000340201641c0006a2802002218450d01201641d0006a21070240201641c4006a280200450d002018102c0b2007211620032007470d000b0b02402038450d002022102c0b202c410171450d0002402001450d002001410574211820362107034020004180056a200710cb0120002802c005221a0d03200741206a2107201841606a22180d000b0b4108211c41002105410021020c020b2012102c02402035450d002036102c0b2031450d02201d102c0c020b200041e0036a41386a221c20004180056a41386a2219290300370300200041e0036a41306a222020004180056a41306a2205290300370300200041e0036a41286a222120004180056a41286a2202290300370300200041e0036a41206a220920004180056a41206a2211290300370300200041e0036a41186a220a20004180056a41186a2213290300370300200041e0036a41106a220b20004180056a41106a221e290300370300200041e0036a41086a221520004180056a41086a221f290300370300200041a0036a41086a220320004180056a41cc006a290200370300200041a0036a41106a221420004180056a41d4006a290200370300200041a0036a41186a223720004180056a41dc006a28020036020020002000290380053703e0032000200041c4056a22162902003703a003200041c0006a41086a222c2015290300370300200041c0006a41106a2215200b290300370300200041c0006a41186a220b200a290300370300200041c0006a41206a220a2009290300370300200041c0006a41286a22092021290300370300200041c0006a41306a22212020290300370300200041c0006a41386a2220201c290300370300200041a0016a41086a221c2003290300370300200041a0016a41106a22032014290300370300200041a0016a41186a22142037280200360200200020002903e003370340200020002903a0033703a001201f202c290300370300201e20152903003703002013200b2903003703002011200a2903003703002002200929030037030020052021290300370300201920202903003703002000200029034037038005200041b0046a41086a2220201c290300370300200041b0046a41106a22212003290300370300200041b0046a41186a22092014280200360200200020002903a0013703b00441e000102a221c450d03201c200029038005370300201c201a360240201c20002903b004370244201c41386a2019290300370300201c41306a2005290300370300201c41286a2002290300370300201c41206a2011290300370300201c41186a2013290300370300201c41106a201e290300370300201c41086a201f290300370300201c41cc006a2020290300370200201c41d4006a2021290300370200201c41dc006a2009280200360200024020184120470d0041012105410121020c010b200741206a211f203620014105746a221a41606a211441012105410121020340201f21070240034020004180056a200710cb0120002802c00522180d01201a200741206a2207470d000c030b0b200041e0036a41386a221920004180056a41386a2220290300370300200041e0036a41306a221f20004180056a41306a2221290300370300200041e0036a41286a223720004180056a41286a2209290300370300200041e0036a41206a222c20004180056a41206a220a290300370300200041e0036a41186a221120004180056a41186a220b290300370300200041e0036a41106a221320004180056a41106a2215290300370300200041e0036a41086a221e20004180056a41086a2203290300370300200041a0036a41086a2222201641086a290200370300200041a0036a41106a2238201641106a290200370300200041a0036a41186a220c201641186a28020036020020002000290380053703e003200020162902003703a003200041b0046a41086a220d201e290300370300200041b0046a41106a222d2013290300370300200041b0046a41186a222e2011290300370300200041b0046a41206a222f202c290300370300200041b0046a41286a222c2037290300370300200041b0046a41306a2237201f290300370300200041b0046a41386a221f2019290300370300200041a0016a41086a22192022290300370300200041a0016a41106a22222038290300370300200041a0016a41186a2238200c280200360200200020002903e0033703b004200020002903a0033703a0012003200d2903003703002015202d290300370300200b202e290300370300200a202f2903003703002009202c290300370300202120372903003703002020201f290300370300200020002903b00437038005201e20192903003703002013202229030037030020112038280200360200200020002903a0013703e003024020022005470d00200541016a22192005490d09200541017422022019200220194b1b2202ad42e0007e2208422088a70d092008a722194100480d090240024020050d002019102a211c0c010b201c200541e0006c2019102e211c0b201c450d050b200741206a211f201c200541e0006c6a2219200029038005370300201941106a2015290300370300201941086a200329030037030020212903002108202029030021062009290300211b200a2903002110200b2903002132201941c0006a2018360200201941186a2032370300201941206a2010370300201941286a201b370300201941386a2006370300201941306a2008370300201941c4006a20002903e003370200201941cc006a201e290300370200201941d4006a2013290300370200201941dc006a2011280200360200200541016a210520142007470d000b0b200041a0056a20043602002000419c056a203136020020004190056a2001ad4220862035ad843703002000203636028c0520004284808080c0003702840520002012360280052000201d36029805200041003602b804200042013703b0042004200041b0046a106702402004450d00201d200441246c6a2104201d21180340201828020021190240024020002802b404221a20002802b80422076b4104490d0020002802b004211a0c010b200741046a22162007490d09201a41017422072016200720164b1b22074100480d0902400240201a0d002007102a211a0c010b20002802b004201a2007102e211a0b201a450d05200020073602b4042000201a3602b00420002802b80421070b2000200741046a3602b804201a20076a20193600002000200041b0046a3602e003201841046a200041e0036a109402201841246a22182004470d000b0b20002802b804211920002802b404211620002802b004211a200041b0026a41086a220741bddbc500ad42808080808001841002221841086a290000370300200020182900003703b0022018102c200041e0036a41086a22042007290300370300200020002903b0023703e003200741c5dbc500ad4280808080a002841002221841086a290000370300200020182900003703b0022018102c200041b0046a41086a22182007290300370300200020002903b0023703b00420004190026a41cffac00010ca0141c000102a2207450d02200720002903e003370000200720002903b0043700102007200029039002370020200741086a2004290300370000200741186a2018290300370000200741286a20004190026a41086a290300370000200741306a200041a0026a290300370000200741386a20004190026a41186a290300370000200041c0003602b404200020073602b004201a2019200041b0046a10f1022007102c02402016450d00201a102c0b200041e0036a20004180056a10c90120003502e803210820002802e003211a200041003602b804200042013703b0042001200041b0046a106702402001450d00200141057421182036210703402000200041b0046a3602a0012007200041a0016a109402200741206a2107201841606a22180d000b0b20002802b40421072008422086201aad8420003502b80442208620002802b0042218ad84100102402007450d002018102c0b024020002802e403450d00201a102c0b2012102c02402035450d002036102c0b02402031450d00201d102c0b201c0d010b200028028003211a024020004188036a2802002207450d00200741d0006c2118201a41c0006a210703400240200741046a280200450d002007280200102c0b200741d0006a2107201841b07f6a22180d000b0b20004184036a280200450d04201a102c0c040b4104102a2207450d002007201736000020004188056a4284808080c0003703004100211a20004198056a41002900d7fa40370300200041103a00800520004180056a41106a41002900cffa4037030020002007360284054101410020004180056a10920102402039410a6e417f7320056a221820054b0d002000418094ebdc0336028405200020394101203941014b1b2207201841036c221820072018491b2007418094ebdc036e22184101201841014b1b22186ead428094ebdc037e200720186ead8042ffffffff0f834280bbb0217e428094ebdc0380a722073602800520004180056a2007418094ebdc034b4102746a280200211a0b2005450d01200541ffffffff03712005470d04200541027422074100480d042007102a2219450d00200521182019210703402007201a360200200741046a21072018417f6a22180d000b201c200520192005201710a60402402005450d002019102c0b2005450d02200541e0006c2118201c41d4006a210703400240200741706a280200450d002007416c6a280200102c0b02402007280200450d002007417c6a280200102c0b200741e0006a2107201841a07f6a22180d000c030b0b1033000b201c410041044100201710a6040b02402002450d00201c102c0b200028028003211a024020004188036a2802002207450d00200741d0006c2118201a41c0006a210703400240200741046a280200450d002007280200102c0b200741d0006a2107201841b07f6a22180d000b0b20004184036a280200450d00201a102c0b0240200ea7450d00200f4101200f1b102c0b20004180066a24000f0b1035000ba60901077f230041d0026b2202240041002103200241003a002820012802042104417f210502400240034020042003460d01200241086a20036a200128020022062d00003a00002001200420056a3602042001200641016a3602002002200341016a22073a00282005417f6a21052007210320074120470d000b20024188016a41086a200241086a41086a29030037030020024188016a41106a200241086a41106a29030037030020024188016a41186a200241086a41186a290300370300200220022903083703880141002108200241003a0028200420076b2107200420056a21030340024020072008470d000240200841ff0171450d00200241003a00280b200041013a00000c030b200241086a20086a200620086a220541016a2d00003a0000200120033602042001200541026a3602002002200841016a22053a00282003417f6a21032005210820054120470d000b200241a8016a41086a200241086a41086a290300370300200241a8016a41106a200241086a41106a290300370300200241a8016a41186a200241086a41186a290300370300200220022903083703a80141002107200241003a0028200620056a2108034002402003417f470d000240200741ff0171450d00200241003a00280b200041013a00000c030b200241086a20076a200820076a220541016a2d00003a0000200120033602042001200541026a3602002002200741016a22053a00282003417f6a21032005210720054120470d000b200241c8016a41086a200241086a41086a290300370300200241c8016a41106a200241086a41106a290300370300200241c8016a41186a200241086a41186a290300370300200220022903083703c80141002107200241003a00c802200820056a41016a2105034002402003417f470d000240200741ff0171450d00200241003a00c8020b200041013a00000c030b200241a8026a20076a20052d00003a0000200120033602042001200541016a22053602002002200741016a22083a00c8022003417f6a21032008210720084120470d000b200241e8016a41086a2201200241a8026a41086a290300370300200241e8016a41106a2203200241a8026a41106a290300370300200241e8016a41186a2205200241a8026a41186a290300370300200241086a41086a20024188016a41086a290300370300200241086a41106a20024188016a41106a290300370300200241086a41186a20024188016a41186a290300370300200220022903a8023703e8012002200229038801370308200241c0006a200241a8016a41186a290300370300200241386a200241a8016a41106a290300370300200241306a200241a8016a41086a290300370300200220022903a801370328200241e0006a200241c8016a41186a290300370300200241d8006a200241c8016a41106a290300370300200241d0006a200241c8016a41086a290300370300200220022903c80137034820024180016a2005290300370300200241f8006a2003290300370300200241f0006a2001290300370300200220022903e801370368200041016a200241086a41800110db051a200041003a00000c010b0240200341ff0171450d00200241003a00280b200041013a00000b200241d0026a24000bca8c020f057f017e017f017e097f017e037f017e017f027e017f037e017f157e167f230041e00e6b22022400200241900e6a41186a22034200370300200241900e6a41106a22044200370300200241900e6a41086a22054200370300200242003703900e200241c80d6a41086a22064196e0c500ad4280808080f0008422071002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703e80c200220093703900e200641a7e0c500ad4280808080b003841002220841086a290000370300200220082900003703c80d2008102c200420022903c80d2209370300200241880b6a41086a220a2005290300370300200241880b6a41106a220b2009370300200241880b6a41186a220c2006290300370300200220093703a80d200220022903900e3703880b200241c80a6a200241880b6a412010940120022802cc0a210d20022802c80a210e200342003703002004420037030020054200370300200242003703900e200620071002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703e80c200220093703900e200641d8e0c500ad42808080808001841002220841086a290000370300200220082900003703c80d2008102c200320062903002209370300200a2005290300370300200b20022903c80d2207370300200c2009370300200220073703a80d200220022903900e3703880b02400240024002404100200241880b6a10ec032206200641ff01714104461b41ff0171220641034b0d00024020060e0400020103000b2001200d4100200e1b6b220620014b0d00200641064f0d020b200041003602000c020b200241900e6a41186a22084200370300200241900e6a41106a220a4200370300200241900e6a41086a22054200370300200242003703900e200241c80d6a41086a22064196e0c500ad4280808080f000841002220341086a290000370300200220032900003703c80d2003102c20052006290300370300200220022903c80d22093703e80c200220093703900e200641d8e0c500ad42808080808001841002220341086a290000370300200220032900003703c80d2003102c200241a80d6a41086a20062903002209370300200220022903c80d22073703a80d20042007370000200441086a2009370000200241880b6a41086a2005290300370300200241880b6a41106a200a290300370300200241880b6a41186a2008290300370300200220022903900e3703880b200241880b6aad428080808080048410050b200241e80b6a41186a4200370300200241e80b6a41106a220f420037030041082110200241e80b6a41086a22054200370300200242003703e80b200241c80d6a41086a220641ecddc500ad4280808080f000841002220441086a290000370300200220042900003703c80d2004102c20052006290300370300200220022903c80d3703e80b200641c9f8c200ad4280808080a001841002220441086a290000370300200220042900003703c80d2004102c200f20022903c80d2209370300200241880b6a41086a2005290300370300200241880b6a41106a2009370300200241880b6a41186a2006290300370300200220093703a80d200220022903e80b3703880b200241e80b6a200241880b6a412010d0014100211141002112024002400240024020022902ec0b420020022802e80b22061b2209422088a722054105742204450d0020044105752212ad42d0007e2207422088a70d032007a722044100480d032004102a2210450d010b2009a7210d2006410120061b210c02402005450d002005410574220441606a210e200241e80b6a41206a210620102103200c21050340200541086a2900002109200541106a290000210720052900002113200241880b6a41186a2208200541186a290000370300200241880b6a41106a220a2007370300200241880b6a41086a220b2009370300200220133703880b200241b00b6a200241880b6a109204200241e80b6a41186a2008290300370300200241e80b6a41106a200a290300370300200241e80b6a41086a200b290300370300200620022903b00b370300200641086a200241b00b6a41086a290300370300200641106a200241b00b6a41106a290300370300200641186a200241b00b6a41186a290300370300200641206a200241b00b6a41206a290300370300200641286a200241b00b6a41286a290300370300200220022903880b3703e80b2003200241e80b6a41d00010db0541d0006a2103200541206a2105200441606a22040d000b200e41057641016a21110b0240200d450d00200c102c0b200241880b6a41186a22044200370300200241880b6a41106a22144200370300200241880b6a41086a22054200370300200242003703880b200241c80d6a41086a22064196e0c500ad4280808080f0008422091002220341086a290000370300200220032900003703c80d2003102c20052006290300370300200220022903c80d22073703e80c200220073703880b200641c2e0c500ad4280808080e002841002220341086a290000370300200220032900003703c80d2003102c201420022903c80d2207370300200241e80b6a41086a22032005290300370300200241e80b6a41106a22082007370300200241e80b6a41186a220a2006290300370300200220073703a80d200220022903880b3703e80b200241b00b6a200241e80b6a10e403410021150240024020022802b40b22160d004104211642002117410021180c010b200241e80b6aad4280808080800484100520022802b00b211820022903b80b21170b200a42003703002008420037030020034200370300200242003703e80b200641f9e8c500ad42808080809001841002220b41086a2900003703002002200b2900003703c80d200b102c20032006290300370300200220022903c80d3703e80b2006419db1c200ad428080808030841002220b41086a2900003703002002200b2900003703c80d200b102c200241a80d6a41086a220b20062903002207370300200220022903c80d22133703a80d200f2013370000200f41086a200737000020052003290300370300201420082903003703002004200a290300370300200220022903e80b3703880b200241b80a6a200241880b6a10980120022903c00a210720022802b80a210d200442003703002014420037030020054200370300200242003703880b200620091002220c41086a2900003703002002200c2900003703c80d200c102c20052006290300370300200220022903c80d22133703e80c200220133703880b200641e6f8c200ad4280808080f0018422131002220c41086a2900003703002002200c2900003703c80d200c102c200b20062903002219370300200220022903c80d221a3703a80d2014201a370000201441086a220e20193700002003200529030037030020082014290300370300200a2004290300370300200220022903880b3703e80b200241a80a6a200241e80b6a10980120022903b00a211920022802a80a211b200442003703002014420037030020054200370300200242003703880b200620091002220c41086a2900003703002002200c2900003703c80d200c102c20052006290300370300200220022903c80d22093703e80c200220093703880b200620131002220c41086a2900003703002002200c2900003703c80d200c102c200b20062903002209370300200220022903c80d22133703a80d20142013370000200e20093700002003200529030037030020082014290300370300200a2004290300370300200220022903880b3703e80b200220074200200d1b22093703b00b200241e80b6aad221c4280808080800484221d200241b00b6aad221e428080808080018410010240200920194200201b1b7d2213500d00200241e80b6a41186a22044200370300200241e80b6a41106a22034200370300200241e80b6a41086a22054200370300200242003703e80b200241c80d6a41086a22064196e0c500ad4280808080f0008422091002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d3703e80b200641bafdc200ad4280808080e001841002220841086a290000370300200220082900003703c80d2008102c200241a80d6a41086a220d20062903002207370300200220022903c80d22193703a80d200f2019370000200f41086a221f2007370000200241880b6a41086a22082005290300370300200241880b6a41106a220a2003290300370300200241880b6a41186a220b2004290300370300200220022903e80b3703880b200241e80b6a200241880b6a412010d00120022802e80b210c20022902ec0b2119200b4200370300200a420037030020084200370300200242003703880b200620091002220e41086a2900003703002002200e2900003703c80d200e102c20082006290300370300200220022903c80d22093703e80c200220093703880b200641c8fdc200ad42808080809001841002220e41086a2900003703002002200e2900003703c80d200e102c200d20062903002209370300200220022903c80d22073703a80d20142007370000201441086a2009370000200520082903003703002003200a2903003703002004200b290300370300200220022903880b3703e80b200241900a6a200241e80b6a4120109e01200241900a6a41106a290300211a20022903980a212020022802900a210e200442003703002003420037030020054200370300200242003703e80b2006418be9c500ad42808080808001841002221b41086a2900003703002002201b2900003703c80d201b102c20052006290300370300200220022903c80d3703e80b200641c9b5c000ad4280808080d001841002221b41086a2900003703002002201b2900003703c80d201b102c200d20062903002209370300200220022903c80d22073703a80d200f2007370000201f200937000020082005290300370300200a2003290300370300200b2004290300370300200220022903e80b3703880b200241f8096a200241880b6a4120109e01200241e8096a20022903800a420020022802f80922061b2207200241f8096a41106a290300420020061b2209428094ebdc03420010e105200241c8096a20204200200e1b201a4200200e1b20194200200c1b22214220882222420010e005200241d8096a20022903e809221a200241e8096a41086a29030022204280ec94a37c427f10e0052009200241c8096a41086a290300221920022903c8092223200756201920095620192009511b22061b21092007202320061b212320022903d80920077c21192022a721032013428086ebc7f5002013428086ebc7f500541b421f8042ffffffff0f83428094ebdc037e429880b5e50380212241012105200c4101200c1b211f41d87d21060240024003402006450d01200241b8096a201a2020200641ccf0c1006a3502002207420010e0052005417f6a2105200641086a2106202320022903b8092213200720197e22072007428094ebdc038022074280ec94a37c7e7c4280cab5ee01562007a76aad7c2207542009200241b8096a41086a2903002007201354ad7c22075420092007511b2204450d000b0240200441016a41017120056b2206417f6a220520064d0d00200241b8086a201a202042c0f0f50b420010e005200241c0086a29030020022903b8082207201942c0f0f50b7e201942288022094280ec94a37c7e7c4280cab5ee01562009a76aad7c2209200754ad7c21130c020b0240200541244b0d00200241a8096a201a20202005410374220441a4eec1006a2802002208ad2207420010e00520024188096a202320022903a8092213200720197e22072007428094ebdc038022074280ec94a37c7e7c4280cab5ee01562007a76aad7c220720232007562009200241a8096a41086a2903002007201354ad7c22135620092013511b22051b22242007202320051b22077d22232009201320051b2013200920051b7d2024200754ad7d41002006410374220a41a4eec1006a280200220620086b2208200820064b1b22064101200641014b1bad2209420010e105200241f8086a200229038809220720024188096a41086a29030022242009420010e00520024198096a201a2020200441a8eec1006a2802002206ad2225420010e005200241c8086a20244200200a41a8eec1006a28020022042006200420064b22081b2006200420081b6bad2213420010e005200241e8086a200742002013420010e005200241d8086a420042002007420010e005427f427f200241e8086a41086a290300220720022903c80820022903d8087c7c222420022903d00820022903e0088442005220242007547222081b2224427f20022903e80820081b2207202320022903f8087d20137e2009807c22092007542208ad7c221320082013202454200920075a1b22081b2123427f200920081b211320024198096a41086a2903002002290398092209202520197e22072007428094ebdc038022074280ec94a37c7e7c4280cab5ee01562007a76aad7c2207200954ad7c210902402005200420064d730d004200200920237d2007201354ad7d2223200720137d2224200756202320095620232009511b22061b21134200202420061b21090c030b427f200920237c200720137c22232007542206ad7c22072006200720095420072009511b22061b2113427f202320061b21090c020b41b8a9c500200541251038000b200241a8086a201a202042e8aafa0b420010e005200241b0086a29030020022903a8082207201942e8aafa0b7e22092009428094ebdc038022094280ec94a37c7e7c4280cab5ee01562009a76aad7c2209200754ad7c21130b42002126200241e8076a201a20204280c2d72f420010e005200241d8076a20022903e807221a20194280c2d72f7e2019420a8022074280ec94a37c7e7c4280cab5ee01562007a76aad7c2207200241e8076a41086a2903002007201a54ad7c428094ebdc03420010e10520024198086a20092013428094ebdc03420010e105200241c8076a20022903d8072213200241d8076a41086a29030022194280ec94a37c427f10e005200241b8076a201320192022420010e00520024188086a200229039808221320024198086a41086a29030022194280ec94a37c427f10e005200241f8076a201320192022420010e0052022200720022903c8077c7e2227428094ebdc0380212820022903b8072129200241b8076a41086a290300212a202220092002290388087c7e2207428094ebdc038021090240024020030d004200212b0c010b201f20034105746a210e20162017422088a74102746a210d200241a8076a20022903f8072213200720094280ec94a37c7e7c4280cab5ee01562009a76aad7c2209200241f8076a41086a2903002009201354ad7c428094ebdc03420010e10520024198076a20022903a807222c200241a8076a41086a290300222d4280ec94a37c427f10e00520184101201841014b1b220a418094ebdc036e22064101200641014b1b210b20092002290398077c212e200241880b6a41106a2118420021264200212b20162103201f21080240024002400240024003402003200d460d060240024020032802002206450d0020024188076a202c202d200a2006200a2006491b200b6ead428094ebdc037e200a200b6ead8042ffffffff0f832209420010e005200241c80d6a41086a22064196e0c500ad4280808080f000841002220541086a290000370300200220052900003703c80d2005102c200241e80c6a41086a22042006290300370300200220022903c80d3703e80c200641c9f8c200ad4280808080a001841002220541086a290000370300200220052900003703c80d2005102c200241a80d6a41086a22052006290300370300200220022903c80d3703a80d200241880b6a2008109f012009202e7e2213428094ebdc03802109200229038807210720024188076a41086a290300211941c000102a2206450d0a20192007201320094280ec94a37c7e7c4280cab5ee01562009a76aad7c2209200754ad7c2107200620022903e80c370000200641086a2004290300370000200620022903a80d370010200641186a2005290300370000200620022903880b370020200641286a200241880b6a41086a290300370000200641306a2018290300370000200641386a200241880b6a41186a290300370000200241c0003602b40e200220063602b00e200241880b6a2006ad42808080808008841003108d010240024020022802880b22050d00410021040c010b200228028c0b211b200220022802900b3602e40a200220053602e00a20024180076a200241e00a6a1075024002402002280280070d00200228028407210c410121040c010b200241003602b80b200242013703b00b2002410b3602ec0d2002200241b00e6a3602e80d2002200241b00b6a3602900e200241013602fc0b200242013702ec0b200241d0b0c2003602e80b2002200241e80d6a3602f80b200241900e6a41c49ac500200241e80b6a10391a20023502b80b42208620023502b00b841004024020022802b40b450d0020022802b00b102c0b410021040b201b450d002005102c0b42002113200241f0066a20092007428094ebdc03420010e105200241e0066a20022903f0062219200241f0066a41086a290300221a4280ec94a37c427f10e005200241d0066a2019201a200c410020041bad2220420010e0052006102c200242003703b80b200242003703b00b024002404200200920022903d00622192020200920022903e0067c7e221a201a428094ebdc0380221a4280ec94a37c7e7c4280cab5ee0156201aa76aad7c222f7d221a201a2009562007200241d0066a41086a290300202f201954ad7c22307d2009202f54ad7d220920075620092007511b22061b22314200200920061b22328450450d00420021090c010b200241e80b6a2008109204200241c0066a20022903e80b220942012009420156200241e80b6a41086a29030022094200522009501b22061b22132009420020061b2209428094ebdc03420010e10520022802880c210c200241c0066a41086a290300213320022903c0062134024020022802900c2206450d00200241b0066a2013200920344201203442015620334200522033501b22051b221a2033420020051b222010e10520024190066a20312032428094ebdc03420010e105200241a0066a20312032428094ebdc03420010e20520022903b006220742ffffffff0f56200241b0066a41086a29030022194200522019501b0d032007a7450d05200c200641306c6a2104200742ffffffff0f83212320024190066a41086a2903002122200229039006212420022903a0062125200c2106034020024180066a20132006290300220720132007542009200641086a29030022075420092007511b22051b2009200720051b201a202010e105200229038006220742808080801054410020024180066a41086a290300501b450d0a200241d8056a20242022200742ffffffff0f83428094ebdc037e20238042ffffffff0f832207420010e005200241e8056a200641106a20022903d8052219200720257e22072007428094ebdc038022074280ec94a37c7e7c4280cab5ee01562007a76aad7c2207200241d8056a41086a2903002007201954ad7c109304200241b00b6a20022903e80520022903f005200241e8056a41106a290300108202200641306a22062004470d000b0b200241b8056a2013200920344201203442015620334200522033501b22061b221a2033420020061b222010e10520022903b8052207428080808010544100200241b8056a41086a290300501b450d05200241a8056a201320022903f80b221920132019542009200241e80b6a41186a29030022195420092019511b22061b2009201920061b201a202010e10520022903a8052209428080808010544100200241a8056a41086a290300501b450d062007a7450d0720024198056a20312032428094ebdc03420010e10520024188056a200229039805221320024198056a41086a29030022194280ec94a37c427f10e005200241f8046a20132019200942ffffffff0f83428094ebdc037e200742ffffffff0f838042ffffffff0f832209420010e00520022903f8042207200920312002290388057c7e22092009428094ebdc038022094280ec94a37c7e7c4280cab5ee01562009a76aad7c2213200754ad2109200241f8046a41086a29030021070240200228028c0c450d00200c102c0b200720097c21090b200241e0046a20082013202f7c2207200920307c2007201354ad7c109304200241b00b6a20022903e00420022903e804200241e0046a41106a290300108202427f202b200241b00b6a41086a2903007c202620022903b00b7c22072026542206ad7c220920062009202b542009202b511b22061b212b427f200720061b21260b200341046a2103200841206a2208200e470d010c070b0b2002411136028c0b200241f9e2c3003602880b41a7e1c30041e000200241880b6a4184ebc300103b000b200241c8056a2013200c290300220720132007542009200c41086a29030022075420092007511b22061b2009200720061b201a202010e10520022903c805428080808010544100200241c8056a41086a290300501b450d0341e0e2c30041194188e2c3001036000b2002411136028c0b200241f9e2c3003602880b41a7e1c30041e000200241880b6a4184ebc300103b000b2002411136028c0b200241f9e2c3003602880b41a7e1c30041e000200241880b6a4184ebc300103b000b41e0e2c30041194188e2c3001036000b2002411136028c0b200241f9e2c3003602880b41a7e1c30041e000200241880b6a4184ebc300103b000b202a2029202720284280ec94a37c7e7c4280cab5ee01562028a76aad7c2209202954ad7c210702402017a7450d002016102c0b200241e80b6a41186a202b370300200241e80b6a41106a2026370300200241e80b6a41086a41003a0000200241900c6a42002007202b7d2009202654ad7d2213200920267d2219200956201320075620132007511b22061b2207370300200241e80b6a41206a4200201920061b2213370300200241043a00e80b41014100200241e80b6a109201200241c8046a2026202b10ce01200241c8046a41106a290300211920022903d004211a02400240024020022903c8042209a7450d00200241880d6a41186a22044200370300200241880d6a41106a22034200370300200241880d6a41086a22054200370300200242003703880d200241c80d6a41086a2206418be9c500ad428080808080018422201002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703e80b200220093703880d200641c9b5c000ad4280808080d0018422231002220841086a290000370300200220082900003703c80d2008102c200320022903c80d2209370300200241e80c6a41086a220a2005290300370300200241e80c6a41106a220b2009370300200241e80c6a41186a220c2006290300370300200220093703880b200220022903880d3703e80c200241b0046a200241e80c6a4120109e01200241b0046a41106a290300210920022903b804212220022802b0042108200442003703002003420037030020054200370300200242003703880d200620201002220341086a290000370300200220032900003703c80d2003102c20052006290300370300200220022903c80d22203703e80b200220203703880d200620231002220341086a290000370300200220032900003703c80d2003102c200420062903002220370300200a2005290300370300200b20022903c80d2223370300200c2020370300200220233703880b200220022903880d3703e80c2002427f2009420020081b220920197c2022420020081b2219201a7c221a2019542206ad7c22192006201920095420192009511b22061b3703f00b2002427f201a20061b3703e80b200241e80b6a2106200241e80c6a21050c010b2009500d01200241880d6a41186a22044200370300200241880d6a41106a22034200370300200241880d6a41086a22054200370300200242003703880d200241c80d6a41086a2206418be9c500ad428080808080018422201002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703e80b200220093703880d200641c9b5c000ad4280808080d0018422231002220841086a290000370300200220082900003703c80d2008102c200320022903c80d2209370300200241e80c6a41086a220a2005290300370300200241e80c6a41106a220b2009370300200241e80c6a41186a220c2006290300370300200220093703880b200220022903880d3703e80c20024198046a200241e80c6a4120109e0120024198046a41106a290300210920022903a00421222002280298042108200442003703002003420037030020054200370300200242003703880d200620201002220341086a290000370300200220032900003703c80d2003102c20052006290300370300200220022903c80d22203703e80b200220203703880d200620231002220341086a290000370300200220032900003703c80d2003102c200420062903002220370300200a2005290300370300200b20022903c80d2223370300200c2020370300200220233703880b200220022903880d3703e80c2002427f2009420020081b220920197c2022420020081b2219201a7c221a2019542206ad7c22192006201920095420192009511b22061b3703f00b2002427f201a20061b3703e80b200241e80b6a2106200241e80c6a21050b2005ad42808080808004842006ad428080808080028410010b200241e80b6a41186a22044200370300200241e80b6a41106a22034200370300200241e80b6a41086a22054200370300200242003703e80b200241c80d6a41086a2206418be9c500ad428080808080018422201002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703b00b200220093703e80b200641c9b5c000ad4280808080d0018422231002220841086a290000370300200220082900003703c80d2008102c200241a80d6a41086a220b20062903002209370300200220022903c80d22193703a80d200f2019370000200f41086a220c2009370000200241880b6a41086a220d2005290300370300200241880b6a41106a220e2003290300370300200241880b6a41186a221b2004290300370300200220022903e80b3703880b20024180046a200241880b6a4120109e0120024180046a41106a290300210920022903880421192002280280042108200442003703002003420037030020054200370300200242003703e80b200620201002220a41086a2900003703002002200a2900003703c80d200a102c20052006290300370300200220022903c80d221a3703b00b2002201a3703e80b200620231002220a41086a2900003703002002200a2900003703c80d200a102c200b2006290300221a370300200220022903c80d22223703a80d200f2022370000200c201a370000200d2005290300370300200e2003290300370300201b2004290300370300200220022903e80b3703880b2002427f2009420020081b220920077c2019420020081b221920137c22222019542208ad7c221a2008201a200954201a2009511b22081b3703f00b2002427f202220081b3703e80b200241880b6aad4280808080800484201c4280808080800284221a1001024002402019427f85201320081b22132009427f85200720081b2209844200520d00200241880d6a41186a22044200370300200241880d6a41106a22034200370300200241880d6a41086a22054200370300200242003703880d200620201002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703e80b200220093703880d200620231002220841086a290000370300200220082900003703c80d2008102c200320022903c80d2209370300200241e80c6a41086a220a2005290300370300200241e80c6a41106a220b2009370300200241e80c6a41186a220c2006290300370300200220093703880b200220022903880d3703e80c200241e8036a200241e80c6a4120109e01200241e8036a41106a290300210920022903f003210720022802e8032108200442003703002003420037030020054200370300200242003703880d200620201002220341086a290000370300200220032900003703c80d2003102c20052006290300370300200220022903c80d22133703e80b200220133703880d200620231002220341086a290000370300200220032900003703c80d2003102c200420062903002213370300200a2005290300370300200b20022903c80d2219370300200c2013370300200220193703880b200220022903880d3703e80c20022009420020081b3703f00b20022007420020081b3703e80b200241e80c6aad4280808080800484201a10010c010b200241e80b6a10ae02200241e80b6a20132009109c012004200937030020032013370300200541053a00002002410c3a00e80b41014100200241e80b6a1092010b410121152021a7450d00201f102c0b200241880b6a41186a22044200370300200241880b6a41106a22034200370300200241880b6a41086a22054200370300200242003703880b200241c80d6a41086a22064196e0c500ad4280808080f0008422091002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22073703e80c200220073703880b2006419de0c500ad4280808080a0018422071002220841086a290000370300200220082900003703c80d2008102c200241a80d6a41086a220820062903002213370300200220022903c80d22193703a80d20142019370000201441086a220a2013370000200241e80b6a41086a220b2005290300370300200241e80b6a41106a220c2003290300370300200241e80b6a41186a220d2004290300370300200220022903880b3703e80b200241e0036a200241e80b6a412010940120022802e403211b20022802e0032118200442003703002003420037030020054200370300200242003703880b200620091002220e41086a2900003703002002200e2900003703c80d200e102c20052006290300370300200220022903c80d22133703e80c200220133703880b200620071002220e41086a2900003703002002200e2900003703c80d200e102c200820062903002207370300200220022903c80d22133703a80d20142013370000200a2007370000200b2005290300370300200c2003290300370300200d2004290300370300200220022903880b3703e80b2002201b410020181b221b41016a22353602b00b201d201e4280808080c0008422071001200442003703002003420037030020054200370300200242003703880b200620091002220e41086a2900003703002002200e2900003703c80d200e102c20052006290300370300200220022903c80d22133703e80c200220133703880b200641a7e0c500ad4280808080b0038422131002220e41086a2900003703002002200e2900003703c80d200e102c200820062903002219370300200220022903c80d221a3703a80d2014201a370000200a2019370000200b2005290300370300200c2003290300370300200d2004290300370300200220022903880b3703e80b200241d8036a200241e80b6a4120109401200442003703002003420037030020054200370300200242003703880b200620091002220e41086a2900003703002002200e2900003703c80d200e102c20052006290300370300200220022903c80d22193703e80c200220193703880b200620131002220e41086a2900003703002002200e2900003703c80d200e102c200820062903002213370300200220022903c80d22193703a80d20142019370000200a2013370000200b2005290300370300200c2003290300370300200d2004290300370300200220022903880b3703e80b200220013602b00b201d20071001200442003703002003420037030020054200370300200242003703880b200620091002220e41086a2900003703002002200e2900003703c80d200e102c20052006290300370300200220022903c80d22093703e80c200220093703880b200641f3e0c500ad4280808080a001841002220e41086a2900003703002002200e2900003703c80d200e102c200820062903002209370300200220022903c80d22073703a80d20142007370000200a2009370000200b2005290300370300200c2003290300370300200d2004290300370300200220022903880b3703e80b200241b00b6a200241e80b6a10eb0320022802b00b2206410420061b2118024020022902b40b420020061b22094220882207a722062009a7470d00200641016a22052006490d032007a722034101742204200520052004491b220541ffffffff01712005470d03200541037422044100480d030240024020060d002004102a21180c010b201820034103742004102e21180b2018450d012009422088a721062005ad21090b201820064103746a2205200136020420052035360200200942ffffffff0f832113200641016a213602400240203541a1054f0d0020132036ad4220868421130c010b2036450d00201b41e17a6a2104200641037441086a2105410021372018210602400340200628020020044f0d01200641086a2106203741016a2137200541786a22050d000b0b0240024020362037490d00024020370d00410021060c020b2037410374211f201e4280808080c0008421092018211b0340201b2802002101200241c80d6a41086a22054196e0c500ad4280808080f0008422071002220641086a290000370300200220062900003703c80d2006102c200241e80b6a41086a22042005290300370300200220022903c80d3703e80b200541f5f8c200ad4280808080b002841002220641086a290000370300200220062900003703c80d2006102c200241880b6a41086a22032005290300370300200220022903c80d3703880b200220013602b00b200241880d6a41186a220820091006220641186a290000370300200241880d6a41106a220a200641106a290000370300200241880d6a41086a220b200641086a290000370300200220062900003703880d2006102c200241e80c6a41186a220c2008290300370300200241e80c6a41106a220d200a290300370300200241e80c6a41086a220e200b290300370300200220022903880d3703e80c41c000102a2206450d04200620022903e80b370000200641086a2004290300370000200620022903880b370010200641186a2003290300370000200620022903e80c370020200641286a200e290300370000200641306a200d290300370000200641386a200c2903003700002006ad4280808080800884100d2006102c200520071002220641086a290000370300200220062900003703c80d2006102c20042005290300370300200220022903c80d3703e80b20054188f9c200ad4280808080b002841002220641086a290000370300200220062900003703c80d2006102c20032005290300370300200220022903c80d3703880b200220013602b00b200820091006220641186a290000370300200a200641106a290000370300200b200641086a290000370300200220062900003703880d2006102c200c2008290300370300200d200a290300370300200e200b290300370300200220022903880d3703e80c41c000102a2206450d04201b41086a211b200620022903e80b370000200641086a2004290300370000200620022903880b370010200641186a2003290300370000200620022903e80c370020200641286a200e290300370000200641306a200d290300370000200641386a200c2903003700002006ad4280808080800884100d2006102c201f41786a221f0d000b203721060c010b41dafec500411c41acfec5001036000b203620376b221f450d0002402006450d002018201820064103746a201f41037410dc051a0b20182802042136200241e80c6a41186a22374200370300200241e80c6a41106a220e4200370300200241e80c6a41086a221b4200370300200242003703e80c200241c80d6a41086a220341ecddc500ad4280808080f00084221a1002220641086a290000370300200220062900003703c80d2006102c201b2003290300370300200220022903c80d22093703e80b200220093703e80c200341e1ddc500ad4280808080b0018422201002220641086a290000370300200220062900003703c80d2006102c200e20022903c80d2209370300200241a80d6a41086a2238201b290300370300200241a80d6a41106a22392009370300200241a80d6a41186a223a2003290300370300200220093703880b200220022903e80c3703a80d200241e80b6a200241a80d6a10e4014101210420022902ec0b21190240024020022802e80b22064101460d00200641014621040c010b2019422088a7223b20362036203b4b1b22012019a72205490d000240200120054d0d00201e4280808080c00084210941ecddc500ad4280808080f0008421070340200241c80d6a41086a220620071002220441086a290000370300200220042900003703c80d2004102c200241e80b6a41086a22082006290300370300200220022903c80d3703e80b200641a1c6c100ad4280808080a002841002220441086a290000370300200220042900003703c80d2004102c200241880b6a41086a22042006290300370300200220022903c80d3703880b200220053602b00b200241880d6a41186a220a20091006220641186a290000370300200241880d6a41106a220b200641106a290000370300200241880d6a41086a220c200641086a290000370300200220062900003703880d2006102c200241e80c6a41186a220d200a290300370300200241e80c6a41106a220a200b290300370300200241e80c6a41086a220b200c290300370300200220022903880d3703e80c41c000102a2206450d04200620022903e80b370000200641086a2008290300370000200620022903880b370010200641186a2004290300370000200620022903e80c370020200641286a200b290300370000200641306a200a290300370000200641386a200d2903003700002006ad428080808080088410052006102c2001200541016a2205470d000b0b2036203b4921042019428080808070832001ad8421190b2013201fad42208684211320374200370300200e4200370300201b4200370300200242003703e80c2003201a1002220641086a290000370300200220062900003703c80d2006102c201b2003290300370300200220022903c80d22093703e80b200220093703e80c200320201002220641086a290000370300200220062900003703c80d2006102c200241880b6a41086a20032903002209370300200220022903c80d22073703880b200e2007370000200e41086a20093700002038201b2903003703002039200e290300370300203a2037290300370300200220022903e80c3703a80d024020040d00200241a80d6aad428080808080048410050c010b4108102a2206450d01200620193e0000200620194220883e0004200241a80d6aad42808080808004842006ad428080808080018410012006102c0b200241880b6a41186a22034200370300200241880b6a41106a22084200370300200241880b6a41086a22054200370300200242003703880b200241c80d6a41086a22064196e0c500ad4280808080f000841002220441086a290000370300200220042900003703c80d2004102c20052006290300370300200220022903c80d22093703e80c200220093703880b200641f3e0c500ad4280808080a001841002220441086a290000370300200220042900003703c80d2004102c200241a80d6a41086a20062903002209370300200220022903c80d22073703a80d20142007370000201441086a2009370000200241e80b6a41086a2005290300370300200241e80b6a41106a2008290300370300200241e80b6a41186a2003290300370300200220022903880b3703e80b0240024020180d00201d10050c010b200241003602b80b200242013703b00b2013422088a72206200241b00b6a10670240024020060d0020022802b80b210320022802b40b210420022802b00b21050c010b201820064103746a211b410020022802b80b220a6b210320022802b40b2104410021060340200a20066a2108201820066a220b280200210d02400240200420036a4104490d0020022802b00b21050c010b200841046a22052008490d062004410174220c2005200c20054b1b220c4100480d060240024020040d00200c102a21050c010b20022802b00b2004200c102e21050b2005450d042002200c3602b40b200220053602b00b200c21040b2002200841046a220c3602b80b2005200a6a20066a200d360000200b41046a280200210d0240200420036a417c6a41034b0d00200c41046a220e200c490d062004410174220c200e200c200e4b1b220c4100480d060240024020040d00200c102a21050c010b20052004200c102e21050b2005450d042002200c3602b40b200220053602b00b200c21040b2002200841086a3602b80b2005200a6a20066a41046a200d360000200341786a2103200641086a2106200b41086a201b470d000b200a20066a21030b2013a72106201d2003ad4220862005ad84100102402004450d002005102c0b2006450d002018102c0b200241003602d80a200242043703d00a200241e80b6a108a04200241e00a6a20022802e80b220620022802f00b10d301024020022802ec0b450d002006102c0b200241880b6a410c6a200241e00a6a41086a290300370200200241880b6a41146a200241e00a6a41106a290300370200200241880b6a411c6a200241e00a6a41186a290300370200200241880b6a41246a200241e00a6a41206a2d00003a0000200220022903e00a37028c0b2002200241d00a6a3602880b200241e80b6a200241880b6a410472109404410121180240024020022802e80b4101460d004100211b4100211f0c010b200241b00b6a41206a200241e80b6a41246a280200360200200241b00b6a41186a200241e80b6a411c6a22062902002209370300200241b00b6a41106a200241e80b6a41146a22052902002207370300200241b00b6a41086a200241e80b6a410c6a22042902002213370300200220022902ec0b22193703b00b200241900e6a41186a2009370300200241900e6a41106a2007370300200241900e6a41086a2013370300200220193703900e200241e80c6a41186a2006290200370300200241e80c6a41106a2005290200370300200241e80c6a41086a2004290200370300200220022902ec0b3703e80c4120102a2205450d01200520022903900e370000200541186a200241900e6a41186a2203290300370000200541106a200241900e6a41106a2208290300370000200541086a200241900e6a41086a220a290300370000200241a80d6a41086a200241e80c6a41086a2903002209370300200241a80d6a41106a200241e80c6a41106a2903002207370300200241a80d6a41186a200241e80c6a41186a2903002213370300200220022903e80c22193703a80d20022802880b2106200241880d6a41186a220b2013370300200241880d6a41106a220c2007370300200241880d6a41086a220d2009370300200220193703880d024020062802082204200641046a280200470d00200441016a220e2004490d042004410174221b200e201b200e4b1b220ead422c7e2209422088a70d042009a7221b4100480d040240024020040d00201b102a21040c010b20062802002004412c6c201b102e21040b2004450d0220062004360200200641046a200e360200200628020821040b200d2903002109200c2903002107200b290300211320022903880d211920062802002004412c6c6a22044281808080103702242004200536022020042019370200200441186a2013370200200441106a2007370200200441086a20093702004101211b2006200628020841016a360208200241b00e6a41086a200a290300370300200241b00e6a41106a2008290300370300200241b00e6a41186a2003290300370300200220022903900e3703b00e4120102a2218450d01201820022903b00e370000201841186a200241b00e6a41186a220e290300370000201841106a200241b00e6a41106a2201290300370000201841086a200241b00e6a41086a2237290300370000200241b00b6a41206a200241880b6a41206a290300370300200241b00b6a41186a200241880b6a41186a290300370300200241b00b6a41106a200241880b6a41106a290300370300200241b00b6a41086a200241880b6a41086a290300370300200220022903880b3703b00b200241e80b6a200241b00b6a410472223c109404024020022802e80b4101460d004101211f0c010b200241e80b6a41047221054102210a412021084101211b4101211f0340200241e80d6a41206a200541206a280200360200200241e80d6a41186a200541186a22062902002209370300200241e80d6a41106a200541106a22042902002207370300200241e80d6a41086a200541086a220329020022133703002002200529020022193703e80d200241900e6a41186a220b2009370300200241900e6a41106a220c2007370300200241900e6a41086a220d2013370300200220193703900e200241e80c6a41186a22362006290000370300200241e80c6a41106a22062004290000370300200241e80c6a41086a22382003290000370300200220052900003703e80c4120102a2204450d02200420022903900e370000200441186a200b290300370000200441106a200c290300370000200441086a200d290300370000200241a80d6a41086a20382903002209370300200241a80d6a41106a20062903002207370300200241a80d6a41186a20362903002213370300200220022903e80c22193703a80d20022802b00b2106200241880d6a41186a22362013370300200241880d6a41106a22382007370300200241880d6a41086a22392009370300200220193703880d024020062802082203200641046a223a280200470d00200341016a223b2003490d052003410174223d203b203d203b4b1b223bad422c7e2209422088a70d052009a7223d4100480d050240024020030d00203d102a21030c010b20062802002003412c6c203d102e21030b2003450d0320062003360200203a203b360200200628020821030b20392903002109203829030021072036290300211320022903880d211920062802002003412c6c6a22034281808080103702242003200436022020032019370200200341186a2013370200200341106a2007370200200341086a20093702002006200628020841016a360208200241c80d6a41086a2206200d290300370300200241c80d6a41106a2204200c290300370300200241c80d6a41186a2203200b290300370300200220022903900e3703c80d200e20032903003703002001200429030037030020372006290300370300200220022903c80d3703b00e0240201b201f470d00201b41016a2206201b490d05200a2006200a20064b1b221f41ffffff3f71201f470d05201f41057422064100480d0502400240201b0d002006102a21180c010b201820082006102e21180b2018450d030b201820086a220620022903b00e370000200641186a200e290300370000200641106a2001290300370000200641086a2037290300370000200241e80b6a203c109404200a41026a210a200841206a2108201b41016a211b20022802e80b4101460d000b0b200241b00b6a108404200241e80b6a20022802b00b220620022802b80b10d301024020022802b40b450d002006102c0b200241e80d6a41086a200241e80b6a41086a22362903002209370300200241e80d6a41106a200241e80b6a41106a22382903002207370300200241e80d6a41186a200241e80b6a41186a22392903002213370300200241e80d6a41206a200241e80b6a41206a220d2d000022063a0000200220022903e80b22193703e80d200241880b6a41206a20063a0000200241880b6a41186a2013370300200241880b6a41106a2007370300200241880b6a41086a2009370300200220193703880b200241e80b6a200241880b6a109504024020022d00980c4102460d000340200241b00b6a41286a200241e80b6a41286a280200360200200241b00b6a41206a200d290300370300200241b00b6a41186a220e2039290300370300200241b00b6a41106a22012038290300370300200241b00b6a41086a22372036290300370300200220022903e80b3703b00b200d28020021084100210a0240200229028c0c2209422088a72203450d0020022802940c210c4100210a41002106024003402006210502400240200a0d000340024020062003490d00200621050c0a0b2002200820064105746a3602c80d200241900e6a200241c80d6a1090040240024020022802980e2205450d0020022802940e21040240200228029c0e450d002005102c0b200641016a21062004200c4d0d010c040b200641016a21060b20062003490d000b4100210a0c040b0340200520034f0d082002200820054105746a22043602c80d200241900e6a200241c80d6a1090040240024020022802980e22060d00200541016a21060c010b20022802940e210b0240200228029c0e450d002006102c0b200541016a2106200b200c4b0d020b02402005200a6b220520034f0d00200820054105746a22052004290000370000200541186a200441186a290000370000200541106a200441106a290000370000200541086a200441086a29000037000020062105200620034f0d040c010b0b41fcb4c000200520031038000b200a41016a210a20062003490d000b0b200a450d00200620034f0d00200820064105746a2205200a4105746b2005200320066b41057410dc051a0b200241b00e6a41186a2206200e290300370300200241b00e6a41106a22052001290300370300200241b00e6a41086a22042037290300370300200220022903b00b3703b00e2008450d01200241880d6a41186a220b2006290300370300200241880d6a41106a220c2005290300370300200241880d6a41086a220e2004290300370300200220022903b00e3703880d0240024020022802d80a220520022802d40a460d0020022802d00a21060c010b200541016a22062005490d05200541017422042006200420064b1b2204ad422c7e2207422088a70d052007a722064100480d050240024020050d002006102a21060c010b20022802d00a2005412c6c2006102e21060b2006450d03200220043602d40a200220063602d00a0b200e2903002107200c2903002113200b290300211920022903880d211a20062005412c6c6a2206200942ffffffff0f832003200a6bad42208684370224200620083602202006201a370200200641186a2019370200200641106a2013370200200641086a20073702002002200541016a3602d80a200241e80b6a200241880b6a10950420022d00980c4102470d000b0b200241880b6a41186a22044200370300200241880b6a41106a22034200370300200241880b6a41086a22054200370300200242003703880b200241c80d6a41086a22064196e0c500ad4280808080f0008422091002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22073703e80c200220073703880b200641f3dfc500ad4280808080e001841002220841086a290000370300200220082900003703c80d2008102c200241a80d6a41086a220a20062903002207370300200220022903c80d22133703a80d20142013370000201441086a220b2007370000200241e80b6a41086a220c2005290300370300200241e80b6a41106a220d2003290300370300200241e80b6a41186a220e2004290300370300200220022903880b3703e80b200241d0036a200241e80b6a412010940120022802d403213e20022802d003213f200442003703002003420037030020054200370300200242003703880b200620091002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703e80c200220093703880b20064181e0c500ad4280808080d002841002220841086a290000370300200220082900003703c80d2008102c200a20062903002209370300200220022903c80d22073703a80d20142007370000200b2009370000200c2005290300370300200d2003290300370300200e2004290300370300200220022903880b3703e80b200241c8036a200241e80b6a412010940120022802cc03210620022802c803210520022802d00a214020022802d40a214120022802d80a2136200242003702d40e200241d0e1c1003602d00e02400240024002402036201b6a2239ad42e0007e2209422088a70d002009a72238417f4c0d004108210e0240024020380d0041082142410821430c010b2038102a2242450d05204221430b4100210d410021440240201b4105742203450d0020034105752244ad42d8007e2209422088a70d072009a722044100480d072004102a220e450d050b2006410420051b223a41014b213b0240201b450d00200341606a213c200241980c6a2105200241900c6a2137200e210841002104201821060340200241b00e6a41186a220a200641186a220b290000370300200241b00e6a41106a220c200641106a220d290000370300200241b00e6a41086a221b200641086a2201290000370300200220062900003703b00e200241b00b6a41186a200b290000370300200241b00b6a41106a200d290000370300200241b00b6a41086a2001290000370300200220062900003703b00b200241d00e6a200241b00b6a200410d501200241e80b6a41086a4200370300200241e80b6a41106a4200370300200241e80b6a41186a4200370300200241e80b6a41206a420037030020374200370300200541186a200a290300370000200541106a200c290300370000200541086a201b290300370000200520022903b00e370000200242003703e80b2008200241e80b6a41d00010db05220841d0006a41003a0000200841d8006a2108200641206a2106200441016a2104200341606a22030d000b203c41057641016a210d0b203a4101203b1b21060240201f450d002018102c0b02400240024002400240200d2006490d000240024020392036412c6c2206412c6d2205490d00203921450c010b203941017422042005200420054b1b2245ad42e0007e2209422088a70d0c2009a722054100480d0c0240024020390d002005102a21420c010b204220382005102e21420b2042450d0a204221430b204020066a2146024020360d004100213d2040213b0c040b200241880d6a41106a2101204021062042213a4100213d0340200241b00e6a41186a2205200641186a290200370300200241b00e6a41106a2204200641106a290200370300200241b00e6a41086a2203200641086a290200370300200220062902003703b00e2006412c6a213b2006280220223c450d04200641286a280200211b200641246a2802002147200241b00b6a41186a22482005290300370300200241b00b6a41106a22492004290300370300200241b00b6a41086a224a2003290300370300200220022903b00e3703b00b200241b8036a200241b00b6a109604201bad42c8007e2209422088a70d062009a72206417f4c0d06200241b8036a41086a290300211a20022903b80321200240024020060d004108211f0c010b2006102a221f450d0b0b02400240201b0d004100211b410021180c010b203c201b4105746a213941002118203c210a0340200a41086a2900002109200a41106a2900002107200a2900002113200241e80b6a41186a2237200a41186a290000370300200241e80b6a41106a22362007370300200241e80b6a41086a22382009370300200220133703e80b200a41206a210a200241d00e6a210620022802d40e210b024003402006280200220841086a210520082f0106220c4105742106410021040240024003402006450d01200241e80b6a2005412010dd052203450d02200641606a2106200441016a2104200541206a21052003417f4a0d000b2004417f6a210c0b200b450d02200b417f6a210b2008200c4102746a4194036a21060c010b0b200d200820044102746a41e8026a220528020022064d0d05200e200641d8006c6a22062903202109200641286a2903002107200241880d6a41186a2208420037030020014200370300200241880d6a41086a22044200370300200242003703880d200241c80d6a41086a2206418be9c500ad42808080808001841002220341086a290000370300200220032900003703c80d2003102c20042006290300370300200220022903c80d3703880d200641c9b5c000ad4280808080d001841002220341086a290000370300200220032900003703c80d2003102c200241880b6a41086a20062903002213370300200220022903c80d22193703880b20012019370000200141086a2013370000200241e80c6a41086a2004290300370300200241e80c6a41106a2001290300370300200241e80c6a41186a2008290300370300200220022903880d3703e80c200241a0036a200241e80c6a4120109e0120024190036a20022903a803200241a0036a41106a290300427f420010e105200d200528020022064d0d0620024180036a2020201a200229039003420020022802a00322041b22134201201342015620024190036a41086a290300420020041b22134200522013501b22041b2013420020041b10e105200e200641d8006c6a220641286a427f200720092002290380037c22132009542204ad7c221920042019200754201320095a1b22041b3703002006427f201320041b370320200241a80d6a41186a22042037290300370300200241a80d6a41106a22032036290300370300200241a80d6a41086a22082038290300370300200220022903e80b3703a80d20052802002105024002402018201b460d00201821060c010b201b41016a2206201b490d10201b410174220b2006200b20064b1b220bad42c8007e2209422088a70d102009a722064100480d1002400240201b0d002006102a211f0c010b201f201b41c8006c2006102e211f0b201f450d0e201b2106200b211b0b201f200641c8006c6a2206420037030020062005360220200641186a4200370300200641106a4200370300200641086a4200370300200620022903a80d3702242006412c6a2008290300370200200641346a20032903003702002006413c6a2004290300370200201841016a21180b200a2039470d000b0b02402047450d00203c102c0b200241900e6a41186a22032048290300370300200241900e6a41106a22082049290300370300200241900e6a41086a220a204a290300370300200220022903b00b3703900e200241880d6a41186a220b420037030020014200370300200241880d6a41086a22054200370300200242003703880d200241c80d6a41086a2206418be9c500ad42808080808001841002220441086a290000370300200220042900003703c80d2004102c20052006290300370300200220022903c80d3703880d200641c9b5c000ad4280808080d001841002220441086a290000370300200220042900003703c80d2004102c200241880b6a41086a20062903002209370300200220022903c80d22073703880b20012007370000200141086a2009370000200241e80c6a41086a2005290300370300200241e80c6a41106a2001290300370300200241e80c6a41186a200b290300370300200220022903880d3703e80c200241e8026a200241e80c6a4120109e01200241d8026a20022903f002200241e8026a41106a290300427f420010e105200241c8026a2020201a20022903d802420020022802e80222061b220942012009420156200241d8026a41086a290300420020061b22094200522009501b22061b2009420020061b10e105203a4200370308203a20022903c802370300203a4200370310203a41186a4200370300203a41286a4200370300203a4201370320203a2018360238203a201b360234203a201f360230203a20022903900e37023c203a41c4006a200a290300370200203a41cc006a2008290300370200203a41d4006a2003290300370200203d41016a213d203a41e0006a213a203b2106203b2046470d000c050b0b02402044450d00200e102c0b02402039450d002042102c0b20022802d00e20022802d40e20022802d80e10da0102402036450d002036412c6c2105204041206a210603400240200641046a280200450d002006280200102c0b2006412c6a2106200541546a22050d000b0b2041450d062040102c0c060b41d087c6002006200d1038000b41a888c6002006200d1038000b203b2046460d000340203b41206a2802002205450d01203b412c6a21060240203b41246a280200450d002005102c0b2006213b20462006470d000b0b203e4100203f1b213a02402041450d002040102c0b203aad42307e2209422088a70d002009a72206417f4c0d000240024020060d00410821370c010b2006102a2237450d050b203a412c6c2206417f4c0d000240024020060d004104214a0c010b2006102a224a450d050b4100213b02400240200d203a200d203a491b223e0d00203a2140410021480c010b200e41a87f6a2147200d41d8006c213c2043203d41e0006c6a211f200241b00e6a41186a2149200241b00e6a41106a2146200241b00e6a41086a2141203a2138410021484100213903400240200d450d00203c2105200e210603400240200641d0006a2d00000d0002400240200641206a2903002207200641286a29030022138450450d0042002109427f2107427f21130c010b427f2109200241b8026a427f427f2007201310e105200241b8026a41086a290300211320022903b80221070b2006200737030020062013370308200641106a2009370300200641186a20093703000b200641d8006a2106200541a87f6a22050d000b0b204321030240203d450d0002400340024020032802382206450d00200641c8006c2104200328023041206a21060340200d200628020022054d0d030240200e200541d8006c6a22052d00500d0020052903202209200541286a290300220784500d00200241e80b6a2003290310200341186a2903002003290300200341086a2903002009200710d701200520052903002209427f2009427f20022903f00b20022802e80b41014622081b22137c22072007200954220a200541086a220b2903002209427f200241e80b6a41106a29030020081b22197c200aad7c220720095420072009511b22081b201320198450220a1b370300200b2009427f200720081b200a1b3703000b200641c8006a2106200441b87f6a22040d000b0b200341e0006a2203201f460d020c000b0b41a888c6002005200d1038000b203941016a2139203c210620472105200e21040340024020060d00203821400c030b200641a87f6a2106200541d8006a2105200441d0006a2103200441d8006a2208210420032d00000d000b02402006450d00200541086a2903002109200541186a2903002107200541106a2903002113200529030021194100210403400240200820046a220341d0006a2d00000d00200341086a290300221a2009201920092013200720032903002220201a200341106a2903002223200341186a290300222210d80141ff0171410146220a1b210920202019200a1b211920222007200a1b210720232013200a1b211320032005200a1b21050b2006200441d8006a2204470d000b20050d00203821400c020b200541013a00500240203d450d002005410c6a2101200541306a2118204321040340200441e0006a2136024020042802382203450d0020042802302106200341c8006c210303400240024020012006460d00200641246a2018412010dd050d010b200441186a22082903002119200541086a220a290300210920042903102113200529030021072005290310211a200641186a200541186a220b290300370300200641106a201a370300200620094200200920197d2007201354ad7d221a200720137d2220200756201a200956201a2009511b220c1b201320198450221b1b3703082006200742002020200c1b201b1b370300200a2903002109200b29030021072005290300211320042005290310370320200441286a200737030020042013370310200820093703000b200641c8006a2106200341b87f6a22030d000b0b203621042036201f470d000b0b2049200541c8006a2900003703002046200541c0006a2900003703002041200541386a290000370300200220052900303703b00e200541286a2903002109200529032021070240024020482038460d00203821400c010b203841016a22062038490d09203841017422052006200520064b1b2240ad42307e2213422088a70d092013a722064100480d090240024020380d002006102a21370c010b2037203841306c2006102e21370b2037450d0720382148204021380b20412903002113204629030021192049290300211a20022903b00e21202037204841306c6a2206200737032020062020370300200641286a2009370300200641186a201a370300200641106a2019370300200641086a2013370300204841016a21482039203e490d000b0b0240203d450d002043203d41e0006c6a2147204841306c2136200241b00b6a41186a2138200241b00b6a41106a2139200241b00b6a41086a213c4100213b2043210103402038200141d4006a2900003703002039200141cc006a290000370300203c200141c4006a2900003703002002200129003c3703b00b024020012802382206450d002001280230220c200641c8006c6a2118200141106a211f4100210d4104211b4100210b0340200c220a41246a2104200a41c8006a210c410021032036210520372106024003402005450d01024020042006460d0020062004412010dd052108200341016a2103200541506a2105200641306a210620080d010b0b418094ebdc0321060240201f200a10d9010d00410021050240200a290310200129032085200a41186a290300200141286a29030085844200520d00200241e80b6a428094ebdc034200200a290300200a41086a290300201f290300201f41086a29030010d70120022802e80b4101460d0120022903f00b220742ff93ebdc0356200241e80b6a41106a29030022094200522009501b0d012007a721050b200521060b200220063602e80b2002418094ebdc033602ec0b200241e80b6a2006418094ebdc034b4102746a2802002105200241c80d6a41186a2204200a413c6a290000370300200241c80d6a41106a2203200a41346a290000370300200241c80d6a41086a2208200a412c6a2900003703002002200a2900243703c80d02400240200b200d460d00200b21060c010b200d41016a2206200d490d0c200d410174220a2006200a20064b1b220aad42247e2209422088a70d0c2009a722064100480d0c02400240200d0d002006102a211b0c010b201b200d41246c2006102e211b0b201b450d0a200d2106200a210d0b201b200641246c6a220620022903c80d37020020082903002109200329030021072004290300211320062005360220200641186a2013370200200641106a2007370200200641086a2009370200200b41016a210b0b200c2018470d000b024002400240200b450d0002400240200b41246c22040d00410021050c010b201b41206a2106410021050340200628020020056a2105200641246a21062004415c6a22040d000b0b02404100418094ebdc0320056b22062006418094ebdc034b1b220a200b6e2206418094ebdc032006418094ebdc03491b2208450d00201b41206a2106410021050340200b2005460d032002417f2006280200220420086a220320032004491b22043602e80b2002418094ebdc033602ec0b2006200241e80b6a2004418094ebdc034b4102746a280200360200200641246a2106200b200541016a2205470d000b0b0240200a2008200b6c6b2208450d00410021060340200b2006200b7022054d0d042002417f201b200541246c6a2205280220220441016a220320032004491b22043602e80b2002418094ebdc033602ec0b2005200241e80b6a2004418094ebdc034b4102746a280200360220200641016a22062008490d000b0b200241e80b6a41186a22052038290300370300200241e80b6a41106a22042039290300370300200241e80b6a41086a2203203c290300370300200220022903b00b3703e80b0240203b203a470d00203a41016a2206203a490d0d203a41017422082006200820064b1b2206ad422c7e2209422088a70d0d2009a722084100480d0d02400240203a0d002008102a214a0c010b204a203a412c6c2008102e214a0b204a450d0b203a213b2006213a0b204a203b412c6c6a220620022903e80b3702002003290300210920042903002107200529030021132006200b3602282006200d3602242006201b360220200641186a2013370200200641106a2007370200200641086a2009370200203b41016a213b0c030b200d450d02201b102c0c020b41d087c6002005200b1038000b41d087c6002005200b1038000b200141e0006a22012047470d000b0b02402044450d00200e102c0b0240203d450d00203d41e0006c2105204341306a210603400240200641046a280200450d002006280200102c0b200641e0006a2106200541a07f6a22050d000b0b02402045450d002042102c0b20022802d00e20022802d40e20022802d80e10da012037450d02204841306c220641306e21050240024020060d0042002126410121430c010b200541057422044100480d072004102a2243450d052005ad21260b024002402037203720066a470d00410021480c010b204841306c2104410021482043210620372105034020062005290000370000200641186a200541186a290000370000200641106a200541106a290000370000200641086a200541086a290000370000204841016a2148200641206a2106200541306a2105200441506a22040d000b0b200242003702b40e200241d0e1c1003602b00e02402048450d0020484105742105204321060340200241880b6a41186a200641186a290000370300200241880b6a41106a200641106a290000370300200241880b6a41086a200641086a290000370300200220062900003703880b200241e80b6a41186a4200370300200241e80b6a41106a4200370300200241e80b6a41086a4200370300200242003703e80b200241003602900c200242083703880c200241b00b6a200241b00e6a200241880b6a200241e80b6a10db01024020022802d00b2204450d0020022802d40b450d002004102c0b200641206a2106200541606a22050d000b0b0240203b412c6c2206450d00204a20066a2118200241880d6a41106a210e418be9c500ad4280808080800184211a204a210d03400240200d28022841246c2206450d00200d280220221b20066a21010340200241a8026a200d109604200241a8026a41086a290300210720022903a8022113200241880d6a41186a22034200370300200e4200370300200241880d6a41086a22054200370300200242003703880d200241c80d6a41086a2206201a1002220441086a290000370300200220042900003703c80d2004102c20052006290300370300200220022903c80d3703880d200641c9b5c000ad4280808080d001841002220441086a290000370300200220042900003703c80d2004102c200241880b6a41086a20062903002209370300200220022903c80d22193703880b200e2019370000200e41086a2009370000200241e80c6a41086a2005290300370300200241e80c6a41106a200e290300370300200241e80c6a41186a2003290300370300200220022903880d3703e80c20024190026a200241e80c6a4120109e0120024180026a20022903980220024190026a41106a290300427f420010e105200241f0016a20132007200229038002420020022802900222061b22094201200942015620024180026a41086a290300420020061b22094200522009501b22061b2009420020061b10e105200241e0016a20022903f0012209428094ebdc038022074200201b22083502202213420010e005200241e0016a41086a29030020022903e00122192013200920074280ec94a37c7e7c7e22092009428094ebdc038022094280ec94a37c7e7c4280cab5ee01562009a76aad7c2209201954ad7c2107200841246a211b200241b00e6a210620022802b40e210b024003402006280200220a41086a2105200a2f0106220c4105742106410021040240024003402006450d0120082005412010dd052203450d02200641606a2106200441016a2104200541206a21052003417f4a0d000b2004417f6a210c0b200b450d02200b417f6a210b200a200c4102746a41f8066a21060c010b0b200a41e8026a200441306c6a210602402008200d460d002008200d412010dd05450d002006427f2006290310221320097c221920192013542205200641186a2204290300221320077c2005ad7c221920135420192013511b22051b3703102004427f201920051b370300200241a80d6a41186a2208200d41186a290000370300200241a80d6a41106a220a200d41106a290000370300200241a80d6a41086a220b200d41086a2900003703002002200d2900003703a80d200641286a2104200641206a2103024020062802282205200641246a280200470d00200541016a22062005490d0d2005410174220c2006200c20064b1b220cad42307e2213422088a70d0d2013a722064100480d0d0240024020050d002006102a21060c010b2003280200200541306c2006102e21060b2006450d0b20032006360200200341046a200c360200200428020021050b200b2903002113200a29030021192008290300212020022903a80d21232003280200200541306c6a2206200937032020062023370300200641286a2007370300200641186a2020370300200641106a2019370300200641086a20133703002004200428020041016a3602000c010b2006427f2006290300221320097c221920192013542205200641086a2204290300221320077c2005ad7c221920135420192013511b22051b3703002004427f201920051b3703002006427f2006290310221320097c220920092013542205200641186a2204290300220920077c2005ad7c220720095420072009511b22051b3703102004427f200720051b3703000b201b2001470d000b0b200d412c6a220d2018470d000b0b20022802b80e210e20022802b40e210820022802b00e2105200241e80b6a41186a220a4200370300200241e80b6a41106a220b4200370300200241e80b6a41086a22044200370300200242003703e80b200241c80d6a41086a22064196e0c500ad4280808080f000841002220341086a290000370300200220032900003703c80d2003102c20042006290300370300200220022903c80d3703e80b200641bafdc200ad4280808080e001841002220341086a290000370300200220032900003703c80d2003102c200241a80d6a41086a20062903002209370300200220022903c80d22073703a80d200f2007370000200f41086a2009370000200241880b6a41086a2004290300370300200241880b6a41106a200b290300370300200241880b6a41186a200a290300370300200220022903e80b3703880b200241e80b6a200241880b6a412010d00120022902ec0b420020022802e80b22061b210702402006410120061b220d450d002007422088a72206450d002006410574210a4196e0c500ad4280808080f000842109200241980b6a210c200d21040340200241c80d6a41086a220620091002220341086a290000370300200220032900003703c80d2003102c200241e80c6a41086a220b2006290300370300200220022903c80d3703e80c200641dff8c200ad4280808080f000841002220341086a290000370300200220032900003703c80d2003102c200241a80d6a41086a22032006290300370300200220022903c80d3703a80d200241880b6a2004109f0141c000102a2206450d06200441206a2104200620022903e80c370000200641086a200b290300370000200620022903a80d370010200641186a2003290300370000200620022903880b370020200641286a200241880b6a41086a290300370000200641306a200c290300370000200641386a200241880b6a41186a2903003700002006ad428080808080088410052006102c200a41606a220a0d000b0b02402007a7450d00200d102c0b0240024020080d00200521060c010b2008210420052106034020062802f80621062004417f6a22040d000b0340200520052f01064102746a41f8066a28020021052008417f6a22080d000b0b200241cc0b6a20052f0106360200200241b00b6a41186a4100360200200241c40b6a20053602002002200e3602d00b200241003602c00b200242003703b80b200220063602b40b200241003602b00b200241e80b6a200241b00b6a10fb030240200241e80b6a41c0006a28020022380d00427f2125427f21220c020b200241880d6a41106a2103200241e80b6a41106a211f200241e80b6a41386a2146200241e80b6a41286a2142427f2125427f21220340200241900e6a41086a200241e80b6a41086a22062903002209370300200241900e6a41106a201f2903002207370300200241900e6a41186a200241e80b6a41186a22362903002213370300200220022903e80b22193703900e204629030021232042290300212420022802ac0c214920022802b00c210a20022903980c212b20022903880c212f200241b00e6a41186a2013370300200241b00e6a41106a2007370300200241b00e6a41086a2009370300200220193703b00e20364200370300201f420037030020064200370300200242003703e80b200241c80d6a41086a2204418be9c500ad4280808080800184221a1002220541086a290000370300200220052900003703c80d2005102c20062004290300370300200220022903c80d3703e80b200441c9b5c000ad4280808080d0018422201002220541086a290000370300200220052900003703c80d2005102c200241a80d6a41086a220c20042903002209370300200220022903c80d22073703a80d200f2007370000200f41086a220b2009370000200241880b6a41086a22182006290300370300200241880b6a41106a223c201f290300370300200241880b6a41186a223d2036290300370300200220022903e80b3703880b200241c8016a200241880b6a4120109e01200241a0016a20022903d001200241c8016a41106a290300427f420010e10520022802c801210520364200370300201f420037030020064200370300200242003703e80b2004201a1002220841086a290000370300200220082900003703c80d2008102c20062004290300370300200220022903c80d3703e80b200420201002220841086a290000370300200220082900003703c80d2008102c200c20042903002209370300200220022903c80d22073703a80d200f2007370000200b200937000020182006290300370300203c201f290300370300203d2036290300370300200220022903e80b3703880b200241b0016a200241880b6a4120109e0120024190016a20022903b801200241b0016a41106a290300427f420010e105200241f0006a20022903a001420020051b220942012009420156200241a0016a41086a290300420020051b22094200522009501b22061b2009420020061b202f202410e00520024180016a200229039001420020022802b00122061b22094201200942015620024190016a41086a290300420020061b22094200522009501b22061b2009420020061b202b202310e005200a41306c220d41306d2106200241f0006a41086a290300212b20024180016a41086a29030021234100210b2002290370212f200229038001212441082139410021470240200d450d002006ad42307e2209422088a70d082009a722054100480d082005102a2239450d06200621470b02402038200d6a2038460d004100210b20392106203821050340200541286a2903002107200541206a2903002113200241a80d6a41186a220e200541186a290300370300200241a80d6a41106a221b200541106a290300370300200c200541086a290300370300200220052903003703a80d200241880d6a41186a2201420037030020034200370300200241880d6a41086a22084200370300200242003703880d2004201a1002220a41086a2900003703002002200a2900003703c80d200a102c20082004290300370300200220022903c80d3703880d200420201002220a41086a2900003703002002200a2900003703c80d200a102c201820042903002209370300200220022903c80d22193703880b20032019370000200341086a2009370000200241e80c6a41086a2008290300370300200241e80c6a41106a2003290300370300200241e80c6a41186a2001290300370300200220022903880d3703e80c200241d8006a200241e80c6a4120109e01200241c8006a2002290360200241d8006a41106a290300427f420010e105200241386a20022903484200200228025822081b220942012009420156200241c8006a41086a290300420020081b22094200522009501b22081b2009420020081b2013200710e0052006200241386a41086a29030037030820062002290338370300200641106a20022903a80d370300200641186a200c290300370300200641206a201b290300370300200641286a200e290300370300200641306a2106200b41016a210b200541306a2105200d41506a220d0d000b0b02402049450d002038102c0b200bad42307e2209422088a70d012009a72206417f4c0d010240024020060d004108210d0c010b2006102a220d450d060b02400240200b0d00410021080c010b2039200b41306c6a210a41002108200d2106203921050340200620052903003703002006200541086a290300370308200641106a200541106a290300370300200641186a200541186a290300370300200641206a200541206a290300370300200641286a200541286a290300370300200641306a2106200841016a2108200541306a2205200a470d000b0b2036202b3703002002202f3703f80b200220243703e80b200220083602900c2002200b36028c0c2002200d3602880c200220233703f00b20044196e0c500ad4280808080f000841002220641086a290000370300200220062900003703c80d2006102c200241e80c6a41086a22052004290300370300200220022903c80d3703e80c200441dff8c200ad4280808080f000841002220641086a290000370300200220062900003703c80d2006102c200c2004290300370300200220022903c80d3703a80d200241880b6a200241b00e6a109f0141c000102a2204450d05200420022903e80c370000200441086a2005290300370000200420022903a80d370010200441186a200c290300370000200420022903880b370020200441286a2018290300370000200441306a203c290300370000200441386a203d290300370000200241003602900b200242013703880b2002200241e80b6a3602c80d200241c80d6a200241880b6a108a012002201f3602c80d200241c80d6a200241880b6a108a0120022802880c210620022802900c2205200241880b6a106702402005450d00200541306c21050340200641106a200241880b6a109101200220063602c80d200641306a2106200241c80d6a200241880b6a108a01200541506a22050d000b0b200228028c0b21062004ad428080808080088420023502900b42208620022802880b2205ad84100102402006450d002005102c0b2024202554210620232022512105202320225421082004102c0240200228028c0c450d0020022802880c102c0b2006200820051b210602402047450d002039102c0b2023202220061b21222024202520061b2125200241e80b6a200241b00b6a10fb0320022802a80c2238450d020c000b0b103a000b200241b00b6a10de01200241880b6a41186a22044200370300200241880b6a41106a22034200370300200241880b6a41086a22054200370300200242003703880b200241c80d6a41086a22064196e0c500ad4280808080f0008422091002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22073703e80c200220073703880b200641c8fdc200ad42808080809001841002220841086a290000370300200220082900003703c80d2008102c200241a80d6a41086a220a20062903002207370300200220022903c80d22133703a80d20142013370000201441086a220b2007370000200241e80b6a41086a220c2005290300370300200241e80b6a41106a220d2003290300370300200241e80b6a41186a220e2004290300370300200220022903880b3703e80b200220223703b80b200220253703b00b201d201e42808080808002841001200442003703002003420037030020054200370300200242003703880b200620091002220841086a290000370300200220082900003703c80d2008102c20052006290300370300200220022903c80d22093703e80c200220093703880b200641bafdc200ad4280808080e001841002220841086a290000370300200220082900003703c80d2008102c200a20062903002209370300200220022903c80d22073703a80d20142007370000200b2009370000200c2005290300370300200d2003290300370300200e2004290300370300200220022903880b3703e80b200241003602b80b200242013703b00b2048200241b00b6a106702402048450d00204841057421052043210603402006200241b00b6a109101200641206a2106200541606a22050d000b0b20022802b40b2106201d20023502b80b42208620022802b00b2205ad84100102402006450d002005102c0b2048ad21090240203b450d00203b412c6c2105204a41206a210603400240200641046a280200450d002006280200102c0b2006412c6a2106200541546a22050d000b0b200942208621090240203a450d00204a102c0b202620098421342040450d012037102c0c010b200241880b6a41186a22034200370300200241880b6a41106a22084200370300200241880b6a41086a22054200370300200242003703880b200241c80d6a41086a22064196e0c500ad4280808080f000841002220441086a290000370300200220042900003703c80d2004102c20052006290300370300200220022903c80d22093703e80c200220093703880b200641c8fdc200ad42808080809001841002220441086a290000370300200220042900003703c80d2004102c200241a80d6a41086a20062903002209370300200220022903c80d22073703a80d20142007370000201441086a2009370000200241e80b6a41086a2005290300370300200241e80b6a41106a2008290300370300200241e80b6a41186a2003290300370300200220022903880b3703e80b200241206a200241e80b6a4120109e01410021430b200241880b6a41186a224a4200370300200241880b6a41106a22464200370300200241880b6a41086a22494200370300200242003703880b200241c80d6a41086a22484196e0c500ad4280808080f0008422331002220641086a290000370300200220062900003703c80d2006102c20492048290300370300200220022903c80d22093703e80c200220093703880b204841fde0c500ad4280808080e0028422311002220641086a290000370300200220062900003703c80d2006102c200241a80d6a41086a224020482903002209370300200220022903c80d22073703a80d20142007370000201441086a22442009370000200241e80b6a41086a22412049290300370300200241e80b6a41106a223e2046290300370300200241e80b6a41186a223f204a290300370300200220022903880b3703e80b200241186a200241e80b6a4120109401200228021c21420240200228021822454101470d00024020424100203541d87e6a2206200620354b1b22474f0d00201c4280808080c00084212f200241e80b6a41386a210f200241e80b6a41246a21084196e0c500ad4280808080f0008421262042213c0340200241c80d6a41086a220620261002220541086a290000370300200220052900003703c80d2005102c200241e80c6a41086a22042006290300370300200220022903c80d3703e80c200641d1fdc200ad42808080808002841002220541086a290000370300200220052900003703c80d2005102c200241a80d6a41086a22052006290300370300200220022903c80d3703a80d2002203c3602e80b200241880d6a41186a2203202f1006220641186a290000370300200241880d6a41106a220a200641106a290000370300200241880d6a41086a220b200641086a290000370300200220062900003703880d2006102c200241880b6a41186a220c2003290300370300200241880b6a41106a220d200a290300370300200241880b6a41086a220a200b290300370300200220022903880d3703880b41c000102a2206450d03200620022903e80c370000200641086a2004290300370000200620022903a80d370010200641186a2005290300370000200620022903880b370020200641286a200a290300370000200641306a200d290300370000200641386a200c290300370000200241e80b6a200641c00010e9030240024020022802e80b223d450d002006ad4280808080800884100520022902ec0b212b0c010b4200212b4108213d0b2006102c203d202b422088a7220641d8006c6a210e203d210302402006450d000340200c200341186a290300370300200d200341106a290300370300200a200341086a2903003703002003280220210b20032903002109200241e80b6a41206a221b200341c4006a290200370300200241e80b6a41286a2201200341cc006a290200370300200241e80b6a41306a2218200341d4006a280200360200200241e80b6a41086a22062003412c6a290200370300200241e80b6a41106a2205200341346a290200370300200241e80b6a41186a22042003413c6a290200370300200220093703880b2002200341246a2902003703e80b200341d8006a2103200b450d01200241e80d6a41186a221f200c290300370300200241e80d6a41106a2237200d290300370300200241e80d6a41086a2236200a290300370300200241b00b6a41086a22382006290300370300200241b00b6a41106a22392005290300370300200241b00b6a41186a223a2004290300370300200241b00b6a41206a223b201b290300370300200241b00b6a41286a221b2001290300370300200241b00b6a41306a22012018280200360200200220022903880b3703e80d200220022903e80b3703b00b2004201f2903003703002005203729030037030020062036290300370300200820022903b00b370200200841086a2038290300370200200841106a2039290300370200200841186a203a290300370200200841206a203b290300370200200841286a201b290300370200200841306a2001280200360200200220022903e80d3703e80b2002200b3602880c200242003703e80a200242003703e00a200220042903003703900b200220052903003703880b200f20022903e80b2006290300200241880b6a200241e00a6a109704024020022802900c2205450d0020022802880c2106200541306c210503402006200641206a290300200641286a290300200241880b6a200241e00a6a109704200641306a2106200541506a22050d000b0b200241e00a6a41086a290300212320022903e00a2122024020022903880b2207200a290300220984500d00200228029c0c2205450d0020022802940c2106200241086a202220072022200754202320095420232009511b22041b22242023200920041b22252005ad420010e10520054105742105200241086a41086a29030021132002290308211a202421092025210703402006201a20092009201a56200720135620072013511b22041b22192013200720041b2220109c01200720207d2009201954ad7d2107200920197d2109200641206a2106200541606a22050d000b427f202320257d2022202454ad7d221320077c202220247d220720097c22192007542206ad7c22092006200920135420092013511b22061b2123427f201920061b21220b2022202310b1020240200228028c0c450d0020022802880c102c0b024020022802980c450d0020022802940c102c0b2003200e470d000b200e21030b202ba7210a02402003200e460d000340200341206a2802002205450d01200341306a28020021062003412c6a28020021040240200341246a280200450d002005102c0b200341d8006a210302402006450d002004102c0b200e2003470d000b0b203c41016a213c0240200a450d00203d102c0b203c2047470d000b0b20422047204220474b1b21420b204a42003703002046420037030020494200370300200242003703880b204820331002220641086a290000370300200220062900003703c80d2006102c20492048290300370300200220022903c80d22093703e80c200220093703880b204820311002220641086a290000370300200220062900003703c80d2006102c204020482903002209370300200220022903c80d22073703a80d201420073700002044200937000020412049290300370300203e2046290300370300203f204a290300370300200220022903880b3703e80b0240024020450d00201d10050c010b200220423602b00b201d201e4280808080c0008410010b024020152017a745720d002016102c0b024020430d002000410036020002402011450d00201141d0006c2105201041c0006a210603400240200641046a280200450d002006280200102c0b200641d0006a2106200541b07f6a22050d000b0b2012450d042010102c0c040b2000203437020420002043360200200041146a2011360200200041106a20123602002000410c6a20103602000c030b1033000b41a8b4c000200520031038000b1035000b200241e00e6a24000bbc0201047f230041d0006b220224002002412036020420022001360200200241086a2001ad42808080808004841003108d0102400240200228020822010d00200041003602000c010b200241106a2802002103200228020c2104200241003602380240024020034104490d0020012800002105200241003602382003417c714104460d00200041086a200128000436020020002005360204410121030c010b20024100360220200242013703182002410b36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241d0b0c2003602382002200241286a360248200241346a41c49ac500200241386a10391a200235022042208620023502188410040240200228021c450d002002280218102c0b410021030b200020033602002004450d002001102c0b200241d0006a24000bd5340b067f017e017f027e027f017e037f017e217f027e207f230041e0016b22022400200241186a200041e8bac000108401200241286a200141f4bcc00010840120022802202103200228021c210420022802182105200241386a41086a200241286a41086a28020036020020022002290328370338200241c8006a41186a22064200370300200241c8006a41106a22074200370300200241c8006a41086a2200420037030020024200370348200241d0016a41086a220141bac6c500ad4280808080c0008422081002220941086a290000370300200220092900003703d0012009102c20002001290300370300200220022903d001220a3703c0012002200a370348200141bec6c500ad4280808080a00184220b1002220941086a290000370300200220092900003703d0012009102c200720022903d001220a370300200241f8006a41086a22092000290300370300200241f8006a41106a220c200a370300200241f8006a41186a220d20012903003703002002200a3703c00120022002290348370378200241086a200241f8006a109801024002400240024002402002290310420020022802081b220e42017c220a200e540d0020064200370300200742003703002000420037030020024200370348200120081002220f41086a2900003703002002200f2900003703d001200f102c20002001290300370300200220022903d001220e3703c0012002200e3703482001200b1002220f41086a2900003703002002200f2900003703d001200f102c200241c0016a41086a22102001290300220b370300200220022903d001220e3703c0012007200e370000200741086a2211200b37000020092000290300370300200c2007290300370300200d2006290300370300200220022903483703782002200a370348200241f8006aad42808080808004842212200241c8006aad220b4280808080800184100120064200370300200742003703002000420037030020024200370348200120081002220f41086a2900003703002002200f2900003703d001200f102c20002001290300370300200220022903d00122083703c00120022008370348200141c8c6c500ad4280808080b001841002220f41086a2900003703002002200f2900003703d001200f102c201020012903002208370300200220022903d001220e3703c0012007200e3700002011200837000020092000290300370300200c2007290300370300200d20062903003703002002200229034837037820024100360250200242013703482003200241c8006a106702402003450d002005200341286c6a21092005210003402000200241c8006a109101200041206a290300210802400240200228024c2206200228025022016b4108490d00200228024821060c010b200141086a22032001490d07200641017422012003200120034b1b22014100480d070240024020060d002001102a21060c010b200228024820062001102e21060b2006450d042002200136024c20022006360248200228025021010b2002200141086a360250200620016a20083700002009200041286a2200470d000b0b200228024c21012012200235025042208620022802482200ad84100102402001450d002000102c0b02402004450d002005102c0b200a42017c220e200a540d02200241f8006a41186a22064200370300200241f8006a41106a22134200370300200241f8006a41086a2200420037030020024200370378200241d0016a41086a220141bac6c500ad4280808080c0008422081002220341086a290000370300200220032900003703d0012003102c20002001290300370300200220022903d001220a3703c0012002200a370378200141f3c6c500ad4280808080e001841002220341086a290000370300200220032900003703d0012003102c201320022903d001220a37030020024198016a41086a2203200029030037030020024198016a41106a2209200a37030020024198016a41186a220c20012903003703002002200a3703c0012002200229037837039801200241c8006a20024198016a1080034100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128410021294100212a4100212b4100212c4100212d4100212e4100212f41002130410021314100213241002133024020022d00484101470d00200241c8006a41086a2d0000211b200241d1006a2d0000211c200241d2006a2d0000211d200241d3006a2d0000211e200241d4006a2d0000211f200241d5006a2d00002120200241d6006a2d00002121200241d7006a2d00002122200241c8006a41106a2d00002123200241d9006a2d00002124200241da006a2d00002125200241db006a2d00002126200241dc006a2d00002127200241dd006a2d00002128200241de006a2d00002129200241df006a2d0000212a200241c8006a41186a2d0000212b200241e1006a2d0000212c200241e2006a2d0000212d200241e3006a2d0000212e200241e4006a2d0000212f200241e5006a2d00002130200241e6006a2d00002131200241e7006a2d00002132200241e8006a2d0000213320022d0049211420022d004a211520022d004b211620022d004c211720022d004d211820022d004e211920022d004f211a0b20064200370300201342003703002000420037030020024200370378200120081002220d41086a2900003703002002200d2900003703d001200d102c20002001290300370300200220022903d001220a3703c0012002200a37037820014181c7c500ad4280808080c00184220a1002220d41086a2900003703002002200d2900003703d001200d102c200241c0016a41086a220f20012903002234370300200220022903d00122353703c00120132035370000201341086a220520343700002003200029030037030020092013290300370300200c20062903003703002002200229037837039801200220024198016a4120109401200228020421042002280200211020064200370300201342003703002000420037030020024200370378200120081002220d41086a2900003703002002200d2900003703d001200d102c20002001290300370300200220022903d00122083703c001200220083703782001200a1002220d41086a2900003703002002200d2900003703d001200d102c200f20012903002208370300200220022903d001220a3703c0012013200a370000200520083700002003200029030037030020092013290300370300200c200629030037030020022002290378370398012002410036024820024198016aad42808080808004842234200b4280808080c000841001417f2004410020101b223641016a220120012036491b410d744128722237417f4c0d032037102a2203450d012003200e370020200320333a001f200320323a001e200320313a001d200320303a001c2003202f3a001b2003202e3a001a2003202d3a00192003202c3a00182003202b3a00172003202a3a0016200320293a0015200320283a0014200320273a0013200320263a0012200320253a0011200320243a0010200320233a000f200320223a000e200320213a000d200320203a000c2003201f3a000b2003201e3a000a2003201d3a00092003201c3a00082003201b3a00072003201a3a0006200320193a0005200320183a0004200320173a0003200320163a0002200320153a0001200320143a0000200241d0016aad4280808080c00084210a4128213841002100410021394100213a410021010340024002400240024002402001450d0020042006470d010b034020012109200020364f0d02200241d0016a41086a220141bac6c500ad4280808080c000841002220641086a290000370300200220062900003703d0012006102c200241c0016a41086a220c2001290300370300200220022903d0013703c0012001418dc7c500ad42808080809002841002220641086a290000370300200220062900003703d0012006102c200241f8006a41086a22062001290300370300200220022903d001370378200220003602d001200a100622012d001f210d20012d001e210f20012d001d210520012d001c210420012d001b211020012d001a211120012d0019213b20012d0018213c20012d0017213d20012d0016213e20012d0015213f20012d0014214020012d0013214120012d0012214220012d0011214320012d0010214420012d000f214520012d000e214620012d000d214720012d000c214820012d000b214920012d000a214a20012d0009214b20012d0008214c20012d0007214d20012d0006214e20012d0005214f20012d0004215020012d0003215120012d0002215220012d0001215320012d000021542001102c41c000102a2201450d07200120022903c001370000200120022903783700102001200d3a003f2001200f3a003e200120053a003d200120043a003c200120103a003b200120113a003a2001203b3a00392001203c3a00382001203d3a00372001203e3a00362001203f3a0035200120403a0034200120413a0033200120423a0032200120433a0031200120443a0030200120453a002f200120463a002e200120473a002d200120483a002c200120493a002b2001204a3a002a2001204b3a00292001204c3a00282001204d3a00272001204e3a00262001204f3a0025200120503a0024200120513a0023200120523a0022200120533a0021200120543a0020200141086a200c290300370000200141186a2006290300370000200241f8006a200141c000109a01024020022802782206450d002001ad428080808080088410050b200229027c21082001102c2006410120061b2201450d022008420020061b2208422088a7210602402009450d002055450d00203a102c0b200041016a21002008a721552001213a200121392006450d000b200120064105746a2104200121392001213a200121060b20024198016a41186a200641186a220929000037030020024198016a41106a200641106a220c29000037030020024198016a41086a200641086a220d2900003703002002200629000037039801200d2900002108200c290000210b2006290000210e200241c8006a41186a220c2009290000370300200241c8006a41106a2209200b370300200241c8006a41086a220d20083703002002200e370348200241f8006a41186a220f200c290300370300200241f8006a41106a220c2009290300370300200241f8006a41086a2205200d29030037030020022002290348370378203720386b411f4b0d02203841206a22092038490d082037410174220d2009200d20094b1b220941004e0d010c080b02402009450d002055450d002039102c0b2038ad4220862003ad84100622012d001f210920012d001e210c20012d001d210d20012d001c210f20012d001b210520012d001a210420012d0019211020012d0018211120012d0017213b20012d0016213c20012d0015213d20012d0014213e20012d0013213f20012d0012214020012d0011214120012d0010214220012d000f214320012d000e214420012d000d214520012d000c214620012d000b214720012d000a214820012d0009214920012d0008214a20012d0007214b20012d0006214c20012d0005214d20012d0004214e20012d0003214f20012d0002215020012d0001215120012d000021522001102c02402037450d002003102c0b200241f8006a41186a22034200370300200241f8006a41106a22534200370300200241f8006a41086a2200420037030020024200370378200241d0016a41086a220141bac6c500ad4280808080c000841002220641086a290000370300200220062900003703d0012006102c20002001290300370300200220022903d00122083703c00120022008370378200141f3c6c500ad4280808080e001841002220641086a290000370300200220062900003703d0012006102c200241c0016a41086a20012903002208370300200220022903d001220a3703c0012013200a370000201341086a200837000020024198016a41086a200029030037030020024198016a41106a205329030037030020024198016a41186a200329030037030020022002290378370398014101102a2201450d04200120523a0000200141014102102e2201450d04200120513a0001200141024104102e2201450d042001204f3a0003200120503a0002200141044108102e2201450d042001204b3a00072001204c3a00062001204d3a00052001204e3a0004200141084110102e2201450d04200120433a000f200120443a000e200120453a000d200120463a000c200120473a000b200120483a000a200120493a00092001204a3a0008200141104120102e2201450d04200120093a001f2001200c3a001e2001200d3a001d2001200f3a001c200120053a001b200120043a001a200120103a0019200120113a00182001203b3a00172001203c3a00162001203d3a00152001203e3a00142001203f3a0013200120403a0012200120413a0011200120423a001020342001ad428080808080048410012001102c200241c8006a41186a22034200370300200241c8006a41106a22094200370300200241c8006a41086a2200420037030020024200370348200241d0016a41086a220141bac6c500ad4280808080c000841002220641086a290000370300200220062900003703d0012006102c20002001290300370300200220022903d00122083703c00120022008370348200141e9c6c500ad4280808080a001841002220641086a290000370300200220062900003703d0012006102c200241c0016a41086a20012903002208370300200220022903d001220a3703c0012007200a370000200741086a2008370000200241f8006a41086a2000290300370300200241f8006a41106a2009290300370300200241f8006a41186a2003290300370300200220022903483703784101102a2201450d04200120143a0000200141014102102e2201450d04200120153a0001200141024104102e2201450d04200120173a0003200120163a0002200141044108102e2201450d042001201b3a00072001201a3a0006200120193a0005200120183a0004200141084110102e2201450d04200120233a000f200120223a000e200120213a000d200120203a000c2001201f3a000b2001201e3a000a2001201d3a00092001201c3a0008200141104120102e2201450d04200120333a001f200120323a001e200120313a001d200120303a001c2001202f3a001b2001202e3a001a2001202d3a00192001202c3a00182001202b3a00172001202a3a0016200120293a0015200120283a0014200120273a0013200120263a0012200120253a0011200120243a001020122001ad428080808080048410012001102c200241c8006a41186a22004200370300200241c8006a41106a22064200370300200241c8006a41086a2203420037030020024200370348200241d0016a41086a220141bac6c500ad4280808080c000841002220941086a290000370300200220092900003703d0012009102c20032001290300370300200220022903d00122083703c00120022008370348200141f3c6c500ad4280808080e001841002220941086a290000370300200220092900003703d0012009102c200241c0016a41086a20012903002208370300200220022903d001220a3703c0012007200a370000200741086a2008370000200241f8006a41086a2003290300370300200241f8006a41106a2006290300370300200241f8006a41186a200029030037030020022002290348370378200241c8006a200241f8006a10800341002101410021094100210c4100210d4100210f410021054100210441002110410021114100213b4100213c4100213d4100213e4100213f410021404100214141002142410021434100214441002145410021464100214741002148410021494100214a4100214b4100214c4100214d4100214e4100214f4100215041002151024020022d00484101470d0020032d0000214a200241d1006a2d00002149200241d2006a2d00002148200241d3006a2d00002147200241d4006a2d00002146200241d5006a2d00002145200241d6006a2d00002144200241d7006a2d0000214320062d00002142200241d9006a2d00002141200241da006a2d00002140200241db006a2d0000213f200241dc006a2d0000213e200241dd006a2d0000213d200241de006a2d0000213c200241df006a2d0000213b20002d00002111200241e1006a2d00002110200241e2006a2d00002104200241e3006a2d00002105200241e4006a2d0000210f200241e5006a2d0000210d200241e6006a2d0000210c200241e7006a2d00002109200241e8006a2d0000210120022d0049215120022d004a215020022d004b214f20022d004c214e20022d004d214d20022d004e214c20022d004f214b0b200241f4006a200d3a0000200241f0006a20103a0000200241ec006a203d3a0000200241e8006a20413a0000200241e4006a20453a0000200020493a0000200241dc006a204d3a0000200620513a0000200241c8006a410c6a200241386a41086a2802003602002002200229033837024c200220013a0077200220093a00762002200c3a00752002200f3a0073200220053a0072200220043a0071200220113a006f2002203b3a006e2002203c3a006d2002203e3a006b2002203f3a006a200220403a0069200220423a0067200220433a0066200220443a0065200220463a0063200220473a0062200220483a00612002204a3a005f2002204b3a005e2002204c3a005d2002204e3a005b2002204f3a005a200220503a00592002410036024820024198016a200241c8006a108b0220024183016a20024198016a41086a280200360000200220022903980137007b20024198016a410c6a200241ff006a290000370000200241c28289aa0436009901200241023a0098012002200229007837009d0120024198016a109001024020022802480d00200241d0006a280200450d00200228024c102c0b200241e0016a24000f0b0240024020370d002009102a21030c010b200320372009102e21030b2003450d03200921370b200641206a2106200320386a22092002290378370000200941186a200f290300370000200941106a200c290300370000200941086a2005290300370000203841206a21380c000b0b41e2a8c20041c9001054000b1033000b41e2a8c20041c9001054000b103a000b1035000bd71302157f037e230041f0026b220224002002412036021420022001360210200241186a2001ad42808080808004841003108d0102400240200228021822030d00200041003602000c010b200228021c21042002200241206a28020036023c20022003360238200241086a200241386a107502400240024002400240024020022802080d00200228023c220541c4006e220641c4006c2201417f4c0d01200228020c210702400240024020010d00410421080c010b2001102a2208450d010b2007450d03200241c8026a41077221094100210a03400240024002400240024002402005450d0020022005417f6a220b36023c20022002280238220c41016a360238200c2d0000220141014b0d000240024020010e020001000b200b41034d0d0120024184026a41026a20024188026a41026a2d00003a0000200241e8016a41086a200241a8026a41086a290200370300200241e8016a41106a200241a8026a41106a290200370300200241e8016a41186a200241a8026a41186a2d00003a0000200241c8016a41086a200241c8026a41086a290100370300200241c8016a41106a200241c8026a41106a290100370300200241c8016a41186a200241c8026a41186a290100370300200220022f0088023b018402200220022902a8023703e801200220022901c8023703c80120022005417b6a220d36023c2002200c41056a360238200c280001210e200220022f01a4023b01c6014100210f0c030b4100210f200241003a00e8022005417e6a211003400240200b200f2201470d000240200141ff0171450d00200241003a00e8020b4100210d4102210f0c040b200241c8026a20016a200c20016a220f41016a2d00003a00002002200f41026a3602382002200141016a220f3a00e8022002201036023c2010417f6a2110200f4120470d000b200241a4026a41026a221120022d00ca023a000020024188026a41086a2212200941086a29000037030020024188026a41106a2213200941106a29000037030020024188026a41186a2214200941186a2d00003a0000200220022f01c8023b01a40220022009290000370388024100210d200b200f460d0120022800cb0221152002201036023c2002200c200f6a220b41026a3602380240200b41016a2d0000220f41014d0d002010210d4102210f0c030b024002400240200f0e020100010b4100210f200241003a00e802200520016b417c6a2101034002402010200f470d000240200f41ff0171450d00200241003a00e8020b4100210d0c050b200241c8026a200f6a200b200f6a220c41026a2d00003a00002002200c41036a3602382002200f41016a220c3a00e8022002200136023c2001417f6a2101200c210f200c4120470d000b200241a8026a41186a200241c8026a41186a290300370300200241a8026a41106a200241c8026a41106a290300370300200241a8026a41086a200241c8026a41086a290300370300200220022903c8023703a8022010200c6b210d410121160c010b410021162010210d0b200241c8016a41186a200241a8026a41186a290300370300200241c8016a41106a200241a8026a41106a290300370300200241c8016a41086a200241a8026a41086a29030037030020024184026a41026a20112d00003a0000200241e8016a41086a2012290300370300200241e8016a41106a2013290300370300200241e8016a41186a20142d00003a0000200220022903a8023703c801200220022f01a4023b01840220022002290388023703e8014101210f2015210e0c020b200241c2016a41026a20024184026a41026a2d00003a0000200241a8016a41086a200241e8016a41086a290300370300200241a8016a41106a200241e8016a41106a290300370300200241a8016a41186a200241e8016a41186a2d00003a000020024188016a41086a200241c8016a41086a29030037030020024188016a41106a200241c8016a41106a29030037030020024188016a41186a200241c8016a41186a290300370300200220022f0184023b01c201200220022903e8013703a801200220022903c80137038801200220022f01c6013b0186010c020b4102210f0b200241c2016a41026a220120024184026a41026a2d00003a0000200241a8016a41086a220c200241e8016a41086a290300370300200241a8016a41106a220b200241e8016a41106a290300370300200241a8016a41186a2205200241e8016a41186a2d00003a000020024188016a41086a2211200241c8016a41086a29030037030020024188016a41106a2212200241c8016a41106a29030037030020024188016a41186a2213200241c8016a41186a290300370300200220022f0184023b01c201200220022903e8013703a801200220022903c80137038801200220022f01c6013b018601200f4102460d00200a41016a211020024182016a41026a221420012d00003a0000200241e8006a41086a2215200c290300370300200241e8006a41106a220c200b290300370300200241e8006a41186a220b20052d00003a0000200241c8006a41086a22052011290300370300200241c8006a41106a22112012290300370300200241c8006a41186a22122013290300370300200220022f01c2013b018201200220022903a8013703682002200229038801370348200220022f0186013b01462006200a470d020240200a41017422012010200120104b1b2206ad42c4007e2217422088a70d002017a7220141004e0d020b1035000b200241003602282006450d072008102c0c070b02400240200a0d002001102a21080c010b2008200a41c4006c2001102e21080b2008450d020b2008200a41c4006c6a2201200f3a00002001200e360004200141036a20142d00003a0000200120022f0182013b0001200b2d0000210f200c29030021172015290300211820022903682119200120163a002120012019370008200141106a2018370000200141186a2017370000200141206a200f3a00002001413a6a2012290300370000200141326a20112903003700002001412a6a200529030037000020012002290348370022200120022f01463b0042200d21052010210a20102007470d000b200241306a20073602002002200636022c200220083602280c050b1033000b200241003602280c020b103a000b200241306a20073602002002200636022c2002200836022820080d010b200241003602b002200242013703a8022002410b3602cc012002200241106a3602c8012002200241a8026a36028801200241dc026a4101360200200242013702cc02200241d0b0c2003602c8022002200241c8016a3602d80220024188016a41c49ac500200241c8026a10391a20023502b00242208620023502a8028410042000410036020020022802ac02450d0120022802a802102c0c010b20002002290328370200200041086a200241286a41086a2802003602000b2004450d002003102c0b200241f0026a24000b860701057f230041106b2203240020034100360208200342013703002002200310670240024002402002450d00200241c4006c210403400240024020012d00004101460d0002400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d06200241017422062005200620054b1b22064100480d060240024020020d002006102a21050c010b200328020020022006102e21050b2005450d052003200636020420032005360200200328020821020b2003200241016a360208200520026a41003a0000200141046a28020021060240024020032802042205200328020822026b4104490d00200328020021050c010b200241046a22072002490d06200541017422022007200220074b1b22024100480d060240024020050d002002102a21050c010b200328020020052002102e21050b2005450d052003200236020420032005360200200328020821020b2003200241046a360208200520026a20063600000c010b02400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d05200241017422062005200620054b1b22064100480d050240024020020d002006102a21050c010b200328020020022006102e21050b2005450d042003200636020420032005360200200328020821020b2003200241016a360208200520026a41013a00002003200336020c200141016a2003410c6a1094020240200141216a2d00004101460d0002400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d06200241017422062005200620054b1b22064100480d060240024020020d002006102a21050c010b200328020020022006102e21050b2005450d052003200636020420032005360200200328020821020b2003200241016a360208200520026a41003a00000c010b02400240200328020420032802082202460d00200328020021050c010b200241016a22052002490d05200241017422062005200620054b1b22064100480d050240024020020d002006102a21050c010b200328020020022006102e21050b2005450d042003200636020420032005360200200328020821020b2003200241016a360208200520026a41013a0000200141226a20031091010b200141c4006a2101200441bc7f6a22040d000b0b20002003290300370200200041086a200341086a280200360200200341106a24000f0b1033000b1035000ba20f06017f017e057f017e057f017e230041f0016b2201240042002102200141e0006a41186a22034200370300200141e0006a41106a22044200370300200141e0006a41086a2205420037030020014200370360200141d0006a41086a220641a4c6c500ad4280808080a001841002220741086a290000370300200120072900003703502007102c2005200629030037030020012001290350220837034020012008370360200641baecc100ad4280808080e000841002220741086a290000370300200120072900003703502007102c200420012903502208370300200141206a41086a2005290300370300200141206a41106a2008370300200141206a41186a2006290300370300200120083703402001200129036037032020014180016a200141206a412010d30120012d0080012107200320014199016a290000370300200420014191016a290000370300200520014189016a29000037030020012001290081013703600240024020074101470d0020002001290360370000200041186a2003290300370000200041106a2004290300370000200041086a20052903003700000c010b20014180016a41186a420037030020014180016a41106a2209420037030020014180016a41086a22074200370300200142003703800120064191b0c200ad4280808080e000841002220a41086a2900003703002001200a290000370350200a102c200720062903003703002001200129035037038001200641cab0c200ad4280808080e000841002220a41086a2900003703002001200a290000370350200a102c20092001290350220837030020052007290300370300200420083703002003200629030037030020012008370320200120012903800137036020014180016a200141e0006a10e40202400240200128028001220a0d004104210a410021060c010b2001290284012202422088a721060b02400240200641246c2206450d002006415c6a2105200a210603400240024020062d00004101460d002005450d030c010b200641016a2800002103200641086a28020021072001200641106a280200360264200120073602600240200341c28289aa04460d0020050d010c030b20014180016a200141e0006a10e50220012d00800122054102460d02200141e4016a2802002109200128028401210b20014180016a41186a420037030020014180016a41106a220c420037030020014180016a41086a220342003703002001420037038001200141d0006a41086a220641ecddc500ad4280808080f000841002220741086a290000370300200120072900003703502007102c200320062903003703002001200129035037038001200641c9f8c200ad4280808080a001841002220741086a290000370300200120072900003703502007102c200c20012903502208370300200141e0006a41086a2003290300370300200141e0006a41106a2008370300200141e0006a41186a200629030037030020012008370320200120012903800137036020014180016a200141e0006a412010d0012001280280012206410120061b2107410021030240200b200920054101711b2205200129028401420020061b2208422088a74f0d00200720054105746a2206450d00200141186a200641186a290000370300200141106a200641106a290000370300200141086a200641086a29000037030020012006290000370300410121030b02402008a7450d002007102c0b2003450d0220014180016a41186a2207200141186a29030037030020014180016a41106a2209200141106a29030037030020014180016a41086a220b200141086a2903003703002001200129030037038001200141e0006a41186a220c4200370300200141e0006a41106a220d4200370300200141e0006a41086a2205420037030020014200370360200141d0006a41086a220641a4c6c500ad4280808080a001841002220341086a290000370300200120032900003703502003102c2005200629030037030020012001290350220837034020012008370360200641baecc100ad4280808080e000841002220341086a290000370300200120032900003703502003102c200141c0006a41086a2006290300220837030020012001290350220e3703402004200e370000200441086a2008370000200141206a41086a2005290300370300200141206a41106a200d290300370300200141206a41186a200c29030037030020012001290360370320200141203602642001200141206a36026020014180016a200141e0006a10a102200041186a2007290300370000200041106a2009290300370000200041086a200b29030037000020002001290380013700000c030b200641246a21062005415c6a21050c000b0b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b02402002422088a72206450d00200641246c2105200a210603400240024020062d0000220341034b0d0002400240024020030e0404000102040b2006410c6a280200450d03200641086a280200102c0c030b2006410c6a280200450d02200641086a280200102c0c020b2006410c6a280200450d01200641086a280200102c0c010b200641086a280200450d00200641046a280200102c0b200641246a21062005415c6a22050d000b0b2002a7450d00200a102c0b200141f0016a24000bfd0d09057f017e017f017e037f017e027f027e087f230041e0006b22012400200141206a41186a22024200370300200141206a41106a22034200370300200141206a41086a2204420037030020014200370320200141d0006a41086a22054196e0c500ad4280808080f0008422061002220741086a290000370300200120072900003703502007102c2004200529030037030020012001290350220837034020012008370320200541c2e0c500ad4280808080e002841002220741086a290000370300200120072900003703502007102c200320012903502208370300200141086a22092004290300370300200141106a220a2008370300200141186a220b20052903003703002001200837034020012001290320370300200141206a200110e4032001290328210c200128022421072001280220210d20024200370300200342003703002004420037030020014200370320200520061002220e41086a2900003703002001200e290000370350200e102c2004200529030037030020012001290350370320200541bafdc200ad4280808080e001841002220e41086a2900003703002001200e290000370350200e102c20032001290350220837030020092004290300370300200a2008370300200b20052903003703002001200837034020012001290320370300200141206a2001412010d001200d410020071b210b200c420020071b210f20012902244200200128022022051b21102007410420071b21112005410120051b210d2000280200211220002802042113024002400240024020002802082205450d002012200541246c6a21142010422088a741057421152012210903402009280220210a200941086a2900002108200941106a29000021062009290000210c2002200941186a29000037030020032006370300200420083703002001200c370320200941246a21094100210020152107200d21050240024003402007450d02200141206a2005460d01200041016a2100200741606a21072005200141206a412010dd05210e200541206a2105200e0d000b200e4541016a41017120006a417f6a21000b200b200a6a2207200b490d000240200041016a220e200f422088a722054d0d000240200fa7220b20056b200e2005200e20054b1b221620056b220e4f0d002005200e6a22172005490d07200b41017422182017201820174b1b221741ffffffff03712017470d07201741027422184100480d0702400240200b0d002018102a21110c010b2011200b4102742018102e21110b2011450d052017ad210f0b201120054102746a210b02400240200e4102490d00200b410020162005417f736a220e41027410da051a2011200520166a20056b4102746a417c6a210b200e20056a21050c010b200e450d010b200b4100360200200541016a21050b200520004d0d04201120004102746a22002000280200200a6a360200200f42ffffffff0f832005ad42208684210f2007210b0b20092014470d000b0b02402013450d002012102c0b02402010a7450d00200d102c0b200141206a41186a220e4200370300200141206a41106a22094200370300200141206a41086a2207420037030020014200370320200141d0006a41086a22054196e0c500ad4280808080f000841002220041086a290000370300200120002900003703502000102c2007200529030037030020012001290350220837034020012008370320200541c2e0c500ad4280808080e002841002220041086a290000370300200120002900003703502000102c200141c0006a41086a2005290300220837030020012001290350220637034020032006370000200341086a2008370000200141086a2007290300370300200141106a2009290300370300200141186a200e290300370300200120012903203703000240024020110d002001ad428080808080048410050c010b20014100360228200142013703204104102a2205450d012005200b36000020014284808080c00037022420012005360220200f422088a72205200141206a10670240024020050d002001280228210a20012802242109200128022021070c010b2005410274210b4100200128022822056b2100200128022421092011210e0340200e280200210302400240200920006a4104490d00200128022021070c010b200541046a22072005490d062009410174220a2007200a20074b1b220a4100480d060240024020090d00200a102a21070c010b20012802202009200a102e21070b2007450d042001200a36022420012007360220200a21090b200e41046a210e2001200541046a220a360228200720056a20033600002000417c6a2100200a2105200b417c6a220b0d000b0b2001ad4280808080800484200aad4220862007ad84100102402009450d002007102c0b2011450d00200fa7450d002011102c0b200141e0006a24000f0b1033000b41a888c600200020051038000b1035000b940703067f017e057f230041a0016b2201240020014180016a41186a2202420037030020014180016a41106a2203420037030020014180016a41086a220442003703002001420037038001200141f0006a41086a220541ecddc500ad4280808080f000841002220641086a290000370300200120062900003703702006102c200420052903003703002001200129037037038001200541f3ddc500ad4280808080c001841002220641086a290000370300200120062900003703702006102c200320012903702207370300200141d0006a41086a22062004290300370300200141d0006a41106a22082007370300200141d0006a41186a22092005290300370300200120073703102001200129038001370350200141086a200141d0006a4120109401200128020c210a2001280208210b200141106a41186a200041186a290000370300200141106a41106a200041106a290000370300200141106a41086a200041086a29000037030020012000290000370310200541a3dbc500ad42808080808001841002220041086a290000370300200120002900003703702000102c200141306a41086a220c20052903003703002001200129037037033020054182aac500ad4280808080e001841002220041086a290000370300200120002900003703702000102c200141c0006a41086a22002005290300370300200120012903703703402001200a4100200b1b3602702002200141f0006aad4280808080c000841006220541186a2900003703002003200541106a2900003703002004200541086a29000037030020012005290000370380012005102c2009200229030037030020082003290300370300200620042903003703002001200129038001370350024041c000102a2205450d00200520012903303700002005200129034037001020052001290350370020200541086a200c290300370000200541186a2000290300370000200541286a2006290300370000200541306a2008290300370000200541386a200929030037000020014180016a200141106a109f01200541c000418001102e2205450d002005200129008001370040200541d8006a20014198016a290000370000200541d0006a20014190016a290000370000200541c8006a20014188016a2900003700002001200541e0001094012001200128020441016a410120012802001b360280012005ad4280808080800c8420014180016aad4280808080c0008410012005102c200141a0016a24000f0b1033000b3802017f017e230041106b220324002003200210b701200329030021042000200341086a29030037030820002004370300200341106a24000b800201057f230041c0006b2205240002400240024020030d00200041003602000c010b2003280208220641164d0d0120032802002107200541206a41186a22082004ad42808080808004841006220341186a290000370300200541206a41106a2204200341106a290000370300200541206a41086a2209200341086a290000370300200520032900003703202003102c200541186a2008290300370300200541106a2004290300370300200541086a20092903003703002005200529032037030020002006ad4220862007ad84200641696aad422086200741176aad8441012005ad42808080808004841008108d010b200541c0006a24000f0b411720061047000baf0201027f23004190016b220324002003200210ee010240024020032d000022024102470d00200041003a00000c010b200341e0006a200341286a290300370300200341e8006a200341306a290300370300200341d8006a41186a200341386a290300370300200341d8006a41206a200341c0006a290300370300200341d8006a41286a200341c8006a290300370300200341d8006a41306a200341d0006a2802003602002003200341206a29030037035802402002450d00200041003a00000c010b2003411c6a2802002102200341186a28020021042000200329026c370001200041013a0000200041196a20034184016a290200370000200041116a200341fc006a290200370000200041096a200341d8006a411c6a2902003700002002450d002004102c0b20034190016a24000bfe0201057f230041c0016b22022400200241086a220341e4d2c500ad42808080808001841002220441086a290000370300200220042900003703002004102c200241d8006a41086a2205200329030037030020022002290300370358200341a9e4c300ad4280808080e001841002220441086a290000370300200220042900003703002004102c200241e8006a41086a220620032903003703002002200229030037036820022001109f01024041c000102a2204450d00200420022903583700002004200229036837001020042002290000370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241106a290000370000200441386a200241186a2900003700002002200441c00010a50120022d00002103200241e8006a200241017241d70010db051a0240024020034102470d00200041023a00000c010b200020033a0000200041016a200241e8006a41d70010db051a0b2004102c200241c0016a24000f0b1033000bd10201057f230041d0006b22022400200241306a41086a220341e4d2c500ad42808080808001841002220441086a290000370300200220042900003703302004102c200241106a41086a2205200329030037030020022002290330370310200341a9e4c300ad4280808080e001841002220441086a290000370300200220042900003703302004102c200241206a41086a2206200329030037030020022002290330370320200241306a2001109f01024041c000102a22040d001033000b200420022903103700002004200229032037001020042002290030370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241c0006a290000370000200441386a200241306a41186a290000370000200241086a200441c000410141004100109701200228020821032004102c200241d0006a240020034101460b870102017f037e230041e0006b22032400200341086a200210ee010240024020032d000822024102470d00420021040c010b2002410173ad2104200341186a2903002105200341106a290300210620020d00200341246a280200450d00200341206a280200102c0b2000200637030820002004370300200041106a2005370300200341e0006a24000be72e0a057f067e0d7f067e057f027e0d7f027e067f027e230041a0056b22022400200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b200241fc006a20042f0106360200200241e0006a41186a4100360200200241f4006a200436020020022003360280012002410036027042002107200242003703682002200136026420024100360260200241c8016a200241e0006a10f2010240024020022903e80122084202520d00420021094200210a0c010b200241f0046aad4280808080800484210b200241d0046aad4280808080800484210c200241fc016a210d200241c8016a412c6a210e200241c8016a410472210f200241c8016a41106a2103200241a5026a2110200241c8016a41086a2111200241a8036a412c6a2112200241a8036a41106a2113200241f8016a211420024190026a211542002107420021094200210a0340200241a8016a41186a2205200241c8016a41186a2201290300370300200241a8016a41106a22062003290300370300200241a8016a41086a2216201129030037030020024188016a41086a2217201041086a29000037030020024188016a41106a2218201041106a29000037030020024188016a41186a2219201041186a290000370300200220022903c8013703a80120022010290000370388012014290300211a2015290300211b20022903f001211c200229038802211d200229038002211e200229039802211f20022802a002212020022d00a402212120022d00c5022104200241c8026a41186a2005290300370300200241c8026a41106a2006290300370300200241c8026a41086a2016290300370300200220022903a8013703c802200241e8026a41186a22162019290300370300200241e8026a41106a22222018290300370300200241e8026a41086a2223201729030037030020022002290388013703e802024002400240024002402004ad42ff0183200820085022051b4201520d00200241c8016a200241c8026a4200201c20051b4200201a20051b10a00120022d00e0012105200241c8006a200a2007200920022903c80120022903d001200329030010f301200241c8006a41106a2903002109200229035021072002290348210a20050d010b024002400240202141ff0171222441014622050d00200441ff01710d002020201ea772450d010b200241c8016a200241c8026a10ee010240024020022d00c8012217417f6a220641014b0d00024020060e020002000b20170d0420022802e401450d0420022802e001102c0c040b20024188036a41086a200d41086a29020037030020024188036a41106a200d41106a29020037030020024188036a41186a200d41186a2902003703002002200d290200370388032003290300212520022903d0012126200228029c02212720022802f801212820022802f401212920022802f001212a20022802ec01212b20022802e801212c20022802e401212d20022802e001212e0c020b4102212920170d0120022802e401450d0120022802e001102c0c010b201fa7210402400240201f422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b200220203602e801200241003602e001200241003602d801200242003703d001200220013602cc01200241003602c801200220043602dc01200220042f01063602e401200241c8016a10f4010c040b4102212f0240024002400240024020294102460d00202c417f4c0d0202400240202c0d0041002130410121310c010b202c2130202c102a2231450d020b2031202e202c10db051a200120024188036a41186a290300370300200320024188036a41106a290300370300201120024188036a41086a29030037030020022002290388033703c8012029410146212f202c2132202b21332026213420252135202a2136202821370b200241f0046a41186a22182001290300370300200241f0046a41106a22192003290300370300200241f0046a41086a22212011290300370300200241d0046a41086a22382023290300370300200241d0046a41106a22392022290300370300200241d0046a41186a223a2016290300370300200220022903c8013703f004200220022903e8023703d00402400240024002400240024002400240200441ff01710d00202f4102460d01201220022903f004370200201241086a2021290300370200201241106a2019290300370200201241186a2018290300370200200220343703a803200220373602d0032002202f3602cc03200220363602c803200220333602c403200220323602c003200220303602bc03200220313602b803200220353703b0032036213b2034213c2035213d203321060c030b202f4102470d010b2005450d03200241f8036a200241c8026a10f501200142003703002003420037030041082106200241c8016a41086a22054200370300200242003703c801200241b0046a41086a22044191b0c200ad4280808080e000841002221741086a290000370300200220172900003703b0042017102c20052004290300370300200220022903b0043703c801200441acb0c200ad4280808080e000841002221741086a290000370300200220172900003703b0042017102c20024190056a41086a20042903002208370300200220022903b004221c370390052003201c370000200341086a200837000020024188046a41086a200529030037030020024188046a41106a200329030037030020024188046a41186a2001290300370300200220022903c80137038804200241386a20024188046a4120109401200228023c210420022802382105201341086a200241f8036a41086a280200360200201320022903f803370200201220022903d004370100201241086a200241d0046a41086a290300370100201241106a2039290300370100201241186a203a290300370100427f213c2002427f3703b0032002427f3703a803200241083602c4034100212f200241003602cc0320022004410020051b223b3602c803427f213d0c010b203241164d0d072032ad4220862031ad84203241696aad422086203141176aad84410110072005450d01200241f8036a200241c8026a10f501200142003703002003420037030041082106200241c8016a41086a22054200370300200242003703c801200241b0046a41086a22044191b0c200ad4280808080e000841002221741086a290000370300200220172900003703b0042017102c20052004290300370300200220022903b0043703c801200441acb0c200ad4280808080e000841002221741086a290000370300200220172900003703b0042017102c20024190056a41086a20042903002208370300200220022903b004221c370390052003201c370000200341086a200837000020024188046a41086a200529030037030020024188046a41106a200329030037030020024188046a41186a2001290300370300200220022903c80137038804200241c0006a20024188046a41201094012002280244210420022802402105201341086a200241f8036a41086a280200360200201320022903f803370200201220022903d004370100201241086a200241d0046a41086a290300370100201241106a2039290300370100201241186a203a290300370100427f213c2002427f3703b0032002427f3703a803200241083602c4034100212f200241003602cc0320022004410020051b223b3602c80302402030450d002031102c427f213c0b427f213d0b0240201e4201520d002002201d3703a8032002201b3703b003201d213c201b213d0b02402024450d00201220022903e802370000201241186a2016290300370000201241106a2022290300370000201241086a20232903003700000b02402020450d00200142003703002003420037030020114200370300200242003703c801200241b0046a41086a22044191b0c200ad4280808080e000841002220541086a290000370300200220052900003703b0042005102c20112004290300370300200220022903b0043703c801200441acb0c200ad4280808080e000841002220541086a290000370300200220052900003703b0042005102c20024190056a41086a20042903002208370300200220022903b004221e370390052003201e370000200341086a200837000020024188046a41086a201129030037030020024188046a41106a200329030037030020024188046a41186a2001290300370300200220022903c80137038804200241306a20024188046a41201094014101212f200241013602cc0320022002280234410020022802301b3602d0030b201fa72104201f422088a722160d02200421050c030b200241c8026a10f6012030450d002031102c0b20294102460d06202d0d054100212d0c060b2016211720042105034020052802ec0321052017417f6a22170d000b0340200420042f01064102746a41ec036a28020021042016417f6a22160d000b0b20042f01062116200220203602a804200220163602a404200241003602a0042002200436029c04200241003602980420024200370390042002200536028c042002410036028804200241c8016a20024188046a10f70120022802c8014101470d0620022802c003222041696aad42208620022802b803220441176aad8421082020ad4220862004ad84211f0340200241b0046a41186a200f41186a290200221e370300200241b0046a41106a200f41106a290200221c370300200241b0046a41086a200f41086a290200221a3703002002200f290200221d3703b00420022802ec01210520022802f001211720022802f4012116203a201e3703002039201c3703002038201a3703002002201d3703d00402400240202041164d0d002001200c1006220441186a2900003703002003200441106a2900003703002011200441086a290000370300200220042900003703c8012004102c201820012903003703002019200329030037030020212011290300370300200220022903c8013703f004200241c8016a201f20084101200b1008108d0120022802c8012204450d01200620022802d0016b210620022802cc01450d012004102c0c010b411720201047000b0240024020050d002001200c1006220441186a2900003703002003200441106a2900003703002011200441086a290000370300200220042900003703c8012004102c201820012903003703002019200329030037030020212011290300370300200220022903c8013703f004201f20084101200b10090c010b2001200c1006220441186a2900003703002003200441106a2900003703002011200441086a290000370300200220042900003703c8012004102c201820012903003703002019200329030037030020212011290300370300200220022903c8013703f004201f20084101200b2016ad4220862005ad84100a200620166a21062017450d002005102c0b200241c8016a20024188046a10f70120022802c8014101470d060c000b0b1033000b103a000b411720321047000b202e102c0b201fa7210402400240201f422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b200220203602e801200241003602e001200241003602d801200242003703d001200220013602cc01200241003602c801200220043602dc01200220042f01063602e401200241c8016a10f4010c020b200220063602c4030b20024188046a10f40120024188046a41186a220420024188036a41186a29030037030020024188046a41106a220120024188036a41106a29030037030020024188046a41086a220520024188036a41086a2903003703002002200229038803370388040240024020294102460d00200e200229038804370200200e41086a2005290300370200200e41106a2001290300370200200e41186a2004290300370200200220263703c801200220283602f001200220293602ec012002202a3602e8012002202b3602e4012002202d3602dc012002202e3602d8012002202736029402200220253703d0012002202c3602e001410121040240202c20022802c003470d0002400240202e20022802b8032201460d00202e2001202c10dd050d02202b2006470d020c010b202b2006470d010b200e2012412010dd050d002026203c852025203d85844200520d00202a203b470d0002402029202f470d004100210420294101470d01202820022802d003460d010b410121040b0240202d450d00202e102c0b20044102460d002004450d010b2011200241a8036a41d00010db051a200241003a00c801200241c8026a200241c8016a10f8010c010b20022802bc03450d0020022802b803102c0b200241c8016a200241e0006a10f20120022903e80122084202520d000b0b200241e0006a10f90102400240200a500d00200241c8016a41186a22054200370300200241c8016a41106a22064200370300200241c8016a41086a22014200370300200242003703c801200241b0046a41086a2204418be9c500ad4280808080800184221f1002220341086a290000370300200220032900003703b0042003102c20012004290300370300200220022903b00422083703a803200220083703c801200441c9b5c000ad4280808080d00184220c1002220341086a290000370300200220032900003703b0042003102c200620022903b004220837030020024188046a41086a2211200129030037030020024188046a41106a220f200837030020024188046a41186a221620042903003703002002200837039005200220022903c80137038804200241186a20024188046a4120109e01200241186a41106a29030021082002290320210b20022802182103200542003703002006420037030020014200370300200242003703c8012004201f1002220641086a290000370300200220062900003703b0042006102c20012004290300370300200220022903b004221f3703a8032002201f3703c8012004200c1002220641086a290000370300200220062900003703b0042006102c20052004290300221f37030020112001290300370300200f20022903b004220c3703002016201f3703002002200c37039005200220022903c80137038804200242002008420020031b220820097d200b420020031b221f200754ad7d220c201f20077d220b201f56200c200856200c2008511b22041b3703d00120024200200b20041b3703c801200241c8016a210420024188046a21010c010b02402007200984500d0041b583c100413341acfec5001036000b200241c8016a41186a22054200370300200241c8016a41106a22064200370300200241c8016a41086a22014200370300200242003703c801200241b0046a41086a2204418be9c500ad4280808080800184221f1002220341086a290000370300200220032900003703b0042003102c20012004290300370300200220022903b00422083703a803200220083703c801200441c9b5c000ad4280808080d00184220c1002220341086a290000370300200220032900003703b0042003102c200620022903b004220837030020024188046a41086a2211200129030037030020024188046a41106a220f200837030020024188046a41186a221620042903003703002002200837039005200220022903c80137038804200220024188046a4120109e01200241106a29030021082002290308210b20022802002103200542003703002006420037030020014200370300200242003703c8012004201f1002220641086a290000370300200220062900003703b0042006102c20012004290300370300200220022903b004221f3703a8032002201f3703c8012004200c1002220641086a290000370300200220062900003703b0042006102c20052004290300221f37030020112001290300370300200f20022903b004220c3703002016201f3703002002200c37039005200220022903c8013703880420022008420020031b3703d0012002200b420020031b3703c801200241c8016a210420024188046a21010b2001ad42808080808004842004ad42808080808002841001200241a0056a24000bf90503087f017e017f23004180026b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e00010db051a2001200341016a36020c200120043602082001200536020420024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e00010db051a200020024180016a41800110db051a0c020b200042023703200c010b2001280200210702400240200528020022030d002004ad210a410021030c010b200741016a210720053301044220862004ad84210a0b2005102c200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b034002400240200328020022050d002004ad210a410021050c010b200741016a210720033301044220862004ad84210a0b2003102c200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e00010db051a200641027420056a418c0b6a280200210302402007417f6a2205450d00034020032802880b21032005417f6a22050d000b0b2001410036020c20012004360208200120033602042001410036020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e00010db051a200020024180016a41800110db051a0b20024180026a24000ba31108037f037e047f017e017f017e037f017e230041c0016b220724002004a7210802400240024002400240024020014201510d0041012109024020084101460d00427f200320067c200220057c220a2002542208ad7c220b2008200b200354200b2003511b22081b210b427f200a20081b210a4200210c4100210d0c040b2002200556200320065620032006511b450d01200320067d2002200554ad7d210b200220057d210a4200210c0c020b4101210d024020084101470d00427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210b427f200120081b210a410021094201210c0c040b200741306a20042005200642012002200310f301200741c0006a290300210b2007290338210a2007290330210c0c040b200620037d2005200254ad7d210b200520027d210a4201210c0b410021094101210d0b2001500d0020074180016a41186a220e420037030020074180016a41106a220f420037030020074180016a41086a221042003703002007420037038001200741b0016a41086a2208418be9c500ad428080808080018422111002221241086a290000370300200720122900003703b0012012102c20102008290300370300200720072903b00122013703a0012007200137038001200841c9b5c000ad4280808080d0018422131002221241086a290000370300200720122900003703b0012012102c200f20072903b0012201370300200741e0006a41086a22142010290300370300200741e0006a41106a22152001370300200741e0006a41186a22162008290300370300200720013703a0012007200729038001370360200741c8006a200741e0006a4120109e01200741c8006a41106a29030021012007290350211720072802482112200e4200370300200f4200370300201042003703002007420037038001200820111002220f41086a2900003703002007200f2900003703b001200f102c20102008290300370300200720072903b00122113703a0012007201137038001200820131002220f41086a2900003703002007200f2900003703b001200f102c200e2008290300221137030020142010290300370300201520072903b001221337030020162011370300200720133703a0012007200729038001370360200742002001420020121b220120037d2017420020121b2203200254ad7d2211200320027d2202200356201120015620112001511b22081b3703880120074200200220081b37038001200741e0006aad428080808080048420074180016aad428080808080028410010b02402004500d002009450d0120074180016a41186a2209420037030020074180016a41106a220d420037030020074180016a41086a221042003703002007420037038001200741b0016a41086a2208418be9c500ad428080808080018422021002220e41086a2900003703002007200e2900003703b001200e102c20102008290300370300200720072903b00122033703a0012007200337038001200841c9b5c000ad4280808080d0018422041002220e41086a2900003703002007200e2900003703b001200e102c200d20072903b0012203370300200741e0006a41086a220f2010290300370300200741e0006a41106a22122003370300200741e0006a41186a22142008290300370300200720033703a0012007200729038001370360200741186a200741e0006a4120109e01200741186a41106a2903002103200729032021012007280218210e20094200370300200d4200370300201042003703002007420037038001200820021002220d41086a2900003703002007200d2900003703b001200d102c20102008290300370300200720072903b00122023703a0012007200237038001200820041002220d41086a2900003703002007200d2900003703b001200d102c200920082903002202370300200f2010290300370300201220072903b001220437030020142002370300200720043703a00120072007290380013703602007420020034200200e1b220320067d20014200200e1b2202200554ad7d2204200220057d2205200256200420035620042003511b22081b3703880120074200200520081b37038001200741e0006aad428080808080048420074180016aad428080808080028410010c010b200d450d0020074180016a41186a2209420037030020074180016a41106a220d420037030020074180016a41086a221042003703002007420037038001200741b0016a41086a2208418be9c500ad428080808080018422021002220e41086a2900003703002007200e2900003703b001200e102c20102008290300370300200720072903b00122033703a0012007200337038001200841c9b5c000ad4280808080d0018422041002220e41086a2900003703002007200e2900003703b001200e102c200d20072903b0012203370300200741e0006a41086a220f2010290300370300200741e0006a41106a22122003370300200741e0006a41186a22142008290300370300200720033703a00120072007290380013703602007200741e0006a4120109e01200741106a2903002103200729030821012007280200210e20094200370300200d4200370300201042003703002007420037038001200820021002220d41086a2900003703002007200d2900003703b001200d102c20102008290300370300200720072903b00122023703a0012007200237038001200820041002220d41086a2900003703002007200d2900003703b001200d102c200920082903002202370300200f2010290300370300201220072903b001220437030020142002370300200720043703a00120072007290380013703602007427f20034200200e1b220320067c20014200200e1b220220057c22052002542208ad7c22022008200220035420022003511b22081b370388012007427f200520081b37038001200741e0006aad428080808080048420074180016aad428080808080028410010b2000200a3703082000200c370300200041106a200b370300200741c0016a24000bb00101037f230041306b220124002001200010f701024020012802004101470d000340024020012802242202450d002001280228450d002002102c0b2001200010f70120012802004101460d000b0b02402000280204220241d0e1c100460d00200228020021032002102c2003450d00200328020021002003102c2000450d00024020002802002202450d0003402000102c2002210020022802002203210220030d000b0b2000102c0b200141306a24000bc50805057f017e017f027e037f230041f0006b22022400200241d0006a41186a22034200370300200241d0006a41106a22044200370300200241d0006a41086a2205420037030020024200370350200241c0006a41086a220641e4d2c500ad428080808080018422071002220841086a290000370300200220082900003703402008102c200520062903003703002002200229034022093703302002200937035020064183d3c500ad4280808080e00184220a1002220841086a290000370300200220082900003703402008102c200420022903402209370300200241106a41086a22082005290300370300200241106a41106a220b2009370300200241106a41186a220c200629030037030020022009370330200220022903503703102002200241106a1098012002280200210d2002290308210920034200370300200442003703002005420037030020024200370350200620071002220441086a290000370300200220042900003703402004102c20052006290300370300200220022903402207370330200220073703502006200a1002220441086a290000370300200220042900003703402004102c20032006290300220737030020082005290300370300200b2002290340220a370300200c20073703002002200a370330200220022903503703102002200942017c4201200d1b2209370350200241106aad4280808080800484200241d0006aad4280808080800184100102404120102a2206450d0020062001290000370000200641186a200141186a290000370000200641106a200141106a290000370000200641086a200141086a2900003700002006412041c000102e2205450d0020052009370020200241d0006a41186a22012005ad42808080808005841006220641186a290000370300200241d0006a41106a2203200641106a290000370300200241d0006a41086a2204200641086a290000370300200220062900003703502006102c200241106a41186a2001290300370300200241106a41106a2003290300370300200241106a41086a2004290300370300200220022903503703104137102a2206450d00200642bac6a1cbc68dd9aff300370000200642f4dec98bf6ac999de400370008200641e5cc85ab073600102006413a3a0016200641ece8013b001420062002290310370017200620022f01183b001f2006200228011a360021200620022f011e3b0025200620022d00203a0027200620022d00213a0028200620022d00223a0029200620022d00233a002a200620022d00243a002b200620022d00253a002c200620022d00263a002d200620022d00273a002e200620022d00283a002f200620022d00293a0030200620022d002a3a0031200620022d002b3a0032200620022d002c3a0033200620022d002d3a0034200620022d002e3a0035200620022d002f3a0036200041bcfec3004194fec3006b410f6a36020820004137360204200020063602002005102c200241f0006a24000f0b1033000bbb0201057f230041c0006b22012400200141206a41086a220241e4d2c500ad42808080808001841002220341086a290000370300200120032900003703202003102c200141086a2204200229030037030020012001290320370300200241a9e4c300ad4280808080e001841002220341086a290000370300200120032900003703202003102c200141106a41086a2205200229030037030020012001290320370310200141206a2000109f01024041c000102a22030d001033000b200320012903003700002003200129031037001020032001290020370020200341086a2004290300370000200341186a2005290300370000200341286a2002290000370000200341306a200141306a290000370000200341386a200141206a41186a2900003700002003ad428080808080088410052003102c200141c0006a24000bdd0605057f047e017f017e047f23004190016b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241e0006a41186a200520034105746a220641206a2900002207370300200241e0006a41106a200641186a2900002208370300200241e0006a41086a200641106a29000022093703002002200641086a290000220a370360200241306a41086a20052003410c6c6a220641f0026a280200220b360200200641e8026a290200210c2001200341016a36020c20012004360208200120053602042002200c3703302000200a3702042000410c6a2009370200200041146a20083702002000411c6a2007370200200041246a200c3702002000412c6a200b360200200041013602000c020b200041003602000c010b2001280200210602400240200528020022030d002004ad210c410021030c010b200641016a210620053301044220862004ad84210c0b2005102c200ca7210402400240200c422088a7220b20032f01064f0d00200321050c010b034002400240200328020022050d002004ad210c410021050c010b200641016a210620033301044220862004ad84210c0b2003102c200ca7210420052103200c422088a7220b20052f01064f0d000b0b200241306a41186a220d2005200b4105746a220341206a290000370300200241306a41106a220e200341186a290000370300200241306a41086a220f200341106a2900003703002002200341086a290000370330200241d0006a41086a22102005200b410c6c6a220341f0026a2802003602002002200341e8026a290200370350200b41027420056a41f0036a280200210302402006417f6a2205450d00034020032802ec0321032005417f6a22050d000b0b2001410036020c200120043602082001200336020420014100360200200241e0006a41186a200d290300220c370300200241e0006a41106a200e2903002207370300200241e0006a41086a200f290300220837030020024188016a201028020022033602002000200229033022093702042000410c6a2008370200200041146a20073702002000411c6a200c370200200041246a2002290350220c3702002000412c6a2003360200200220093703602002200c37038001200041013602000b20024190016a24000b8a0401057f230041c0006b22022400200241206a41086a220341e4d2c500ad42808080808001841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341a9e4c300ad4280808080e001841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2000109f01024041c000102a2204450d00200420022903003700002004200229031037001020042002290020370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241003602282002420137032020012d000021004101102a21030240024020004101460d002003450d02200242818080801037022420022003360220200341003a0000200141086a200241206a10b4040c010b2003450d01200242818080801037022420022003360220200341013a00002002200241206a360210200141016a200241106a1094020b200228022421032004ad4280808080800884200235022842208620022802202200ad84100102402003450d002000102c0b2004102c024020012d00000d002001411c6a280200450d00200141186a280200102c0b200241c0006a24000f0b1033000bca0201067f230041b0016b22012400200141086a200010f201024020012903284202510d000340200128026021022001280258210302400240200128025c22040d00200321050c010b2004210620032105034020052802ec0321052006417f6a22060d000b0340200320032f01064102746a41ec036a28020021032004417f6a22040d000b0b200120023602a801200141003602a001200141003602980120014200370390012001200536028c0120014100360288012001200336029c01200120032f01063602a40120014188016a10f401200141086a200010f20120012903284202520d000b0b02402000280204220341d0e1c100460d00200328020021042003102c2004450d00200428020021052004102c2005450d00024020052802002203450d0003402005102c2003210520032802002204210320040d000b0b2005102c0b200141b0016a24000be80202097f027e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010dd05220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a220541c5036a310000200541e8026a290300220c200c5022081ba7450d004200200541f8026a29030020081b210c4200200541f0026a29030020081b210d0c010b200341086a20012802102002200141146a28020028021c110400200341106a290300210c200128020021042003290308210d0b20012004417f6a3602002000200c3703082000200d370300200341206a24000f0b41c689c6004118200341186a418883c100103b000bd40402097f017e230041106b22052400024002400240200128020041016a220641004c0d0020012006360200200141046a2106200141086a28020021070240024003402006280200220841086a210920082f0106220a41057421064100210b0240024003402006450d0120022009412010dd05220c450d02200641606a2106200b41016a210b200941206a2109200c417f4a0d000b200b417f6a210a0b2007450d022007417f6a21072008200a4102746a41880b6a21060c010b0b2008200b41e0006c6a22094198036a2106200941e8026a210d2009419c036a2802002107024003402006280200220841086a210920082f0106220a41057421064100210b0240024003402006450d0120042009412010dd05220c450d02200641606a2106200b41016a210b200941206a2109200c417f4a0d000b200b417f6a210a0b024020070d004100210c0c030b2007417f6a21072008200a4102746a41ec036a21060c010b0b4101210c0240200841e8026a200b410c6c6a2206280200220b0d00410021060c010b20062802082209417f4c0d040240024020090d0020054200370300410121060c010b2009102a2206450d0620054100360204200520093602000b200520093602042006200b200910db051a2005290300210e0b02400240200d2d005d450d0020064100200c1b21060c010b200c450d010b2000200e370204200020063602000c010b20002001280210200220032004200141146a28020028020c1105000b20012001280200417f6a360200200541106a24000f0b41c689c6004118200541086a418883c100103b000b103a000b1033000bcb0401097f230041c0006b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a280200210602400240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010dd05220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a220841e8026a210502400240200841c5036a2d00000d00200341206a41086a220a200541c5006a290000370300200341206a41106a220b200541cd006a290000370300200341206a41186a2207200541d5006a29000037030020032005413d6a2900003703204102210820052d003c4101470d01200341186a2007290300370300200341106a200b290300370300200341086a200a29030037030020032003290320370300410121080c010b200341086a200541c5006a290000370300200341106a200541cd006a290000370300200341186a200541d5006a29000037030020032005413d6a29000037030020052d003c21080b200841ff01714102470d010b200020012802102002200141146a280200280210110400200128020021040c010b200020083a000020002003290300370001200041096a200341086a290300370000200041116a200341106a290300370000200041196a200341186a2903003700000b20012004417f6a360200200341c0006a24000f0b41c689c6004118200341206a418883c100103b000bb80201097f230041106b220224000240200028020041016a220341004c0d0020002003360200200041046a2104200041086a280200210502400240024003402004280200220641086a210720062f010622084105742104410021090240024003402004450d0120012007412010dd05220a450d02200441606a2104200941016a2109200741206a2107200a417f4a0d000b2009417f6a21080b2005450d022005417f6a2105200620084102746a41880b6a21040c010b0b2006200941e0006c6a220441a4036a2d000022074101410220074101461b200441c5036a2d00001b22044102470d010b20002802102001200041146a2802002802181101002104200028020021030c010b200441014621040b20002003417f6a360200200241106a240020040f0b41c689c6004118200241086a418883c100103b000bfc0202097f037e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010dd05220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a22054190036a290300210c20054188036a290300210d20054180036a290300210e0240200541c5036a2d00000d00200ea721054201210e2005450d010c020b200e4202520d010b200320012802102002200141146a280200280214110400200341106a290300210c200128020021042003290308210d2003290300210e0b20012004417f6a360200200041106a200c3703002000200d3703082000200e370300200341206a24000f0b41c689c6004118200341186a418883c100103b000b851409057f017e0c7f047e037f017e037f047e097f230041f00c6b22022400024020002802000d002000417f360200200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241f0016a200210f201024020022903900222074202510d002000410c6a2108200041046a2109200241900a6a41146a210a200241900a6a41206a210b200241f0016a4104722103200241f0016a413d6a210c200241cd026a210d200241b8026a210e200241f0016a41306a210f200241f0016a41286a21100340200241c8006a41086a2204200241f0016a41086a2211290300370300200241c8006a41106a2201200241f0016a41106a2212290300370300200241c8006a41186a2205200241f0016a41186a2213290300370300200220022903f001370348200e2903002114200f290300211520022903b0022116200229039802211720022f01ee02211820022d00ed02211920022d00cc02211a20022903a802211b20022802c002211c20022802c402211d20022802c802211e200241286a41186a200d41186a290000221f370300200241286a41106a200d41106a2900002220370300200241286a41086a200d41086a29000022213703002002200d2900002222370328200241e8006a41186a2223201f370300200241e8006a41106a22242020370300200241e8006a41086a222520213703002002202237036820024188016a41186a2226200529030037030020024188016a41106a2227200129030037030020024188016a41086a222820042903003703002002200229034837038801024002400240024002402009280200222941d0e1c100460d002000280208212a0c010b200241900a6a410041e00210da051a200241f0016a410041a00810da051a41880b102a2229450d014100212a202941003b010620294100360200202941086a200241900a6a41e00210db051a202941e8026a200241f0016a41a00810db051a20004100360208200020293602040b0340202941086a210120292f0106222b410574210441002105024003402004450d0120024188016a2001412010dd052206450d04200441606a2104200541016a2105200141206a21012006417f4a0d000b2005417f6a212b0b0240202a450d00202a417f6a212a2029202b4102746a41880b6a28020021290c010b0b200241c0016a41186a2026290300221f370300200241c0016a41106a20272903002220370300200241c0016a41086a20282903002221370300200220022903880122223703c001200a2022370200200a41086a2021370200200a41106a2020370200200a41186a201f370200200220083602a00a2002202b36029c0a200220093602980a200220293602940a200241003602900a20102014370300201220153703002002201637039002200220173703f8012002201a3a00ac022002201e3602a8022002201d3602a4022002201c3602a0022002201b37038802200220073703f001200c2002290368370000200c41086a2025290300370000200c41106a2024290300370000200c41186a2023290300370000200220183b01ce02200220193a00cd02200241900a6a200241f0016a1080021a0c020b1033000b202941e8026a200541e0006c6a2129024020194101710d0020292029290300200720075022041b37030020292029290308201720041b370308202941106a22012001290300201520041b370300200241900a6a41186a22062023290300370300200241900a6a41106a222a2024290300370300200241900a6a41086a222b2025290300370300200220022903683703900a20292d003c21012013202941d5006a22052900003703002012202941cd006a22192900003703002011202941c5006a222329000037030020022029413d6a22242900003703f0012028200241900a6a200241f0016a201a41ff0171410146221a1b220441086a2900003703002027200441106a2900003703002026200441186a2900003703002002200429000037038801202941012001201a1b3a003c2024200229038801370000202320282903003700002019202729030037000020052026290300370000202920162029290320201ba722041b370320202941286a22012014200129030020041b3703002029201b202929031820041b37031802400240201d0d00201c21040c010b201d2101201c2104034020042802ec0321042001417f6a22010d000b0340201c201c2f01064102746a41ec036a280200211c201d417f6a221d0d000b0b201c2f010621012002201e3602a801200220013602a401200241003602a0012002201c36029c01200241003602980120024200370390012002200436028c012002410036028801200241f0016a20024188016a10f701024020022802f0014101470d00202941306a211c0340200241900a6a41286a200341286a280200360200200b200341206a2902003703002006200341186a2204290200370300202a200341106a2201290200370300202b200341086a2205290200370300200220032902003703900a200241c0016a41186a2004290000370300200241c0016a41106a2001290000370300200241c0016a41086a2005290000370300200220032900003703c001200241e0016a41086a200b41086a2802003602002002200b2902003703e001200241b0016a201c200241c0016a200241e0016a108102024020022802b001450d0020022802b4012204450d0020022802b801450d002004102c0b200241f0016a20024188016a10f70120022802f0014101460d000b0b20024188016a10f4010c010b202941386a212b202941306a212a202928023821262029280230210402400240202941346a28020022050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b200220263602900220024100360288022002410036028002200242003703f801200220013602f401200241003602f0012002200436028402200220042f010636028c02200241f0016a10f401202941286a201437030020292016370320202941106a2015370300202920173703082029201b37031820292007370300202a201d360204202a201c360200202b201e3602002029201a3a003c2029413d6a2002290368370000202941c5006a2025290300370000202941cd006a2024290300370000202941d5006a2023290300370000202920183b015e202920193a005d0b200241f0016a200210f20120022903900222074202520d000b0b200210f9012000200028020041016a360200200241f00c6a24000f0b41f089c6004110200241f0016a41f882c100103b000bf41801187f230041d0116b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e00010db051a024002400240024020032f01062201410b490d00200241b0036a410041e00210da051a20024198066a410041a00810da051a41880b102a2209450d03200941003b010620094100360200200941086a200241b0036a41e00210db052101200941e8026a20024198066a41a00810db052106200220032f00c8013b01ac032002200341ca016a2d00003a00ae03200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210a200341cf016a280000210b200341d3016a280000210c200341d7016a280000210d20024198066a200341a8076a41e00010db051a2001200341e8016a20032f010641796a220041057410db052101200620034188086a200041e0006c10db052106200341063b0106200920003b0106200220022f01ac033b019403200220022d00ae033a0096032002200229039803370380032002200229009d0337008503200241b0036a20024198066a41e00010db051a0240024020044107490d00200441057420016a41c07e6a2001200441796a22074105746a2201200041ffff037120076b41057410dc051a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200441e0006c20066a220041c07b6a200041e07a6a220e200941066a22002f010020076b41e0006c10dc051a200e200241a0026a41e00010db051a0c010b200341086a20044105746a220141206a2001200341066a22002f010020046b41057410dc051a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220e41e0006a200e20002f010020046b41e0006c10dc051a200e200241a0026a41e00010db051a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e00010db051a2002411c6a41026a220f20042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e00010db051a20032802002206450d0120032f0104211020024198066a410272211103402002419c026a41026a2212200f2d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e00010db051a201041ffff0371210702400240024020062f01062203410b490d002011410041b20b10da051a41b80b102a2201450d0720014100360200200141046a20024198066a41b40b10db051a200220062f00c8013b01ac032002200641ca016a2d00003a00ae03200220062900db01370398032002200641e0016a29000037009d03200641cb016a2800002113200641cf016a2800002114200641d3016a2800002115200641d7016a280000211620024198066a200641a8076a41e00010db051a200141086a200641e8016a20062f0106220041796a220341057410db052117200141e8026a20064188086a200341e0006c10db052118200141880b6a200641a40b6a2000417a6a220841027410db052119200641063b0106200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024198066a41e00010db051a200220022d00ae0322033a009603200220022f01ac0322003b0194032002200229009d033700850320022002290398033703800320024194066a41026a220820033a0000200220003b01940620022002290380033703800120022002290085033700850120024198066a200241b0036a41e00010db051a201041ffff037122004107490d0120172007417a6a22044105746a2017200741796a22034105746a220020012f010620036b41057410dc051a200041186a200229008d023700002000200d36000f2000200c36000b2000200b3600072000200a360003200041026a20122d00003a0000200020022f019c023b00002000200229038802370013200741e0006c20186a220041c07b6a200041e07a6a220020012f010620036b41e0006c10dc051a2000200241a0026a41e00010db051a200120012f010641016a22003b01062007410274220a20196a416c6a201920044102746a2210200041ffff0371220720046b41027410dc051a2010200936020020072004490d022001200a6a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020032007490d000c030b0b200641086a2200200741016a22044105746a200020074105746a2200200320076b220141057410dc051a2000200d36000f2000200c36000b2000200b3600072000200a360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002006200741e0006c6a220041c8036a200041e8026a2200200141e0006c10dc051a2000200241a0026a41e00010db051a2006200341016a22033b01062007410274200641880b6a22006a41086a200020044102746a2200200341ffff037120046b41027410dc051a20002009360200201041ffff037120062f010622034f0d05200920043b010420092006360200200420034f0d052003417f6a210120062004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042006360200200041046a21002001200341016a2203470d000c060b0b200641086a2203200741016a22044105746a200320074105746a220320062f0106221020076b221941057410dc051a2003200d36000f2003200c36000b2003200b3600072003200a360003200341026a20122d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200641e8026a200741e0006c6a220341e0006a2003201941e0006c10dc051a2003200241a0026a41e00010db051a2006201041016a22033b010620074102742219200641880b6a22106a41086a201020044102746a2210200341ffff037120046b41027410dc051a20102009360200200020062f010622044f0d00200620196a418c0b6a2103034020032802002200200741016a22073b010420002006360200200341046a210320042007470d000b0b20024184026a41026a220320082d00003a0000200220022f0194063b01840220022002290380013703f00120022002290085013700f50120024190016a20024198066a41e00010db051a200f20032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e00010db051a0240200628020022030d002013210a2016210d2015210c2014210b200121090c030b20062f010421102013210a2016210d2015210c2014210b20032106200121090c000b0b200320044105746a220041286a200041086a2210200120046b41057410dc051a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000201020022903203700002003200441e0006c6a220041c8036a200041e8026a220e20032f010620046b41e0006c10dc051a200e200241a0026a41e00010db051a200320032f010641016a3b01060c010b20024198066a410272410041b20b10da051a41b80b102a2203450d0120034100360200200341046a20024198066a41b40b10db051a2003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200320032f010622044105746a220041086a20022f011c3b00002000410a6a2002411c6a41026a2d00003a0000200041176a200d360000200041136a200c3600002000410f6a200b3600002000410b6a200a3600002000411b6a2002290308370000200041206a200229000d3700002003200441e0006c6a41e8026a200241206a41e00010db051a200341880b6a200441016a22004102746a2009360200200320003b0106200920003b0104200920033602000b200241d0116a2400200e0f0b1033000b9d1e03087f037e127f23004180076b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a290000370300200420022900003703600240024002402001280200220541d0e1c100460d00200128020421060c010b41002106200441e8026a410041e00210da051a200441c0016a410041840110da051a41ec03102a2205450d01200541003b010620054100360200200541086a200441e8026a41e00210db051a200541e8026a200441c0016a41840110db051a20014100360204200120053602000b024002400340200541086a2107200541066a210820052f0106220941057421024100210a0240024003402002450d01200441e0006a2007412010dd05220b450d02200241606a2102200a41016a210a200741206a2107200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200520094102746a41ec036a28020021050c010b0b200441e8026a41086a22022005200a410c6c6a220741f0026a220a2802003602002004200741e8026a22072902003703e80220072003290200370200200a200341086a280200360200200441c0016a41086a20022802002202360200200420042903e802220c3703c0012000410c6a20023602002000200c370204200041013602000c010b200441086a41186a220b200441e0006a41186a2202290300370300200441086a41106a200441e0006a41106a2207290300220c370300200441086a41086a200441e0006a41086a220a290300220d37030020042004290360220e3703082001200128020841016a3602082007200c370300200a200d3703002002200b2903003703002004200e370360200441d8026a41086a2206200341086a280200360200200420032902003703d80202400240024020082f01002203410b490d00200441e8026a410041e00210da051a200441c0016a410041840110da051a41ec03102a220f450d04200f41003b0106200f4100360200200f41086a200441e8026a41e00210db052107200f41e8026a200441c0016a41840110db05210a200441e8026a41086a220b200541b8036a280200360200200420052900db013703a8012004200541e0016a2900003700ad01200420052902b0033703e802200420052f00c8013b01bc012004200541ca016a2d00003a00be01200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a20052f010641796a220241057410db052107200a200541bc036a2002410c6c10db05210a200541063b0106200f20023b0106200420042f01bc013b01a401200420042d00be013a00a601200420042903a8013703c001200420042900ad013700c501200441286a41086a200b280200360200200420042903e8023703280240024020094107490d00200941057420076a41c07e6a2007200941796a220b4105746a2207200241ffff0371200b6b41057410dc051a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a290300370000200720042903603700002009410c6c200a6a220241b87f6a200241ac7f6a2202200f41066a22082f0100200b6b410c6c10dc051a200241086a200441d8026a41086a280200360200200220042903d8023702000c010b200541086a20094105746a220241206a200220082f010020096b41057410dc051a200241186a200441e0006a41186a290300370000200241106a200441e0006a41106a290300370000200241086a200441e0006a41086a29030037000020022004290360370000200541e8026a2009410c6c6a2202410c6a200220082f010020096b410c6c10dc051a200241086a200441d8026a41086a280200360200200220042903d8023702000b200820082f010041016a3b010020044198016a41026a220220042d00a6013a0000200441c8026a41086a2214200441286a41086a280200360200200420042f01a4013b019801200420042903c001370350200420042900c501370055200420042903283703c8022004413c6a41026a221520022d00003a0000200420042f0198013b013c2004200429005537002d20042004290350370328200441c0006a41086a22162014280200360200200420042903c80237034020052802002206450d0120052f01042103200441e8026a4102722117034020044194016a41026a221820152d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a41086a221920162802003602002004200429034037039801200341ffff0371210502400240024020062f01062202410b490d002017410041960410da051a419c04102a220b450d08200b4100360200200b41046a200441e8026a41980410db051a200420062f00c8013b01bc012004200641ca016a2d00003a00be012004200641db016a2900003703a8012004200641e0016a2900003700ad01200641cb016a280000211a200641cf016a280000211b200641d3016a280000211c200641d7016a280000211d200441e8026a41086a221e200641b8036a2802003602002004200641b0036a2902003703e802200b41086a200641e8016a20062f0106220741796a220241057410db05211f200b41e8026a200641bc036a2002410c6c10db052120200b41ec036a20064188046a2007417a6a220941027410db052108200641063b0106200b20023b010602402009450d00410021022008210703402007280200220a20023b0104200a200b360200200741046a21072009200241016a2202470d000b0b200441d8026a41086a2202201e280200360200200420042d00be0122073a00a601200420042f01bc01220a3b01a401200420042903a8013703c001200420042900ad013700c501200420042903e8023703d802200441c4026a41026a220920073a00002004200a3b01c402200420042903c0013703e802200420042900c5013700ed0220142002280200360200200420042903d8023703c802200341ffff037122074107490d01201f2005417a6a220a4105746a201f200541796a22024105746a2207200b2f010620026b41057410dc051a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20182d00003a0000200720042f0194013b0000200720042903603700132005410c6c20206a220741b87f6a200741ac7f6a2207200b2f0106220320026b410c6c10dc051a200741086a20192802003602002007200429039801370200200b200341016a22073b01062005410274221020086a416c6a2008200a4102746a2203200741ffff03712205200a6b41027410dc051a2003200f3602002005200a490d02200b20106a41d4036a210703402007280200220a200241016a22023b0104200a200b360200200741046a210720022005490d000c030b0b200641086a2207200541016a220a4105746a200720054105746a2207200220056b41057410dc051a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20044194016a41026a2d00003a0000200720042f0194013b00002007200429036037001320062005410c6c6a220241f4026a200241e8026a220720062f0106220b20056b410c6c10dc051a200241f0026a20044198016a41086a28020036020020072004290398013702002006200b41016a22023b01062005410274200641ec036a22076a41086a2007200a4102746a2207200241ffff0371220b200a6b41027410dc051a2007200f360200200341ffff0371200b4f0d052006200a417f6a22024102746a41f0036a210703402007280200220a200241016a22023b0104200a2006360200200741046a21072002200b490d000c060b0b200641086a2202200541016a22034105746a200220054105746a220220062f010620056b41057410dc051a200241186a20042900653700002002201336000f2002201236000b2002201136000720022010360003200241026a20182d00003a0000200220042f0194013b000020022004290360370013200641e8026a2005410c6c6a2202410c6a200220062f0106220a20056b410c6c10dc051a200241086a201928020036020020022004290398013702002006200a41016a22023b010620054102742210200641ec036a220a6a41086a200a20034102746a2208200241ffff0371220a20036b41027410dc051a2008200f3602002007200a4f0d00200620106a41f0036a2102034020022802002207200541016a22053b010420072006360200200241046a2102200a2005470d000b0b20044190016a41026a220220092d00003a000020044180016a41086a22072014280200360200200420042f01c402220a3b019001200420042903e802370350200420042900ed02370055200420042903c80237038001201520022d00003a00002004200a3b013c2004200429005537002d200420042903503703282016200728020036020020042004290380013703400240200628020022020d00201a2110201d2113201c2112201b2111200b210f0c030b20062f01042103201a2110201d2113201c2112201b211120022106200b210f0c000b0b200520094105746a220b41286a200b41086a2201200320096b41057410dc051a200b41206a2002290300370000200b41186a2007290300370000200b41106a200a2903003700002001200429036037000020052009410c6c6a220241f4026a200241e8026a220720052f010620096b410c6c10dc051a200241f0026a2006280200360200200720042903d802370200200520052f010641016a3b01060c010b200441e8026a410272410041960410da051a419c04102a2202450d0220024100360200200241046a200441e8026a41980410db051a2002200128020022073602ec03200120023602002001200128020441016a360204200741003b010420072002360200200220022f0106220a4105746a220741086a20042f013c3b00002007410a6a2004413c6a41026a2d00003a0000200741176a2013360000200741136a20123600002007410f6a20113600002007410b6a20103600002007411b6a2004290328370000200741206a200429002d3700002002200a410c6c6a220741f0026a200441c0006a41086a280200360200200741e8026a2004290340370200200241ec036a200a41016a22074102746a200f360200200220073b0106200f20073b0104200f20023602000b200041003602000b20044180076a24000f0b1033000bc50506047f017e017f017e037f017e23004180016b22042400024002402001a74101470d002000427f2000290300220120027c220220022001542205200041086a2206290300220120037c2005ad7c220220015420022001511b22051b3703002006427f200220051b3703000c010b20014201520d00200441c0006a41186a22064200370300200441c0006a41106a22074200370300200441c0006a41086a2205420037030020044200370340200441f0006a41086a2200418be9c500ad428080808080018422081002220941086a290000370300200420092900003703702009102c2005200029030037030020042004290370220137036020042001370340200041c9b5c000ad4280808080d00184220a1002220941086a290000370300200420092900003703702009102c200720042903702201370300200441206a41086a220b2005290300370300200441206a41106a220c2001370300200441206a41186a220d20002903003703002004200137036020042004290340370320200441086a200441206a4120109e01200441086a41106a29030021012004290310210e2004280208210920064200370300200742003703002005420037030020044200370340200020081002220741086a290000370300200420072900003703702007102c20052000290300370300200420042903702208370360200420083703402000200a1002220741086a290000370300200420072900003703702007102c200620002903002208370300200b2005290300370300200c2004290370220a370300200d20083703002004200a370360200420042903403703202004427f2001420020091b220120037c200e420020091b220320027c22082003542200ad7c22022000200220015420022001511b22001b3703482004427f200820001b370340200441206aad4280808080800484200441c0006aad428080808080028410010b20044180016a24000ba90603067f017e077f230041106b2203240002400240024002400240200241046a2204417f4c0d000240024020040d00410121050c010b2004102a2205450d040b2003410036020820032004360204200320053602002002200310670240024020032802042206200328020822046b2002490d00200328020021070c010b200420026a22052004490d05200641017422082005200820054b1b22054100480d050240024020060d002005102a21070c010b200328020020062005102e21070b2007450d042003200536020420032007360200200521060b200720046a2001200210db051a200420026a2201ad4220862007ad84101d220229000021092002102c20032009370300200720016a210a200141086a220b20014f0d01200341086a210c20032108410021024100210b410121042007210d41002105034020024101742101200c200841016a220e6b210f034020082d0000210802402002200b470d00200f210b024002400240200541ff01710e03010200010b200a200d6b210b0c010b417f200f200a200d6b6a220b200b200f491b210b0b2002417f200b41016a22102010200b491b6a220b2002490d072001200b2001200b4b1b220b4100480d070240024020020d00200b102a21040c010b20042002200b102e21040b2004450d060b200420026a20083a0000024002400240024002400240200541ff01710e03010300010b200a200d460d010c040b0240200e200c460d00410021050c030b200a200d470d030b200241016a21020c070b41012105200e200c470d00200241016a21020c060b200241016a2102200e21080c020b200241016a210241022105200141026a2101200d220841016a210d0c000b0b0b103a000b410121040240200b450d00200b4100480d03200b102a2204450d020b410021020340200420026a200320026a2d00003a0000200241016a22024108470d000b024020010d00410821020c010b200420026a2105410021020340200520026a200720026a2d00003a00002001200241016a2202470d000b200a20076b41086a21020b200020023602082000200b3602042000200436020002402006450d002007102c0b200341106a24000f0b1033000b1035000bbd0201057f230041c0006b22022400200241206a41086a220341e5d6c500ad42808080808002841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341affbc000ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2001109f01024041c000102a22040d001033000b200420022903003700002004200229031037001020042002290020370020200042c0808080800837020420002004360200200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241c0006a24000b130020004101360204200041e883c1003602000b3400200041ecddc50036020420004100360200200041146a4107360200200041106a41b487c100360200200041086a42073702000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241003600000b130020004101360204200041f493c1003602000bfa0101057f230041106b22022400024002404111102a2203450d002002421137020420022003360200410d200210670240024020022802042204200228020822036b410d490d002003410d6a2105200228020021040c010b2003410d6a22052003490d02200441017422062005200620054b1b22064100480d020240024020040d002006102a21040c010b200228020020042006102e21040b2004450d0120022006360204200220043602000b20022005360208200420036a220341002900b6fb40370000200341056a41002900bbfb4037000020002002290300370200200041086a2002280208360200200241106a24000f0b1033000b1035000bfb1206057f027e047f017e047f027e23004180016b22012400200141286a41186a4200370300200141286a41106a22024200370300200141286a41086a2203420037030020014200370328200141186a41086a220441ecddc500ad4280808080f000841002220541086a290000370300200120052900003703182005102c2003200429030037030020012001290318370328200441c9f8c200ad4280808080a001841002220541086a290000370300200120052900003703182005102c200220012903182206370300200141d8006a41086a2003290300370300200141d8006a41106a2006370300200141d8006a41186a20042903003703002001200637030820012001290328370358200141286a200141d8006a412010d001200129022c4200200128022822041b2207422088a74105742103410021052004410120041b22082104024002400240024002400340024020030d00410221090c030b20002004460d0120042000412010dd052102200541016a2105200341606a2103200441206a210420020d000b20024541016a41017120056a417f6a21050b200141286a41186a4200370300200141286a41106a220a4200370300200141286a41086a2203420037030020014200370328200141186a41086a220441ecddc500ad4280808080f000841002220041086a290000370300200120002900003703182000102c20032004290300370300200120012903182206370308200120063703282004418cdec500ad4280808080a002841002220041086a290000370300200120002900003703182000102c200a20012903182206370300200141d8006a41086a2003290300370300200141d8006a41106a2006370300200141d8006a41186a20042903003703002001200637030820012001290328370358200141286a200141d8006a10960120012802282203410420031b210b410021040240024002400240200129022c420020031b2206422088220ca7220d41014b0d00200d0e020201020b200d2103034020042003410176220020046a22022005200b20024102746a280200491b2104200320006b220341014b0d000b0b4100210902402005200b20044102746a2802002203470d004100210e0c020b2004200520034b6a21040b200141286a41186a220f4200370300200141286a41106a22104200370300200141286a41086a2200420037030020014200370328200141186a41086a220341ecddc500ad4280808080f000841002220241086a290000370300200120022900003703182002102c2000200329030037030020012001290318220c3703082001200c370328200341c9f8c200ad4280808080a001841002220241086a290000370300200120022900003703182002102c200141086a41086a2003290300220c370300200120012903182211370308200a2011370000200a41086a200c370000200141d8006a41086a2000290300370300200141d8006a41106a2010290300370300200141d8006a41186a200f29030037030020012001290328370358200141186a200141d8006aad42808080808004841003108d01024002400240024020012802182200450d00200128021c21022001200328020036022c200120003602282001200141286a107520012802000d01200128020421030c020b2001420037022c20014101360228200141286a107821030c020b410021030b2002450d002000102c0b20032003418094ebdc036e22004180ec94a37c6c6aad4280fd87d1007e2212428094ebdc038021112004200d4b0d020240200d2006a7470d00200d41016a2203200d490d05200d4101742202200320032002491b220341ffffffff03712003470d05200341027422024100480d0502400240200d0d002002102a210b0c010b200b200d4102742002102e210b0b200b450d042003ad21060b200b20044102746a220341046a2003200d20046b41027410dc051a200320053602004101210e200642ffffffff0f83200d41016a2204ad220c422086842106200420004180fd87d1006c2011a76a201220114280ec94a37c7e7c4280cab5ee01566a4b21090b200141286a41186a22024200370300200141286a41106a220d4200370300200141286a41086a2203420037030020014200370328200141186a41086a220441ecddc500ad4280808080f000841002220041086a290000370300200120002900003703182000102c20032004290300370300200120012903182211370308200120113703282004418cdec500ad4280808080a002841002220041086a290000370300200120002900003703182000102c200141086a41086a20042903002211370300200120012903182212370308200a2012370000200a41086a2011370000200141d8006a41086a2003290300370300200141d8006a41106a200d290300370300200141d8006a41186a20022903003703002001200129032837035802400240200b0d00200141d8006aad428080808080048410050c010b2001410036023020014201370328200ca72203200141286a10670240024020030d002001280230210a200128022c210d200128022821030c010b4100200128023022046b2100200b20034102746a2110200128022c210d200b210203402002280200210f02400240200d20006a4104490d00200128022821030c010b200441046a22032004490d07200d410174220a2003200a20034b1b220a4100480d0702400240200d0d00200a102a21030c010b2001280228200d200a102e21030b2003450d062001200a36022c20012003360228200a210d0b2001200441046a220a360230200320046a200f3600002000417c6a2100200a21042010200241046a2202470d000b0b2006a72104200141d8006aad4280808080800484200aad4220862003ad8410010240200d450d002003102c0b2004450d00200b102c0b200e450d00200141d8006a41086a22042005ad37030020014102360258200141286a200141d8006a108f01200141236a2203200141286a41086a22022802003600002001200129032837001b200141286a410c6a2001411f6a2200290000370000200141c6a4b9da04360029200141023a00282001200129001837002d200141286a109001200141013602282001200536022c200141d8006a200141286a108b02200320042802003600002001200129035837001b200141d8006a410c6a2000290000370000200141c28289aa04360059200141023a00582001200129001837005d200141d8006a10900120012802280d002002280200450d00200128022c102c0b02402007a7450d002008102c0b20014180016a240020090f0b41ecb3c000411e41acfec5001036000b1033000b1035000b9a0403047f017e027f230041106b220224002002410036020820024201370300200128020021034101102a2104024002400240024020034101460d002004450d02200242818080801037020420022004360200200441013a0000200128020421032001410c6a28020022042002106702402004450d002003200441286c6a2105034020032002109101200341206a29030021060240024020022802042207200228020822046b4108490d00200228020021070c010b200441086a22082004490d06200741017422042008200420084b1b22044100480d060240024020070d002004102a21070c010b200228020020072004102e21070b2007450d052002200436020420022007360200200228020821040b2002200441086a360208200720046a20063700002005200341286a2203470d000b0b200141106a200210ba020c010b2004450d01200242818080801037020420022004360200200441023a0000200128020421070240024020022802042203200228020822046b4104490d00200228020021030c010b200441046a22082004490d03200341017422052008200520084b1b22084100480d030240024020030d002008102a21030c010b200228020020032008102e21030b2003450d0220022008360204200220033602000b2002200441046a360208200320046a20073600000b20002002290300370200200041086a200241086a280200360200200241106a24000f0b1033000b1035000be31104047f017e037f047e230041b0056b22022400200241206a2001107502400240024002400240024020022802200d00024020022802242203450d0003402003417f6a22030d000b0b20012802042203450d01200128020022042d0000210520012003417f6a3602042001200441016a36020002400240200541ff00714104470d0020054118744118754100480d01420221060c060b200042033703680c060b200241c0036a2001108d0220022d00c0034102460d0220024198036a41206a200241c0036a41206a28020036020020024198036a41186a200241c0036a41186a29030037030020024198036a41106a200241c0036a41106a29030037030020024198036a41086a200241c0036a41086a290300370300200220022903c0033703980320012802042205450d02200128020022042d0000210320012005417f6a3602042001200441016a360200200341024b0d02024002400240024020030e03000102000b41002103200241003a00c0022005417f6a2107417e21080340024020072003470d00200341ff0171450d07200241003a00c0020c070b20024180026a20036a200420036a220941016a2d00003a00002001200520086a3602042001200941026a3602002002200341016a22093a00c0022008417f6a210820092103200941c000470d000b200241f0046a41386a20024180026a41386a2903002206370300200241f0046a41306a20024180026a41306a290300220a370300200241f0046a41286a20024180026a41286a290300220b370300200241f0046a41206a20024180026a41206a290300220c370300200241f0046a41186a20024180026a41186a290300220d370300200241a8046a41086a20024180026a41086a290300370300200241a8046a41106a20024180026a41106a290300370300200241a8046a41186a200d370300200241a8046a41206a200c370300200241a8046a41286a200b370300200241a8046a41306a200a370300200241a8046a41386a200637030020022002290380023703a8042009417f7320056a2105200420096a41016a2104410021030c020b41002103200241003a00c0022005417f6a2107417e21080340024020072003470d00200341ff0171450d06200241003a00c002420221060c070b20024180026a20036a200420036a220941016a2d00003a00002001200520086a3602042001200941026a3602002002200341016a22093a00c0022008417f6a210820092103200941c000470d000b200241f0046a41386a20024180026a41386a2903002206370300200241f0046a41306a20024180026a41306a290300220a370300200241f0046a41286a20024180026a41286a290300220b370300200241f0046a41206a20024180026a41206a290300220c370300200241f0046a41186a20024180026a41186a290300220d370300200241a8046a41086a20024180026a41086a290300370300200241a8046a41106a20024180026a41106a290300370300200241a8046a41186a200d370300200241a8046a41206a200c370300200241a8046a41286a200b370300200241a8046a41306a200a370300200241a8046a41386a200637030020022002290380023703a8042009417f7320056a210541012103200420096a41016a21040c010b41002103200241003a00c1022005417f6a2107417e21080340024020072003470d00200341ff0171450d05200241003a00c102420221060c060b20024180026a20036a200420036a220941016a2d00003a00002001200520086a3602042001200941026a3602002002200341016a22093a00c1022008417f6a210820092103200941c100470d000b200241a8046a20024180026a41c10010db051a2009417f7320056a2105200420096a41016a2104410221030b200241e7036a200241a8046a41c10010db051a2005450d022004310000210b20012005417f6a22083602042001200441016a36020002400240200b50450d00420021060c010b2008450d032004310001210c20012005417e6a3602042001200441026a3602004202200b420f8386220a4204540d0342012106200c420886200b84420488200a420c88220b4201200b4201561b7e220b200a5a0d030b200241186a2001107520022802180d02200228021c210520022001108e022002290300a70d02200241106a290300210d2002290308210c200241f0046a41206a20024198036a41206a280200360200200241f0046a41186a20024198036a41186a290300370300200241f0046a41106a20024198036a41106a290300370300200241f0046a41086a20024198036a41086a29030037030020022002290398033703f00420024180026a200241e7036a41c10010db051a200220022f0196033b01fe010c030b200042033703680c040b200042033703680c030b420221060b200241d8016a41086a2204200241f0046a41086a290300370300200241d8016a41106a2208200241f0046a41106a290300370300200241d8016a41186a2209200241f0046a41186a290300370300200241d8016a41206a2207200241f0046a41206a280200360200200220022903f0043703d80120024197016a20024180026a41c10010db051a200220022f01fe013b019401024020064202520d00200042033703680c020b200241f0006a41206a2007280200360200200241f0006a41186a2009290300370300200241f0006a41106a2008290300370300200241f0006a41086a2004290300370300200220022903d8013703702002412f6a20024197016a41c10010db051a200220022f0194013b012c0b20024180026a2001108f0202402002280280024118460d0020002002290370370300200020033a0024200041206a200241f0006a41206a280200360200200041186a200241f0006a41186a290300370300200041106a200241f0006a41106a290300370300200041086a200241f0006a41086a290300370300200041256a2002412f6a41c10010db051a200020022f012c3b016620004188016a200d37030020004180016a200c37030020004190016a2005360200200041f8006a200b3703002000200a3703702000200637036820004198016a20024180026a41900110db051a0c010b200042033703680b200241b0056a24000bf40601067f230041f0006b21020240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204410121072001200441016a360200200541f001490d0a200541847e6a220541034b0d0420050e0401020803010b200041023a00000f0b20064102490d0320042f0001210520012003417d6a3602042001200441036a360200200541ef014b0d04200041023a00000f0b20064104490d042004280001210520012003417b6a3602042001200441056a36020041012107200541ffff034b0d07200041023a00000f0b41002105200241003a00682003417f6a21062003417e6a210302400340024020062005470d000240200541ff0171450d00200241003a00680b410121010c020b200241c8006a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00682003417f6a21032007210520074120470d000b200241c6006a20022d004a3a0000200241306a200241d7006a290000370300200241386a200241df006a290000370300200241c0006a200241e7006a2d00003a0000200220022f01483b01442002200229004f370328200228004b2105410021010b200241246a41026a2203200241c4006a41026a2d00003a0000200241086a41086a2207200241286a41086a290300370300200241086a41106a2204200241286a41106a290300370300200241086a41186a2206200241286a41186a2d00003a0000200220022f01443b0124200220022903283703082001450d05200041023a00000f0b200041023a00000f0b200041023a00000f0b410121070c030b200041023a00000f0b0240200641044f0d00200041023a00000f0b200041023a000020012003417b6a3602042001200441056a3602000f0b200241286a41026a20032d00003a0000200241c8006a41086a2007290300370300200241c8006a41106a2004290300370300200241c8006a41186a20062d00003a0000200220022f01243b012820022002290308370348410021070b200020073a0000200020022f01283b0001200041046a2005360200200041086a2002290348370200200041036a2002412a6a2d00003a0000200041106a200241c8006a41086a290300370200200041186a200241c8006a41106a290300370200200041206a200241c8006a41186a2802003602000bde0506067f017e017f017e017f017e230041206b220224000240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200024002400240200541037122074103460d0002400240024020070e03000102000b2005410276ad21080c040b410121072006450d0220042d0001210620012003417e6a3602042001200441026a3602002006410874200572220141ffff0371418002490d02200141fcff0371410276ad21080c030b4101210720064103490d01200441036a2d0000210620042f0001210920012003417c6a3602042001200441046a3602002009200641107472410874200572220141808004490d012001410276ad21080c020b024020054102762209410c4b0d0002400240024020090e0d00030303010303030303030302000b20064104490d052004350001210820012003417b6a3602042001200441056a36020020084280808080045421074200210a0c060b20064108490d04200429000121082001200341776a3602042001200441096a3602002008428080808080808080015421074200210a0c050b20064110490d03200441096a290000210a2004290001210820012003416f6a3602042001200441116a360200200a428080808080808080015421070c040b200941046a220641104b0d022003417e6a2103200441026a21044100210541012107200241186a210b420021084200210a03402003417f460d01200241106a2004417f6a3100004200200541037441f8007110de0520012003360204200120043602002003417f6a2103200441016a2104200b290300200a84210a20022903102008842108200541016a220541ff01712006490d000b2002427f427f41e80020094103746b41f8007110df052008200229030058200a200241086a290300220c58200a200c511b21070c030b0c020b4200210a410021070c010b410121070b20002008370308200041106a200a37030020002007ad370300200241206a24000bd28f010b077f017e037f027e017f057e057f017e057f027e027f230041f0096b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541174b0d1920050e180102030405060708090a0b0c0d0e0f101112131415161718010b200041183602000c360b2006450d3420042d0001210620012003417e6a22073602042001200441026a360200200641064b0d34410121080240024002400240024002400240024020060e0707000102030406070b200241d0076a2001107720022802d0072205450d3b20022902d4072109410221080c060b20074108490d3a200429000221092001200341766a36020420012004410a6a360200410321080c050b200241d0076a2001107720022802d0072205450d3920022902d4072109410421080c040b200241086a2001107520022802080d38200128020441186e220a41186c2204417f4c0d25200228020c210b0240024020040d00410421050c010b2004102a2205450d270b0240200b450d004100210841002104410021060340200241b0046a200110770240024020022802b0042207450d0020022902b4042109200241d0076a2001107720022802d0070d012009a7450d002007102c0b02402006450d002005210103400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141186a2101200441686a22040d000b0b200a0d040c3b0b200641016a210320022802d807210c20022903d007210d02402006200a470d0020082003200820034b1b220aad42187e220e422088a70d2a200ea7220f4100480d2a0240024020060d00200f102a21050c010b20052004200f102e21050b2005450d290b200520046a22062007360200200641146a200c3602002006410c6a200d370200200641046a2009370200200841026a2108200441186a210420032106200b2003470d000b0b2005450d38200bad422086200aad842109410521080c030b200241106a2001107520022802100d372001280204410c6e220c410c6c2204417f4c0d242002280214210a0240024020040d00410421050c010b2004102a2205450d260b02400240200a450d004100210841002104410021060340200241d0076a2001107720022802d007450d02200641016a2103200241b0046a41086a2207200241d0076a41086a280200360200200220022903d0073703b00402402006200c470d0020082003200820034b1b220cad420c7e2209422088a70d2a2009a7220b4100480d2a0240024020060d00200b102a21050c010b20052004200b102e21050b2005450d290b200520046a220620022903b004370200200641086a2007280200360200200841026a21082004410c6a210420032106200a2003470d000b0b2005450d38200aad422086200cad842109410621080c030b02402006450d002005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200441746a22040d000b0b200c450d370b2005102c0c360b200241d0076a2001107720022802d0072205450d3520022902d4072109410721080b20004100360200200041106a20093702002000410c6a2005360200200041086a2008360200200041186a200241e0086a41f80010db051a0c350b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241186a2001107520022802180d0020012802044190016e22074190016c2204417f4c0d21200228021c210c0240024020040d00410821080c010b2004102a2208450d230b02400240200c450d004100210641002104410021050340200241e0086a2001108f0220022802e0084118460d02200541016a2103200241d0076a200241e0086a41900110db051a024020052007470d0020062003200620034b1b2207ad4290017e2209422088a70d272009a7220a4100480d270240024020050d00200a102a21080c010b20082004200a102e21080b2008450d260b200820046a200241d0076a41900110db051a200641026a210620044190016a210420032105200c2003470d000b0b2008450d012000200836020420004101360200200041086a200cad4220862007ad84370200200041106a200241b0046a41800110db051a0c360b02402005450d002008210103402001107320014190016a2101200441f07e6a22040d000b0b2007450d002008102c0b200041183602000c340b02402006450d0020012003417e6a3602042001200441026a3602000b200041183602000c330b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241206a200110c2022002290320a70d002002290328210920004103360200200041086a2009370300200041106a200241e0086a41800110db051a0c330b200041183602000c320b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241d0076a200110800120022802d00722010d160b200041183602000c310b02402006450d0020012003417e6a3602042001200441026a3602000b200041183602000c300b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541034b0d00024002400240024020050e0400010203000b200241d0076a2001108d0220022d00d0074102460d03200241b0046a41086a2203200241dc076a290200370300200241b0046a41106a2205200241e4076a290200370300200241b0046a41186a2206200241ec076a290200370300200220022902d4073703b00420022802d0072104200241306a2001108e022002290330a70d03200241306a41106a29030021092002290338210d20024190046a41186a200629030037030020024190046a41106a200529030037030020024190046a41086a2003290300370300200220022903b00437039004410121010c310b200241d0076a2001108d0220022d00d0074102460d02200241b8046a200241dc076a290200370300200241b0046a41106a200241e4076a290200370300200241c8046a200241ec076a290200370300200220022902d4073703b00420022802d0072104200241e0006a2001108e022002290360a70d02200241e0006a41106a29030021092002290368210d200241c8006a2001108e022002290348a70d02200241c8006a41106a29030021102002290350211120024190046a41186a200241b0046a41186a29030037030020024190046a41106a200241b0046a41106a29030037030020024190046a41086a200241b0046a41086a290300370300200220022903b00437039004410221010c300b200241d0076a2001108d0220022d00d0074102460d01200241c8066a41086a200241dc076a290200370300200241c8066a41106a200241e4076a290200370300200241c8066a41186a200241ec076a290200370300200220022902d4073703c80620022802d0072104200241d0076a2001108d0220022d00d0074102460d01200241b0046a41206a2203200241d0076a41206a280200360200200241b0046a41186a200241d0076a41186a290300370300200241b0046a41106a200241d0076a41106a290300370300200241b0046a41086a200241d0076a41086a290300370300200220022903d0073703b004200241f8006a2001108e022002290378a70d01200241f8006a41106a29030021122002290380012113200241c8056a41186a200241c8066a41186a2903002209370300200241c8056a41106a200241c8066a41106a290300220d37030020024190046a41086a200241c8066a41086a29030037030020024190046a41106a200d37030020024190046a41186a2009370300200220022903c80637039004200241b0046a41086a2903002109200241b0046a41186a2903002110200241b0046a41106a29030021112003350200211420022903b004210d410321010c2f0b200241d0076a2001108d0220022d00d0074102460d00200241b0046a41086a2203200241dc076a290200370300200241b0046a41106a2205200241e4076a290200370300200241b0046a41186a2206200241ec076a290200370300200220022902d4073703b00420022802d007210420024190016a2001108e02200229039001a70d0020024190016a41106a2903002109200229039801210d20024190046a41086a200329030037030020024190046a41106a200529030037030020024190046a41186a2006290300370300200220022903b00437039004410421010c2e0b200041183602000c2f0b2006450d2b20042d0001210520012003417e6a22153602042001200441026a3602002005410f4b0d2b4104211602400240024002400240024002400240024002400240024002400240024020050e1000010239030405060708090a0b0c0d0e000b200241d0076a2001108d0220022d00d0074102460d392002200241eb076a2f00003b01b004200241dc076a290200210d200241e7076a2800002117200241e6076a2d00002118200241e5076a2d00002119200241e4076a2d0000210f200241ed076a2d0000210b200241ee076a2d0000210c200241ef076a2d00002107200241f0076a280200210a20022902d407210920022802d0072106200241a8016a2001108e0220022903a801a70d3920012802042204450d39200241b8016a290300211a20022903b001210e200128020022032d0000210820012004417f6a360204410121162001200341016a360200200841024b0d39200220022f01b0043b01c6050c380b200241c0016a2001108e0220022903c001a70d38200241d0016a290300210d20022903c8012109200220022f01c8063b01c605200241d9066a290000211a20022900d106210e20022d00ca06210b20022d00cb06210c20022d00cc06210720022800cd06210a410221160c370b200241d8016a2001108e0220022903d801a70d37200241e8016a290300210d20022903e0012109200220022f00b5043b01c605200241c6046a290100211a20022901be04210e20022800b104211720022d00b704210b20022d00b804210c20022d00b904210720022801ba04210a410321160c360b200241f0016a2001107520022802f0010d3620022802f4012106200220022f01d0073b01c60542002109410521164200210d0c350b200241f8016a2001107520022802f8010d35200128020441246e221b41246c2204417f4c0d2420022802fc01211c0240024020040d00410421060c010b2004102a2206450d260b0240201c450d004123210541002108410021040340200241d0076a2001108d02200220022f00ef073b01c805024020022d00d00722074102470d00201b450d382006102c0c380b200441016a210320022800eb07210c20022d00ea07210a20022d00e907210b20022d00e807210f20022903e007210920022903d807210d20022802d407211920022d00d307211820022d00d207211720022d00d107211620022d00f107211d20022d00f207211e20022d00f3072115200220022f01c8053b01c80602402004201b470d0020082003200820034b1b221bad42247e220e422088a70d29200ea7221f4100480d290240024020040d00201f102a21060c010b20062005415d6a201f102e21060b2006450d280b200620056a220441776a200a3a0000200441766a200b3a0000200441756a200f3a0000200441606a20183a00002004415f6a20173a00002004415e6a20163a00002004415d6a20073a00002004416d6a2009370000200441656a200d370000200441616a2019360000200441786a200c3600002004417c6a20022f01c8063b00002004417e6a201d3a00002004417f6a201e3a0000200420153a0000200841026a2108200541246a210520032104201c2003470d000b0b2006450d35201cad422086201bad842109200220022f01b0043b01c6054200210d410621160c340b410721160c330b2015450d3320042d0002210820012003417d6a3602042001200441036a360200200841034f0d33200220022f01d0073b01c605410821160c320b200241d0076a2001108d0220022d00d0074102460d322002200241eb076a2f00003b01c605200241dc076a290200210d200241e7076a2800002117200241e6076a2d00002118200241e5076a2d00002119200241e4076a2d0000210f200241ed076a2d0000210b200241ee076a2d0000210c200241ef076a2d00002107200241f0076a280200210a20022902d407210920022802d0072106410921160c310b20024180026a200110752002280280020d312002280284022106200220022f0190043b01c60542002109410a21164200210d0c300b410b21160c2f0b410c21160c2e0b200241d0076a200110820120022802d0072206450d2e200220022f01b0043b01c60520022902d40721094200210d410d21160c2d0b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d2f200241003a00f0070c2f0b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01c605200241df076a290000210d20022900d707210920022801ea07211720022d00e907211820022d00e807211920022d00e707210f20022800d307210620022d00d207211d20022d00d107211e20022d00d0072108410e21160c2c0b410f21160c2b0b20154104490d2b2004280002210620012003417a6a3602042001200441066a360200200241d0076a2001107e20022802d007450d2b200220022f01b0043b01c605200241d8076a350200210d20022903d0072109411021160c2a0b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241c8066a200110e20120022d00c8064101460d00200241c8056a200241c8066a41017241800110db051a200241c8066a2001107720022802c80622010d130b200041183602000c2d0b2006450d2720042d0001210520012003417e6a221d3602042001200441026a360200200541144b0d27410e21160240024002400240024002400240024002400240024002400240024002400240024002400240024020050e15000102030405060708090a0b0c3a0d0e0f10111213000b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d3c200241003a00f0070c3c0b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01b004200241df076a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d007211720024188026a2001108e02200229038802a70d3a20024198026a290300211a200229039002210e200220022f01b0043b01c405410121160c390b200241a0026a2001107520022802a0020d3920022802a4022107200220022f01d0073b01c405410221160c380b200241a8026a2001107520022802a8020d3820012802042204450d3820022802ac022107200128020022052d0000210320012004417f6a3602042001200541016a360200200341ff0071221941064b0d38200220022f01d0073b01c40520034107762117410321160c370b200241b0026a2001107520022802b0020d3720012802042204450d3720022802b4022107200128020022052d0000210320012004417f6a3602042001200541016a360200200341ff0071221941064b0d37200220022f01d0073b01c40520034107762117410421160c360b201d41034d0d362004280002210720012003417a6a3602042001200441066a360200200220022f01d0073b01c405410521160c350b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d37200241003a00f0070c370b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01c405200241df076a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d0072117410621160c340b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d36200241003a00f0070c360b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01c405200241df076a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d0072117410721160c330b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d35200241003a00f0070c350b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01c405200241df076a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d0072117410821160c320b41002105200241003a00f0072003417e6a2107417d21060340024020072005470d00200541ff0171450d34200241003a00f0070c340b200241d0076a20056a200420056a220841026a2d00003a00002001200320066a3602042001200841036a3602002002200541016a22083a00f0072006417f6a21062008210520084120470d000b200220022f01ee073b01c805200320086b2203417e6a4104490d32200241df076a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d0072117200420086a220441026a280000210620012003417a6a22053602042001200441066a220836020020054104490d322008350000210e2001200341766a36020420012004410a6a360200200220022f01c8053b01c4054200211a410921160c310b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d33200241003a00f0070c330b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01c405200241df076a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d0072117410a21160c300b200241b8026a2001107520022802b8020d3020022802bc022107200220022f01d0073b01c405410b21160c2f0b201d41034d0d2f2004280002210720012003417a6a3602042001200441066a360200200220022f0190043b01c405410c21160c2e0b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d30200241003a00f0070c300b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01c405200241df076a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d0072117410d21160c2d0b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d2f200241003a00f0070c2f0b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200220022f01ee073b01c405410f2116200241d0076a410f6a290000210920022900d707210d20022801ea07210f20022d00e907210b20022d00e807210a20022d00e707210c20022800d307210720022d00d207211820022d00d107211920022d00d00721170c2c0b41002105200241003a00f0072003417e6a21072003417d6a21060340024020072005470d00200541ff0171450d2e200241003a00f0070c2e0b200241d0076a20056a200420056a220841026a2d00003a0000200120063602042001200841036a3602002002200541016a22083a00f0072006417f6a21062008210520084120470d000b200220022900d707220d3703c806200220022f01ee073b00df06200220022801ea07220f3600db06200220022d00e907220b3a00da06200220022d00e807220a3a00d906200220022d00e707220c3a00d8062002200241df076a29000022093703d0062003417e6a2008460d2c20022800d307210720022d00d207211820022d00d107211920022d00d0072117200420086a220441026a2d00002108200120063602042001200441036a360200200841064b0d2c200220022f00df063b01c405411021160c2b0b411121160c2a0b411221160c290b200241d0076a2001107720022802d0072207450d29200220022f01b0043b01c40520022902d407210d411321160c280b200241d0076a2001107720022802d0072207450d28200220022f01b0043b01c40520022902d407210d411421160c270b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d29200241003a00f0070c290b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200241bd046a200241df076a2900002209370000200220022900d707220d3700b504200220022f01ee0722013b01cc04200220022801ea07220f3602c804200220022d00e907220b3a00c704200220022d00e807220a3a00c604200220022d00e707220c3a00c504200220022800d30722073600b104200220022d00d20722183a00b00420022d00d107211920022d00d0072117200220013b01c405411521160c260b200241d0076a200110fd0220022d00d0074105470d11200041183602000c2b0b200241d0076a200110fd0220022d00d0074105470d11200041183602000c2a0b2006450d2220042d0001210520012003417e6a360204410221032001200441026a360200200541054b0d220240024002400240024020050e06001701020304000b200241d0076a200110820120022802d0072204450d26200241d8076a280200210820022802d4072106200241c0026a2001108e0220022903c002a7450d152006450d262004102c0c260b200241d0076a2001108d0220022d00d0074102460d25200220022902d407221a3703c805200241dc076a290200210d200241e4076a290200210e200241ec076a290200210920022802d007210420022802cc052108201aa72106410321030c150b410421030c140b410521030c130b200241d0076a2001108d0220022d00d0074102460d22200220022902d407221a3703c805200241dc076a290200210d200241e4076a290200210e200241ec076a290200210920022802d007210420022802cc052108201aa72106410621030c120b2006450d2020042d0001210520012003417e6a3602042001200441026a360200200541044b0d200240024002400240024020050e050001020304000b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d26200241003a00f0070c260b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200241bd046a200241df076a2900002209370000200220022900d707220d3700b504200220022801ea07220a3602c804200220022d00e907220b3a00c704200220022d00e807220f3a00c604200220022d00e70722193a00c504200220022800d307220c3600b104200220022d00d20722183a00b00420022d00d007211720022d00d1072116200220022f01ee073b01c405200220022f01c8063b01c205410121010c230b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d25200241003a00f0070c250b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200241bd046a200241df076a2900002209370000200220022900d707220d3700b504200220022801ea07220a3602c804200220022d00e907220b3a00c704200220022d00e807220f3a00c604200220022d00e70722193a00c504200220022800d307220c3600b104200220022d00d20722183a00b00420022d00d007211720022d00d1072116200220022f01ee073b01c405200220022f01c8063b01c205410221010c220b41002105200241003a00f007410220036b21072003417d6a210603400240200720056a0d00200541ff0171450d24200241003a00f0070c240b200241d0076a20056a200420056a220841026a2d00003a0000200120063602042001200841036a3602002002200541016a22083a00f0072006417f6a21062008210520084120470d000b200241bd046a200241df076a2900002209370000200220022900d707220d3700b504200220022801ea07220a3602c804200220022d00e907220b3a00c704200220022d00e807220f3a00c604200220022d00e70722193a00c504200220022800d307220c3600b104200220022d00d20722183a00b00420022d00d007211720022d00d1072116200220022f01ee073b01c60541002105200241003a00f007200420086a2107200820036b41026a210303400240200320056a0d00200541ff0171450d24200241003a00f0070c240b200241d0076a20056a200720056a220441026a2d00003a0000200120063602042001200441036a3602002002200541016a22043a00f0072006417f6a21062004210520044120470d000b200241bd046a200241df076a290000221a370000200220022900d707220e3700b504200220022801ea07221e3602c804200220022d00e907221d3a00c704200220022d00e80722073a00c604200220022d00e70722083a00c504200220022800d30722063600b104200220022d00d20722053a00b00420022d00d007210420022d00d1072103200220022f01ee073b01c205200220022f01c6053b01c405410321010c210b200241d0076a200110820120022802d007220c450d21200220022f01b0043b01c405200220022f01c8063b01c20520022902d407210d410421010c200b41002105200241003a00f0072003417e6a21082003417d6a21030340024020082005470d00200541ff0171450d22200241003a00f0070c220b200241d0076a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00f0072003417f6a21032006210520064120470d000b200241bd046a200241df076a2900002209370000200220022801ea073602c804200220022d00e9073a00c704200220022f00e7073b00c504200220022f01ee073b01cc04200220022900d707220d3700b504200220022800d307220c3600b104200220022d00d20722183a00b00420022d00d007211720022d00d1072116200241d8066a220120022900c504370300200241e0066a200241cd046a2d00003a0000200241d0066a20093703002002200d3703c80620012d0000211920022d00d906210f20022d00da06210b20022800db06210a200220022f00df063b01c405200220022f01c8053b01c205410521010c1f0b024002402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241d8026a2001107520022802d802450d010b200041183602000c280b20022802dc0221012000410e36020020002001360204200041086a200241e0086a41880110db051a0c270b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241d0076a2001107720022802d00722010d110b200041183602000c260b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541024b0d0002400240024020050e03000102000b200241e0026a2001108e0220022903e002a70d02200241f0026a290300210920022903e802210d200241d0076a2001108d0220022d00d0074102460d02200241b8046a200241dc076a290200370300200241c0046a200241e4076a290200370300200241c8046a200241ec076a290200370300200220022902d4073703b00420022802d0072101410121040c1e0b200241f8026a2001107520022802f8020d0120022802fc022101200241b0046a41186a200241d0076a41186a290300370300200241b0046a41106a200241d0076a41106a290300370300200241b0046a41086a200241d0076a41086a290300370300200220022903d0073703b004410221040c1d0b20024180036a200110752002280280030d002002280284032101200241b0046a41186a200241d0076a41186a290300370300200241b0046a41106a200241d0076a41106a290300370300200241b0046a41086a200241d0076a41086a290300370300200220022903d0073703b004410321040c1c0b200041183602000c250b2006450d1820042d0001210520012003417e6a3602042001200441026a360200200541044b0d180240024002400240024020050e050001020304000b200241e0086a200110fe0220022d00d0094102460d1c200241d8076a20024190096a290300370300200241e0076a20024198096a290300370300200220022f00f7083b01c20520022002290388093703d007200241f3086a280000210c200241fc086a280200210420022d00f208210a20022d00f108210b20022d00f008210320022903e808210920022903e008210d20022d00f908210520022d00fa08210620022d00fb08210f200229038009210e200220022f00bf093b01c005200241b0096a2903002120200241bb096a2800002101200241d0096a290300212120022903a809211420022d00ba09210820022d00b909211620022d00b809211d20022903a009211a20022802c409211e20022903c809211320022d00c309211520022d00c209211b20022d00c109211c4101211f0c1d0b20024188036a200110c202200229038803a70d1b2002290390032109200241b0046a2001107720022802b0042207450d1b200241d0076a41086a200241e0086a41086a290300370300200241d0076a41106a200241e0086a41106a290300370300200220022f01c8063b01c205200220022903e0083703d007200220022f0190043b01c00520022902b404210d420021144102211f420021200c1c0b200241e0086a2001108d0220022d00e0084102460d1a2002200241fb086a2f00003b01b004200241ec086a2902002109200241f7086a280000210c200241f6086a2d0000210a200241f5086a2d0000210b200241f4086a2d00002103200241fd086a2d00002105200241fe086a2d00002106200241ff086a2d0000210f20024180096a280200210420022902e408210d20022802e0082107200241a8036a2001108e0220022903a803a70d1a200241b8036a290300210e20022903b003212020024198036a200110c202200229039803a70d1a20022903a003211a200241e0086a2001107720022802e008450d1a200241e0076a200e370300200220203703d807200220022f01b0043b01c205200220022f0190043b01c0052002200241e8086a2802003602d00720022903e008210e420021144103211f420021200c1b0b200241d0036a2001108e0220022903d003a70d19200241e0036a290300210e20022903d803211a200241c0036a200110c20220022903c003a70d1920022903c803212041002103200241003a0080092001280204417f6a2104024003402004417f460d01200241e0086a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0080092004417f6a21042005210320054120470d000b200241d8066a200241f7086a2900002221370300200241e0066a200241ff086a2d00003a0000200241d0066a200241ef086a2900002209370300200220022900e708220d3703c80620022800e308210720022d00e208211920022d00e108211820022d00e008211720022800db06210c20022d00da06210a20022d00d906210b200220022f00df063b019004200241e0086a2001107720022802e0082204450d1a2021a721032002201a3703d007200220022f0190043b01c205200220203703e007200220022f01b0043b01c0052002200e3703d80720022902e408210e420021144104211f420021200c1b0b200341ff0171450d19200241003a0080090c190b41002105200241003a0080092003417e6a21072003417d6a21060340024020072005470d00200541ff0171450d1a200241003a0080090c1a0b200241e0086a20056a200420056a220841026a2d00003a0000200120063602042001200841036a3602002002200541016a22083a0080092006417f6a21062008210520084120470d000b200241d8066a200241f7086a290000221a370300200241e0066a200241ff086a2d00003a0000200241d0066a200241ef086a2900002209370300200220022900e708220d3703c80620022800e308210720022d00e208211920022d00e108211820022d00e008211720022800db06210c20022d00da06210a20022d00d906210b200220022f00df063b01c6052003417e6a2008460d18200420086a221641026a2d0000211d200120063602042001201641036a360200201d41014b0d184100210502400240201d0e020100010b41002104200241003a008009200820036b41036a2106200320086b417c6a210303400240200620046a0d00200441ff0171450d1b200241003a0080090c1b0b200241e0086a20046a201620046a220541036a2d00003a0000200120033602042001200541046a3602002002200441016a22053a0080092003417f6a21032005210420054120470d000b200241bd046a200241ef086a290000370000200220022f01fe0822013b01f003200220022900e7083700b504200220022800e3083600b104200220022d00e2083a00b004200220022801fa083602c804200220022d00f9083a00c704200220022f00f7083b00c50420022d00e108210f20022d00e0082106200220013b01cc0420022902b404210e20022802b0042104200241d8066a20013b0100200241d0066a200241c4046a290200370300200220022902bc043703c806410121050b201aa72103200241d0076a41106a200241c8066a41106a2f01003b0100200241d0076a41086a200241c8066a41086a290300370300200241e6076a20024194046a2f01003b0100200220022903c8063703d007200220022f01c6053b01c20520022002280190043601e207200220022f01c4053b01c005420021144105211f420021200c190b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541024b0d00024002400240024020050e03000102000b200241d0076a2001108f0220022802d0074118460d03200241e0086a200241d0076a41900110db051a419001102a2204450d142004200241e0086a41900110db051a410121010c020b200241e0086a2001108d024102210120022d00e0084102460d02200241e0056a200241fc086a290200220d370300200241d8056a200241f4086a2902002209370300200241ec086a290200211a20022802e008210420022902e408210e0c010b200241e0086a2001108d0220022d00e0084102460d01200241d0066a200241ec086a290200370300200241d8066a200241f4086a290200370300200241c8066a41186a200241fc086a290200370300200220022902e4083703c80620022802e0082104200241d0076a2001108f0220022802d0074118460d01200241e0086a200241d0076a41900110db051a419001102a2203450d122003200241e0086a41900110db051a200241c8056a41186a200241c8066a41186a290300220d370300200241c8056a41106a200241c8066a41106a2903002209370300200241d0066a290300211a20022903c806210e410321010b2000200136020420004112360200200041246a200d3702002000411c6a2009370200200041146a201a3702002000410c6a200e3702002000412c6a2003360200200041086a2004360200200041306a200241b0046a41e00010db051a0c240b200041183602000c230b2006450d1520042d0001210520012003417e6a22063602042001200441026a36020020050d1520064104490d152004280002211820012003417a6a3602042001200441066a360200200241e0086a2001107720022802e008220f450d15200241e8086a280200211720022802e4082119200241e8036a2001107520022802e8030d142001280204410c6e220c410c6c2204417f4c0d0e20022802ec03210a0240024020040d00410421080c010b2004102a2208450d100b0240200a450d004100210641002104410021050340200241e0086a2001107720022802e0082207450d15200541016a210320022902e408210902402005200c470d0020062003200620034b1b220cad420c7e220d422088a70d13200da7220b4100480d130240024020050d00200b102a21080c010b20082004200b102e21080b2008450d120b200820046a22052007360200200541046a2009370200200641026a21062004410c6a210420032105200a2003470d000b0b2008450d14200f450d15200128020422034104490d1220012802002206280000210b20012003417c6a22043602042001200641046a36020020044104490d11200628000421162001200341786a22073602042001200641086a36020041002104200241003a00a009200341776a21030340024020072004470d000240200441ff0171450d00200241003a00a0090b02402019450d00200f102c0b0240200a450d00200a410c6c21042008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200441746a22040d000b0b200c450d172008102c0c170b200241e0086a20046a200620046a220541086a2d00003a0000200120033602042001200541096a3602002002200441016a22053a00a0092003417f6a210320052104200541c000470d000b200241d0076a41386a2201200241e0086a41386a290300370300200241d0076a41306a2204200241e0086a41306a290300370300200241d0076a41286a2203200241e0086a41286a290300370300200241d0076a41206a2205200241e0086a41206a290300370300200241d0076a41186a2206200241e0086a41186a290300370300200241d0076a41106a2207200241e0086a41106a290300370300200241d0076a41086a221d200241e0086a41086a290300370300200220022903e0083703d007200f0d0d0c150b02402006450d0020012003417e6a3602042001200441026a3602000b200041183602000c210b02402006450d0020012003417e6a3602042001200441026a3602000b200041183602000c200b02402006450d0020012003417e6a3602042001200441026a3602000b200041183602000c1f0b2006450d0120042d0001210520012003417e6a360204410221032001200441026a360200200541034b0d01024002400240024020050e0400030102000b200241d0076a2001107720022802d0072204450d0420022902d4072109410121030c020b200241d0076a2001108d0220022d00d0074102460d03200241dc076a290200211a200241e4076a2902002120200241ec076a290200210d20022802d007210420022902d40721094200210e410321030c010b200241d0076a2001108d0220022d00d0074102460d02200241b0046a41086a2203200241dc076a290200370300200241c0046a2205200241e4076a290200370300200241c8046a2208200241ec076a290200370300200220022902d4073703b00420022802d0072104200241d0076a2001107720022802d007450d02200241d0076a41086a280200210620022903d007210e2003290300211a200529030021202008290300210d20022903b0042109410421030b20002003360204200041173602002000412c6a200e370200200041246a200d3702002000411c6a2020370200200041146a201a370200200041346a20063602002000410c6a2009370200200041086a2004360200200041386a200241e0086a41d80010db051a0c1e0b200041183602000c1d0b200041183602000c1c0b200041086a20022902d4073702002000200136020420004104360200200041106a200241e0086a41800110db051a0c1b0b200220022902cc063703e008200241e0086a41086a200241c8056a41800110db051a200241d0076a200241e0086a41880110db051a200241b0046a200241d0076a41880110db051a2000200136020420004108360200200041086a200241b0046a41880110db051a0c1a0b200241b0046a41206a200241d0076a41206a2903002209370300200241b0046a41186a200241d0076a41186a290300220d370300200241b0046a41106a200241d0076a41106a290300220e370300200241b0046a41086a200241d0076a41086a290300221a370300200220022903d00722203703b0042000410a360200200020203702042000410c6a201a370200200041146a200e3702002000411c6a200d370200200041246a20093702002000412c6a200241e0086a41e40010db051a0c190b200241b0046a41206a200241d0076a41206a2903002209370300200241b0046a41186a200241d0076a41186a290300220d370300200241b0046a41106a200241d0076a41106a290300220e370300200241b0046a41086a200241d0076a41086a290300221a370300200220022903d00722203703b0042000410b360200200020203702042000410c6a201a370200200041146a200e3702002000411c6a200d370200200041246a20093702002000412c6a200241e0086a41e40010db051a0c180b200241d0026a290300210e20022903c802210d410121030b2000410c360200200041206a200e370200200041186a200d370200200041286a2009370200200041146a2008360200200041106a20063602002000410c6a2004360200200041086a2003360200200041306a200241e0086a41e00010db051a0c160b200041086a20022902d407370200200020013602042000410f360200200041106a200241e0086a41800110db051a0c150b200241b0046a41386a221e2001290300370300200241b0046a41306a22012004290300370300200241b0046a41286a22042003290300370300200241b0046a41206a22032005290300370300200241b0046a41186a22052006290300370300200241b0046a41106a22062007290300370300200241b0046a41086a2207201d290300370300200220022903d0073703b004200041246a2016360200200041206a200b3602002000411c6a200a360200200041186a200c360200200041146a2008360200200041106a20173602002000410c6a2019360200200041086a200f3602002000201836020420004113360200200041286a20022903b004370200200041306a2007290300370200200041386a2006290300370200200041c0006a2005290300370200200041c8006a2003290300370200200041d0006a2004290300370200200041d8006a2001290300370200200041e0006a201e29030037020020004188016a200241c8066a41206a29030037030020004180016a200241c8066a41186a290300370300200041f8006a200241c8066a41106a290300370300200041f0006a200241c8066a41086a290300370300200041e8006a20022903c8063703000c140b103a000b1033000b1035000b02402019450d00200f102c0b0240200a450d00200a410c6c21042008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200441746a22040d000b0b200c450d032008102c0c030b02402019450d00200f102c0b0240200a450d00200a410c6c21042008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200441746a22040d000b0b200c450d022008102c0c020b02402005450d002008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200441746a22040d000b0b200c450d002008102c0b2019450d00200f102c0b200041183602000c0c0b200041183602000c0b0b200241c8056a41086a2222200241d0076a41086a290300370300200241c8056a41106a2223200241d0076a41106a290300370300200220022f01c2053b01be05200220022903d0073703c805200220022f01c0053b01bc05200041236a200c3600002000200a3a00222000200b3a0021200041206a20033a0000200041186a2009370200200041106a200d3700002000410c6a2007360000200020193a000b200020183a000a200020173a0009200041086a201f3a000020004111360200200041306a200e3702002000412c6a20043602002000200f3a002b200020063a002a200020053a0029200020022f01be053b0027200041c8006a2023290300370200200041c0006a2022290300370200200041386a20022903c805370200200041e0006a2020370200200041d8006a2014370200200041eb006a2001360000200020083a006a200020163a0069200041e8006a201d3a0000200041d0006a201a37020020022f01bc05210120004180016a2021370200200041f8006a2013370200200041f4006a201e360200200020153a00732000201b3a00722000201c3a0071200020013b006f0c0a0b200241c8066a41186a200241b0046a41186a290300220e370300200241c8066a41106a200241b0046a41106a290300221a370300200241c8066a41086a200241b0046a41086a2903002220370300200220022903b00422213703c806200041386a2009370200200041306a200d3702002000410c6a2001360200200041086a200436020020004110360200200041106a2021370200200041186a2020370200200041206a201a370200200041286a200e370200200041c0006a200241e0086a41d00010db051a0c090b200220022f01c40522153b01c005200220022f01c2053b01be052000411f6a200a3600002000200b3a001e2000200f3a001d2000411c6a20193a0000200041146a20093700002000410c6a200d370000200041086a200c360000200020183a0007200020163a0006200020173a0005200020013a00042000410d3602002000413f6a201e3600002000201d3a003e200020073a003d2000413c6a20083a0000200041346a201a3700002000412c6a200e370000200041286a2006360000200020053a0027200020033a0026200020043a0025200020153b0023200020022f01be053b0043200041c8006a200241e0086a41c80010db051a0c080b200041183602000c070b200041183602000c060b200220022f01c40522013b01c205200041386a201a370200200041306a200e370200200041236a200f3600002000200b3a00222000200a3a0021200041206a200c3a0000200041186a2009370200200041106a200d3702002000410c6a2007360200200020183a000b200020193a000a200020173a0009200041086a20163a0000200041093602002000412c6a2006360200200020083a0029200020013b0027200041c0006a200241e0086a41d00010db051a0c050b200041183602000c040b200220022f01c60522013b01c405200041186a200d370200200041106a2009370200200041386a201a370200200041306a200e370200200041236a2017360000200020183a0022200020193a0021200041206a200f3a00002000410c6a20063602002000201d3a000b2000201e3a000a200020083a0009200041086a20163a0000200041073602002000412c6a200a360200200020073a002b2000200c3a002a2000200b3a0029200020013b0027200041c0006a200241e0086a41d00010db051a0c030b200041183602000c020b200241f0036a41186a20024190046a41186a290300220e370300200241f0036a41106a20024190046a41106a290300221a370300200241f0036a41086a20024190046a41086a2903002220370300200220022903900422213703f003200041e0006a2012370200200041d8006a2013370200200041c8006a2010370200200041c0006a2011370200200041386a2009370200200041306a200d3702002000410c6a2004360200200041086a200136020020004106360200200041106a2021370200200041186a2020370200200041206a201a370200200041286a200e370200200041d0006a2014370200200041e8006a20022903e008370300200041f0006a200241e0086a41086a290300370300200041f8006a200241e0086a41106a29030037030020004180016a200241e0086a41186a29030037030020004188016a200241e0086a41206a2903003703000c010b200041183602000b200241f0096a24000b802205017f037e087f017e037f230041800b6b22022400420221030240024002400240024002400240200129036822044202520d00200241106a20014198016a41900110db051a0c010b200241ee016a200141246a41c20010db051a200241b0026a41086a20014188016a290300370300200241b0026a41106a20014190016a290300370300200220014180016a2903003703b002200141f8006a2903002103200129037021052001280204210620012d00002107200241e00a6a41026a2208200141036a2d00003a0000200241e8026a41086a2209200141106a290200370300200241e8026a41106a220a200141186a290200370300200241e8026a41186a220b200141206a280200360200200220012f00013b01e00a200220012902083703e80202400240024020074101460d00200241a00a6a41026a20082d00003a0000200241e0066a41086a2009290300370300200241e0066a41106a200a290300370300200241e0066a41186a200b2d00003a0000200220022f01e00a3b01a00a200220022903e8023703e0060c010b200241f8076a200641067610910220022802f8072107024002402002280280082006413f7122064b0d00410021080c010b200241a00a6a41026a200720064105746a220641026a2d00003a0000200241e8066a2006410f6a290000370300200241f0066a200641176a290000370300200241f8066a2006411f6a2d00003a0000200220062f00003b01a00a200220062900073703e00620062800032106410121080b024020022802fc07450d002007102c0b20080d00410121070c010b200241f8076a41026a200241a00a6a41026a2d00003a0000200241e8026a41086a200241e0066a41086a290300370300200241e8026a41106a200241e0066a41106a290300370300200241e8026a41186a200241e0066a41186a2d00003a0000200220022f01a00a3b01f807200220022903e0063703e802410021070b200241800a6a41026a2208200241f8076a41026a2d00003a0000200241c8056a41086a2209200241e8026a41086a290300370300200241c8056a41106a220a200241e8026a41106a290300370300200241c8056a41186a220b200241e8026a41186a2d00003a0000200220022f01f8073b01800a200220022903e8023703c80502402007450d00200041013b0001200041013a0000200041036a41003a000020014198016a1092020c060b200241d7026a2009290300370000200241df026a200a290300370000200241e7026a200b2d00003a0000200220022f01800a3b01c802200220063600cb02200220022903c8053700cf02200220082d00003a00ca02200241f8076a20014198016a41900110db051a20024188096a41106a200241b0026a41106a29030037030020024188096a41086a200241b0026a41086a290300370300200220022903b0023703880941002106200241e00a6a4100109302200241800a6a41086a200241eb0a6a290000370300200241800a6a41106a200241f30a6a290000370300200241950a6a200241e00a6a41186a2209290000370000200220022900e30a3703800a20022f01e00a210c20022d00e20a210d200241a00a6a41186a4200370300200241a00a6a41106a220a4200370300200241a00a6a41086a22074200370300200242003703a00a200241e0096a41086a22014191b0c200ad4280808080e000841002220841086a290000370300200220082900003703e0092008102c20072001290300370300200220022903e009220e3703c00a2002200e3703a00a200141acb0c200ad4280808080e000841002220841086a290000370300200220082900003703e0092008102c200a20022903e009220e370300200241e00a6a41086a2007290300370300200241e00a6a41106a200e370300200920012903003703002002200e3703d00a200220022903a00a3703e00a200241086a200241e00a6a4120109401024020044201520d0020054200510d02200228020c410020022802081b2101417f21062001ad220e20032003200e541b220e200e20037d2005827d220e42ffffffff0f560d00200ea721060b200241e0096a41086a22014191b0c200ad4280808080e000841002220741086a290000370300200220072900003703e0092007102c200241c00a6a41086a22082001290300370300200220022903e0093703c00a200141a3b0c200ad42808080809001841002220741086a290000370300200220072900003703e0092007102c200241d00a6a41086a22072001290300370300200220022903e0093703d00a200220063602e009200241e00a6a41186a2209200241e0096aad4280808080c000841006220141186a290000370300200241e00a6a41106a220a200141106a290000370300200241e00a6a41086a220b200141086a290000370300200220012900003703e00a2001102c200241a00a6a41186a220f2009290300370300200241a00a6a41106a2209200a290300370300200241a00a6a41086a220a200b290300370300200220022903e00a3703a00a41c000102a2201450d02200120022903c00a370000200141086a2008290300370000200120022903d00a370010200141186a2007290300370000200120022903a00a370020200141286a200a290300370000200141306a2009290300370000200141386a200f290300370000410121072002200141c000410141004100109701200228020021082001102c0240024020084101460d000c010b200241e00a6a2006109302200241e0096a41086a200241eb0a6a290000370300200241e0096a41106a200241f30a6a290000370300200241e0096a41156a200241f80a6a290000370000200241a00a6a41086a200241800a6a41086a290300370300200241a00a6a41106a200241800a6a41106a290300370300200241a00a6a41156a200241800a6a41156a290000370000200220022900e30a3703e009200220022903800a3703a00a20022f01e00a20022d00e20a411074722101410021070b200241c0096a41156a2206200241a00a6a41156a290000370000200241c0096a41106a2208200241a00a6a41106a290300370300200241c0096a41086a2209200241a00a6a41086a290300370300200241a0096a41086a220a200241e0096a41086a290300370300200241a0096a41106a220b200241e0096a41106a290300370300200241a0096a41156a220f200241e0096a41156a290000370000200220022903a00a3703c009200220022903e0093703a00902402007450d00200241f8076a109202200041036a41003a0000200041800a3b0001200041013a00000c060b20024190056a41156a2207200629000037000020024190056a41106a2206200829030037030020024190056a41086a22082009290300370300200241f0046a41086a2209200a290300370300200241f0046a41106a220a200b290300370300200241f0046a41156a220b200f290000370000200220022903c00937039005200220022903a0093703f004200241b0056a41106a220f20024188096a41106a290300370300200241b0056a41086a221020024188096a41086a29030037030020022002290388093703b005200241e0066a41046a200241f8076a41900110db051a200241c8056a200241e0066a41940110db051a200241e8026a200241c8056a41046a41900110db051a200241ac046a2211200c200d41107472220c3b010020024188046a200337030020024180046a200537030020024190046a220d20022903b00537030020024198046a2010290300370300200241a0046a2210200f290300370300200241af046a200229039005370000200241b7046a2008290300370000200241bf046a2006290300370000200241c4046a2007290000370000200241c6013602a804200241e8026a41c6016a200c4110763a0000200220043703f803200241ce046a20014110763a0000200241cc046a220720013b0100200241cf046a20022903f004370000200241d7046a2009290300370000200241df046a200a290300370000200241e4046a200b2900003700004104102a2201450d02200242043702e406200220013602e006200241e8026a200241e0066a108b010240024020022903f8034201510d000240024020022802e40620022802e8062201460d0020022802e00621060c010b200141016a22062001490d06200141017422082006200820064b1b22084100480d060240024020010d002008102a21060c010b20022802e00620012008102e21060b2006450d05200220083602e406200220063602e00620022802e80621010b2002200141016a3602e806200620016a41003a00000c010b2002290388042002290380042203420c882204420120044201561b8021040240024020022802e406220620022802e80622016b4102490d0020022802e00621060c010b200141026a22082001490d05200641017422012008200120084b1b22014100480d050240024020060d002001102a21060c010b20022802e00620062001102e21060b2006450d04200220013602e406200220063602e00620022802e80621010b2002200141026a3602e806200620016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b2010200241e0066a1089012002200d3602c805200241c8056a200241e0066a108a0120022802a80421080240024020022802e406220620022802e80622016b4104490d0020022802e00621060c010b200141046a22092001490d04200641017422012009200120094b1b22014100480d040240024020060d002001102a21060c010b20022802e00620062001102e21060b2006450d03200220013602e406200220063602e00620022802e80621010b2002200141046a3602e806200620016a20083600002002200241e0066a3602c8052011200241c8056a1094022002200241e0066a3602c8052007200241c8056a10940220022802e006210120022802e40621070240024020022802e80622064180024b0d00200241ee016a20012006200241c8026a10950221060c010b200241e00a6a41186a22082006ad4220862001ad841006220641186a290000370300200241e00a6a41106a2209200641106a290000370300200241e00a6a41086a220a200641086a290000370300200220062900003703e00a2006102c200241a00a6a41186a2008290300370300200241a00a6a41106a2009290300370300200241a00a6a41086a200a290300370300200220022903e00a3703a00a200241ee016a200241a00a6a4120200241c8026a10950221060b02402007450d002001102c0b2006450d04200241c8016a41086a200241c8026a41086a290300370300200241c8016a41106a200241c8026a41106a290300370300200241c8016a41186a200241c8026a41186a290300370300200241a0016a41086a20024188046a290300370300200241a0016a41106a20024190046a290300370300200241a0016a41186a20024198046a290300370300200241c0016a200241a0046a290300370300200220022903c8023703c801200220024180046a2903003703a00120022903f8032103200241106a200241e8026a41900110db051a0b200041086a20022903c801370300200041286a2003370300200041306a20022903a001370300200041206a200241c8016a41186a290300370300200041186a200241c8016a41106a290300370300200041106a200241c8016a41086a290300370300200041386a200241a0016a41086a290300370300200041c0006a200241a0016a41106a290300370300200041c8006a200241a0016a41186a290300370300200041d0006a200241a0016a41206a290300370300200041d8006a200241106a41900110db051a200041003a0000200241800b6a24000f0b41c090c600411941dc90c6001036000b1033000b1035000b20004180083b0001200041013a0000200041036a41003a0000200241e8026a1092020b200241800b6a24000bff0301067f230041f0006b22022400200241d0006a41086a220341b5e5c200ad4280808080f000841002220441086a290000370300200220042900003703502004102c200241086a41086a2205200329030037030020022002290350370308200341c7e5c200ad4280808080f000841002220441086a290000370300200220042900003703502004102c200241186a41086a22062003290300370300200220022903503703182002200136024c200241d0006a41186a2201200241cc006aad4280808080c000841006220441186a290000370300200241d0006a41106a2207200441106a2900003703002003200441086a290000370300200220042900003703502004102c200241286a41186a22042001290300370300200241286a41106a22012007290300370300200241286a41086a2207200329030037030020022002290350370328024041c000102a2203450d00200320022903083700002003200229031837001020032002290328370020200341086a2005290300370000200341186a2006290300370000200341286a2007290300370000200341306a2001290300370000200341386a2004290300370000200241d0006a200341c00010d0010240024020022802502204450d0020002002290254370204200020043602000c010b20004100360208200042013702000b2003102c200241f0006a24000f0b1033000bb30c01057f024002402000280200220141164b0d000240024002400240024002400240024002400240024002400240024020010e1700010f0f020f0f030405060708090f0a0f0b0c0d0f0f0f000b0240200041086a280200220141064b0d00024002400240024020010e0713130013010203130b200041106a280200450d122000410c6a280200102c0f0b200041106a280200450d112000410c6a280200102c0f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141186a2101200241686a22020d000b0b200041106a280200450d10200028020c102c0f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041106a280200450d0f200028020c102c0f0b200041106a280200450d0e2000410c6a280200102c0f0b02402000410c6a2802002202450d002000280204210120024190016c210203402001107320014190016a2101200241f07e6a22020d000b0b200041086a280200450d0d2000280204102c0f0b02402000410c6a2802002201450d0020002802042203200141f0006c6a2104034002402003410c6a2802002202450d0020032802042101200241246c210203400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012002415c6a22020d000b0b200341f0006a21010240200341086a280200450d002003280204102c0b2001210320012004470d000b0b200041086a280200450d0c2000280204102c0f0b0240200041086a2d00002201410f4b0d00410120017441bfbf03710d0c024020014106470d00200041106a280200450d0d2000410c6a280200102c0f0b200041106a280200450d0c2000410c6a280200102c0f0b200041146a280200450d0b200041106a280200102c0f0b200041086a280200450d0a2000280204102c0f0b200041086a2d0000416d6a220141014b0d090240024020010e020001000b200041106a280200450d0a2000410c6a280200102c0f0b200041106a280200450d092000410c6a280200102c0f0b20002d0004417f6a220141024b0d0802400240024020010e03000102000b2000410c6a280200450d0a200041086a280200102c0f0b200041086a22012802001092022001280200102c0f0b2000410c6a22012802001092022001280200102c0f0b20002d0004417f6a220141024b0d0702400240024020010e03000102000b2000410c6a280200450d09200041086a280200102c0f0b200041086a22012802001092022001280200102c0f0b2000410c6a22012802001092022001280200102c0f0b200041086a2802004101470d06200041106a280200450d062000410c6a280200102c0f0b20002d00044104470d052000410c6a280200450d05200041086a280200102c0f0b200041086a280200450d042000280204102c0f0b200041086a2d0000417e6a220141024b0d0302400240024020010e03000102000b200041106a280200450d052000410c6a280200102c0f0b200041346a280200450d04200041306a280200102c0f0b200041306a280200450d032000412c6a280200102c0f0b02402000280204220141024b0d00024020010e03040004040b200041086a22012802001092022001280200102c0f0b2000412c6a22012802001092022001280200102c0f0b02402000410c6a280200450d00200041086a280200102c0b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041186a280200450d012000280214102c0c010b02402000280204220141034b0d00024020010e0402000202020b2000410c6a280200450d01200041086a280200102c0f0b200041306a280200450d002000412c6a280200102c0f0b0bef0401067f230041f0006b22022400200241086a22034191b0c200ad4280808080e000841002220441086a290000370300200220042900003703002004102c200241286a41086a2205200329030037030020022002290300370328200341a3b0c200ad42808080809001841002220441086a290000370300200220042900003703002004102c200241386a41086a22062003290300370300200220022903003703382002200136026c200241186a2201200241ec006aad4280808080c000841006220441186a290000370300200241106a2207200441106a2900003703002003200441086a290000370300200220042900003703002004102c200241c8006a41186a22042001290300370300200241c8006a41106a22012007290300370300200241c8006a41086a2207200329030037030020022002290300370348024041c000102a2203450d00200320022903283700002003200229033837001020032002290348370020200341086a2005290300370000200341186a2006290300370000200341286a2007290300370000200341306a2001290300370000200341386a20042903003700002002200341c00010d3012007200241096a2900003703002001200241116a2900003703002004200241196a290000370300200220022900013703480240024020022d00004101460d0020004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b20002002290348370000200041186a200241c8006a41186a290300370000200041106a200241c8006a41106a290300370000200041086a200241c8006a41086a2903003700000b2003102c200241f0006a24000f0b1033000b920501037f20002d00002102024002404101102a2203450d00200320023a000020002d00012102200341014102102e2203450d00200320023a000120002d00022102200341024104102e2203450d00200320023a0002200320002d00033a000320002d00042102200341044108102e2203450d00200320023a0004200320002d00053a0005200320002d00063a0006200320002d00073a000720002d00082102200341084110102e2203450d00200320023a0008200320002d00093a0009200320002d000a3a000a200320002d000b3a000b200320002d000c3a000c200320002d000d3a000d200320002d000e3a000e200320002d000f3a000f20002d00102102200341104120102e2203450d00200320023a0010200320002d00113a0011200320002d00123a0012200320002d00133a0013200320002d00143a0014200320002d00153a0015200320002d00163a0016200320002d00173a0017200320002d00183a0018200320002d00193a0019200320002d001a3a001a200320002d001b3a001b200320002d001c3a001c200320002d001d3a001d200320002d001e3a001e200320002d001f3a001f024002402001280200220041046a2802002202200041086a28020022016b4120490d00200028020021020c010b200141206a22042001490d02200241017422012004200120044b1b22014100480d020240024020020d002001102a21020c010b200028020020022001102e21020b2002450d0120002002360200200041046a2001360200200041086a28020021010b200041086a200141206a360200200220016a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000200020032900003700002003102c0f0b1033000b1035000b9e0501037f230041b0016b22042400024002400240024020002d00000e03000102000b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a2002ad4220862001ad84200441206a100b41014621000c020b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a2002ad4220862001ad84200441206a100c41014621000c010b20044190016a41186a22052002ad4220862001ad841006220141186a29000037030020044190016a41106a2202200141106a29000037030020044190016a41086a2206200141086a29000037030020042001290000370390012001102c200441186a2005290300370300200441106a2002290300370300200441086a2006290300370300200420042903900137030041012101200441206a200041016a200410be024100210020042d00200d00200441c8006a41206a200441c1006a2d00003a0000200441c8006a41186a200441396a290000370300200441c8006a41106a200441316a290000370300200441c8006a41086a200441296a290000370300200420042900213703482005200441c8006aad42808080809004841006220041186a2900003703002002200041106a2900003703002006200041086a29000037030020042000290000370390012000102c200441f0006a41186a2005290300370300200441f0006a41106a2002290300370300200441f0006a41086a200629030037030020042004290390013703700240200441f0006a2003460d00200441f0006a2003412010dd054521010b200121000b200441b0016a240020000ba00701087f230041d00b6b220424000240024020002802000d002000417f360200200441206a41186a200141186a290000370300200441206a41106a200141106a290000370300200441206a41086a200141086a29000037030020042001290000370320024002402000280204220541d0e1c100460d00200041086a28020021060c010b41002106200441f0086a410041e00210da051a200441d0006a410041a00810da051a41880b102a2205450d02200541003b010620054100360200200541086a200441f0086a41e00210db051a200541e8026a200441d0006a41a00810db051a200041086a4100360200200020053602040b200041046a210702400240034020052f010622084105742109410021014100210a02400240034020092001460d01200441206a200520016a41086a412010dd05220b450d02200141206a2101200a41016a210a200b417f4a0d000b200a417f6a21080b2006450d022006417f6a2106200520084102746a41880b6a28020021050c010b0b2000410c6a210b410121010c010b200441186a200441206a41186a290300370300200441106a200441206a41106a290300370300200441086a200441206a41086a290300370300200420042903203703002000410c6a210b410021062008210a410021010b0240024020010d002004418c096a200441086a29030037020020044194096a200441106a2903003702002004419c096a200441186a2903003702002004200b360280092004200a3602fc08200420073602f808200420053602f408200420063602f0082004200429030037028409200441f0006a2004290340370300200441f8006a200441c0006a41086a29030037030020044184016a42003702002004420037036820044200370350200441d0e1c10036028001200441003a008c012004418d016a200429002037000020044195016a200441206a41086a2900003700002004419d016a200441206a41106a290000370000200441a5016a200441206a41186a290000370000200441003a00ad01200441f0086a200441d0006a10800221010c010b200441e8006a4200370300200441e4006a41d0e1c100360200200441003602702004410036026020044200370358200441d0e1c100360254200441003602502005200a41e0006c6a41e8026a2101200441d0006a10f4010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441d00b6a24000f0b41f089c6004110200441d0006a41f882c100103b000b1033000b130020004106360204200041cc95c1003602000b3400200041e5d6c50036020420004100360200200041146a4106360200200041106a41fcaec100360200200041086a42103702000b130020004105360204200041e8b7c1003602000b2e01017f02404104102a22020d001033000b20004284808080c0003702042000200236020020024180a70c3600000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241073600000b2c01017f02404104102a22020d001033000b20004284808080c000370204200020023602002002410d3600000b3a01017f02404110102a22020d001033000b2002420037000820024280809aa6eaafe301370000200042908080808002370204200020023602000bed6807017f027e027f017e127f027e017f230041d0046b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e0700010203040508000b200341a4026a41013602002003420137029402200341fcc4c50036029002200341043602a401200341f4c4c5003602a0012003200341a0016a3602a00220034190026a4184c5c5001041000b200141186a2903002104200141106a29030021052001410c6a2802002106200141086a2802002107200128020421012002411a6a2901002108200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241046a2d0000211641022117200241026a2f010021180240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f01002119200241086a2d000021024100211a0c010b4101211a41002102410021190b201941ffff0371410874200241187472201741ff01717221190240201a450d0041d6b2c0002102410f2117024002400240024020190e05000102031e000b20144108742015722013411874722102201141087420127220104118747221170c1d0b41dd8cc6002102410e21170c1c0b41c3b2c0002102411321170c1b0b41b2b2c0002102411121170c1a0b20032008370370200320093a006f2003200a3a006e2003200b3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a0063200320133a0062200320143b0160200320153a005f2003201936005b200320163a005a200320183b015820034190026a41186a420037030020034190026a41106a2202420037030020034190026a41086a22194200370300200342003703900220034180016a41086a221741e5d6c500ad42808080808002841002221a41086a2900003703002003201a29000037038001201a102c20192017290300370300200320032903800122083703f00120032008370390022017419883c100ad4280808080a001841002221a41086a2900003703002003201a29000037038001201a102c20022003290380012208370300200341c0036a41086a2019290300370300200341c0036a41106a2008370300200341c0036a41186a2017290300370300200320083703a00120032003290390023703c003200341a0016a200341c0036aad428080808080048422081003108d01024002400240024020032802a0012217450d0020032802a40121192003200341a8016a280200360294022003201736029002200341286a20034190026a107520032802280d01200328022c21100c020b2003420037029402200341013602900220034190026a107821100c020b410021100b2019450d002017102c0b20034190026a41186a2211420037030020034190026a41106a2212420037030020034190026a41086a22194200370300200342003703900220034180016a41086a221741e5d6c500ad42808080808002841002221a41086a2900003703002003201a29000037038001201a102c201920172903003703002003200329038001221b3703f0012003201b37039002201741eae5c200ad4280808080f000841002221a41086a2900003703002003201a29000037038001201a102c200341a0016a41086a2017290300221b3703002003200329038001221c3703a0012002201c370000200241086a201b370000200341c0036a41086a2019290300370300200341c0036a41106a2012290300370300200341c0036a41186a201129030037030020032003290390023703c00320034190026a20081003108d010240024020032802900222020d00410021170c010b200328029402211a200320192802003602a401200320023602a001200341206a200341a0016a10750240024020032802200d00200328022421170c010b410021170b201a450d002002102c0b0240201720106a22020d0041d7bbc1002102412f21170c1a0b0240200620024d0d004186bcc1002102412021170c1a0b41a6bcc100210241252117200641104b0d19024020060d0041cbbcc10021020c1a0b02402005428180e983b1de165441002004501b450d0041f0bcc1002102413021170c1a0b0240200341d8006a109f020d00200341186a200341d8006a428080e983b1de16420010c1012003280218450d0041a0bdc1002102411d21170c1a0b200341086a200341d8006a10b101200342f0d0c9abc6add9b1f400370378200341f8006a200341d8006a2003290308220820052008200554200341086a41086a290300220820045420082004511b22021b22052008200420021b2208417f411e10be0120034180016a41086a221741e5d6c500ad428080808080028422041002220241086a29000037030020032002290000370380012002102c200341f0016a41086a2219201729030037030020032003290380013703f001201741fdfbc000ad4280808080f000841002220241086a29000037030020032002290000370380012002102c200341a0016a41086a221a201729030037030020032003290380013703a00120034190026a200341d8006a109f0141c000102a2202450d16200220032903f001370000200241086a2019290300370000200220032903a001370010200241186a201a2903003700002002200329039002370020200241286a20034190026a41086a290300370000200241306a200341a0026a2210290300370000200241386a20034190026a41186a2211290300370000200320083703980220032005370390022002ad428080808080088420034190026aad428080808080028410012002102c201720041002220241086a29000037030020032002290000370380012002102c2019201729030037030020032003290380013703f001201741affbc000ad4280808080f000841002220241086a29000037030020032002290000370380012002102c201a201729030037030020032003290380013703a00120034190026a200341d8006a109f0141c000102a2217450d16201720032903f001370000201741086a200341f0016a41086a290300370000201720032903a001370010201741186a200341a0016a41086a2903003700002017200329039002370020201741286a20034190026a41086a290300370000201741306a2010290300370000201741386a2011290300370000200341a0016a201741c00010a0020240024020032d00ac0122024102460d00200341f0036a41086a200341b5016a290000370300200341f0036a41106a200341bd016a290000370300200341f0036a41186a200341c5016a29000037030020034180016a41086a200341d6016a29010037030020034180016a41106a200341de016a29010037030020034180016a41186a200341e6016a2901003703002003200341ad016a2900003703f0032003200341ce016a29010037038001200341cd016a2d0000211920032802a401450d0120032802a001102c0c010b2003200341d8006a3602940320034190026a10d20120034198036a200328029002220220032802980210d3010240200328029402450d002002102c0b0240024020032d0098030d0020034190026a10d201200328029002210220032003280298023602f403200320023602f003200341d8006a200341f0036a10a1020240200328029402450d002002102c0b410021190c010b200341d8036a200341b1036a290000370300200341c0036a41106a200341a9036a290000370300200341c0036a41086a200341a1036a29000037030020032003290099033703c003200341e0036a200341c0036a10840220034190026a20032802e003221a20032802e803221010a002024020032d009c024102470d00200341003602f801200342013703f00120034180016a41146a410d36020020034180016a410c6a410b360200200341103602bc04200341e5d6c5003602b8042003410b36028401200341073602c404200341affbc0003602c0042003200341e0036a360290012003200341c0046a360288012003200341b8046a360280012003200341f0016a3602cc04200341f0036a41146a4103360200200342033702f403200341c09dc5003602f003200320034180016a36028004200341cc046a41c49ac500200341f0036a10391a20033502f80142208620033502f0018410042003280294032119200341f0036a10d20120032802f0032102200320032802f803360284012003200236028001201920034180016a10a102024020032802f403450d002002102c0b024020032802f401450d0020032802f001102c0b024020032802e403450d0020032802e003102c0b410021190c010b200341f0036a20034190026a410c6a41c20010db051a20032d009104211920034180016a41086a20034190026a41086a280200220236020020034180016a41106a20034192046a410020194101461b3602002003200329039002220837038001200320034194036a36028c01200341003602f801200342013703f0012002200341f0016a106720034180016a410c6a21122008a7211102402002450d00200241057421192011210203402002200341f0016a109101200241206a2102201941606a22190d000b0b2012200341f0016a10a20220032802f40121022010ad422086201aad8420033502f80142208620032802f0012219ad84100102402002450d002019102c0b0240200328028401450d002011102c0b024020032802e403450d0020032802e003102c0b200328029403211920034190026a10d201200328029002210220032003280298023602f403200320023602f0032019200341f0036a10a1020240200328029402450d002002102c0b20034180016a41086a200341c0036a41086a29030037030020034180016a41106a200341c0036a41106a29030037030020034180016a41186a200341c0036a41186a290300370300200320032903c00337038001410121190b410021020b2003419d026a20032903f003370000200341bd026a20193a0000200341be026a200329038001370100200341a5026a200341f0036a41086a290300370000200341ad026a200341f0036a41106a290300370000200341b5026a200341f0036a41186a290300370000200341c6026a20034180016a41086a290300370100200341ce026a20034180016a41106a290300370100200341d6026a20034180016a41186a290300370100200320023a009c02200320063602980220032007360294022003200136029002200341003602a801200342013703a0012006200341a0016a1067200641057421022003419c026a210703402001200341a0016a109101200141206a2101200241606a22020d000b2007200341a0016a10a30220032802a40121022017ad428080808080088420033502a80142208620032802a0012201ad84100102402002450d002001102c0b2017102c200328029402450d18200328029002102c0c180b2002411a6a2901002108200241196a2d00002117200241186a2d00002107200241166a2f01002119200241156a2d0000211a200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d000021152002410c6a2d000021062002410a6a2f01002109200241096a2d0000210a200241046a2d0000210b41022101200241026a2f0100210c0240024020022d00000d0020022d00014101470d00200241056a2d00002101200241066a2f0100210d200241086a2d000021024100210e0c010b4101210e410021024100210d0b200320083703d803200320173a00d703200320073a00d603200320193b01d4032003201a3a00d303200320103a00d203200320113b01d003200320123a00cf03200320133a00ce03200320143b01cc03200320153a00cb03200320063a00ca03200320093b01c8032003200a3a00c7032003200b3a00c2032003200c3b01c0032003200d41ffff0371410874200241187472200141ff01717222013600c3030240200e450d0041d6b2c0002102410f2117024020010e05001605081b000b20032800c703210220032800cb0321170c1a0b20034190026a41186a200341c0036a41186a29030037030020034190026a41106a200341c0036a41106a29030037030020034190026a41086a200341c0036a41086a290300370300200320032903c00337039002024020034190026a109f02450d0020034190026a410110a402410021020c1a0b410f21174199bfc10021020c190b41022107200341b8046a41026a200141076a2d00003a0000200341d8006a41086a200141146a290200370300200341d8006a41106a2001411c6a290200370300200341d8006a41186a200141246a280200360200200320012f00053b01b80420032001410c6a290200370358200141086a280200211720012d000421152002411a6a2901002108200241196a2d00002106200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000211a2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241046a2d0000210f200241026a2f010021160240024020022d00000d0020022d00014101470d00200241056a2d00002107200241066a2f01002101200241086a2d00002102410021190c010b4101211941002101410021020b200141ffff0371410874200741ff017172200241187472210102402019450d0041d6b2c0002102410f2117024020010e05001504071a000b201341087420147220124118747221022010410874201172201a4118747221170c190b200320083703b003200320063a00af03200320093a00ae032003200a3b01ac032003200b3a00ab032003200c3a00aa032003200d3b01a8032003200e3a00a7032003201a3a00a603200320103b01a403200320113a00a303200320123a00a203200320133b01a003200320143a009f032003200136009b032003200f3a009a03200320163b019803200341e0036a41026a2202200341b8046a41026a2d00003a000020034180016a41086a200341d8006a41086a29030037030020034180016a41106a2201200341d8006a41106a29030037030020034180016a41186a200341d8006a41186a280200360200200320032f01b8043b01e00320032003290358370380010240201541ff01714101460d00200341c0046a41026a20022d00003a0000200341f0016a41086a20034180016a41086a290300370300200341f0016a41106a2001290300370300200341f0016a41186a20034180016a41186a2d00003a0000200320032f01e0033b01c00420032003290380013703f0010c120b200341a0016a201741067610910220032802a00121010240024020032802a8012017413f7122024b0d00410021020c010b200341c0046a41026a200120024105746a220241026a2d00003a0000200341f8016a2002410f6a29000037030020034180026a200241176a29000037030020034188026a2002411f6a2d00003a0000200320022f00003b01c004200320022900073703f00120022800032117410121020b024020032802a401450d002001102c0b20020d11410121020c120b2002411a6a2901002108200241196a2d00002114200241186a2d00002115200241166a2f01002106200241156a2d00002109200241146a2d0000210a200241126a2f0100210b200241116a2d0000210c200241106a2d000021192002410e6a2f0100211a2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d0000210d41022101200241026a2f0100210e0240024020022d00000d0020022d00014101470d00200241056a2d00002101200241066a2f01002117200241086a2d00002102410021070c010b4101210741002117410021020b201741ffff0371410874200141ff017172200241187472210102402007450d0041d6b2c0002102410f2117024020010e050014030619000b20124108742013722011411874722102201a41087420107220194118747221170c180b2003200837038804200320143a008704200320153a008604200320063b018404200320093a0083042003200a3a0082042003200b3b0180042003200c3a00ff03200320193a00fe032003201a3b01fc03200320103a00fb03200320113a00fa03200320123b01f803200320133a00f703200320013600f3032003200d3a00f2032003200e3b01f00320034190026a41186a420037030020034190026a41106a2210420037030020034190026a41086a22014200370300200342003703900220034180016a41086a220241e5d6c500ad42808080808002841002221741086a29000037030020032017290000370380012017102c200120022903003703002003200329038001370390022002419883c100ad4280808080a001841002221741086a29000037030020032017290000370380012017102c20102003290380012208370300200341a0016a41086a2001290300370300200341a0016a41106a2008370300200341a0016a41186a2002290300370300200320083703c00320032003290390023703a00120034190026a200341a0016a412010d0012003280290022201410120011b21194100211a410021020240200329029402420020011b2208422088a7220141014b0d004100210720010e020f0e0f0b03402001410176221720026a22072002201920074105746a200341f0036a412010dd054101481b2102200120176b220141014b0d000c0e0b0b2002411a6a2901002108200241196a2d00002115200241186a2d00002106200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000211a2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241046a2d0000210e41022117200241026a2f0100210f0240024020022d00000d0020022d00014101470d00200241056a2d00002117200241066a2f01002107200241086a2d00002102410021190c010b4101211941002107410021020b200741ffff0371410874201741ff01717220024118747221072019450d0141d6b2c0002102410f2117024020070e050012010417000b201341087420147220124118747221022010410874201172201a4118747221170c160b41c3b2c0002102411321170c150b2003200837038804200320153a008704200320063a008604200320093b0184042003200a3a0083042003200b3a0082042003200c3b0180042003200d3a00ff032003201a3a00fe03200320103b01fc03200320113a00fb03200320123a00fa03200320133b01f803200320143a00f703200320073600f3032003200e3a00f2032003200f3b01f003200341a0016a200341f0036a10a50220032d00a001450d0320034190026a41186a420037030020034190026a41106a2210420037030020034190026a41086a22174200370300200342003703900220034180016a41086a220241e5d6c500ad42808080808002841002220741086a29000037030020032007290000370380012007102c20172002290300370300200320032903800137039002200241a283c100ad42808080809001841002220741086a29000037030020032007290000370380012007102c20102003290380012208370300200341a0016a41086a2017290300370300200341a0016a41106a2008370300200341a0016a41186a2002290300370300200320083703c00320032003290390023703a00120034190026a200341a0016a10d1012003280290022217410820171b211a41002102024002400240024002400240200329029402420020171b2205422088a7221141014b0d0020110e020201020b2011211703402017410176220720026a22192002201a201941306c6a200341f0036a412010dd054101481b2102201720076b221741014b0d000b0b201a200241306c6a200341f0036a412010dd05450d010b20034190026a41186a2219420037030020034190026a41106a2211420037030020034190026a41086a22174200370300200342003703900220034180016a41086a220241e5d6c500ad42808080808002841002220741086a29000037030020032007290000370380012007102c201720022903003703002003200329038001370390022002419883c100ad4280808080a001841002220741086a29000037030020032007290000370380012007102c200341c0036a41086a20022903002208370300200320032903800122043703c00320102004370000201041086a2008370000200341a0016a41086a2017290300370300200341a0016a41106a2011290300370300200341a0016a41186a201929030037030020032003290390023703a00120034190026a200341a0016a412010d0012003280290022217410120171b211041002102024002400240200329029402420020171b2208422088a7221141014b0d0020110e020201020b2011211703402017410176220720026a22192002201020194105746a200341f0036a412010dd054101481b2102201720076b221741014b0d000b0b201020024105746a200341f0036a412010dd05450d030b41ebbec10021022008a70d010c0b0b200220114f0d06201a200241306c6a2217201741306a2002417f7320116a41306c10dc051a200341f0036a4280809aa6eaafe301420010c201200341c0036a41186a4200370300200341c0036a41106a22194200370300200341c0036a41086a22174200370300200342003703c00320034180016a41086a220241e5d6c500ad42808080808002841002220741086a29000037030020032007290000370380012007102c20172002290300370300200320032903800122083703f001200320083703c003200241a283c100ad42808080809001841002220741086a29000037030020032007290000370380012007102c2019200329038001220837030020034190026a41086a201729030037030020034190026a41106a200837030020034190026a41186a2002290300370300200320083703a001200320032903c00337039002200341003602a801200342013703a0012011417f6a2202200341a0016a10670240024020020d0020032802a801211720032802a401211920032802a00121070c010b201a200241306c6a2111201a210203402002200341a0016a109101200241286a2903002108200241206a29030021040240024020032802a401221920032802a80122176b4110490d0020032802a00121070c010b201741106a22072017490d11201941017422172007201720074b1b22104100480d110240024020190d002010102a21070c010b20032802a00120192010102e21070b2007450d15200320103602a401200320073602a00120032802a8012117201021190b200720176a22102008370008201020043700002003201741106a22173602a8012011200241306a2202470d000b0b20034190026aad42808080808004842017ad4220862007ad84100102402019450d002007102c0b410021022005a7450d0b201a102c0c0b0b2010102c0c090b200220114f0d05201020024105746a2217201741206a2002417f7320116a41057410dc051a200341f0036a4280809aa6eaafe301420010c201200341c0036a41186a4200370300200341c0036a41106a22194200370300200341c0036a41086a22174200370300200342003703c00320034180016a41086a220241e5d6c500ad42808080808002841002220741086a29000037030020032007290000370380012007102c20172002290300370300200320032903800122043703f001200320043703c0032002419883c100ad4280808080a001841002220741086a29000037030020032007290000370380012007102c2019200329038001220437030020034190026a41086a201729030037030020034190026a41106a200437030020034190026a41186a2002290300370300200320043703a001200320032903c00337039002200341003602a801200342013703a0012011417f6a2202200341a0016a106702402002450d00201141057441606a21172010210203402002200341a0016a109101200241206a2102201741606a22170d000b0b20032802a401210220034190026aad428080808080048420033502a80142208620032802a0012217ad84100102402002450d002017102c0b410021022008a7450d082010102c0c080b200341d8006a41026a2217200141076a2d00003a0000200341f0036a41086a2207200141146a290200370300200341f0036a41106a22192001411c6a290200370300200341f0036a41186a221a200141246a280200360200200320012f00053b015820032001410c6a2902003703f00320022d000120022d000072450d010b41b2b2c0002102411121170c120b200141086a280200210220012d00042101200341e0036a41026a20172d00003a000020034180016a41086a200729030037030020034180016a41106a201929030037030020034180016a41186a201a280200360200200320032f01583b01e003200320032903f003370380010240200141ff01714101460d00200341c0046a41026a200341e0036a41026a2d00003a0000200341f0016a41086a20034180016a41086a290300370300200341f0016a41106a20034180016a41106a290300370300200341f0016a41186a20034180016a41186a2d00003a0000200320032f01e0033b01c00420032003290380013703f0010c040b20034190026a20024106761091022003280290022101024002402003280298022002413f7122024b0d00410021170c010b200341c0046a41026a200120024105746a220241026a2d00003a0000200341f8016a2002410f6a29000037030020034180026a200241176a29000037030020034188026a2002411f6a2d00003a0000200320022f00003b01c004200320022900073703f00120022800032102410121170b0240200328029402450d002001102c0b20170d03410121010c040b200341f0036a4280809aa6eaafe301420010c2012003419d026a200341f8036a290300370000200341a5026a20034180046a290300370000200341ad026a20034188046a290300370000200341033a009402200341093a009002200320032903f00337009502410021024101410020034190026a1092010c050b418ab4c000411d41acfec5001036000b418ab4c000411d41acfec5001036000b20034198036a41026a200341c0046a41026a2d00003a000020034190026a41086a200341f0016a41086a29030037030020034190026a41106a200341f0016a41106a29030037030020034190026a41186a200341f0016a41186a2d00003a0000200320032f01c0043b019803200320032903f00137039002410021010b200341c0036a41026a20034198036a41026a2d00003a0000200341cf036a20034190026a41086a290300370000200341d7036a20034190026a41106a290300370000200341df036a20034190026a41186a2d00003a0000200320032f0198033b01c003200320023600c30320032003290390023700c70320010d07200341a0016a41186a200341c0036a41186a290100370300200341a0016a41106a200341c0036a41106a290100370300200341a0016a41086a200341c0036a41086a290100370300200320032901c0033703a00120034198036a200341a0016a10a502024020032d0098034101460d0020032d0099032101200341c8006a200341a0016a4280809aa6eaafe301420010bf012003290348200341c8006a41086a29030010a9012003419d026a200341a0016a41086a290300370000200341a5026a200341b0016a290300370000200341ad026a200341b8016a290300370000200341023a009402200341093a009002200320032903a00137009502410021024101410020034190026a10920102402001450d000c0e0b10cf010c0d0b200341a0036a2802002117200328029c0321020c0c0b2005a7450d00201a102c0b412e211720012802004101470d0a200141086a280200450d0a2001280204102c0c0a0b0240201920024105746a200341f0036a412010dd0522010d004101211a200221070c010b2001411f7620026a21070b02402008a7450d002019102c0b0240201a450d0041e7bdc1002102411e21170c090b4185bec100210241212117200341f0036a10a6020d0841a6bec1002102200341f0036a10a7020d0842002108200341c0006a200341f0036a4280809aa6eaafe301420010c10102402003280240450d0041c7bec1002102412421170c090b200329038804210420032d008704211920032d008604211a20032f018404211120032d008304211220032d008204211320032f018004211420032d00ff03211520032d00fe03210620032f01fc03210920032d00fb03210a20032d00fa03210b20032f01f803210c20032d00f703210d20032800f303210e20032d00f203210f20032f01f003211620034190026a41186a2218420037030020034190026a41106a221d420037030020034190026a41086a22014200370300200342003703900220034180016a41086a220241e5d6c500ad42808080808002841002221741086a29000037030020032017290000370380012017102c200120022903003703002003200329038001370390022002419883c100ad4280808080a001841002221741086a29000037030020032017290000370380012017102c200341c0036a41086a200229030022053703002003200329038001221b3703c0032010201b370000201041086a2005370000200341a0016a41086a2001290300370300200341a0016a41106a201d290300370300200341a0016a41186a201829030037030020032003290390023703a00120034190026a200341a0016a412010d0010240024020032802900222170d004100210241012117410021010c010b2003290294022208422088a721012008a721020b024020012007490d00024020012002470d0020022008a7470d00200241016a22102002490d02200241017422182010201820104b1b221041ffffff3f712010470d02201041057422184100480d020240024020020d002018102a21170c010b201720024105742018102e21170b2017450d062010ad21080b201720074105746a220241206a2002200120076b41057410dc051a20022004370018200220193a00172002201a3a0016200220113b0014200220123a0013200220133a0012200220143b0010200220153a000f200220063a000e200220093b000c2002200a3a000b2002200b3a000a2002200c3b00082002200d3a00072002200e3600032002200f3a0002200220163b0000200341c0036a41186a4200370300200341c0036a41106a221a4200370300200341c0036a41086a22074200370300200342003703c00320034180016a41086a220241e5d6c500ad42808080808002841002221941086a29000037030020032019290000370380012019102c20072002290300370300200320032903800122043703f001200320043703c0032002419883c100ad4280808080a001841002221941086a29000037030020032019290000370380012019102c201a200329038001220437030020034190026a41086a200729030037030020034190026a41106a200437030020034190026a41186a2002290300370300200320043703a001200320032903c00337039002024020170d0020034190026aad42808080808004841005410021020c0a0b200341003602a801200342013703a001200141016a2202200341a0016a106702402002450d00201720024105746a21012017210203402002200341a0016a1091012001200241206a2202470d000b0b2008a7210220032802a401210120034190026aad428080808080048420033502a80142208620032802a0012207ad84100102402001450d002007102c0b2002450d072017102c410021020c090b41ecb3c000411e41acfec5001036000b1035000b200341c0036a41026a200341c0046a41026a2d00003a0000200341a0016a41086a200341f0016a41086a290300370300200341a0016a41106a200341f0016a41106a290300370300200341a0016a41186a200341f0016a41186a2d00003a0000200320032f01c0043b01c003200320032903f0013703a001410021020b2003419f026a200341a0016a41086a290300370000200341a7026a200341a0016a41106a290300370000200341af026a200341a0016a41186a2d00003a0000200320032f01c0033b0190022003201736009302200320032903a001370097022003200341c2036a2d00003a00920220020d00200341f0036a41186a20034190026a41186a290300370300200341f0036a41106a20034190026a41106a290300370300200341f0036a41086a20034190026a41086a29030037030020032003290390023703f003024020034198036a200341f0036a412010dd050d0041bdbdc1002102411221170c060b024020034198036a109f020d0041cfbdc1002102411821170c060b02400240200341f0036a109f02450d0020034180016a41086a221041e5d6c500ad428080808080028422051002220241086a29000037030020032002290000370380012002102c200341f0016a41086a2201201029030037030020032003290380013703f001201041affbc000ad4280808080f000841002220241086a29000037030020032002290000370380012002102c200341a0016a41086a2212201029030037030020032003290380013703a001200341c0036a200341f0036a109f0141c000102a2202450d03200220032903f001370000200241086a2001290300370000200220032903a001370010200241186a2012290300370000200220032903c003370020200241286a200341c0036a41086a2214290300370000200241306a200341c0036a41106a290300370000200241386a200341c0036a41186a29030037000020034190026a200241c00010d0012002102c2003280290022202410120021b2215200329029402420020021b221b422088a74105746a211320034190026a41106a211120152119034020192013460d020240201910a6020d00201910a7020d0020034190026a41186a221742003703002011420037030020034190026a41086a220242003703002003420037039002201020051002220141086a29000037030020032001290000370380012001102c200220102903003703002003200329038001370390022010419883c100ad4280808080a001841002220141086a29000037030020032001290000370380012001102c201420102903002208370300200320032903800122043703c00320112004370000201141086a200837000020122002290300370300200341a0016a41106a2011290300370300200341a0016a41186a201729030037030020032003290390023703a00120034190026a200341a0016a412010d0012003280290022201410120011b211a41002102024002400240200329029402420020011b2208422088a7220141014b0d0020010e020201020b03402001410176221720026a22072002201a20074105746a2019412010dd054101481b2102200120176b220141014b0d000b0b201a20024105746a2019412010dd054521020b02402008a7450d00201a102c0b201941206a21192002450d010b0b201ba7450d002015102c0b200341306a20034198036a428080e983b1de16420010bf012003290330200341386a29030010a9014100210120034198036a21170c030b0240201ba7450d002015102c0b20034190026a200341f0036a20034198036a428080e983b1de16420010c00141012101200341f0036a21172003280290024101470d0220034198026a280200211720032802940221020c050b41dd8cc6002102410e21170c040b1033000b410021022017410010a4022003419d026a200341f0036a41086a290300370000200341a5026a200341f0036a41106a290300370000200341ad026a200341f0036a41186a290300370000200341b5026a200329039803370000200341bd026a20034198036a41086a290300370000200341c5026a20034198036a41106a290300370000200341cd026a20034198036a41186a290300370000200341d5026a20013a0000200341043a009402200341093a009002200320032903f003370095024101410020034190026a1092010c020b410021020c010b2007450d002001102c0b2000201736020420002002360200200341d0046a24000bd10201057f230041d0006b22012400200141306a41086a220241e5d6c500ad42808080808002841002220341086a290000370300200120032900003703302003102c200141106a41086a2204200229030037030020012001290330370310200241fdfbc000ad4280808080f000841002220341086a290000370300200120032900003703302003102c200141206a41086a2205200229030037030020012001290330370320200141306a2000109f01024041c000102a22030d001033000b200320012903103700002003200129032037001020032001290030370020200341086a2004290300370000200341186a2005290300370000200341286a2002290000370000200341306a200141c0006a290000370000200341386a200141306a41186a290000370000200141086a200341c000410141004100109701200128020821022003102c200141d0006a240020024101460be80b030a7f017e027f230041a0026b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022040d00200041023a000c0c010b200328021421052003200341106a41086a28020036026420032004360260200341e8006a200341e0006a10820102400240024020032802682206450d00200328026c2107024020032802642201450d00200341e8006a41086a280200210820032001417f6a220936026420032003280260220a41016a220b360260200a2d0000220141014b0d004100210c0240024020010e020100010b41002101200341003a0098020340024020092001470d0020034100360264200141ff0171450d03200341003a0098020c030b200341f8016a20016a200a20016a220241016a2d00003a00002003200241026a3602602003200141016a22023a0098022002210120024120470d000b200341b8016a41086a200341f8016a41086a290300220d37030020034198016a41186a200341f8016a41186a29030037030020034198016a41106a200341f8016a41106a29030037030020034198016a41086a200d3703002003200920026b2209360264200320032903f801220d3703b8012003200d370398014101210c200a20026a41016a210b0b200341f8006a41186a20034198016a41186a290300370300200341f8006a41106a20034198016a41106a290300370300200341f8006a41086a20034198016a41086a29030037030020032003290398013703782009450d0020032009417f6a22093602642003200b41016a360260200b2d0000220141014b0d00410021020240024020010e020100010b41002101200341003a0098020340024020092001470d0020034100360264200141ff0171450d03200341003a0098020c030b200341f8016a20016a200b20016a220241016a2d00003a00002003200241026a3602602003200141016a22023a0098022002210120024120470d000b200341b8016a41086a200341f8016a41086a290300220d37030020034198016a41186a200341f8016a41186a29030037030020034198016a41106a200341f8016a41106a29030037030020034198016a41086a200d3703002003200920026b360264200320032903f801220d3703b8012003200d37039801410121020b200341206a41186a220120034198016a41186a290300370300200341206a41106a220920034198016a41106a290300370300200341206a41086a220a20034198016a41086a290300370300200341c0006a41086a220b200341f8006a41086a290300370300200341c0006a41106a220e200341f8006a41106a290300370300200341c0006a41186a220f200341f8006a41186a290300370300200320032903980137032020032003290378370340200c4102460d02200020083602082000200736020420002006360200200341f8016a41086a2206200b290300370300200341f8016a41106a220b200e290300370300200341f8016a41186a2207200f290300370300200341d8016a41086a2208200a290300370300200341d8016a41106a220a2009290300370300200341d8016a41186a22092001290300370300200320032903403703f801200320032903203703d801200320032f011e3b01b801200041256a20072903003700002000411d6a200b290300370000200041156a2006290300370000200020032903f80137000d2000412d6a20023a00002000412e6a20032903d801370000200041366a20082903003700002000413e6a200a290300370000200041c6006a2009290300370000200041ce006a20032f01b8013b00000c030b2007450d002006102c0b4102210c0b200341003602e001200342013703d8012003410b3602bc012003200341086a3602b8012003200341d8016a360298012003418c026a4101360200200342013702fc01200341d0b0c2003602f8012003200341b8016a3602880220034198016a41c49ac500200341f8016a10391a20033502e00142208620033502d80184100420032802dc01450d0020032802d801102c0b2000200c3a000c2005450d002004102c0b200341a0026a24000bc30301027f20002d0000210202404101102a2203450d00200320023a000020002d00012102200341014102102e2203450d00200320023a000120002d00022102200341024104102e2203450d00200320023a0002200320002d00033a000320002d00042102200341044108102e2203450d00200320023a0004200320002d00053a0005200320002d00063a0006200320002d00073a000720002d00082102200341084110102e2203450d00200320023a0008200320002d00093a0009200320002d000a3a000a200320002d000b3a000b200320002d000c3a000c200320002d000d3a000d200320002d000e3a000e200320002d000f3a000f20002d00102102200341104120102e2203450d00200320023a0010200320002d00113a0011200320002d00123a0012200320002d00133a0013200320002d00143a0014200320002d00153a0015200320002d00163a0016200320002d00173a0017200320002d00183a0018200320002d00193a0019200320002d001a3a001a200320002d001b3a001b200320002d001c3a001c200320002d001d3a001d200320002d001e3a001e200320002d001f3a001f20012902002003ad428080808080048410012003102c0f0b1033000ba00501047f200141046a2802002102200141086a28020021030240024002400240200028020022040d000240024020022003460d00200128020021020c010b200341016a22022003490d04200341017422042002200420024b1b22044100480d040240024020030d002004102a21020c010b200128020020032004102e21020b2002450d0320012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c010b0240024020022003460d00200128020021020c010b200341016a22022003490d03200341017422052002200520024b1b22054100480d030240024020030d002005102a21020c010b200128020020032005102e21020b2002450d0220012002360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200220036a41013a0000200428020020011091010b200141046a2802002102200141086a28020021030240200028020422040d000240024020022003460d00200128020021000c010b200341016a22002003490d03200341017422022000200220004b1b22024100480d030240024020030d002002102a21000c010b200128020020032002102e21000b2000450d0220012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b0240024020022003460d00200128020021000c010b200341016a22002003490d02200341017422022000200220004b1b22024100480d020240024020030d002002102a21000c010b200128020020032002102e21000b2000450d0120012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41013a0000200420011091010f0b1033000b1035000bb50501037f024002400240024020002d00004101460d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d04200241017422042003200420034b1b22044100480d040240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0320012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c010b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d03200241017422042003200420034b1b22044100480d030240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a0000200041016a20011091010b024020002d00214101460d0002400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d03200041017422032002200320024b1b22034100480d030240024020000d002003102a21020c010b200128020020002003102e21020b2002450d0220012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d02200241017422042003200420034b1b22044100480d020240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a0000200041226a20011091010f0b1033000b1035000bdb1505047f017e027f017e047f23004180046b22022400200241e0006a41086a220341e5d6c500ad42808080808002841002220441086a290000370300200220042900003703602004102c200241186a41086a2205200329030037030020022002290360370318200341affbc000ad4280808080f000841002220441086a290000370300200220042900003703602004102c200241a0026a41086a22042003290300370300200220022903603703a002200241f0026a2000109f01024041c000102a2203450d0020032002290318370000200320022903a002370010200320022900f002370020200341086a2005290300370000200341186a2004290300370000200341286a200241f0026a41086a290000370000200341306a20024180036a290000370000200341386a200241f0026a41186a290000370000200241f0026a200341c00010a002024020022d00fc0222044102460d002003ad428080808080088410050b20022902f402210620022802f0022107200241186a200241fd026a41c30010db051a200241e0006a200241186a41c30010db051a0240024020044102470d002003102c0c010b200220043a00a801200241a8016a410172200241e0006a41c10010db052108200241ca016a21050240024020022d00c9014101460d00200241003602f0010c010b200241f0016a200510840220022d00a80121040b02400240024002400240200441ff01714101460d0020024100360280020c010b20024180026a20081084022002280280020d010b024020022d00c9014101460d00200241f0026a10d20120023502f80242208620022802f0022204ad84100520022802f402450d022004102c0c020b200241f0026a10d20120022802f0022104200220022802f8023602a402200220043602a0022005200241a0026a10a10220022802f402450d012004102c0c010b20024190026a41086a20024180026a41086a28020022083602002002200229038002220937039002200241a0026a2009a7220a200810a0020240024020022d00ac024102470d00200241003602c803200242013703c003200241d0036a41146a410d360200200241dc036a410b360200200241103602ec03200241e5d6c5003602e8032002410b3602d403200241073602f403200241affbc0003602f003200220024190026a3602e0032002200241f0036a3602d8032002200241e8036a3602d0032002200241c0036a3602fc03200241f0026a41146a4103360200200242033702f402200241849dc5003602f0022002200241d0036a36028003200241fc036a41c49ac500200241f0026a10391a20023502c80342208620023502c00384100420022802c403450d0120022802c003102c0c010b200241f0026a200241a0026a41d00010db051a200241bd036a200241c9016a220441206a2d00003a0000200241b5036a200441186a290000370000200241ad036a200441106a290000370000200241a5036a200441086a2900003700002002419d036a2004290000370000200241003602d803200242013703d00320022802f002210420022802f8022205200241d0036a1067200241fc026a210b02402005450d002005410574210503402004200241d0036a109101200441206a2104200541606a22050d000b0b200b200241d0036a10a30220022802d40321042008ad422086200aad8420023502d80342208620022802d0032205ad84100102402004450d002005102c0b20022802f402450d0020022802f002102c0b0240200228029402450d00200228029002102c0b4101210a0c010b4100210a0b0240024020022802f00122080d00410021040c010b20024190026a41086a200241f0016a41086a280200220b360200200220022903f001220937039002200241a0026a2009a7220c200b10a0020240024020022d00ac024102470d00200241003602c803200242013703c003200241d0036a41146a410d360200200241dc036a410b360200200241103602ec03200241e5d6c5003602e8032002410b3602d403200241073602f403200241affbc0003602f003200220024190026a3602e0032002200241f0036a3602d8032002200241e8036a3602d0032002200241c0036a3602fc03200241f0026a41146a4103360200200242033702f402200241a89cc5003602f0022002200241d0036a36028003200241fc036a41c49ac500200241f0026a10391a20023502c80342208620023502c00384100420022802c403450d0120022802c003102c0c010b200241f0026a200241a0026a41d00010db051a2002419c036a200241a8016a41206a2d00003a000020024194036a200241c0016a2903003702002002418c036a200241b8016a29030037020020024184036a200241a8016a41086a290300370200200220022903a8013702fc02200241003602d803200242013703d00320022802f002210420022802f8022205200241d0036a1067200241fc026a210d02402005450d002005410574210503402004200241d0036a109101200441206a2104200541606a22050d000b0b200d200241d0036a10a30220022802d4032104200bad422086200cad8420023502d80342208620022802d0032205ad84100102402004450d002005102c0b20022802f402450d0020022802f002102c0b0240200228029402450d00200228029002102c0b410121040b0240200a200228028002220545720d00200228028402450d002005102c0b02402004200845720d0020022802f401450d002008102c0b2003102c2007450d002006a7450d002007410120071b102c0b200241e0006a41086a220441e5d6c500ad42808080808002841002220341086a290000370300200220032900003703602003102c200241186a41086a2205200429030037030020022002290360370318200441fdfbc000ad4280808080f000841002220341086a290000370300200220032900003703602003102c200241a0026a41086a22072004290300370300200220022903603703a002200241f0026a2000109f0141c000102a2203450d0020032002290318370000200320022903a002370010200320022900f002370020200341086a2005290300370000200341186a2007290300370000200341286a200241f0026a41086a2205290000370000200341306a200241f0026a41106a2208290000370000200341386a200241f0026a41186a220a2900003700002003ad428080808080088410052003102c200242f0d0c9abc6add9b1f400370310200a42003703002008420037030020054200370300200242003703f00220044191b0c200ad4280808080e000841002220341086a290000370300200220032900003703602003102c20052004290300370300200220022903603703f002200441acb0c200ad4280808080e000841002220341086a290000370300200220032900003703602003102c20082002290360220637030020072005290300370300200241a0026a41106a2006370300200241a0026a41186a200429030037030020022006370318200220022903f0023703a002200241086a200241a0026a41201094012002200228020c410020022802081b360260200241f0026a200010ae0120022802f402210420022802f002210320022802f802210820024184036a200241106a3602002002200320084105746a3602fc02200220033602f802200220043602f402200220033602f0022002200241e0006a36028003200241a0026a200241f0026a10860120052007280200360200200220022903a0023703f0022000200241f0026a10b00102402001450d002000428080e983b1de16420010c2010b20024180046a24000f0b1033000ba61b09057f017e027f027e027f037e017f057e017f230041c0016b22022400200241a0016a41186a4200370300200241a0016a41106a22034200370300200241a0016a41086a22044200370300200242003703a001200241206a41086a220541e5d6c500ad42808080808002841002220641086a290000370300200220062900003703202006102c20042005290300370300200220022903203703a001200541eae5c200ad4280808080f000841002220641086a290000370300200220062900003703202006102c20032002290320220737030020024180016a41086a200429030037030020024180016a41106a200737030020024180016a41186a200529030037030020022007370360200220022903a00137038001200241c0006a20024180016a10d101024002400240024002400240200228024022080d0041002109410821080c010b2002290244220aa721094100210502400240200a422088220ba7220c41014b0d00200c0e020201020b200c210403402004410176220620056a220d20052008200d41306c6a2001412010dd054101481b2105200420066b220441014b0d000b0b2008200541306c6a2001412010dd05450d010b200041013a0000200041086a410c360200200041046a41aeecc1003602002009450d012008102c0c010b02400240024002402005200c4f0d002008200541306c6a2204200441306a200c2005417f736a41306c10dc051a200241a0016a41186a22094200370300200241a0016a41106a220c4200370300200241a0016a41086a220d4200370300200242003703a001200241206a41086a220541e5d6c500ad428080808080028422071002220441086a290000370300200220042900003703202004102c200d2005290300370300200220022903203703a001200541a283c100ad4280808080900184220e1002220441086a290000370300200220042900003703202004102c200241e0006a41086a22042005290300220f37030020022002290320221037036020032010370000200341086a200f37000020024180016a41086a200d29030037030020024180016a41106a200c29030037030020024180016a41186a2009290300370300200220022903a00137038001200241a0016a20024180016a10d10120022802a0012206410820061b21110240024020022902a401420020061b220f422088221050450d00420021100c010b20092011201042ffffffff0f7c2210a741306c6a220641186a290300370300200c200641106a290300370300200d200641086a290300370300200220062903003703a0012010422086200f42ffffffff0f8384210f200641286a290300211220062903202113420121100b200241e0006a41186a4200370300200241e0006a41106a220c42003703002004420037030020024200370360200520071002220641086a290000370300200220062900003703202006102c2004200529030037030020022002290320220737038001200220073703602005200e1002220641086a290000370300200220062900003703202006102c200c20022903202207370300200241c0006a41086a2004290300370300200241c0006a41106a2007370300200241c0006a41186a20052903003703002002200737038001200220022903603703400240024020110d00200241c0006aad428080808080048410050c010b20024100360288012002420137038001200f422088a7220520024180016a10670240024020050d002002280288012104200228028401210d20022802800121060c010b2011200541306c6a2109201121050340200520024180016a109101200541286a2903002107200541206a290300210e02400240200228028401220d20022802880122046b4110490d0020022802800121060c010b200441106a22062004490d0a200d41017422042006200420064b1b22034100480d0a02400240200d0d002003102a21060c010b200228028001200d2003102e21060b2006450d092002200336028401200220063602800120022802880121042003210d0b200620046a220320073700082003200e3700002002200441106a2204360288012009200541306a2205470d000b0b200241c0006aad42808080808004842004ad4220862006ad8410010240200d450d002006102c0b200fa7450d002011102c0b200a42ffffffff0f83200b42ffffffff0f7c2214422086221584210b200241186a200241a0016a41186a2903002207370300200241106a200241a0016a41106a290300220e370300200241086a200241a0016a41086a290300220f370300200220022903a0012216370300200241206a41186a22052007370300200241206a41106a2204200e370300200241206a41086a2203200f370300200220163703200240201050450d00410021110c040b20024180016a41186a200529030037030020024180016a41106a200429030037030020024180016a41086a20032903003703002002200229032037038001410021050240024002402014a7220941014b0d0020090e020201020b2009210403402004410176220620056a220d20052008200d41306c6a20024180016a412010dd054101481b2105200420066b220441014b0d000b0b2008200541306c6a20024180016a412010dd052204450d022004411f7620056a21050b200241c0006a41186a20024180016a41186a2903002207370300200241c0006a41106a20024180016a41106a290300220e370300200241c0006a41086a20024180016a41086a290300220f37030020022002290380012210370340200241e0006a41186a2007370300200241e0006a41106a200e370300200241e0006a41086a200f37030020022010370360200241a0016a41186a2007370300200241a0016a41106a200e370300200241a0016a41086a200f370300200220103703a001200520094b0d0202402009200aa7470d00200941016a22042009490d07200941017422062004200620044b1bad220742307e220e422088a70d07200ea722044100480d070240024020090d002004102a21080c010b2008200941306c2004102e21080b2008450d062015200784210b0b2008200541306c6a220441306a2004200920056b41306c10dc051a200441286a201237030020042013370320200441186a200241a0016a41186a290300370300200441106a200241a0016a41106a290300370300200441086a200241a0016a41086a290300370300200420022903a001370300200b42ffffffff0f83200a4280808080708384210b410121110c030b418ab4c000411d41acfec5001036000b200241c0006a41186a20024180016a41186a290300370300200241c0006a41106a20024180016a41106a290300370300200241c0006a41086a20024180016a41086a2903003703002002200229038001370340410021110c010b41ecb3c000411e41acfec5001036000b200241e0006a41186a22064200370300200241e0006a41106a220d4200370300200241e0006a41086a2205420037030020024200370360200341e5d6c500ad42808080808002841002220441086a290000370300200220042900003703202004102c200520032903003703002002200229032022073703800120022007370360200341eae5c200ad4280808080f000841002220441086a290000370300200220042900003703202004102c20024180016a41086a2003290300220737030020022002290320220e37038001200c200e370000200c41086a2007370000200241c0006a41086a2005290300370300200241c0006a41106a200d290300370300200241c0006a41186a200629030037030020022002290360370340200241003602a801200242013703a001200b422088a7220c200241a0016a106702400240200c0d0020022802a801210420022802a401210d20022802a00121060c010b2008200c41306c6a21092008210503402005200241a0016a109101200541286a2903002107200541206a290300210e0240024020022802a401220d20022802a80122046b4110490d0020022802a00121060c010b200441106a22062004490d05200d41017422042006200420064b1b22034100480d0502400240200d0d002003102a21060c010b20022802a001200d2003102e21060b2006450d04200220033602a401200220063602a00120022802a80121042003210d0b200620046a220320073700082003200e3700002002200441106a22043602a8012009200541306a2205470d000b0b200241c0006aad42808080808004842004ad4220862006ad8410010240200d450d002006102c0b200c41306c220541306d2103410021060240024020050d0041012109410021030c010b200341ffffff3f712003470d03200341057422054100480d032005102a2209450d020b200ba721170240200c450d00200c41306c210d4100210620092105200821040340200441086a2900002107200441106a290000210e2004290000210a200541186a200441186a290000370000200541106a200e370000200541086a20073700002005200a370000200641016a2106200541206a2105200441306a2104200d41506a220d0d000b0b02402017450d002008102c0b200241a0016a41186a200141186a290000370300200241a0016a41106a200141106a290000370300200241a0016a41086a200141086a290000370300200220012900003703a001200241a0016a41012009200610dd01200020113a0001200041003a0000200041026a2002290180013701002000410a6a20024180016a41086a2f01003b01002003450d002009102c0b200241c0016a24000f0b1033000b1035000b960303057f017e017f230041e0006b22012400200141206a41186a4200370300200141206a41106a22024200370300200141206a41086a2203420037030020014200370320200141d0006a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200120052900003703502005102c2003200429030037030020012001290350370320200441eae5c200ad4280808080f000841002220541086a290000370300200120052900003703502005102c200220012903502206370300200141086a2003290300370300200141106a2006370300200141186a20042903003703002001200637034020012001290320370300200141206a200110d10120012802202203410820031b2107410021040240024002402001290224420020031b2206422088a7220341014b0d0020030e020201020b03402003410176220520046a220220042007200241306c6a2000412010dd054101481b2104200320056b220341014b0d000b0b2007200441306c6a2000412010dd054521040b02402006a7450d002007102c0b200141e0006a240020040b960303057f017e017f230041e0006b22012400200141206a41186a4200370300200141206a41106a22024200370300200141206a41086a2203420037030020014200370320200141d0006a41086a220441e5d6c500ad42808080808002841002220541086a290000370300200120052900003703502005102c2003200429030037030020012001290350370320200441a283c100ad42808080809001841002220541086a290000370300200120052900003703502005102c200220012903502206370300200141086a2003290300370300200141106a2006370300200141186a20042903003703002001200637034020012001290320370300200141206a200110d10120012802202203410820031b2107410021040240024002402001290224420020031b2206422088a7220341014b0d0020030e020201020b03402003410176220520046a220220042007200241306c6a2000412010dd054101481b2104200320056b220341014b0d000b0b2007200441306c6a2000412010dd054521040b02402006a7450d002007102c0b200141e0006a240020040bb309010a7f230041b0016b2202240041002103024020012802102204450d0020012802082205200128020c460d00200128021421062001200541246a360208200241c4006a41026a2207200541036a2d00003a0000200241286a41086a2208200541106a290000370300200241286a41106a2209200541186a290000370300200241286a41186a220a200541206a280000360200200220052f00013b01442002200541086a29000037032820052d0000220b4102460d00200541046a280000210520012004417f6a360210200241086a41026a20072d00003a000020024190016a41086a200829030037030020024190016a41106a200929030037030020024190016a41186a200a280200360200200220022f01443b01082002200229032837039001024002400240200b4101460d002002418c016a41026a200241086a41026a2d00003a0000200241f0006a41086a20024190016a41086a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41186a20024190016a41186a2d00003a0000200220022f01083b018c0120022002290390013703700c010b200241c8006a2005410676109102200228024821040240024020022802502005413f7122014b0d00410021010c010b2002418c016a41026a200420014105746a220141026a2d00003a0000200241f8006a2001410f6a29000037030020024180016a200141176a29000037030020024188016a2001411f6a2d00003a0000200220012f00003b018c012002200129000737037020012800032105410121010b0240200228024c450d002004102c0b20010d00410121010c010b200241ec006a41026a2002418c016a41026a2d00003a000020024190016a41086a200241f0006a41086a29030037030020024190016a41106a200241f0006a41106a29030037030020024190016a41186a200241f0006a41186a2d00003a0000200220022f018c013b016c2002200229037037039001410021010b200241e8006a41026a2204200241ec006a41026a2d00003a0000200241c8006a41086a220720024190016a41086a290300370300200241c8006a41106a220820024190016a41106a290300370300200241c8006a41186a220920024190016a41186a2d00003a0000200220022f016c3b016820022002290390013703480240024020010d002002418c016a41026a20042d00003a0000200241f0006a41086a2007290300370300200241f0006a41106a2008290300370300200241f0006a41186a20092d00003a0000200220022f01683b018c0120022002290348370370410121010c010b200641013a0000410021010b200241246a41026a22042002418c016a41026a2d00003a0000200241086a41086a2207200241f0006a41086a290300370300200241086a41106a2208200241f0006a41106a290300370300200241086a41186a2209200241f0006a41186a2d00003a0000200220022f018c013b0124200220022903703703082001450d00200020022f01243b0001200041046a2005360000200041086a2002290308370000200041036a20042d00003a0000200041106a2007290300370000200041186a2008290300370000200041206a20092d00003a0000410121030b200020033a0000200241b0016a24000bc30405057f017e017f017e067f230041f0016b22022400024002402000280200220320002802044f0d00200028020c2104200141086a210520024190016a4102722106024003402000200341016a36020020024190016a2000280208280200220310af0120022d0090014101460d012002290091012107200241086a2003107720022802082208450d01200229020c210920022007370300024002402001280200220a41d0e1c100460d002001280204210b0c010b2006410041da0010da051a200241086a410041840110da051a41e401102a220a450d044100210b200a4100360200200a41046a20024190016a41dc0010db051a200a41e0006a200241086a41840110db051a200141003602042001200a3602000b024002400340200a41086a210c200a2f0106220d41037421034100210e024003402003450d012002200c410810dd05220f450d03200341786a2103200e41016a210e200c41086a210c200f417f4a0d000b200e417f6a210d0b0240200b450d00200b417f6a210b200a200d4102746a41e4016a280200210a0c010b0b2002200737021c200220053602182002200d360214200220013602102002200a36020c2002410036020820022009370294012002200836029001200241086a20024190016a10aa020c010b200a200e410c6c6a220341e4006a220c280200210e200c2009370200200341e0006a220c2802002103200c20083602002003450d00200e450d002003102c0b200028020022032000280204490d000c020b0b200441013a00000b200241f0016a24000f0b1033000bcc1207027f017e057f027e017f017e0a7f230041b0036b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241f0016a41086a2207200141086a280200360200200220012902003703f001024002400240024020002f01062201410b490d00200241d0026a410272410041da0010da051a200241386a410041840110da051a41e401102a2208450d0320084100360200200841046a200241d0026a41dc0010db051a200841e0006a200241386a41840110db052107200241386a41086a2209200041b0016a280200360200200220002902a8013703382000413c6a330000210a2000413e6a310000210b20002d003f210c2000350038210d200841086a200041c0006a20002f010641796a220141037410db05210e2007200041b4016a2001410c6c10db052107200041063b0106200820013b0106200241d0026a41086a2009280200360200200220022903383703d002200d200a200b4210868442208684210a0240024020034107490d002003410374200e6a41506a200e200341796a22094103746a220e200141ffff037120096b41037410dc051a200e20043700002003410c6c20076a220341b87f6a200341ac7f6a2203200841066a22012f010020096b410c6c10dc051a200341086a200241f0016a41086a280200360200200320022903f0013702000c010b200041086a20034103746a220741086a2007200041066a22012f010020036b41037410dc051a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c10dc051a200741086a200241f0016a41086a280200360200200720022903f0013702000b200120012f010041016a3b0100200241286a41086a220f200241d0026a41086a22102802002203360200200241086a221120033602002002200c3a0017200220022903d00222043703282002200a3e02102002200a4230883c00162002200a4220883d011420022004370300200229031021042000280200220c450d0120002f01042112200241d0026a410272211303402002200641016a22063602202002200c360224200f201128020036020020022002290300370328201241ffff03712109024002400240200c2f01062200410b490d002013410041da0010da051a200241f0016a200241d0026a41dc0010db051a200241386a410041b40110da051a419402102a2207450d0720074100360200200741046a200241f0016a41dc0010db051a200741e0006a200241386a41b40110db052103200c41386a290000210a200241386a41086a2214200c41b0016a2802003602002002200c41a8016a290200370338200741086a200c41c0006a200c2f0106220141796a220041037410db0521152003200c41b4016a2000410c6c10db052116200741e4016a200c4180026a2001417a6a220e41027410db052117200c41063b0106200720003b01060240200e450d00410021002017210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b20102014280200220036020020022002290338220b3703d002201420003602002002200b370338201241ffff037122034107490d0120152009417a6a22034103746a2015200941796a22004103746a220120072f010620006b41037410dc051a200120043700002009410c6c20166a220141b87f6a200141ac7f6a220120072f0106220e20006b410c6c10dc051a200141086a200f280200360200200120022903283702002007200e41016a22013b01062009410274221220176a416c6a201720034102746a220e200141ffff0371220920036b41027410dc051a200e200836020020092003490d02200720126a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320002009490d000c030b0b200c41086a2201200941016a22034103746a200120094103746a2201200020096b220741037410dc051a20012004370000200c2009410c6c6a220141ec006a200141e0006a220e2007410c6c10dc051a200141e8006a200241286a41086a280200360200200e2002290328370200200c200041016a22003b01062009410274200c41e4016a22016a41086a200120034102746a2201200041ffff0371220720036b41027410dc051a20012008360200201241ffff037120074f0d05200c2003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b01042001200c360200200341046a210320002007490d000c060b0b200c41086a2200200941016a220e4103746a200020094103746a2200200c2f0106220120096b221241037410dc051a20002004370000200c41e0006a2009410c6c6a2200410c6a20002012410c6c10dc051a200041086a200f28020036020020002002290328370200200c200141016a22003b010620094102742217200c41e4016a22016a41086a2001200e4102746a2212200041ffff03712201200e6b41027410dc051a20122008360200200320014f0d00200c20176a41e8016a2100034020002802002203200941016a22093b01042003200c360200200041046a210020012009470d000b0b200241106a41086a2014280200220036020020112000360200200220022903382204370310200220043703000240200c28020022000d0020072108200a21040c030b200c2f010421122000210c200a2104200721080c000b0b200020034103746a220941106a200941086a2209200120036b41037410dc051a2009200437000020002003410c6c6a220141ec006a200141e0006a220920002f010620036b410c6c10dc051a200141e8006a2007280200360200200920022903f001370200200020002f010641016a3b01060c010b200241d0026a410272410041da0010da051a200241f0016a200241d0026a41dc0010db051a200241386a410041b40110da051a419402102a2200450d0120004100360200200041046a200241f0016a41dc0010db051a200041e0006a200241386a41b40110db0521012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f01062203410c6c6a22012002290300370200200020034103746a41086a2004370000200141086a200241086a280200360200200041e4016a200341016a22034102746a2008360200200020033b0106200820033b0104200820003602000b200241b0036a24000f0b1033000b0900200042043702000bf10602027f067e230041d0016b220624000240200341ff0171450d00200641d0006a2001ad42004280c8afa025420010e005200641c0006a2002418094ebdc032002418094ebdc03491bad420042e807420010e00520064190016a41186a420037030020064190016a41106a2207420037030020064190016a41086a220342003703002006420037039001200641c0016a41086a2202418be9c500ad42808080808001841002220141086a290000370300200620012900003703c0012001102c20032002290300370300200620062903c0013703900120024193e9c500ad42808080809002841002220141086a290000370300200620012900003703c0012001102c200720062903c0012208370300200641f0006a41086a2003290300370300200641f0006a41106a2008370300200641f0006a41186a2002290300370300200620083703b0012006200629039001370370200641d0006a41086a290300200641c0006a41086a2903007c2006290350220820062903407c2209200854ad7c20094280a094a58d1d7c2208200954ad7c2109200641e0006a200641f0006a1098010240024020062802600d00410021024200210a0c010b2006290368220b200b423f87220a7c200a85210a200b42005521020b200641206a20082009428094ebdc03420010e105200641106a2006290320220b200641206a41086a290300220c4280ec94a37c427f10e005200641306a20082009200a428094ebdc0380220d420010e0052006200a200d4280ec94a37c7e7ca72203360290012006418094ebdc03360294012006200b200c20064190016a2003418094ebdc034b4102746a350200220a420010e005427f427f2009200641306a41086a290300200641086a2903007c2006290330220c20062903007c220b200c54ad7c200b200a200820062903107c7e220a200a428094ebdc0380220a4280ec94a37c7e7c4280cab5ee0156200aa76aad7c220a200b54ad7c220c7c2008200a7c220d2008542203ad7c220b2003200b200954200b2009511b22031b42002009200c7d2008200a54ad7d220b2008200a7d220a200856200b200956200b2009511b22011b20021b220820057c427f200d20031b4200200a20011b20021b220920047c22042009542202ad7c22092002200920085420092008511b22021b2105427f200420021b21040b2000200437030020002005370308200641d0016a24000bb9280a017f047e067f027e047f017e017f017e0b7f027e230041e0046b2201240002400240024020004180e101700d00200141a0036a10ae0220014190016a200141a0036a10b7012001420020014190016a41086a29030022022001290390012203428080e983b1de1654ad7d2204200342808097fccea1697c22052003562004200256200342ffffe883b1de16561b22061b22033703a80120014200200520061b22023703a001200141a0036a41186a22072003370300200141a0036a41106a22082002370300200141a0036a41086a220941013a00002001410c3a00a0034100210a41014100200141a0036a109201200141003a00b701200142003703c001200142003703b801200742003703002008420037030020094200370300200142003703a003200141c8016a41086a220b41a4e9c500ad4280808080800184220c1002220641086a290000370300200120062900003703c8012006102c2009200b290300370300200120012903c80122033703c002200120033703a003200b41b9e9c500ad4280808080900184220d1002220641086a290000370300200120062900003703c8012006102c200820012903c8012203370300200141d8016a41086a220e2009290300370300200141d8016a41106a220f2003370300200141d8016a41186a2210200b290300370300200120033703c002200120012903a0033703d801200141a0036a200141d8016a10960120012802a0032206410420061b2111024020012902a403420020061b2212422088a72213450d00200141c8016aad4280808080c000842114200141a9036a2115200141c0026a41c0006a2116200141e0026a2117410021184100210a41002106024003400240024002400240200a450d00201120064102746a21192011200620186a4102746a211a0340200620134f0d02200141d8016a2019280200221b10af0220012903d8014201520d04200141c0026a200e41e00010db051a20012903a001220420012903c002220554200141a0016a41086a2903002203200141c0026a41086a29030022025420032002511b450d03200141013a00b7010240201820066a221b20134f0d00201a2019280200360200201941046a2119201a41046a211a200641016a22062013490d010c070b0b41fcb4c000201b20131038000b201120064102746a21190340200620134f0d01200141d8016a2019280200221b10af0220012903d8014201520d03200141c0026a200e41e00010db051a20012903a001220420012903c00222055a200141a0016a41086a2903002203200141c0026a41086a29030022025a20032002511b0d02201941046a2119200141013a00b701200641016a22062013490d000b4100210a0c050b41a8b4c000200620131038000b2001200420057d3703a0012001200320027d2004200554ad7d3703a801200b200c1002221941086a290000370300200120192900003703c8012019102c200141a0046a41086a221a200b290300370300200120012903c8013703a004200b41e1e5c200ad42808080809001841002221941086a290000370300200120192900003703c8012019102c200141b0046a41086a221c200b290300370300200120012903c8013703b0042001201b3602c801200720141006221941186a2900003703002008201941106a2900003703002009201941086a290000370300200120192900003703a0032019102c200141c0046a41186a221d2007290300370300200141c0046a41106a221e2008290300370300200141c0046a41086a221f2009290300370300200120012903a0033703c00441c000102a2219450d06201920012903a004370000201941086a201a290300370000201920012903b004370010201941186a201c290300370000201920012903c004370020201941286a201f290300370000201941306a201e290300370000201941386a201d2903003700002019ad428080808080088410052019102c201720012903d002200141c0026a41186a29030010c20120014180016a201620012903c002200141c0026a41086a2219290300109d01200141b8016a41086a221a427f201a290300220320014180016a41086a2903007c20012903b80122022001290380017c2204200254221aad7c2202201a200220035420022003511b221a1b3703002001427f2004201a1b3703b80120012903c0022103200141a0036a41386a201929030037030020152016290000370000201541086a201641086a290000370000201541106a201641106a290000370000201541186a201641186a290000370000200120033703d003200141023a00a8032001410c3a00a0032001201b3602cc0341014100200141a0036a1092010b2018417f6a2118200a41016a210a200641016a22062013490d000b0b200a450d00200620134f0d00201120064102746a2219200a4102746b2019201320066b41027410dc051a0b200742003703002008420037030020094200370300200142003703a003200b200c1002220641086a290000370300200120062900003703c8012006102c2009200b290300370300200120012903c80122033703c002200120033703a003200b200d1002220641086a290000370300200120062900003703c8012006102c200141c0026a41086a200b2903002203370300200120012903c80122023703c00220082002370000200841086a2003370000200e2009290300370300200f200829030037030020102007290300370300200120012903a0033703d8010240024020110d00200141d8016aad428080808080048410050c010b200141003602a803200142013703a0032013200a6b2206200141a0036a10670240024020060d0020012802a803211320012802a403210e20012802a00321190c010b201120064102746a210b20012802a403210e20012802a80321062011211a0340201a280200211b02400240200e20066b4104490d00200641046a211320012802a00321190c010b200641046a22132006490d05200e41017422192013201920134b1b22184100480d0502400240200e0d002018102a21190c010b20012802a003200e2018102e21190b2019450d06200120183602a403200120193602a0032018210e0b200120133602a803201920066a201b36000020132106200b201a41046a221a470d000b0b2012a72106200141d8016aad42808080808004842013ad4220862019ad8410010240200e450d002019102c0b2006450d002011102c0b024020012d00b7010d00200141d8006a20012903a0012203200141a0016a41086a2206290300220242c0843d420010e105200141c8006a20012903582204200141d8006a41086a290300220542c0fb42427f10e005200141386a2004200542a0c21e420010e005200620022002200141386a41086a29030020012903382204200320012903487c220542a0c21e7e2005420188220542c0fb427e7c42a0c21e562005a76aad7c2205200454ad7c22042005200356200420025620042002511b22131b22047d20032003200520131b220254ad7d3703002001200320027d3703a001200141a0036a41186a22194200370300200141a0036a41106a221a4200370300200141a0036a41086a22134200370300200142003703a003200141c8016a41086a2206418be9c500ad428080808080018422051002220e41086a2900003703002001200e2900003703c801200e102c20132006290300370300200120012903c80122033703c004200120033703a003200641c9b5c000ad4280808080d00184220c1002220e41086a2900003703002001200e2900003703c801200e102c201a20012903c8012203370300200141d8016a41086a22182013290300370300200141d8016a41106a220b2003370300200141d8016a41186a22082006290300370300200120033703c004200120012903a0033703d801200141e8006a200141d8016a4120109e01200141e8006a41106a29030021032001290370210d2001280268210e20194200370300201a420037030020134200370300200142003703a003200620051002221b41086a2900003703002001201b2900003703c801201b102c20132006290300370300200120012903c80122053703c004200120053703a0032006200c1002221b41086a2900003703002001201b2900003703c801201b102c20192006290300220537030020182013290300370300200b20012903c801220c370300200820053703002001200c3703c004200120012903a0033703d8012001420020034200200e1b220320047d200d4200200e1b2205200254ad7d220c200520027d220d200556200c200356200c2003511b22061b3703a80320014200200d20061b3703a003200141d8016aad4280808080800484200141a0036aad42808080808002841001200141b8016a41086a220e427f200e290300220c2003200420061b7c20012903b80122032005200220061b7c22052003542206ad7c220320062003200c542003200c511b22061b3703002001427f200520061b3703b80120192004370300201a2002370300201341033a00002001410c3a00a00341014100200141a0036a1092010b200141c0026a10ae02200141d8016a200141c0026a20012903b8012203200141b8016a41086a2903002202410210ac010240024020012802d8010d00200141d8016a41106a290300210520012903e0012104200141a0036a41186a22194200370300200141a0036a41106a22064200370300200141a0036a41086a221a4200370300200142003703a003200141c8016a41086a2213418be9c500ad428080808080018422141002220e41086a2900003703002001200e2900003703c801200e102c201a2013290300370300200120012903c801220c3703a0042001200c3703a003201341c9b5c000ad4280808080d0018422201002220e41086a2900003703002001200e2900003703c801200e102c200620012903c801220c370300200141c0046a41086a201a290300370300200141c0046a41106a221a200c370300200141c0046a41186a220e20132903003703002001200c3703b004200120012903a0033703c004200141086a200141c0046a4120109e01200220057d2003200454ad7d200520027d2004200354ad7d20042003582005200258200520025122131b221b1b2121200320047d200420037d201b1b2112200141086a41106a29030042002001280208221b1b210c20012903104200201b1b210d024002402004200356200520025620131b0d002019420037030020064200370300200141a0036a41086a221b4200370300200142003703a003200141c8016a41086a221320141002221841086a290000370300200120182900003703c8012018102c201b2013290300370300200120012903c80122033703a004200120033703a003201320201002221841086a290000370300200120182900003703c8012018102c200141b0046a41086a20132903002203370300200120012903c80122023703b00420062002370000200641086a2003370000200141c0046a41086a201b290300370300201a2006290300370300200e2019290300370300200120012903a0033703c0042001427f200c20217c200d20127c2202200d542206ad7c220320062003200c542003200c511b22061b3703a8032001427f200220061b3703a003200141a0036a21060c010b2019420037030020064200370300200141a0036a41086a221b4200370300200142003703a003200141c8016a41086a221320141002221841086a290000370300200120182900003703c8012018102c201b2013290300370300200120012903c80122033703a004200120033703a003201320201002221841086a290000370300200120182900003703c8012018102c200141b0046a41086a20132903002203370300200120012903c80122023703b00420062002370000200641086a2003370000200141c0046a41086a201b290300370300201a2006290300370300200e2019290300370300200120012903a0033703c00420014200200c20217d200d201254ad7d2203200d20127d2202200d562003200c562003200c511b22061b3703a80320014200200220061b3703a003200141a0036a21060b200141c0046aad42808080808004842006ad428080808080028410010c010b41c9c5c100ad4280808080a009841004200141a0036a41186a22194200370300200141a0036a41106a221a4200370300200141a0036a41086a22134200370300200142003703a003200141c8016a41086a2206418be9c500ad428080808080018422051002220e41086a2900003703002001200e2900003703c801200e102c20132006290300370300200120012903c80122043703c004200120043703a003200641c9b5c000ad4280808080d00184220c1002220e41086a2900003703002001200e2900003703c801200e102c201a20012903c8012204370300200141d8016a41086a221b2013290300370300200141d8016a41106a22182004370300200141d8016a41186a220b2006290300370300200120043703c004200120012903a0033703d801200141206a200141d8016a4120109e01200141206a41106a29030021042001290328210d2001280220210e20194200370300201a420037030020134200370300200142003703a003200620051002221a41086a2900003703002001201a2900003703c801201a102c20132006290300370300200120012903c80122053703c004200120053703a0032006200c1002221a41086a2900003703002001201a2900003703c801201a102c201920062903002205370300201b2013290300370300201820012903c801220c370300200b20053703002001200c3703c004200120012903a0033703d8012001427f20044200200e1b220420027c200d4200200e1b220220037c22052002542206ad7c22032006200320045420032004511b22061b3703a8032001427f200520061b3703a003200141d8016aad4280808080800484200141a0036aad428080808080028410010b20012903a0012103200141b8036a200141a0016a41086a290300370300200141b0036a2003370300200141a0036a41086a41043a00002001410c3a00a00341014100200141a0036a1092010b2000108c01200141e0046a24000f0b1035000b1033000be70301067f230041d0006b22012400200141ed003a0008024002404101102a2202450d00200241ed003a0000200141ef003a0008200241014102102e2202450d00200241ef003a0001200141e4003a0008200241024104102e2202450d00200241e4003a0002200241ec003a0003200141f0003a0008200241044108102e2202450d00200241f0003a0004200241f9003a00052002412f3a0006200241f4003a0007200141f2003a0008200241084110102e2203450d00200341f2003a0008200341f3003a0009200341f2003a000a200341f9003a000b200141003a0048410c210220032104410021050340200141003a0008200141086a20042002410047220610db051a024020020d00200141003a00080b20022006490d02200141286a20056a20012d00083a00002001200541016a22053a0048200220066b2102200420066a210420054120470d000b200141086a41186a2202200141286a41186a290300370300200141086a41106a2205200141286a41106a290300370300200141086a41086a2206200141286a41086a290300370300200120012903283703082003102c200041186a2002290300370000200041106a2005290300370000200041086a200629030037000020002001290308370000200141d0006a24000f0b1033000b200620021047000b8d0402077f017e230041f0016b22022400200241086a220341a4e9c500ad42808080808001841002220441086a290000370300200220042900003703002004102c200241e8006a41086a2205200329030037030020022002290300370368200341e1e5c200ad42808080809001841002220441086a290000370300200220042900003703002004102c200241f8006a41086a2206200329030037030020022002290300370378200220013602ec01200241186a2201200241ec016aad4280808080c000841006220441186a290000370300200241106a2207200441106a2900003703002003200441086a290000370300200220042900003703002004102c20024188016a41186a2208200129030037030020024188016a41106a2201200729030037030020024188016a41086a220720032903003703002002200229030037038801024041c000102a2204450d0020042002290368370000200420022903783700102004200229038801370020200441086a2005290300370000200441186a2006290300370000200441286a2007290300370000200441306a2001290300370000200441386a20082903003700002002200441c00010b8022002290300210920024188016a200341e00010db051a0240024020094201510d00200042003703000c010b20004201370300200041086a20024188016a41e00010db051a0b2004102c200241f0016a24000f0b1033000b961b05067f017e047f017e277f230041c00d6b22032400200341106a41186a22044200370300200341106a41106a22054200370300200341106a41086a2206420037030020034200370310200341f00c6a41086a22074191b0c200ad4280808080e000841002220841086a290000370300200320082900003703f00c2008102c20062007290300370300200320032903f00c370310200741acb0c200ad4280808080e000841002220841086a290000370300200320082900003703f00c2008102c200520032903f00c2209370300200341a00d6a41086a220a2006290300370300200341a00d6a41106a220b2009370300200341a00d6a41186a220c2007290300370300200320093703900d200320032903103703a00d200341086a200341a00d6a4120109401200328020c21082003280208210d20044200370300200542003703002006420037030020034200370310200741c586c200ad42808080808003841002220541086a290000370300200320052900003703f00c2005102c20062007290300370300200320032903f00c37031020074193c6c100ad4280808080e001841002220541086a290000370300200320052900003703f00c2005102c200420072903002209370300200a2006290300370300200b20032903f00c220e370300200c20093703002003200e3703900d200320032903103703a00d200341106a200341a00d6a412010d00120032802102206410120061b210f024002402003290214420020061b2209422088a722040d0020004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b200341106a410041e00c10da051a2008417f6a41d100704130200d1b2106200241056a2110200f41206a2111200f20044105746a2112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128410021294100212a4100212b4100212c4100212d4100212e4100212f410021304100213141002132200f21084100213341d10021340240034020332105024002402006450d000240200f450d00200641016a2106034020112008220441206a22352004201246220d1b21082006417f6a22060d000b20112035200d1b2108200f2004200d1b220d0d020c040b200641016a2106034020122008460d04200841206a21082006417f6a22060d000b200841606a220d0d010c030b024020082012470d0020112108200f220d0d010c030b2008210d200841206a21080b02400240024002402010417f4c0d00024002402010450d002010102a2206450d0341002104200341003602a80d200320103602a40d200320063602a00d0c010b200341003602a80d200320103602a40d200341013602a00d4101102a2206450d02200341013602a40d200320063602a00d20032802a80d21040b2003200441016a3602a80d200620046a20053a00002002200341a00d6a10670240024020032802a40d220420032802a80d22066b2002490d0020032802a00d21040c010b200620026a22352006490d03200441017422062035200620354b1b22064100480d030240024020040d002006102a21040c010b20032802a00d20042006102e21040b2004450d02200320063602a40d200320043602a00d20032802a80d21060b2003200620026a3602a80d200420066a2001200210db051a2003200341a00d6a3602900d200d200341900d6a10940220032802a40d2104200c20033502a80d42208620032802a00d2233ad841006220641186a290000370300200b200641106a290000370300200a200641086a290000370300200320062900003703a00d2006102c200341f00c6a41186a220d200c290300370300200341f00c6a41106a2235200b2903003703002007200a290300370300200320032903a00d3703f00c02402004450d002033102c0b2034417f6a2134200541016a2133200341106a20054103704105746a220620032903f00c370000200641186a200d290300370000200641106a2035290300370000200641086a20072903003700004100210403402005200541036e220d417d6c6a4102470d04200341106a20046a220641df006a2d000022132006411f6a2d000022147120132014722006413f6a2d000071722132200641de006a2d000022132006411e6a2d000022147120132014722006413e6a2d000071722131200641dd006a2d000022132006411d6a2d000022147120132014722006413d6a2d000071722130200641dc006a2d000022132006411c6a2d000022147120132014722006413c6a2d00007172212f200641db006a2d000022132006411b6a2d000022147120132014722006413b6a2d00007172212e200641da006a2d000022132006411a6a2d000022147120132014722006413a6a2d00007172212d200641d9006a2d00002213200641196a2d00002214712013201472200641396a2d00007172212c200641d8006a2d00002213200641186a2d00002214712013201472200641386a2d00007172212b200641d7006a2d00002213200641176a2d00002214712013201472200641376a2d00007172212a200641d6006a2d00002213200641166a2d00002214712013201472200641366a2d000071722129200641d5006a2d00002213200641156a2d00002214712013201472200641356a2d000071722128200641d4006a2d00002213200641146a2d00002214712013201472200641346a2d000071722127200641d3006a2d00002213200641136a2d00002214712013201472200641336a2d000071722126200641d2006a2d00002213200641126a2d00002214712013201472200641326a2d000071722125200641d1006a2d00002213200641116a2d00002214712013201472200641316a2d000071722124200641d0006a2d00002213200641106a2d00002214712013201472200641306a2d000071722123200641cf006a2d000022132006410f6a2d000022147120132014722006412f6a2d000071722122200641ce006a2d000022132006410e6a2d000022147120132014722006412e6a2d000071722121200641cd006a2d000022132006410d6a2d000022147120132014722006412d6a2d000071722120200641cc006a2d000022132006410c6a2d000022147120132014722006412c6a2d00007172211f200641cb006a2d000022132006410b6a2d000022147120132014722006412b6a2d00007172211e200641ca006a2d000022132006410a6a2d000022147120132014722006412a6a2d00007172211d200641c9006a2d00002213200641096a2d00002214712013201472200641296a2d00007172211c200641c8006a2d00002213200641086a2d00002214712013201472200641286a2d00007172211b200641c7006a2d00002213200641076a2d00002214712013201472200641276a2d00007172211a200641c6006a2d00002213200641066a2d00002214712013201472200641266a2d000071722119200641c5006a2d00002213200641056a2d00002214712013201472200641256a2d000071722118200641c4006a2d00002213200641046a2d00002214712013201472200641246a2d000071722117200641c3006a2d00002213200641036a2d00002214712013201472200641236a2d000071722116200641c2006a2d00002213200641026a2d00002214712013201472200641226a2d000071722115200641c1006a2d00002213200641016a2d00002214712013201472200641216a2d000071722114200641c0006a2d0000221320062d00002235712013203572200641206a2d000071722113200441800c460d04200341106a2004200d410574200541096e41e0006c6b6a6a220641ff006a20323a0000200641fe006a20313a0000200641fd006a20303a0000200641fc006a202f3a0000200641fb006a202e3a0000200641fa006a202d3a0000200641f9006a202c3a0000200641f8006a202b3a0000200641f7006a202a3a0000200641f6006a20293a0000200641f5006a20283a0000200641f4006a20273a0000200641f3006a20263a0000200641f2006a20253a0000200641f1006a20243a0000200641f0006a20233a0000200641ef006a20223a0000200641ee006a20213a0000200641ed006a20203a0000200641ec006a201f3a0000200641eb006a201e3a0000200641ea006a201d3a0000200641e9006a201c3a0000200641e8006a201b3a0000200641e7006a201a3a0000200641e6006a20193a0000200641e5006a20183a0000200641e4006a20173a0000200641e3006a20163a0000200641e2006a20153a0000200641e1006a20143a0000200641e0006a20133a0000200d2105200441e0006a220441e00c470d000c040b0b103a000b1033000b1035000b4100210620340d000b0b200020323a001f200020313a001e200020303a001d2000202f3a001c2000202e3a001b2000202d3a001a2000202c3a00192000202b3a00182000202a3a0017200020293a0016200020283a0015200020273a0014200020263a0013200020253a0012200020243a0011200020233a0010200020223a000f200020213a000e200020203a000d2000201f3a000c2000201e3a000b2000201d3a000a2000201c3a00092000201b3a00082000201a3a0007200020193a0006200020183a0005200020173a0004200020163a0003200020153a0002200020143a0001200020133a00000b02402009a7450d00200f102c0b200341c00d6a24000bf40508017f017e047f017e017f017e037f017e230041f0016b22022400200241186a2000200110ce01200241186a41106a2903002101200229032021000240024020022903182203a7450d00200241e0006a10ae02200241e0006a20002001109c01200241f8006a2001370300200241e0006a41106a2000370300200241e8006a41053a00002002410c3a006041014100200241e0006a1092010c010b2003500d00200241e0006a41186a22044200370300200241e0006a41106a22054200370300200241e0006a41086a2206420037030020024200370360200241e0016a41086a2207418be9c500ad428080808080018422081002220941086a290000370300200220092900003703e0012009102c20062007290300370300200220022903e001220337035020022003370360200741c9b5c000ad4280808080d00184220a1002220941086a290000370300200220092900003703e0012009102c200520022903e0012203370300200241306a41086a220b2006290300370300200241306a41106a220c2003370300200241306a41186a220d200729030037030020022003370350200220022903603703302002200241306a4120109e01200241106a29030021032002290308210e2002280200210920044200370300200542003703002006420037030020024200370360200720081002220541086a290000370300200220052900003703e0012005102c20062007290300370300200220022903e0012208370350200220083703602007200a1002220541086a290000370300200220052900003703e0012005102c200420072903002208370300200b2006290300370300200c20022903e001220a370300200d20083703002002200a37035020022002290360370330200242002003420020091b220320017d200e420020091b2201200054ad7d2208200120007d2200200156200820035620082003511b22071b37036820024200200020071b370360200241306aad4280808080800484200241e0006aad428080808080028410010b200241f0016a24000b130020004103360204200041b4c6c1003602000b3400200041a4e9c50036020420004100360200200041146a4103360200200041106a419ccdc100360200200041086a42083702000b1300200041043602042000419cd1c1003602000b2e01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241a0c21e3600000b2e01017f02404104102a22020d001033000b20004284808080c0003702042000200236020020024180e1013600000b2e01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241d086033600000be90804067f027e077f027e230041e0016b220324002003200236020420032001360200200341086a2002ad4220862001ad841003108d0102400240200328020822040d00200042003703000c010b200341106a2802002105200328020c210641002101200341003a00d801200541706a2107024002400340024020052001470d00200141ff0171450d02200341003a00d8010c020b200341b8016a20016a200420016a2d00003a00002003200141016a22023a00d8012007417f6a21072002210120024120470d000b200341d8006a41086a200341b8016a41086a290300370300200341d8006a41106a200341b8016a41106a290300370300200341d8006a41186a200341b8016a41186a290300370300200320032903b801370358200520026b22084110490d00200420026a22052900002109200541086a290000210a41002101200341003a00d801200841706a21080340024020082001470d00200141ff0171450d02200341003a00d8010c020b200341b8016a20016a200520016a41106a2d00003a00002003200141016a22023a00d8012002210120024120470d000b200341f8006a41086a220b200341b8016a41086a2201290300370300200341f8006a41106a220c200341b8016a41106a2208290300370300200341f8006a41186a220d200341b8016a41186a220e290300370300200320032903b801370378200720026b410f4d0d00200341386a41086a2207200341d8006a41086a290300370300200341386a41106a220f200341d8006a41106a290300370300200341386a41186a2210200341d8006a41186a290300370300200341186a41086a2211200b290300370300200341186a41106a220b200c290300370300200341186a41186a220c200d2903003703002003200329035837033820032003290378370318200520026a220241106a2900002112200241186a2900002113200120072903003703002008200f290300370300200e201029030037030020034198016a41086a2202201129030037030020034198016a41106a2207200b29030037030020034198016a41186a2205200c290300370300200320032903383703b8012003200329031837039801200041206a2013370300200041186a2012370300200041106a200a37030020002009370308200041286a20032903b801370300200041306a2001290300370300200041386a2008290300370300200041c0006a200e290300370300200041c8006a200329039801370300200041d0006a2002290300370300200041d8006a2007290300370300200041e0006a2005290300370300420121090c010b200341003602a00120034201370398012003410b36027c20032003360278200320034198016a360258200341cc016a4101360200200342013702bc01200341d0b0c2003602b8012003200341f8006a3602c801200341d8006a41c49ac500200341b8016a10391a20033502a0014220862003350298018410040240200328029c01450d00200328029801102c0b420021090b200020093703002006450d002004102c0b200341e0016a24000bc70904067f017e047f017e230041b0016b22072400200741206a200242002003200410e005200741f0006a41186a22084200370300200741f0006a41106a22094200370300200741f0006a41086a220a420037030020074200370370200741a0016a41086a220b41e4d2c500ad428080808080018422041002220c41086a2900003703002007200c2900003703a001200c102c200a200b290300370300200720072903a00122033703900120072003370370200b41ecd2c500ad4280808080800184220d1002220c41086a2900003703002007200c2900003703a001200c102c200920072903a0012203370300200741d0006a41086a220c200a290300370300200741d0006a41106a220e2003370300200741d0006a41186a220f200b290300370300200720033703900120072007290370370350200741c0006a200741d0006a10980120072903482103200728024021102008420037030020094200370300200a420037030020074200370370200b20041002221141086a290000370300200720112900003703a0012011102c200a200b290300370300200720072903a00122043703900120072004370370200b200d1002221141086a290000370300200720112900003703a0012011102c2008200b2903002204370300200c200a290300370300200e20072903a001220d370300200f20043703002007200d37039001200720072903703703502007200120027d2003420020101b7c370370200741d0006aad42808080808004842204200741f0006aad220d42808080808001841001200741306a20002007290320200741206a41086a290300109d012005200729033022027d200220057d2002200558200741306a41086a290300220320065820032006511b22111b2101200620037d2005200254ad7d200320067d2002200554ad7d20111b2105024002402011450d002001200510a9010c010b2008420037030020094200370300200a420037030020074200370370200b418be9c500ad428080808080018422021002221141086a290000370300200720112900003703a0012011102c200a200b290300370300200720072903a00122063703900120072006370370200b41c9b5c000ad4280808080d0018422031002221141086a290000370300200720112900003703a0012011102c200920072903a0012206370300200c200a290300370300200e2006370300200f200b290300370300200720063703900120072007290370370350200741086a200741d0006a4120109e01200741086a41106a290300210620072903102112200728020821112008420037030020094200370300200a420037030020074200370370200b20021002220941086a290000370300200720092900003703a0012009102c200a200b290300370300200720072903a00122023703900120072002370370200b20031002220941086a290000370300200720092900003703a0012009102c2008200b2903002202370300200c200a290300370300200e20072903a0012203370300200f20023703002007200337039001200720072903703703502007427f2006420020111b220620057c2012420020111b220520017c2202200554220bad7c2205200b200520065420052006511b220b1b3703782007427f2002200b1b3703702004200d428080808080028410010b200741b0016a24000bdb2601067f20002d000021020240024002400240200141046a2203280200200141086a22042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0001210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0002210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0003210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0004210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0005210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0006210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0007210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0008210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0009210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000a210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000b210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000c210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000d210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000e210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d000f210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0010210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0011210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0012210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0013210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0014210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0015210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0016210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0017210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0018210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d0019210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001a210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001b210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001c210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001d210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001e210202400240200328020020042802002205460d00200128020021060c010b200541016a22062005490d02200541017422072006200720064b1b22074100480d020240024020050d002007102a21060c010b200128020020052007102e21060b2006450d0120012006360200200141046a2007360200200141086a28020021050b2004200541016a360200200620056a20023a000020002d001f210502400240200328020020042802002200460d00200128020021030c010b200041016a22032000490d02200041017422062003200620034b1b22064100480d020240024020000d002006102a21030c010b200128020020002006102e21030b2003450d0120012003360200200141046a2006360200200141086a28020021000b2004200041016a360200200320006a20053a00000f0b1033000b1035000b34002000418be9c50036020420004100360200200041146a4101360200200041106a41f0d6c100360200200041086a42083702000b130020004102360204200041e4d7c1003602000b3400200041c586c20036020420004100360200200041146a4101360200200041106a41f4d8c100360200200041086a42183702000bb80303017f017e027f230041d0006b2203240002402001200210252204422088a72201450d002004a722022d0000220541014b0d002001417f6a210602400240024020050e020001000b41002101200341003a0049200241016a21050340024020062001470d00200141ff0171450d04200341003a00490c040b200341286a20016a200520016a2d00003a00002003200141016a22023a00492002210120024121470d000b200341106a200341316a290000370300200341186a200341396a290000370300200341206a200341c1006a2900003703002003200329002937030820032d00282101410021020c010b2006450d0120022d0001220141034f0d01200341086a41186a200341286a41186a290000370300200341086a41106a200341286a41106a290000370300200341086a41086a200341286a41086a29000037030020032003290028370308410121020b200020013a0001200020023a0000200041026a20032903083700002000410a6a200341106a290300370000200041126a200341186a2903003700002000411a6a200341206a290300370000200341d0006a24000f0b41d88bc600412e200341286a41888cc600103b000b130020004102360204200041f4e9c5003602000bf80303097f017e017f230041e0026b22022400200141086a2802002103200028020421042000280200210520012802042106024020002802082207200028020c2208460d0020012802002100200241086a41096a2109200241d0016a410472210a0240034020072802002101200241c4006a200741046a418c0110db051a20014118460d01200220013602d001200a200241c4006a418c0110db051a200241003b0118200241086a200241d0016a200241186a10c1022002290308210b20022d00102101200241d0016a41026a220c200941026a2d00003a0000200220092f00003b01d001024020014102460d00200241186a41026a200c2d00003a0000200220022f01d0013b01180b200041086a20013a00002000200b370200200041096a20022f01183b00002000410b6a200241186a41026a2d00003a00002000410c6a2100200341016a210320074190016a22072008470d000b200821070c010b20074190016a21070b20062003360200024020072008460d00200241d0016a4104722101034020072802002100200241d0016a200741046a418c0110db051a20004118460d01200241c4006a200241d0016a418c0110db051a200220003602d0012001200241c4006a418c0110db051a200241d0016a107320074190016a22072008470d000b0b02402004450d002005102c0b200241e0026a24000bc4880308017f017e067f027e057f017e197f067e230041c00a6b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e180102000304001b1a19181716150e0d0c0b0a090800000007010b000b200141106a29030021042001410c6a280200210520022d0001210620022d00002102024002400240024002400240024002400240200141086a2802002207417f6a0e0708000102030405080b2004a7210702400240200241ff01710d00200641ff01714101460d010b2007450d3b2005102c0c3b0b2007450d362005102c0c360b200220067241ff01710d384108102a2202450d212002200437000041dddac200ad4280808080a001842002ad428080808080018410012002102c0c350b2004a721070240200220067241ff0171450d0020070d040c380b41e7dac200ad4280808080d000842004428080808070832005ad8410012007450d342005102c0c340b2004422088a721082004a721090240200220067241ff0171450d0002402008450d00200841186c21062005210203400240200241046a280200450d002002280200102c0b0240200241106a280200450d002002410c6a280200102c0b200241186a2102200641686a22060d000b0b410121064100210a4103210820090d320c330b0240200841186c2202450d00200520026a2106200521020340200241086a350200422086200235020084200241146a3502004220862002410c6a350200841001200241186a22022006470d000b0b02402008450d00200841186c21062005210203400240200241046a280200450d002002280200102c0b0240200241106a280200450d002002410c6a280200102c0b200241186a2102200641686a22060d000b0b410121064100210a4105210820090d310c320b2004422088a721082004a721090240200220067241ff0171450d0002402008450d002008410c6c21062005210203400240200241046a280200450d002002280200102c0b2002410c6a2102200641746a22060d000b0b410021064101210a410321082009450d320c310b02402008410c6c2202450d00200520026a2106200521020340200241086a35020042208620023502008410052002410c6a22022006470d000b0b02402008450d002008410c6c21062005210203400240200241046a280200450d002002280200102c0b2002410c6a2102200641746a22060d000b0b410021064101210a4105210820090d300c310b2004a72107200220067241ff0171450d012007450d340b2005102c0c330b2004428080808070832005ad84100d2007450d2f2005102c0c2f0b200220067241ff01710d310c2e0b2001410c6a2802002106200141086a280200210820012802042107024020022d000120022d000072450d0002402006450d0020064190016c21062007210203402002107320024190016a2102200641f07e6a22060d000b0b02402008450d002007102c0b20004181023b010820004111360204200041b2b2c000360200410021052000410a6a41003a0000410121070c350b41002105200341003602a806200342043703a00620064190016c22024190016d210a0240024020020d00410421060c010b200aad420c7e2204422088a70d0d2004a722064100480d0d2006102a2206450d1a2003200a3602a406200320063602a0060b2003200720026a3602bc09200320073602b80920032008ad4220862007ad843703b009200341a8076a41086a41003602002003200341a0066a41086a3602ac07200320063602a807200341b0096a200341a8076a10c002200341b0086a41086a200341a0066a41086a2802002202360200200320032903a00622043703b008200341b3076a2002360000200320043700ab07200341b0096a41086a200341af076a29000037000041012107200341013a00b009200320032900a8073700b10941014100200341b0096a109201200041023a00080c340b024020022d00000d0020022d000141ff01714102470d00200141086a2903002104200341c0036a41186a22054200370300200341c0036a41106a22024200370300200341c0036a41086a22074200370300200342003703c00341f9e8c500ad4280808080900184220b1002220628000321082006290007210c20062d000f210a20062f00002109200641026a2d0000210d2006102c2003200d3a00c203200320093b01c0032003200a3a00cf032003200c3700c703200320083600c3034182e9c500ad4280808080900184100222062d000f21082006280003210a2006290007210c20062f00002109200641026a2d0000210d2006102c200341d2036a220e200d3a0000200220093b0100200341a0036a41086a220920072903003703002003200c3700d7032003200a3600d303200341a0036a41106a220a2002290300370300200320083a00df03200341a0036a41186a22082005290300370300200320032903c0033703a003200341206a200341a0036a412041014100410010970120032802204101460d03200542003703002002420037030020074200370300200342003703c003200b10022206280003210d2006290007210b20062d000f210f20062f00002110200641026a2d000021112006102c200320113a00c203200320103b01c0032003200f3a00cf032003200b3700c7032003200d3600c303419db1c200ad42808080803084220b100222062d000f210d2006280003210f2006290007210c20062f00002110200641026a2d000021112006102c200e20113a0000200220103b0100200920072903003703002003200c3700d7032003200f3600d303200a20022903003703002003200d3a00df0320082005290300370300200320032903c0033703a003200341106a200341a0036a10980102402003290318500d002003280210450d00200341c0036a41186a22054200370300200341c0036a41106a22064200370300200341c0036a41086a22074200370300200342003703c00341f9e8c500ad42808080809001841002220228000321082002290007210c20022d000f210a20022f00002109200241026a2d0000210d2002102c2003200d3a00c203200320093b01c0032003200a3a00cf032003200c3700c703200320083600c303419db1c200ad42808080803084100222022d000f21082002280003210a2002290007210c20022f00002109200241026a2d0000210d2002102c200341d2036a200d3a0000200620093b0100200341a0036a41086a20072903003703002003200c3700d7032003200a3600d303200341a0036a41106a2006290300370300200320083a00df03200341a0036a41186a2005290300370300200320032903c0033703a0032003200341a0036a109801200329030842dc0b7c42dc0b20032802001b2004560d030b200341c0036a41186a22054200370300200341c0036a41106a22024200370300200341c0036a41086a22074200370300200342003703c00341f9e8c500ad4280808080900184220c1002220628000321082006290007211220062d000f210a20062f00002109200641026a2d0000210d2006102c2003200d3a00c203200320093b01c0032003200a3a00cf03200320123700c703200320083600c303200b100222062d000f21082006280003210a2006290007210b20062f00002109200641026a2d0000210d2006102c200341d2036a220e200d3a0000200220093b0100200341a0036a41086a220920072903003703002003200b3700d7032003200a3600d303200341a0036a41106a220a2002290300370300200320083a00df03200341a0036a41186a22082005290300370300200320032903c0033703a003200320043703b009200341a0036aad42808080808004842204200341b0096aad220b42808080808001841001200542003703002002420037030020074200370300200342003703c003200c10022206280003210d2006290007210c20062d000f210f20062f00002110200641026a2d000021112006102c200320113a00c203200320103b01c0032003200f3a00cf032003200c3700c7032003200d3600c3034182e9c500ad4280808080900184100222062d000f210d2006280003210f2006290007210c20062f00002110200641026a2d000021112006102c200e20113a0000200220103b0100200920072903003703002003200c3700d7032003200f3600d303200a20022903003703002003200d3a00df0320082005290300370300200320032903c0033703a00341012107200341013a00b0092004200b428080808010841001200041023a0008410121050c340b20004181063b01082000410f360204200041d6b2c0003602002000410a6a41003a00000c210b2001410c6a2802002106200141086a280200210f2001280204210a41d6b2c0002109410f210d20022d00000d2420022d000141ff01714102470d2402402006410b490d00410f210d41e4ecc10021090c260b41a4c6c500ad4280808080a00184220b1002220228000321052002290007210420022d000f210720022f00002108200241026a2d000021092002102c41aec6c500ad4280808080c00184221210022202280003210d2002290007210c20022d000f210e20022f00002110200241026a2d000021112002102c200341b0096a41126a221320113a0000200320103b01c009200320093a00b209200320083b01b0092003200e3a00cf092003200c3700c7092003200d3600c309200320073a00bf09200320043700b709200320053600b3090240200341b0096a109501220241ff01714102460d002002410171450d0041bd8fc2002109411c210d0c250b200b1002220228000321052002290007210420022d000f210720022f00002108200241026a2d000021092002102c201210022202280003210d2002290007210c20022d000f210e20022f00002110200241026a2d000021112002102c201320113a0000200320103b01c009200320093a00b209200320083b01b0092003200e3a00cf092003200c3700c7092003200d3600c309200320073a00bf09200320043700b709200320053600b309200341013a00a807200341b0096aad42808080808004842212200341a8076aad42808080801084100142002104200341a0066a41186a22074200370300200341a0066a41106a22024200370300200341a0066a41086a22084200370300200342003703a0064191b0c200ad4280808080e000841002220528000321092005290007210c20052d000f210d20052f0000210e200541026a2d000021102005102c200320103a00a2062003200e3b01a0062003200d3a00af062003200c3700a706200320093600a30641acb0c200ad4280808080e00084100222052d000f21092005280003210d2005290007210c20052f0000210e200541026a2d000021102005102c200341a0066a41126a221120103a00002002200e3b0100200341b0086a41086a220e20082903003703002003200c3700b7062003200d3600b306200341b0086a41106a220d2002290300370300200320093a00bf06200341b0086a41186a22092007290300370300200320032903a0063703b008200341306a200341b0086a41201094012003280234211020032802302113200742003703002002420037030020084200370300200342003703a006200b1002220528000321142005290007210b20052d000f211520052f00002116200541026a2d000021172005102c200320173a00a206200320163b01a006200320153a00af062003200b3700a706200320143600a30641f889c200ad4280808080e00084100222052d000f2114200528000321152005290007210b20052f00002116200541026a2d000021172005102c201120173a0000200220163b0100200e20082903003703002003200b3700b706200320153600b306200d2002290300370300200320143a00bf0620092007290300370300200320032903a0063703b008200341b0096a200341b0086a10e6010240024020032802b0092205450d00200320053602c00320032902b4092204422088a721022004a721070c010b41042105200341043602c00341002102410021070b0240024020022007460d002004422088210b0c010b024020022004a7470d00200241016a22072002490d0c200241017422082007200820074b1bad220b42c4007e220c422088a70d0c200ca722074100480d0c0240024020020d002007102a21050c010b2005200241c4006c2007102e21050b2005450d19200320053602c003200442808080807083200b8421040b2004422088220ba721020b2005200241c4006c6a220241003a000020022010410020131b360204200220032f00a8073b0001200241036a200341a8076a41026a2d00003a0000200220032902b009370208200241106a200341b0096a41086a2218290200370200200241186a200341b0096a41106a2219290200370200200241206a200341b0096a41186a290200370200200241286a200341b0096a41206a290200370200200241306a200341b0096a41286a290200370200200241386a200341b0096a41306a290200370200200241c0006a200341b0096a41386a280200360200200b422086200442ffffffff0f83844280808080107c2104200a200641f0006c6a2111024020060d00200a21070c230b200341b2066a211a200a210703402007280204210220072802002106200341b0096a200741086a41e80010db051a200741f0006a21072002450d23200341a8076a200341b0096a41e80010db051a200320023602b409200320063602b0092018200341a8076a41e80010db051a20032802c0032114200341a0066a41186a22084200370300200341a0066a41106a22064200370300200341a0066a41086a220e4200370300200342003703a0064191b0c200ad4280808080e000841002220228000321052002290007210b20022d000f210920022f0000210d200241026a2d000021102002102c200320103a00a2062003200d3b01a006200320093a00af062003200b3700a706200320053600a30641acb0c200ad4280808080e00084100222022d000f2105200228000321092002290007210b20022f0000210d200241026a2d000021102002102c201a20103a00002006200d3b0100200341b0086a41086a2213200e2903003703002003200b3700b706200320093600b306200341b0086a41106a2006290300370300200320053a00bf06200341b0086a41186a22152008290300370300200320032903a0063703b008200341286a200341b0086a412010940120032802282106200328022c2105200341b0086a200341b0096a10ee0202400240024020032802b00922020d0041ef8fc20021094110210d0c010b024020022005410020061b22064d0d00411a210d41ff8fc20021090c010b200341a0066a2002417f6a1093020240200341a0066a2019412010dd05450d004119210d419990c20021090c010b024020032802b009220941002006417b6a2202200220064b1b4f0d004126210d41b290c20021090c010b02400240201420142004422088220ba7221041c4006c22066a460d00201441016a2102034002402002417f6a2d00004101470d0041012105200341b0086a2002460d032002200341b0086a412010dd05450d030b200241c4006a2102200641bc7f6a22060d000b0b410021050b200341a0066a2009109302200341a0066a200341b0086a412010dd05210220034180046a41086a2216200341a0056a41086a221729020037030020034180046a41106a221b200341a0056a41106a221c290200370300200320032902a0053703800441d98fc20021094116210d20050d2420020d010c240b20034180046a41086a200341a0056a41086a29020037030020034180046a41106a200341a0056a41106a290200370300200320032902a005370380040c230b20034180056a410e6a220520034180046a410e6a29010037010020034180056a41086a2209201629030037030020032003290380043703800520034180046a200341b0096a10ee02200341a0056a41186a220d4200370300201c420037030020174200370300200342003703a00520154200370300200341b0086a41106a221d420037030020134200370300200342003703b00841c800102a2202450d18200341a0066a10e801200241186a2008290300370200200241106a200341a0066a41106a2206290300370200200241086a200e290300370200200220032903a0063702002002410236022020024101360244200220032903b0083700242002412c6a2013290300370000200241346a201d2903003700002002413c6a2015290300370000200320023602e00320034282808080203702e403200341e0036a10e9012008200d2903003703002006201c290300370300200e2017290300370300200320032903a0053703a006200341a0066a10ea01200e20162903003703002006201b290300370300200820034180046a41186a29030037030020132009290300370300200341b0086a410e6a2209200529010037010020032003290380043703a00620032003290380053703b0080240024020102004a7460d002004210c0c010b201041016a22022010490d0c200ba74101742205200220022005491bad220c42c4007e220b422088a70d0c200ba722024100480d0c0240024020100d002002102a21020c010b2014201041c4006c2002102e21020b2002450d19200320023602c0032004422088220ba721100b20032802c003201041c4006c6a220241013a0000200220032903a00637000120024116360028200241d98fc200360024200241003a0021200220032903b00837002c200241096a200e290300370000200241116a2006290300370000200241196a20082903003700002002413a6a2009290100370000200241346a2013290300370000200c42ffffffff0f832104200b422086210b024020032802bc092206450d0020032802b4092102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102c0c030b2002410c6a280200450d02200241086a280200102c0c020b2002410c6a280200450d01200241086a280200102c0c010b200241086a280200450d00200241046a280200102c0b200241246a21022006415c6a22060d000b0b200b2004842104024020032802b809450d0020032802b409102c0b20044280808080107c210420072011470d000c240b0b419cdbc20041ce0041acfec5001036000b41ecdac200413041acfec5001036000b2002410a6a2f010022084108762109200241066a2f0100220d410876211e200141106a28020022064118762113200641087621142002411a6a290100210b200241196a2d0000211f200241186a2d00002120200241166a2f01002121200241156a2d00002122200241146a2d00002123200241126a2f01002124200241116a2d00002125200241106a2d000021262002410e6a2f010021272002410d6a2d000021282002410c6a2d00002129200241096a2d00002105200241086a2d00002111200241056a2d0000210e200241046a2d00002110200241026a2f0100212a200141216a2900002104200141206a2d000021152001411d6a2f000021162001411c6a2d00002117200141196a2f0000211c200141186a2d0000211b200141156a2f0000211d200141146a2d000021182001410c6a2802002107200141086a280200210a20022d0001210f20022d0000210220012d001f211920012d001b211a20012d0017212b02400240024002400240024002400240024002400240024002400240024002400240024020012802040e050001020304000b200341b0096a41146a4101360200200342013702b409200341fcc4c5003602b009200341043602a406200341f4c4c5003602a0062003200341a0066a3602c009200341b0096a4184c5c5001041000b02400240200241ff01710d00200f41ff01714101460d010b4113210641c3b2c00021020c0c0b2003200b3703c0072003201f3a00bf07200320203a00be07200320213b01bc07200320223a00bb07200320233a00ba07200320243b01b807200320253a00b707200320263a00b607200320273b01b407200320283a00b307200320293a00b207200320083b01b007200320053a00af07200320103a00aa072003202a3b01a8072003200d410874201141187472200e723600ab070240200641034f0d004183b3c4002102410e21060c0c0b0240200641104d0d004191b3c4002102410d21060c0c0b41afb7c500ad4280808080c00084100222022d000f2105200229000721042002280003210820022f00002109200241026a2d0000210d2002102c41c4f9c300ad4280808080e00084100222022d000f210e2002290007210b2002280003210f20022f00002110200241026a2d000021112002102c200341a0036a200341a8076a109f0141c000102a2202450d24200220043700072002200836000320022009200d4110747222083b0000200241026a20084110763a0000200220053a000f2002200b3700172002200f3600132002201020114110747222053b0010200241126a20054110763a00002002200e3a001f200220032902a003370020200241286a200341a0036a41086a290200370000200241306a200341a0036a41106a290200370000200241386a200341a0036a41186a290200370000200341b0096a200241c00010ef02024020032802b00922050d002002102c42002104428080e983b1de16210b20034180036a200341a8076a428080e983b1de16420010c1012003280280032202450d0420032802840321060c0c0b200341b0096a41186a2903002104200341b0096a41106a290300210b20032802b40921082002102c200341b0096a41086a41003a0000200341b9096a20032903a807370000200341c9096a200341a8076a41106a290300370000200341d1096a200341a8076a41186a290300370000200341a8076a41086a290300210c200341113a00b009200341b0096a41116a200c37000041014100200341b0096a1092012008450d092005102c0c090b02400240200241ff01710d00200f41ff01714101470d00410021020c010b410121024102210e410021114100210d0b2003200b3702b8032003201f3a00b703200320203a00b603200320213b01b403200320223a00b303200320233a00b203200320243b01b003200320253a00af03200320263a00ae03200320273b01ac03200320283a00ab03200320293a00aa03200320083b01a803200320053a00a703200320103a00a2032003202a3b01a0032003200d410874201141187472200e7222053600a30302402002450d0041d6b2c0002102410f2106024002400240024020050e050001020310000b20032800a703210220032800ab0321060c0f0b41dd8cc6002102410e21060c0e0b41c3b2c0002102411321060c0d0b41b2b2c0002102411121060c0c0b200341a8076a41186a200341a0036a41186a290200370300200341a8076a41106a200341a0036a41106a290200370300200341a8076a41086a200341a0036a41086a290200370300200320032902a0033703a80741afb7c500ad4280808080c00084100222022d000f2106200229000721042002280003210520022f00002107200241026a2d000021082002102c41c4f9c300ad4280808080e00084100222022d000f210a2002290007210b2002280003210920022f0000210d200241026a2d0000210e2002102c200341c0036a200341a8076a109f0141c000102a2202450d2320022004370007200220053600032002200720084110747222053b0000200241026a20054110763a0000200220063a000f2002200b370017200220093600132002200d200e4110747222063b0010200241126a20064110763a00002002200a3a001f200220032902c003370020200241286a200341c8036a290200370000200241306a200341c0036a41106a290200370000200241386a200341c0036a41186a290200370000200341b0096a200241c00010ef02024020032802b0092206450d002002ad428080808080088410050b200341b0096a41186a2903002104200341c0096a290300210b20032802b40921052002102c2006450d0702402005450d002006102c0b200341a8076a200b200410c201200341e8096a2004370300200341e0096a200b370300200341b0096a41086a41033a0000200341b9096a20032903a807370000200341c9096a200341b8076a290300370000200341d1096a200341c0076a290300370000200341a8076a41086a2903002104200341113a00b009200341b0096a41116a200437000041014100200341b0096a1092010c0c0b024002400240200241ff017122114101460d00201e2109200d2108200e21050c010b2005210f201041ff01714101460d010b20114103460d00200f20027241ff0171450d00419eb3c4002102410a21060c0d0b0240200a41ff01714101460d00200a4118762109200a4108762105200a41107621080c050b200341b0096a200741067610910220032802b009210a0240024020032802b8092007413f7122024b0d00410021020c010b200a20024105746a22022f0000220541087621082002290018210420022d0017211520022d0016211920022f0014211620022d0013211720022d0012211a20022f0010211c20022d000f211b20022d000e212b20022f000c211d20022d000b211820022d000a211320022f0008211420022d000721062002280003210720022d00022109410121020b024020032802b409450d00200a102c0b20020d04410121050c050b200141346a2802002121200141306a28020021112001412c6a280200211f024002400240200241ff017122204101460d00201e2109200d2108200e21050c010b2005210f201041ff01714101460d010b20204103460d00200f20027241ff0171450d00419eb3c4002102410a21060c030b0240200a41ff01714101460d00200a4118762109200a4108762105200a41107621080c020b200341b0096a200741067610910220032802b009210a0240024020032802b8092007413f7122024b0d00410021020c010b200a20024105746a22022f0000220541087621082002290018210420022d0017211520022d0016211920022f0014211620022d0013211720022d0012211a20022f0010211c20022d000f211b20022d000e212b20022f000c211d20022d000b211820022d000a211320022f0008211420022d000721062002280003210720022d00022109410121020b024020032802b409450d00200a102c0b20020d0141dd8cc6002102410e21060c020b200341b0096a41086a41023a0000200341b9096a20032903a807370000200341a8076a41086a290300210c200341113a00b009200341b0096a41116a200c370000200341c9096a200341b8076a290300370000200341d1096a200341c0076a29030037000041014100200341b0096a1092010c050b200320043703c007200320153a00bf07200320193a00be07200320163b01bc07200320173a00bb072003201a3a00ba072003201c3b01b8072003201b3a00b7072003202b3a00b6072003201d3b01b407200320183a00b307200320133a00b207200320143b01b007200320063a00af07200320073600ab07200320093a00aa0720032008410874200541ff0171723b01a80741afb7c500ad4280808080c00084100222022d000f2106200229000721042002280003210520022f00002107200241026a2d000021082002102c41c4f9c300ad4280808080e00084100222022d000f210a2002290007210b2002280003210920022f0000210d200241026a2d0000210e2002102c200341c0036a200341a8076a109f0141c000102a2202450d1f20022004370007200220053600032002200720084110747222053b0000200241026a20054110763a0000200220063a000f2002200b370017200220093600132002200d200e4110747222063b0010200241126a20064110763a00002002200a3a001f200220032902c003370020200241286a200341c0036a41086a290200370000200241306a200341c0036a41106a290200370000200241386a200341c0036a41186a290200370000200341b0096a200241c00010ef02200341b0096a41186a22052903002104200341b0096a41106a290300210b20032802b409210720032802b00921062002102c0240024020060d004200210b420021040c010b2007450d002006102c0b200520043703002003200b3703c009200320213602b809200320113602b4092003201f3602b00941afb7c500ad4280808080c00084100222022d000f2106200229000721042002280003210520022f00002107200241026a2d000021082002102c41c4f9c300ad4280808080e00084100222022d000f210a2002290007210b2002280003210920022f0000210d200241026a2d0000210e2002102c200341a0036a200341a8076a109f0141c000102a2202450d1f20022004370007200220053600032002200720084110747222053b0000200241026a20054110763a0000200220063a000f2002200b370017200220093600132002200d200e4110747222063b0010200241126a20064110763a00002002200a3a001f200220032902a003370020200241286a200341a0036a41086a290200370000200241306a200341a0036a41106a290200370000200241386a200341a0036a41186a290200370000200341c0003602a406200320023602a006200341b0096a200341a0066a10792002102c02402011450d00201f102c0b200341b0096a41086a41013a0000200341b9096a20032903a807370000200341c9096a200341b8076a290300370000200341d1096a200341a8076a41186a290300370000200341a8076a41086a2903002104200341113a00b009200341b0096a41116a20043700004100210241014100200341b0096a1092010c050b2011450d06201f102c0c060b2008410874200541ff0171722102410021050b200320043702b803200320153a00b703200320193a00b603200320163b01b403200320173a00b3032003201a3a00b2032003201c3b01b0032003201b3a00af032003202b3a00ae032003201d3b01ac03200320183a00ab03200320133a00aa03200320143b01a803200320063a00a703200320073600a303200320093a00a203200320023b01a00302402005450d0041dd8cc6002102410e21060c070b200341a8076a41186a200341a0036a41186a290200370300200341a8076a41106a200341a0036a41106a290200370300200341a8076a41086a200341a0036a41086a290200370300200320032902a0033703a80741afb7c500ad4280808080c00084100222022d000f2106200229000721042002280003210520022f00002107200241026a2d000021082002102c41c4f9c300ad4280808080e00084100222022d000f210a2002290007210b2002280003210920022f0000210d200241026a2d0000210e2002102c200341c0036a200341a8076a109f0141c000102a2202450d1c20022004370007200220053600032002200720084110747222053b0000200241026a20054110763a0000200220063a000f2002200b370017200220093600132002200d200e4110747222063b0010200241126a20064110763a00002002200a3a001f200220032902c003370020200241286a200341c0036a41086a290200370000200241306a200341c0036a41106a290200370000200241386a200341c0036a41186a290200370000200341b0096a200241c00010ef02024020032802b0092206450d002002ad428080808080088410050b200341c8096a2903002104200341c0096a290300210b20032802b40921052002102c2006450d0002402005450d002006102c0b20034188036a200341a8076a200b200410bf0120032903880320034188036a41086a29030010b102200341e8096a2004370300200341e0096a200b370300200341b0096a41086a41043a0000200341b9096a20032903a807370000200341c9096a200341b8076a290300370000200341d1096a200341c0076a290300370000200341a8076a41086a2903002104200341113a00b009200341b0096a41116a200437000041014100200341b0096a1092010c050b41a8b3c4002102410921060c050b200341b0096a41186a20043703002003200b3703c009200320063602b809200320073602b4092003200a3602b00941afb7c500ad4280808080c00084100222022d000f2106200229000721042002280003210520022f00002108200241026a2d000021092002102c41c4f9c300ad4280808080e00084100222022d000f210d2002290007210b2002280003210e20022f0000210f200241026a2d000021102002102c200341c0036a200341a8076a109f0141c000102a2202450d1a20022004370007200220053600032002200820094110747222053b0000200241026a20054110763a0000200220063a000f2002200b3700172002200e3600132002200f20104110747222063b0010200241126a20064110763a00002002200d3a001f200220032902c003370020200241286a200341c8036a290200370000200241306a200341c0036a41106a290200370000200241386a200341c0036a41186a290200370000200341c0003602a406200320023602a006200341b0096a200341a0066a10792002102c02402007450d00200a102c0b410021020b0c010b2007450d00200a102c0b20020d010b200041023a00084100210d0c010b200041812e3b010820002006360204200020023602004100210d2000410a6a41003a00000b41012107410121054101210e4101210f4101211041012111410121134101211441012115410121084101210a4101210941012100410121060c3b0b2001411c6a280200210e200141186a2802002110200141146a280200210f2001410c6a2802002111200141086a280200211341d6b2c0002107410f21050240024020022d00000d0020022d000141ff01714102470d00200141246a2802002114200141106a2802002115200341a0036a41186a22054200370300200341a0036a41106a22064200370300200341a0036a41086a22074200370300200342003703a00341ecddc500ad4280808080f000841002220228000321082002290007210420022d000f210a20022f00002109200241026a2d0000210d2002102c2003200d3a00a203200320093b01a0032003200a3a00af03200320043700a703200320083600a30341f3ddc500ad4280808080c00184100222022d000f21082002280003210a2002290007210420022f00002109200241026a2d0000210d2002102c200341a0036a41126a200d3a0000200620093b0100200341e0036a41086a2007290300370300200320043700b7032003200a3600b303200341e0036a41106a2006290300370300200320083a00bf03200341e0036a41186a2005290300370300200320032903a0033703e003200341f8026a200341e0036a412010940120032802fc02210620032802f802210541a3dbc500ad4280808080800184100222022d000f2116200229000721042002280003211720022f0000211c200241026a2d0000211b2002102c41abdbc500ad4280808080a00284100222022d000f211d2002290007210b2002280003211820022f00002119200241026a2d0000211a2002102c20032006410020051b222b3602a807200341c0036a41186a2205200341a8076aad22124280808080c00084220c1006220241186a290000370300200341c0036a41106a2207200241106a290000370300200341c0036a41086a2208200241086a290000370300200320022900003703c0032002102c200341b0096a41186a220a2005290300370300200341b0096a41106a22092007290300370300200341b0096a41086a220d2008290300370300200320032903c0033703b00941c000102a2202450d1520022004370007200220173600032002201c201b4110747222063b0000200241026a20064110763a0000200220163a000f2002200b3700172002201836001320022019201a4110747222063b0010200241126a20064110763a00002002201d3a001f200220032903b009370020200241286a200d290300370000200241306a2009290300370000200241386a200a290300370000200320143602a8072005200c1006220641186a2900003703002007200641106a2900003703002008200641086a290000370300200320062900003703c0032006102c200a200529030037030020092007290300370300200d2008290300370300200320032903c0033703b009200241c000418001102e2202450d15200220032903b00937004041182105200241d8006a200341b0096a41186a290300370000200241d0006a200341b0096a41106a290300370000200241c8006a200341b0096a41086a290300370000200341f0026a200241e00041014100410010970120032802f00221072002102c200341a0036a41186a22084200370300200341a0036a41106a22064200370300200341a0036a41086a220a4200370300200342003703a00341a3dbc500ad42808080808001841002220228000321092002290007210420022d000f210d20022f00002116200241026a2d000021172002102c200320173a00a203200320163b01a0032003200d3a00af03200320043700a703200320093600a30341a0c6c500ad4280808080c00084100222022d000f21092002280003210d2002290007210420022f00002116200241026a2d000021172002102c200341b2036a20173a0000200620163b0100200341e0036a41086a200a290300370300200320043700b7032003200d3600b303200341e0036a41106a2006290300370300200320093a00bf03200341e0036a41186a2008290300370300200320032903a0033703e003200341b0096a200341e0036a10f00220032802b0092202410120021b211620032902b409420020021b210402400240024020074101470d0041e1c5c5002107411521050c010b201620144105746a410020142004422088a7491b22020d0141f6c5c50021070b2004a7450d012016102c0c010b200241086a290000210b200241106a290000210c2002290000212c200341a8076a41186a200241186a290000222d370300200341a8076a41106a200c370300200341a8076a41086a200b3703002003202c3703a807200341bd096a200b370000200341c5096a200c370000200341cd096a202d370000200341003a00b4092003410f3a00b0092003202c3700b50941014100200341b0096a109201200341003602b809200342013703b0092015200341b0096a10670240024020032802b409220620032802b80922026b2015490d0020032802b00921060c010b200220156a22052002490d09200641017422072005200720054b1b22054100480d090240024020060d002005102a21060c010b20032802b00920062005102e21060b2006450d16200320053602b409200320063602b0090b2003200220156a3602b809200620026a2013201510db051a200e200341b0096a106702400240200e450d00200f200e410c6c6a210d200f210603402006280200210a200641086a2802002202200341b0096a10670240024020032802b409220820032802b80922056b2002490d0020032802b00921070c010b200520026a22072005490d0c200841017422092007200920074b1b22094100480d0c0240024020080d002009102a21070c010b20032802b00920082009102e21070b2007450d19200320093602b409200320073602b009200921080b2003200520026a22093602b809200720056a200a200210db051a2006410c6a2206200d470d000c020b0b20032802b809210920032802b409210820032802b00921070b41a3dbc500ad4280808080800184100222022d000f21062002290007210b2002280003211520022f00002117200241026a2d0000211c2002102c41abdbc500ad4280808080a00284100222022d000f211b2002290007210c2002280003211d20022f00002118200241026a2d000021192002102c2003202b3602a807200341c0036a41186a220520124280808080c000841006220241186a290000370300200341c0036a41106a220a200241106a290000370300200341c0036a41086a220d200241086a290000370300200320022900003703c0032002102c200341b0096a41186a221a2005290300370300200341b0096a41106a222b200a290300370300200341b0096a41086a221f200d290300370300200320032903c0033703b00941c000102a2202450d152002201820194110747222183b001020022017201c4110747222173b00002002201b3a001f2002200c3700172002201d360013200220063a000f2002200b37000720022015360003200220032903b009370020200241126a20184110763a0000200241026a20174110763a0000200241286a201f290300370000200241306a202b290300370000200241386a201a290300370000200320143602b0092005200341b0096aad4280808080c000841006220641186a290000370300200a200641106a290000370300200d200641086a290000370300200320062900003703c0032006102c200341a0056a41186a2005290300370300200341a0056a41106a200a290300370300200341a0056a41086a200d290300370300200320032903c0033703a005200241c000418001102e2202450d15200220032903a005370040200241d8006a200341b8056a290300370000200241d0006a200341b0056a290300370000200241c8006a200341a8056a290300370000200341e0003602b409200320023602b00920072009200341b0096a10f1022002102c02402008450d002007102c0b02402004a7450d002016102c0b02402011450d002013102c0b0240200e450d00200e410c6c2106200f210203400240200241046a280200450d002002280200102c0b2002410c6a2102200641746a22060d000b0b02402010450d00200f102c0b200041023a0008410021060c010b02402011450d002013102c0b0240200e450d00200e410c6c2106200f210203400240200241046a280200450d002002280200102c0b2002410c6a2102200641746a22060d000b0b02402010450d00200f102c0b20004181263b01082000200536020420002007360200410021062000410a6a41003a00000b41012107410121054101210e4101210f4101211041012111410121134101211441012115410121084101210a41012109410121000c390b200141206a290200210c200141186a290200210b2002411a6a2901002104200241196a2d00002108200241186a2d0000210a200241166a2f01002109200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021132002410d6a2d000021142002410c6a2d000021152002410a6a2f01002116200241096a2d00002117200241086a2d0000211c200241066a2f0100211b200241056a2d0000211d200241046a2d00002118200241026a2f01002119200141286a2802002107200141106a29020021122001410c6a280200211a200141086a280200210620022d0001210520022d00002102024002400240024002400240024002400240024002400240024020012802040e0400010203000b200341b0096a41146a4101360200200342013702b409200341fcc4c5003602b009200341043602a406200341f4c4c5003602a0062003200341a0066a3602c009200341b0096a4184c5c5001041000b41002107200241ff01710d07200541ff01714101470d07200320043703b806200320083a00b7062003200a3a00b606200320093b01b4062003200d3a00b3062003200e3a00b2062003200f3b01b006200320103a00af06200320113a00ae06200320133b01ac06200320143a00ab06200320183a00a206200320193b01a006200320164108742017722015411874723600a7062003201b410874201d72201c411874723600a306200341c0036a41186a22074200370300200341c0036a41106a22054200370300200341c0036a41086a22084200370300200342003703c00341afb7c500ad4280808080c0008410022202280003210a2002290007210420022d000f210920022f0000210d200241026a2d0000210e2002102c2003200e3a00c2032003200d3b01c003200320093a00cf03200320043700c7032003200a3600c303418cb8c500ad42808080803084100222022d000f210a200228000321092002290007210420022f0000210d200241026a2d0000210e2002102c200341d2036a200e3a00002005200d3b0100200341a0036a41086a2008290300370300200320043700d703200320093600d303200341a0036a41106a20052903003703002003200a3a00df03200341a0036a41186a2007290300370300200320032903c0033703a003200341b0096a200341a0036a412010d30120032d00b00921022007200341c9096a2900003703002005200341c1096a2900003703002008200341b9096a290000370300200320032900b1093703c0030240024020024101460d00200341a8076a41186a4200370300200341a8076a41106a4200370300200341a8076a41086a4200370300200342003703a8070c010b200341a8076a41186a2007290300370300200341a8076a41106a2005290300370300200341a8076a41086a2008290300370300200320032903c0033703a8070b41022107200341a0066a200341a8076a412010dd050d07200341b0096a200641900110db051a200341003b01a807200341b0086a200341b0096a200341a8076a10c10241012102024020032d00b80822054102460d00200341b9086a310000210b20033100ba08210420033502b408210c20032802b008210741eb8cc600ad4280808080d00184100402402005450d00200b100e0b2004100e410021022007450d00200c4220862007ad8410040b200320023a00b2092003410e3b01b00941014100200341b0096a1092012006102c0c090b200320064118763a008205200320064108763b01800502400240200241ff01710d00200541ff01714101460d010b410021070c080b200320043703b806200320083a00b7062003200a3a00b606200320093b01b4062003200d3a00b3062003200e3a00b2062003200f3b01b006200320103a00af06200320113a00ae06200320133b01ac06200320143a00ab06200320183a00a206200320193b01a006200320164108742017722015411874723600a7062003201b410874201d72201c411874723600a306200341c0036a41186a22084200370300200341c0036a41106a22054200370300200341c0036a41086a220a4200370300200342003703c00341afb7c500ad4280808080c000841002220228000321092002290007210420022d000f210d20022f0000210e200241026a2d0000210f2002102c2003200f3a00c2032003200e3b01c0032003200d3a00cf03200320043700c703200320093600c303418cb8c500ad42808080803084100222022d000f21092002280003210d2002290007210420022f0000210e200241026a2d0000210f2002102c200341d2036a200f3a00002005200e3b0100200341a0036a41086a200a290300370300200320043700d7032003200d3600d303200341a0036a41106a2005290300370300200320093a00df03200341a0036a41186a2008290300370300200320032903c0033703a003200341b0096a200341a0036a412010d30120032d00b00921022008200341c9096a2900003703002005200341c1096a290000370300200a200341b9096a290000370300200320032900b1093703c0030240024020024101460d00200341a8076a41186a4200370300200341a8076a41106a4200370300200341a8076a41086a4200370300200342003703a8070c010b200341a8076a41186a2008290300370300200341a8076a41106a2005290300370300200341a8076a41086a200a290300370300200320032903c0033703a8070b200341a0066a200341a8076a412010dd050d010240200641ff01714101460d0020032f01800520032d00820541107472210a200b420888a72109200b422088a7210d200ba7210e0c060b200341b0096a201a41067610910220032802b00921060240024020032802b809201a413f7122024b0d00410021020c010b200620024105746a22022f0010200241126a2d000041107472210920022f0000200241026a2d000041107472210a20022d001f21072002290017210c2002280013210d20022d000f210e200229000721122002280003211a410121020b024020032802b409450d002006102c0b20020d05410121070c070b2001412c6a280200212b200341b0086a41106a200c3703002003200b3703b808200320073602c808200320123703b00802400240200241ff01710d00200541ff01714101460d010b202b109202410021070c040b200320043703b806200320083a00b7062003200a3a00b606200320093b01b4062003200d3a00b3062003200e3a00b2062003200f3b01b006200320103a00af06200320113a00ae06200320133b01ac06200320143a00ab06200320183a00a206200320193b01a006200320164108742017722015411874723600a7062003201b410874201d72201c411874723600a306200341c0036a41186a22074200370300200341c0036a41106a22054200370300200341c0036a41086a22084200370300200342003703c00341afb7c500ad4280808080c0008410022202280003210a2002290007210420022d000f210920022f0000210d200241026a2d0000210e2002102c2003200e3a00c2032003200d3b01c003200320093a00cf03200320043700c7032003200a3600c303418cb8c500ad42808080803084100222022d000f210a200228000321092002290007210420022f0000210d200241026a2d0000210e2002102c200341d2036a200e3a00002005200d3b0100200341a0036a41086a2008290300370300200320043700d703200320093600d303200341a0036a41106a20052903003703002003200a3a00df03200341a0036a41186a2007290300370300200320032903c0033703a003200341b0096a200341a0036a412010d30120032d00b00921022007200341c9096a2900003703002005200341c1096a2900003703002008200341b9096a290000370300200320032900b1093703c0030240024020024101460d00200341a8076a41186a4200370300200341a8076a41106a4200370300200341a8076a41086a4200370300200342003703a8070c010b200341a8076a41186a2007290300370300200341a8076a41106a2005290300370300200341a8076a41086a2008290300370300200320032903c0033703a8070b200341a0066a200341a8076a412010dd050d010240200641ff01714101460d0020064108762102200341c0086a290300210420032903b808220b420888a72106200b422088a72107200ba7210820032802c808210a20032903b008210b0c030b200341b0096a201a41067610910220032802b00921090240024020032802b809201a413f7122024b0d00410021050c010b200920024105746a22052f0010200541126a2d000041107472210620052f0000200541026a2d000041107472210220052d001f210a200529001721042005280013210720052d000f21082005290007210b2005280003211a410121050b024020032802b409450d002009102c0b20050d02202b109202410121070c030b410221070c050b202b109202410221070c010b200320063b01f003200341e0036a41126a20064110763a00002003200a3a00ff03200320043700f703200320073600f303200320083a00ef032003200b3700e7032003201a3600e303200320023b01e003200320024110763a00e203200341b0096a202b41900110db051a200341b2076a200341e8036a290300370100200341a8076a41126a20032903f003370100200341c2076a200341f8036a29030037010020034180023b01a807200320032903e0033701aa07200341a0056a200341b0096a200341a8076a10c10241012102024020032d00a80522064102460d00200341a9056a310000210b20033100aa05210420033502a405210c20032802a005210541eb8cc600ad4280808080d00184100402402006450d00200b100e0b2004100e410021022005450d00200c4220862005ad8410040b200320023a00b2092003418e043b01b00941014100200341b0096a109201410321070b202b102c0c020b200341c0036a41186a22054200370300200341c0036a41106a22064200370300200341c0036a41086a22084200370300200342003703c00341afb7c500ad4280808080c0008410022202280003210f2002290007210420022d000f211020022f00002111200241026a2d000021132002102c200320133a00c203200320113b01c003200320103a00cf03200320043700c7032003200f3600c303418cb8c500ad42808080803084100222022d000f210f200228000321102002290007210420022f00002111200241026a2d000021132002102c200341d2036a20133a0000200620113b0100200341a0036a41086a2008290300370300200320043700d703200320103600d303200341a0036a41106a20062903003703002003200f3a00df03200341a0036a41186a2005290300370300200320032903c0033703a003200341b0096a200341a0036a412010d30120032d00b00921022005200341c9096a2900003703002006200341c1096a2900003703002008200341b9096a290000370300200320032900b1093703c0030240024020024101460d00200341a0056a41186a4200370300200341a0056a41106a4200370300200341a0056a41086a4200370300200342003703a0050c010b200341a0056a41186a2005290300370300200341a0056a41106a2006290300370300200341a0056a41086a2008290300370300200320032903c0033703a0050b200341ba096a200341a8056a290300370100200341b0096a41126a2202200341a0056a41106a290300370100200341ca096a200341b8056a2903003701002003418e023b01b009200320032903a0053701b20941014100200341b0096a109201200320093b01c009200220094110763a0000200320073a00cf092003200c3700c7092003200d3600c3092003200e3a00bf09200320123700b7092003201a3600b3092003200a3b01b0092003200a4110763a00b20941afb7c500ad4280808080c000841002220228000321062002290007210420022d000f210520022f00002107200241026a2d000021082002102c418cb8c500ad4280808080308410022202280003210a2002290007210b20022d000f210920022f0000210d200241026a2d0000210e2002102c200341e0036a41126a200e3a00002003200d3b01f003200320083a00e203200320073b01e003200320093a00ff032003200b3700f7032003200a3600f303200320053a00ef03200320043700e703200320063600e303200341203602ac072003200341e0036a3602a807200341b0096a200341a8076a10a102410321070c010b20061092022006102c0b41cfe7c5002102410b21064102210502400240024020070e0400010203000b41c3b2c000210241132106410021050c010b41dd8cc6002102410e2106410121050b20004181243b010820002006360204200020023602002000410a6a20053a00000c010b200041023a00080b4100210041012107410121054101210e4101210f4101211041012111410121134101211441012115410121084101210a41012109410121060c380b200341b0096a200141086a41800110db051a200341a8076a41206a200241206a290200370300200341a8076a41186a200241186a290200370300200341a8076a41106a200241106a290200370300200341a8076a41086a200241086a290200370300200320022902003703a807200341e8026a200341b0096a200341a8076a10f2020240024020032802e80222020d00200041023a0008410021090c010b20032802ec02210620004181223b010820002002360200410021092000410a6a41003a0000200020063602040b41012107410121054101210e4101210f4101211041012111410121134101211441012115410121084101210a0c360b200341a0056a41086a220a2001411c6a290200370300200341a0056a41106a2209200141246a290200370300200341a0056a41186a220d2001412c6a2802003602002003200141146a2902003703a005200241086a2802002105200241046a28020021072001410c6a280200210820022d0000210602400240024002400240024002400240024002400240200141086a2802000e0400010203000b200341b0096a41146a4101360200200342013702b409200341fcc4c5003602b009200341043602a406200341f4c4c5003602a0062003200341a0066a3602c009200341b0096a4184c5c5001041000b200141386a290300210b200141306a29030021042002411a6a290100210c200241196a2d0000210f200241186a2d00002110200241166a2f01002111200241156a2d00002113200241146a2d00002114200241126a2f01002115200241116a2d00002116200241106a2d000021172002410e6a2f0100211c2002410d6a2d0000211b2002410c6a2d0000211d200241026a2f01002118200141106a280200210e20022d00012102200341b0086a41186a200d280200360200200341b0086a41106a2009290300370300200341b0086a41086a200a290300370300200320032903a0053703b00802400240200641ff01710d00200241ff01714101460d010b4113210641c3b2c0002105410021020c080b2003200c3703c0072003200f3a00bf07200320103a00be07200320113b01bc07200320133a00bb07200320143a00ba07200320153b01b807200320163a00b707200320173a00b6072003201c3b01b4072003201b3a00b307200320073a00aa07200320183b01a80720032005411076410874200541087641ff017172201d411874723600af0720032007411076410874200741087641ff0171722005411874723600ab0702400240200841ff01714101460d0020084108762107200341c0086a290300212c20032903b808220c420888a72108200c422088a72109200ca7210d20032802c808210f20032903b008212d0c010b200341b0096a200e41067610910220032802b00921060240024020032802b809200e413f7122024b0d00410021020c010b200620024105746a22022f0010200241126a2d000041107472210820022f0000200241026a2d000041107472210720022d001f210f2002290017212c2002280013210920022d000f210d2002290007212d2002280003210e410121020b024020032802b409450d002006102c0b2002450d060b200341b8026a2004200b42c0843d420010e105200341a8026a20032903b802220c200341b8026a41086a290300221242c0fb42427f10e00520034198026a200c201242d08603420010e005200341c8026a200341a8076a2003290398022212200420032903a8027c220c42d086037e200c421480220c42c0fb427e7c42a0c21e56200ca76aad7c220c428080e983b1de16200c428080e983b1de165620034198026a41086a290300200c201254ad7c220c420052200c501b22021b2212200c420020021b220c10c10120032802c8020d06200341e0036a41186a22054200370300200341e0036a41106a22064200370300200341e0036a41086a220a4200370300200342003703e00341a4e9c500ad4280808080800184222e1002220228000321102002290007212f20022d000f211120022f00002113200241026a2d000021142002102c200320143a00e203200320133b01e003200320113a00ef032003202f3700e703200320103600e30341ace9c500ad4280808080d00184222f100222022d000f2110200228000321112002290007213020022f00002113200241026a2d000021142002102c200341e0036a41126a221520143a0000200620133b0100200341a0036a41086a2213200a290300370300200320303700f703200320113600f303200341a0036a41106a22112006290300370300200320103a00ff03200341a0036a41186a22102005290300370300200320032903e0033703a00320034190026a200341a0036a4120109401200328029402211420032802900221162005420037030020064200370300200a4200370300200342003703e003202e1002220228000321172002290007213020022d000f211c20022f0000211b200241026a2d0000211d2002102c2003201d3a00e2032003201b3b01e0032003201c3a00ef03200320303700e703200320173600e303202f100222022d000f21172002280003211c2002290007212f20022f0000211b200241026a2d0000211d2002102c2015201d3a00002006201b3b01002013200a2903003703002003202f3700f7032003201c3600f30320112006290300370300200320173a00ff0320102005290300370300200320032903e0033703a00320032014410020161b221041016a3602b009200341a0036aad4280808080800484200341b0096aad4280808080c000841001200341820a6a20084110763a0000200341800a6a20083b0100200341b0096a41186a200c370300200341b0096a41386a200341a8076a41186a290300370300200341b0096a41306a200341a8076a41106a290300370300200341b0096a41286a200341a8076a41086a2903003703002003418f0a6a200f3a0000200341870a6a202c370000200341830a6a2009360000200341ff096a200d3a0000200341f7096a202d370000200341f3096a200e360000200320073b01f009200341f2096a20074110763a00002003200b3703b809200320043703b009200320123703c009200320032903a8073703d009202e100222022d000f2107200229000721042002280003210820022f00002109200241026a2d0000210d2002102c41e1e5c200ad4280808080900184100222022d000f210e2002290007210b2002280003210f20022f00002111200241026a2d000021132002102c200320103602a006200341c0036a41186a2214200341a0066aad4280808080c000841006220241186a290000370300200341c0036a41106a2215200241106a290000370300200341c0036a41086a2216200241086a290000370300200320022900003703c0032002102c2005201429030037030020062015290300370300200a2016290300370300200320032903c0033703e00341c000102a2202450d19200220043700072002200836000320022009200d4110747222083b0000200241026a20084110763a0000200220073a000f2002200b3700172002200f3600132002201120134110747222073b0010200241126a20074110763a00002002200e3a001f200220032903e003370020200241286a200341e0036a41086a290300370000200241306a2006290300370000200241386a2005290300370000200341003602a806200342013703a006200341b0096a41206a200341a0066a109101200341b0096a41086a290300210420032903b009210b0240024020032802a406220520032802a80622066b4110490d0020032802a00621050c010b200641106a22072006490d0d200541017422062007200620074b1b22064100480d0d0240024020050d002006102a21050c010b20032802a00620052006102e21050b2005450d1a200320063602a406200320053602a00620032802a80621060b200520066a220520043700082005200b3700002003200641106a3602a806200341b0096a41c0006a200341a0066a109101200341c8096a290300210420032903c009210b0240024020032802a406220720032802a80622056b4110490d0020032802a00621060c010b200541106a22062005490d0d200741017422052006200520064b1b22084100480d0d0240024020070d002008102a21060c010b20032802a00620072008102e21060b2006450d1a200320083602a406200320063602a00620032802a8062105200821070b200620056a220820043700082008200b3700002002ad4280808080800884200541106aad4220862006ad84100102402007450d002006102c0b2002102c200341b8096a41003a00002003410c3a00b009200341b0096a410c6a201036020041014100200341b0096a1092010c080b200641ff01714101470d0320054102490d03200741ff01710d0341a4e9c500ad4280808080800184100222022d000f2106200229000721042002280003210520022f00002107200241026a2d0000210a2002102c41e1e5c200ad4280808080900184100222022d000f21092002290007210b2002280003210d20022f0000210e200241026a2d0000210f2002102c200320083602b009200341c0036a41186a2208200341b0096aad4280808080c000841006220241186a290000370300200341c0036a41106a2210200241106a290000370300200341c0036a41086a2211200241086a290000370300200320022900003703c0032002102c200341a0036a41186a22132008290300370300200341a0036a41106a22082010290300370300200341a0036a41086a22102011290300370300200320032903c0033703a00341c000102a2202450d18200220043700072002200536000320022007200a4110747222053b0000200241026a20054110763a0000200220063a000f2002200b3700172002200d3600132002200e200f4110747222063b0010200241126a20064110763a0000200220093a001f200220032903a003370020200241286a2010290300370000200241306a2008290300370000200241386a2013290300370000200341b0096a200241c00010b802024020032903b00942015222060d002002ad428080808080088410050b20032903b8092104200341a0066a200341c0096a41d80010db051a200341b0096a200341a0066a41d80010db051a20060d01200341b0086a200341b0096a41d80010db051a2002102c200320043703a807200341a8076a41086a200341b0086a41d80010db051a200341d0026a200341c8076a20032903b807200341c0076a29030010bf0120032903d002200341d0026a41086a29030010a9010c070b200641ff01714101470d0220054104490d02200741ff01710d0241a4e9c500ad4280808080800184100222022d000f2106200229000721042002280003210520022f00002107200241026a2d0000210a2002102c41e1e5c200ad4280808080900184100222022d000f21092002290007210b2002280003210d20022f0000210e200241026a2d0000210f2002102c200320083602b009200341c0036a41186a2210200341b0096aad4280808080c000841006220241186a290000370300200341c0036a41106a2211200241106a290000370300200341c0036a41086a2213200241086a290000370300200320022900003703c0032002102c200341a0036a41186a22142010290300370300200341a0036a41106a22102011290300370300200341a0036a41086a22112013290300370300200320032903c0033703a00341c000102a2202450d17200220043700072002200536000320022007200a4110747222053b0000200241026a20054110763a0000200220063a000f2002200b3700172002200d3600132002200e200f4110747222063b0010200241126a20064110763a0000200220093a001f200220032903a003370020200241286a2011290300370000200241306a2010290300370000200241386a2014290300370000200341e0026a200241c00041014100410010970120032802e00221062002102c20064101470d01200341a0036a41186a22054200370300200341a0036a41106a22024200370300200341a0036a41086a22074200370300200342003703a00341a4e9c500ad4280808080800184220c10022206280003210a2006290007210420062d000f210920062f0000210d200641026a2d0000210e2006102c2003200e3a00a2032003200d3b01a003200320093a00af03200320043700a7032003200a3600a30341b9e9c500ad42808080809001842212100222062d000f210a200628000321092006290007210420062f0000210d200641026a2d0000210e2006102c200341a0036a41126a200e3a00002002200d3b0100200341e0036a41086a220d2007290300370300200320043700b703200320093600b303200341e0036a41106a220920022903003703002003200a3a00bf03200341e0036a41186a220a2005290300370300200320032903a0033703e003200341b0096a200341e0036a10960120032802b0092206410420061b210e024020032902b409420020061b2204422088220ba722062004a7470d00200641016a220f2006490d0b200ba722114101742210200f200f2010491b220f41ffffffff0371200f470d0b200f41027422104100480d0b0240024020060d002010102a210e0c010b200e20114102742010102e210e0b200e450d182004422088220ba72106200fad21040b200e20064102746a2008360200200542003703002002420037030020074200370300200342003703a003200c1002220628000321082006290007210c20062d000f210f20062f00002110200641026a2d000021112006102c200320113a00a203200320103b01a0032003200f3a00af032003200c3700a703200320083600a3032012100222062d000f21082006280003210f2006290007210c20062f00002110200641026a2d000021112006102c200341b2036a20113a0000200220103b0100200d20072903003703002003200c3700b7032003200f3600b30320092002290300370300200320083a00bf03200a2005290300370300200320032903a0033703e0030240200e0d00200341e0036aad428080808080048410050c070b200341003602b809200342013703b009200ba741016a2206200341b0096a10670240024020060d0020032802b809210a20032802b409210820032802b00921060c010b410020032802b80922026b2105200e20064102746a210d20032802b4092108200e210703402007280200210902400240200820056a4104490d0020032802b00921060c010b200241046a22062002490d0d2008410174220a2006200a20064b1b220a4100480d0d0240024020080d00200a102a21060c010b20032802b0092008200a102e21060b2006450d1a2003200a3602b409200320063602b009200a21080b2003200241046a220a3602b809200620026a20093600002005417c6a2105200a2102200d200741046a2207470d000b0b2004a72102200341e0036aad4280808080800484200aad4220862006ad84100102402008450d002006102c0b2002450d06200e102c0c060b2002102c0b41dee9c500210541142106410321020c030b410e210641cf8cc6002105410021020c020b41dd8cc6002105410e2106410121020c010b41c2e9c5002105411c2106410221020b20004181203b010820002006360204200020053602002000410a6a20023a00000c1a0b200041023a00080c190b200141086a28020021062001280204210502400240024020022d00000d0020022d000141ff01714101460d010b02402006450d002005102c0b200041811e3b010820004113360204200041c3b2c0003602004100210a2000410a6a41003a00000c010b02402006450d002005102c0b200041023a00084100210a0b41012107410121054101210e4101210f4101211041012111410121134101211441012115410121080c330b02400240024020022d00000d0020022d000141ff01714102470d0020012802042106200341e0036a41186a22074200370300200341e0036a41106a22054200370300200341e0036a41086a22084200370300200342003703e00341f9e8c500ad428080808090018410022202280003210a2002290007210420022d000f210920022f0000210d200241026a2d0000210e2002102c2003200e3a00e2032003200d3b01e003200320093a00ef03200320043700e7032003200a3600e30341de99c500ad4280808080e00084100222022d000f210a200228000321092002290007210420022f0000210d200241026a2d0000210e2002102c200341e0036a41126a200e3a00002005200d3b0100200341a0056a41086a2008290300370300200320043700f703200320093600f303200341a0056a41106a20052903003703002003200a3a00ff03200341a0056a41186a2007290300370300200320032903e0033703a00520034188026a200341a0056a41204101410041001097012003280288024101460d01200341c0036a41186a22074200370300200341c0036a41106a22054200370300200341c0036a41086a22084200370300200342003703c0034191b0c200ad4280808080e0008410022202280003210a2002290007210420022d000f210920022f0000210d200241026a2d0000210e2002102c2003200e3a00c2032003200d3b01c003200320093a00cf03200320043700c7032003200a3600c30341acb0c200ad4280808080e00084100222022d000f210a200228000321092002290007210420022f0000210d200241026a2d0000210e2002102c200341c0036a41126a200e3a00002005200d3b0100200341a0036a41086a2008290300370300200320043700d703200320093600d303200341a0036a41106a20052903003703002003200a3a00df03200341a0036a41186a2007290300370300200320032903c0033703a00320034180026a200341a0036a412010940120032802840241002003280280021b2006490d02200341e0036a41186a22074200370300200341e0036a41106a22054200370300200341e0036a41086a22084200370300200342003703e00341f9e8c500ad428080808090018410022202280003210a2002290007210420022d000f210920022f0000210d200241026a2d0000210e2002102c2003200e3a00e2032003200d3b01e003200320093a00ef03200320043700e7032003200a3600e30341de99c500ad4280808080e00084100222022d000f210a200228000321092002290007210420022f0000210d200241026a2d0000210e2002102c200341f2036a200e3a00002005200d3b0100200341a0056a41086a2008290300370300200320043700f703200320093600f303200341a0056a41106a20052903003703002003200a3a00ff03200341a0056a41186a2007290300370300200320032903e0033703a005200320063602b009200341a0056aad4280808080800484200341b0096aad4280808080c000841001200041023a00080c1a0b200041811c3b01082000410f360204200041d6b2c0003602002000410a6a41003a00000c190b41ef99c500413141acfec5001036000b41a09ac500412341acfec5001036000b20034180056a41026a220d200141076a2d00003a0000200341a8076a41086a220e2001411c6a290200370300200341a8076a41106a220f200141246a290200370300200341a8076a41186a2001412c6a290200370300200341c8076a200141346a290200370300200341d0076a2001413c6a290200370300200341d8076a200141c4006a2d00003a0000200320012f00053b0180052003200141146a2902003703a807200141086a28020021082001410c6a280200210a200141106a28020021052002410c6a2802002110200241086a280200210720022f0001200241036a2d0000411074722111200241046a280200211320022d000021060240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000422090e06000102030405000b200341b0096a41146a4101360200200342013702b409200341fcc4c5003602b009200341043602a406200341f4c4c5003602a0062003200341a0066a3602c009200341b0096a4184c5c5001041000b200341b7066a200e290300370000200341bf066a200f2d00003a0000200320032f0180053b01a006200320053600ab062003200a3600a706200320083600a306200320032903a8073700af062003200d2d00003a00a206024002402006417f6a220241024b0d00024020020e03000102000b200741017420104d0d00201341ff0171450d010b200620117241ff01710d140b200341c0036a41186a22054200370300200341c0036a41106a22064200370300200341c0036a41086a22074200370300200342003703c00341e9eac100ad4280808080b0028410022202280003210d2002290007210420022d000f210e20022f0000210f200241026a2d000021102002102c200320103a00c2032003200f3b01c0032003200e3a00cf03200320043700c7032003200d3600c30341eae5c200ad4280808080f00084100222022d000f210d2002280003210e2002290007210420022f0000210f200241026a2d000021102002102c200341d2036a20103a00002006200f3b0100200341a0036a41086a2007290300370300200320043700d7032003200e3600d303200341a0036a41106a20062903003703002003200d3a00df03200341a0036a41186a2005290300370300200320032903c0033703a003200341b0096a200341a0036a412010d001024020032802b009220d0d004101210d20034101360280044100210f410021100c100b2003200d3602800420032802b409210f20032902b4092204a7211041002102024002402004422088a7220e41014b0d00200e0e021101110b200e210603402006410176220520026a22072002200d20074105746a200341a0066a412010dd054101481b2102200620056b220641014b0d000b0b0240200d20024105746a200341a0066a412010dd0522060d00419eecc10021052010450d12200d102c4110210f0c150b200341b0096a41186a200341a0066a41186a290300370300200341b0096a41106a200341a0066a41106a290300370300200341b0096a41086a200341a0066a41086a290300370300200320032903a0063703b00902402006411f7620026a2205200e4b0d00200341b0096a21060c110b41ecb3c000411e41acfec5001036000b200341b7066a200e290300370000200341bf066a200f2d00003a0000200320032f0180053b01a006200320053600ab062003200a3600a706200320083600a306200320032903a8073700af062003200d2d00003a00a206024002402006417f6a220241024b0d00024020020e03000102000b200741017420104d0d00201341ff0171450d010b200620117241ff01710d130b200341c0036a41186a22054200370300200341c0036a41106a22064200370300200341c0036a41086a22074200370300200342003703c00341e9eac100ad4280808080b0028410022202280003210d2002290007210420022d000f210e20022f0000210f200241026a2d000021102002102c200320103a00c2032003200f3b01c0032003200e3a00cf03200320043700c7032003200d3600c30341eae5c200ad4280808080f00084100222022d000f210d2002280003210e2002290007210420022f0000210f200241026a2d000021102002102c200341d2036a20103a00002006200f3b0100200341a0036a41086a2007290300370300200320043700d7032003200e3600d303200341a0036a41106a20062903003703002003200d3a00df03200341a0036a41186a2005290300370300200320032903c0033703a003200341b0096a200341a0036a412010d00120032802b0092206410120061b210d41002102024002400240024020032902b409420020061b2204422088a7220e41014b0d00200e0e020201020b200e210603402006410176220520026a22072002200d20074105746a200341a0066a412010dd054101481b2102200620056b220641014b0d000b0b200d20024105746a200341a0066a412010dd05450d010b41aeecc1002105410c210f2004a7450d14200d102c0c140b2002200e4f0d03200d20024105746a2206200641206a2002417f73200e6a41057410dc051a200341a0056a41186a22054200370300200341a0056a41106a22064200370300200341a0056a41086a22074200370300200342003703a00541e9eac100ad4280808080b0028410022202280003210f2002290007210b20022d000f211020022f00002111200241026a2d000021132002102c200320133a00a205200320113b01a005200320103a00af052003200b3700a7052003200f3600a30541eae5c200ad4280808080f00084100222022d000f210f200228000321102002290007210b20022f00002111200241026a2d000021132002102c200341b2056a20133a0000200620113b0100200341b0096a41086a20072903003703002003200b3700b705200320103600b305200341b0096a41106a20062903003703002003200f3a00bf05200341b0096a41186a2005290300370300200320032903a0053703b009200341003602b808200342013703b008200e417f6a2205200341b0086a106702402005450d00200e41057441606a2106200d210203402002200341b0086a109101200241206a2102200641606a22060d000b0b20032802b4082102200341b0096aad428080808080048420033502b80842208620032802b0082206ad84100102402002450d002006102c0b200341b0096a41186a200341a0066a41186a290300370300200341b0096a41106a200341a0066a41106a290300370300200341b0096a41086a200341a0066a41086a290300370300200320032903a0063703b009200341b0096a4101200d200510f3022003418a023b01b0094100210541014100200341b0096a1092012004a7450d0b200d102c0c0b0b200341c7086a200e290300370000200341cf086a200f2d00003a0000200320032f0180053b01b008200320053600bb082003200a3600b708200320083600b308200320032903a8073700bf082003200d2d00003a00b208200341a0066a41186a200341d1076a290000370300200341a0066a41106a200341c9076a290000370300200341a0066a41086a200341a8076a41196a290000370300200320032900b9073703a006024002402006417f6a220241024b0d00024020020e03000102000b200741017420104d0d00201341ff0171450d010b200620117241ff01710d120b0240200341b0086a200341a0066a412010dd050d00410021050c0b0b200341c0036a41186a22054200370300200341c0036a41106a22064200370300200341c0036a41086a22074200370300200342003703c00341e9eac100ad4280808080b0028410022202280003210d2002290007210420022d000f210e20022f0000210f200241026a2d000021102002102c200320103a00c2032003200f3b01c0032003200e3a00cf03200320043700c7032003200d3600c30341eae5c200ad4280808080f00084100222022d000f210d2002280003210e2002290007210420022f0000210f200241026a2d000021102002102c200341d2036a20103a00002006200f3b0100200341a0036a41086a2007290300370300200320043700d7032003200e3600d303200341a0036a41106a20062903003703002003200d3a00df03200341a0036a41186a2005290300370300200320032903c0033703a003200341b0096a200341a0036a412010d00120032802b0092206410120061b210741aeecc1002105410c210f410021020240024020032902b409420020061b2204422088a7221041014b0d0020100e020e010e0b2010210603402006410176220d20026a220e20022007200e4105746a200341b0086a412010dd054101481b21022006200d6b220641014b0d000b0b200720024105746a2211200341b0086a412010dd050d0c410021060240201041014b0d0020100e020a090a0b2010210503402005410176220d20066a220e20062007200e4105746a200341a0066a412010dd054101481b21062005200d6b220541014b0d000c090b0b024002402006417f6a220241024b0d00024020020e03000102000b200741017420104d0d00201341ff0171450d010b200620117241ff0171450d000240200a450d002008102c0b419eb3c4002105410a210f0c140b2008200510f402200341c0036a41186a22074200370300200341c0036a41106a22064200370300200341c0036a41086a220d4200370300200342003703c00341e9eac100ad4280808080b00284220410022202280003210e2002290007210b20022d000f210f20022f00002110200241026a2d000021112002102c200320113a00c203200320103b01c0032003200f3a00cf032003200b3700c7032003200e3600c30341eae5c200ad4280808080f00084220b100222022d000f210e2002280003210f2002290007210c20022f00002110200241026a2d000021112002102c200341c0036a41126a20113a0000200620103b0100200341a0036a41086a200d2903003703002003200c3700d7032003200f3600d303200341a0036a41106a20062903003703002003200e3a00df03200341a0036a41186a2007290300370300200320032903c0033703a003200341b0096a200341a0036a412010d0012008200520032802b0092202410120021b220620032902b409420020021b220c422088a710f5020240200ca7450d002006102c0b200341a0056a41186a22074200370300200341a0056a41106a22064200370300200341a0056a41086a220d4200370300200342003703a005200410022202280003210e2002290007210420022d000f210f20022f00002110200241026a2d000021112002102c200320113a00a205200320103b01a0052003200f3a00af05200320043700a7052003200e3600a305200b100222022d000f210e2002280003210f2002290007210420022f00002110200241026a2d000021112002102c200341a0056a41126a20113a0000200620103b0100200341b0096a41086a200d290300370300200320043700b7052003200f3600b305200341b0096a41106a20062903003703002003200e3a00bf05200341b0096a41186a2007290300370300200320032903a0053703b009200341003602a806200342013703a0062005200341a0066a106702402005450d00200541057421062008210203402002200341a0066a109101200241206a2102200641606a22060d000b0b20032802a4062102200341b0096aad428080808080048420033502a80642208620032802a0062206ad84100102402002450d002006102c0b0240200a450d002008102c0b2003418a063b01b009410021054101210241014100200341b0096a1092010c120b201041107621142010410876211520074110762116200741087621172002411a6a2901002104200241196a2d0000211b200241186a2d0000211d200241166a2f01002118200241156a2d00002119200241146a2d0000211a200241126a2f0100212b200241116a2d0000211f200241106a2d0000211c200341c7086a200e290300370000200341cf086a200f2d00003a0000200320032f0180053b01b008200320053600bb082003200a3600b708200320083600b308200320032903a8073700bf082003200d2d00003a00b208410220134108762007411874724102201141ff017141014622051b20061b21020240024020060d0020050d010b41d6b2c0002105410f210f024002400240024020020e050001020315000b201741ff01712016410874722010411874722105201541ff0171201441087472201c41187472210f0c140b41dd8cc6002105410e210f0c130b41c3b2c00021054113210f0c120b41b2b2c00021054111210f0c110b200320043703b8062003201b3a00b7062003201d3a00b606200320183b01b406200320193a00b3062003201a3a00b2062003202b3b01b0062003201f3a00af062003201c3a00ae06200320143b01ac06200320153a00ab06200320103a00aa06200320163b01a806200320173a00a706200320023600a306200320133a00a206200320114108763b01a006200341a0066a200341b0086a412010dd05450d03200341c0036a41186a22054200370300200341c0036a41106a22064200370300200341c0036a41086a22074200370300200342003703c00341e9eac100ad4280808080b0028410022202280003210d2002290007210420022d000f210e20022f0000210f200241026a2d000021102002102c200320103a00c2032003200f3b01c0032003200e3a00cf03200320043700c7032003200d3600c30341eae5c200ad4280808080f00084100222022d000f210d2002280003210e2002290007210420022f0000210f200241026a2d000021102002102c200341d2036a20103a00002006200f3b0100200341a0036a41086a2007290300370300200320043700d7032003200e3600d303200341a0036a41106a20062903003703002003200d3a00df03200341a0036a41186a2005290300370300200320032903c0033703a003200341b0096a200341a0036a412010d00120032802b0092206410120061b210741aeecc1002105410c210f410021020240024020032902b409420020061b2204422088a7221041014b0d0020100e020701070b2010210603402006410176220d20026a220e20022007200e4105746a200341a0066a412010dd054101481b21022006200d6b220641014b0d000b0b200720024105746a2211200341a0066a412010dd050d05410021060240201041014b0d0020100e020302030b2010210503402005410176220d20066a220e20062007200e4105746a200341b0086a412010dd054101481b21062005200d6b220541014b0d000c020b0b418ab4c000411d41acfec5001036000b200720064105746a200341b0086a412010dd050d00419eecc10021054110210f0c030b200341e0036a41186a2206200341b0086a41186a290300370300200341e0036a41106a2205200341b0086a41106a290300370300200341e0036a41086a220d200341b0086a41086a290300370300200320032903b0083703e003200220104f0d01201120032903e003370000201141186a2006290300370000201141106a2005290300370000201141086a200d2903003700002007201010f402200341a0056a41186a22054200370300200341a0056a41106a22064200370300200341a0056a41086a220d4200370300200342003703a00541e9eac100ad4280808080b0028410022202280003210e2002290007210b20022d000f210f20022f00002111200241026a2d000021132002102c200320133a00a205200320113b01a0052003200f3a00af052003200b3700a7052003200e3600a30541eae5c200ad4280808080f00084100222022d000f210e2002280003210f2002290007210b20022f00002111200241026a2d000021132002102c200341b2056a20133a0000200620113b0100200341b0096a41086a200d2903003703002003200b3700b7052003200f3600b305200341b0096a41106a20062903003703002003200e3a00bf05200341b0096a41186a2005290300370300200320032903a0053703b00941002102200341003602a805200342013703a0052010200341a0056a1067201041057421060340200720026a200341a0056a1091012006200241206a2202470d000b20032802a4052102200341b0096aad428080808080048420033502a80542208620032802a0052206ad84100102402002450d002006102c0b200341b0096a41186a200341a0066a41186a290300370300200341b0096a41106a200341a0066a41106a290300370300200341b0096a41086a200341a0066a41086a290300370300200320032903a0063703b009200341b0096a41012007201010f3022004a7450d002007102c0b2003418a083b01b0094100210541014100200341b0096a1092010c040b41a888c600200220101038000b2004a7450d0a2007102c0c0a0b200720064105746a200341a0066a412010dd050d00419eecc10021054110210f0c030b200341e0036a41186a2206200341a0066a41186a290300370300200341e0036a41106a2205200341a0066a41106a290300370300200341e0036a41086a220d200341a0066a41086a290300370300200320032903a0063703e003200220104f0d01201120032903e003370000201141186a2006290300370000201141106a2005290300370000201141086a200d2903003700002007201010f402200341a0056a41186a22054200370300200341a0056a41106a22064200370300200341a0056a41086a220d4200370300200342003703a00541e9eac100ad4280808080b0028410022202280003210e2002290007210b20022d000f210f20022f00002111200241026a2d000021132002102c200320133a00a205200320113b01a0052003200f3a00af052003200b3700a7052003200e3600a30541eae5c200ad4280808080f00084100222022d000f210e2002280003210f2002290007210b20022f00002111200241026a2d000021132002102c200341b2056a20133a0000200620113b0100200341b0096a41086a200d2903003703002003200b3700b7052003200f3600b305200341b0096a41106a20062903003703002003200e3a00bf05200341b0096a41186a2005290300370300200320032903a0053703b00941002102200341003602a805200342013703a0052010200341a0056a1067201041057421060340200720026a200341a0056a1091012006200241206a2202470d000b20032802a4052102200341b0096aad428080808080048420033502a80542208620032802a0052206ad84100102402002450d002006102c0b200341b0096a41186a200341b0086a41186a290300370300200341b0096a41106a200341b0086a41106a290300370300200341b0096a41086a200341b0086a41086a290300370300200320032903b0083703b009200341b0096a41012007201010f3022003418a043b01b0094100210541014100200341b0096a1092012004a7450d002007102c0b0c070b41a888c600200220101038000b2004a7450d052007102c0c050b200341b0096a41186a200341a0066a41186a290300370300200341b0096a41106a200341a0066a41106a290300370300200341b0096a41086a200341a0066a41086a290300370300200320032903a0063703b0094100210e200341b0096a2106410021050b02400240200e2010460d00200f21100c010b0240200f200e460d00200f21100c010b200f41016a2202200f490d02200f41017422072002200720024b1b221041ffffff3f712010470d02201041057422024100480d0202400240200f0d002002102a210d0c010b200d200f4105742002102e210d0b200d450d0f2003200d360280040b200d20054105746a220241206a2002200e20056b41057410dc051a200241186a200641186a290000370000200241106a200641106a290000370000200241086a200641086a29000037000020022006290000370000200341a0056a41186a22054200370300200341a0056a41106a22064200370300200341a0056a41086a22074200370300200342003703a00541e9eac100ad4280808080b0028410022202280003210d2002290007210420022d000f210f20022f00002111200241026a2d000021132002102c200320133a00a205200320113b01a0052003200f3a00af05200320043700a7052003200d3600a30541eae5c200ad4280808080f00084100222022d000f210d2002280003210f2002290007210420022f00002111200241026a2d000021132002102c200341b2056a20133a0000200620113b0100200341b0096a41086a2007290300370300200320043700b7052003200f3600b305200341b0096a41106a20062903003703002003200d3a00bf05200341b0096a41186a2005290300370300200320032903a0053703b0092003280280042102200341003602b808200342013703b008200e41016a2207200341b0086a106702402007200e490d00200e41057441206a210603402002200341b0086a109101200241206a2102200641606a22060d000b0b20032802b4082102200341b0096aad428080808080048420033502b80842208620032802b0082206ad84100102402002450d002006102c0b200341b0096a41186a200341a0066a41186a290300370300200341b0096a41106a200341a0066a41106a290300370300200341b0096a41086a200341a0066a41086a290300370300200320032903a0063703b00941002105410141002003280280042202200710f3022003410a3b01b00941014100200341b0096a1092012010450d002002102c0b4110210f0c020b1035000b419eb3c4002105410a210f0b410021020b024020094104470d002002200a45720d002008102c0b20050d00200041023a0008410021080c010b200041811a3b01082000200f36020420002005360200410021082000410a6a41003a00000b41012107410121054101210e4101210f41012110410121114101211341012114410121150c2a0b200341a8076a41206a200141286a290300370300200341a8076a41186a200141206a290300370300200341a8076a41106a200141186a290300370300200341a8076a41086a200141106a2903003703002003200141086a2903003703a807200341b0096a41206a200241206a290200370300200341b0096a41186a200241186a290200370300200341b0096a41106a200241106a290200370300200341b0096a41086a200241086a290200370300200320022902003703b009200341f8016a200341a8076a200341b0096a109e020240024020032802f80122020d00200041023a0008410021150c010b20032802fc01210620004181183b010820002002360200410021152000410a6a41003a0000200020063602040b41012107410121054101210e4101210f410121104101211141012113410121140c280b200341a8076a41206a200141246a290200370300200341a8076a41186a2001411c6a290200370300200341a8076a41106a200141146a290200370300200341a8076a41086a2001410c6a290200370300200320012902043703a807200341b0096a41206a200241206a290200370300200341b0096a41186a200241186a290200370300200341b0096a41106a200241106a290200370300200341b0096a41086a200241086a290200370300200320022902003703b009200341f0016a200341a8076a200341b0096a10f6020240024020032802f00122020d00200041023a0008410021140c010b20032802f401210620004181163b010820002002360200410021142000410a6a41003a0000200020063602040b41012107410121054101210e4101210f4101211041012111410121130c260b200341a8076a41206a200141246a290200370300200341a8076a41186a2001411c6a290200370300200341a8076a41106a200141146a290200370300200341a8076a41086a2001410c6a290200370300200320012902043703a807200341b0096a41206a200241206a290200370300200341b0096a41186a200241186a290200370300200341b0096a41106a200241106a290200370300200341b0096a41086a200241086a290200370300200320022902003703b009200341e8016a200341a8076a200341b0096a10f7020240024020032802e80122020d00200041023a0008410021130c010b20032802ec01210620004181143b010820002002360200410021132000410a6a41003a0000200020063602040b41012107410121054101210e4101210f41012110410121110c240b200341b0096a41306a200141386a290300370300200341b0096a41286a200141306a290300370300200341b0096a41206a200141286a290300370300200341b0096a41186a200141206a290300370300200341b0096a41106a200141186a290300370300200341b0096a41086a200141106a2903003703002003200141086a2903003703b009200341a8076a41206a200241206a290200370300200341a8076a41186a200241186a290200370300200341a8076a41106a200241106a290200370300200341a8076a41086a200241086a290200370300200320022902003703a807200341e0016a200341b0096a200341a8076a10f8020240024020032802e00122020d00200041023a0008410021110c010b20032802e401210620004181123b010820002002360200410021112000410a6a41003a0000200020063602040b41012107410121054101210e4101210f410121100c220b200141086a280200211120012802042116200341b0096a2001410c6a41840110db051a2002411a6a2901002104200241196a2d0000210f200241186a2d00002110200241166a2f01002113200241156a2d00002114200241146a2d00002115200241126a2f01002117200241116a2d0000211c200241106a2d000021072002410e6a2f010021082002410d6a2d0000210a2002410c6a2d000021092002410a6a2f0100210d200241096a2d0000210e200241046a2d0000211b200241026a2f0100211d200241056a280000210520022d0000210620022d0001210220034180046a200341b0096a41046a41800110db051a410220054102200241014622021b20061b21050240024002400240024020060d0020020d010b41d6b2c0002102410f2106024002400240024020050e050001020305000b200d410874200e7220094118747221022008410874200a7220074118747221060c040b41dd8cc6002102410e21060c030b41c3b2c0002102411321060c020b41b2b2c0002102411121060c010b200320043703c8082003200f3a00c708200320103a00c608200320133b01c408200320143a00c308200320153a00c208200320173b01c0082003201c3a00bf08200320073a00be08200320083b01bc082003200a3a00bb08200320093a00ba082003200d3b01b8082003200e3a00b708200320053600b3082003201b3a00b2082003201d3b01b008200341a8076a200341b0086a10f902024020032802c8072202450d00200341a0066a41106a200341e0076a290300370300200341a0066a41086a200341d8076a290300370300200341a0066a41186a200341e8076a290300370300200341c0066a200341f0076a280200360200200341c0036a41086a2206200341ac066a290200370300200341c0036a41106a2205200341b4066a290200370300200341c0036a41186a2207200341bc066a2902003703002003200341d0076a2903003703a006200320032902a4063703c003024020032802cc07450d002002102c0b20034180056a41086a200629030037030020034180056a41106a200529030037030020034180056a41186a2007290300370300200320032903c00337038005200341a0056a20034180046a41800110db051a200341e0036a20034180056a10a601200341a8076a20032802e003220620032802e80310a70120032d00a8072102200341b0086a200341a8076a41017241800110db051a0240024020024101460d00200341003a00a0060c010b200341013a00a006200341a0066a410172200341b0086a41800110db051a0b024020032802e403450d002006102c0b200341a0056a41206a2113200341e0056a211420034180066a2115200341c1066a2117200341e1066a211c20034181076a211b200341a0066a410172211d200341a8076a4101722105417021080340410021060240024002400240200841a4eec1006a280000220241e6e485f3064a220f0d00200241e2c289ab06460d0141012107200241e1ea91cb06470d0341202106201521070c030b200241e9dabdf306460d0141012107200241e7e485f306470d0241202106200341a0056a21070c020b41202106201321070c010b41202106201421070b200320063602b808200320073602b408200320023602b008200341c0036a200341b0086a10a801200341a8076a20032802c003220a20032802c80310d301200341a0036a41086a2209200541086a290000370300200341a0036a41106a220d200541106a290000370300200341a0036a41186a220e200541186a290000370300200320052900003703a0030240024020032d00a8074101470d00200341e0036a41186a2210200e290300370300200341e0036a41106a220e200d290300370300200341e0036a41086a220d2009290300370300200320032903a0033703e003024020032802c403450d00200a102c0b200341a8076a41186a2010290300370300200341a8076a41106a200e290300370300200341a8076a41086a200d290300370300200320032903e0033703a807200341a8076a20034180056a412010dd05450d0141bfbbc1002102411821060c040b20032802c403450d00200a102c0b0240024020032d00a0064101470d004100210a410121090240024002400240200f0d00200241e2c289ab06460d01200241e1ea91cb06470d034120210a201b21090c030b200241e9dabdf306460d01200241e7e485f306470d024120210a201d21090c020b4120210a201721090c010b4120210a201c21090b02402006200a470d0020072009460d0220072009200610dd05450d020b2003200a3602b007200320093602ac07200320023602a807200341b0086a200341a8076a10a80120033502b80842208620032802b008220aad84100520032802b408450d00200a102c0b200320063602b007200320073602ac07200320023602a807200341b0086a200341a8076a10a80120032802b0082102200320032802b8083602ac07200320023602a80720034180056a200341a8076a10a10220032802b408450d002002102c0b200841046a22080d000b200341b0086a20034180056a10a60120032802b008210220033502b8082104200341003602b007200342013703a807200341a0056a200341a8076a109101200341c0056a200341a8076a109101200341e0056a200341a8076a10910120034180066a200341a8076a10910120032802ac07210620044220862002ad8420033502b00742208620032802a8072205ad84100102402006450d002005102c0b024020032802b408450d002002102c0b2011450d022016102c0c020b4198bbc1002102412721060b02402011450d002016102c0b2002450d0020004181103b01082000200636020420002002360200410021102000410a6a41003a00000c010b200041023a0008410021100b41012107410121054101210e4101210f0c200b200341b0096a41306a200141386a290300370300200341b0096a41286a200141306a290300370300200341b0096a41206a200141286a290300370300200341b0096a41186a200141206a290300370300200341b0096a41106a200141186a290300370300200341b0096a41086a200141106a2903003703002003200141086a2903003703b009200341a8076a41206a200241206a290200370300200341a8076a41186a200241186a290200370300200341a8076a41106a200241106a290200370300200341a8076a41086a200241086a290200370300200320022902003703a807200341a0066a200341b0096a200341a8076a10fa02410c21020240024020032802a0062206410c470d00200041023a00080c010b4195e2c5002105410b210702400240024002400240024002400240024002400240024020060e0c000102030405060708090a0b000b20032802a4062105200341a8066a2802002102410021070c0a0b41dd8cc6002105410e2102410121070c090b4188e2c5002105410d2102410221070c080b4180e2c500210541082102410321070c070b41f3e1c5002105410d2102410421070c060b41e6e1c5002105410d2102410521070c050b41dde1c500210541092102410621070c040b41d1e1c5002105410721070c030b41c3e1c5002105410e2102410821070c020b41b2e1c500210541112102410921070c010b41a1e1c500210541112102410a21070b200041810e3b010820002002360204200020053602002000410a6a20073a00000b4100210f41012107410121054101210e0c1e0b2003419c036a41026a22072001410f6a2d00003a000020034180046a41086a22082001411c6a29020037030020034180046a41106a220a200141246a29020037030020034180046a41186a22092001412c6a280200360200200320012f000d3b019c032003200141146a29020037038004200141c8006a2903002112200141c0006a290300212c200141386a290300210c2002411a6a2901002104200241196a2d0000210f200241186a2d00002110200241166a2f01002111200241156a2d00002113200241146a2d00002114200241126a2f0100211541112106200241116a2d00002116200241106a2d000021172002410e6a2f0100211c2002410d6a2d0000211b2002410c6a2d0000211d2002410a6a2f01002118200241096a2d00002119200241086a2d0000211a200241066a2f0100212b200241056a2d0000211f200241046a2d00002120200241026a2f01002121200141106a28020021052001410c6a2d00002122200141306a290300210b20022d0001210d20022d0000210e0240024002400240024002400240024002400240024002400240024002400240200141086a2802000e050001020304000b200341b0096a41146a4101360200200342013702b409200341fcc4c5003602b009200341043602a406200341f4c4c5003602a0062003200341a0066a3602c009200341b0096a4184c5c5001041000b200341a0066a41086a2008290300370300200341a0066a41106a200a290300370300200341a0066a41186a2009280200360200200320032f019c033b01800520032003290380043703a006200320072d00003a008205200320043703b8052003200f3a00b705200320103a00b605200320113b01b405200320133a00b305200320143a00b205200320153b01b005200320163a00af05200320173a00ae052003201c3b01ac052003201b3a00ab052003201d3a00aa05200320183b01a805200320193a00a70520034102202b410874201f72201a411874724102200d41ff017141014622061b200e41ff017122021b22073600a305200320203a00a205200320213b01a0050240024020020d0020060d010b41d6b2c0002102410f210620070e050416050617040b200341a8076a41186a200341a0056a41186a290300370300200341a8076a41106a200341a0056a41106a290300370300200341a8076a41086a200341a0056a41086a290300370300200320032903a0053703a8070240202241ff01714101460d00200341a0066a41106a290300210420032f01800520032d00820541107472210220032903a8062212420888a721062012422088a721072012a7210820032802b806210a20032903a00621120c130b200341b0086a200541067610910220032802b00821090240024020032802b8082005413f7122024b0d004100210d0c010b200920024105746a22052f0010200541126a2d000041107472210620052f0000200541026a2d000041107472210220052d001f210a200529001721042005280013210720052d000f210820052900072112200528000321054101210d0b024020032802b408450d002009102c0b200d0d12410121090c130b200341a0066a41086a2008290300370300200341a0066a41106a200a290300370300200341a0066a41186a2009280200360200200320032f019c033b01b00820032003290380043703a006200320072d00003a00b20841b2b2c0002102200d200e7241ff01710d1502400240202241ff01714101460d00200341a0066a41106a290300210420032f01b00820032d00b20841107472210220032903a806222d420888a72106202d422088a72107202da7210820032802b806210a20032903a006212d0c010b200341b0096a200541067610910220032802b00921090240024020032802b8092005413f7122024b0d004100210d0c010b200920024105746a22052f0010200541126a2d000041107472210620052f0000200541026a2d000041107472210220052d001f210a200529001721042005280013210720052d000f21082005290007212d200528000321054101210d0b024020032802b409450d002009102c0b200d450d150b200320063b01b807200341a8076a41126a20064110763a00002003200a3a00c707200320043700bf07200320073600bb07200320083a00b7072003202d3700af07200320053600ab07200320023b01a807200320024110763a00aa07418be9c500ad4280808080800184100222022d000f2106200229000721042002280003210520022f00002107200241026a2d000021082002102c41d6b5c000ad4280808080b00184100222022d000f210a2002290007212d2002280003210920022f0000210d200241026a2d0000210e2002102c200341a0056a200341a8076a109f0141c000102a2202450d0d20022004370007200220053600032002200720084110747222053b0000200241026a20054110763a0000200220063a000f2002202d370017200220093600132002200d200e4110747222063b0010200241126a20064110763a00002002200a3a001f200220032903a005370020200241286a200341a0056a41086a290300370000200241306a200341a0056a41106a290300370000200241386a200341a0056a41186a290300370000200341b8016a200241c000109e01200341b8016a41106a290300212f20032903c001210420032802b80121062002102c4200200b200b428080e983b1de16544100200c501b22021b222d2004420020061b222e564200200c20021b2204202f420020061b220b562004200b5122021b0d06202d202e542004200b5420021b450d0c200341c0036a41186a22054200370300200341c0036a41106a22024200370300200341c0036a41086a22074200370300200342003703c003418be9c500ad4280808080800184220c1002220628000321082006290007212f20062d000f210a20062f00002109200641026a2d0000210d2006102c2003200d3a00c203200320093b01c0032003200a3a00cf032003202f3700c703200320083600c30341c9b5c000ad4280808080d00184222f100222062d000f21082006280003210a2006290007213020062f00002109200641026a2d0000210d2006102c200341d2036a220e200d3a0000200220093b0100200341a0036a41086a22092007290300370300200320303700d7032003200a3600d303200341a0036a41106a220a2002290300370300200320083a00df03200341a0036a41186a220d2005290300370300200320032903c0033703a003200341a0016a200341a0036a4120109e01200341a0016a41106a290300213020032903a801213120032802a0012108200542003703002002420037030020074200370300200342003703c003200c10022206280003210f2006290007210c20062d000f211020062f00002111200641026a2d000021132006102c200320133a00c203200320113b01c003200320103a00cf032003200c3700c7032003200f3600c303202f100222062d000f210f200628000321102006290007210c20062f00002111200641026a2d000021132006102c200e20133a0000200220113b0100200920072903003703002003200c3700d703200320103600d303200a20022903003703002003200f3a00df03200d2005290300370300200320032903c0033703a003200342002030420020081b220c202e202d54ad2004200b7d7c7c2031420020081b220b202e202d7d222f54ad7d222e200b202f7d222f200b56202e200c56202e200c511b22021b3703b80920034200202f20021b3703b009200341b0096a2102200341a0036a21060c0b0b200141e0006a2903002104200141d8006a290300212d200141d0006a290300212e200341a0066a41086a2008290300370300200341a0066a41106a200a290300370300200341a0066a41186a2009280200360200200320032f019c033b018005200320072d00003a00820520032003290380043703a00641b2b2c0002102200d200e7241ff01710d140240202241ff01714101460d00200341a0066a41106a290300212f20032f01800520032d00820541107472210220032903a8062230420888a721062030422088a721072030a7210820032802b806210a20032903a00621300c090b200341b0096a200541067610910220032802b00921090240024020032802b8092005413f7122024b0d004100210d0c010b200920024105746a22052f0010200541126a2d000041107472210620052f0000200541026a2d000041107472210220052d001f210a2005290017212f2005280013210720052d000f210820052900072130200528000321054101210d0b024020032802b409450d002009102c0b200d0d08410121090c090b200341b0086a41086a2008290300370300200341b0086a41106a200a290300370300200341b0086a41186a2009280200360200200320032f019c033b01800520032003290380043703b008200320072d00003a008205200320043703b8052003200f3a00b705200320103a00b605200320113b01b405200320133a00b305200320143a00b205200320153b01b005200320163a00af05200320173a00ae052003201c3b01ac052003201b3a00ab052003201d3a00aa05200320183b01a805200320193a00a70520034102202b410874201a41187472201f724102200d41ff017141014622061b200e41ff017122021b22073600a305200320203a00a205200320213b01a005024020020d0020060d040b41d6b2c0002102410f210620070e050012010213000b20032800a705210220032800ab0521060c120b41c3b2c0002102411321060c110b41b2b2c0002102411121060c100b200341a8076a41186a200341a0056a41186a290300370300200341a8076a41106a200341a0056a41106a290300370300200341a8076a41086a200341a0056a41086a290300370300200320032903a0053703a8070240202241ff01714101460d00200341b0086a41106a290300210420032f01800520032d00820541107472210220032903b8082212420888a721062012422088a721072012a7210820032802c808210a20032903b00821120c020b200341a0066a200541067610910220032802a00621090240024020032802a8062005413f7122024b0d004100210d0c010b200920024105746a22052f0010200541126a2d000041107472210620052f0000200541026a2d000041107472210220052d001f210a200529001721042005280013210720052d000f210820052900072112200528000321054101210d0b024020032802a406450d002009102c0b200d0d01410121090c020b200341c0036a41186a22054200370300200341c0036a41106a22024200370300200341c0036a41086a22074200370300200342003703c003418be9c500ad4280808080800184220c1002220628000321082006290007212f20062d000f210a20062f00002109200641026a2d0000210d2006102c2003200d3a00c203200320093b01c0032003200a3a00cf032003202f3700c703200320083600c30341c9b5c000ad4280808080d00184222f100222062d000f21082006280003210a2006290007213020062f00002109200641026a2d0000210d2006102c200341d2036a220e200d3a0000200220093b0100200341a0036a41086a22092007290300370300200320303700d7032003200a3600d303200341a0036a41106a220a2002290300370300200320083a00df03200341a0036a41186a220d2005290300370300200320032903c0033703a00320034188016a200341a0036a4120109e0120034188016a41106a290300213020032903900121312003280288012108200542003703002002420037030020074200370300200342003703c003200c10022206280003210f2006290007210c20062d000f211020062f00002111200641026a2d000021132006102c200320133a00c203200320113b01c003200320103a00cf032003200c3700c7032003200f3600c303202f100222062d000f210f200628000321102006290007210c20062f00002111200641026a2d000021132006102c200e20133a0000200220113b0100200920072903003703002003200c3700d703200320103600d303200a20022903003703002003200f3a00df03200d2005290300370300200320032903c0033703a0032003427f2030420020081b220c2004200b7d202d202e54ad7d7c2031420020081b220b202d202e7d7c222e200b542202ad7c220b2002200b200c54200b200c511b22021b3703b8092003427f202e20021b3703b009200341b0096a2102200341a0036a21060c040b410021090b200320063b01f003200341f2036a20064110763a00002003200a3a00ff03200320043700f703200320073600f303200320083a00ef03200320123700e703200320053600e303200320023b01e003200320024110763a00e20320090d0b200341b0096a41186a200341e0036a41186a290300370300200341b0096a41106a200341e0036a41106a290300370300200341b0096a41086a200341e0036a41086a290300370300200320032903e0033703b009200341d8016a200341a8076a200341b0096a200b200c410010cd01024020032802d8012202450d0020032802dc0121060c0d0b410021020c0c0b410021090b200320063b01b005200341b2056a20064110763a00002003200a3a00bf052003202f3700b705200320073600b305200320083a00af05200320303700a705200320053600a305200320023b01a005200320024110763a00a20520090d09200b422088a72105200341a8076a41186a200341a0056a41186a290300370300200341a8076a41106a200341a0056a41106a290300370300200341a8076a41086a200341a0056a41086a290300370300200320032903a0053703a807024002400240200ba741ff01714101460d00200b420888a72102202c420888a72106202c422088a72107202ea7210a202ca721080c010b200341b0086a200b422688a710910220032802b00821090240024020032802b8082005413f7122054b0d004100210d202f21122030210c0c010b200920054105746a22052f0010200541126a2d000041107472210620052f0000200541026a2d000041107472210220052d001f210a200529001721122005280013210720052d000f21082005290007210c200528000321054101210d0b024020032802b408450d002009102c0b200d0d00410121090c010b410021090b200320063b01f003200341f2036a20064110763a00002003200a3a00ff03200320123700f703200320073600f303200320083a00ef032003200c3700e703200320053600e303200320023b01e003200320024110763a00e20320090d09200341b0096a41186a200341e0036a41186a290300370300200341b0096a41106a200341e0036a41106a290300370300200341b0096a41086a200341e0036a41086a290300370300200320032903e0033703b009200341d0016a200341a8076a200341b0096a202d2004410110cd0120032802d0012202450d0820032802d40121060c0a0b2006ad42808080808004842002ad428080808080028410010b200341a8076a202d200410a201418be9c500ad4280808080800184100222022d000f21062002290007210b2002280003210520022f00002107200241026a2d000021082002102c41e1b5c000ad4280808080f00184100222022d000f210a2002290007210c2002280003210920022f0000210d200241026a2d0000210e2002102c200341e0036a200341a8076a109f0141c000102a2202450d002002200b370007200220053600032002200720084110747222053b0000200241026a20054110763a0000200220063a000f2002200c370017200220093600132002200d200e4110747222063b0010200241126a20064110763a00002002200a3a001f200220032903e003370020200241286a200341e0036a41086a290300370000200241306a200341e0036a41106a290300370000200241386a200341e0036a41186a290300370000200341f0006a200241c000109e01200341f0006a41106a290300212e2003290378210b200328027021062002102c4200202c202c428080e983b1de165441002012501b22021b220c200b420020061b222c564200201220021b220b202e420020061b221256200b20125122021b0d01200c202c54200b20125420021b450d03200341c0036a41186a22054200370300200341c0036a41106a22024200370300200341c0036a41086a22074200370300200342003703c003418be9c500ad4280808080800184222e1002220628000321082006290007212f20062d000f210a20062f00002109200641026a2d0000210d2006102c2003200d3a00c203200320093b01c0032003200a3a00cf032003202f3700c703200320083600c30341c9b5c000ad4280808080d00184222f100222062d000f21082006280003210a2006290007213020062f00002109200641026a2d0000210d2006102c200341d2036a220e200d3a0000200220093b0100200341a0036a41086a22092007290300370300200320303700d7032003200a3600d303200341a0036a41106a220a2002290300370300200320083a00df03200341a0036a41186a220d2005290300370300200320032903c0033703a003200341d8006a200341a0036a4120109e01200341d8006a41106a29030021302003290360213120032802582108200542003703002002420037030020074200370300200342003703c003202e10022206280003210f2006290007212e20062d000f211020062f00002111200641026a2d000021132006102c200320133a00c203200320113b01c003200320103a00cf032003202e3700c7032003200f3600c303202f100222062d000f210f200628000321102006290007212e20062f00002111200641026a2d000021132006102c200e20133a0000200220113b0100200920072903003703002003202e3700d703200320103600d303200a20022903003703002003200f3a00df03200d2005290300370300200320032903c0033703a003200342002030420020081b222e202c200c54ad200b20127d7c7c2031420020081b2212202c200c7d222f54ad7d222c2012202f7d222f201256202c202e56202c202e511b22021b3703b80920034200202f20021b3703b009200341b0096a2102200341a0036a21060c020b1033000b200341c0036a41186a22054200370300200341c0036a41106a22024200370300200341c0036a41086a22074200370300200342003703c003418be9c500ad4280808080800184222e1002220628000321082006290007212f20062d000f210a20062f00002109200641026a2d0000210d2006102c2003200d3a00c203200320093b01c0032003200a3a00cf032003202f3700c703200320083600c30341c9b5c000ad4280808080d00184222f100222062d000f21082006280003210a2006290007213020062f00002109200641026a2d0000210d2006102c200341c0036a41126a220e200d3a0000200220093b0100200341a0036a41086a22092007290300370300200320303700d7032003200a3600d303200341a0036a41106a220a2002290300370300200320083a00df03200341a0036a41186a220d2005290300370300200320032903c0033703a003200341c0006a200341a0036a4120109e01200341c0006a41106a29030021302003290348213120032802402108200542003703002002420037030020074200370300200342003703c003202e10022206280003210f2006290007212e20062d000f211020062f00002111200641026a2d000021132006102c200320133a00c203200320113b01c003200320103a00cf032003202e3700c7032003200f3600c303202f100222062d000f210f200628000321102006290007212e20062f00002111200641026a2d000021132006102c200e20133a0000200220113b0100200920072903003703002003202e3700d703200320103600d303200a20022903003703002003200f3a00df03200d2005290300370300200320032903c0033703a0032003427f2030420020081b222e200b20127d200c202c54ad7d7c2031420020081b2212200c202c7d7c222c2012542202ad7c221220022012202e542012202e511b22021b3703b8092003427f202c20021b3703b009200341b0096a2102200341a0036a21060b2006ad42808080808004842002ad428080808080028410010b200341a8076a200c200b10aa01200341f8096a200b370300200341f0096a200c370300200341e8096a2004370300200341e0096a202d370300200341b0096a41086a41033a0000200341b9096a20032903a807370000200341c1096a200341a8076a41086a290300370000200341c9096a200341b8076a290300370000200341d1096a200341c0076a290300370000200341033a00b0094100210241014100200341b0096a1092010c040b410021090b200320063b01f003200341f2036a20064110763a00002003200a3a00ff03200320043700f703200320073600f303200320083a00ef03200320123700e703200320053600e303200320023b01e003200320024110763a00e20320090d01200341b0096a41186a200341e0036a41186a290300370300200341b0096a41106a200341e0036a41106a290300370300200341b0096a41086a200341e0036a41086a290300370300200320032903e0033703b009200341386a200341a8076a200341b0096a200b200c410110cd0120032802382202450d00200328023c21060c020b410021020c010b41dd8cc6002102410e21060b024020020d00200041023a00080c010b200041810c3b010820002006360204200020023602002000410a6a41003a00000b41012107410121050c110b024020032802bc092206450d0020032802b4092102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102c0c030b2002410c6a280200450d02200241086a280200102c0c020b2002410c6a280200450d01200241086a280200102c0c010b200241086a280200450d00200241046a280200102c0b200241246a21022006415c6a22060d000b0b024020032802b809450d0020032802b409102c0b024020072011460d00034020072802042208450d01200741086a280200210e02402007410c6a2802002202450d00200241246c21062008210203400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102c0c030b2002410c6a280200450d02200241086a280200102c0c020b2002410c6a280200450d01200241086a280200102c0c010b200241086a280200450d00200241046a280200102c0b200241246a21022006415c6a22060d000b0b200741f0006a21070240200e450d002008102c0b20072011470d000b0b0240200f450d00200a102c0b2004a7450d052014102c0c050b20072011460d00034020072802042208450d01200741086a280200210902402007410c6a2802002202450d00200241246c21062008210203400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102c0c030b2002410c6a280200450d02200241086a280200102c0c020b2002410c6a280200450d01200241086a280200102c0c010b200241086a280200450d00200241046a280200102c0b200241246a21022006415c6a22060d000b0b200741f0006a210702402009450d002008102c0b20072011470d000b0b0240200f450d00200a102c0b41a4c6c500ad4280808080a001841002220228000321062002290007210b20022d000f210520022f00002107200241026a2d000021082002102c41f889c200ad4280808080e0008410022202280003210a2002290007210c20022d000f210920022f0000210d200241026a2d0000210e2002102c200341c2096a200e3a00002003200d3b01c009200320083a00b209200320073b01b009200320093a00cf092003200c3700c7092003200a3600c309200320053a00bf092003200b3700b709200320063600b309200341a8076a20032802c00322022004422088a710e701201220033502b00742208620032802a8072206ad841001024020032802ac07450d002006102c0b02402004a7450d002002102c0b200041023a00084100210e0c040b2006450d010b200a200641f0006c6a2108200a2107034002402007410c6a2802002206450d0020072802042102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102c0c030b2002410c6a280200450d02200241086a280200102c0c020b2002410c6a280200450d01200241086a280200102c0c010b200241086a280200450d00200241046a280200102c0b200241246a21022006415c6a22060d000b0b200741f0006a21020240200741086a280200450d002007280204102c0b2002210720022008470d000b0b200f450d00200a102c0b20004181083b01082000200d360204200020093602004100210e2000410a6a41003a00000b41012107410121050c0a0b2005102c0b0240024002402007417e6a220241054b0d000240024002400240024020020e06000501020304000b41000d062004a70d050c060b41000d052004a70d040c050b200a450d0402402004422088a72202450d00200241186c21062005210203400240200241046a280200450d002002280200102c0b0240200241106a280200450d002002410c6a280200102c0b200241186a2102200641686a22060d000b0b2004a70d030c040b2006450d0302402004422088a72202450d002002410c6c21062005210203400240200241046a280200450d002002280200102c0b2002410c6a2102200641746a22060d000b0b2004a70d020c030b41000d022004a70d010c020b02402007417f6a220241024b0d0020020e03020002020b2004a7450d010b2005102c0b41d6b2c0002102410f21064104210720080e06010204030500010b200041023a0008410121050c050b410021070c030b41dd8cc6002102410e2106410121070c020b41b2b2c000210241112106410321070c010b41c3b2c000210241132106410221070b41012105200041013b010820002006360204200020023602002000410a6a20073a00000b410021070b4101210e0b4101210f0b410121100b410121110b410121130b410121140b410121150b410121080b4101210a0b410121090b41012100410121060b4101210d0b024002402001280200220241134b0d000240024002400240024002400240024002400240024002400240024020020e1400010e0f020e0f030405060708090f0a0f0b0c0d000b2007450d0e200141086a10fb020c0e0b2005450d0d02402001410c6a2802002206450d002001280204210220064190016c210603402002107320024190016a2102200641f07e6a22060d000b0b200141086a280200450d0d2001280204102c0c0d0b200e450d0c02402001410c6a2802002202450d0020012802042207200241f0006c6a2100034002402007410c6a2802002206450d0020072802042102200641246c210603400240024020022d0000220541034b0d0002400240024020050e0404000102040b2002410c6a280200450d03200241086a280200102c0c030b2002410c6a280200450d02200241086a280200102c0c020b2002410c6a280200450d01200241086a280200102c0c010b200241086a280200450d00200241046a280200102c0b200241246a21022006415c6a22060d000b0b200741f0006a21020240200741086a280200450d002007280204102c0b2002210720022000470d000b0b200141086a280200450d0c2001280204102c0c0c0b200f450d0b0240200141086a2d00002202410f4b0d00410120027441bfbf03710d0c024020024106470d00200141106a280200450d0d2001410c6a280200102c0c0d0b200141106a280200450d0c2001410c6a280200102c0c0c0b200141146a280200450d0b200141106a280200102c0c0b0b2010450d0a200141086a280200450d0a2001280204102c0c0a0b2011450d09200141086a2d0000416d6a220241014b0d090240024020020e020001000b200141106a280200450d0a2001410c6a280200102c0c0a0b200141106a280200450d092001410c6a280200102c0c090b2013450d0820012d0004417f6a220241024b0d0802400240024020020e03000102000b2001410c6a280200450d0a200141086a280200102c0c0a0b200141086a220228020010fc022002280200102c0c090b2001410c6a220228020010fc022002280200102c0c080b2014450d0720012d0004417f6a220241024b0d0702400240024020020e03000102000b2001410c6a280200450d09200141086a280200102c0c090b200141086a220228020010fc022002280200102c0c080b2001410c6a220228020010fc022002280200102c0c070b2015450d06200141086a2802004101470d06200141106a280200450d062001410c6a280200102c0c060b2008450d0520012d00044104470d052001410c6a280200450d05200141086a280200102c0c050b200a450d04200141086a280200450d042001280204102c0c040b2009450d03200141086a2d0000417e6a220241024b0d0302400240024020020e03000102000b200141106a280200450d052001410c6a280200102c0c050b200141346a280200450d04200141306a280200102c0c040b200141306a280200450d032001412c6a280200102c0c030b2000450d0202402001280204220241024b0d00024020020e03040004040b200141086a220228020010fc022002280200102c0c030b2001412c6a220228020010fc022002280200102c0c020b2006450d0102402001410c6a280200450d00200141086a280200102c0b02402001411c6a2802002206450d00200141146a28020021022006410c6c210603400240200241046a280200450d002002280200102c0b2002410c6a2102200641746a22060d000b0b200141186a280200450d012001280214102c0c010b200d450d0002402001280204220241034b0d00024020020e0402000202020b2001410c6a280200450d01200141086a280200102c0c010b200141306a280200450d002001412c6a280200102c0b200341c00a6a24000bb50404057f017e017f017e0240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a3602000240200441037122064103460d00024002400240024020060e03000102000b2004410276ad21070c020b41012106024020050d000c050b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d04200141fcff0371410276ad21070c010b410121060240200541034f0d000c040b200341036a2d0000210520032f0001210820012002417c6a3602042001200341046a3602002008200541107472410874200472220141808004490d032001410276ad21070b410021060c020b02402004410276220841044b0d000240024020080e050002020201000b20054104490d022003350001210720012002417b6a3602042001200341056a36020020074280808080045421060c030b20054108490d01200329000121072001200241776a3602042001200341096a3602002007428080808080808080015421060c020b200841046a220541084b0d002002417e6a2102200341026a2103410021044200210741012106034002402002417f470d000c030b2003417f6a310000210920012002360204200120033602002002417f6a2102200341016a210320092004410374413871ad862007842107200441016a220441ff01712005490d000b2007427f412820084103746b413871ad885821060c010b410121060b2000200737030820002006ad3703000b810903017f017e057f230041e0006b22022400024002400240024020002903002203423f560d0002400240200141046a280200200141086a2802002200460d00200128020021040c010b200041016a22042000490d04200041017422052004200520044b1b22054100480d040240024020000d002005102a21040c010b200128020020002005102e21040b2004450d0320012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a00000c010b0240200342808001540d0002402003428080808004540d0002404108200379a741037622056b4104490d0002400240200141046a280200200141086a2802002204460d00200128020021060c010b200441016a22072004490d06200441017422062007200620074b1b22074100480d060240024020040d002007102a21060c010b200128020020042007102e21060b2006450d0520012006360200200141046a2007360200200141086a28020021040b200141086a2207200441016a360200200620046a411320054102746b3a0000200220002903002203370308200541786a2104200141046a2106034002400240200628020020072802002200460d00200128020021050c010b200041016a22052000490d07200041017422082005200820054b1b22084100480d070240024020000d002008102a21050c010b200128020020002008102e21050b2005450d062001200536020020062008360200200728020021000b2007200041016a360200200520006a2003a73a000020034208882103200441016a22002004492105200021042005450d000b200220033703082003500d03200241286a41146a4109360200200241346a410e360200200241106a41146a41033602002002200241086a360240200241d0e1c10036024420024203370214200241ec9fc6003602102002410e36022c200242043703582002420137024c200241d8e1c1003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a4184c5c5001041000b4196e1c100413641acfec5001036000b02400240200141046a2802002204200141086a28020022006b4104490d00200128020021040c010b200041046a22052000490d04200441017422002005200020054b1b22004100480d040240024020040d002000102a21040c010b200128020020042000102e21040b2004450d0320012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a74102744102723600000c010b02400240200141046a2802002204200141086a28020022006b4102490d00200128020021040c010b200041026a22052000490d03200441017422002005200020054b1b22004100480d030240024020040d002000102a21040c010b200128020020042000102e21040b2004450d0220012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b00000b200241e0006a24000f0b1033000b1035000bbf0202027f017e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d01200441012001104221000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b20034180011047000b20034180011047000b810605027f027e017f027e027f230041a0016b220224002000280200210002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0220054290ce005441002004501b450d012005a72103412721000c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d022001410141b087c0004102200241206a20006a41800120006b104521000c060b41272100200241186a21060340200241106a200520044290ce00420010e1052002200229031022072006290300220842f0b17f427f10e005200241206a20006a2203417c6a200520022903007ca7220941ffff037141e4006e220a41017441c284c0006a2f00003b00002003417e6a200a419c7f6c20096a41ffff037141017441c284c0006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000c040b0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d012001410141b087c0004102200241206a20006a41800120006b104521000c040b20004180011047000b20004180011047000b2007a721030b02400240200341e3004a0d00200321090c010b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441c284c0006a2f00003b00000b024002402009410a480d00200241206a2000417e6a22006a200941017441c284c0006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141dc9ec6004100200241206a20006a412720006b104521000b200241a0016a240020000b130020004105360204200041b0e2c1003602000b3400200041e9eac10036020420004100360200200041146a4101360200200041106a41fceac100360200200041086a42133702000b8d0301027f230041e0006b22032400200341003a0005024002402000413f4b0d0041012104200341013a0005200320004102743a00000c010b02400240200041808001490d0020004180808080044f0d0141042104200341043a0005200320004102744102723602000c020b41022104200341023a0005200320004102744101723b01000c010b41052104200341053a0005200341033a0000200320003600010b024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d0120002003200210db051a200341e0006a24000f0b20022001103f000b200341286a41146a4109360200200341346a410c360200200341106a41146a410336020020034203370214200341ec9fc6003602102003410c36022c2003200341086a36024020032003410c6a360244200342043703582003420137024c200341c0a0c6003602482003200341286a3602202003200341c8006a3602382003200341c4006a3602302003200341c0006a360228200341106a41fca0c6001041000bb60201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001104221000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b20044180011047000b20044180011047000b130020004102360204200041ccb0c0003602000b130020004101360204200041f8eac5003602000b3400200041a4c6c50036020420004100360200200041146a4103360200200041106a41f087c200360200200041086a420a3702000b130020004101360204200041e486c2003602000b13002000410136020420004180dcc2003602000b130020004104360204200041f8b5c0003602000b130020004103360204200041b4f9c2003602000b130020004101360204200041a0dec5003602000b13002000411036020420004184b5c4003602000b130020004106360204200041f4ddc2003602000b13002000410536020420004184fcc0003602000b130020004106360204200041b8dbc1003602000b13002000410336020420004190d7c5003602000b130020004106360204200041a8bfc1003602000b130020004106360204200041c0e4c3003602000b130020004103360204200041e4a3c5003602000b13002000410336020420004190a6c5003602000b130020004101360204200041d8dbc5003602000b130020004105360204200041b8ddc3003602000bca2504027f027e087f037e230041b00d6b22072400024002400240024002400240024002402001280230200128024022082802b801460d002004420020042903082209200841c0006a2903007d220a200a20095622081b37030820080d02200741186a41186a200141e8006a290000370300200741186a41106a200141e0006a290000370300200741186a41086a200141d8006a29000037030020072001290050370318200741b0026a41186a220b2006280208220cad4220862006350200841006220841186a290000370300200741b0026a41106a220d200841106a290000370300200741b0026a41086a220e200841086a290000370300200720082900003703b0022008102c200741d00a6a41186a200b290300370300200741d00a6a41106a200d290300370300200741d00a6a41086a200e290300370300200720072903b0023703d00a4120102a22080d010c070b200041cf8bc20036020420004101360200200041086a41293602002000410c6a2006290200370200200041146a200641086a2802003602000c050b20082005290000370000200841186a200541186a290000370000200841106a200541106a290000370000200841086a200541086a2900003700002008412041c000102e2208450d05200820072903d00a370020200841386a200741d00a6a41186a290300370000200841306a200741d00a6a41106a290300370000200841286a200741d00a6a41086a290300370000200841c000418001102e2208450d0520082007290318370040200841d8006a200741186a41186a290300370000200841d0006a200741186a41106a290300370000200841c8006a200741186a41086a290300370000200741b0026a41186a220d2008ad4280808080800c841006220b41186a290000370300200741b0026a41106a220e200b41106a290000370300200741b0026a41086a220f200b41086a2900003703002007200b2900003703b002200b102c200741386a41186a220b200d290300370300200741386a41106a220d200e290300370300200741386a41086a220e200f290300370300200720072903b0023703382008102c20062902002109200741d8006a41d8006a200e290300370300200741b8016a200d290300370300200741c0016a200b29030037030020074194016a410036020020074184016a41f88bc200360200200741f8006a4200370300200741f4006a221041d0e1c10036020020072001360260200741d8006a41286a200141186a2211360200200720072903383703a8012007420837028c012007410036027020074100360264200720012802483602a00120072001290340370398012007200128023041016a360288012001290300210a2007200128024c3602a4012007200a370358200741c8016a41186a200541186a290000370300200741c8016a41106a200541106a290000370300200741c8016a41086a200541086a29000037030020074101360270200720052900003703c8012011200741386a10fd01210620072007280270417f6a2208360270024002400240024020060d0020080d012007417f36027020074190026a41186a200741386a41186a29030037030020074190026a41106a200741386a41106a29030037030020074190026a41086a200741386a41086a2903003703002007200729033837039002024002402007280274220e41d0e1c100460d002007280278210f0c010b4100210f200741d00a6a410041e00210da051a200741b0026a410041a00810da051a41880b102a220e450d0a200e41003b0106200e4100360200200e41086a200741d00a6a41e00210db051a200e41e8026a200741b0026a41a00810db051a200741003602782007200e3602740b024002400340200e41086a2108200e2f0106221241057421064100210b0240024003402006450d0120074190026a2008412010dd05220d450d02200641606a2106200b41016a210b200841206a2108200d417f4a0d000b200b417f6a21120b200f450d02200f417f6a210f200e20124102746a41880b6a280200210e0c010b0b200e200b41e0006c6a41e8026a21060c010b200741f0016a41186a20074190026a41186a290300220a370300200741f0016a41106a20074190026a41106a2903002213370300200741f0016a41086a20074190026a41086a2903002214370300200720072903900222153703f001200741ec0a6a2014370200200741d00a6a41246a2013370200200741fc0a6a200a3702002007200741d8006a41246a3602e00a200720123602dc0a200720103602d80a2007200e3602d40a200741003602d00a200720153702e40a200741e4026a4200370200200741003a00ec02200742003703b002200741003a008d03200741d0e1c1003602e002200742003703c802200741d00a6a200741b0026a10800221060b200741e0016a290300210a20064201370318200641013a003c200641286a427f370300200641206a427f3703002006413d6a20072903c801370000200641c5006a200741d0016a290300370000200641cd006a200741d8016a290300370000200641d5006a200a3700002007200728027041016a360270200741106a20044101200741186a200741386a20022003200741d8006a10de022007280210220e0d02200741b0026a200520072802a00128020010df02024020072802b0024101470d002009422088a72106200741b8026a280200210520072802b402210e2009a721010c080b20074190026a41186a200741b0026a410472220641186a2802002208360200200741d00a6a41106a200641086a290200370300200741d00a6a41186a200641106a290200370300200741f00a6a2008360200200741063602d40a200741b3cbc5003602d00a200720062902003703d80a200728029c0121062007200741d8006a3602c8022007290358210a20072802a4012108200741d8026a200741186a41086a290300370300200741e0026a200741186a41106a290300370300200741e8026a200741186a41186a290300370300200720033703b802200720023703b002200720083602cc022007200a3703c002200720072903183703d0022007200c3602f801200720093703f00120074190026a2006200741d00a6a200741b0026a200741f0016a200410e0022007419c026a290200210220074190026a41086a2802002112200728029402210f02402007280290024101470d002002422088a72106200741a4026a280200210c2002a7210120122105200f210e0c070b200728027041016a220c41004c0d032007200c360270200728027821040240024003402010280200220541086a210820052f0106220e41057421064100210b0240024003402006450d01200741386a2008412010dd05220d450d02200641606a2106200b41016a210b200841206a2108200d417f4a0d000b200b417f6a210e0b2004450d022004417f6a21042005200e4102746a41880b6a21100c010b0b2005200b41e0006c6a220641c5036a310000200641e8026a290300220320035022081ba7450d004200200641f8026a29030020081b21034200200641f0026a29030020081b21090c010b2007200728028001200741386a20072802840128021c110400200741086a2903002103200729030021092007280270210c0b2007200c417f6a3602702009200728029801220629037854200320064180016a29030022095420032009511b450d052002a7210c419c8cc200210e411e2105200f2101201221060c060b2009422088a721062009a7210141d3fbc000210e412a21050c060b41f089c6004110200741b0026a41f882c100103b000b200728021421052009422088a721062009a721010c040b41c689c6004118200741b0026a418883c100103b000b200041ba8cc20036020420004101360200200041086a412a3602002000410c6a2006290200370200200041146a200641086a2802003602000c030b20074190026a41086a2208200741186a41086a29030037030020074190026a41106a220b200741186a41106a29030037030020074190026a41186a220d200741186a41186a290300370300200741f0016a41086a2205200741386a41086a290300370300200741f0016a41106a2204200741386a41106a290300370300200741f0016a41186a220e200741386a41186a2903003703002007200729031837039002200720072903383703f001024002402007280294012206200728029001470d00200641016a220c2006490d0120064101742210200c2010200c4b1b220cad42b8017e2203422088a70d012003a722104100480d010240024020060d002010102a21060c010b200728028c01200641b8016c2010102e21060b2006450d052007200c360290012007200636028c0120072802940121060b200728028c01200641b8016c6a220641003a0000200620072f00ed013b0001200641013a00102006410036000c200642013700042006200729039002370011200620072903f001370031200641036a200741ef016a2d00003a0000200641196a2008290300370000200641216a200b290300370000200641296a200d290300370000200641396a2005290300370000200641c1006a2004290300370000200641c9006a200e290300370000200641e0006a200741d7016a290000370000200641d9006a200741c8016a41086a290000370000200620072900c801370051200641e8006a200741b0026a41d00010db051a200720072802940141016a2208360294010240200741d00a6a41186a280200450d00200741e40a6a280200102c20072802940121080b200728029001210e200728028c012105200728027c210c2007280278210d2007280274210602402007280264220b450d00200741e8006a280200450d00200b102c0b0240024020024280808080f01f8350450d002007200c3602b8022007200d3602b402200720063602b0022011200741b0026a10ff012007200e3602b402200720053602b00220072005200841b8016c22086a22043602bc0202400240200141386a280200220b2001413c6a28020022066b200841b8016d220d490d002001280234210b0c010b2006200d6a220e2006490d03200b4101742206200e2006200e4b1b2206ad42b8017e2203422088a70d032003a7220e4100480d0302400240200b0d00200e102a210b0c010b2001280234200b41b8016c200e102e210b0b200b450d072001200b360234200141386a20063602002001413c6a28020021060b200b200641b8016c6a2005200810db051a2001413c6a22062006280200200d6a360200200720043602b802200741b0026a10720c010b02402008450d00200841b8016c210441002108034002400240200520086a220b2d0000220141014b0d000240024020010e020001000b0240200b41086a280200450d00200b41046a280200102c0b200b41106a2d00004105490d02200b41386a280200450d02200b41346a280200102c0c020b200b41286a10730c010b200b41e8006a280200450d00200b41e4006a280200102c0b2004200841b8016a2208470d000b0b0240200e450d002005102c0b02400240200d0d00200621080c010b200d210b20062108034020082802880b2108200b417f6a220b0d000b0340200620062f01064102746a41880b6a2802002106200d417f6a220d0d000b0b200741cc026a20062f0106360200200741c8026a4100360200200741c4026a20063602002007200c3602d002200741003602c002200742003703b802200720083602b402200741003602b002200741b0026a10f9010b20002007290338370004200041003602002000412c6a2002370200200041286a2012360200200041246a200f3602002000411c6a200741d0006a290300370000200041146a200741c8006a2903003700002000410c6a200741c0006a2903003700000c030b1035000b200741e80a6a280200450d00200741e40a6a280200102c0b024020072802642208450d00200741e8006a280200450d002008102c0b2006ad2102200728027c21042007280274210602400240200728027822080d002006210b0c010b2008210d2006210b0340200b2802880b210b200d417f6a220d0d000b0340200620062f01064102746a41880b6a28020021062008417f6a22080d000b0b200242208621022001ad2103200741cc026a20062f010636020041002108200741c8026a4100360200200741c4026a2006360200200720043602d002200741003602c002200742003703b8022007200b3602b402200741003602b002200741b0026a10f90102402007280294012206450d00200728028c01210d200641b8016c2101034002400240200d20086a22062d0000220b41014b0d0002400240200b0e020001000b0240200641086a280200450d00200641046a280200102c0b200641106a2d00004105490d02200641386a280200450d02200641346a280200102c0c020b200641286a10730c010b200641e8006a280200450d00200641e4006a280200102c0b2001200841b8016a2208470d000b0b200220038421020240200728029001450d00200728028c01102c0b2000200e36020420004101360200200041146a200c3602002000410c6a2002370200200041086a20053602000b200741b00d6a24000f0b1033000bbc0d020b7f067e230041e0016b22082400024002400240024002400240200728021841016a220941004c0d00200741186a210a20072009360218200741206a280200210b2007411c6a220c210d024002400340200d280200220e41086a210f200e2f01062210410574210d41002111024002400340200d450d012004200f412010dd052212450d02200d41606a210d201141016a2111200f41206a210f2012417f4a0d000b2011417f6a21100b200b450d02200b417f6a210b200e20104102746a41880b6a210d0c010b0b200e201141e0006c6a220d41c5036a310000200d41e8026a2903002213201350220f1ba7450d004200200d41f8026a290300200f1b21144200200d41f0026a290300200f1b21150c010b200841306a200741286a28020020042007412c6a28020028021c110400200841386a290300211420072802182109200829033021150b20072009417f6a360218200141186a29030021132007280240210d20012903102116024002400240024041004101410220152014842217501b20021b0e03010200010b200d41a8016a210d0c020b200d4188016a210d0c010b200d4198016a210d0b20162013844200510d01200841206a200d290300200d41086a2903002016201310e10520014200200129030822132008290320427f200841206a41086a290300501b7d22162016201356220d1b3703080240200d450d0041e48cc200210d4122210f0c060b200a28020041016a220141004c0d02200720013602182007280220210b024002400340200c280200220e41086a210f200e2f01062210410574210d41002111024002400340200d450d012003200f412010dd052212450d02200d41606a210d201141016a2111200f41206a210f2012417f4a0d000b2011417f6a21100b200b450d02200b417f6a210b200e20104102746a41880b6a210c0c010b0b200e201141e0006c6a220d41c5036a310000200d41e8026a2903002213201350220f1ba7450d004200200d41f8026a290300200f1b21134200200d41f0026a290300200f1b21160c010b200841106a200741286a28020020032007412c6a28020028021c110400200841186a290300211320072802182101200829031021160b200a2001417f6a3602000240201620057d2218201656201320067d2016200554ad7d221620135620162013511b4101470d0041868dc200210d411d210f0c060b024020174200520d002007280240220d290378200556200d4180016a290300221320065620132006511b450d0041a38dc200210d411f210f0c060b200841086a200341022018201610ad0102402008280208220d450d00200828020c210f0c060b0240201520057c2217201554220d201420067c200dad7c221320145420132014511b450d0041c28dc200210d412d210f0c060b4100210d024020032004470d000c060b024020032004412010dd050d000c060b200a200320182016109602200a200420172013109602200841b8016a41086a2211200341086a290000370300200841b8016a41106a2212200341106a290000370300200841b8016a41186a220e200341186a29000037030020084198016a41086a220b200441086a29000037030020084198016a41106a2210200441106a29000037030020084198016a41186a2201200441186a290000370300200820032900003703b801200820042900003703980102402007413c6a280200220f200741386a280200470d00200f41016a220d200f490d05200f4101742204200d2004200d4b1b2204ad42b8017e2213422088a70d052013a7220d4100480d0502400240200f0d00200d102a210d0c010b2007280234200f41b8016c200d102e210d0b200d450d042007200d360234200741386a2004360200200728023c210f0b4100210d2007280234200f41b8016c6a220f41003a0000200f20082f00dd013b0001200f4200370008200f4101360004200f20082903b801370011200f200829039801370031200f41036a200841df016a2d00003a0000200f41106a41003a0000200f41196a2011290300370000200f41216a2012290300370000200f41296a200e290300370000200f41396a200b290300370000200f41c1006a2010290300370000200f41c9006a2001290300370000200f2005370358200f41e0006a2006370300200f41d4006a20084191016a41036a280000360000200f200828009101360051200f41e8006a200841c0006a41d00010db051a2007200728023c41016a36023c0c050b41c689c6004118200841c0006a418883c100103b000b41b0c5c100411941d890c2001036000b41c689c6004118200841c0006a418883c100103b000b1033000b1035000b2000200f3602042000200d360200200841e0016a24000b811402097f017e230041d0016b2203240020034198016a41086a220441e4d2c500ad42808080808001841002220541086a29000037030020032005290000370398012005102c20034188016a41086a220620042903003703002003200329039801370388012004419ee4c300ad4280808080b001841002220541086a29000037030020032005290000370398012005102c200341d8006a41086a22072004290300370300200320032903980137035820034198016a2001109f01024002400240024041c000102a2205450d002005200329038801370000200520032903583700102005200329009801370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341a8016a290000370000200541386a20034198016a41186a290000370000200341c0003602bc01200320053602b801200341186a2005ad42808080808008841003108d0102400240200328021822070d00410221040c010b200328021c21082003200341206a2802003602c401200320073602c001200341106a200341c0016a10750240024020032802100d0020032802142106200341086a200341c0016a107520032802080d00200328020c21092003200341c0016a107520032802000d0020032802c4012204450d002003280204210a20032004417f6a3602c401200320032802c001220441016a3602c00120042d0000220b41014b0d004100210402400240200b0e020100010b410121040b20034198016a200341c0016a1077200328029801450d00200341d8006a41086a20034198016a41086a280200220b360200200341f8006a41086a200b360200200341f4006a41026a20034188016a41026a2d00003a0000200320032f008801220b3b01cc0120032003290398013703782003200b3b01740c010b20034100360260200342013703582003410b36028c012003200341b8016a360288012003200341d8006a3602cc01200341ac016a41013602002003420137029c01200341d0b0c20036029801200320034188016a3602a801200341cc016a41c49ac50020034198016a10391a200335026042208620033502588410040240200328025c450d002003280258102c0b410221040b2008450d002007102c0b20034198016a41086a2207200341f8006a41086a280200360200200341d8006a41026a200341f4006a41026a2d00003a00002003200329037837039801200320032f01743b015802400240024020044102460d00200341c8006a41086a22082007280200360200200341c4006a41026a2207200341d8006a41026a2d00003a00002003200329039801370348200320032f01583b01442005102c200341386a41086a20082802002205360200200341346a41026a20072d000022073a0000200341186a41146a2005360200200341336a20073a000020032003290348220c3703382003200a3602202003200936021c200320043a00302003200c370224200320032f01443b003120032006360218200228025820064d0d0220034198016a41086a220441e4d2c500ad42808080808001841002220541086a29000037030020032005290000370398012005102c20034188016a41086a2206200429030037030020032003290398013703880120044192e4c300ad4280808080c001841002220541086a29000037030020032005290000370398012005102c200341d8006a41086a22072004290300370300200320032903980137035820034198016a2001109f0141c000102a2205450d032005200329038801370000200520032903583700102005200329009801370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200341a8016a290000370000200541386a20034198016a41186a29000037000020034198016a200541c00010bd03200329029c01210c20032802980121042005102c20040d01200041a1e8c20036020420004101360200200041086a411a3602000c050b2005102c200041086a411136020020004190e8c200360204200041013602000c050b20034198016a2004200c422088a7200210ff03200ca7210702402003280298014101470d002000200329029c01370204200041013602002007450d042004102c0c040b200341d8006a41186a220220034198016a410472220541186a280200360200200341d8006a41106a2209200541106a290200370300200341d8006a41086a2206200541086a290200370300200320052902003703580240200341186a41106a2205280200450d002003280224102c0b200341186a41186a200228020036020020052009290300370300200341186a41086a20062903003703002003200329035837031820034198016a41086a220541e4d2c500ad42808080808001841002220241086a29000037030020032002290000370398012002102c20034188016a41086a20052903003703002003200329039801370388012005419ee4c300ad4280808080b001841002220241086a29000037030020032002290000370398012002102c20062005290300370300200320032903980137035820034198016a2001109f0141c000102a2205450d012005200329038801370000200520032903583700102005200329009801370020200541086a20034188016a41086a290300370000200541186a200341d8006a41086a290300370000200541286a20034198016a41086a290000370000200541306a200341a8016a290000370000200541386a20034198016a41186a290000370000200341003602a0012003420137039801200341186a20034198016a108901200341186a41047220034198016a108901200341186a41086a20034198016a10890120032d0030210202400240200328029c0120032802a0012201460d0020032802980121060c010b200141016a22062001490d03200141017422092006200920064b1b22094100480d030240024020010d002009102a21060c010b20032802980120012009102e21060b2006450d022003200936029c0120032006360298010b2003200141016a3602a001200620016a20023a00002003280224210a2003412c6a280200220620034198016a106702400240200328029c01220920032802a00122026b2006490d0020032802980121010c010b200220066a22012002490d03200941017422082001200820014b1b22084100480d030240024020090d002008102a21010c010b20032802980120092008102e21010b2001450d022003200836029c012003200136029801200821090b200120026a200a200610db051a2005ad4280808080800884200220066aad4220862001ad84100102402009450d002001102c0b2005102c2007450d002004102c0b20002003290318370204200041003602002000411c6a200341306a280200360200200041146a200341286a2903003702002000410c6a200341206a2903003702000c030b1033000b1035000b200341286a280200450d002003280224102c0b200341d0016a24000bc71c04087f027e017f017e230041e0006b220624000240024002402002410c6a280200200241106a28020010102207417f460d00410c102a22080d010c020b109103000b200820073602082008428180808010370200200641186a420037030020064280808080c00037031020064204370308024002400240024002402008280200220741016a220941014d0d00200820093602002007417e460d002008200741026a3602000240200628021c22072006280218470d00200741016a22092007490d022007410174220a2009200a20094b1b220941ffffffff03712009470d022009410274220a4100480d020240024020070d00200a102a210a0c010b20062802142007410274200a102e210a0b200a450d06200620093602182006200a3602140b200628021420074102746a20083602002006200628021c41016a36021c2008280208210b4103102a2209450d05200941026a41002d009a86463a0000200941002f009886463b00004106102a220a450d05200a41046a41002f00d9b8453b0000200a41002800d5b845360000024020062802102207200628020c470d00200741016a220c2007490d022007410174220d200c200d200c4b1b220c41ffffff3f71200c470d02200c410574220d4100480d020240024020070d00200d102a210d0c010b20062802082007410574200d102e210d0b200d450d062006200c36020c2006200d3602080b200628020820074105746a220741013602182007200a36020c2007428380808030370204200720093602002007411c6a200b360200200741106a4286808080e0003702002006200628021041016a36021020082008280200417f6a2207360200024020070d002008280208101120082008280204417f6a220736020420070d002008102c0b200641086a419886c6004103419b86c6004103410f109303200641086a419886c60041034191d3c500410f4110109303200641086a419886c600410341a0d3c500410f4111109303200641086a419886c600410341afd3c50041084112109303200641086a419886c600410341b7d3c500410f4113109303200641086a419886c600410341c6d3c500410a4114109303200641086a419886c600410341d0d3c500410a4115109303200641086a419886c600410341dad3c500410b4116109303200641086a419886c600410341e5d3c500410d4117109303200641086a419886c600410341f2d3c500410c4118109303200641086a419886c600410341fed3c500410b4119109303200641086a419886c60041034189d4c5004115411a109303200641086a419886c6004103419ed4c500410a411b109303200641086a419886c600410341a8d4c5004107411c109303200641086a419886c600410341afd4c5004113411d109303200641086a419886c600410341c2d4c5004111411e109303200641086a419886c600410341d3d4c500410e411f109303200641086a419886c600410341e1d4c50041104120109303200641086a419886c600410341f1d4c50041104121109303200641086a419886c60041034181d5c50041114122109303200641086a419886c60041034192d5c50041114123109303200641086a419886c600410341a3d5c50041164124109303200641086a419886c600410341b9d5c50041124125109303200641086a419886c600410341cbd5c500410b4126109303200641086a419886c600410341d6d5c50041104127109303200641086a419886c600410341e6d5c50041174128109303200641206a410c6a200441086a280200360200200620033602204100210b2006410036023c20062005360238200620083602342006200429020037022420062001280200360230200241146a350200210e2002411c6a350200210f200628020821072006280210210820064100360258200642013703502008200641d0006a106702402008450d00200720084105746a2105034020072802002104200741086a2802002208200641d0006a1067024002402006280254220a200628025822096b2008490d002006280250210a0c010b200920086a22012009490d04200a41017422032001200320014b1b22014100480d0402400240200a0d002001102a210a0c010b2006280250200a2001102e210a0b200a450d08200620013602542006200a3602500b2006200920086a360258200a20096a2004200810db051a2007410c6a2802002103200741146a280200220a200641d0006a10670240024020062802542209200628025822046b200a490d00200628025021080c010b2004200a6a22082004490d04200941017422012008200120084b1b22014100480d040240024020090d002001102a21080c010b200628025020092001102e21080b2008450d082006200136025420062008360250200121090b20062004200a6a2201360258200820046a2003200a10db051a02400240200741186a2802004101460d000240024020092001460d002009210a0c010b200941016a220a2009490d0620094101742204200a2004200a4b1b220a4100480d060240024020090d00200a102a21080c010b20082009200a102e21080b2008450d0a2006200a360254200620083602500b2006200141016a2209360258200820016a41013a000020062007411c6a2802002204360248200641c8006a21010c010b0240024020092001460d002009210a0c010b200941016a220a2009490d0520094101742204200a2004200a4b1b220a4100480d050240024020090d00200a102a21080c010b20082009200a102e21080b2008450d092006200a360254200620083602500b2006200141016a2209360258200820016a41023a000020062007411c6a2802002204360248200641c8006a21010b0240200a20096b41034b0d00200941046a22042009490d04200a41017422032004200320044b1b22044100480d0402400240200a0d002004102a21080c010b2008200a2004102e21080b2008450d082006200436025420062008360250200128020021040b2006200941046a360258200820096a2004360000200741206a22072005470d000b0b2006280254210302404129200f422086200e8420063502584220862006280250220dad84200641206a1012220c41036a220841024b0d000240024020080e03000201000b4102210b0b41012104024020030d000c060b200d102c0c050b200628021c220541ffffffff03712005470d0220054102742207417f4c0d02200628021421080240024020070d00410421100c010b2007102a2210450d060b0240024020050d004100210a0c010b200541027421044100210a2010210703402008280200220928020041016a220141014d0d02200841046a21082009200136020020072009360200200a41016a210a200741046a21072004417c6a22040d000b0b02402003450d00200d102c0b2002350204210e2002350200210f20064100360258200642013703504100200641d0006a1067200635025821112006280254210920062802502107410a10302208450d050240024002400240200c200e422086200f8420114220862007ad842008410a200641206a101341036a220241034b0d004101210420020e0402000001020b41ac91c600412841acfec5001036000b2006410936024c410121042006200841016a36024820082d0000220241014b0d01410421010240024020020e020100010b200641d0006a200641c8006a10ae03200628025022014104460d02200628025421030b410021040b2008102c2009450d042007102c0c040b2008102c024020090d000c040b2007102c0c030b00000b1035000b103a000b200c10140240200a450d00200a4102742107201021080340200828020022092009280200417f6a3602000240200828020022092802000d0020092802081011200828020022092009280204417f6a360204200828020022092802040d002009102c0b200841046a21082007417c6a22070d000b0b4102210b2005450d002010102c0b200641206a41086a28020021072006280234210820062802242109024002400240024002400240024002400240200628023c220a0d002006412c6a290200210e20040d04200141044b0d0320010e050203030301020b2000200a36020420004100360200200041106a41003a0000200041086a200641c0006a29030037020002402007450d002009102c0b20082008280200417f6a220736020020070d072008280208101120082008280204417f6a22073602042007450d060c070b2000200936020441002109200041106a41003a00002000410c6a4100360200200041086a20073602000c040b20002009360204200041106a20033a00002000410c6a200e3e0200200041086a2007360200410021090c030b200041cfbcc500360204200041146a200e3e0200200041106a20073602002000410c6a2009360200200041086a41113602000c010b0240200b450d00200041f0bcc500360204200041146a200e3e0200200041106a20073602002000410c6a2009360200200041086a41103602000c010b200041e0bcc500360204200041146a200e3e0200200041106a20073602002000410c6a2009360200200041086a41103602000b410121090b2000200936020020082008280200417f6a220736020020070d012008280208101120082008280204417f6a220736020420070d010b2008102c0b024020062802102207450d00200628020821082007410574210703400240200841046a280200450d002008280200102c0b0240200841106a280200450d002008410c6a280200102c0b200841206a2108200741606a22070d000b0b0240200628020c450d002006280208102c0b0240200628021c2207450d0020062802142108200741027421070340200828020022092009280200417f6a3602000240200828020022092802000d0020092802081011200828020022092009280204417f6a360204200828020022092802040d002009102c0b200841046a21082007417c6a22070d000b0b02402006280218450d002006280214102c0b200641e0006a24000f0b1033000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a28020022040d00200321000c010b2004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000b0b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a10f901200141306a24000b8d2a020c7f037e230022072108200741800f6b41607122072400200720043703382007200337033020072005360244024002400240024002402001280230200128024022092802b801460d002005420020052903082203200941386a2903007d2204200420035622091b37030820090d0120074180046a20024100410110e302200741a4046a280200210a200741a0046a280200210b20072d008804220541037122094103460d0220090e03030203030b200041ef8dc20036020420004101360200200041086a41293602002000410c6a2006290200370200200041146a200641086a2802003602000c030b200041988ec20036020420004101360200200041086a41233602002000410c6a2006290200370200200041146a200641086a280200360200200824000f0b200041bb8ec20036020420004101360200200041086a41193602002000410c6a2006290200370200200041146a200641086a28020036020020050d01200a450d01200b102c200824000f0b200741a8046a2802002109200741c8006a41186a220c200141e8006a290000370300200741c8006a41106a220d200141e0006a290000370300200741c8006a41086a220e200141d8006a290000370300200720012900503703484100210f41002110024002400240024002400240024002400240024002400240024020050d002009417f4c0d010240024020090d002007420037038004410121100c010b2009102a2210450d0a200741003602840420072009360280040b20072009360284042010200b200910db051a2007290380042103200a450d00200b102c0b200741a4016a410036020020074194016a41f88bc200360200200741e8006a41206a420037030020074184016a41d0e1c100360200200741e8006a41106a2003370300200741e8006a41d8006a200241086a290000370300200741e8006a41e0006a200241106a290000370300200741e8006a41e8006a200241186a29000037030020072001360270200741e8006a41286a200141186a22113602002007420837029c01200741003602800120072010360274200720022900003703b801200720012802483602b001200720012903403703a8012007200128023041016a36029801200129030021032007200128024c3602b40120072003370368200741d8016a41206a200e290300370300200741d8016a41286a200d29030037030020074188026a200c290300370300200741ec016a200641086a280200360200200720023602e001200720072903483703f001200720062902003702e4012007200741c4006a3602dc012007200741306a3602d8010240024020072903302203200741306a41086a290300220484500d00200741286a20072802444100200741f0016a200220032004200741e8006a10de02200728022822060d01200728028001210f20072802e00121020b200f41016a220d41004c0d02200741d8016a41186a210e200741e4016a210f2007200d36028001200741e8006a41206a280200210a20074184016a2212210602400240024003402006280200220b41086a2105200b2f0106220c4105742106410021090240024003402006450d0120022005412010dd052210450d02200641606a2106200941016a2109200541206a21052010417f4a0d000b2009417f6a210c0b200a450d02200a417f6a210a200b200c4102746a41880b6a21060c010b0b200b200941e0006c6a220541e8026a210602400240200541c5036a2d00000d0020074180046a41086a2209200641c5006a29000037030020074180046a41106a2210200641cd006a29000037030020074180046a41186a220b200641d5006a29000037030020072006413d6a290000370380044102210520062d003c4101470d01200741a00c6a41186a200b290300370300200741a00c6a41106a2010290300370300200741a00c6a41086a200929030037030020072007290380043703a00c410121050c010b200741a80c6a200641c5006a290000370300200741b00c6a200641cd006a290000370300200741b80c6a200641d5006a29000037030020072006413d6a2900003703a00c20062d003c21050b200541ff01714102470d010b20074190026a2007280290012002200728029401280210110400200728028001210d20072d00900221050c010b20074199026a200741a80c6a290300370000200741a1026a200741b00c6a290300370000200741a9026a200741b80c6a290300370000200720053a009002200720072903a00c370091020b2007200d417f6a360280014101210a0240200541ff01714101470d00200741b8026a41186a200741a9026a290000370300200741b8026a41106a200741a1026a290000370300200741b8026a41086a20074199026a29000037030020072007290091023703b80220074180046a200741b8026a20072802b00128020010df0202402007280280044101470d0020072902e4012203422088a7210520074180046a41086a28020021092007280284042106200741ec016a28020021102003a721020c0e0b200741a00c6a41186a220520074180046a410472220641186a2802002209360200200741d8026a41106a200641086a290200370300200741d8026a41186a200641106a290200370300200741f8026a2009360200200741043602dc02200741afcbc5003602d802200720062902003703e00220072802ac0121062005200e41186a2900002203370300200741a00c6a41106a200e41106a2900002204370300200741a00c6a41086a2205200e41086a2900002213370300200741a8046a2013370300200741b0046a2004370300200741b8046a20033703002007200e29000022033703a00c200720033703a00420072802d801220941086a29030021032007200741e8006a36029804200929030021042007290368211320072802b4012109200720033703880420072004370380042007200936029c0420072013370390042005200f41086a2802003602002007200f2902003703a00c200741e0036a2006200741d8026a20074180046a200741a00c6a20072802dc0128020010e002200741ec036a2902002103200741e0036a41086a280200210c20072802e403210a024020072802e0034101470d002003422088a72105200741f4036a28020021102003a72102200c2109200a21060c0d0b20072802800141016a220f41004c0d0420072802e00121022007200f36028001200728028801210d201221060240024003402006280200220b41086a2105200b2f0106220e4105742106410021090240024003402006450d0120022005412010dd052210450d02200641606a2106200941016a2109200541206a21052010417f4a0d000b2009417f6a210e0b200d450d02200d417f6a210d200b200e4102746a41880b6a21060c010b0b200b200941e0006c6a220641c5036a310000200641e8026a290300220420045022051ba7450d004200200641f8026a29030020051b21044200200641f0026a29030020051b21130c010b200741186a200728029001200220072802940128021c110400200741206a290300210420072903182113200728028001210f0b2007200f417f6a221036028001201320072802a801220629037854200420064180016a29030022135420042013511b0d050c060b4100210c420021030240200741e8016a280200450d0020072802e401102c0b420021040c060b200728022c210920072902e4012203422088a721052003a72102200741ec016a28020021100c0b0b103a000b41c689c600411820074180046a418883c100103b000b41c689c600411820074180046a418883c100103b000b20072802702206450d020240024020072802e0012205200641d0006a2209460d0020092005412010dd05450d00034020062802082206450d022005200641d0006a2209460d0120092005412010dd050d000b0b2003a7211041d48ec200210641372109200c2105200a21020c070b20100d032007417f36028001200741003a00bc03200742003702b403200741013a009d03200741d0e1c1003602b003200741e0036a41186a200541186a290000370300200741e0036a41106a200541106a290000370300200741e0036a41086a200541086a290000370300200720052900003703e00302400240200728028401221041d0e1c100460d00200728028801210b0c010b200741a00c6a410041e00210da051a20074180046a410041a00810da051a41880b102a2210450d054100210b201041003b010620104100360200201041086a200741a00c6a41e00210db051a201041e8026a20074180046a41a00810db051a200741003602880120072010360284010b02400240034020102f0106220d4105742102410021064100210502400240034020022006460d01200741e0036a201020066a41086a412010dd052209450d02200641206a2106200541016a21052009417f4a0d000b2005417f6a210d0b200b450d02200b417f6a210b2010200d4102746a41880b6a28020021100c010b0b2010200541e0006c6a22064190036a20072903a80337030020064188036a20072903a003370300200641c0036a200729039803370000200641b8036a200729039003370000200641b0036a200729038803370000200641a8036a20072903800337000020064180036a4200370300200641e8026a2205290300211320054200370300200641a0036a22052802002102200520072903b80337030020064198036a22062903002104200620072903b0033703002004a721062004422088a721050c010b200741c0036a41186a200741e0036a41186a2903002204370300200741c0036a41106a200741e0036a41106a2903002213370300200741c0036a41086a200741e0036a41086a2903002214370300200720072903e00322153703c003200741bc0c6a2014370200200741a00c6a41246a2013370200200741cc0c6a20043702002007200741e8006a41246a3602b00c2007200d3602ac0c200720123602a80c200720103602a40c200741003602a00c200720153702b40c20074180046a41186a42003703002007420037038004200741b8046a20072903b803370300200741b0046a20072903b003370300200741a8046a20072903a803370300200741a0046a20072903a003370300200741d8046a200729039803370300200741d0046a200729039003370300200741c8046a200729038803370300200741c0046a200729038003370300200741a00c6a20074180046a1080021a420221130b024020134202510d000240024020050d00200621090c010b2005211020062109034020092802ec0321092010417f6a22100d000b0340200620062f01064102746a41ec036a28020021062005417f6a22050d000b0b2007419c046a20062f010636020020074198046a410036020020074194046a2006360200200720023602a004200741003602900420074200370388042007200936028404200741003602800420074180046a10f4010b200720072802800141016a360280010b0240200741f0026a280200450d00200741ec026a280200102c0b200342ffffffff0f83210420034280808080708321030b20072802a401210520072802a001210d200728029c01210b200728028c01210e20072802880121102007280284012106024020072802742209450d00200741f8006a280200450d002009102c0b200420038421040240024020034280808080f01f8350450d002007200e3602880420072010360284042007200636028004201120074180046a10ff012007200d360284042007200b360280042007200b200541b8016c22056a220236028c0402400240200141386a28020022092001413c6a28020022066b200541b8016d2210490d00200128023421090c010b200620106a220d2006490d0620094101742206200d2006200d4b1b2206ad42b8017e2203422088a70d062003a7220d4100480d060240024020090d00200d102a21090c010b2001280234200941b8016c200d102e21090b2009450d0520012009360234200141386a20063602002001413c6a28020021060b2009200641b8016c6a200b200510db051a2001413c6a2206200628020020106a360200200720023602880420074180046a10722000410c6a2004370200200041086a200c3602002000200a3602040c010b2000200a3602042000410c6a2004370200200041086a200c36020002402005450d00200541b8016c210141002105034002400240200b20056a22092d0000220241014b0d000240024020020e020001000b0240200941086a280200450d00200941046a280200102c0b200941106a2d00004105490d02200941386a280200450d02200941346a280200102c0c020b200941286a10730c010b200941e8006a280200450d00200941e4006a280200102c0b2001200541b8016a2205470d000b0b0240200d450d00200b102c0b0240024020100d00200621050c010b2010210920062105034020052802880b21052009417f6a22090d000b0340200620062f01064102746a41880b6a28020021062010417f6a22100d000b0b2007419c046a20062f010636020020074198046a410036020020074194046a20063602002007200e3602a004200741003602900420074200370388042007200536028404200741003602800420074180046a10f9010b20004100360200200824000f0b418b8fc20041321054000b41f089c600411020074180046a41f882c100103b000b1033000b1035000b200741f0026a280200450d00200741ec026a280200102c0b2000200636020420004101360200200041146a2010360200200041086a20093602002000410c6a2005ad4220862002ad84370200024020072802742206450d00200741f8006a280200450d002006102c0b200741e8006a411c6a2802002106200728028c0121000240024020072802880122050d00200621090c010b2005211020062109034020092802880b21092010417f6a22100d000b0340200620062f01064102746a41880b6a28020021062005417f6a22050d000b0b20074180046a411c6a20062f01063602004100210520074198046a410036020020074194046a2006360200200720003602a004200741003602900420074200370388042007200936028404200741003602800420074180046a10f901024020072802a4012206450d00200728029c012110200641b8016c2100034002400240201020056a22062d0000220941014b0d000240024020090e020001000b0240200641086a280200450d00200641046a280200102c0b200641106a2d00004105490d02200641386a280200450d02200641346a280200102c0c020b200641286a10730c010b200641e8006a280200450d00200641e4006a280200102c0b2000200541b8016a2205470d000b0b20072802a001450d00200728029c01102c200824000f0b200824000be71f07057f027e0c7f077e017f017e057f230041b0036b22042400200441a0016a200110ee010240024020042d00a0012205417f6a41ff017141024f0d00200041003a0000200041086a200441a0016a41d80010db051a0c010b200441f8016a41086a2206200441a0016a413c6a290200370300200441f8016a41106a2207200441a0016a41c4006a290200370300200441f8016a41186a2208200441a0016a41cc006a2902003703002004200441a0016a41346a2902003703f801200441a0016a41106a2903002109200441a0016a41086a290300210a200441a0016a41306a280200210b200441a0016a412c6a280200210c200441a0016a41246a280200210d200441a0016a41206a280200210e200441bc016a280200210f200441a0016a41186a2802002110200441a0016a41d4006a2802002111200441a0016a41286a280200211220044198026a41186a420037030020044198026a41106a2213420037030020044198026a41086a221442003703002004420037039802200441a0036a41086a22154191b0c200ad4280808080e000841002221641086a290000370300200420162900003703a0032016102c20142015290300370300200420042903a00337039802201541acb0c200ad4280808080e000841002221641086a290000370300200420162900003703a0032016102c201320042903a0032217370300200441f0026a41086a2014290300370300200441f0026a41106a2017370300200441f0026a41186a2015290300370300200420173703900320042004290398023703f00220044198016a200441f0026a4120109401024002400240024002400240024002400240024041004100200428029c0141002004280298011b221520026b2202200220154b1b220220126b2214201420024b1b2214450d0020044188016a200110b701200441f8006a200429038801221720044188016a41086a2903002218428080a8ec85afd1b101420010e1054200200dad22192004290378221a7d221b201b2019564200200441f8006a41086a2903002019201a54ad7c7d22194200522019501b22021b221a4200201920021b221984500d020240024002400240024002402017428080d287e2bc2d5441002018501b0d00200441e0006a2014ad4200201a201910e005200441d0006a2004290360200441e0006a41086a290300428080e983b1de16420010e005200441f0006a20014108420020172017428080aef89dc3527c2219200a200a201956200920182019201754ad7c427f7c22195620092019511b22021b221a2004290350221b201a201b542019200920021b221a200441d0006a41086a290300221954201a2019511b22021b221c7d221d201d2017562018201a201920021b221a7d2017201c54ad7d221720185620172018511b22141b4200201720141b10ad0120042802700d03024020020d002003450d030b20044198026a2001201c201a410810ac012004280298024101460d0a200441386a20044198026a41086a29030020044198026a41106a220629030010ce01200441386a41106a290300211a2004290340211720042903382218a7450d0120044198026a41186a220742003703002006420037030020044198026a41086a221642003703002004420037039802200441a0036a41086a2214418be9c500ad428080808080018422181002220841086a290000370300200420082900003703a0032008102c20162014290300370300200420042903a003221c370390032004201c37039802201441c9b5c000ad4280808080d00184221c1002220841086a290000370300200420082900003703a0032008102c20044190036a41086a221e2014290300221d370300200420042903a003221f370390032013201f370000201341086a2220201d370000200441f0026a41086a22212016290300370300200441f0026a41106a22222006290300370300200441f0026a41186a2223200729030037030020042004290398023703f002200441206a200441f0026a4120109e01200441206a41106a290300211d2004290328211f200428022021082007420037030020064200370300201642003703002004420037039802201420181002222441086a290000370300200420242900003703a0032024102c20162014290300370300200420042903a00322183703900320042018370398022014201c1002222441086a290000370300200420242900003703a0032024102c201e20142903002218370300200420042903a003221c370390032013201c3700002020201837000020212016290300370300202220062903003703002023200729030037030020042004290398023703f00220044200201d420020081b2218201a7d201f420020081b221a201754ad7d221c201a20177d2217201a56201c201856201c2018511b22141b3703a00220044200201720141b37039802200441f0026aad428080808080048420044198026aad428080808080028410010c020b200110f601200e41164d0d08200ead4220862010ad84200e41696aad422086201041176aad8441011007200041023a0008200041013a00000c030b2018500d0020044198026a41186a2206420037030020044198026a41106a2207420037030020044198026a41086a221642003703002004420037039802200441a0036a41086a2214418be9c500ad428080808080018422181002220841086a290000370300200420082900003703a0032008102c20162014290300370300200420042903a003221c370390032004201c37039802201441c9b5c000ad4280808080d00184221c1002220841086a290000370300200420082900003703a0032008102c20044190036a41086a221e2014290300221d370300200420042903a003221f370390032013201f370000201341086a2220201d370000200441f0026a41086a22212016290300370300200441f0026a41106a22222007290300370300200441f0026a41186a2223200629030037030020042004290398023703f002200441086a200441f0026a4120109e01200441086a41106a290300211d2004290310211f200428020821082006420037030020074200370300201642003703002004420037039802201420181002222441086a290000370300200420242900003703a0032024102c20162014290300370300200420042903a00322183703900320042018370398022014201c1002222441086a290000370300200420242900003703a0032024102c201e20142903002218370300200420042903a003221c370390032013201c3700002020201837000020212016290300370300202220072903003703002023200629030037030020042004290398023703f00220044200201d420020081b2218201a7d201f420020081b221a201754ad7d221c201a20177d2217201a56201c201856201c2018511b22141b3703a00220044200201720141b37039802200441f0026aad428080808080048420044198026aad428080808080028410010b20020d0020030d02200041003a0008200041023a0000200041186a2009370000200041106a200a370000200041386a200b360000200041346a200c360000200041306a20123600002000412c6a200d360000200041286a200e360000200041246a200f360000200041206a20103600002000413c6a20042903f801370000200041c4006a20044180026a290300370000200041cc006a200441f8016a41106a290300370000200041d4006a200441f8016a41186a290300370000200041dc006a2011360000200541037122004103460d0420000e030d04040d0b200ead4220862010ad842209100f2117200441003602a803200442013703a0032017a722032017422088a72212200441a0036a1086030240024020042802a403221620042802a80322146b4120490d00201441206a211520042802a00321020c010b201441206a22152014490d09201641017422022015200220154b1b220d4100480d090240024020160d00200d102a21020c010b20042802a0032016200d102e21020b2002450d082004200d3602a403200420023602a003200d21160b200420153602a803200220146a221420042903f801370000201441086a200441f8016a41086a290300370000201441106a200441f8016a41106a290300370000201441186a200441f8016a41186a29030037000020044198026a41186a22142015ad4220862002ad841006221541186a29000037030020044198026a41106a220d201541106a29000037030020044198026a41086a2213201541086a29000037030020042015290000370398022015102c200441f0026a41186a22152014290300370300200441f0026a41106a2214200d290300370300200441f0026a41086a220d201329030037030020042004290398023703f00202402016450d002002102c0b200441b1026a2015290300370000200441a9026a2014290300370000200441a1026a200d290300370000200420042903f00237009902200441013a009802200120044198026a108703200e41164d0d092009200e41696aad422086201041176aad8441011007200041013a0000200041086a20044198026a41d80010db051a2012450d002003102c0b200f450d092010102c0c090b200441c8026a200b360200200441c4026a200c360200200441c0026a2015360200200441bc026a200d360200200441b8026a200e360200200441b4026a200f36020020044198026a41186a2010360200200441cc026a20042903f801370200200441d4026a200441f8016a41086a290300370200200441dc026a200441f8016a41106a290300370200200441e4026a200441f8016a41186a29030037020020044198026a41106a200920197d200a201b54ad7d370300200441003a0098022004200a201b7d3703a002200120044198026a108703200041023a0000200041086a20044198026a41d80010db051a0c080b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041386a200b360000200041346a200c360000200041306a20123600002000412c6a200d360000200041286a200e360000200041246a200f360000200041206a20103600002000413c6a20042903f801370000200041c4006a2006290300370000200041cc006a2007290300370000200041d4006a2008290300370000200041dc006a20113600000c070b200f450d080c070b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041386a200b360000200041346a200c360000200041306a20123600002000412c6a200d360000200041286a200e360000200041246a200f360000200041206a20103600002000413c6a20042903f801370000200041c4006a20044180026a290300370000200041cc006a200441f8016a41106a290300370000200041d4006a200441f8016a41186a290300370000200041dc006a20113600000c050b4117200e1047000b2004200429029c023703f00241aba9c20041fe00200441f0026a41acaac200103b000b1033000b1035000b4117200e1047000b0240200541037122004103460d0020000e03020000020b200f450d010b2010102c0b200441b0036a24000baf0201037f230041e0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022010d00200041003602000c010b200228021421032002200241186a28020036022420022001360220200241c8006a200241206a1083010240024020022802482204450d002000200229024c370204200020043602000c010b20024100360230200242013703282002410b36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241d0b0c2003602482002200241386a360258200241c4006a41c49ac500200241c8006a10391a2002350230422086200235022884100420004100360200200228022c450d002002280228102c0b2003450d002001102c0b200241e0006a24000bd20903067f017e057f230041f0016b22022400024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a3602002005417f6a220541014b0d0520050e020102010b200041023a00000c050b20064104490d012004280001210720012003417b6a22053602042001200441056a36020020054108490d02200429000521082001200341736a36020420012004410d6a36020041002105200241003a00b001410d20036b2109200341726a210603400240200920056a0d000240200541ff0171450d00200241003a00b0010b200041023a00000c060b20024190016a20056a200420056a220a410d6a2d00003a0000200120063602042001200a410e6a3602002002200541016a220a3a00b0012006417f6a2106200a2105200a4120470d000b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a290300370300200220022903900137037041002105200241003a00d0012004200a6a2109200a20036b410d6a210a03400240200a20056a0d000240200541ff0171450d00200241003a00d0010b200041023a00000c060b20024190016a20056a200920056a2204410d6a2d00003a00002001200636020420012004410e6a3602002002200541016a22043a00d0012006417f6a210620042105200441c000470d000b200241106a41386a220120024190016a41386a290300370300200241106a41306a220520024190016a41306a290300370300200241106a41286a220620024190016a41286a290300370300200241106a41206a220420024190016a41206a290300370300200241106a41186a220a20024190016a41186a290300370300200241106a41106a220320024190016a41106a290300370300200241106a41086a220920024190016a41086a290300370300200241d0006a41086a220b200241f0006a41086a290300370300200241d0006a41106a220c200241f0006a41106a290300370300200241d0006a41186a220d200241f0006a41186a290300370300200220022903900137031020022002290370370350200041003a000020002002290350370001200041096a200b290300370000200041116a200c290300370000200041196a200d290300370000200041216a2002290310370000200041296a2009290300370000200041316a2003290300370000200041396a200a290300370000200041c1006a2004290300370000200041c9006a2006290300370000200041d1006a2005290300370000200041d9006a2001290300370000200041e3006a2002410f6a2d00003a0000200041e1006a20022f000d3b0000200041e8006a2008370300200041e4006a20073602000c040b0240024020064104490d002004280001210620012003417b6a22053602042001200441056a360200200541084f0d010b200041023a00000c040b200041013a0000200020022f00103b0001200429000521082001200341736a36020420012004410d6a360200200041086a2008370300200041046a2006360200200041036a200241126a2d00003a0000200041106a20024190016a41e00010db051a0c030b200041023a00000c020b200041023a00000c010b200041023a00000b200241f0016a24000bf70101077f230041106b220124002001410036020820014201370300200110e60220012802042102200128020021030240024002400240200041046a2802002204200041086a28020022056b20012802082206490d00200028020021040c010b200520066a22072005490d02200441017422052007200520074b1b22054100480d020240024020040d002005102a21040c010b200028020020042005102e21040b2004450d0120002004360200200041046a2005360200200041086a28020021050b200041086a200520066a360200200420056a2003200610db051a02402002450d002003102c0b200141106a24000f0b1033000b1035000b931501067f230041106b220224000240024002400240024002400240024020012d00000e050003010204000b20024100360208200242013703004101102a2203450d05200242818080801037020420022003360200200341023a00002002200236020c200141016a2002410c6a1094020c040b20024100360208200242013703004101102a2203450d04200242818080801037020420022003360200200341043a000020012d0001210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d06200341017422062005200620054b1b22064100480d060240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0520022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0002210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d06200341017422062005200620054b1b22064100480d060240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0520022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0003210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d06200341017422062005200620054b1b22064100480d060240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0520022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0004210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d06200341017422062005200620054b1b22064100480d060240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0520022006360204200220053602000b2002200341016a360208200520036a20043a000020012802082104200141106a2802002201200210670240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d06200541017422072006200720064b1b22064100480d060240024020050d002006102a21050c010b200228020020052006102e21050b2005450d0520022006360204200220053602000b2002200320016a360208200520036a2004200110db051a0c030b20024100360208200242013703004101102a2203450d03200242818080801037020420022003360200200341053a000020012d0001210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d05200341017422062005200620054b1b22064100480d050240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0420022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0002210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d05200341017422062005200620054b1b22064100480d050240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0420022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0003210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d05200341017422062005200620054b1b22064100480d050240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0420022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0004210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d05200341017422062005200620054b1b22064100480d050240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0420022006360204200220053602000b2002200341016a360208200520036a20043a000020012802082104200141106a2802002201200210670240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d05200541017422072006200720064b1b22064100480d050240024020050d002006102a21050c010b200228020020052006102e21050b2005450d0420022006360204200220053602000b2002200320016a360208200520036a2004200110db051a0c020b20024100360208200242013703004101102a2203450d02200242818080801037020420022003360200200341063a000020012d0001210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d04200341017422062005200620054b1b22064100480d040240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0320022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0002210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d04200341017422062005200620054b1b22064100480d040240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0320022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0003210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d04200341017422062005200620054b1b22064100480d040240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0320022006360204200220053602000b2002200341016a360208200520036a20043a000020012d0004210402400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d04200341017422062005200620054b1b22064100480d040240024020030d002006102a21050c010b200228020020032006102e21050b2005450d0320022006360204200220053602000b2002200341016a360208200520036a20043a000020012802082104200141106a2802002201200210670240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d04200541017422072006200720064b1b22064100480d040240024020050d002006102a21050c010b200228020020052006102e21050b2005450d0320022006360204200220053602000b2002200320016a360208200520036a2004200110db051a0c010b20024100360208200242013703004101102a2203450d01200242818080801037020420022003360200200341003a0000200141046a28020021042001410c6a2802002201200210670240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d03200541017422072006200720064b1b22064100480d030240024020050d002006102a21050c010b200228020020052006102e21050b2005450d0220022006360204200220053602000b2002200320016a360208200520036a2004200110db051a0b200020022201290200370200200041086a200141086a280200360200200241106a24000f0b1033000b1035000bd70701047f230041106b2202240002400240024020002d0000417f6a220341034b0d00024002400240024020030e0400010203000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200028020421032000410c6a2802002200200110672000450d0320004105742100034020032001109101200341206a2103200041606a22000d000c040b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a000020002802042001108b010c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d04200341017422052004200520044b1b22054100480d040240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041046a200110890120002802082001108b010c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d03200341017422052004200520044b1b22054100480d030240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002002200136020c200041016a2002410c6a109402200041246a200110890120002d0021210402400240200141046a28020020052802002203460d00200128020021000c010b200341016a22002003490d03200341017422052000200520004b1b22054100480d030240024020030d002005102a21000c010b200128020020032005102e21000b2000450d0220012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20043a00000b200241106a24000f0b1033000b1035000bcd1702047f017e200028025821020240024002400240200141046a2802002203200141086a28020022046b4104490d00200128020021030c010b200441046a22052004490d02200341017422042005200420054b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240200141046a2802002203200528020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290348210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290350210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028025c210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280260210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280264210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280268210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d02200341017422042002200420024b1b22044100480d020240024020030d002004102a21030c010b200128020020032004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000020002d0070210502400240200141046a28020020022802002204460d00200128020021030c010b200441016a22032004490d02200441017422022003200220034b1b22024100480d020240024020040d002002102a21030c010b200128020020042002102e21030b2003450d0120012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a20053a0000200028026c210302400240200141046a2802002204200228020022006b4104490d00200128020021040c010b200041046a22022000490d02200441017422002002200020024b1b22004100480d020240024020040d002000102a21040c010b200128020020042000102e21040b2004450d0120012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000f0b1033000b1035000bb8be0102087f027e230041106b220224000240024002400240024020002d0000220341114b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e12000102030405060708090a0b0c0d0e0f1011000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d14200341017422052004200520044b1b22054100480d140240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00000240024020002802044101460d00200241003a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d16200341017422052004200520044b1b22054100480d160240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280208210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d16200441017422032005200320054b1b22034100480d160240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1520012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600002000410c6a2103410721050c010b200241013a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d15200341017422052004200520044b1b22054100480d150240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000410021040240200041106a2d00004101470d00200241013a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d16200341017422062004200620044b1b22064100480d160240024020030d002006102a21040c010b200128020020032006102e21040b2004450d1520012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41013a000020002d001121040b200220043a000002400240200141046a28020020052802002203460d00200128020021050c010b200341016a22052003490d15200341017422062005200620054b1b22064100480d150240024020030d002006102a21050c010b200128020020032006102e21050b2005450d1420012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a20043a00002002200041126a2d000022053a000002400240200141046a28020020062802002203460d00200128020021040c010b200341016a22042003490d15200341017422062004200620044b1b22064100480d150240024020030d002006102a21040c010b200128020020032006102e21040b2004450d1420012004360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200420036a20053a00002000280214210502400240200141046a2802002204200628020022036b4104490d00200128020021040c010b200341046a22062003490d15200441017422032006200320064b1b22034100480d150240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1420012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2005360000200041186a2103411321050b200220032d000022063a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d14200341017422072004200720044b1b22074100480d140240024020030d002007102a21040c010b200128020020032007102e21040b2004450d1320012004360200200141046a2007360200200141086a28020021030b200141086a2207200341016a360200200420036a20063a00002002200020056a41066a2d000022043a000002400240200141046a28020020072802002200460d00200128020021030c010b200041016a22032000490d14200041017422052003200520034b1b22054100480d140240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1320012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000c110b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d13200341017422052004200520044b1b22054100480d130240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a28020020052802002204460d00200128020021050c010b200441016a22032004490d13200441017422052003200520034b1b22034100480d130240024020040d002003102a21050c010b200128020020042003102e21050b2005450d1220012005360200200141046a2003360200200141086a28020021040b200141086a2203200441016a360200200520046a41003a0000200028020421042000410c6a2802002200200110672000450d102000410c6c21082004410a6a2104200141046a210603404100210502402004417e6a22072d00004102460d00200241013a000002400240200628020020032802002200460d00200128020021050c010b200041016a22052000490d15200041017422092005200920054b1b22094100480d150240024020000d002009102a21050c010b200128020020002009102e21050b2005450d142001200536020020062009360200200328020021000b2003200041016a360200200520006a41013a000041002105024020072d00004101470d00200241013a000002400240200628020020032802002200460d00200128020021050c010b200041016a22052000490d16200041017422072005200720054b1b22074100480d160240024020000d002007102a21050c010b200128020020002007102e21050b2005450d152001200536020020062007360200200328020021000b2003200041016a360200200520006a41013a00002004417f6a2d000021050b200220053a000002400240200628020020032802002200460d00200128020021070c010b200041016a22072000490d15200041017422092007200920074b1b22094100480d150240024020000d002009102a21070c010b200128020020002009102e21070b2007450d142001200736020020062009360200200328020021000b2003200041016a360200200720006a20053a000020042d000021050b200220053a000002400240200628020020032802002200460d00200128020021070c010b200041016a22072000490d14200041017422092007200920074b1b22094100480d140240024020000d002009102a21070c010b200128020020002009102e21070b2007450d132001200736020020062009360200200328020021000b2003200041016a360200200720006a20053a00002004410c6a2104200841746a22080d000c110b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041086a20011091012000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d12200341017422002005200020054b1b22004100480d120240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1120012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0f0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d11200341017422052004200520044b1b22054100480d110240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a000020002d0008220341034b0d0e0240024002400240024020030e0400010203000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d15200341017422052004200520044b1b22054100480d150240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041096a20011091012000290330210a2002200041386a2903003703082002200a3703000c030b200241013a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d14200341017422052004200520044b1b22054100480d140240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041096a20011091012000290330210a2002200041386a2903003703082002200a3703000c020b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d13200341017422052004200520044b1b22054100480d130240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041096a2001109101200041296a2001109101200041d8006a290300210a2000290350210b02400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d13200441017422032005200320054b1b22034100480d130240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1220012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a2203200a3700082003200b3700002000290360210a2002200041e8006a2903003703082002200a3703000c010b200241033a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041096a2001109101200041386a290300210a2000290330210b02400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d12200441017422032005200320054b1b22034100480d120240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1120012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a2203200a3700082003200b3700002000290340210a2002200041c8006a2903003703082002200a3703000b2002210302400240200141046a2802002204200141086a28020022006b4110490d00200128020021040c010b200041106a22052000490d11200441017422002005200020054b1b22004100480d110240024020040d002000102a21040c010b200128020020042000102e21040b2004450d1020012004360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200420006a220141086a200341086a290000370000200120032900003700000c0e0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d10200341017422052004200520044b1b22054100480d100240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a000020002d0008220341024b0d0d02400240024020030e03000102000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d12200341017422052004200520044b1b22054100480d120240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a290300210a2000290310210b02400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d12200441017422032005200320054b1b22034100480d120240024020040d002003102a21040c010b200128020020042003102e21040b2004450d1120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a2203200a3700082003200b370000200041286a290300210a2000290320210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d12200341017422002004200020044b1b22004100480d120240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1120012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c0f0b200241013a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d11200341017422052004200520044b1b22054100480d110240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041096a2001109101200041386a290300210a2000290330210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d11200341017422002004200020044b1b22004100480d110240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1020012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c0e0b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d10200341017422052004200520044b1b22054100480d100240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d10200341017422002005200020054b1b22004100480d100240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0f20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d0f200341017422002005200020054b1b22004100480d0f0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0e20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0c0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d0e200341017422072005200720054b1b22074100480d0e0240024020030d002007102a21050c010b200128020020032007102e21050b2005450d0d20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000024002400240024002400240024002400240024002400240024002400240024020002d00080e10000102030405060708090a0b0c0d0e0f000b200241003a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d1d200341017422072005200720054b1b22074100480d1d0240024020030d002007102a21050c010b200128020020032007102e21050b2005450d1c20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41003a0000200028020c21070240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a22082003490d1d200541017422032008200320084b1b22034100480d1d0240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1c20012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2007360000200041186a290300210a2000290310210b0240024020062802002203200428020022006b4110490d00200128020021030c010b200041106a22052000490d1d200341017422002005200020054b1b22004100480d1d0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1c20012003360200200141046a2000360200200141086a28020021000b2004200041106a360200200320006a2201200a3700082001200b3700000c1a0b200241013a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d1c200341017422072005200720054b1b22074100480d1c0240024020030d002007102a21050c010b200128020020032007102e21050b2005450d1b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41013a0000200028020c21070240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a22082003490d1c200541017422032008200320084b1b22034100480d1c0240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1b20012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2007360000200041286a290300210a2000290320210b0240024020062802002205200428020022036b4110490d00200128020021040c010b200341106a22042003490d1c200541017422032004200320044b1b22034100480d1c0240024020050d002003102a21040c010b200128020020052003102e21040b2004450d1b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a2203200a3700082003200b37000020002802102103200041186a2802002200200110672000450d1920004105742100034020032001109101200341206a2103200041606a22000d000c1a0b0b200241023a000002400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1b200041017422052003200520034b1b22054100480d1b0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c180b200241033a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d1a200341017422072005200720054b1b22074100480d1a0240024020030d002007102a21050c010b200128020020032007102e21050b2005450d1920012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41033a0000200028020c21070240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a22082003490d1a200541017422032008200320084b1b22034100480d1a0240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1920012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200736000020002d0009220041024b0d1702400240024020000e03000102000b200241003a000002400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1c200041017422052003200520034b1b22054100480d1c0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c190b200241013a000002400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1b200041017422052003200520034b1b22054100480d1b0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c180b200241023a000002400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d1a200041017422052003200520034b1b22054100480d1a0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d1920012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c170b200241043a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d19200341017422072005200720054b1b22074100480d190240024020030d002007102a21050c010b200128020020032007102e21050b2005450d1820012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41043a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d19200341017422002006200020064b1b22004100480d190240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1820012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c160b200241053a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d18200341017422072005200720054b1b22074100480d180240024020030d002007102a21050c010b200128020020032007102e21050b2005450d1720012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d18200341017422002006200020064b1b22004100480d180240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1720012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c150b200241063a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d17200341017422072005200720054b1b22074100480d170240024020030d002007102a21050c010b200128020020032007102e21050b2005450d1620012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d17200341017422002006200020064b1b22004100480d170240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1620012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c140b200241073a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d16200341017422072005200720054b1b22074100480d160240024020030d002007102a21050c010b200128020020032007102e21050b2005450d1520012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41073a0000200028020c21070240024020062802002205200428020022036b4104490d00200128020021050c010b200341046a22082003490d16200541017422032008200320084b1b22034100480d160240024020050d002003102a21050c010b200128020020052003102e21050b2005450d1520012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2007360000200220002d000922053a000002400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d16200041017422062003200620034b1b22064100480d160240024020000d002006102a21030c010b200128020020002006102e21030b2003450d1520012003360200200141046a2006360200200141086a28020021000b2004200041016a360200200320006a20053a00000c130b200241083a000002400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d15200341017422052004200520044b1b22054100480d150240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041096a2001109101200041296a20011091010c120b200241093a000002400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d14200341017422052004200520044b1b22054100480d140240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041096a20011091010c110b2002410a3a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d13200341017422062005200620054b1b22064100480d130240024020030d002006102a21050c010b200128020020032006102e21050b2005450d1220012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a410a3a0000200041096a200110910120022001360200200041296a2002109402200028024c210502400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22062000490d13200341017422002006200020064b1b22004100480d130240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1220012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c100b2002410b3a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d12200341017422062005200620054b1b22064100480d120240024020030d002006102a21050c010b200128020020032006102e21050b2005450d1120012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a410b3a000020022001360200200041096a2002109402200041296a2001109101200041d8006a290300210a2000290350210b02400240200141046a2802002203200628020022006b4110490d00200128020021030c010b200041106a22052000490d12200341017422002005200020054b1b22004100480d120240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1120012003360200200141046a2000360200200141086a28020021000b2004200041106a360200200320006a2201200a3700082001200b3700000c0f0b2002410c3a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d11200341017422062005200620054b1b22064100480d110240024020030d002006102a21050c010b200128020020032006102e21050b2005450d1020012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a410c3a000020022001360200200041096a2002109402200041296a2001109101200041d8006a290300210a2000290350210b02400240200141046a2802002203200628020022006b4110490d00200128020021030c010b200041106a22052000490d11200341017422002005200020054b1b22004100480d110240024020030d002000102a21030c010b200128020020032000102e21030b2003450d1020012003360200200141046a2000360200200141086a28020021000b2004200041106a360200200320006a2201200a3700082001200b3700000c0e0b2002410d3a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d10200341017422062005200620054b1b22064100480d100240024020030d002006102a21050c010b200128020020032006102e21050b2005450d0f20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a410d3a000020022001360200200041096a2002109402200028022c210502400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22062000490d10200341017422002006200020064b1b22004100480d100240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0f20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0d0b2002410e3a000002400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d0f200341017422062005200620054b1b22064100480d0f0240024020030d002006102a21050c010b200128020020032006102e21050b2005450d0e20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a410e3a000020022001360200200041096a2002109402200028022c210502400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22062000490d0f200341017422002006200020064b1b22004100480d0f0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0e20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0c0b2002410f3a000002400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410f3a000020022001360200200041096a2002109402200041296a2001109101200041f8006a290300210a2000290370210b02400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d0e200441017422032005200320054b1b22034100480d0e0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0d20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a2203200a3700082003200b370000200041c9006a20011091010c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041046a200110eb020c0a0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041046a200110eb020c090b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a000020002d0004220341044b0d080240024002400240024020030e050001020304000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d11200341017422052004200520044b1b22054100480d110240024020030d002005102a21040c010b200128020020032005102e21040b2004450d1020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000020002802082103200041106a2802002200200110672000450d0c2003200041306c6a2108200141046a2106034020032001109101200341286a290300210a200341206a290300210b0240024020062802002204200528020022006b4110490d00200128020021040c010b200041106a22072000490d12200441017422002007200020074b1b22004100480d120240024020040d002000102a21040c010b200128020020042000102e21040b2004450d112001200436020020062000360200200528020021000b2005200041106a360200200420006a2200200a3700082000200b3700002008200341306a2203470d000c0d0b0b200241013a000002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d10200041017422042003200420034b1b22044100480d100240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0f20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c0b0b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041056a20011091010c0a0b200241033a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a0000200041056a20011091010c090b200141086a2802002103200241043a0000024002402003200141046a280200460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041056a2001109101200041256a2001109101200220002d004522043a000002400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d0d200041017422052003200520034b1b22054100480d0d0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0c20012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c200341017422052004200520044b1b22054100480d0c0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a000020002d0001220041054b0d07024002400240024002400240024020000e06000102030405000b410021030c050b410121030c040b410221030c030b410321030c020b410421030c010b410521030b200220033a000002400240200141046a280200200141086a2802002200460d00200128020021040c010b200041016a22042000490d0c200041017422052004200520044b1b22054100480d0c0240024020000d002005102a21040c010b200128020020002005102e21040b2004450d0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a20033a00000c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0b200341017422052004200520044b1b22054100480d0b0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000280204220341024b0d0602400240024020030e03000102000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000020002802082103200041106a2802002200200110672000450d082003200041286c6a2108200141046a2106034020032001109101200341206a290300210a0240024020062802002204200528020022006b4108490d00200128020021040c010b200041086a22072000490d0e200441017422002007200020074b1b22004100480d0e0240024020040d002000102a21040c010b200128020020042000102e21040b2004450d0d2001200436020020062000360200200528020021000b2005200041086a360200200420006a200a3700002008200341286a2203470d000c090b0b200241013a000002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0c200041017422042003200420034b1b22044100480d0c0240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c070b200241023a000002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0b200041017422042003200420034b1b22044100480d0b0240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0a20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a00000c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a200341017422052004200520044b1b22054100480d0a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a000020002d0008220341054b0d0502400240024002400240024020030e06000102030405000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0f200341017422052004200520044b1b22054100480d0f0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d0f200341017422002005200020054b1b22004100480d0f0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0e20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0a0b200241013a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a290300210a2000290310210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d0e200341017422002004200020044b1b22004100480d0e0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0d20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c090b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200028022c210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d0d200441017422032005200320054b1b22034100480d0d0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0c20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a290300210a2000290330210b02400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d0d200441017422032005200320054b1b22034100480d0d0240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0c20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a2203200a3700082003200b370000200041096a20011091010c080b200241033a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c200341017422052004200520044b1b22054100480d0c0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a290300210a2000290310210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d0c200341017422002004200020044b1b22004100480d0c0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0b20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c070b200141086a2802002103200241043a0000024002402003200141046a280200460d00200128020021040c010b200341016a22042003490d0b200341017422052004200520044b1b22054100480d0b0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a290300210a2000290310210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d0b200341017422002004200020044b1b22004100480d0b0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0a20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c060b200241053a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a200341017422052004200520044b1b22054100480d0a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a0000200041186a290300210a2000290310210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d0a200341017422002004200020044b1b22004100480d0a0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0920012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410d3a000020002d0008220341054b0d0402400240024002400240024020030e06000102030405000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0e200341017422052004200520044b1b22054100480d0e0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041096a2001109101200041296a2001109101200041d8006a290300210a2000290350210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d0e200341017422002004200020044b1b22004100480d0e0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0d20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c090b200241013a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0d200341017422052004200520044b1b22054100480d0d0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0c20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041096a2001109101200041296a20011091010c080b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c200341017422052004200520044b1b22054100480d0c0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a000020022001360200200041096a20021094020c070b200241033a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0b200341017422052004200520044b1b22054100480d0b0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d0b200341017422002005200020054b1b22004100480d0b0240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0a20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c060b200141086a2802002103200241043a0000024002402003200141046a280200460d00200128020021040c010b200341016a22042003490d0a200341017422052004200520044b1b22054100480d0a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041096a2001109101200220002d002922043a000002400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d0a200041017422052003200520034b1b22054100480d0a0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0920012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000c050b200241053a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a0000200041096a2001109101200028022c2106200041346a28020022002001106702400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d09200441017422032005200320054b1b22034100480d090240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0820012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010db051a0c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d08200341017422052004200520044b1b22054100480d080240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410e3a000020002d0001220341024b0d0302400240024020030e03000102000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a200341017422052004200520044b1b22054100480d0a0240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200220002d000222043a000002400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d0a200041017422052003200520034b1b22054100480d0a0240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0920012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000c050b200241013a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041026a20011091010c040b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d08200341017422052004200520044b1b22054100480d080240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200220002d000222043a000002400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d08200041017422052003200520034b1b22054100480d080240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0720012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d07200341017422052004200520044b1b22054100480d070240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410f3a000020002d0004220341024b0d0202400240024020030e03000102000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041056a20011091010c040b200241013a000002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d08200041017422042003200420034b1b22044100480d080240024020000d002004102a21030c010b200128020020002004102e21030b2003450d0720012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c030b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d07200341017422052004200520044b1b22054100480d070240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a000020002802082104200041106a2802002200200110672000450d022004200041d0006c6a21050340200420011091012002200441206a36020020022001108a012002200441306a36020020022001108a01200428024021002004280248220320011067200441d0006a210402402003450d00200341306c21030340200041106a20011091012002200036020020022001108a01200041306a2100200341506a22030d000b0b20052004470d000c030b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41103a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041106a200110ec02200028020421062000410c6a28020022032001106702400240200141046a2802002204200528020022006b2003490d00200128020021040c010b200020036a22052000490d06200441017422002005200020054b1b22004100480d060240024020040d002000102a21040c010b200128020020042000102e21040b2004450d0520012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a2006200310db051a0c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41113a000020002d0008220341044b0d000240024002400240024020030e050001020304000b200241003a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d09200341017422052004200520044b1b22054100480d090240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041096a20011091010c040b200241013a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d08200341017422052004200520044b1b22054100480d080240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041096a20011091010c030b200241023a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d07200341017422052004200520044b1b22054100480d070240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041096a20011091010c020b200241033a000002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041096a2001109101200041386a290300210a2000290330210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d06200341017422002004200020044b1b22004100480d060240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0520012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000c010b200141086a2802002103200241043a0000024002402003200141046a280200460d00200128020021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041096a2001109101200041386a290300210a2000290330210b02400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d05200341017422002004200020044b1b22004100480d050240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0420012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a2201200a3700082001200b3700000b200241106a24000f0b1033000b1035000b1033000b1035000b8d1201057f230041106b2202240002400240024020002d0000220341054b0d0002400240024002400240024020030e06000102030405000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d08200341017422052004200520044b1b22054100480d080240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041016a20011091012000280244210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d08200441017422032005200320054b1b22034100480d080240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0720012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a20063600002002200136020c200041216a2002410c6a1094022000280248210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d08200341017422002005200020054b1b22004100480d080240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0720012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d07200341017422052004200520044b1b22054100480d070240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041016a20011091012002200136020c200041216a2002410c6a10940220002d0041210602400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d07200341017422052004200520044b1b22054100480d070240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20063a00002000280244210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d07200441017422032005200320054b1b22034100480d070240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0620012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a20063600002000280248210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d07200341017422002005200020054b1b22004100480d070240024020030d002000102a21030c010b200128020020032000102e21030b2003450d0620012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200136020c200041016a2002410c6a1094020c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002002200136020c200041016a2002410c6a1094020c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d04200341017422052004200520044b1b22054100480d040240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002002200136020c200041016a2002410c6a10940220002d0021210402400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d04200041017422052003200520034b1b22054100480d040240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0320012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d03200341017422052004200520044b1b22054100480d030240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a00002002200136020c200041016a2002410c6a10940220002d0021210402400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d03200041017422052003200520034b1b22054100480d030240024020000d002005102a21030c010b200128020020002005102e21030b2003450d0220012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000b200241106a24000f0b1033000b1035000bb21401047f20002d000021020240024002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0001210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0002210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0003210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0004210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0005210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0006210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0007210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0008210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d0009210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d000a210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d000b210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d000c210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d000d210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d000e210202400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d02200341017422052004200520044b1b22054100480d020240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a20023a000020002d000f210402400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d02200041017422022003200220034b1b22024100480d020240024020000d002002102a21030c010b200128020020002002102e21030b2003450d0120012003360200200141046a2002360200200141086a28020021000b200141086a200041016a360200200320006a20043a00000f0b1033000b1035000bea0b01037f230041306b210202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e18000102030405060708090a0b0c0d0e0f1011121314151617000b417f2102024002400240200141086a280200417f6a220341064b0d0041012101024020030e0703010200020202030b41c09a0c21020c020b410021010b4190ce0021020b200041013a0005200020013a0004200020023602000f0b200041013b0104200041003602000f0b20004180023b010420004190ce003602000f0b20004181023b010420004190ce003602000f0b20004181023b010420004190ce003602000f0b20004180023b010420004190ce003602000f0b4100210202400240200141086a280200417f6a220341034b0d0041c0843d2101024020030e0402000202020b4101210241d0860321010c010b4190ce0021010b200041013a0005200020023a0004200020013602000f0b410121024100210302400240200141086a2d0000417f6a2204410f4b0d0041a0c21e210102400240024020040e1004040000010104040102020202020202040b4180b51821010c030b41b0e32d21010c020b4100210141012103410021020c010b4190ce0021010b200020023a0005200020033a0004200020013602000f0b20004180023b0104200041f093093602000f0b410021020240024002400240200141086a2d0000417f6a220341144b0d0041c096b1022101024002400240024020030e15070700000107070702020303060606050504060604070b41c09a0c21010c060b4101210241a0c21e21010c050b41c09a0c21010c040b410121020b4190ce0021010c020b41a0c21e21010c010b41a08d0621010b200041013a0005200020023a0004200020013602000f0b0240024020012d0004417f6a220341034b0d004101210241a08d0621010240024020030e0403030001030b41c096b10221010c020b41c09a0c21010c010b410021024190ce0021010b200041013a0005200020023a0004200020013602000f0b0240024020012d0004417f6a220341034b0d004101210241a08d0621010240024020030e0403030001030b41c096b10221010c020b41c09a0c21010c010b410021024190ce0021010b200041013a0005200020023a0004200020013602000f0b4100210202400240200141086a280200417f6a220341054b0d0041a08d06210102400240024020030e06040300010202040b41c0843d21010c030b41a0c21e21010c020b41012102418089fa0021010c010b4190ce0021010b200041013a0005200020023a0004200020013602000f0b20004180023b0104200041d086034190ce0020012d0004417f6a4107714105491b3602000f0b20004180023b010420004190ce003602000f0b20004180023b010420004190ce003602000f0b4100210202400240200141086a280200417f6a220341024b0d0041a0c21e2101024020030e03020000020b4101210241a08d0621010c010b4190ce0021010b200041013a0005200020023a0004200020013602000f0b02400240200141086a2d0000417f6a220341044b0d0020022101024002400240024020030e050500010203050b200241086a21010c040b200241106a21010c030b200241186a21010c020b200241206a21010c010b200241286a21010b2001428080808080e20937020020004180023b010420004190ce003602000f0b024002402001280204417f6a220441024b0d00410021014101210241002103024020040e03020100020b4101210241002101410121030c010b41012103410021024190ce0021010b200020033a0005200020023a0004200020013602000f0b20004180023b010420004190ce003602000f0b20004180023b010420004190ce003602000f0b20004180023b010420004190ce003602000f0b20004180023b010420004190ce003602000f0b4101210241002103024002402001280204417f6a220441034b0d0041d086032101024020040e0402010000020b4100210141012103410021020c010b4190ce0021010b200020023a0005200020033a0004200020013602000b880401077f230041306b22022400200241003602082002420137030020022002360210200141106a200241106a1094022001200210890120022002360210200141306a200241106a10940220022002360210200141d0006a200241106a109402200128020421032001410c6a2802002201200210670240024002402001450d00200141246c21040340200241106a200310e702200228021021050240024020022802042206200228020822016b20022802182207490d00200228020021060c010b200120076a22082001490d04200641017422012008200120084b1b22014100480d040240024020060d002001102a21060c010b200228020020062001102e21060b2006450d032002200136020420022006360200200228020821010b2002200120076a360208200620016a2005200710db051a02402002280214450d002005102c0b200341246a21032004415c6a22040d000b0b20022802042107200241106a41186a2203200235020842208620022802002204ad841006220141186a290000370300200241106a41106a2206200141106a290000370300200241106a41086a2205200141086a290000370300200220012900003703102001102c200041186a2003290300370000200041106a2006290300370000200041086a20052903003700002000200229031037000002402007450d002004102c0b200241306a24000f0b1033000b1035000b9d0302057f017e230041e0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003602000c010b200328021421022003200341186a28020036022420032001360220200341c8006a200341206a10770240024020032802482204450d00200328024c21050240200328022422064110490d002003200641706a36022420032003280220220641106a360220200341c8006a41086a280200210720062900002108200041186a200641086a290000370300200041106a2008370300200041086a200736020020002005360204200020043602000c020b2005450d002004102c0b20034100360230200342013703282003410b36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341d0b0c2003602482003200341386a360258200341c4006a41c49ac500200341c8006a10391a2003350230422086200335022884100420004100360200200328022c450d002003280228102c0b2002450d002001102c0b200341e0006a24000be006010d7f23004190016b220224002002412036021420022001360210200241186a2001ad42808080808004841003108d0102400240200228021822030d00200041003602000c010b200228021c21042002200241206a28020036023c20022003360238200241086a200241386a1075024002400240024020022802080d0002400240200228023c22014160712205417f4c0d00200228020c210602400240200141057622070d00410121080c010b2005102a2208450d020b02402006450d004100210903402001210a200241003a0088012009220b41016a2109410021010240024002400340200a2001460d01200241e8006a20016a200228023822052d00003a00002002200541016a3602382002200141016a22053a0088012005210120054120470d000b200241c8006a41186a220c200241e8006a41186a290300370300200241c8006a41106a220d200241e8006a41106a290300370300200241c8006a41086a220e200241e8006a41086a290300370300200220022903683703482007200b470d020240200b41017422012009200120094b1b220741ffffff3f712007470d002007410574220141004e0d020b1035000b2002410036023c0240200141ff0171450d00200241003a0088010b200241003602282007450d072008102c0c070b02400240200b0d002001102a21080c010b2008200b4105742001102e21080b2008450d040b200a20056b21012008200b4105746a220b2002290348370000200b41186a200c290300370000200b41106a200d290300370000200b41086a200e29030037000020092006470d000b200241306a20063602002002200736022c200220083602282002200a20056b36023c0c050b200241306a20063602002002200736022c2002200836022820080d040c030b103a000b1033000b200241003602280b20024100360250200242013703482002410b36022c2002200241106a3602282002200241c8006a360244200241fc006a41013602002002420137026c200241d0b0c2003602682002200241286a360278200241c4006a41c49ac500200241e8006a10391a2002350250422086200235024884100420004100360200200228024c450d012002280248102c0c010b20002002290328370200200041086a200241286a41086a2802003602000b2004450d002003102c0b20024190016a24000b8f0201057f230041106b22032400024002400240200141046a2204417f4c0d000240024020040d00410121050c010b2004102a2205450d020b2003410036020820032004360204200320053602002001200310670240024020032802042206200328020822056b2001490d00200328020021040c010b200520016a22042005490d03200641017422072004200720044b1b22074100480d030240024020060d002007102a21040c010b200328020020062007102e21040b2004450d022003200736020420032004360200200721060b200420056a2000200110db051a2002290200200520016aad4220862004ad84100102402006450d002004102c0b200341106a24000f0b103a000b1033000b1035000bd46109027f017e047f027e047f017e0c7f0c7e117f230041900a6b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e06000102030405000b200341c4026a4101360200200342013702b402200341fcc4c5003602b002200341043602b406200341f4c4c5003602b0062003200341b0066a3602c002200341b0026a4184c5c5001041000b200141e0006a2802002104200341b0066a200141086a41d80010db051a200341f8046a41186a200141fc006a28020036020020034188056a200141f4006a290200370300200341f8046a41086a200141ec006a2902003703002003200141e4006a2902003703f804024020022d000120022d000072450d0041b2b2c0002104411121020c110b41e4d2c500ad42808080808001842205100222022f0000210620022d000221072002280003210820022d000721092002290008210a2002102c41f4d2c500ad4280808080f00184220b100222022f0000210c20022d0002210d2002280003210e20022d0007210f200229000821102002102c20032010370390042003200f3a008f042003200e4118763a008e042003200e4108763b018c042003200e3a008b042003200d3a008a042003200c3b0188042003200a4238883c0087042003200a4230883c0086042003200a4220883d0184042003200a4218883c0083042003200a4210883c0082042003200a3d018004200320093a00ff03200320083600fb03200320073a00fa03200320063b01f803200341b0026a200341f8036a10e7030240410020032802880320032d00a0034102461b2004490d0041b1b3c4002104413521020c110b200341bc026a2004360200200341b0026a41086a41033a00002003410d3a00b00241014100200341b0026a109201200341b0026a200341b0066a41d80010db051a20034194036a200341f8046a41086a2903003702002003419c036a20034188056a290300370200200341a4036a200341f8046a41186a2802003602002003200436028803200320032903f80437028c032005100222022f0000210e20022d000221062002280003210720022d000721082002290008210a2002102c200b100222022f0000210920022d0002210c2002280003210420022d0007210d200229000821102002102c20032010370390042003200d3a008f04200320044118763a008e04200320044108763b018c04200320043a008b042003200c3a008a04200320093b0188042003200a4238883c0087042003200a4230883c0086042003200a4220883d0184042003200a4218883c0083042003200a4210883c0082042003200a3d018004200320083a00ff03200320073600fb03200320063a00fa032003200e3b01f803200341003602d008200342013703c808200341b0026a200341c8086a10e90220032802cc082102200341f8036aad428080808080048420033502d00842208620032802c8082204ad84100102402002450d002004102c0b410021040c0f0b2001410c6a2802002111200141086a2802002107200141046a2802002109200141106a290300210a2002411a6a2901002110200241196a2d00002112200241186a2d00002113200241166a2f01002114200241156a2d00002115200241146a2d00002116200241126a2f01002117200241116a2d00002118200241106a2d000021082002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210f2002410a6a2f01002119200241096a2d0000211a200241046a2d0000211b41022104200241026a2f0100211c0240024020022d00000d0020022d00014101470d00200241056a2d00002104200241066a2f0100210e200241086a2d00002102410021060c010b41012106410021024100210e0b200e41ffff0371410874200241187472200441ff017172210e02402006450d0041d6b2c0002104410f21020240024002400240200e0e050001020312000b2019410874201a72200f411874722104200c410874200d7220084118747221020c110b41dd8cc6002104410e21020c100b41c3b2c0002104411321020c0f0b41b2b2c0002104411121020c0e0b200320103703e008200320123a00df08200320133a00de08200320143b01dc08200320153a00db08200320163a00da08200320173b01d808200320183a00d708200320083a00d6082003200c3b01d4082003200d3a00d3082003200f3a00d208200320193b01d0082003201a3a00cf082003200e3600cb082003201b3a00ca082003201c3b01c80841e4d2c500ad4280808080800184100222022f0000210420022d0002210e2002280003210620022d00072108200229000821102002102c41b7e4c300ad4280808080800184100222022f0000210c20022d0002210d2002280003210f20022d00072119200229000821052002102c200320053701c806200320193a00c7062003200f3600c3062003200d3a00c2062003200c3b01c006200320103701b806200320083a00b706200320063600b3062003200e3a00b206200320043b01b006200341c0006a200341b0066a4120109e01420021050240024020032903484201200328024022021b2210200341d0006a290300420020021b220b8450450d004200211d0c010b200341206a200b4200200a420010e005200341306a20104200200a420010e005200341106a420042002010420010e00502402003290328200329031884420052200341386a2903002205200329032020032903107c7c221d20055472450d0041a7c4c1002104412721020c0f0b200329033021050b200341b0026a200341c8086a2005201d410810ac01024020032802b0024101470d0020032802b802210220032802b40221040c0e0b4110210e200341b0026a41106a290300211e20032903b802211f41e4d2c500ad4280808080800184100222022f0000210620022d000221082002280003210c20022d0007210d200229000821052002102c41f4d2c500ad4280808080f00184100222022f0000210f20022d000221192002280003210420022d0007211a2002290008211d2002102c2003201d370390042003201a3a008f04200320044118763a008e04200320044108763b018c04200320043a008b04200320193a008a042003200f3b018804200320054238883c008704200320054230883c008604200320054220883d018404200320054218883c008304200320054210883c008204200320053d0180042003200d3a00ff032003200c3600fb03200320083a00fa03200320063b01f803200341b0026a200341f8036a10e70320032903b002210520032903b802212020032903c002212120032903c802212220032903d002212320032903d802212420032903e002212520032903e802212620032903f002212720032903f8022128200329038003211d200328028803210d200328028c0321042003280290032106200328029403210f2003280298032108200328029c03210c20032d00a00321022003200341b0026a41f4006a2800003600fb03200320032800a1033602f8030240024020024102470d0042012105200342013703f806200342af013703f00620034287013703e806200342013703e006200342013703d806200342013703d006200342013703c806200342013703c006200342013703b806200342013703b0064100210220034100360288074120210c418080012108418080042106410421044201211d0c010b200341b0066a41f4006a20032800fb033600002003200d36028807200320283703f806200320273703f006200320263703e806200320253703e006200320243703d806200320233703d006200320223703c806200320213703c006200320203703b806200320053703b006200320032802f8033600a107200f210e0b2003200542002011ad2220420010e005200320023a00a0072003200c36029c0720032008360298072003200e3602940720032006360290072003200436028c072003201d370380074200200a427f200329030020032903084200521b7d22052005200a5622021b210502402002450d0041bbe8c2002104412c21020c0c0b200341b0026a20092011200341b0066a10ff03024020032802b0024101470d00200341b8026a280200210220032802b40221040c0c0b200341e8076a41186a2204200341b0026a410472220241186a280200360200200341e8076a41106a2206200241106a290200370300200341e8076a41086a2208200241086a290200370300200320022902003703e807200341f8046a41186a220e20204220862009ad841006220241186a290000370300200341f8046a41106a220d200241106a290000370300200341f8046a41086a220f200241086a290000370300200320022900003703f8042002102c20034192026a221920032d00fa043a0000200341d8096a41086a221a200341f8046a41136a290000370300200341e5096a2212200e290000370000200320032f01f8043b01900220032003290083053703d80920032800fb04210c20032800ff042102200341f8036a41186a2004280200360200200341f8036a41106a2006290300370300200341f8036a41086a22062008290300370300200320032903e8073703f803200320023600b7022003200c3600b302200320192d00003a00b202200320032f0190023b01b002200341b0026a41136a201a290300370000200341b0026a41186a2012290000370000200320032903d8093700bb0241e4d2c500ad428080808080018410022204290008211d20042d000721082004280003211920042d0002211a20042f000021122004102c419ee4c300ad4280808080b0018410022204290008212020042d000721132004280003211420042d0002211520042f000021162004102c200341f8046a200341b0026a109f0141c000102a2204450d0320042020370018200420133a001720042014360013200420153a0012200420163b00102004201d370008200420083a0007200420193600032004201a3a0002200420123b0000200420032903f804370020200441286a200f290300370000200441306a200d290300370000200441386a200e290300370000200341003602b802200342013703b002200341f8036a200341b0026a108901200341f8036a410472200341b0026a1089012006200341b0026a10890120032d00900421080240024020032802b40220032802b802220e460d0020032802b00221060c010b200e41016a2206200e490d05200e410174220d2006200d20064b1b220d4100480d0502400240200e0d00200d102a21060c010b20032802b002200e200d102e21060b2006450d042003200d3602b402200320063602b0020b2003200e41016a3602b8022006200e6a20083a0000200328028404210f2003418c046a2802002206200341b0026a10670240024020032802b402220d20032802b80222086b2006490d0020032802b002210e0c010b200820066a220e2008490d05200d4101742219200e2019200e4b1b22194100480d0502400240200d0d002019102a210e0c010b20032802b002200d2019102e210e0b200e450d04200320193602b4022003200e3602b0022019210d0b200e20086a200f200610db051a2004ad4280808080800884200820066aad422086200ead8410010240200d450d00200e102c0b2004102c024020034188046a280200450d00200f102c0b200341c3026a200341d8096a41086a290300370000200341b0026a41186a200341e5096a290000370000200320032f0190023b01b002200320023600b7022003200c3600b302200320032903d8093700bb02200320034192026a2d00003a00b20241e4d2c500ad428080808080018410022204290008211d20042d0007210e2004280003210620042d0002210820042f0000210d2004102c4192e4c300ad4280808080c0018410022204290008212020042d0007210f2004280003211920042d0002211a20042f000021122004102c200341f8046a200341b0026a109f0141c000102a2204450d03200420203700182004200f3a0017200420193600132004201a3a0012200420123b00102004201d3700082004200e3a000720042006360003200420083a00022004200d3b0000200420032903f804370020200441286a200341f8046a41086a290300370000200441306a200341f8046a41106a290300370000200441386a200341f8046a41186a290300370000200341c0003602b402200320043602b00220092011200341b0026a10f1022004102c02402007450d002009102c0b200341f8036a41026a20034190026a41026a2d000022043a0000200341f8046a41086a220e200341d8096a41086a290300370300200341f8046a410d6a2206200341d8096a410d6a290000370000200320032f01900222073b01f803200320032903d8093703f804200341b0026a41086a41023a0000200341b9026a20073b0000200341bb026a20043a0000200341b0026a41106a2002360200200341bc026a200c3602002003410d3a00b002200341c4026a20032903f804370200200341cc026a200e290300370200200341d1026a20062900003700004100210441014100200341b0026a109201200341c8086a200a20052010200b201f201e10b9020c0c0b200141c0006a2903002110200141386a29030021052002411a6a290100210b200241196a2d00002129200241186a2d0000212a200241166a2f0100212b200241156a2d0000212c200241146a2d0000212d200241126a2f0100212e200241116a2d0000212f200241106a2d000021302002410e6a2f010021312002410d6a2d000021322002410c6a2d000021332002410a6a2f01002134200241096a2d00002135200241046a2d0000213641022104200241026a2f01002137200141306a28020021382001412c6a2802002108200141286a28020021092001411d6a290000210a2001411c6a2d0000210c2001411b6a2d0000210d200141196a2f0000210f200141186a2d00002119200141176a2d0000211a200141156a2f00002112200141146a2d00002113200141136a2d00002114200141116a2f00002115200141106a2d000021162001410f6a2d000021172001410d6a2f000021182001410c6a2d0000211b200141086a280200210e200141076a2d0000211c200141056a2f00002111200141046a2d00002139200141c8006a290300211d0240024020022d00000d0020022d00014101470d00200241056a2d00002104200241066a2f01002106200241086a2d00002102410021070c010b4101210741002102410021060b200641ffff0371410874200241187472200441ff01717221060240024002402007450d0041d6b2c0002104410f210202400240024020060e05000401020f000b20344108742035722033411874722104203141087420327220304118747221020c0e0b41c3b2c0002104411321020c0d0b41b2b2c0002104411121020c0c0b203941ff01714101470d01200341b0026a200e41067610910220032802b00221040240024020032802b802200e413f7122024b0d00410021020c010b200420024105746a2202290018210a20022d0017210c20022d0016210d20022f0014210f20022d0013211920022d0012211a20022f0010211220022d000f211320022d000e211420022f000c211520022d000b211620022d000a211720022f0008211820022d0007211b2002280003210e20022d0002211c20022f00002111410121020b024020032802b402450d002004102c0b20020d010b41dd8cc6002104410e21020c0a0b2003200a370390042003200c3a008f042003200d3a008e042003200f3b018c04200320193a008b042003201a3a008a04200320123b018804200320133a008704200320143a008604200320153b018404200320163a008304200320173a008204200320183b0180042003201b3a00ff032003200e3600fb032003201c3a00fa03200320113b01f8032003200b3703c806200320293a00c7062003202a3a00c6062003202b3b01c4062003202c3a00c3062003202d3a00c2062003202e3b01c0062003202f3a00bf06200320303a00be06200320313b01bc06200320323a00bb06200320333a00ba06200320343b01b806200320353a00b706200320063600b306200320363a00b206200320373b01b006200341c8026a200329039004370300200341b0026a41106a200329038804370300200341b0026a41086a200329038004370300200320032903f8033703b002200320383602d008200320083602cc08200320093602c808200341f8046a200341b0066a200341b0026a20052010201d200341c8086a10d503024020032802f8044101460d00200341f8046a41086a280200450d0820032802fc04102c0c080b20032802fc042204450d07200341f8046a41086a2802002102200341f8046a41106a280200450d0820034184056a280200102c0c080b200141386a2903002105200141306a290300210b200141c0006a290300210a200341d0016a41186a200141196a290000370300200341d0016a41106a200141116a290000370300200341d0016a41086a200141096a290000370300200320012900013703d0012002411a6a2901002110200241196a2d00002112200241186a2d00002113200241166a2f01002114200241156a2d00002115200241146a2d00002116200241126a2f01002117200241116a2d00002118200241106a2d000021092002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210f2002410a6a2f01002119200241096a2d0000211a200241046a2d0000211b41022104200241026a2f0100211c2001412c6a2802002111200141286a280200210e200141246a28020021080240024020022d00000d0020022d00014101470d00200241056a2d00002104200241066a2f01002106200241086a2d00002102410021070c010b4101210741002106410021020b200641ffff0371410874200441ff017172200241187472210602402007450d0041d6b2c0002104410f21020240024002400240024020060e050001020304000b2019410874201a72200f411874722104200c410874200d7220094118747221020c030b41dd8cc6002104410e21020c020b41c3b2c0002104411321020c010b41b2b2c0002104411121020b200e450d062008102c0c060b2003201037038802200320123a008702200320133a008602200320143b018402200320153a008302200320163a008202200320173b018002200320183a00ff01200320093a00fe012003200c3b01fc012003200d3a00fb012003200f3a00fa01200320193b01f8012003201a3a00f701200320063600f3012003201b3a00f2012003201c3b01f00141e4d2c500ad4280808080800184100222022f0000210420022d000221062002280003210720022d00072109200229000821102002102c41b7e4c300ad4280808080800184100222022f0000210c20022d0002210d2002280003210f20022d000721192002290008211d2002102c2003201d3701c806200320193a00c7062003200f3600c3062003200d3a00c2062003200c3b01c006200320103701b806200320093a00b706200320073600b306200320063a00b206200320043b01b006200341a0016a200341b0066a4120109e014200211d024002400240024020032903a801420120032802a00122021b2210200341b0016a290300420020021b221f8450450d004200211e0c010b20034180016a201f4200200a420010e00520034190016a20104200200a420010e005200341f0006a420042002010420010e005024020032903880120032903788442005220034198016a290300221d20032903800120032903707c7c221e201d5472450d004127210241a7c4c10021040c020b200329039001211d0b200341b0026a200341f0016a201d201e410810ac0120032802b0024101470d0120032802b802210220032802b40221040b200e450d062008102c0c060b41102106200341b0026a41106a290300211e20032903b802211d20034190026a41186a201f370300200320103703a0022003200a370398022003200a3703900241e4d2c500ad4280808080800184100222022f0000210720022d000221092002280003210c20022d0007210d2002290008210a2002102c41f4d2c500ad4280808080f00184100222022f0000210f20022d000221192002280003210420022d0007211a200229000821102002102c20032010370390042003201a3a008f04200320044118763a008e04200320044108763b018c04200320043a008b04200320193a008a042003200f3b0188042003200a4238883c0087042003200a4230883c0086042003200a4220883d0184042003200a4218883c0083042003200a4210883c0082042003200a3d0180042003200d3a00ff032003200c3600fb03200320093a00fa03200320073b01f803200341b0066a200341f8036a10e70320032903b006211020032903b806211f20032903c006212020032903c806212120032903d006212220032903d806212320032903e006212420032903e806212520032903f006212620032903f8062127200329038007210a200328028807210d200328028c0721042003280290072107200328029407210f2003280298072109200328029c07210c20032d00a00721022003200341b0066a41f4006a2800003600fb03200320032800a1073602f8030240024020024102470d004201210a200342013703f802200342af013703f00220034287013703e802200342013703e002200342013703d802200342013703d002200342013703c802200342013703c002200342013703b802200342013703b0024100210220034100360288034120210c418080012109418080042107410421040c010b200341b0026a41f4006a20032800fb033600002003200d36028803200320273703f802200320263703f002200320253703e802200320243703e002200320233703d802200320223703d002200320213703c802200320203703c0022003201f3703b802200320103703b002200320032802f8033600a103200f21060b200341b0036a4200370300200341e0036a4200370300200341d0036a4200370300200341c0036a4200370300200320023a00a0032003200c36029c032003200936029803200320063602940320032007360290032003200436028c032003200a370380032003428080e983b1de163703a80320034280a094a58d1d3703d80320034280a094a58d1d3703c80320034280a094a58d1d3703b803200342a08080808080103703e8032003200341b0026a3602f0032003200341b0026a3602f403200341f8046a41186a2204200341f0016a41186a290300370300200341f8046a41106a2206200341f0016a41106a290300370300200341f8046a41086a2207200341f0016a41086a290300370300200320032903f0013703f80441f9e8c500ad4280808080900184100222022f0000210920022d0002210c2002280003210d20022d0007210f2002290008210a2002102c419db1c200ad42808080803084100222022f0000211920022d0002211a2002280003211220022d00072113200229000821102002102c200320103701c806200320133a00c706200320123600c3062003201a3a00c206200320193b01c0062003200a3701b8062003200f3a00b7062003200d3600b3062003200c3a00b206200320093b01b006200341e0006a200341b0066a1098012003290368210a200328026021094191b0c200ad4280808080e00084100222022f0000210c20022d0002210d2002280003210f20022d00072119200229000821102002102c41acb0c200ad4280808080e00084100222022f0000211a20022d000221122002280003211320022d000721142002290008211f2002102c2003201f3701c806200320143a00c706200320133600c306200320123a00c2062003201a3b01c006200320103701b806200320193a00b7062003200f3600b3062003200d3a00b2062003200c3b01b006200341d8006a200341b0066a4120109401200341b0046a4200370300200341f8036a412c6a41c0ecc1003602004101211b200341f8036a41286a410136020020034194046a41d0e1c100360200200341d0046a2007290300370300200341d8046a2006290300370300200341e0046a2004290300370300200341f8036a41206a42003703002003428080808080013703a8042003420037038004200320032903f8043703c80441002118200341003602900420032802582102200328025c21042003200341f4036a3602c0042003200341f0036a3602bc042003200341b0026a3602b80420032004410020021b3602c4042003200a420020091b3703f80320032011360280052003200e3602fc04200320083602f804200341b0066a200341f8036a200b200520034190026a200341d0016a200341f8046a10dd0220032802b0064101470d03200341b0066a41106a28020022114108762139200341bc066a2802002130200341b0066a41086a280200210220032802b406211c410121184101211b0c040b200141216a2d00002116200341e8076a41186a200141196a290000370300200341e8076a41106a200141116a290000370300200341e8076a41086a200141096a290000370300200320012900013703e807200341c8086a41186a2001413a6a290000370300200341c8086a41106a200141326a290000370300200341c8086a41086a2001412a6a2900003703002003200141226a2900003703c808200341b0026a41086a2002411e6a2801003602002003200241166a2901003703b00220022800012106200241156a2d00002107200241146a2d00002108200241126a2f01002109200241116a2d0000210c200241106a2d0000210d2002410e6a2f0100210f2002410d6a2d000021192002410c6a2d0000211a2002410a6a2f01002112200241096a2d00002113200241056a280000210e0240024020022d00002215450d00200e4118762117200e410876211841002114200341b0026a21022006211b0c010b20064118762115200341b0026a410472210241012114200e211b2013210e20122118201a211720192113200f2112200d211a200c21192009210f2008210d2007210c20032f01b002210920032d00b202210820032d00b30221070b2002290100210a200341f8036a41186a200341c8086a41186a290300370300200341f8036a41106a200341c8086a41106a290300370300200341f8036a41086a200341c8086a41086a290300370300200320032903c8083703f80341e6b3c400210441e90021022014450d0c02400240201641ff01714101460d00200641ff01714101470d0e20064108762102410221060c010b200641ff01714102470d0d41002106200329039004210a20032d008f04210720032d008e04210820032f018c04210920032d008b04210c20032d008a04210d20032f018804210f20032d008704211920032d008604211a20032f018404211220032d008304211320032d008204211720032f018004211820032d00ff03210e20032800fb03211b20032d00fa03211520032f01f80321020b2003200a37039005200320073a008f05200320083a008e05200320093b018c052003200c3a008b052003200d3a008a052003200f3b018805200320193a0087052003201a3a008605200320123b018405200320133a008305200320173a008205200320183b0180052003200e3a00ff042003201b3600fb04200320153a00fa04200320023b01f80441002104200341b0026a200341e8076a2006410010e30220032d00b0022102024020032d00b8020d00200341d4026a280200450d00200341d0026a280200102c0b200241ff01714101470d0b200341b0026a200341f8046a42808086bdbacdd21a420010b801024020032802b0024101470d0020032802b802210220032802b40221040c0d0b200341b0026a41106a290300211020032903b8022105418be9c500ad4280808080800184220a100222022f0000210e20022d000221062002280003210720022d000721082002290008210b2002102c41c9b5c000ad4280808080d00184221d100222022f0000210920022d0002210c2002280003210d20022d0007210f2002290008211f2002102c2003201f3701c8062003200f3a00c7062003200d3600c3062003200c3a00c206200320093b01c0062003200b3701b806200320083a00b706200320073600b306200320063a00b2062003200e3b01b006200341b8016a200341b0066a4120109e01200341b8016a41106a290300210b20032903c001211f20032802b801210e200a100222022f0000210620022d000221072002280003210820022d000721092002290008210a2002102c201d100222022f0000210c20022d0002210d2002280003210f20022d000721192002290008211d2002102c2003201d3701c806200320193a00c7062003200f3600c3062003200d3a00c2062003200c3b01c0062003200a3701b806200320093a00b706200320083600b306200320073a00b206200320063b01b0062003427f2010200b4200200e1b220a7c2005201f4200200e1b22107c22052010542202ad7c221020022010200a542010200a511b22021b370380042003427f200520021b3703f803200341b0066aad4280808080800484200341f8036aad428080808080028410010c0b0b1033000b1035000b200341e0066a28020022114108762139200341b0066a412c6a2802002130200341b0066a41286a2802002102200341d4066a280200211c201141ff01710d00200341b0066a41086a20034198046a290300370300200341f8046a41086a200341bc066a28020036020020032003290390043703b006200320032902b4063703f804200341880a6a200341f8046a10f10141002118410021114100211b0b200341f0016a20032903900220032903980220032903a00220034190026a41186a290300201d201e10b90220032802b404210e20032802b0042106200320032802ac0422043602f004200320063602ec04200320043602e80420032004200e41b8016c6a220f3602f4040240200e450d00200341c8086a4101722114200341ef076a2115200341e8076a4102722107200341b0066a41106a2116200341d8066a211320034194076a211a200341f1066a2108200341d1066a2109200341b0066a4101722119200341a8076a2117034020042d0000210e200341f8046a200441016a41b70110db051a02400240200e4103460d002003200e3a00b0062019200341f8046a41b70110db0521060240024002400240200e0e03000102000b20032802b806210d20032802bc06210620032802b406210e2015201641d80010db051a2003410d3a00c8082014200341e8076a41df0010db051a200e2006200341c8086a109201410121064100210c0240200d450d00200e102c0b4100210d0c020b20032f00b106210e20032d00b306210c20032802b406210d20032d00b806211220032900b906210a20032900c106211020032900c9062105200341c8086a201341900110db051a20072006290000370000200741086a200641086a290000370000200741106a200641106a290000370000200741186a200641186a29000037000020034180023b01e807200341d8096a200341c8086a200341e8076a10c102200320032d00e0094102463a00f108200320053700e908200320103700e1082003200a3700d908200320123a00d8082003200d3602d4082003200c3a00d3082003200e3b00d108200341043a00d0082003410d3a00c808410021064101210c41014100200341c8086a1092014100210d0c010b2017290300210a20032903a0072110200341d8096a41186a200641186a290000370300200341d8096a41106a200641106a290000370300200341d8096a41086a200641086a290000370300200320062900003703d809200341e8076a41186a200941186a290000370300200341e8076a41106a200941106a290000370300200341e8076a41086a200941086a290000370300200320092900003703e807200341c8086a41186a200841186a290000370300200341c8086a41106a200841106a290000370300200341c8086a41086a200841086a290000370300200320082900003703c808200341f8096a41086a201a41086a2802003602002003201a2902003703f809200341d8096a200341e8076a200341c8086a2010200a200341f8096a10c6044101210c410121064101210d0b024020032d00b006220e41014b0d0002400240200e0e020001000b200c450d03024020032802b806450d0020032802b406102c0b20032d00c0064105490d0320032802e806450d0320032802e406102c0c030b2006450d0220131092020c020b200d20032802980745720d01200328029407102c0c010b2003200441b8016a3602f0040c020b200441b8016a2204200f470d000b2003200f3602f0040b200341e8046a107202402003280284042204450d0020034188046a280200450d002004102c0b0240201b450d00200341f8036a411c6a2802002104200328029c0421080240024020032802980422060d002004210e0c010b200621072004210e0340200e2802880b210e2007417f6a22070d000b0340200420042f01064102746a41880b6a28020021042006417f6a22060d000b0b200341b0066a411c6a20042f0106360200200341c8066a4100360200200341c4066a2004360200200320083602d006200341003602c006200342003703b8062003200e3602b406200341003602b006200341b0066a10f9010b024020180d0041002104024020020d00410021020c020b201c102c0c010b0240201c0d00410021040c010b02402039410874201141ff017172450d002030102c0b201c21040b41002107410121060c080b410021040b41012107410021060c060b41012107410021062008450d052009102c0c050b02402007450d002009102c0b200341c8086a200a20052010200b201f201e10b9020b4100210841012106410121070c040b410021084101210602402007450d002009102c0b410121070c030b0b41012106410121070b410121080b024020012d0000417e6a220e41024b0d000240024002400240200e0e03000102000b2008450d03200141086a280200450d03200141046a280200102c0c030b20060d010c020b2007450d01200141286a280200450d01200141246a280200102c0c010b2001412c6a280200450d00200141286a280200102c0b2000200236020420002004360200200341900a6a24000b901008087f027e047f017e057f027e017f057e230022042105200441a0016b41607122042400024002400240200141ffffff3f712001470d0020014105742206417f4c0d000240024020060d00410121070c010b2006102a2207450d020b410021084100210602402001450d002001410574210820072106034020062000290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a290000370000200641206a2106200041206a2100200841606a22080d000b200141057441606a41057641016a2106200121080b200420063602102004200836020c2004200736020820072006410041202006676b108903200441e0006a41186a22094200370300200441e0006a41106a220a4200370300200441e0006a41086a220b420037030020044200370360200441286a41086a220841cee5c200ad4280808080b00284220c1002220041086a290000370300200420002900003703282000102c200b200829030037030020042004290328370360200841e1e5c200ad42808080809001841002220041086a290000370300200420002900003703282000102c200a2004290328220d370300200441c0006a41086a220e200b290300370300200441c0006a41106a220f200d370300200441c0006a41186a221020082903003703002004200d3703900120042004290360370340200441e0006a200441c0006a412010d00120042802602200410120001b21112004290264420020001b2212422088a72200450d0220004105742113200441e0006a4114722114200441e0006a4108722115200441c0006a410c722116200441e0006a410c6a2117201121060340200641086a290000210d200641106a2900002118200629000021192009200641186a290000370300200a2018370300200b200d370300200420193703602008200c1002220041086a290000370300200420002900003703282000102c200441186a41086a2201200829030037030020042004290328370318200841f1e5c200ad4280808080e000841002220041086a290000370300200420002900003703282000102c20044190016a41086a220720082903003703002004200429032837039001200441c0006a200441e0006a109f0141c000102a2200450d0220002004290318370000200020042903900137001020002004290040370020200041086a2001290300370000200041186a2007290300370000200041286a200e290000370000200041306a200f290000370000200041386a2010290000370000200441e0006a200041c00010e5032008201741086a290200370300200441286a41106a221a201741106a28020036020020042017290200370328024020042802682201450d002004290360210d20162004290328370200201641086a2008290300370200201641106a201a2802003602002004200d3703400b20042001360248200441003602682004290358211920042004290378221b3703582004290350211c20042004290370221d3703502004290340211e2004200429036022183703402004290348210d20042004290368221f370348201fa7210102400240200da7221a0d00201f210d201d211c201b21190c010b2004201e3703602004200d3703682004201c370370200420193703782004201a201ca74105746a3602342004201a3602302004200d422088a736022c2004201a3602282004200441086a36023820044190016a200441286a108501201541086a200728020036020020152004290390013702002004201c422088a7221a2019422088a74105746a3602342004201a36023020042019a736022c2004201a3602282004200441086a36023820044190016a200441286a108501201441086a200728020036020020142004290390013702002004290368210d20042903602118200429037821192004290370211c02402001450d00201ba721070240201f422088a7450d002001102c0b2007450d00201d422088a7102c0b200420183703402004200d3703482004201c37035020042019370358200da721010b200420183703602004200d3703682004201c370370200da72107200420193703780240024020010d002000ad428080808080088410050c010b200441c00036022c20042000360228200441e0006a200441286a10fd030b02402007450d002019a721010240200d422088a7450d002007102c0b2001450d00201c422088a7102c0b200641206a21062000102c201341606a22130d000c030b0b103a000b1033000b02402012a7450d002011102c0b200441c0006a41186a4200370300200441c0006a41106a22014200370300200441c0006a41086a2206420037030020044200370340200441286a41086a220041cee5c200ad4280808080b002841002220841086a290000370300200420082900003703282008102c2006200029030037030020042004290328220d3703182004200d370340200041eae5c200ad4280808080f000841002220841086a290000370300200420082900003703282008102c20012004290328220d370300200441e0006a41086a2006290300370300200441e0006a41106a200d370300200441e0006a41186a20002903003703002004200d370390012004200429034037036020044100360248200442013703402003200441c0006a106702402003450d002003410574210003402002200441c0006a109101200241206a2102200041606a22000d000b0b20042802442100200441e0006aad4280808080800484200435024842208620042802402206ad84100102402000450d002006102c0b0240200428020c450d002004280208102c0b200524000bf71405177f017e017f027e047f230041206b220224000240024020014115490d00024002402001410176220341ffffff3f712003470d0020034105742204417f4c0d0041012105024002402004450d002004102a2205450d010b200041606a2106200041a07f6a210741002108410021094104210a4100210b2001210c034002400240200c220d417f6a220e0d004101210f4100210c0c010b0240024002400240024002402000200e4105746a200d410574221020006a41406a412010dd054100480d004102200d6b210e200720106a21044101210f03400240200e200f6a4101470d004100210c200d210f0c080b200f41016a210f200441206a2004412010dd052111200441606a21042011417f4a0d000b200d200f6b210e0c010b200720106a2104024003400240200e4101470d004100210e0c020b200e417f6a210e200441206a2004412010dd052111200441606a210420114100480d000b0b200d200e490d01200d20014b0d03200d200e6b220f4101762212450d00200620106a21042000200e4105746a21110340200241186a2210201141186a2213290000370300200241106a2214201141106a2215290000370300200241086a2216201141086a221729000037030020022011290000370300200441086a22182900002119200441106a221a290000211b200441186a220c290000211c201120042900003700002013201c3700002015201b37000020172019370000200c2010290300370000201a20142903003700002018201629030037000020042002290300370000200441606a2104201141206a21112012417f6a22120d000b0b0240200e0d00200e210c0c050b0240200f41094d0d00200e210c0c050b200d20014b0d01200d200e6b21122000200e4105746a21100340200d200e417f6a220c490d040240200d200c6b220f4102490d002000200e4105746a22042000200c4105746a220e412010dd05417f4a0d00200e2900002119200e2004290000370000200241186a2216200e41186a2211290000370300200241106a2217200e41106a2213290000370300200241086a2218200e41086a22142900003703002014200441086a2900003700002013200441106a2900003700002011200441186a29000037000020022019370300410121150240200f4103490d00200e41c0006a2002412010dd05417f4a0d00410221112010210402400340200441186a200441386a290000370000200441106a200441306a290000370000200441086a200441286a2900003700002004200441206a221329000037000020122011460d01200441c0006a21142011211520132104201141016a211120142002412010dd05417f4a0d020c000b0b201121150b200e20154105746a22042002290300370000200441186a2016290300370000200441106a2017290300370000200441086a20182903003700000b200c450d05201041606a2110201241016a2112200c210e200f410a4f0d050c000b0b200e200d1047000b200d200e417f6a220c490d010b200d2001103f000b200c200d1047000b0240200b2009470d0002400240200941016a22042009490d00200941017422112004201120044b1b220441ffffffff01712004470d002004410374221141004e0d010b1035000b0240024020090d002011102a210a0c010b200a20094103742011102e210a0b200a450d02200421092008210b0b200a200b4103746a2204200f3602042004200c360200200841016a220b21080240200b4102490d00024003400240024002400240200a200b417f6a22084103746a2204280200450d00200b410374200a6a220f41746a280200220e200428020422114d0d000240200b41024b0d00200b21084102210b200c450d0b0c080b200a200b417d6a22164103746a28020422042011200e6a4d0d010240200b41034b0d00200b21084103210b200c450d0b0c080b200f41646a2802002004200e6a4d0d01200b21080c060b200b4103490d0120042802042111200a200b417d6a22164103746a28020421040b20042011490d010b200b417e6a21160b024002400240024002400240200b201641016a221d4b221e450d00200b20164b221f450d01200a20164103746a2217280204222020172802006a2204200a201d4103746a2218280200221a490d02200420014b0d032000201a4105746a22142018280204221541057422116a210f2004410574210e2004201a6b220d20156b220420154f0d042005200f2004410574221110db05221320116a21120240024020154101480d00200441014e0d010b200f2104201321110c060b2006200e6a210e200f21040340200e200441606a220f201241606a220d200d200f412010dd0541004822101b2211290000370000200e41186a201141186a290000370000200e41106a201141106a290000370000200e41086a201141086a2900003700002012200d20101b211202402014200f200420101b2204490d00201321110c070b200e41606a210e2013211120132012490d000c060b0b41d087c600201d200b1038000b41d087c6002016200b1038000b201a20041047000b20042001103f000b20052014201110db05221320116a21120240024020154101480d00200d20154a0d010b20142104201321110c010b2000200e6a2110201321112014210403402004200f2011200f2011412010dd05410048220d1b220e290000370000200441186a200e41186a290000370000200441106a200e41106a290000370000200441086a200e41086a2900003700002011201141206a200d1b2111200441206a2104200f41206a200f200d1b220f20104f0d01201220114b0d000b0b20042011201220116b41607110db051a0240201f450d002017201a360200201741046a202020156a360200201e450d022018201841086a200b201d417f736a41037410dc051a2008210b200841014d0d030c010b0b41a888c6002016200b1038000b418ab4c000411d41acfec5001036000b200c450d030c000b0b1033000b103a000b02402009450d00200a102c0b2003450d012005102c0c010b20014102490d002001417f6a2111200141057420006a41206a2110410121120340024002400240024020112204417f6a221120014b0d00200120116b220e4102490d03200020044105746a2204200020114105746a220d412010dd05417f4a0d03200d2900002119200d2004290000370000200241186a2214200d41186a220f290000370300200241106a220b200d41106a2213290000370300200241086a2215200d41086a220a290000370300200a200441086a2900003700002013200441106a290000370000200f200441186a2900003700002002201937030041012104200e4103490d02200d41c0006a2002412010dd05417f4a0d0241002113201021040340200441406a220e200441606a220f290000370000200e41186a200f41186a290000370000200e41106a200f41106a290000370000200e41086a200f41086a29000037000020122013220e460d02200e417f6a211320042002412010dd05210f200441206a2104200f417f4a0d020c000b0b201120011047000b4102200e6b21040b200d20044105746a22042002290300370000200441186a2014290300370000200441106a200b290300370000200441086a20152903003700000b201041606a21102012417f6a211220110d000b0b200241206a24000ba00901177f230041206b220424002002410020031b21052000410020011b2106200241206a200220031b2107200041206a200020011b2108200020014105746a2109200220034105746a210a4100210b4100210c4101210d4100210e4100210f41012110024002400340200b4101742111200b41057421120240024002400340024020050d0020072113200d2114200c2115200b21160c020b2005210220072103200d2114200c2115200b2116201221172011211802400340024002402006450d0020022006460d0320022006412010dd052213450d032013417f4c0d01200321072014210d2015210c2016210b200221050c060b200441186a2203200541186a290000370300200441106a2216200541106a290000370300200441086a2206200541086a290000370300200420052900003703000240200b200c470d00200b41016a2202200b490d0a200b41017422172002201720024b1b220c41ffffff3f71200c470d0a200c41057422024100480d0a02400240200b0d002002102a210d0c010b200d200b4105742002102e210d0b200d450d090b200d200b4105746a22022004290300370000200241186a2003290300370000200241106a2016290300370000200241086a200629030037000041002106410020072007200a4622021b2105201141026a2111201241206a2112200b41016a210b2007200741206a20021b21070c030b200441186a2213200241186a290000370300200441106a2219200241106a290000370300200441086a221a200241086a29000037030020042002290000370300024020162015470d00201641016a22022016490d0920182002201820024b1b221541ffffff3f712015470d09201541057422024100480d090240024020160d002002102a21140c010b201420172002102e21140b2014450d080b201420176a22022004290300370000200241186a2013290300370000200241106a2019290300370000200241086a201a290300370000410020032003200a4622131b2102201841026a2118201741206a2117201641016a21162003200341206a20131b221321032002450d030c000b0b0b2014210d2015210c2016210b2003200341206a2003200a4622021b210741002008200820094622161b21064100200320021b21052008200841206a20161b21080c030b410021052006450d01201321072014210d2015210c2016210b0b200441186a2203200641186a290000370300200441106a2216200641106a290000370300200441086a2217200641086a290000370300200420062900003703000240200e200f470d00200e41016a2202200e490d04200e41017422062002200620024b1b220f41ffffff3f71200f470d04200f41057422024100480d0402400240200e0d002002102a21100c010b2010200e4105742002102e21100b2010450d030b2010200e4105746a22022004290300370000200241186a2003290300370000200241106a2016290300370000200241086a201729030037000041002008200820094622021b2106200e41016a210e2008200841206a20021b21080c010b0b201420162000200110f30202402015450d002014102c0b0240200f450d002010102c0b200441206a24000f0b1033000b1035000b896a07067f017e017f027e0f7f027e097f230041e0046b220324000240024002400240024002400240024002400240024002400240024002400240024020012d000022040e050001020304000b200341c4026a4101360200200342013702b402200341fcc4c5003602b002200341043602c403200341f4c4c5003602c0032003200341c0036a3602c002200341b0026a4184c5c5001041000b200141086a2802002104200141046a2802002105024020022d000120022d000072450d004111210241b2b2c00021062004450d0f2005102c0c0f0b20052001410c6a280200220210f402200341b0026a41186a22074200370300200341b0026a41106a22014200370300200341b0026a41086a22084200370300200342003703b002200341d0046a41086a220641cee5c200ad4280808080b0028422091002220a41086a2900003703002003200a2900003703d004200a102c20082006290300370300200320032903d0043703b002200641eae5c200ad4280808080f00084220b1002220a41086a2900003703002003200a2900003703d004200a102c200120032903d004220c370300200341c0036a41086a2008290300370300200341c0036a41106a200c370300200341c0036a41186a20062903003703002003200c370340200320032903b0023703c003200341b0026a200341c0036a412010d0012005200220032802b0022206410120061b220820032902b402420020061b220c422088a710f5020240200ca7450d002008102c0b2007420037030020014200370300200341b0026a41086a22084200370300200342003703b002200341d0046a41086a220620091002220a41086a2900003703002003200a2900003703d004200a102c20082006290300370300200320032903d004220c3703602003200c3703b0022006200b1002220a41086a2900003703002003200a2900003703d004200a102c200120032903d004220c370300200341c0006a41086a2008290300370300200341c0006a41106a200c370300200341c0006a41186a20062903003703002003200c370370200320032903b002370340200341003602b802200342013703b0022002200341b0026a106702402002450d00200241057421012005210203402002200341b0026a109101200241206a2102200141606a22010d000b0b20032802b4022102200341c0006aad428080808080048420033502b80242208620032802b0022201ad84100102402002450d002001102c0b4100210602402004450d002005102c0b0c0e0b200141046a28020021072002411a6a290100210c200241196a2d00002105200241186a2d00002108200241166a2f0100210a200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d000021132002410c6a2d000021142002410a6a2f01002115200241096a2d00002116200241046a2d0000211741022106200241026a2f010021180240024020022d00000d0020022d00014101470d00200241056a2d00002106200241066a2f01002119200241086a2d000021024100211a0c010b4101211a41002102410021190b2003200c3703c802200320053a00c702200320083a00c6022003200a3b01c4022003200d3a00c3022003200e3a00c2022003200f3b01c002200320103a00bf02200320113a00be02200320123b01bc02200320133a00bb02200320143a00ba02200320153b01b802200320163a00b702200320173a00b202200320183b01b0022003201941ffff0371410874200241187472200641ff01717222053600b3020240201a450d0041d6b2c0002106410f2102024002400240024020050e050001020310000b20032800b702210620032800bb0221020c0f0b41dd8cc6002106410e21020c0e0b41c3b2c0002106411321020c0d0b41b2b2c0002106411121020c0c0b20034180016a41186a200341b0026a41186a220629030037030020034180016a41106a200341b0026a41106a220529030037030020034180016a41086a200341b0026a41086a2202290300370300200320032903b00237038001200642003703002005420037030020024200370300200342003703b002200341d0046a41086a220641cee5c200ad4280808080b002841002220841086a290000370300200320082900003703d0042008102c20022006290300370300200320032903d0043703b002200641eae5c200ad4280808080f000841002220841086a290000370300200320082900003703d0042008102c200520032903d004220c370300200341c0036a41086a2002290300370300200341c0036a41106a200c370300200341c0036a41186a20062903003703002003200c370340200320032903b0023703c003200341b0026a200341c0036a412010d00120032902b402420020032802b00222021b220c422088a741057421062002410120021b220a210202400340024020060d00410021080c020b4101210820034180016a2002460d01200641606a2106200220034180016a412010dd052105200241206a210220050d000b0b0240200ca7450d00200a102c0b024020080d0041a0f7c2002106411521020c0c0b4100210a200341003602b802200342013703b0022007200341b0026a108b0120032802b4022106200341b0026a41186a220520033502b80242208620032802b002220fad841006220241186a290000370300200341b0026a41106a2208200241106a290000370300200341b0026a41086a220d200241086a290000370300200320022900003703b0022002102c200341a0016a41186a22022005290300370300200341a0016a41106a22052008290300370300200341a0016a41086a220e200d290300370300200320032903b0023703a00102402006450d00200f102c0b200341b0026a200741900110db051a200341c0036a410d6a20034180016a41086a290300370000200341c0036a41156a20034180016a41106a290300370000200341c0036a411d6a20034180016a41186a29030037000041012108200341013a00c40320032003290380013700c503200341023a00c003200341c0006a200341b0026a200341c0036a10c10220032d00482106200341b0026a410d6a200e290300370000200341b0026a41156a2005290300370000200341b0026a411d6a2002290300370000200341d5026a20064102463a0000200341053a00b402200341083a00b002200320032903a0013700b50241014100200341b0026a1092012007102c410021060c0c0b200141086a2802002107200141046a280200211b2002411a6a290100210c200241196a2d00002112200241186a2d00002113200241166a2f01002114200241156a2d00002115200241146a2d00002116200241126a2f01002117200241116a2d00002118200241106a2d0000210a2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241046a2d0000211941022106200241026a2f0100211a0240024020022d00000d0020022d00014101470d00200241056a2d00002106200241066a2f01002105200241086a2d00002102410021080c010b4101210841002105410021020b200541ffff0371410874200641ff017172200241187472210502402008450d0041d6b2c0002106410f2102024002400240024020050e05000102030e000b2010410874201172200f411874722106200d410874200e72200a4118747221020c0d0b41dd8cc6002106410e21020c0c0b41c3b2c0002106411321020c0b0b41b2b2c0002106411121020c0a0b2003200c37039801200320123a009701200320133a009601200320143b019401200320153a009301200320163a009201200320173b019001200320183a008f012003200a3a008e012003200d3b018c012003200e3a008b012003200f3a008a01200320103b018801200320113a0087012003200536008301200320193a0082012003201a3b018001200341b0026a41186a4200370300200341b0026a41106a220a4200370300200341b0026a41086a22064200370300200342003703b002200341d0046a41086a220241cee5c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220541086a290000370300200320052900003703d0042005102c200a20032903d004220c370300200341c0036a41086a2006290300370300200341c0036a41106a200c370300200341c0036a41186a20022903003703002003200c370340200320032903b0023703c003200341b0026a200341c0036a412010d00120032902b402420020032802b00222021b220c422088a741057421062002410120021b220d210202400340024020060d00410021080c020b4101210820034180016a2002460d01200641606a2106200220034180016a412010dd052105200241206a210220050d000b0b0240200ca7450d00200d102c0b024020080d0041a0f7c2002106411521020c0a0b200341003602b802200342013703b0022007200341b0026a108b0120032802b402210d200341b0026a41186a220620033502b80242208620032802b0022210ad841006220241186a290000370300200341b0026a41106a2205200241106a290000370300200341b0026a41086a2208200241086a290000370300200320022900003703b0022002102c200341a0016a41186a22022006290300370300200341a0016a41106a220e2005290300370300200341a0016a41086a220f2008290300370300200320032903b0023703a0010240200d450d002010102c0b200620022903003703002005200e2903003703002008200f290300370300200320032903a0013703b002200341d0046a41086a220241cee5c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a2002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a2002290300370300200320032903d004370370200341c0006a200341b0026a109f0141c000102a2202450d0120022003290360370000200241086a200341e0006a41086a29030037000020022003290370370010200241186a200341f0006a41086a29030037000020022003290340370020200241286a200341c0006a41086a290300370000200241306a200341d0006a290300370000200241386a200341c0006a41186a290300370000200341186a200241c000410141004100109701200328021821062002102c20064101460d0202400240201b4102490d0042002109200341c0006a41186a220e4200370300200341c0006a41106a220f4200370300200341c0006a41086a2206420037030020034200370340200341d0046a41086a220241cee5c200ad4280808080b00284220c1002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d004220b3703602003200b370340200241ace9c500ad4280808080d00184220b1002220541086a290000370300200320052900003703d0042005102c200f20032903d004221c370300200341b0026a41086a22052006290300370300200341b0026a41106a2208201c370300200341b0026a41186a220d20022903003703002003201c370370200320032903403703b002200341106a200341b0026a41201094012003280214211120032802102112200e4200370300200f420037030020064200370300200342003703402002200c1002221041086a290000370300200320102900003703d0042010102c20062002290300370300200320032903d004221c3703602003201c3703402002200b1002221041086a290000370300200320102900003703d0042010102c200e2002290300221c37030020052006290300370300200820032903d004221d370300200d201c3703002003201d370370200320032903403703b002200341086a200341b0026a412010940120032802082110200328020c2113200e4200370300200f420037030020064200370300200342003703402002200c1002220f41086a2900003703002003200f2900003703d004200f102c20062002290300370300200320032903d004221c3703602003201c3703402002200b1002220f41086a2900003703002003200f2900003703d004200f102c200e2002290300220b37030020052006290300370300200820032903d004221c370300200d200b3703002003201c370370200320032903403703b0024101210e2003201341016a410120101b3602c003200341b0026aad4280808080800484200341c0036aad4280808080c000841001200d42003703002008420037030020054200370300200342003703b0022002200c1002220f41086a2900003703002003200f2900003703d004200f102c20052002290300370300200320032903d0043703b002200241e1e5c200ad42808080809001841002220f41086a2900003703002003200f2900003703d004200f102c20062002290300220c370300200320032903d004220b370340200a200b370000200a41086a200c370000200341c0036a41086a2005290300370300200341c0036a41106a2008290300370300200341c0036a41186a200d290300370300200320032903b0023703c003200341b0026a200341c0036a412010d0010240024020032802b002220a0d0041002106410021020c010b20032902b4022209422088a721022009a72106200a210e0b200d200341a0016a41186a2903003703002008200341a0016a41106a2903003703002005200341a0016a41086a290300370300200320032903a0013703b0020240024020022006460d002006210d0c010b024020062009a7220d470d00200641016a22022006490d08200641017422052002200520024b1b220d41ffffff3f71200d470d08200d41057422024100480d080240024020060d002002102a210e0c010b200e20064105742002102e210e0b200e450d0520094280808080708321090b2009422088a721020b200e20024105746a220620032903b002370000200641186a200341b0026a41186a2205290300370000200641106a200341b0026a41106a2208290300370000200641086a200341b0026a41086a2206290300370000200542003703002008420037030020064200370300200342003703b002200341d0046a41086a220541cee5c200ad4280808080b002841002220a41086a2900003703002003200a2900003703d004200a102c20062005290300370300200320032903d004220c3703602003200c3703b002200541e1e5c200ad42808080809001841002220a41086a2900003703002003200a2900003703d004200a102c200820032903d004220c370300200341c0006a41086a2006290300370300200341c0006a41106a200c370300200341c0006a41186a20052903003703002003200c370370200320032903b00237034002400240200e0d00200341c0006aad428080808080048410050c010b200341003602b802200342013703b002200241016a2206200341b0026a106702402006450d00200241057441206a2106200e210203402003200341b0026a3602c0032002200341c0036a109402200241206a2102200641606a22060d000b0b20032802b4022102200341c0006aad428080808080048420033502b80242208620032802b0022206ad84100102402002450d002006102c0b200d450d00200e102c0b200341b0026a200741900110db051a200341c0036a41186a200341a0016a41186a290300370300200341c0036a41106a200341a0016a41106a290300370300200341c0036a41086a200341a0016a41086a290300370300200320032903a0013703c003200341d0046a41086a220241cee5c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22052002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22062002290300370300200320032903d004370370200341c0006a200341c0036a109f0141c000102a2202450d0320022003290360370000200241086a200529030037000020022003290370370010200241186a200629030037000020022003290340370020200241286a200341c0006a41086a290300370000200241306a200341c0006a41106a290300370000200241386a200341c0006a41186a290300370000200341003602c803200342013703c003200341b0026a200341c0036a108b0120032802c40321062002ad428080808080088420033502c80342208620032802c0032205ad84100102402006450d002005102c0b2002102c200341b0026a1092024120102a2206450d032006200329038001370000200641186a20034180016a41186a2208290300370000200641106a20034180016a41106a220a290300370000200641086a20034180016a41086a220d290300370000200341dc036a4100360200200341cc036a428180808010370200200342013702d403200320063602c8032003201b3602c40320032011410020121b220e3602c003200341b0026a41186a200341a0016a41186a220f290300370300200341b0026a41106a200341a0016a41106a2210290300370300200341b0026a41086a200341a0016a41086a2211290300370300200320032903a0013703b002200341d0046a41086a220241cee5c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c200341e0006a41086a22122002290300370300200320032903d004370360200241f1e5c200ad4280808080e000841002220541086a290000370300200320052900003703d0042005102c200341f0006a41086a22052002290300370300200320032903d004370370200341c0006a200341b0026a109f0141c000102a2202450d0320022003290360370000200241086a201229030037000020022003290370370010200241186a200529030037000020022003290340370020200241286a200341c0006a41086a290300370000200241306a200341c0006a41106a290300370000200241386a200341c0006a41186a290300370000200341c0003602b402200320023602b002200341c0036a200341b0026a10fd032002102c2006102c200341bd026a200d290300370000200341c5026a200a290300370000200341cd026a2008290300370000200341d5026a20032903a001370000200341dd026a2011290300370000200341e5026a2010290300370000200341ed026a200f290300370000200341fc026a201b360200200341f8026a200e360200200341003a00b402200341083a00b00220032003290380013700b502200341b0026a21020c010b200341b0026a41186a22084200370300200341b0026a41106a220d4200370300200341b0026a41086a22064200370300200342003703b002200341d0046a41086a220241cee5c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220541086a290000370300200320052900003703d0042005102c200341c0006a41086a2002290300220c370300200320032903d0042209370340200a2009370000200a41086a200c370000200341c0036a41086a2006290300370300200341c0036a41106a200d290300370300200341c0036a41186a2008290300370300200320032903b0023703c003200341206a200341c0036a412010d00102400240200328022022060d00410021020c010b2003290224220c422088a72102200ca7450d002006102c0b200341b0026a200741900110db051a200341cc036a2002360200200341c0036a41086a4101360200200341003a00c403200341023a00c003200341c0006a200341b0026a200341c0036a10c10220032d00482102200341bd026a200341a0016a41086a290300370000200341c5026a200341b0016a290300370000200341cd026a200341b8016a290300370000200341d5026a20024102463a0000200341043a00b402200341083a00b002200320032903a0013700b502200341b0026a21020b410021084101210a4101410020021092012007102c410021060c0b0b200141216a2d0000211b200141246a280200211a200341206a41186a200141196a290000370300200341206a41106a200141116a290000370300200341206a41086a200141096a290000370300200320012900013703202002411a6a290100210c200241196a2d00002111200241186a2d00002112200241166a2f01002113200241156a2d00002114200241146a2d00002115200241126a2f01002116200241116a2d00002117200241106a2d0000210a2002410e6a2f010021072002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241046a2d0000211841022106200241026a2f010021190240024020022d00000d0020022d00014101470d00200241056a2d00002106200241066a2f01002105200241086a2d00002102410021080c010b4101210841002105410021020b200541ffff0371410874200641ff017172200241187472210502402008450d0041d6b2c0002106410f2102024002400240024020050e05000102030c000b200f410874201072200e4118747221062007410874200d72200a4118747221020c0b0b41dd8cc6002106410e21020c0a0b41c3b2c0002106411321020c090b41b2b2c0002106411121020c080b2003200c37039801200320113a009701200320123a009601200320133b019401200320143a009301200320153a009201200320163b019001200320173a008f012003200a3a008e01200320073b018c012003200d3a008b012003200e3a008a012003200f3b018801200320103a0087012003200536008301200320183a008201200320193b018001200341b0026a41186a4200370300200341b0026a41106a22074200370300200341b0026a41086a22064200370300200342003703b002200341d0046a41086a220241cee5c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220541086a290000370300200320052900003703d0042005102c200720032903d004220c370300200341c0036a41086a2006290300370300200341c0036a41106a200c370300200341c0036a41186a20022903003703002003200c370340200320032903b0023703c003200341b0026a200341c0036a412010d00120032902b402420020032802b00222021b220c422088a741057421062002410120021b220a210202400340024020060d00410021080c020b4101210820034180016a2002460d01200641606a2106200220034180016a412010dd052105200241206a210220050d000b0b0240200ca7450d00200a102c0b024020080d00418df8c2002106411221020c080b200341d0046a41086a220241cee5c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22052002290300370300200320032903d004370360200241f1e5c200ad4280808080e000841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22082002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2206450d0020062003290360370000200641086a200529030037000020062003290370370010200641186a200829030037000020062003290040370020200641286a200341c0006a41086a29000037000041102102200641306a200341c0006a41106a290000370000200641386a200341c0006a41186a290000370000200341b0026a200641c00010e503200341cc026a2802002113200341b0026a41186a2802002111200341c4026a280200210a200341b0026a41106a280200211020032802bc02211220032802b802210f20032802b402211420032802b00221052006102c0240200f0d0041d4f7c2002106411321020c080b41e7f7c20021062005201a470d06201041057421064100211541002105200f21020240024003402006450d0220034180016a2002460d01200541016a2105200641606a2106200220034180016a412010dd052108200241206a210220080d000b20084541016a41017120056a417f6a21050b410121150b2013410574210d20034180016a200a6b210e410021164100210641002102024002400340200d2002460d02200e2002460d01200641016a2106200a20026a2108200241206a2102200820034180016a412010dd0522080d000b20084541016a41017120066a417f6a21060b410121160b024002400240201b41ff01710d002016450d010c080b20150d07200341b0026a41186a220820034180016a41186a290300370300200341b0026a41106a220d20034180016a41106a290300370300200341b0026a41086a220e20034180016a41086a29030037030020032003290380013703b0020240024020102012460d0020122105201021120c010b201241016a22022012490d06201241017422052002200520024b1b220541ffffff3f712005470d06200541057422024100480d060240024020120d002002102a210f0c010b200f20124105742002102e210f0b200f450d030b200f20124105746a220220032903b002370000200241186a2008290300370000200241106a200d290300370000200241086a200e290300370000201041016a21102016450d01201320064d0d04200a2013417f6a22134105746a2202290000210c200229000821092002290010210b200a20064105746a220641186a200241186a2900003700002006200b370010200620093700082006200c3700000c010b200329039801210c20032d009701210820032d009601210d20032f019401210e20032d009301211620032d009201211720032f019001211820032d008f01211920032d008e01211e20032f018c01211f20032d008b01212020032d008a01212120032f018801212220032d0087012123200328008301212420032d008201212520032f01800121260240024020132011460d0020112106201321110c010b201141016a22022011490d05201141017422062002200620024b1b220641ffffff3f712006470d05200641057422024100480d050240024020110d002002102a210a0c010b200a20114105742002102e210a0b200a450d020b200a20114105746a2202200c370018200220083a00172002200d3a00162002200e3b0014200220163a0013200220173a0012200220183b0010200220193a000f2002201e3a000e2002201f3b000c200220203a000b200220213a000a200220223b0008200220233a000720022024360003200220253a0002200220263b0000201341016a211302402015450d00201020054d0d06200f2010417f6a22104105746a2202290000210c200229000821092002290010210b200f20054105746a220541186a200241186a2900003700002005200b370010200520093700082005200c3700000b20062111201221050b200341d5026a2003290320370000200341c5026a20034180016a41106a290300370000200341cd026a20034180016a41186a290300370000200341e5026a200341206a41106a290300370000200341ed026a200341206a41186a290300370000200341083a00b002200341bd026a20034180016a41086a290300370000200341dd026a200341206a41086a290300370000200341013a00b40220032003290380013700b502200341fc026a2013360200200341f8026a2010360200200341f5026a201b3a00004100210641014100200341b0026a109201200341b0026a41186a220e4200370300200341b0026a41106a22124200370300200341b0026a41086a22084200370300200342003703b002200341d0046a41086a220241cee5c200ad4280808080b002841002220d41086a2900003703002003200d2900003703d004200d102c20082002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220d41086a2900003703002003200d2900003703d004200d102c200341c0006a41086a2002290300220c370300200320032903d004220937034020072009370000200741086a200c370000200341c0036a41086a2008290300370300200341c0036a41106a2012290300370300200341c0036a41186a200e290300370300200320032903b0023703c003200341a0016a200341c0036a412010d001024020032802a0012202450d0020032902a401220c422088a72106200ca7450d002002102c0b02400240201020144f22020d004100200620136b2208200820064b1b2014490d00200341cc026a2013360200200341b0026a41186a2011360200200341b0026a41106a2010360200200341bc026a20053602002003200a3602c4022003200f3602b802200320143602b4022003201a3602b002200341d0046a41086a220241cee5c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22082002290300370300200320032903d004370360200241f1e5c200ad4280808080e000841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22062002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0220022003290360370000200241086a200829030037000020022003290370370010200241186a200629030037000020022003290040370020200241286a200341c0006a41086a290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a290000370000200341c0003602c403200320023602c003200341b0026a200341c0036a10fd032002102c02402005450d00200f102c0b02402011450d00200a102c0b410021060c010b0240024020020d00200341d0046a41086a220241cee5c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22082002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22062002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0320022003290360370000200241086a200829030037000020022003290370370010200241186a200629030037000020022003290040370020200241286a200341c0006a41086a290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a2900003700002002ad428080808080088410052002102c200341bd026a200341206a41086a290300370000200341c5026a200341206a41106a290300370000200341cd026a200341206a41186a290300370000200341033a00b402200341083a00b002200320032903203700b50241014100200341b0026a1092010c010b200341c5026a200341206a41106a290300370000200341cd026a200341206a41186a290300370000200341083a00b002200341bd026a200341206a41086a290300370000200341023a00b402200320032903203700b50241014100200341b0026a109201200341d0046a41086a220241cee5c200ad4280808080b002841002220841086a290000370300200320082900003703d0042008102c200341e0006a41086a220d2002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220841086a290000370300200320082900003703d0042008102c200341f0006a41086a22082002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0220022003290360370000200241086a200d29030037000020022003290370370010200241186a200829030037000020022003290040370020200241286a200341c0006a41086a290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a290000370000200341b0026a200241c00010f40320032802b0022108200341c0036a200341b0026a410472220d418c0110db051a024020084118470d002002102c0c010b200341a0016a200341c0036a418c0110db051a2002102c200320083602b002200d200341a0016a418c0110db051a200341cc036a2006360200200341c0036a41086a2014360200200341003a00c403200341023a00c003200341c0006a200341b0026a200341c0036a10c10220032d00482102200341bd026a200341206a41086a290300370000200341c5026a200341306a290300370000200341cd026a200341386a290300370000200341d5026a20024102463a0000200341043a00b402200341083a00b002200320032903203700b50241014100200341b0026a1092010b200341d0046a41086a220641cee5c200ad4280808080b00284220c1002220241086a290000370300200320022900003703d0042002102c200341e0006a41086a22082006290300370300200320032903d004370360200641f1e5c200ad4280808080e000841002220241086a290000370300200320022900003703d0042002102c200341f0006a41086a220d2006290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0120022003290360370000200241086a200829030037000020022003290370370010200241186a200d29030037000020022003290040370020200241286a200341c0006a41086a220d290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a2900003700002002ad428080808080088410052002102c200341b0026a41186a220e4200370300200341b0026a41106a22104200370300200341b0026a41086a22024200370300200342003703b0022006200c1002220841086a290000370300200320082900003703d0042008102c20022006290300370300200320032903d0043703b002200641e1e5c200ad42808080809001841002220841086a290000370300200320082900003703d0042008102c200d2006290300220c370300200320032903d004220937034020072009370000200741086a200c370000200341c0036a41086a2002290300370300200341c0036a41106a2010290300370300200341c0036a41186a200e290300370300200320032903b0023703c003200341b0026a200341c0036a412010d0010240024020032802b0022202450d00200320032902b4023702a401200320023602a0010c010b200341003602a801200342013703a0010b200341a0016a200341206a107a20032802a801210d20032802a401211020032802a0012107200341c0006a41186a4200370300200341c0006a41106a220e4200370300200341c0006a41086a2206420037030020034200370340200341d0046a41086a220241cee5c200ad4280808080b002841002220841086a290000370300200320082900003703d0042008102c20062002290300370300200320032903d004220c3703602003200c370340200241e1e5c200ad42808080809001841002220841086a290000370300200320082900003703d0042008102c200e20032903d004220c370300200341b0026a41086a2006290300370300200341b0026a41106a200c370300200341b0026a41186a20022903003703002003200c370370200320032903403703b0020240024020070d00200341b0026aad428080808080048410050c010b200341003602c803200342013703c003200d200341c0036a10670240200d450d00200d41057421062007210203402003200341c0036a3602402002200341c0006a109402200241206a2102200641606a22060d000b0b20032802c4032102200341b0026aad428080808080048420033502c80342208620032802c0032206ad84100102402002450d002006102c0b2010450d002007102c0b02402005450d00200f102c0b410021062011450d00200a102c0b0c070b1033000b41b5f7c2002106411f21020c060b41a888c600200620131038000b1035000b41a888c600200520101038000b41f7f7c2002106411621020b02402012450d00200f102c0b2011450d00200a102c0b4101210a410121080c020b20071092022007102c410021084101210a0c010b20071092022007102c410121084100210a0b2004417f6a220541024b0d0002400240024020050e03000102000b200141086a280200450d02200141046a280200102c0c020b200a450d01200141046a28020022011092022001102c0c010b2008450d00200141086a28020022011092022001102c0b2000200236020420002006360200200341e0046a24000bf46a05067f017e107f047e097f230041e0046b220324000240024002400240024002400240024002400240024002400240024002400240024020012d000022040e050001020304000b200341c4026a4101360200200342013702b402200341fcc4c5003602b002200341043602c403200341f4c4c5003602c0032003200341c0036a3602c002200341b0026a4184c5c5001041000b200141086a2802002104200141046a2802002105024020022d000120022d000072450d004111210241b2b2c00021062004450d0f2005102c0c0f0b20052001410c6a280200220210f402200341b0026a41186a4200370300200341b0026a41106a22064200370300200341b0026a41086a22074200370300200342003703b002200341d0046a41086a220141fde7c200ad4280808080b002841002220841086a290000370300200320082900003703d0042008102c20072001290300370300200320032903d0043703b002200141eae5c200ad4280808080f000841002220841086a290000370300200320082900003703d0042008102c200620032903d0042209370300200341c0036a41086a2007290300370300200341c0036a41106a2009370300200341c0036a41186a200129030037030020032009370340200320032903b0023703c003200341b0026a200341c0036a412010d001200341b0026a2005200220032802b0022201410120011b220720032902b402420020011b2209422088a710dc012006280200210120032802b402210620032802b002210820032802bc02220a200341c4026a2802002005200210dd0102402001450d00200a102c0b02402006450d002008102c0b02402009a7450d002007102c0b200341b0026a41186a4200370300200341b0026a41106a22084200370300200341b0026a41086a22064200370300200342003703b002200341d0046a41086a220141fde7c200ad4280808080b002841002220741086a290000370300200320072900003703d0042007102c20062001290300370300200320032903d0042209370360200320093703b002200141eae5c200ad4280808080f000841002220741086a290000370300200320072900003703d0042007102c200820032903d0042209370300200341c0006a41086a2006290300370300200341c0006a41106a2009370300200341c0006a41186a200129030037030020032009370370200320032903b002370340200341003602b802200342013703b0022002200341b0026a106702402002450d00200241057421012005210203402002200341b0026a109101200241206a2102200141606a22010d000b0b20032802b4022102200341c0006aad428080808080048420033502b80242208620032802b0022201ad84100102402002450d002001102c0b4100210602402004450d002005102c0b0c0e0b200141046a280200210a2002411a6a2901002109200241196a2d00002105200241186a2d00002107200241166a2f01002108200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241046a2d0000211541022106200241026a2f010021160240024020022d00000d0020022d00014101470d00200241056a2d00002106200241066a2f01002117200241086a2d00002102410021180c010b4101211841002102410021170b200320093703c802200320053a00c702200320073a00c602200320083b01c4022003200b3a00c3022003200c3a00c2022003200d3b01c0022003200e3a00bf022003200f3a00be02200320103b01bc02200320113a00bb02200320123a00ba02200320133b01b802200320143a00b702200320153a00b202200320163b01b0022003201741ffff0371410874200241187472200641ff01717222053600b30202402018450d0041d6b2c0002106410f2102024002400240024020050e050001020310000b20032800b702210620032800bb0221020c0f0b41dd8cc6002106410e21020c0e0b41c3b2c0002106411321020c0d0b41b2b2c0002106411121020c0c0b20034180016a41186a200341b0026a41186a220629030037030020034180016a41106a200341b0026a41106a220529030037030020034180016a41086a200341b0026a41086a2202290300370300200320032903b00237038001200642003703002005420037030020024200370300200342003703b002200341d0046a41086a220641fde7c200ad4280808080b002841002220741086a290000370300200320072900003703d0042007102c20022006290300370300200320032903d0043703b002200641eae5c200ad4280808080f000841002220741086a290000370300200320072900003703d0042007102c200520032903d0042209370300200341c0036a41086a2002290300370300200341c0036a41106a2009370300200341c0036a41186a200629030037030020032009370340200320032903b0023703c003200341b0026a200341c0036a412010d00120032902b402420020032802b00222021b2209422088a741057421062002410120021b2208210202400340024020060d00410021070c020b4101210720034180016a2002460d01200641606a2106200220034180016a412010dd052105200241206a210220050d000b0b02402009a7450d002008102c0b024020070d0041a0f7c2002106411521020c0c0b41002108200341003602b802200342013703b002200a200341b0026a108b0120032802b4022106200341b0026a41186a220520033502b80242208620032802b002220dad841006220241186a290000370300200341b0026a41106a2207200241106a290000370300200341b0026a41086a220b200241086a290000370300200320022900003703b0022002102c200341a0016a41186a22022005290300370300200341a0016a41106a22052007290300370300200341a0016a41086a220c200b290300370300200320032903b0023703a00102402006450d00200d102c0b200341b0026a200a41900110db051a200341c0036a410d6a20034180016a41086a290300370000200341c0036a41156a20034180016a41106a290300370000200341c0036a411d6a20034180016a41186a29030037000041012107200341013a00c40320032003290380013700c503200341013a00c003200341c0006a200341b0026a200341c0036a10c10220032d00482106200341b0026a410d6a200c290300370000200341b0026a41156a2005290300370000200341b0026a411d6a2002290300370000200341d5026a20064102463a0000200341053a00b402200341073a00b002200320032903a0013700b50241014100200341b0026a109201200a102c410021060c0c0b200141086a280200210a200141046a28020021192002411a6a2901002109200241196a2d00002110200241186a2d00002111200241166a2f01002112200241156a2d00002113200241146a2d00002114200241126a2f01002115200241116a2d00002116200241106a2d000021082002410e6a2f0100210b2002410d6a2d0000210c2002410c6a2d0000210d2002410a6a2f0100210e200241096a2d0000210f200241046a2d0000211741022106200241026a2f010021180240024020022d00000d0020022d00014101470d00200241056a2d00002106200241066a2f01002105200241086a2d00002102410021070c010b4101210741002105410021020b200541ffff0371410874200641ff017172200241187472210502402007450d0041d6b2c0002106410f2102024002400240024020050e05000102030e000b200e410874200f72200d411874722106200b410874200c7220084118747221020c0d0b41dd8cc6002106410e21020c0c0b41c3b2c0002106411321020c0b0b41b2b2c0002106411121020c0a0b2003200937039801200320103a009701200320113a009601200320123b019401200320133a009301200320143a009201200320153b019001200320163a008f01200320083a008e012003200b3b018c012003200c3a008b012003200d3a008a012003200e3b0188012003200f3a0087012003200536008301200320173a008201200320183b018001200341b0026a41186a4200370300200341b0026a41106a22084200370300200341b0026a41086a22064200370300200342003703b002200341d0046a41086a220241fde7c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220541086a290000370300200320052900003703d0042005102c200820032903d0042209370300200341c0036a41086a2006290300370300200341c0036a41106a2009370300200341c0036a41186a200229030037030020032009370340200320032903b0023703c003200341b0026a200341c0036a412010d00120032902b402420020032802b00222021b2209422088a741057421062002410120021b220b210202400340024020060d00410021070c020b4101210720034180016a2002460d01200641606a2106200220034180016a412010dd052105200241206a210220050d000b0b02402009a7450d00200b102c0b024020070d0041a0f7c2002106411521020c0a0b200341003602b802200342013703b002200a200341b0026a108b0120032802b402210b200341b0026a41186a220620033502b80242208620032802b002220ead841006220241186a290000370300200341b0026a41106a2205200241106a290000370300200341b0026a41086a2207200241086a290000370300200320022900003703b0022002102c200341a0016a41186a22022006290300370300200341a0016a41106a220c2005290300370300200341a0016a41086a220d2007290300370300200320032903b0023703a0010240200b450d00200e102c0b200620022903003703002005200c2903003703002007200d290300370300200320032903a0013703b002200341d0046a41086a220241fde7c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a2002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a2002290300370300200320032903d004370370200341c0006a200341b0026a109f0141c000102a2202450d0120022003290360370000200241086a200341e0006a41086a29030037000020022003290370370010200241186a200341f0006a41086a29030037000020022003290340370020200241286a200341c0006a41086a290300370000200241306a200341d0006a290300370000200241386a200341c0006a41186a290300370000200341186a200241c000410141004100109701200328021821062002102c20064101460d020240024020194102490d004200211a200341c0006a41186a220c4200370300200341c0006a41106a220d4200370300200341c0006a41086a2206420037030020034200370340200341d0046a41086a220241fde7c200ad4280808080b0028422091002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d004221b3703602003201b370340200241ace9c500ad4280808080d00184221b1002220541086a290000370300200320052900003703d0042005102c200d20032903d004221c370300200341b0026a41086a22052006290300370300200341b0026a41106a2207201c370300200341b0026a41186a220b20022903003703002003201c370370200320032903403703b002200341106a200341b0026a41201094012003280214210f20032802102110200c4200370300200d42003703002006420037030020034200370340200220091002220e41086a2900003703002003200e2900003703d004200e102c20062002290300370300200320032903d004221c3703602003201c3703402002201b1002220e41086a2900003703002003200e2900003703d004200e102c200c2002290300221c37030020052006290300370300200720032903d004221d370300200b201c3703002003201d370370200320032903403703b002200341086a200341b0026a41201094012003280208210e200328020c2111200c4200370300200d42003703002006420037030020034200370340200220091002220d41086a2900003703002003200d2900003703d004200d102c20062002290300370300200320032903d004221c3703602003201c3703402002201b1002220d41086a2900003703002003200d2900003703d004200d102c200c2002290300221b37030020052006290300370300200720032903d004221c370300200b201b3703002003201c370370200320032903403703b0024101210c2003201141016a4101200e1b3602c003200341b0026aad4280808080800484200341c0036aad4280808080c000841001200b42003703002007420037030020054200370300200342003703b002200220091002220d41086a2900003703002003200d2900003703d004200d102c20052002290300370300200320032903d0043703b002200241e1e5c200ad42808080809001841002220d41086a2900003703002003200d2900003703d004200d102c200620022903002209370300200320032903d004221b3703402008201b370000200841086a2009370000200341c0036a41086a2005290300370300200341c0036a41106a2007290300370300200341c0036a41186a200b290300370300200320032903b0023703c003200341b0026a200341c0036a412010d0010240024020032802b00222080d0041002106410021020c010b20032902b402221a422088a72102201aa721062008210c0b200b200341a0016a41186a2903003703002007200341a0016a41106a2903003703002005200341a0016a41086a290300370300200320032903a0013703b0020240024020022006460d002006210b0c010b02402006201aa7220b470d00200641016a22022006490d08200641017422052002200520024b1b220b41ffffff3f71200b470d08200b41057422024100480d080240024020060d002002102a210c0c010b200c20064105742002102e210c0b200c450d05201a42808080807083211a0b201a422088a721020b200c20024105746a220620032903b002370000200641186a200341b0026a41186a2205290300370000200641106a200341b0026a41106a2207290300370000200641086a200341b0026a41086a2206290300370000200542003703002007420037030020064200370300200342003703b002200341d0046a41086a220541fde7c200ad4280808080b002841002220841086a290000370300200320082900003703d0042008102c20062005290300370300200320032903d0042209370360200320093703b002200541e1e5c200ad42808080809001841002220841086a290000370300200320082900003703d0042008102c200720032903d0042209370300200341c0006a41086a2006290300370300200341c0006a41106a2009370300200341c0006a41186a200529030037030020032009370370200320032903b00237034002400240200c0d00200341c0006aad428080808080048410050c010b200341003602b802200342013703b002200241016a2206200341b0026a106702402006450d00200241057441206a2106200c210203402003200341b0026a3602c0032002200341c0036a109402200241206a2102200641606a22060d000b0b20032802b4022102200341c0006aad428080808080048420033502b80242208620032802b0022206ad84100102402002450d002006102c0b200b450d00200c102c0b200341b0026a200a41900110db051a200341c0036a41186a200341a0016a41186a290300370300200341c0036a41106a200341a0016a41106a290300370300200341c0036a41086a200341a0016a41086a290300370300200320032903a0013703c003200341d0046a41086a220241fde7c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22052002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22062002290300370300200320032903d004370370200341c0006a200341c0036a109f0141c000102a2202450d0320022003290360370000200241086a200529030037000020022003290370370010200241186a200629030037000020022003290340370020200241286a200341c0006a41086a290300370000200241306a200341c0006a41106a290300370000200241386a200341c0006a41186a290300370000200341003602c803200342013703c003200341b0026a200341c0036a108b0120032802c40321062002ad428080808080088420033502c80342208620032802c0032205ad84100102402006450d002005102c0b2002102c200341b0026a1092024120102a2206450d032006200329038001370000200641186a20034180016a41186a2207290300370000200641106a20034180016a41106a2208290300370000200641086a20034180016a41086a220b290300370000200341dc036a4100360200200341cc036a428180808010370200200342013702d403200320063602c803200320193602c4032003200f410020101b220c3602c003200341b0026a41186a200341a0016a41186a220d290300370300200341b0026a41106a200341a0016a41106a220e290300370300200341b0026a41086a200341a0016a41086a220f290300370300200320032903a0013703b002200341d0046a41086a220241fde7c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c200341e0006a41086a22102002290300370300200320032903d004370360200241f1e5c200ad4280808080e000841002220541086a290000370300200320052900003703d0042005102c200341f0006a41086a22052002290300370300200320032903d004370370200341c0006a200341b0026a109f0141c000102a2202450d0320022003290360370000200241086a201029030037000020022003290370370010200241186a200529030037000020022003290340370020200241286a200341c0006a41086a290300370000200241306a200341c0006a41106a290300370000200241386a200341c0006a41186a290300370000200341c0003602b402200320023602b002200341c0036a200341b0026a10fd032002102c2006102c200341bd026a200b290300370000200341c5026a2008290300370000200341cd026a2007290300370000200341d5026a20032903a001370000200341dd026a200f290300370000200341e5026a200e290300370000200341ed026a200d290300370000200341fc026a2019360200200341f8026a200c360200200341003a00b402200341073a00b00220032003290380013700b502200341b0026a21020c010b200341b0026a41186a22074200370300200341b0026a41106a220b4200370300200341b0026a41086a22064200370300200342003703b002200341d0046a41086a220241fde7c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220541086a290000370300200320052900003703d0042005102c200341c0006a41086a20022903002209370300200320032903d004221a3703402008201a370000200841086a2009370000200341c0036a41086a2006290300370300200341c0036a41106a200b290300370300200341c0036a41186a2007290300370300200320032903b0023703c003200341206a200341c0036a412010d00102400240200328022022060d00410021020c010b20032902242209422088a721022009a7450d002006102c0b200341b0026a200a41900110db051a200341cc036a2002360200200341c0036a41086a4101360200200341003a00c403200341013a00c003200341c0006a200341b0026a200341c0036a10c10220032d00482102200341bd026a200341a0016a41086a290300370000200341c5026a200341b0016a290300370000200341cd026a200341b8016a290300370000200341d5026a20024102463a0000200341043a00b402200341073a00b002200320032903a0013700b502200341b0026a21020b4100210741012108410141002002109201200a102c410021060c0b0b200141216a2d00002119200141246a2802002118200341206a41186a200141196a290000370300200341206a41106a200141116a290000370300200341206a41086a200141096a290000370300200320012900013703202002411a6a2901002109200241196a2d0000210f200241186a2d00002110200241166a2f01002111200241156a2d00002112200241146a2d00002113200241126a2f01002114200241116a2d00002115200241106a2d000021082002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241046a2d0000211641022106200241026a2f010021170240024020022d00000d0020022d00014101470d00200241056a2d00002106200241066a2f01002105200241086a2d00002102410021070c010b4101210741002105410021020b200541ffff0371410874200641ff017172200241187472210502402007450d0041d6b2c0002106410f2102024002400240024020050e05000102030c000b200d410874200e72200c411874722106200a410874200b7220084118747221020c0b0b41dd8cc6002106410e21020c0a0b41c3b2c0002106411321020c090b41b2b2c0002106411121020c080b20032009370398012003200f3a009701200320103a009601200320113b019401200320123a009301200320133a009201200320143b019001200320153a008f01200320083a008e012003200a3b018c012003200b3a008b012003200c3a008a012003200d3b0188012003200e3a0087012003200536008301200320163a008201200320173b018001200341b0026a41186a4200370300200341b0026a41106a220a4200370300200341b0026a41086a22064200370300200342003703b002200341d0046a41086a220241fde7c200ad4280808080b002841002220541086a290000370300200320052900003703d0042005102c20062002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220541086a290000370300200320052900003703d0042005102c200a20032903d0042209370300200341c0036a41086a2006290300370300200341c0036a41106a2009370300200341c0036a41186a200229030037030020032009370340200320032903b0023703c003200341b0026a200341c0036a412010d00120032902b402420020032802b00222021b2209422088a741057421062002410120021b2208210202400340024020060d00410021070c020b4101210720034180016a2002460d01200641606a2106200220034180016a412010dd052105200241206a210220050d000b0b02402009a7450d002008102c0b024020070d00418df8c2002106411221020c080b200341d0046a41086a220241fde7c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22052002290300370300200320032903d004370360200241f1e5c200ad4280808080e000841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22072002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2206450d0020062003290360370000200641086a200529030037000020062003290370370010200641186a200729030037000020062003290040370020200641286a200341c0006a41086a29000037000041102102200641306a200341c0006a41106a290000370000200641386a200341c0006a41186a290000370000200341b0026a200641c00010e503200341cc026a2802002111200341b0026a41186a280200210f200341c4026a2802002108200341b0026a41106a280200210e20032802bc02211020032802b802210d20032802b402211220032802b00221052006102c0240200d0d0041d4f7c2002106411321020c080b41e7f7c200210620052018470d06200e41057421064100211341002105200d21020240024003402006450d0220034180016a2002460d01200541016a2105200641606a2106200220034180016a412010dd052107200241206a210220070d000b20074541016a41017120056a417f6a21050b410121130b2011410574210b20034180016a20086b210c410021144100210641002102024002400340200b2002460d02200c2002460d01200641016a2106200820026a2107200241206a2102200720034180016a412010dd0522070d000b20074541016a41017120066a417f6a21060b410121140b024002400240201941ff01710d002014450d010c080b20130d07200341b0026a41186a220720034180016a41186a290300370300200341b0026a41106a220b20034180016a41106a290300370300200341b0026a41086a220c20034180016a41086a29030037030020032003290380013703b00202400240200e2010460d0020102105200e21100c010b201041016a22022010490d06201041017422052002200520024b1b220541ffffff3f712005470d06200541057422024100480d060240024020100d002002102a210d0c010b200d20104105742002102e210d0b200d450d030b200d20104105746a220220032903b002370000200241186a2007290300370000200241106a200b290300370000200241086a200c290300370000200e41016a210e2014450d01201120064d0d0420082011417f6a22114105746a220229000021092002290008211a2002290010211b200820064105746a220641186a200241186a2900003700002006201b3700102006201a370008200620093700000c010b200329039801210920032d009701210720032d009601210b20032f019401210c20032d009301211420032d009201211520032f019001211620032d008f01211720032d008e01211e20032f018c01211f20032d008b01212020032d008a01212120032f018801212220032d0087012123200328008301212420032d008201212520032f0180012126024002402011200f460d00200f21062011210f0c010b200f41016a2202200f490d05200f41017422062002200620024b1b220641ffffff3f712006470d05200641057422024100480d0502400240200f0d002002102a21080c010b2008200f4105742002102e21080b2008450d020b2008200f4105746a22022009370018200220073a00172002200b3a00162002200c3b0014200220143a0013200220153a0012200220163b0010200220173a000f2002201e3a000e2002201f3b000c200220203a000b200220213a000a200220223b0008200220233a000720022024360003200220253a0002200220263b0000201141016a211102402013450d00200e20054d0d06200d200e417f6a220e4105746a220229000021092002290008211a2002290010211b200d20054105746a220541186a200241186a2900003700002005201b3700102005201a370008200520093700000b2006210f201021050b200341d5026a2003290320370000200341bd026a20034180016a41086a290300370000200341c5026a20034180016a41106a290300370000200341cd026a20034180016a41186a290300370000200341dd026a200341206a41086a290300370000200341e5026a200341206a41106a290300370000200341ed026a200341206a41186a290300370000200341013a00b402200341073a00b00220032003290380013700b502200341fc026a2011360200200341f8026a200e360200200341f5026a20193a00004100210641014100200341b0026a109201200341b0026a41186a220c4200370300200341b0026a41106a22104200370300200341b0026a41086a22074200370300200342003703b002200341d0046a41086a220241fde7c200ad4280808080b002841002220b41086a2900003703002003200b2900003703d004200b102c20072002290300370300200320032903d0043703b002200241eae5c200ad4280808080f000841002220b41086a2900003703002003200b2900003703d004200b102c200341c0006a41086a20022903002209370300200320032903d004221a370340200a201a370000200a41086a2009370000200341c0036a41086a2007290300370300200341c0036a41106a2010290300370300200341c0036a41186a200c290300370300200320032903b0023703c003200341a0016a200341c0036a412010d001024020032802a0012202450d0020032902a4012209422088a721062009a7450d002002102c0b02400240200e20124f22020d004100200620116b2207200720064b1b2012490d00200341cc026a2011360200200341b0026a41186a200f360200200341b0026a41106a200e360200200341bc026a2005360200200320083602c4022003200d3602b802200320123602b402200320183602b002200341d0046a41086a220241fde7c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22072002290300370300200320032903d004370360200241f1e5c200ad4280808080e000841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22062002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0220022003290360370000200241086a200729030037000020022003290370370010200241186a200629030037000020022003290040370020200241286a200341c0006a41086a290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a290000370000200341c0003602c403200320023602c003200341b0026a200341c0036a10fd032002102c02402005450d00200d102c0b0240200f450d002008102c0b410021060c010b0240024020020d00200341d0046a41086a220241fde7c200ad4280808080b002841002220641086a290000370300200320062900003703d0042006102c200341e0006a41086a22072002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220641086a290000370300200320062900003703d0042006102c200341f0006a41086a22062002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0320022003290360370000200241086a200729030037000020022003290370370010200241186a200629030037000020022003290040370020200241286a200341c0006a41086a290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a2900003700002002ad428080808080088410052002102c200341bd026a200341206a41086a290300370000200341c5026a200341206a41106a290300370000200341cd026a200341206a41186a290300370000200341033a00b402200341073a00b002200320032903203700b50241014100200341b0026a1092010c010b200341bd026a200341206a41086a290300370000200341c5026a200341206a41106a290300370000200341cd026a200341206a41186a290300370000200341023a00b402200341073a00b002200320032903203700b50241014100200341b0026a109201200341d0046a41086a220241fde7c200ad4280808080b002841002220741086a290000370300200320072900003703d0042007102c200341e0006a41086a220b2002290300370300200320032903d004370360200241fcf0c200ad4280808080a001841002220741086a290000370300200320072900003703d0042007102c200341f0006a41086a22072002290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0220022003290360370000200241086a200b29030037000020022003290370370010200241186a200729030037000020022003290040370020200241286a200341c0006a41086a290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a290000370000200341b0026a200241c00010f40320032802b0022107200341c0036a200341b0026a410472220b418c0110db051a024020074118470d002002102c0c010b200341a0016a200341c0036a418c0110db051a2002102c200320073602b002200b200341a0016a418c0110db051a200341cc036a2006360200200341c0036a41086a2012360200200341003a00c403200341013a00c003200341c0006a200341b0026a200341c0036a10c10220032d00482102200341bd026a200341206a41086a290300370000200341c5026a200341306a290300370000200341cd026a200341386a290300370000200341d5026a20024102463a0000200341043a00b402200341073a00b002200320032903203700b50241014100200341b0026a1092010b200341d0046a41086a220641fde7c200ad4280808080b0028422091002220241086a290000370300200320022900003703d0042002102c200341e0006a41086a22072006290300370300200320032903d004370360200641f1e5c200ad4280808080e000841002220241086a290000370300200320022900003703d0042002102c200341f0006a41086a220b2006290300370300200320032903d004370370200341c0006a200341206a109f0141c000102a2202450d0120022003290360370000200241086a200729030037000020022003290370370010200241186a200b29030037000020022003290040370020200241286a200341c0006a41086a220b290000370000200241306a200341c0006a41106a290000370000200241386a200341c0006a41186a2900003700002002ad428080808080088410052002102c200341b0026a41186a220c4200370300200341b0026a41106a220e4200370300200341b0026a41086a22024200370300200342003703b002200620091002220741086a290000370300200320072900003703d0042007102c20022006290300370300200320032903d0043703b002200641e1e5c200ad42808080809001841002220741086a290000370300200320072900003703d0042007102c200b20062903002209370300200320032903d004221a370340200a201a370000200a41086a2009370000200341c0036a41086a2002290300370300200341c0036a41106a200e290300370300200341c0036a41186a200c290300370300200320032903b0023703c003200341b0026a200341c0036a412010d0010240024020032802b0022202450d00200320032902b4023702a401200320023602a0010c010b200341003602a801200342013703a0010b200341a0016a200341206a107a20032802a801210b20032802a401210e20032802a001210a200341c0006a41186a4200370300200341c0006a41106a220c4200370300200341c0006a41086a2206420037030020034200370340200341d0046a41086a220241fde7c200ad4280808080b002841002220741086a290000370300200320072900003703d0042007102c20062002290300370300200320032903d004220937036020032009370340200241e1e5c200ad42808080809001841002220741086a290000370300200320072900003703d0042007102c200c20032903d0042209370300200341b0026a41086a2006290300370300200341b0026a41106a2009370300200341b0026a41186a200229030037030020032009370370200320032903403703b00202400240200a0d00200341b0026aad428080808080048410050c010b200341003602c803200342013703c003200b200341c0036a10670240200b450d00200b4105742106200a210203402003200341c0036a3602402002200341c0006a109402200241206a2102200641606a22060d000b0b20032802c4032102200341b0026aad428080808080048420033502c80342208620032802c0032206ad84100102402002450d002006102c0b200e450d00200a102c0b02402005450d00200d102c0b41002106200f450d002008102c0b0c070b1033000b41b5f7c2002106411f21020c060b41a888c600200620111038000b1035000b41a888c6002005200e1038000b41f7f7c2002106411621020b02402010450d00200d102c0b200f450d002008102c0b41012108410121070c020b200a109202200a102c41002107410121080c010b200a109202200a102c41012107410021080b2004417f6a220541024b0d0002400240024020050e03000102000b200141086a280200450d02200141046a280200102c0c020b2008450d01200141046a28020022011092022001102c0c010b2007450d00200141086a28020022011092022001102c0b2000200236020420002006360200200341e0046a24000bc4a80205017f037e137f027e037f230041e0066b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e1600010205060708090a0b0c0d0e201d1c1b1a19181716000b200341e4036a4101360200200342013702d403200341fcc4c5003602d003200341043602e405200341f4c4c5003602e0052003200341e0056a3602e003200341d0036a4184c5c5001041000b200141306a2903002104200141286a2903002105200341c0026a41186a200141196a290000370300200341c0026a41106a200141116a290000370300200341c0026a41086a200141096a290000370300200320012900013703c0022002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d00012119200320063703d00341002102201941ff01714101460d010b410121024102211841002116410021170b200320063703a003200320073a009f03200320083a009e03200320093b019c032003200a3a009b032003200b3a009a032003200c3b0198032003200d3a0097032003200e3a0096032003200f3b019403200320103a009303200320113a009203200320123b019003200320133a008f03200320143a008a03200320153b0188032003201741ffff0371410874201641187472201841ff017172220936008b0302402002450d0041d6b2c0002108410f210720090e050220212233020b20034188056a41186a20034188036a41186a29030037030020034188056a41106a20034188036a41106a29030037030020034188056a41086a20034188036a41086a2903003703002003200329038803370388050240200542808084fea6dee1115441002004501b450d0041e695c5002108410d2107410121090c340b200341106a20034188056a2005200410c10102402003280210450d0041f395c5002108411a2107410121090c340b200341e0016a41186a22094200370300200341e0016a41106a22074200370300200341e0016a41086a22084200370300200342003703e001200341d0046a41086a220241bad6c500ad428080808090018422061002221641086a290000370300200320162900003703d0042016102c20082002290300370300200320032903d004221a370380022003201a3703e0012002419cd6c500ad4280808080f00184221b1002221641086a290000370300200320162900003703d0042016102c200720032903d004221a370300200341c0016a41086a22172008290300370300200341c0016a41106a2218201a370300200341c0016a41186a220a20022903003703002003201a37039002200320032903e0013703c001200341086a200341c0016a4120109401200328020c210b2003280208210c200942003703002007420037030020084200370300200342003703e001200220061002221641086a290000370300200320162900003703d0042016102c20082002290300370300200320032903d004221a370380022003201a3703e0012002201b1002221641086a290000370300200320162900003703d0042016102c20092002290300221a37030020172008290300370300201820032903d004221b370300200a201a3703002003201b37039002200320032903e0013703c0012003200b4100200c1b221641016a3602d003200341c0016aad4280808080800484221a200341d0036aad4280808080c000841001200320034188056a36028803200220061002221741086a290000370300200320172900003703d0042017102c20034180026a41086a22182002290300370300200320032903d00437038002200241e0c5c400ad42808080809001841002221741086a290000370300200320172900003703d0042017102c20034190026a41086a22172002290300370300200320032903d00437039002200320163602e005200341d0036a41186a220a200341e0056aad4280808080c000841006220241186a290000370300200341d0036a41106a220b200241106a290000370300200341d0036a41086a220c200241086a290000370300200320022900003703d0032002102c2009200a2903003703002007200b2903003703002008200c290300370300200320032903d0033703e00141c000102a2202450d352002200329038002370000200241086a20182903003700002002200329039002370010200241186a2017290300370000200220032903e001370020200241286a2008290300370000200241306a2007290300370000200241386a20092903003700004110102a2208450d3520082005370000200820043700082003429080808080023702d403200320083602d0034101200341d0036a1067200328028803200341d0036a10910120032802d40321082002ad428080808080088420033502d80342208620032802d0032209ad84100102402008450d002009102c0b2002102c200341ec056a200341c0026a41086a290300370200200341f4056a200341c0026a41106a290300370200200341fc056a200341c0026a41186a2903003702002003418c066a20034188056a41086a29030037020020034194066a20034188056a41106a2903003702002003419c066a20034188056a41186a290300370200200320163602e005200320032903c0023702e4052003200329038805370284062003200341e0056a3602d005200341e0016a41186a22174200370300200341e0016a41106a22184200370300200341e0016a41086a22084200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002220941086a290000370300200320092900003703d0042009102c20082002290300370300200320032903d004220637038002200320063703e001200241d5c5c400ad4280808080b001841002220941086a290000370300200320092900003703d0042009102c20034190026a41086a20022903002206370300200320032903d004221b370390022007201b370000200741086a2006370000200341c0016a41086a2008290300370300200341c0016a41106a2018290300370300200341c0016a41186a2017290300370300200320032903e0013703c00120034188036a201a1003108d01024002402003280288032208450d0020034188036a41086a2802002102200328028c0321090c010b200341003602d803200342013703d0034100200341d0036a106720032802d803210220032802d403210920032802d00321080b200320023602a802200320093602a402200320083602a002024002402002450d00200341d0036a20082002410110db0320032802d0034101470d0120032802a402450d3120032802a002102c0c310b4101200341a0026a106720032802d005220828020021170240024020032802a402220920032802a80222026b4104490d0020032802a00221090c010b200241046a22182002490d38200941017422022018200220184b1b22024100480d380240024020090d002002102a21090c010b20032802a00220092002102e21090b2009450d37200320023602a402200320093602a00220032802a80221020b2003200241046a3602a802200920026a20173600002003200341a0026a3602d003200841046a200341d0036a109402200841246a200341a0026a1091010c2e0b20032802d40321170240200341dc036a2802002202200341d8036a2802002208460d0020032802a802200220086b6a220941046a2218417f4c0d130240024020180d004101210a0c010b2018102a220a450d370b200320183602ec042003200a3602e804200320093602f0042003200341e8046a3602d0032017200341d0036a200210c80220092002490d1220032802f00422172009490d1120032802a80222172008490d1020032802e804211820032802a002210a2003200920026b2209360280022003201720086b22173602900220092017470d0f201820026a200a20086a200910db051a20032802d005220828020021170240024020032802ec04220920032802f00422026b4104490d0020032802e80421090c010b200241046a22182002490d38200941017422022018200220184b1b22024100480d380240024020090d002002102a21090c010b20032802e80420092002102e21090b2009450d37200320023602ec04200320093602e80420032802f00421020b2003200241046a3602f004200920026a20173600002003200341e8046a3602d003200841046a200341d0036a109402200841246a200341e8046a10910120032802f004210820032802ec04210920032802e804210220032802a402450d2f20032802a002102c0c2f0b2003200341a0026a3602d0032017200341d0036a200810c80220032802d005220828020021170240024020032802a402220920032802a80222026b4104490d0020032802a00221090c010b200241046a22182002490d37200941017422022018200220184b1b22024100480d370240024020090d002002102a21090c010b20032802a00220092002102e21090b2009450d36200320023602a402200320093602a00220032802a80221020b2003200241046a3602a802200920026a20173600002003200341a0026a3602d003200841046a200341d0036a109402200841246a200341a0026a1091010c2d0b200141046a28020021192002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d0001211c200320063703d00341002102201c41ff01714101460d010b410121024102211841002116410021170b200320063703a003200320073a009f03200320083a009e03200320093b019c032003200a3a009b032003200b3a009a032003200c3b0198032003200d3a0097032003200e3a0096032003200f3b019403200320103a009303200320113a009203200320123b019003200320133a008f03200320143a008a03200320153b0188032003201741ffff0371410874201641187472201841ff017172220936008b032002450d0141d6b2c0002108410f210720090e05001e1f2031000b200328008f0321082003280093032107410121090c310b200341e0056a41186a20034188036a41186a290300370300200341e0056a41106a20034188036a41106a290300370300200341e0056a41086a20034188036a41086a29030037030020032003290388033703e005200341d0036a201910cc04024020032802e00322090d00418d96c500210841242107410121090c310b200341d0036a41186a280200210720032802e4032102200341186a200341e0056a20032902d403220642208620033502d003842204200341dc036a350200422086200642208884220610c10120032802180d29200341c0016a41186a200341e0056a41186a290300370300200341c0016a41106a2208200341e0056a41106a290300370300200341c0016a41086a2217200341e0056a41086a290300370300200320032903e0053703c0010240024020072002460d0020022116200721020c010b200241016a22162002490d34200241017422182016201820164b1b221641ffffff3f712016470d34201641057422184100480d340240024020020d002018102a21090c010b200920024105742018102e21090b2009450d330b200920024105746a220220032903c001370000200241186a200341c0016a41186a290300370000200241106a2008290300370000200241086a2017290300370000200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20034180026a41086a2002290300370300200320032903d00437038002200241e0c5c400ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20034190026a41086a2002290300370300200320032903d004370390022003201936028805200341d0036a41186a220820034188056aad4280808080c000841006220241186a290000370300200341d0036a41106a2217200241106a290000370300200341d0036a41086a2218200241086a290000370300200320022900003703d0032002102c200341e0016a41186a22022008290300370300200341e0016a41106a2017290300370300200341e0016a41086a2018290300370300200320032903d0033703e00141c000102a2208450d322008200329038002370000200841086a20034180026a41086a2903003700002008200329039002370010200841186a20034190026a41086a290300370000200820032903e001370020200841286a200341e0016a41086a290300370000200841306a200341e0016a41106a290300370000200841386a20022903003700004110102a2202450d3220022004370000200220063700082003429080808080023702d403200320023602d003200741016a2202200341d0036a106702402002450d00200741057441206a21072009210203402002200341d0036a109101200241206a2102200741606a22070d000b0b20032802d40321022008ad428080808080088420033502d80342208620032802d0032207ad84100102402002450d002007102c0b2008102c2016450d282009102c0c280b200141026a2d00002119200141046a280200211c20012d0001211d2002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d0001211e200320063703d00341002102201e41ff01714101460d010b410121024102211841002116410021170b200320063703f801200320073a00f701200320083a00f601200320093b01f4012003200a3a00f3012003200b3a00f2012003200c3b01f0012003200d3a00ef012003200e3a00ee012003200f3b01ec01200320103a00eb01200320113a00ea01200320123b01e801200320133a00e701200320143a00e201200320153b01e0012003201741ffff0371410874201641187472201841ff01717222093600e30102402002450d0041d6b2c0002108410f210720090e05191c1d1e2f190b200341c0016a41186a200341e0016a41186a2903002206370300200341c0016a41106a200341e0016a41106a2903002204370300200341c0016a41086a200341e0016a41086a2903002205370300200320032903e001221a3703c001200341d0036a41186a2006370300200341d0036a41106a2004370300200341d0036a41086a20053703002003201a3703d003200341d0036a201c201d41ff0171410047201910e10421080c260b200141026a2d00002119200141046a280200211c20012d0001211d2002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d0001211e200320063703d00341002102201e41ff01714101460d010b410121024102211841002116410021170b200320063703d801200320073a00d701200320083a00d601200320093b01d4012003200a3a00d3012003200b3a00d2012003200c3b01d0012003200d3a00cf012003200e3a00ce012003200f3b01cc01200320103a00cb01200320113a00ca01200320123b01c801200320133a00c701200320143a00c201200320153b01c0012003201741ffff0371410874201641187472201841ff01717222093600c30102402002450d0041d6b2c0002108410f210720090e051e1b1c1d2e1e0b200341d0036a41186a200341c0016a41186a290300370300200341d0036a41106a200341c0016a41106a290300370300200341d0036a41086a200341c0016a41086a290300370300200320032903c0013703d003200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d0043703800220024188fbc400ad4280808080d000841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a200341d0036a109f0141c000102a2202450d302002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a290300370000200220032903e001370020200241286a200341e0016a41086a2208290300370000200241306a200341e0016a41106a2209290300370000200241386a200341e0016a41186a2207290300370000200341d0036a200241c00010d3012008200341d9036a2900003703002009200341e1036a2900003703002007200341e9036a290000370300200320032900d1033703e001410121080240024020032d00d0034101460d00410021160c010b200341a2016a20032d00e2013a0000200341a0026a41086a200341f3016a290000370300200341ad026a2007290000370000200320032f01e0013b01a001200320032900eb013703a0024101211620032800e701210720032800e30121090b2002102c0240024020160d00410b210741cb96c50021090c010b200341d0056a41026a200341a0016a41026a2d00003a0000200341c0026a41086a200341a0026a41086a290300370300200341c0026a410d6a200341a0026a410d6a290000370000200320032f01a0013b01d005200320032903a0023703c002410021080b200341d0066a41026a2202200341d0056a41026a2d00003a0000200341e8046a41086a2216200341c0026a41086a290300370300200341e8046a41106a200341c0026a41106a290300370300200320032f01d0053b01d006200320032903c0023703e80402402008450d0020092108410121090c2f0b20034188056a41026a20022d000022023a0000200341e0056a41086a22082016290300370300200341e0056a410d6a2216200341e8046a410d6a290000370000200320032f01d00622173b018805200320032903e8043703e005200341e3036a2008290300370000200341e8036a2016290000370000200320023a00d203200320173b01d003200320073600d703200320093600d303200320032903e0053700db03200341d0036a201c201d41ff0171410047201910e10421080c250b41cf8cc6002108410e210720022d0000417f6a221741024b0d2c200141046a280200211841012109410121160240024020170e03003001000b200241046a2d00000d2d4101210941012116200241086a28020041036c2002410c6a280200410174490d2f0b200341d0036a201810d704024020032d00f8034103470d0041fb96c5002108410d2107410121090c2e0b200341e0056a41206a200341d0036a41286a280200360200200341e0056a41186a200341d0036a41206a2903002206370300200341e0056a41106a200341d0036a41186a22022903002204370300200341e0056a41086a200341d0036a41106a22072903002205370300200320032903d803221a3703e005200341c0016a41186a2006370300200341c0016a41106a2004370300200341c0016a41086a20053703002003201a3703c0012002200637030020072004370300200341d0036a41086a20053703002003201a3703d003200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a22082002290300370300200320032903d0043703800220024188fdc400ad4280808080d001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a22072002290300370300200320032903d00437039002200341e0016a200341d0036a109f0141c000102a2202450d2f2002200329038002370000200241086a20082903003700002002200329039002370010200241186a2007290300370000200220032903e001370020200241286a200341e0016a41086a290300370000200241306a200341e0016a41106a290300370000200241386a200341e0016a41186a29030037000041012109200341206a200241c000410141004100109701200328022021072002102c20074101460d0d200341d0036a41186a200341c0016a41186a290300370300200341d0036a41106a200341c0016a41106a290300370300200341d0036a41086a200341c0016a41086a290300370300200320032903c0013703d003200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a22082002290300370300200320032903d0043703800220024188fdc400ad4280808080d001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a22072002290300370300200320032903d00437039002200341e0016a200341d0036a109f0141c000102a2202450d2f2002200329038002370000200241086a20082903003700002002200329039002370010200241186a2007290300370000200220032903e001370020200241286a200341e0016a41086a290300370000200241306a200341e0016a41106a290300370000200241386a200341e0016a41186a29030037000041012109200341013a00d0032002ad4280808080800884200341d0036aad4280808080108410012002102c201810d20441002108410121160c2e0b200341a0056a200141196a29000037030020034198056a200141116a29000037030020034190056a200141096a290000370300200320012900013703880541cf8cc6002108410e210720022d0000417f6a220941024b0d2b0240024020090e03002d01000b200241086a2802004101742002410c6a280200490d2c200241046a28020041ff01710d2c0b200341e0016a41186a4200370300200341e0016a41106a22094200370300200341e0016a41086a22074200370300200342003703e001200341d0046a41086a220241bad6c500ad428080808090018422041002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d004220637038002200320063703e00120024184c6c400ad4280808080c001841002220841086a290000370300200320082900003703d0042008102c200920032903d0042206370300200341c0016a41086a2007290300370300200341c0016a41106a2006370300200341c0016a41186a20022903003703002003200637039002200320032903e0013703c001200341306a200341c0016a4120410141004100109701024020032802304101470d00418897c500210841152107410121090c2d0b200341d0036a41186a20034188056a41186a290300370300200341d0036a41106a20034188056a41106a290300370300200341d0036a41086a20034188056a41086a29030037030020032003290388053703d003200220041002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d00437038002200241bcfcc400ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a200341d0036a109f0141c000102a2202450d2e2002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a220b290300370000200220032903e001370020200241286a200341e0016a41086a2207290300370000200241306a200341e0016a41106a2216290300370000200241386a200341e0016a41186a2217290300370000200341d0036a200241c00010ed0320032802d003210c20032903d803210420032802d40321082002102c02402008450d00200341d0036a41186a4200370300200341d0036a41106a220d4200370300200341d0036a41086a22184200370300200342003703d003200341d0046a41086a22024191b0c200ad4280808080e000841002220a41086a2900003703002003200a2900003703d004200a102c20182002290300370300200320032903d0043703d003200241acb0c200ad4280808080e000841002220a41086a2900003703002003200a2900003703d004200a102c200d20032903d0042206370300200341e0056a41086a2018290300370300200341e0056a41106a2006370300200341e0056a41186a2002290300370300200320063703e001200320032903d0033703e005200341286a200341e0056a4120109401200328022c410020032802281b210202402004a7450d002008102c0b2002200c4f0d00419d97c5002108411a2107410121090c2d0b200341d0036a41186a20034188056a41186a290300370300200341d0036a41106a20034188056a41106a290300370300200341d0036a41086a20034188056a41086a29030037030020032003290388053703d003200341003a00f003201742003703002016420037030020074200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d004220637038002200320063703e00120024184c6c400ad4280808080c001841002220841086a290000370300200320082900003703d0042008102c200b20022903002206370300200320032903d00422043703900220092004370000200941086a2006370000200341c0016a41086a2007290300370300200341c0016a41106a2016290300370300200341c0016a41186a2017290300370300200320032903e0013703c001200341003602e805200342013703e0052003200341e0056a36028803200341d0036a20034188036a109402024020032d00f003220241024b0d00024002400240024020020e03000102000b410021070c020b410121070c010b410221070b200320073a00d0040240024020032802e40520032802e8052202460d0020032802e00521080c010b200241016a22072002490d31200241017422082007200820074b1b22074100480d310240024020020d002007102a21080c010b20032802e00520022007102e21080b2008450d30200320073602e405200320083602e00520032d00d004210720032802e80521020b2003200241016a3602e805200820026a20073a00000b20032802e4052102200341c0016aad428080808080048420033502e80542208620032802e0052207ad84100102402002450d002007102c0b410021080c2a0b200341f8056a200141196a290000370300200341f0056a200141116a290000370300200341e0056a41086a200141096a290000370300200320012900013703e00541cf8cc600210820022d0000417f6a220741024b0d210240024020070e03002301000b200241046a2d00000d22200241086a2802004102742002410c6a28020041036c490d220b200341d0036a41186a200341e0056a41186a290300370300200341d0036a41106a200341e0056a41106a290300370300200341d0036a41086a200341e0056a41086a290300370300200320032903e0053703d003200341023a00f003200341e0016a41186a4200370300200341e0016a41106a22094200370300200341e0016a41086a22074200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d004220637038002200320063703e00120024184c6c400ad4280808080c001841002220841086a290000370300200320082900003703d0042008102c200920032903d0042206370300200341c0016a41086a2007290300370300200341c0016a41106a2006370300200341c0016a41186a20022903003703002003200637039002200320032903e0013703c00120034100360290052003420137038805200320034188056a36028803200341d0036a20034188036a109402024020032d00f003220241024b0d00024002400240024020020e03000102000b410021070c020b410121070c010b410221070b200320073a00d00402400240200328028c052003280290052202460d0020032802880521080c010b200241016a22072002490d30200241017422082007200820074b1b22074100480d300240024020020d002007102a21080c010b20032802880520022007102e21080b2008450d2f2003200736028c05200320083602880520032d00d004210720032802900521020b2003200241016a36029005200820026a20073a00000b200328028c052102200341c0016aad42808080808004842003350290054220862003280288052207ad8410012002450d202007102c0c200b200341f8056a200141196a290000370300200341f0056a200141116a290000370300200341e8056a200141096a290000370300200320012900013703e00541cf8cc600210820022d0000417f6a220741024b0d200240024020070e03002201000b200241086a2802002002410c6a280200490d21200241046a28020041ff01710d210b200341d0036a41186a200341e0056a41186a290300370300200341d0036a41106a200341e0056a41106a290300370300200341d0036a41086a200341e0056a41086a290300370300200320032903e0053703d003200341013a00f003200341e0016a41186a4200370300200341e0016a41106a22094200370300200341e0016a41086a22074200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d004220637038002200320063703e00120024184c6c400ad4280808080c001841002220841086a290000370300200320082900003703d0042008102c200920032903d0042206370300200341c0016a41086a2007290300370300200341c0016a41106a2006370300200341c0016a41186a20022903003703002003200637039002200320032903e0013703c00120034100360290052003420137038805200320034188056a36028803200341d0036a20034188036a109402024020032d00f003220241024b0d00024002400240024020020e03000102000b410021070c020b410121070c010b410221070b200320073a00d00402400240200328028c052003280290052202460d0020032802880521080c010b200241016a22072002490d2f200241017422082007200820074b1b22074100480d2f0240024020020d002007102a21080c010b20032802880520022007102e21080b2008450d2e2003200736028c05200320083602880520032d00d004210720032802900521020b2003200241016a36029005200820026a20073a00000b200328028c052102200341c0016aad42808080808004842003350290054220862003280288052207ad8410012002450d1f2007102c0c1f0b200141286a280200210a200141246a2802002118200341a0036a200141196a29000037030020034198036a200141116a29000037030020034188036a41086a200141096a29000037030020032001290001370388034101210941cf8cc6002108410e210720022d0000417e6a221641014b0d290240024020160e020001000b200241046a2d00000d2a200241086a28020041036c2002410c6a280200410174490d2a0b200341e0016a41186a220b420037030041102107200341e0016a41106a22164200370300200341e0016a41086a22024200370300200342003703e001200341d0046a41086a220841bad6c500ad42808080809001841002221741086a290000370300200320172900003703d0042017102c20022008290300370300200320032903d004220637038002200320063703e00120084184c6c400ad4280808080c001841002221741086a290000370300200320172900003703d0042017102c201620032903d0042206370300200341c0016a41086a2002290300370300200341c0016a41106a2006370300200341c0016a41186a20082903003703002003200637039002200320032903e0013703c001200341d0036a200341c0016a10ea0320032d00f0032117200b200341d0036a41186a2903003703002016200341d0036a41106a2903003703002002200341d0036a41086a290300370300200320032903d0033703e0010240024020174103470d004101210241b797c50021080c010b200341a2016a20032d00e2013a0000200341a0026a41086a200341f3016a290000370300200341ad026a200b290000370000200320032f01e0013b01a001200320032900eb013703a0024100210220032800e701210720032800e30121080b200341d0056a41026a220b200341a0016a41026a2d00003a0000200341e0056a41086a200341a0026a41086a290300370300200341e0056a410d6a220c200341a0026a410d6a290000370000200320032f01a0013b01d005200320032903a0023703e00520020d292003419b056a200341e8056a290300370000200341a0056a200c290000370000200320032f01d0053b0188052003200736008f052003200836008b05200320032903e005370093052003200b2d00003a008a05024020170d0041c797c5002108412a21070c2a0b024020034188036a20034188056a412010dd05450d0041f197c5002108410c21070c2a0b200341e0016a41186a220b4200370300200341e0016a41106a220c4200370300200341e0016a41086a22074200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d004220637038002200320063703e00120024184c6c400ad4280808080c001841002220841086a290000370300200320082900003703d0042008102c20034190026a41086a20022903002206370300200320032903d00422043703900220162004370000201641086a2006370000200341c0016a41086a2007290300370300200341c0016a41106a200c290300370300200341c0016a41186a200b290300370300200320032903e0013703c001200341c0016aad42808080808004841005200341d0036a41186a220b4200370300200341d0036a41106a22084200370300200341d0036a41086a22074200370300200342003703d00320024191b0c200ad4280808080e000841002221641086a290000370300200320162900003703d0042016102c20072002290300370300200320032903d0043703d003200241acb0c200ad4280808080e000841002221641086a290000370300200320162900003703d0042016102c200820032903d0042206370300200341e0056a41086a2007290300370300200341e0056a41106a2006370300200341e0056a41186a2002290300370300200320063703e001200320032903d0033703e005200341386a200341e0056a4120109401200328023c210220032802382116200b20034188036a41186a290300370300200820034188036a41106a290300370300200720034188036a41086a29030037030020032003290388033703d003410021082002410020161b20184180a30520184180a3054b1b6a200341d0036a2017200a10ca040c290b200341d8026a200141196a290000370300200341c0026a41106a200141116a290000370300200341c0026a41086a200141096a290000370300200320012900013703c00241cf8cc6002108410e210720022d00004102470d27200241236a2d00002116200241216a2f000021172002411f6a2d000021182002411d6a2f0000210a2002410f6a2d0000210b2002410d6a2f0000210c2002410b6a2d0000210d200241096a2f0000210e200241076a2d0000210f200241056a2f00002110200241246a2802002111200241206a2d00002112200241116a2900002106200241106a2d000021132002410c6a2d00002114200241086a2d00002115200241046a2d000021092003200241196a2800003602d803200320063703d00320094101470d272003201720164110747222023b01a40541102107200341a6056a20024110763a00002003200a20184110747222023b01a005200341a2056a20024110763a00002003200c200b4110747222023b01900520034192056a20024110763a000020032006a722023b01940520034196056a20024110763a0000200320113a00a705200320123a00a305200320032902d40337039805200320133a009305200320143a008f05200320153a008b05200320064218883c0097052003200e200d4110747222023b018c05200320024110763a008e0520032010200f4110747222023b018805200320024110763a008a05200341e0016a41186a22174200370300200341e0016a41106a22094200370300200341e0016a41086a22024200370300200342003703e001200341d0046a41086a220841bad6c500ad42808080809001841002221641086a290000370300200320162900003703d0042016102c20022008290300370300200320032903d004220637038002200320063703e00120084184c6c400ad4280808080c001841002221641086a290000370300200320162900003703d0042016102c200920032903d0042206370300200341c0016a41086a2002290300370300200341c0016a41106a2006370300200341c0016a41186a20082903003703002003200637039002200320032903e0013703c001200341d0036a200341c0016a10ea0320032d00f00321082017200341d0036a41186a22162903003703002009200341d0036a41106a22182903003703002002200341d0036a41086a220a290300370300200320032903d0033703e00120084103460d0220034188036a41186a2017290300220637030020034188036a41106a2009290300220437030020034188036a41086a20022903002205370300200320032903e001221a370388032016200637030020182004370300200a20053703002003201a3703d003419198c5002108200341c0026a200341d0036a412010dd050d27200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a22082002290300370300200320032903d00437038002200241bcfcc400ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a22072002290300370300200320032903d00437039002200341e0016a200341c0026a109f0141c000102a2202450d2a2002200329038002370000200241086a20082903003700002002200329039002370010200241186a2007290300370000200220032903e001370020200241286a200341e0016a41086a290300370000200241306a200341e0016a41106a290300370000200241386a200341e0016a41186a290300370000200341d0036a200241c00010ed0320032903d803210620032802d803211820032802d40321172002102c41002107024020170d0041012117410021184100210a0c1c0b2006a7210a41002102024002402006422088a7220b41014b0d00200b0e021d011d0b200b210703402007410176220820026a22162002201720164105746a20034188056a412010dd054101481b2102200720086b220741014b0d000b0b0240201720024105746a20034188056a412010dd0522070d0041a198c500210841262107200a450d282017102c410121090c290b200341d0036a41186a20034188056a41186a290300370300200341d0036a41106a20034188056a41106a290300370300200341d0036a41086a20034188056a41086a29030037030020032003290388053703d00302402007411f7620026a2216200b4b0d00200341d0036a2108200b21070c1d0b41ecb3c000411e41acfec5001036000b4101210920022d000120022d0000720d19200141046a28020010d20441002108410121160c280b4101210920022d000120022d0000720d18200141046a2802002117200341d0036a41186a4200370300200341d0036a41106a22164200370300200341d0036a41086a22074200370300200342003703d003200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d0043703d003200241b6c5c400ad4280808080d001841002220841086a290000370300200320082900003703d0042008102c201620032903d0042206370300200341e0056a41086a2007290300370300200341e0056a41106a2006370300200341e0056a41186a2002290300370300200320063703e001200320032903d0033703e005200341d0036a200341e0056a10f00320032802d0032202410420021b210c0240024020032902d403420020021b2206422088a722160d004100210b0c010b200c41246a210d410021184100210b410021080240034002400240200b450d00200c200841286c6a2102200c200820186a41286c6a21070340200820164f0d1d2017200241246a280200460d020240201820086a220a20164f0d0020072002290200370200200741206a200241206a290200370200200741186a200241186a290200370200200741106a200241106a290200370200200741086a200241086a290200370200200741286a2107200241286a2102200841016a22082016490d010c050b0b41fcb4c000200a20161038000b200d200841286c6a21020340200820164f0d1c20172002280200460d01200241286a2102200841016a22082016490d000b4100210b0c030b2018417f6a2118200b41016a210b200841016a22082016490d000b0b200b450d00200820164f0d00200c200841286c6a22024100200b6b41286c6a2002201620086b41286c10dc051a0b02402016200b6b220720164f0d00200341e0016a41186a4200370300200341e0016a41106a22174200370300200341e0016a41086a22084200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002221641086a290000370300200320162900003703d0042016102c20082002290300370300200320032903d004220437038002200320043703e001200241b6c5c400ad4280808080d001841002221641086a290000370300200320162900003703d0042016102c201720032903d0042204370300200341c0016a41086a2008290300370300200341c0016a41106a2004370300200341c0016a41186a20022903003703002003200437039002200320032903e0013703c001200341203602d4032003200341c0016a3602d003200c2007200341d0036a10e204410021082006a7450d17200c102c410121160c280b41aa99c5002108411221072006a7450d26200c102c0c260b41fd97c500210841142107410121090c250b200341d0046a41146a4109360200200341dc046a410c36020020034188036a41146a41033602002003420337028c03200341ec9fc600360288032003410c3602d404200320034180026a3602a001200320034190026a3602e001200342043703e003200342013702d403200341c0a0c6003602d0032003200341d0046a360298032003200341d0036a3602e0042003200341e0016a3602d8042003200341a0016a3602d00420034188036a41fca0c6001041000b200820171047000b20092017103f000b200220091047000b103a000b41d696c5002108412521070c1f0b200341e8046a41186a200141196a290000370300200341e8046a41106a200141116a290000370300200341e8046a41086a200141096a290000370300200320012900013703e8042002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d00012119200320063703d00341002102201941ff01714101460d010b410121024100211741022118410021160b200320063701d801200320073a00d701200320083a00d601200320093b01d4012003200a3a00d3012003200b3a00d2012003200c3b01d0012003200d3a00cf012003200e3a00ce012003200f3b01cc01200320103a00cb01200320113a00ca01200320123b01c801200320133a00c701200320143a00c201200320153b01c0012003201741ffff0371410874201841ff01717220164118747222093600c30102402002450d0041d6b2c0002108410f210702400240024020090e051100010221110b410e210741dd8cc6002108410121090c210b4113210741c3b2c0002108410121090c200b4111210741b2b2c0002108410121090c1f0b200341c0026a41186a200341c0016a41186a290100370300200341c0026a41106a200341c0016a41106a290100370300200341c0026a41086a200341c0016a41086a290100370300200320032901c0013703c002200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d00437038002200241c3c5c400ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a200341e8046a109f0141c000102a2202450d202002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a290300370000200220032901e001370020200241286a200341e0016a41086a290100370000200241306a200341e0016a41106a290100370000200241386a200341e0016a41186a290100370000200341d0036a200241c00010ef03200341e0056a41086a2216200341d0036a41206a290300370300200341e0056a41106a200341d0036a41286a290300370300200341e0056a41186a2208200341d0036a41306a290300370300200341e0056a41206a2207200341d0036a41386a2802003602002003200341d0036a41186a2903003703e005024020032802e0032217450d00200341d0036a410c6a35020021052003418c046a280200211820032902d403210420032802e403210a20032802d003210d20034188056a41206a220b200728020036020020034188056a41186a2207200829030037030020034188056a41106a2208200341e0056a41106a220c29030037030020034188056a41086a22092016290300370300200320032903e005370388052002102c20034188036a41206a200b28020036020020034188036a41186a200729030037030020034188036a41106a200829030037030020034188036a41086a20092903003703002003200329038805370388032007200341a4036a29020037030020082003419c036a290200370300200920034188036a410c6a2902003703002003200329028c03370388050240200a450d002017102c0b200341d0036a41186a22164200370300200341d0036a41106a22084200370300200341d0036a41086a22074200370300200342003703d003200341d0046a41086a22024191b0c200ad4280808080e000841002220941086a290000370300200320092900003703d0042009102c20072002290300370300200320032903d0043703d003200241acb0c200ad4280808080e000841002220941086a290000370300200320092900003703d0042009102c200820032903d0042206370300200341e0056a41086a22092007290300370300200c2006370300200341e0056a41186a22172002290300370300200320063703e001200320032903d0033703e00520034198016a200341e0056a41201094010240200328029c0141002003280298011b20184180de344100200341c0026a20034188056a412010dd051b6a41809c316a4f0d0041092107419099c5002108410121090c200b200542208620044220888421052004422086200dad84211a20164200370300200341d0036a41106a220a420037030020074200370300200342003703d003200241bad6c500ad42808080809001841002221841086a290000370300200320182900003703d0042018102c20072002290300370300200320032903d0043703d003200241b6c5c400ad4280808080d001841002221841086a290000370300200320182900003703d0042018102c200341e0016a41086a20022903002206370300200320032903d00422043703e00120082004370000200841086a200637000020092007290300370300200341e0056a41106a200a29030037030020172016290300370300200320032903d0033703e005200341d0036a200341e0056a10f00320032802d0032202410420021b221620032902d403420020021b2206422088a741286c6a21082016210202400240034020022008460d010240200341e8046a200241046a2207460d00200741246a21022007200341e8046a412010dd050d010b0b410821072006a70d01419999c5002108410121090c210b200341d0036a20034188056a200341c0026a201a200510c001200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a22082002290300370300200320032903d00437038002200241c3c5c400ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a22072002290300370300200320032903d00437039002200341e0016a200341e8046a109f0141c000102a2202450d222002200329038002370000200241086a20082903003700002002200329039002370010200241186a2007290300370000200220032901e001370020200241286a200341e0016a41086a290100370000200241306a200341e0016a41106a290100370000200241386a200341e0016a41186a2901003700002002ad428080808080088410052002102c200341d0036a41086a410f3a0000200341d9036a20032903e804370000200341e1036a200341e8046a41086a290300370000200341e9036a200341e8046a41106a290300370000200341f1036a200341e8046a41186a290300370000200341f9036a20032903880537000020034181046a20034188056a41086a29030037000020034189046a20034188056a41106a29030037000020034191046a20034188056a41186a290300370000200341063a00d003200341c0046a201a370300200341c8046a2005370300200341b1046a200341c0026a41186a290300370000200341a9046a200341c0026a41106a290300370000200341a1046a200341c0026a41086a29030037000020034199046a20032903c002370000410021084101210941014100200341d0036a1092012006a7450d102016102c410121160c210b2016102c419999c5002108410121090c1f0b2002102c41092107410121094101211641a199c50021080c1f0b2001410c6a280200211d200141086a280200211c200141046a280200210a2002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241046a2d00002115200241026a2f0100211902400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d0001211e200320063703d00341002102201e41ff01714101460d010b410121024100211741022118410021160b200320063701d801200320073a00d701200320083a00d601200320093b01d4012003200b3a00d3012003200c3a00d2012003200d3b01d0012003200e3a00cf012003200f3a00ce01200320103b01cc01200320113a00cb01200320123a00ca01200320133b01c801200320143a00c701200320153a00c201200320193b01c0012003201741ffff0371410874201841ff01717220164118747222093600c301024002402002450d0041d6b2c0002108410f2107024002400240024020090e050001020305000b20032800c701210820032800cb0121070c040b41dd8cc6002108410e21070c030b41c3b2c0002108411321070c020b41b2b2c0002108411121070c010b20034188036a41186a200341c0016a41186a29010037030020034188036a41106a200341c0016a41106a29010037030020034188036a41086a200341c0016a41086a290100370300200320032901c00137038803200341d0036a41186a2207201dad422086200aad841006220241186a290000370300200341d0036a41106a2208200241106a290000370300200341d0036a41086a2209200241086a290000370300200320022900003703d0032002102c20034188056a41186a200729030037030020034188056a41106a200829030037030020034188056a41086a2009290300370300200320032903d00337038805200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d00437038002200241c3c5c400ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a20034188056a109f0141c000102a2202450d202002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a290300370000200220032901e001370020200241286a200341e0016a41086a290100370000200241306a200341e0016a41106a290100370000200241386a200341e0016a41186a29010037000020034190016a200241c00041014100410010970120032802900121072002102c024020074101470d0041ee98c5002108411621070c010b200341d0036a41186a4200370300200341d0036a41106a22094200370300200341d0036a41086a22074200370300200342003703d003200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d0043703d003200241b6c5c400ad4280808080d001841002220841086a290000370300200320082900003703d0042008102c200920032903d0042206370300200341e0056a41086a2007290300370300200341e0056a41106a2006370300200341e0056a41186a2002290300370300200320063703e001200320032903d0033703e005200341d0036a200341e0056a10f00320032802d0032202410420021b221720032902d403420020021b2206422088a741286c6a2108201721020240034020022008460d01024020034188056a200241046a2207460d00200741246a2102200720034188056a412010dd050d010b0b200341d0036a41186a22084200370300200341d0036a41106a22184200370300200341d0036a41086a22024200370300200342003703d003200341d0046a41086a22074191b0c200ad4280808080e000841002221641086a290000370300200320162900003703d0042016102c20022007290300370300200320032903d0043703d003200741acb0c200ad4280808080e000841002221641086a290000370300200320162900003703d0042016102c200341e0016a41086a20072903002204370300200320032903d00422053703e00120092005370000200941086a2004370000200341e0056a41086a22072002290300370300200341e0056a41106a22092018290300370300200341e0056a41186a22162008290300370300200320032903d0033703e00520034188016a200341e0056a4120109401200328028c012118200328028801210b201620034188056a41186a220c290300370300200920034188056a41106a220d290300370300200720034188056a41086a220929030037030020032003290388053703e0052008201d360200200341e4036a201c360200200341f4036a20034188036a41086a2207290300370200200341fc036a20034188036a41106a220829030037020020034184046a20034188036a41186a220e290300370200200342003703d803200342003703d0032003200a3602e00320032003290388033702ec0341002116200320184100200b1b36028c04200341e0056a200341d0036a10e304200341a8046a4200370300200341a0046a42003703002002410b3a0000200341d9036a200329038805370000200341e1036a2009290300370000200341e9036a200d290300370000200341f1036a200c290300370000200341f9036a20032903880337000020034181046a200729030037000020034189046a200829030037000020034191046a200e290300370000200341063a00d0034101210941014100200341d0036a10920102402006a7450d002017102c0b410021080c200b418499c5002108410c21072006a7450d002017102c0b4100211641012109201c450d1e200a102c0c1e0b2001410c6a280200211d200141086a280200210b200141046a280200210a2002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241046a2d00002119200241026a2f0100211c02400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d0001211e200320063703d00341002102201e41ff01714101460d010b410121024100211741022118410021160b200320063701d801200320073a00d701200320083a00d601200320093b01d4012003200c3a00d3012003200d3a00d2012003200e3b01d0012003200f3a00cf01200320103a00ce01200320113b01cc01200320123a00cb01200320133a00ca01200320143b01c801200320153a00c701200320193a00c2012003201c3b01c0012003201741ffff0371410874201841ff01717220164118747222093600c301024002402002450d0041d6b2c0002108410f2107024002400240024020090e050001020305000b20032800c701210820032800cb0121070c040b41dd8cc6002108410e21070c030b41c3b2c0002108411321070c020b41b2b2c0002108411121070c010b20034188036a41186a200341c0016a41186a29010037030020034188036a41106a200341c0016a41106a29010037030020034188036a41086a200341c0016a41086a290100370300200320032901c00137038803200341d0036a41186a2207201dad2206422086200aad841006220241186a290000370300200341d0036a41106a2208200241106a290000370300200341d0036a41086a2209200241086a290000370300200320022900003703d0032002102c20034188056a41186a200729030037030020034188056a41106a200829030037030020034188056a41086a2009290300370300200320032903d00337038805200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d00437038002200241c3c5c400ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a20034188056a109f0141c000102a2202450d1f2002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a290300370000200220032901e001370020200241286a200341e0016a41086a290100370000200241306a200341e0016a41106a290100370000200241386a200341e0016a41186a29010037000020034180016a200241c00041014100410010970120032802800121072002102c024020074101470d0041ee98c5002108411621070c010b200341e8006a200642004280a094a58d1d420010e005200341f8006a20034188036a20032903682206200341e8006a41086a290300220410c101024020032802782208450d00200328027c21070c010b200341d0036a41186a22094200370300200341d0036a41106a22164200370300200341d0036a41086a22024200370300200342003703d003200341d0046a41086a22074191b0c200ad4280808080e000841002220841086a290000370300200320082900003703d0042008102c20022007290300370300200320032903d0043703d003200741acb0c200ad4280808080e000841002220841086a290000370300200320082900003703d0042008102c201620032903d0042205370300200341e0056a41086a22082002290300370300200341e0056a41106a22162005370300200341e0056a41186a22172007290300370300200320053703e001200320032903d0033703e005200341e0006a200341e0056a41201094012003280264210720032802602118201720034188056a41186a220c290300370300201620034188056a41106a2217290300370300200820034188056a41086a221629030037030020032003290388053703e0052009201d360200200341e4036a200b360200200341f4036a20034188036a41086a2208290300370200200341fc036a20034188036a41106a220b29030037020020034184046a20034188036a41186a220d290300370200200320043703d803200320063703d0032003200a3602e00320032003290388033702ec034100210920032007410020181b36028c04200341e0056a200341d0036a10e304200341a8046a2004370300200341a0046a20063703002002410b3a0000200341d9036a200329038805370000200341e1036a2016290300370000200341e9036a2017290300370000200341f1036a200c290300370000200341f9036a20032903880337000020034181046a200829030037000020034189046a200b29030037000020034191046a200d290300370000200341063a00d0034101211641014100200341d0036a109201410021080c1e0b4101211641002109200b450d1d200a102c0c1d0b4101210920022d000120022d0000720d0d200341e0016a41186a4200370300200341e0016a41106a22164200370300200341e0016a41086a22074200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d004220637038002200320063703e001200241d5c5c400ad4280808080b001841002220841086a290000370300200320082900003703d0042008102c201620032903d0042206370300200341c0016a41086a2007290300370300200341c0016a41106a2006370300200341c0016a41186a20022903003703002003200637039002200320032903e0013703c001200341c0016aad4280808080800484100541002108410121160c1c0b200241196a2d00002117200241186a2d00002118200241166a2f0100210a2002411a6a2901002106200241156a3100002104200241146a3100002105200241126a330100211a200241116a2d00002113200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d000021112002410c6a2d0000210d2002410a6a2f0100210e200241096a2d00002112200241046a2d0000211441022116200241026a2f01002115024002400240024020022d0000450d00200320063702d403200320173a00d303200320183a00d2032003200a3b01d003410121070c010b200241086a2d00002108200241066a2f01002109200241056a2d0000211d20022d00012102200320063703d00341012107200241ff01714101460d010b41002109410021080c010b2006423888a7211c2006422088a721102006421888a721192006a7210f41002107201d21160b200b411074200c41ffff037172210b200d411074200e41ffff037172210c2008411074200941ffff037172210202402007450d0041d6b2c0002108410f210702402002410874201641ff0171720e050008090a1b000b200c4108742012722108200b4108742011722107410121090c1b0b200320103b01bc02200341be026a20104110763a00002003200f3b01b802200341ba026a200f4110763a00002003200b3b01ac02200341ae026a200b4110763a00002003200c3b01a802200341aa026a200c4110763a0000200320143a00a202200320153b01a0022003201c3a00bf02200320193a00bb02200320133a00af02200320113a00ab02200320123a00a702200320163a00a302200320023b01a402200320024110763a00a60220032005421086201a84200442188684200aad42ffff0383422086842018ad42ff0183423086842017ad42ff0183423886843703b002200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a22082002290300370300200320032903d00437038002200241e0b4c400ad4280808080b001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a22072002290300370300200320032903d0043703900220034188036a200341a0026a109f0141c000102a2202450d1c2002200329038002370000200241086a20082903003700002002200329039002370010200241186a20072903003700002002200329038803370020200241286a20034188036a41086a290300370000200241306a20034198036a290300370000200241386a20034188036a41186a290300370000200341d8006a200241c000410141004100109701200328025821072002102c024020074101460d0041e198c5002108410d2107410121090c1b0b200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a22082002290300370300200320032903d00437038002200241e0b4c400ad4280808080b001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a22072002290300370300200320032903d0043703900220034188036a200341a0026a109f0141c000102a2202450d1c2002200329038002370000200241086a20082903003700002002200329039002370010200241186a20072903003700002002200329038803370020200241286a20034188036a41086a290300370000200241306a20034188036a41106a290300370000200241386a20034188036a41186a290300370000200341d0036a200241c00010e803024020032d00f103220841024622160d002002ad428080808080088410050b200341e8046a41186a2209200341d0036a41186a290300370300200341e8046a41106a2217200341d0036a41106a290300370300200341e8046a41086a2218200341d0036a41086a2207290300370300200320032903d0033703e80420032d00f003210a200341c0026a200341d0036a41226a41c10010db051a200341e0016a41086a220b2018290300370300200341e0016a41106a2017290300370300200341e0016a41186a2009290300370300200320032903e8043703e00120034188036a200341c0026a41c10010db051a41072109024020160d00200341c0016a41186a200341e0016a41186a290300370300200341c0016a41106a200341e0016a41106a290300370300200341c0016a41086a200b290300370300200320032903e0013703c001200320083a00880520034188056a41017220034188036a41c10010db05211620034188056a41226a21090240024020032d00a9054101460d00200341003602d0050c010b200341d0056a200910d50420032d00880521080b02400240024002400240200841ff01714101460d0020034100360280020c010b20034180026a201610d5042003280280020d010b024020032d00a9054101460d00200341d0036a10d00420033502d80342208620032802d0032208ad84100520032802d403450d022008102c0c020b200341d0036a10d00420032802d0032108200320032802d8033602e405200320083602e0052009200341e0056a10a10220032802d403450d012008102c0c010b20034190026a41086a20034180026a41086a28020022093602002003200329038002220637039002200341e0056a2006a72217200910e8030240024020032d0081064102470d00200341003602d804200342013703d004200341a0016a41146a410d360200200341ac016a410b360200200341093602cc06200341bad6c5003602c8062003410b3602a4012003410b3602d406200341e0b4c4003602d006200320034190026a3602b0012003200341d0066a3602a8012003200341c8066a3602a0012003200341d0046a3602dc06200341d0036a41146a4103360200200342033702d403200341849dc5003602d0032003200341a0016a3602e003200341dc066a41c49ac500200341d0036a10391a20033502d80442208620033502d00484100420032802d404450d0120032802d004102c0c010b200341d0036a200341e0056a41c20010db051a200341b2046a200341a9056a220841206a2d00003a0000200341aa046a200841186a290000370100200341a2046a200841106a2900003701002003419a046a200841086a290000370100200341d0036a41c2006a2008290000370100200341003602a801200342013703a001200341d0036a200341a0016a109101024020032d00f003220841064b0d000240024002400240024002400240024020080e0700010203040506000b410021160c060b410121160c050b410221160c040b410321160c030b410421160c020b410521160c010b410621160b200320163a00d0040240024020032802a40120032802a8012208460d0020032802a00121180c010b200841016a22162008490d23200841017422182016201820164b1b22164100480d230240024020080d002016102a21180c010b20032802a00120082016102e21180b2018450d22200320163602a401200320183602a00120032d00d004211620032802a80121080b2003200841016a3602a801201820086a20163a00000b200341f1036a200341a0016a10a30220032802a40121082009ad4220862017ad8420033502a80142208620032802a0012209ad8410012008450d002009102c0b0240200328029402450d00200328029002102c0b410121090c010b410021090b0240024020032802d00522080d00410021160c010b20034190026a41086a200341d0056a41086a2802002217360200200320032903d005220637039002200341e0056a2006a7220b201710e8030240024020032d0081064102470d00200341003602a801200342013703a001200341d0046a41146a410d360200200341dc046a410b360200200341093602cc06200341bad6c5003602c8062003410b3602d4042003410b3602d406200341e0b4c4003602d006200320034190026a3602e0042003200341d0066a3602d8042003200341c8066a3602d0042003200341a0016a3602dc06200341d0036a41146a4103360200200342033702d403200341a89cc5003602d0032003200341d0046a3602e003200341dc066a41c49ac500200341d0036a10391a20033502a80142208620033502a00184100420032802a401450d0120032802a001102c0c010b200341d0036a200341e0056a41e30010db051a20034191046a200341a8056a2d00003a000020034189046a200341a0056a29030037000020034181046a20034198056a290300370000200341f9036a20034188056a41086a29030037000020032003290388053700f103200341003602a801200342013703a001200341d0036a200341a0016a109101024020032d00f003221641064b0d000240024002400240024002400240024020160e0700010203040506000b410021180c060b410121180c050b410221180c040b410321180c030b410421180c020b410521180c010b410621180b200320183a00d0040240024020032802a40120032802a8012216460d0020032802a001210c0c010b201641016a22182016490d222016410174220c2018200c20184b1b22184100480d220240024020160d002018102a210c0c010b20032802a00120162018102e210c0b200c450d21200320183602a4012003200c3602a00120032d00d004211820032802a80121160b2003201641016a3602a801200c20166a20183a00000b200341f1036a200341a0016a10a30220032802a40121162017ad422086200bad8420033502a80142208620032802a0012217ad8410012016450d002017102c0b0240200328029402450d00200328029002102c0b410121160b02402009200328028002221745720d00200328028402450d002017102c0b02402016200845720d0020032802d405450d002008102c0b200a21090b2002102c200341d0036a41186a4200370300200341d0036a41106a2216420037030020074200370300200342003703d003200341d0046a41086a22024191b0c200ad4280808080e000841002220841086a290000370300200320082900003703d0042008102c20072002290300370300200320032903d0043703d003200241acb0c200ad4280808080e000841002220841086a290000370300200320082900003703d0042008102c201620032903d0042206370300200341e0056a41086a2007290300370300200341e0056a41106a2006370300200341e0056a41186a2002290300370300200320063703e001200320032903d0033703e005200341d0006a200341e0056a4120109401200342e4cab5fbb6ccdcb0e300370388054100210820034188056a200341a0026a427f427f41002009200941ff01714107461b4118744118754102744180d6c5006a2802004180de346c2003280254410020032802501b6a410210be01200741093a0000200341d0036a41096a20032903a002370000200341e1036a200341a0026a41086a290300370000200341e9036a200341a0026a41106a290300370000200341f1036a200341a0026a41186a290300370000200341063a00d00341014100200341d0036a1092010c180b200141216a2d00002116200341a0016a41186a200141196a290000370300200341a0016a41106a200141116a290000370300200341a0016a41086a200141096a290000370300200320012900013703a0012002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241046a2d00002115200241026a2f0100211902400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002117200241066a2f01002118200241056a2d0000210a20022d0001211c200320063703d00341002102201c41ff01714101460d010b41012102410021184102210a410021170b200320063703d801200320073a00d701200320083a00d601200320093b01d4012003200b3a00d3012003200c3a00d2012003200d3b01d0012003200e3a00cf012003200f3a00ce01200320103b01cc01200320113a00cb01200320123a00ca01200320133b01c801200320143a00c701200320153a00c201200320193b01c0012003201841ffff0371410874200a41ff01717220174118747222093600c30102402002450d0041d6b2c0002108410f210720090e050906070819090b200341a0026a41186a200341c0016a41186a290300370300200341a0026a41106a200341c0016a41106a290300370300200341a0026a41086a200341c0016a41086a290300370300200320032903c0013703a002200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d00437038002200241e0b4c400ad4280808080b001841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a200341a0026a109f0141c000102a2202450d1b2002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a290300370000200220032903e001370020200241286a200341e0016a41086a290300370000200241306a200341e0016a41106a290300370000200241386a200341e0016a41186a290300370000200341e0056a200241c00010e80302400240024020032d00810622074102470d002003200341a0026a3602d006200341d0036a10d004200341c0026a20032802d003220720032802d80310d301024020032802d403450d002007102c0b024020032d00c0020d00200341d0036a10d00420032802d0032107200320032802d80336028c052003200736028805200341a0026a20034188056a10a10220032802d403450d022007102c0c020b200341e8046a41186a200341d9026a290000370300200341e8046a41106a200341d1026a290000370300200341e8046a41086a200341c0026a41096a290000370300200320032900c1023703e804200341c0016a200341e8046a10d504200341d0036a20032802c001220920032802c801221710e803024020032d00f1034102470d0020034100360290032003420137038803200341d0046a41146a410d360200200341dc046a410b3602002003410936029402200341bad6c500360290022003410b3602d4042003410b3602e401200341e0b4c4003602e0012003200341c0016a3602e0042003200341e0016a3602d804200320034190026a3602d004200320034188036a3602800220034188056a41146a41033602002003420337028c05200341c09dc500360288052003200341d0046a3602980520034180026a41c49ac50020034188056a10391a20033502900342208620033502880384100420032802d006210820034188056a10d004200328028805210720032003280290053602e401200320073602e0012008200341e0016a10a1020240200328028c05450d002007102c0b0240200328028c03450d00200328028803102c0b20032802c401450d0220032802c001102c0c020b20034188056a200341f1036a41c20010db051a20032d00a905210720034188036a41206a2208200341d0036a41206a2d00003a000020034188036a41186a200341d0036a41186a29030037030020034188036a41106a200341d0036a41106a29030037030020034188036a41086a200341d0036a41086a290300370300200341b0036a200341aa056a410020074101461b360200200320032903d003370388032003200341d0066a3602ac03200341003602e801200342013703e00120034188036a200341e0016a109101024020082d0000220741064b0d000240024002400240024002400240024020070e0700010203040506000b410021080c060b410121080c050b410221080c040b410321080c030b410421080c020b410521080c010b410621080b200320083a00d0040240024020032802e40120032802e8012207460d0020032802e00121180c010b200741016a22082007490d21200741017422182008201820084b1b22084100480d210240024020070d002008102a21180c010b20032802e00120072008102e21180b2018450d20200320083602e401200320183602e00120032d00d004210820032802e80121070b2003200741016a3602e801201820076a20083a00000b200341ac036a200341e0016a10a20220032802e40121072017ad4220862009ad8420033502e80142208620032802e0012208ad84100102402007450d002008102c0b024020032802c401450d0020032802c001102c0b20032802d0062108200341d0036a10d00420032802d0032107200320032802d80336028c052003200736028805200820034188056a10a102024020032802d403450d002007102c0b20034188036a41086a200341e8046a41086a29030037030020034188036a41106a200341e8046a41106a29030037030020034188036a41186a200341e8046a41186a290300370300200320032903e8043703880341012108410021070c020b20034188056a41186a2003419a066a29010037030020034188056a41106a20034192066a29010037030020034188056a41086a2003418a066a29010037030020034188036a41086a200341ab066a29000037030020034188036a41106a200341b3066a29000037030020034188036a41186a200341bb066a2900003703002003200329018206370388052003200341a3066a29000037038803200341a2066a2d000021080c010b41002108410021070b200341d9036a200329038805370000200341f9036a20083a0000200341fa036a200329038803370100200341e1036a20034188056a41086a290300370000200341e9036a20034188056a41106a290300370000200341f1036a20034188056a41186a29030037000020034182046a20034188036a41086a2903003701002003418a046a20034188036a41106a29030037010020034192046a20034188036a41186a290300370100200320073a00d803200320163a00d4032003200341a0016a3602d003200341003602e805200342013703e005200341a0016a200341e0056a1091010240201641064b0d000240024002400240024002400240024020160e0700010203040506000b410021080c060b410121080c050b410221080c040b410321080c030b410421080c020b410521080c010b410621080b200320083a00d0040240024020032802e40520032802e8052207460d0020032802e00521090c010b200741016a22082007490d1e200741017422092008200920084b1b22084100480d1e0240024020070d002008102a21090c010b20032802e00520072008102e21090b2009450d1d200320083602e405200320093602e00520032d00d004210820032802e80521070b2003200741016a3602e805200920076a20083a00000b200341d0036a41086a200341e0056a10a30220032802e40521072002ad428080808080088420033502e80542208620032802e0052208ad84100102402007450d002008102c0b2002102c200342e4cab5fbb6ccdcb0e3003703d005200341d0056a200341a0026a417f10bd01200341d0036a41086a41083a0000200341d9036a20032903a002370000200341e1036a200341a0026a41086a290300370000200341e9036a200341a0026a41106a290300370000200341f1036a200341a0026a41186a290300370000200341f9036a20032903a00137000020034181046a200341a0016a41086a29030037000020034189046a200341a0016a41106a29030037000020034191046a200341a0016a41186a290300370000200341063a00d003410021084101210941014100200341d0036a109201410121160c1a0b20034188036a41186a200141196a29000037030020034188036a41106a200141116a29000037030020034188036a41086a200141096a29000037030020032001290001370388032002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d00012119200320063703d00341002102201941ff01714101460d010b410121024100211741022118410021160b200320063703d801200320073a00d701200320083a00d601200320093b01d4012003200a3a00d3012003200b3a00d2012003200c3b01d0012003200d3a00cf012003200e3a00ce012003200f3b01cc01200320103a00cb01200320113a00ca01200320123b01c801200320133a00c701200320143a00c201200320153b01c0012003201741ffff0371410874201841ff01717220164118747222093600c30102402002450d0041d6b2c0002108410f210720090e050805060718080b20034188056a41186a200341c0016a41186a29030037030020034188056a41106a200341c0016a41106a29030037030020034188056a41086a200341c0016a41086a290300370300200320032903c00137038805200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d0043703800220024188fbc400ad4280808080d000841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a20034188036a109f0141c000102a2202450d1a2002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a290300370000200220032903e001370020200241286a200341e0016a41086a2208290300370000200241306a200341e0016a41106a2209290300370000200241386a200341e0016a41186a2207290300370000200341d0036a200241c00010d3012008200341d9036a2900003703002009200341e1036a2900003703002007200341e9036a290000370300200320032900d1033703e001410121090240024020032d00d0034101460d00410021160c010b200341a2016a20032d00e2013a0000200341a0026a41086a200341f3016a290000370300200341ad026a2007290000370000200320032f01e0013b01a001200320032900eb013703a0024101211620032800e701210720032800e30121080b2002102c0240024020160d00410b210741cb96c50021080c010b200341d0056a41026a200341a0016a41026a2d00003a0000200341c0026a41086a200341a0026a41086a290300370300200341c0026a410d6a200341a0026a410d6a290000370000200320032f01a0013b01d005200320032903a0023703c002410021090b200341d0066a41026a2202200341d0056a41026a2d00003a0000200341e8046a41086a2216200341c0026a41086a290300370300200341e8046a41106a200341c0026a41106a290300370300200320032f01d0053b01d006200320032903c0023703e80420090d17200341f3056a2016290300370000200341e0056a41186a200341f5046a290000370000200320032f01d0063b01e005200320073600e705200320083600e305200320032903e8043700eb05200320022d00003a00e2050240200341e0056a20034188056a412010dd05450d0041d698c5002108410b2107410121090c190b200341d0036a41186a20034188036a41186a290300370300200341d0036a41106a20034188036a41106a290300370300200341d0036a41086a20034188036a41086a29030037030020032003290388033703d003200341d0036a10e404410021080c160b2002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d00012119200320063703d00341002102201941ff01714101460d010b410121024100211741022118410021160b200320063703f801200320073a00f701200320083a00f601200320093b01f4012003200a3a00f3012003200b3a00f2012003200c3b01f0012003200d3a00ef012003200e3a00ee012003200f3b01ec01200320103a00eb01200320113a00ea01200320123b01e801200320133a00e701200320143a00e201200320153b01e0012003201741ffff0371410874201841ff01717220164118747222093600e3012002450d0141d6b2c0002108410f210720090e050003040516000b20032800e701210820032800eb012107410121090c160b200341c0016a41186a200341e0016a41186a2903002206370300200341c0016a41106a200341e0016a41106a2903002204370300200341c0016a41086a200341e0016a41086a2903002205370300200320032903e001221a3703c001200341d0036a41186a2006370300200341d0036a41106a2004370300200341d0036a41086a20053703002003201a3703d003200341d0036a10e4040c0d0b20034188056a41186a200141196a29000037030020034188056a41106a200141116a29000037030020034188056a41086a200141096a29000037030020032001290001370388052002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241046a2d00002114200241026a2f0100211502400240024020022d0000450d00200320063702d403200320073a00d303200320083a00d203200320093b01d0030c010b200241086a2d00002116200241066a2f01002117200241056a2d0000211820022d00012119200320063703d00341002102201941ff01714101460d010b410121024100211741022118410021160b200320063703d801200320073a00d701200320083a00d601200320093b01d4012003200a3a00d3012003200b3a00d2012003200c3b01d0012003200d3a00cf012003200e3a00ce012003200f3b01cc01200320103a00cb01200320113a00ca01200320123b01c801200320133a00c701200320143a00c201200320153b01c0012003201741ffff0371410874201841ff01717220164118747222093600c30102402002450d0041d6b2c0002108410f210720090e050401020314040b20034188036a41186a200341c0016a41186a29030037030020034188036a41106a200341c0016a41106a29030037030020034188036a41086a200341c0016a41086a290300370300200320032903c00137038803200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20034180026a41086a2002290300370300200320032903d0043703800220024188fbc400ad4280808080d000841002220741086a290000370300200320072900003703d0042007102c20034190026a41086a2002290300370300200320032903d00437039002200341e0016a20034188056a109f0141c000102a2202450d162002200329038002370000200241086a20034180026a41086a22082903003700002002200329039002370010200241186a20034190026a41086a2209290300370000200220032903e001370020200241286a200341e0016a41086a290300370000200241306a200341e0016a41106a290300370000200241386a200341e0016a41186a290300370000200341c8006a200241c000410141004100109701200328024821072002102c024020074101470d0041c798c5002108410f2107410121090c150b200341e0056a41186a20034188036a41186a290300370300200341e0056a41106a20034188036a41106a290300370300200341e0056a41086a20034188036a41086a29030037030020032003290388033703e005200341d0036a41186a20034188056a41186a290300370300200341d0036a41106a20034188056a41106a290300370300200341d0036a41086a20034188056a41086a29030037030020032003290388053703d003200341d0046a41086a220241bad6c500ad42808080809001841002220741086a290000370300200320072900003703d0042007102c20082002290300370300200320032903d0043703800220024188fbc400ad4280808080d000841002220741086a290000370300200320072900003703d0042007102c20092002290300370300200320032903d00437039002200341e0016a200341d0036a109f0141c000102a2202450d162002200329038002370000200241086a20034180026a41086a2903003700002002200329039002370010200241186a20034190026a41086a290300370000200220032903e001370020200241286a200341e0016a41086a290300370000200241306a200341e0016a41106a290300370000200241386a200341e0016a41186a290300370000200341c0003602d403200320023602d003200341e0056a200341d0036a10a1022002102c410021080c120b41dd8cc6002108410e2107410121090c130b41c3b2c000210841132107410121090c120b41b2b2c000210841112107410121090c110b20032800c701210820032800cb012107410121090c100b410121160c100b41a8b4c000200820161038000b41b2b2c0002108411121070c0d0b200341d0036a41186a20034188056a41186a290300370300200341d0036a41106a20034188056a41106a290300370300200341d0036a41086a20034188056a41086a29030037030020032003290388053703d003200341d0036a2108410021160b024002402007200a460d002018210a0c010b024020182007460d002018210a0c010b201841016a22022018490d0f2018410174220a2002200a20024b1b220a41ffffff3f71200a470d0f200a41057422024100480d0f0240024020180d002002102a21170c010b201720184105742002102e21170b2017450d0e0b201720164105746a220241206a2002200720166b41057410dc051a200241186a200841186a290000370000200241106a200841106a290000370000200241086a200841086a29000037000020022008290000370000200341d0036a41186a4200370300200341d0036a41106a22184200370300200341d0036a41086a22084200370300200342003703d003200341d0046a41086a22024191b0c200ad4280808080e000841002221641086a290000370300200320162900003703d0042016102c20082002290300370300200320032903d0043703d003200241acb0c200ad4280808080e000841002221641086a290000370300200320162900003703d0042016102c201820032903d0042206370300200341e0056a41086a2008290300370300200341e0056a41106a2006370300200341e0056a41186a2002290300370300200320063703e001200320032903d0033703e005200341c0006a200341e0056a41201094012003280240211620032802442118200241bad6c500ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20034180026a41086a220b2002290300370300200320032903d00437038002200241bcfcc400ad42808080809001841002220841086a290000370300200320082900003703d0042008102c20034190026a41086a220c2002290300370300200320032903d00437039002200341e0016a200341c0026a109f0141c000102a2208450d0d2008200329038002370000200841086a200b2903003700002008200329039002370010200841186a200c290300370000200820032903e001370020200841286a200341e0016a41086a290300370000200841306a200341e0016a41106a290300370000200841386a200341e0016a41186a2903003700004104102a2202450d0d20034284808080c0003702d403200320023602d0032002201841809c316a41809c3120161b2216360000200741016a2202200341d0036a106702402002450d00200741057441206a21072017210203402002200341d0036a109101200241206a2102200741606a22070d000b0b20032802d40321022008ad428080808080088420033502d80342208620032802d0032207ad84100102402002450d002007102c0b2008102c0240200a450d002017102c0b200341d0036a41086a410a3a0000200341d9036a200329038805370000200341f9036a20032903c002370000200341e1036a20034188056a41086a290300370000200341e9036a20034188056a41106a290300370000200341f1036a20034188056a41186a29030037000020034181046a200341c0026a41086a29030037000020034189046a200341c0026a41106a29030037000020034191046a200341c0026a41186a290300370000200341063a00d0032003419c046a20163602004100210841014100200341d0036a109201200341e0016a41186a22174200370300200341e0016a41106a22184200370300200341e0016a41086a22074200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002221641086a290000370300200320162900003703d0042016102c20072002290300370300200320032903d004220637038002200320063703e00120024184c6c400ad4280808080c001841002221641086a290000370300200320162900003703d0042016102c20034190026a41086a20022903002206370300200320032903d00422043703900220092004370000200941086a2006370000200341c0016a41086a2007290300370300200341c0016a41106a2018290300370300200341c0016a41186a2017290300370300200320032903e0013703c001200341c0016aad428080808080048410050c090b410021080b410e2107410121090c090b41222107410121090c080b4100210841012109410121160c080b41b196c5002108411a21072002450d052009102c410121090c060b20032802a802210820032802a402210920032802a00221020b2002450d00201a2008ad4220862002ad8410012009450d012002102c0c010b200341e0016a41186a22174200370300200341e0016a41106a22184200370300200341e0016a41086a22084200370300200342003703e001200341d0046a41086a220241bad6c500ad42808080809001841002220941086a290000370300200320092900003703d0042009102c20082002290300370300200320032903d004220637038002200320063703e001200241d5c5c400ad4280808080b001841002220941086a290000370300200320092900003703d0042009102c20034190026a41086a20022903002206370300200320032903d004221b370390022007201b370000200741086a2006370000200341c0016a41086a2008290300370300200341c0016a41106a2018290300370300200341c0016a41186a2017290300370300200320032903e0013703c001200341003602d803200342013703d0034101200341d0036a106720032802d005220828020021090240024020032802d403220720032802d80322026b4104490d0020032802d00321070c010b200241046a22172002490d07200741017422022017200220174b1b22024100480d070240024020070d002002102a21070c010b20032802d00320072002102e21070b2007450d06200320023602d403200320073602d00320032802d80321020b2003200241046a3602d803200720026a20093600002003200341d0036a36028803200841046a20034188036a109402200841246a200341d0036a10910120032802d4032102201a20033502d80342208620032802d0032207ad8410012002450d002007102c0b200341e8036a2004370300200341e0036a2005370300200341dc036a201636020041002108200341d8036a41003a0000200341063a00d00341014100200341d0036a1092010b0b410121090b410121160b20012d0000221741736a220241074b0d0220020e080502050502020403050b1033000b1035000b2017416d6a220241014b0d020240024020020e020001000b200141086a280200450d03200141046a280200102c0c030b200141086a280200450d02200141046a280200102c0c020b2016450d01200141086a280200450d01200141046a280200102c0c010b2009450d00200141086a280200450d00200141046a280200102c0b2000200736020420002008360200200341e0066a24000b860501087f230041a0016b22022400200241086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703002004102c20024180016a41086a220520032903003703002002200229030037038001200341d9f8c200ad4280808080e000841002220441086a290000370300200220042900003703002004102c200241d0006a41086a220620032903003703002002200229030037035020022001109f01024041c000102a2204450d0020042002290380013700002004200229035037001020042002290000370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241106a2201290000370000200441386a200241186a22072900003700002002200441c00010e6032005200329030037030020024180016a41106a2205200129030037030020024180016a41186a2201200729030037030020062002412c6a290200370300200241d0006a41106a2206200241346a290200370300200241d0006a41186a22072002413c6a290200370300200241f0006a2208200241c4006a290200370300200241d0006a41286a2209200241cc006a280200360200200220022903003703800120022002290224370350024020022802202203450d00200020022903800137030020002002290350370224200041186a2001290300370300200041106a2005290300370300200041086a20024180016a41086a2903003703002000412c6a200241d0006a41086a290300370200200041346a20062903003702002000413c6a2007290300370200200041c4006a2008290300370200200041cc006a20092802003602000b200020033602202004102c200241a0016a24000f0b1033000b85c70105017f027e157f077e017f230041c0056b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e1100010203060708090a0b0c0d0e0f101112000b200341b4046a4101360200200342013702a404200341fcc4c5003602a0042003410436028c02200341f4c4c50036028802200320034188026a3602b004200341a0046a4184c5c5001041000b200141306a2903002104200141286a290300210520012d00012106200341e0026a41026a200141076a2d00003a0000200341d8036a41086a200141146a290200370300200341d8036a41106a2001411c6a290200370300200341d8036a41186a200141246a2802003602002003200141056a2f00003b01e00220032001410c6a2902003703d8030240024020022d00000d0020022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c220b200141046a2d00002107200141086a2802002108200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241086a2d00002116200241066a2f01002117200241056a2d00002118200241046a2d00002119200241026a2f0100211a20032002411a6a2901003703d001200320093a00cf012003200a3a00ce012003200b3b01cc012003200c3a00cb012003200d3a00ca012003200e3b01c8012003200f3a00c701200320103a00c601200320113b01c401200320123a00c301200320193a00ba012003201a3b01b801200320152014410874722013411874723600bf01200320182017410874722016411874723600bb01200341c0036a41086a22024196e0c500ad4280808080f000841002220941086a290000370300200320092900003703c0032009102c20034188016a41086a220a2002290300370300200320032903c00337038801200241d3f8c200ad4280808080e000841002220941086a290000370300200320092900003703c0032009102c20034188026a41086a22092002290300370300200320032903c00337038802200341f8046a200341b8016a109f0141c000102a2202450d232002200329038801370000200241086a200a2903003700002002200329038802370010200241186a2009290300370000200220032903f804370020200241286a200341f8046a41086a290300370000200241306a200341f8046a41106a290300370000200241386a200341f8046a41186a29030037000041012109200341206a200241c0004101410041001097012003280220210a2002102c200a4101460d11200341c0036a41026a2202200341e0026a41026a2d00003a0000200341a0046a41086a2209200341d8036a41086a290300370300200341a0046a41106a200341d8036a41106a290300370300200341a0046a41186a220a200341d8036a41186a280200360200200320032f01e0023b01c003200320032903d8033703a0040240200741ff01714101460d00200341a8016a41026a20022d00003a0000200341f8046a41086a2009290300370300200341f8046a41106a200341a0046a41106a290300370300200341f8046a41186a200a2d00003a0000200320032f01c0033b01a801200320032903a0043703f8040c1e0b200341a0036a200841067610910220032802a00321090240024020032802a8032008413f7122024b0d00410021020c010b200341a8016a41026a200920024105746a220241026a2d00003a000020034180056a2002410f6a29000037030020034188056a200241176a29000037030020034190056a2002411f6a2d00003a0000200320022f00003b01a801200320022900073703f80420022800032108410121020b024020032802a403450d002009102c0b20020d1d410121020c1e0b0240024020022d00000d0020022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c210b200141106a2903002104200141086a2903002105200241196a2d00002109200241186a2d00002106200241166a2f01002108200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241086a2d00002114200241066a2f01002115200241056a2d00002116200241046a2d00002117200241026a2f0100211820032002411a6a29010037039005200320093a008f05200320063a008e05200320083b018c052003200a3a008b052003200b3a008a052003200c3b0188052003200d3a0087052003200e3a0086052003200f3b018405200320103a008305200320173a00fa04200320183b01f804200320132012410874722011411874723600ff04200320162015410874722014411874723600fb04200341a0046a200341f8046a109804024020032d00a0044101460d00200041033602000c210b200341d8036a41086a200341a0046a41186a290300221b370300200341d8036a41106a2209200341c0046a2d000022023a00002003200341a0046a41106a290300221c3703d803200320032802a4043600bb01200320032d00a3043a00ba01200320032f00a1043b01b8012003200341a0046a41086a2903003700bf01200341d7016a20023a0000200341cf016a201b3700002003201c3700c701200341a0046a200341b8016a10f9020240024020032802c00422080d00410121060c010b20034188046a200341db046a29000037030020034180046a41106a200341e3046a29000037030020034180046a41186a200341eb046a2d00003a0000200320032900d304370380042003200341cc046a2f01003b01e0022003200341ce046a2d00003a00e202200341a0046a41186a290300211d200341c8046a280200210a200341cf046a280000210b20032903b004211c20032802c404210220032903a804211e20032903a004211b200341ec046a280200210c410021060b200341d8036a41086a220d20034180046a41086a290300370300200920034180046a41106a290300370300200341d8036a41186a220920034180046a41186a2d00003a0000200320032f01e0023b01a003200320032d00e2023a00a20320032003290380043703d80320060d0120034188026a41186a201d370300200341b0026a200a360200200341ac026a2002360200200341b6026a20032d00a2033a0000200341b7026a200b360000200341bb026a20032903d803370000200341c3026a200d290300370000200341cb026a200341e8036a290300370000200341d3026a20092d00003a00002003201c37039802200320083602a8022003201e370390022003201b37038802200320032f01a0033b01b4022003200c3602d402200341286a200341f8046a10b70102402003290328221b200329038802221f7d2220201b56200341286a41086a290300221e20032903900222217d201b201f54ad7d221b201e56201b201e511b0d002003200520202020200556201b200456201b2004511b22021b2205201c7c221c37039802200341a0026a2004201b20021b2204201d7c201c200554ad7c37030020032005201f7c221b370388022003200420217c201b200554ad7c37039002200341b8016a20034188026a10990420032802ac0221020b02402002450d0020032802a802102c0b2000410c3602000c200b0240024020022d00000d004101210920022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c200b200141106a290300211c200141086a290300211d200241196a2d00002106200241186a2d00002108200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241086a2d00002115200241066a2f01002116200241056a2d00002117200241046a2d00002118200241026a2f0100211920032002411a6a2901003703d001200320063a00cf01200320083a00ce012003200a3b01cc012003200b3a00cb012003200c3a00ca012003200d3b01c8012003200e3a00c7012003200f3a00c601200320103b01c401200320113a00c301200320183a00ba01200320193b01b801200320142013410874722012411874723600bf01200320172016410874722015411874723600bb01200341a0046a200341b8016a10f9020240024020032802c00422080d000c010b20034180046a41086a200341db046a29000037030020034190046a200341e3046a29000037030020034180046a41186a200341eb046a2d00003a0000200320032900d304370380042003200341cc046a2f01003b01e0022003200341ce046a2d00003a00e202200341a0046a41186a2903002104200341c8046a2802002106200341cf046a280000210a20032903b004210520032802c404210220032903a804211e20032903a004211b200341ec046a280200210b410021090b200341f8046a41086a20034180046a41086a290300370300200341f8046a41106a220c20034180046a41106a290300370300200341f8046a41186a20034180046a41186a2d00003a0000200320032f01e0023b01d803200320032d00e2023a00da0320032003290380043703f8042009450d012000201b370204200041023602000c1f0b2000201b370204200041023602000c1e0b20034188026a41186a2004370300200341b0026a2006360200200341ac026a2002360200200341b6026a20032d00da033a0000200341b7026a200a360000200341bb026a20032903f804370000200341c3026a20034180056a290300370000200341cb026a200c290300370000200341d3026a200341f8046a41186a2d00003a00002003200537039802200320083602a8022003201e370390022003201b37038802200320032f01d8033b01b4022003200b3602d40202400240024002402006411f4b0d002005201d2005201d542004201c542004201c511b22091b221b2004201c20091b221c84500d0320034188026a41186a42002004201c7d2005201b54ad7d221d2005201b7d221e428080e983b1de16544100201d501b22091b37030020034200201e20091b37039802200341a0046a41186a4200370300200341a0046a41106a220d4200370300200341a0046a41086a220b4200370300200342003703a004200341c0036a41086a220a4196e0c500ad4280808080f000841002220c41086a2900003703002003200c2900003703c003200c102c200b200a290300370300200320032903c003221d3703a8012003201d3703a004200a419de0c500ad4280808080a001841002220c41086a2900003703002003200c2900003703c003200c102c200d20032903c003221d370300200341f8046a41086a200b290300370300200341f8046a41106a201d370300200341f8046a41186a200a2903003703002003201d37038004200320032903a0043703f804200341386a200341f8046a4120109401200328023c210a2003280238210b20062002470d02200241016a22062002490d1c2002410174220c2006200c20064b1b220cad42187e221d422088a70d1c201da7220641004e0d010c1c0b2000410b3602002002450d202008102c0c200b0240024020020d002006102a21080c010b2008200241186c2006102e21080b2008450d212003200c3602ac02200320083602a80220032802b00221060b2008200641186c6a22022004201c20091b37030820022005201b20091b3703002002200a41a0056a41a005200b1b360210200320032802b00241016a3602b002200341b8016a20034188026a10990420032802ac0221020b02402002450d0020032802a802102c0b2000410c3602000c1d0b0240024020022d00000d004101210920022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c1d0b200241196a2d00002106200241186a2d00002108200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241086a2d00002115200241066a2f01002116200241056a2d00002117200241046a2d00002118200241026a2f0100211920032002411a6a2901003703f003200320063a00ef03200320083a00ee032003200a3b01ec032003200b3a00eb032003200c3a00ea032003200d3b01e8032003200e3a00e7032003200f3a00e603200320103b01e403200320113a00e303200320183a00da03200320193b01d803200320142013410874722012411874723600df03200320172016410874722015411874723600db03200341a0046a200341d8036a10f9020240024020032802c004220b0d004200211b420021040c010b20034180046a41086a200341db046a29000037030020034190046a200341e3046a29000037030020034180046a41186a200341eb046a2d00003a0000200320032900d304370380042003200341cc046a2f01003b01e0022003200341ce046a2d00003a00e202200341a0046a41186a290300211e200341cf046a280000210f200341c8046a280200210d20032903a80421044200211b20032903b004211d4100210920032802c404210e20032903a00421050b20034188026a41086a20034180046a41086a29030037030020034188026a41106a220220034180046a41106a29030037030020034188026a41186a20034180046a41186a2d00003a0000200320032f01e0023b01b801200320032d00e2023a00ba0120032003290380043703880202400240024020090d004108210c20034188016a41086a20034188026a41086a29030037030020034188016a41106a200229030037030020034188016a41186a20034188026a41186a2d00003a0000200320032d00ba013a00be05200320032f01b8013b01bc05200320032903880237038801200341a0046a41186a4200370300200341a0046a41106a22084200370300200341a0046a41086a22094200370300200342003703a004200341c0036a41086a22024196e0c500ad4280808080f000841002220641086a290000370300200320062900003703c0032006102c20092002290300370300200320032903c003221c3703a8012003201c3703a0042002419de0c500ad4280808080a001841002220641086a290000370300200320062900003703c0032006102c200820032903c003221c370300200341f8046a41086a2009290300370300200341f8046a41106a201c370300200341f8046a41186a20022903003703002003201c37038004200320032903a0043703f804200341c8006a200341f8046a4120109401201b2005842105024002400240200d41186c2202450d0041002109200328024c410020032802481b2108200b20026a210a0340200b20096a2202290300211b200241086a290300211c2008200241106a2802002206490d0242002004201c7d2005201b54ad7d221c2005201b7d221b200556201c200456201c2004511b22061b21044200201b20061b2105200941186a2109200241186a200a470d000b0b410021060240200e0d004100210d0c020b200b102c4100210d0c010b4118102a220c450d22200c201b370300200c2006360210200c201c37030802400240200d41186c41686a2009470d00410121064101210d0c010b200241186a2110200d41186c200b6a41686a2112410121064101210d03402010210202400340200241086a290300211c2002290300211b2008200241106a2802002209490d0142002004201c7d2005201b54ad7d221c2005201b7d221b200556201c200456201c2004511b22091b21044200201b20091b2105200241186a2202200a470d000c030b0b0240200d2006470d00200641016a220d2006490d1e20064101742210200d2010200d4b1b220dad42187e221f422088a70d1e201fa722104100480d1e0240024020060d002010102a210c0c010b200c200641186c2010102e210c0b200c450d250b200241186a2110200c200641186c6a2211201c3703082011201b37030020112009360210200641016a210620122002470d000b0b200e450d00200b102c0b200341ce046a20032d00be053a0000200341cf046a200f360000200341d3046a200329038801370000200341c8046a2006360200200341c4046a200d3602002003201d3703b004200341a0046a41186a201e370300200341db046a20034190016a290300370000200341e3046a20034198016a290300370000200341eb046a20034188016a41186a2d00003a0000200320053703a004200320032f01bc053b01cc042003200c3602c004200320043703a8040240201d201e844200520d002006450d020b200341d8036a200341a0046a1099040c020b20002005370204200041023602000c1e0b200341f8046a41186a200341cc046a220241186a290000370300200341f8046a41106a200241106a290000370300200341f8046a41086a200241086a290000370300200342f3e885db96cddbb3203703a003200320022900003703f80420034188026a41186a420037030020034188026a41106a2208420037030020034188026a41086a220242003703002003420037038802200341c0036a41086a22094191b0c200ad4280808080e000841002220641086a290000370300200320062900003703c0032006102c20022009290300370300200320032903c00337038802200941acb0c200ad4280808080e000841002220641086a290000370300200320062900003703c0032006102c200820032903c0032204370300200341b8016a41086a22062002290300370300200341b8016a41106a2004370300200341b8016a41186a2009290300370300200320043703800420032003290388023703b801200341c0006a200341b8016a412010940120032003280244410020032802401b3602800420034188026a200341f8046a10ae01200328028c0221082003280288022109200328029002210a2003419c026a200341a0036a36020020032009200a4105746a3602940220032009360290022003200836028c022003200936028802200320034180046a36029802200341b8016a20034188026a10860120022006280200360200200320032903b80137038802200341f8046a20034188026a10b001200341f8046a10a4010b024020032802c404450d0020032802c004102c0b2000410c3602000c1c0b200141046a280200210910a3010240024020022d00000d004101210620022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c1c0b200241196a2d00002108200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241086a2d00002116200241066a2f01002117200241056a2d00002118200241046a2d00002119200241026a2f0100211a20032002411a6a29010037039803200320083a0097032003200a3a0096032003200b3b0194032003200c3a0093032003200d3a0092032003200e3b0190032003200f3a008f03200320103a008e03200320113b018c03200320123a008b03200320193a0082032003201a3b01800320032015201441087472201341187472360087032003201820174108747220164118747236008303200341a0046a20034180036a10f9020240024020032802c00422020d000c010b20034180046a41086a200341db046a29000037030020034190046a200341e3046a29000037030020034180046a41186a200341eb046a2d00003a0000200320032900d304370380042003200341cc046a2f01003b01e0022003200341ce046a2d00003a00e202200341a0046a41186a290300211c200341c8046a280200210a200341cf046a280000210b20032903b004211b20032802c404210820032903a804210520032903a0042104200341ec046a280200210c410021060b200341b8016a41086a20034180046a41086a290300370300200341b8016a41106a220d20034180046a41106a290300370300200341b8016a41186a20034180046a41186a2d00003a0000200320032f01e0023b01f804200320032d00e2023a00fa0420032003290380043703b801024020060d0020034188026a41186a201c37030020034188026a41286a200a360200200341ac026a2008360200200341b6026a20032d00fa043a0000200341b7026a200b360000200341bb026a20032903b801370000200341c3026a200341b8016a41086a290300370000200341cb026a200d290300370000200341d3026a200341b8016a41186a2d00003a00002003201b37039802200320023602a80220032005370390022003200437038802200320032f01f8043b01b4022003200c3602d402200341b4026a2208108704200341c0036a41086a22024196e0c500ad4280808080f000841002220641086a290000370300200320062900003703c0032006102c200341a8016a41086a220a2002290300370300200320032903c0033703a801200241c9f8c200ad4280808080a001841002220641086a290000370300200320062900003703c0032006102c20034180046a41086a22062002290300370300200320032903c00337038004200341a0046a2008109f0141c000102a2202450d1e200220032903a801370000200241086a200a2903003700002002200329038004370010200241186a2006290300370000200220032903a004370020200241286a200341a0046a41086a290300370000200241306a200341a0046a41106a290300370000200241386a200341a0046a41186a290300370000200341b8016a200241c00010f203024020032d00bc0122064102470d00200320083602bc05200341a0046a108a04200341d8036a20032802a004220620032802a80410d301024020032802a404450d002006102c0b024020032d00d8030d00200341a0046a108a0420032802a0042106200320032802a8043602fc04200320063602f8042008200341f8046a10a10220032802a404450d172006102c0c170b20034198046a200341f1036a29000037030020034190046a200341e9036a29000037030020034180046a41086a200341e1036a290000370300200320032900d90337038004200341e8006a20034180046a108904200341a0046a200328026822062003280270220810f203024020032d00a4044102470d00200341003602e802200342013703e002200341a0036a41146a410d360200200341ac036a410b360200200341073602c40320034196e0c5003602c0032003410b3602a4032003410a36028c01200341c9f8c200360288012003200341e8006a3602b003200320034188016a3602a8032003200341c0036a3602a0032003200341e0026a3602a801200341f8046a41146a4103360200200342033702fc04200341c09dc5003602f8042003200341a0036a36028805200341a8016a41c49ac500200341f8046a10391a20033502e80242208620033502e00284100420032802bc052108200341f8046a108a0420032802f804210620032003280280053602a403200320063602a0032008200341a0036a10a102024020032802fc04450d002006102c0b024020032802e402450d0020032802e002102c0b200328026c450d172003280268102c0c170b20032802a004210a200341f8046a200341a0046a41047241c20010db051a200341e0026a41086a2003419a056a410020032d0099054101461b3602002003200a3602e0022003200341bc056a3602e402200341003602a803200342013703a003200341e0026a200341a0036a108901200341e0026a410472200341a0036a10a20220032802a403210a2008ad4220862006ad8420033502a80342208620032802a0032206ad8410010240200a450d002006102c0b0240200328026c450d002003280268102c0b20032802bc052108200341a0046a108a0420032802a0042106200320032802a8043602fc04200320063602f8042008200341f8046a10a102024020032802a404450d002006102c0b200341a0036a41086a20034180046a41086a290300370300200341a0036a41106a20034180046a41106a290300370300200341a0036a41186a20034180046a41186a29030037030020032003290380043703a00341012108410021060c170b200341f8046a41186a200341d5016a290000370300200341f8046a41106a200341cd016a290000370300200341f8046a41086a200341c5016a290000370300200341a0036a41086a200341e6016a290100370300200341a0036a41106a200341ee016a290100370300200341a0036a41186a200341f6016a290100370300200320032900bd013703f8042003200341de016a2901003703a003200341dd016a2d000021080c160b20002004370204200041023602000c1b0b2001410c6a2802002109200141086a2802002108200141046a280200210a10a3010240024020022d00000d004101210620022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c120b200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002110200241116a2d00002111200241106a2d000021122002410e6a2f010021132002410d6a2d000021142002410c6a2d000021152002410a6a2f01002116200241096a2d00002117200241086a2d00002118200241066a2f01002119200241056a2d0000211a200241046a2d00002107200241026a2f0100212220032002411a6a290100370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320103b019003200320113a008f03200320123a008e03200320133b018c03200320143a008b03200320073a008203200320223b01800320032017201641087472201541187472360087032003201a20194108747220184118747236008303200341a0046a20034180036a10f9020240024020032802c004220b0d000c010b20034180046a41086a200341db046a29000037030020034190046a200341e3046a29000037030020034180046a41186a200341eb046a2d00003a0000200320032900d304370380042003200341cc046a2f01003b01e0022003200341ce046a2d00003a00e202200341a0046a41186a290300211c200341c8046a280200210c200341cf046a280000210d20032903b004211b20032802c404210220032903a804210520032903a0042104200341ec046a280200210e410021060b20034188026a41086a20034180046a41086a29030037030020034188026a41106a220f20034180046a41106a29030037030020034188026a41186a20034180046a41186a2d00003a0000200320032f01e0023b01f804200320032d00e2023a00fa0420032003290380043703880202400240024020060d00200341b8016a41186a201c370300200341e0016a200c360200200341b8016a41246a2002360200200341e6016a20032d00fa043a0000200341e7016a200d360000200341eb016a200329038802370000200341f3016a20034190026a290300370000200341fb016a200f29030037000020034183026a20034188026a41186a2d00003a00002003201b3703c8012003200b3602d801200320053703c001200320043703b801200320032f01f8043b01e4012003200e3602840202402009450d00200341003a008004200341103602e8032003200a200941246c6a3602e4032003200a3602e003200320083602dc032003200a3602d803200320034180046a3602ec03200341a0046a200341d8036a10a8020240024020032d00a0044101460d0020032802e403210620032802e003210202400340024020062002470d00200221080c020b20022d00002109200241246a2208210220094102470d000b0b200320083602e0034100210c4101210b024020032802dc030d00410021020c020b20032802d803102c410021020c010b4120102a220b450d21200b20032900a104370000200b41186a200341b9046a290000370000200b41106a200341b1046a290000370000200b41086a200341a9046a290000370000200341f8046a41106a200341d8036a41106a290300370300200341f8046a41086a200341d8036a41086a290300370300200320032903d8033703f804200341a0046a200341f8046a10a8020240024020032d00a0040d00410121024101210c0c010b200341a0046a41017221094102210a41202108410121024101210c034020034188026a41186a220d200941186a29000037030020034188026a41106a220e200941106a29000037030020034188026a41086a220f200941086a290000370300200320092900003703880202402002200c470d00200241016a22062002490d1d200a2006200a20064b1b220c41ffffff3f71200c470d1d200c41057422064100480d1d0240024020020d002006102a210b0c010b200b20082006102e210b0b200b450d240b200b20086a2206200329038802370000200641186a200d290300370000200641106a200e290300370000200641086a200f290300370000200a41026a210a200841206a2108200241016a2102200341a0046a200341f8046a10a80220032d00a0040d000b0b2003280284052108200328028005210902400340024020082009470d002009210a0c020b20092d00002106200941246a220a210920064102470d000b0b2003200a3602800520032802fc04450d0020032802f804102c0b20032d008004450d02200c450d03200b102c0c030b200041073602002002450d14200b102c0c140b20002004370204200041023602000c130b200b0d100b410121062000410136020020032802dc01450d1020032802d801102c0c100b0240024020022d00000d004101210920022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c1a0b200241196a2d00002106200241186a2d00002108200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241086a2d00002115200241066a2f01002116200241056a2d00002117200241046a2d00002118200241026a2f0100211920032002411a6a2901003703d001200320063a00cf01200320083a00ce012003200a3b01cc012003200b3a00cb012003200c3a00ca012003200d3b01c8012003200e3a00c7012003200f3a00c601200320103b01c401200320113a00c301200320183a00ba01200320193b01b801200320142013410874722012411874723600bf01200320172016410874722015411874723600bb01200341a0046a200341b8016a10f9020240024020032802c00422020d000c010b20034180046a41086a200341db046a29000037030020034190046a200341e3046a29000037030020034180046a41186a200341eb046a2d00003a0000200320032900d304370380042003200341cc046a2f01003b01e0022003200341ce046a2d00003a00e202200341a0046a41186a290300211c200341c8046a2802002108200341cf046a280000210a20032903b004211b20032802c404210620032903a804210520032903a0042104200341ec046a280200210b410021090b200341f8046a41086a20034180046a41086a290300370300200341f8046a41106a220c20034180046a41106a290300370300200341f8046a41186a20034180046a41186a2d00003a0000200320032f01e0023b01d803200320032d00e2023a00da0320032003290380043703f804024020090d0020034188026a41186a201c370300200341b0026a2008360200200341ac026a22092006360200200341b6026a20032d00da033a0000200341b7026a200a360000200341bb026a20032903f804370000200341c3026a20034180056a290300370000200341cb026a200c290300370000200341d3026a200341f8046a41186a2d00003a00002003201b37039802200320023602a80220032005370390022003200437038802200320032f01d8033b01b4022003200b3602d402200341b4026a2202108604200210870402402009280200450d0020032802a802102c0b2000410c3602000c1a0b20002004370204200041023602000c190b0240024020022d00000d004101210920022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c190b20012d0001211a200241196a2d00002106200241186a2d00002108200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241086a2d00002115200241066a2f01002116200241056a2d00002117200241046a2d00002118200241026a2f0100211920032002411a6a2901003703d001200320063a00cf01200320083a00ce012003200a3b01cc012003200b3a00cb012003200c3a00ca012003200d3b01c8012003200e3a00c7012003200f3a00c601200320103b01c401200320113a00c301200320183a00ba01200320193b01b801200320142013410874722012411874723600bf01200320172016410874722015411874723600bb01200341a0046a200341b8016a10f9020240024020032802c004220b0d000c010b20034180046a41086a200341db046a29000037030020034190046a200341e3046a29000037030020034180046a41186a200341eb046a2d00003a0000200320032900d304370380042003200341cc046a2f01003b01e0022003200341ce046a2d00003a00e202200341a0046a41186a290300211c200341c8046a2802002106200341cf046a280000210820032903b004211b20032802c404210220032903a804210520032903a0042104200341ec046a280200210a410021090b200341f8046a41086a20034180046a41086a290300370300200341f8046a41106a220c20034180046a41106a290300370300200341f8046a41186a20034180046a41186a2d00003a0000200320032f01e0023b01d803200320032d00e2023a00da0320032003290380043703f804024020090d0020034188026a41186a201c370300200341b0026a2006360200200341ac026a22092002360200200341b6026a20032d00da033a0000200341b7026a2008360000200341bb026a20032903f804370000200341c3026a20034180056a290300370000200341cb026a200c290300370000200341d3026a200341f8046a41186a2d00003a00002003201b370398022003200b3602a80220032005370390022003200437038802200320032f01d8033b01b4022003200a3602d402200341b4026a201a10a90402402009280200450d0020032802a802102c0b2000410c3602000c190b20002004370204200041023602000c180b200341d4036a41026a200141076a2d00003a0000200341e8006a41086a200141146a290200370300200341e8006a41106a2001411c6a290200370300200341e8006a41186a200141246a2802003602002003200141056a2f00003b01d40320032001410c6a2902003703680240024020022d00000d0020022d00014101460d010b200041c3b2c00036020420004100360200200041086a41133602000c180b200141046a2d0000211a200141086a2802002109200241196a2d00002106200241186a2d00002108200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241086a2d00002115200241066a2f01002116200241056a2d00002117200241046a2d00002118200241026a2f0100211920032002411a6a2901003703f802200320063a00f702200320083a00f6022003200a3b01f4022003200b3a00f3022003200c3a00f2022003200d3b01f0022003200e3a00ef022003200f3a00ee02200320103b01ec02200320113a00eb02200320183a00e202200320193b01e002200320142013410874722012411874723600e702200320172016410874722015411874723600e302200341a0046a200341e0026a109804024020032d00a0044101460d00200041033602000c180b200341d8036a41086a200341a0046a41186a22062903002204370300200341d8036a41106a200341c0046a2d000022083a00002003200341a0046a41106a220229030022053703d803200320032802a40436008303200320032d00a3043a008203200320032f00a1043b0180032003200341a0046a41086a220a290300370087032003419f036a20083a000020034197036a20043700002003200537008f03200341c0036a41026a2208200341d4036a41026a2d00003a0000200320032f01d4033b01c003200a200341e8006a41086a2903003703002002200341e8006a41106a2903003703002006200341e8006a41186a280200360200200320032903683703a0040240201a41ff01714101460d00200341a8016a41026a20082d00003a0000200341f8046a41086a200341a0046a41086a290300370300200341f8046a41106a2002290300370300200341f8046a41186a200341a0046a41186a2d00003a0000200320032f01c0033b01a801200320032903a0043703f8040c0b0b20034188026a20094106761091022003280288022106024002402003280290022009413f7122024b0d00410021020c010b200341a8016a41026a200620024105746a220241026a2d00003a000020034180056a2002410f6a29000037030020034188056a200241176a29000037030020034190056a2002411f6a2d00003a0000200320022f00003b01a801200320022900073703f80420022800032109410121020b0240200328028c02450d002006102c0b20020d0a410121020c0b0b024020022d000120022d000072450d00200041b2b2c00036020420004100360200200041086a41113602000c170b200141046a2802002108200341a0046a41186a4200370300200341a0046a41106a220a4200370300200341a0046a41086a22094200370300200342003703a004200341c0036a41086a22024196e0c500ad4280808080f000841002220641086a290000370300200320062900003703c0032006102c20092002290300370300200320032903c00322043703a801200320043703a004200241f3dfc500ad4280808080e001841002220641086a290000370300200320062900003703c0032006102c200a20032903c0032204370300200341f8046a41086a2009290300370300200341f8046a41106a2004370300200341f8046a41186a20022903003703002003200437038004200320032903a0043703f804200320083602a004200341f8046aad4280808080800484200341a0046aad4280808080c0008410012000410c3602000c160b024020022d000120022d000072450d00200041b2b2c00036020420004100360200200041086a41113602000c160b200341a0046a41186a4200370300200341a0046a41106a22084200370300200341a0046a41086a22094200370300200342003703a004200341c0036a41086a22024196e0c500ad4280808080f000841002220641086a290000370300200320062900003703c0032006102c20092002290300370300200320032903c00322043703a801200320043703a004200241d8e0c500ad42808080808001841002220641086a290000370300200320062900003703c0032006102c200820032903c0032204370300200341f8046a41086a2009290300370300200341f8046a41106a2004370300200341f8046a41186a20022903003703002003200437038004200320032903a0043703f804410121094101102a2202450d17200241023a0000200341f8046aad42808080808004842002ad4280808080108410012002102c2000410c36020041012106410121080c160b024020022d000120022d000072450d00200041b2b2c00036020420004100360200200041086a41113602000c150b200341a0046a41186a4200370300200341a0046a41106a22084200370300200341a0046a41086a22094200370300200342003703a004200341c0036a41086a22024196e0c500ad4280808080f000841002220641086a290000370300200320062900003703c0032006102c20092002290300370300200320032903c00322043703a801200320043703a004200241d8e0c500ad42808080808001841002220641086a290000370300200320062900003703c0032006102c200820032903c0032204370300200341f8046a41086a2009290300370300200341f8046a41106a2004370300200341f8046a41186a20022903003703002003200437038004200320032903a0043703f804410121094101102a2202450d16200241013a0000200341f8046aad42808080808004842002ad4280808080108410012002102c2000410c36020041012106410121080c150b200141086a2802002108200141046a280200210a024020022d000120022d000072450d00200041b2b2c0003602044100210620004100360200200041086a4111360200410121092008450d0c200a102c410121080c150b2001410c6a2802002109200341a0046a41186a4200370300200341a0046a41106a220c4200370300200341a0046a41086a22064200370300200342003703a004200341c0036a41086a22024196e0c500ad4280808080f000841002220b41086a2900003703002003200b2900003703c003200b102c20062002290300370300200320032903c00322043703a801200320043703a004200241dcc1c300ad4280808080d001841002220b41086a2900003703002003200b2900003703c003200b102c200c20032903c0032204370300200341f8046a41086a2006290300370300200341f8046a41106a2004370300200341f8046a41186a20022903003703002003200437038004200320032903a0043703f804200341003602a804200342013703a0042009200341a0046a106702402009450d0020094105742109200a210203402002200341a0046a109101200241206a2102200941606a22090d000b0b20032802a4042102200341f8046aad428080808080048420033502a80442208620032802a0042209ad84100102402002450d002009102c0b02402008450d00200a102c0b2000410c3602004100210641012109410121080c140b200341a0046a41186a200141196a290000370300200341a0046a41106a200141116a290000370300200341a0046a41086a200141096a290000370300200320012900013703a004024020022d000120022d000072450d00200041b2b2c000360204200041086a4111360200200041003602000c130b200342f3e885db96cddbb3203703f80420034188026a41186a420037030020034188026a41106a2208420037030020034188026a41086a220242003703002003420037038802200341c0036a41086a22094191b0c200ad4280808080e000841002220641086a290000370300200320062900003703c0032006102c20022009290300370300200320032903c00337038802200941acb0c200ad4280808080e000841002220641086a290000370300200320062900003703c0032006102c200820032903c0032204370300200341b8016a41086a22062002290300370300200341b8016a41106a2004370300200341b8016a41186a2009290300370300200320043703800420032003290388023703b801200341e0006a200341b8016a412010940120032003280264410020032802601b3602d80320034188026a200341a0046a10ae01200328028c0221082003280288022109200328029002210a2003419c026a200341f8046a36020020032009200a4105746a3602940220032009360290022003200836028c0220032009360288022003200341d8036a36029802200341b8016a20034188026a10860120022006280200360200200320032903b80137038802200341a0046a20034188026a10b001200341a0046a10a4012000410c3602000c120b024020022d000120022d000072450d00200041b2b2c00036020420004100360200200041086a41113602000c120b200341a0046a41186a4200370300200341a0046a41106a22084200370300200341a0046a41086a22094200370300200342003703a004200341c0036a41086a22024196e0c500ad4280808080f000841002220641086a290000370300200320062900003703c0032006102c20092002290300370300200320032903c00322043703a801200320043703a004200241d8e0c500ad42808080808001841002220641086a290000370300200320062900003703c0032006102c200820032903c0032204370300200341f8046a41086a2009290300370300200341f8046a41106a2004370300200341f8046a41186a20022903003703002003200437038004200320032903a0043703f804410121094101102a2202450d13200241033a0000200341f8046aad42808080808004842002ad4280808080108410012002102c2000410c36020041012106410121080c120b200241036a2d0000210820022f0001210a200141106a28020021092001410c6a2802002114200141086a2802002111200141046a28020021150240024020022d0000220b417f6a220641024b0d00024020060e03000102000b200241046a2d00000d00200241086a2802004102742002410c6a28020041036c4f0d010b200b200a2008411074727241ff0171450d002000410636020041002108410121092014450d032011102c0c030b20112009410041202009676b108d03200341c0036a41086a22024196e0c500ad4280808080f000841002220641086a290000370300200320062900003703c0032006102c200341a8016a41086a22082002290300370300200320032903c0033703a801200241d1fdc200ad42808080808002841002220641086a290000370300200320062900003703c0032006102c20034180046a41086a22062002290300370300200320032903c00337038004200320153602b80120034188026a41186a220a200341b8016aad22054280808080c000841006220241186a29000037030020034188026a41106a220b200241106a29000037030020034188026a41086a220c200241086a29000037030020032002290000370388022002102c200341a0046a41186a220d200a290300370300200341a0046a41106a220a200b290300370300200341a0046a41086a220b200c29030037030020032003290388023703a00441c000102a2202450d12200220032903a801370000200241086a20082903003700002002200329038004370010200241186a2006290300370000200220032903a004370020200241286a200b290300370000200241306a200a290300370000200241386a200d290300370000200341a0046a200241c00010e90320032902a404210420032802a00421062002102c2004420020061b21042006410820061b211220094102742213450d0141002109417f210b41002108410021060340024002400240201120096a280200220a20064f0d00410821020c010b2008200a6a22022004422088a7220c490d01410921020b2000200236020002402014450d002011102c0b02402004422088a72200450d00201241306a2102200041d8006c210003400240200241746a280200450d00200241706a280200102c0b02402002280200450d002002417c6a280200102c0b200241d8006a2102200041a87f6a22000d000b0b41002108410121092004a7450d042012102c0c040b2012200241d8006c6a220228022c210f20022802202110200241306a280200210d200241246a280200210e2002200241d8006a200b200c6a200a6b41d8006c10dc051a0240200e450d002010102c0b0240200d450d00200f102c0b200641016a210620044280808080707c2104200b41016a210b2008417f6a21082013200941046a2209470d000c020b0b2000410436020041012106410121080c100b02402014450d002011102c0b200341c0036a41086a22024196e0c500ad4280808080f000841002220941086a290000370300200320092900003703c0032009102c200341a8016a41086a22062002290300370300200320032903c0033703a801200241d1fdc200ad42808080808002841002220941086a290000370300200320092900003703c0032009102c20034180046a41086a22092002290300370300200320032903c00337038004200320153602b80120034188026a41186a220820054280808080c000841006220241186a29000037030020034188026a41106a220a200241106a29000037030020034188026a41086a220b200241086a29000037030020032002290000370388022002102c200341a0046a41186a220c2008290300370300200341a0046a41106a2208200a290300370300200341a0046a41086a220a200b29030037030020032003290388023703a00441c000102a2202450d10200220032903a801370000200241086a20062903003700002002200329038004370010200241186a2009290300370000200220032903a004370020200241286a200a290300370000200241306a2008290300370000200241386a200c290300370000200341a0046a20122004422088a72209109e042002ad428080808080088420033502a80442208620032802a0042206ad841001024020032802a404450d002006102c0b2002102c02402009450d00200941d8006c2109201241306a210203400240200241746a280200450d00200241706a280200102c0b02402002280200450d002002417c6a280200102c0b200241d8006a2102200941a87f6a22090d000b0b02402004a7450d002012102c0b2000410c36020041002108410121090b410121060c0e0b20034188026a41026a200341a8016a41026a2d00003a0000200341a0046a41086a200341f8046a41086a290300370300200341a0046a41106a200341f8046a41106a290300370300200341a0046a41186a200341f8046a41186a2d00003a0000200320032f01a8013b018802200320032903f8043703a004410021020b20034188016a41086a2206200341a0046a41086a29030037030020034188016a41106a2208200341a0046a41106a29030037030020034188016a41186a220a200341a0046a41186a2d00003a0000200320032f0188023b01bc05200320032903a0043703880120032003418a026a2d00003a00be0520020d09200341af036a2006290300370000200341b7036a2008290300370000200341bf036a200a2d00003a0000200320032d00be053a00a203200320032f01bc053b01a003200320093600a30320032003290388013700a703200341c0036a41086a22024196e0c500ad4280808080f000841002220941086a290000370300200320092900003703c0032009102c200341a8016a41086a2002290300370300200320032903c0033703a801200241d9f8c200ad4280808080e000841002220941086a290000370300200320092900003703c0032009102c20034180046a41086a2002290300370300200320032903c00337038004200341a0046a200341a0036a109f0141c000102a2202450d0d200220032903a801370000200241086a200341a8016a41086a2903003700002002200329038004370010200241186a20034180046a41086a290300370000200220032903a004370020200241286a200341a0046a41086a290300370000200241306a200341b0046a290300370000200241386a200341a0046a41186a29030037000041012109200341d8006a200241c000410141004100109701200328025821062002102c0240024020064101460d00200341a0036a20034180036a412010dd05450d01200341e0026a200341a0036a10aa04200341c0036a41086a22024196e0c500ad4280808080f000841002220941086a290000370300200320092900003703c0032009102c20034188016a41086a22062002290300370300200320032903c00337038801200241d9f8c200ad4280808080e000841002220941086a290000370300200320092900003703c0032009102c20034188026a41086a22092002290300370300200320032903c00337038802200341f8046a20034180036a109f0141c000102a2202450d0f2002200329038801370000200241086a20062903003700002002200329038802370010200241186a2009290300370000200220032903f804370020200241286a200341f8046a41086a290300370000200241306a200341f8046a41106a220a290300370000200241386a200341f8046a41186a220b290300370000200341a0046a200241c00010e603024020032802c0042206450d002002ad428080808080088410050b200341d8036a41186a220c200341a0046a41186a220d290300370300200341d8036a41106a220e200341a0046a41106a220f290300370300200341d8036a41086a2210200341a0046a41086a220929030037030020034188026a41086a2208200341cc046a221529020037030020034188026a41106a2211200341d4046a221629020037030020034188026a41186a2212200341dc046a221729020037030020034188026a41206a2213200341e4046a221829020037030020034188026a41286a2214200341ec046a2219280200360200200320032903a0043703d803200320032902c40437038802200341f8046a41086a221a2010290300370300200a200e290300370300200b200c29030037030020092008290300370300200f2011290300370300200d2012290300370300200341a0046a41206a220b2013290300370300200341a0046a41286a2014280200360200200320032903d8033703f80420032003290388023703a00402402006450d0020034180046a41186a220c200341f8046a41186a220d29030037030020034180046a41106a220e200341f8046a41106a220f29030037030020034180046a41086a2210201a290300370300200341b8016a41086a22112009290300370300200341b8016a41106a2212200341a0046a41106a220a290300370300200341b8016a41186a2213200341a0046a41186a2214290300370300200341b8016a41206a221a200b290300370300200341b8016a41286a220b200341a0046a41286a2207280200360200200320032903f80437038004200320032903a0043703b8012002102c2014200c290300370300200a200e29030037030020092010290300370300200341c4046a20032903b8013702002015201129030037020020162012290300370200201720132903003702002018201a2903003702002019200b28020036020020032003290380043703a004200320063602c004200341c0036a41086a22024196e0c500ad4280808080f000841002220941086a290000370300200320092900003703c0032009102c20034188016a41086a2002290300370300200320032903c00337038801200241d9f8c200ad4280808080e000841002220941086a290000370300200320092900003703c0032009102c20082002290300370300200320032903c00337038802200341f8046a200341a0036a109f0141c000102a2206450d102006200329038801370000200641086a20034188016a41086a2903003700002006200329038802370010200641186a20034188026a41086a290300370000200620032903f804370020200641286a200341f8046a41086a290300370000200641306a200f290300370000200641386a200d29030037000020034100360290022003420137038802200341cc046a20034188026a1091012003200341a0046a3602f804200341f8046a20034188026a108a012003200a3602f804200341f8046a20034188026a108a0120032802c00421022007280200220920034188026a106702402009450d002002200941186c6a21090340200320023602f804200341f8046a20034188026a108a01200241106a20034188026a1089012009200241186a2202470d000b0b200328028c0221022006ad42808080808008842003350290024220862003280288022209ad84100102402002450d002009102c0b2006102c20032802c404450d0220032802c004102c0c020b2002102c0c010b2000410536020041012106410121080c0d0b2000410c3602000c0b0b200341a0046a41186a220d4200370300200341a0046a41106a220a4200370300200341a0046a41086a22084200370300200342003703a004200341c0036a41086a22094196e0c500ad4280808080f0008422051002220641086a290000370300200320062900003703c0032006102c20082009290300370300200320032903c00322043703a801200320043703a0042009419de0c500ad4280808080a001841002220641086a290000370300200320062900003703c0032006102c200a20032903c0032204370300200341f8046a41086a2008290300370300200341f8046a41106a2004370300200341f8046a41186a20092903003703002003200437038004200320032903a0043703f804200341d0006a200341f8046a4120109401200320023602e8022003200c3602e4022003200b3602e002200341003a00f00220032003280254410020032802501b3602ec02200341e4016a220b108604200920051002220241086a290000370300200320022900003703c0032002102c200341a8016a41086a220c2009290300370300200320032903c0033703a801200941aff8c200ad4280808080a001841002220241086a290000370300200320022900003703c0032002102c20034180046a41086a22022009290300370300200320032903c00337038004200341a0046a200b109f0141c000102a2206450d0c200620032903a801370000200641086a200c2903003700002006200329038004370010200641186a2002290300370000200620032903a004370020200641286a2008290300370000200641306a200a290300370000200641386a200d29030037000020034188026a200641c00010ee030240024020032d0098024102460d00200341f8046a41086a200341a5026a290000370300200341f8046a41106a200341ad026a290000370300200341f8046a41186a200341b5026a290000370300200341a0036a41086a200341c6026a290100370300200341a0036a41106a200341ce026a290100370300200341a0036a41186a200341d6026a29010037030020032003419d026a2900003703f8042003200341be026a2901003703a003200341bd026a2d0000210220032d009c022109200328028c02450d01200328028802102c0c010b2003200b3602d403200341a0046a108404200341d8036a20032802a004220220032802a80410d301024020032802a404450d002002102c0b0240024020032d00d8030d00200341a0046a10840420032802a0042102200320032802a8043602fc04200320023602f804200b200341f8046a10a102024020032802a404450d002002102c0b410021020c010b20034180046a41186a200341f1036a29000037030020034180046a41106a200341e9036a29000037030020034180046a41086a200341e1036a290000370300200320032900d9033703800420034188016a20034180046a108b04200341a0046a2003280288012208200328029001220a10ee03024020032d00b0044102470d002003410036027020034201370368200341a0036a41146a410d360200200341ac036a410b360200200341073602ac0120034196e0c5003602a8012003410b3602a4032003410a3602c403200341aff8c2003602c003200320034188016a3602b0032003200341c0036a3602a8032003200341a8016a3602a0032003200341e8006a3602bc05200341f8046a41146a4103360200200342033702fc04200341c09dc5003602f8042003200341a0036a36028805200341bc056a41c49ac500200341f8046a10391a2003350270422086200335026884100420032802d4032109200341f8046a10840420032802f804210220032003280280053602a403200320023602a0032009200341a0036a10a102024020032802fc04450d002002102c0b0240200328026c450d002003280268102c0b0240200328028c01450d00200328028801102c0b410021020c010b200341f8046a200341a0046a41146a41c20010db051a20032d0099052102200341a0036a41106a200341a0046a41106a280200360200200341a0036a41086a200341a0046a41086a2903002204370300200341a0036a41186a2003419a056a410020024101461b360200200320032903a00422053703a0032003200341d4036a3602b40320034100360270200342013703682004a72202200341e8006a10672005a7210b02402002450d0020024105742109200b210203402002200341e8006a109101200241206a2102200941606a22090d000b0b20032802ac03210c02400240200328026c2209200328027022026b4104490d00200328026821090c010b200241046a220d2002490d0820094101742202200d2002200d4b1b22024100480d080240024020090d002002102a21090c010b200328026820092002102e21090b2009450d0f2003200236026c20032009360268200328027021020b2003200241046a360270200920026a200c36000020032d00b003210c02400240200328026c20032802702202460d00200328026821090c010b200241016a22092002490d082002410174220d2009200d20094b1b220d4100480d080240024020020d00200d102a21090c010b20032802682002200d102e21090b2009450d0f2003200d36026c20032009360268200328027021020b2003200241016a360270200920026a200c3a0000200341a0036a41146a200341e8006a10a202200328026c2102200aad4220862008ad84200335027042208620032802682209ad84100102402002450d002009102c0b024020032802a403450d00200b102c0b0240200328028c01450d00200328028801102c0b20032802d4032109200341a0046a10840420032802a0042102200320032802a8043602fc04200320023602f8042009200341f8046a10a102024020032802a404450d002002102c0b200341a0036a41086a20034180046a41086a290300370300200341a0036a41106a20034180046a41106a290300370300200341a0036a41186a20034180046a41186a29030037030020032003290380043703a003410121020b410021090b200341c5046a20023a0000200341c6046a20032903a003370100200341ad046a200341f8046a41086a290300370000200341b5046a200341f8046a41106a290300370000200341bd046a200341f8046a41186a290300370000200341ce046a200341a0036a41086a290300370100200341d6046a200341a0036a41106a290300370100200341de046a200341a0036a41186a290300370100200320093a00a404200320032903f8043700a5042003200341e0026a3602a0042003410036029002200342013703880220032802e002210220032802e802220920034188026a106702402009450d00200941057421090340200220034188026a109101200241206a2102200941606a22090d000b0b20032802ec02210802400240200328028c02220920032802900222026b4104490d0020032802880221090c010b200241046a220a2002490d0620094101742202200a2002200a4b1b22024100480d060240024020090d002002102a21090c010b20032802880220092002102e21090b2009450d0d2003200236028c02200320093602880220032802900221020b2003200241046a36029002200920026a200836000020032d00f002210802400240200328028c022003280290022202460d0020032802880221090c010b200241016a22092002490d062002410174220a2009200a20094b1b220a4100480d060240024020020d00200a102a21090c010b2003280288022002200a102e21090b2009450d0d2003200a36028c02200320093602880220032802900221020b2003200241016a36029002200920026a20083a0000200341a0046a41047220034188026a10a302200328028c0221022006ad42808080808008842003350290024220862003280288022209ad84100102402002450d002009102c0b2006102c024020032802e402450d0020032802e002102c0b024020032802dc01450d0020032802d801102c0b2000410c360200410121060b41002109410121080c0a0b41012106410021092008450d00200a102c0b410121080c080b41002108410021060b200341c5046a20083a0000200341c6046a20032903a003370100200341ad046a200341f8046a41086a290300370000200341b5046a200341f8046a41106a290300370000200341bd046a200341f8046a41186a290300370000200341ce046a200341a0036a41086a290300370100200341d6046a200341a0036a41106a290300370100200341de046a200341a0036a41186a290300370100200320063a00a404200320093602a004200320032903f8043700a504200341003602c001200342013703b801200341a0046a200341b8016a108901200341a0046a410472200341b8016a10a30220032802bc0121092002ad428080808080088420033502c00142208620032802b8012206ad84100102402009450d002006102c0b2002102c024020032802ac02450d0020032802a802102c0b2000410c3602000c050b1035000b200341a0036a41026a200341a8016a41026a2d00003a0000200341a0046a41086a200341f8046a41086a290300370300200341a0046a41106a200341f8046a41106a290300370300200341a0046a41186a200341f8046a41186a2d00003a0000200320032f01a8013b01a003200320032903f8043703a004410021020b20034180036a41026a220a200341a0036a41026a2d00003a000020034180046a41086a2209200341a0046a41086a29030037030020034180046a41106a220b200341a0046a41106a29030037030020034180046a41186a220c200341a0046a41186a2d00003a0000200320032f01a0033b018003200320032903a004370380042002450d010b410121092000410136020041012106410121080c020b20034197026a20092903003700002003419f026a200b290300370000200341a7026a200c2d00003a0000200320032f0180033b0188022003200836008b02200320032903800437008f022003200a2d00003a008a02200341c0036a41086a22024196e0c500ad4280808080f000841002220841086a290000370300200320082900003703c0032008102c200341a8016a41086a2002290300370300200320032903c0033703a801200241d9f8c200ad4280808080e000841002220841086a290000370300200320082900003703c0032008102c20092002290300370300200320032903c00337038004200341a0046a20034188026a109f0141c000102a2202450d02200220032903a801370000200241086a200341a8016a41086a2903003700002002200329038004370010200241186a20034180046a41086a290300370000200220032903a004370020200241286a200341a0046a41086a290300370000200241306a200341b0046a290300370000200241386a200341a0046a41186a29030037000041012109200341186a200241c000410141004100109701200328021821082002102c410521020240024020084101460d00410a2102200542ffffe883b1de165620044200522004501b0d010b2000200236020041012106410121080c020b200341b8016a20034188026a10aa04200341b8016a200610a904200341086a200341b8016a10b701200341086a41086a290300211b2003290308211c200341ce046a20032d00ba013a0000200341cf046a20032800bb01360000200341c8046a4100360200200341a0046a41186a201b2004201c200554201b200454201b2004511b22091b2204370300200341d3046a200341b8016a4107722202290000370000200341db046a200241086a290000370000200341e3046a200241106a290000370000200341eb046a200241186a2d00003a0000200320032f01b8013b01cc04200342083703c0042003201c200520091b22053703b004200320043703a804200320053703a00420034188026a200341a0046a1099040240200341c4046a280200450d0020032802c004102c0b2000410c3602000b4101210941012106410121080b024020012d00002200417f6a2202410f4b0d0002400240024020020e1005030303050003030503030301050302050b2009450d04200141086a280200450d04200141046a280200102c0c040b2006450d03200141086a280200450d03200141046a280200102c0c030b2008450d022001410c6a280200450d02200141086a280200102c0c020b02402000410f4b0d00410120007441bebf03710d02024020004106460d002000410d470d01200141086a280200450d03200141046a280200102c0c030b200141086a280200450d02200141046a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b1033000b200341c0056a24000bb20201027f024002402000280200220141064b0d00024002400240024020010e0705050005010203050b200041086a280200450d042000280204102c0f0b200041086a280200450d032000280204102c0f0b02402000410c6a2802002202450d0020002802042101200241186c210203400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141186a2101200241686a22020d000b0b200041086a280200450d022000280204102c0f0b02402000410c6a2802002202450d00200028020421012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041086a280200450d012000280204102c0c010b200041086a280200450d002000280204102c0f0b0b800a01057f024002402000280200220141164b0d000240024002400240024002400240024002400240024002400240024020010e1700010f0f020f0f030405060708090f0a0f0b0c0d0f0f0f000b200041086a10fb020f0b02402000410c6a2802002202450d002000280204210120024190016c210203402001107320014190016a2101200241f07e6a22020d000b0b200041086a280200450d0d2000280204102c0f0b02402000410c6a2802002201450d0020002802042203200141f0006c6a2104034002402003410c6a2802002202450d0020032802042101200241246c210203400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012002415c6a22020d000b0b200341f0006a21010240200341086a280200450d002003280204102c0b2001210320012004470d000b0b200041086a280200450d0c2000280204102c0f0b0240200041086a2d00002201410f4b0d00410120017441bfbf03710d0c024020014106470d00200041106a280200450d0d2000410c6a280200102c0f0b200041106a280200450d0c2000410c6a280200102c0f0b200041146a280200450d0b200041106a280200102c0f0b200041086a280200450d0a2000280204102c0f0b200041086a2d0000416d6a220141014b0d090240024020010e020001000b200041106a280200450d0a2000410c6a280200102c0f0b200041106a280200450d092000410c6a280200102c0f0b20002d0004417f6a220141024b0d0802400240024020010e03000102000b2000410c6a280200450d0a200041086a280200102c0f0b200041086a220128020010fc022001280200102c0f0b2000410c6a220128020010fc022001280200102c0f0b20002d0004417f6a220141024b0d0702400240024020010e03000102000b2000410c6a280200450d09200041086a280200102c0f0b200041086a220128020010fc022001280200102c0f0b2000410c6a220128020010fc022001280200102c0f0b200041086a2802004101470d06200041106a280200450d062000410c6a280200102c0f0b20002d00044104470d052000410c6a280200450d05200041086a280200102c0f0b200041086a280200450d042000280204102c0f0b200041086a2d0000417e6a220141024b0d0302400240024020010e03000102000b200041106a280200450d052000410c6a280200102c0f0b200041346a280200450d04200041306a280200102c0f0b200041306a280200450d032000412c6a280200102c0f0b02402000280204220141024b0d00024020010e03040004040b200041086a220128020010fc022001280200102c0f0b2000412c6a220128020010fc022001280200102c0f0b02402000410c6a280200450d00200041086a280200102c0b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041186a280200450d012000280214102c0c010b02402000280204220141034b0d00024020010e0402000202020b2000410c6a280200450d01200041086a280200102c0f0b200041306a280200450d002000412c6a280200102c0f0b0b8d0902067f047e230041e0026b220224000240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a360200200541034b0d0620050e0401020304010b200041053a00000c090b200241206a200110820120022802200d03200041053a00000c080b200241c0006a2001108f020240024020022802404118460d00200241d0016a200241c0006a41900110db051a419001102a22050d010c080b200041053a00000c080b2005200241d0016a41900110db052105200041023a0000200020022f00103b0001200041036a200241106a41026a2d00003a0000200041046a2005360200200041086a2002290220370200200041106a200241206a41086a290200370200200041186a200241206a41106a290200370200200041206a200241206a41186a2902003702000c070b20022001107520022802000d0420022802042105200241c0006a2001108f0220022802404118460d04200241d0016a200241c0006a41900110db051a419001102a2201450d052001200241d0016a41900110db052101200041033a0000200020022f00103b0001200041036a200241126a2d00003a0000200041086a2001360200200041046a20053602002000410c6a2002290220370200200041146a200241206a41086a2902003702002000411c6a200241306a290200370200200041246a200241386a2802003602000c060b41002105200241003a00f0012003417f6a21062003417e6a21030340024020062005470d00200541ff0171450d04200241003a00f0010c040b200241d0016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00f0012003417f6a21032007210520074120470d000b200241c0006a41186a200241d0016a41186a290300370300200241c0006a41106a200241d0016a41106a290300370300200241c0006a41086a200241d0016a41086a290300370300200220022903d001370340200241086a2001107520022802080d0220012802042203450d02200228020c2104200128020022072d0000210520012003417f6a3602042001200741016a360200200541014b0d02410021010240024020050e020100010b410121010b200241206a41186a200241c0006a41186a2903002208370300200241206a41106a200241c0006a41106a2903002209370300200241206a41086a200241c0006a41086a290300220a37030020022002290340220b370320200041043a00002000200b370001200041096a200a370000200041116a2009370000200041196a2008370000200041246a2004360200200041216a20013a00000c050b200241cb006a200241206a41086a28020036000020022002290320370043200041013a000020002002290040370001200041086a200241c7006a290000370000200041106a20022902d001370200200041186a200241d0016a41086a290200370200200041206a200241d0016a41106a2902003702000c040b200041053a00000c030b200041053a00000c020b200041053a00000c010b1033000b200241e0026a24000bf10603057f0b7e067f230041106b21020240200128020422034104490d0020012802002204280000210520012003417c6a22063602042001200441046a36020020064108490d00200429000421072001200341746a220636020420012004410c6a36020020064108490d00200429000c210820012003416c6a22063602042001200441146a36020020064108490d00200429001421092001200341646a220636020420012004411c6a36020020064108490d00200429001c210a20012003415c6a22063602042001200441246a36020020064108490d002004290024210b2001200341546a220636020420012004412c6a36020020064108490d00200429002c210c20012003414c6a22063602042001200441346a36020020064108490d002004290034210d2001200341446a220636020420012004413c6a36020020064108490d00200429003c210e2001200341bc7f6a22063602042001200441c4006a36020020064108490d002004290044210f2001200341b47f6a22063602042001200441cc006a36020020064108490d00200429004c21102001200341ac7f6a22063602042001200441d4006a36020020064108490d00200429005421112001200341a47f6a22063602042001200441dc006a36020020064104490d00200428005c21122001200341a07f6a22063602042001200441e0006a36020020064104490d002004280060211320012003419c7f6a22063602042001200441e4006a36020020064104490d00200428006421142001200341987f6a22063602042001200441e8006a36020020064104490d00200428006821152001200341947f6a22063602042001200441ec006a22043602002006450d0020042d000021062001200341937f6a22163602042001200441016a360200200641014b0d00410021170240024020060e020100010b410121170b20164104490d00200020173a00702000201536026820002014360264200020133602602000201236025c2000200536025820002011370350200020103703482000200f3703402000200e3703382000200d3703302000200c3703282000200b3703202000200a3703182000200937031020002008370308200020073703002004280001210620012003418f7f6a3602042001200441056a3602002000200636026c200041f4006a2002410c6a280000360000200020022800093600710f0b200041023a00700bcc07020e7f047e230041a0016b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360234200220033602302002200241306a1075024002400240024020022802000d00024002402002280234220541286e220641286c2201417f4c0d00200228020421070240024020010d00410821080c010b2001102a2208450d020b02402007450d00410021090340200241003a0098012009220a41016a2109410021010240024002400240034020052001460d01200241f8006a20016a2002280230220b2d00003a00002002200b41016a3602302002200141016a220c3a009801200c2101200c4120470d000b200241d8006a41086a220d200241f8006a41086a290300370300200241d8006a41106a220e200241f8006a41106a290300370300200241d8006a41186a220f200241f8006a41186a2903003703002002200229037837035820022005200c6b220136023420014108490d01200241386a41086a220c200d290300370300200241386a41106a220d200e290300370300200241386a41186a220e200f290300370300200220022903583703382002200b41096a3602302002200141786a2205360234200b29000121102006200a470d030240200a41017422012009200120094b1b2206ad42287e2211422088a70d002011a7220141004e0d030b1035000b20024100360234200141ff0171450d00200241003a0098010b200241003602202006450d072008102c0c070b02400240200a0d002001102a21080c010b2008200a41286c2001102e21080b2008450d040b2008200a41286c6a22012002290338370300200c2903002111200d2903002112200e290300211320012010370320200141186a2013370300200141106a2012370300200141086a201137030020092007470d000b200241286a200736020020022006360224200220083602200c050b200241286a2007360200200220063602242002200836022020080d040c030b103a000b1033000b200241003602200b20024100360260200242013703582002410b36023c2002200241086a3602382002200241d8006a3602202002418c016a41013602002002420137027c200241d0b0c2003602782002200241386a36028801200241206a41c49ac500200241f8006a10391a2002350260422086200235025884100420004100360200200228025c450d012002280258102c0c010b20002002290320370200200041086a200241206a41086a2802003602000b2004450d002003102c0b200241a0016a24000bd60302057f047e230041f0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022030d00200041003a00000c010b200241186a28020021042002280214210541002101200241003a006802400340024020042001470d000240200141ff0171450d00200241003a00680b4100210120024100360228200242013703202002410b3602442002200241086a3602402002200241206a36026c200241dc006a41013602002002420137024c200241d0b0c2003602482002200241c0006a360258200241ec006a41c49ac500200241c8006a10391a200235022842208620023502208410042002280224450d022002280220102c0c020b200241c8006a20016a200320016a2d00003a00002002200141016a22063a00682006210120064120470d000b200241206a41186a200241c8006a41186a2903002207370300200241206a41106a200241c8006a41106a2903002208370300200241206a41086a200241c8006a41086a290300220937030020022002290348220a370320200041196a2007370000200041116a2008370000200041096a20093700002000200a370001410121010b200020013a00002005450d002003102c0b200241f0006a24000b3400200041bac6c50036020420004100360200200041146a4109360200200041106a41dc91c200360200200041086a42043702000b130020004102360204200041c4a3c2003602000b2d01017f02404108102a22020d001033000b20004288808080800137020420002002360200200242b8173700000b2d01017f02404108102a22020d001033000b20004288808080800137020420002002360200200242c8013700000bb30c06017f027e057f017e037f017e230041f0016b22022400200241f8006a2000200110ce01200241f8006a41106a290300210020022903800121010240024020022903782203a7450d00200241c0006a200142004204420010e005200241306a420042002001420010e005200241d0006a2002290340200241c0006a41086a2903002203200042028620022903307c7c22044205420010e10542b3e6cc99b3e6cc99332002290350200042ffffffffffffffff3f8320005220022903384200527220042003547222051b220320012001200356200042b3e6cc99b3e6cc9933200241d0006a41086a29030020051b22035620002003511b22051b22042003200020051b220310b102200241e0006a200120047d200020037d2001200454ad7d10ce01200241e0006a41106a290300210120022903682100024020022903602203a7450d00200241b0016a10e801200241b0016a20002001109c010c020b2003500d01200241b0016a41186a22064200370300200241b0016a41106a22074200370300200241b0016a41086a22084200370300200242003703b001200241e0016a41086a2205418be9c500ad428080808080018422041002220941086a290000370300200220092900003703e0012009102c20082005290300370300200220022903e00122033703d001200220033703b001200541c9b5c000ad4280808080d00184220a1002220941086a290000370300200220092900003703e0012009102c200720022903e001220337030020024190016a41086a220b200829030037030020024190016a41106a220c200337030020024190016a41186a220d2005290300370300200220033703d001200220022903b00137039001200241186a20024190016a4120109e01200241186a41106a29030021032002290320210e20022802182109200642003703002007420037030020084200370300200242003703b001200520041002220741086a290000370300200220072900003703e0012007102c20082005290300370300200220022903e00122043703d001200220043703b0012005200a1002220741086a290000370300200220072900003703e0012007102c200620052903002204370300200b2008290300370300200c20022903e001220a370300200d20043703002002200a3703d001200220022903b00137039001200242002003420020091b220320017d200e420020091b2201200054ad7d2204200120007d2200200156200420035620042003511b22051b3703b80120024200200020051b3703b00120024190016aad4280808080800484200241b0016aad428080808080028410010c010b2003500d00200241b0016a41186a22064200370300200241b0016a41106a22074200370300200241b0016a41086a22084200370300200242003703b001200241e0016a41086a2205418be9c500ad428080808080018422041002220941086a290000370300200220092900003703e0012009102c20082005290300370300200220022903e00122033703d001200220033703b001200541c9b5c000ad4280808080d00184220a1002220941086a290000370300200220092900003703e0012009102c200720022903e001220337030020024190016a41086a220b200829030037030020024190016a41106a220c200337030020024190016a41186a220d2005290300370300200220033703d001200220022903b00137039001200220024190016a4120109e01200241106a29030021032002290308210e20022802002109200642003703002007420037030020084200370300200242003703b001200520041002220741086a290000370300200220072900003703e0012007102c20082005290300370300200220022903e00122043703d001200220043703b0012005200a1002220741086a290000370300200220072900003703e0012007102c200620052903002204370300200b2008290300370300200c20022903e001220a370300200d20043703002002200a3703d001200220022903b00137039001200242002003420020091b220320007d200e420020091b2200200154ad7d2204200020017d2201200056200420035620042003511b22051b3703b80120024200200120051b3703b00120024190016aad4280808080800484200241b0016aad428080808080028410010b200241f0016a24000ba40301057f230041106b22032400024002400240200141046a2204417f4c0d000240024020040d00410121050c010b2004102a2205450d020b2003410036020820032004360204200320053602002001200310670240024020032802042206200328020822056b2001490d00200328020021040c010b200520016a22042005490d03200641017422072004200720044b1b22074100480d030240024020060d002007102a21040c010b200328020020062007102e21040b2004450d022003200736020420032004360200200721060b200420056a2000200110db051a02400240200241046a2802002207200241086a28020022006b200520016a2201490d00200228020021050c010b200020016a22052000490d03200741017422002005200020054b1b22004100480d030240024020070d002000102a21050c010b200228020020072000102e21050b2005450d0220022005360200200241046a2000360200200241086a28020021000b200241086a200020016a360200200520006a2004200110db051a02402006450d002004102c0b200341106a24000f0b103a000b1033000b1035000beb0301057f230041c0006b22022400200241206a41086a220341e4d2c500ad42808080808001841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341a9e4c300ad4280808080e001841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2000109f01024041c000102a2204450d00200420022903003700002004200229031037001020042002290020370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241003602282002420137032020012d000021004101102a21030240024020004101460d002003450d02200242818080801037022420022003360220200341003a0000200141086a200241206a10b4040c010b2003450d01200242818080801037022420022003360220200341013a00002002200241206a360210200141016a200241106a1094020b200228022421032004ad4280808080800884200235022842208620022802202201ad84100102402003450d002001102c0b2004102c200241c0006a24000f0b1033000b02000be52003167f037e067f230041c0026b220424000240024020014115490d0041012105410121060240024002400340200121072000210820052006714101732109024002400240024002400240034002400240024002402003450d00024020054101710d0020002001108a032003417f6a21030b2001410276220a41036c210b200a410174210c4100210d024020014132490d00200a200a417f6a220d2000200a4105746a2000200d4105746a412010dd05220e410048220f1b2210200a41016a2211200d200a200f1b220a200020114105746a2000200a4105746a412010dd0541004822111b220a2000200a4105746a200020104105746a412010dd0522104100481b210a200c200c417f6a220d2000200c4105746a2000200d4105746a412010dd05221241004822131b2214200c4101722215200d200c20131b220c200020154105746a2000200c4105746a412010dd0522134100481b220c2000200c4105746a200020144105746a412010dd0522144100481b210c200b200b417f6a220d2000200b4105746a2000200d4105746a412010dd05221541004822161b2217200b41016a2218200d200b20161b220b200020184105746a2000200b4105746a412010dd05220d4100481b220b2000200b4105746a200020174105746a412010dd0522164100481b210b41024101200f1b200e411f7620111b2010411f766a2012411f766a2013411f766a2014411f766a2015411f766a200d411f766a2016411f766a210d0b2000200c4105746a2000200a4105746a412010dd05220f411f76200d6a2000200b4105746a2000200a200c200f410048220f1b220e4105746a412010dd052210411f766a210d2000200b200e20104100481b220b4105746a2000200c200a200f1b22194105746a412010dd05417f4c0d01200b21190c020b20002001108b030c0f0b200d41016a220d410c490d0002402001410176220b450d00200020014105746a41606a210a2000210c0340200441206a41186a220d200c41186a220f290000370300200441206a41106a220e200c41106a2210290000370300200441206a41086a2211200c41086a22122900003703002004200c290000370320200a41086a2213290000211a200a41106a2214290000211b200a41186a2215290000211c200c200a290000370000200f201c3700002010201b3700002012201a3700002015200d2903003700002014200e29030037000020132011290300370000200a2004290320370000200a41606a210a200c41206a210c200b417f6a220b0d000b0b20012019417f736a21194101210a0c010b200d45210a0b0240200a452009724101710d0020002001108c030d0d0b2002450d02201920014f0d0102402002200020194105746a220a412010dd0541004e0d0020002108200121070c040b200441206a41186a2212200041186a220e290000370300200441206a41106a2213200041106a2210290000370300200441206a41086a2214200041086a221129000037030020042000290000370320200a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2000200a290000370000200e201c3700002010201b3700002011201a370000200d2012290300370000200b2013290300370000200c2014290300370000200a2004290320370000200441c0016a41186a2217200e290000370300200441c0016a41106a22182010290000370300200441c0016a41086a22192011290000370300200420002900003703c001200041606a2115200041206a21164100210c2001210b03400240200c200b417f6a220d4f0d002016200c4105746a210a0340200441c0016a200a412010dd05417f4c0d01200a41206a210a200d200c41016a220c470d000b200d210c0b2015200b4105746a210a02400340200c200b417f6a220b4f0d01200441c0016a200a412010dd05210d200a41606a220f210a200d4100480d000b20122016200c4105746a220a41186a220d2900003703002013200a41106a221d2900003703002014200a41086a22062900003703002004200a290000370320200f41286a221e290000211a200f41306a221f290000211b200f41386a2220290000211c200a200f41206a220f290000370000200d201c370000201d201b3700002006201a37000020202012290300370000201f2013290300370000201e2014290300370000200f2004290320370000200c41016a210c0c010b0b200020042903c001370000200e2017290300370000201020182903003700002011201929030037000002402001200c41016a220a490d002000200a4105746a21002001200a6b220141154f0d010c0c0b0b200a20011047000b41c4ffc500201920011038000b2007450d010b201920074f0d01200441206a41186a2216200841186a221e290000370300200441206a41106a2217200841106a221f290000370300200441206a41086a2218200841086a222029000037030020042008290000370320200820194105746a220a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2008200a290000370000201e201c370000201f201b3700002020201a370000200d2016290300370000200b2017290300370000200c2018290300370000200a2004290320370000200441186a2205201e290000370300200441106a2209201f290000370300200441086a2221202029000037030020042008290000370300200841206a21014100211d2007417f6a220d450d022001210a0340200a2004412010dd0541004e0d03200a41206a210a200d201d41016a221d470d000b200d211d0c020b41f8fec500410041001038000b4188ffc500201920071038000b200820074105746a210c200d210b02400340200c2100200b220a201d4d22060d01200a417f6a210b200041606a220c2004412010dd05417f4a0d000b0b0240200a201d490d00200d200a490d0241800121144100210f410021124100210d4100211141800121152001201d4105746a2222210103400240200020016b220a419fc0004b22190d00200a410576220a41807f6a200a2012200f492011200d49220c72220b1b210a0240200b450d002015200a200c1b2115200a2014200c1b21140c010b200a200a41017622156b21140b02402011200d470d00024020150d00200441c0006a220d21110c010b4100210a200441c0006a2211210d2001210c0340200d200a3a0000200d200c2004412010dd05417f73411f766a210d200c41206a210c2015200a41016a220a470d000b0b02402012200f470d00024020140d00200441c0016a220f21120c010b200041606a210a4100210c200441c0016a2212210f0340200f200c3a0000200f200a2004412010dd05411f766a210f200a41606a210a2014200c41016a220c470d000b0b0240200f20126b220a200d20116b220c200c200a4b1b2213450d002016200120112d00004105746a220a41186a2900003703002017200a41106a2900003703002018200a41086a2900003703002004200a290000370320200120112d00004105746a220a200020122d0000417f734105746a220c290000370000200a41186a200c41186a290000370000200a41106a200c41106a290000370000200a41086a200c41086a290000370000024020134101460d004100210a034020002012200a6a220e2d0000417f734105746a220c20012011200a6a41016a22102d00004105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200120102d00004105746a220c2000200e41016a2d0000417f734105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200a41026a210c200a41016a220b210a200c2013490d000b2012200b6a21122011200b6a21110b200020122d0000417f734105746a220a2004290320370000200a41186a2016290300370000200a41106a2017290300370000200a41086a2018290300370000201241016a2112201141016a21110b200020144105746b20002012200f461b2100200120154105746a20012011200d461b210120190d000b024002402011200d4f0d002000210a034020162001200d417f6a220d2d00004105746a220c41186a220b2900003703002017200c41106a220f2900003703002018200c41086a22002900003703002004200c290000370320200a41606a220a41086a220e290000211a200a41106a2210290000211b200a41186a2212290000211c200c200a290000370000200b201c370000200f201b3700002000201a3700002012201629030037000020102017290300370000200e2018290300370000200a20042903203700002011200d490d000c020b0b2001210a2012200f4f0d000340200f417f6a220f2d0000210c2016200a41186a220b2900003703002017200a41106a220d2900003703002018200a41086a22012900003703002004200a2900003703202000200c417f734105746a220c41086a220e290000211a200c41106a2210290000211b200c41186a2211290000211c200a200c290000370000200b201c370000200d201b3700002001201a3700002011201629030037000020102017290300370000200e2018290300370000200c2004290320370000200a41206a210a2012200f490d000b0b20082004290300370000201e2005290300370000201f2009290300370000202020212903003700002007200a20226b410576201d6a22014d0d032016201e2900003703002017201f2900003703002018202029000037030020042008290000370320200820014105746a220a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2008200a290000370000201e201c370000201f201b3700002020201a370000200d2016290300370000200b2017290300370000200c2018290300370000200a2004290320370000200720016b220c450d04200c20012001200c4b1b210b2007410376210d200a41206a2100024002402001200c417f6a220c490d002000200c200a2003108903200821000c010b2008200120022003108903200a2102200c21010b200b200d4f2105200141154f0d010c050b0b201d200a1047000b200a200d103f000b4188ffc500200120071038000b4198ffc500411c41b4ffc5001036000b20014102490d00200041606a210f4101210b0340200b410574210a200b417f6a210c200b41016a210b02402000200a6a220a2000200c4105746a220d412010dd05417f4a0d00200441c0016a41186a220e200a41186a2210290000370300200441c0016a41106a2211200a41106a2212290000370300200441c0016a41086a2213200a41086a22142900003703002004200a2900003703c001200a200d2900003700002014200d41086a2900003700002012200d41106a2900003700002010200d41186a2900003700004100210d0240200c450d00200f210a03400240200441c0016a200a412010dd054100480d00200c210d0c020b200a41206a200a290000370000200a41386a200a41186a290000370000200a41306a200a41106a290000370000200a41286a200a41086a290000370000200a41606a210a200c417f6a220c0d000b0b2000200d4105746a220a20042903c001370000200a41186a200e290300370000200a41106a2011290300370000200a41086a20132903003700000b200f41206a210f200b2001470d000b0b200441c0026a24000beb050a067f017e017f017e017f017e017f017e017f017e230041206b2202240002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d022001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c37000020052008370000024020032001490d00200321040c030b2006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c370000200520083700002003410172220420014f0d022006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a22012900002108200020054105746a220041086a2205290000210a200041106a2204290000210c200041186a2203290000210e20012000290000370000200141186a220629000021102006200e370000200141106a2206290000210e2006200c370000200141086a2201290000210c2001200a370000200320103700002004200e3700002005200c370000200020083700000b200241206a24000f0b4188ffc500200520011038000b41f8fec500200420011038000be90609067f017e017f017e017f027e017f017e027f230041206b22022400024020014101762203450d0003402003417f6a2203210402400240024003402004410174220541017221060240200541026a220520014f0d00200620014f0d0220052006200020064105746a200020054105746a412010dd054100481b21060b200620014f0d03200420014f0d02200020044105746a2204200020064105746a2205412010dd0541004e0d03200541086a22072900002108200541106a2209290000210a200541186a220b290000210c2004290000210d20042005290000370000200441186a220e290000210f200e200c370000200441106a220e290000210c200e200a370000200441086a2204290000210a20042008370000200b200f3700002009200c3700002007200a3700002005200d370000200621040c000b0b41a080c600200620011038000b41b080c600200420011038000b20030d000b0b0240024020014102490d002001210703402007417f6a220720014f0d02200241186a2209200041186a2204290000370300200241106a220b200041106a2205290000370300200241086a220e200041086a2203290000370300200020074105746a220641086a2900002108200641106a290000210a200641186a290000210c2000290000210d200020062900003700002004200c3700002005200a370000200320083700002002200d37030041002105024002400240034020062002290300370000200641186a2009290300370000200641106a200b290300370000200641086a200e2903003700002005410174220641017221040240200641026a220620074f0d00200420074f0d0220062004200020044105746a200020064105746a412010dd054100481b21040b200420074f0d03200520074f0d02200020054105746a2205200020044105746a2206412010dd0541004e0d032009200541186a2203290000370300200b200541106a2210290000370300200e200541086a2211290000370300200641086a2900002108200641106a290000210a200641186a290000210c2005290000210d200520062900003700002003200c3700002010200a370000201120083700002002200d370300200421050c000b0b41a080c600200420071038000b41b080c600200520071038000b200741014b0d000b0b200241206a24000f0b4188ffc500200720011038000bdb08030a7f017e0a7f230041c0006b22022400200041a07f6a21032001417f6a2104200141324921054101210641002107024003400240024020062001490d00410021080c010b41012108200020064105746a2209200941606a412010dd054100480d0003404101210a20042006460d03200641016a2106200941206a220a2009412010dd052108200a21092008417f4a0d000b200620014921080b2006200146210a20050d0120062001460d0102400240024002402006417f6a220920014f0d002008450d0120002006410574220b6a220a290000210c200a200020094105746a22092900003700002009200c370000200a41086a220d290000210c200d200941086a220e290000370000200e200c370000200a41106a220f290000210c200f200941106a22102900003700002010200c370000200a41186a2211290000210c2011200941186a22122900003700002012200c37000020064102490d03200920002006417e6a22084105746a2213412010dd05417f4a0d032009290000210c20092013290000370000200241206a41186a22142012290000370300200241206a41106a22152010290000370300200241206a41086a2216200e290000370300200e201341086a2900003700002010201341106a2900003700002012201341186a2900003700002002200c3703204100210e2008450d022003200b6a210903400240200241206a2009412010dd054100480d002008210e0c040b200941206a2009290000370000200941386a200941186a290000370000200941306a200941106a290000370000200941286a200941086a290000370000200941606a21092008417f6a22080d000c030b0b41f8fec500200920011038000b4188ffc500200620011038000b2000200e4105746a22092002290320370000200941186a2014290300370000200941106a2015290300370000200941086a20162903003700000b200741016a21070240200120066b22104102490d00200a41206a2209200a412010dd05417f4a0d00200a290000210c200a2009290000370000200241206a41186a22122011290000370300200241206a41106a2213200f290000370300200241206a41086a220b200d290000370300200d200941086a290000370000200f200941106a2900003700002011200941186a2900003700002002200c3703204101210d024020104103490d00200a41c0006a200241206a412010dd05417f4a0d00410321084102210e0340200a200e4105746a220941606a220d2009290000370000200d41186a200941186a290000370000200d41106a200941106a290000370000200d41086a200941086a290000370000024020082010490d00200e210d0c020b20084105742109200e210d2008210e200841016a2108200a20096a200241206a412010dd054100480d000b0b200a200d4105746a22092002290320370000200941186a2012290300370000200941106a2013290300370000200941086a200b2903003700000b20074105470d000b4100210a0b200241c0006a2400200a0bc21301147f23004180026b220424000240024020014115490d0041012105410121060240024002400340200121072000210820052006714101732109024002400240024002400240034002400240024002402003450d00024020054101710d0020002001108e032003417f6a21030b2001410276220a41036c210b200a410174210c4100210d024020014132490d00200b200b417f6a220e2000200b4102746a280200220f2000200e4102746a280200221049220d1b2211200b41016a2212200e200b200d1b200020124102746a280200220b2010200f200d1b220e4922101b200b200e20101b200020114102746a2802004922131b210b200c200c417f6a220e2000200c4102746a28020022112000200e4102746a280200221249220f1b2214200c4101722215200e200c200f1b200020154102746a280200220c20122011200f1b220e4922111b200c200e20111b200020144102746a2802004922141b210c200a200a417f6a22122000200a4102746a2802002215200020124102746a280200220649220e1b2216200a41016a22172012200a200e1b200020174102746a280200220a20062015200e1b22154922121b200a201520121b200020164102746a2802004922151b210a41024101200e1b200e20121b20156a200f6a20116a20146a200d6a20106a20136a210d0b200d2000200c4102746a280200220f2000200a4102746a280200221049220e6a2000200b4102746a280200220d2010200f200e1b22114922106a210f200d201120101b2000200c200a200e1b220d4102746a280200490d01200b200a200c200e1b20101b210d0c020b20002001108f030c0f0b200f41016a220f410c490d0002402001410176220b450d00200020014102746a417c6a210a2000210c0340200c280200210e200c200a280200360200200a200e360200200c41046a210c200a417c6a210a200b417f6a220b0d000b0b2001200d417f736a210d4101210a0c010b200f45210a0b0240200a452009724101710d00200020011090030d0d0b2002450d02200d20014f0d01024020022802002000200d4102746a220a280200220c4f0d0020002108200121070c040b2000280200210b2000200c360200200a200b3602002000417c6a2110200041046a21112000280200210d4100210c2001210b03400240200c200b417f6a220e4f0d002011200c4102746a210a0340200d200a280200490d01200a41046a210a200e200c41016a220c470d000b200e210c0b2010200b4102746a210a02400340200c200b417f6a220b4f0d01200a280200210e200a417c6a220f210a200d200e490d000b2011200c4102746a220a2802002112200a200e360200200f41046a2012360200200c41016a210c0c010b0b2000200d36020002402001200c41016a220a490d002000200a4102746a21002001200a6b220141154f0d010c0c0b0b200a20011047000b41c4ffc500200d20011038000b2007450d010b200d20074f0d012008280200210a20082008200d4102746a220c280200360200200c200a360200200841046a210f20082802002111410021142007417f6a220d450d02200f210a0340200a28020020114f0d03200a41046a210a200d201441016a2214470d000b200d21140c020b41f8fec500410041001038000b4188ffc500200d20071038000b200820074102746a210c200d210b02400340200c210e200b220a20144d22060d01200a417f6a210b200e417c6a220c28020020114f0d000b0b0240200a2014490d00200d200a490d0241800121054100210b410021014100210c410021104180012109200f20144102746a2216210d03400240200e200d6b220a4183084b22130d00200a410276220a41807f6a200a2001200b492010200c49220f7222001b210a02402000450d002009200a200f1b2109200a2005200f1b21050c010b200a200a41017622096b21050b02402010200c470d00024020090d002004220c21100c010b4100210a20042210210c200d210f0340200c200a3a0000200c200f28020020114f6a210c200f41046a210f2009200a41016a220a470d000b0b02402001200b470d00024020050d0020044180016a220b21010c010b200e417c6a210a4100210f20044180016a2201210b0340200b200f3a0000200b200a2802002011496a210b200a417c6a210a2005200f41016a220f470d000b0b0240200b20016b220a200c20106b220f200f200a4b1b2212450d00200d20102d00004102746a220a2802002115200a200e20012d0000417f734102746a280200360200024020124101460d004100210a0340200e2001200a6a220f2d0000417f734102746a200d2010200a6a41016a22002d00004102746a280200360200200d20002d00004102746a200e200f41016a2d0000417f734102746a280200360200200a41026a210f200a41016a2200210a200f2012490d000b200120006a2101201020006a21100b200e20012d0000417f734102746a2015360200200141016a2101201041016a21100b200e20054102746b200e2001200b461b210e200d20094102746a200d2010200c461b210d20130d000b024002402010200c4f0d00200e210a0340200d200c417f6a220c2d00004102746a220b280200210e200b200a417c6a220a280200360200200a200e3602002010200c490d000c020b0b200d210a2001200b4f0d000340200a280200210c200a200e200b417f6a220b2d0000417f734102746a220d280200360200200d200c360200200a41046a210a2001200b490d000b0b200820113602002007200a20166b41027620146a22014d0d032008200820014102746a220a280200360200200a2011360200200720016b220c450d04200c20012001200c4b1b210b2007410376210e200a41046a2100024002402001200c417f6a220c490d002000200c200a2003108d03200821000c010b2008200120022003108d03200a2102200c21010b200b200e4f2105200141154f0d010c050b0b2014200a1047000b200a200d103f000b4188ffc500200120071038000b4198ffc500411c41b4ffc5001036000b20014102490d00200041746a210e4102210d4101210a0340200a41016a210c02402000200a4102746a2210280200220b2000200a417f6a22114102746a220f28020022124f0d002010201236020002402011450d00200b2000200a417e6a22104102746a221128020022124f0d00200f2012360200024020100d002011210f0c010b0240200b2000200a417d6a220a4102746a220f2802002210490d002011210f0c010b20112010360200200a450d00200d210f200e210a02400340200b200a28020022104f0d01200a41046a2010360200200a417c6a210a200f41016a2210200f4921112010210f2011450d000b0b200a41046a210f0b200f200b3602000b200d417f6a210d200e41046a210e200c210a200c2001470d000b0b20044180026a24000bf30201067f02400240024020014108490d00200141017641feffffff07712202417f6a220320014f0d022001410d74200173220441117620047322044105742004732205417f2001417f6a677622067122044100200120042001491b6b220420014f0d01200020034102746a220328020021072003200020044102746a220428020036020020042007360200024020022001490d00200221030c030b2005410d7420057322044111762004732204410574200473220520067122044100200120042001491b6b220420014f0d01200020024102746a220328020021072003200020044102746a2204280200360200200420073602002002410172220320014f0d022005410d742005732204411176200473220441057420047320067122044100200120042001491b6b220420014f0d01200020034102746a220128020021022001200020044102746a2200280200360200200020023602000b0f0b4188ffc500200420011038000b41f8fec500200320011038000bc70301067f024020014101762202450d0003402002417f6a2202210302400240024003402003410174220441017221050240200441026a220420014f0d00200520014f0d0220042005200020054102746a280200200020044102746a280200491b21050b200520014f0d03200320014f0d02200020034102746a22032802002204200020054102746a220628020022074f0d032003200736020020062004360200200521030c000b0b41a080c600200520011038000b41b080c600200320011038000b20020d000b0b0240024020014102490d002001210403402004417f6a220420014f0d02200028020021052000200020044102746a2203280200360200200320053602004100210302400240024003402003410174220641017221050240200641026a220620044f0d00200520044f0d0220062005200020054102746a280200200020064102746a280200491b21050b200520044f0d03200320044f0d02200020034102746a22032802002206200020054102746a220728020022024f0d032003200236020020072006360200200521030c000b0b41a080c600200520041038000b41b080c600200320041038000b200441014b0d000b0b0f0b4188ffc500200420011038000b8a05010f7f2001417d6a2102200041086a21032000416c6a21042001417f6a2105200041046a2106410021072001413249210841012109024003400240024020092001490d004100210a0c010b4101210a20002009410274220b6a220c280200220d200c417c6a280200490d002006200b6a210a03404101210c20052009460d03200941016a2109200a280200220c200d4f210b200a41046a210a200c210d200b0d000b2009200149210a0b2009200146210c20080d0120092001460d0102400240024002402009417f6a220d20014f0d00200a450d012000200d4102746a220c280200210b200c20002009410274220e6a220a280200220d360200200a200b360200024020094102490d00200d20002009417e6a220b4102746a220f28020022104f0d00200c201036020002400240200b0d00200f210c0c010b0240200d20002009417d6a220b4102746a220c2802002210490d00200f210c0c010b200f2010360200200b450d00200d200a41706a280200220f4f0d002004200e6a2110024003402010220c41086a200f360200200b417f6a220b450d01200c417c6a2110200d200c280200220f490d000b0b200c41046a210c0b200c200d3602000b200741016a2107200120096b220b4102490d03200a280204220f200a280200220c4f0d03200a41046a210d200a200f360200200b4103490d02200a280208220f200c4f0d02200d200f3602000240200b41044f0d00200a41086a210d0c030b200220096b210a2003200e6a210d0340200d41046a220b280200220e200c4f0d03200d200e360200200b210d200a417f6a220a0d000b200b210d0c020b41f8fec500200d20011038000b4188ffc500200920011038000b200d200c3602000b20074105470d000b4100210c0b200c0b120041bcaac20041fc0041acfec5001036000b5101027e024002402003450d002002280200450d010b41b5abc50041f4031054000b2001280218220342002003290308220420023502047d2205200520045622021b37030820004105410420021b3602000bd60201047f0240024002402002417f4c0d000240024020020d00410121060c010b2002102a2206450d020b20062001200210db0521062004417f4c0d000240024020040d0041012101410021070c010b200421072004102a2201450d020b20012003200410db052103024020002802082201200041046a280200470d00200141016a22082001490d03200141017422092008200920084b1b220841ffffff3f712008470d03200841057422094100480d030240024020010d002009102a21010c010b200028020020014105742009102e21010b2001450d0220002001360200200041046a2008360200200028020821010b200028020020014105746a220141003602182001200336020c2001200236020820012002360204200120063602002001411c6a2005360200200141146a2004360200200141106a20073602002000200028020841016a3602080f0b103a000b1033000b1035000bfa0e05047f027e027f017e027f230041c00c6b22042400024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042105200241246a2802002106200241346a28020021030240200241146a2802002207450d004105210220012802002802182802402802bc012003490d080b200441286a4200370300200441206a4200370300200441186a420037030020012802182202420020022903082208427f20012802102903482209420586200942ffffffffffffffff07832009521b7d22092009200856220a1b3703082004420037031041052102200a0d070240024020012802142802082005200441106a4120101e41026a220a41024b0d00200a0e03090001090b41ac91c600412841d491c6001036000b024002400240024020070d00410121034100210b0c010b2004200128021029034842002003ad220c420010e0052001280218220a4200200a2903082209427f200429030020042903084200521b7d22082008200956220a1b370308200a0d0a2003417f4c0d070240024020030d004101210b02402001280214280208200641014100101e41026a220341024b0d0020030e030d00020d0b41ac91c600412841d491c6001036000b20031030220b450d0a024020012802142802082006200b2003101e41026a220341024b0d0020030e03030001030b41ac91c600412841d491c6001036000b200c422086200c842109200b4521030b20012802002101200441306a41186a220a200441106a41186a290300370300200441306a41106a2205200441106a41106a290300370300200441306a41086a2206200441106a41086a290300370300200420042903103703302001280218210720030d0120072802402802bc012009422088a74f0d012009a7450d090b200b102c0c080b200441d0006a41186a200a290300370300200441d0006a41106a2005290300370300200441d0006a41086a20062903003703002004200429033037035020072802180d052007417f360218200441a8016a200741e8006a290000370300200441a0016a200741e0006a29000037030020044198016a200741d8006a2900003703002004200729005037039001024002402007411c6a220d280200220a41d0e1c100460d00200741206a28020021060c010b41002106200441e0096a410041e00210da051a200441c0016a410041a00810da051a41880b102a220a450d07200a41003b0106200a4100360200200a41086a200441e0096a41e00210db051a200a41e8026a200441c0016a41a00810db051a200741206a41003602002007200a36021c0b024002400340200a2f0106220e4105742105410021024100210302400240034020052002460d0120044190016a200a20026a41086a412010dd052201450d02200241206a2102200341016a21032001417f4a0d000b2003417f6a210e0b2006450d022006417f6a2106200a200e4102746a41880b6a280200210a0c010b0b200741246a2101410121020c010b200441f0006a41186a20044190016a41186a290300370300200441f0006a41106a20044190016a41106a290300370300200441f0006a41086a20044190016a41086a2903003703002004200429039001370370200741246a210141002106200e2103410021020b0240024020020d00200441fc096a200441f0006a41086a290300370200200441840a6a200441f0006a41106a2903003702002004418c0a6a200441f0006a41186a290300370200200420013602f009200420033602ec092004200d3602e8092004200a3602e409200420063602e009200420042903703702f409200441e0016a20042903b001370300200441e8016a200441b0016a41086a290300370300200441f4016a4200370200200442003703d801200442003703c001200441d0e1c1003602f001200441003a00fc01200441fd016a20042900900137000020044185026a20044190016a41086a2900003700002004418d026a20044190016a41106a29000037000020044195026a20044190016a41186a290000370000200441003a009d02200441e0096a200441c0016a10800221020c010b200441d8016a4200370300200441d4016a41d0e1c100360200200441003602e001200441003602d001200442003703c801200441d0e1c1003602c401200441003602c001200a200341e0006c6a41e8026a2102200441c0016a10f4010b200441c0016a41186a200441d0006a41186a290300370300200441c0016a41106a200441d0006a41106a290300370300200441c0016a41086a200441d0006a41086a290300370300200420042903503703c00120042009370294012004200b36029001200441e0096a200241306a200441c0016a20044190016a108102024020042802e009450d0020042802e4092202450d00200441e8096a280200450d002002102c0b2007200728021841016a360218410421020c070b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b103a000b41f089c6004110200441c0016a41f882c100103b000b1033000b20002002360200200441c00c6a24000b970302017f027e230041c0006b22042400024002402003450d0020022802000d0020022802042103200441186a4200370300200441106a4200370300200441086a420037030020012802182202420020022903082205427f20012802102903482206420586200642ffffffffffffffff07832006521b7d2206200620055622021b3703082004420037030002400240024020020d00024002402001280214280208200320044120101e41026a220241024b0d0020020e03020001020b41ac91c600412841d491c6001036000b200441206a2001280200280218220241186a200241d0006a2002410c6a4100200228020c1b200410fb012004280220450d01200441306a41086a2203200441206a41086a28020036020020042004290320370330200141046a21020240200141086a280200450d002002280200102c0b20022004290330370200200241086a2003280200360200410021010c020b200041053602000c030b2001410c6a4100360200410121010b20004100360200200020013602040c010b41b5abc50041f4031054000b200441c0006a24000ba20b05017f017e057f047e027f230041c0016b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d06200241286a2903002105200241346a2802002103200241c4006a2802002106200241d4006a2802002107200241e4006a2802002108200441d0006a20012002280204200241146a28020010ec04200441f8006a41086a2202200441d9006a290000370300200441f8006a41106a2209200441e1006a290000370300200441f8006a41186a220a200441e9006a29000037030020042004290051370378024020042d00504101460d00200441306a41186a200a290300370300200441306a41106a2009290300370300200441306a41086a200229030037030020042004290378370330200441186a20012003200610ee042004290318a70d00200441186a41106a290300210b2004290320210c200441086a200128021029034842002008ad420010e0052001280218220242002002290308220d427f200429030820042903104200521b7d220e200e200d5622021b37030820020d00200141046a21060240024020082001410c6a220928020022034b0d00200821020c010b02400240200141086a280200220220036b200820036b220f490d002006280200210a200321020c010b2003200f6a220a2003490d0b20024101742210200a2010200a4b1b22104100480d0b0240024020020d002010102a210a0c010b200628020020022010102e210a0b200a450d0a2001200a360204200141086a20103602002001410c6a28020021020b200a20026a211002400240200f4102490d002010410020082003417f7322036a220f10da051a200a200820026a20036a6a2110200f20026a21020c010b200f450d010b201041003a0000200241016a21020b20092002360200024002402001280214280208200720012802042002101e41026a220241024b0d0020020e03020001020b41ac91c600412841d491c6001036000b2001410c6a2202280200210a20024100360200200141086a2802002103200128020421092001420137020420012802182202290308220e210d024002402005500d002005210d200e2005540d010b2002200e200d7d37030820022903102105200441f8006a41186a200241186a2903003703002004200d370380012004200d370378200420053703880120012802002802182108200441d0006a41186a200441306a41186a290300370300200441d0006a41106a200441306a41106a290300370300200441d0006a41086a200441306a41086a290300370300200420042903303703502004200a3602b801200420033602b401200420093602b00120044198016a2008200441d0006a200c200b200441f8006a200441b0016a10e20241012107024002402004280298014101460d0020044198016a410472210920044198016a41106a2d0000210a200441a4016a2802002108200441a0016a2802002103410021070c010b200441a4016a2109200441ac016a280200210820044198016a41106a28020021034100210a0b20092802002109200220042903800120022903087c370308200141086a2802002102024020070d0002402002450d002006280200102c0b200620093602000c0c0b2002450d002006280200102c0b20062009360200418002210a410021080c0a0b200041053602000c0a0b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b1033000b1035000b2001410c6a2008360200200141086a2003360200200041003602002000200a3602040b200441c0016a24000bbd0c05017f017e057f047e037f230041d0016b220424000240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d06200241286a2903002105200241346a2802002103200241c4006a2802002106200241d4006a2802002107200241e4006a280200210820044198016a20012002280204200241146a28020010ed04200441e0006a41086a2202200441a1016a290000370300200441e0006a41106a2209200441a9016a290000370300200441e0006a41186a220a200441b1016a29000037030020042004290099013703600240024020042d0098014101460d00200441286a41186a200a290300370300200441286a41106a2009290300370300200441286a41086a200229030037030020042004290360370328200441106a20012003200610ee042004290310a70d00200441106a41106a290300210b2004290318210c2004200128021029034842002008ad420010e0052001280218220242002002290308220d427f200429030020042903084200521b7d220e200e200d5622021b37030820020d00200141046a210a0240024020082001410c6a220628020022034b0d00200821020c010b02400240200141086a280200220220036b200820036b220f490d00200a2802002109200321020c010b2003200f6a22092003490d0c200241017422102009201020094b1b22104100480d0c0240024020020d002010102a21090c010b200a28020020022010102e21090b2009450d0b20012009360204200141086a20103602002001410c6a28020021020b200920026a211002400240200f4102490d002010410020082003417f7322036a220f10da051a2009200820026a20036a6a2110200f20026a21020c010b200f450d010b201041003a0000200241016a21020b20062002360200024002402001280214280208200720012802042002101e41026a220241024b0d0020020e03020001020b41ac91c600412841d491c6001036000b2001410c6a2202280200210920024100360200200141086a2802002103200128020421062001420137020420012802182202290308220e210d0240024002402005500d002005210d200e2005540d010b2002200e200d7d37030820022903102105200441e0006a41186a200241186a2903003703002004200d3703682004200d370360200420053703702001280200280218210820042009360288012004200336028401200420063602800120044198016a2008200c200b200441e0006a200441286a20044180016a10dd0241012109024002402004280298014101460d0020044180016a41086a20044198016a41186a29030037030020044180016a41106a200441b8016a280200360200200420044198016a41106a29030037038001200441c8016a2d00002108200441c0016a2802002107200441bc016a280200210f200441a4016a280200211020044198016a41086a280200210341002109200428029c0121060c010b200441ac016a2802002110200441a8016a2802002103200441a4016a2802002106410021080b2002200429036820022903087c370308200441c8006a41086a220220044180016a41086a290300370300200441c8006a41106a221120044180016a41106a2802003602002004200429038001370348024020090d00200441ac016a2002290300370200200441b4016a2011280200360200200420103602a0012004200336029c012004200636029801200420042903483702a4010240200141086a280200450d00200a280200102c0b2001200f3602042001410c6a4100360200200141086a2007360200200841ff017122020d0220044198016a200a1091010c020b200141086a280200450d00200a280200102c0b200120063602042001410c6a4100360200200141086a200336020041800221020b20004100360200200020023602040c010b200041053602000b200441d0016a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b1033000b1035000ba00503027f037e057f230041206b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441106a20012802102903184200200241146a2802002203ad2206420010e00520012802182202420020022903082207427f200429031020042903184200521b7d2208200820075622021b370308024020020d002004200128021029034842002006420010e00520012802182202420020022903082207427f200429030020042903084200521b7d2208200820075622021b37030820020d000240024020032001410c6a2209280200220a4b0d00200321020c010b02400240200141086a2802002202200a6b2003200a6b220b490d002001280204210c200a21020c010b200a200b6a220c200a490d062002410174220d200c200d200c4b1b220d4100480d060240024020020d00200d102a210c0c010b20012802042002200d102e210c0b200c450d052001200c360204200141086a200d3602002001410c6a28020021020b200c20026a210d02400240200b4102490d00200d41002003200a417f73220a6a220b10da051a200c200320026a200a6a6a210d200b20026a21020c010b200b450d010b200d41003a0000200241016a21020b20092002360200024002402001280214280208200520012802042002101e41026a220241024b0d0020020e03020001020b41ac91c600412841d491c6001036000b2001410c6a2202280200210320024100360200200141086a280200210220012802042105200142013702040240200128021c220a450d00200141206a280200450d00200a102c0b2001200536021c200141246a2003360200200141206a20023602000b20004105360200200441206a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b1033000b1035000b23002001410c6a4100360200200128020041206a200141046a109101200041043602000b27002001410c6a4100360200200128020028021841d0006a200141046a109101200041043602000bd10102027f027e410021042001410c6a41003602002001280218220541186a2903002106200529031021070240024002400240200141086a28020022054110490d00200128020421050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102a21050c010b200128020420052004102e21050b2005450d0120012005360204200141086a20043602002001410c6a28020021040b2001410c6a200441106a360200200520046a2201200637000820012007370000200041043602000f0b1033000b1035000bbe0103017f017e017f410021042001410c6a4100360200200128021829030821050240024002400240200141086a28020022064108490d00200128020421060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102a21060c010b200128020420062004102e21060b2006450d0120012006360204200141086a20043602002001410c6a28020021040b2001410c6a200441086a360200200620046a2005370000200041043602000f0b1033000b1035000bb404020b7f027e230041206b220424002001410c6a41003602000240024002402001280200280218220528021841016a220641004c0d00200541d0006a2107200520063602182005411c6a2108200541206a28020021090240024003402008280200220a41086a210b200a2f0106220c41057421084100210d0240024003402008450d012007200b412010dd05220e450d02200841606a2108200d41016a210d200b41206a210b200e417f4a0d000b200d417f6a210c0b2009450d022009417f6a2109200a200c4102746a41880b6a21080c010b0b200a200d41e0006c6a220841c5036a310000200841e8026a290300220f200f50220b1ba7450d004200200841f8026a290300200b1b210f4200200841f0026a290300200b1b21100c010b200441086a200541286a28020020072005412c6a28020028021c110400200441106a290300210f20052802182106200429030821100b20052006417f6a36021802400240200141086a280200220b2001410c6a28020022086b4110490d002001280204210b0c010b200841106a220d2008490d03200b4101742208200d2008200d4b1b22084100480d0302400240200b0d002008102a210b0c010b2001280204200b2008102e210b0b200b450d022001200b360204200141086a20083602002001410c6a28020021080b2001410c6a200841106a360200200b20086a2208200f3700082008201037000020004104360200200441206a24000f0b41c689c6004118200441186a418883c100103b000b1033000b1035000bd10102027f027e410021042001410c6a41003602002001280200220541086a2903002106200529030021070240024002400240200141086a28020022054110490d00200128020421050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102a21050c010b200128020420052004102e21050b2005450d0120012005360204200141086a20043602002001410c6a28020021040b2001410c6a200441106a360200200520046a2201200637000820012007370000200041043602000f0b1033000b1035000b900302047f027e230041c0006b220424000240024002402003450d0020022802000d0020034101460d0120022802100d01410521050240200241146a28020022032001280210220628026c4b0d0020022802042107200441086a200629034842002003ad420010e00520012802182202420020022903082208427f200429030820042903104200521b7d2209200920085622021b37030820020d002003417f4c0d0302400240024020030d004101210202402001280214280208200741014100101e41026a220641024b0d0020060e03040002040b41ac91c600412841d491c6001036000b0240200310302202450d0002402001280214280208200720022003101e41026a220641024b0d0020060e03030002030b41ac91c600412841d491c6001036000b1033000b2001410c6a4100360200200441186a2002200310b002410421052004200141046a36023c200441186a2004413c6a1094022003450d010b2002102c0b20002005360200200441c0006a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b103a000bbe0103017f017e017f410021042001410c6a4100360200200128020029031021050240024002400240200141086a28020022064108490d00200128020421060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102a21060c010b200128020420062004102e21060b2006450d0120012006360204200141086a20043602002001410c6a28020021040b2001410c6a200441086a360200200620046a2005370000200041043602000f0b1033000b1035000bd80102027f027e410021042001410c6a4100360200200128020028021828024022054180016a2903002106200529037821070240024002400240200141086a28020022054110490d00200128020421050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102a21050c010b200128020420052004102e21050b2005450d0120012005360204200141086a20043602002001410c6a28020021040b2001410c6a200441106a360200200520046a2201200637000820012007370000200041043602000f0b1033000b1035000bba0803027f047e027f23004180056b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802102903484200200241146a2802002202ad420010e00520012802182203420020032903082206427f200429032820042903304200521b7d2207200720065622031b3703080240024020030d002002417f4c0d0402400240024020020d004101210302402001280214280208200541014100101e41026a220541024b0d0020050e03040002040b41ac91c600412841d491c6001036000b200210302203450d0802402001280214280208200520032002101e41026a220541024b0d0020050e03020001020b41ac91c600412841d491c6001036000b2004200236023c20042003360238200441e8036a200441386a108f02024020042802e80322054118460d00200441d8026a200441e8036a410472418c0110db051a02402002450d002003102c0b200441c8016a200441d8026a418c0110db051a20042005360238200441386a410472200441c8016a418c0110db051a200441003602f003200442013703e803200441386a200441e8036a108b0120042802f0032103024020042802ec03450d0020042802e803102c0b200128021822022903102206200241186a2903002207844200510d07200441186a2003ad42004280c8afa025420010e005200441086a200429031822084280a094a58d1d7c2209200441186a41086a2903002009200854ad7c2006200710e10520024200200229030822062004290308427f200441086a41086a290300501b7d220720072006561b37030820072006580d03200441386a1092020c020b2002450d010b2003102c0b410521020c070b20012802002102200441d8026a200441386a41900110db051a200441c8016a41086a2002280218220241d8006a290000370300200441d8016a2203200241e0006a290000370300200441e0016a2205200241e8006a290000370300200420022900503703c801200441ef036a200441d8026a41900110db051a02402002413c6a2802002201200241386a280200470d00200141016a220a2001490d062001410174220b200a200b200a4b1b220aad42b8017e2206422088a70d062006a7220b4100480d060240024020010d00200b102a21010c010b2002280234200141b8016c200b102e21010b2001450d0520022001360234200241386a200a360200200228023c21010b2002280234200141b8016c6a220141013a0000200120042903c801370001200141096a200441d0016a290300370000200141116a2003290300370000200141196a2005290300370000200141216a200441e8036a41970110db051a2002200228023c41016a36023c410421020c060b41b5abc50041f4031054000b41b5abc50041f4031054000b103a000b41b0c5c100411941d890c2001036000b1033000b1035000b2000200236020020044180056a24000bce0f030c7f047e027f23004180026b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620034107460d0720022802700d07200241246a2802002105200241346a2802002106200241c4006a2802002107200241d4006a2802002108200241e4006a2802002109200241f4006a280200210a200441e0006a20012002280204200241146a28020010ec04200441e0016a41086a2203200441e9006a220b290000370300200441e0016a41106a220c200441f1006a220d290000370300200441e0016a41186a220e200441f9006a220f290000370300200420042900613703e0014105210220042d00604101460d0b200441206a41186a200e290300370300200441206a41106a200c290300370300200441206a41086a2003290300370300200420042903e001370320200441e0006a20012005200610ed042003200b290000370300200c200d290000370300200e200f290000370300200420042900613703e00120042d00604101460d0b200441c0006a41186a200441e0016a41186a290300370300200441c0006a41106a200441e0016a41106a290300370300200441c0006a41086a200441e0016a41086a290300370300200420042903e001370340200441086a20012007200810ee0420042802080d0b200441086a41106a29030021102004290310211102400240200a0d00410121054100210c4100210e0c010b200441e0016a41186a2103200441e0016a41106a2106200441e0016a41086a210b4100210f410021024100210c4100210e4101210503402003420037030020064200370300200b42003703002001280218220d4200200d2903082212427f20012802102903482213420586201342ffffffffffffffff07832013521b7d22132013201256220d1b370308200442003703e001200d0d0c024002402001280214280208200920026a220d200441e0016a4120101e41026a220741024b0d0020070e030e00010e0b41ac91c600412841d491c6001036000b200441e0006a41186a22082003290300370300200441e0006a41106a22142006290300370300200441e0006a41086a2215200b290300370300200420042903e0013703600240200c200e470d00200f200c41016a220e200f200e4b1b220e41ffffff3f71200e470d0c200e41057422074100480d0c02400240200c0d002007102a21050c010b200520022007102e21050b2005450d0b0b200520026a22072004290360370000200741186a2008290300370000200741106a2014290300370000200741086a2015290300370000200d41206a200d490d0c200f41026a210f200241206a2102200a200c41016a220c470d000b0b20012802002802182103200441c0016a41086a2201200441206a41086a290300370300200441c0016a41106a2206200441206a41106a290300370300200441c0016a41186a220b200441206a41186a290300370300200441e0016a41086a220d200341d8006a290000370300200441e0016a41106a220f200341e0006a290000370300200441e0016a41186a2207200341e8006a290000370300200420042903203703c001200420032900503703e001200441a0016a41186a2208200441c0006a41186a290300370300200441a0016a41106a220a200441c0006a41106a290300370300200441a0016a41086a2209200441c0006a41086a290300370300200420042903403703a00102402003413c6a2802002202200341386a280200470d00200241016a22142002490d0a200241017422152014201520144b1b2214ad42b8017e2213422088a70d0a2013a722154100480d0a0240024020020d002015102a21020c010b2003280234200241b8016c2015102e21020b2002450d0920032002360234200341386a2014360200200328023c21020b2003280234200241b8016c6a220241023a0000200220042903e001370001200220042903c001370021200241096a200d290300370000200241116a200f290300370000200241196a2007290300370000200241296a2001290300370000200241316a2006290300370000200241396a200b290300370000200220053600642002200e3600682002200c36006c20022011370370200241f8006a2010370300200220042903a001370041200241c9006a2009290300370000200241d1006a200a290300370000200241d9006a2008290300370000200220042f009d013b0061200241e3006a2004419d016a41026a2d00003a0000200220042903603703800120024188016a200441e0006a41086a29030037030020024190016a200441e0006a41106a29030037030020024198016a200441e0006a41186a290300370300200241a0016a20044180016a290300370300200241a8016a20044188016a290300370300200241b0016a20044190016a2903003703002003200328023c41016a36023c410421020c0b0b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b1033000b1035000b41052102200e450d002005102c0b2000200236020020044180026a24000b16002000410036020020002001410c6a2802003602040bb20202057f027e230041106b220424000240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d024105210302402001410c6a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128021029035042002005ad420010e00520012802182202420020022903082209427f200429030020042903084200521b7d220a200a20095622021b37030820020d000240024020012802142802082007200820066a2005101f41026a220241024b0d0020020e03020001020b41ac91c600412841a892c6001036000b410421030b20002003360200200441106a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000bfc0303027f027e067f230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802102903484200200241146a2802002203ad420010e00520012802182202420020022903082206427f200429030020042903084200521b7d2207200720065622021b37030841052108024020020d000240024020032001410c6a2209280200220a4b0d00200321020c010b02400240200141086a2802002202200a6b2003200a6b220b490d002001280204210c200a21020c010b200a200b6a220c200a490d062002410174220d200c200d200c4b1b220d4100480d060240024020020d00200d102a210c0c010b20012802042002200d102e210c0b200c450d052001200c360204200141086a200d3602002001410c6a28020021020b200c20026a210d02400240200b4102490d00200d41002003200a417f73220a6a220b10da051a200c200320026a200a6a6a210d200b20026a21020c010b200b450d010b200d41003a0000200241016a21020b20092002360200024002402001280214280208200520012802042002101e41026a220141024b0d0020010e03020001020b41ac91c600412841d491c6001036000b410421080b20002008360200200441106a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b1033000b1035000bc60b05047f027e037f027e027f230041f0016b220424000240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a280200210602400240024002400240200241146a2802002203450d0020022802042107200441386a200128021029034842002003ad420010e00520012802182202420020022903082208427f200429033820042903404200521b7d22092009200856220a1b37030841052102200a0d0d2003417f4c0d0920031030220a450d0a024020012802142802082007200a2003101e41026a220741024b0d0020070e03040002040b41ac91c600412841d491c6001036000b4101210b410021074100210c0c010b2004200336029c012004200a36029801200441c8006a20044198016a108201200441d0006a2802002107200429024c2108200428024c210c2004280248210b200a102c200b450d0b200128021028025c2008422088a7490d0a0b200b2007410041202007676b108903024020074102490d00200b21022007210303402002200241206a220a412010dd05450d0b200a21022003417f6a220341024f0d000b0b200441286a200128021029034842002006ad220d420010e00520012802182202420020022903082208427f200429032820042903304200521b7d2209200920085622021b37030820020d092006417f4c0d060240024020060d004101210a02402001280214280208200541014100101e41026a220241024b0d0020020e030c00020c0b41ac91c600412841d491c6001036000b20061030220a450d080240024020012802142802082005200a2006101e41026a220241024b0d0020020e03010002010b41ac91c600412841d491c6001036000b200a102c0c0a0b200441086a2001280210220329032842002007ad420010e005200441186a20032903204200200d420010e00520012802182102427f2109024020042903204200520d0020042903104200520d002004290318220820042903087c220e2008540d00427f200e20032903307c22082008200e541b21090b200242002002290308220820097d220920092008561b37030820092008580d012006450d09200a102c0c090b200a102c0c090b200441c8016a41086a22062001280200280218220341d8006a290000370300200441c8016a41106a2201200341e0006a290000370300200441c8016a41186a2205200341e8006a290000370300200420032900503703c80102402003413c6a2802002202200341386a280200470d00200241016a220f2002490d0720024101742210200f2010200f4b1b220fad42b8017e2208422088a70d072008a722104100480d070240024020020d002010102a21020c010b2003280234200241b8016c2010102e21020b2002450d0620032002360234200341386a200f360200200328023c21020b2003280234200241b8016c6a220241003a0000200220042f00ed013b0001200241053a00102002200736000c2002200c3600082002200b360004200220042903c801370011200241036a200441ed016a41026a2d00003a0000200241196a2006290300370000200241216a2001290300370000200241296a20052903003700002002200a3600342002200d422086200d84370038200220042f00c5013b0031200241336a200441c5016a41026a2d00003a00002002200429039801370340200241c8006a20044198016a41086a290300370300200241d0006a20044198016a41106a290300370300200241d8006a20044198016a41186a290300370300200241e0006a200441b8016a290300370300200241e8006a200441c8006a41d00010db051a2003200328023c41016a36023c410421020c080b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b41b5abc50041f4031054000b103a000b1033000b1035000b41052102200c450d00200b102c0b20002002360200200441f0016a24000bbe0803027f027e057f230041f00b6b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d01200441086a20012002280204200241146a28020010ee044105210202402004290308a70d00200128020028021822052802180d03200441186a2903002106200429031021072005417f360218200441d8006a200541e8006a290000370300200441d0006a200541e0006a290000370300200441c8006a200541d8006a29000037030020042005290050370340024002402005411c6a2208280200220941d0e1c100460d00200541206a280200210a0c010b4100210a20044190096a410041e00210da051a200441f0006a410041a00810da051a41880b102a2209450d05200941003b010620094100360200200941086a20044190096a41e00210db051a200941e8026a200441f0006a41a00810db051a200541206a41003602002005200936021c0b02400240034020092f0106220b410574210c4100210241002103024002400340200c2002460d01200441c0006a200920026a41086a412010dd052201450d02200241206a2102200341016a21032001417f4a0d000b2003417f6a210b0b200a450d02200a417f6a210a2009200b4102746a41880b6a28020021090c010b0b200541246a2101410121020c010b200441206a41186a200441c0006a41186a290300370300200441206a41106a200441c0006a41106a290300370300200441206a41086a200441c0006a41086a29030037030020042004290340370320200541246a21014100210a200b2103410021020b0240024020020d00200441ac096a200441206a41086a290300370200200441b4096a200441206a41106a290300370200200441bc096a200441206a41186a290300370200200420013602a0092004200336029c09200420083602980920042009360294092004200a36029009200420042903203702a40920044190016a200429036037030020044198016a200441e0006a41086a290300370300200441a4016a4200370200200442003703880120044200370370200441d0e1c1003602a001200441003a00ac01200441ad016a2004290040370000200441b5016a200441c0006a41086a290000370000200441bd016a200441c0006a41106a290000370000200441c5016a200441c0006a41186a290000370000200441003a00cd0120044190096a200441f0006a10800221020c010b20044188016a420037030020044184016a41d0e1c1003602002004410036029001200441003602800120044200370378200441d0e1c100360274200441003602702009200341e0006c6a41e8026a2102200441f0006a10f4010b200241286a2006370300200241206a2007370300200242013703182005200528021841016a360218410421020b20002002360200200441f00b6a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b41f089c6004110200441f0006a41f882c100103b000b1033000b9f0203037f027e027f230041206b220424002001410c6a22054100360200200441086a2001280200280218220641186a200641d0006a10fe01200441086a41106a290300210720042802082106200429031021080240024002400240200141086a2802002209200528020022056b4110490d00200128020421090c010b200541106a220a2005490d0220094101742205200a2005200a4b1b22054100480d020240024020090d002005102a21090c010b200128020420092005102e21090b2009450d0120012009360204200141086a20053602002001410c6a28020021050b2001410c6a200541106a360200200920056a22012007427f20061b37000820012008427f20061b37000020004104360200200441206a24000f0b1033000b1035000bf00203027f027e017f230041206b220424000240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802102903484200200241146a2802002202ad420010e00520012802182203420020032903082206427f200429030020042903084200521b7d2207200720065622081b37030841052103024020080d002002417f4c0d0302400240024020020d004101210802402001280214280208200541014100101e41026a220141024b0d0020010e03040002040b41ac91c600412841d491c6001036000b0240200210302208450d0002402001280214280208200520082002101e41026a220141024b0d0020010e03030002030b41ac91c600412841d491c6001036000b1033000b200441106a200820021058024020042802100d00200429021410040b410421032002450d010b2008102c0b20002003360200200441206a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b103a000bba0101037f410021042001410c6a4100360200200128020028021c21050240024002400240200141086a28020022064104490d00200128020421060c010b200641017422044104200441044b1b22044100480d020240024020060d002004102a21060c010b200128020420062004102e21060b2006450d0120012006360204200141086a20043602002001410c6a28020021040b2001410c6a200441046a360200200620046a2005360000200041043602000f0b1033000b1035000bea0503027f027e067f230041306b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802102903484200200241146a2802002203ad420010e00520012802182202420020022903082206427f200429030020042903084200521b7d2207200720065622021b3703080240024020020d00200141046a21080240024020032001410c6a2209280200220a4b0d00200321020c010b02400240200141086a2802002202200a6b2003200a6b220b490d002008280200210c200a21020c010b200a200b6a220c200a490d072002410174220d200c200d200c4b1b220d4100480d070240024020020d00200d102a210c0c010b20082802002002200d102e210c0b200c450d062001200c360204200141086a200d3602002001410c6a28020021020b200c20026a210d02400240200b4102490d00200d41002003200a417f73220a6a220b10da051a200c200320026a200a6a6a210d200b20026a21020c010b200b450d010b200d41003a0000200241016a21020b20092002360200024002402001280214280208200520012802042002101e41026a220241024b0d0020020e03020001020b41ac91c600412841d491c6001036000b2001410c6a2202350200210620024100360200200141086a220328020021052001280204210220014201370204200441106a20064220862002ad841003108d010240024020042802100d0002402003280200450d002008280200102c0b200120023602042001410c6a4100360200200141086a2005360200410121010c010b200441206a41086a200441106a41086a2802003602002004200429031037032002402003280200450d002008280200102c0b20082004290320370200200841086a200441206a41086a280200360200410021012005450d002002102c0b20004100360200200020013602040c010b200041053602000b200441306a24000f0b41b5abc50041f4031054000b41b5abc50041f4031054000b1033000b1035000b9605020a7f017e230041c0006b220424002004200136020c20042000410120011b3602082004200441086a1075024020042802000d00024002400240200428020c22014170712200417f4c0d002004280204210502400240200141047622060d00410821070c010b2000102a2207450d020b02402005450d00200441206a4104722108410021094100210a410021000340200441206a200441086a10ae03200441306a41086a220b200841086a2802003602002004200829020037033002402004280220220c4104470d002006450d062007102c0c060b200041016a2101200441106a41086a220d200b28020036020020042004290330370310024020002006470d0020092001200920014b1b220641ffffffff00712006470d052006410474220b4100480d050240024020000d00200b102a21070c010b2007200a200b102e21070b2007450d040b2007200a6a2200200c360200200041046a20042903103702002000410c6a200d280200360200200941026a2109200a41106a210a2001210020052001470d000b0b2007450d03200441206a2002200720052003110600200428022021004101102a2201450d012004428180808010370234200420013602300240024020004105460d00200141003a0000200141014102102e2101024020004104470d002001450d04200141003a00012004428280808020370234200420013602304202210e0c020b2001450d03200141013a0001200442828080802037023420042001360230200441206a200441306a10ac042004350238210e200428023021010c010b200141013a00004201210e0b2001ad422086200e84210e02402006450d002007102c0b200441c0006a2400200e0f0b103a000b1033000b1035000b41c8ebc30041f000200441206a4194ebc300103b000bde0202047f017e02400240024002400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a3602002004417f6a220441034b0d0520040e0401020304010b200041043602000f0b0240200541034b0d00200041043602000f0b200041003602002003280001210420012002417b6a3602042001200341056a360200200020043602040f0b024020054108490d0020004101360200200329000121062001200241776a3602042001200341096a360200200041086a20063703000f0b200041043602000f0b0240200541034b0d00200041043602000f0b200041023602002003280001210420012002417b6a3602042001200341056a360200200020043602040f0b024020054108490d0020004103360200200329000121062001200241776a3602042001200341096a360200200041086a20063703000f0b200041043602000f0b200041043602000bca1002077f027e230041106b220224002002410036020820024201370300410420021067024002400240024020022802042203200228020822046b4104490d00200441046a2105200228020021030c010b200441046a22052004490d02200341017422062005200620054b1b22064100480d020240024020030d002006102a21030c010b200228020020032006102e21030b2003450d0120022006360204200220033602000b20022005360208200320046a41eede91ab06360000410e200210670240024020022802042205200228020822066b410e490d002006410e6a2104200228020021030c010b2006410e6a22042006490d02200541017422032004200320044b1b22074100480d020240024020050d002007102a21030c010b200228020020052007102e21030b2003450d012002200736020420022003360200200721050b20022004360208200320066a220641002900f3ec41370000200641066a41002900f9ec413700000240200520046b41034b0d00200441046a22062004490d02200541017422072006200720064b1b22064100480d020240024020050d002006102a21030c010b200320052006102e21030b2003450d0120022006360204200220033602000b2002200441046a360208200320046a410a3600000240024020022802042203200228020822046b4104490d00200228020021030c010b200441046a22052004490d02200341017422062005200620054b1b22054100480d020240024020030d002005102a21030c010b200228020020032005102e21030b2003450d0120022005360204200220033602000b2002200441046a360208200320046a41c6013600000240024020022802042203200228020822046b4104490d00200228020021030c010b200441046a22052004490d02200341017422062005200620054b1b22054100480d020240024020030d002005102a21030c010b200228020020032005102e21030b2003450d0120022005360204200220033602000b2002200441046a360208200320046a41c601360000410c200210674184edc1002104034020042d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441016a2d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441026a2d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441036a2d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441046a2d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441056a2d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441066a2d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441076a2d0000210602400240200228020420022802082203460d00200228020021050c010b200341016a22052003490d03200341017422072005200720054b1b22074100480d030240024020030d002007102a21050c010b200228020020032007102e21050b2005450d0220022007360204200220053602000b2002200341016a360208200520036a20063a0000200441086a28020021060240024020022802042205200228020822036b4104490d00200228020021050c010b200341046a22072003490d03200541017422082007200820074b1b22074100480d030240024020050d002007102a21050c010b200228020020052007102e21050b2005450d0220022007360204200220053602000b2002200341046a360208200520036a20063600002004410c6a22044194eec100470d000b200235020821092002350200210a200241106a2400200a2009422086840f0b1033000b1035000b9a1c05037f017e047f037e037f230041a00a6b22022400024002402001450d00200220003602100c010b200241013602100b20022001360214200241f8076a200241106a10b1030240024020022802fc07450d00200241186a200241f8076a41fc0010db051a20024198016a200241186a41fc0010db051a20024198016a10b20302402002280298012201450d00200241f8076a2001417f6a109302200241f8076a200241a8016a412010dd050d000240024020024190026a28020022030d004100210341042104410021010c010b024002402003ad420c7e2205422088a70d002005a722014100480d0020022802880221002001102a22040d011033000b1035000b200341a8026c210620034103742107200421010340200220003602c004200241f8076a200241c0046a108701200141086a200241f8076a41086a280200360200200120022903f8073702002001410c6a2101200041a8026a2100200641d87d6a22060d000b200741786a41037641016a21010b200220013602c804200220033602c404200220043602c004200241f8076a200241c0046a10b3030240200241e8016a2201200241f8076a412010dd05450d0041c18cc600ad4280808080e0018410042001ad42808080808004841015200241f8076aad428080808080048410150b02402001200241f8076a412010dd050d002002418c026a28020021082002280288022107200228029002210620024198026a20024198016a41f00010db051a2007200641a8026c6a2100200228029802210920072101024002402006450d00200241c0046a41f0006a210441eb8cc600ad4280808080d00184210a200721010240034020024190076a200141e80010db051a200141e8006a290300210520024188036a200141f0006a41b80110db051a20054203510d01200241c0046a20024190076a41e80010db051a200220053703a805200420024188036a41b80110db051a2002200241c0046a3602e806200241f8076a200241e8066a1087012002280280082106024020022802fc07450d0020022802f807102c0b200241f8076a200241c0046a41a80210db051a200241003602f806200241e8066a200241f8076a2006200241f8066a10b40320022d00e8064101460d03024020022d00f40622064102460d0020023100f606210520023100f506210b20023502f006210c20022802ec062103200a100402402006450d00200b100e0b2005100e2003450d00200c4220862003ad8410040b200141a8026a22012000470d000b200021010c010b200141a8026a21010b20012000460d0420024190096a2106200241f8076a41f0006a2103034020024188036a200141e80010db051a200141e8006a2903002105200241f8076a200141f0006a41b80110db051a20054203510d0520024190076a20024188036a41e80010db051a200241c0046a200241f8076a41b80110db051a200241f8076a20024190076a41e80010db051a200220053703e0082003200241c0046a41b80110db051a20061073200141a8026a22012000470d000c050b0b200241086a20022f00e90620022d00eb064110747210b5032002280208200228020c41acfec5001036000b41929ec500412441acfec5001036000b41f69dc500411c41acfec5001036000b20024194036a4104360200200241d4046a4102360200200242023702c40420024184adc2003602c0042002410436028c03200241fcacc200360288032002410036029c01200241dc9ec60036029801200220024188036a3602d004200220024198016a36029003200241c0046a4194adc2001041000b02402008450d002007102c0b20024181b0c2004110109401200228020421040240200228020022074101470d004181b0c200ad428080808080028410050b200241f8076a41186a22084200370300200241f8076a41106a22004200370300200241f8076a41086a22014200370300200242003703f807200241c0046a41086a22064191b0c200ad4280808080e000841002220341086a290000370300200220032900003703c0042003102c20012006290300370300200220022903c0043703f80720024188036a41086a220d41c8c2c200ad4280808080e001841002220341086a29000037030020022003290000370388032003102c2000200229038803220537030020062001290300370300200241c0046a41106a220e2005370300200241c0046a41186a220f200d2903003703002002200537039007200220022903f8073703c00420022004410020071b3602f807200241c0046aad4280808080800484220b200241f8076aad4280808080c000841001200842003703002000420037030020014200370300200242003703f80720024190076a41086a220341e4d2c500ad42808080808001841002220441086a29000037030020022004290000370390072004102c2001200329030037030020022002290390073703f807200341ecd2c500ad42808080808001841002220441086a29000037030020022004290000370390072004102c2000200229039007220537030020062001290300370300200e2005370300200f20032903003703002002200537038803200220022903f8073703c004200b1005200910ad02200241f8076a10b603200220024198026a410c6a280200220336028807200228029c0221072002200241f8076a410c6a280200220136028c07024020032001470d0002402003450d0020022802fc0721084100210641eadbc200ad4280808080c002842105034002400240024002400240024002400240200720066a22012d00002204200820066a22002d0000470d000240024002400240024020040e050001020304000b20012000460d09200141016a200041016a412010dd050d040c090b024020012000460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002209200041086a280200220d460d072009200d200410dd050d030c070b024020012000460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002209200041086a280200220d460d052009200d200410dd050d020c050b024020012000460d00200141016a280000200041016a280000470d020b200141106a2802002204200041106a280200470d01200141086a2802002209200041086a280200220d460d032009200d200410dd050d010c030b2001410c6a28020022042000410c6a280200470d00200141046a2802002209200041046a280200220d460d012009200d200410dd05450d010b20051004200241c0046a200110e70220023502c80442208620022802c0042204ad841015024020022802c404450d002004102c0b200241c0046a200010e70220023502c80442208620022802c0042204ad841015024020022802c404450d002004102c0b20012d000020002d00002204470d0520040e050403020100040b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d0520012000200410dd050d040c050b024020012000460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002201200041086a2802002200460d0420012000200410dd05450d040c030b024020012000460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002201200041086a2802002200460d0320012000200410dd050d020c030b024020012000460d00200141016a280000200041016a280000470d020b200141106a2802002204200041106a280200470d01200141086a2802002201200041086a2802002200460d0220012000200410dd050d010c020b20012000460d01200141016a200041016a412010dd05450d010b41c09ec500412741acfec5001036000b200641246a21062003417f6a22030d000b0b024020024198026a41306a2201200241f8076a41306a2200412010dd05450d0041c18cc600ad4280808080e0018410042001ad428080808080048410152000ad428080808080048410150b024020012000412010dd05450d0041e79ec500412841acfec5001036000b02402002280284082200450d0020022802fc072101200041246c210003400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012000415c6a22000d000b0b024020024180086a280200450d0020022802fc07102c0b024020022802a4022200450d00200228029c022101200041246c210003400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012000415c6a22000d000b0b0240200241a0026a280200450d00200228029c02102c0b200241a00a6a240042010f0b20024188036a41146a410936020020024188036a410c6a410c36020020024190076a41146a41033602002002420337029407200241ec9fc600360290072002410c36028c03200220024188076a3602f80620022002418c076a3602e806200242043703d004200242013702c404200241b89ec5003602c004200220024188036a3602a0072002200241c0046a360298032002200241e8066a360290032002200241f8066a3602880320024190076a4184c5c5001041000bdd05030c7f017e017f230041c0056b2202240020024198036a200110810102400240200228029c0322030d00200041003602040c010b200241a4036a280200210420022802a00321052002280298032106200241106a200241a8036a41e00010db051a200241086a20011075024020022802080d00024002400240200128020441a8026e220741a8026c2208417f4c0d00200228020c21090240024020080d004108210a0c010b2008102a220a450d020b024002402009450d004100210b410021084100210c034020024198036a2001108c022002290380044203510d02200c41016a210d200241f0006a20024198036a41a80210db051a0240200c2007470d00200b200d200b200d4b1b2207ad42a8027e220e422088a70d06200ea7220f4100480d0602400240200c0d00200f102a210a0c010b200a2008200f102e210a0b200a450d050b200a20086a200241f0006a41a80210db051a200b41026a210b200841a8026a2108200d210c2009200d470d000b0b200a450d0420024198036a200241106a41e00010db051a2000410c6a2004360200200020053602082000200336020420002006360200200041106a20024198036a41e00010db051a200041f8006a2009360200200041f4006a2007360200200041f0006a200a3602000c050b0240200c450d00200a4198016a210d0340200d1073200d41a8026a210d200841d87d6a22080d000b0b2007450d03200a102c0c030b103a000b1033000b1035000b2000410036020402402004450d00200441246c210d2003210803400240024020082d0000220c41034b0d00024002400240200c0e0404000102040b2008410c6a280200450d03200841086a280200102c0c030b2008410c6a280200450d02200841086a280200102c0c020b2008410c6a280200450d01200841086a280200102c0c010b200841086a280200450d00200841046a280200102c0b200841246a2108200d415c6a220d0d000b0b2005450d002003102c0b200241c0056a24000b9a740a0e7f027e017f037e1c7f017e027f0a7e017f027e230041d0066b2201240002400240024002400240024002402000410c6a28020041246c22020d004104210341002104410021050c010b200028020421064104210341002104410021050340024020062d00004101470d00200641106a2802002207417f4c0d03200641086a2802002108200641016a28000021090240024020070d004101210a4100210b0c010b2007210b2007102a220a450d060b200a2008200710db05210a20014180066a41026a220c200141d8056a41026a2d00003a0000200141b0046a41086a220d200141a8066a41086a290200370300200120012f00d8053b018006200120012902a8063703b004024020042005470d00200441016a22082004490d082004410174220e2008200e20084b1b2205ad42247e220f422088a70d08200fa722084100480d080240024020040d002008102a21030c010b2003200441246c2008102e21030b2003450d060b2003200441246c6a220841013a000020082009360001200820073600102008200b36000c2008200a360008200820012f0180063b0005200841076a200c2d00003a0000200820012903b0043702142008411c6a200d290300370200200441016a21040b200641246a21062002415c6a22020d000b0b200141003602b0044181b0c200ad4280808080800284200141b0046aad4280808080c0008422101001200141d8036a41186a22074200370300200141d8036a41106a22114200370300200141d8036a41086a22084200370300200142003703d803200141b0046a41086a22064191b0c200ad4280808080e00084220f1002220241086a290000370300200120022900003703b0042002102c20082006290300370300200120012903b00422123703f803200120123703d803200641acb0c200ad4280808080e000841002220241086a290000370300200120022900003703b0042002102c201120012903b0042212370300200141b8036a41086a22092008290300370300200141b8036a41106a220a2012370300200141b8036a41186a220b20062903003703002001201237038804200120012903d8033703b80320012000280200220d3602b004200141b8036aad4280808080800484221220101001200742003703002011420037030020084200370300200142003703d8032006200f1002220241086a290000370300200120022900003703b0042002102c20082006290300370300200120012903b00422133703f803200120133703d803200641cab0c200ad4280808080e000841002220241086a290000370300200120022900003703b0042002102c20072006290300221337030020092008290300370300200a20012903b0042214370300200b20133703002001201437038804200120012903d8033703b803200141203602b4042001200141b8036a3602b00420032004200141b0046a10da03200742003703002011420037030020084200370300200142003703d8032006200f1002220241086a290000370300200120022900003703b0042002102c20082006290300370300200120012903b00422133703f803200120133703d803200641b2b0c200ad4280808080a001841002220241086a290000370300200120022900003703b0042002102c20072006290300221337030020092008290300370300200a20012903b0042214370300200b20133703002001201437038804200120012903d8033703b803200141203602b4042001200141b8036a3602b004200041106a2215200141b0046a10be032006200f1002220241086a290000370300200120022900003703b0042002102c200141f8036a41086a22162006290300370300200120012903b0043703f803200641a3b0c200ad42808080809001841002220241086a290000370300200120022900003703b0042002102c20014188046a41086a220c2006290300370300200120012903b004370388042001200d417f6a3602b00420014180066a41186a220d20101006220241186a29000037030020014180066a41106a220e200241106a29000037030020014180066a41086a2217200241086a29000037030020012002290000370380062002102c2007200d2903003703002011200e2903003703002008201729030037030020012001290380063703d80341c000102a2202450d02200220012903f8033700002002200129038804370010200220012903d803370020200241086a2016290300370000200241186a200c290300370000200241286a2008290300370000200241306a2011290300370000200241386a2007290300370000200120023602b004200141c0003602b4042015200141b0046a10be032002102c200742003703002011420037030020084200370300200142003703d8032006200f1002220241086a290000370300200120022900003703b0042002102c20082006290300370300200120012903b00422103703f803200120103703d803200641bcb0c200ad4280808080e001841002220241086a290000370300200120022900003703b0042002102c200c20062903002210370300200120012903b00422133703880420112013370000201141086a2202201037000020092008290300370300200a2011290300370300200b2007290300370300200120012903d8033703b803200141203602b4042001200141b8036a3602b004200041d0006a200141b0046a10be03200742003703002011420037030020084200370300200142003703d8032006200f1002221541086a290000370300200120152900003703b0042015102c20082006290300370300200120012903b00422103703f803200120103703d803200641fdb1c200ad4280808080e000841002221541086a290000370300200120152900003703b0042015102c200c20062903002210370300200120012903b004221337038804201120133700002002201037000020092008290300370300200a2011290300370300200b2007290300370300200120012903d8033703b80320121005200742003703002011420037030020084200370300200142003703d8032006200f1002221541086a290000370300200120152900003703b0042015102c20082006290300370300200120012903b00422103703f803200120103703d803200641e4c4c200ad4280808080a001841002221541086a290000370300200120152900003703b0042015102c200c20062903002210370300200120012903b004221337038804201120133700002002201037000020092008290300370300200a2011290300370300200b2007290300370300200120012903d8033703b803201210052006200f1002220241086a290000370300200120022900003703b0042002102c20162006290300370300200120012903b0043703f80320064183b2c200ad4280808080b001841002220241086a290000370300200120022900003703b0042002102c200c2006290300370300200120012903b00437038804200d42011006220641186a290000370300200e200641106a2900003703002017200641086a29000037030020012006290000370380062006102c2007200d2903003703002011200e2903003703002008201729030037030020012001290380063703d80341c000102a2206450d02200620012903f8033700002006200129038804370010200620012903d803370020200641086a200141f8036a41086a290300370000200641186a20014188046a41086a290300370000200641286a200141d8036a41086a290300370000200641306a200141d8036a41106a290300370000200641386a200141d8036a41186a2903003700002006ad4280808080800884100d2006102c20002802002118200141a8066a41186a22094200370300200141a8066a41106a22064200370300200141a8066a41086a22084200370300200142003703a80620014198046a41086a22074191b0c200ad4280808080e000841002220241086a29000037030020012002290000370398042002102c2008200729030037030020012001290398043703a806200741b2b0c200ad4280808080a001841002220241086a29000037030020012002290000370398042002102c2006200129039804220f37030020014180066a41086a200829030037030020014180066a41106a200f37030020014180066a41186a20072903003703002001200f3703b004200120012903a80637038006200141b0046a20014180066a412010d30120012d00b00421072009200141c9046a2900003703002006200141c1046a2900003703002008200141b9046a290000370300200120012900b1043703a8060240024020074101460d00200141d8056a41186a4200370300200141d8056a41106a4200370300200141d8056a41086a4200370300200142003703d8050c010b200141d8056a41186a2009290300370300200141d8056a41106a2006290300370300200141d8056a41086a2008290300370300200120012903a8063703d8050b200141a8066a41186a22094200370300200141a8066a41106a220a4200370300200141a8066a41086a22024200370300200142003703a80620014198046a41086a220841c586c200ad42808080808003841002220741086a29000037030020012007290000370398042007102c2002200829030037030020012001290398043703a80620084193c6c100ad4280808080e001841002220741086a29000037030020012007290000370398042007102c200141b0046a41086a2008290300220f370300200120012903980422103703b00420062010370000200641086a200f37000020014180066a41086a200229030037030020014180066a41106a200a29030037030020014180066a41186a2009290300370300200120012903a80637038006200141b0056a20014180066a412010d0010240024002400240024020012802b00522070d002009200141d8056a41186a290300370300200a200141d8056a41106a2903003703002002200141d8056a41086a290300370300200120012903d8053703a8064101210741002102200141a8066a2106410021090c010b20012902b405220fa7210a0240200f422088a7220841d100490d00200141b0046a41186a2202200141d8056a41186a290300370300200141b0046a41106a2209200141d8056a41106a290300370300200141b0046a41086a220b200141d8056a41086a290300370300200120012903d8053703b0042018417f6a41d10070220620084f0d04200720064105746a220620012903b004370000200641186a2002290300370000200641106a2009290300370000200641086a200b290300370000200a21020c030b200141b0056a41086a280200210920012802b4052102200141a8066a41186a200141d8056a41186a290300370300200141a8066a41106a200141d8056a41106a290300370300200141a8066a41086a200141d8056a41086a290300370300200120012903d8053703a80602402008200a460d00200141a8066a2106200a2102200821090c020b200141a8066a210620022008470d010b200241016a22082002490d072002410174220a2008200a20084b1b220841ffffff3f712008470d072008410574220a4100480d070240024020020d00200a102a21070c010b20072002410574200a102e21070b2007450d05200821020b200720094105746a22082006290000370000200841186a200641186a290000370000200841106a200641106a290000370000200841086a200641086a290000370000200941016a21080b200141b0046a41186a4200370300200141b0046a41106a220b4200370300200141b0046a41086a22094200370300200142003703b00420014198046a41086a220641c586c200ad42808080808003841002220a41086a2900003703002001200a29000037039804200a102c2009200629030037030020012001290398043703b00420064193c6c100ad4280808080e001841002220a41086a2900003703002001200a29000037039804200a102c200b200129039804220f370300200141a8066a41086a2009290300370300200141a8066a41106a200f370300200141a8066a41186a20062903003703002001200f37038006200120012903b0043703a8060240024020070d00200141a8066aad428080808080048410050c010b200141003602b804200142013703b0042008200141b0046a106702402008450d00200841057421082007210603402001200141b0046a36028006200620014180066a109402200641206a2106200841606a22080d000b0b20012802b4042106200141a8066aad428080808080048420013502b80442208620012802b0042208ad84100102402006450d002008102c0b2002450d002007102c0b024020184180a70c700d0010cf010b02400240201841809c3170450d0020014180066a211920014188046a211a200141f8036a211b200141b0046a211c0c010b200141b0046a41186a4200370300200141b0046a41106a22024200370300200141b0046a41086a22084200370300200142003703b00420014198046a41086a220641bad6c500ad42808080809001841002220741086a29000037030020012007290000370398042007102c200820062903003703002001200129039804220f3703f8032001200f3703b004200641d0d6c500ad4280808080d002841002220741086a29000037030020012007290000370398042007102c2002200129039804220f37030020014180066a41086a200829030037030020014180066a41106a200f37030020014180066a41186a20062903003703002001200f37038804200120012903b004370380060240024020014180066a109501220641ff01714102460d0020014180066aad4280808080800484100520064101710d010b200141b0046a211c200141f8036a211b20014188046a211a20014180066a2119201810c904450d01201810cb041a0c010b200141b0046a211c200141f8036a211b20014188046a211a20014180066a2119201810cb04450d00201810c9041a0b200141b0046a41186a220c4200370300200141b0046a41106a221d4200370300200141b0046a41086a220a4200370300200142003703b00420014198046a41086a220641bad6c500ad4280808080900184220f1002220841086a29000037030020012008290000370398042008102c200141f8036a41086a2207200629030037030020012001290398043703f803201c41086a2202201b41086a2209290000370000201c201b290000370000200641c3d6c500ad4280808080d001841002220841086a29000037030020012008290000370398042008102c20014188046a41086a220b2006290300370300200120012903980437038804201d201a290000221037030020014180066a41086a2216200a29030037030020014180066a41106a2215201037030020014180066a41186a221e201a41086a220d290000370300200120012903b00437038006200141b0036a2019412010940120012802b403210e20012802b0032100200c4200370300201d4200370300200a4200370300200142003703b0042006200f1002220841086a29000037030020012008290000370398042008102c2007200629030037030020012001290398043703f80320022009290000370000201c201b290000370000200641abd6c500ad4280808080f001841002220841086a29000037030020012008290000370398042008102c200b2006290300370300200120012903980437038804200c200d290000220f3703002016200a2903003703002015201a290000370300201e200f370300200120012903b00437038006200141a8036a201941201094014100211f02400240200e410020001b220620012802ac03410020012802a8031b22074f0d00200141b0046a4104722108200141d9046a210b0340200141b0046a200610d704024020012d00d80422094103460d00200141a8066a41086a200841086a290200220f370300200141a8066a41106a200841106a2902002210370300200141a8066a41186a200841186a2902002212370300200141a8066a41206a200841206a2802002202360200200141b8036a41026a220d200b41026a2d00003a00002001200829020022133703a8062001200b2f00003b01b80320012802b004210e200a200f370300201d2010370300200c2012370300200141b0046a41206a22002002360200200120133703b004200141d8036a41026a2217200d2d00003a0000200120012f01b8033b01d803410321020240200e2018470d0020014180066a41206a2000280200360200201e200c2903003703002015201d2903003703002016200a29030037030020014198046a41026a20172d00003a0000200120012903b00437038006200120012f01d8033b01980420062120200921020b20024103470d030b2007200641016a2206470d000b0b41042121410021080c030b200141d8056a41206a20014180066a41206a2802002208360200200141d8056a41186a20014180066a41186a290300220f370300200141d8056a41106a20014180066a41106a2903002210370300200141d8056a41086a20014180066a41086a290300221237030020014188046a41026a220920014198046a41026a2d00003a0000200141b0056a41086a220a2012370300200141b0056a41106a220b2010370300200141b0056a41186a220c200f370300200141b0056a41206a220d20083602002001200129038006220f3703d805200120012f0198043b0188042001200f3703b005200141f8036a41026a220e20092d00003a0000200120012f0188043b01f8034130102a2221450d03410121082021201836020420212020360200202120012903b005370208202120023a002c202120012f01f8033b002d202141106a200a290300370200202141186a200b290300370200202141206a200c290300370200202141286a200d2802003602002021412f6a200e2d00003a00004101211f200641016a220620074f0d02200141b0046a4104722108200141d9046a210a02400340200141b0046a200610d704024020012d00d80422094103460d00200141a8066a41086a200841086a290200220f370300200141a8066a41106a200841106a2902002210370300200141a8066a41186a200841186a2902002212370300200141a8066a41206a200841206a2802002202360200200141b8036a41026a220b200a41026a2d00003a00002001200829020022133703a8062001200a2f00003b01b80320012802b004210c200141b0046a41086a220d200f370300200141b0046a41106a220e2010370300200141b0046a41186a22002012370300200141b0046a41206a22172002360200200120133703b004200141d8036a41026a2216200b2d00003a0000200120012f01b8033b01d803410321020240200c2018470d0020014180066a41206a201728020036020020014180066a41186a200029030037030020014180066a41106a200e29030037030020014180066a41086a200d29030037030020014198046a41026a20162d00003a0000200120012903b00437038006200120012f01d8033b01980420062115200921020b20024103470d020b2007200641016a2206470d000b410121084101211f0c030b200141d8056a41206a222220014180066a41206a22202802002208360200200141d8056a41186a222320014180066a41186a2224290300220f370300200141d8056a41106a222520014180066a41106a22262903002210370300200141d8056a41086a222720014180066a41086a2228290300221237030020014188046a41026a222920014198046a41026a222a2d00003a0000200141b0056a41086a222b2012370300200141b0056a41106a222c2010370300200141b0056a41186a222d200f370300200141b0056a41206a222e20083602002001200129038006220f3703d805200120012f0198043b0188042001200f3703b005200141f8036a41026a222f20292d00003a0000200120012f0188043b01f803200641016a2106200141b0046a4104722109200141d9046a210b410121084101211f0340200141b0046a41086a220e202b290300370300200141b0046a41106a2200202c290300370300200141b0046a41186a2217202d290300370300200141b0046a41206a2216202e280200360200200141a8066a41026a220c202f2d00003a0000200120012903b0053703b004200120012f01f8033b01a8060240201f2008470d00200841016a220a2008490d072008410174220d200a200d200a4b1b221fad42307e220f422088a70d07200fa7220a4100480d070240024020080d00200a102a21210c010b2021200841306c200a102e21210b2021450d050b2021200841306c6a220a2018360204200a20153602002016280200210d2017290300210f20002903002110200e290300211220012903b0042113200a412c6a20023a0000200a41086a2013370200200a41106a2012370200200a41186a2010370200200a41206a200f370200200a41286a200d360200200a412d6a20012f01a8063b0000200a412f6a200c2d00003a0000200841016a2108200620074f0d0302400340200141b0046a200610d704024020012d00d804220a4103460d00200141a8066a41086a200941086a290200220f370300200141a8066a41106a200941106a2902002210370300200141a8066a41186a200941186a2902002212370300200141a8066a41206a200941206a2802002202360200200141b8036a41026a220c200b41026a2d00003a00002001200929020022133703a8062001200b2f00003b01b80320012802b004210d200e200f370300200020103703002017201237030020162002360200200120133703b004200141d8036a41026a221e200c2d00003a0000200120012f01b8033b01d803410321020240200d2018470d002020201628020036020020242017290300370300202620002903003703002028200e290300370300202a201e2d00003a0000200120012903b00437038006200120012f01d8033b01980420062115200a21020b20024103470d020b2007200641016a2206470d000c050b0b20222020280200220a36020020232024290300220f3703002025202629030022103703002027202829030022123703002029202a2d00003a0000202b2012370300202c2010370300202d200f370300202e200a3602002001200129038006220f3703d805200120012f0198043b0188042001200f3703b005202f20292d00003a0000200120012f0188043b01f803200641016a21060c000b0b41a888c600200620081038000b103a000b2021200841306c6a21300240024020080d002021212e0c010b2019ad42808080808004842131200141b0046a4104722106200141b0046a41186a2117200141b0046a41106a21162021212e0340202e220841086a2802002125200828020021022017200841246a29020037030020162008411c6a290200370300200141b0046a41086a220e200841146a29020037030020012008410c6a2902003703b004200841306a212e2008412c6a2d000022244103460d01200141b0056a41186a2017290300220f370300200141b0056a41106a20162903002210370300200141b0056a41086a200e2903002212370300200120012903b00422133703b005200141d8056a41186a2227200f370300200141d8056a41106a22322010370300200141d8056a41086a22332012370300200120133703d805200141a8066a200210cd0420012802a806210b0240024020012802b00622080d004200213442002135420021364200213742002114420021380c010b2008410574210942002114200b21084200213842002136420021374200213442002135034020014198036a200810b10120014198036a41086a2903002110200129039803210f20062008290000370000200641086a200841086a290000370000200641106a200841106a290000370000200641186a200841186a290000370000200120023602b00420014190036a200141b0046a10ce0420012d00900341017121070240024020012d009103220a0d00200141d0026a200f2010420a420010e10520012903d0022212210f200141d0026a41086a290300221321100c010b200141f0026a20104200200aad2212420010e00520014180036a200f42002012420010e005200141e0026a42004200200f420010e005427f20014180036a41086a290300221220012903f00220012903e0027c7c221320012903f80220012903e80284420052201320125472220a1b2113427f200129038003200a1b21120b200841206a21084200201320071b20377c4200201220071b223920367c2236203954ad7c21372013420020071b20357c2012420020071b221220347c2234201254ad7c2135201020387c200f20147c2214200f54ad7c2138200941606a22090d000b0b024020012802ac06450d00200b102c0b200141a8066a200210cd0420012802a80621000240024020012802b00622080d00420021394200213a4200213b4200213c420021134200213d0c010b2008410574210942002113200021084200213d4200213b4200213c420021394200213a034020062008290000370000200641086a200841086a2207290000370000200641106a200841106a220a290000370000200641186a200841186a220b290000370000200120023602b004200141c8026a200141b0046a10ce0420012d00c802210c20012d00c902210d2017200b2900003703002016200a290000370300200e2007290000370300200120082900003703b004200141a8026a2002200141b0046a200d411010cf04200141a8026a41186a290300203d7c20012903b802220f20137c2213200f54ad7c213d4200200141a8026a41086a290300220f200c41017122071b203c7c420020012903a802221020071b2212203b7c223b201254ad7c213c200f420020071b203a7c2010420020071b220f20397c2239200f54ad7c213a200841206a2108200941606a22090d000b0b024020012802ac06450d002000102c0b200141d8036a41186a222b4200370300200141d8036a41106a222c4200370300200141d8036a41086a22294200370300200142003703d80320014198046a41086a222f418be9c500ad42808080808001841002220841086a29000037030020012008290000370398042008102c2029202f29030037030020012001290398043703d803202f41c9b5c000ad4280808080d001841002220841086a29000037030020012008290000370398042008102c200e202f290300220f370300200120012903980422103703b00420112010370000201141086a223e200f370000200141b8036a41086a22152029290300370300200141b8036a41106a221e202c290300370300200141b8036a41186a2220202b290300370300200120012903d8033703b80320014190026a200141b8036a4120109e0120014190026a41106a290300420020012802900222081b210f200129039802420020081b211002400240201320147c2212420288203d20387c2012201354ad7c2213423e868422142013420288223884500d002014201285203820138584500d00410021080240034020014180026a20122013200841046a41fe007110df05200841026a2108200129038002221420014180026a41086a290300223884500d01201420128520382013858450450d000b0b200141f0016a20122013200841fe007110df0520012903f001200141f0016a41086a29030084211442002138024020080d002014420052ad21140c020b2014420052ad21140340200141d0016a2012201341002008417e6a2207200720084b1b220841ff007110df05200141e0016a2014420186223f420184223d20384201862014423f88842238203d203810e005203f203d20012903e00120012903d00156200141e0016a41086a2903002214200141d0016a41086a29030022405620142040511b1b211420080d000c020b0b420021382012201384420052ad21140b024002402010420288200f423e86842212200f420288221384500d0020122010852013200f8584500d004100210802400340200141c0016a2010200f200841046a41fe007110df05200841026a210820012903c0012212200141c0016a41086a290300221384500d0120122010852013200f858450450d000b0b200141b0016a2010200f200841fe007110df0520012903b001200141b0016a41086a29030084211242002113024020080d002012420052ad21120c020b2012420052ad2112034020014190016a2010200f41002008417e6a2207200720084b1b220841ff007110df05200141a0016a2012420186223f420184223d20134201862012423f88842213203d201310e005203f203d20012903a00120012903900156200141a0016a41086a290300221220014190016a41086a29030022405620122040511b1b211220080d000c020b0b420021132010200f84420052ad21120b02400240024002400240201420388450450d00410021000c010b203c20377c203b20367c2210203b54ad7c213b203a20357c203920347c220f203954ad7c213902400240024020240e03010200010b200f2010562039203b562039203b511b21000c020b0340200141c0006a2010203b2014203810e1052012223420132235844200510d04200141c0006a41086a290300211220012903402113200141306a200f20392034203510e10541012100201320012903302236542012200141306a41086a290300223d542012203d5122081b0d0202402036201354203d20125420081b450d00410021000c030b200141206a201320122014203810e005200141106a2036203d2034203510e0050240200f200129031022127d22132039200141106a41086a2903007d200f201254ad7d223d84500d00203b200141206a41086a2903007d213620102001290320220f5421082010200f7d21122014210f2038213920132114203d2138203421102035213b201220362008ad7d221384500d030c010b0b410021000c010b03402038213d2014213420122013844200510d02200141f0006a200f20392034203d10e10520014180016a2010203b2012201310e105410121002001290380012235200129037022365420014180016a41086a2903002214200141f0006a41086a290300223854201420385122081b0d0102402036203554203820145420081b450d00410021000c020b200141e0006a203520142012201310e005200141d0006a203620382034203d10e0050240200f200129035022147d22382039200141d0006a41086a2903007d200f201454ad7d22358450450d00410021000c020b203b200141e0006a41086a2903007d213620102001290360220f5421082010200f7d21142012210f20132139203821122035211320342110203d213b201420362008ad7d2238844200520d000b0b200141b0046a200210cd0420012802b004212220012802b404212320012802b8042208450d022022200841057422246a212d202221080240034020014180066a41186a2207200841186a220b29000037030020014180066a41106a2209200841106a220c29000037030020014180066a41086a220a200841086a220d29000037030020012008290000370380062008290000210f200641186a2226200b2900003700002006200f370000200641086a2228200d290000370000200641106a222a200c290000370000200120023602b004200141086a200141b0046a10ce042015200a290300370300201e20092903003703002020200729030037030020012001290380063703b8030240200020012d000841017145734101470d0020012d0009210b200841206a21080c020b200841206a2108202441606a22240d000c040b0b0340200141a8066a41186a2020290300220f370300200141a8066a41106a201e2903002210370300200141a8066a41086a20152903002212370300200120012903b80322133703a8062017200f37030020162010370300200e2012370300200142e4cab5fbb6ccdcb0e3003703a804200120133703b004200141a8046a200141b0046a200b4118744118754102744180d6c5006a2802004180de346c20186a10bd012008202d460d03024003402007200841186a220b2900003703002009200841106a220c290000370300200a200841086a220d2900003703002001200829000037038006202b200b290000370300202c200c2900003703002029200d290000370300200120082900003703d803200120023602b004200d290000210f200c2900002110200829000021122026200b290000370000202a20103700002028200f370000200620123700002001200141b0046a10ce042015200a290300370300201e20092903003703002020200729030037030020012001290380063703b803200020012d000041017145730d01202d200841206a2208470d000c050b0b20012d0001210b200841206a21080c000b0b41b091c200411941d890c2001036000b41b091c200411941d890c2001036000b02402023450d002022102c0b200210d2040240024020000d00200120023602bc04200141053a00b804200141063a00b00441014100200141b0046a1092010c010b200120023602bc04200141043a00b804200141063a00b00441014100200141b0046a10920102400240024002402025450d00200141a8066a41186a22002027290300370300200141a8066a41106a22242032290300370300200141a8066a41086a22262033290300370300200120012903d8053703a806202b4200370300202c420037030020294200370300200142003703d803202f41bad6c500ad428080808090018422101002220841086a29000037030020012008290000370398042008102c2029202f29030037030020012001290398043703d803202f41b6c5c400ad4280808080d0018422121002220841086a29000037030020012008290000370398042008102c200e202f290300220f370300200120012903980422133703b00420112013370000203e200f37000020152029290300370300201e202c2903003703002020202b290300370300200120012903d8033703b803202520186a210c20014180066a200141b8036a10f0030240200128028006220b0d004104210b410021154200210f0c030b200129028406220fa72115410021080240200f422088a7220d41014b0d00200d0e020302030b200d2107034020082007410176220920086a220a200c200b200a41286c6a280200491b2108200720096b220741014b0d000c020b0b2017202729030037030020162032290300370300200e2033290300370300200120012903d8053703b004200141b0046a200210d4040c030b0240200c200b200841286c6a2802002207460d002008200c20074b6a21080b2017200029030037030020162024290300370300200e2026290300370300200120012903a8063703b0042008200d4d0d0141ecb3c000411e41acfec5001036000b2017200029030037030020162024290300370300200e2026290300370300200120012903a8063703b0044100210d410021080b0240200d2015470d00200d200fa7470d00200d41016a2207200d490d06200d41017422092007200920074b1bad220f42287e2213422088a70d062013a722074100480d0602400240200d0d002007102a210b0c010b200b200d41286c2007102e210b0b200b450d040b200b200841286c6a220741286a2007200d20086b41286c10dc051a2007200c360200200720012903b0043702042007410c6a200e290300370200200741146a20162903003702002007411c6a2017290300370200200720023602242017420037030020164200370300200e4200370300200142003703b004202f20101002220841086a29000037030020012008290000370398042008102c200141f8036a41086a202f29030037030020012001290398043703f803201c41086a201b41086a290000370000201c201b290000370000202f20121002220841086a29000037030020012008290000370398042008102c20014188046a41086a202f290300370300200120012903980437038804201d201a290000370000201d41086a201a41086a29000037000020014180066a41086a200e29030037030020014180066a41106a201629030037030020014180066a41186a2017290300370300200120012903b004370380060240200b0d00203110050c010b200141203602b404200120193602b004200b200d41016a200141b0046a10e204200fa7450d00200b102c0b202e2030470d000b2030212e0b2030202e6b2106024003402006450d01200641506a2106202e412c6a2108202e41306a212e20082d00004103470d000b0b0240201f450d002021102c0b200141d8036a41186a22094200370300200141d8036a41106a220a4200370300200141d8036a41086a22084200370300200142003703d80320014198046a41086a220641bad6c500ad42808080809001841002220741086a29000037030020012007290000370398042007102c2008200629030037030020012001290398043703d803200641b6c5c400ad4280808080d001841002220741086a29000037030020012007290000370398042007102c200141b0046a41086a22022006290300220f370300200120012903980422103703b00420112010370000201141086a200f370000200141b8036a41086a2008290300370300200141b8036a41106a200a290300370300200141b8036a41186a2009290300370300200120012903d8033703b803200141b0046a200141b8036a10f00320012802b0042206410420061b210c024020012902b404420020061b2213422088a7220d450d00200c200d41286c6a210941002108200141b0046a41186a210a200141b0046a41106a210b200c210602400340024020062802002018460d0020080d020c030b200641246a2802002107200641046a290000210f2006410c6a2900002110200641146a2900002112200a2006411c6a290000370300200b2012370300200220103703002001200f3703b004200141b0046a200710d404200841016a2108200641286a22062009470d000b0b2008200d4b0d02200141b0046a41186a22024200370300200141b0046a41106a22094200370300200141b0046a41086a220a4200370300200142003703b00420014198046a41086a220641bad6c500ad42808080809001841002220741086a29000037030020012007290000370398042007102c200141f8036a41086a200629030037030020012001290398043703f803201c41086a201b41086a290000370000201c201b290000370000200641b6c5c400ad4280808080d001841002220741086a29000037030020012007290000370398042007102c20014188046a41086a2006290300370300200120012903980437038804201d201a290000370000201d41086a201a41086a29000037000020014180066a41086a200a29030037030020014180066a41106a200929030037030020014180066a41186a2002290300370300200120012903b00437038006200141003602b804200142013703b004200d20086b2206200141b0046a106702402006450d00200c200d41286c6a210a200c200841286c6a21080340200828020021020240024020012802b404220720012802b80422066b4104490d0020012802b00421070c010b200641046a22092006490d06200741017422062009200620094b1b22064100480d060240024020070d002006102a21070c010b20012802b00420072006102e21070b2007450d04200120063602b404200120073602b00420012802b80421060b2001200641046a3602b804200720066a20023600002001200141b0046a3602a806200841046a2207200141a8066a109402200841246a28020021020240024020012802b404220820012802b80422066b4104490d0020012802b00421080c010b200641046a22092006490d06200841017422062009200620094b1b22064100480d060240024020080d002006102a21080c010b20012802b00420082006102e21080b2008450d04200120063602b404200120083602b00420012802b80421060b2001200641046a3602b804200820066a2002360000200741246a2208200a470d000b0b20012802b40421062019ad428080808080048420013502b80442208620012802b0042208ad8410012006450d002008102c0b02402013a7450d00200c102c0b201810df01410010e303410010e30302402004450d00200441246c21082003210603400240024020062d0000220741034b0d0002400240024020070e0404000102040b2006410c6a280200450d03200641086a280200102c0c030b2006410c6a280200450d02200641086a280200102c0c020b2006410c6a280200450d01200641086a280200102c0c010b200641086a280200450d00200641046a280200102c0b200641246a21062008415c6a22080d000b0b02402005450d002003102c0b200141d0066a24000f0b1033000b2008200d1047000b1035000b8404010b7f230041206b2202240020012802002103200128020821042002410036020820024201370300200420021067024002400240024020040d002002280208210520022802042106200228020021070c010b20032004410c6c6a21082003210903402009280200210a200941086a280200220b2002106702400240200228020422062002280208220c6b200b490d00200228020021070c010b200c200b6a2207200c490d04200641017422052007200520074b1b22054100480d040240024020060d002005102a21070c010b200228020020062005102e21070b2007450d032002200536020420022007360200200521060b2002200c200b6a22053602082007200c6a200a200b10db051a2009410c6a22092008470d000b0b200241186a22092005ad4220862007ad841029220b41186a290000370300200241106a220c200b41106a290000370300200241086a220a200b41086a2900003703002002200b290000370300200b102c200041186a2009290300370000200041106a200c290300370000200041086a200a2903003700002000200229030037000002402006450d002007102c0b02402004450d002004410c6c21092003210b03400240200b41046a280200450d00200b280200102c0b200b410c6a210b200941746a22090d000b0b0240200141046a280200450d002003102c0b200241206a24000f0b1033000b1035000bf81f08057f027e017f037e017f027e087f027e230041e0076b2204240020044188046a200141a80210db051a200441a0026a20044188046a109002410121050240024002400240024020042d00a0024101470d00200020042f00a1023b0001200041013a0000200041036a20042d00a3023a000020032802002106410021010c010b200441c0006a200441a0026a41086a41e00110db051a024020032802002206450d00200341086a280200210720032802042108200441386a4181b0c20041101094014100210520044188046a200428023c410020042802381b10bc03200428028804210120042004280290043602a402200420013602a00220062007200441a0026a10f1020240200428028c04450d002001102c0b2008450d002006102c0b200441b0066a200441c0006a41d0006a10ed0220044188046a200441c0006a41e00110db051a20042903b0062109024002400240024002400240024020042903a804220a4202520d004100210b20042802d8044113460d010c090b200441a0076a41186a20044188046a41186a290300370300200441a0076a41106a20044188046a41106a290300370300200441a0076a41086a20044188046a41086a29030037030020042004290388043703a00720044188046a41c0006a290300210c200441c0046a290300210d200441d0046a280200210720042903b004210e200441a0026a41186a4200370300200441a0026a41106a220f4200370300200441a0026a41086a22084200370300200442003703a002200441b8066a41086a22014191b0c200ad4280808080e0008422101002220b41086a2900003703002004200b2900003703b806200b102c20082001290300370300200420042903b80622113703c007200420113703a002200141acb0c200ad4280808080e000841002220b41086a2900003703002004200b2900003703b806200b102c200f20042903b8062211370300200441d8066a41086a2008290300370300200441d8066a41106a2011370300200441d8066a41186a2001290300370300200420113703d007200420042903a0023703d806200441306a200441d8066a41201094010240200a4201520d00200e4200510d020b200120101002220841086a290000370300200420082900003703b8062008102c200441c0076a41086a2001290300370300200420042903b8063703c00720014197b0c200ad4280808080c001841002220841086a290000370300200420082900003703b8062008102c200441d0076a41086a2001290300370300200420042903b8063703d007200441a0026a200441a0076a109f0141c000102a2201450d02200120042903c007370000200120042903d007370010200120042903a002370020200141086a200441c0076a41086a2212290300370000200141186a200441d0076a41086a2213290300370000200141286a200441a0026a41086a290300370000200141306a200441b0026a290300370000200141386a200441a0026a41186a290300370000200441286a200141c000109401200428022c210b200428022821142001102c41002108200b410020141b22012007470d03200441b8066a41086a22014191b0c200ad4280808080e00084220a1002220841086a290000370300200420082900003703b8062008102c20122001290300370300200420042903b8063703c00720014197b0c200ad4280808080c001841002220841086a290000370300200420082900003703b8062008102c20132001290300370300200420042903b8063703d007200441d8066a200441a0076a109f0141c000102a2201450d02200120042903c007370000200141086a200441c0076a41086a290300370000200120042903d007370010200141186a200441d0076a41086a2215290300370000200120042903d806370020200141286a200441d8066a41086a2212290300370000200141306a200441d8066a41106a2213290300370000200141386a200441d8066a41186a22162903003700002004200741016a3602a0022001ad4280808080800884200441a0026aad220e4280808080c00084221110012001102c200441a0026a41186a22174200370300200441a0026a41106a220b4200370300200441a0026a41086a22074200370300200442003703a002200441b8066a41086a2201200a1002220841086a290000370300200420082900003703b8062008102c20072001290300370300200420042903b8063703a00220014184c3c200ad428080808080028422101002220841086a290000370300200420082900003703b8062008102c200b20042903b806220a370300201220072903003703002013200a370300201620012903003703002004200a3703d007200420042903a0023703d806200441206a200441d8066a41201094014100210841062114417f2004280224410020042802201b221820026a221920192018491b221842808080c0f588fe064280808080f28ba80920094280808080f01f835022191b220a200a428094ebdc0380220a4280ec94a37c7e7c4280cab5ee0156200aa76a4b0d0420174200370300200b420037030020074200370300200442003703a00220014191b0c200ad4280808080e00084221a1002220841086a290000370300200420082900003703b8062008102c20072001290300370300200420042903b806220a3703c0072004200a3703a002200120101002220841086a290000370300200420082900003703b8062008102c200b20042903b806220a370300201220072903003703002013200a370300201620012903003703002004200a3703d007200420042903a0023703d806200420183602a002200441d8066aad428080808080048422102011100120174200370300200b420037030020074200370300200442003703a0022001201a1002220841086a290000370300200420082900003703b8062008102c20072001290300370300200420042903b806220a3703c0072004200a3703a002200141e0c2c200ad4280808080b00284221b1002220841086a290000370300200420082900003703b8062008102c20152001290300220a370300200420042903b80622113703d007200f2011370000200f41086a200a370000201220072903003703002013200b29030037030020162017290300370300200420042903a0023703d806200441186a200441d8066a412010940141002108417f200428021c410020042802181b220f4180afd0e502418094ebdc0320191b22012009a7220720012007491b6a22122012200f491b220f20014b0d04200441a0026a41186a22164200370300200441a0026a41106a22134200370300200441a0026a41086a22144200370300200442003703a002200441b8066a41086a2201201a1002221241086a290000370300200420122900003703b8062012102c20142001290300370300200420042903b806220a3703c0072004200a3703a0022001201b1002221241086a290000370300200420122900003703b8062012102c200441d0076a41086a2001290300220a370300200420042903b80622113703d007200b2011370000200b41086a200a370000200441d8066a41086a2014290300370300200441d8066a41106a2013290300370300200441d8066a41186a2016290300370300200420042903a0023703d8062004200f3602a0022010200e4280808080c000841001200441086a200220072009422888a7200d200c10ac0241012114200441a0026a200441a0076a2004290308200441086a41086a29030041014111200d200c84501b10ac0120042802a0024101460d0420042903a8022013290300108503200441a0026a20044188046a41d0006a10c703024020042d00a0024101460d00200441cc026a2802002107200441c8026a280200210f200441c4026a2802002108200441bc026a2802002114200441b8026a280200210b0240200441c0026a2802002201450d002001410c6c2102200b210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b02402014450d00200b102c0b02402007450d002007410c6c21022008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200f450d082008102c0c080b20042d00a10222084102460d0720042f01a20221140c040b200441a0026a200441dc046a10c603024020042d00a0024101460d00200441cc026a2802002107200441c8026a2802002114200441c4026a2802002108200441bc026a2802002112200441b8026a280200210f0240200441c0026a2802002201450d002001410c6c2102200f210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b02402012450d00200f102c0b02402007450d002007410c6c21022008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b2014450d082008102c0c080b20042d00a10222014102460d0720042f01a20241087420017221010c040b41c090c600411941dc90c6001036000b1033000b41034102200120074b1b21140b201441087420087221010b200441d8046a109202200041036a20014110763a0000200020013b0001200041013a000020054521010b20010d022006450d02200341046a280200450d022006102c0c020b20044180076a41186a200441a0076a41186a29030037030020044180076a41106a200441a0076a41106a29030037030020044180076a41086a200441a0076a41086a290300370300200420042903a007370380074101210b0b200441b8066a41186a220820044180076a41186a2201290300370300200441b8066a41106a220f20044180076a41106a2202290300370300200441b8066a41086a221420044180076a41086a220729030037030020042004290380073703b806200441a0026a200441d8046a41900110db051a200441a0076a41186a22122008290300370300200441a0076a41106a2213200f290300370300200441a0076a41086a220f2014290300370300200420042903b8063703a007410221080240200b450d0020012012290300370300200220132903003703002007200f290300370300200420042903a00737038007410121080b200441e2066a2007290300370100200441ea066a2002290300370100200441f2066a2001290300370100200420083a00d90620042004290380073701da06200441003a00d806200441a0076a200441a0026a200441d8066a10c102200441ab076a2d0000210220042903a007210a20042d00a807210120042f00a90721072004419c046a200937020020044188046a41106a2001200720024110747241087472220236020020044188046a41086a2009200a20014102461b3703002004200141024736028c04200441003a0088044101410020044188046a10920120044181b0c20041101094012004200428020441016a410120042802001b360288044181b0c200ad428080808080028420044188046aad4280808080c0008410012000410c6a2002360200200041046a200a370200200041003a00002006450d002005450d00200341046a280200450d002006102c0b200441e0076a24000beb0101027f20014180feff077141087621020240024020014101710d00411f210341ff8ec60021010240024002400240024002400240200241ff01710e080006010203040508000b4120210341df8ec60021010c070b4127210341ff8dc60021010c060b4117210341e88dc60021010c050b41c98dc60021010c040b4126210341a38dc60021010c030b412b210341f88cc60021010c020b4139210341a68ec60021010c010b411f210341a090c600210102400240200241ff01710e03000102000b41c100210341df8fc60021010c010b41c1002103419e8fc60021010b20002003360204200020013602000bee1e09057f017e017f017e027f017e017f027e077f230041f0016b22012400200141a8016a41186a22024200370300200141a8016a41106a22034200370300200141a8016a41086a22044200370300200142003703a801200141c8016a41086a22054191b0c200ad4280808080e0008422061002220741086a290000370300200120072900003703c8012007102c20042005290300370300200120012903c801220837039801200120083703a801200541c8c2c200ad4280808080e001841002220741086a290000370300200120072900003703c8012007102c200320012903c8012208370300200141f8006a41086a22072004290300370300200141f8006a41106a22092008370300200141f8006a41186a220a200529030037030020012008370350200120012903a801370378200141f8006aad220b428080808080048422081005200242003703002003420037030020044200370300200142003703a801200520061002220c41086a2900003703002001200c2900003703c801200c102c20042005290300370300200120012903c801220d370398012001200d3703a801200541e0c2c200ad4280808080b002841002220c41086a2900003703002001200c2900003703c801200c102c20022005290300220d37030020072004290300370300200920012903c801220e370300200a200d3703002001200e370350200120012903a80137037820081005200242003703002003420037030020044200370300200142003703a801200520061002220c41086a2900003703002001200c2900003703c801200c102c20042005290300370300200120012903c801220d370398012001200d3703a80120054184c3c200ad42808080808002841002220c41086a2900003703002001200c2900003703c801200c102c20022005290300220d37030020072004290300370300200920012903c801220e370300200a200d3703002001200e370350200120012903a80137037820081005200242003703002003420037030020044200370300200142003703a801200520061002220c41086a2900003703002001200c2900003703c801200c102c20042005290300370300200120012903c801220d370398012001200d3703a801200541acb0c200ad4280808080e000841002220c41086a2900003703002001200c2900003703c801200c102c20022005290300220d37030020072004290300370300200920012903c801220e370300200a200d3703002001200e370350200120012903a801370378200141086a200141f8006a4120109401200128020c210f0240200128020822104101470d00200810050b200242003703002003420037030020044200370300200142003703a801200520061002220c41086a2900003703002001200c2900003703c801200c102c20042005290300370300200120012903c801220637039801200120063703a801200541b2b0c200ad4280808080a001841002220c41086a2900003703002001200c2900003703c801200c102c200141d0006a41086a20052903002206370300200120012903c801220d3703502003200d370000200341086a20063700002007200429030037030020092003290300370300200a2002290300370300200120012903a801370378200141c8016a200141f8006a412010d3010240024020012d00c8014101460d00200141106a41086a4200370300200141106a41106a4200370300200141106a41186a4200370300200141a8016a41186a200141e1016a290000370300200141a8016a41106a200141d9016a290000370300200141a8016a41086a200141d1016a290000370300200120012900c9013703a801200142003703100c010b20081005200141a8016a41186a200141e1016a2900002206370300200141a8016a41106a200141d9016a290000220d370300200141a8016a41086a200141d1016a290000220e370300200141106a41086a200e370300200141106a41106a200d370300200141106a41186a2006370300200120012900c90122063703a801200120063703100b200141a8016a41186a22024200370300200141a8016a41106a22074200370300200141a8016a41086a22044200370300200142003703a801200141c8016a41086a22054191b0c200ad4280808080e00084220d1002220941086a290000370300200120092900003703c8012009102c20042005290300370300200120012903c801220637039801200120063703a801200541cab0c200ad4280808080e000841002220941086a290000370300200120092900003703c8012009102c200141d0006a41086a221120052903002206370300200120012903c801220e3703502003200e370000200341086a22122006370000200141f8006a41086a22132004290300370300200141f8006a41106a22142007290300370300200141f8006a41186a22152002290300370300200120012903a801370378200141c8016a200141f8006a10e4020240024020012802c80122090d0041042109420021060c010b2008100520012902cc0121060b200f410020101b210a200242003703002007420037030020044200370300200142003703a8012005200d1002220c41086a2900003703002001200c2900003703c801200c102c20042005290300370300200120012903c801220d370398012001200d3703a801200541bcb0c200ad4280808080e001841002220c41086a2900003703002001200c2900003703c801200c102c20112005290300220d370300200120012903c801220e3703502003200e3700002012200d370000201320042903003703002014200729030037030020152002290300370300200120012903a801370378200141c8016a200141f8006a412010d3010240024020012d00c8014101460d00200141306a41086a4200370300200141306a41106a4200370300200141306a41186a4200370300200141a8016a41186a200141e1016a290000370300200141a8016a41106a200141d9016a290000370300200141a8016a41086a200141d1016a290000370300200120012900c9013703a801200142003703300c010b20081005200141a8016a41186a200141e1016a2900002208370300200141a8016a41106a200141d9016a290000220d370300200141a8016a41086a200141d1016a290000220e370300200141306a41086a200e370300200141306a41106a200d370300200141306a41186a2008370300200120012900c90122083703a801200120083703300b0240024002400240200a41fb01490d00200a41857e6a2203450d00200141c8016a41086a22054191b0c200ad4280808080e000841002220441086a290000370300200120042900003703c8012004102c20014198016a41086a22022005290300370300200120012903c80137039801200541a3b0c200ad42808080809001841002220441086a290000370300200120042900003703c8012004102c200141d0006a41086a22072005290300370300200120012903c80137035020012003360278200141c8016a41186a2203200b4280808080c000841006220441186a290000370300200141c8016a41106a220c200441106a2900003703002005200441086a290000370300200120042900003703c8012004102c200141a8016a41186a22042003290300370300200141a8016a41106a2203200c290300370300200141a8016a41086a220c2005290300370300200120012903c8013703a80141c000102a2205450d01200520012903980137000020052001290350370010200520012903a801370020200541086a2002290300370000200541186a2007290300370000200541286a200c290300370000200541306a2003290300370000200541386a20042903003700002005ad428080808080088410052005102c0b101b210841002105200141003a00e8012008422088a721022008a722072104034020022005460d03200141c8016a20056a20042d00003a00002001200541016a22033a00e801200441016a21042003210520034120470d000b200141d0006a41086a200141c8016a41086a290300370300200141d0006a41106a200141c8016a41106a290300370300200141d0006a41186a200141c8016a41186a290300370300200120012903c80137035002402002450d002007102c0b200141003602d001200142013703c8012001200141c8016a3602a801200141106a200141a8016a10940220012802cc01210520014198016a20013502d00142208620012802c8012204ad84101c108d0102402005450d002004102c0b02402001280298012203450d00200141a0016a2802002102200128029c01210c41002105200141003a00e8010340024020022005470d000240200541ff0171450d00200141003a00e8010b41dfd0c200412c200141c8016a418cd1c200103b000b200141c8016a20056a200320056a2d00003a00002001200541016a22043a00e8012004210520044120470d000b200141f8006a41086a200141c8016a41086a22042903002208370300200141f8006a41106a200141c8016a41106a2202290300220d370300200141f8006a41186a200141c8016a41186a2207290300220e370300200120012903c801220b370378200420083703002002200d3703002007200e3703002001200b3703c801200141a8016a41026a220f200141f5006a41026a2d00003a0000200120012f00753b01a8010240024020064220882208a722052006a7460d002006210d0c010b200541016a22102005490d032008a74101742211201020102011491bad220d42247e2208422088a70d032008a722104100480d030240024020050d002010102a21090c010b2009200541246c2010102e21090b2009450d0220064220882208a721050b2009200541246c6a220541003a0000200520012903c801370001200541096a2004290300370000200541116a2002290300370000200541196a2007290300370000200520012f01a8013b0021200541236a200f2d00003a00002008422086200d42ffffffff0f83844280808080107c2106200c450d002003102c0b200020012903103700102000200a36020020002001290350370030200041286a200141106a41186a290300370000200041206a200141106a41106a290300370000200041186a200141106a41086a290300370000200041386a200141d0006a41086a290300370000200041c0006a200141d0006a41106a290300370000200041c8006a200141d0006a41186a290300370000200041086a200637020020002009360204200041e8006a200141306a41186a290300370000200041e0006a200141306a41106a290300370000200041d8006a200141306a41086a29030037000020002001290330370050200141f0016a24000f0b1033000b1035000b0240200541ff0171450d00200141003a00e8010b41dfd0c200412c200141c8016a418cd1c200103b000ba20301027f23004180026b22022400024002402001450d00200220003602000c010b200241013602000b20022001360204200241f8006a20021081010240200228027c450d00200241086a200241f8006a41f00010db051a200241086a10b2030240200241086a410c6a2802002200450d00200228020c2101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012000415c6a22000d000b0b0240200241106a280200450d00200228020c102c0b20024180026a240042010f0b200241f4016a41043602002002411c6a41023602002002420237020c20024184adc200360208200241043602ec0120024184aec2003602e801200241003602fc01200241dc9ec6003602f8012002200241e8016a3602182002200241f8016a3602f001200241086a4194adc2001041000bd02a020b7f017e230041d0006b2202240020024100360228200242013703200240024002404104102a2203450d0020024284808080c00037022420022003360220200341edcad18b0636000002400240200228022420022802282203460d00200228022021040c010b200341016a22042003490d03200341017422052004200520044b1b22054100480d030240024020030d002005102a21040c010b200228022020032005102e21040b2004450d0120022005360224200220043602200b2002200341016a360228200420036a41093a00004119200241206a106741ccf0c100210603402006280204210720062802082203200241206a10670240024020022802242205200228022822046b2003490d00200228022021050c010b200420036a22082004490d04200541017422042008200420084b1b22044100480d040240024020050d002004102a21050c010b200228022020052004102e21050b2005450d022002200436022420022005360220200228022821040b2002200420036a360228200520046a2007200310db051a200228022421042002280228210302400240200628020c4102470d000240024020042003460d00200228022021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200228022020032005102e21040b2004450d042002200536022420022004360220200228022821030b2002200341016a360228200420036a41003a00000c010b0240024020042003460d00200228022021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200228022020032005102e21040b2004450d032002200536022420022004360220200228022821030b2002200341016a360228200420036a41013a00000240200628020c4101460d00200241306a20062802101103002002280234210720022802382203200241206a10670240024020022802242205200228022822046b2003490d00200228022021050c010b200420036a22082004490d06200541017422042008200420084b1b22044100480d060240024020050d002004102a21050c010b200228022020052004102e21050b2005450d042002200436022420022005360220200228022821040b2002200420036a360228200520046a2007200310db051a200228024021050240200228023c4101460d0020052002280244200241206a10680c020b200520022802482203200241206a106802402003450d00200341d8006c21074100210403400240200520046a220341346a280200450d002003413c6a280200450d00200341386a280200102c0b0240200341c4006a280200450d00200341cc006a280200450d00200341c8006a280200102c0b2007200441d8006a2204470d000b0b2002280244450d012005102c0c010b2006280214210720062802182203200241206a10670240024020022802242205200228022822046b2003490d00200228022021050c010b200420036a22082004490d05200541017422042008200420084b1b22044100480d050240024020050d002004102a21050c010b200228022020052004102e21050b2005450d032002200436022420022005360220200228022821040b2002200420036a360228200520046a2007200310db051a200628022021030240200628021c4101460d002003200641246a280200200241206a10680c010b20032006280228200241206a10680b200228022421042002280228210302400240200628022c4102470d000240024020042003460d00200228022021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200228022020032005102e21040b2004450d042002200536022420022004360220200228022821030b2002200341016a360228200420036a41003a00000c010b0240024020042003460d00200228022021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200228022020032005102e21040b2004450d032002200536022420022004360220200228022821030b2002200341016a360228200420036a41013a00000240200628022c4101460d00200241186a200628023011030020022802182104200228021c2203200241206a10672003450d012003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10670240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d0720074101742205200a2005200a4b1b22054100480d070240024020070d002005102a21070c010b200228022020072005102e21070b2007450d052002200536022420022007360220200228022821050b2002200520046a360228200720056a2009200410db051a200341706a200241206a10692003200241206a10662003412c6a2103200841546a22080d000c020b0b2006280230210420062802382203200241206a10672003450d002003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10670240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d0620074101742205200a2005200a4b1b22054100480d060240024020070d002005102a21070c010b200228022020072005102e21070b2007450d042002200536022420022007360220200228022821050b2002200520046a360228200720056a2009200410db051a200341706a200241206a10692003200241206a10662003412c6a2103200841546a22080d000b0b200228022421042002280228210302400240200628023c4102470d000240024020042003460d00200228022021040c010b200341016a22042003490d06200341017422052004200520044b1b22054100480d060240024020030d002005102a21040c010b200228022020032005102e21040b2004450d042002200536022420022004360220200228022821030b2002200341016a360228200420036a41003a00000c010b0240024020042003460d00200228022021040c010b200341016a22042003490d05200341017422052004200520044b1b22054100480d050240024020030d002005102a21040c010b200228022020032005102e21040b2004450d032002200536022420022004360220200228022821030b2002200341016a360228200420036a41013a00000240200628023c4101460d00200241106a20062802401103002002280210210420022802142203200241206a10672003450d012003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10670240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d0720074101742205200a2005200a4b1b22054100480d070240024020070d002005102a21070c010b200228022020072005102e21070b2007450d052002200536022420022007360220200228022821050b2002200520046a360228200720056a2009200410db051a200341706a200241206a10662003200241206a10662003412c6a2103200841546a22080d000c020b0b2006280240210420062802482203200241206a10672003450d002003412c6c21082004411c6a21030340200341686a28020021092003416c6a2802002204200241206a10670240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d0620074101742205200a2005200a4b1b22054100480d060240024020070d002005102a21070c010b200228022020072005102e21070b2007450d042002200536022420022007360220200228022821050b2002200520046a360228200720056a2009200410db051a200341706a200241206a10662003200241206a10662003412c6a2103200841546a22080d000b0b02400240200628024c4101460d00200241086a20062802501103002002280208210b200228020c2203200241206a10672003450d01200341386c210c410021070340200b20076a220341046a2802002109200341086a2802002204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0720084101742205200a2005200a4b1b22054100480d070240024020080d002005102a21080c010b200228022020082005102e21080b2008450d052002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a200341106a2802002109200341146a2802002204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0720084101742205200a2005200a4b1b22054100480d070240024020080d002005102a21080c010b200228022020082005102e21080b2008450d052002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a02400240200341186a2802004101460d00200241306a2003411c6a280200200341206a28020028020c1102002002280230210920022802382204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0920084101742205200a2005200a4b1b22054100480d090240024020080d002005102a21080c010b200228022020082005102e21080b2008450d072002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a2002280234450d012009102c0c010b2003411c6a2802002109200341246a2802002204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0820084101742205200a2005200a4b1b22054100480d080240024020080d002005102a21080c010b200228022020082005102e21080b2008450d062002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a0b200341286a200241206a1066200c200741386a2207470d000c020b0b2006280250210b20062802582203200241206a10672003450d00200341386c210c410021070340200b20076a220341046a2802002109200341086a2802002204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0620084101742205200a2005200a4b1b22054100480d060240024020080d002005102a21080c010b200228022020082005102e21080b2008450d042002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a200341106a2802002109200341146a2802002204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0620084101742205200a2005200a4b1b22054100480d060240024020080d002005102a21080c010b200228022020082005102e21080b2008450d042002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a02400240200341186a2802004101460d00200241306a2003411c6a280200200341206a28020028020c1102002002280230210920022802382204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0820084101742205200a2005200a4b1b22054100480d080240024020080d002005102a21080c010b200228022020082005102e21080b2008450d062002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a2002280234450d012009102c0c010b2003411c6a2802002109200341246a2802002204200241206a10670240024020022802242208200228022822056b2004490d00200228022021080c010b200520046a220a2005490d0720084101742205200a2005200a4b1b22054100480d070240024020080d002005102a21080c010b200228022020082005102e21080b2008450d052002200536022420022008360220200228022821050b2002200520046a360228200820056a2009200410db051a0b200341286a200241206a1066200c200741386a2207470d000b0b02400240200628025c4101460d00200220062802601103002002280200210420022802042203200241206a10672003450d012003411c6c21082004410c6a21030340200341786a28020021092003417c6a2802002204200241206a10670240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d0720074101742205200a2005200a4b1b22054100480d070240024020070d002005102a21070c010b200228022020072005102e21070b2007450d052002200536022420022007360220200228022821050b2002200520046a360228200720056a2009200410db051a2003200241206a10662003411c6a2103200841646a22080d000c020b0b2006280260210420062802682203200241206a10672003450d002003411c6c21082004410c6a21030340200341786a28020021092003417c6a2802002204200241206a10670240024020022802242207200228022822056b2004490d00200228022021070c010b200520046a220a2005490d0620074101742205200a2005200a4b1b22054100480d060240024020070d002005102a21070c010b200228022020072005102e21070b2007450d042002200536022420022007360220200228022821050b2002200520046a360228200720056a2009200410db051a2003200241206a10662003411c6a2103200841646a22080d000b0b200641ec006a220641d885c200470d000b2002280228220341046a2204417f4c0d0120022802242108200228022021070240024020040d00410121050c010b2004102a2205450d010b2002410036023820022004360234200220053602302003200241306a10670240024020022802342205200228023822046b2003490d00200228023021050c010b200420036a22092004490d03200541017422062009200620094b1b22094100480d030240024020050d002009102a21050c010b200228023020052009102e21050b2005450d0120022009360234200220053602300b200520046a2007200310db051a200420036aad4220862005ad84210d02402008450d002007102c0b200241d0006a2400200d0f0b1033000b103a000b1035000ba80601047f230041b0076b22022400024002402001450d00200220003602000c010b200241013602000b20022001360204200241f8046a2002108c0202400240024020022903e0054203510d00200241186a200241f8046a41a80210db051a200241c0026a200241186a41a80210db051a2002200241c0026a3602f804200241e8046a200241f8046a10870120022802f0042101200241f8046a200241c0026a41a80210db051a200241a8076a20022802f004360200200220022903e8043703a007200241086a200241f8046a2001200241a0076a10b4034101410220022d000841014622031b2200102a2201450d012002410036028005200220003602fc04200220013602f8040240024020030d00200141003a00004102210320024102360280050240200241146a2d000022044102470d00200141003a00010c020b200141013a00010240024020044101470d00200141024104102e2201450d05200141013a000220024284808080303702fc04200220013602f8044103210320022d001521040c010b410221034100210420004102470d0041000d0520004101742204200041016a2205200420054b1b22044100480d05200120002004102e2201450d04200220043602fc04200220013602f804410021040b200120036a20043a00002002200341016a220036028005200241166a2d00002104024020022802fc042000470d0041000d0520004101742203200041016a2205200320054b1b22034100480d050240024020000d002003102a21010c010b200120002003102e21010b2001450d04200220033602fc04200220013602f8040b2002200041016a220336028005200120006a20043a00000c010b200141013a00002002410136028005200241086a410172200241f8046a10ba03200228028005210320022802f80421010b200241b0076a24002003ad4220862001ad840f0b200241246a4104360200200241d4026a4102360200200242023702c40220024184adc2003602c0022002410436021c2002419caec2003602182002410036020c200241dc9ec6003602082002200241186a3602d0022002200241086a360220200241c0026a4194adc2001041000b1033000b1035000ba00b01057f230041106b22022400200141046a2802002103200141086a2802002104024002400240024020002d00004101460d000240024020032004460d00200128020021050c010b200441016a22032004490d04200441017422052003200520034b1b22034100480d040240024020040d002003102a21050c010b200128020020042003102e21050b2005450d0320012005360200200141046a2003360200200141086a28020021040b200141086a2206200441016a36020041002103200520046a41003a000002400240024002400240024002400240024020002d00010e080700010203040506070b200241013a000f410121030c070b410221030c050b410321030c040b410421030c030b410521030c020b410621030c010b200241073a000f02400240200141046a28020020062802002204460d00200128020021030c010b200441016a22032004490d06200441017422052003200520034b1b22054100480d060240024020040d002005102a21030c010b200128020020042005102e21030b2003450d0520012003360200200141046a2005360200200141086a28020021040b200141086a200441016a360200200320046a41073a000020002d000221030b200220033a000f0b02400240200141046a280200200141086a2802002204460d00200128020021000c010b200441016a22002004490d04200441017422052000200520004b1b22054100480d040240024020040d002005102a21000c010b200128020020042005102e21000b2000450d0320012000360200200141046a2005360200200141086a28020021040b200141086a200441016a360200200020046a20033a00000c010b0240024020032004460d00200128020021030c010b200441016a22032004490d03200441017422052003200520034b1b22054100480d030240024020040d002005102a21030c010b200128020020042005102e21030b2003450d0220012003360200200141046a2005360200200141086a28020021040b200141086a200441016a360200200320046a41013a000020002d0001220441024b0d0002400240024020040e03000102000b02400240200141046a280200200141086a2802002204460d00200128020021000c010b200441016a22002004490d05200441017422032000200320004b1b22034100480d050240024020040d002003102a21000c010b200128020020042003102e21000b2000450d0420012000360200200141046a2003360200200141086a28020021040b200141086a200441016a360200200020046a41003a00000c020b02400240200141046a280200200141086a2802002204460d00200128020021000c010b200441016a22002004490d04200441017422032000200320004b1b22034100480d040240024020040d002003102a21000c010b200128020020042003102e21000b2000450d0320012000360200200141046a2003360200200141086a28020021040b200141086a200441016a360200200020046a41013a00000c010b02400240200141046a280200200141086a2802002204460d00200128020021030c010b200441016a22032004490d03200441017422052003200520034b1b22054100480d030240024020040d002005102a21030c010b200128020020042005102e21030b2003450d0220012003360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200320046a41023a000020002d0002210302400240200141046a28020020052802002204460d00200128020021000c010b200441016a22002004490d03200441017422052000200520004b1b22054100480d030240024020040d002005102a21000c010b200128020020042005102e21000b2000450d0220012000360200200141046a2005360200200141086a28020021040b200141086a200441016a360200200020046a20033a00000b200241106a24000f0b1033000b1035000bdb1109077f017e017f027e027f017e057f017e037f23004190026b22022400200241186a4181b0c2004110109401200228021c21030240200228021822044101470d004181b0c200ad428080808080028410050b200241b0016a41186a22054200370300200241b0016a41106a22064200370300200241b0016a41086a22074200370300200242003703b001200241206a41086a22084191b0c200ad4280808080e0008422091002220a41086a2900003703002002200a290000370320200a102c20072008290300370300200220022903203703b001200841c8c2c200ad4280808080e00184220b1002220a41086a2900003703002002200a290000370320200a102c20062002290320220c37030020024190016a41086a220d200729030037030020024190016a41106a220a200c37030020024190016a41186a220e20082903003703002002200c3703d001200220022903b0013703900120022003410020041b36022020024190016aad4280808080800484220f200241206aad4280808080c000841001200241206a41186a22104200370300200241206a41106a220442003703002008420037030020024200370320200241d0016a41086a221120091002220341086a290000370300200220032900003703d0012003102c20082011290300370300200220022903d001370320201141acb0c200ad4280808080e000841002220341086a290000370300200220032900003703d0012003102c200420022903d001220c370300200241e0016a41086a22122008290300370300200241e0016a41106a200c370300200241e0016a41186a221320112903003703002002200c3703b001200220022903203703e001200241106a200241e0016a41201094012002280214210420022802102114200542003703002006420037030020074200370300200242003703b001201141e4d2c500ad42808080808001841002220341086a290000370300200220032900003703d0012003102c20072011290300370300200220022903d0013703b001201141ecd2c500ad42808080808001841002220341086a290000370300200220032900003703d0012003102c20052011290300220c370300200d2007290300370300200a20022903d0012215370300200e200c3703002002201537038002200220022903b00137039001200f10052004410020141b10ad02200542003703002006420037030020074200370300200242003703b001201120091002220341086a290000370300200220032900003703d0012003102c20072011290300370300200220022903d001220c370380022002200c3703b0012011200b1002220341086a290000370300200220032900003703d0012003102c20052011290300220c370300200d2007290300370300200a20022903d001220b370300200e200c3703002002200b37038002200220022903b00137039001200241086a20024190016a41201094010240024002400240200228020c410020022802081b22160d0041042117410021160c010b2016ad420c7e220c422088a70d01200ca7220a4100480d01200a102a2217450d024100210a201721030340200241e0016a200a10bc03200241206a20022802e001221420022802e801221810bd03024020022802202204450d002018ad4220862014ad8410050b200a41016a210a2002290224420020041b210c2004410120041b2104024020022802e401450d002014102c0b20032004360200200341046a200c3702002003410c6a21032016200a470d000b0b200220163602282002201636022420022017360220200241e0016a200241206a10b30320102013290300370300200241206a41106a2203200241e0016a41106a29030037030020082012290300370300200220022903e00137032020054200370300200241b0016a41106a2204420037030020074200370300200242003703b001201120091002220a41086a2900003703002002200a2900003703d001200a102c20072011290300370300200220022903d001220c370380022002200c3703b001201141bcb0c200ad4280808080e001841002220a41086a2900003703002002200a2900003703d001200a102c20024180026a41086a2011290300220c370300200220022903d00122093703800220062009370000200641086a200c370000200d200729030037030020024190016a41106a2004290300370300200e2005290300370300200220022903b00137039001200241203602b401200220024190016a3602b001200241206a200241b0016a10be03200241206a10b603200241003602b801200242013703b0012002200241b0016a3602e0012003200241e0016a109402200241206a200241b0016a1089012002200241b0016a3602e001200241d0006a200241e0016a1094022002200241b0016a3602e001200241f0006a200241e0016a109402200228022421042002412c6a280200220a200241b0016a10670240200a450d00200a41246c21160340200241e0016a200410e70220022802e00121180240024020022802b401221420022802b801220a6b20022802e8012203490d0020022802b00121140c010b200a20036a2211200a490d032014410174220a2011200a20114b1b220a4100480d030240024020140d00200a102a21140c010b20022802b0012014200a102e21140b2014450d042002200a3602b401200220143602b00120022802b801210a0b2002200a20036a3602b8012014200a6a2018200310db051a024020022802e401450d002018102c0b200441246a21042016415c6a22160d000b0b20023502b801422086210c20023502b00121090240200228022c2203450d002002280224210a200341246c2103034002400240200a2d0000220441034b0d0002400240024020040e0404000102040b200a410c6a280200450d03200a41086a280200102c0c030b200a410c6a280200450d02200a41086a280200102c0c020b200a410c6a280200450d01200a41086a280200102c0c010b200a41086a280200450d00200a41046a280200102c0b200a41246a210a2003415c6a22030d000b0b200c200984210c0240200241286a280200450d002002280224102c0b20024190026a2400200c0f0b1035000b1033000bcd0301067f230041f0006b22022400200241d0006a41086a22034191b0c200ad4280808080e000841002220441086a290000370300200220042900003703502004102c200241086a41086a2205200329030037030020022002290350370308200341b4c3c200ad4280808080d001841002220441086a290000370300200220042900003703502004102c200241186a41086a22062003290300370300200220022903503703182002200136024c200241d0006a41186a2201200241cc006aad4280808080c000841006220441186a290000370300200241d0006a41106a2207200441106a2900003703002003200441086a290000370300200220042900003703502004102c200241286a41186a22042001290300370300200241286a41106a22012007290300370300200241286a41086a2207200329030037030020022002290350370328024041c000102a22030d001033000b200320022903083700002003200229031837001020032002290328370020200042c0808080800837020420002003360200200341086a2005290300370000200341186a2006290300370000200341286a2007290300370000200341306a2001290300370000200341386a2004290300370000200241f0006a24000bbb0201017f230041e0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036022420032001360220200341c8006a200341206a1077024002402003280248450d0020002003290348370200200041086a200341c8006a41086a2802003602000c010b20034100360230200342013703282003410b36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341d0b0c2003602482003200341386a360258200341c4006a41c49ac500200341c8006a10391a2003350230422086200335022884100420004100360200200328022c450d002003280228102c0b2002450d002001102c0b200341e0006a24000bc30301027f20002d0000210202404101102a2203450d00200320023a000020002d00012102200341014102102e2203450d00200320023a000120002d00022102200341024104102e2203450d00200320023a0002200320002d00033a000320002d00042102200341044108102e2203450d00200320023a0004200320002d00053a0005200320002d00063a0006200320002d00073a000720002d00082102200341084110102e2203450d00200320023a0008200320002d00093a0009200320002d000a3a000a200320002d000b3a000b200320002d000c3a000c200320002d000d3a000d200320002d000e3a000e200320002d000f3a000f20002d00102102200341104120102e2203450d00200320023a0010200320002d00113a0011200320002d00123a0012200320002d00133a0013200320002d00143a0014200320002d00153a0015200320002d00163a0016200320002d00173a0017200320002d00183a0018200320002d00193a0019200320002d001a3a001a200320002d001b3a001b200320002d001c3a001c200320002d001d3a001d200320002d001e3a001e200320002d001f3a001f20012902002003ad428080808080048410012003102c0f0b1033000b932907017f017e027f017e0e7f027e077f230041f0036b22022400024002402001450d00200220003602200c010b200241013602200b20022001360224200241186a200241206a1075024020022802180d00200228021c21012002200241206a3602f801200241003a00d003200242003702e402200241d0e1c1003602e0022002200136023c200241003602382002200241d0036a3602442002200241f8016a360240200241386a200241e0026a10a90220022802e002210120022902e4022103024020022d00d003450d0020012003a72003422088a710c0030c010b2001450d002002200337022c20022001360228200241386a200241286a10c10302400240024002400240024020022802384101460d00200241386a41086a2903002103200241b8016a41186a4200370300200241b8016a41106a22044200370300200241b8016a41086a22004200370300200242003703b801200241e8016a41086a220141f9e8c500ad42808080809001841002220541086a290000370300200220052900003703e8012005102c20002001290300370300200220022903e8013703b8012001419db1c200ad428080808030841002220541086a290000370300200220052900003703e8012005102c200420022903e8012206370300200241d0036a41086a2000290300370300200241d0036a41106a2006370300200241d0036a41186a2001290300370300200220063703d801200220022903b8013703d003200241086a200241d0036a109801200229031021062002280208210141a802102a2207450d0420074103360298012007420237036820072003200642dc0b7c42dc0b20011b220620032006561b3703a001200241286a2101200228022c210803402001280200220941086a210020092f0106220a4103742101410021050240024003402001450d0141c991c2002000410810dd05220b450d02200141786a2101200541016a2105200041086a2100200b417f4a0d000b2005417f6a210a0b024020080d004101210c0c060b2008417f6a21082009200a4102746a41e4016a21010c010b0b200220092005410c6c6a220141e8006a2802003602e4022002200141e0006a2802003602e002200241386a200241e0026a10800102402002280238220d0d004101210c0c040b200228023c210e200241386a41086a2201280200220a450d01200241386a41186a22094200370300200241386a41106a220f42003703002001420037030020024200370338200241e8016a41086a220041a4c6c500ad4280808080a001841002220541086a290000370300200220052900003703e8012005102c20012000290300370300200220022903e801370338200041f889c200ad4280808080e000841002220541086a290000370300200220052900003703e8012005102c200f20022903e8012203370300200241d0036a41086a2001290300370300200241d0036a41106a2003370300200241d0036a41186a2000290300370300200220033703d801200220022903383703d003200241386a200241d0036a10e601200229023c4200200228023822011b2203a7210c2001410420011b22082100200821010240024002402003422088a72210450d002008201041c4006c6a21004100210502400340200820056a22012d0000210b200241386a200141016a41c30010db051a200b4102460d01200241b8016a41186a2009290000370300200241b8016a41106a200f290000370300200241b8016a41086a200241386a41086a290000370300200220022900383703b801200b4101460d03200541c4006a2105200141c4006a2000470d000b200021010c010b200141c4006a21010b0240034020002001460d0120012d00002105200141c4006a210120054102470d000b0b41012109410021110240200c0d00410021120c020b2008102c410021120c010b200241d0036a41086a220b200241b8016a41086a290300370300200241d0036a41106a2213200241b8016a41106a290300370300200241d0036a41186a2214200241b8016a41186a290300370300200220022903b80122033703f801200220033703d0034120102a2209450d05200920022903d003370000200941186a2014290300370000200941106a2013290300370000200941086a200b29030037000041012111024002400240201041c4006c41bc7f6a2005470d00410121120c010b200141c4006a2d00002105200241386a200141c5006a41c30010db051a20014188016a210b024020054102470d0041012112200b21010c020b41012111410121120340200b210102400340200241b8016a41186a220b200241386a41186a290000370300200241b8016a41106a2210200241386a41106a290000370300200241b8016a41086a2213200241386a41086a290000370300200220022900383703b801200541ff01714101460d0120002001460d0320012d00002105200241386a200141016a41c30010db051a200141c4006a210120054102460d040c000b0b200241d0036a41086a20132903002203370300200241d0036a41106a20102903002206370300200241d0036a41186a200b2903002215370300200220022903b80122163703d003200241f8016a41186a220b2015370300200241f8016a41106a22102006370300200241f8016a41086a22132003370300200220163703f801024020122011470d00201141016a22052011490d0a201141017422142005201420054b1b221241ffffff3f712012470d0a201241057422054100480d0a0240024020110d002005102a21090c010b200920114105742005102e21090b2009450d090b200920114105746a220520022903f801370000200541186a200b290300370000200541106a2010290300370000200541086a2013290300370000201141016a211120002001460d0120012d00002105200241386a200141016a41c30010db051a200141c4006a210b20054102470d000b200141c4006a21010c010b200021010b0240034020002001460d0120012d00002105200141c4006a210120054102470d000b0b200c450d002008102c0b200d200a41f0006c6a2114200241e0026a41106a2117200241e0026a41086a21184200211541042119200d210b0340200b2802042101200b2802002100200241386a200b41086a41e80010db051a200b41f0006a210b2001450d03200241f8016a200241386a41e80010db051a200220013602e402200220003602e0022018200241f8016a41e80010db051a200241386a41186a22104200370300200241386a41106a22134200370300200241386a41086a2205420037030020024200370338200241e8016a41086a22014191b0c200ad4280808080e000841002220041086a290000370300200220002900003703e8012000102c20052001290300370300200220022903e801370338200141acb0c200ad4280808080e000841002220041086a290000370300200220002900003703e8012000102c200241d8016a41086a20012903002203370300200220022903e80122063703d801200f2006370000200f41086a2003370000200241d0036a41086a221a2005290300370300200241d0036a41106a221b2013290300370300200241d0036a41186a221c2010290300370300200220022903383703d0032002200241d0036a41201094012002280200210120022802042100200241d0036a200241e0026a10ee0202400240024020022802e002417f6a22082000410020011b22014f0d00200241386a2008109302200241386a2017412010dd050d0020022802e002221d41002001417b6a2200200020014b1b490d0020114105742108200241d0036a20096b210c4100210102400340024020082001470d004100210a0c020b4101210a200c2001460d01200920016a2100200141206a21012000200241d0036a412010dd050d000b0b200241386a201d109302200241386a200241d0036a412010dd052101200a0d0020010d010b024020022802ec022200450d0020022802e4022101200041246c210003400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012000415c6a22000d000b0b20022802e802450d0120022802e402102c0c010b200241d0036a200241e0026a10ee02200241386a200241e0026a41f00010db051a0240024020154220882203a722012015a7460d00200121000c010b200141016a220a2001490d082003a72200410174220c200a200a200c491bad221542f0007e2203422088a70d082003a7220a4100480d080240024020010d00200a102a21190c010b2019200141f0006c200a102e21190b2019450d070b2019200041f0006c6a200241386a41f00010db051a2010201c2903003703002013201b2903003703002005201a290300370300200220022903d003370338024020112012470d00201141016a22012011490d082011410174220a2001200a20014b1b221241ffffff3f712012470d08201241057422014100480d080240024020110d002001102a21090c010b200920082001102e21090b2009450d070b201542ffffffff0f83200041016a2200ad422086842115200920086a22012002290338370000200141186a2010290300370000200141106a2013290300370000200141086a20052903003700002000410a460d04201141016a21110b200b2014470d000b2014210b0c020b2002200229023c3703e00241d5b1c2004128200241e0026a41a0b1c200103b000b4101210c200e450d01200d102c0c010b0240200b2014460d000340200b2802042208450d01200b41086a280200210a0240200b410c6a2802002201450d00200141246c21002008210103400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012000415c6a22000d000b0b200b41f0006a210b0240200a450d002008102c0b200b2014470d000b0b0240200e450d00200d102c0b02402012450d002009102c0b0240201542ffffffff0f560d004101210c2015a7450d012019102c0c010b024020190d004101210c0c010b200741a80241d004102e2207450d01200741a8026a200241e0026a41e80010db051a2007420237039003200720153703c803200720193602c403200741043602c003200720022903f80137039803200741a0036a20024180026a290300370300200741a8036a20024188026a290300370300200741b0036a20024190026a290300370300200741b8036a20024198026a290300370300200741d0036a200241386a41800110db051a4102210c0b200241286a2101200228022c210802400240024003402001280200220941086a210020092f0106220a4103742101410021050240024003402001450d0141d191c2002000410810dd05220b450d02200141786a2101200541016a2105200041086a2100200b417f4a0d000b2005417f6a210a0b2008450d022008417f6a21082009200a4102746a41e4016a21010c010b0b200941e0006a2005410c6c6a22012802084104490d0020012802002800002108200241b8016a41186a220b4200370300200241b8016a41106a22094200370300200241b8016a41086a22004200370300200242003703b801200241e8016a41086a220141f9e8c500ad42808080809001841002220541086a290000370300200220052900003703e8012005102c20002001290300370300200220022903e8013703b801200141e499c500ad4280808080b001841002220541086a290000370300200220052900003703e8012005102c200241d8016a41086a20012903002203370300200220022903e80122063703d80120042006370000200441086a2003370000200241d0036a41086a2000290300370300200241d0036a41106a2009290300370300200241d0036a41186a200b290300370300200220022903b8013703d003200241386a200241d0036a10960120022802382201410420011b2105410021000240200229023c420020011b2203422088a72201417f6a220b20014b0d00200b20014f0d002005200b4102746a2201450d00200128020020084721000b02402003a7450d002005102c0b20000d010b200c21100c010b2007200c41a8026c2201200c4101742200200c41016a2210200020104b1b41a8026c102e2207450d01200720016a200241e0026a41e80010db0522014202370368200120022903f801370370200141f8006a20024180026a29030037030020014180016a20024188026a29030037030020014188016a20024190026a29030037030020014190016a20024198026a2903003703002001419c016a20083602002001410e36029801200141a8016a200241386a41800110db051a0b2002280228200228022c200228023010c003200241003602e802200242013703e0022010200241e0026a1067201041a8026c210c20022802e402210820022802e8022101200721050340200220053602f801200241386a200241f8016a1087012002280238210a02400240200820016b20022802402209490d00200120096a210020022802e002210b0c010b200120096a22002001490d032008410174220b2000200b20004b1b220f4100480d030240024020080d00200f102a210b0c010b20022802e0022008200f102e210b0b200b450d022002200f3602e4022002200b3602e002200f21080b200220003602e802200b20016a200a200910db051a0240200228023c450d00200a102c0b200541a8026a210520002101200c41d87d6a220c0d000b201041a8026c210520074198016a21012000ad422086200bad842103034020011073200141a8026a2101200541d87d6a22050d000b2007102c200241f0036a240020030f0b1033000b1035000b200241ec026a4104360200200241cc006a41023602002002420237023c20024184adc200360238200241043602e402200241b4aec2003602e002200241003602fc01200241dc9ec6003602f8012002200241e0026a3602482002200241f8016a3602e802200241386a4194adc2001041000bd90303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200441e0006a2802002104200141016a21010c010b02400240200028020022010d002003ad210541002106410021010c010b20003301044220862003ad842105410121060b2000102c2005a72103024002402005422088a7220720012f01064f0d00200121040c010b034002400240200128020022040d002003ad2105410021040c010b200641016a210620013301044220862003ad8421050b2001102c2005a72103200421012005422088a7220720042f01064f0d000b0b200741027420046a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a280200210402402006417f6a2201450d00034020002802e40121002001417f6a22010d000b0b410021010b2004450d012002417f6a210202402005a7450d002004102c0b20020d000b0b0240200041d0e1c100460d00200028020021012000102c2001450d00200128020021042001102c2004450d00024020042802002201450d0003402004102c2001210420012802002200210120000d000b0b2004102c0b0bf00101067f2001280204210202400240024003402001280200220341086a210420032f01062205410374210141002106024003402001450d0141a0e8c5002004410810dd052207450d03200141786a2101200641016a2106200441086a21042007417f4a0d000b2006417f6a21050b02402002450d002002417f6a2102200320054102746a41e4016a21010c010b0b200041a8e8c500360204200041086a41283602000c010b200341e0006a2006410c6c6a220128020841074b0d01200041d0e8c500360204200041086a41293602000b200041013602000f0b200041086a2001280200290000370300200041003602000bec3006077f017e0c7f027e017f037e230041c0026b22022400024002402001450d00200220003602200c010b200241013602200b20022001360224200241c8006a200241206a10b1030240024002400240200228024c2203450d00200241c0016a2802002104200241bc016a2802002105200241b8016a2802002106200241c8006a410c6a280200210720022802502108200241186a200241206a107520022802180d02200228021c21012002200241206a3602d001200241003a0038200242003702e401200241d0e1c1003602e0012002200136024c200241003602482002200241386a3602542002200241d0016a360250200241c8006a200241e0016a10a90220022802e001210120022902e401210920022d0038450d0120012009a72009422088a710c0030c020b200241dc016a4104360200200241f4016a4102360200200242023702e40120024184adc2003602e001200241043602d401200241d0aec2003602d0012002410036023c200241dc9ec6003602382002200241d0016a3602f0012002200241386a3602d801200241e0016a4194adc2001041000b20010d010b200241e0016a410c6a4104360200200241dc006a41023602002002420237024c20024184adc200360248200241043602e401200241d0aec2003602e001200241003602d401200241dc9ec6003602d0012002200241e0016a3602582002200241d0016a3602e801200241c8006a4194adc2001041000b2002200937022c20022001360228200241013b01442002420037023c200241d0e1c100360238200241386a41086a210a02400240024002402004450d002006200441a8026c6a210b200241e0016a410272210c200241c8006a41106a210d2006210e024002400240024002400340200e41e8006a2903004202520d0602400240200e28029801220f41034722100d00200e2903a0012109200241286a2101200228022c211102400240024002400240024002400240024003402001280200221241086a210020122f010622134103742101410021140240024003402001450d0141e98ac6002000410810dd052215450d02200141786a2101201441016a2114200041086a21002015417f4a0d000b2014417f6a21130b2011450d022011417f6a2111201220134102746a41e4016a21010c010b0b201241e0006a2014410c6c6a220128020841074b0d0141f18ac6002113201642808080807083422984a721110c020b419a8bc6002113201642808080807083421c84a721110c010b200942b8178020012802002900002216510d014131211141b8abc20021130b0240024020022d0045450d00413121014196acc20021000c010b2002280238200228023c200228024010c0032002420037023c200241d0e1c100360238200242e2c289abb68edbb7f4003703d00141002101200241e0016a410272410041da0010da051a200241c8006a410041840110da051a41e401102a2215450d1120154100360200201541046a200241e0016a41dc0010db051a201541e0006a200241c8006a41840110db051a2002410036023c2002201536023820152f0106220e4103742112417f2100024002400340024020122001470d00200e21000c020b200241d0016a201520016a41086a410810dd052214450d02200141086a2101200041016a21002014417f4a0d000b0b200242e2c289abb68edbb7f40037025c2002200a360258200220003602542002201536024c200241003602482002200241386a360250201141046a2200417f4c0d03024002402000450d002000102a2201450d14200241003602bc02200220013602e0012011413f4b0d01200120114102743a0000410121140c110b200241003602bc0241012100200241013602e0014101102a2201450d13200141033a0000200241013602bc02200220013602e001410521140c0c0b201141808001490d0e2011418080808004490d0d0c090b412d210141e9abc20021000b2002200136024c2002200036024841c7acc2004122200241c8006a41ecacc200103b000b20100d05200e2903a0012117200241c8006a200241286a10c1030240024020022802484101470d0020023502502109200228024c21184101210f0c010b20022903502109200241c8006a41186a22154200370300200d4200370300200241c8006a41086a2200420037030020024200370348200241e0016a41086a220141f9e8c500ad42808080809001841002221441086a290000370300200220142900003703e0012014102c20002001290300370300200220022903e0013703482001419db1c200ad428080808030841002221441086a290000370300200220142900003703e0012014102c200241d0016a41086a20012903002219370300200220022903e001221a3703d001200d201a370000200d41086a201937000020012000290300370300200241e0016a41106a200d290300370300200241e0016a41186a2015290300370300200220022903483703e001200241086a200241e0016a10980102402017200942b0ea017c560d004100210f2017200229031042dc0b7c42dc0b20022802081b2209540d010c060b201b4280808080708342258421094101210f41b0b1c20021180b024020022d0045450d00413121014196acc20021000c040b0240200f450d002002280238200228023c200228024010c0032002420037023c200241d0e1c100360238200242f4d2b59bc7ae98b8303703d0010c020b20022802382112200242f4d2b59bc7ae98b8303703d001201241d0e1c100460d01200228023c21110c020b103a000b200c410041da0010da051a200241c8006a410041840110da051a41e401102a2212450d0d4100211120124100360200201241046a200241e0016a41dc0010db051a201241e0006a200241c8006a41840110db051a2002410036023c200220123602380b02400340201241086a210020122f01062213410374210141002114024003402001450d01200241d0016a2000410810dd052215450d03200141786a2101201441016a2114200041086a21002015417f4a0d000b2014417f6a21130b02402011450d002011417f6a2111201220134102746a41e4016a28020021120c010b0b200242f4d2b59bc7ae98b83037025c2002200a360258200220133602542002201236024c200241003602482002200241386a360250200241003602e801200242013703e0014101102a210102400240200f0d002001450d0f200141003a000020024281808080103702e401200220013602e001200141014109102e2201450d0f200120093700012002428980808090013702e401200220013602e0010c010b2001450d0e200141013a000020024281808080103702e401200220013602e0012009a72201200241e0016a10670240024020022802e401221420022802e80122006b2001490d0020022802e00121140c010b200020016a22152000490d10201441017422122015201220154b1b22154100480d100240024020140d002015102a21140c010b20022802e00120142015102e21140b2014450d0f200220153602e401200220143602e0010b2002200020016a3602e801201420006a2018200110db051a0b200241d0016a41086a200241e0016a41086a280200360200200220022903e0013703d001200241c8006a200241d0016a10aa022002200f3a0045200241003a00442009211b200f450d02200241e0016a41086a200241386a41086a290300370300200220022903383703e0010c0c0b412d210141e9abc20021000b200220003602482002200136024c41c7acc2004122200241c8006a41ecacc200103b000b200e28029801210f0b0240200f4104470d00200e41a4016a280200410b490d000240024020022d0045450d00413121014196acc20021000c010b2002280238200228023c200228024010c0032002420037023c200241d0e1c100360238200242f5dc8de3d6ec9c98303703d00141002101200241e0016a410272410041da0010da051a200241c8006a410041840110da051a41e401102a2215450d0b20154100360200201541046a200241e0016a41dc0010db051a201541e0006a200241c8006a41840110db051a2002410036023c2002201536023820152f010622114103742112417f2100024002400340024020122001470d00201121000c020b200241d0016a201520016a41086a410810dd052214450d02200141086a2101200041016a21002014417f4a0d000b0b200242f5dc8de3d6ec9c983037025c2002200a360258200220003602542002201536024c200241003602482002200241386a360250200241003602e801200242013703e0014101102a2201450d0c200141003a000020024281808080103702e401200220013602e001410f200241e0016a10670240024020022802e401221420022802e80122016b410f490d002001410f6a210020022802e00121140c010b2001410f6a22002001490d0e201441017422152000201520004b1b22154100480d0e0240024020140d002015102a21140c010b20022802e00120142015102e21140b2014450d0d200220153602e401200220143602e0010b200220003602e801201420016a220141002900e4ec41370000200141076a41002900ebec41370000200241d0016a41086a20022802e801360200200220022903e0013703d001200241c8006a200241d0016a10aa0220024180023b0144200241e0016a41086a200241386a41086a290300370300200220022903383703e0010c0b0b412d210141e9abc20021000b200220003602482002200136024c41c7acc2004122200241c8006a41ecacc200103b000b200e41a8026a220e200b470d010c070b0b200141033a0000200241013602bc022000417f6a41034b0d01200041017422144105201441054b1b22144100480d080b200120002014102e2201450d06200220013602e001201421000b20012011360001410521140c020b0240200041034b0d00200041017422144104201441044b1b22144100480d06200120002014102e2201450d05200220013602e001201421000b20012011410274410272360000410421140c010b0240200041014b0d0020012000200041017422144102201441024b1b2214102e2201450d04200220013602e001201421000b41022114200120114102744101723b00000b200220143602bc0202400240200020146b2011490d00200021150c010b201420116a22152014490d04200041017422122015201220154b1b22154100480d04200120002015102e2201450d03200220013602e0010b2002201420116a3602bc02200120146a2013201110db051a200220153602d401200220022802e0013602d001200220022802bc023602d801200241c8006a200241d0016a10aa0220024180023b0144200241e0016a41086a200241386a41086a290300370300200220022903383703e0010c010b200241e0016a41086a200a290300370300200220022903383703e0010b2002280228200228022c200228023010c00302402007450d00200741246c21002003210103400240024020012d0000221441034b0d0002400240024020140e0404000102040b2001410c6a280200450d03200141086a280200102c0c030b2001410c6a280200450d02200141086a280200102c0c020b2001410c6a280200450d01200141086a280200102c0c010b200141086a280200450d00200141046a280200102c0b200141246a21012000415c6a22000d000b0b02402008450d002003102c0b02402004450d00200441a8026c210020064198016a2101034020011073200141a8026a2101200041d87d6a22000d000b0b02402005450d002006102c0b200241003602502002420137034820022d00ec0121004101102a2201450d002002410136024c20022002280250221441016a36025020022001360248200120146a20003a000020022d00ed01211402400240200228024c20022802502201460d00200228024821000c010b200141016a22002001490d02200141017422152000201520004b1b22154100480d020240024020010d002015102a21000c010b200228024820012015102e21000b2000450d012002201536024c20022000360248200228025021010b2002200141016a360250200020016a20143a000020022802e801200241c8006a106720022802e00122142100024020022802e4012215450d002015210120142100034020002802e40121002001417f6a22010d000b0b0240024020022802e80122130d00410021010c010b200241e0016a211041002115034002400240201520002f01064f0d0020002015410c6c6a41e0006a2112200020154103746a41086a2101201541016a21150c010b02400240200028020022010d00201b428080808070832010ad84211b41002114410021010c010b20003301044220862010ad84211b410121140b201b2116201b21090240201b422088a7220020012f0106490d0003402009221642ffffffff0f832109201441016a211420012f01042200200128020022012f01064f0d000b0b20012000410c6c6a2115200120004103746a2111200041027420016a41e8016a28020021002016a7211002402014417f6a2201450d00034020002802e40121002001417f6a22010d000b0b201541e0006a2112201141086a2101410021150b20012d0000210e02400240200228024c20022802502214460d00200228024821110c010b201441016a22112014490d042014410174220f2011200f20114b1b220f4100480d040240024020140d00200f102a21110c010b20022802482014200f102e21110b2011450d032002200f36024c20022011360248200228025021140b2002201441016a360250201120146a200e3a000020012d0001210e02400240200228024c20022802502214460d00200228024821110c010b201441016a22112014490d042014410174220f2011200f20114b1b220f4100480d040240024020140d00200f102a21110c010b20022802482014200f102e21110b2011450d032002200f36024c20022011360248200228025021140b2002201441016a360250201120146a200e3a000020012d0002210e02400240200228024c20022802502214460d00200228024821110c010b201441016a22112014490d042014410174220f2011200f20114b1b220f4100480d040240024020140d00200f102a21110c010b20022802482014200f102e21110b2011450d032002200f36024c20022011360248200228025021140b2002201441016a360250201120146a200e3a000020012d0003210e02400240200228024c20022802502214460d00200228024821110c010b201441016a22112014490d042014410174220f2011200f20114b1b220f4100480d040240024020140d00200f102a21110c010b20022802482014200f102e21110b2011450d032002200f36024c20022011360248200228025021140b2002201441016a360250201120146a200e3a000020012d0004210e02400240200228024c20022802502214460d00200228024821110c010b201441016a22112014490d042014410174220f2011200f20114b1b220f4100480d040240024020140d00200f102a21110c010b20022802482014200f102e21110b2011450d032002200f36024c20022011360248200228025021140b2002201441016a360250201120146a200e3a000020012d0005210e02400240200228024c20022802502214460d00200228024821110c010b201441016a22112014490d042014410174220f2011200f20114b1b220f4100480d040240024020140d00200f102a21110c010b20022802482014200f102e21110b2011450d032002200f36024c20022011360248200228025021140b2002201441016a360250201120146a200e3a000020012d0006210e02400240200228024c20022802502214460d00200228024821110c010b201441016a22112014490d042014410174220f2011200f20114b1b220f4100480d040240024020140d00200f102a21110c010b20022802482014200f102e21110b2011450d032002200f36024c20022011360248200228025021140b2002201441016a360250201120146a200e3a000020012d0007211102400240200228024c20022802502201460d00200228024821140c010b200141016a22142001490d042001410174220e2014200e20144b1b220e4100480d040240024020010d00200e102a21140c010b20022802482001200e102e21140b2014450d032002200e36024c20022014360248200228025021010b2002200141016a360250201420016a20113a00002012280200211120122802082201200241c8006a106702400240200228024c2212200228025022146b2001490d00200228024821120c010b201420016a220e2014490d0420124101742214200e2014200e4b1b22144100480d040240024020120d002014102a21120c010b200228024820122014102e21120b2012450d032002201436024c20022012360248200228025021140b2002201420016a360250201220146a2011200110db051a2013417f6a22130d000b20022802e801210120022802e401211520022802e00121140b200235024821092002350250211620142015200110c003200241c0026a240020092016422086840f0b1033000b1035000b5702017f027e230041306b2202240020024101410010b00220024100360228200242013703202002200241206a36022c20022002412c6a1094022002350228210320023502202104200241306a240020042003422086840b9a4205077f027e027f047e067f230041a00d6b22022400024002402001450d00200220003602380c010b200241013602380b2002200136023c200241b0076a200241386a108c02024002400240024002400240024002402002290398084203510d00200241f8006a200241b0076a41a80210db051a200241a0036a200241f8006a41a80210db051a2002200241a0036a3602c805200241b0076a200241c8056a10870120022802b8072103024020022802b407450d0020022802b007102c0b200241b0076a200241a0036a41a80210db051a200241c8056a200241b0076a10900241012100024020022d00c8054101470d00200220022d00cb053a0043200220022f00c9053b0041200241013a00400c060b200241b0076a200241c8056a41086a220141e00110db051a200241d8096a20024180086a220410ed020240024020022903d0074202520d00200241c0006a41206a22014200370300200241c0006a41186a22004280808080c000370300200241013a0068200242043703502002427f37034820024200370340200241c8056a41206a22034200370300200241c8056a41186a22054280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241c00a6a200241c0006a200241c8056a10c503200241c0006a41286a2206200241c00a6a41286a2903003703002001200241c00a6a41206a2903003703002000200241c00a6a41186a290300370300200241c0006a41106a2207200241c00a6a41106a290300370300200241c0006a41086a2208200241c00a6a41086a290300370300200220022903c00a3703402003420037030020054280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241f00a6a200241c0006a200241c8056a10c5032006200241f00a6a41286a2903003703002001200241f00a6a41206a2903003703002000200241f00a6a41186a2903003703002007200241f00a6a41106a2903003703002008200241f00a6a41086a290300370300200220022903f00a3703402003420037030020054280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241a00b6a200241c0006a200241c8056a10c5032006200241a00b6a41286a2903003703002001200241a00b6a41206a2903003703002000200241a00b6a41186a2903003703002007200241a00b6a41106a2903003703002008200241a00b6a41086a290300370300200220022903a00b3703402003420037030020054280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241e00b6a200241c0006a200241c8056a10c5032006200241e00b6a41286a2903003703002001200241e00b6a41206a2903003703002000200241e00b6a41186a2903003703002007200241e00b6a41106a2903003703002008200241e00b6a41086a290300370300200220022903e00b3703402003420037030020054280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241900c6a200241c0006a200241c8056a10c5032006200241900c6a41286a2903003703002001200241900c6a41206a2903003703002000200241900c6a41186a2903003703002007200241900c6a41106a2903003703002008200241900c6a41086a290300370300200220022903900c3703402003420037030020054280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241c00c6a200241c0006a200241c8056a10c5032006200241c00c6a41286a2903003703002001200241c00c6a41206a2903003703002000200241c00c6a41186a2903003703002007200241c00c6a41106a2903003703002008200241c00c6a41086a290300370300200220022903c00c3703402003420037030020054280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241f00c6a200241c0006a200241c8056a10c5032002419c0a6a2200200241f00c6a41086a290300370200200220022903f00c3702940a200241840d6a2802002107200241f00c6a41186a2802002101200241f00c6a41206a2802002108200241940d6a280200210320022802800d2105200228028c0d210620022903980d2109200241e0096a41086a2000290200370300200220022902940a3703e0092002280280084113460d01200241003a00cb05418102210020024181023b00c905200241013a00c8050c050b20022903d809210a200241c0006a41206a22054200370300200241c0006a41186a22064280808080c000370300200241013a006820024204370350427f21092002427f37034820024200370340200241c8056a41206a22074200370300200241c8056a41186a22004280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241e0096a200241c0006a200241c8056a10c503200241c0006a41286a2208200241e0096a41286a2903003703002005200241e0096a41206a2903003703002006200241e0096a41186a290300370300200241c0006a41106a220b200241e0096a41106a290300370300200241c0006a41086a220c200241e0096a41086a290300370300200220022903e0093703402007420037030020004280808080c000370300200241013a00f005200242043703d8052002427f3703d005200242003703c805200241900a6a200241c0006a200241c8056a10c5032008200241900a6a41286a2903003703002005200241900a6a41206a2903003703002006200241900a6a41186a290300370300200b200241900a6a41106a290300370300200c200241900a6a41086a290300370300200220022903900a37034020004200370300200241c8056a41106a2208420037030020014200370300200242003703c805200241900c6a41086a22054191b0c200ad4280808080e00084220d1002220641086a290000370300200220062900003703900c2006102c20012005290300370300200220022903900c3703c805200541acb0c200ad4280808080e000841002220641086a290000370300200220062900003703900c2006102c200820022903900c220e370300200241f00c6a41086a2001290300370300200241f00c6a41106a2201200e370300200241f00c6a41186a220620052903003703002002200e3703c00c200220022903c8053703f00c200241306a200241f00c6a41201094012002280234410020022802301bad210e024020022903d0074201520d0020022903d80722094200510d03200e200241e0076a290300220f200f200e541b221020097c2010200f7d2009827d21090b2007420037030020004280808080c000370300200241013a00f005200242043703d805200242003703c805200242002009200e7d220e200e2009561b3703d005200241c00a6a200241c0006a200241c8056a10c503200241f00c6a41286a200241c00a6a41286a290300370300200241f00c6a41206a200241c00a6a41206a2903003703002006200241c00a6a41186a2903003703002001200241c00a6a41106a290300370300200241f00c6a41086a200241c00a6a41086a290300370300200220022903c00a3703f00c20022802f8072100200241900c6a41086a2201200d1002220541086a290000370300200220052900003703900c2005102c200241c0006a41086a22062001290300370300200220022903900c37034020014197b0c200ad4280808080c001841002220541086a290000370300200220052900003703900c2005102c200241e00b6a41086a22052001290300370300200220022903900c3703e00b200241c00c6a200241b0076a109f0141c000102a2201450d0720012002290340370000200120022903e00b370010200120022900c00c370020200141086a2006290300370000200141186a2005290300370000200141286a200241c00c6a41086a290000370000200141306a200241d00c6a290000370000200141386a200241c00c6a41186a290000370000200241286a200141c000109401200228022c2105200228022821062001102c02402005410020061b220720004d0d00200220022800a00b3602d80b2002200241a30b6a2800003600db0b200241003a004320024180063b0041200241013a004020022802800d21030240200241f00c6a41186a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b0240200241840d6a280200450d002003102c0b200228028c0d21030240200241940d6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b200241900d6a280200450d062003102c0c060b410c102a2205450d074104102a2201450d072002420437024420022001360240200241b0076a200241c0006a1091010240024020022802442206200228024822016b4104490d00200228024021080c010b200141046a22082001490d09200641017422012008200120084b1b22014100480d090240024020060d002001102a21080c010b200228024020062001102e21080b2008450d082002200136024420022008360240200228024821010b410421062002200141046a360248200820016a2000360000200241c00c6a41086a2208200228024822013602002002200229034022093703c00c200541086a20013602002005200937020041002101200720004f0d03410c102a2206450d074104102a2201450d072002420437024420022001360240200241b0076a200241c0006a1091010240024020022802442207200228024822016b4104490d00200228024021070c010b200141046a220b2001490d0920074101742201200b2001200b4b1b22014100480d090240024020070d002001102a21070c010b200228024020072001102e21070b2007450d082002200136024420022007360240200228024821010b2002200141046a360248200720016a2000417f6a360000200241c00c6a41086a200228024822013602002002200229034022093703c00c200641086a200136020020062009370200410121010c030b200241c8056a20024184086a10c603024020022d00c8054101470d0020022f00c90520022d00cb054110747221000c040b200241900c6a41286a2200200241c8056a41306a290300370300200241900c6a41206a220b200241c8056a41286a220c290300370300200241900c6a41186a2211200241c8056a41206a2212290300370300200241900c6a41106a2213200241c8056a41186a2214290300370300200241900c6a41086a2215200241c8056a41106a2216290300370300200220022903d0053703900c200241f00c6a41086a200241e0096a41086a290300370300200241940d6a2003360200200241f00c6a41206a2008360200200241f00c6a41186a2001360200200241840d6a2007360200200220022903e0093703f00c200220093703980d2002200636028c0d200220053602800d200c20002903003703002012200b2903003703002014201129030037030020162013290300370300200241c8056a41086a2015290300370300200220022903900c3703c805200241c00c6a200241f00c6a200241c8056a10c503200241c0006a41086a20022903c00c370300200241c0006a41106a200241c00c6a41086a290300370300200241c0006a41186a200241c00c6a41106a290300370300200241c0006a41206a200241c00c6a41186a290300370300200241c0006a41286a200241c00c6a41206a290300370300200241c0006a41306a200241c00c6a41286a290300370300200241003a00400c040b20024184016a4104360200200241b4036a4102360200200242023702a40320024184adc2003602a0032002410436027c200241e8aec200360278200241003602cc05200241dc9ec6003602c8052002200241f8006a3602b0032002200241c8056a36028001200241a0036a4194adc2001041000b41c090c600411941dc90c6001036000b200241c8056a41206a428180808010370300200241c8056a41186a2001360200200241dc056a2001360200200220022800a00b3602d80b2002200241a00b6a41036a2800003600db0b200241f4056a20022800db0b360000200241013a00f005200220053602e405200220063602d8052002427f3703d0052002200a42ffffffff0f833703c805200220022802d80b3600f105200241f00a6a200241f00c6a200241c8056a10c503200241f00c6a41286a200241f00a6a41286a290300370300200241f00c6a41206a200241f00a6a41206a290300370300200241f00c6a41186a2207200241f00a6a41186a290300370300200241f00c6a41106a200241f00a6a41106a290300370300200241f00c6a41086a200241f00a6a41086a290300370300200220022903f00a3703f00c200241c0006a41186a220b4200370300200241c0006a41106a22064200370300200241c0006a41086a2200420037030020024200370340200241900c6a41086a22014191b0c200ad4280808080e00084220e1002220541086a290000370300200220052900003703900c2005102c20002001290300370300200220022903900c37034020014184c3c200ad42808080808002841002220541086a290000370300200220052900003703900c2005102c200620022903900c220937030020082000290300370300200241c00c6a41106a22002009370300200241c00c6a41186a22082001290300370300200220093703e00b200220022903403703c00c200241206a200241c00c6a41201094010240417f2002280224410020022802201b220120036a220520052001491b4280808080f28ba80942808080c0f588fe06200a422088a7221141ff017122051b22092009428094ebdc038022094280ec94a37c7e7c4280cab5ee01562009a76a4b0d002008420037030020004200370300200241c00c6a41086a22084200370300200242003703c00c200241900c6a41086a2201200e1002220c41086a2900003703002002200c2900003703900c200c102c20082001290300370300200220022903900c2209370340200220093703c00c200141e0c2c200ad4280808080b002841002220c41086a2900003703002002200c2900003703900c200c102c200020022903900c2209370300200241c0006a41086a200829030037030020062009370300200b2001290300370300200220093703e00b200220022903c00c370340200241186a200241c0006a4120109401417f200228021c410020022802181b2206418094ebdc034180afd0e50220051b2201200aa7220020012000491b6a220520052006491b20014b0d00200241c8056a41206a22014200370300200241c8056a41186a22054280808080c000370300200220022800d80b3602d00b2002200241d80b6a41036a2800003600d30b200241f4056a220620022800d30b360000200242043703d805200241013a00f0052002427f3703d0052002427f200a42ffffffff0f83201141ff01714101461b3703c805200220022802d00b3600f105200241a00b6a200241f00c6a200241c8056a10c503200241f00c6a41286a200241a00b6a41286a290300370300200241f00c6a41206a200241a00b6a41206a290300370300200241f00c6a41186a2207200241a00b6a41186a290300370300200241f00c6a41106a200241a00b6a41106a290300370300200241f00c6a41086a200241a00b6a41086a290300370300200220022903a00b3703f00c200241086a20032000200a422888a720022903e8072209200241f0076a290300220e10ac02200241c00c6a200241b0076a2002290308220a200241086a41086a290300220d410141112009200e84501b10ac01024020022802c00c4101470d00200241003a004320024180023b0041200241013a004020022802800d2103024020072802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b0240200241840d6a280200450d002003102c0b200228028c0d21030240200241940d6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b200241900d6a280200450d032003102c0c030b20022903c80c200241c00c6a41106a22002903001085032001420037030020054280808080c0003703002006200241900c6a41036a280000360000200242043703d805200220022800900c3600f1052002427f3703d0052002200a427f200d501b3703c805200241013a00f005200241e00b6a200241f00c6a200241c8056a10c503200241c00c6a41286a200241e00b6a41286a290300370300200241c00c6a41206a200241e00b6a41206a290300370300200241c00c6a41186a200241e00b6a41186a2903003703002000200241e00b6a41106a290300370300200241c00c6a41086a200241e00b6a41086a290300370300200220022903e00b3703c00c200241c8056a200410c703024020022d00c8054101470d00200220022d00cb053a0043200220022f00c9053b0041200241013a004020022802d00c21030240200241d80c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b0240200241d40c6a280200450d002003102c0b20022802dc0c21030240200241e40c6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b200241e00c6a280200450d032003102c0c030b200241f00c6a41286a200241c8056a41306a290300370300200241f00c6a41206a200241c8056a41286a290300370300200241f00c6a41186a200241c8056a41206a290300370300200241f00c6a41106a200241c8056a41186a290300370300200241f00c6a41086a200241c8056a41106a290300370300200220022903d0053703f00c200241900c6a200241c00c6a200241f00c6a10c503200241c0006a41086a20022903900c370300200241c0006a41106a200241900c6a41086a290300370300200241c0006a41186a200241900c6a41106a290300370300200241c0006a41206a200241900c6a41186a290300370300200241c0006a41286a200241900c6a41206a290300370300200241c0006a41306a200241900c6a41286a290300370300200241003a00400c020b200220022800d80b3602d00b2002200241d80b6a41036a2800003600d30b200241003a0043200241800c3b0041200241013a004020022802800d2103024020072802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b0240200241840d6a280200450d002003102c0b200228028c0d21030240200241940d6a2802002201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b200241900d6a280200450d012003102c0c010b200241013a0040200220003b0041200220004110763a004302402001450d002001410c6c21002005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b02402007450d002005102c0b02402003450d002003410c6c21002006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b2008450d002006102c0b200410920220022d004021000b4101102a2201450d00200242013702b407200220013602b00702400240200041ff01714101460d00200241013602b807200141003a0000200241c8006a2903002109024020022802b4072200417f6a41074b0d00200041017422034109200341094b1b22034100480d04200120002003102e2201450d03200220033602b407200220013602b0070b200241093602b80720012009370001200241d8006a2802002100200241e0006a2802002201200241b0076a106702402001450d0020002001410c6c6a2108034020002802002106200041086a2802002201200241b0076a10670240024020022802b407220520022802b80722036b2001490d0020022802b00721050c010b200320016a22072003490d06200541017422042007200420074b1b22074100480d060240024020050d002007102a21050c010b20022802b00720052007102e21050b2005450d05200220073602b407200220053602b0070b2002200320016a3602b807200520036a2006200110db051a2000410c6a22002008470d000b0b200241e4006a2802002100200241ec006a2802002201200241b0076a10670240024020010d0020022802b407210620022802b80721080c010b20002001410c6c6a2104034020002802002107200041086a2802002201200241b0076a10670240024020022802b407220620022802b80722036b2001490d0020022802b00721050c010b200320016a22052003490d06200641017422082005200820054b1b22084100480d060240024020060d002008102a21050c010b20022802b00720062008102e21050b2005450d05200220083602b407200220053602b007200821060b2002200320016a22083602b807200520036a2007200110db051a2000410c6a22002004470d000b0b200241d0006a290300210902400240200620086b4108490d0020022802b00721010c010b200841086a22012008490d04200641017422002001200020014b1b22004100480d040240024020060d002000102a21010c010b20022802b00720062000102e21010b2001450d03200220003602b407200220013602b0070b2002200841086a3602b807200120086a2009370000200241f0006a2d00002105024020022802b40720022802b8072200470d00200041016a22032000490d04200041017422062003200620034b1b22034100480d040240024020000d002003102a21010c010b200120002003102e21010b2001450d03200220033602b407200220013602b0070b2002200041016a22033602b807200120006a20053a00000c010b200241013602b807200141013a0000200241c0006a410172200241b0076a10ba0320022802b807210320022802b00721010b2003ad4220862001ad842109024020022d00400d000240200241e0006a2802002200450d00200241d8006a28020021012000410c6c210003400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b0240200241dc006a280200450d002002280258102c0b0240200241ec006a2802002200450d00200241e4006a28020021012000410c6c210003400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b200241e8006a280200450d002002280264102c0b200241a00d6a240020090f0b1033000b1035000bc60505017f027e077f017e017f230041206b220324002002290300210420012903002105200141106a210620022802102107024002400240024002400240200141146a2802002208200141186a28020022096b200241186a280200220a490d00200628020021080c010b2009200a6a220b2009490d022008410174220c200b200c200b4b1b220bad420c7e220d422088a70d02200da7220c4100480d020240024020080d00200c102a21080c010b20062802002008410c6c200c102e21080b2008450d0120012008360210200141146a200b3602000b20082009410c6c6a2007200a410c6c10db051a200141186a2009200a6a36020020024100360218200341086a200641086a280200360200200320062902003703002001411c6a2106200228021c210b02400240200141206a2802002208200141246a28020022096b200241246a280200220a490d00200628020021080c010b2009200a6a220c2009490d022008410174220e200c200e200c4b1b220cad420c7e220d422088a70d02200da7220e4100480d020240024020080d00200e102a21080c010b20062802002008410c6c200e102e21080b2008450d012001200836021c200141206a200c3602000b427f200520047c220420042005541b210520082009410c6c6a200b200a410c6c10db051a200141246a2009200a6a36020020024100360224200341106a41086a200641086a28020036020020032006290200370310200229030822042001290308220d200d2004561b210420012d0028450d024101210120022d0028450d020c030b1033000b1035000b410021010b20002005370300200020032903003702102000200329031037021c200020013a002820002004370308200041186a200341086a280200360200200041246a200341106a41086a2802003602000240200241146a280200450d002007102c0b0240200241206a280200450d00200b102c0b200341206a24000bb91005067f017e017f017e067f230041f0006b2202240020012802202103200241306a41186a4200370300200241306a41106a22044200370300200241306a41086a2205420037030020024200370330200241e0006a41086a220641ecddc500ad4280808080f000841002220741086a290000370300200220072900003703602007102c2005200629030037030020022002290360370330200641c9f8c200ad4280808080a001841002220741086a290000370300200220072900003703602007102c200420022903602208370300200241106a41086a2005290300370300200241106a41106a2008370300200241106a41186a20062903003703002002200837035020022002290330370310200241306a200241106a412010d00120022802302206410120061b2105024002400240024002400240024002400240024020032002290234420020061b2208422088a7490d002008a7450d012005102c0c010b2003200520034105746a10cb03210602402008a7450d002005102c0b20060d010b200241306a41186a22054200370300200241306a41106a22074200370300200241306a41086a2203420037030020024200370330200241e0006a41086a220641ecddc500ad4280808080f000841002220941086a290000370300200220092900003703602009102c2003200629030037030020022002290360370330200641f3ddc500ad4280808080c001841002220941086a290000370300200220092900003703602009102c200241d0006a41086a22092006290300220837030020022002290360220a3703502004200a370000200441086a220b2008370000200241106a41086a220c2003290300370300200241106a41106a220d2007290300370300200241106a41186a220e200529030037030020022002290330370310200241086a200241106a4120109401200128021c200228020c410020022802081b220f470d0120054200370300200742003703002003420037030020024200370330200641a3dbc500ad42808080808001841002221041086a290000370300200220102900003703602010102c2003200629030037030020022002290360370330200641a0c6c500ad4280808080c000841002221041086a290000370300200220102900003703602010102c20092006290300220837030020022002290360220a3703502004200a370000200b2008370000200c2003290300370300200d2007290300370300200e200529030037030020022002290330370310200241306a200241106a10f00220022802302206410120061b210d200128022022032002290234420020061b2208422088a74f0d03200d20034105746a220e450d032002410036023820024201370330200128020021044104102a22060d020c070b20004180063b0001200041013a0000200041036a41003a00000c050b20004180063b0001200041013a0000200041036a41003a00000c040b20024284808080c0003702342002200636023020062004360000200128020421072001410c6a2802002206200241306a10670240024020022802342205200228023822046b2006490d00200228023021050c010b200420066a22092004490d032005410174220b2009200b20094b1b22094100480d030240024020050d002009102a21050c010b200228023020052009102e21050b2005450d0520022009360234200220053602300b2002200420066a360238200520046a2007200610db051a200141106a2802002104200141186a2802002206200241306a10670240024020060d002002280234210520022802382109200f21070c010b20042006410c6c6a210c03402004280200210b200441086a2802002206200241306a10670240024020022802342205200228023822036b2006490d00200228023021070c010b200320066a22072003490d05200541017422092007200920074b1b22094100480d050240024020050d002009102a21070c010b200228023020052009102e21070b2007450d072002200936023420022007360230200921050b2002200320066a2209360238200720036a200b200610db051a2004410c6a2204200c470d000b20012802202103200128021c21070b02400240200520096b4104490d00200941046a2104200228023021060c010b200941046a22042009490d03200541017422062004200620044b1b220b4100480d030240024020050d00200b102a21060c010b20022802302005200b102e21060b2006450d052002200b36023420022006360230200b21050b20022004360238200620096a200736000002400240200520046b41034d0d00200521070c010b200441046a22072004490d03200541017422092007200920074b1b22074100480d030240024020050d002007102a21060c010b200620052007102e21060b2006450d0520022007360234200220063602300b200620046a2003360000200141246a200441046aad4220862006ad84200e100c210402402007450d002006102c0b20044101460d010b20004180083b0001200041013a0000200041036a41003a00002008a7450d02200d102c0c020b410c102a2206450d024104102a2204450d0220024284808080c000370234200220043602302004200f360000200e200241306a109101200241106a41086a2002280238220436020020022002290330220a370310200641086a20043602002006200a370200200041306a41013a0000200041286a428180808010370200200041246a2006360200200041206a4100360200200041186a4204370300200041106a42e400370300200041086a427f370300200041316a2002280030360000200041346a200241336a280000360000200041003a00002008a7450d01200d102c0c010b1035000b200241f0006a24000f0b1033000bbd0502057f017e230041f0006b220224000240024020012802004111460d00200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a42003703000c010b024002400240024002400240200141086a2d00000e06050402010004050b200141c8006a21030c020b200141d0006a21030c010b200141186a21030b200241306a41186a4200370300200241306a41106a22044200370300200241306a41086a2205420037030020024200370330200241e0006a41086a220141e4d2c500ad42808080808001841002220641086a290000370300200220062900003703602006102c2005200129030037030020022002290360370330200141ecd2c500ad42808080808001841002220641086a290000370300200220062900003703602006102c200420022903602207370300200241106a41086a2005290300370300200241106a41106a2007370300200241106a41186a200129030037030020022007370350200220022903303703102002200241106a109801024020032903004280ade20420022903087d4280ade20420022802001b560d00200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a42003703000c030b200041800c3b0001200041013a0000200041036a41003a00000c020b200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a42003703000c010b200241c4006a410136020020024201370234200241fcc4c50036023020024104360214200241a4ebc3003602102002200241106a360240200241306a4184c5c5001041000b200241f0006a24000bd13b07047f017e047f017e037f027e1a7f230041e0036b2202240002400240024002400240024002400240024020014104490d0020002800002103410041002802dca1462200410120001b3602dca1460240200041014b0d000240024020000e020001000b4100419cb0c0003602e4a146410041dc9ec6003602e0a146410041023602dca1460c010b034041002802dca1464101460d000b0b10164101470d06200241a0016a41186a4200370300200241a0016a41106a22044200370300200241a0016a41086a22014200370300200242003703a001200241206a41086a220041a3dbc500ad42808080808001841002220541086a290000370300200220052900003703202005102c20012000290300370300200220022903203703a00120004187a6c500ad42808080808001841002220541086a290000370300200220052900003703202005102c200420022903202206370300200241e0006a41086a2001290300370300200241e0006a41106a2006370300200241e0006a41186a2000290300370300200220063703c803200220022903a001370360200241106a200241e0006a4120109401200228021421002002280210210141002105200241a0016a41004190aac500ad4280808080e003841017108d012000410020011b21010240024020022802a00122000d00410121040c010b20022902a4012206422088a72205450d0320002d0000220441014b0d032005417f6a2105410021070240024020040e020100010b410121070b20054104490d032000280001210502400240024020070d0020052003460d0141002104200520034f0d02410121040c020b4101210420052001490d010b410021040b200021050b200120034f0d012004450d014101102a2200450d07200041003a0000200041014105102e2200450d07200020033600012002200536026020022006370264200241a0016a200241e0006a10c90320022802a401210141004190aac500ad4280808080e0038420023502a80142208620022802a0012207ad842000ad4280808080d000841018210402402001450d002007102c0b02402005450d002006a7450d002005102c0b2000102c4101210820044101470d0620022003360218200241a0016a41186a4200370300200241a0016a41106a22094200370300200241a0016a41086a22014200370300200242003703a001200241206a41086a220041a3dbc500ad42808080808001841002220541086a290000370300200220052900003703202005102c20012000290300370300200220022903203703a001200041a0c6c500ad4280808080c000841002220541086a290000370300200220052900003703202005102c200920022903202206370300200241e0006a41086a2001290300370300200241e0006a41106a2006370300200241e0006a41186a2000290300370300200220063703c803200220022903a001370360200241a0016a200241e0006a10f00220022802a001210a20022902a401210b200241a0016a41e9dabdf30610ca0320022802a001210320022802a40121070240024020022802a80122000d004100210c4100210d0c010b20004105742201410575220c41ffffff3f71200c470d09200c41057422054100480d092005102a2208450d08200320016a210e20004105742104410021000340200320006a22012900002106200141086a290000210f200141106a2900002110200820006a220541186a200141186a290000370000200541106a2010370000200541086a200f370000200520063700002004200041206a2200470d000b200e20036b41606a41057641016a210d0b02402007450d002003102c0b200d4115490d0402404101450d00200d41017622114105742200417f4c0d002000102a2212450d08200841606a2113200841a07f6a211441042115410021164100211741002118200d2119034020192107410021194101210402402007417f6a2205450d00024002400240024002400240200820054105746a2007410574220e20086a41406a412010dd054100480d002007417e6a21032014200e6a210041002119410021010340024020032001470d00200721040c080b200141016a2101200041206a2000412010dd052105200041606a21002005417f4a0d000b200141016a21042001417f7320076a21050c010b2014200e6a210002400340024020054101470d00410021050c020b2005417f6a2105200041206a2000412010dd052101200041606a210020014100480d000b0b20072005490d012007200d4b0d03200720056b22044101762203450d002013200e6a2100200820054105746a21010340200241a0016a41186a220e200141186a221a290000370300200241a0016a41106a221b200141106a221c290000370300200241a0016a41086a221d200141086a221e290000370300200220012900003703a001200041086a221f2900002106200041106a2220290000210f200041186a2219290000211020012000290000370000201a2010370000201c200f370000201e20063700002019200e2903003700002020201b290300370000201f201d290300370000200020022903a001370000200041606a2100200141206a21012003417f6a22030d000b0b024020050d00200521190c050b0240200441094d0d00200521190c050b2007200d4b0d01200720056b2103200820054105746a210e034020072005417f6a2219490d040240200720196b22044102490d00200820054105746a2200200820194105746a2205412010dd05417f4a0d00200241a0016a41186a221d200541186a2201290000370300200241a0016a41106a221e200541106a221a290000370300200241a0016a41086a221f200541086a221b290000370300200220052900003703a00120052000290000370000201b200041086a290000370000201a200041106a2900003700002001200041186a2900003700004101211c024020044103490d00200541c0006a200241a0016a412010dd05417f4a0d0041022101200e210002400340200041186a200041386a290000370000200041106a200041306a290000370000200041086a200041286a2900003700002000200041206a221a29000037000020032001460d01200041c0006a211b2001211c201a2100200141016a2101201b200241a0016a412010dd05417f4a0d020c000b0b2001211c0b2005201c4105746a220020022903a001370000200041186a201d290300370000200041106a201e290300370000200041086a201f2903003700000b2019450d05200e41606a210e200341016a2103201921052004410a4f0d050c000b0b200520071047000b20072005417f6a2219490d010b2007200d103f000b201920071047000b024020182016470d00201641016a22002016490d0b201641017422012000200120004b1b220041ffffffff01712000470d0b200041037422014100480d0b0240024020160d002001102a21150c010b201520164103742001102e21150b2015450d0a20002116201721180b201520184103746a2200200436020420002019360200201741016a22182117024020184102490d0002400340024002400240024020152018417f6a22174103746a2200280200450d00201841037420156a220341746a2802002205200028020422014d0d000240201841024b0d0020182117410221182019450d0d0c080b20152018417d6a221d4103746a2802042200200120056a4d0d010240201841034b0d0020182117410321182019450d0d0c080b200341646a280200200020056a4d0d01201821170c060b20184103490d012000280204210120152018417d6a221d4103746a28020421000b20002001490d010b2018417e6a211d0b0240024002400240024002402018201d41016a22214b2222450d002018201d4b2223450d012015201d4103746a221e2802042224201e2802006a2200201520214103746a221f2802002220490d022000200d4b0d03200820204105746a221b201f280204221c41057422016a210320004105742105200020206b2207201c6b2200201c4f0d04201220032000410574220110db05221a20016a210402400240201c4101480d00200041014e0d010b20032100201a21010c060b201320056a21052003210003402005200041606a2203200441606a220720072003412010dd05410048220e1b2201290000370000200541186a200141186a290000370000200541106a200141106a290000370000200541086a200141086a29000037000020042007200e1b21040240201b20032000200e1b2200490d00201a21010c070b200541606a2105201a2101201a2004490d000c060b0b41d087c600202120181038000b41d087c600201d20181038000b202020001047000b2000200d103f000b2012201b200110db05221a20016a210402400240201c4101480d002007201c4a0d010b201b2100201a21010c010b200820056a210e201a2101201b2100034020002003200120032001412010dd0541004822071b2205290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002001200141206a20071b2101200041206a2100200341206a200320071b2203200e4f0d01200420014b0d000b0b20002001200420016b41607110db051a02402023450d00201e2020360200201e41046a2024201c6a3602002022450d02201f201f41086a20182021417f736a41037410dc051a20172118201741014d0d030c010b0b41a888c600201d20181038000b418ab4c000411d41acfec5001036000b2019450d050c000b0b103a000b200241ec006a4104360200200241b4016a4102360200200242023702a40120024184adc2003602a0012002410436026420024184afc20036026020024100360224200241dc9ec6003602202002200241e0006a3602b0012002200241206a360268200241a0016a4194adc2001041000b2000450d042006a7450d042005102c0c040b02402006a7450d002000102c0b41c8dac500ad4280808080d0058410040c030b02402016450d002015102c0b2011450d012012102c0c010b200d4102490d002008200d417f6a22014105746a21044101210503400240024002400240200d20012200417f6a2201490d00200d20016b22074102490d03200820004105746a2200200820014105746a2203412010dd05417f4a0d03200241a0016a41186a2218200341186a220e290000370300200241a0016a41106a221c200341106a221a290000370300200241a0016a41086a2215200341086a221b290000370300200220032900003703a00120032000290000370000201b200041086a290000370000201a200041106a290000370000200e200041186a2900003700004101210020074103490d02200341c0006a200241a0016a412010dd05417f4a0d0241002107200421000340200041186a200041386a290000370000200041106a200041306a290000370000200041086a200041286a2900003700002000200041206a221a29000037000020052007220e460d02200e417f6a2107200041c0006a211b201a2100201b200241a0016a412010dd05417f4a0d020c000b0b2001200d1047000b4102200e6b21000b200320004105746a220020022903a001370000200041186a2018290300370000200041106a201c290300370000200041086a20152903003700000b200441606a21042005417f6a210520010d000b0b41012100200a4101200a1b2119200b4200200a1b2206a721230240024002402006422088a722010d0041002101410021030c010b201920014105746a211b200241b8026a2125200241a0016a410272211f200241e1026a21204100211e4100212141012117410021072019210403400240024002400240200d41014b0d004100210141002103410121000240200d0e020600060b0340200241a0016a41186a200441186a290000370300200241a0016a41106a200441106a290000370300200241a0016a41086a200441086a290000370300200220042900003703a0012008200241a0016a412010dd05450d03200741016a2107201b200441206a2204470d000c020b0b0340200241a0016a41186a200441186a290000370300200241a0016a41106a200441106a290000370300200241a0016a41086a200441086a290000370300200220042900003703a001200441206a21040240200d450d0041002100200d210103402001410176220520006a22032000200820034105746a200241a0016a412010dd054101481b2100200120056b220141014b0d000b200820004105746a200241a0016a412010dd05450d040b200741016a21072004201b470d000b0b201e210120212103201721000c030b200441206a2104410021000b0240200d20004b0d0041d087c6002000200d1038000b2002200736021c200241a0016a41186a22054200370300200241a0016a41106a22034200370300200241a0016a41086a22014200370300200242003703a001200241206a41086a221d41ecddc500ad4280808080f0008422101002220e41086a2900003703002002200e290000370320200e102c2001201d290300370300200220022903203703a001201d41c9f8c200ad4280808080a001841002220e41086a2900003703002002200e290000370320200e102c200241c8036a41086a2218201d290300220637030020022002290320220f3703c8032009200f370000200941086a221c2006370000200241e0006a41086a22122001290300370300200241e0006a41106a22162003290300370300200241e0006a41186a22132005290300370300200220022903a001370360200241a0016a200241e0006a412010d00120022802a001220e4101200e1b211a024002400240200720022902a4014200200e1b2206422088a7490d002006a7450d01201a102c0c010b2007201a20074105746a10cb03210e02402006a7450d00201a102c0b200e0d010b200241a0016a10cc030240024002400240024020022802a001220a450d0020022802b401212420022802b001212620022802ac01211420022802a801212220022802a401212720022802182111200542003703002003420037030020014200370300200242003703a001201d20101002220e41086a2900003703002002200e290000370320200e102c2001201d290300370300200220022903203703a001201d41f3ddc500ad4280808080c001841002220e41086a2900003703002002200e290000370320200e102c2018201d290300220637030020022002290320220f3703c8032009200f370000201c2006370000201220012903003703002016200329030037030020132005290300370300200220022903a001370360200241086a200241e0006a4120109401200228020c212820022802082129200228021c212a200242013703a001200241003602a8014104102a2201450d0a20024284808080c0003702a401200220013602a001200120113600002022200241a0016a10670240024020022802a401220520022802a80122016b2022490d0020022802a00121050c010b200120226a22032001490d0c2005410174220e2003200e20034b1b22034100480d0c0240024020050d002003102a21050c010b20022802a00120052003102e21050b2005450d0b200220033602a401200220053602a0010b2002200120226a3602a801200520016a200a202210db051a2024200241a0016a10672024450d0120142024410c6c6a211520142105034020052802002118200541086a2802002201200241a0016a10670240024020022802a401220e20022802a80122036b2001490d0020022802a001211a0c010b200320016a221a2003490d0d200e410174221c201a201c201a4b1b221c4100480d0d02400240200e0d00201c102a211a0c010b20022802a001200e201c102e211a0b201a450d0c2002201c3602a4012002201a3602a001201c210e0b2002200320016a221c3602a801201a20036a2018200110db051a2005410c6a22052015470d000c030b0b410221050c020b20022802a401210e20022802a801211c0b02400240200e201c6b4104490d0020022802a00121010c010b201c41046a2201201c490d09200e41017422052001200520014b1b22054100480d0902400240200e0d002005102a21010c010b20022802a001200e2005102e21010b2001450d08200220053602a401200220013602a0012005210e0b2002201c41046a22053602a8012001201c6a2028410020291b221a36000002400240200e20056b41034d0d00200e21030c010b200541046a22032005490d09200e41017422182003201820034b1b22034100480d0902400240200e0d002003102a21010c010b2001200e2003102e21010b2001450d08200220033602a401200220013602a0010b200120056a202a360000200241a0016a41e9dabdf306200820004105746a2001201c41086a10cd0320022d00a0014101460d0102402003450d002001102c0b02402027450d00200a102c0b02402024450d002024410c6c21012014210003400240200041046a280200450d002000280200102c0b2000410c6a2100200141746a22010d000b0b410121052026450d002014102c0b4100210102402023450d002019102c0b20212103201721000c040b201d201f41086a290000370300200241206a41106a2200201f41106a290000370300200241206a41186a2205201f41186a290000370300200241206a41206a220e201f41206a290000370300200241206a41286a2218201f41286a290000370300200241206a41306a221c201f41306a290000370300200241206a41376a2215201f41376a2900003700002002201f29000037032020022d00a101212802402003450d002001102c0b200241e0006a41376a22012015290000370000200241e0006a41306a2203201c290300370300200241e0006a41286a221c2018290300370300200241e0006a41206a2218200e29030037030020132005290300370300201620002903003703002012201d29030037030020022002290320370360024041002802d8a1464103490d002002412a3602d4032002412a3602cc032002200241186a3602d00320022002411c6a3602c80341002802e4a146210041002802e0a146210541002802dca146210e200241a7033602e001200242b5808080103703d801200241d8aac5003602d401200242103702cc01200241c8aac5003602c801200242023703c001200242023703b001200241b0aac5003602ac01200241083602a801200241c0aac5003602a401200241033602a001200041d4b3c000200e410246220e1b28021021002002200241c8036a3602bc01200541ecb3c000200e1b200241a0016a20001102000b20202002290360370000202041086a2012290300370000202041106a2016290300370000202041186a2013290300370000202041206a2018290300370000202041286a201c290300370000202041306a2003290300370000202041376a2001290000370000200220283a00e0022002202a3602dc022002201a3602d802200220243602d402200220263602d002200220143602cc02200220223602c802200220273602c4022002200a3602c002200220113602bc02200241133602b80220024202370388022002200241a0016a3602dc03200241c8036a200241dc036a10870120022802c80320022802cc0320022802d00310cf03210020251092020240201e2021470d00201e41016a2201201e490d07201e41017422052001200520014b1b22214100480d0702400240201e0d002021102a21170c010b2017201e2021102e21170b2017450d060b2017201e6a4103410420001b3a0000201e41016a211e0b200741016a2107201e210120212103201721002004201b470d000b0b02402023450d002019102c0b4104210502400240024002402001450d00024020002d00002207417c6a220441014b0d0020040e020201020b200721050b20030d010c020b0240024020014101470d00410421050c010b20002d00012205417c6a220441014b0d0041042105024020040e020001000b4102210403402004450d07024020012004470d00410421050c020b200020046a2107200441016a21044104210520072d000022074104460d000b20074105460d00200721050b2003450d010b2000102c0b4101210120054104470d00200228021821014101102a2200450d02200041013a0000200041014105102e2200450d022000200136000141004190aac500ad4280808080e003842000ad4280808080d0008410192000102c200c450d012008102c0c010b0240200c450d002008102c0b02402001200345720d002000102c0b412e210341f5dac5002100200241c8036a2101024002400240024020050e0400010203000b412d210341c8dac5002100200241206a21010c020b411f210341a9dac5002100200241e0006a21010c010b41fbd9c5002100200241a0016a21010b20012003360204200120003602002003ad4220862000ad8410040b200241e0036a240042010f0b1033000b1035000bff0201067f230041106b220224000240024002400240024002400240200128020022030d00410121040c010b0240200141086a28020041056a2204417f4c0d0020040d0120024100360208200242013703000c020b103a000b2004102a2205450d04200241003602082002200436020420022005360200024020030d00200541003a0000200241013602080c030b20040d010b4101102a2205450d0320024101360204200220053602000b200541013a000020024101360208200141086a2802002204200210670240024020022802042201200228020822056b2004490d00200228020021010c010b200520046a22062005490d02200141017422072006200720064b1b22064100480d020240024020010d002006102a21010c010b200228020020012006102e21010b2001450d0320022006360204200220013602000b2002200520046a360208200120056a2003200410db051a0b20002002290300370200200041086a200241086a280200360200200241106a24000f0b1035000b1033000bfd0403017f017e0a7f230041e0006b220224002002200136020c20022002410c6a102322034220883e0214200220033e02102002200241106a1075024020022802000d0002400240200228021422044160712205417f4c0d002002280204210602400240200441057622010d00410121070c010b2005102a2207450d020b2001ad2103024002402006450d0041002108034020042109200241003a0058200841016a210841002101024002400240034020092001460d01200241386a20016a200228021022052d00003a00002002200541016a3602102002200141016a22053a00582005210120054120470d000b200241186a41186a220a200241386a41186a290300370300200241186a41106a220b200241386a41106a290300370300200241186a41086a220c200241386a41086a290300370300200220022903383703182003a72003422088a72201470d020240200141016a22042001490d002001410174220d20042004200d491b220441ffffff3f712004470d002004410574220d41004e0d020b1035000b200241003602140240200141ff0171450d00200241003a00580b2003a7450d072007102c0c070b0240024020010d00200d102a21070c010b20072001410574200d102e21070b2007450d052003428080808070832004ad8421030b200920056b2104200720014105746a22012002290318370000200141186a200a290300370000200141106a200b290300370000200141086a200c29030037000020034280808080107c210320082006470d000b2002200920056b3602140c010b2007450d030b2000200337020420002007360200200241e0006a24000f0b103a000b1033000b41d88bc600412e200241386a41c88bc600103b000bd90b04067f017e067f017e23004190016b22022400200241f0006a41186a22034200370300200241f0006a41106a22044200370300200241f0006a41086a2205420037030020024200370370200241e0006a41086a220641ecddc500ad4280808080f000841002220741086a290000370300200220072900003703602007102c2005200629030037030020022002290360370370200641f3ddc500ad4280808080c001841002220741086a290000370300200220072900003703602007102c200420022903602208370300200241306a41086a22092005290300370300200241306a41106a220a2008370300200241306a41186a220b20062903003703002002200837035020022002290370370330200241186a200241306a4120109401200228021c210c2002280218210d200641a3dbc500ad42808080808001841002220741086a290000370300200220072900003703602007102c200241206a41086a220e200629030037030020022002290360370320200641abdbc500ad4280808080a002841002220741086a290000370300200220072900003703602007102c200241d0006a41086a22072006290300370300200220022903603703502002200c4100200d1b220c3602602003200241e0006aad220f4280808080c0008422081006220641186a2900003703002004200641106a2900003703002005200641086a290000370300200220062900003703702006102c200b2003290300370300200a20042903003703002009200529030037030020022002290370370330024041c000102a2206450d00200620022903203700002006200229035037001020062002290330370020200641086a200e290300370000200641186a2007290300370000200641286a2009290300370000200641306a200a290300370000200641386a200b29030037000020022000360260200320081006220741186a2900003703002004200741106a2900003703002005200741086a290000370300200220072900003703702007102c200b2003290300370300200a20042903003703002009200529030037030020022002290370370330200641c000418001102e2206450d0020062002290330370040200641d8006a200241306a41186a2203290300370000200641d0006a200241306a41106a2207290300370000200641c8006a200241306a41086a220929030037000041012105200241106a200641e000410141004100109701200228021021042006102c024020044101460d00200241e0006a41086a220641a3dbc500ad42808080808001841002220541086a290000370300200220052900003703602005102c200241206a41086a20062903003703002002200229036037032020064182aac500ad4280808080e001841002220541086a290000370300200220052900003703602005102c200241d0006a41086a2006290300370300200220022903603703502002200c360260200241f0006a41186a2205200f4280808080c000841006220641186a290000370300200241f0006a41106a2204200641106a290000370300200241f0006a41086a220a200641086a290000370300200220062900003703702006102c20032005290300370300200720042903003703002009200a2903003703002002200229037037033041c000102a2206450d01200620022903203700002006200229035037001020062002290330370020200641086a200241206a41086a290300370000200641186a200241d0006a41086a290300370000200641286a200241306a41086a290300370000200641306a200241306a41106a290300370000200641386a200241306a41186a290300370000200241f0006a2001109f01200641c000418001102e2206450d0120062002290070370040200641d8006a200241f0006a41186a290000370000200641d0006a200241f0006a41106a290000370000200641c8006a200241f0006a41086a290000370000200241086a200641e000109401200228020c2105200228020821042006102c200541004720044100477121050b20024190016a240020050f0b1033000bcb0405017f017e0b7f017e017f230041206b22012400200110222202a7220336020820012002422088a7220436020c02402004450d0020032d0000210520012004417f6a36020c2001200341016a360208200541014b0d00024002400240024002400240024020050e020001000b200141106a200141086a107720012802102206450d06200141186a2802002107200128021421082001200141086a107520012802000d05200128020c410c6e2209410c6c2203417f4c0d022001280204210a0240024020030d004104210b0c010b2003102a220b450d040b02400240200a450d004100210c41002104410021050340200141106a200141086a10772001280210220d450d02200541016a210320012902142102024020052009470d00200c2003200c20034b1b2209ad420c7e220e422088a70d08200ea7220f4100480d080240024020050d00200f102a210b0c010b200b2004200f102e210b0b200b450d070b200b20046a2205200d360200200541046a2002370200200c41026a210c2004410c6a210420032105200a2003470d000b0b200b450d0620060d020c070b02402005450d00200b210303400240200341046a280200450d002003280200102c0b2003410c6a2103200441746a22040d000b0b2009450d05200b102c0c050b410021060b2000200836020420002006360200200041146a200a360200200041106a20093602002000410c6a200b360200200041086a2007360200200141206a24000f0b103a000b1033000b1035000b2008450d002006102c0b41d88bc600412e200141106a41888cc600103b000b8e0402017f017e23004190016b22052400200520013602040240200541046a20022004ad4220862003ad8410242206422088a72201450d002006a722042d0000220341014b0d00410021020240024020030e020100010b41002102200541003a008801200441016a21042001417f6a21010340024020012002470d00200241ff0171450d03200541003a0088010c030b200541c8006a20026a200420026a2d00003a00002005200241016a22033a00880120032102200341c000470d000b200541086a41386a200541c8006a41386a290300370300200541086a41306a200541c8006a41306a290300370300200541086a41286a200541c8006a41286a290300370300200541086a41206a200541c8006a41206a290300370300200541086a41186a200541c8006a41186a290300370300200541086a41106a200541c8006a41106a290300370300200541086a41086a200541c8006a41086a29030037030020052005290348370308410121020b200020023a000020002005290308370001200041096a200541106a290300370000200041116a200541186a290300370000200041196a200541206a290300370000200041216a200541286a290300370000200041296a200541306a290300370000200041316a200541386a290300370000200041396a200541c0006a29030037000020054190016a24000f0b41d88bc600412e200541c8006a41888cc600103b000baf0201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001104221000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b20044180011047000b20044180011047000b7603017f017e017f230041106b220324000240024002402002ad4220862000ad8410212204428080808010540d00410121022004a72d0000220541014b0d0020050e020102010b41d88bc600412e200341086a41888cc600103b000b410021020b02402001450d002000102c0b200341106a240020020b950703067f067e017f230041e0006b220224002002411436020c200241b5b5c000360208200241106a41b5b5c000ad4280808080c002841003108d01024002400240024020022802102203450d00200228021421042002200241186a2802002205360224200220033602200240024002402005450d0020022005417f6a3602242002200341016a36022020032d00002105200241c8006a200241206a107420022802482206450d00200228024c2107200541ff01714101460d012007450d002006102c0b20024100360230200242013703282002410b36023c2002200241086a3602382002200241286a36024441012105200241dc006a41013602002002420137024c200241d0b0c2003602482002200241386a360258200241c4006a41c49ac500200241c8006a10391a200235023042208620023502288410040240200228022c450d002002280228102c0b410221070c010b200241d0006a3502004220862007ad84210841012107410021050b02402004450d002003102c0b20050d0020074101460d01024020062802082205ad220942287e220a422088a70d00200aa72204417f4c0d00200628020021030240024020040d00410821060c010b2004102a2206450d040b0240024020050d004200210a0c010b200541286c21044200210a200621050340200341086a2903002108200341106a290300210b200341186a290300210c2003290300210d200541206a200341206a290300370300200541186a200c370300200541106a200b370300200541086a20083703002005200d370300200541286a2105200a4280808080107c210a200341286a2103200441586a22040d000b0b200a20098421080c020b103a000b42002108410821060b20024100360250200242013703482008422088a72203200241c8006a106702402003450d002006200341286c6a210e2006210503402005200241c8006a109101200541206a290300210a02400240200228024c2204200228025022036b4108490d00200228024821040c010b200341086a22072003490d04200441017422032007200320074b1b22034100480d040240024020040d002003102a21040c010b200228024820042003102e21040b2004450d032002200336024c20022004360248200228025021030b2002200341086a360250200420036a200a370000200e200541286a2205470d000b0b2002350250422086200235024884210a02402008a7450d002006102c0b200241e0006a2400200a0f0b1033000b1035000b9e0e06057f017e017f017e037f017e230041c0016b22022400200241086a41186a22034200370300200241086a41106a22044200370300200241086a41086a2205420037030020024200370308200241f8006a41086a220641bac6c500ad4280808080c0008422071002220841086a290000370300200220082900003703782008102c2005200629030037030020022002290378370308200641c8c6c500ad4280808080b001841002220841086a290000370300200220082900003703782008102c200420022903782209370300200241a0016a41086a220a2005290300370300200241a0016a41106a220b2009370300200241a0016a41186a220c200629030037030020022009370358200220022903083703a001200241086a200241a0016a10ff0220022802082108200229020c210920034200370300200442003703002005420037030020024200370308200620071002220441086a290000370300200220042900003703782004102c2005200629030037030020022002290378370308200641e9c6c500ad4280808080a001841002220441086a290000370300200220042900003703782004102c200320062903002207370300200a2005290300370300200b2002290378220d370300200c20073703002002200d370358200220022903083703a001200241f8006a200241a0016a10800320022d00782106200c20024191016a290000370300200b20024189016a290000370300200a20024181016a290000370300200220022900793703a0012009420020081b21092008410820081b21050240024020064101460d00200241d8006a41186a4200370300200241d8006a41106a4200370300200241d8006a41086a4200370300200242003703580c010b200241d8006a41186a200c290300370300200241d8006a41106a200b290300370300200241d8006a41086a200a290300370300200220022903a0013703580b2002412c6a2009370200200241086a41186a42043703002002413c6a200241d8006a41086a290300370200200241c4006a200241e8006a290300370200200241cc006a200241d8006a41186a2903003702002002200536022820024201370318200242c801370310200242b81737030820022002290358370234200241013a0054200241003602800120024201370378024002404108102a2206450d002002410836027c2002200228028001220541086a3602800120022006360278200620056a42b8173700002002290310210902400240200228027c220520022802800122066b4108490d00200228027821050c010b200641086a22082006490d02200541017422062008200620084b1b22064100480d020240024020050d002006102a21050c010b200228027820052006102e21050b2005450d012002200636027c2002200536027820022802800121060b2002200641086a36028001200520066a20093700002002290318210902400240200228027c220520022802800122066b4108490d00200228027821050c010b200641086a22082006490d02200541017422062008200620084b1b22064100480d020240024020050d002006102a21050c010b200228027820052006102e21050b2005450d012002200636027c2002200536027820022802800121060b2002200641086a36028001200520066a20093700002002290320210902400240200228027c220520022802800122066b4108490d00200228027821050c010b200641086a22082006490d02200541017422062008200620084b1b22064100480d020240024020050d002006102a21050c010b200228027820052006102e21050b2005450d012002200636027c2002200536027820022802800121060b2002200641086a36028001200520066a200937000020022802282105200241086a41286a2802002206200241f8006a106702402006450d002005200641286c6a210b03402005200241f8006a109101200541206a290300210902400240200228027c220820022802800122066b4108490d00200228027821080c010b200641086a220a2006490d0420084101742206200a2006200a4b1b22064100480d040240024020080d002006102a21080c010b200228027820082006102e21080b2008450d032002200636027c2002200836027820022802800121060b2002200641086a36028001200820066a2009370000200b200541286a2205470d000b0b200241346a200241f8006a10ba0220022d0054210802400240200228027c2002280280012206460d00200228027821050c010b200641016a22052006490d022006410174220a2005200a20054b1b220a4100480d020240024020060d00200a102a21050c010b20022802782006200a102e21050b2005450d012002200a36027c2002200536027820022802800121060b2002200641016a36028001200520066a20083a000020023502800142208620023502788421090240200228022c450d002002280228102c0b200241c0016a240020090f0b1033000b1035000bd90904057f017e097f017e230041b0016b2202240020024188016a41186a420037030020024188016a41106a2203420037030020024188016a41086a220442003703002002420037038801200241e8006a41086a2205418ec6c500ad4280808080a002841002220641086a290000370300200220062900003703682006102c200420052903003703002002200229036837038801200541a0c6c500ad4280808080c000841002220641086a290000370300200220062900003703682006102c200320022903682207370300200241106a41086a2004290300370300200241106a41106a2007370300200241106a41186a2005290300370300200220073703302002200229038801370310200241203602442002200241106a360240200241c8006a200241106aad42808080808004841003108d010240024002400240200228024822080d00410021030c010b200228024c21092002200241c8006a41086a28020036025c20022008360258200241086a200241d8006a107502400240024020022802080d00200228025c22054160712204417f4c0d04200228020c210a024002402005410576220b0d00410121030c010b2004102a2203450d060b0240200a450d004100210c034020052106200241003a00a801200c220d41016a210c41002105024002400240034020062005460d0120024188016a20056a200228025822042d00003a00002002200441016a3602582002200541016a22043a00a8012004210520044120470d000b200241e8006a41186a220e20024188016a41186a290300370300200241e8006a41106a220f20024188016a41106a290300370300200241e8006a41086a221020024188016a41086a2903003703002002200229038801370368200b200d470d020240200d4101742205200c2005200c4b1b220b41ffffff3f71200b470d00200b410574220541004e0d020b1035000b2002410036025c0240200541ff0171450d00200241003a00a8010b20024100360230200b450d052003102c0c050b02400240200d0d002005102a21030c010b2003200d4105742005102e21030b2003450d080b200620046b21052003200d4105746a220d2002290368370000200d41186a200e290300370000200d41106a200f290300370000200d41086a2010290300370000200c200a470d000b200241386a200a3602002002200b360234200220033602302002200620046b36025c200229023421070c030b200241386a200a3602002002200b360234200220033602302003450d01200229023421070c020b200241003602300b4100210320024100360270200242013703682002410b3602342002200241c0006a3602302002200241e8006a3602642002419c016a41013602002002420137028c01200241d0b0c200360288012002200241306a36029801200241e4006a41c49ac50020024188016a10391a200235027042208620023502688410040240200228026c450d002002280268102c0b0b2009450d002008102c0b200241003602900120024201370388012007420020031b2207422088a7220520024188016a10672003410120031b210602402005450d0020054105742104200621050340200520024188016a109101200541206a2105200441606a22040d000b0b20023502900142208620023502880184211102402007a7450d002006102c0b200241b0016a240020110f0b103a000b1033000bbd0503037f047e027f23004190016b2202240041002103200241003a00482000410120011b2104024002400240034020012003460d01200241286a20036a200420036a2d00003a00002002200341016a22003a00482000210320004120470d000b200241086a41186a200241286a41186a22012903002205370300200241086a41106a200241286a41106a22042903002206370300200241086a41086a200241286a41086a22002903002207370300200220022903282208370308200241d0006a41186a2005370300200241d0006a41106a2006370300200241d0006a41086a20073703002002200837035020004191b0c200ad4280808080e000841002220341086a290000370300200220032900003703282003102c200241f0006a41086a220920002903003703002002200229032837037020004197b0c200ad4280808080c001841002220341086a290000370300200220032900003703282003102c20024180016a41086a220a20002903003703002002200229032837038001200241286a200241d0006a109f0141c000102a22030d010c020b0240200341ff0171450d00200241003a00480b2002413c6a4102360200200241dc006a41043602002002420237022c20024184adc200360228200241043602542002419cafc2003602502002410036020c200241dc9ec6003602082002200241d0006a3602382002200241086a360258200241286a4194adc2001041000b20032002290370370000200320022903800137001020032002290028370020200341086a2009290300370000200341186a200a290300370000200341286a2000290000370000200341306a2004290000370000200341386a20012900003700002002200341c00010940120022802042100200228020021012003102c4104102a2203450d0020032000410020011b36000020024190016a24002003ad4280808080c000840f0b1033000ba50e03057f037e017f230041d0016b22022400024020010d00410121000b200220003602082002200136020c41002103200241003a008001200121040340024020012003470d002002410036020c0240200341ff0171450d00200241003a0080010b200241f4006a4102360200200241ac016a41043602002002420237026420024184adc200360260200241043602a401200241b4afc2003602a00120024100360234200241dc9ec6003602302002200241a0016a3602702002200241306a3602a801200241e0006a4194adc2001041000b200241e0006a20036a200020036a22052d00003a00002002200541016a3602082002200341016a22053a0080012004417f6a21042005210320054120470d000b200241106a41086a200241e0006a41086a290300370300200241106a41106a200241e0006a41106a290300370300200241106a41186a200241e0006a41186a2903003703002002200120056b220636020c2002200229036037031041002103200241003a008001200020056a21010340024020062003470d002002410036020c0240200341ff0171450d00200241003a0080010b200241f4006a4102360200200241ac016a41043602002002420237026420024184adc200360260200241043602a401200241b4afc2003602a00120024100360234200241dc9ec6003602302002200241a0016a3602702002200241306a3602a801200241e0006a4194adc2001041000b200241e0006a20036a200120036a22052d00003a00002002200541016a3602082002200341016a22053a0080012005210320054120470d000b200241306a41086a200241e0006a41086a290300370300200241306a41106a200241e0006a41106a290300370300200241306a41186a200241e0006a41186a290300370300200220022903603703302002200420056b220436020c02400240024020044110490d002002200120056a220341106a3602082002200441706a220536020c20054108490d0120032900002107200341086a29000021082002200441686a36020c2002200341186a360208200341106a290000210920024188016a200241086a10772002280288010d02200241ac016a4104360200200241f4006a41023602002002420237026420024184adc200360260200241043602a401200241b4afc2003602a001200241003602c401200241dc9ec6003602c0012002200241a0016a3602702002200241c0016a3602a801200241e0006a4194adc2001041000b200241ac016a4104360200200241f4006a41023602002002420237026420024184adc200360260200241043602a401200241b4afc2003602a0012002410036028c01200241dc9ec600360288012002200241a0016a360270200220024188016a3602a801200241e0006a4194adc2001041000b200241ac016a4104360200200241f4006a41023602002002420237026420024184adc200360260200241043602a401200241b4afc2003602a0012002410036028c01200241dc9ec600360288012002200241a0016a360270200220024188016a3602a801200241e0006a4194adc2001041000b200241d0006a41086a220320024188016a41086a22052802003602002002200229038801370350200241a0016a41186a200241106a41186a290300370300200241a0016a41106a200241106a41106a290300370300200241a0016a41086a200241106a41086a290300370300200220022903103703a001200241e0006a41186a200241306a41186a290300370300200241e0006a41106a200241306a41106a290300370300200241e0006a41086a200241306a41086a29030037030020022002290330370360200241c0016a41086a2003280200360200200220022903503703c00120024188016a200241a0016a200241e0006a200720082009200241c0016a10d503024002402002280288014101460d0020024194016a280200210420052802002100200228028c01210520022d00980121010c010b0240200228029801450d0020024194016a280200102c0b410021050b20024100360268200242013703604101102a210302400240024002402005450d002003450d02200341003a0000200242818080801037026420022003360260200341014102102e2203450d02200320013a00012002428280808020370264200220033602602004200241e0006a10670240024020022802642203200228026822016b2004490d00200228026021030c010b200120046a22062001490d042003410174220a2006200a20064b1b22064100480d040240024020030d002006102a21030c010b200228026020032006102e21030b2003450d0320022006360264200220033602600b2002200120046a2206360268200320016a2005200410db051a2006ad42208621070c010b2003450d01200341013a000020024281808080103702642002200336026042808080801021070b20072003ad84210702402000450d002005450d002005102c0b200241d0016a240020070f0b1033000b1035000baf1f05047f017e017f037e0e7f230041c0096b22072400200741e8006a41186a200141186a290000370300200741e8006a41106a200141106a290000370300200741e8006a41086a200141086a2900003703002007200129000037036820074188016a41186a200241186a29000037030020074188016a41106a200241106a29000037030020074188016a41086a200241086a290000370300200720022900003703880120062802002108200628020421092006280208210a4200210b200741e0056a41186a4200370300200741e0056a41106a22014200370300200741e0056a41086a22064200370300200742003703e00520074190036a41086a220241e4d2c500ad42808080808001841002220c41086a2900003703002007200c29000037039003200c102c2006200229030037030020072007290390033703e005200241b7e4c300ad42808080808001841002220c41086a2900003703002007200c29000037039003200c102c2001200729039003220d370300200741a8046a41086a2006290300370300200741a8046a41106a200d370300200741a8046a41186a20022903003703002007200d37039807200720072903e0053703a804200741d0006a200741a8046a4120109e010240024002400240024020072903584201200728025022021b220d200741d0006a41106a290300420020021b220e8450450d004200210f0c010b200741306a200e42002005420010e005200741c0006a200d42002005420010e005200741206a42004200200d420010e00502402007290338200729032884420052200741c0006a41086a290300220b200729033020072903207c7c220f200b5472450d004127210241a7c4c10021010c020b2007290340210b0b200741c8016a200741e8006a200b200f410810ac0120072802c8014101470d0120072802d001210220072802cc0121010b2000200136020420004101360200200041146a41003602002000410c6a4201370200200041086a20023602002009450d012008102c0c010b200741c8016a41106a2206290300210f20072903d001210b200741a8016a41186a200e3703002007200d3703b801200720053703b001200720053703a801200741c8016a41186a420037030020064200370300200741c8016a41086a220c4200370300200742003703c80120074190036a41086a220241e4d2c500ad42808080808001841002221041086a29000037030020072010290000370390032010102c200c200229030037030020072007290390033703c801200241f4d2c500ad4280808080f001841002221041086a29000037030020072010290000370390032010102c2006200729039003220d370300200741a8046a41086a200c290300370300200741a8046a41106a200d370300200741a8046a41186a20022903003703002007200d3703e005200720072903c8013703a804200741e0056a200741a8046a10e70320072d00d0062102200741a8046a200741e0056a41f00010db051a2007200741e0056a41f4006a2800003600fb07200720072800d1063602f8070240024020024102470d002007428080818080043703b0022007428080848080023703a80220074201370398022007420137039002200742af0137038802200742870137038002200742013703f801200742013703f001200742013703e801200742013703e001200742013703d801200742013703d001200742013703c80120074280808080c0003703a002410021020c010b200741c8016a200741a8046a41f00010db051a200741c8016a41f4006a20072800fb07360000200720072802f8073600b9020b200741c8026a4200370300200741f8026a4200370300200741e8026a4200370300200741d8026a4200370300200720023a00b8022007428080e983b1de163703c00220074280a094a58d1d3703f00220074280a094a58d1d3703e00220074280a094a58d1d3703d002200742a0808080808010370380032007200741c8016a360288032007200741c8016a36028c03200741f8076a41186a2211200741e8006a41186a290300370300200741f8076a41106a2212200741e8006a41106a290300370300200741f8076a41086a2213200741e8006a41086a290300370300200720072903683703f807200741e0056a41186a220c4200370300200741e0056a41106a22104200370300200741e0056a41086a22064200370300200742003703e00520074190036a41086a220241f9e8c500ad42808080809001841002221441086a29000037030020072014290000370390032014102c2006200229030037030020072007290390033703e0052002419db1c200ad428080808030841002221441086a29000037030020072014290000370390032014102c20074198076a41086a22152002290300220d370300200720072903900322053703980720012005370000200141086a2216200d370000200741a8046a41086a22172006290300370300200741a8046a41106a22182010290300370300200741a8046a41186a2219200c290300370300200720072903e0053703a804200741106a200741a8046a1098012007290318210d2007280210211a200c42003703002010420037030020064200370300200742003703e00520024191b0c200ad4280808080e000841002221441086a29000037030020072014290000370390032014102c2006200229030037030020072007290390033703e005200241acb0c200ad4280808080e000841002221441086a29000037030020072014290000370390032014102c2015200229030022053703002007200729039003220e370398072001200e3700002016200537000020172006290300370300201820102903003703002019200c290300370300200720072903e0053703a804200741086a200741a8046a4120109401200741c8036a4200370300200741bc036a41c0ecc1003602004101211b200741b8036a4101360200200741ac036a41d0e1c100360200200741e8036a2013290300370300200741f0036a2012290300370300200741f8036a201129030037030020074190036a41206a42003703002007428080808080013703c0032007420037039803200720072903f8073703e003200741003602a80320072802082102200728020c210120072007418c036a3602d803200720074188036a3602d4032007200741c8016a3602d00320072001410020021b3602dc032007200d4200201a1b37039003200c20074188016a41186a290300370300201020074188016a41106a290300370300200620074188016a41086a29030037030020072007290388013703e0052007200a3602b004200720093602ac04200720083602a80420074180046a20074190036a200741e0056a20032004200741a8016a200741a8046a10e20202402007280280040d0020074180046a41106a2d00000d00200741e0056a41086a200741b0036a290300370300200741a8046a41086a200741ec056a280200360200200720072903a8033703e005200720072902e4053703a804200741b8096a200741a8046a10f1014100211b0b200741e8006a20072903a80120072903b00120072903b801200741a8016a41186a290300200b200f10b90220072802cc03210120072802c8032106200720072802c40322023602a0042007200636029c04200720023602980420072002200141b8016c6a22113602a40402402001450d00200741f8076a41017221192007419f076a211a20074181086a210c20074198076a4102722109200741e0056a41106a211c20074188066a2118200741c4066a2113200741a1066a210820074181066a2110200741e0056a4101722112200741d8066a211d034020022d00002101200741a8046a200241016a41b70110db051a0240024020014103460d00200720013a00e0052012200741a8046a41b70110db052106024002400240024020010e03000102000b20072802e805211420072802ec05210620072802e4052101201a201c41d80010db051a2007410d3a00f807201920074198076a41df0010db051a20012006200741f8076a109201410121064100210a02402014450d002001102c0b410021140c020b20074188096a41186a2201200641186a220a29000037030020074188096a41106a2214200641106a221529000037030020074188096a41086a2216200641086a22172900003703002007200629000037038809200741f8076a201841900110db051a20092006290000370000200941086a2017290000370000200941106a2015290000370000200941186a200a29000037000020074180023b019807200741a8096a200741f8076a20074198076a10c10220072d00b0092106200c200729038809370000200c41086a2016290300370000200c41106a2014290300370000200c41186a2001290300370000200741043a0080082007410d3a00f807200720064102463a00a108410021064101210a41014100200741f8076a109201410021140c010b201d290300210d20072903d006210520074188096a41186a200641186a29000037030020074188096a41106a200641106a29000037030020074188096a41086a200641086a290000370300200720062900003703880920074198076a41186a201041186a29000037030020074198076a41106a201041106a29000037030020074198076a41086a201041086a2900003703002007201029000037039807200741f8076a41186a200841186a290000370300200741f8076a41106a200841106a290000370300200741f8076a41086a200841086a290000370300200720082900003703f807200741a8096a41086a201341086a280200360200200720132902003703a80920074188096a20074198076a200741f8076a2005200d200741a8096a10c6044101210a41012106410121140b024020072d00e005220141014b0d000240024020010e020001000b200a450d03024020072802e805450d0020072802e405102c0b20072d00f0054105490d03200728029806450d03200728029406102c0c030b2006450d0220181092020c020b201420072802c80645720d0120072802c406102c0c010b2007200241b8016a3602a0040c020b200241b8016a22022011470d000b200720113602a0040b20074198046a1072200041106a20074180046a41106a290300370200200041086a20074180046a41086a29030037020020002007290380043702000240200728029c032202450d0020074190036a41106a280200450d002002102c0b201b450d0020074190036a411c6a280200210220072802b403210c0240024020072802b00322060d00200221010c010b2006210020022101034020012802880b21012000417f6a22000d000b0340200220022f01064102746a41880b6a28020021022006417f6a22060d000b0b200741e0056a411c6a20022f0106360200200741f8056a4100360200200741f4056a20023602002007200c36028006200741003602f005200742003703e805200720013602e405200741003602e005200741e0056a10f9010b200741c0096a24000bdd1002077f017e23004180026b2202240041002103200241003a00a8012000410120011b21040240034020012003460d0120024188016a20036a200420036a2d00003a00002002200341016a22003a00a8012000210320004120470d000b200241086a41086a20024188016a41086a290300370300200241086a41106a20024188016a41106a290300370300200241086a41186a20024188016a41186a290300370300200220022903880137030841002103200241003a00a801200420006a2104200120006b21010340024020012003470d000240200341ff0171450d00200241003a00a8010b2002419c016a4102360200200241ec016a41043602002002420237028c0120024184adc20036028801200241043602e401200241bcafc2003602e0012002410036026c200241dc9ec6003602682002200241e0016a360298012002200241e8006a3602e80120024188016a4194adc2001041000b20024188016a20036a200420036a2d00003a00002002200341016a22003a00a8012000210320004120470d000b200241286a41086a220320024188016a41086a290300370300200241286a41106a220020024188016a41106a290300370300200241286a41186a220120024188016a41186a22042903003703002002200229038801370328200241e8006a41186a200241086a41186a290300370300200241e8006a41106a200241086a41106a290300370300200241e8006a41086a200241086a41086a29030037030020022002290308370368200241c8006a41186a2001290300370300200241c8006a41106a2000290300370300200241c8006a41086a20032903003703002002200229032837034820024188016a200241e8006a10ee01024002400240024002400240024020022d00880122034102460d004101210520030d01200241b4016a2802004102460d01200241a8016a280200220041164d0d03200241a4016a28020021062004280200210120024188016a41186a2207200241c8006aad42808080808004841006220341186a29000037030020024188016a41106a2208200341106a29000037030020024188016a41086a2204200341086a29000037030020022003290000370388012003102c200241e0016a41186a2007290300370300200241e0016a41106a2008290300370300200241e0016a41086a200429030037030020022002290388013703e00120024188016a2000ad4220862001ad84200041696aad422086200141176aad844101200241e0016aad42808080808004841008108d01200428020021042002280288012100200228028c01210802402006450d002001102c0b410021010c020b410021050b410121010b41012103024002400240024002400240024020010d00200441066a410220001b2203417f4c0d082003450d010b2003102a2206450d084100210720024100360290012002200336028c0120022006360288012001450d012002410136029001200641013a0000200228028c0121042002280290012103200541ff01714101460d0420042003460d0220022802880121040c030b200241003602900120024201370388014101102a2206450d072002410136028c01200220063602880120022802900121070b2002200741016a36029001200620076a41003a0000200228028c0121062002280290012103024020000d000240024020062003460d0020022802880121040c010b200341016a22042003490d09200341017422062004200620044b1b22064100480d090240024020030d002006102a21040c010b20022802880120032006102e21040b2004450d082002200636028c01200220043602880120022802900121030b2002200341016a36029001200420036a41003a00000c040b0240024020062003460d0020022802880121060c010b200341016a22062003490d08200341017422072006200720064b1b22074100480d080240024020030d002007102a21060c010b20022802880120032007102e21060b2006450d072002200736028c01200220063602880120022802900121030b2002200341016a36029001200620036a41013a0000200420024188016a106702400240200228028c01220620022802900122036b2004490d0020022802880121060c010b200320046a22072003490d08200641017422032007200320074b1b22034100480d080240024020060d002003102a21060c010b20022802880120062003102e21060b2006450d072002200336028c01200220063602880120022802900121030b2002200320046a36029001200620036a2000200410db051a0c030b200341016a22042003490d06200341017422062004200620044b1b22064100480d060240024020030d002006102a21040c010b20022802880120032006102e21040b2004450d052002200636028c01200220043602880120022802900121030b2002200341016a36029001200420036a41003a00000c010b0240024020042003460d0020022802880121040c010b200341016a22042003490d05200341017422062004200620044b1b22064100480d050240024020030d002006102a21040c010b20022802880120032006102e21040b2004450d042002200636028c01200220043602880120022802900121030b2002200341016a36029001200420036a41013a00000b200235029001422086200235028801842109024020010d002000450d002008450d002000102c0b20024180026a240020090f0b411720001047000b103a000b1033000b1035000b0240200341ff0171450d00200241003a00a8010b2002419c016a4102360200200241ec016a41043602002002420237028c0120024184adc20036028801200241043602e401200241bcafc2003602e0012002410036026c200241dc9ec6003602682002200241e0016a360298012002200241e8006a3602e80120024188016a4194adc2001041000bad0402027f027e23004180056b22022400024002402001450d00200220003602100c010b200241013602100b20022001360214200241d8026a200241106a108c020240024020022903c0034203510d00200241186a200241d8026a41a80210db051a0240200228021422014104490d0020022802102200280000210320022001417c6a3602142002200041046a360210200241d8026a200241186a41a80210db051a200241c0026a200241f0036a220110ed022002200320022903c0022204a722002004422888a74200420010ac02200241086a29030021042002290300210520022d00c402210320011092024104102a2201450d0220012000360000200141044108102e2201450d02200120033a0004200141084115102e2201450d02200120053700052001410d6a200437000020024180056a24002001ad4280808080d002840f0b200241cc026a4104360200200241ec026a4102360200200242023702dc0220024184adc2003602d802200241043602c402200241d0afc2003602c002200241003602d402200241dc9ec6003602d0022002200241c0026a3602e8022002200241d0026a3602c802200241d8026a4194adc2001041000b200241cc026a41043602002002412c6a41023602002002420237021c20024184adc200360218200241043602c402200241d0afc2003602c002200241003602d402200241dc9ec6003602d0022002200241c0026a3602282002200241d0026a3602c802200241186a4194adc2001041000b1033000bcc0c06017f017e017f027e057f017e230041a0026b220224000240024020010d002002200136020c200241013602080c010b20022001417f6a36020c2002200041016a36020820002d0000220141014b0d00410021000240024020010e020100010b200241106a200241086a107720022802102200450d01200229021421030b0240024002400240024020000d004100210442002105420021060c010b20034220882205a72201417f4c0d010240024020010d0042002106410121040c010b200521062001102a2204450d030b20042000200110db051a0b200220043602f001200220054220862006843702f401200241e7e485f3063602d001200241106a200241f0016a10c90320022802142107200241106a41186a2208200241d0016a200235021842208620022802102209ad84101a220141186a290000370300200241106a41106a220a200141106a290000370300200241106a41086a220b200141086a290000370300200220012900003703102001102c20024190016a41186a200829030037030020024190016a41106a200a29030037030020024190016a41086a200b290300370300200220022903103703900102402007450d002009102c0b02402004450d002006a7450d002004102c0b4100210142002105420021064200210c4100210402402000450d0020034220882206a72207417f4c0d010240024020070d004200210c410121040c010b2006210c2007102a2204450d030b20042000200710db051a0b2002200436021020022006422086200c84370214200241b0016a41e2c289ab06200241106a10d9034200210602402000450d0020034220882206a72204417f4c0d010240024020040d0042002106410121010c010b2004102a2201450d030b20012000200410db051a20034280808080708321050b2002200136021020022005200684370214200241d0016a41e9dabdf306200241106a10d9030240024020000d004200210641002101420021050c010b20034220882206a72204417f4c0d010240024020040d0041012101420021060c010b2004102a2201450d030b20012000200410db051a20034280808080708321050b20022001360290022002200520068437029402200241f0016a41e1ea91cb0620024190026a10d903200241106a41086a20024190016a41086a290300370300200241106a41106a20024190016a41106a290300370300200241106a41186a20024190016a41186a290300370300200241386a200241b0016a41086a290300370300200241c0006a200241b0016a41106a290300370300200241c8006a200241b0016a41186a290300370300200241d8006a200241d0016a41086a290300370300200241e0006a200241d0016a41106a290300370300200241e8006a200241d0016a41186a2903003703002002200229039001370310200220022903b001370330200220022903d00137035020024188016a200241f0016a41186a29030037030020024180016a200241f0016a41106a290300370300200241f8006a200241f0016a41086a290300370300200220022903f001370370200241003602f801200242013703f001200241106a200241f0016a109101200241306a200241f0016a109101200241d0006a200241f0016a109101200241f0006a200241f0016a10910120022802f801210120022802f401210820022802f001210702402000450d002003a7450d002000102c0b200141046a2200417f4c0d000240024020000d00410121040c010b2000102a2204450d020b2002410036021820022000360214200220043602102001200241106a10670240024020022802142204200228021822006b2001490d00200228021021040c010b200020016a220a2000490d032004410174220b200a200b200a4b1b220a4100480d030240024020040d00200a102a21040c010b20022802102004200a102e21040b2004450d022002200a360214200220043602100b200420006a2007200110db051a200020016aad4220862004ad84210302402008450d002007102c0b200241a0026a240020030f0b103a000b1033000b1035000b200241fc016a4104360200200241246a41023602002002420237021420024184adc200360210200241043602f401200241e4afc2003602f001200241003602d401200241dc9ec6003602d0012002200241f0016a3602202002200241d0016a3602f801200241106a4194adc2001041000b810201057f230041306b22032400200341086a200241086a280200360200200320022902003703002003200136020c200341106a200310c90320032802142101200341106a41186a22042003410c6a200335021842208620032802102205ad841020220241186a290000370300200341106a41106a2206200241106a290000370300200341106a41086a2207200241086a290000370300200320022900003703102002102c200041186a2004290300370000200041106a2006290300370000200041086a20072903003700002000200329031037000002402001450d002005102c0b024020032802002200450d002003280204450d002000102c0b200341306a24000bd00201087f230041206b220324002003410036020820034201370300200120031067024002400240024020010d002003280208210420032802042105200328020021060c010b200141246c210720032802042105200328020821010340200341106a200010e7022003280210210802400240200520016b20032802182209490d00200120096a2104200328020021060c010b200120096a22042001490d04200541017422062004200620044b1b220a4100480d040240024020050d00200a102a21060c010b20032802002005200a102e21060b2006450d032003200a36020420032006360200200a21050b20032004360208200620016a2008200910db051a02402003280214450d002008102c0b200041246a2100200421012007415c6a22070d000b0b20022902002004ad4220862006ad84100102402005450d002006102c0b200341206a24000f0b1033000b1035000bd40201027f0240024002402002450d002002417f6a2104024020012d0000220241037122054103460d000240024020050e03040001040b2004450d0220012d0001410874200272220241ffff0371418002490d02200241fcff037141027621020c040b20044103490d0120012f0001200141036a2d000041107472410874200272220241808004490d01200241027621020c030b200241034b0d0020044104490d002001280001220241ffffffff034b0d020b200041013602000f0b200241027621020b0240200220036a220120024f0d00200041013602000f0b41012103410121050240200241c000490d0041022105200241808001490d00410441052002418080808004491b21050b0240200141c000490d0041022103200141808001490d00410441052001418080808004491b21030b20002001360204200041003602002000410c6a2003360200200041086a20053602000be50401057f230041106b2202240002400240024002402000280280014101460d0002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d04200341017422052004200520044b1b22054100480d040240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200028028401210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d04200441017422032005200320054b1b22034100480d040240024020040d002003102a21040c010b200128020020042003102e21040b2004450d0320012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d03200341017422052004200520044b1b22054100480d030240024020030d002005102a21040c010b200128020020032005102e21040b2004450d0220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b2000200110ea02200028028801210320004190016a28020022002001106702402000450d002000410574210003402002200136020c20032002410c6a109402200341206a2103200041606a22000d000b0b200241106a24000f0b1033000b1035000bfe0201027f024020002d0000417f6a2201410f4b0d00024002400240024002400240024020010e1000070707070107070207030704070506000b200041086a280200450d06200041046a280200102c0c060b200041086a2d00004101470d05200041146a280200450d05200041106a280200102c0c050b200041046a2d00000d042000410c6a280200450d04200041086a280200102c0c040b200041046a2802000d032000410c6a280200450d03200041086a280200102c0c030b200041086a2d00004105490d02200041306a280200450d022000412c6a280200102c0c020b200041046a2d00004102490d010240200041106a2802002201450d00200141d0006c2102200041086a28020041c0006a210103400240200141046a280200450d002001280200102c0b200141d0006a2101200241b07f6a22020d000b0b2000410c6a280200450d012000280208102c0c010b200041086a280200450d00200041046a280200102c0b02402000418c016a280200450d00200028028801102c0b0b13002000410736020420004190b2c2003602000b340020004191b0c20036020420004100360200200041146a410d360200200041106a41c0b9c200360200200041086a42063702000b5401017f230041206b22022400200241003602082002420837030020024100360218200242013703104100200241106a1067200041086a2002280218360200200020022903103702002002107d200241206a24000b7201017f230041306b22022400200241186a4200370300200241106a4200370300200241086a42003703002002420037030020024100360228200242013703202002200241206a36022c20022002412c6a109402200041086a200228022836020020002002290320370200200241306a24000b2b01017f02404101102a22020d001033000b200042818080801037020420002002360200200241003a00000bbb0405057f017e017f027e047f230041f0006b22012400200141306a41186a22024200370300200141306a41106a22034200370300200141306a41086a2204420037030020014200370330200141e0006a41086a22054191b0c200ad4280808080e0008422061002220741086a290000370300200120072900003703602007102c2004200529030037030020012001290360220837035020012008370330200541e0c2c200ad4280808080b0028422091002220741086a290000370300200120072900003703602007102c200320012903602208370300200141106a41086a22072004290300370300200141106a41106a220a2008370300200141106a41186a220b20052903003703002001200837035020012001290330370310200141086a200141106a4120109401200128020c210c2001280208210d20024200370300200342003703002004420037030020014200370330200520061002220341086a290000370300200120032900003703602003102c2004200529030037030020012001290360220837035020012008370330200520091002220341086a290000370300200120032900003703602003102c20022005290300220837030020072004290300370300200a20012903602206370300200b200837030020012006370350200120012903303703102001417f200c4100200d1b220520006a220420042005491b2205418094ebdc032005418094ebdc03491b360230200141106aad4280808080800484200141306aad4280808080c000841001200141f0006a24000bd90201047f230041e0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022010d00200041003602040c010b200228021421032002200241186a2802002204360224200220013602200240024020044104490d0020022004417c6a3602242002200141046a36022020012800002104200241c8006a200241206a107e20022802482205450d002000200229024c37020820002005360204200020043602000c010b20024100360230200242013703282002410b36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241d0b0c2003602482002200241386a360258200241c4006a41c49ac500200241c8006a10391a2002350230422086200235022884100420004100360204200228022c450d002002280228102c0b2003450d002001102c0b200241e0006a24000bfc0302077f017e230041e0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003602080c010b200328021421042003200341186a28020022023602242003200136022002400240024020024104490d002003200141046a36022020032002417c6a220536022420054104490d00200128000021052003200241786a3602242003200141086a36022020012800042106200341c8006a200341206a10820120032802482202450d00200341c8006a41086a2802002107200328024c2108200341c8006a200341206a10820120032802480d012008450d002002102c0b20034100360230200342013703282003410b36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341d0b0c2003602482003200341386a360258200341c4006a41c49ac500200341c8006a10391a2003350230422086200335022884100420004100360208200328022c450d012003280228102c0c010b200341286a41086a200341c8006a41086a280200220936020020032003290348220a370328200041106a20073602002000200836020c200020023602082000200636020420002005360200200041146a200a3702002000411c6a20093602000b2004450d002001102c0b200341e0006a24000bdd0808047f047e057f027e017f017e017f017e230041f0016b220324002003200236026420032001360260200341e8006a2002ad4220862001ad841003108d0102400240200328026822040d00200041003602200c010b200328026c21052003200341f0006a280200220636029c01200320043602980141002101200341003a00e801024002400340024020062001470d002003410036029c01200141ff0171450d02200341003a00e8010c020b200341c8016a20016a200420016a22022d00003a00002003200241016a360298012003200141016a22023a00e8012002210120024120470d000b200341a8016a41086a200341c8016a41086a290300370300200341a8016a41106a200341c8016a41106a290300370300200341a8016a41186a200341c8016a41186a290300370300200320032903c8013703a8012003200620026b36029c01200341c8006a20034198016a108e022003290348a70d00200341c8006a41106a290300210720032903502108200341306a20034198016a108e022003290330a70d00200341306a41106a29030021092003290338210a200341286a20034198016a107520032802280d00024002400240200328029c0141186e220b41186c2201417f4c0d00200328022c210c0240024020010d004108210d0c010b2001102a220d450d020b0240200c450d00200341106a41106a210e4100210f41002106410021020340200341106a20034198016a108e02024002402003290310a70d00200e290300211020032903182111200341086a20034198016a10752003280208450d010b200b450d06200d102c0c060b200241016a2101200328020c211202402002200b470d00200f2001200f20014b1b220bad42187e2213422088a70d052013a722144100480d050240024020020d002014102a210d0c010b200d20062014102e210d0b200d450d040b200d20066a2202201037030820022011370300200241106a2012360200200f41026a210f200641186a210620012102200c2001470d000b0b200d450d03200341f8006a41186a200341a8016a41186a2903002210370300200341f8006a41106a200341a8016a41106a2903002211370300200341f8006a41086a200341a8016a41086a2903002213370300200320032903a8012215370378200041186a20093703002000200a37031020002007370308200020083703002000200cad422086200bad843702242000200d3602202000412c6a2015370200200041346a20133702002000413c6a2011370200200041c4006a20103702000c040b103a000b1033000b1035000b200341003602b001200342013703a8012003410b36027c2003200341e0006a3602782003200341a8016a3602a401200341dc016a4101360200200342013702cc01200341d0b0c2003602c8012003200341f8006a3602d801200341a4016a41c49ac500200341c8016a10391a20033502b00142208620033502a8018410042000410036022020032802ac01450d0020032802a801102c0b2005450d002004102c0b200341f0016a24000bf30201047f230041c0016b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022010d00200041023a00700c010b200228021421032002200241186a28020036029c012002200136029801200241206a20024198016a10fe020240024020022d00900122044102460d002000200241206a41f00010db0521052002200241206a41f4006a2800003600a30120022002280091013602a001200541f4006a20022800a301360000200520022802a0013600710c010b200241003602a801200242013703a0012002410b3602b4012002200241086a3602b0012002200241a0016a3602bc01200241346a410136020020024201370224200241d0b0c2003602202002200241b0016a360230200241bc016a41c49ac500200241206a10391a20023502a80142208620023502a00184100420022802a401450d0020022802a001102c0b200020043a00702003450d002001102c0b200241c0016a24000bee0d03077f017e067f230041c0026b220324002003200236020420032001360200200341086a2002ad4220862001ad841003108d0102400240200328020822040d00200041023a00210c010b200341106a2802002105200328020c210641002101200341003a00b8022005417e6a21070240024002400340024020052001470d00200141ff0171450d02200341003a00b8020c020b20034198026a20016a200420016a2d00003a00002003200141016a22023a00b8022007417f6a21072002210120024120470d000b200341f8016a41186a20034198026a41186a290300370300200341f8016a41106a20034198026a41106a290300370300200341f8016a41086a20034198026a41086a29030037030020032003290398023703f80120052002460d00200420026a22082d0000220941074f0d00200341f8006a41186a200341f8016a41186a290300370300200341f8006a41106a200341f8016a41106a290300370300200341f8006a41086a200341f8016a41086a290300370300200320032903f8013703782005417f6a2002460d00200841016a2d0000220141014b0d00200520026b210202400240024020010e020100010b41002101200341003a00b8022002417e6a21050340024020052001470d00200141ff0171450d04200341003a00b8020c040b20034198026a20016a200820016a41026a2d00003a00002003200141016a22023a00b8022002210120024120470d000b200341d8016a41086a20034198026a41086a290300220a370300200341b8016a41186a20034198026a41186a290300370300200341b8016a41106a20034198026a41106a290300370300200341b8016a41086a200a3703002003200329039802220a3703d8012003200a3703b801200720026b2107200820026a41026a2105410121010c010b200841026a21052002417e6a2107410021010b20034198016a41186a200341b8016a41186a29030037030020034198016a41106a200341b8016a41106a29030037030020034198016a41086a200341b8016a41086a290300370300200320032903b801370398012007450d0020052d0000220241014b0d00410021080240024020020e020100010b41002102200341003a00b802200541016a21082007417f6a21050340024020052002470d00200241ff0171450d03200341003a00b8020c030b20034198026a20026a200820026a2d00003a00002003200241016a22073a00b8022007210220074120470d000b200341d8016a41086a20034198026a41086a290300220a370300200341b8016a41186a20034198026a41186a290300370300200341b8016a41106a20034198026a41106a290300370300200341b8016a41086a200a3703002003200329039802220a3703d8012003200a3703b801410121080b200341186a41186a2202200341b8016a41186a290300370300200341186a41106a2207200341b8016a41106a290300370300200341186a41086a2205200341b8016a41086a290300370300200341386a41086a220b20034198016a41086a290300370300200341386a41106a220c20034198016a41106a290300370300200341386a41186a220d20034198016a41186a290300370300200320032903b8013703182003200329039801370338200341d8006a41186a220e200341f8006a41186a290300370300200341d8006a41106a220f200341f8006a41106a290300370300200341d8006a41086a2210200341f8006a41086a2903003703002003200329037837035820014102460d0120002003290358370000200020093a0020200041186a200e290300370000200041106a200f290300370000200041086a201029030037000020034198026a41086a2209200b29030037030020034198026a41106a220b200c29030037030020034198026a41186a220c200d2903003703002003200329033837039802200341f8016a41186a220d2002290300370300200341f8016a41106a22022007290300370300200341f8016a41086a22072005290300370300200320032903183703f8012000413a6a200c290300370000200041326a200b2903003700002000412a6a20092903003700002000200329039802370022200041c2006a20083a0000200041c3006a20032903f801370000200041cb006a2007290300370000200041d3006a2002290300370000200041db006a200d2903003700000c020b410221010b2003410036028002200342013703f8012003410b3602dc01200320033602d8012003200341f8016a3602b801200341ac026a41013602002003420137029c02200341d0b0c200360298022003200341d8016a3602a802200341b8016a41c49ac50020034198026a10391a20033502800242208620033502f80184100420032802fc01450d0020032802f801102c0b200020013a00212006450d002004102c0b200341c0026a24000b800b040e7f027e037f037e230041c0016b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360234200320043602302003200341306a107502400240024002400240024002400240024002400240024020032802000d002003280234220641d8006e220741d8006c2201417f4c0d02200328020421080240024020010d00410821090c010b2001102a2209450d040b2008450d014100210a4100210b0340200341003a00b801200b41016a210c4100210102400240034020062001460d0120034198016a20016a2003280230220d2d00003a00002003200d41016a3602302003200141016a22023a00b8012002210120024120470d000b200341f8006a41086a220e20034198016a41086a290300370300200341f8006a41106a220f20034198016a41106a290300370300200341f8006a41186a221020034198016a41186a29030037030020032003290398013703782003200620026b2201360234200141104f0d010c0c0b20034100360234200141ff0171450d0b200341003a00b8010c0b0b2003200d41116a3602302003200141706a360234200d41096a2900002111200d290001211220034198016a200341306a107f2003280298012202450d0a20032802a0012113200328029c01210d20034198016a200341306a1082012003280298012206450d09200328029c012114024020032802342201410f4b0d0020140d080c090b20032802a0012115200341d8006a41086a200e2903002216370300200341d8006a41106a200f2903002217370300200341d8006a41186a20102903002218370300200341386a41086a220e2016370300200341386a41106a220f2017370300200341386a41186a221020183703002003200329037822163703582003200141706a36023420032003280230220141106a36023020032016370338200141086a29000021162001290000211702402007200b470d00200b4101742201200c2001200c4b1b2207ad42d8007e2218422088a70d062018a722014100480d0602400240200b0d002001102a21090c010b2009200b41d8006c2001102e21090b2009450d050b2009200b41d8006c6a2201201737031020012011370308200120123703002001200636022c20012002360220200141186a2016370300200141346a2015360200200141306a2014360200200141286a2013360200200141246a200d36020020012003290338370338200141c0006a200e290300370300200141c8006a200f290300370300200141d0006a20102903003703000240200c2008470d00200341286a200836020020032007360224200320093602200c070b200a41d8006a210a20032802342106200c210b0c000b0b200341003602200c090b200341286a2008360200200320073602242003200936022020090d030c080b103a000b1033000b1035000b20002003290320370200200041086a200341206a41086a2802003602000c050b2006102c0b200d450d012002102c0c010b200d450d002002102c0b200341003602200240200b450d00200941306a210103400240200141746a280200450d00200141706a280200102c0b02402001280200450d002001417c6a280200102c0b200141d8006a2101200a41a87f6a220a0d000b0b2007450d002009102c0b2003410036028001200342013703782003410b36025c2003200341086a3602582003200341f8006a360238200341ac016a41013602002003420137029c01200341d0b0c200360298012003200341d8006a3602a801200341386a41c49ac50020034198016a10391a200335028001422086200335027884100420004100360200200328027c450d002003280278102c0b2005450d002004102c0b200341c0016a24000b800401057f230041f0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022030d00200041033a00200c010b200241186a28020021042002280214210541002101200241003a0068024002400340024020042001470d00200141ff0171450d02200241003a00680c020b200241c8006a20016a200320016a2d00003a00002002200141016a22063a00682006210120064120470d000b200241286a41186a200241c8006a41186a290300370300200241286a41106a200241c8006a41106a290300370300200241286a41086a200241c8006a41086a2903003703002002200229034837032820042006460d00200320066a2d0000220141034f0d0020002002290328370000200041186a200241286a41186a290300370000200041106a200241286a41106a290300370000200041086a200241286a41086a2903003700000c010b20024100360230200242013703282002410b3602242002200241086a3602202002200241286a36026c200241dc006a41013602002002420137024c200241d0b0c2003602482002200241206a360258200241ec006a41c49ac500200241c8006a10391a200235023042208620023502288410040240200228022c450d002002280228102c0b410321010b200020013a00202005450d002003102c0b200241f0006a24000bd205010d7f230041e0006b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a1075024002400240024020022802000d0002400240200228022422054178712201417f4c0d002002280204210602400240200541037622070d00410421080c010b2001102a2208450d020b02402006450d00410021094100210a4100210b03402002410036022802400240024020054104490d0020022005417c6a220536022420022002280220220141046a3602202001280000210c2002410036022820054104490d00200b41016a210d20022005417c6a22053602242002200141086a36022020012800042101200b2007470d0202402009200d2009200d4b1b220741ffffffff01712007470d002007410374220e41004e0d020b1035000b200241003602482007450d072008102c0c070b02400240200b0d00200e102a21080c010b2008200a200e102e21080b2008450d040b2008200a6a220b200c360200200b41046a2001360200200941026a2109200a41086a210a200d210b2006200d470d000b200241d0006a20063602002002200736024c200220083602480c050b200241d0006a20063602002002200736024c2002200836024820080d040c030b103a000b1033000b200241003602480b20024100360230200242013703282002410b36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241d0b0c2003602482002200241386a360258200241c4006a41c49ac500200241c8006a10391a2002350230422086200235022884100420004100360200200228022c450d012002280228102c0c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2004450d002003102c0b200241e0006a24000b810201037f230041d0006b220124002001412036020420012000360200200141086a2000ad42808080808004841003108d0102400240200128020822020d00410421000c010b200128020c210302400240200141106a280200450d0020022d000022004104490d010b20014100360220200142013703182001410b36022c200120013602282001200141186a360234200141cc006a41013602002001420137023c200141d0b0c2003602382001200141286a360248200141346a41c49ac500200141386a10391a200135022042208620013502188410040240200128021c450d002001280218102c0b410421000b2003450d002002102c0b200141d0006a240020000bd90201037f230041e0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003602040c010b200328021421042003200341186a2802002202360224200320013602200240024020024104490d0020032002417c6a3602242003200141046a36022020012800002102200341c8006a200341206a10820120032802482205450d002000200329024c37020820002005360204200020023602000c010b20034100360230200342013703282003410b36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341d0b0c2003602482003200341386a360258200341c4006a41c49ac500200341c8006a10391a2003350230422086200335022884100420004100360204200328022c450d002003280228102c0b2004450d002001102c0b200341e0006a24000b940e030c7f017e037f230041a0026b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041023a00100c010b200328021421042003200341106a41086a28020036026c20032001360268200341f8016a200341e8006a10820102400240024020032802f8012205450d0020032802fc01210602400240200328026c22074104490d00200341f8016a41086a280200210820032007417c6a220236026c20032003280268220941046a220a3602680240024002402002450d002009280000210b20032007417b6a220c36026c2003200a41016a360268200a2d0000220d41014b0d0041002102200d0e020201020b2006450d040c030b410121020b200341f4006a41026a200341d8016a41026a2d00003a0000200320032f00d8013b01740240200c450d0020032007417a6a220c36026c2003200a41026a220d360268200a2d0001220a41014b0d004100210e02400240200a0e020100010b4100210a200341003a0098022007417a6a210e4179210c03400240200e200a470d00200a41ff0171450d03200341003a0098020c030b200341f8016a200a6a2009200a6a220d41066a2d00003a000020032007200c6a36026c2003200d41076a3602682003200a41016a220d3a009802200c417f6a210c200d210a200d4120470d000b200341b8016a41086a200341f8016a41086a290300220f37030020034198016a41186a200341f8016a41186a29030037030020034198016a41106a200341f8016a41106a29030037030020034198016a41086a200f370300200320032903f801220f3703b8012003200f370398012007200d6b417a6a210c2009200d6a41066a210d4101210e0b200341f8006a41186a20034198016a41186a290300370300200341f8006a41106a20034198016a41106a290300370300200341f8006a41086a20034198016a41086a2903003703002003200329039801370378200c450d002003200c417f6a36026c2003200d41016a360268200d2d0000220a41014b0d004100210702400240200a0e020100010b4100210a200341003a009802200c417f6a2109200c417e6a2107034002402009200a470d00200a41ff0171450d03200341003a00980220060d050c060b200341f8016a200a6a200d200a6a220c41016a2d00003a00002003200c41026a3602682003200a41016a220c3a0098022003200736026c2007417f6a2107200c210a200c4120470d000b200341b8016a41086a200341f8016a41086a290300220f37030020034198016a41186a200341f8016a41186a29030037030020034198016a41106a200341f8016a41106a29030037030020034198016a41086a200f370300200320032903f801220f3703b8012003200f37039801410121070b200341206a41186a220a20034198016a41186a290300370300200341206a41106a220c20034198016a41106a290300370300200341206a41086a220d20034198016a41086a290300370300200341c0006a41086a2209200341f8006a41086a290300370300200341c0006a41106a2210200341f8006a41106a290300370300200341c0006a41186a2211200341f8006a41186a290300370300200320032903980137032020032003290378370340200341e4006a41026a2212200341f4006a41026a2d00003a0000200320032f01743b016420024102460d042000200b36020c200020083602082000200636020420002005360200200341b8016a41026a220520122d00003a0000200341f8016a41086a22062009290300370300200341f8016a41106a22092010290300370300200341f8016a41186a22082011290300370300200341d8016a41086a220b200d290300370300200341d8016a41106a220d200c290300370300200341d8016a41186a220c200a290300370300200320032f01643b01b801200320032903403703f801200320032903203703d801200320032f011e3b019801200041136a20052d00003a0000200020032f01b8013b0011200041146a200e3a0000200041156a20032903f8013700002000411d6a2006290300370000200041256a20092903003700002000412d6a2008290300370000200041356a20073a0000200041366a20032903d8013700002000413e6a200b290300370000200041c6006a200d290300370000200041ce006a200c290300370000200041d6006a20032f0198013b00000c050b20060d010c020b2006450d010b2005102c0b410221020b200341003602e001200342013703d8012003410b3602bc012003200341086a3602b8012003200341d8016a360298012003418c026a4101360200200342013702fc01200341d0b0c2003602f8012003200341b8016a3602880220034198016a41c49ac500200341f8016a10391a20033502e00142208620033502d80184100420032802dc01450d0020032802d801102c0b200020023a00102004450d002001102c0b200341a0026a24000bbb0603087f027e017f230041a0016b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022040d00200041003602100c010b200328021421052003200341106a41086a28020036024420032004360240200341c8006a200341c0006a10770240024020032802482206450d00200341c8006a41086a2802002107200328024c210841002101200341003a009801200328024421090240024002400240034020092001460d01200341f8006a20016a2003280240220a2d00003a00002003200a41016a3602402003200141016a22023a0098012002210120024120470d000b200341d8006a41086a200341f8006a41086a290300370300200341d8006a41106a200341f8006a41106a290300370300200341d8006a41186a200341f8006a41186a290300370300200320032903783703582003200920026b220136024420014110490d012003200a41116a3602402003200141706a2202360244200241044f0d032008450d040c020b200341003602440240200141ff0171450d00200341003a0098010b20080d010c030b2008450d020b2006102c0c010b200a41096a290000210b200a290001210c200341206a41086a2202200341d8006a41086a290300370300200341206a41106a2209200341d8006a41106a290300370300200341206a41186a220d200341d8006a41186a290300370300200320032903583703202003200a41156a36024020032001416c6a3602442006450d00200a28001121012000200c37030020002008360214200020063602102000200b370308200041186a20073602002000411c6a20032903203702002000413c6a2001360200200041246a20022903003702002000412c6a2009290300370200200041346a200d2903003702000c010b20034100360260200342013703582003410b3602242003200341086a3602202003200341d8006a3602482003418c016a41013602002003420137027c200341d0b0c2003602782003200341206a36028801200341c8006a41c49ac500200341f8006a10391a2003350260422086200335025884100420004100360210200328025c450d002003280258102c0b2005450d002004102c0b200341a0016a24000b810802107f017e230041a0016b220224002002412036020c20022001360208200241106a2001ad42808080808004841003108d0102400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360234200220033602302002200241306a10750240024002400240024020022802000d000240024002402002280234220541286e220641286c2201417f4c0d00200228020421070240024020010d00410421080c010b2001102a2208450d020b02402007450d0041002109034020054104490d07200941016a210a20022005417c6a220b36023420022002280230220c41046a360230200c280000210d41002101200241003a00980103400240200b2001470d0020024100360234200141ff0171450d09200241003a0098010c090b200241f8006a20016a200c20016a220e41046a2d00003a00002002200e41056a3602302002200141016a220e3a009801200e2101200e4120470d000b200241d8006a41086a220b200241f8006a41086a290300370300200241d8006a41106a220f200241f8006a41106a290300370300200241d8006a41186a2210200241f8006a41186a2903003703002002200229037837035820022005200e6b2205417c6a220136023420014104490d07200241386a41086a2211200b290300370300200241386a41106a220b200f290300370300200241386a41186a220f2010290300370300200220022903583703382002200541786a22053602342002200c200e6a220141086a360230200141046a280000210e024020062009470d0020094101742201200a2001200a4b1b2206ad42287e2212422088a70d052012a722014100480d050240024020090d002001102a21080c010b2008200941286c2001102e21080b2008450d040b2008200941286c6a2201200d360200200120022903383702042001410c6a2011290300370200200141146a200b2903003702002001411c6a200f2903003702002001200e360224200a2109200a2007470d000b200241286a200736020020022006360224200220083602200c050b200241286a2007360200200220063602242002200836022020080d040c060b103a000b1033000b1035000b200241003602200c020b20002002290320370200200041086a200241206a41086a2802003602000c020b200241003602202006450d002008102c0b20024100360260200242013703582002410b36023c2002200241086a3602382002200241d8006a3602202002418c016a41013602002002420137027c200241d0b0c2003602782002200241386a36028801200241206a41c49ac500200241f8006a10391a2002350260422086200235025884100420004100360200200228025c450d002002280258102c0b2004450d002003102c0b200241a0016a24000b830301047f230041e0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003602080c010b200328021421042003200341186a2802002202360224200320013602200240024020024104490d002003200141046a36022020032002417c6a220536022420054104490d00200128000021052003200241786a3602242003200141086a36022020012800042102200341c8006a200341206a107e20032802482206450d002000200329024c37020c2000200636020820002002360204200020053602000c010b20034100360230200342013703282003410b36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341d0b0c2003602482003200341386a360258200341c4006a41c49ac500200341c8006a10391a2003350230422086200335022884100420004100360208200328022c450d002003280228102c0b2004450d002001102c0b200341e0006a24000bbc0b03097f017e027f23004190026b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022040d00200041023a00040c010b200328021421052003200341186a280200360264200320043602602003200341e0006a10754102210602400240024020032802000d0020032802642201450d002003280204210720032001417f6a220836026420032003280260220941016a220a36026020092d0000220141014b0d004100210b0240024020010e020100010b41002101200341003a0088020340024020082001470d0020034100360264200141ff0171450d03200341003a0088020c030b200341e8016a20016a200920016a220241016a2d00003a00002003200241026a3602602003200141016a22023a0088022002210120024120470d000b200341a8016a41086a200341e8016a41086a290300220c37030020034188016a41186a200341e8016a41186a29030037030020034188016a41106a200341e8016a41106a29030037030020034188016a41086a200c3703002003200820026b2208360264200320032903e801220c3703a8012003200c370388014101210b200920026a41016a210a0b200341e8006a41186a20034188016a41186a290300370300200341e8006a41106a20034188016a41106a290300370300200341e8006a41086a20034188016a41086a29030037030020032003290388013703682008450d0020032008417f6a22083602642003200a41016a360260200a2d0000220141014b0d00410021020240024020010e020100010b41002101200341003a0088020340024020082001470d0020034100360264200141ff0171450d03200341003a0088020c030b200341e8016a20016a200a20016a220241016a2d00003a00002003200241026a3602602003200141016a22023a0088022002210120024120470d000b200341a8016a41086a200341e8016a41086a290300220c37030020034188016a41186a200341e8016a41186a29030037030020034188016a41106a200341e8016a41106a29030037030020034188016a41086a200c3703002003200820026b360264200320032903e801220c3703a8012003200c37038801410121020b200341206a41186a220120034188016a41186a290300370300200341206a41106a220620034188016a41106a290300370300200341206a41086a220820034188016a41086a290300370300200341c0006a41086a2209200341e8006a41086a290300370300200341c0006a41106a220a200341e8006a41106a290300370300200341c0006a41186a220d200341e8006a41186a290300370300200320032903880137032020032003290368370340200b4102470d01200b21060b200341003602d001200342013703c8012003410b3602ac012003200341086a3602a8012003200341c8016a36028801200341fc016a4101360200200342013702ec01200341d0b0c2003602e8012003200341a8016a3602f80120034188016a41c49ac500200341e8016a10391a20033502d00142208620033502c80184100420032802cc01450d0120032802c801102c0c010b200341e8016a41186a220e200d290300370300200341e8016a41106a220d200a290300370300200341e8016a41086a220a2009290300370300200341c8016a41086a22092008290300370300200341c8016a41106a22082006290300370300200341c8016a41186a22062001290300370300200320032903403703e801200320032903203703c801200320032f011e3b01a80120002007360200200020032903e8013700052000410d6a200a290300370000200041156a200d2903003700002000411d6a200e290300370000200041256a20023a0000200041266a20032903c8013700002000412e6a2009290300370000200041366a20082903003700002000413e6a2006290300370000200041c6006a20032f01a8013b0000200b21060b200020063a00042005450d002004102c0b20034190026a24000bf30202027f037e230041e0006b220324002003200236020c20032001360208200341106a2002ad4220862001ad841003108d0102400240200328021022010d00200041003602100c010b200328021421042003200341106a41086a2802002202360224200320013602200240024020024110490d002003200241706a3602242003200141106a360220200141086a290000210520012900002106200341c8006a200341206a10820120032802482202450d00200329024c2107200020053703082000200637030020002007370214200020023602100c010b20034100360230200342013703282003410b36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341d0b0c2003602482003200341386a360258200341c4006a41c49ac500200341c8006a10391a2003350230422086200335022884100420004100360210200328022c450d002003280228102c0b2004450d002001102c0b200341e0006a24000be70203017f017e017f230041d0026b220324002003200236029401200320013602900120034198016a2002ad4220862001ad8422041003108d010240024020032802980122010d00411821010c010b200328029c0121052003200341a0016a2802003602bc02200320013602b802200341a8016a200341b8026a108f020240024020032802a80122024118460d002003200341a8016a410472418c0110db051a0c010b20034100360208200342013703002003410b3602c402200320034190016a3602c002200320033602cc02200341bc016a4101360200200342013702ac01200341d0b0c2003602a8012003200341c0026a3602b801200341cc026a41c49ac500200341a8016a10391a200335020842208620033502008410042003280204450d002003280200102c0b02402005450d002001102c0b4118210120024118460d0020041005200221010b20002001360200200041046a2003418c0110db051a200341d0026a24000b1300200041013602042000419cd1c2003602000b3400200041f9e8c50036020420004100360200200041146a4102360200200041106a41fcd4c200360200200041086a42093702000b130020004101360204200041bcd7c2003602000b2d01017f02404108102a22020d001033000b20004288808080800137020420002002360200200242dc0b3700000b850401037f230041106b2202240020012d0000210302404101102a2204450d00200420033a000020012d00012103200441014102102e2204450d00200420033a000120012d00022103200441024104102e2204450d00200420033a0002200420012d00033a000320012d00042103200441044108102e2204450d00200420033a0004200420012d00053a0005200420012d00063a0006200420012d00073a000720012d00082103200441084110102e2204450d00200420033a0008200420012d00093a0009200420012d000a3a000a200420012d000b3a000b200420012d000c3a000c200420012d000d3a000d200420012d000e3a000e200420012d000f3a000f20012d00102103200441104120102e2204450d00200420033a0010200420012d00113a0011200420012d00123a0012200420012d00133a0013200420012d00143a0014200420012d00153a0015200420012d00163a0016200420012d00173a0017200420012d00183a0018200420012d00193a0019200420012d001a3a001a200420012d001b3a001b200420012d001c3a001c200420012d001d3a001d200420012d001e3a001e200420012d001f3a001f200241086a22032004ad42808080808004841002220141086a290000370300200220012900003703002001102c200041086a2003290300370000200020022903003700002004102c200241106a24000f0b1033000b130020004103360204200041e8b2c0003602000bd308030d7f017e017f230041a0016b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2205200128020422062f01064f0d01200241186a2207200620054105746a220341206a290000370300200241106a2208200341186a290000370300200241086a2209200341106a2900003703002002200341086a290000370300200241206a41286a220a2006200541306c6a22034190036a290300370300200241206a41206a220b20034188036a290300370300200241206a41186a220c20034180036a290300370300200241206a41106a220d200341f8026a290300370300200241206a41086a220e200341f0026a290300370300200341e8026a290300210f2001200541016a36020c20012004360208200120063602042002200f370320200241d0006a41186a2007290300370300200241d0006a41106a2008290300370300200241d0006a41086a200929030037030020022002290300370350200241d0006a41286a200e290300370300200241d0006a41306a200d29030037030020024188016a200c29030037030020024190016a200b29030037030020024198016a200a290300370300200220022903203703702000200241d0006a41d00010db051a0c020b200041003602400c010b2001280200210702400240200628020022030d002004ad210f410021030c010b200741016a210720063301044220862004ad84210f0b2006102c200fa7210502400240200f422088a7220420032f01064f0d00200321060c010b034002400240200328020022060d002005ad210f410021060c010b200741016a210720033301044220862005ad84210f0b2003102c200fa7210520062103200f422088a7220420062f01064f0d000b0b200241186a2208200620044105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41286a220b2006200441306c6a22034190036a290300370300200241206a41206a220c20034188036a290300370300200241206a41186a220d20034180036a290300370300200241206a41106a220e200341f8026a290300370300200241206a41086a2210200341f0026a2903003703002002200341e8026a290300370320200441027420066a41fc066a280200210302402007417f6a2206450d00034020032802f80621032006417f6a22060d000b0b2001410036020c200120053602082001200336020420014100360200200241d0006a41186a2008290300370300200241d0006a41106a2009290300370300200241d0006a41086a200a290300370300200241d0006a41286a2010290300370300200241d0006a41306a200e29030037030020024188016a200d29030037030020024190016a200c29030037030020024198016a200b29030037030020022002290300370350200220022903203703702000200241d0006a41d00010db051a0b200241a0016a24000bda0401077f230041f0006b22022400200241d0006a41086a220341b5e5c200ad4280808080f000841002220441086a290000370300200220042900003703502004102c200241086a41086a2205200329030037030020022002290350370308200341c7e5c200ad4280808080f000841002220441086a290000370300200220042900003703502004102c200241186a41086a22062003290300370300200220022903503703182002200036024c200241d0006a41186a2200200241cc006aad4280808080c000841006220441186a290000370300200241d0006a41106a2207200441106a2900003703002003200441086a290000370300200220042900003703502004102c200241286a41186a22042000290300370300200241286a41106a22082007290300370300200241286a41086a2207200329030037030020022002290350370328024041c000102a2200450d00200020022903083700002000200229031837001020002002290328370020200041086a2005290300370000200041186a2006290300370000200041286a2007290300370000200041306a2008290300370000200041386a2004290300370000200128020021052001280208210320024100360258200242013703502003200241d0006a106702402003450d00200341057421042005210303402003200241d0006a109101200341206a2103200441606a22040d000b0b200228025421032000ad4280808080800884200235025842208620022802502204ad84100102402003450d002004102c0b2000102c0240200141046a280200450d002005102c0b200241f0006a24000f0b1033000b960301067f230041106b22022400200241003602082002420137030020002802002103024002404104102a2204450d0020024284808080c0003702042002200436020020042003360000200028020421050240024020022802042206200228020822046b4104490d00200441046a2103200228020021060c010b200441046a22032004490d02200641017422072003200720034b1b22074100480d020240024020060d002007102a21060c010b200228020020062007102e21060b2006450d0120022007360204200220063602000b20022003360208200620046a200536000020002802082104200041106a28020022032002106702402003450d0020034105742103034020042002109101200441206a2104200341606a22030d000b0b200028021421042000411c6a28020022032002106702402003450d0020034105742103034020042002109101200441206a2104200341606a22030d000b0b200228020421042001290200200235020842208620022802002203ad84100102402004450d002003102c0b200241106a24000f0b1033000b1035000b3400200041b5e5c20036020420004100360200200041146a4102360200200041106a41f8e5c200360200200041086a42073702000b8ea20106167f017e047f017e027f027e230041e0046b2204240041002105200441003602b002200420023602ac02200420013602a802024002400240024002400240024002400240024002400240200241034b0d0041012106200441013a0068200441e4036a4101360200200442013702d403200441f0f7c5003602d0032004412b36029402200420044190026a3602e0032004200441e8006a3602900220044180016a200441d0036a10372004280280012107200428028401210820042802880121094105210a4100210b0c010b200441043602b002024020012800004180c2cdeb06460d004101210a410121060c010b024002402002417c714104460d00200241074b0d0141082002103f000b41012106200441013a0068200441e4036a4101360200200442013702d403200441f0f7c5003602d0032004412b36029402200420044190026a3602e0032004200441e8006a3602900220044180016a200441d0036a10372004280280012107200428028401210820042802880121094105210a410021054100210b0c010b200441083602b002410121060240200128000422074101460d004102210a0c010b200441d0036a200441a8026a10f30402400240024020042802d0034101470d00410421084100210c410021090c010b200441d0036a410572210741042108412c210a410021064100210c410021094100210b0240034020044190026a41026a2201200741026a2d00003a0000200420072f00003b019002200428028004210d20042802fc03210e20042802f803210f20042802f403211020042802f003211120042802ec03211220042802e803211320042802e403211420042802e003211520042802dc03211620042802d8032117024020042d00d4032205417e6a41ff0171410b4b0d0041002118024002400240024002400240024002400240024002400240024020050e100c0c000102030405060708090a0b0c0c0c0b410121180c0b0b410221180c0a0b410321180c090b410421180c080b410521180c070b410621180c060b410721180c050b410821180c040b410921180c030b410a21180c020b410b21180c010b410c21180b0240200b41ff0171221920184d0d004113210a0c030b41002118024002400240024002400240024002400240024002400240024020050e100c0c000102030405060708090a0b0c0c0c0b410121180c0b0b410221180c0a0b410321180c090b410421180c080b410521180c070b410621180c060b410721180c050b410821180c040b410921180c030b410a21180c020b410b21180c010b410c21180b024020192018470d004114210a0c030b4100210b02400240024002400240024002400240024002400240024020050e100c0c000102030405060708090a0b0c0c0c0b4101210b0c0b0b4102210b0c0a0b4103210b0c090b4104210b0c080b4105210b0c070b4106210b0c060b4107210b0c050b4108210b0c040b4109210b0c030b410a210b0c020b410b210b0c010b410c210b0b20044180016a41026a221820012d00003a0000200420042f0190023b0180010240200c2009470d00200c41016a2201200c490d0720062001200620014b1b2209ad42307e221a422088a70d07201aa722014100480d0702400240200c0d002001102a21080c010b2008200a41546a2001102e21080b2008450d060b2008200a6a220141546a20053a00002001200d3602002001417c6a200e360200200141786a200f360200200141746a2010360200200141706a20113602002001416c6a2012360200200141686a2013360200200141646a2014360200200141606a20153602002001415c6a2016360200200141586a2017360200200141556a220120042f0180013b0000200141026a20182d00003a0000200641026a2106200a41306a210a200c41016a210c200441d0036a200441a8026a10f30420042802d0034101460d020c000b0b024002402005410e4b0d00024002400240024002400240024002400240024002400240024020050e0f0001020304050607080e090e0a0b0c000b2016450d0d2017102c0c0d0b02402016450d002017102c0b2013450d0c2014102c0c0c0b02402015450d00201541047421052017210103400240200141046a280200450d002001280200102c0b200141106a2101200541706a22050d000b0b2016450d0b2017102c0c0b0b02402015450d00201541286c21052017210103400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101200541586a22050d000b0b2016450d0a2017102c0c0a0b2016450d092017102c0c090b2016450d082017102c0c080b2016450d072017102c0c070b02402015450d00201720154104746a2113201721150340024020152802082205450d0020152802002101200541047421050340024020012d00004109470d000240200141046a2207280200220628020441ffffffff0371450d002006280200102c200728020021060b2006102c0b200141106a2101200541706a22050d000b0b201541106a21010240201541046a280200450d002015280200102c0b2001211520012013470d000b0b2016450d062017102c0c060b02402015450d00201541146c21052017210103400240200141046a280200450d002001280200102c0b200141146a21012005416c6a22050d000b0b2016450d052017102c0c050b02402015450d0020172015411c6c6a2113201721150340024020152802042201450d0002402015410c6a2802002205450d00200541047421050340024020012d00004109470d000240200141046a2207280200220628020441ffffffff0371450d002006280200102c200728020021060b2006102c0b200141106a2101200541706a22050d000b0b201541086a280200450d002015280204102c0b2015411c6a21010240201541146a280200450d002015280210102c0b2001211520012013470d000b0b2016450d042017102c0c040b02402015450d002017201541186c6a21132017211503400240201541046a280200450d002015280200102c0b0240201541146a2802002205450d00201528020c2101200541047421050340024020012d00004109470d000240200141046a2207280200220628020441ffffffff0371450d002006280200102c200728020021060b2006102c0b200141106a2101200541706a22050d000b0b201541186a21010240201541106a280200450d00201528020c102c0b2001211520012013470d000b0b2016450d032017102c0c030b02402015450d0020172015411c6c6a2113201721150340024020152802042201450d0002402015410c6a2802002205450d00200541047421050340024020012d00004109470d000240200141046a2207280200220628020441ffffffff0371450d002006280200102c200728020021060b2006102c0b200141106a2101200541706a22050d000b0b201541086a280200450d002015280204102c0b2015411c6a21010240201541146a280200450d002015280210102c0b2001211520012013470d000b0b2016450d022017102c0c020b02402017450d002016450d002017102c0b02402013450d0002402011450d002011410c6c2105201321010340024020012802002206450d00200141046a280200450d002006102c0b2001410c6a2101200541746a22050d000b0b2012450d002013102c0b200f450d010240200d450d00200f200d4104746a2116200f211703402017220741106a2117024020072802042201450d0002402007410c6a2802002205450d002005410c6c21050340024020012802002206450d00200141046a280200450d002006102c0b2001410c6a2101200541746a22050d000b0b200741086a280200450d002007280204102c0b20172016470d000b0b200e450d01200f102c0c010b02402016450d002017102c0b02402013450d002012450d002013102c0b200f450d002010102c0b0c010b024020042d00d4030d002008200c41306c6a21052008210102400340024020052001470d00410021070c020b20012d0000210b200141306a220a2101200b410c470d000b200a415c6a28020021070b2008200c41306c6a210520082101024003404100210a024020052001470d00410021010c020b20012d0000210b200141306a22062101200b4104470d000b200441e0006a200641546a10f404200428026421010b024020072001470d004101210741e100210b41f3da012105410021060c030b0240200c450d00200c41306c210c200821010340200110f504200141306a2101200c41506a220c0d000b0b41012106411a210a024020090d000c030b2008102c0c020b20042802d403220a4110762105200a410876210b200441d0036a41106a2802002117200441dc036a2802002116200441d0036a41086a28020021070b0240200c450d00200c41306c210c200821010340200110f504200141306a2101200c41506a220c0d000b0b4101210602402009450d002008102c0b20172109201621080b2005411074200b41ff017141087472200a41ff017172210502402006450d002008210b0c080b20042802b0022002470d06200441d0026a200c360200200441cc026a2009360200200420083602c802200420073602c402200420053602c002200441d0036a200441c0026a10f60420042802d00322010d052008200c41306c6a210b20082101024003400240200b2001470d00410021010c020b20012d00002102200141306a220a210120024102470d000b200441d8006a200a41546a10f40420042802582101200428025c21020b2002410020011b21132001410420011b210f2008200c41306c6a210b20082101024003400240200b2001470d00410021010c020b20012d00002102200141306a220a210120024108470d000b200441d0006a200a41546a10f40420042802502101200428025421020b2002410020011b21122001410420011b21172008200c41306c6a210b20082101024003400240200b2001470d00410021010c020b20012d00002102200141306a220a210120024104470d000b200441c8006a200a41546a10f40420042802482101200428024c21020b2002410020011b21162001410420011b21152008200c41306c6a210a2008210102400340410021020240200a2001470d00410021010c020b20012d0000210b200141306a22062101200b4103470d000b200441c0006a200641546a10f404200428024021012004280244210b0b0240200b410020011b220b450d00200b41286c210b2001410420011b41186a2101410021020340200220012d0000456a2102200141286a2101200b41586a220b0d000b0b024020120d00411e2101200041b9cbc5003602040c050b2017201241146c6a2112410021114100210d02400240034041d7cbc500210b41382101201741086a280200417c6a220641024b0d012017280200210a02400240024020060e03000401000b4101210d200a41afcbc500460d01200a28000041e3c2b1e306460d010c030b41012111200a41b3cbc500460d00200a41b3cbc500410610dd050d020b02402017410c6a280200450d0041132101200041d5ccc5003602040c080b0240201741106a280200220120026b220a20014d0d00412a2101200041e8ccc5003602040c080b41afccc500210b412621012016200a4d0d012015200a4102746a220a450d01418fccc500210b412021012013200a280200220a4d0d01200f200a4104746a220a450d014192cdc500210b411f2101200a2802080d01200a2d000d220a41077141044b0d010240200a0e050002020200000b201741146a22172012470d000b2011200d714101710d01411c411e201141017122021b2101200041b1cdc50041b9cbc50020021b3602040c060b2000200b3602040c050b2008200c41306c6a210b2008210102400340200b2001460d0120012d00002102200141306a220a210120024106470d000b200441386a200a41546a10f404200428023c450d00200041fdc8c500360204411f21010c050b2008200c41306c6a210b200328026821062008210102400340200b2001460d0120012d00002102200141306a220a210120024105470d000b200441306a200a41546a220110f4040240200428023441014d0d00411821012000419cc9c5003602040c060b200441286a200110f404200428022c450d0020042802282201450d00200128020020064d0d0041222101200041b4c9c5003602040c050b2008200c41306c6a210b2008210102400340200b2001460d0120012d00002102200141306a220a210120024107470d000b200441206a200a41546a10f4042004280220220120042802244104746a210b03402001200b460d012001450d012001410c6a2102200141106a210120022d0000410271450d000b41322101200041c0cac5003602040c050b2008200c41306c6a210b2008210102400340200b2001460d0120012d00002102200141306a220a21012002410c470d000b200a415c6a2802002201450d00200a41546a280200220a200141186c6a21060340200a220241186a210a2002280208410374210120022802002102024003402001450d01200141786a210120022d0004210b200241086a2102200b410271450d000b413121012000418fcac5003602040c070b200a2006470d000b0b2008200c41306c6a210b2008210102400340200b2001460d0120012d00002102200141306a220a210120024102470d000b200441186a200a41546a10f404200428021c2201450d002004280218220220014104746a211603402002450d01200241106a2117200420022d000d220b3a00d0032002280200220120022802086a2106410021024100200441d0036a200b4104461b210a024003400240024002400240200241ff01710e03000102000b20012006460d01410021022001210b200141016a21010c020b20012006460d03410121022001210b200141016a21010c010b200a450d0241022102200a210b4100210a0b200b2d0000410271450d000b41392101200041d6c9c5003602040c070b2017210220172016470d000b0b2008200c41306c6a210b20082101024003400240200b2001470d00410021010c020b20012d00002102200141306a220a210120024102470d000b200441106a200a41546a10f40420042802102101200428021421020b2002410020011b210f2001410420011b21122008200c41306c6a210b20082101024003400240200b2001470d00410021010c020b20012d00002102200141306a220a210120024103470d000b200441086a200a41546a10f40420042802082101200428020c210b0b2001410420011b2202200b410020011b41286c6a210a410021150340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002200a460d00412d21014198bac500210b20022802084103470d03024020022802002206419886c600460d002006419886c600410310dd050d040b200241286a2116411521064191b9c5002117411421014184bac500210b02400240024020022d00180e0400060118000b4136210641dbb8c5002117200f200228021c22014d0d17201220014104746a2213450d1720022802142106200228020c210220032d00700d012006410b470d014138210141ccb9c500210b200241cbd5c500460d05200241cbd5c500410b10dd05450d050c160b412f210141c5bac500210b20022802144106470d040240200228020c220641d5b8c500460d00200641d5b8c500410610dd050d050b02402015450d00411f2101200041f4bac5003602040c1e0b2002411c6a2115201621020c180b4126210141a6b9c500210b2006417d6a220641144b0d0302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020060e15002121210e042107320b0a120114111b10210c191d000b2002419b86c600460d202002419b86c600410310dd05450d20419b86c6002002410310dd050d204101102a2217450d35201741003a000020132d000c41e000460d010c300b20024191d3c500460d014191d3c5002002410f10dd05450d01200241a0d3c500460d0341a0d3c5002002410f10dd05450d030240200241b7d3c500460d0041b7d3c5002002410f10dd050d200b4107102a2217450d3420174100360003201741013a0002201741003b000020132d000c41e000460d060c2e0b20132802084101470d2e0240201328020022112017460d0041002102034020024101460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d300c000b0b20132d000d4104470d2e2017102c201621020c320b4104102a2217450d322017410036000020132d000c41e000470d2b20132802084104470d2b0240201328020022112017460d0041002102034020024104460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d2d0c000b0b20132d000d4104470d2b2017102c201621020c310b0240200241afd3c500460d00200229000042e5f0d1fbb5ac98b6ec00520d1d0b4107102a2217450d3120174100360003201741013a0002201741003b000020132d000c41e000460d010c290b4101102a2217450d30201741003a000020132d000c41e000470d2720132802084101470d27201328020022112017460d2641002102034020024101460d27201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d280c000b0b20132802084107470d27201328020022112017460d2441002102034020024107460d25201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d280c000b0b200241c6d3c500460d0141c6d3c5002002410a10dd05450d010240200241d0d3c500460d0041d0d3c5002002410a10dd050d060b4126210641a6b9c500211720132d000c41e000470d2b20132802080d2b2016210220132d000d4104460d2d0c2b0b20132802084107470d27201328020022112017460d2141002102034020024107460d22201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d280c000b0b4102102a2217450d2c201741003b000020132d000c41e000470d1f20132802084102470d1f0240201328020022112017460d0041002102034020024102460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d210c000b0b20132d000d4104470d1f2017102c201621020c2b0b0240200241e5d3c500460d0041e5d3c5002002410d10dd050d170b4126210641a6b9c500211720132d000c41e000470d2820132802080d282016210220132d000d4104460d2a0c280b0240200241f2d3c500460d0041f2d3c5002002410c10dd050d160b4126210641a6b9c500211720132d000c41e000470d2720132802080d272016210220132d000d4104460d290c270b024020024189d4c500460d004189d4c5002002411510dd050d150b4126210641a6b9c500211720132d000c41e000470d2620132802080d262016210220132d000d4104460d280c260b02402002419ed4c500460d00419ed4c5002002410a10dd050d140b4102102a2217450d28201741003b000020132d000c41e000460d010c1a0b0240200241a8d4c500460d0041a8d4c5002002410710dd050d130b4126210641a6b9c500211720132d000c41e000470d2420132802080d242016210220132d000d4104460d260c240b20132802084102470d180240201328020022112017460d0041002102034020024102460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d1a0c000b0b20132d000d4104470d182017102c201621020c250b0240200241afd4c500460d0041afd4c5002002411310dd050d110b4126210641a6b9c500211720132d000c41e000470d2220132802080d222016210220132d000d4104460d240c220b200241c2d4c500460d0141c2d4c5002002411110dd05450d0120024181d5c500460d064181d5c5002002411110dd05450d06024020024192d5c500460d004192d5c5002002411110dd050d100b4104102a2217450d242017410036000020132d000c41e000460d080c150b0240200241d3d4c500460d0041d3d4c5002002410e10dd050d0f0b4108102a2217450d232017420037000020132d000c41e000460d020c130b4102102a2217450d22201741003b000020132d000c41e000470d1120132802084102470d110240201328020022112017460d0041002102034020024102460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d130c000b0b20132d000d4104470d112017102c201621020c210b200241e1d4c500460d0141e1d4c5002002411010dd05450d01200241f1d4c500460d0241f1d4c5002002411010dd05450d020240200241d6d5c500460d0041d6d5c5002002411010dd050d0d0b4126210641a6b9c500211720132d000c41e000470d1e20132802080d1e2016210220132d000d4104460d200c1e0b20132802084108470d100240201328020022112017460d0041002102034020024108460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d120c000b0b20132d000d4104470d102017102c201621020c1f0b4126210641a6b9c500211720132d000c41e000470d1c20132802080d1c20132d000d22014104460d1c20162102200141fb0171450d1e0c1c0b4103102a2217450d1e201741003a0002201741003b000020132d000c41e000470d0c20132802084103470d0c0240201328020022112017460d0041002102034020024103460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d0e0c000b0b20132d000d4104470d0c2017102c201621020c1d0b4102102a2217450d1d201741003b000020132d000c41e000470d0a20132802084102470d0a0240201328020022112017460d0041002102034020024102460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d0c0c000b0b20132d000d4104470d0a2017102c201621020c1c0b0240200241a3d5c500460d0041a3d5c5002002411610dd050d080b4102102a2217450d1c201741003b000020132d000c41e000460d020c080b20132802084104470d0c0240201328020022112017460d0041002102034020024104460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d0e0c000b0b20132d000d4104470d0c2017102c201621020c1a0b0240200241b9d5c500460d0041b9d5c5002002411210dd050d060b4126210641a6b9c500211720132d000c41e000470d1720132802080d172016210220132d000d4104460d190c170b20132802084102470d050240201328020022112017460d0041002102034020024102460d01201720026a210b201120026a2106200241016a210220062d0000200b2d0000470d070c000b0b20132d000d4104470d052017102c201621020c180b0240200241e6d5c500460d0041e6d5c5002002411710dd050d040b4102102a2211450d18201141003b000020132d000c41e000470d0220132802084102470d022013280200220d2011460d0141002102034020024102460d02201120026a2106200d20026a2117200241016a210220172d000020062d0000470d030c000b0b0240024020150d004100211b4100211c0c010b024020152802040d0020004193bbc500360204413221010c1d0b02402015280200221b201541086a280200221c4d0d00200041c5bbc50036020441c90021010c1d0b201c20032802644d0d002000418ebcc50036020441c10021010c1c0b200441d0036a41086a22024200370300200441d0e1c1003602d40320042003290308221aa7417f201a428080808010541b3602e00320042003290310221aa7417f201a428080808010541b3602d003200441d0036a4104722201410d10f7042001410c10f7042001410710f7042001410f10f704200441e8006a41106a20042802e003360200200441e8006a41086a2002290300370300200420042903d003370368200441d0036a41106a220b200c360200200441d0036a410c6a2009360200200420083602d803200420073602d403200420053602d00320044180016a200441d0036a10f8044101102a2201450d17200141003a0000200420042f01d003220c3b01c002200b41e0083b01002002428180808010370300200420013602d403200441013602d0032004200c3b01e20320044180016a200441d0036a10f90421054103102a2202450d17200241026a41002d009a86463a0000200241002f009886463b00004103102a220c450d17200c41026a41002d009d86463a0000200c41002f009b86463b0000200441c0026a41026a200441d0036a41026a220a2d000022083a0000200420042f00d00322093b01c00220044194016a280200210b20044180016a41106a2802002101200a20083a0000200420093b01d0030240200b2001470d00200141016a220b2001490d192001410174220a200b200a200b4b1b220bad42287e221a422088a70d19201aa7220a4100480d190240024020010d00200a102a21010c010b200428028c01200141286c200a102e21010b2001450d182004200b360290012004200136028c01200428029401210b0b200428028c01200b41286c6a220141003a00182001200c36020c200142838080803037020420012002360200200141106a428380808030370200200141196a20042f01d0033b00002001411b6a200441d2036a2d00003a00002001411c6a2005360200200420042802940141016a36029401200441d0036a20044180016a418c0110db051a20044190026a200441d0036a10fa0420044190026a41106a280200220941306c2101200428029802220841546a2102024003404100210c2001450d01200141506a21012002412c6a210b200241306a22052102200b2d00004103470d000b200541086a2802002201450d00200141286c2102200528020041186a21014100210c0340200c20012d0000456a210c200141286a2101200241586a22020d000b0b200941306c2101200841546a2102200c417f6a210b024003404100210c2001450d01200141506a21012002412c6a2105200241306a220a210220052d00004103470d000b200a41086a2802002201450d00200141286c2102200a28020041186a21014100210c0340200c20012d0000456a210c200141286a2101200241586a22020d000b0b200941306c21012008415c6a21020240034041002106024020010d00410021010c020b200141506a2101200241246a2105200241306a220a210220052d00004104470d000b200a28020021010b02400240024002402009450d002001200c6a21102008200941306c6a210f200441e8006a41047221194100211d4100210e0340024020082d000041786a220141044b0d00024002400240024020010e050301020400030b200828020c2201450d0320082802042205200141186c6a211e200e210103402001210e02402005220c2802144104742202450d00200c28020c21010340024020012d0000410b470d00200141046a2205280200220a200b490d002005200a41016a3602000b200141106a2101200241706a22020d000b0b200442003703e00320044280808080c0003703d803200442043703d0034110102a2201450d2120042802d8032102200420013602d003200441013602d403200120024104746a22014200370200200141056a4200370000200420042802d80341016a3602d8030240200c2802142214450d00410021162014210103400240024002400240024002400240201620014f0d00411021050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200c28020c221820164104746a2d000022110eac010001020202020202020202020202020303030404050506060707080809090a0a0b0b0c0d0d0e0e0f0f1010111213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f2020212122222323242425252627272828292a2a2b2b2c2d2d2e2e2f2f303031313232333434353536363737383839393a3a3b3b3c3c3d3d3e3e3f3f40404141424243434444454546464747484a4a4a4a49494a4a4a4a4a4a4a4a4a4a4a4a4a4a4b4b4b4b000b411121050c4a0b411221050c490b410a21050c480b410821050c470b410821050c460b410421050c450b410421050c440b410421050c430b410421050c420b410421050c410b410421050c400b410421050c3f0b410521050c3e0b410521050c3d0b410521050c3c0b410521050c3b0b410521050c3a0b411321050c390b411421050c380b410621050c370b410721050c360b410b21050c350b410b21050c340b410b21050c330b410b21050c320b410b21050c310b410b21050c300b410b21050c2f0b410b21050c2e0b410b21050c2d0b410b21050c2c0b410b21050c2b0b410c21050c2a0b410c21050c290b410c21050c280b410c21050c270b410c21050c260b410c21050c250b410021050c240b410021050c230b410121050c220b410221050c210b410321050c200b410321050c1f0b410021050c1e0b410021050c1d0b410021050c1c0b410021050c1b0b410021050c1a0b410021050c190b410121050c180b410221050c170b410321050c160b410321050c150b410021050c140b410021050c130b410021050c120b410021050c110b410d21050c100b410d21050c0f0b410d21050c0e0b410d21050c0d0b410d21050c0c0b410d21050c0b0b410d21050c0a0b410d21050c090b410d21050c080b410d21050c070b410d21050c060b410d21050c050b410d21050c040b410d21050c030b410e21050c020b410e21050c010b410f21050b201641016a21122004280270211520192101024003402001280200220641086a211720062f0106210a41002102024002400340200a20022201460d01200141016a210202404100417f4101201720016a2d0000220720054b1b20072005461b41016a0e03000301000b0b2002417f6a210a0b024020150d00200441e8006a21020c030b2015417f6a21152006200a4102746a41ec006a21010c010b0b200441e8006a21020240200620014103746a41146a22012802000e0401070001010b200141046a21020b20022802002102024002400240024002400240024002402011417e6a220141084b0d0020010e090103020c0405050607010b20042802d8032201417f6a220520014f0d0c200520014b0d0c20042802d00320054104746a2205280208220120026a22022001490d0c200541086a20023602000c0d0b20042802d8032201417f6a220520014f0d0b200520014b0d0b20042802d00320054104746a2205280208220120026a22022001490d0b200541086a200236020020042802d8032201417f6a220520014f0d0b200520014b0d0b20042802d003220220054104746a280204210502400240200120042802d403460d002001210a0c010b200141016a220a2001490d3220014101742206200a2006200a4b1b220a41ffffffff0071200a470d32200a41047422064100480d32200220014104742006102e2202450d312004200a3602d403200420023602d00320042802d803210a0b2002200a4104746a220220093b000d200241003a000c20022005360204200220013602002002410f6a20094110763a0000200241086a4100360200200420042802d80341016a3602d8030c0c0b20042802d8032201417f6a220520014f0d0a200520014b0d0a20042802d00320054104746a2205280208220120026a22022001490d0a200541086a200236020020042802d803220221010240200220042802d403470d00200241016a22012002490d31200241017422052001200520014b1b220141ffffffff00712001470d31200141047422054100480d310240024020020d002005102a21050c010b20042802d00320024104742005102e21050b2005450d30200420013602d403200420053602d00320042802d80321010b20042802d00320014104746a220120093b000d200141003a000c20012012360204200120023602002001410f6a20094110763a0000200141086a4100360200200420042802d80341016a3602d8030c0b0b20042802d8032201417f6a220520014f0d09200520014b0d0920042802d00320054104746a2205280208220120026a22022001490d09200541086a200236020020042802d803220221010240200220042802d403470d00200241016a22012002490d30200241017422052001200520014b1b220141ffffffff00712001470d30200141047422054100480d300240024020020d002005102a21050c010b20042802d00320024104742005102e21050b2005450d2f200420013602d403200420053602d00320042802d80321010b20042802d00320014104746a220120093b000d200141013a000c20012012360204200120023602002001410f6a20094110763a0000200141086a4100360200200420042802d80341016a3602d8030c0a0b200441d0036a201610fb040d0820042802d8032202450d0820042002417f6a22013602d80320042802d003220520014104746a220a2d000c4102460d082001450d092002417e6a220220014f0d08200520024104746a2205200a280200220220052802002205200520024b1b360200200220014f0d09200441d0036a201610fb040d080c090b20042802d8032201417f6a220520014f0d07200520014b0d0720042802d00320054104746a2205280208220120026a22022001490d07201820164104746a41046a280200210a200541086a200236020020042802d8032201417f6a220220014b0d072002200a6b220120024b0d07200441d0036a201610fb040d0720042802d803220220014d0d0720042802d003220520014104746a2d000c0d08200241047420056a41706a2202200120022802002202200220014b1b3602000c080b20042802d8032201417f6a220520014f0d06200520014b0d0620042802d00320054104746a2205280208220120026a22022001490d06200541086a200236020020042802d8032201417f6a220720014b0d06201820164104746a41046a280200220128020421022001280200211120012802082101200441003a00c0020240200720016b220120074d0d00200441013a00c0020c070b4104102a2206450d2b20062001360200024020020d00410121054101210a0c040b200720112802006b221720074b0d0241022105200241027421184101210a4104210141022102034002402005417f6a2215200a470d00201541016a220a2015490d2e2002200a2002200a4b1b220a41ffffffff0371200a470d2e200a41027422154100480d2e0240024020020d002015102a21060c010b200620012015102e21060b2006450d2d0b200620016a201736020020182001460d04201120016a2117200541016a2105200241026a2102200141046a2101200720172802006b221720074d0d000b200441013a00c0020c040b20042802d8032201417f6a220520014f0d05200520014b0d0520042802d00320054104746a2205280208220120026a22022001490d05200541086a2002360200200441d0036a201610fb040d0520042802d8032201450d0520042802d00322022d000c0d06200141047420026a41706a41003602000c060b41a086c600201620011038000b4101210a200441013a00c0020c010b20042d00c0020d002006450d022005ad422086200aad84211a410121170240200441d0036a201610fb040d000240201a422088a72201450d002001410274210520062101034020042802d803220a200128020022024d0d02024020042802d003220720024104746a2d000c0d00200a41047420076a41706a220a2002200a280200220a200a20024b1b3602000b200141046a21012005417c6a22050d000b0b410021170b0240201aa7450d002006102c0b20170d020c030b200a450d012006102c0c010b200441d0036a201610fb04450d010b024020042802d403450d0020042802d003102c0b024020042802e003450d0020042802dc03102c0b4101211d0c070b20122014460d01200c2802142101201221160c000b0b20042802dc0320042802e4032201410041202001676b10fc0420042903e003211f20042802dc032118024020042802d403450d0020042802d003102c0b024020180d004101211d0c050b024002400240200c2802142202201f422088a722064101746a220141ffffffff00712001470d0020014104742205417f4c0d000240024020050d00410821050c010b2005102a2205450d25200c28021421020b200c4100360214200c28020c2120200c200536020c200c41106a220a2802002121200a2001360200202020024104746a2115201820064103746a211441022106024020020d0020182112202021010c020b410021012018211241002105202021020340200241016a2f0000200241036a2d0000411074722109024020022d0000220741ac01470d00200241106a21010c030b200241086a290000211a200241046a28000021170240024020064102470d00024020122014470d0041002106201421120c020b20122902002222422088a7210d2022a7211341012106201241086a21120b20064101470d0020052013470d0002402001200a280200470d00200141016a22062001490d28200141017422162006201620064b1b220641ffffffff00712006470d28200641047422164100480d280240024020010d002016102a21010c010b200c28020c20014104742016102e21010b2001450d27200c200136020c200a2006360200200c28021421010b200c28020c20014104746a220120042f00d0033b00012001412d3a00002001200d360204200141036a200441d0036a41026a2d00003a0000200c200c28021441016a220136021402402001200a280200470d00200141016a22062001490d28200141017422162006201620064b1b220641ffffffff00712006470d28200641047422164100480d280240024020010d002016102a21010c010b200c28020c20014104742016102e21010b2001450d27200c200136020c200a2006360200200c28021421010b200c28020c20014104746a220120042f00d0033b00012001410b3a00002001200b36020441022106200141036a200441d0036a41026a2d00003a0000200c200c28021441016a2201360214200521130b02402001200a280200470d00200141016a22162001490d27200141017422112016201120164b1b221641ffffffff00712016470d27201641047422114100480d270240024020010d002011102a21010c010b200c28020c20014104742011102e21010b2001450d26200c200136020c200a2016360200200c28021421010b200541016a2105200c28020c20014104746a2201201a37030820012017360204200120093b0001200120073a0000200141036a20094110763a0000200c200c28021441016a2201360214200241106a22022015470d000c030b0b103a000b20012015460d0003400240024020012d000022024109460d00200241ac01470d010c030b0240200141046a280200220228020441ffffffff0371450d002002280200102c0b2002102c0b200141106a22012015470d000b0b201fa7210102402021450d002020102c0b2012201447200620064102461b210202402001450d002018102c0b024020024101470d004101211d0c050b200c41186a2105024002402004280278450d00200c2802142202450d00200c28020c2101200241047421024100210c0340024020012d0000412c470d002001410b3a0000200141046a2010360200200c41016a210c0b200141106a2101200241706a22020d000b41012101200c0d010b200e21010b2005201e470d000b2001210e0c030b20082802042201200b490d022008200141016a3602040c020b200828020c2201450d01200828020422052001411c6c6a210a034020052201411c6a2105024020012802182202450d002001280210210120024102742102034002402001280200220c200b490d002001200c41016a3602000b200141046a21012002417c6a22020d000b0b2005200a460d020c000b0b200828020c2201450d00200141146c2102200828020441106a2101034002402001417c6a2802000d002001280200220c200b490d002001200c41016a3602000b200141146a21012002416c6a22020d000b0b200841306a2208200f470d000b201d4101710d02200e4101710d0120042802a002210620042802980221080b2004419c026a280200211520042802940221072004280290022117410021160c020b200441d0036a41106a20044190026a41106a280200360200200441d0036a41086a20044190026a41086a29030037030020042004290390023703d003200441c0026a200441d0036a10f8044110102a2202450d19200241063a00004101102a2201450d19200141003a00004101102a2205450d19200520012d00003a00002001102c4110102a220c450d19200c41063a000041f000102a2201450d19200141063a00602001412c3b01502001200b3602442001410b3a0040200141d8003a0030200120042802783602242001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00000240200c2d00004109470d000240200c280204220b28020441ffffffff0371450d00200b280200102c200c280204210b0b200b102c0b200c102c024020022d00004109470d0002402002280204220c28020441ffffffff0371450d00200c280200102c2002280204210c0b200c102c0b2002102c200441f4036a4287808080f000370200200441f0036a2001360200200441ec036a4100360200200441d0036a410c6a4281808080800c370200200441d8036a4101360200200441003602fc03200442043702e403200420053602d403200441013602d003200441c0026a200441d0036a10fd04200441d0036a200441c0026a418c0110db051a200441a8026a200441d0036a10fa04200441a8026a410c6a2802002115200441b8026a280200210620042802a802211720042802ac02210720042802b0022108410021160c010b2004419c026a28020021152004280298022108024020042802a0022206450d00200641306c2102200821010340200110f504200141306a2101200241506a22020d000b0b41012116411a210741f2cac50021172015450d002008102c0b200441f4006a2802002109200428026c210c0240200441f0006a2802002201450d000340200c28026c210c2001417f6a22010d000b0b4100210b41002101024003402009450d01024002402001200c2f01064f0d00200c20014103746a41146a290200211a200141016a21010c010b02400240200c28020022010d00200bad211a41002105410021010c010b200c330104422086200bad84211a410121050b200c102c201aa7210b02400240201a422088a7220a20012f01064f0d00200121020c010b034002400240200128020022020d00200bad211a410021020c010b200541016a21052001330104422086200bad84211a0b2001102c201aa7210b20022101201a422088a7220a20022f01064f0d000b0b200a41027420026a41f0006a280200210c2002200a4103746a41146a290200211a02402005417f6a2201450d000340200c28026c210c2001417f6a22010d000b0b410021010b2009417f6a2109201aa74103470d000b0b0240200c41d0e1c100460d00200c2802002101200c102c2001450d00200128020021022001102c2002450d00024020022802002201450d0003402002102c200121022001280200220c2101200c0d000b0b2002102c0b02402016450d002000201736020420004101360200200041086a20073602000c210b200441c0026a41106a2006360200200441c0026a410c6a2015360200200420083602c802200420073602c402200420173602c002200441d0036a200441c0026a200328026010fe04024020042802d0034101470d000240200441d0036a41086a280200450d0020042802d403102c0b2000418ccbc50036020420004101360200200041086a41233602000c210b200441e4036a280200210c200441d0036a41106a2802002113200441d0036a410c6a2802002115200441d8036a280200210b20042802d40321022003280258210f200441003602b002200442013703a8024104102a2201450d17200441043602ac02200420042802b002220541046a3602b002200420013602a802200120056a20023600000240024020042802ac02220220042802b00222016b4104490d0020042802a80221020c010b200141046a22052001490d19200241017422012005200120054b1b22014100480d190240024020020d002001102a21020c010b20042802a80220022001102e21020b2002450d18200420013602ac02200420023602a80220042802b00221010b2004200141046a3602b002200220016a200b3600002015200c41306c22016a210b024002400240200c0d00201521010c010b200141506a2106200441d0036a4101722102200441d0036a41276a2105200441d0036a41206a210a200441d0036a41186a2108200441d0036a41086a2109201521010240034020012d0000210c2005200141286a290000370000200a200141216a2900003703002008200141196a290000370300200441d0036a41106a2207200141116a2900003703002009200141096a2900003703002004200141016a2900003703d0030240200c4110470d00200141306a21010c030b200441c0026a41276a22172005290000370000200441c0026a41206a2216200a290300370300200441c0026a41186a2008290300221a370300200441c0026a41106a20072903002222370300200441c0026a41086a2009290300221f370300200420042903d00322233703c00220022023370000200241086a201f370000200241106a2022370000200241186a201a370000200241206a2016290300370000200241276a20172900003700002004200c3a00d00320044180016a200441d0036a200441a8026a10ff0420042d008001220c411f470d01200641506a2106200141306a2201200b470d000b200b21010c010b2004280284012112200428028801210f02402006450d00200141306a2101200441d0036a4101722102200441d0036a41276a210a200441d0036a41206a2108200441d0036a41186a2109200441d0036a41086a2106034020012d00002105200a200141286a2900003700002008200141216a2900003703002009200141196a290000370300200441d0036a41106a2207200141116a2900003703002006200141096a2900003703002004200141016a2900003703d00320054110460d01200441c0026a41276a2217200a290000370000200441c0026a41206a22162008290300370300200441c0026a41186a2009290300221a370300200441c0026a41106a20072903002222370300200441c0026a41086a2006290300221f370300200420042903d00322233703c00220022023370000200241086a201f370000200241106a2022370000200241186a201a370000200241206a2016290300370000200241276a2017290000370000200420053a00d003200441d0036a10f504200141306a2201200b470d000b0b02402013450d002015102c0b024020042802ac02450d0020042802a802102c0b200c4105470d01200f450d012012102c0c010b02402001200b460d00200441d0036a4101722102200441d0036a41276a2105200441d0036a41206a210a200441d0036a41186a2108200441d0036a41086a2109034020012d0000210c2005200141286a290000370000200a200141216a2900003703002008200141196a290000370300200441d0036a41106a2206200141116a2900003703002009200141096a2900003703002004200141016a2900003703d003200c4110460d01200441c0026a41276a22072005290000370000200441c0026a41206a2217200a290300370300200441c0026a41186a2008290300221a370300200441c0026a41106a20062903002222370300200441c0026a41086a2009290300221f370300200420042903d00322233703c00220022023370000200241086a201f370000200241106a2022370000200241186a201a370000200241206a2017290300370000200241276a20072900003700002004200c3a00d003200441d0036a10f504200141306a2201200b470d000b0b02402013450d002015102c0b20042802a802210120042902ac02211a2000411c6a41003a0000200041146a201a370200200041106a20013602002000410c6a201c360200200041086a201b3602002000200f3602042000411d6a20042f0090023b0000200041003602002000411f6a20044192026a2d00003a00000c210b200041cdcdc50036020420004101360200200041086a41253602000c200b20132d000d22024104460d00200241fb01710d002011102c201621020c150b2011102c0b2000200b3602040c180b2017102c200041a6b9c5003602040c170b2017102c200041a6b9c5003602040c160b2017102c200041a6b9c5003602040c150b2017102c200041a6b9c5003602040c140b2017102c200041a6b9c5003602040c130b2017102c200041a6b9c5003602040c120b2017102c200041a6b9c5003602040c110b2017102c200041a6b9c5003602040c100b20132d000d22024104460d05200241fb01710d052017102c201621020c0a0b20132d000d22024104460d02200241fb01710d022017102c201621020c090b20132d000d22024104460d00200241fb01710d002017102c201621020c080b2017102c200041a6b9c5003602040c0c0b2017102c200041a6b9c5003602040c0b0b2017102c200041a6b9c5003602040c0a0b2017102c200041a6b9c5003602040c090b2017102c200041a6b9c5003602040c080b02400240200241dad3c500460d0041dad3c5002002410b10dd050d010b4126210641a6b9c500211720132d000c41e000470d0120132802080d012016210220132d000d4104460d030c010b0240200241fed3c500460d0041fed3c5002002410b10dd050d020b4126210641a6b9c500211720132d000c41e000470d0020132802080d002016210220132d000d4104460d020b20062101200020173602040c060b0240200241cbd5c500460d0041cbd5c5002002410b10dd050d050b4102102a2206450d01200641003b000020132d000c41e000470d0320132802084102470d030240201328020022172006460d0041002101034020014102460d01200620016a2102201720016a210b200141016a2101200b2d000020022d0000470d050c000b0b20132d000d4104470d032006102c201621020c000b0b1033000b1035000b2006102c0b41262101200041a6b9c5003602040b20004101360200200041086a20013602000240200c450d002008200c41306c6a21072008210a0340200a220541306a210a0240024020052d00002201410e4b0d00024002400240024002400240024002400240024002400240024020010e0f0001020304050607080e090e0a0b0c000b200541086a280200450d0d200541046a280200102c0c0d0b0240200541086a280200450d00200541046a280200102c0b200541146a280200450d0c200541106a280200102c0c0c0b02402005410c6a2802002202450d00200541046a28020021012002410474210203400240200141046a280200450d002001280200102c0b200141106a2101200241706a22020d000b0b200541086a280200450d0b2005280204102c0c0b0b02402005410c6a2802002202450d00200541046a2802002101200241286c210203400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101200241586a22020d000b0b200541086a280200450d0a2005280204102c0c0a0b200541086a280200450d09200541046a280200102c0c090b200541086a280200450d08200541046a280200102c0c080b200541086a280200450d07200541046a280200102c0c070b02402005410c6a2802002201450d00200541046a280200220b20014104746a210603400240200b2802082202450d00200b2802002101200241047421020340024020012d00004109470d000240200141046a2200280200220c28020441ffffffff0371450d00200c280200102c2000280200210c0b200c102c0b200141106a2101200241706a22020d000b0b200b41106a21010240200b41046a280200450d00200b280200102c0b2001210b20012006470d000b0b200541086a280200450d062005280204102c0c060b02402005410c6a2802002202450d00200541046a2802002101200241146c210203400240200141046a280200450d002001280200102c0b200141146a21012002416c6a22020d000b0b200541086a280200450d052005280204102c0c050b02402005410c6a2802002201450d00200541046a280200220b2001411c6c6a210603400240200b2802042201450d000240200b410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2200280200220c28020441ffffffff0371450d00200c280200102c2000280200210c0b200c102c0b200141106a2101200241706a22020d000b0b200b41086a280200450d00200b280204102c0b200b411c6a21010240200b41146a280200450d00200b280210102c0b2001210b20012006470d000b0b200541086a280200450d042005280204102c0c040b02402005410c6a2802002201450d00200541046a280200220b200141186c6a210603400240200b41046a280200450d00200b280200102c0b0240200b41146a2802002202450d00200b28020c2101200241047421020340024020012d00004109470d000240200141046a2200280200220c28020441ffffffff0371450d00200c280200102c2000280200210c0b200c102c0b200141106a2101200241706a22020d000b0b200b41186a21010240200b41106a280200450d00200b28020c102c0b2001210b20012006470d000b0b200541086a280200450d032005280204102c0c030b02402005410c6a2802002201450d00200541046a280200220b2001411c6c6a210603400240200b2802042201450d000240200b410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2200280200220c28020441ffffffff0371450d00200c280200102c2000280200210c0b200c102c0b200141106a2101200241706a22020d000b0b200b41086a280200450d00200b280204102c0b200b411c6a21010240200b41146a280200450d00200b280210102c0b2001210b20012006470d000b0b200541086a280200450d022005280204102c0c020b0240200541046a2802002201450d00200541086a280200450d002001102c0b0240200541146a2802002201450d0002402005411c6a2802002202450d002002410c6c2102034002402001280200220c450d00200141046a280200450d00200c102c0b2001410c6a2101200241746a22020d000b0b200541186a280200450d002005280214102c0b200541246a280200220b450d0102402005412c6a2802002201450d00200b20014104746a21060340200b220041106a210b024020002802042201450d0002402000410c6a2802002202450d002002410c6c2102034002402001280200220c450d00200141046a280200450d00200c102c0b2001410c6a2101200241746a22020d000b0b200041086a280200450d002000280204102c0b200b2006470d000b0b200541286a280200450d012005280224102c0c010b0240200541086a280200450d00200541046a280200102c0b0240200541146a2802002201450d00200541186a280200450d002001102c0b200541246a280200450d00200541206a280200102c0b200a2007470d000b0b2009450d042008102c0c040b024020042802d403450d002001102c0b0240200c450d00200c41306c2102200821010340200110f504200141306a2101200241506a22020d000b0b41eac8c5002101411321022009450d022008102c0c020b200441003a0068200441e4036a4101360200200442013702d403200441f0f7c5003602d0032004412b36029402200420044190026a3602e0032004200441e8006a3602900220044180016a200441d0036a10372004280280012107200428028401210b0240200c450d00200c41306c2102200821010340200110f504200141306a2101200241506a22020d000b0b410521052009450d002008102c0b41d4c8c500210141162102200b450d00200541ff01714105470d002007102c0b2000200136020420004101360200200041086a20023602000b200441e0046a24000b130020004104360204200041e8e8c2003602000b3400200041cee5c20036020420004100360200200041146a4105360200200041106a41b8f3c200360200200041086a42133702000b3400200041fde7c20036020420004100360200200041146a4105360200200041106a41b8f3c200360200200041086a42133702000b02000bb30303047f017e017f230041d0006b22012400200141c0006a41086a22024196e0c500ad4280808080f000841002220341086a290000370300200120032900003703402003102c200141206a41086a22042002290300370300200120012903403703202002419ff8c200ad42808080808002841002220341086a290000370300200120032900003703402003102c200141306a41086a20022903002205370300200141086a2004290300370300200141186a20053703002001200129034022053703302001200129032037030020012005370310024002404101450d004120210402400240024002404120450d004120102a22020d010c050b411021044110102a2202450d04200141106a210320022001290300370000200241086a200141086a2903003700000c010b20022001290300370000200241086a200141086a290300370000200141106a21034120210641204110470d010b20022004200441017422064120200641204b1b2206102e2202450d020b20022003290000370010200241186a200341086a290000370000200041203602082000200636020420002002360200200141d0006a24000f0b103a000b1033000bb80801067f230041106b220224002002410036020820024201370300200028020022032802002104200328020822052002106702402005450d0020054105742105034020042002109101200441206a2104200541606a22050d000b0b200328020c2106024002400240024020022802042205200228020822046b4104490d00200228020021050c010b200441046a22072004490d02200541017422042007200420074b1b22044100480d020240024020050d002004102a21050c010b200228020020052004102e21050b2005450d012002200436020420022005360200200228020821040b2002200441046a360208200520046a200636000020032d0010210302400240200228020420022802082204460d00200228020021050c010b200441016a22052004490d02200441017422062005200620054b1b22064100480d020240024020040d002006102a21050c010b200228020020042006102e21050b2005450d012002200636020420022005360200200228020821040b2002200441016a360208200520046a20033a000002400240200028020422042d00004101460d0002400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d04200541017422002003200020034b1b22004100480d040240024020050d002000102a21030c010b200228020020052000102e21030b2003450d032002200036020420022003360200200228020821050b2002200541016a360208200320056a41003a00000c010b02400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d03200541017422002003200020034b1b22004100480d030240024020050d002000102a21030c010b200228020020052000102e21030b2003450d022002200036020420022003360200200228020821050b2002200541016a360208200320056a41013a0000200441016a20021091010b0240024020042d00214101460d0002400240200228020420022802082204460d00200228020021050c010b200441016a22052004490d04200441017422032005200320054b1b22034100480d040240024020040d002003102a21050c010b200228020020042003102e21050b2005450d032002200336020420022005360200200228020821040b2002200441016a360208200520046a41003a00000c010b02400240200228020420022802082205460d00200228020021030c010b200541016a22032005490d03200541017422002003200020034b1b22004100480d030240024020050d002000102a21030c010b200228020020052000102e21030b2003450d022002200036020420022003360200200228020821050b2002200541016a360208200320056a41013a0000200441226a20021091010b200228020421042001290200200235020842208620022802002205ad84100102402004450d002005102c0b200241106a24000f0b1033000b1035000ba80e03057f017e017f230041e0036b22012400200141d8026a41086a22024196e0c500ad4280808080f000841002220341086a290000370300200120032900003703d8022003102c200141d0006a41086a22042002290300370300200120012903d802370350200241c9f8c200ad4280808080a001841002220341086a290000370300200120032900003703d8022003102c20014190026a41086a22052002290300370300200120012903d80237039002200141d8026a2000109f010240024002400240024041c000102a2203450d00200320012903503700002003200129039002370010200320012900d802370020200341086a2004290300370000200341186a2005290300370000200341286a2002290000370000200341306a200141e8026a290000370000200341386a200141d8026a41186a290000370000200141d8026a200341c00010f203024020012d00dc02220241024622000d002003ad428080808080088410050b2001410d6a200141d8026a41057241c30010db051a200141d0006a2001410d6a41c30010db051a20000d04200120023a00980120014198016a410172200141d0006a41c10010db052104200141ba016a21000240024020012d00b9014101460d00200141003602e0010c010b200141e0016a200010890420012d00980121020b024002400240200241ff01714101460d00200141003602f0010c010b200141f0016a200410890420012802f0010d010b024020012d00b9014101460d00200141d8026a108a0420013502e00242208620012802d8022202ad84100520012802dc02450d042002102c0c040b200141d8026a108a0420012802d8022102200120012802e002360294022001200236029002200020014190026a10a10220012802dc02450d032002102c0c030b20014180026a41086a200141f0016a41086a2802002202360200200120012903f00122063703800220014190026a2006a72204200210f203024020012d0094024102470d00200141003602a803200142013703a003200141b0036a41146a410d360200200141bc036a410b360200200141073602cc0320014196e0c5003602c8032001410b3602b4032001410a3602d403200141c9f8c2003602d003200120014180026a3602c0032001200141d0036a3602b8032001200141c8036a3602b0032001200141a0036a3602dc03200141d8026a41146a4103360200200142033702dc02200141849dc5003602d8022001200141b0036a3602e802200141dc036a41c49ac500200141d8026a10391a20013502a80342208620013502a00384100420012802a403450d0220012802a003102c0c020b200141d8026a20014190026a41c80010db051a2001419d036a200141b9016a220041206a2d00003a000020014195036a200041186a2900003700002001418d036a200041106a29000037000020014185036a200041086a290000370000200141fd026a2000290000370000200141003602b803200142013703b003200141d8026a200141b0036a108901200141d8026a410472200141b0036a10a30220012802b40321002002ad4220862004ad8420013502b80342208620012802b0032202ad8410012000450d012002102c0c010b1033000b0240200128028402450d00200128028002102c0b410121000c010b410021000b0240024020012802e00122020d00410021040c010b20014180026a41086a200141e0016a41086a2802002204360200200120012903e00122063703800220014190026a2006a72205200410f2030240024020012d0094024102470d00200141003602a803200142013703a003200141b0036a41146a410d360200200141bc036a410b360200200141073602cc0320014196e0c5003602c8032001410b3602b4032001410a3602d403200141c9f8c2003602d003200120014180026a3602c0032001200141d0036a3602b8032001200141c8036a3602b0032001200141a0036a3602dc03200141d8026a41146a4103360200200142033702dc02200141a89cc5003602d8022001200141b0036a3602e802200141dc036a41c49ac500200141d8026a10391a20013502a80342208620013502a00384100420012802a403450d0120012802a003102c0c010b200141d8026a20014190026a41c80010db051a200141fc026a200141b8016a2d00003a0000200141f4026a200141b0016a290300370200200141ec026a200141a8016a290300370200200141e4026a20014198016a41086a29030037020020012001290398013702dc02200141003602b803200142013703b003200141d8026a200141b0036a108901200141d8026a410472200141b0036a10a30220012802b40321072004ad4220862005ad8420013502b80342208620012802b0032204ad8410012007450d002004102c0b0240200128028402450d00200128028002102c0b410121040b0240200020012802f001220545720d0020012802f401450d002005102c0b2004200245720d0020012802e401450d002002102c0b2003102c200141e0036a24000b840d05027f017e027f017e047f230041f0036b220124004196e0c500ad4280808080f0008410022202290008210320022800042104200228000021052002102c41aff8c200ad4280808080a0018410022202290008210620022800042107200228000021082002102c200141d8026a2000109f01024002400240024041c000102a2202450d00200220063700182002200736001420022008360010200220033700082002200436000420022005360000200220012900d802370020200241286a200141e0026a290000370000200241306a200141e8026a290000370000200241386a200141f0026a290000370000200141d8026a200241c00010ee03024020012d00e802220041024622040d002002ad428080808080088410050b20012802dc02210520012802d80221072001200141ec026a41c40010db05220141c4006a200141c40010db051a20040d0320014188016a200141c4006a41c20010db051a200141aa016a21040240024020012d00a9014101460d00200141003602d0010c010b200141d0016a2004108b040b02400240024020012d0088014101460d00200141003602e0010c010b200141e0016a20014188016a410172108b0420012802e0010d010b0240024020012d00a9014101460d00200141d8026a10840420013502e00242208620012802d8022204ad84100520012802dc02450d012004102c0c010b200141d8026a10840420012802d8022108200120012802e002360284022001200836028002200420014180026a10a10220012802dc02450d002008102c0b410021080c030b200141f0016a41086a200141e0016a41086a2802002204360200200120012903e00122033703f00120014180026a2003a72209200410ee03024020012d0090024102470d00200141003602b803200142013703b003200141c0036a41146a410d360200200141cc036a410b360200200141073602dc0320014196e0c5003602d8032001410b3602c4032001410a3602e403200141aff8c2003602e0032001200141f0016a3602d0032001200141e0036a3602c8032001200141d8036a3602c0032001200141b0036a3602ec03200141d8026a41146a4103360200200142033702dc02200141849dc5003602d8022001200141c0036a3602e802200141ec036a41c49ac500200141d8026a10391a20013502b80342208620013502b00384100420012802b403450d0220012802b003102c0c020b200141d8026a20014180026a41d80010db051a200141ad036a200141a9016a220841206a2d00003a0000200141a5036a200841186a2900003700002001419d036a200841106a29000037000020014195036a200841086a2900003700002001418d036a2008290000370000200120043602c403200120093602c003200141d8026a200141c0036a108c0420012802dc02450d0120012802d802102c0c010b1033000b024020012802f401450d0020012802f001102c0b410121080b0240024020012802d00122040d00410021090c010b200141f0016a41086a200141d0016a41086a2802002209360200200120012903d00122033703f00120014180026a2003a7220a200910ee030240024020012d0090024102470d00200141003602b803200142013703b003200141c0036a41146a410d360200200141cc036a410b360200200141073602dc0320014196e0c5003602d8032001410b3602c4032001410a3602e403200141aff8c2003602e0032001200141f0016a3602d0032001200141e0036a3602c8032001200141d8036a3602c0032001200141b0036a3602ec03200141d8026a41146a4103360200200142033702dc02200141a89cc5003602d8022001200141c0036a3602e802200141ec036a41c49ac500200141d8026a10391a20013502b80342208620013502b00384100420012802b403450d0120012802b003102c0c010b200141d8026a20014180026a41d80010db051a2001418c036a200141a8016a2d00003a000020014184036a200141a0016a290300370200200141fc026a20014198016a290300370200200141f4026a20014188016a41086a29030037020020012001290388013702ec02200120093602c4032001200a3602c003200141d8026a200141c0036a108c0420012802dc02450d0020012802d802102c0b024020012802f401450d0020012802f001102c0b410121090b0240200820012802e001220a45720d0020012802e401450d00200a102c0b2009200445720d0020012802d401450d002004102c0b2002102c024020004102460d002005450d002007102c0b200141f0036a24000bb10501067f230041e0006b22012400200141c0006a41086a22024196e0c500ad4280808080f000841002220341086a290000370300200120032900003703402003102c200141086a200229030037030020012001290340370300200241a8f9c200ad42808080809001841002220341086a290000370300200120032900003703402003102c200141106a41086a2002290300370300200120012903403703100240024002404104102a2202450d0020014204370244200120023602402000200141c0006a109101200028022021030240024020012802442200200128024822026b4104490d00200128024021000c010b200241046a22042002490d02200041017422022004200220044b1b22024100480d020240024020000d002002102a21000c010b200128024020002002102e21000b2000450d012001200236024420012000360240200128024821020b2001200241046a360248200020026a200336000020012802442100200141c0006a41186a2203200135024842208620012802402205ad841006220241186a290000370300200141c0006a41106a2204200241106a290000370300200141c0006a41086a2206200241086a290000370300200120022900003703402002102c200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a20062903003703002001200129034037032002402000450d002005102c0b41c000102a22020d020b1033000b1035000b200220012903003700002002200129031037001020022001290320370020200241086a200141086a290300370000200241186a200141106a41086a290300370000200241286a200141206a41086a290300370000200241306a200141306a290300370000200241386a200141206a41186a2903003700002002ad428080808080088410052002102c200141e0006a24000bbd0201057f230041c0006b22022400200241206a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341c9f8c200ad4280808080a001841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2001109f01024041c000102a22040d001033000b200420022903003700002004200229031037001020042002290020370020200042c0808080800837020420002004360200200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241c0006a24000bb30303047f017e017f230041d0006b22012400200141c0006a41086a22024196e0c500ad4280808080f000841002220341086a290000370300200120032900003703402003102c200141206a41086a2204200229030037030020012001290340370320200241b9f8c200ad42808080808002841002220341086a290000370300200120032900003703402003102c200141306a41086a20022903002205370300200141086a2004290300370300200141186a20053703002001200129034022053703302001200129032037030020012005370310024002404101450d004120210402400240024002404120450d004120102a22020d010c050b411021044110102a2202450d04200141106a210320022001290300370000200241086a200141086a2903003700000c010b20022001290300370000200241086a200141086a290300370000200141106a21034120210641204110470d010b20022004200441017422064120200641204b1b2206102e2202450d020b20022003290000370010200241186a200341086a290000370000200041203602082000200636020420002002360200200141d0006a24000f0b103a000b1033000bbd0201057f230041c0006b22022400200241206a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341aff8c200ad4280808080a001841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2001109f01024041c000102a22040d001033000b200420022903003700002004200229031037001020042002290020370020200042c0808080800837020420002004360200200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241c0006a24000bcc0301057f230041106b22022400200241003602082002420137030020002802002103200028020822042002106702402004450d0020044105742104034020032002109101200341206a2103200441606a22040d000b0b200028020c2105024002400240024020022802042204200228020822036b4104490d00200228020021040c010b200341046a22062003490d02200441017422032006200320064b1b22034100480d020240024020040d002003102a21040c010b200228020020042003102e21040b2004450d012002200336020420022004360200200228020821030b2002200341046a360208200420036a200536000020002d0010210502400240200228020420022802082203460d00200228020021040c010b200341016a22042003490d02200341017422062004200620044b1b22064100480d020240024020030d002006102a21040c010b200228020020032006102e21040b2004450d012002200636020420022004360200200228020821030b2002200341016a360208200420036a20053a0000200041146a200210a302200228020421032001290200200235020842208620022802002204ad84100102402003450d002004102c0b200241106a24000f0b1033000b1035000b850401067f230041f0006b22032400200341d0006a41086a22044196e0c500ad4280808080f000841002220541086a290000370300200320052900003703502005102c200341086a41086a220620042903003703002003200329035037030820044188f9c200ad4280808080b002841002220541086a290000370300200320052900003703502005102c200341186a41086a22072004290300370300200320032903503703182003200136024c200341d0006a41186a2201200341cc006aad4280808080c000841006220541186a290000370300200341d0006a41106a2208200541106a2900003703002004200541086a290000370300200320052900003703502005102c200341286a41186a22052001290300370300200341286a41106a22012008290300370300200341286a41086a2208200429030037030020032003290350370328024041c000102a2204450d00200420032903083700002004200329031837001020042003290328370020200441086a2006290300370000200441186a2007290300370000200441286a2008290300370000200441306a2001290300370000200441386a2005290300370000200341d0006a200210f903200441c000418001102e2204450d0020042003290050370040200441c8006a200341d8006a29000037000020004280818080800a37020420002004360200200341f0006a24000f0b1033000b850401067f230041f0006b22032400200341d0006a41086a22044196e0c500ad4280808080f000841002220541086a290000370300200320052900003703502005102c200341086a41086a2206200429030037030020032003290350370308200441f5f8c200ad4280808080b002841002220541086a290000370300200320052900003703502005102c200341186a41086a22072004290300370300200320032903503703182003200136024c200341d0006a41186a2201200341cc006aad4280808080c000841006220541186a290000370300200341d0006a41106a2208200541106a2900003703002004200541086a290000370300200320052900003703502005102c200341286a41186a22052001290300370300200341286a41106a22012008290300370300200341286a41086a2208200429030037030020032003290350370328024041c000102a2204450d00200420032903083700002004200329031837001020042003290328370020200441086a2006290300370000200441186a2007290300370000200441286a2008290300370000200441306a2001290300370000200441386a2005290300370000200341d0006a200210f903200441c000418001102e2204450d0020042003290050370040200441c8006a200341d8006a29000037000020004280818080800a37020420002004360200200341f0006a24000f0b1033000be50201057f230041c0006b22022400200241206a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241086a22052003290300370300200220022903203703002003419bf9c200ad4280808080d001841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2001109f01024041c000102a2204450d00200420022903003700002004200229031037001020042002290020370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241206a200441c00010f103024020022802282203450d002000200229022c37020c200020022903203702000b200020033602082004102c200241c0006a24000f0b1033000be80201057f230041c0006b22022400200241206a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241086a22052003290300370300200220022903203703002003419bf9c200ad4280808080d001841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2001280200109f01024041c000102a2204450d00200420022903003700002004200229031037001020042002290020370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241206a200441c00010f103024020022802282203450d002000200229022c37020c200020022903203702000b200020033602082004102c200241c0006a24000f0b1033000bbe0501087f230041c0006b22022400200241206a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241086a22052003290300370300200220022903203703002003419bf9c200ad4280808080d001841002220441086a290000370300200220042900003703202004102c200241106a41086a2204200329030037030020022002290320370310200241206a2000109f010240024041c000102a2206450d00200620022903003700002006200229031037001020062002290020370020200641086a2005290300370000200641186a2004290300370000200641286a2003290000370000200641306a200241306a290000370000200641386a200241206a41186a2900003700002002410036022820024201370320200128020021044104102a2203450d0020024284808080c000370224200220033602202003200436000020012802042104200341044108102e2203450d00200242888080808001370224200320043600042002200336022020012802082104200141106a2802002201200241206a10670240024020010d002002280228210720022802242105200228022021030c010b200141027421084100200228022822016b21002002280224210503402004280200210902400240200520006a4104490d00200228022021030c010b200141046a22032001490d04200541017422072003200720034b1b22074100480d040240024020050d002007102a21030c010b200228022020052007102e21030b2003450d032002200736022420022003360220200721050b200441046a21042002200141046a2207360228200320016a20093600002000417c6a2100200721012008417c6a22080d000b0b2006ad42808080808008842007ad4220862003ad84100102402005450d002003102c0b2006102c200241c0006a24000f0b1033000b1035000bbe0701067f23004190016b22022400200241d0006a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703502004102c200241386a41086a2205200329030037030020022002290350370338200341dff8c200ad4280808080f000841002220441086a290000370300200220042900003703502004102c200241186a41086a2206200329030037030020022002290350370318200241d0006a2001109f01024041c000102a2204450d00200420022903383700002004200229031837001020042002290050370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241d0006a41106a2205290000370000200441386a200241d0006a41186a2206290000370000200241c00036024c20022004360248200241386a2004ad42808080808008841003108d0102400240200228023822010d00410021030c010b200228023c21072002200241386a41086a280200360284012002200136028001200241d0006a20024180016a10cc010240024020022802702203450d00200241186a41186a200241d0006a41186a290300370300200241186a41106a200241d0006a41106a290300370300200241186a41086a200241d0006a41086a290300370300200241086a41086a200241fc006a28020036020020022002290350370318200220022902743703080c010b4100210320024100360220200242013703182002410b36020c2002200241c8006a3602082002200241186a36028c01200241e4006a410136020020024201370254200241d0b0c2003602502002200241086a3602602002418c016a41c49ac500200241d0006a10391a20023502204220862002350218841004200228021c450d002002280218102c0b2007450d002001102c0b200241d0006a41086a2201200241186a41086a2903003703002005200241186a41106a2903003703002006200241186a41186a290300370300200241386a41086a2205200241086a41086a2802003602002002200229031837035020022002290308370338024002402003450d002000200229035037030020002003360220200041246a2002290338370200200041186a200241d0006a41186a290300370300200041106a200241d0006a41106a290300370300200041086a20012903003703002000412c6a20052802003602000c010b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000b2004102c20024190016a24000f0b1033000bf10e04057f017e197f027e230041f0026b22042400200441a0026a41086a22054196e0c500ad4280808080f000841002220641086a290000370300200420062900003703a0022006102c200441386a41086a22072005290300370300200420042903a002370338200541b5fdc200ad4280808080d000841002220641086a290000370300200420062900003703a0022006102c200441e0016a41086a22062005290300370300200420042903a0023703e001200441a0016a2001109f010240024002400240024041c000102a2205450d0020052004290338370000200520042903e001370010200520042900a001370020200541086a2007290300370000200541186a2006290300370000200541286a200441a0016a41086a290000370000200541306a200441b0016a290000370000200541386a200441a0016a41186a290000370000200441c00036027c20042005360278200441386a2005ad42808080808008841003108d01024020042802382206450d00200428023c210802400240200441c0006a280200450d0020062d000022074103490d010b200441003602e801200442013703e0012004410b36020c2004200441f8006a3602082004200441e0016a3602c001200441b4026a4101360200200442013702a402200441d0b0c2003602a0022004200441086a3602b002200441c0016a41c49ac500200441a0026a10391a20043502e80142208620043502e001841004024020042802e401450d0020042802e001102c0b410321070b02402008450d002006102c0b20074103470d020b2005102c0c020b1033000b2005102c0240024020070e03020001020b200441a0026a20012002200310b80120043502a0024201852102200441b0026a2903002109200441a8026a29030021030c030b200441a0026a200110980420042d00a0024101470d01200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a2002200310b80120043502384201852102200441386a41106a2903002109200441386a41086a29030021030c020b200441f8006a200110980420042d00784101470d00200441c0016a41186a220720044191016a290000370300200441c0016a41106a220520044189016a290000370300200441c0016a41086a220620044181016a290000370300200420042900793703c001200441a0026a200441c0016a10f902200441a0016a41186a22082007290300370300200441a0016a41106a22072005290300370300200441a0016a41086a220a2006290300370300200420042903c0013703a00120042802c002220b450d00200441e0016a41186a220c2008290300370300200441e0016a41106a220d2007290300370300200441e0016a41086a220e200a290300370300200441e0016a41286a2207200441a0026a41086a2208290300370300200441e0016a41306a220a200441a0026a41106a220f290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41286a2212200441ec026a2213280200360200200441086a41206a2214200441e4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41106a2218200441d4026a2219290200370300200441086a41086a221a200441cc026a221b290200370300200420042903a0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d200a290300370300200441386a41286a221e2007290300370300200441386a41206a221f200429038002370300200441386a41186a2220200c290300370300200441386a41106a2221200d290300370300200441386a41086a2222200e290300370300200420042903e0013703382010201c290300370300200a201d2903003703002007201e290300370300200441e0016a41206a221c201f290300370300200c2020290300370300200d2021290300370300200e2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a20222903003703002004200429033837037820112010290300370300200f200a290300370300200820072903003703002004200b3602c0022004201c2903003703a002200441c4026a22072004290308370200201b201a2903003702002019201829030037020020172016290300370200201520142903003702002013201228020036020020112903002109200f200f290300222320027c22243703002011200920037c2024202354ad7c37030020082903002109200420042903a002222320027c22243703a0022008200920037c2024202354ad7c370300200441c0016a20012002200310b80120043502c00121022005290300210920062903002103200441f8006a200441a0026a10990402402007280200450d0020042802c002102c0b200242018521020c010b420021020b2000200337030820002002370300200041106a2009370300200441f0026a24000baf0603037f047e037f230022022103200241a0026b41607122022400200141186a220429000021052004200229039801370000200129001021062001200229039001370010200129000821072001200229038801370008200241003a00800120012900002108200120022903800137000020022005370338200220063703302002200737032820022008370320200141206a2d0000210420024180016a41176a2209200537000020024180016a41106a220a200229003137030020024180016a41086a220b20022900293703002002200229002137038001024002402008a741ff01714101460d00200041003602000c010b200241176a2009290000370000200241106a200a290300370300200241086a200b2903003703002002200229038001370300200220043a001f200241f0006a200210890420024180016a20022802702204200228027810f203024020022d0084014102470d00200241003602e801200242013703e001200241f0016a41146a410d360200200241fc016a410b3602002002410736028c0220024196e0c500360288022002410b3602f4012002410a36029402200241c9f8c200360290022002200241f0006a36028002200220024190026a3602f801200220024188026a3602f0012002200241e0016a36029c02200241206a41146a410336020020024203370224200241a89cc5003602202002200241f0016a3602302002419c026a41c49ac500200241206a10391a20023502e80142208620023502e00184100420004100360200024020022802e401450d0020022802e001102c0b2002280274450d012002280270102c200324000f0b20024180016a4104722109200228028001210a02402002280274450d002004102c0b200241206a200941c20010db051a200141206a200241e1006a2d00003a0000200141186a200241d9006a290000370000200141106a200241d1006a290000370000200141086a200241c9006a29000037000020012002290041370000200020022903003700042000410c6a200241086a290300370000200041146a200241106a2903003700002000411c6a200241186a29030037000020004101360200200041246a200a360200200324000f0b200324000be50703037f047e037f230022022103200241a0036b41607122022400200141186a220429000021052004200229039802370000200129001021062001200229039002370010200129000821072001200229038802370008200241003a0080022001290000210820012002290380023700002002200537039801200220063703900120022007370388012002200837038001200141206a2d0000210420024180026a41176a2209200537000020024180026a41106a220a20022900910137030020024180026a41086a220b200229008901370300200220022900810137038002024002402008a741ff01714101460d00200041023a00300c010b200241186a41176a2009290000370000200241186a41106a200a290300370300200241186a41086a200b2903003703002002200229038002370318200220043a0037200241f0016a200241186a108b0420024180026a20022802f001220420022802f80110ee03024020022d0090024102470d00200241003602e802200242013703e002200241f0026a41146a410d360200200241fc026a410b3602002002410736028c0320024196e0c500360288032002410b3602f4022002410a36029403200241aff8c200360290032002200241f0016a36028003200220024190036a3602f802200220024188036a3602f0022002200241e0026a36029c03200241386a41146a41033602002002420337023c200241a89cc5003602382002200241f0026a3602482002419c036a41c49ac500200241386a10391a20023502e80242208620023502e002841004200041023a0030024020022802e402450d0020022802e002102c0b20022802f401450d0120022802f001102c200324000f0b20024180016a20024180026a41d80010db051a024020022802f401450d002004102c0b200241f0026a41106a220420024180016a41106a280200360200200241f0026a41086a220920024180016a41086a29030037030020022002290380013703f002200241386a20024194016a41c20010db051a200141206a200241f9006a2d00003a0000200141186a200241f1006a290000370000200141106a200241e9006a290000370000200141086a200241e1006a2900003700002001200229005937000020024180026a41186a200241186a41186a290300220537030020024180026a41106a200241186a41106a290300220837030020024180026a41086a200241186a41086a2903002206370300200020022903182207370200200041086a2006370200200041106a2008370200200041186a20053702002002200737038002200041206a20022903f002370200200041286a2009290300370200200041306a2004280200360200200324000f0b200324000bf30302047f027e230041c0016b22022400200241086a20011098040240024020022d00084101470d0020024180016a41186a200241216a29000037030020024180016a41106a200241196a29000037030020024180016a41086a200241116a2900003703002002200229000937038001200241306a41086a22034196e0c500ad4280808080f000841002220141086a290000370300200220012900003703302001102c200241a0016a41086a22042003290300370300200220022903303703a001200341d9f8c200ad4280808080e000841002220141086a290000370300200220012900003703302001102c200241b0016a41086a22052003290300370300200220022903303703b001200241306a20024180016a109f01024041c000102a2201450d00200120022903a001370000200120022903b00137001020012002290030370020200141086a2004290300370000200141186a2005290300370000200141286a2003290000370000200141306a200241306a41106a290000370000200141386a200241306a41186a2203290000370000200241306a200141c00010e603200329030021062002290340210720022802542104200228025021032001102c2003450d012004450d022003102c0c020b1033000b42002107420021060b2000200737030020002006370308200241c0016a24000bba1105017f047e017f057e047f230041c0026b22052400200541a0016a20001098040240024020052d00a0014101470d00200541306a41186a200541b9016a290000370300200541c0006a200541b1016a290000370300200541306a41086a200541a9016a290000370300200520052900a101370330200541a0016a200541306a10f90220052802c001450d00200541d0006a200541a0016a41d00010db051a200541d0006a41086a290300210620052903502107024002402005290360220820012008200154200541d0006a41186a290300220920025420092002511b220a1b220b20092002200a1b220c8450450d002007210d2006210e0c010b200541e8006a220a2009200c7d2008200b54ad7d220f37030020052008200b7d220d37036002400240200d428080e983b1de1656200f420052200f501b450d00200b2108200c21090c010b200a420037030020054200370360200f20027c200d20017c2201200d54ad7c21020b20054200200620097d2007200854ad7d220b200720087d220f200756200b200656200b2006511b220a1b220e37035820054200200f200a1b220d370350200220097d2001200854ad7d2102200120087d21010b02400240024002400240200541f8006a28020022100d004100210a410021100c010b2005280270210a201041186c21114100211003400240200a2903002208200120012008562002200a41086a221229030022095620022009511b22131b220b2009200220131b220c84500d00200a2008200b7d220d370300200a2009200c7d2008200b54ad7d220f37030802400240200d428080e983b1de1656200f420052200f501b450d002001210f200b2108200c21090c010b200a4200370308200a42003703002002200f7c2001200d7c220f200154ad7c21020b200541d0006a41086a221342002013290300220120097d2005290350220b200854ad7d220c200b20087d220d200b56200c200156200c2001511b22131b220e37030020054200200d20131b220d370350200220097d200f200854ad7d2102200f20087d210120122903002109200a29030021080b024020082009844200520d00200a41186a210a201041016a2110201141686a22110d010b0b2005280278220a2010490d010b200541003602780240200a20106b220a450d0002402010450d00200528027022132013201041186c6a200a41186c10dc051a200541d8006a290300210e2005290350210d0b2005200a3602780b42002007200d7d220820082007562006200e7d2007200d54ad7d220920065620092006511b220a1b220842002009200a1b22098450450d010c020b41dafec500411c41acfec5001036000b200541a0016a41086a2210418be9c500ad42808080808001841002220a41086a2900003703002005200a2900003703a001200a102c200541a0026a41086a22132010290300370300200520052903a0013703a002201041d6b5c000ad4280808080b001841002220a41086a2900003703002005200a2900003703a001200a102c200541b0026a41086a22112010290300370300200520052903a0013703b002200541a0016a2000109f0141c000102a220a450d02200a20052903a002370000200a20052903b002370010200a20052900a001370020200a41086a2013290300370000200a41186a2011290300370000200a41286a2010290000370000200a41306a200541a0016a41106a290000370000200a41386a200541a0016a41186a290000370000200541186a200a41c000109e01200541186a41106a29030021022005290320210120052802182110200a102c20002001420020101b22012008200120012008562002420020101b220b200956200b2009511b220a1b22027d200b2009200b200a1b220c7d2001200254ad7d10a20102400240200820027d220b2009200c7d2008200254ad7d220f844200520d002004427f2004290300220220087c22012001200254220a200441086a2210290300220220097c200aad7c220120025420012002511b220a1b3703002010427f2001200a1b3703000c010b200541a0016a41086a2210418be9c500ad42808080808001841002220a41086a2900003703002005200a2900003703a001200a102c200541a0026a41086a22132010290300370300200520052903a0013703a002201041e1b5c000ad4280808080f001841002220a41086a2900003703002005200a2900003703a001200a102c200541b0026a41086a22112010290300370300200520052903a0013703b002200541a0016a2000109f0141c000102a220a450d03200a20052903a002370000200a20052903b002370010200a20052900a001370020200a41086a2013290300370000200a41186a2011290300370000200a41286a2010290000370000200a41306a200541a0016a41106a290000370000200a41386a200541a0016a41186a2900003700002005200a41c000109e01200541106a29030021012005290308210d20052802002110200a102c2000200d420020101b220d200b200d200d200b562001420020101b220e200f56200e200f511b220a1b22017d200e200f200e200a1b22067d200d200154ad7d10aa012004427f2004290300220d200120027c220e7c22022002200d54220a200441086a221029030022022006200c7c200e200154ad7c7c200aad7c220c200254200c2002511b220a1b3703002010427f200c200a1b370300200b20017d2202200f20067d200b200154ad7d220f84500d00200342002003290300220120027d220b200b200156200341086a220a290300220b200f7d2001200254ad7d2202200b562002200b511b22101b370300200a4200200220101b3703000b200541306a200541d0006a109904200541d8016a2009370300200541d0016a2008370300200541a0016a41086a41013a0000200541a9016a2000290000370000200541b1016a200041086a290000370000200541b9016a200041106a290000370000200541c1016a200041186a290000370000200541043a00a00141014100200541a0016a1092010b200541f4006a280200450d002005280270102c0b200541c0026a24000f0b1033000be00301047f230041f0006b22022400200241086a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703082004102c200241306a41086a2205200329030037030020022002290308370330200341d3f8c200ad4280808080e000841002220441086a290000370300200220042900003703082004102c200241c0006a41086a2204200329030037030020022002290308370340200241d0006a2001109f01024041c000102a2203450d00200320022903303700002003200229034037001020032002290350370020200341086a2005290300370000200341186a2004290300370000200341286a200241d0006a41086a2205290300370000200341306a200241e0006a2204290300370000200341386a200241d0006a41186a2201290300370000200241086a200341c00010d3012005200241086a41096a2900003703002004200241086a41116a2900003703002001200241086a41196a290000370300200220022900093703500240024020022d00084101460d00200041003a00000c010b200041013a000020002002290350370001200041096a200241d8006a290300370000200041116a2004290300370000200041196a20012903003700000b2003102c200241f0006a24000f0b1033000bb30401067f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a22032001290300200141086a290300417f411f10be01200241306a41086a22044196e0c500ad4280808080f000841002220541086a290000370300200220052900003703302005102c200241106a41086a2206200429030037030020022002290330370310200441d9f8c200ad4280808080e000841002220541086a290000370300200220052900003703302005102c200241206a41086a2207200429030037030020022002290330370320200241306a2000109f01024041c000102a2205450d00200520022903103700002005200229032037001020052002290030370020200541086a2006290300370000200541186a2007290300370000200541286a2004290000370000200541306a200241306a41106a290000370000200541386a200241306a41186a29000037000020024100360238200242013703302003200241306a10910120022001360220200241206a200241306a108a012002200141106a360220200241206a200241306a108a0120012802202104200141286a2802002201200241306a106702402001450d002004200141186c6a2101034020022004360220200241206a200241306a108a01200441106a200241306a1089012001200441186a2204470d000b0b200228023421042005ad4280808080800884200235023842208620022802302201ad84100102402004450d002001102c0b2005102c200241d0006a24000f0b1033000b130020004110360204200041e4fdc2003602000bc90405057f017e017f027e037f230041e0006b22002400200041206a41186a22014200370300200041206a41106a22024200370300200041206a41086a2203420037030020004200370320200041d0006a41086a22044196e0c500ad4280808080f0008422051002220641086a290000370300200020062900003703502006102c2003200429030037030020002000290350220737034020002007370320200441d8e0c500ad428080808080018422081002220641086a290000370300200020062900003703502006102c200220002903502207370300200041086a22092003290300370300200041106a220a2007370300200041186a220b200429030037030020002007370340200020002903203703000240024002404100200010ec032206200641ff01714104461b41ff0171417f6a220641024b0d0020060e03010001010b20014200370300200242003703002003420037030020004200370320200420051002220641086a290000370300200020062900003703502006102c2003200429030037030020002000290350220737034020002007370320200420081002220641086a290000370300200020062900003703502006102c200041c0006a41086a2004290300220737030020002000290350220537034020022005370000200241086a200737000020092003290300370300200a2002290300370300200b2001290300370300200020002903203703004101102a2204450d01200441013a00002000ad42808080808004842004ad4280808080108410012004102c0b200041e0006a24000f0b1033000b340020004196e0c50036020420004100360200200041146a411a360200200041106a41ccafc300360200200041086a42073702000b5301017f02404110102a2202450d002002420037000820024200370000200241104120102e2202450d0020024200370010200042a0808080800437020420002002360200200241186a42003700000f0b1033000bff0503027f027e047f230041106b2203240020034100360208200342013703002002200310670240024002402002450d002001200241d8006c6a21040340200141386a2003109101200141086a2903002105200129030021060240024020032802042207200328020822026b4110490d00200328020021070c010b200241106a22082002490d04200741017422022008200220084b1b22024100480d040240024020070d002002102a21070c010b200328020020072002102e21070b2007450d032003200236020420032007360200200328020821020b200720026a22072005370008200720063700002003200241106a36020820012802202102200128022822072003106702402007450d002002200741306c6a2109034020022003109101200241286a2903002105200241206a29030021060240024020032802042208200328020822076b4110490d00200328020021080c010b200741106a220a2007490d0620084101742207200a2007200a4b1b22074100480d060240024020080d002007102a21080c010b200328020020082007102e21080b2008450d052003200736020420032008360200200328020821070b200820076a22082005370008200820063700002003200741106a3602082009200241306a2202470d000b0b200128022c2102200141346a28020022072003106702402007450d0020074105742107034020022003109101200241206a2102200741606a22070d000b0b200141186a2903002105200129031021060240024020032802042207200328020822026b4110490d00200328020021070c010b200241106a22082002490d04200741017422022008200220084b1b22024100480d040240024020070d002002102a21070c010b200328020020072002102e21070b2007450d032003200236020420032007360200200328020821020b200720026a22072005370008200720063700002003200241106a360208200141d8006a22012004470d000b0b20002003290300370200200041086a200341086a280200360200200341106a24000f0b1033000b1035000b6701027f230041106b22022400200241003602082002420137030002404104102a22030d001033000b2003410036000020024284808080c00037020420022003360200410020021067200041086a200228020836020020002002290300370200200241106a24000b8d0201037f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a108a012002200336023c2002413c6a200241306a108a012002280220210320042802002204200241306a106702402004450d00200441306c21040340200341106a200241306a1091012002200336023c200341306a21032002413c6a200241306a108a01200441506a22040d000b0b20002002290330370200200041086a200241306a41086a28020036020002402002280224450d002002280220102c0b200241c0006a24000be20101047f230041106b220224002002410036020c02404101102a2203450d0002400240200228020c2204413f4b0d00200320044102743a0000410121050c010b0240200441808001490d0002402004418080808004490d00200341033a0000200228020c210441052105200341014105102e2203450d03200320043600010c020b41042105200341014104102e2203450d02200320044102744102723600000c010b41022105200341014102102e2203450d01200320044102744101723b00000b200020053602082000200536020420002003360200200241106a24000f0b1033000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241043600000b130020004102360204200041a0dbc3003602000b2d01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241a0053600000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241063600000b9f4312057f017e017f017e027f027e047f017e067f017e077f027e027f017e067f027e017f027e230041f0036b2205240010a301200541c8036a41186a22064200370300200541c8036a41106a22074200370300200541c8036a41086a22084200370300200542003703c80320054188036a41086a22094196e0c500ad4280808080f00084220a1002220b41086a2900003703002005200b29000037038803200b102c200820092903003703002005200529038803220c3703c8022005200c3703c803200941e0e0c500ad4280808080b002841002220b41086a2900003703002005200b29000037038803200b102c2007200529038803220c37030020054198036a41086a220b200829030037030020054198036a41106a220d200c37030020054198036a41186a220e20092903003703002005200c3703d802200520052903c80337039803200541203602ec01200520054198036a3602e80120054188026a20054198036aad220f428080808080048422101003108d010240024020052802880222110d00410021120c010b200528028c0221130240024020054188026a41086a2802004104490d0020112800002114410121120c010b41002112200541003602b002200542013703a8022005410b36028c032005200541e8016a360288032005200541a8026a3602d802200541dc036a4101360200200542013702cc03200541d0b0c2003602c803200520054188036a3602d803200541d8026a41c49ac500200541c8036a10391a20053502b00242208620053502a802841004024020052802ac02450d0020052802a802102c0b0b2013450d002011102c0b200642003703002007420037030020084200370300200542003703c8032009200a1002221141086a29000037030020052011290000370388032011102c200820092903003703002005200529038803220c3703c8022005200c3703c8032009419de0c500ad4280808080a001841002221141086a29000037030020052011290000370388032011102c200541d8026a41086a22132009290300220c370300200520052903880322153703d80220072015370000200741086a2216200c370000200b2008290300370300200d2007290300370300200e2006290300370300200520052903c80337039803200541e0016a20054198036a412010940120052802e401211720052802e0012118200642003703002007420037030020084200370300200542003703c8032009200a1002221141086a29000037030020052011290000370388032011102c200820092903003703002005200529038803220a3703c8022005200a3703c803200941a7e0c500ad4280808080b003841002221141086a29000037030020052011290000370388032011102c20132009290300220a3703002005200529038803220c3703d8022007200c3700002016200a370000200b2008290300370300200d2007290300370300200e2006290300370300200520052903c80337039803200541d8016a20054198036a41201094012017410020181b2219211702400240024020052802dc01410020052802d8011b20044d0d00200541c8036a41186a220b4200370300200541c8036a41106a220d4200370300200541c8036a41086a22084200370300200542003703c80320054188036a41086a22094196e0c500ad4280808080f000841002220641086a29000037030020052006290000370388032006102c200820092903003703002005200529038803220a3703c8022005200a3703c803200941f3e0c500ad4280808080a001841002220641086a29000037030020052006290000370388032006102c200541d8026a41086a2009290300220a3703002005200529038803220c3703d8022007200c370000200741086a200a37000020054198036a41086a200829030037030020054198036a41106a200d29030037030020054198036a41186a200b290300370300200520052903c80337039803200541c8036a20054198036a10eb0320052802c8032209410420091b220b20052902cc03420020091b220a422088a741037422096a210803402009450d02200941786a21092008417c6a2106200841786a2108200628020020044b0d000b200b20096a2802002117200aa7450d00200b102c0b200541c8036a41186a22184200370300200541c8036a41106a221a4200370300200541c8036a41086a22164200370300200542003703c80320054188036a41086a221b4196e0c500ad4280808080f00084221c1002220941086a29000037030020052009290000370388032009102c2016201b2903003703002005200529038803220a3703c8022005200a3703c803201b41fde0c500ad4280808080e00284220a1002220941086a29000037030020052009290000370388032009102c200541d8026a41086a221d201b290300220c370300200520052903880322153703d80220072015370000200741086a221e200c37000020054198036a41086a2213201629030037030020054198036a41106a221f201a29030037030020054198036a41186a22202018290300370300200520052903c80337039803200541d0016a20054198036a412010940120052802d401210820052802d001210620184200370300201a420037030020164200370300200542003703c803201b201c1002220941086a29000037030020052009290000370388032009102c2016201b2903003703002005200529038803220c3703c8022005200c3703c803201b200a1002220941086a29000037030020052009290000370388032009102c201d201b290300220a3703002005200529038803220c3703d8022007200c370000201e200a37000020132016290300370300201f201a29030037030020202018290300370300200520052903c8033703980320052008201920064101461b3602c8032010200541c8036aad4280808080c00084100120032001200120034b1b2221450d014100201941e07a6a2209200920194b1b21222014410020121b212320054188036aad4280808080c000842124200f42808080808002842125201941016a2126200021114100212702400240034020184200370300201a420037030020164200370300200542003703c803201b201c1002220941086a29000037030020052009290000370388032009102c2016201b2903003703002005200529038803220a3703c8022005200a3703c803201b41dcc1c300ad4280808080d001841002220941086a29000037030020052009290000370388032009102c201d201b290300220a3703002005200529038803220c3703d8022007200c370000201e200a37000020132016290300370300201f201a29030037030020202018290300370300200520052903c80337039803200541c8036a20054198036a412010d00120052902cc03420020052802c80322091b220a422088a741057421082027220641016a2127200220064102746a210e2000200641e0006c6a210b2009410120091b220d210902400340024020080d00410021040c020b4101210420112009460d012009200b412010dd052106200841606a2108200941206a210920060d000b0b0240200aa7450d00200d102c0b0240024020040d00200e2802002109200542003703d002200542003703c802200541c0016a200b290320220a200b41286a290300428094ebdc03420010e105200541a0016a200b290330220c200b41386a290300428094ebdc03420010e105200541b0016a20052903c0012210200541c0016a41086a290300220f4280ec94a37c427f10e005200541f0006a2010200f2009ad2215420010e00520054190016a20052903a0012210200541a0016a41086a290300220f4280ec94a37c427f10e00520054180016a2010200f2015420010e005200542003703e002200542003703d802200c2005290390017c20157e2210428094ebdc0380210c02400240024020052903704200200a20052903b0017c20157e220a200a428094ebdc0380220a4280ec94a37c7e7c4280cab5ee0156200aa76a2208ad7d85200541f0006a41086a29030042002008410047ad7d8584500d00200529038001210a20054180016a41086a290300212820054188026a2017200b108e042005280288022108200520052802900222063602ec01200520083602e801200541a8026a2006ad4220862008ad841003108d010240024020052802a80222060d004200210f0c010b20052802ac0221040240024020052802b002220d4104490d00200d417c6a410f4d0d00200628000021294201210f0c010b200541003602d003200542013703c8032005410b36028c032005200541e8016a360288032005200541c8036a3602ec03200541013602ac032005420137029c03200541d0b0c20036029803200520054188036a3602a803200541ec036a41c49ac50020054198036a10391a20053502d00342208620053502c803841004024020052802cc03450d0020052802c803102c0b4200210f0b2004450d002006102c0b0240200528028c02450d002008102c0b200920294100200f4200521b22034d0d0320054198036a2017200b108e0420053502a003210f20052802980321064110102a2208450d0420082009360000200841104120102e2209450d042009200a2010200c4280ec94a37c7e7c4280cab5ee0156200ca76aad7c220c3700042009410c6a2028200c200a54ad7c220a370000200f4220862006ad842009ad4280808080c0028410012009102c0240200528029c03450d002006102c0b200541a8026a200b108f0420052802b002450d0120054188026a41106a200541a8026a41106a28020036020020054188026a41086a200541a8026a41086a290300370300200520052903a802370388020c020b20054200370390032005420037038803200542003703f001200542003703e801200541a8026a200b108f040240024020052802b002450d0020054188026a41106a200541a8026a41106a28020036020020054188026a41086a200541a8026a41086a290300370300200520052903a802370388020c010b200541003602d803200542043703d003200520223602cc03200541003602c803200b200541c8036a10910420054188026a41106a20052802d80336020020054188026a41086a20052903d003370300200520052903c803370388020b2013200529038802370200201341086a20054188026a41086a290300370200201341106a20054188026a41106a280200360200200541003a00c0032005200b36029c032005202236029803200520233602bc032005200541e8016a3602b803200520054188036a3602b403200541c8036a20054198036a201710a704024020052802d0034102460d0020052802c803220d20052802a003470d00410021090240202620052802a40322064d0d00024020052802b003220820052802ac03470d00200841016a22092008490d09200841017422042009200420094b1b220941ffffffff03712009470d09200941027422044100480d090240024020080d002004102a21040c010b20052802a80320084102742004102e21040b2004450d06200520093602ac03200520043602a8030b20052802a803220941046a2009200841027410dc051a2009202620066b360200200520263602a403410121092005200841016a3602b0032005200d41016a220d3602a0030b200520093a00c003200b108604200b1087040240200b108a0241ff017122084102460d002008410171450d00109b040b2009450d0020052802a403210e02400240024020052802b0032201450d0020052802a80321082001410274210441002106200e210902400340200920224d0d01200641016a2106200920082802006b2109200841046a21082004417c6a22040d000c020b0b200120064f0d010b2005200e2022200e20224b1b3602a4030c010b2005200e2022200e20224b1b3602a403200520063602b00341000d00200d20016b200d20066b4f0d00410020016b210903402016200b41086a290200370300201a200b41106a2902003703002018200b41186a2902003703002005200b2902003703c8032005200d20096a3602e803200541c8036a1088042006200941016a22096a0d000b0b200b20131091040b20052802ac03450d0220052802a803102c0c020b200541003602d803200542043703d003200520223602cc03200541003602c803200b200541c8036a10910420054188026a41106a20052802d80336020020054188026a41086a20052903d003370300200520052903c803370388020b2013200529038802370200201341086a222a20054188026a41086a222b290300370200201341106a222c20054188026a41106a222d280200360200200541003a00c0032005200b36029c032005202236029803200520233602bc032005200541d8026a3602b8032005200541c8026a3602b403200541e8006a20054198036a2017200c200a10a80420052802a003210e02400240024020052802684101470d00200528026c2208200e460d010b20052d00c00321090c010b02400240202620052802a40322094d0d00024020052802b003220620052802ac03470d00200641016a22042006490d082006410174220d2004200d20044b1b220441ffffffff03712004470d082004410274220d4100480d080240024020060d00200d102a210d0c010b20052802a8032006410274200d102e210d0b200d450d05200520043602ac032005200d3602a8030b20052802a803220441046a2004200641027410dc051a2004202620096b360200200520263602a403410121092005200641016a3602b0032005200841016a22083602a0030c010b20052d00c00321090b200520093a00c003200b108604200b1087040240200b108a0241ff017122064102460d002006410171450d00109b040b2008210e0b0240200941ff0171450d0020052802a4032101200528029803210d02400240024020052802b0032212450d0020052802a8032108201241027421044100210620012109024003402009200d4d0d01200641016a2106200920082802006b2109200841046a21082004417c6a22040d000c020b0b201220064f0d010b20052001200d2001200d4b1b3602a4030c010b20052001200d2001200d4b1b3602a403200520063602b00341000d00200e20126b200e20066b4f0d00410020126b2108200528029c0321090340200941086a290000210a200941106a290000210c200929000021102018200941186a290000370300201a200c3703002016200a370300200520103703c8032005200e20086a3602e803200541c8036a1088042006200841016a22086a0d000b0b200528029c0320131091040b024020052802ac03450d0020052802a803102c0b4200210a200542003703900320054200370388030240024002400240200b41c8006a220928020022080d00410821120c010b2008ad220a42307e220c422088a70d07200ca722084100480d072008102a2212450d04200928020022090d010b4200210f420021280c010b200b41c0006a2802002201200941306c6a212e2003ad212f0340200542003703f001200542003703e801200541c0006a2001290300220f200141086a290300428094ebdc03420010e105200541306a2005290340220c200541c0006a41086a29030022104280ec94a37c427f10e005200541206a200c2010202f420010e005200541106a200c20102015420010e00520054198036a2017200141106a220d108d04200541d0006a200528029803220820052802a003109e014200200541106a41086a29030020052903102210200f20052903307c220f20157e220c200c428094ebdc0380220c4280ec94a37c7e7c4280cab5ee0156200ca76aad7c220c201054ad7c2210200541206a41086a29030020052903202228200f202f7e220f200f428094ebdc0380220f4280ec94a37c7e7c4280cab5ee0156200fa76aad7c220f202854ad7c7d200c200f54ad7d2228200c200f7d220f200c56202820105620282010511b22091b21104200200f20091b210c200541d0006a41106a290300210f20052903582128200528025021090240200528029c03450d002008102c0b200541c8036a2017200d108d0420052802c803210820053502d003213020052028420020091b2228200c7c220c370398032005200f420020091b20107c200c202854ad7c22103703a00320304220862008ad8420251001024020052802cc03450d002008102c0b200541a8026a200d108f040240024020052802b002450d00202d200541a8026a41106a280200360200202b200541a8026a41086a290300370300200520052903a802370388020c010b200541003602d803200542043703d003200520223602cc03200541003602c803200d200541c8036a109104202d20052802d803360200202b20052903d003370300200520052903c803370388020b2013200529038802370200202a202b290300370200202c202d280200360200200541003a00c0032005200d36029c032005202236029803200520233602bc032005200541e8016a3602b803200520054188036a3602b403200541086a20054198036a2017200c201010a80420052802a003210302400240024020052802084101470d00200528020c22062003460d010b20052d00c00321090c010b02400240202620052802a40322094d0d00024020052802b003220820052802ac03470d00200841016a22042008490d0a2008410174220e2004200e20044b1b220441ffffffff03712004470d0a2004410274220e4100480d0a0240024020080d00200e102a210e0c010b20052802a8032008410274200e102e210e0b200e450d07200520043602ac032005200e3602a8030b20052802a803220441046a2004200841027410dc051a2004202620096b360200200520263602a403410121092005200841016a3602b0032005200641016a22033602a0030c010b20052d00c0032109200621030b200520093a00c003200d108604200d1087040b0240200941ff0171450d0020052802a4032114200528029803210e02400240024020052802b0032231450d0020052802a8032108203141027421044100210620142109024003402009200e4d0d01200641016a2106200920082802006b2109200841046a21082004417c6a22040d000c020b0b203120064f0d010b20052014200e2014200e4b1b3602a4030c010b20052014200e2014200e4b1b3602a403200520063602b00341000d00200320316b200320066b4f0d00410020316b2108200528029c0321090340200941086a290000210c200941106a29000021102009290000210f2018200941186a290000370300201a20103703002016200c3703002005200f3703c8032005200320086a3602e803200541c8036a1088042006200841016a22086a0d000b0b200528029c0320131091040b024020052802ac03450d0020052802a803102c0b200d41086a290000210c200d29000021102020200d41186a290000370300201f200d41106a2900003703002013200c3703002005201037039803200541e8016a41086a290300210c20052903e801211002400240200a422088220fa72209200aa7460d00200921080c010b200941016a22062009490d07200fa722084101742204200620062004491bad220a42307e220f422088a70d07200fa722064100480d070240024020090d002006102a21120c010b2012200941306c2006102e21120b2012450d040b2013290300210f201f29030021282020290300213020052903980321322012200841306c6a2209201037032020092032370300200941286a200c370300200941186a2030370300200941106a2028370300200941086a200f370300200a42ffffffff0f83200841016aad42208684210a200141306a2201202e470d000b201b2903002128200529038803210f0b200541c8026a41086a2204290300211020052903c8022115200541e8016a41086a2209200b41086a290300370300200541e8016a41106a2208200b41106a290300370300200541e8016a41186a2206200b41186a2903003703002005200b2903003703e8012012450d00201d290300212f20052903d802213020054188026a41186a220e2006290300370300202d2008290300370300202b2009290300370300200520052903e80137038802200b280258220d41ffffff3f71200d470d03200d4105742206417f4c0d03200b28025021090240024020060d004101210b0c010b2006102a220b450d020b02400240200d0d00410021010c010b200b2108034020082009290000370000200841186a200941186a290000370000200841106a200941106a290000370000200841086a200941086a290000370000200841206a2108200941206a2109200641606a22060d000b200d41057441606a41057641016a21010b200541a8026a41186a2203200e290300370300200541a8026a41106a220e202d290300370300200541a8026a41086a2214202b29030037030020052005290388023703a802201b201c1002220941086a29000037030020052009290000370388032009102c2004201b29030037030020052005290388033703c802201b41d1fdc200ad42808080808002841002220941086a29000037030020052009290000370388032009102c201d201b29030037030020052005290388033703d8022005201936028803202020241006220941186a290000370300201f200941106a2900003703002013200941086a29000037030020052009290000370398032009102c20182020290300370300201a201f2903003703002016201329030037030020052005290398033703c80341c000102a2206450d01200620052903c802370000200620052903d802370010200620052903c80337002041082104200641086a200541c8026a41086a290300370000200641186a200541d8026a41086a290300370000200641286a200541c8036a41086a290300370000200641306a201a290300370000200641386a201829030037000020054198036a200641c00010e90302400240200528029803222b0d00410021084200210c410021090c010b200529029c03220c422088a72108200ca72109202b21040b20202003290300370300201f200e29030037030020132014290300370300200520052903a80237039803024020082009470d0002402008200ca7470d00200841016a22092008490d062008410174220e2009200e20094b1bad223242d8007e2233422088a70d062033a722094100480d060240024020080d002009102a21040c010b2004200841d8006c2009102e21040b2004450d03200c42808080807083203284210c0b200c422088a721080b2004200841d8006c220e6a22092015200f7c220f3703102009202f370308200920303703002009200b36022c20092012360220200941186a201020287c200f201554ad7c370300200941346a2001360200200941306a200d360200200941246a200a3702002009200529039803370338200941c0006a2013290300370300200941c8006a201f290300370300200941d0006a20202903003703000240024020040d002006ad428080808080088410050c010b20054198036a2004200841016a2209109e042006ad428080808080088420053502a0034220862005280298032208ad8410010240200528029c03450d002008102c0b200ca7210b02402009450d00200441306a2109200e41d8006a210803400240200941746a280200450d00200941706a280200102c0b02402009280200450d002009417c6a280200102c0b200941d8006a2109200841a87f6a22080d000b0b200b450d002004102c0b2006102c0b201141e0006a211120272021490d010c050b0b1033000b103a000b1035000b200aa7450d00200b102c0b200541f0036a24000bbd0101057f2001280208210302402001410c6a280200220420024d0d0002400240200141186a2802002205450d00200141106a2802002101200541027421062003417f6a2103034002402004200128020022076b220520024b0d00200420024b0d030b200141046a21012003417f6a2103200521042006417c6a22060d000b0b200041023602080f0b2000200736020c2000410136020820002005ad4220862003ad843702000f0b2000410036020820002004ad4220862003ad843702000bc91604027f037e057f047e230041e0026b22052400200541c8016a2001200210a7040240024020052802d0014102470d00410021020c010b20052802c80121062001280204220241086a2900002107200241106a290000210820022900002109200541c8016a41186a200241186a290000370300200541c8016a41106a2008370300200541c8016a41086a2007370300200520093703c801200520063602e801200541b0026a41086a22024196e0c500ad4280808080f000841002220a41086a2900003703002005200a2900003703b002200a102c200541f0016a41086a2002290300370300200520052903b0023703f001200241a8f9c200ad42808080809001841002220a41086a2900003703002005200a2900003703b002200a102c20054180026a41086a2002290300370300200520052903b00237038002024002404104102a2202450d00200542043702b402200520023602b002200541c8016a200541b0026a10910120052802e801210b0240024020052802b402220a20052802b80222026b4104490d0020052802b002210a0c010b200241046a220c2002490d02200a4101742202200c2002200c4b1b22024100480d0202400240200a0d002002102a210a0c010b20052802b002200a2002102e210a0b200a450d01200520023602b4022005200a3602b00220052802b80221020b2005200241046a3602b802200a20026a200b36000020052802b402210a200541b0026a41186a220b20053502b80242208620052802b002220dad841006220241186a290000370300200541b0026a41106a220c200241106a290000370300200541b0026a41086a220e200241086a290000370300200520022900003703b0022002102c20054190026a41186a200b29030037030020054190026a41106a200c29030037030020054190026a41086a200e290300370300200520052903b002370390020240200a450d00200d102c0b41c000102a2202450d00200220052903f00137000020022005290380023700102002200529039002370020200241086a200541f0016a41086a290300370000200241186a20054180026a41086a220b290300370000200241286a20054190026a41086a290300370000200241306a20054190026a41106a290300370000200241386a20054190026a41186a290300370000200541c0003602d402200520023602d00220054180026a2002ad42808080808008841003108d0102400240200528028002220a0d004200210f0c010b200528028402210c02400240200b280200220b4110490d00200b4170714110460d00200a41186a2900002108200a41086a2900002110200a2900102107200a29000021094201210f0c010b200541003602980220054201370390022005410b3602f4012005200541d0026a3602f001200520054190026a3602dc02200541c4026a4101360200200542013702b402200541d0b0c2003602b0022005200541f0016a3602c002200541dc026a41c49ac500200541b0026a10391a2005350298024220862005350290028410040240200528029402450d00200528029002102c0b4200210f0b200c450d00200a102c0b2002102c20084200200f42005222021b21082007420020021b21070240024002402009420020021b220f2003542010420020021b220920045420092004511b0d00200f20038520092004858450450d02200541b8016a20032004428094ebdc03420010e105200541a8016a20052903b8012209200541b8016a41086a290300220f4280ec94a37c427f10e00520054198016a2009200f20013502242210420010e00520054188016a4200200529039801220f201020052903a80120037c7e22092009428094ebdc038022094280ec94a37c7e7c4280cab5ee01562009a76aad7c220920077d2210201020095620054198016a41086a2903002009200f54ad7c220f20087d2009200754ad7d2209200f562009200f511b22021b220f4200200920021b428094ebdc03420010e105200541f8006a200529038801220920054188016a41086a29030022104280ec94a37c427f10e005200541e8006a200920104280cab5ee01420010e005200541e8006a41086a29030020052903682210200f20052903787c22094280cab5ee017e428094ebdc03824280cab5ee01562009420188a76aad7c2209201054ad7c210f410021020c010b200541c8006a20032004428094ebdc03420010e105200541d8006a20032004428094ebdc03420010e205200541386a2005290348200541c8006a41086a29030020013502242210420010e005200541286a420020052903382211201020052903587e22102010428094ebdc038022104280ec94a37c7e7c4280cab5ee01562010a76aad7c221020077d22122012201056200541386a41086a2903002010201154ad7c221120087d2010200754ad7d221020115620102011511b22021b22114200201020021b428094ebdc03420010e105200541186a20052903282210200541286a41086a29030022124280ec94a37c427f10e005200541086a201020124280cab5ee01420010e005200141206a28020022022003200f7d221020022903007c2212370300200241086a2202200420097d2003200f54ad7d20022903007c2012201054ad7c370300200541086a41086a2903002005290308220f201120052903187c22094280cab5ee017e428094ebdc03824280cab5ee01562009420188a76aad7c2209200f54ad7c210f410121020b024002402009200f84500d00200128021c22022002290300221020097c2211370300200241086a22022002290300200f7c2011201054ad7c3703002008200f7c200720097c2209200754ad7c2108200921070c010b2002450d010b200141013a0028200541b0026a41086a22024196e0c500ad4280808080f000841002220141086a290000370300200520012900003703b0022001102c200541f0016a41086a2002290300370300200520052903b0023703f001200241a8f9c200ad42808080809001841002220141086a290000370300200520012900003703b0022001102c20054180026a41086a2002290300370300200520052903b002370380024104102a2202450d01200542043702b402200520023602b002200541c8016a200541b0026a10910120052802e801210a0240024020052802b402220120052802b80222026b4104490d0020052802b00221010c010b200241046a220b2002490d0320014101742202200b2002200b4b1b22024100480d030240024020010d002002102a21010c010b20052802b00220012002102e21010b2001450d02200520023602b402200520013602b00220052802b80221020b2005200241046a3602b802200120026a200a36000020052802b4022101200541b0026a41186a220a20053502b80242208620052802b002220ead841006220241186a290000370300200541b0026a41106a220b200241106a290000370300200541b0026a41086a220c200241086a290000370300200520022900003703b0022002102c20054190026a41186a200a29030037030020054190026a41106a200b29030037030020054190026a41086a200c290300370300200520052903b0023703900202402001450d00200e102c0b41c000102a2202450d01200220052903f00137000020022005290380023700102002200529039002370020200241086a200541f0016a41086a290300370000200241186a20054180026a41086a290300370000200241286a20054190026a41086a290300370000200241306a20054190026a41106a290300370000200241386a20054190026a41186a2903003700004110102a2201450d012001200337000020012004370008200141104120102e2201450d0120012007370010200141186a20083700002002ad42808080808008842001ad428080808080048410012001102c2002102c0b410121020c020b1033000b1035000b2000200636020420002002360200200541e0026a24000bb80302057f017e230041c0006b22022400200241206a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341b5fdc200ad4280808080d000841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2000109f01024041c000102a2204450d00200420022903003700002004200229031037001020042002290020370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a29000037000002400240200141ff0171220341024d0d004101210342002107410121010c010b024002400240024020030e03000102000b410021010c020b410121010c010b410221010b200220013a00204101102a2203450d01200320013a00004100210142808080801021070b2004ad428080808080088420072003ad841001024020010d002003102c0b2004102c200241c0006a24000f0b1033000bc70201057f230041c0006b22022400200241206a41086a22034196e0c500ad4280808080f000841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341d3f8c200ad4280808080e000841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2000109f01024041c000102a22040d001033000b200420022903003700002004200229031037001020042002290020370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241c000360224200220043602202001200241206a10a1022004102c200241c0006a24000b13002000410a360204200041a4e2c5003602000bba0a02037f017e02400240024002400240024020002802000e0400010203000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d05200241017422042003200420034b1b22044100480d050240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d05200241017422002004200020044b1b22004100480d050240024020020d002000102a21020c010b200128020020022000102e21020b2002450d0420012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d04200241017422042003200420034b1b22044100480d040240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0320012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d04200241017422002003200020034b1b22004100480d040240024020020d002000102a21020c010b200128020020022000102e21020b2002450d0320012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d03200241017422042003200420034b1b22044100480d030240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d03200241017422002004200020044b1b22004100480d030240024020020d002000102a21020c010b200128020020022000102e21020b2002450d0220012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d02200241017422042003200420034b1b22044100480d020240024020020d002004102a21030c010b200128020020022004102e21030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d02200241017422002003200020034b1b22004100480d020240024020020d002000102a21020c010b200128020020022000102e21020b2002450d0120012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b1033000b1035000b130020004104360204200041b8ecc3003602000b3400200041afb7c50036020420004100360200200041146a4101360200200041106a41ecf8c300360200200041086a42043702000b4b01027f230041106b2202240002404101102a22030d001033000b200341003a0000200041086a4101360200200241013602042002200336020020002002290300370200200241106a24000b13002000410336020420004198fac3003602000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241103600000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241033600000b3901017f02404110102a22020d001033000b200242003700082002428080e983b1de16370000200042908080808002370204200020023602000be50902067f027e230041106b2202240020002802102103200041186a2802002204200110670240024002400240200141046a2802002205200141086a28020022066b2004490d00200128020021050c010b200620046a22072006490d02200541017422062007200620074b1b22064100480d020240024020050d002006102a21050c010b200128020020052006102e21050b2005450d0120012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a2003200410db051a200028021c210502400240200141046a2802002206200728020022046b4104490d00200128020021060c010b200441046a22032004490d02200641017422042003200420034b1b22044100480d020240024020060d002004102a21060c010b200128020020062004102e21060b2006450d0120012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a20053600002002200136020c2000412c6a2002410c6a109402200041086a29030021082000290300210902400240200141046a2802002206200328020022046b4110490d00200128020021060c010b200441106a22052004490d02200641017422042005200420054b1b22044100480d020240024020060d002004102a21060c010b200128020020062004102e21060b2006450d0120012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000280220210302400240200141046a2802002206200528020022046b4104490d00200128020021060c010b200441046a22052004490d02200641017422042005200420054b1b22044100480d020240024020060d002004102a21060c010b200128020020062004102e21060b2006450d0120012006360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200620046a20033600000240024020002802244101460d0002400240200141046a28020020052802002200460d00200128020021040c010b200041016a22042000490d04200041017422062004200620044b1b22064100480d040240024020000d002006102a21040c010b200128020020002006102e21040b2004450d0320012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a00000c010b02400240200141046a28020020052802002204460d00200128020021060c010b200441016a22062004490d03200441017422052006200520064b1b22054100480d030240024020040d002005102a21060c010b200128020020042005102e21060b2006450d0220012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a00002000280228210602400240200141046a2802002204200528020022006b4104490d00200128020021040c010b200041046a22052000490d03200441017422002005200020054b1b22004100480d030240024020040d002000102a21040c010b200128020020042000102e21040b2004450d0220012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20063600000b200241106a24000f0b1033000b1035000b130020004101360204200041f8fcc3003602000b1300200041053602042000419cfec3003602000b3400200041e4d2c50036020420004100360200200041146a4107360200200041106a41f490c400360200200041086a42083702000b3301017f02404110102a22020d001033000b2002420037000820024201370000200042908080808002370204200020023602000b2201017f230041106b22022400200241003602002000200210c903200241106a24000bc70101017f23004190016b22022400200241003a00782002428080848080023703682002420137035820024201370350200242af0137034820024287013703402002420137033820024201370330200242013703282002420137032020024201370318200242013703102002420137030820024280808080c00037036020024280808180800437037020024100360288012002420137038001200241086a20024180016a10e902200041086a200228028801360200200020022903800137020020024190016a24000b130020004110360204200041f899c4003602000b2f01017f02404108102a22020d001033000b2000428880808080013702042000200236020020024280ade2043700000b2e01017f02404104102a22020d001033000b20004284808080c000370204200020023602002002418080013600000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241203600000b2d01017f02404108102a22020d001033000b20004288808080800137020420002002360200200242e8073700000b3801017f02404110102a22020d001033000b2002420037000820024280a094a58d1d370000200042908080808002370204200020023602000b3701017f02404110102a22020d001033000b2002420037000820024280c8afa025370000200042908080808002370204200020023602000b3a01017f02404110102a22020d001033000b20024200370008200242808086bdbacdd21a370000200042908080808002370204200020023602000b3b01017f02404110102a22020d001033000b200242003700082002428080a8ec85afd1b101370000200042908080808002370204200020023602000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241083600000b2c01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241023600000ba02a04127f017e017f067e230041f0036b22062400200641d0026a200010ee01410221070240024020062d00d00222084102470d0041012108413421094102210a0c010b200641d0036a41086a220b200641e4026a290200370300200641d0036a41106a220a200641ec026a290200370300200641d0036a41186a220c200641f4026a290200370300200641a8036a41086a220d20064188036a290300370300200641a8036a41106a220e20064190036a290300370300200641a8036a41186a220f20064198036a290300370300200641a8036a41206a2210200641a0036a2903003703002006200641dc026a2902003703d003200620064180036a2903003703a803200641d0026a41086a2802002109024020080d00200641fc026a2802002107200641a0026a41186a200c290300370300200641a0026a41106a200a290300370300200641a0026a41086a200b290300370300200641f8016a41086a200d290300370300200641f8016a41106a200e290300370300200641f8016a41186a200f290300370300200641f8016a41206a2010290300370300200620062903d0033703a002200620062903a8033703f8010b4102210a024020074102470d0041012108413421090c010b200641a8036a41186a200641a0026a41186a290300370300200641a8036a41106a200641a0026a41106a290300370300200641a8036a41086a200641a0026a41086a290300370300200641d0026a41086a200641f8016a41086a290300370300200641d0026a41106a200641f8016a41106a290300370300200641d0026a41186a200641f8016a41186a290300370300200641d0026a41206a200641f8016a41206a290300370300200620062903a0023703a803200620062903f8013703d002410021082007210a0b200641d8016a41086a220c200641a8036a41086a220d290300370300200641d8016a41106a220e200641a8036a41106a220f290300370300200641d8016a41186a2210200641a8036a41186a2211290300370300200641b0016a41086a2212200641d0026a41086a2207290300370300200641b0016a41106a2213200641d0026a41106a220b290300370300200641b0016a41186a2214200641d0026a41186a2215290300370300200641b0016a41206a2216200641d0026a41206a290300370300200620062903a8033703d801200620062903d0023703b0010240024020080d0020064188016a221720062903b001370300200641ec006a200c290300370200200641f4006a200e290300370200200641fc006a201029030037020020064190016a201229030037030020064198016a2013290300370300200641a0016a2014290300370300200641a8016a201629030037030020062009360260200620062903d8013702642006200a3602840120154200370300200b420037030020074200370300200642003703d002200641a0026a41086a22084191b0c200ad4280808080e000841002220941086a290000370300200620092900003703a0022009102c20072008290300370300200620062903a0023703d002200841acb0c200ad4280808080e000841002220941086a290000370300200620092900003703a0022009102c200b20062903a0022218370300200d2007290300370300200f201837030020112008290300370300200620183703d801200620062903d0023703a803200641d8006a200641a8036a4120109401200628025c410020062802581b210c41012107024002402006280284014101470d002017280200200c460d010b200641d0026a200110ee010240024020062d00d002220a4102470d00412e210d41d5b2c400210e0c010b200641a0026a41026a20062d00d3023a0000200641a8036a41086a2207200641e4026a280200360200200620062f00d1023b01a0022006200641dc026a2902003703a803200641ec026a2802002108200641e8026a28020021090240200a0d0041012107412e210d41d5b2c400210e024020080d000c020b2009102c0c010b200641d0026a41086a280200210d20062802d402210e200641d8016a41026a200641a0026a41026a2d00003a0000200641f8016a41086a2007280200360200200620062f01a0023b01d801200620062903a8033703f801200641f0026a2d0000210f410021070b200641c0026a41026a200641d8016a41026a2d00003a0000200641b0016a41086a220a200641f8016a41086a280200360200200620062f01d8013b01c002200620062903f8013703b00120070d00200641e3036a200a280200360000200620062f01c0023b01d0032006200d3600d7032006200e3600d303200620062903b0013700db032006200f3a00ef03200620083600eb03200620093600e7032006200641c2026a2d00003a00d2032006280284012116200628028801211720062005280200220e200541086a280200221241057422086a3602b4012006200e3602b0012006200641e0006a3602b801024002400240024002400240024002402012450d00200e210703402006200741206a22093602b001200641d0026a200a200710c70420062802d00222070d0220092107200841606a22080d000b0b41002110200641003602c802200642043703c0024104210f410021110c010b200641a8036a41086a2209200641d0026a410c6a280200360200200620062902d4023703a8034110102a220f450d01200f2007360200200f20062903a803370204200f410c6a20092802003602002009200641b0016a41086a280200360200200620062903b00122183703a803024002402018a7220820062802ac03220a470d0041012110410121110c010b200641d0026a4104722113200a41606a21154101211041012111034020082107024003402006200741206a22083602a803200641d0026a2009200710c70420062802d002220d0d0120082107200a2008470d000c030b0b200641f8016a41086a201341086a28020022083602002006201329020022183703f801200641d0026a41086a22192008360200200620183703d002024020112010470d00201041016a22082010490d05201041017422112008201120084b1b221141ffffffff00712011470d05201141047422084100480d050240024020100d002008102a210f0c010b200f20104104742008102e210f0b200f450d040b200741206a2108200f20104104746a2214200d360200201420062903d0023702042014410c6a2019280200360200201041016a211020152007470d000b0b200620103602c802200620113602c4022006200f3602c0020b200641f8006a350200422086200635027084100f2118200641003602b003200642013703a8032018a722152018422088a7220d200641a8036a1086030240024020062802ac03220a20062802b00322096b4120490d00200941206a210720062802a80321080c010b200941206a22072009490d02200a41017422082007200820074b1b22134100480d0202400240200a0d002013102a21080c010b20062802a803200a2013102e21080b2008450d01200620133602ac03200620083602a8032013210a0b200620073602b003200820096a22092002290000370000200941086a200241086a290000370000200941106a200241106a290000370000200941186a200241186a290000370000200641d0026a41186a22092007ad4220862008ad841006220741186a290000370300200641d0026a41106a2213200741106a290000370300200641d0026a41086a2214200741086a290000370300200620072900003703d0022007102c200641b0016a41186a2009290300370300200641b0016a41106a2013290300370300200641b0016a41086a2014290300370300200620062903d0023703b0010240200a450d002008102c0b0240200d450d002015102c0b0240200641b0016a200641d0036a412010dd050d00200c201720121b210a4101201620121b2112200641f0006a210d4100210802402010450d0020104104742109200f410c6a2107410021080340200728020020086a2108200741106a2107200941706a22090d000b0b2006200628027c20086b36027c200010f601200641d0026a41106a2209200437030020064180036a200a360200200641fc026a2012360200200641f8026a200c360200200641f4026a200628027c360200200641d0026a41186a220a200d290300370300200641d0026a41206a200d41086a28020036020020064184036a20022900003702002006418c036a200241086a29000037020020064194036a200241106a2900003702002006419c036a200241186a290000370200200620033703d802200641003a00d0022001200641d0026a10f801200641c8006a200010b701200641c8006a41086a290300211a2006290348211b200641f8016a20004200420010a00120062903f801211c200a420037030020094200370300200641d0026a41086a22084200370300200642003703d002200641a0026a41086a2207418be9c500ad4280808080800184221d1002220041086a290000370300200620002900003703a0022000102c20082007290300370300200620062903a00222183703d801200620183703d002200741c9b5c000ad4280808080d00184221e1002220041086a290000370300200620002900003703a0022000102c200641d8016a41086a220020072903002218370300200620062903a00222033703d801200b2003370000200b41086a22022018370000200641a8036a41086a220c2008290300370300200641a8036a41106a220d2009290300370300200641a8036a41186a2212200a290300370300200620062903d0023703a803200641306a200641a8036a4120109e01200641306a41106a2903004200200628023022131b21182006290338420020131b2103200641f8016a41106a290300211f200629038002210402400240201c4200520d00200a42003703002009420037030020084200370300200642003703d0022007201d1002221341086a290000370300200620132900003703a0022013102c20082007290300370300200620062903a002221c3703d8012006201c3703d0022007201e1002221341086a290000370300200620132900003703a0022013102c20002007290300221c370300200620062903a002221d3703d801200b201d3700002002201c370000200c2008290300370300200d20092903003703002012200a290300370300200620062903d0023703a8032006427f2018201f7c200320047c22042003542207ad7c22032007200320185420032018511b22071b3703d8022006427f200420071b3703d002200641d0026a21070c010b200a42003703002009420037030020084200370300200642003703d0022007201d1002221341086a290000370300200620132900003703a0022013102c20082007290300370300200620062903a002221c3703d8012006201c3703d0022007201e1002221341086a290000370300200620132900003703a0022013102c20002007290300221c370300200620062903a002221d3703d801200b201d3700002002201c370000200c2008290300370300200d20092903003703002012200a290300370300200620062903d0023703a803200642002018201f7d2003200454ad7d221c200320047d2204200356201c201856201c2018511b22071b3703d80220064200200420071b3703d002200641d0026a21070b200641a8036aad428080808080048422042007ad42808080808002841001200641206a2001201b201a109d01200641206a41086a29030021032006290320211a200641d0026a41186a22094200370300200641d0026a41106a22004200370300200641d0026a41086a22084200370300200642003703d002200641a0026a41086a2207418be9c500ad428080808080018422181002220a41086a2900003703002006200a2900003703a002200a102c20082007290300370300200620062903a002221b3703d8012006201b3703d002200741c9b5c000ad4280808080d00184221b1002220a41086a2900003703002006200a2900003703a002200a102c200641d8016a41086a220c2007290300221c370300200620062903a002221d3703d801200b201d370000200b41086a220d201c370000200641a8036a41086a22122008290300370300200641a8036a41106a22132000290300370300200641a8036a41186a22142009290300370300200620062903d0023703a803200641086a200641a8036a4120109e01200641086a41106a290300211c2006290310211d2006280208210a200942003703002000420037030020084200370300200642003703d002200720181002220241086a290000370300200620022900003703a0022002102c20082007290300370300200620062903a00222183703d801200620183703d0022007201b1002220241086a290000370300200620022900003703a0022002102c200c20072903002218370300200620062903a002221b3703d801200b201b370000200d2018370000201220082903003703002013200029030037030020142009290300370300200620062903d0023703a8032006427f2003201c4200200a1b22187c201a201d4200200a1b22037c221a2003542207ad7c22032007200320185420032018511b22071b3703d8022006427f201a20071b3703d0022004200641d0026aad4280808080800284100102402010450d0020104104742108200f41046a210703400240200741046a280200450d002007280200102c0b200741106a2107200841706a22080d000b0b02402011450d00200f102c0b200541046a280200450d08200e102c0c080b200f20104104746a210e200f21072010450d03200641a8036aad42808080808004842103200f210703400240200728020022080d00200741106a21070c050b2006280278220941164d0d03200741046a28020021002006280270210b200741086a280200210a2007410c6a3502002118200641d0026a41186a22022008ad42808080808004841006220841186a290000370300200641d0026a41106a220c200841106a290000370300200641d0026a41086a220d200841086a290000370300200620082900003703d0022008102c200641a8036a41186a2002290300370300200641a8036a41106a200c290300370300200641a8036a41086a200d290300370300200620062903d0023703a8032009ad422086200bad84200941696aad422086200b41176aad844101200320184220862000ad84100a0240200a450d002000102c0b200741106a2207200e470d000c050b0b1033000b1035000b411720091047000b2007200e460d0003402007280200450d010240200741086a280200450d00200741046a280200102c0b200741106a2207200e470d000b0b2011450d00200f102c0b200641f4006a280200450d002006280270102c0b200541046a280200450d002005280200102c0b200641f0036a24000b9d0403057f017e027f230041f0006b22032400024002402001280200220441186a280200220541164d0d0020042802102106200341d0006a41186a22072002ad428080808080048422081006220441186a290000370300200341d0006a41106a2209200441106a290000370300200341d0006a41086a220a200441086a290000370300200320042900003703502004102c200341106a41186a2007290300370300200341106a41106a2009290300370300200341106a41086a200a2903003703002003200329035037031020032005ad4220862006ad84200541696aad422086200641176aad844101200341106aad42808080808004841008108d010240024020032802000d00200041003602000c010b20012802002204280218220541164d0d0220042802102106200341d0006a41186a220120081006220441186a290000370300200341d0006a41106a2207200441106a290000370300200341d0006a41086a2209200441086a290000370300200320042900003703502004102c200341306a41186a2001290300370300200341306a41106a2007290300370300200341306a41086a2009290300370300200320032903503703302005ad4220862006ad84200541696aad422086200641176aad844101200341306aad4280808080800484100920002002360200200020032903003702042000410c6a200341086a2802003602000b200341f0006a24000f0b411720051047000b411720051047000bc00201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff018341012001104221000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b20044180011047000b20044180011047000bfd0506057f017e017f017e097f017e230041f0016b22012400200141c0006a41186a22024200370300200141c0006a41106a22034200370300200141c0006a41086a2204420037030020014200370340200141f0006a41086a220541bad6c500ad428080808090018422061002220741086a290000370300200120072900003703702007102c200420052903003703002001200129037022083703602001200837034020054184c6c400ad4280808080c001841002220741086a290000370300200120072900003703702007102c200320012903702208370300200141206a41086a22072004290300370300200141206a41106a22092008370300200141206a41186a220a20052903003703002001200837036020012001290340370320200141f0006a200141206a10ea030240024020012d009001220b4103470d004190c6c40021040c010b200141206aad428080808080048422081005200141086a220c2005290300370300200141106a220d200141f0006a41106a220e290300370300200141186a220f200141f0006a41186a22102903003703002001200129037037030020024200370300200342003703002004420037030020014200370340200520061002221141086a290000370300200120112900003703702011102c2004200529030037030020012001290370220637036020012006370340200541d0d6c500ad4280808080d002841002221141086a290000370300200120112900003703702011102c200141e0006a41086a2005290300220637030020012001290370221237036020032012370000200341086a20063700002007200429030037030020092003290300370300200a200229030037030020012001290340370320200141013a00702008200141f0006aad428080808010841001200541023a0000200141063a00704100210441014100200141f0006a1092012010200f290300370300200e200d2903003703002005200c29030037030020012001290300370370200041809c316a200141f0006a200b4180de3410ca040b200141f0016a240020040bbf0c05057f017e017f027e057f230041f0016b22042400200441086a41186a22054200370300200441086a41106a22064200370300200441086a41086a2207420037030020044200370308200441d0016a41086a220841bad6c500ad428080808090018422091002220a41086a2900003703002004200a2900003703d001200a102c20072008290300370300200420042903d001220b3703282004200b370308200841abd6c500ad4280808080f00184220c1002220a41086a2900003703002004200a2900003703d001200a102c200620042903d001220b370300200441c8006a41086a220d2007290300370300200441c8006a41106a220a200b370300200441c8006a41186a220e20082903003703002004200b370338200420042903083703482004200441c8006a41201094012004280204210f2004280200211020054200370300200642003703002007420037030020044200370308200820091002221141086a290000370300200420112900003703d0012011102c20072008290300370300200420042903d001220b3703282004200b3703082008200c1002221141086a290000370300200420112900003703d0012011102c20052008290300220b370300200d2007290300370300200a20042903d001220c370300200e200b3703002004200c370338200420042903083703482004200f410020101b221141016a3602d001200441c8006aad4280808080800484200441d0016aad4280808080c000841001200a200141086a290000370300200e200141106a290000370300200441c8006a41206a200141186a2900003703002004200336024c20042000360248200420023a007020042001290000370350200820091002220141086a290000370300200420012900003703d0012001102c200441286a41086a220a2008290300370300200420042903d001370328200841ebb4c400ad42808080808002841002220141086a290000370300200420012900003703d0012001102c200441386a41086a220e2008290300370300200420042903d001370338200420113602cc01200441d0016a41186a2200200441cc016aad4280808080c000841006220141186a290000370300200441d0016a41106a2203200141106a2900003703002008200141086a290000370300200420012900003703d0012001102c200520002903003703002006200329030037030020072008290300370300200420042903d0013703080240024041c000102a2208450d0020082004290328370000200841086a200a2903003700002008200429033837001020082004290308370020200841186a200e290300370000200841286a2007290300370000200841306a2006290300370000200841386a200529030037000020042802482101200441003602d801200442013703d0014104102a2207450d00200441043602d401200420042802d801220541046a3602d801200420073602d001200720056a20013600002004200441d0016a360208200441d0006a200441086a109402024020042d0070220741024b0d00024002400240024020070e03000102000b410021010c020b410121010c010b410221010b200420013a00080240024020042802d40120042802d8012207460d0020042802d00121050c010b200741016a22052007490d03200741017422062005200620054b1b22064100480d030240024020070d002006102a21050c010b20042802d00120072006102e21050b2005450d02200420063602d401200420053602d00120042802d80121070b2004200741016a3602d801200520076a20013a00000b200428024c21050240024020042802d401220120042802d80122076b4104490d0020042802d00121010c010b200741046a22062007490d02200141017422072006200720064b1b22074100480d020240024020010d002007102a21010c010b20042802d00120012007102e21010b2001450d01200420073602d401200420013602d00120042802d80121070b2004200741046a3602d801200120076a200536000020042802d40121072008ad428080808080088420043502d80142208620042802d0012201ad84100102402007450d002001102c0b2008102c200441d4006a2011360200200441d1006a20023a0000200441d0006a41033a0000200441063a004841014100200441c8006a109201200441f0016a24000f0b1033000b1035000b9f2004067f027e117f097e230022012102200141a0046b41607122012400200141e0006a41186a4200370300200141e0006a41106a22034200370300200141e0006a41086a220442003703002001420037036020014180046a41086a220541bad6c500ad42808080809001841002220641086a29000037030020012006290000370380042006102c20042005290300370300200120012903800422073703a00320012007370360200541d5c5c400ad4280808080b001841002220641086a29000037030020012006290000370380042006102c20032001290380042207370300200141c0006a41086a2004290300370300200141c0006a41106a2007370300200141c0006a41186a2005290300370300200120073703c00320012001290360370340200141203602f4012001200141c0006a3602f001200141f8016a200141c0006aad428080808080048422081003108d010240024002400240024020012802f80122090d004100210a0c010b20012802fc01210b2001200141f8016a41086a28020036029c022001200936029802200141386a20014198026a107502400240024020012802380d000240200128029c02220c41c4006e220d41c4006c2205417f4c0d00200128023c210e0240024020050d004104210a0c010b2005102a220a450d060b0240200e450d004100210f034002400240200c4104490d002001200c417c6a220636029c022001200128029802221041046a360298022010280000211141002105200141003a008001024002400340024020062005470d002001410036029c02200541ff01710d020c030b200141e0006a20056a201020056a220441046a2d00003a00002001200441056a360298022001200541016a22043a0080012004210520044120470d000b200141c0036a41086a2212200141e0006a41086a2213290300370300200141c0036a41106a2214200141e0006a41106a2215290300370300200141c0036a41186a2216200141e0006a41186a22172903003703002001200620046b36029c02200120012903603703c00341002105200141003a008001201020046a21182004200c6b41046a210c03400240200c20056a0d002001410036029c02200541ff0171450d030c020b200141e0006a20056a201820056a221041046a2d00003a00002001201041056a360298022001200541016a22103a0080012006417f6a21062010210520104120470d000b200141e0036a41086a22052013290300370300200141e0036a41106a22102015290300370300200141e0036a41186a22182017290300370300200141a0036a41086a22192012290300370300200141a0036a41106a22122014290300370300200141a0036a41186a221420162903003703002001200620046b220c36029c02200120012903603703e003200120012903c0033703a003201720142903003703002015201229030037030020132019290300370300200120012903a00337036020014180046a41186a201829030037030020014180046a41106a201029030037030020014180046a41086a2005290300370300200120012903e0033703800441002105201121190c030b200141003a0080010b4100210c0b410121050b20014180036a41086a2206200141e0006a41086a29030037030020014180036a41106a2210200141e0006a41106a29030037030020014180036a41186a2218200141e0006a41186a290300370300200141e0026a41086a221120014180046a41086a290300370300200141e0026a41106a221320014180046a41106a290300370300200141e0026a41186a221520014180046a41186a290300370300200120012903603703800320012001290380043703e00202402005450d002001410036028802200d450d05200a102c0c050b200f41016a2104200141c0026a41186a22172018290300370300200141c0026a41106a22182010290300370300200141c0026a41086a22102006290300370300200141a0026a41086a22062011290300370300200141a0026a41106a22112013290300370300200141a0026a41186a2213201529030037030020012001290380033703c002200120012903e0023703a0020240200d200f470d00200f41017422052004200520044b1b220dad42c4007e2207422088a70d0a2007a722054100480d0a02400240200f0d002005102a210a0c010b200a200f41c4006c2005102e210a0b200a450d080b200a200f41c4006c6a22052019360200200520012903c0023702042005410c6a2010290300370200200541146a20182903003702002005411c6a2017290300370200200520012903a0023702242005412c6a2006290300370200200541346a20112903003702002005413c6a20132903003702002004210f2004200e470d000b0b20014190026a200e3602002001200d36028c022001200a36028802200a450d02200129028c0221070c030b103a000b20014100360288020b4100210a200141003602880420014201370380042001410b3602e4032001200141f0016a3602e003200120014180046a3602c003200141f4006a410136020020014201370264200141d0b0c2003602602001200141e0036a360270200141c0036a41c49ac500200141e0006a10391a2001350288044220862001350280048410040240200128028404450d00200128028004102c0b0b200b450d002009102c0b200a4104200a1b211802400240024020074200200a1b221a422088a72211450d002018201141c4006c6a2105200141e0006a201828020010cc04201841c4006a210f02400240200128027022040d004200211b420021070c010b200141286a2001290360200141e0006a41086a290300200141f8006a350200420010e005200141286a41086a29030021072001290328211b2001280274450d002004102c0b0240200f2005470d002001201b3703604100211020014100360270200120073703680c020b201141c4006c41bc7f6a210a410021102018210c410121040340200141e0006a200f220628020010cc0402400240200128027022050d004200211c4200211d0c010b200141186a2001290360200141e0006a41086a2903002001350278420010e005200141186a41086a290300211d2001290318211c2001280274450d002005102c0b200641c4006a210f2007201d201b201c562007201d562007201d511b22051b2107201b201c20051b211b200c200620051b210c2010200420051b2110200441016a2104200a41bc7f6a220a0d000b2001201b3703602001201036027020012007370368200c0d010b41e9c5c4002101201aa7450d012018102c2002240041e9c5c4000f0b201020114f0d022018201041c4006c6a220541186a2206290200211d20182011417f6a220441c4006c6a220c41c0006a2802002110200c41206a290200211b200c41286a290200211c200c41306a290200211e200c41386a290200211f200c2902002120200c2902082107200c29021021212006200c41186a290200370200200529021021222005202137021020052902082121200520073702082005290200210720052020370200200541386a201f370200200541306a201e370200200541286a201c370200200541206a220628020021112006201b370200200541c0006a20103602002001202237037020012021370368200120073703602001201d370378200141e0036a41186a200128027c360200200141e0036a41106a2001290274370300200141e0036a41086a200129026c370300200120012902643703e003200141e0006a41186a220f4200370300200141e0006a41106a220a4200370300200141e0006a41086a220642003703002001420037036020014180046a41086a220541bad6c500ad42808080809001841002221041086a29000037030020012010290000370380042010102c200620052903003703002001200129038004221d3703a0032001201d370360200541d5c5c400ad4280808080b001841002221041086a29000037030020012010290000370380042010102c200141c0036a41086a2005290300221d3703002001200129038004221b3703c0032003201b370000200341086a201d370000200141c0006a41086a2006290300370300200141c0006a41106a200a290300370300200141c0006a41186a200f2903003703002001200129036037034020014100360268200142013703602004200141e0006a106702402004450d00201821050340200528020021100240024020012802642206200128026822046b4104490d00200128026021060c010b200441046a220f2004490d0620064101742204200f2004200f4b1b22044100480d060240024020060d002004102a21060c010b200128026020062004102e21060b2006450d042001200436026420012006360260200128026821040b2001200441046a360268200620046a20103600002001200141e0006a36028004200541046a20014180046a109402200541246a200141e0006a109101200541c4006a2205200c470d000b0b200128026421052008200135026842208620012802602204ad84100102402005450d002004102c0b2007a721100240201aa7450d002018102c0b20014180046a41086a220541bad6c500ad42808080809001841002220441086a29000037030020012004290000370380042004102c200141a0036a41086a2206200529030037030020012001290380043703a003200541e0c5c400ad42808080809001841002220441086a29000037030020012004290000370380042004102c200141c0036a41086a220f200529030037030020012001290380043703c003200120103602800320014180046a41186a220c20014180036aad4280808080c000841006220441186a29000037030020014180046a41106a220a200441106a2900003703002005200441086a29000037030020012004290000370380042004102c200141e0006a41186a2204200c290300370300200141e0006a41106a220c200a290300370300200141e0006a41086a220a2005290300370300200120012903800437036041c000102a2205450d01200520012903a003370000200520012903c00337001020052001290360370020200541086a2006290300370000200541186a200f290300370000200541286a200a290300370000200541306a200c290300370000200541386a2004290300370000200141e0006a200541c00010f303024020012802702206450d002005ad428080808080088410050b200141e8006a2903002107200141f8006a280200210f2001290360211d2001280274210c2005102c02402006450d000240200f4105742204450d002006210503402005201d200710c201200541206a2105200441606a22040d000b0b20014188016a200737030020014180016a201d370300200141e0006a41186a2205200f360200200141f4006a200c360200200141e0006a41106a22042006360200200141ec006a2010360200200141e0006a41086a220641013a0000200141063a006041014100200141e0006a1092012005200141e0036a41186a2802003602002004200141e0036a41106a2903003703002006200141e0036a41086a290300370300200120012903e0033703602001201136027c200041809c316a200141e0006a41004180de3410ca040b410021010b2002240020010f0b1033000b41a888c600201020111038000b1035000bcb0401087f230041f0006b22022400200241d0006a41086a220341bad6c500ad42808080809001841002220441086a290000370300200220042900003703502004102c200241086a41086a2205200329030037030020022002290350370308200341e0c5c400ad42808080809001841002220441086a290000370300200220042900003703502004102c200241186a41086a22062003290300370300200220022903503703182002200136024c200241d0006a41186a2201200241cc006aad4280808080c000841006220441186a290000370300200241d0006a41106a2207200441106a2900003703002003200441086a290000370300200220042900003703502004102c200241286a41186a22082001290300370300200241286a41106a22092007290300370300200241286a41086a2201200329030037030020022002290350370328024041c000102a2204450d00200420022903083700002004200229031837001020042002290328370020200441086a2005290300370000200441186a2006290300370000200441286a2001290300370000200441306a2009290300370000200441386a2008290300370000200241d0006a200441c00010f303200120032903003703002006200241d0006a411c6a2802003602002002200229035037032820022002290264370318024020022802602203450d002000200229032837030020002002290318370214200041086a200241286a41086a2903003703002000411c6a200241186a41086a2802003602000b200020033602102004102c200241f0006a24000f0b1033000bff0301067f230041f0006b22022400200241d0006a41086a220341bad6c500ad42808080809001841002220441086a290000370300200220042900003703502004102c200241086a41086a2205200329030037030020022002290350370308200341ccc5c400ad42808080809001841002220441086a290000370300200220042900003703502004102c200241186a41086a22062003290300370300200220022903503703182002200136024c200241d0006a41186a2201200241cc006aad4280808080c000841006220441186a290000370300200241d0006a41106a2207200441106a2900003703002003200441086a290000370300200220042900003703502004102c200241286a41186a22042001290300370300200241286a41106a22012007290300370300200241286a41086a2207200329030037030020022002290350370328024041c000102a2203450d00200320022903083700002003200229031837001020032002290328370020200341086a2005290300370000200341186a2006290300370000200341286a2007290300370000200341306a2001290300370000200341386a2004290300370000200241d0006a200341c00010d0010240024020022802502204450d0020002002290254370204200020043602000c010b20004100360208200042013702000b2003102c200241f0006a24000f0b1033000b860701067f23004190016b22022400200241206a200141206a280200360200200241186a200141186a290200370300200241106a200141106a290200370300200241086a200141086a29020037030020022001290200370300200241e8006a41086a220141bad6c500ad42808080809001841002220341086a290000370300200220032900003703682003102c200241286a41086a200129030037030020022002290368370328200141fbb4c400ad4280808080e000841002220341086a290000370300200220032900003703682003102c200241386a41086a20012903003703002002200229036837033802404104102a2203450d0020024284808080c00037026c20022003360268200320022802003600002002410472200241e8006a109101200228026c2104200241e8006a41186a2205200235027042208620022802682206ad841006220341186a290000370300200241e8006a41106a2207200341106a2900003703002001200341086a290000370300200220032900003703682003102c200241c8006a41186a2005290300370300200241c8006a41106a2007290300370300200241c8006a41086a20012903003703002002200229036837034802402004450d002006102c0b41c000102a2201450d00200120022903283700002001200229033837001020012002290348370020200141086a200241286a41086a290300370000200141186a200241386a41086a290300370000200141286a200241c8006a41086a2204290300370000200141306a200241d8006a290300370000200141386a200241c8006a41186a290300370000200241c00036022c20022001360228200241c8006a2001ad42808080808008841003108d0102400240200228024822030d0041002103410021040c010b200228024c2107024002402004280200450d0020032d0000220441ff0071220541064b0d00200441077621040c010b20024100360270200242013703682002410b36023c2002200241286a3602382002200241e8006a36028c01200241146a410136020020024201370204200241d0b0c2003602002002200241386a3602102002418c016a41c49ac500200210391a200235027042208620023502688410040240200228026c450d002002280268102c0b410221040b02402007450d002003102c0b4100200520044102461b2103200441017121040b2001102c200020033a0001200020043a000020024190016a24000f0b1033000bb70d04017f047e137f087e230041a0046b2205240002400240024020040d00420021064200210742002108420021090c010b200541e8016a10d004200541b0026a20052802e801220a20052802f00110d301024020052802ec01450d00200a102c0b20054198016a41086a200541b0026a41086a290300220637030020054198016a41106a200541b0026a41106a290300220737030020054198016a41186a200541b0026a41186a220b290300220837030020054198016a41206a200541b0026a41206a220c2d0000220a3a0000200520052903b002220937039801200541c0016a41206a200a3a0000200541c0016a41186a2008370300200541c0016a41106a2007370300200541c0016a41086a2006370300200520093703c001200541e8016a200541c0016a10d1044200210842002109420021064200210720052d00a8024107460d002004417f6a210d20054198036a410472210e200541b0026a41c0006a210f420021064200210742002108420021090340200b2007370300200520063703c002200520083703b002200520093703b802200c200541e8016a41c10010db05211002400240200f2002460d00200f2002412010dd050d010b200e2010290200370200200e41086a201041086a2211290200370200200e41106a201041106a2212290200370200200e41186a201041186a2213290200370200200520013602980320054180046a41086a220a41bad6c500ad42808080809001841002220441086a29000037030020052004290000370380042004102c200541c0036a41086a2214200a29030037030020052005290380043703c003200a41fbb4c400ad4280808080e000841002220441086a29000037030020052004290000370380042004102c200541d0036a41086a2215200a29030037030020052005290380043703d0034104102a2204450d0320054284808080c0003702840420052004360280042004200528029803360000200e20054180046a109101200528028404211620054180046a41186a22172005350288044220862005280280042218ad841006220441186a29000037030020054180046a41106a2219200441106a290000370300200a200441086a29000037030020052004290000370380042004102c200541e0036a41186a221a2017290300370300200541e0036a41106a221b2019290300370300200541e0036a41086a221c200a29030037030020052005290380043703e00302402016450d002018102c0b41c000102a2204450d03200420052903c003370000200420052903d003370010200420052903e003370020200441086a2014290300370000200441186a2015290300370000200441286a201c290300370000200441306a201b290300370000200441386a201a29030037000020054190016a200441c00041014100410010970120052802900121142004102c20144101460d0020052d00900321042017201329000037030020192012290000370300200a2011290000370300200520102900003703800420054180016a20054180046a10b10120054180016a41086a290300211d200529038001211e02400240200420032004200341ff0171491b220441ff01710d002005201e201d420a420010e10520054198036a41186a201729030037030020054198036a41106a201929030037030020054198036a41086a200a290300370300200520052903800437039803200541106a200120054198036a4100200d10cf04200541106a41186a290300211f200541106a41086a2903002120200529032021212005290310212220052903002223211e200541086a2903002224211d0c010b200541c0006a201d42002004ad42ff01832223420010e005200541d0006a201e42002023420010e00520054198036a41186a201729030037030020054198036a41106a201929030037030020054198036a41086a200a290300370300200520052903800437039803200541e0006a200120054198036a2004200d10cf04200541306a42004200201e420010e005427f200541d0006a41086a2903002223200529034020052903307c7c221f2005290348200529033884420052201f2023547222041b2124427f200529035020041b2123200541e0006a41186a290300211f200541e0006a41086a290300212020052903702121200529036021220b201d20077c201e20067c2207201e54ad7c201f7c200720217c2206200754ad7c2107202420097c202320087c2209202354ad7c20207c200920227c2208200954ad7c21090b200541e8016a200541c0016a10d10420052d00a8024107470d000b0b2000200637031020002008370300200041186a200737030020002009370308200541a0046a24000f0b1033000bb30303047f017e017f230041d0006b22012400200141c0006a41086a220241bad6c500ad42808080809001841002220341086a290000370300200120032900003703402003102c200141206a41086a2204200229030037030020012001290340370320200241cfb4c400ad42808080809002841002220341086a290000370300200120032900003703402003102c200141306a41086a20022903002205370300200141086a2004290300370300200141186a20053703002001200129034022053703302001200129032037030020012005370310024002404101450d004120210402400240024002404120450d004120102a22020d010c050b411021044110102a2202450d04200141106a210320022001290300370000200241086a200141086a2903003700000c010b20022001290300370000200241086a200141086a290300370000200141106a21034120210641204110470d010b20022004200441017422064120200641204b1b2206102e2202450d020b20022003290000370010200241186a200341086a290000370000200041203602082000200636020420002002360200200141d0006a24000f0b103a000b1033000b820803037f047e067f230022022103200241c0036b41607122022400200141186a22042900002105200420022903b80237000020012900102106200120022903b00237001020012900082107200120022903a802370008200241003a00a00220012900002108200120022903a002370000200220053703b801200220063703b001200220073703a801200220083703a001200141206a2d00002104200241a0026a41176a22092005370000200241a0026a41106a220a20022900b101370300200241a0026a41086a220b20022900a901370300200220022900a1013703a002024002402008a741ff01714101460d00200041073a00400c010b200241106a41176a2009290000370000200241106a41106a200a290300370300200241106a41086a200b290300370300200220022903a002370310200220043a002f20024190026a200241106a10d504200241a0026a200228029002220420022802980210e803024020022d00c1024102470d00200241003602a0032002420137039803200241306a41146a410d3602002002413c6a410b360200200241093602ac03200241bad6c5003602a8032002410b3602342002410b3602b403200241e0b4c4003602b003200220024190026a3602402002200241b0036a3602382002200241a8036a360230200220024198036a3602bc03200241d8006a41146a41033602002002420337025c200241a89cc5003602582002200241306a360268200241bc036a41c49ac500200241d8006a10391a20023502a003422086200235029803841004200041073a00400240200228029c03450d00200228029803102c0b200228029402450d01200228029002102c200324000f0b200241a0016a200241a0026a41e30010db051a0240200228029402450d002004102c0b200241306a41206a2204200241a0026a41206a2d00003a0000200241306a41186a2209200241a0026a41186a220a290300370300200241306a41106a220b200241a0026a41106a220c290300370300200241306a41086a220d200241a0026a41086a220e290300370300200220022903a002370330200241d8006a200241c1016a41c20010db051a200141206a200241d8006a41c1006a2d00003a0000200141186a20024191016a290000370000200141106a20024189016a290000370000200141086a20024181016a29000037000020012002290079370000200a200241106a41186a290300370300200c200241106a41106a290300370300200e200241106a41086a290300370300200220022903103703a002200241c8026a200d290300370300200241d0026a200b290300370300200241d8026a2009290300370300200241e0026a20042d00003a0000200220022903303703c0022000200241a0026a41c10010db051a200324000f0b200324000bd31309027f017e047f017e057f027e027f017e017f230041c0016b22012400200141a0016a41086a220241bad6c500ad428080808090018422031002220441086a290000370300200120042900003703a0012004102c200141386a41086a22052002290300370300200120012903a001370338200241ebb4c400ad42808080808002841002220441086a290000370300200120042900003703a0012004102c200141c8006a41086a22062002290300370300200120012903a001370348200120003602a001200141f8006a41186a2207200141a0016aad22084280808080c000841006220441186a290000370300200141f8006a41106a2209200441106a290000370300200141f8006a41086a220a200441086a290000370300200120042900003703782004102c200141d8006a41186a220b2007290300370300200141d8006a41106a220c2009290300370300200141d8006a41086a220d200a29030037030020012001290378370358024041c000102a2204450d00200420012903383700002004200129034837001020042001290358370020200441086a2005290300370000200441186a2006290300370000200441286a200d290300370000200441306a200c290300370000200441386a200b2903003700002004ad428080808080088410052004102c200b4200370300200c4200370300200d420037030020014200370358200220031002220441086a290000370300200120042900003703a0012004102c200d2002290300370300200120012903a001220337033820012003370358200241c3d6c500ad4280808080d00184220e1002220441086a290000370300200120042900003703a0012004102c200c20012903a0012203370300200a200d29030037030020092003370300200720022903003703002001200337034820012001290358370378200141106a200141f8006a412010940102402001280214410020012802101b22042000470d00200141d8006a41186a22074200370300200141d8006a41106a22094200370300200141d8006a41086a2202420037030020014200370358200141a0016a41086a220441bad6c500ad42808080809001841002220d41086a2900003703002001200d2900003703a001200d102c20022004290300370300200120012903a001220337033820012003370358200441abd6c500ad4280808080f001841002220d41086a2900003703002001200d2900003703a001200d102c200141c8006a41086a20042903002203370300200120012903a001220f370348200c200f370000200c41086a2003370000200141f8006a41086a2002290300370300200141f8006a41106a2009290300370300200141f8006a41186a200729030037030020012001290358370378200141086a200141f8006a412010940120012802082102200128020c210d200041016a220410d30421072004200d410020021b220d4f0d0020070d000340200441016a220410d30421022004200d4f0d012002450d000b0b200141d8006a41186a22074200370300200141d8006a41106a22094200370300200141d8006a41086a220d420037030020014200370358200141a0016a41086a220241bad6c500ad428080808090018422031002220a41086a2900003703002001200a2900003703a001200a102c200d2002290300370300200120012903a001220f3703382001200f3703582002200e1002220a41086a2900003703002001200a2900003703a001200a102c200141c8006a41086a220a2002290300220e370300200120012903a001220f370348200c200f370000200c41086a200e370000200141f8006a41086a220c200d290300370300200141f8006a41106a220b2009290300370300200141f8006a41186a2205200729030037030020012001290358370378200120043602a001200141f8006aad428080808080048420084280808080c0008422081001200220031002220441086a290000370300200120042900003703a0012004102c200141386a41086a22062002290300370300200120012903a001370338200241ccc5c400ad42808080809001841002220441086a290000370300200120042900003703a0012004102c200a2002290300370300200120012903a001370348200120003602a001200520081006220441186a290000370300200b200441106a290000370300200c200441086a290000370300200120042900003703782004102c200720052903003703002009200b290300370300200d200c2903003703002001200129037837035841c000102a2204450d00200420012903383700002004200129034837001020042001290358370020200441086a2006290300370000200441186a200a290300370000200441286a200d290300370000200441306a2009290300370000200441386a20072903003700002004ad428080808080088410052004102c200141f8006a200010cd04200128027c21102001280278211102402001280280012204450d0020044105742107200141f8006a410472210d41bad6c500ad42808080809001842112201121020340200141186a41186a200241186a2900002203370300200141186a41106a200241106a2900002208370300200141186a41086a200241086a290000220e37030020012002290000220f370318200d200f370200200d41086a200e370200200d41106a2008370200200d41186a200337020020012000360278200141a0016a41086a220420121002220c41086a2900003703002001200c2900003703a001200c102c200141386a41086a22092004290300370300200120012903a001370338200441fbb4c400ad4280808080e000841002220c41086a2900003703002001200c2900003703a001200c102c200141c8006a41086a220a2004290300370300200120012903a0013703484104102a220c450d0220014284808080c0003702a4012001200c3602a001200c2001280278360000200d200141a0016a10910120012802a401210b200141a0016a41186a220520013502a80142208620012802a0012213ad841006220c41186a290000370300200141a0016a41106a2206200c41106a2900003703002004200c41086a2900003703002001200c2900003703a001200c102c200141d8006a41186a220c2005290300370300200141d8006a41106a22052006290300370300200141d8006a41086a22062004290300370300200120012903a0013703580240200b450d002013102c0b41c000102a2204450d02200241206a2102200420012903383700002004200129034837001020042001290358370020200441086a2009290300370000200441186a200a290300370000200441286a2006290300370000200441306a2005290300370000200441386a200c2903003700002004ad428080808080088410052004102c200741606a22070d000b0b02402010450d002011102c0b200141c0016a24000f0b1033000bda0301067f230041f0006b22012400200141d0006a41086a220241bad6c500ad42808080809001841002220341086a290000370300200120032900003703502003102c200141086a41086a2204200229030037030020012001290350370308200241ebb4c400ad42808080808002841002220341086a290000370300200120032900003703502003102c200141186a41086a22052002290300370300200120012903503703182001200036024c200141d0006a41186a2200200141cc006aad4280808080c000841006220341186a290000370300200141d0006a41106a2206200341106a2900003703002002200341086a290000370300200120032900003703502003102c200141286a41186a22032000290300370300200141286a41106a22002006290300370300200141286a41086a2206200229030037030020012001290350370328024041c000102a22020d001033000b200220012903083700002002200129031837001020022001290328370020200241086a2004290300370000200241186a2005290300370000200241286a2006290300370000200241306a2000290300370000200241386a20032903003700002001200241c000410141004100109701200128020021032002102c200141f0006a240020034101460ba30a05067f057e017f017e017f230041b0036b22022400200241f8016a41086a220341bad6c500ad42808080809001841002220441086a290000370300200220042900003703f8012004102c20024188036a41086a22052003290300370300200220022903f80137038803200341c3c5c400ad42808080809001841002220441086a290000370300200220042900003703f8012004102c200241d0006a41086a22062003290300370300200220022903f801370350200241f8016a2000109f01024002400240024041c000102a2204450d00200420022903880337000020042002290350370010200420022900f801370020200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241f8016a41106a2207290000370000200441386a200241f8016a41186a2205290000370000200241f8016a200441c00010ef0302402002280288022203450d002004ad428080808080088410050b200241d0006a41086a2002419c026a2902002208370300200241d0006a41106a200241a4026a2902002209370300200241d0006a41186a200241ac026a290200220a370300200220024194026a290200220b370350200241f8016a41086a2206290300210c2005280200210d20022903f801210e200228028c02210f2005200a37030020072009370300200620083703002002200b3703f80102402003450d00200241106a41186a200241f8016a41186a290300370300200241106a41106a200241f8016a41106a290300370300200241106a41086a2006290300370300200220022903f8013703100b2004102c024020030d00200241f8016a41086a410e3a000020024181026a2000290000370000200241a4026a200136020020024189026a200041086a29000037000020024191026a200041106a29000037000020024199026a200041186a290000370000200241063a00f80141014100200241f8016a1092010c040b200241306a41186a2204200241106a41186a290300370300200241306a41106a2205200241106a41106a290300370300200241306a41086a2206200241106a41086a290300370300200220022903103703302002200d3602e401200220033602e001200241d0006a200241e0016a108f0220022802504118460d01200241306a200e200c10c201200241d0026a200c370300200241c8026a200e370300200241f8016a41086a2207410c3a0000200241a1026a2002290330370000200241a9026a2006290300370000200241b1026a2005290300370000200241b9026a200429030037000020024181026a2204200029000037000020024189026a200041086a29000037000020024191026a200041106a29000037000020024199026a200041186a290000370000200241063a00f80141014100200241f8016a109201200241f8016a200241d0006a41900110db051a200241003b018803200241e8016a200241f8016a20024188036a10c10220022d00f0012100200241f8016a410c6a2001360200200420004102463a0000200741073a0000200241063a00f80141014100200241f8016a1092010c020b1033000b2002200241306a200e200c10bf012002290300200241086a29030010b102200241f8016a41086a410d3a0000200241a4026a200136020020024181026a200029000037000020024189026a200041086a29000037000020024191026a200041106a29000037000020024199026a200041186a290000370000200241063a00f80141014100200241f8016a1092010b200f450d002003102c0b200241b0036a24000bbd0201057f230041c0006b22022400200241206a41086a220341bad6c500ad42808080809001841002220441086a290000370300200220042900003703202004102c200241086a2205200329030037030020022002290320370300200341e0b4c400ad4280808080b001841002220441086a290000370300200220042900003703202004102c200241106a41086a2206200329030037030020022002290320370310200241206a2001109f01024041c000102a22040d001033000b200420022903003700002004200229031037001020042002290020370020200042c0808080800837020420002004360200200441086a2005290300370000200441186a2006290300370000200441286a2003290000370000200441306a200241306a290000370000200441386a200241206a41186a290000370000200241c0006a24000b130020004115360204200041acc6c4003602000bca0a02087f037e230041b0016b2202240020024188016a41086a220341bad6c500ad42808080809001841002220441086a29000037030020022004290000370388012004102c200241086a41086a220520032903003703002002200229038801370308200341ebb4c400ad42808080808002841002220441086a29000037030020022004290000370388012004102c200241e0006a41086a22062003290300370300200220022903880137036020022001360250200241286a41186a2201200241d0006aad4280808080c000841006220441186a290000370300200241286a41106a2207200441106a290000370300200241286a41086a2208200441086a290000370300200220042900003703282004102c20024188016a41186a2204200129030037030020024188016a41106a22092007290300370300200320082903003703002002200229032837038801024002400240024041c000102a2201450d0020012002290308370000200120022903603700102001200229038801370020200141086a2005290300370000200141186a2006290300370000200141286a2003290300370000200141306a2009290300370000200141386a2004290300370000200241c00036024c20022001360248200241d0006a2001ad42808080808008841003108d010240200228025022050d00410321030c040b20022802542108200241d8006a28020022094104490d012005280000210741002103200241003a00a8012009417c6a21060340024020062003470d00200341ff0171450d03200241003a00a8010c030b20024188016a20036a200520036a41046a2d00003a00002002200341016a22043a00a8012004210320044120470d000b200241286a41186a20024188016a41186a290300370300200241286a41106a20024188016a41106a290300370300200241286a41086a20024188016a41086a29030037030020022002290388013703282009417c6a2004460d01200520046a220641046a2d0000220341034f0d01200920046b417b6a41034d0d01200241e0006a41086a200241286a41086a290300220a370300200241e0006a41106a200241286a41106a290300220b370300200241e0006a41186a200241286a41186a290300220c370300200241dc006a41026a220920024185016a41026a2d00003a0000200241086a41086a200a370300200241086a41106a200b370300200241086a41186a200c37030020022002290328220a370360200220022f0085013b015c2002200a370308200641056a2800002104200241286a41026a20092d00003a0000200220022f015c3b01280c020b1033000b20024100360268200242013703602002410b36022c2002200241c8006a3602282002200241e0006a3602082002419c016a41013602002002420137028c01200241d0b0c200360288012002200241286a36029801200241086a41c49ac50020024188016a10391a2002350268422086200235026084100402402002280264450d002002280260102c0b410321030b2008450d002005102c0b20024188016a41086a2205200241086a41086a29030037030020024188016a41106a2206200241086a41106a29030037030020024188016a41186a2208200241086a41186a290300370300200241e0006a41026a2209200241286a41026a2d00003a00002002200229030837038801200220022f01283b0160024020034103460d0020002004360204200020073602002000200229038801370208200020022f01603b0029200041106a2005290300370200200041186a2006290300370200200041206a20082903003702002000412b6a20092d00003a00000b200020033a00282001102c200241b0016a24000b3400200041bad6c50036020420004100360200200041146a4110360200200041106a41b0ecc400360200200041086a42093702000bf90201057f230041c0006b22022400200241206a4200370300200241186a4200370300200241086a41086a4200370300200241003a0028200242003703082002410036023820024201370330200241086a200241306a10910102400240024020022d0028220341064b0d000240024002400240024002400240024020030e0700010203040506000b410021040c060b410121040c050b410221040c040b410321040c030b410421040c020b410521040c010b410621040b200220043a003f02400240200228023420022802382203460d00200228023021050c010b200341016a22052003490d03200341017422062005200620054b1b22064100480d030240024020030d002006102a21050c010b200228023020032006102e21050b2005450d022002200636023420022005360230200228023821030b2002200341016a360238200520036a20043a00000b20002002290330370200200041086a200241306a41086a280200360200200241c0006a24000f0b1033000b1035000b3f01017f230041106b220224002002410036020820024201370300410020021067200041086a200228020836020020002002290300370200200241106a24000b6f01027f230041d0006b220224002002410036021002404101102a2203450d00200341003a0000200041086a4101360200200241013602442002200336024020002002290340370200024020022802102200450d002002280214450d002000102c0b200241d0006a24000f0b1033000b130020004107360204200041fc8ac5003602000b2e01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241809c313600000b2e01017f02404104102a22020d001033000b20004284808080c0003702042000200236020020024180a3053600000b3a01017f02404110102a22020d001033000b20024200370008200242808084fea6dee111370000200042908080808002370204200020023602000b2e01017f02404104102a22020d001033000b20004284808080c0003702042000200236020020024180de343600000bd71604097f017e017f017e230041a0016b2204240041bc99c500210502400240200110d304450d0020044180016a41086a220641bad6c500ad42808080809001841002220541086a29000037030020042005290000370380012005102c200441186a41086a20062903003703002004200429038001370318200641fbb4c400ad4280808080e000841002220541086a29000037030020042005290000370380012005102c200441e0006a41086a200629030037030020042004290380013703604104102a2205450d0120044284808080c00037028401200420053602800120052001360000200020044180016a109101200428028401210720044180016a41186a22082004350288014220862004280280012209ad841006220541186a29000037030020044180016a41106a220a200541106a2900003703002006200541086a29000037030020042005290000370380012005102c200441286a41186a2008290300370300200441286a41106a200a290300370300200441286a41086a2006290300370300200420042903800137032802402007450d002009102c0b41c000102a2206450d01200620042903183700002006200429036037001020062004290328370020200641086a200441186a41086a2207290300370000200641186a200441e0006a41086a2208290300370000200641286a200441286a41086a220a290300370000200641306a200441286a41106a2209290300370000200641386a200441286a41186a220b290300370000200441086a200641c000410141004100109701200428020821052006102c024020054101460d002004200036021420044180016a41086a220641bad6c500ad42808080809001841002220541086a29000037030020042005290000370380012005102c200720062903003703002004200429038001370318200641ccc5c400ad42808080809001841002220541086a29000037030020042005290000370380012005102c2008200629030037030020042004290380013703602004200136024820044180016a41186a220c200441c8006aad220d4280808080c000841006220541186a29000037030020044180016a41106a220e200541106a2900003703002006200541086a29000037030020042005290000370380012005102c200b200c2903003703002009200e290300370300200a2006290300370300200420042903800137032841c000102a2206450d02200620042903183700002006200429036037001020062004290328370020200641086a200441186a41086a290300370000200641186a200441e0006a41086a290300370000200641286a200441286a41086a2205290300370000200641306a200441386a290300370000200641386a200441286a41186a290300370000200441286a2006ad4280808080800884220f1003108d01024002402004280228220a450d0020052802002105200428022c21090c010b20044100360288012004420137038001410020044180016a106720042802880121052004280284012109200428028001210a0b200420053602502004200936024c2004200a360248024002400240024002402005450d0020044180016a200a2005410110db032004280280014101470d01200428024c450d042004280248102c0c040b4101200441c8006a10672004280214200441c8006a1091010c010b200428028401210b0240024002400240024002402004418c016a280200220520044188016a280200220a460d0020042802502005200a6b6a220941046a220c417f4c0d0102400240200c0d004101210e0c010b200c102a220e450d0c0b2004200c36021c2004200e360218200420093602202004200441186a36028001200b20044180016a200510c80220092005490d022004280220220b2009490d032004280250220b200a490d042004280218210c2004280248210e2004200920056b22093602582004200b200a6b220b36025c2009200b470d05200c20056a200e200a6a200910db051a2004280214200441186a1091012004280220210a200428021c210920042802182105200428024c450d072004280248102c0c070b2004200441c8006a36028001200b20044180016a200a10c8022004280214200441c8006a1091010c050b103a000b200520091047000b2009200b103f000b200a200b1047000b200441286a41146a4109360200200441346a410c360200200441e0006a41146a410336020020044203370264200441ec9fc6003602602004410c36022c2004200441d8006a3602782004200441dc006a36027c20044204370390012004420137028401200441c0a0c600360280012004200441286a360270200420044180016a3602382004200441fc006a3602302004200441f8006a360228200441e0006a41fca0c6001041000b2004280250210a200428024c2109200428024821050b2005450d00200f200aad4220862005ad84100102402009450d002005102c0b2006102c0c010b2006102c20044180016a41086a220641bad6c500ad42808080809001841002220541086a29000037030020042005290000370380012005102c200441186a41086a220a20062903003703002004200429038001370318200641ccc5c400ad42808080809001841002220541086a29000037030020042005290000370380012005102c200441e0006a41086a2209200629030037030020042004290380013703602004200136024820044180016a41186a220b200d4280808080c000841006220541186a29000037030020044180016a41106a220c200541106a2900003703002006200541086a29000037030020042005290000370380012005102c200441286a41186a2205200b290300370300200441286a41106a220b200c290300370300200441286a41086a220c2006290300370300200420042903800137032841c000102a2206450d02200620042903183700002006200429036037001020062004290328370020200641086a200a290300370000200641186a2009290300370000200641286a200c290300370000200641306a200b290300370000200641386a200529030037000020044100360288012004420137038001410120044180016a1067200428021420044180016a10910120042802840121052006ad4280808080800884200435028801422086200428028001220aad84100102402005450d00200a102c0b2006102c0b20044180016a41086a220641bad6c500ad42808080809001841002220541086a29000037030020042005290000370380012005102c200720062903003703002004200429038001370318200641fbb4c400ad4280808080e000841002220541086a29000037030020042005290000370380012005102c2008200629030037030020042004290380013703604104102a2206450d0120044284808080c00037028401200420063602800120062001360000200020044180016a109101200428028401210120044180016a41186a22052004350288014220862004280280012208ad841006220641186a29000037030020044180016a41106a2200200641106a29000037030020044180016a41086a2207200641086a29000037030020042006290000370380012006102c200441286a41186a2005290300370300200441286a41106a2000290300370300200441286a41086a2007290300370300200420042903800137032802402001450d002008102c0b41c000102a2206450d01200620042903183700002006200429036037001020062004290328370020200641086a200441186a41086a290300370000200641186a200441e0006a41086a290300370000200641286a200441286a41086a290300370000200641306a200441386a290300370000200641386a200441286a41186a2903003700004101102a2201450d0141002105200141807f410020021b2003723a00002006ad42808080808008842001ad4280808080108410012001102c2006102c0b200441a0016a240020050f0b1033000bcc0301057f230041106b2203240020034100360208200342013703002001200310670240024002402001450d002000200141286c6a21040340200028020021050240024020032802042206200328020822016b4104490d00200328020021060c010b200141046a22072001490d04200641017422012007200120074b1b22014100480d040240024020060d002001102a21060c010b200328020020062001102e21060b2006450d032003200136020420032006360200200328020821010b2003200141046a360208200620016a20053600002003200336020c200041046a22062003410c6a109402200041246a28020021050240024020032802042200200328020822016b4104490d00200328020021000c010b200141046a22072001490d04200041017422012007200120074b1b22014100480d040240024020000d002001102a21000c010b200328020020002001102e21000b2000450d032003200136020420032000360200200328020821010b2003200141046a360208200020016a2005360000200641246a22002004470d000b0b200328020421012002290200200335020842208620032802002200ad84100102402001450d002000102c0b200341106a24000f0b1033000b1035000bf70702067f027e230041e0006b22022400200241186a200041186a290000370300200241106a200041106a290000370300200241086a200041086a29000037030020022000290000370300200241c0006a41086a220341bad6c500ad42808080809001841002220041086a290000370300200220002900003703402000102c200241206a41086a2204200329030037030020022002290340370320200341c3c5c400ad42808080809001841002220041086a290000370300200220002900003703402000102c200241306a41086a2205200329030037030020022002290340370330200241c0006a2002109f0102400240024041c000102a2200450d00200020022903203700002000200229033037001020002002290040370020200041086a2004290300370000200041186a2005290300370000200041286a2003290000370000200041306a200241c0006a41106a290000370000200041386a200241c0006a41186a290000370000200141186a280200220341186a2204417f4c0d010240024020040d00410121050c010b2004102a2205450d01200128021821030b200241003602482002200436024420022005360240200128021021062003200241c0006a10670240024020022802442205200228024822046b2003490d00200228024021050c010b200420036a22072004490d03200541017422042007200420074b1b22044100480d030240024020050d002004102a21050c010b200228024020052004102e21050b2005450d012002200436024420022005360240200228024821040b2002200420036a360248200520046a2006200310db051a2001411c6a200241c0006a109101200141086a2903002108200129030021090240024020022802442205200228024822046b4110490d00200228024021030c010b200441106a22032004490d03200541017422042003200420034b1b22064100480d030240024020050d002006102a21030c010b200228024020052006102e21030b2003450d01200220063602442002200336024020022802482104200621050b200320046a22062008370008200620093700002002200441106a2204360248200128023c21060240200520046b41034b0d00200441046a22072004490d03200541017422042007200420074b1b22044100480d030240024020050d002004102a21030c010b200320052004102e21030b2003450d012002200436024420022003360240200228024821040b2002200441046a360248200320046a2006360000200228024421032000ad4280808080800884200235024842208620022802402204ad84100102402003450d002004102c0b2000102c0240200141146a280200450d002001280210102c0b200241e0006a24000f0b1033000b103a000b1035000bff0201047f230041e0006b22012400200141186a200041186a290000370300200141106a200041106a290000370300200141086a200041086a29000037030020012000290000370300200141c0006a41086a220241bad6c500ad42808080809001841002220041086a290000370300200120002900003703402000102c200141206a41086a220320022903003703002001200129034037032020024188fbc400ad4280808080d000841002220041086a290000370300200120002900003703402000102c200141306a41086a2204200229030037030020012001290340370330200141c0006a2001109f01024041c000102a22000d001033000b200020012903203700002000200129033037001020002001290040370020200041086a2003290300370000200041186a2004290300370000200041286a2002290000370000200041306a200141c0006a41106a290000370000200041386a200141c0006a41186a2900003700002000ad428080808080088410052000102c200141e0006a24000bbc0101037f02400240024002402000280200220041046a2802002203200041086a28020022046b2002490d00200028020021030c010b200420026a22052004490d02200341017422042005200420054b1b22044100480d020240024020030d002004102a21030c010b200028020020032004102e21030b2003450d0120002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a2001200210db051a41000f0b1033000b1035000ba70301047f230041106b22022400200028020021002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b0240024002400240200041046a2802002203200041086a28020022046b2001490d00200028020021030c010b200420016a22052004490d02200341017422042005200420054b1b22044100480d020240024020030d002004102a21030c010b200028020020032004102e21030b2003450d0120002003360200200041046a2004360200200041086a28020021040b200041086a200420016a360200200320046a2002410c6a200110db051a200241106a240041000f0b1033000b1035000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41c49ac500200241086a10392101200241206a240020010b130020004101360204200041c49fc5003602000b13002000410236020420004198a1c5003602000b2d01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241e8073600000b2d01017f02404104102a22020d001033000b20004284808080c00037020420002002360200200241e5003600000bfa0304027f027e017f027e230041e0006b22042400200441086a200128021029034842002003ad420010e00520012802182205420020052903082206427f200429030820042903104200521b7d2207200720065622051b37030802400240024020050d002003417f4c0d0102400240024020030d004101210802402001280214280208200241014100101e41026a220141024b0d0020010e03040002040b41ac91c600412841d491c6001036000b0240200310302208450d0002402001280214280208200220082003101e41026a220141024b0d0020010e03030002030b41ac91c600412841d491c6001036000b1033000b41002101200441003a005802400240034020032001460d01200441386a20016a200820016a2d00003a00002004200141016a22053a00582005210120054120470d000b200441186a41186a200441386a41186a2903002206370300200441186a41106a200441386a41106a2903002207370300200441186a41086a200441386a41086a290300220937030020042004290338220a370318200041196a2006370000200041116a2007370000200041096a20093700002000200a370001410021010c010b0240200141ff0171450d00200441003a00580b410121010b200020013a00002003450d032008102c0c030b2008102c0b200041013a00000c010b103a000b200441e0006a24000bfa0304027f027e017f027e230041e0006b22042400200441086a200128021029034842002003ad420010e00520012802182205420020052903082206427f200429030820042903104200521b7d2207200720065622051b37030802400240024020050d002003417f4c0d0102400240024020030d004101210802402001280214280208200241014100101e41026a220141024b0d0020010e03040002040b41ac91c600412841d491c6001036000b0240200310302208450d0002402001280214280208200220082003101e41026a220141024b0d0020010e03030002030b41ac91c600412841d491c6001036000b1033000b41002101200441003a005802400240034020032001460d01200441386a20016a200820016a2d00003a00002004200141016a22053a00582005210120054120470d000b200441186a41186a200441386a41186a2903002206370300200441186a41106a200441386a41106a2903002207370300200441186a41086a200441386a41086a290300220937030020042004290338220a370318200041196a2006370000200041116a2007370000200041096a20093700002000200a370001410021010c010b0240200141ff0171450d00200441003a00580b410121010b200020013a00002003450d032008102c0c030b2008102c0b200041013a00000c010b103a000b200441e0006a24000bd40202027f037e230041106b220424002004200128021029034842002003ad420010e00520012802182205420020052903082206427f200429030020042903084200521b7d2207200720065622051b37030842012106024002400240024020050d002003417f4c0d02024020030d0002402001280214280208200241014100101e41026a220341024b0d00420021074200210820030e03050005050b41ac91c600412841d491c6001036000b02400240200310302205450d0002402001280214280208200220052003101e41026a220141024b0d0020010e03020004020b41ac91c600412841d491c6001036000b1033000b2005102c0b0c020b0240200341104f0d004200210742012106420021082005102c0c020b200541086a290000210820052900002107420021062005102c0c010b103a000b2000200737030820002006370300200041106a2008370300200441106a24000b130020004103360204200041acafc5003602000b3400200041afb7c50036020420004100360200200041146a4101360200200041106a41b4b7c500360200200041086a42043702000b990101017f02404101102a2202450d00200241003a0000200241014102102e2202450d00200241003a0001200241024104102e2202450d00200241003b0002200241044108102e2202450d0020024100360004200241084110102e2202450d0020024200370008200241104120102e2202450d002002420037001820024200370010200042a08080808004370204200020023602000f0b1033000bd30101017f230041106b22022400024002400240024020002d00000e03010200010b200220012802184183f8c500410b2001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c020b20022001280218418ef8c500410c2001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b20022001280218419af8c500410d2001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040b200241106a240020000be8cf0106067f017e057f017e117f027e2300419081046b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280204220320012802082204460d00200441016a22052004490d02200320054f0d0120052003103f000b200241013a0030200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103720022802f88004210420022802fc8004210120004101360200200041003a00042001450d2a2004102c0c2a0b200128020020046a2d00002104200120053602082004410c4b0d0302400240024020040e0d0001151413121110050c0b0a04000b200241e8006a200110920541012106200228026c2107024020022802684101470d0020074108762101200241f8006a2802002104200241e8006a41086a29030021080c250b41002109200241e8006a41004180800110da051a410021034100210a2007450d1f410021054100210a410121064100210b0340024002402001280204220c200128020822036b2007200b6b220441808001200441808001491b2204490d00200320046a220d2003490d04200c200d4f0d01200d200c103f000b200241013a00e880042002418c81046a4101360200200242013702fc8004200241f0f7c5003602f880042002412b36021c2002200241186a36028881042002200241e880046a360218200241306a200241f880046a10372002290330210820022802382104410521070240200a450d002006102c0b0c260b200241e8006a200128020020036a200410db051a2001200d36020802400240200a20056b2004490d00200520046a21030c010b200520046a22032005490d22200a410174220d2003200d20034b1b220d4100480d2202400240200a0d00200d102a21060c010b2006200a200d102e21060b2006450d2a200d210a0b200620056a200241e8006a200410db051a2003210520072004200b6a220b4b0d000c200b0b200241e8006a2001109905024020022802684101470d00200228026c22044108762105200241e8006a41086a2903002208422088210e200241f8006a28020021030c1e0b200241fc006a280200210f200241f8006a2802002101200241f4006a2802002103200241f0006a2802002110200228026c210b4100210441002109024002400240034002402004411f4d0d00410f21040c020b0240024020032001460d002001417f460d052003200141016a22054f0d01200141016a2003103f000b200241013a0030200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241c8006a200241e8006a1037410521040c020b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200521012006418001710d000b20044120490d01410d210420064110490d010b200241f880046a41086a200241c8006a41086a28020022033602002002200229034822083703f880042008422088a721092008a721060c1e0b20024100360260200242043703580240024020090d00410421010c010b410020036b2111200b41026a2112410120036b21134100210a410421014100211441002115410021160340201621170240024002400240024002400240024020032005460d00200541016a22042005490d0120032004490d060240200b20056a2d0000220441e000460d00411821050c260b201741016a211641022118200541026a210441002106410321192012211a4100211b024002400340201a21072019210c2018210d02402006411f4d0d00410f21050c020b02400240201320046a4102460d002004450d07200320044f0d0120042003103f000b200241013a00302002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1037200241206a41086a200241f880046a41086a280200360200200220022903f88004370320410521050c020b200b20046a417f6a2d0000221c41ff00712006411f7174201b72211b200d41016a2118200c41016a2119200741016a211a200441016a2104200641076a2106201c418001710d000b20064120490d01201c4110490d01410d21050b200241e880046a41086a200241206a41086a28020022033602002002200229032022083703e880042008a721064100210420022802ec800421090c250b41002119200241003602382002420137033002400240201b0d002004417f6a21064101211c4100211a4100211d0c010b201120056a211e410021184101211c4100211a034002400240201e200d6a450d002005200c6a2204450d07200320044f0d0120042003103f000b200220183602342002201a3602382002201c360230200241013a00e880042002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103720022802f88004210620022802fc80042109200228028081042103410521050c260b200720056a2c000022044100480d0602400240200441c00071450d00200441807f72220441ff017141fb014b0d010b200220183602342002201a3602382002201c360230410621050c250b02400240201a2018460d002018211d201a21180c010b201841016a22062018490d2d2018410174221d2006201d20064b1b221d4100480d2d0240024020180d00201d102a211c0c010b201c2018201d102e211c0b201c450d350b201c20186a2004417f733a0000200d41016a210d200c41016a210c200741016a2107201d2118201b201a41016a221a470d000b2002201d3602342002201a3602382002201c3602302005200d6a21060b201c411076411074221b201c41087641ff0171410874221872201c41ff0171221c72210c4100210d03404100210402402019411f4d0d00410f21050c230b0240024020032006460d002006417f460d082003200641016a22054f0d01200641016a2003103f000b200241013a00302002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103720022802f88004210620022802fc8004210920022d00808104210320022d00818104210720022f01828104210d410521050c230b200b20066a2d0000220741ff00712019411f7174200d72210d201941076a2119200521062007418001710d000b20194120490d072007410f4d0d07410d21050c210b200241013a00302002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103720022802f88004210620022802fc8004210920022d00808104210320022d00818104210720022f01828104210d410521050c240b417f20041047000b417f20041047000b417f20041047000b200220183602342002201a3602382002201c360230411921050c1d0b417f200641016a1047000b20042003103f000b0240200d41014d0d004104210541f2cdc5002106412421090c190b024002400240200d0e020001000b410421060c010b20032005460d18024002400240200541016a220d2005490d002003200d490d010240200b20056a2c0000220441004e0d00411921050c1e0b41062105200441c00071450d02200441807f72220441ff017141fb014d0d022004417f732106200d21050c030b417f200541016a1047000b200541016a2003103f000b0c1a0b024020172015470d00024020142015460d00201421150c010b201441016a22042014490d232014410174220d2004200d20044b1b221541ffffffff00712015470d23201541047422044100480d230240024020140d002004102a21010c010b200120144104742004102e21010b2001450d2b2002201536025c20022001360258201521140b200120174104746a2204201f4180807c71200641ff01714108747241e00072221f36020c2004201a3602082004201d36020420042018201c72201b72360200200a41106a210a2002201636026020162009470d000b0b2005200f462104200229025c2208422088210e02402010450d00200b102c0b200ea721052008a721092004450d1c2005ad4220862009ad842108410221030c270b417f200141016a1047000b2003200d1047000b417f20051047000b200241e8006a2001109905024020022802684101470d00200041013602002000200241e8006a41047222012902003702042000410c6a200141086a2902003702000c280b200241fc006a280200210d200241f8006a2802002104200241f4006a2802002105200241f0006a280200210a200228026c210b410021034100210102400240034002402003411f4d0d00410f21040c080b20052004460d062004417f460d012005200441016a2206490d02200b20046a2d0000220941ff00712003411f71742001722101200341076a2103200621042009418001710d000b20034120490d04410d21042009410f4b0d060c040b417f200441016a1047000b200441016a2005103f000b200241e8006a2001109905024020022802684101470d00200041013602002000200241e8006a41047222012902003702042000410c6a200141086a2902003702000c270b200241fc006a280200210d200241f8006a2802002104200241f4006a2802002105200241f0006a280200210a200228026c210b410021034100210102400240034002402003411f4d0d00410f21040c0d0b20052004460d0b2004417f460d012005200441016a2206490d02200b20046a2d0000220941ff00712003411f71742001722101200341076a2103200621042009418001710d000b20034120490d09410d21042009410f4b0d0b0c090b417f200441016a1047000b200441016a2005103f000b200041123a000420004101360200200041056a20043a00000c250b200d20064621040240200a450d00200b102c0b02402004450d00410b21030c210b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a10372002418381046a200241386a280200360000200220022903303700fb8004200041053a0004200020022900f880043700052000410c6a200241ff80046a290000370000200041013602000c240b200241013a0030200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1037410521040b2000200436020420004101360200200041086a20022903f88004370200200041106a200241f880046a41086a280200360200200a450d22200b102c0c220b200241e8006a20011099050240024020022802684101470d00200228026c22014108762106200241e8006a41086a2903002208422088210e200241f8006a280200210b0c010b200241c0006a200241fc006a280200360200200241386a200241f4006a2902003703002002200229026c37033041002101410021050240024002400240024002400240034002402001411f4d0d00410f210d0c020b0240024020022802382209200228023c2204460d00200441016a22032004490d05200920034f0d0120032009103f000b200241013a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241c8006a200241e8006a10374105210d0c020b200228023020046a2d000021042002200336023c200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210d20044110490d010b200241f880046a41086a200241c8006a41086a280200220b3602002002200229034822083703f880042008422088a721072008a7210c410021060c040b20024100360250200242043703480240024020050d00410421010c010b4100210d0340200d41016a210d41002101410021090240024002400240024002400240034002402001411f4d0d00410f210d0c030b20022802382206200228023c2204460d01200441016a22032004490d0420062003490d06200228023020046a2d000021042002200336023c200441ff00712001411f71742009722109200141076a21012004418001710d000b20014120490d022004410f4d0d02410d210d0c010b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241f880046a200241e8006a1037200241e880046a41086a200241f880046a41086a280200360200200220022903f8800422083703e880042008a7210c4105210d0b20022802f08004210b20022802ec80042107410021060c090b200241e8006a200241306a108a05024020022802684101470d00200228026c220d41087621062002280278210b200228027421072002280270210c0c090b200228027421192002280270211c200228026c211a410021044100210b02400240034002402004411f4d0d00410f210d0c020b0240024020022802382206200228023c2203460d00200341016a22012003490d06200620014f0d0120012006103f000b200241013a00e880042002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a1037200241206a41086a200241f880046a41086a280200360200200220022903f8800422083703202008a7210c4105210d0c030b2002280230220a20036a2d000021032002200136023c200341ff00712004411f7174200b72210b200441076a21042003418001710d000b20044120490d0520034110490d05410d210d0b0b2002280228210b200228022421070c070b417f20031047000b417f20011047000b20032006103f000b4100211b200241e8006a41004180800410da051a02400240200b0d00410121184100210c0c010b4100211b4101211841002103410021070240034002400240200620016b200b20076b220441808004200441808004491b2204490d00200120046a220c2001490d032006200c4f0d01200c2006103f000b200241013a00202002410136028c8104200242013702fc8004200241f0f7c5003602f880042002412b36021c2002200241186a36028881042002200241206a360218200241e880046a200241f880046a103720022802e88004210c20022802ec8004210720022802f08004210b4105210d201b450d072018102c0c070b200241e8006a200a20016a200410db051a2002200c36023c02400240201b20036b2004490d00200320046a210c0c010b200320046a220c2003490d22201b4101742201200c2001200c4b1b22014100480d2202400240201b0d002001102a21180c010b2018201b2001102e21180b2018450d2a2001211b0b201820036a200241e8006a200410db051a200b200420076a22074d0d02200228023c2101200228023821062002280230210a200c21030c000b0b2001200c1047000b024020022802502203200228024c470d00200341016a22012003490d1f200341017422042001200420014b1b2204ad421c7e2208422088a70d1f2008a722014100480d1f0240024020030d002001102a21010c010b20022802482003411c6c2001102e21010b2001450d272002200436024c200220013602480b200228024822012003411c6c6a2204200941087622063b0001200420183602102004201a360204200420093a0000200441036a20064110763a0000200441186a200c360200200441146a201b3602002004410c6a2019360200200441086a201c3602002002200341016a360250200d2005470d000b0b200228023c2002280240462104200229024c2208422088210e02402002280234450d002002280230102c0b20014108762105200ea721032008a7210a2004450d042005410874200141ff01717221012003ad422086200aad842108410d21030c230b417f20031047000b02402019450d0020194104742104201a21010340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b41002106201c450d00201a102c0b2002280248211b024020022802502201450d00201b2001411c6c6a210a201b21090340024020092802042201450d0002402009410c6a2802002204450d00200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b200941086a280200450d002009280204102c0b2009411c6a21010240200941146a280200450d002009280210102c0b200121092001200a470d000b0b200228024c450d00201b102c0b2006410874200d41ff01717221012007ad220e422086200cad8421082002280234450d012002280230102c0c010b2005410874200141ff017172210d20024103410220041b3a00e88004200241e8006a41146a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103720022903f88004210820022802808104210b02402003450d00200d2003411c6c6a2106200d21090340024020092802042201450d0002402009410c6a2802002204450d00200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b200941086a280200450d002009280204102c0b2009411c6a21010240200941146a280200450d002009280210102c0b2001210920012006470d000b0b2008422088210e4105210141002106200a450d00200d102c0b20004101360200200041106a200b360200200041086a200e422086200842ffffffff0f838437020020002006410874200141ff0171723602040c210b200241e8006a20011099050240024020022802684101470d00200228026c220a4108762104200241e8006a41086a2903002208422088210e200241f8006a280200210d0c010b200241fc006a280200211b200241f8006a2802002101200241f4006a2802002105200241f0006a2802002107200228026c210b410021044100210902400240024002400240024002400240024002400240034002402004411f4d0d00410f210a0c020b0240024020052001460d002001417f460d052005200141016a22034f0d01200141016a2005103f000b200241013a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a10374105210a0c020b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200321012006418001710d000b20044120490d01410d210a20064110490d010b200241306a41086a200241f880046a41086a280200220d360200200220022903f8800422083703302008422088a7210c2008a7211b0c080b20024100360260200242043703580240024020090d00410421010c010b200241f1006a21104100211c0340201c41016a211c4100210141002106024002400240024002400240024002400240024002400240034002402001411f4d0d00410f210a0c020b0240024020052003460d002003417f460d062005200341016a22044f0d01200341016a2005103f000b200241013a00f880042002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241f880046a360218200241c8006a200241e8006a10374105210a2002280248211b0c030b200b20036a2d0000220a41ff00712001411f71742006722106200141076a210120042103200a418001710d000b20014120490d02200a4110490d02410d210a0b0b2002280250210d200228024c210c0c120b4100210c200241e8006a41004180800110da051a410121180240024020060d00200421034100211a4100210a0c010b4100210d4100211a41002119034002400240200520046b200620196b220141808001200141808001491b2201490d00200420016a22032004490d05200520034f0d0120032005103f000b200241013a00482002410136028c8104200242013702fc8004200241f0f7c5003602f880042002412b36021c2002200241186a36028881042002200241c8006a360218200241e880046a200241f880046a103720022802e88004211b20022802ec8004210c20022802f08004210d4105210a201a450d142018102c0c140b200241e8006a200b20046a200110db051a02400240201a200d6b2001490d00200d20016a210a0c010b200d20016a220a200d490d2d201a4101742204200a2004200a4b1b22044100480d2d02400240201a0d002004102a21180c010b2018201a2004102e21180b2018450d352004211a0b2018200d6a200241e8006a200110db051a20032104200a210d2006200120196a22194b0d000b0b2002200a3602402002410036023c2002200a3602382002201aad4220862018ad84370330410021014100210d02400240034002402001411f4d0d00410f210a0c020b02400240200a200c460d00200c417f460d07200a200c41016a22064f0d01200c41016a200a103f000b200241013a00482002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241f880046a200241e8006a1037200241206a41086a200241f880046a41086a280200360200200220022903f880043703204105210a0c020b2018200c6a2d000021042002200636023c200441ff00712001411f7174200d72210d200141076a21012006210c2004418001710d000b20014120490d0120044110490d01410d210a0b200241e880046a41086a200241206a41086a280200220d3602002002200229032022083703e880042008a7211b20022802ec8004210c0c110b4100210c200241003602f08004200242043703e8800402400240200d0d0041042116410021174100210f0c010b41002117410421164100210f03402017211d200f221441016a210f4100210141002118024002400240034002402001411f4d0d00410f21040c020b0240024020022802382219200228023c2204460d00200441016a22062004490d0b201920064f0d0120062019103f000b200241013a00f880042002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241f880046a360218200241c8006a200241e8006a1037410521042002280248211b0c030b2002280230221a20046a2d0000210a2002200636023c200a41ff00712001411f71742018722118200141076a2101200a418001710d000b20014120490d02200a4110490d02410d21040b0b2002280250210d200228024c210c410021010c0a0b02400240024020192006460d00200441026a21042006417f460d0920192004490d0a201a20066a2c000021012002200436023c0240200141004e0d00411921040c0d0b41062104200141c00071450d0b200141807f72220141ff017141fb014d0d0b2014201d460d01201d21172014211d0c020b200241013a00482002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241f880046a200241e8006a103720022802f88004211b20022802fc8004210c20022802808104210d410521040c0b0b201d41016a2204201d490d2d201d41017422062004200620044b1b221741ffffffff01712017470d2d201741037422044100480d2d02400240201d0d002004102a21160c010b2016201d4103742004102e21160b2016450d35200220163602e880040b2016201d4103746a2204201341807e712001417f7341ff01717222133a000420042018360200200f200d470d000b200220173602ec80042002200f3602f080040b2016200f4103746a210a201621010340200a2001460d09200c20012802006a2204200c492106200141086a21012004210c20060d0e0c000b0b417f200341016a1047000b200420031047000b417f200c41016a1047000b417f20061047000b417f20041047000b20042019103f000b0b2002201d3602ec8004200220143602f08004200141ff0171410874200472210a201d0d070c080b4101210a4100210441082119410021060340200241e8006a200241306a108b05024020022802684101470d002002280278210d2002280274210c2002280270211b200228026c210a0c050b200241f880046a41026a2201201041026a2d00003a0000200220102f00003b01f880042002280274211a200229037821080240024002400240024020022d0070220d4106470d00200a417f6a210a0c010b200d417e6a41034f0d00200a41016a220c200a4f2118200c210a20180d004115210c419ec7c500211b4104210a200d4109460d010c080b200241e8006a41026a220c20012d00003a0000200220022f01f880043b016820062004460d01200421180c020b0240201a28020441ffffffff0371450d00201a280200102c0b201a102c0c060b200441016a22012004490d23200441017422062001200620014b1b221841ffffffff00712018470d23201841047422014100480d230240024020040d002001102a21190c010b201920044104742001102e21190b2019450d2b20042106201821040b201920064104746a2201200d3a0000200120083703082001201a360204200120022f01683b0001200141036a200c2d00003a0000200641016a2106200a0d000b200228023c200228024046210102402002280234450d002002280230102c0b0240024002402001450d002002280260220a200228025c470d02200a41016a2201200a490d24200a41017422042001200420014b1b2204ad42187e2208422088a70d242008a7220141004e0d010c240b20024103410220011b3a00e880042002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103720022802f88004211b20022802fc8004210c20022802808104210d02402006450d0020064104742104201921010340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b02402018450d002019102c0b4105210a2017450d0a2016102c0c0a0b02400240200a0d002001102a21010c010b2002280258200a41186c2001102e21010b2001450d2a2002200436025c200220013602580b20022802582201200a41186c6a2204201936020c2004200f3602082004201736020420042016360200200441146a2006360200200441106a20183602002002200a41016a360260201c2009470d000b0b2003201b462104200229025c2208422088210e02402007450d00200b102c0b200ea721032008a721072004450d082003ad4220862007ad842108410c21030c260b417f200141016a1047000b02402006450d0020064104742103201921010340024020012d00004109470d000240200141046a2209280200220528020441ffffffff0371450d002005280200102c200928020021050b2005102c0b200141106a2101200341706a22030d000b0b2004450d012019102c0c010b20022802808104210d20022802fc8004210c411c210a0b2017450d010b2016102c0b2002280234450d002002280230102c0b20022802582118024020022802602201450d002018200141186c6a21062018210903400240200941046a280200450d002009280200102c0b0240200941146a2802002204450d00200928020c2101200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b200941186a21010240200941106a280200450d00200928020c102c0b2001210920012006470d000b0b200228025c450d002018102c0b200a4108762104200cad220e422086201bad8421082007450d01200b102c0c010b20024103410220041b3a0030200241e8006a41146a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103720022903f88004210820022802808104210d02402003450d002001200341186c6a210b2001210603400240200641046a280200450d002006280200102c0b0240200641146a2802002203450d00200628020c2104200341047421030340024020042d00004109470d000240200441046a2209280200220528020441ffffffff0371450d002005280200102c200928020021050b2005102c0b200441106a2104200341706a22030d000b0b200641186a21040240200641106a280200450d00200628020c102c0b200421062004200b470d000b0b2008422088210e4105210a410021042007450d002001102c0b20004101360200200041106a200d360200200041086a200e422086200842ffffffff0f838437020020002004410874200a41ff0171723602040c200b200241e8006a20011099050240024020022802684101470d00200228026c22044108762106200241e8006a41086a2903002208422088210e200241f8006a280200210b0c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a2902003703002002200229026c3703f8800441002101410021050240024002400240024002400240034002402001411f4d0d00410f210d0c020b02400240200228028081042209200228028481042204460d00200441016a22032004490d05200920034f0d0120032009103f000b200241013a0058200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200241e880046a41086a200241306a41086a280200360200200220022903303703e880044105210d0c020b20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210d20044110490d010b200241c8006a41086a200241e880046a41086a280200220b360200200220022903e8800422083703482008422088a721072008a7210c410021060c040b200241003602f08004200242043703e880040240024020050d00410421010c010b4100210b0340200b41016a210b410021014100210902400240024002400240034002402001411f4d0d00410f210d0c030b200228028081042206200228028481042204460d01200441016a22032004490d0920062003490d0a20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742009722109200141076a21012004418001710d000b20014120490d022004410f4d0d02410d210d0c010b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200241206a41086a200241306a41086a2802003602002002200229033022083703202008a7210c4105210d0b2002280228210b20022802242107410021060c010b200241e8006a200241f880046a108a05024020022802684101470d00200228026c220d41087621062002280278210b200228027421072002280270210c0c010b2002280274211b20022802702119200228026c2118200241e8006a200241f880046a108c0520022802684101470d01200228026c210d2002280278210b200228027421072002280270210c0240201b450d00201b4104742104201821010340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b200d41087621062019450d002018102c0b20022802e88004211b024020022802f080042201450d00201b2001411c6c6a210a201b21090340024020092802042201450d0002402009410c6a2802002204450d00200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b200941086a280200450d002009280204102c0b2009411c6a21010240200941146a280200450d002009280210102c0b200121092001200a470d000b0b20022802ec8004450d06201b102c0c060b4100210a2002280270210c200228026c2107024002402002280274220141027422030d004104210d410021060c010b2003410275220641ffffffff03712006470d1d200641027422044100480d1d2004102a220d450d250b02402001450d002003417c6a210a200d210120072104034020012004280200360200200141046a2101200441046a21042003417c6a22030d000b200a41027641016a210a0b0240200c450d002007102c0b024020022802f08004220320022802ec8004470d00200341016a22012003490d1d200341017422042001200420014b1b2204ad421c7e2208422088a70d1d2008a722014100480d1d0240024020030d002001102a21010c010b20022802e880042003411c6c2001102e21010b2001450d25200220043602ec8004200220013602e880040b20022802e8800422012003411c6c6a2204200941087622073b00012004200d36021020042018360204200420093a0000200441036a20074110763a0000200441186a200a360200200441146a20063602002004410c6a201b360200200441086a20193602002002200341016a3602f08004200b2005470d000b0b200228028481042002280288810446210420022902ec80042208422088210e024020022802fc8004450d0020022802f88004102c0b200ea721032008a7210d2004450d042003ad422086200dad842108410a21030c210b417f20031047000b417f20031047000b20032006103f000b2006410874200d41ff01717221042007ad220e422086200cad84210820022802fc8004450d0120022802f88004102c0c010b20024103410220041b3a00e88004200241e8006a41146a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a1037200229033021082002280238210b02402003450d0020012003411c6c6a210a200121060340024020062802042204450d0002402006410c6a2802002203450d00200341047421030340024020042d00004109470d000240200441046a2209280200220528020441ffffffff0371450d002005280200102c200928020021050b2005102c0b200441106a2104200341706a22030d000b0b200641086a280200450d002006280204102c0b2006411c6a21040240200641146a280200450d002006280210102c0b200421062004200a470d000b0b2008422088210e4105210441002106200d450d002001102c0b20004101360200200041106a200b360200200041086a200e422086200842ffffffff0f838437020020002006410874200441ff0171723602040c1f0b200d20064621040240200a450d00200b102c0b02402004450d00410921030c1b0b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a10372002418381046a200241386a280200360000200220022903303700fb8004200041053a0004200020022900f880043700052000410c6a200241ff80046a290000370000200041013602000c1e0b200241013a0030200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1037410521040b2000200436020420004101360200200041086a20022903f88004370200200041106a200241f880046a41086a280200360200200a450d1c200b102c0c1c0b200241e8006a20011099050240024020022802684101470d00200228026c22034108762104200241e8006a41086a2903002208422088210e200241f8006a28020021090c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a2902003703002002200229026c3703f88004410021014100210502400240024002400240024002400240024002400240024002400240024002400240034002402001411f4d0d00410f21030c020b02400240200228028081042209200228028481042204460d00200441016a22032004490d05200920034f0d0120032009103f000b200241013a0058200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200241206a41086a200241306a41086a28020036020020022002290330370320410521030c020b20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210320044110490d010b200241e880046a41086a200241206a41086a28020022093602002002200229032022083703e880042008422088a721062008a7210b0c0f0b20024100360260200242043703584104210102402005450d004100211b4100210c4100211a0340200241e8006a200241f880046a108e05024020022802684101470d002002200229027422083703e880042002280270210b200228026c21032008a721060c0f0b20022802702118200228026c211902400240200228028081042203200228028481042209460d00200941016a22042009490d05200320044f0d0120042003103f000b200241013a00482002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10370c0c0b2002280274211c20022802f88004220620096a2d000021072002200436028481040240200741034d0d00410a21040c0e0b0240024002400240024020070e0400010203000b410021074100210b4100210903400240200b411f4d0d00410f21040c130b20032004460d112004417f460d092003200441016a220d490d0d200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41002107200b4120490d03200a410f4d0d03410d21040c110b4100210b410021090340200b411f4b0d0e0240024020032004460d002004417f460d0b2003200441016a220d4f0d01200441016a2003103f000b200241013a00482002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10370c100b200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41012107200b4120490d02200a410f4d0d020c0c0b4100210b410021090340200b411f4b0d0d0240024020032004460d002004417f460d0b2003200441016a220d4f0d01200441016a2003103f000b200241013a00482002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10370c0f0b200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41022107200b4120490d01200a410f4b0d0b0c010b4100210b410021090340200b411f4b0d0c0240024020032004460d002004417f460d0b2003200441016a220d4f0d01200441016a2003103f000b200241013a00482002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10370c0e0b200620046a2d0000210a2002200d3602848104200a41ff0071200b411f71742009722109200b41076a210b200d2104200a418001710d000b41032107200b4120490d00200a410f4b0d0a0b200220093602f08004200220073602ec800420022902ec8004210802400240200c201b460d00201b21030c010b201b41016a2204201b490d23201b41017422032004200320044b1b2203ad42147e220e422088a70d23200ea722044100480d2302400240201b0d002004102a21010c010b2001201b41146c2004102e21010b2001450d2b20022001360258201b210c2003211b0b2001200c41146c6a2204200837020c2004201c3602082004201836020420042019360200200c41016a210c201a41016a221a2005470d000b2002200336025c2002200c3602600b2002280284810420022802888104462104200229025c2208422088210e024020022802fc8004450d0020022802f88004102c0b200ea721032008a721052004450d0d2003ad4220862005ad842108410821030c270b417f20031047000b417f20041047000b417f200441016a1047000b417f200441016a1047000b417f200441016a1047000b417f200441016a1047000b200441016a2003103f000b410d2104410021070c030b410f2104410021070c020b2002280230210b2002290234210841052104410021070c010b200241013a00482002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241306a200241e8006a10372002280230210b20022902342108410521040b20074108742004722103200220083703e880042008a721062018450d002019102c0b2002200c3602602002201b36025c20022802ec800421090240200c450d00200c41146c21052001210403400240200441046a280200450d002004280200102c0b200441146a21042005416c6a22050d000b0b201b450d012001102c0c010b20024103410220041b3a00e88004200241e8006a41146a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a1037200229033021082002280238210902402003450d00200341146c21032001210403400240200441046a280200450d002004280200102c0b200441146a21042003416c6a22030d000b0b2008422088210e41052103410021042005450d012001102c0c010b200341087621042006ad220e422086200bad84210820022802fc8004450d0020022802f88004102c0b20004101360200200041106a2009360200200041086a200e422086200842ffffffff0f838437020020002004410874200341ff0171723602040c1b0b200241e8006a20011099050240024020022802684101470d00200228026c220b4108762104200241e8006a41086a2903002208422088210e200241f8006a28020021060c010b200241c0006a200241fc006a280200360200200241386a200241f4006a2902003703002002200229026c3703304100210141002109024002400240024002400240024002400240024002400240034002402001411f4d0d00410f210b0c020b0240024020022802382205200228023c2204460d00200441016a22032004490d05200520034f0d0120032005103f000b200241013a0058200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241f880046a200241e8006a1037200241206a41086a200241f880046a41086a280200360200200220022903f880043703204105210b0c020b2002280230220620046a2d000021042002200336023c200441ff00712001411f71742009722109200141076a21012004418001710d000b20014120490d01410d210b20044110490d010b200241e880046a41086a200241206a41086a28020022063602002002200229032022083703e880042008422088a721072008a7210d0c0a0b20024100360260200242043703580240024020090d00410421010c010b2009417f6a211b4104210141042110410421094104211c4104211a4100210a4100210c03400240024020052003460d00200341016a220b2003490d052005200b4f0d01200b2005103f000b2002200a36025c2002200c360260200241013a0048200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241e880046a200241e8006a103720022802e88004210d20022802ec8004210720022802f080042106410521010c080b200620036a2c000021042002200b36023c20044100480d0402400240200441c00071450d00200441807f72220441ff017141fb014b0d010b2002200a36025c2002200c360260410621010c070b024002400240024002402005200b460d00200341026a210d200b417f460d0a2005200d4f0d01200d2005103f000b2002200a36025c2002200c360260200241013a0048200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241c8006a360218200241e880046a200241e8006a103720022802e88004210d20022802ec8004210720022802f080042106410521010c010b2006200b6a2d000021032002200d36023c0240200341014b0d004100210520030e020302030b2002200a36025c2002200c360260410c21010b2002418881046a20063602002002418481046a20073602002002418081046a200d360200200220033a00fd8004200220013a00fc80040c0a0b41800221050b200241e8006a200241306a108a05200228027421072002280270210d200228026c210b024020022802684101470d002002200a36025c2002200c360260200241f8006a28020021060c0a0b02400240200c200a460d00200a2118200c210a0c010b200a41016a2201200a490d1d200a41017422032001200320014b1b221841ffffffff00712018470d1d201841047422014100480d1d02400240200a0d002001102a21010c010b201c200a4104742001102e21010b2001450d252002200136025820012110200121092001211c2001211a0b201a200a4104746a220320194180807c712004417f7341ff017172200572221936020c200320073602082003200d3602042003200b360200200a41016a210c0240201b450d00201b417f6a211b200228023c210320022802382105200228023021062018210a0c010b0b2002201836025c2002200c3602600b200228023c2002280240462104200229025c2208422088210e02402002280234450d002002280230102c0b200ea721032008a7210d2004450d082003ad422086200dad842108410721030c210b417f20031047000b417f200b1047000b2002200a36025c2002200c360260411921010c010b417f200d1047000b0b2002418881046a20063602002002418481046a20073602002002418081046a200d360200200220043a00fd8004200220013a00fc80040b200241013a00f8800420022802fc8004210b0b0240200c450d002009200c4104746a210c0340024020092802082204450d0020092802002101200441047421040340024020012d00004109470d000240200141046a2205280200220328020441ffffffff0371450d002003280200102c200528020021030b2003102c0b200141106a2101200441706a22040d000b0b200941106a21010240200941046a280200450d002009280200102c0b200121092001200c470d000b0b200a450d012010102c0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103720022903f88004210820022802808104210602402003450d00200120034104746a210a2001210b03400240200b2802082203450d00200b2802002104200341047421030340024020042d00004109470d000240200441046a2209280200220528020441ffffffff0371450d002005280200102c200928020021050b2005102c0b200441106a2104200341706a22030d000b0b200b41106a21040240200b41046a280200450d00200b280200102c0b2004210b2004200a470d000b0b2008422088210e4105210b41002104200d450d012001102c0c010b200b41087621042007ad220e422086200dad8421082002280234450d002002280230102c0b20004101360200200041106a2006360200200041086a200e422086200842ffffffff0f838437020020002004410874200b41ff0171723602040c1a0b200241e8006a20011099050240024020022802684101470d00200228026c22034108762105200241e8006a41086a2903002208422088210e200241f8006a28020021040c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a29020022083703002002200229026c220e3703f88004200ea7210b2008a721054100210420022802848104210141002103024002400240024002400240024003402004411f4b0d010240024020052001460d002001417f460d072005200141016a22094f0d01200141016a2005103f000b200220053602848104200241013a0058200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200241206a41086a200241306a41086a280200360200200220022903303703204105210b0c030b200b20016a2d0000220641ff00712004411f71742003722103200441076a2104200921012006418001710d000b200220093602848104024020044120490d00410d210b2006410f4b0d020b200241003602382002420437033020030d02410421010c030b200220013602848104410f210b0b200241e880046a41086a200241206a41086a28020022043602002002200229032022083703e880042008422088a7210a2008a7210d410021090c030b4104210141002105410021060340200241e8006a200241f880046a10910520022f006d20022d006f4110747221092002280274210a2002280270210d20022d006c210b024020022802684101470d002002200536023420022006360238200241f8006a28020021042005450d042001102c0c040b0240024020062005460d0020052107200621040c010b200541016a22042005490d15200541017422072004200720044b1b2207ad420c7e2208422088a70d152008a722044100480d150240024020050d002004102a21010c010b20012005410c6c2004102e21010b2001450d1d2002200136023020052104200721050b20012004410c6c6a220420093b00012004200d3602042004200b3a0000200441036a20094110763a0000200441086a200a3602002003200641016a2206470d000b20022007360234200220063602380b200228028481042002280288810446210420022902342108024020022802fc8004450d0020022802f88004102c0b2008a721092004450d022008422088a7ad4220862009ad842108410621030c190b417f200141016a1047000b200941ffffff07712205410874200b41ff0171722103200aad220e422086200dad84210820022802fc8004450d0120022802f88004102c0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a103720022903302208422088210e2002280238210441052103410021052009450d002001102c0b20004101360200200041106a2004360200200041086a200e422086200842ffffffff0f838437020020002005410874200341ff0171723602040c190b200241e8006a20011099050240024020022802684101470d00200228026c22034108762105200241e8006a41086a2903002208422088210e200241f8006a28020021040c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a29020022083703002002200229026c220e3703f88004200ea7210b2008a72103410021042002280284810421014100210902400240024002400240024002400240024003402004411f4b0d010240024020032001460d002001417f460d072003200141016a22054f0d01200141016a2003103f000b200220033602848104200241013a0058200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200241206a41086a200241306a41086a280200360200200220022903303703204105210a0c030b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200521012006418001710d000b200220053602848104024020044120490d00410d210a2006410f4b0d020b41002107200241003602f08004200242043703e8800420090d02410421014100210d0c030b200220013602848104410f210a0b200241e880046a41086a200241206a41086a28020022043602002002200229032022083703e880042008a7210b4100210320022802ec8004210d0c050b4104210141012107410021060340024002400240024020032005460d00200541016a22042005490d0720032004490d08200b20056a2c000021032002200436028481040240200341004e0d004119210a0c020b4107210a0240200341c000710d000c020b200341807f7222034170470d02200241e8006a200241f880046a10910520022f006d20022d006f41107472210320022d006c210a20022802684101470d0320034180feff07714108762105200228027821042002280274210d2002280270210b0c020b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a10372002280230210b2002280234210d200228023821044105210a0b0b200220063602ec800420022007417f6a3602f080042005410874200341ff01717221032006450d062001102c0c060b200228027421052002280270210b024002402007417f6a22042006460d002006210d200421060c010b200641016a22042006490d162006410174220d2004200d20044b1b220dad420c7e2208422088a70d162008a722044100480d160240024020060d002004102a21010c010b20012006410c6c2004102e21010b2001450d1e200220013602e880040b20012006410c6c6a220420033b0001200420053602082004200b3602042004200a3a0000200441036a20034110763a0000024020092007460d00200741016a210720022802848104210520022802808104210320022802f88004210b200d21060c010b0b2002200d3602ec8004200220073602f080040b2002280284810420022802888104462104024020022802fc8004450d0020022802f88004102c0b2004450d042007ad422086200dad842108410521030c1a0b417f200141016a1047000b417f20041047000b20042003103f000b200341ffffff07712205410874200a41ff0171722103200dad220e422086200bad84210820022802fc8004450d0120022802f88004102c0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a103720022903302208422088210e200228023821044105210341002105200d450d002001102c0b20004101360200200041106a2004360200200041086a200e422086200842ffffffff0f838437020020002005410874200341ff0171723602040c180b200241e8006a20011099050240024020022802684101470d00200228026c22044108762105200241e8006a41086a2903002208422088210e200241f8006a28020021030c010b200241fc006a280200210c200241f8006a2802002101200241f4006a2802002103200241f0006a2802002107200228026c210b4100210441002109024002400240024002400240024002400240034002402004411f4d0d00410f21040c020b0240024020032001460d002001417f460d052003200141016a22054f0d01200141016a2003103f000b200241013a0030200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a1037200241206a41086a200241f880046a41086a280200360200200220022903f88004370320410521040c020b200b20016a2d0000220641ff00712004411f71742009722109200441076a2104200521012006418001710d000b20044120490d01410d210420064110490d010b200241e880046a41086a200241206a41086a28020022033602002002200229032022083703e880042008a7210520022802ec800421090c060b4100211b20024100360238200242043703300240024020090d0041042101410021060c010b41042101410021064100211b034020062118201b221941016a211b20052104410021064100210a03402006411f4b0d050240024020032004460d002004417f460d062003200441016a22054f0d01200441016a2003103f000b2002201836023420022019360238200241013a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241f880046a200241e8006a103720022802f88004210520022802fc80042109200228028081042103410521040c080b200b20046a2d0000220d41ff00712006411f7174200a72210a200641076a210620052104200d418001710d000b024020064120490d00200d410f4d0d002002201836023420022019360238410d21040c060b0240024020192018460d0020182106201921180c010b201841016a22042018490d17201841017422062004200620044b1b220641ffffffff03712006470d17200641027422044100480d170240024020180d002004102a21010c010b200120184102742004102e21010b2001450d1f200220013602300b200120184102746a200a360200201b2009470d000b200220063602342002201b3602380b2005200c46210402402007450d00200b102c0b2004450d06201bad4220862006ad842108410421030c1b0b417f200141016a1047000b417f200441016a1047000b2002201836023420022019360238410f21040b0b2018450d002001102c0b2009ad220e4220862005ad842108410021052007450d01200b102c0c010b20024103410220041b3a0030200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103720022903f880042208422088210e20022802808104210341052104410021052006450d002001102c0b20004101360200200041106a2003360200200041086a200e422086200842ffffffff0f838437020020002005410874200441ff0171723602040c170b200241e8006a20011099050240024020022802684101470d00200228026c22034108762105200241e8006a41086a2903002208422088210e200241f8006a28020021040c010b2002418881046a200241fc006a2802003602002002418081046a200241f4006a2902003703002002200229026c3703f8800441002101410021050240024002400240024002400240024002400240034002402001411f4d0d00410f21030c020b02400240200228028081042209200228028481042204460d00200441016a22032004490d05200920034f0d0120032009103f000b200241013a0058200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200241206a41086a200241306a41086a28020036020020022002290330370320410521030c020b20022802f8800420046a2d00002104200220033602848104200441ff00712001411f71742005722105200141076a21012004418001710d000b20014120490d01410d210320044110490d010b200241e880046a41086a200241206a41086a28020022043602002002200229032022083703e880042008422088a721092008a721060c080b200241003602f08004200242043703e880040240024020050d00410421010c010b20022802ec8004210720022802f08004210d410021100340200241e8006a200241f880046a108e052002280274210920022802702118200228026c211a024020022802684101470d002002280278210420182106201a21030c080b200241e8006a200241f880046a108e052002280274211320022802702119200228026c211c024020022802684101470d00200228027821042019210620132109201c21030c070b0240024002400240024002400240024002400240024002400240024002400240200228028081042203200228028481042206460d00200641016a22012006490d02200320014f0d0120012003103f000b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200228023021062002290234210e4105210a4100211b410021030c140b20022802f88004220c20066a2d000021042002200136028481044100211b0240200441034d0d004109210a410021030c140b024002400240024020040e0400010203000b4100211b410021044100210a034002402004411f4d0d00410f210a0c160b0240024020032001460d002001417f460d072003200141016a220b4f0d01200141016a2003103f000b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200228023021062002290234210e4105210a4100211b0c170b200c20016a2d000021062002200b3602848104200641ff00712004411f7174200a72210a200441076a2104200b21012006418001710d000b4100211b20044120490d0f2006410f4d0d0f410d210a0c140b0240024020032001460d00200641026a21042001417f460d0620032004490d07200c20016a2c0000210120022004360284810402402001417f4a0d00411921030c0e0b200141c000710d010c0c0b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a10372002290330210820022802382104410521030c0c0b200141807f7222014170470d0a200241e8006a200241f880046a10910520022903702108200228026c210a024020022802684101470d00200228027821040c0d0b4101211b0c0f0b200241e8006a200241f880046a10910520022903702108200228026c210a024020022802684101460d004102211b0c0f0b20022002280278360270200a418080807871211b200a4180807c712103200a41087621040c0c0b0240024020032001460d00200641026a210b2001417f460d062003200b490d08200c20016a2c000021042002200b36028481040240200441004e0d004119210a410021030c160b200441c000710d010c090b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a10374105210a2002290234210e20022802302106410021030c140b200441807f72220441ff017141fc01490d07024002402003200b460d00200641036a2101200b417f460d07200320014f0d0120012003103f000b200241013a00582002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241d8006a360218200241306a200241e8006a1037200228023021062002290234210e4105210a410021030c140b200c200b6a2d0000210b200220013602848104410021030240200b41014d0d00410c210a4100211b200b21040c140b2004417f7321064103211b0240200b0e020e000e0b410121030c0d0b417f20011047000b417f200141016a1047000b417f20041047000b20042003103f000b417f200b1047000b417f20011047000b200b2003103f000b4106210a410021030c0b0b410721030b200141ff0171410874200372210a0b20022004360270200a418080807871211b200a4180807c712103200a41087621040b20022008370368200229026c210e2008a721060c070b0b02400240200d2007460d002007210b0c010b200741016a22012007490d17200741017422042001200420014b1b220bad42287e220e422088a70d17200ea722014100480d170240024020070d002001102a21010c010b20022802e88004200741286c2001102e21010b2001450d1f200220013602e880042007210d200b21070b20022802e880042201200d41286c6a2204201c36020c20042009360208200420183602042004201a360200200441206a20083702002004411c6a200a3602002004411a6a20033a0000200441196a20063a0000200441186a201b3a0000200441146a2013360200200441106a2019360200200d41016a210d201041016a22102005470d000b2002200b3602ec80042002200d3602f080040b200228028481042002280288810446210420022902ec80042208422088210e024020022802fc8004450d0020022802f88004102c0b200ea721032008a721092004450d062003ad4220862009ad842108410321030c1b0b417f20031047000b0b41002103410021040b200a41ff0171200441ff0171410874722003418080fc077172201b722103200e422088a72104200ea721092019450d00201c102c0b2018450d00201a102c0b200220073602ec80042002200d3602f0800420022802e88004210b0240200d450d00200d41286c2105200b210103400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101200541586a22050d000b0b2007450d01200b102c0c010b20024103410220041b3a00e88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241e880046a360218200241306a200241e8006a1037200229033021082002280238210402402003450d00200341286c21052001210303400240200341046a280200450d002003280200102c0b0240200341106a280200450d002003410c6a280200102c0b200341286a2103200541586a22050d000b0b2008422088210e41052103410021052009450d012001102c0c010b200341087621052009ad220e4220862006ad84210820022802fc8004450d0020022802f88004102c0b20004101360200200041106a2004360200200041086a200e422086200842ffffffff0f838437020020002005410874200341ff0171723602040c160b200241013a00302002410136027c2002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103720022802f88004210620022802fc8004210920022d00808104210320022d00818104210720022f01828104210d410521050b0b201d450d03200c102c0c030b0b2018450d00201c102c0b2003411076210d200341087621070b200741ff0171410874200341ff0171722103200d411074210d200441ff0171410874210702402017450d002001210403400240200441046a280200450d002004280200102c0b200441106a2104200a41706a220a0d000b0b2003200d722103200720057221042014450d012001102c0c010b20024103410220041b3a0030200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241306a360218200241f880046a200241e8006a103720022903f88004210820022802808104210302402005450d00200541047421052001210403400240200441046a280200450d002004280200102c0b200441106a2104200541706a22050d000b0b2008422088210e41052104410021052009450d012001102c0c010b200441087621052009ad220e4220862006ad8421082010450d00200b102c0b20004101360200200041106a2003360200200041086a200e422086200842ffffffff0f838437020020002005410874200441ff0171723602040c0c0b41002101410021040240024002400340024020094105470d00410f21070c020b0240024020032009460d00200320094b0d01200941016a2003103f000b200241013a00f88004200241fc006a41013602002002420137026c200241f0f7c5003602682002412b36021c2002200241186a3602782002200241f880046a360218200241206a200241e8006a103741052107200229032021080c030b200620096a2d0000220541ff00712001411f71742004722104200141076a2101200941016a220b21092005418001710d000b20014120490d0220054110490d02410d21070b0b2008422088a72109200228022821042008a7210d0c040b024020040d00410021054101211b410021094100210d0c070b200241e8006a410041800810da051a410021054100210d4101211b410021070340024002402003200b6b200420076b22014180082001418008491b2201490d00200b20016a220c200b490d042003200c4f0d01200c2003103f000b200241013a00e880042002418c81046a4101360200200242013702fc8004200241f0f7c5003602f880042002412b36021c2002200241186a36028881042002200241e880046a360218200241306a200241f880046a103720022903302208422088a72109200228023821042008a72101410521070240200d450d00201b102c0b2001210d0c050b200241e8006a2006200b6a200110db051a02400240200d20056b2001490d00200520016a21090c010b200520016a22092005490d02200d410174220b2009200b20094b1b220b4100480d0202400240200d0d00200b102a211b0c010b201b200d200b102e211b0b201b450d0a200b210d0b201b20056a200241e8006a200110db051a20092105200c210b2004200120076a22074d0d030c000b0b1035000b200b200c1047000b200241e8006a201b2009105820022802684101470d02410821070240200d450d00201b102c0b0b2009ad422086200dad84210841002101200a450d002006102c0b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff0171723602040c060b201b4108762105200c210b0b2003200b490d022003200b6b2201417f4c0d030240024020010d00410121040c010b2001102a2204450d020b2009ad4220862108200dad210e20042006200b6a200110db051a2001ad222042208621210240200a450d002006102c0b2008200e8421082021202084210e2005410874201b41ff0171722101410121030b200020033a000420004100360200200041056a20022f00153b0000200041186a200e370200200041146a20043602002000410c6a2008370200200041086a2001360200200041206a2002290200370200200041076a200241176a2d00003a0000200041286a200241086a290200370200200041306a200241106a2802003602000c030b1033000b200b20031047000b103a000b2002419081046a24000b160020002001280208360204200020012802003602000bb20c01067f0240024020002d00002201410e4b0d00024002400240024002400240024002400240024002400240024020010e0f0001020304050607080e090e0a0b0c000b200041086a280200450d0d200041046a280200102c0f0b0240200041086a280200450d00200041046a280200102c0b200041146a280200450d0c200041106a280200102c0f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200102c0b200141106a2101200241706a22020d000b0b200041086a280200450d0b2000280204102c0f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101200241586a22020d000b0b200041086a280200450d0a2000280204102c0f0b200041086a280200450d09200041046a280200102c0f0b200041086a280200450d08200041046a280200102c0f0b200041086a280200450d07200041046a280200102c0f0b02402000410c6a2802002201450d00200041046a280200220320014104746a21040340024020032802082202450d0020032802002101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102c200528020021060b2006102c0b200141106a2101200241706a22020d000b0b200341106a21010240200341046a280200450d002003280200102c0b2001210320012004470d000b0b200041086a280200450d062000280204102c0f0b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200102c0b200141146a21012002416c6a22020d000b0b200041086a280200450d052000280204102c0f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a21040340024020032802042201450d0002402003410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102c200528020021060b2006102c0b200141106a2101200241706a22020d000b0b200341086a280200450d002003280204102c0b2003411c6a21010240200341146a280200450d002003280210102c0b2001210320012004470d000b0b200041086a280200450d042000280204102c0f0b02402000410c6a2802002201450d00200041046a2802002203200141186c6a210403400240200341046a280200450d002003280200102c0b0240200341146a2802002202450d00200328020c2101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102c200528020021060b2006102c0b200141106a2101200241706a22020d000b0b200341186a21010240200341106a280200450d00200328020c102c0b2001210320012004470d000b0b200041086a280200450d032000280204102c0f0b200041046a2201109805200041086a280200450d022001280200102c0f0b0240200041046a2802002201450d00200041086a280200450d002001102c0b0240200041146a2802002201450d0002402000411c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102c0b2001410c6a2101200241746a22020d000b0b200041186a280200450d002000280214102c0b200041246a2802002203450d0102402000412c6a2802002201450d00200320014104746a210403402003220541106a2103024020052802042201450d0002402005410c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102c0b2001410c6a2101200241746a22020d000b0b200541086a280200450d002005280204102c0b20032004470d000b0b200041286a280200450d012000280224102c0c010b0240200041086a280200450d00200041046a280200102c0b0240200041146a2802002201450d00200041186a280200450d002001102c0b200041246a280200450d00200041206a280200102c0f0b0be34c04177f017e047f017e230041e0026b22022400200128020841546a2103200141106a28020041306c2104024002400240024002400240024002400240024002400240024003402004450d01200441506a21042003412c6a2105200341306a2206210320052d00004102470d000b200241e8006a200610f40441042107200228026c2208450d01200841047422044100480d0c200228026821032004102a2207450d052008410474210641002109200721040340200341086a2802002205417f4c0d042003410c6a2d0000210a2003280200210b0240024020050d004101210c0c010b2005102a220c450d070b200c200b200510db05210b2004410d6a2003410d6a2d00003a00002004410c6a200a3a0000200441086a2005360200200441046a20053602002004200b360200200441106a2104200941016a2109200341106a2103200641706a22060d000b20070d020b410421070b41002109410021080b200128021041306c2104200128020841546a2103024003404100210c4104210a024020040d0041042103410021040c020b200441506a21042003412c6a2105200341306a2206210320052d00004103470d000b200241e0006a200610f404410421034100210420022802602205450d0020022802642104200521030b024020040d004101210d4100210e410021034100210f4100210b41002110410121114100210541002112410421134100210641002114410421150c020b200441286c21162003411c6a21044104210a4100210c4100210e4101210d410021034100210f4100210b41002110410121114100210541002112410421134100210641002114410421150340024002400240024002402004417c6a2d00000e0400010203000b2004280200211702402003200f470d00200341016a220f2003490d0f20034101742218200f2018200f4b1b220f41ffffffff0371200f470d0f200f41027422184100480d0f0240024020030d002018102a210a0c010b200a20034102742018102e210a0b200a450d080b200a20034102746a2017360200200341016a21030c030b200241b8016a41086a2217200441086a280200360200200220042902003703b801024020052012470d00200541016a22122005490d0e200541017422182012201820124b1b2212ad420c7e2219422088a70d0e2019a722184100480d0e0240024020050d002018102a21130c010b20132005410c6c2018102e21130b2013450d070b20132005410c6c6a221820022903b801370200201841086a2017280200360200200541016a21050c020b200241b8016a41086a2217200441086a280200360200200220042902003703b801024020062014470d00200641016a22182006490d0d2006410174221a2018201a20184b1b2214ad420c7e2219422088a70d0d2019a722184100480d0d0240024020060d002018102a21150c010b20152006410c6c2018102e21150b2015450d060b20152006410c6c6a221820022903b801370200201841086a2017280200360200200641016a21060c010b2004417e6a22172d000021182004417d6a221a2d0000211b0240200b2010470d00200b41016a2210200b490d0c200b410174221c2010201c20104b1b221020106a221d2010490d0c201d4100480d0c02400240200b0d00201d102a21110c010b2011201c201d102e21110b2011450d050b2011200b4101746a221d20184101713a0001201d201b3a000020172d00002117201a2d000021180240200c200e470d00200c41016a221a200c490d0c200c410174221b201a201b201a4b1b220e200e6a221a200e490d0c201a4100480d0c02400240200c0d00201a102a210d0c010b200d201b201a102e210d0b200d450d050b200b41016a210b200d200c4101746a221a20174101713a0001201a20183a0000200c41016a210c0b200441286a2104201641586a2216450d020c000b0b103a000b2001280210221b41306c211820012802082116410021040240034020182004460d01201620046a2117200441306a221a210420172d00004104470d000b200241d8006a2016201a6a41546a10f404200228025c2204450d002002280258211620044102742118200341017421172003410274210403402016280200211a02402003200f470d00200341016a220f2003490d0a2017200f2017200f4b1b220f41ffffffff0371200f470d0a200f410274221b4100480d0a0240024020030d00201b102a210a0c010b200a2004201b102e210a0b200a450d030b201641046a2116200a20046a201a360200201741026a2117200441046a2104200341016a21032018417c6a22180d000b200128020821162001280210211b0b2016201b41306c6a2118201621040240034020182004460d0120042d00002117200441306a221a210420174105470d000b200241d0006a201a41546a10f4042002280254410c6c221a450d0020022802502104200541017421172005410c6c21160340200441086a2118024002400240200441046a2802004101470d0020022018280200221b3602a0022004280200221d201b4b0d010b200241003602700c010b200241023602cc01200242023702bc012002418c98c6003602b801200241013602d402200241013602cc022002201d3602b0022002200241c8026a3602c8012002200241b0026a3602d0022002200241a0026a3602c802200241f0006a200241b8016a10372002280270450d00200241f0006a21040c080b20042902002119200241b8016a41086a221b2018280200360200200220193703b801024020052012470d00200541016a22122005490d0a20172012201720124b1b2212ad420c7e2219422088a70d0a2019a722184100480d0a0240024020050d002018102a21130c010b201320162018102e21130b2013450d030b2004410c6a2104201320166a221820022903b801370200201841086a201b280200360200201741026a21172016410c6a2116200541016a2105201a41746a221a0d000b200128020821162001280210211b0b2016201b41306c6a2118201621040240034020182004460d0120042d00002117200441306a221a210420174106470d000b200241c8006a201a41546a10f404200228024c2217450d00200228024821042017410c6c2118200641017421172006410c6c21160340200241b8016a2004109f05024020022802b801450d00200241b8016a21040c080b20042902002119200241b8016a41086a221a200441086a280200360200200220193703b801024020062014470d00200641016a22142006490d0a20172014201720144b1b2214ad420c7e2219422088a70d0a2019a7221b4100480d0a0240024020060d00201b102a21150c010b20152016201b102e21150b2015450d030b2004410c6a2104201520166a221b20022903b801370200201b41086a201a280200360200201741026a21172016410c6a2116200641016a2106201841746a22180d000b200128020821162001280210211b0b2016201b41306c6a2118201621040240034020182004460d0120042d00002117200441306a221a210420174107470d000b200241c0006a201a41546a10f40420022802442217450d002002280240220420174104746a211d200b4101742116200241b8016a410472211b0340200241b8016a2004200d200c10a00502400240024020022d00b8014101460d00200220022d00b90122173a00a002024020172004410c6a2d00002218470d00200241003602700c030b200241023602cc01200242023702bc01200241a099c6003602b8012002412c3602d4022002412c3602cc02200220183a00b0022002200241c8026a3602c8012002200241a0026a3602d0022002200241b0026a3602c802200241f0006a200241b8016a10370c010b200241f0006a41086a201b41086a2802003602002002201b2902003703700b02402002280270450d00200241f0006a21040c090b2004410c6a2d000021170b2004410d6a2d000021180240200b2010470d00200b41016a2210200b490d0a20162010201620104b1b221020106a221a2010490d0a201a4100480d0a02400240200b0d00201a102a21110c010b20112016201a102e21110b2011450d030b201120166a221a20173a0000201a41016a20184101713a0000201641026a2116200b41016a210b200441106a2204201d470d000b200128020821162001280210211b0b200241a8016a2003360200200241a4016a200f3602002002419c016a200936020020024198016a200836020020024190016a200b3602002002418c016a201036020020024184016a200536020020024180016a20123602002002200a3602a001200220073602940120022011360288012002201336027c2002200636027820022014360274200220153602702016201b41306c6a21052016210402400340024020052004470d004100210a0c020b20042d00002103200441306a2206210420034104470d000b200241386a200641546a10f404200228023c210a0b2002200a3602ac012016201b41306c6a21052016210402400340024020052004470d00410021040c020b20042d00002103200441306a220621042003410c470d000b2006415c6a28020021040b200220043602b001200a2004470d0202400240024002400240200a450d002016201b41306c6a210520162104034020052004460d0320042d00002103200441306a2206210420034104470d000b2016201b41306c6a210a201621040340200a2004460d0220042d00002103200441306a220521042003410c470d000b200241306a200641546a10f40420022802342204450d002002280230220c20044102746a21132005415c6a2116200541546a210f200241f1016a21184100210b03402002200b3602b40120162802002104200f2802002105200242013702bc0120024194cfc5003602b801200241013602b402200241013602cc012002200241b0026a3602c8012002200241b4016a3602b002200241c8026a200241b8016a103720022802c802210320022902cc0221190240024002400240024002402004200b4d0d0002402019a7450d002003102c0b2002200c28020022043602a0020240200228029c0120044b0d00200241013602cc01200242023702bc01200241ac9cc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a103720022902cc022219422088a7210420022802c80221062019a721030c040b2005200b41186c6a22032802142209450d0120022802940120044104746a22052d000d211720052802002112200328020c210420032802002110200528020822152106024020032802082211450d002011410374210a201521032010210503400240200320052802006a220620034f0d004120102a2206450d0f200641186a410029008c9f46370000200641106a41002900849f46370000200641086a41002900fc9e46370000200641002900f49e463700000c050b200541086a210520062103200a41786a220a0d000b0b4108102a2203450d0c20032017ad42ff0183422886370200200241b0026a41026a2205200241c8026a41026a2d00003a0000200220022f00c8023b01b002200220173a00f0012002418080013602ec0120024281808080103702e401200220033602e001200242808080808080103703d801200242013703d001200220063602cc01200220113602c801200220103602c401200220153602c001200220123602bc012002200241f0006a3602b801201820022f01b0023b0000201841026a20052d00003a000020094104742105410021030340200220033602f801200220043602fc0120024180026a200241b8016a200410a2050240200228028002450d00200241a0026a41086a20024180026a41086a28020036020020022002290380023703a002200241033602c402200242033702b402200241f8c7c5003602b0022002412d3602dc02200241013602d4022002412e3602cc022002200241c8026a3602c0022002200241a0026a3602d8022002200241f8016a3602d0022002200241fc016a3602c80220024190026a200241b0026a1037024020022802a402450d0020022802a002102c0b2002280290022206450d002002290294022119024020022802d401450d0020022802d001102c0b2019422088211e024020022802e401450d0020022802e001102c0b201ea721042019a721030c060b200441106a2104200341016a2103200541706a22050d000b024020022802e8010d00024020022802d401450d0020022802d001102c0b20022802e401450d0620022802e001102c0c060b4190c8c500413041acfec5001036000b20002003360200200020193702040c0f0b4120102a2206450d0a200641186a41002900efc745370000200641106a41002900e7c745370000200641086a41002900dfc745370000200641002900d7c7453700000b41202103412021040b2006450d010b200220063602b00220022004ad4220862003ad843702b4022002200241b0026a36029002200241023602cc01200242023702bc012002419ccfc5003602b8012002412f3602d402200241013602cc022002200241c8026a3602c801200220024190026a3602d0022002200241b4016a3602c802200241a0026a200241b8016a1037024020022802b402450d0020022802b002102c0b20022802a0022204450d0020022902a402211920002004360200200020193702040c0b0b200b41016a210b200c41046a220c2013470d000b200128020821162001280210211b0b2016201b41306c6a2105201621040240034020052004460d0120042d00002103200441306a2206210420034109470d000b2002200641546a280200220436029002024020022802a80120044b0d00200241cc016a4101360200200242023702bc01200241889cc6003602b801200241013602b4022002200241b0026a3602c801200220024190026a3602b002200241c8026a200241b8016a10370c090b200220022802a00120044102746a28020022043602a0020240200228029c0120044b0d00200241cc016a4101360200200242023702bc01200241ac9cc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a10370c090b20022802940120044104746a220431000d4220862004350208844280808080c000510d00412d102a2204450d05200441256a41002900d1cf45370000200441206a41002900cccf45370000200441186a41002900c4cf45370000200441106a41002900bccf45370000200441086a41002900b4cf45370000200441002900accf45370000200042ad808080d005370204200020043602000c090b2016201b41306c6a2103034020032016460d0420162d00002104201641306a2205211620044108470d000b200241286a200541546a220f10f404200228022821044100210502400240200228022c22030d004104210a410021160c010b200341ffffffff01712003470d0c200341037422064100480d0c2006102a220a450d05200321160b02402003450d002004200341146c6a21062003410274417c6a210b200a2103034020042802002105200341046a200441086a28020036020020032005360200200341086a2103200441146a22042006470d000b200b41027641016a21050b200a2005200241b8016a410041202005676b109a05200a20054103746a2206200a460d0241012105200a2104200a21030340024002402005450d00200620046b41037620054d0d05200420054103746a22040d010c050b20062004460d040b200220033602a00202400240200341046a2802002205200441046a280200470d002003280200220b2004280200220c460d01200b200c200510dd05450d010b200441086a210441002105200341086a22032006470d010c040b0b200241cc016a4101360200200242013702bc01200241dccfc5003602b801200241303602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a1037200041086a200241c8026a41086a280200360200200020022903c8023702000c050b41cacec50041c8001054000b41accec500411e1054000b200241206a200f10f404024020022802242204450d00200441146c2103200228022041106a2104024002400340024002400240024002402004417c6a2802000e0400030201000b2002200428020022053602900202400240024020022802a80120054b0d00200241cc016a4101360200200242023702bc01200241889cc6003602b801200241013602b4022002200241b0026a3602c801200220024190026a3602b002200241c8026a200241b8016a10370c010b200220022802a00120054102746a28020022053602a002200228029c0120054b0d01200241013602cc01200242023702bc01200241ac9cc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a10370b20022802c8022104200020022902cc02370204200020043602000c0b0b2019428080808080608320022802940120054104746a220535020884200531000d4220868421190c030b2002200428020022053602a002024020022802900120054b0d00200241cc016a4101360200200242023702bc01200241cc9cc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a10370c060b20022802880120054101746a2d0001450d02200241cc016a4101360200200242023702bc01200241ec9cc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a10370c050b2002200428020022053602a002200228027820054b0d01200241013602cc01200242023702bc01200241b89bc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a103720022802c8022205450d01200020022902cc02370204200020053602000c080b2002200428020022053602a00220022802840120054d0d020b200441146a21042003416c6a22030d000c030b0b200241cc016a4101360200200242023702bc01200241e89bc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a103720022802c8022104200020022902cc02370204200020043602000c040b20022802c8022104200020022902cc02370204200020043602000c030b2016450d00200a102c0b2001280210220b41306c21042001280208220c41546a21030240024002400240024002400240024002400240024003402004450d01200441506a21042003412c6a2105200341306a2206210320052d00004103470d000b200241186a200610f404200228021c2204450d0020022802182105200441286c210641002104034002400240024002400240200520046a220341186a2d00000e0400030201000b20022003411c6a28020022033602a002200228029c0120034b0d03200241cc016a4101360200200242023702bc01200241ac9cc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a103720022802c8022104200020022902cc02370204200020043602000c140b2003411a6a2d0000450d022003410c6a2802002104200341146a2802002103200241b8016a41146a4101360200200220033602b402200220043602b002200241043602a402200242013702bc01200241e4cfc5003602b8012002200241b0026a3602a0022002200241a0026a3602c801200241c8026a200241b8016a1037200041086a200241c8026a41086a280200360200200020022903c8023702000c130b200241b8016a2003411c6a109f0520022802b801450d01200020022903b801370200200041086a200241b8016a41086a2802003602000c120b200341206a2802004101470d002003411c6a280200210a2002200341246a280200220336029002200a20034d0d00200241023602cc01200242023702bc012002418c98c6003602b801200241013602d402200241013602cc022002200a3602a0022002200241c8026a3602c8012002200241a0026a3602d002200220024190026a3602c802200241b0026a200241b8016a103720022802b00222030d030b2006200441286a2204470d000b0b200228028401220441014b0d072002280278220441014b0d08200b41306c2104200c41546a2103024003402004450d01200441506a21042003412c6a2105200341306a2206210320052d0000410d470d000b200241106a200610f404200228021022042002280214411c6c6a2105034020042005460d012002200428020022033602a0020240200228027820034b0d00200241013602cc01200242023702bc01200241b89bc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a103720022802c80222030d040b200441046a2204280200450d04200241b8016a200420022802880120022802900110a00520022d00b8014101460d05200441186a210420022d00b901450d000b4120102a2204450d0b200441186a4100290094d045370000200441106a410029008cd045370000200441086a4100290084d045370000200441002900fccf45370000200042a08080808004370204200020043602000c0f0b200b41306c2104200c41546a2103024003402004450d01200441506a21042003412c6a2105200341306a2206210320052d0000410a470d000b200241086a200610f404200228020c2204450d002002280208220a2004411c6c6a210b02400340200a450d022002200a28020022043602a00220022802840120044d0d07200a280204450d08200241b8016a200a41046a20022802880120022802900110a00520022d00b8014101460d0920022d00b9010d0c2002200a10a4050240024020022802042204450d00200228020021032004410274210520022802a80121060340200220032802002204360290020240200620044b0d00200241cc016a4101360200200242023702bc01200241889cc6003602b801200241013602b4022002200241b0026a3602c801200220024190026a3602b002200241c8026a200241b8016a10370c050b200220022802a00120044102746a28020022043602a002200228029c0120044d0d022019428080808080608320022802940120044104746a220435020884200431000d422086842119200341046a21032005417c6a22050d000b0b200a411c6a220a200b460d030c010b0b200241013602cc01200242023702bc01200241ac9cc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a10370b20022802c8022104200020022902cc02370204200020043602000c0f0b2000410036020002402002280274450d002002280270102c0b0240200228028001450d00200228027c102c0b0240200228028c01450d00200228028801102c0b0240200228029c012203450d0020022802940121042003410474210303400240200441046a280200450d002004280200102c0b200441106a2104200341706a22030d000b0b0240200228029801450d00200228029401102c0b024020022802a401450d0020022802a001102c0b200e450d10200d102c0c100b200020022902b402370204200020033602000c0d0b200020022902cc02370204200020033602000c0c0b4129102a2204450d07200441286a41002d00c4d0453a0000200441206a41002900bcd045370000200441186a41002900b4d045370000200441106a41002900acd045370000200441086a41002900a4d0453700002004410029009cd045370000200042a98080809005370204200020043602000c0b0b200020022902bc01370200200041086a200241c4016a2802003602000c0a0b200241cc016a4101360200200242023702bc01200241e89bc6003602b801200241013602b4022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a103720022802c8022104200020022902cc02370204200020043602000c090b412a102a2204450d04200441286a41002f00edd0453b0000200441206a41002900e5d045370000200441186a41002900ddd045370000200441106a41002900d5d045370000200441086a41002900cdd045370000200441002900c5d045370000200042aa808080a005370204200020043602000c080b200020022902bc01370200200041086a200241c4016a2802003602000c070b200241cc016a4101360200200242013702bc01200241eccfc5003602b801200241013602b402200220043602a0022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a1037200041086a200241c8026a41086a280200360200200020022903c8023702000c060b200241cc016a4101360200200242013702bc01200241f4cfc5003602b801200241013602b402200220043602a0022002200241b0026a3602c8012002200241a0026a3602b002200241c8026a200241b8016a1037200041086a200241c8026a41086a280200360200200020022903c8023702000c050b4120102a2204450d00200441186a4100290094d045370000200441106a410029008cd045370000200441086a4100290084d045370000200441002900fccf45370000200042a08080808004370204200020043602000c040b1033000b2016450d02200a102c0c020b200241cc016a4102360200200241d4026a4101360200200242023702bc012002419ccec5003602b801200241013602cc022002200241c8026a3602c8012002200241b0016a3602d0022002200241ac016a3602c802200241b0026a200241b8016a1037200041086a200241b0026a41086a280200360200200020022903b0023702000c010b20022802c8022104200020022902cc02370204200020043602000b02402002280274450d002002280270102c0b0240200228028001450d00200228027c102c0b0240200228028c01450d00200228028801102c0b0240200228029c012203450d0020022802940121042003410474210303400240200441046a280200450d002004280200102c0b200441106a2104200341706a22030d000b0b0240200228029801450d00200228029401102c0b024020022802a401450d0020022802a001102c0b200e450d01200d102c0c010b20002004290200370200200041086a200441086a2802003602000240200e450d00200d102c0b02402014450d002015102c0b02402012450d002013102c0b02402010450d002011102c0b02402009450d00200941047421032007210403400240200441046a280200450d002004280200102c0b200441106a2104200341706a22030d000b0b02402008450d002007102c0b200f450d00200a102c0b200241e0026a24000f0b1035000bac1301177f23004190026b220224000240024002402000280200220341d0e1c100460d00200028020421040c010b41002104200241b8016a410041d80010da051a2002411f6a220542003700002002420037011a41ec00102a2203450d0120034100360200200320022902183702042003410b6a2005290000370000200341136a200241b7016a41d90010db051a20004100360204200020033602000b200141ff01712106024002400340200341066a210720032f01062108410c21094100210502400240034020082005460d01200320056a210a200941086a2109200541016a210502404100417f4101200a41086a2d0000220a20064b1b200a2006461b41016a0e03000301000b0b2005417f6a21080b2004450d022004417f6a2104200320084102746a41ec006a28020021030c010b0b200320096a42013702000c010b2000200028020841016a36020802400240024020072f01002205410b490d00200241276a41016a410041d80010da051a200241003a001941ec00102a220b450d04200b4100360200200b410036000f200b4200370007200b20022f01183b0005200b41136a200241276a41d90010db051a2003410e6a2d0000210c2003280248210d2003280244210e200b41086a2003410f6a20032f010641796a220510db052109200b41146a200341cc006a200541037410db052106200341063b0106200b20053b010620084107490d0120092008417a6a220a6a2009200841796a22086a2209200541ffff037120086b10dc051a200920013a00002006200a4103746a200620084103746a2205200b41066a22072f010020086b41037410dc051a2005410136020020072f010021050c020b200341086a2209200841016a22066a200920086a2209200520086b220a10dc051a200920013a0000200341146a220920064103746a200920084103746a2209200a41037410dc051a200941013602002003200541016a3b01060c020b200341086a2205200841016a22096a200520086a220620072f0100220520086b220a10dc051a200620013a0000200341146a220620094103746a200620084103746a2209200a41037410dc051a200941013602000b2007200541016a3b010002402003280200220a450d00200341046a2105200241276a41016a210f200241a8016a2101200241a0016a211020024198016a211120024190016a211220024180016a41086a2113034020052f01002106024002400240200a2f01062205410b490d00200f410041d80010da051a200241003a0019200220022f01183b0108200241b7016a200241276a41d90010db051a20014200370300201042003703002011420037030020124200370300201342003703002002420037038001419c01102a2209450d06200941003602002009410036000f20094200370007200920022f01083b0005200941136a200241b7016a41d90010db051a20094194016a20012903003702002009418c016a201029030037020020094184016a2011290300370200200941fc006a2012290300370200200941f4006a2013290300370200200920022903800137026c200a41c8006a2802002114200a41c4006a2802002115200a410e6a2d00002116200941086a200a410f6a200a2f0106220341796a220510db052117200941146a200a41cc006a200541037410db052118200941ec006a200a4188016a2003417a6a220441027410db052107200a41063b0106200920053b010602402004450d00410021052007210303402003280200220820053b010420082009360200200341046a21032004200541016a2205470d000b0b20064107490d0120172006417a6a22036a2017200641796a22056a220820092f010620056b10dc051a2008200c3a0000201820034103746a201820054103746a220820092f010620056b41037410dc051a2008200e3602002008200d360204200920092f010641016a22083b01062006410274220c20076a416c6a200720034102746a2204200841ffff0371220620036b41027410dc051a2004200b36020020062003490d022009200c6a41d4006a2103034020032802002208200541016a22053b010420082009360200200341046a210320052006490d000c030b0b200a41086a2209200641016a22036a200920066a2209200520066b220810dc051a2009200c3a0000200a41146a220920034103746a200920064103746a2209200841037410dc051a2009200e3602002009200d360204200a200541016a22053b01062006410274200a41ec006a22096a41086a200920034102746a2209200541ffff0371220820036b41027410dc051a2009200b360200200620084f0d04200a2003417f6a22054102746a41f0006a2103034020032802002209200541016a22053b01042009200a360200200341046a210320052008490d000c050b0b200a41086a2203200641016a22056a200320066a2203200a2f0106220820066b220410dc051a2003200c3a0000200a41146a220320054103746a200320064103746a2203200441037410dc051a2003200e3602002003200d360204200a200841016a22033b010620064102742207200a41ec006a22086a41086a200820054102746a2204200341ffff0371220820056b41027410dc051a2004200b360200200620084f0d00200a20076a41f0006a2105034020052802002203200641016a22063b01042003200a360200200541046a210520082006470d000b0b0240200a28020022030d002009210b2014210d2015210e2016210c0c020b200a41046a21052003210a2016210c2015210e2014210d2009210b0c000b0b200241b7016a41016a410041d80010da051a2002411f6a220542003700002002420037011a200220022902183703082002200529000037000f200241276a200241b7016a41d90010db051a200241a8016a22034200370300200241a0016a2209420037030020024180016a41186a2208420037030020024190016a2206420037030020024180016a41086a220a42003703002002420037038001419c01102a2205450d0120054100360200200520022903083702042005410b6a200229000f370000200541136a200241276a41d90010db051a20054194016a20032903003702002005418c016a200929030037020020054184016a2008290300370200200541fc006a2006290300370200200541f4006a200a290300370200200520022903800137026c20052000280200220336026c200020053602002000200028020441016a360204200341003b010420032005360200200520052f010622034103746a220941186a200d360200200941146a200e360200200520036a41086a200c3a0000200541ec006a200341016a22034102746a200b360200200520033b0106200b20033b0104200b20053602000b20024190026a24000f0b1033000b842701377f2001410c6a28020021022001280208210341002104024002400240200141106a28020022050d00410021064100210741002108410021094100210a4100210b4100210c4100210d4100210e410021050c010b410021044100210e4100210d4100210c4100210b4100210a4100210941002108410021074100210f4100211002400340200121112010210620032005417f6a220541306c6a220128002c2112200128002821132001280024211420012800202115200128001c2116200128001821172001280014211820012800102119200128000c211a2001280008211b2001280004211c41012110024002400240024002400240024020012d0000221d417e6a221e410e4d0d004101211f0c010b4101211f4101212041012121410121224101212341012124201c21010240024002400240024002400240024002400240024002400240024002400240024002400240201e0e0f00010203040506180717080917171a000b0240200f0d002006211020112101201c210f201b2125201a21260c180b02402026450d0020264104742110200f210103400240200141046a280200450d002001280200102c0b200141106a2101201041706a22100d000b0b41002124410121102025450d11200f102c0c110b024020070d002006211020112101201c2107201b2127201a21280c170b02402028450d00202841286c21102007210103400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101201041586a22100d000b0b41002123410121102027450d0f2007102c0c0f0b2029450d0d2008450d0d2008102c0c0d0b202a450d0b2009450d0b2009102c0c0b0b202b450d09200a450d09200a102c0c090b0240200b0d002006211020112101201c210b201b212c201a212d0c130b0240202d450d00200b202d4104746a2122200b21210340024020212802082210450d0020212802002101201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141106a21010240202141046a280200450d002021280200102c0b2001212120012022470d000b0b4101211f41002110202c450d07200b102c0c070b0240200c0d002006211020112101201c210c201b212e201a212f0c120b0240202f450d00202f41146c2110200c210103400240200141046a280200450d002001280200102c0b200141146a21012010416c6a22100d000b0b4100211f41012110202e450d05200c102c0c050b0240200d0d002006211020112101201c210d201b2130201a21310c110b02402031450d00200d2031411c6c6a2122200d21210340024020212802042201450d0002402021410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141086a280200450d002021280204102c0b2021411c6a21010240202141146a280200450d002021280210102c0b2001212120012022470d000b0b41002120410121102030450d03200d102c0c030b0240200e0d002006211020112101201c210e201b2132201a21330c100b02402033450d00200e203341186c6a2122200e212103400240202141046a280200450d002021280200102c0b0240202141146a2802002210450d00202128020c2101201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141186a21010240202141106a280200450d00202128020c102c0b2001212120012022470d000b0b41002121410121102032450d01200e102c0c010b024020040d002006211020112101201a2134201b2135201c21040c0f0b02402034450d0020042034411c6c6a2122200421210340024020212802042201450d0002402021410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141086a280200450d002021280204102c0b2021411c6a21010240202141146a280200450d002021280210102c0b2001212120012022470d000b0b410021224101211002402035450d002004102c0b201c2104201b2135201a21344101211f41012120410121210c0c0b201a2133201b2132201c210e4101211f410121200c0a0b201a2131201b2130201c210d4101211f0c080b201a212f201b212e201c210c0c060b201a212d201b212c201c210b0c050b2006211020112101201c210a201b212b201a21360c090b2006211020112101201c2109201b212a201a21370c080b2006211020112101201c2108201b2129201a21380c070b201a2128201b2127201c21074101211f410121204101212141012122410121240c050b201a2126201b2125201c210f4101211f410121204101212141012122410121230c040b410121200b410121210b410121220b41012123410121240b024002400240201e410b4b0d000240024002400240024002400240024002400240201e0e0c000102030405060a070a0809000b2024450d0b0240201a450d00201a4104742110201c210103400240200141046a280200450d002001280200102c0b200141106a2101201041706a22100d000b0b201b450d0b0c0a0b2023450d0a0240201a450d00201a41286c2110201c210103400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101201041586a22100d000b0b201b0d090c0a0b41000d09201b0d080c090b41000d08201b0d070c080b41000d07201b0d060c070b2010450d060240201a450d00201c201a4104746a211e201c21210340024020212802082210450d0020212802002101201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141106a21010240202141046a280200450d002021280200102c0b200121212001201e470d000b0b201b0d050c060b201f450d050240201a450d00201a41146c2110201c210103400240200141046a280200450d002001280200102c0b200141146a21012010416c6a22100d000b0b201b0d040c050b2020450d040240201a450d00201c201a411c6c6a211e201c21210340024020212802042201450d0002402021410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141086a280200450d002021280204102c0b2021411c6a21010240202141146a280200450d002021280210102c0b200121212001201e470d000b0b201b0d030c040b2021450d030240201a450d00201c201a41186c6a211e201c212103400240202141046a280200450d002021280200102c0b0240202141146a2802002210450d00202128020c2101201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141186a21010240202141106a280200450d00202128020c102c0b200121212001201e470d000b0b201b0d020c030b2022450d020240201a450d00201c201a411c6c6a211e201c21210340024020212802042201450d0002402021410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141086a280200450d002021280204102c0b2021411c6a21010240202141146a280200450d002021280210102c0b200121212001201e470d000b0b201b0d010c020b0240201d410e4b0d00200621102011210102400240024002400240024002400240024002400240201d0e0f0001020304040405060e070e08090a000b201b0d0b0c0c0b0240201b450d00201c102c0b2018450d0b2019102c0c0b0b0240201a450d00201a4104742110201c210103400240200141046a280200450d002001280200102c0b200141106a2101201041706a22100d000b0b201b0d090c0a0b201a450d00201a41286c2110201c210103400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101201041586a22100d000b0b201b0d070c080b0240201a450d00201c201a4104746a211e201c21210340024020212802082210450d0020212802002101201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141106a21010240202141046a280200450d002021280200102c0b200121212001201e470d000b0b201b0d060c070b0240201a450d00201a41146c2110201c210103400240200141046a280200450d002001280200102c0b200141146a21012010416c6a22100d000b0b201b0d050c060b0240201a450d00201c201a411c6c6a211e201c21210340024020212802042201450d0002402021410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141086a280200450d002021280204102c0b2021411c6a21010240202141146a280200450d002021280210102c0b200121212001201e470d000b0b201b0d040c050b0240201a450d00201c201a41186c6a211e201c212103400240202141046a280200450d002021280200102c0b0240202141146a2802002210450d00202128020c2101201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141186a21010240202141106a280200450d00202128020c102c0b200121212001201e470d000b0b201b0d030c040b0240201a450d00201c201a411c6c6a211e201c21210340024020212802042201450d0002402021410c6a2802002210450d00201041047421100340024020012d00004109470d000240200141046a2220280200221f28020441ffffffff0371450d00201f280200102c2020280200211f0b201f102c0b200141106a2101201041706a22100d000b0b202141086a280200450d002021280204102c0b2021411c6a21010240202141146a280200450d002021280210102c0b200121212001201e470d000b0b201b0d020c030b0240201c450d00201b450d00201c102c0b02402018450d0002402016450d002016410c6c211020182101034002402001280200221f450d00200141046a280200450d00201f102c0b2001410c6a2101201041746a22100d000b0b2017450d002018102c0b2014450d0202402012450d00201420124104746a211c2014212103402021222041106a2121024020202802042201450d0002402020410c6a2802002210450d002010410c6c2110034002402001280200221f450d00200141046a280200450d00201f102c0b2001410c6a2101201041746a22100d000b0b202041086a280200450d002020280204102c0b2021201c470d000b0b2013450d022014102c0c020b0240201b450d00201c102c0b02402018450d002017450d002018102c0b2014450d012015102c0c010b201c102c0b20062110201121010b20050d000b4100210520012111201021060b200f0d010b4104210f41002125410021260b20002003360280012000200636025420002026360208200020253602042000200f36020020004188016a200536020020004184016a2002360200200041fc006a2034410020041b360200200041f8006a2035410020041b36020020002004410420041b360274200041f0006a20334100200e1b360200200041ec006a20324100200e1b3602002000200e4104200e1b360268200041e4006a20314100200d1b360200200041e0006a20304100200d1b3602002000200d4104200d1b36025c200041d8006a2011360200200041d0006a202f4100200c1b360200200041cc006a202e4100200c1b3602002000200c4104200c1b360248200041c4006a202d4100200b1b360200200041c0006a202c4100200b1b3602002000200b4104200b1b36023c200041386a20364100200a1b360200200041346a202b4100200a1b3602002000200a4104200a1b3602302000412c6a2037410020091b360200200041286a202a410020091b36020020002009410420091b360224200041206a2038410020081b3602002000411c6a2029410020081b36020020002008410420081b360218200041146a2028410020071b360200200041106a2027410020071b36020020002007410420071b36020c0ba705010e7f230041106b2202240002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042108200241086a200010f40402400240200228020c2209450d002002280208220120094104746a210a0240200741ff0171220b4104460d004100210c200341ff0171210d0340024020012d000c200d470d0020012802082004470d000240200128020022092008460d002004450d002004210e2008210f034020092d0000200f2d0000470d02200941016a2109200f41016a210f200e417f6a220e0d000b0b20012d000d2209200b470d0020094104470d040b200c41016a210c200141106a2201200a470d000c020b0b4100210c200341ff0171210d0340024020012d000c200d470d0020012802082004470d000240200128020022092008460d002004450d002004210e2008210f034020092d0000200f2d0000470d02200941016a2109200f41016a210f200e417f6a220e0d000b0b20012d000d4104460d030b200c41016a210c200141106a2201200a470d000b0b0240024020002802082201200041046a280200470d00200141016a22092001490d012001410174220f2009200f20094b1b220941ffffffff00712009470d012009410474220f4100480d010240024020010d00200f102a21010c010b20002802002001410474200f102e21010b2001450d0420002001360200200041046a2009360200200028020821010b200028020020014104746a220120063b010e200120073a000d200120033a000c2001200436020820012005360204200120083602002000200028020841016a3602082002200010f4042002280204417f6a210c0c040b1035000b2005450d022008102c0c020b2001280204210c0c010b1033000b200241106a2400200c0b8322022d7f017e230041306b220224002002410436020020012802042103200128020021044101210502400240024002400240200128020822060d0041002107410121080c010b4130102a2207450d012007200636000c200720033600082007200436000420022007360200200741023a000041002108410121070b200141106a2802002109200128020c210a02400240200141146a280200220b0d002007210c0c010b2007410174220d200741016a220c200d200c4b1b220c41306c210d0240024020070d00200d102a210d0c010b2002280200200741306c200d102e210d0b200d450d012002200d360200200d200741306c6a220d41033a0000200d20022f002d3b0001200d200b36000c200d2009360008200d200a360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021050b2001411c6a280200210e2001280218210f4100211002400240200141206a28020022110d00200c2112410021130c010b024002402007200c460d00200c21120c010b41000d0341000d03200c410174220d200c41016a2212200d20124b1b2212ad42307ea7220d4100480d0302400240200c0d00200d102a210d0c010b2002280200200c41306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d41043a0000200d20022f002d3b0001200d201136000c200d200e360008200d200f360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a29020037020041012113200741016a21070b200141286a280200211420012802242115024002402001412c6a28020022110d002012210c0c010b0240024020072012460d002012210c0c010b41000d0341000d032012410174220d201241016a220c200d200c4b1b220cad42307ea7220d4100480d030240024020120d00200d102a210d0c010b2002280200201241306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d41053a0000200d20022f002d3b0001200d201136000c200d2014360008200d2015360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a29020037020041012110200741016a21070b200141346a28020021162001280230211702400240200141386a28020022120d00410021180c010b02402007200c470d0041000d0341000d03200c410174220d200c41016a2211200d20114b1b2211ad42307ea7220d4100480d0302400240200c0d00200d102a210d0c010b2002280200200c41306c200d102e210d0b200d450d022002200d3602002011210c0b2002280200200741306c6a220d41063a0000200d20022f002d3b0001200d201236000c200d2016360008200d2017360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a29020037020041012118200741016a21070b200141c0006a2802002119200128023c211a4101211b02400240200141c4006a280200221c0d00200c21124101211d0c010b024002402007200c460d00200c21120c010b41000d0341000d03200c410174220d200c41016a2212200d20124b1b2212ad42307ea7220d4100480d0302400240200c0d00200d102a210d0c010b2002280200200c41306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d41073a0000200d20022f002d3b0001200d201c36000c200d2019360008200d201a360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a21074100211d0b200141cc006a280200211e2001280248211f02400240200141d0006a28020022200d00201221110c010b0240024020072012460d00201221110c010b41000d0341000d032012410174220d201241016a220c200d200c4b1b2211ad42307ea7220d4100480d030240024020120d00200d102a210d0c010b2002280200201241306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d41083a0000200d20022f002d3b0001200d202036000c200d201e360008200d201f360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a200241046a41086a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a21074100211b0b410121210240024020012802544101460d002011210c0c010b200141d8006a28020021120240024020072011460d002011210c0c010b41000d0341000d032011410174220d201141016a220c200d200c4b1b220cad42307ea7220d4100480d030240024020110d00200d102a210d0c010b2002280200201141306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d41093a0000200d20022f002d3b0001200d2012360204200d2002290204370208200d41036a2002412f6a2d00003a0000200d41106a2002410c6a290200370200200d41186a200241046a41106a290200370200200d41206a200241046a41186a290200370200200d41286a200241046a41206a290200370200200741016a21070b200141e0006a2802002122200128025c212302400240200141e4006a28020022240d00200c21120c010b024002402007200c460d00200c21120c010b41000d0341000d03200c410174220d200c41016a2212200d20124b1b2212ad42307ea7220d4100480d0302400240200c0d00200d102a210d0c010b2002280200200c41306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d410a3a0000200d20022f002d3b0001200d202436000c200d2022360008200d2023360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021210b200141ec006a2802002125200128026821264101212702400240200141f0006a28020022280d0020122111410121290c010b0240024020072012460d00201221110c010b41000d0341000d032012410174220d201241016a220c200d200c4b1b2211ad42307ea7220d4100480d030240024020120d00200d102a210d0c010b2002280200201241306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d410c3a0000200d20022f002d3b0001200d202836000c200d2025360008200d2026360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021290b200141f8006a280200212a2001280274212b02400240200141fc006a280200222c0d002011210c0c010b0240024020072011460d002011210c0c010b41000d0341000d032011410174220d201141016a220c200d200c4b1b220cad42307ea7220d4100480d030240024020110d00200d102a210d0c010b2002280200201141306c200d102e210d0b200d450d022002200d3602000b2002280200200741306c6a220d410d3a0000200d20022f002d3b0001200d202c36000c200d202a360008200d202b360004200d2002290204370210200d41036a2002412f6a2d00003a0000200d41186a2002410c6a290200370200200d41206a200241146a290200370200200d41286a200241046a41186a290200370200200741016a2107410021270b20014184016a2802002111200128028001210d02400240200c20076b20014188016a28020041306c222d41306d2212490d00200228020021010c010b200720126a22012007490d02200c410174222e2001202e20014b1b222ead42307e222f422088a70d02202fa722014100480d0202400240200c0d002001102a21010c010b2002280200200c41306c2001102e21010b2001450d0120022001360200202e210c0b2001200741306c6a200d202d10db051a200720126a210702402011450d00200d102c0b2000200136020820004280c2cdeb16370200200041106a20073602002000410c6a200c3602002027450d020240202c450d00202b202c411c6c6a2112202b21000340024020002802042201450d0002402000410c6a2802002207450d00200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102c200c280200210d0b200d102c0b200141106a2101200741706a22070d000b0b200041086a280200450d002000280204102c0b2000411c6a21010240200041146a280200450d002000280210102c0b2001210020012012470d000b0b202a450d02202b102c0c020b1033000b1035000b02402029450d0002402028450d002026202841186c6a21122026210003400240200041046a280200450d002000280200102c0b0240200041146a2802002207450d00200028020c2101200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102c200c280200210d0b200d102c0b200141106a2101200741706a22070d000b0b200041186a21010240200041106a280200450d00200028020c102c0b2001210020012012470d000b0b2025450d002026102c0b02402021450d0002402024450d0020232024411c6c6a2112202321000340024020002802042201450d0002402000410c6a2802002207450d00200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102c200c280200210d0b200d102c0b200141106a2101200741706a22070d000b0b200041086a280200450d002000280204102c0b2000411c6a21010240200041146a280200450d002000280210102c0b2001210020012012470d000b0b2022450d002023102c0b0240201b450d0002402020450d00202041146c2107201f210103400240200141046a280200450d002001280200102c0b200141146a21012007416c6a22070d000b0b201e450d00201f102c0b0240201d450d000240201c450d00201a201c4104746a2112201a21000340024020002802082207450d0020002802002101200741047421070340024020012d00004109470d000240200141046a220c280200220d28020441ffffffff0371450d00200d280200102c200c280200210d0b200d102c0b200141106a2101200741706a22070d000b0b200041106a21010240200041046a280200450d002000280200102c0b2001210020012012470d000b0b2019450d00201a102c0b02402016410047201841017371450d002017102c0b02402014410047201041017371450d002015102c0b0240200e410047201341017371450d00200f102c0b02402005450d000240200b450d00200b41286c2107200a210103400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101200741586a22070d000b0b2009450d00200a102c0b02402008450d0002402006450d00200641047421072004210103400240200141046a280200450d002001280200102c0b200141106a2101200741706a22070d000b0b2003450d002004102c0b200241306a24000bea0203037f017e027f410121020240024002400240200041086a2802002203417f6a220420034f0d00200420034b0d00200028020020044104746a220329020421052003200141016aad3702042005a721012005422088a721030240200041086a28020022024101460d002002450d0220002802002002417e6a4104746a22022802042001470d002002200228020820036a36020841000f0b410021022003450d000240200041146a2802002204200041106a280200470d00200441016a22062004490d04200441017422072006200720064b1b220641ffffffff01712006470d04200641037422074100480d040240024020040d002007102a21040c010b200028020c20044103742007102e21040b2004450d032000200436020c200041106a2006360200200028021421040b200028020c20044103746a22042003360204200420013602002000200028021441016a3602140b20020f0b418e87c600413f1054000b1033000b1035000b911302147f027e23004180026b220424000240024020014115490d0041012105410121060240024002400340200121072000210820052006714101732109024002400240024002400240034002400240024002402003450d00024020054101710d0020002001109b052003417f6a21030b2001410276220a41036c210b200a410174210c4100210d024020014132490d00200b200b417f6a220d2000200b4103746a280200220e2000200d4103746a280200220f4922101b2211200b41016a2212200d200b20101b200020124103746a280200220b200f200e20101b220d49220f1b200b200d200f1b200020114103746a2802004922131b210b200c200c417f6a220d2000200c4103746a28020022112000200d4103746a280200221249220e1b2214200c4101722206200d200c200e1b200020064103746a280200220c20122011200e1b220d4922111b200c200d20111b200020144103746a2802004922141b210c200a200a417f6a22122000200a4103746a2802002206200020124103746a280200221549220d1b2216200a41016a22172012200a200d1b200020174103746a280200220a20152006200d1b22064922121b200a200620121b200020164103746a2802004922061b210a41024101200d1b200d20121b20066a200e6a20116a20146a20106a200f6a20136a210d0b200d2000200c4103746a280200220e2000200a4103746a280200220f4922106a2000200b4103746a280200220d200f200e20101b221149220f6a210e200d2011200f1b2000200c200a20101b220d4103746a280200490d01200b200a200c20101b200f1b210d0c020b2000200110b5050c0f0b200e41016a220e410c490d0002402001410176220b450d00200020014103746a41786a210a2000210c0340200c2902002118200c200a290200370200200a2018370200200c41086a210c200a41786a210a200b417f6a220b0d000b0b2001200d417f736a210d4101210a0c010b200e45210a0b0240200a452009724101710d002000200110b6050d0d0b2002450d02200d20014f0d01024020022802002000200d4103746a220a2802004f0d0020002108200121070c040b200029020021182000200a290200370200200a2018370200200041786a210f200041086a211120002902002218a721104100210c2001210b03400240200c200b417f6a220d4f0d002011200c4103746a210a0340200a28020020104b0d01200a41086a210a200d200c41016a220c470d000b200d210c0b200f200b4103746a210a02400340200c200b417f6a220b4f0d01200a280200210d200a41786a220e210a200d20104b0d000b2011200c4103746a220a2902002119200a200e41086a220d290200370200200d2019370200200c41016a210c0c010b0b2000201837020002402001200c41016a220a490d002000200a4103746a21002001200a6b220141154f0d010c0c0b0b200a20011047000b41c4ffc500200d20011038000b2007450d010b200d20074f0d012008290200211820082008200d4103746a220a290200370200200a2018370200200841086a210e20082902002219a72111410021142007417f6a2210450d02200e210a0340200a28020020114f0d03200a41086a210a2010201441016a2214470d000b201021140c020b41f8fec500410041001038000b4188ffc500200d20071038000b200820074103746a210c2010210b02400340200c210d200b220a20144d22060d01200a417f6a210b200d41786a220c28020020114f0d000b0b0240200a2014490d002010200a490d0241800121054100210b410021014100210c4100210f4180012109200e20144103746a2215211003400240200d20106b220a4187104b22130d00200a410376220a41807f6a200a2001200b49200f200c49220e7222001b210a02402000450d002009200a200e1b2109200a2005200e1b21050c010b200a200a41017622096b21050b0240200f200c470d00024020090d002004220c210f0c010b4100210a2004220f210c2010210e0340200c200a3a0000200c200e28020020114f6a210c200e41086a210e2009200a41016a220a470d000b0b02402001200b470d00024020050d0020044180016a220b21010c010b200d41786a210a4100210e20044180016a2201210b0340200b200e3a0000200b200a2802002011496a210b200a41786a210a2005200e41016a220e470d000b0b0240200b20016b220a200c200f6b220e200e200a4b1b2212450d002010200f2d00004103746a220a2902002118200a200d20012d0000417f734103746a290200370200024020124101460d004100210a0340200d2001200a6a220e2d0000417f734103746a2010200f200a6a41016a22002d00004103746a290200370200201020002d00004103746a200d200e41016a2d0000417f734103746a290200370200200a41026a210e200a41016a2200210a200e2012490d000b200120006a2101200f20006a210f0b200d20012d0000417f734103746a2018370200200141016a2101200f41016a210f0b200d20054103746b200d2001200b461b210d201020094103746a2010200f200c461b211020130d000b02400240200f200c4f0d00200d210a03402010200c417f6a220c2d00004103746a220b2902002118200b200a41786a220a290200370200200a2018370200200f200c490d000c020b0b2010210a2001200b4f0d000340200a2902002118200a200d200b417f6a220b2d0000417f734103746a220c290200370200200c2018370200200a41086a210a2001200b490d000b0b200820193702002007200a20156b41037620146a22014d0d032008200820014103746a220a290200370200200a2019370200200720016b220c450d04200c20012001200c4b1b210b2007410376210d200a41086a2100024002402001200c417f6a220c490d002000200c200a200310fc04200821000c010b200820012002200310fc04200a2102200c21010b200b200d4f2105200141154f0d010c050b0b2014200a1047000b200a2010103f000b4188ffc500200120071038000b4198ffc500411c41b4ffc5001036000b20014102490d00200041786a21104100210e4101210b0340200b410374210c200b417f6a210a200b41016a210b02402000200c6a220d2802002000200a4103746a220f2802004f0d00200d2902002118200d200f2902003702000240200a450d00200e210c2010210a200d41706a2802002018a7220d4d0d00024002400340200a41086a200a290200370200200c4101460d01200c417f6a210c200a41786a220a280200200d4b0d000c020b0b4100210c0b2000200c4103746a210f0b200f20183702000b200e41016a210e201041086a2110200b2001470d000b0b20044180026a24000bd20402097f017e230041306b22022400200241106a2203200141246a290200370300200241086a22042001411c6a29020037030020022001290214370300200241186a41106a2205200141106a280200360200200241186a41086a2206200141086a290200370300200220012902003703182000200241186a10f9042107024002400240200041206a28020022082000411c6a280200470d00200841016a22092008490d022008410174220a2009200a20094b1b220941ffffffff03712009470d022009410274220a4100480d020240024020080d00200a102a21080c010b20002802182008410274200a102e21080b2008450d01200020083602182000411c6a2009360200200028022021080b200028021820084102746a20073602002000200028022041016a3602202005200329030037030020062004290300370300200220022903003703180240200041f0006a22032802002208200041ec006a280200470d00200841016a22042008490d02200841017422052004200520044b1b2204ad42187e220b422088a70d02200ba722054100480d020240024020080d002005102a21080c010b2000280268200841186c2005102e21080b2008450d0120002008360268200041ec006a2004360200200041f0006a28020021080b2000280268200841186c6a22082002290318370200200841106a200241186a41106a290300370200200841086a200241186a41086a29030037020020032003280200220841016a360200024020012d002c450d0020004101360254200041d8006a20083602000b200241306a24000f0b1033000b1035000bb47805077f017e217f037e157f230022032104200341e0086b41607122032400024002400240024002404110102a2205450d00200541063a00004120102a2206450d00200641063a001020064100360204200620032f00d0053b00012006412d3a0000200641036a200341d2056a2d00003a0000024020052d00004109470d0002402005280204220728020441ffffffff0371450d002007280200102c200528020421070b2007102c0b2005102c200141106a28020041306c2105200128020841546a210702400340024020050d004110102a2207450d0320074180023b010c200742828080802037020420072006360200200720032f01b0033b010e0240200128021022052001410c6a280200470d00200541016a22082005490d08200541017422092008200920084b1b2208ad42307e220a422088a70d08200aa722094100480d080240024020050d002009102a21050c010b2001280208200541306c2009102e21050b2005450d04200120053602082001410c6a2008360200200128021021050b2001280208200541306c6a220520032f00c0043b0001200541073a0000200542818080801037000820052007360004200520032902d005370210200541036a200341c2046a2d00003a0000200541186a200341d8056a290200370200200541206a200341e0056a290200370200200541286a200341d0056a41186a2902003702002001200128021041016a220b3602104100210c0c020b200541506a21052007412c6a2108200741306a2209210720082d00004107470d000b200320032f01b0033b01d0050240200941086a22072802002205200941046a280200470d00200541016a22082005490d062005410174220d2008200d20084b1b220841ffffffff00712008470d062008410474220d4100480d060240024020050d00200d102a21050c010b20092802002005410474200d102e21050b2005450d0220092005360200200941046a2008360200200941086a28020021050b200928020020054104746a22054180023b010c200542828080802037020420052006360200200520032f01d0053b010e2007200728020041016a360200200341306a200910f4042003280234417f6a210c2001280210210b0b200b41306c21052001280208220e41546a210702400340410021082005450d01200541506a21052007412c6a2109200741306a2206210720092d00004103470d000b200641086a2802002205450d00200541286c2107200628020041186a2105410021080340200820052d0000456a2108200541286a2105200741586a22070d000b0b200b41306c2105200e41546a210702400340410021092005450d01200541506a21052007412c6a2106200741306a220d210720062d00004103470d000b200d41086a2802002205450d00200541286c2107200d28020041186a2105410021090340200920052d0000456a2109200541286a2105200741586a22070d000b0b200b41306c2105200e415c6a2107024003404100210f024020050d00410021050c020b200541506a2105200741246a2106200741306a220d210720062d00004104470d000b200d28020021050b200341003602c00402400240200520096a220b0d0041042110410021110c010b0240024002402008450d00200342003703d005410021050c010b200341d0056a4100200110ab0520032802d405210520032802d0054101470d00200341d8056a290300210a024020032802c0042207450d0020032802c404450d002007102c0b2003200a3702c404200320053602c00441002111410421104100210f0c010b4104102a2210450d022010200536020002400240200b4102490d000240024020084102490d00200342003703d0054100210d0c010b200341d0056a4101200110ab0520032802d405210d20032802d0054101470d00200341d8056a290300210a024020032802c004450d0020032802c404450d0020032802c004102c0b2003200a3702c4042003200d3602c0040c010b410221064104210741012109410121110340200941016a2105024020092011470d0020062005200620054b1b221141ffffffff03712011470d0a2011410274220e4100480d0a20102007200e102e2210450d060b201020076a200d360200024002402005200b4f0d000240200820054d0d00200342003703d0054100210d0c020b200341d0056a2005200110ab0520032802d405210d20032802d0054101470d0120032903d805210a024020032802c004450d0020032802c404450d0020032802c004102c0b200941016a210f2003200a3702c4042003200d3602c0040c040b200941016a210f0c030b200641026a2106200741046a2107200521090c000b0b4101210f410121110b20032802c00421050b2005450d0020032902c404210a02402011450d002010102c0b2000200536020420004101360200200041086a200a3702000c030b024020012802102205450d0020012802082212200541306c6a2113200341c0046a41146a2114200341c0076a2115200341f4056a211620034184066a211720034194066a2118200341a4066a2119200341b4066a211a200341c4066a211b200341d4066a211c200341e4066a211d200341f4066a211e20034184076a211f20034194076a2120200341a4076a2121200341b4076a2122024002400340024020122d0000410c470d00201228020c2205450d0020122802042206200541186c6a212303400240200641146a220e2802002205450d002006410c6a212441002109024002400340200920054f0d014101210502402024280200200941047422256a22072d0000410b470d002003200741046a22073602a00220072802002207200f4f0d03201020074102746a2802002208450d002003200c3602b407200341133a00b007200341d7003a00a00720032008360294072003412d3a0090072003200c36028407200341123a008007200320073602f4062003410b3a00f006200341063a00e006200341003a00d00620034184083b01c006200341373a00b006200320023602a4062003412d3a00a0062003200c36029406200341123a0090062003200c36028406200341133a008006200341d6003a00f005200320083602e4052003412d3a00e0052003200c3602d405200341123a00d005200e280200222620094d0d09200e2009360200200628020c2105200320153602d804200320243602d0042003200520256a220b41106a220d3602c8042003200941016a22273602c0042003202620276b22283602c40420032005202741047422296a222a3602cc042003200341d0056a3602d404200d21050240200b2d0000220841ac01460d004100210502400340200b20056a21070240200841ff01714109470d000240200741046a280200220828020441ffffffff0371450d002008280200102c0b2008102c0b2005450d012003200741206a3602c804200541106a2105200741106a2d0000220841ac01470d000b200b20056a41106a21050c010b200741106a21050b02402005202a460d0003402003200541106a22073602c80420052d0000220841ac01460d01024020084109470d000240200541046a280200220528020441ffffffff0371450d002005280200102c0b2005102c0b20072105200d2007470d000b0b02400240024002402028450d000240202720062802142205470d00200341d0056a21052015210b0c030b2025200541047422056b2108200628020c20056a2107200341d0056a21052015210d0340024002402005200d470d00410021050c010b2003200541106a3602d4040b200341b0036a200510ac0520032d00b00341ac01460d04200720032903b003370300200741086a200341b0036a41086a2903003703002006200628021441016a3602142008450d02200741106a2107200841706a210820032802d804210d20032802d40421050c000b0b2024201410ad050c020b20032802d804210b20032802d40421050b0240200b20056b2207450d000240024020032802d004220d41046a222a280200222520266b20074104762208490d00200d28020021070c010b202620086a22072026490d12202541017422262007202620074b1b222641ffffffff00712026470d12202641047422074100480d120240024020250d002007102a21070c010b200d28020020254104742007102e21070b2007450d0e200d2007360200202a20263602000b2007202720086a22254104746a200720296a202841047410dc051a200320253602c0042025200d2802082207460d00200920086a410474200741047422076b2108200d28020020076a21070340024002402005200b470d00410021050c010b2003200541106a3602d4040b200341b0036a200510ac0520032d00b00341ac01460d02200720032903b003370300200741086a200341b0036a41086a290300370300200d200d28020841016a3602082008450d01200741106a2107200841706a210820032802d804210b20032802d40421050c000b0b200341003602b803200342083703b003200341b0036a201410ad0520032802b003222820032802b8032207410474220b6a210d20032802b40321292028210502402007450d000240024020032802d004222541046a222a280200220520032802c404222720032802c00422076a22266b200b4104752208490d00202528020021050c010b202620086a222b2026490d1220054101742226202b2026202b4b1b222641ffffffff00712026470d122026410474222b4100480d120240024020050d00202b102a21050c010b20252802002005410474202b102e21050b2005450d0e20252005360200202a20263602000b2005200720086a220841047422266a200520074104746a202741047410dc051a200320083602c00420282105200820252802082207460d002025280200220520266a212a200520074104746a21082028210703400240200b0d00200d21050c020b200341b0036a41026a2205200741036a2d00003a0000200320072f00013b01b003024020072d0000222741ac01470d00200741106a21050c020b200741046a2802002126200741086a290300210a200820273a0000200841086a200a370300200841046a202636020020032f01b0032127200841036a20052d00003a0000200841016a20273b00002025202528020841016a360208200b41706a210b200741106a22052107200841106a2208202a470d000b0b02402005200d460d0003400240024020052d000022074109460d00200741ac01470d010c030b0240200541046a280200220728020441ffffffff0371450d002007280200102c0b2007102c0b200541106a2205200d470d000b0b2029450d002028102c0b024020032802c804220520032802cc04220d460d0003402003200541106a22073602c80420052d0000220841ac01460d01024020084109470d000240200541046a280200220528020441ffffffff0371450d002005280200102c0b2005102c0b20072105200d2007470d000b0b024020032802c4042205450d00024020032802c004220d20032802d004220b41086a22082802002207460d00200b280200220b20074104746a200b200d4104746a200541047410dc051a0b2008200520076a3602000b024020032d00d0054109470d00024020032802d405220528020441ffffffff0371450d002005280200102c20032802d40521050b2005102c0b024020032d00e0054109470d000240200341d0056a41146a280200220528020441ffffffff0371450d002005280200102c20032802e40521050b2005102c0b024020032d00f0054109470d0002402016280200220528020441ffffffff0371450d002005280200102c20032802f40521050b2005102c0b024020032d0080064109470d0002402017280200220528020441ffffffff0371450d002005280200102c20032802840621050b2005102c0b024020032d0090064109470d0002402018280200220528020441ffffffff0371450d002005280200102c20032802940621050b2005102c0b024020032d00a0064109470d0002402019280200220528020441ffffffff0371450d002005280200102c20032802a40621050b2005102c0b024020032d00b0064109470d000240201a280200220528020441ffffffff0371450d002005280200102c20032802b40621050b2005102c0b024020032d00c0064109470d000240201b280200220528020441ffffffff0371450d002005280200102c20032802c40621050b2005102c0b024020032d00d0064109470d000240201c280200220528020441ffffffff0371450d002005280200102c20032802d40621050b2005102c0b024020032d00e0064109470d000240201d280200220528020441ffffffff0371450d002005280200102c20032802e40621050b2005102c0b024020032d00f0064109470d000240201e280200220528020441ffffffff0371450d002005280200102c20032802f40621050b2005102c0b024020032d0080074109470d000240201f280200220528020441ffffffff0371450d002005280200102c20032802840721050b2005102c0b024020032d0090074109470d0002402020280200220528020441ffffffff0371450d002005280200102c20032802940721050b2005102c0b024020032d00a0074109470d0002402021280200220528020441ffffffff0371450d002005280200102c20032802a40721050b2005102c0b024020032d00b0074109470d0002402022280200220528020441ffffffff0371450d002005280200102c20032802b40721050b2005102c0b410f21050b200520096a2209200e2802002205490d000c030b0b41a8f8c500200920051038000b200341013602e405200342013702d405200341b8f8c5003602d005200341313602b4032003200341b0036a3602e0052003200341a0026a3602b003200341c0046a200341d0056a103720032802c00422050d040b200641186a22062023470d000b0b201241306a22122013470d000c030b0b20032902c404210a2000200536020420004101360200200041086a200a3702002011450d042010102c0c040b41dafec500411c41acfec5001036000b200341386a41106a200141106a280200221e360200200341386a41086a200141086a290200220a37030020032001290200370338201e41306c2105200aa7222041546a210702400340024020050d00410021050c020b200541506a21052007412c6a2108200741306a2209210720082d00004108470d000b200341286a200910f40420032802282105200328022c21070b2007410020051b210b201e41306c2107202041546a21082005410420051b210502400340024020070d00410021090c020b200741506a21072008412c6a2109200841306a2206210820092d0000410a470d000b200341206a200610f40420032802202109200328022421070b2007410020091b210e201e41306c2107202041546a21082009410420091b212a02400340024020070d004100210d0c020b200741506a21072008412c6a2109200841306a2206210820092d00004109470d000b200628020021084101210d0b20034200370254200341d0e1c1003602502005200b41146c6a2107202a200e411c6c6a211f200341c0046a410272221a41266a2121201a41206a2122201a41186a212b201a41106a2112201a41086a2101200341c0046a41286a21134104212341002115410021284100211d41002118410021170240024002400240410041ff01710e03000102000b410021090c020b410221090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e03000104040b0240201841ff01710e03020300020b201d4101470d06410021090c090b4100212941002114200d0d0b0c110b0240034020072005460d012005410c6a2109200541146a2206210520092802000d000b20062105200d2129200821142006417c6a28020021080c0b0b201d4101470d02410021090c090b0340024020072005470d00410221170c0c0b2005410c6a2109200541146a2206210520092802000d000b20062105200d2129200821142006417c6a28020021080c090b024002400240201841ff01710e03010200010b201d4101470d05410021090c060b0240034020072005460d012005410c6a2109200541146a2206210520092802000d000b20062105200d2129200821142006417c6a28020021080c0a0b201d4101470d02410021090c070b034020052007460d0f2005410c6a2109200541146a2206210520092802000d000b20062105200d2129200821142006417c6a28020021080c080b410121090c060b410121090c040b410121090c020b410121090b0340024002400240024020090e020001010b2027201c470d01410121090c030b202a201f460d0c200341186a202a10a40520032802182227450d0c202a411c6a212a2027200328021c4102746a211c0c010b2027450d0b202728020021094101211d202741046a2127200d212920082114200921080c050b410021090c000b0b0340024002400240024020090e020001010b2027201c470d014101211d410121090c030b0240202a201f470d00410221170c070b200341086a202a10a405202a411c6a212a0240200328020822090d00410221170c070b2009200328020c4102746a211c200921270c010b202741046a2109024020270d00410221174101211d200921270c060b202728020021064101211d20092127200d212920082114200621080c040b410021090c000b0b0340024002400240024020090e020001010b2027201c470d01410121090c030b202a201f460d0a200341106a202a10a40520032802102227450d0a202a411c6a212a202720032802144102746a211c0c010b2027450d0920272802002109410221184101211d202741046a2127200d212920082114200921080c030b410021090c000b0b0340024002400240024020090e020001010b2027201c470d014101211d410121090c030b410221180240202a201f470d00410221170c050b2003202a10a405202a411c6a212a0240200328020022090d00410221170c050b200920032802044102746a211c200921270c010b202741046a2109024020270d00410221184101211d20092127410221170c040b20272802002106410221184101211d20092127200d212920082114200621080c020b410021090c000b0b2003200836025c02402008200f490d00200341013602e405200342023702d405200341c8fcc5003602d005200341013602b4032003200341b0036a3602e0052003200341dc006a3602b003200341c0046a200341d0056a103720032902c404220a422088a7210820032802c0042124200aa7211b0c050b0240201020084102746a2802002209450d000240024020282015460d0020152116202821150c010b201541016a22062015490d0d2015410174220d2006200d20064b1b221641ffffffff03712016470d0d201641027422064100480d0d0240024020150d002006102a21230c010b202320154102742006102e21230b2023450d090b202320154102746a2008360200200341d0056a200328025c220b200341386a10af0520032802d805211b20032802d4052124024020032802d00522194101470d0020032802dc052108201621150c060b20242802082208417f4c0d072024280200210620242d000c210d0240024020080d004101210e0c010b2008102a220e450d090b200e2006200810db0521062003200836026820032008360264200320063602602003200d3a006c200320242d000d3a006d200341003602702003200328025c3602782003200936027c024002402003280250220941d0e1c100460d00200328025421260c010b2021420037010020224200370100202b42003701002012420037010020014200370100201a4200370100200341d0056a410041e00210da051a419403102a2209450d094100212620094100360200200920032903c0043702042009410c6a200341c0046a41086a290300370200200941146a200341c0046a41106a2903003702002009411c6a200341c0046a41186a290300370200200941246a200341c0046a41206a2903003702002009412c6a2013290300370200200941346a200341d0056a41e00210db051a20034100360254200320093602500b202841016a21280240034020092f010622154102742125410021084114210d417f210602400340024020252008470d00201521060c020b200920086a210e200641016a2106200d41206a210d200841046a21080240417f200e41086a280200220e200b47200e200b4b1b41016a0e03020001020b0b2009200d6a220828020421062008280200210d20082003290360370200200841186a200329037837020020082802102109200820032903703702102008200329036837020820094102460d022006450d02200d102c0c020b02402026450d002026417f6a2126200920064102746a4194036a28020021090c010b0b2003200328025841016a3602582003290378210a2003290370212c2003290368212d2003290360212e0240024020092f0106220d410b490d002021420037010020224200370100202b42003701002012420037010020014200370100201a4200370100200341d0056a410041e00210da051a419403102a2208450d0b20084100360200200820032903c0043702042008410c6a200341c0046a41086a222f290300370200200841146a200341c0046a41106a22302903003702002008411c6a200341c0046a41186a2231290300370200200841246a200341c0046a41206a22322903003702002008412c6a2013290300370200200841346a200341d0056a41e00210db05210e200341d0056a41086a2226200941fc016a290200370300200341d0056a41106a221520094184026a290200370300200341d0056a41186a22332009418c026a290200370300200320092902f4013703d00520092802202134200841086a200941246a20092f010641796a220d41027410db052125200e20094194026a200d41057410db05210e200941063b01062008200d3b01062031203329030037030020302015290300370300202f2026290300370300200320032903d0053703c0040240024020064107490d0020252006417a6a22354102746a2025200641796a22364102746a2206200d41ffff037120366b41027410dc051a2006200b360200200e20354105746a200e20364105746a2206200841066a220d2f010020366b41057410dc051a200641186a200a3702002006202c3702102006202d3702082006202e370200200d2f0100210e0c010b200941086a220d200641016a22254102746a200d20064102746a2236200941066a220d2f0100220e20066b223541027410dc051a2036200b360200200941346a220b20254105746a200b20064105746a2206203541057410dc051a200641186a200a3702002006202c3702102006202d3702082006202e3702000b200d200e41016a3b0100200341b0036a41186a22372031290300220a370300200341b0036a41106a22382030290300222c370300200341b0036a41086a2239202f290300222d37030020034190016a41186a223a200a37030020034190016a41106a223b202c37030020034190016a41086a223c202d370300200320032903c004220a3703b0032003200a3703900102402009280200220e0d00200821060c020b20092f010421362008213d0340200341a0026a41186a223e203a290300370300200341a0026a41106a223f203b290300370300200341a0026a41086a2240203c29030037030020032003290390013703a002203641ffff0371210b024002400240200e2f01062208410b490d002021420037010020224200370100202b42003701002012420037010020014200370100201a42003701002039202f2903003703002038203029030037030020372031290300370300200341b0036a41206a22082032290300370300200341b0036a41286a22092013290300370300200320032903c0043703b003200341d0056a410041900310da051a41c403102a2206450d0f20064100360200200620032903b0033702042006410c6a2039290300370200200641146a20382903003702002006411c6a2037290300370200200641246a20082903003702002006412c6a2009290300370200200641346a200341d0056a41900310db052109200e41206a28020021412033200e418c026a2902003703002015200e4184026a2902003703002026200e41fc016a2902003703002003200e41f4016a2902003703d005200641086a200e41246a200e2f0106220d41796a220841027410db0521422009200e4194026a200841057410db05214320064194036a200e41b0036a200d417a6a222541027410db052135200e41063b0106200620083b010602402025450d00410021082035210903402009280200220d20083b0104200d2006360200200941046a21092025200841016a2208470d000b0b20312033290300220a37030020302015290300222c370300202f2026290300222d370300200320032903d005222e3703c0042033200a3703002015202c3703002026202d3703002003202e3703d005203641ffff037122094107490d012042200b417a6a220d41027422256a2042200b41796a22084102746a220920062f010620086b41027410dc051a200920343602002043200d4105746a204320084105746a220920062f010620086b41057410dc051a200941186a203e290300370200200941106a203f290300370200200941086a2040290300370200200920032903a002370200200620062f010641016a22093b0106200b410274223620356a416c6a203520256a2225200941ffff0371220b200d6b41027410dc051a2025203d360200200b200d490d02200620366a41fc026a210903402009280200220d200841016a22083b0104200d2006360200200941046a21092008200b490d000c030b0b200e41086a2209200b41016a2206410274220d6a2009200b41027422256a22092008200b6b222641027410dc051a20092034360200200e41346a220920064105746a2009200b4105746a2209202641057410dc051a200941186a203e290300370200200941106a203f290300370200200941086a2040290300370200200920032903a002370200200e200841016a22083b01062025200e4194036a22096a41086a2009200d6a2209200841ffff0371220d20066b41027410dc051a2009203d360200200b200d4f0d05200e2006417f6a22084102746a4198036a2109034020092802002206200841016a22083b01042006200e360200200941046a21092008200d490d000c060b0b200e41086a2208200b41016a2225410274220d6a2008200b41027422366a2208200e2f01062235200b6b224241027410dc051a20082034360200200e41346a220820254105746a2008200b4105746a2208204241057410dc051a200841186a203e290300370200200841106a203f290300370200200841086a2040290300370200200820032903a002370200200e203541016a22083b01062036200e4194036a22356a41086a2035200d6a2235200841ffff0371220d20256b41027410dc051a2035203d3602002009200d4f0d00200e20366a4198036a2108034020082802002209200b41016a220b3b01042009200e360200200841046a2108200d200b470d000b0b203a2033290300370300203b2015290300370300203c2026290300370300200320032903d005370390010240200e28020022080d00204121340c030b200e2f010421362008210e204121342006213d0c000b0b200941086a2208200641016a220e4102746a200820064102746a2208200d20066b222541027410dc051a2008200b360200200941346a2208200e4105746a200820064105746a2208202541057410dc051a200841186a200a3702002008202c3702102008202d3702082008202e3702002009200d41016a3b01060c010b2021420037010020224200370100202b42003701002012420037010020014200370100201a42003701002039202f2903003703002038203029030037030020372031290300370300200341b0036a41206a22092032290300370300200341b0036a41286a220d2013290300370300200320032903c0043703b003200341d0056a410041900310da051a41c403102a2208450d0920084100360200200820032903b0033702042008410c6a2039290300370200200841146a20382903003702002008411c6a2037290300370200200841246a20092903003702002008412c6a200d290300370200200841346a200341d0056a41900310db05210b20082003280250220936029403200320083602502003200328025441016a36025420092008360200200941003b0104200b20082f0106220d4105746a2209200329039001370200200941186a203a290300370200200941106a203b290300370200200941086a203c2903003702002008200d4102746a41086a203436020020084194036a200d41016a22094102746a2006360200200820093b0106200620093b0104200620083602000b02402019450d00201b450d002024102c0b201621150b2029210d20142108201741ff01710e03010200010b410121090c020b410021090c010b410221090c000b0b20032802502003280254200328025810b00502402015450d002023102c0b0240201e450d00201e41306c2107202021050340200510b105200541306a2105200741506a22070d000b0b0240200341c4006a280200450d002020102c0b2000202436020420004101360200200041086a2008ad422086201bad843702002011450d052010102c200424000f0b2003280248220d41306c21052003280240220b41546a210720032802582134200328025421272003280250212602400340410021082005450d01200541506a21052007412c6a2109200741306a2206210720092d00004103470d000b200641086a2802002205450d00200541286c2107200628020041186a2105410021080340200820052d0000456a2108200541286a2105200741586a22070d000b0b200d41306c2105200b415c6a210702400340024020050d00410021050c020b200541506a2105200741246a2109200741306a2206210720092d00004104470d000b200628020021050b200341d0056a41106a2229200341386a41106a280200360200200341d0056a41086a200341386a41086a290300370300200320032903383703d00520034190016a200341d0056a10f8042028450d02202320284102746a2114200520086a2124200341d0056a41e0016a2116200341d0056a41d0016a2117200341d0056a41c0016a2118200341d0056a41b0016a2119200341d0056a41a0016a211a200341d0056a4190016a211b200341d0056a4180016a211c200341d0056a41f0006a211d200341d0056a41e0006a211e200341d0056a41d0006a211f200341d0056a41c0006a2120200341d0056a41306a2121200341d0056a41206a2122200341c7046a212b20034184066a211220034194066a2101200341a4066a2113200341b4066a2133200341c4066a2136200341d4066a2135200341e4066a212f200341f4066a213020034184076a213120034194076a2137200341a4076a2138200341b4076a21392023212803402028220541046a212820052802002106202621082027210e034020082f0106222a410274210b41002109417f210741002105024003400240200b2005470d00202a21070c020b200820056a210d200741016a2107200941206a2109200541046a21050240417f200d41086a280200220d200647200d20064b1b41016a0e03020001020b0b200820096a220e412c6a2802002107200e41306a28020021052003200c3602b407200341133a00b007200341d7003a00a00720032005360294072003412d3a0090072003200c36028407200341123a008007200320073602f4062003410b3a00f006200341063a00e006200341003a00d00620034184083b01c006200341373a00b006200320023602a4062003412d3a00a0062003200c36029406200341123a0090062003200c36028406200341133a008006200341d6003a00f005200320053602e4052003412d3a00e0052003200c3602d405200341123a00d005200e411c6a222a280200220d41106a220541ffffffff00712005470d0320054104742207417f4c0d030240024020070d00410821060c010b2007102a2206450d05202a280200210d0b02400240200d0d00410021080c010b41002109410021070340024020072005470d00200541016a22082005490d0b2005410174220b2008200b20084b1b220841ffffffff00712008470d0b2008410474220b4100480d0b0240024020050d00200b102a21060c010b20062005410474200b102e21060b2006450d07200821050b200620096a2208410f3a0000200841046a2007360200200841016a20032f01b0033b0000200841036a200341b0036a41026a2d00003a0000200941106a2109200741016a22082107200d2008470d000b0b02400240200520086b410e4d0d00200521090c010b2008410f6a22072008490d09200541017422092007200920074b1b220941ffffffff00712009470d09200941047422074100480d090240024020050d002007102a21060c010b200620054104742007102e21060b2006450d050b200341c0046a200341d0056a10b205200620084104746a220520032903c004370300200541086a200341c0046a41086a2207290300370300200341c0046a202910b205200541186a2007290300370300200520032903c004370310200341c0046a202210b205200541286a2007290300370300200541206a20032903c004370300200341c0046a202110b205200541386a2007290300370300200541306a20032903c004370300200341c0046a202010b205200541c8006a2007290300370300200541c0006a20032903c004370300200341c0046a201f10b205200541d8006a2007290300370300200541d0006a20032903c004370300200341c0046a201e10b205200541e8006a2007290300370300200541e0006a20032903c004370300200341c0046a201d10b205200541f8006a2007290300370300200541f0006a20032903c004370300200341c0046a201c10b20520054188016a200729030037030020054180016a20032903c004370300200341c0046a201b10b20520054198016a200729030037030020054190016a20032903c004370300200341c0046a201a10b205200541a8016a2007290300370300200541a0016a20032903c004370300200341c0046a201910b205200541b8016a2007290300370300200541b0016a20032903c004370300200341c0046a201810b205200541c8016a2007290300370300200541c0016a20032903c004370300200341c0046a201710b205200541d8016a2007290300370300200541d0016a20032903c004370300200341c0046a201610b205200541e8016a2007290300370300200541e0016a20032903c004370300024002402008410f6a22052009460d002009210d200521090c010b200941016a22052009490d09200941017422072005200720054b1b220d41ffffffff0071200d470d09200d41047422054100480d090240024020090d002005102a21060c010b200620094104742005102e21060b2006450d050b200620094104746a220541063a0000200520032900c004370001200541086a202b290000370000200341c0046a20034190016a418c0110db051a4110102a2207450d04200741063a0000200341b0036a200341c0046a418c0110db051a202a2802002205417f4c0d03200e41146a280200212a410121094101210b02402005450d002005102a220b450d050b200b202a200510db05210b0240024020050d004100212a0c010b2005102a2209450d052005212a0b2009200b200510db05210f02402005450d00200b102c0b200341c0046a200341b0036a418c0110db051a200e41216a310000212c200341b0036a200341c0046a418c0110db051a200341c0046a200341b0036a418c0110db051a200341a0026a200341c0046a418c0110db051a4110102a2209450d04200841106a2108202541807e712125200a428080808080804083220a2005ad84202c422886844280808080800c84212c200941063a00002009102c200341b0036a200341a0026a418c0110db051a200341c0046a200341b0036a418c0110db051a024020072d00004109470d0002402007280204220528020441ffffffff0371450d002005280200102c200728020421050b2005102c0b2007102c200341a0026a200341c0046a418c0110db051a200341c0046a200341a0026a418c0110db051a200320253602dc03200320083602d8032003200d3602d403200320063602d003200341003602cc03200342043702c4032003202c3702bc032003202a3602b8032003200f3602b403200341013602b003200341c0046a200341b0036a10fd0420034190016a200341c0046a418c0110db051a200e41286a2024360200200e41246a4101360200024020032d00d0054109470d00024020032802d405220528020441ffffffff0371450d002005280200102c20032802d40521050b2005102c0b024020032d00e0054109470d000240200341d0056a41146a280200220528020441ffffffff0371450d002005280200102c20032802e40521050b2005102c0b024020032d00f0054109470d000240200341d0056a41246a280200220528020441ffffffff0371450d002005280200102c20032802f40521050b2005102c0b024020032d0080064109470d0002402012280200220528020441ffffffff0371450d002005280200102c20032802840621050b2005102c0b024020032d0090064109470d0002402001280200220528020441ffffffff0371450d002005280200102c20032802940621050b2005102c0b024020032d00a0064109470d0002402013280200220528020441ffffffff0371450d002005280200102c20032802a40621050b2005102c0b024020032d00b0064109470d0002402033280200220528020441ffffffff0371450d002005280200102c20032802b40621050b2005102c0b024020032d00c0064109470d0002402036280200220528020441ffffffff0371450d002005280200102c20032802c40621050b2005102c0b024020032d00d0064109470d0002402035280200220528020441ffffffff0371450d002005280200102c20032802d40621050b2005102c0b024020032d00e0064109470d000240202f280200220528020441ffffffff0371450d002005280200102c20032802e40621050b2005102c0b024020032d00f0064109470d0002402030280200220528020441ffffffff0371450d002005280200102c20032802f40621050b2005102c0b024020032d0080074109470d0002402031280200220528020441ffffffff0371450d002005280200102c20032802840721050b2005102c0b024020032d0090074109470d0002402037280200220528020441ffffffff0371450d002005280200102c20032802940721050b2005102c0b024020032d00a0074109470d0002402038280200220528020441ffffffff0371450d002005280200102c20032802a40721050b2005102c0b024020032d00b0074109470d0002402039280200220528020441ffffffff0371450d002005280200102c20032802b40721050b2005102c0b200a4280808080808c0184210a202441016a212420282014470d020c050b0240200e450d00200e417f6a210e200820074102746a4194036a28020021080c010b0b0b41d8fcc5004180011054000b103a000b1033000b02402015450d002023102c0b200341d0056a20034190016a418c0110db051a200341c0046a200341d0056a10fa040240200341c0046a41106a2802002205450d0020032802c8042215200541306c6a21290340024020152d000041786a220541024b0d0002400240024020050e03000102000b201528020c2205450d0220152802042208200541146c6a212403400240200828020c0d002008280210210e202621062027210c0340200641286a2109200641086a210720062f010622254102742105417f210d02400340024020050d002025210d0c020b2007280200210b200d41016a210d200941206a21092005417c6a2105200741046a21070240417f200b200e47200b200e4b1b41016a0e03020001020b0b02402009417c6a280200450d00200820092802003602100c030b41d8fdc50041351054000b200c450d01200c417f6a210c2006200d4102746a4194036a28020021060c000b0b200841146a22082024470d000c030b0b2015280204210b202621092027210e0340200941286a2108200941086a210720092f0106220c4102742105417f210602400340024020050d00200c21060c020b2007280200210d200641016a2106200841206a21082005417c6a2105200741046a21070240417f200d200b47200d200b4b1b41016a0e03020001020b0b02402008417c6a280200450d00201520082802003602040c040b41d8fdc50041351054000b200e450d02200e417f6a210e200920064102746a4194036a28020021090c000b0b201528020c2205450d002015280204222a2005411c6c6a210f03400240202a2802182205450d00202a280210220c20054102746a21280340200c222441046a210c2024280200210b202621092027210e0340200941286a2108200941086a210720092f010622254102742105417f2106024002400340024020050d00202521060c020b2007280200210d200641016a2106200841206a21082005417c6a2105200741046a21070240417f200d200b47200d200b4b1b41016a0e03020001020b0b02402008417c6a280200450d00202420082802003602000c020b41d8fdc50041351054000b200e450d00200e417f6a210e200920064102746a4194036a28020021090c010b0b200c2028470d000b0b202a411c6a222a200f470d000b0b201541306a22152029470d000b0b200341cc046a290200210a20032802c004210520032902c404212c20262027203410b005200041106a200a370200200041086a202c37020020002005360204200041003602002011450d012010102c200424000f0b024020012802102205450d0020012802082103200541306c21050340200310b105200341306a2103200541506a22050d000b0b2001410c6a280200450d002001280208102c0b200424000f0b1035000bfa820204117f017e0b7f017e230041e0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e100100021211100f0e0d0b090a06050403010b200141186a2802002104200141146a2802002105200141106a28020021062001410c6a2802002107200141086a2802002108200141046a28020021090240200241046a280200200241086a280200220a460d002002280200210b0c190b200a41016a220b200a490d15200a410174220c200b200c200b4b1b220c4100480d1502400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d142002200b360200200241046a200c360200200241086a280200210a0c180b2001410c6a280200210b200141086a2802002105200141046a280200210420012d0001210d02400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d15200a4101742206200c2006200c4b1b22064100480d1502400240200a0d002006102a210c0c010b2002280200200a2006102e210c0b200c450d142002200c360200200241046a2006360200200241086a280200210a0b200241086a2206200a41016a360200200c200a6a200d3a000002400240200241046a280200220c2006280200220a6b200b490d002002280200210c0c010b200a200b6a220d200a490d15200c410174220a200d200a200d4b1b220a4100480d1502400240200c0d00200a102a210c0c010b2002280200200c200a102e210c0b200c450d142002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2004200b10db051a4100210b4101210d024020050d004101210c0c220b2004102c4101210c0c210b2001410c6a2802002106200141086a280200210e200141046a280200210f02400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d14200a410174220c200b200c200b4b1b220c4100480d1402400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d132002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41013a0000200f20064104746a21104100210c4100210b41002105410121042006210a03400240200b2005470d00200c200b41016a220d200c200d4b1b22054100480d1502400240200c0d002005102a21040c010b2004200b2005102e21040b2004450d140b2004200b6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41026a210c200b41016a210b200d210a200d0d000b024020060d00200f21080c110b200f210a0340200a41106a2108200a2d000d22114105460d11200a2d000c210c200a2802082109200a2802042112200a280200211302402005200b470d00200b41016a220a200b490d15200b410174220d200a200d200a4b1b22054100480d1502400240200b0d002005102a21040c010b2004200b2005102e21040b2004450d140b2004200b6a200c3a0000200b41016a210a200b410174220b41046a2107200b41026a210c2009210b0340200721060240200a2005470d00200a41016a220d200a490d16200c200d200c200d4b1b22054100480d1602400240200a0d002005102a21040c010b2004200a2005102e21040b2004450d150b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200641026a2107200c41026a210c200a41016a210a200d210b200d0d000b0240024020090d00200a210b0c010b4100210c0340200a200c6a210b41fc00210d02400240024002402013200c6a2d00000e050200010305020b41fe00210d0c020b41fd00210d0c010b41ff00210d0b0240200b2005470d00200b41016a2205200b490d1720062005200620054b1b22054100480d1702400240200b0d002005102a21040c010b2004200b2005102e21040b2004450d160b2004200a6a200c6a200d3a0000200641026a21062009200c41016a220c470d000b200a200c6a210b0b02402012450d002013102c0b4100210a024020114104460d0002402005200b470d00200b41016a220a200b490d16200b410174220c200a200c200a4b1b22054100480d1602400240200b0d002005102a21040c010b2004200b2005102e21040b2004450d150b2004200b6a41013a0000200b41016a210b201141077141ff0073210a0b02402005200b470d00200b41016a220c200b490d15200b410174220d200c200d200c4b1b22054100480d1502400240200b0d002005102a21040c010b2004200b2005102e21040b2004450d140b2004200b6a200a3a0000200b41016a210b2008210a20082010470d000c120b0b200141286a2802002113200141246a280200210f200141206a28020021082001411c6a2802002107200141186a2802002110200141146a28020021092001410c6a2902002114200141086a2802002112200141046a280200211102400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d05200a410174220c200b200c200b4b1b220c4100480d0502400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d042002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41003a0000200341dc006a410036020020034201370254200320023602502014422088a7210d4100210a4100210b2014a72206210c034002400240200a200b460d002003280254210a0c010b200a41016a2204200a490d06200a41017422052004200520044b1b22044100480d0602400240200a0d002004102a210a0c010b2003280254200a2004102e210a0b200a450d05200320043602582003200a3602540b2003200b41016a36025c200a200b6a200c41807f72200c41ff0071200c41077622041b3a00002003280258210a200328025c210b2004210c20040d000b02400240200a200b6b2006490d00200328025421040c010b200b20066a220c200b490d05200a4101742204200c2004200c4b1b220c4100480d0502400240200a0d00200c102a21040c010b2003280254200a200c102e21040b2004450d042003200c36025820032004360254200c210a0b2003200b20066a220c36025c2004200b6a2011200610db051a02402012450d002011102c0b034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d06200a4101742204200b2004200b4b1b220b4100480d0602400240200a0d00200b102a210a0c010b2003280254200a200b102e210a0b200a450d052003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220b1b3a00000240200b450d002003280258210a200328025c210c200b210d0c010b0b4101211202402009450d002007210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d07200a410174220d200c200d200c4b1b220d4100480d0702400240200a0d00200d102a210c0c010b2003280254200a200d102e210c0b200c450d062003200d3602582003200c3602540b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280258220b200328025c220a6b2007490d002003280254210b0c010b200a20076a220c200a490d06200b410174220d200c200d200c4b1b220c4100480d0602400240200b0d00200c102a210b0c010b2003280254200b200c102e210b0b200b450d052003200c3602582003200b3602540b2003200a20076a36025c200b200a6a2009200710db051a410021122010450d002009102c0b200820134104746a21062013210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d06200a410174220d200c200d200c4b1b220d4100480d0602400240200a0d00200d102a210c0c010b2003280254200a200d102e210c0b200c450d052003200d3602582003200c3602540b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b200821040240024002402013450d00411021072008210403402004220b41106a2104200b280200220c4108460d01200b410c6a2802002102200b41086a280200210a200b280204210b024002400240024002400240024002400240200c0e080001020304050607000b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d11200c4101742205200d2005200d4b1b22054100480d1102400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d10200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41003a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d12200c4101742205200d2005200d4b1b22054100480d1202400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d11200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d12200b410174220d200c200d200c4b1b220d4100480d1202400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d112003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c080b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d10200c4101742205200d2005200d4b1b22054100480d1002400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0f200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41013a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d11200c4101742205200d2005200d4b1b22054100480d1102400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d10200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d11200b410174220d200c200d200c4b1b220d4100480d1102400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d102003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c070b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0f200c4101742205200d2005200d4b1b22054100480d0f02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0e200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41023a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d10200c4101742205200d2005200d4b1b22054100480d1002400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0f200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d10200b410174220d200c200d200c4b1b220d4100480d1002400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d0f2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c060b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0e200c4101742205200d2005200d4b1b22054100480d0e02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0d200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41033a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0f200c4101742205200d2005200d4b1b22054100480d0f02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0e200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d0f200b410174220d200c200d200c4b1b220d4100480d0f02400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d0e2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b20032002200341d0006a10880520032d0000220a411f460d0420032f000120032d000341107472210d0c070b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0d200c4101742205200d2005200d4b1b22054100480d0d02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0c200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41043a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0e200c4101742205200d2005200d4b1b22054100480d0e02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0d200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d0e200b410174220d200c200d200c4b1b220d4100480d0e02400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d0d2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b20032002200341d0006a10880520032d0000220a411f460d0320032f000120032d000341107472210d0c060b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0c200c4101742205200d2005200d4b1b22054100480d0c02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0b200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41053a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0d200c4101742205200d2005200d4b1b22054100480d0d02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0c200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d0d200b410174220d200c200d200c4b1b220d4100480d0d02400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d0c2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b20032002200341d0006a10880520032d0000220a411f460d0220032f000120032d000341107472210d0c050b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0b200c4101742205200d2005200d4b1b22054100480d0b02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0a200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41063a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0c200c4101742205200d2005200d4b1b22054100480d0c02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0b200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d0c200b410174220d200c200d200c4b1b220d4100480d0c02400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d0b2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000c020b0b024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0a200c4101742205200d2005200d4b1b22054100480d0a02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d09200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a41073a00000340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d0b200c4101742205200d2005200d4b1b22054100480d0b02400240200c0d002005102a210d0c010b2003280254200c2005102e210d0b200d450d0a200320053602582003200d360254200328025c210c0b2003200c41016a36025c200d200c6a200b41807f72200b41ff0071200b410776220c1b3a0000200c210b200c0d000b0340024002402003280258200328025c220b460d002003280254210c0c010b200b41016a220c200b490d0b200b410174220d200c200d200c4b1b220d4100480d0b02400240200b0d00200d102a210c0c010b2003280254200b200d102e210c0b200c450d0a2003200d3602582003200c360254200328025c210b0b2003200b41016a36025c200c200b6a200a41807f72200a41ff0071200a410776220b1b3a0000200b210a200b0d000b0b200741106a210720042006470d000b200621040b0240034020062004460d012004280200210a200441106a2104200a4108470d000b0b0240200f450d002008102c0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d08200a4101742206200c2006200c4b1b22064100480d0802400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d072004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d07200b410174220a200c200a200c4b1b220a4100480d0702400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d062004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021114101210d2009450d012012450d012010450d012009102c0c010b20032903082114200328020421042013410474210c02400340200c2007460d01200820076a210b200741106a2107200b2802004108470d000b0b0240200f450d002008102c0b02402003280258450d002003280254102c0b02402009450d002012450d002010450d002009102c0b200a411f470d15410021114101210d0b4101210b4101210c410121044101210641012112410121104101210541012107410121024101210841012109410121130c380b2001412c6a280200210e200141286a2802002115200141246a2802002111200141206a28020021162001411c6a2802002117200141186a2802002118200141146a28020021102001410c6a2902002114200141086a2802002119200141046a280200211202400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d04200a410174220c200b200c200b4b1b220c4100480d0402400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d032002200b360200200241046a200c360200200241086a280200210a0b4101210d200241086a200a41016a36020041002104200b200a6a41003a00004104102a220f450d02200f41eec2b5ab063600000240024020120d00410021134100211a0c010b410121064100210a410021042014a72205210b034002400240200a2004460d00200a210d2004210a0c010b200a41016a220c200a490d06200a410174220d200c200d200c4b1b220d4100480d0602400240200a0d00200d102a21060c010b2006200a200d102e21060b2006450d050b2006200a6a200b41807f72200b41ff0071200b410776220c1b3a0000200a41016a2104200d210a200c210b200c0d000b02400240200d20046b2005490d00200d21080c010b200420056a220a2004490d05200d410174220b200a200b200a4b1b22084100480d050240200d0d002008102a22060d010c050b2006200d2008102e2206450d040b200620046a2012200510db051a02402019450d002012102c0b4101102a220d450d03200d41003a00004101210a4101210b200420056a2207210c034002400240200a200b460d00200a21040c010b200a41016a220b200a490d06200a4101742204200b2004200b4b1b22044100480d0602400240200a0d002004102a210d0c010b200d200a2004102e210d0b200d450d05200a210b2004210a0b200d200b6a200c41807f72200c41ff0071200c41077622051b3a0000200b41016a210b2005210c20050d000b02402004200b6b20074f0d00200b20076a220a200b490d052004410174220c200a200c200a4b1b220a4100480d050240024020040d00200a102a210d0c010b200d2004200a102e210d0b200d450d04200a21040b200d200b6a2006200710db051a200b20076a21134101211a2008450d002006102c0b0240024002400240024002400240024020100d004101211b0c010b4100211b20034100360240200342013703382003410c6a2017360200200341086a201836020020032010360204200320144220883e0200200341d0006a2003200341386a109305024020032d00502209411f460d0020032f005120032d0053411074722108200341d0006a41086a290300211420032802542116200328023c0d020c030b0240024020042013460d002004210a0c010b200441016a220a2004490d0b2004410174220b200a200b200a4b1b220a4100480d0b0240024020040d00200a102a210d0c010b200d2004200a102e210d0b200d450d0a200421130b200d20136a41013a0000201341016a210b20032802402206210c034002400240200a200b460d00200a21040c010b200a41016a220b200a490d0c200a4101742204200b2004200b4b1b22044100480d0c02400240200a0d002004102a210d0c010b200d200a2004102e210d0b200d450d0b200a210b2004210a0b200d200b6a200c41807f72200c41ff0071200c41077622051b3a0000200b41016a210b2005210c20050d000b2003280238210a02402004200b6b20064f0d00200b20066a220c200b490d0b20044101742205200c2005200c4b1b220c4100480d0b0240024020040d00200c102a210d0c010b200d2004200c102e210d0b200d450d0a200c21040b200d200b6a200a200610db051a0240200328023c450d00200a102c0b200b20066a21134100211b0b0240024020110d00410021050c010b2003410036024020034201370338410121064100210c4100210a2016210b03400240200a200c470d00200c41016a2205200c490d0c200c41017422072005200720054b1b22054100480d0c02400240200c0d002005102a21060c010b2006200c2005102e21060b2006450d0b2003200536023c200320063602382005210c0b2003200a41016a22073602402006200a6a200b41807f72200b41ff0071200b41077622051b3a00002007210a2005210b20050d000b2011200e4104746a210802400240024020160d00201121050c010b20112105200e450d00200841706a211c4100210a2011211d02400340201d210502400340200541046a28020022090d01200a41016a210a2008200541106a2205470d000c050b0b200541106a211d200a41016a211e2016417f6a2116200541086a29020021142005280200211f200328023c210c2003280240210b034002400240200b200c460d00200328023821060c010b200c41016a2206200c490d10200c41017422072006200720064b1b22074100480d1002400240200c0d002007102a21060c010b2003280238200c2007102e21060b2006450d0f2003200736023c200320063602382007210c0b2003200b41016a22073602402006200b6a200a41807f72200a41ff0071200a41077622061b3a00002007210b2006210a20060d000b20032014370308200320093602042003201f360200200341d0006a2003200341386a109305024020032d00502209411f470d002016450d02201e210a201c2005470d010c020b0b20032d0053211d20032f0051211f20032802542116200329035821140240200841706a2005460d00200541106a210503402005220a41106a21050240200a2802042206450d00200a28020821070240200a410c6a280200220a450d00200a410c6c210b2006210a03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b2007450d002006102c0b20052008470d000b0b201d411074210a02402015450d002011102c0b201f200a72210841012105200328023c450d062003280238102c0c060b200541106a21050b20052008460d0003402005220a41106a21050240200a2802042206450d00200a28020821070240200a410c6a280200220a450d00200a410c6c210b2006210a03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b2007450d002006102c0b20052008470d000b0b02402015450d002011102c0b0240024020042013460d002004210a0c010b200441016a220a2004490d0b2004410174220b200a200b200a4b1b220a4100480d0b0240024020040d00200a102a210d0c010b200d2004200a102e210d0b200d450d0a200421130b200d20136a41023a0000201341016a210b20032802402206210c034002400240200a200b460d00200a21040c010b200a41016a220b200a490d0c200a4101742204200b2004200b4b1b22044100480d0c02400240200a0d002004102a210d0c010b200d200a2004102e210d0b200d450d0b200a210b2004210a0b200d200b6a200c41807f72200c41ff0071200c41077622051b3a0000200b41016a210b2005210c20050d000b2003280238210a02402004200b6b20064f0d00200b20066a220c200b490d0b20044101742205200c2005200c4b1b220c4100480d0b0240024020040d00200c102a210d0c010b200d2004200c102e210d0b200d450d0a200c21040b200d200b6a200a200610db051a0240200328023c450d00200a102c0b200b20066a2113410121050b0240201a201245720d002019450d002012102c0b02402010450d00201b4101730d0002402017450d002017410c6c210b2010210a03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b2018450d002010102c0b2005201145720d030240200e450d002011200e4104746a21072011210603402006220541106a210602402005280204220a450d0002402005410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b200541086a280200450d002005280204102c0b20062007470d000b0b2015450d032011102c0c030b2003280238102c0b410021050b0240201a201245720d002019450d002012102c0b02402010450d00201b4101730d0002402017450d002017410c6c210b2010210a03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b2018450d002010102c0b02402005201145720d000240200e450d002011200e4104746a21072011210603402006220541106a210602402005280204220a450d0002402005410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b200541086a280200450d002005280204102c0b20062007470d000b0b2015450d002011102c0b2009411f460d002008410874200972210a02402004450d00200d102c0b2000200a360200200041086a2014370200200041046a2016360200200f102c0c010b200341146a2013360200200341106a20043602002003200d36020c20034284808080c0003702042003200f360200200341d0006a20032002109405200320032900513703382003200341d0006a41086a29000037003f20032d0050220a411f460d012000200a3a000020002003290338370001200041086a200329003f3700000b410021084101210d4101210c410121044101210541012106410121074101210b41012102410121090c1d0b410021134101210d4101210b4101210c4101210441012106410121124101211041012105410121074101210241012108410121090c360b2001410c6a2802002105200141086a2802002107200141046a280200210602400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d03200a410174220c200b200c200b4b1b220c4100480d0302400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d022002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a410b3a0000200341c4006a41003602002003420137023c2003200236023820062005411c6c6a21114100210a4100210b2005210c034002400240200a200b460d00200328023c210a0c010b200a41016a220d200a490d04200a4101742204200d2004200d4b1b220d4100480d0402400240200a0d00200d102a210a0c010b200328023c200a200d102e210a0b200a450d032003200d3602402003200a36023c0b2003200b41016a360244200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280240210a2003280244210b200c210c0c010b0b2003201136025c20032006360258200320073602542003200636025002402005450d00034020032006220a411c6a2206360258200a2802102207450d01200a410c6a2802002102200a41086a2802002108200a2802042105200a41146a2902002114200a280200210b03400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d06200a410174220d200c200d200c4b1b220d4100480d0602400240200a0d00200d102a210c0c010b200328023c200a200d102e210c0b200c450d052003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b0240024002400240024020050d00410121130c010b200320023602302003200836022c200320053602282003200341286a200341386a10850520032d0000220a411f470d01410021130b2014a721092014422088a72204210b03400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d09200a410174220d200c200d200c4b1b220d4100480d0902400240200a0d00200d102a210c0c010b200328023c200a200d102e210c0b200c450d082003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280240220b2003280244220a6b2004490d00200328023c210b0c010b200a20046a220c200a490d08200b410174220a200c200a200c4b1b220a4100480d0802400240200b0d00200a102a210b0c010b200328023c200b200a102e210b0b200b450d072003200a3602402003200b36023c2003280244210a0b2003200a20046a360244200b200a6a2007200410db051a02402009450d002007102c0b2005450d0220130d010c020b20032d0003411074210b20032f0001210c200329030821202003280204210d02402014a7450d002007102c0b200c200b72210b200341d0006a10950502402003280240450d00200328023c102c0b2000200b3b00012000200a3a0000200041036a200b4110763a0000200041086a2020370000200041046a200d360000410021024101210d4101210c410121044101210541012106410121074101210b0c1e0b02402002450d002002410474210b2005210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b2008450d002005102c0b20062011470d000b0b200341d0006a10950520032802402108200328023c21022003280238220441086a210d200441046a210520032802442207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d04200a4101742206200c2006200c4b1b22064100480d0402400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d032004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d03200b410174220a200c200a200c4b1b220a4100480d0302400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d022004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021094101210d4101210b4101210c4101210441012106410121124101211041012105410121074101210241012108410121130c350b2001410c6a2802002106200141086a2802002107200141046a280200210d02400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d10200a410174220c200b200c200b4b1b220c4100480d1002400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d0f2002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a410a3a0000200341246a41003602002003420137021c20032002360218200d200641186c6a210f4100210a4100210b2006210c034002400240200a200b460d00200328021c210a0c010b200a41016a2204200a490d11200a41017422052004200520044b1b22044100480d1102400240200a0d002004102a210a0c010b200328021c200a2004102e210a0b200a450d10200320043602202003200a36021c0b2003200b41016a360224200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280220210a2003280224210b200c210c0c010b0b2003200f3602342003200d3602302003200736022c2003200d36022802402006450d0020034101722102200341026a210703402003200d41186a2213360230200d2802002208450d01200d41146a2802002111200d41106a2802002110200d28020c2109200d280208210c200d28020421124100210b200341003602442003420137023c2008200c4103746a21062003200341186a3602384100210a034002400240200b200a460d00200328023c210b0c010b200b41016a220a200b490d13200b410174220d200a200d200a4b1b220a4100480d1302400240200b0d00200a102a210b0c010b200328023c200b200a102e210b0b200b450d122003200a3602402003200b36023c2003280244210a0b2003200a41016a360244200b200a6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280240210b2003280244210a200c210c0c010b0b0240024020062008470d00200821040c010b2008210a0340200a41086a2104200a2902002214422088a7220a41ff01714104460d01200a41187441187521052014a7210b03400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d07200a410174220d200c200d200c4b1b220d4100480d0702400240200a0d00200d102a210c0c010b200328023c200a200d102e210c0b200c450d142003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b0240024020032802402003280244220a460d00200328023c210b0c010b200a41016a220b200a490d06200a410174220c200b200c200b4b1b220c4100480d0602400240200a0d00200c102a210b0c010b200328023c200a200c102e210b0b200b450d052003200c3602402003200b36023c2003280244210a0b2003200a41016a360244200b200a6a2005417f73220a413f7141c00072200a2005417f4a1b3a00002004210a20042006470d000b200621040b0240034020062004460d0120042d0004210a200441086a2104200a4104470d000b0b02402012450d002008102c0b20092011410474220a6a210c024002400240024020110d002009210a0c010b200a41706a210d2009210a0340200a2d0000210b2007200a41036a2d00003a00002003200a41016a2f00003b01000240200b41ac01470d00200a41106a210a0c020b200341cc006a41026a20072d000022043a0000200320032f010022053b014c200a41046a2802002106200a41086a2903002114200220053b0000200241026a20043a00002003200b3a00002003201437030820032006360204200341d0006a2003200341386a108d05024020032d00502204411f46220b450d00200d41706a210d200a41106a220a200c470d010c030b0b20032d0053210520032f0051210620032802542108200329035821140240200d450d00200a41106a210a034002400240200a2d0000220d4109460d00200d41ac01470d010c030b0240200a41046a280200220d28020441ffffffff0371450d00200d280200102c0b200d102c0b200a41106a220a200c470d000b0b02402010450d002009102c0b02402003280240450d00200328023c102c0b200b0d022006200541107472210a200341286a10960502402003280220450d00200328021c102c0b2000200a3b0001200020043a0000200041036a200a4110763a0000200041086a2014370000200041046a20083600004100210b4101210d4101210c410121044101210541012106410121070c1d0b200a200c460d00034002400240200a2d0000220b4109460d00200b41ac01470d010c030b0240200a41046a280200220b28020441ffffffff0371450d00200b280200102c0b200b102c0b200a41106a220a200c470d000b0b02402010450d002009102c0b20032802402111200328023c21092003280238210c20032802442208210b034002400240200c41086a2205280200200c410c6a2204280200220a460d00200c280204210d0c010b200a41016a220d200a490d06200a4101742206200d2006200d4b1b22064100480d0602400240200a0d002006102a210d0c010b200c280204200a2006102e210d0b200d450d05200c200d360204200520063602002004280200210a0b2004200a41016a360200200d200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402005280200220b2004280200220a6b2008490d00200c280204210b0c010b200a20086a220d200a490d05200b410174220a200d200a200d4b1b220a4100480d0502400240200b0d00200a102a210b0c010b200c280204200b200a102e210b0b200b450d04200c200b3602042005200a3602002004280200210a0b2004200a20086a360200200b200a6a2009200810db051a2011450d002009102c0b2013210d2013200f470d000b0b200341286a10960520032802202108200328021c21022003280218220441086a210d200441046a210520032802242207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d03200a4101742206200c2006200c4b1b22064100480d0302400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d022004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d02200b410174220a200c200a200c4b1b220a4100480d0202400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d012004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021084101210d4101210b4101210c410121044101210641012112410121104101210541012107410121020c240b1033000b1035000b2001410c6a2802002105200141086a2802002106200141046a280200210802400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d0d200a410174220c200b200c200b4b1b220c4100480d0d02400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d0c2002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41093a0000200341c4006a41003602002003420137023c2003200236023820082005411c6c6a21124100210a4100210b2005210c034002400240200a200b460d00200328023c210a0c010b200a41016a220d200a490d0e200a4101742204200d2004200d4b1b220d4100480d0e02400240200a0d00200d102a210a0c010b200328023c200a200d102e210a0b200a450d0d2003200d3602402003200a36023c0b2003200b41016a360244200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280240210a2003280244210b200c210c0c010b0b2003201236025c20032008360258200320063602542003200836025002402005450d00034020032008220a411c6a2208360258200a2802102206450d01200a410c6a2802002102200a41086a2802002109200a2802042107200a41146a2902002114200a280200210b03400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d10200a410174220d200c200d200c4b1b220d4100480d1002400240200a0d00200d102a210c0c010b200328023c200a200d102e210c0b200c450d0f2003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b0240024002400240024020070d00410121110c010b200320023602302003200936022c200320073602282003200341286a200341386a10850520032d0000220a411f470d01410021110b20062014422088a7220b4102746a21052014a7211303400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d13200a410174220d200c200d200c4b1b220d4100480d1302400240200a0d00200d102a210c0c010b200328023c200a200d102e210c0b200c450d122003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024020052006460d002006210403402004280200210b03400240024020032802402003280244220a460d00200328023c210c0c010b200a41016a220c200a490d15200a410174220d200c200d200c4b1b220d4100480d1502400240200a0d00200d102a210c0c010b200328023c200a200d102e210c0b200c450d142003200d3602402003200c36023c2003280244210a0b2003200a41016a360244200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b200441046a22042005470d000b0b02402013450d002006102c0b2007450d0220110d010c020b20032d0003411074210b20032f0001210c200329030821202003280204210d02402014a7450d002006102c0b200c200b72210b200341d0006a10970502402003280240450d00200328023c102c0b2000200b3b00012000200a3a0000200041036a200b4110763a0000200041086a2020370000200041046a200d360000410021074101210d4101210c4101210441012105410121060c180b02402002450d002002410474210b2007210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b2009450d002007102c0b20082012470d000b0b200341d0006a10970520032802402108200328023c21022003280238220441086a210d200441046a210520032802442207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d0e200a4101742206200c2006200c4b1b22064100480d0e02400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d0d2004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d0d200b410174220a200c200a200c4b1b220a4100480d0d02400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d0c2004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021024101210d4101210b4101210c4101210441012106410121124101211041012105410121070c200b200141046a280200210a02400240200241046a280200200241086a280200220b460d002002280200210c0c010b200b41016a220c200b490d0c200b410174220d200c200d200c4b1b220d4100480d0c02400240200b0d00200d102a210c0c010b2002280200200b200d102e210c0b200c450d0b2002200c360200200241046a200d360200200241086a280200210b0b200241086a200b41016a360200200c200b6a410c3a00004100210c4100210b410021064101210503400240200b2006470d00200c200b41016a220d200c200d4b1b22064100480d0d02400240200c0d002006102a21050c010b2005200b2006102e21050b2005450d0c0b2005200b6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41026a210c200b41016a210b200d210a200d0d000b200b417f6a2109200241086a2104200241046a2107200b210c03400240024020072802002004280200220a460d002002280200210d0c010b200a41016a220d200a490d0d200a4101742208200d2008200d4b1b22084100480d0d02400240200a0d002008102a210d0c010b2002280200200a2008102e210d0b200d450d0c2002200d360200200720083602002004280200210a0b2004200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200241046a280200220c200241086a280200220a6b20094d0d002002280200210c0c010b200a200b6a220d200a490d0c200c410174220a200d200a200d4b1b220a4100480d0c02400240200c0d00200a102a210c0c010b2002280200200c200a102e210c0b200c450d0b2002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2005200b10db051a4101210d2006450d012005102c0c010b200141046a280200210a02400240200241046a280200200241086a280200220b460d002002280200210c0c010b200b41016a220c200b490d0b200b410174220d200c200d200c4b1b220d4100480d0b02400240200b0d00200d102a210c0c010b2002280200200b200d102e210c0b200c450d0a2002200c360200200241046a200d360200200241086a280200210b0b200241086a200b41016a360200200c200b6a41083a00004100210c4100210b410021064101210503400240200b2006470d00200c200b41016a220d200c200d4b1b22064100480d0c02400240200c0d002006102a21050c010b2005200b2006102e21050b2005450d0b0b2005200b6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41026a210c200b41016a210b200d210a200d0d000b200b417f6a2109200241086a2104200241046a2107200b210c03400240024020072802002004280200220a460d002002280200210d0c010b200a41016a220d200a490d0c200a4101742208200d2008200d4b1b22084100480d0c02400240200a0d002008102a210d0c010b2002280200200a2008102e210d0b200d450d0b2002200d360200200720083602002004280200210a0b2004200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200241046a280200220c200241086a280200220a6b20094d0d002002280200210c0c010b200a200b6a220d200a490d0b200c410174220a200d200a200d4b1b220a4100480d0b02400240200c0d00200a102a210c0c010b2002280200200c200a102e210c0b200c450d0a2002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2005200b10db051a4101210d2006450d002005102c0b4101210b4101210c0c160b2001410c6a2802002106200141086a280200210f200141046a280200211002400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d09200a410174220c200b200c200b4b1b220c4100480d0902400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d082002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41073a00002010200641146c6a2112410021044100210a4100210c4101210b2006210d03400240200a200c470d002004200a41016a220c2004200c4b1b220c4100480d0a0240024020040d00200c102a210b0c010b200b200a200c102e210b0b200b450d090b200b200a6a200d41807f72200d41ff0071200d41077622051b3a0000200441026a2104200a41016a210a2005210d20050d000b02400240024020060d00201021080c010b201021040340200441146a2108200428020c22134104460d012004280204211120042802002109200a4101742105200441106a280200210d20042802082207210403400240200a200c470d00200a41016a220c200a490d0d2005200c2005200c4b1b220c4100480d0d02400240200a0d00200c102a210b0c010b200b200a200c102e210b0b200b450d0c0b200b200a6a200441807f72200441ff0071200441077622061b3a0000200541026a2105200a41016a210a2006210420060d000b02400240200c200a6b2007490d00200c21040c010b200a20076a2204200a490d0c200c41017422052004200520044b1b22044100480d0c02400240200c0d002004102a210b0c010b200b200c2004102e210b0b200b450d0b0b200b200a6a2009200710db051a200720046b200a6a210c02402011450d002009102c0b02400240200c450d002004210c0c010b200441016a220c2004490d0c20044101742205200c2005200c4b1b220c4100480d0c0240024020040d00200c102a210b0c010b200b2004200c102e210b0b200b450d0b0b200b20076a200a6a20133a00002007200a6a41016a210a03400240200a200c470d00200a41016a220c200a490d0d200a4101742204200c2004200c4b1b220c4100480d0d02400240200a0d00200c102a210b0c010b200b200a200c102e210b0b200b450d0c0b200b200a6a200d41807f72200d41ff0071200d41077622041b3a0000200a41016a210a2004210d20040d000b2008210420082012470d000c020b0b20082012460d0003402008410c6a2802004104460d010240200841046a280200450d002008280200102c0b200841146a22082012470d000b0b0240200f450d002010102c0b200241086a2106200241046a2107200a210403400240024020072802002006280200220d460d00200228020021050c010b200d41016a2205200d490d0a200d41017422082005200820054b1b22084100480d0a02400240200d0d002008102a21050c010b2002280200200d2008102e21050b2005450d0920022005360200200720083602002006280200210d0b2006200d41016a3602002005200d6a200441807f72200441ff00712004410776220d1b3a0000200d2104200d0d000b02400240200241046a2802002204200241086a280200220d6b200a490d00200228020021040c010b200d200a6a2205200d490d092004410174220d2005200d20054b1b220d4100480d090240024020040d00200d102a21040c010b20022802002004200d102e21040b2004450d0820022004360200200241046a200d360200200241086a280200210d0b200241086a200d200a6a3602002004200d6a200b200a10db051a410021074101210d0240200c450d00200b102c0b4101210b4101210c41012104410121064101211241012110410121050c1b0b2001410c6a2802002105200141086a2802002112200141046a280200210802400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d08200a410174220c200b200c200b4b1b220c4100480d0802400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d072002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41063a0000200341dc006a41003602002003420137025420032002360250200820054104746a21134100210a4100210b2005210c034002400240200a200b460d002003280254210a0c010b200a41016a220d200a490d09200a4101742204200d2004200d4b1b220d4100480d0902400240200a0d00200d102a210a0c010b2003280254200a200d102e210a0b200a450d082003200d3602582003200a3602540b2003200b41016a36025c200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280258210a200328025c210b200c210c0c010b0b20082104024002402005450d00200541047421114100210c034002402008200c6a220b410d6a2d000022044102470d00200b41106a21040c020b200b2802002105200b41086a2802002106200b41046a2802002107200b410c6a2d00002102024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d0b200a4101742209200d2009200d4b1b22094100480d0b02400240200a0d002009102a210d0c010b2003280254200a2009102e210d0b200d450d0a200320093602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200241ff00733a0000024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d0b200a4101742202200d2002200d4b1b22024100480d0b02400240200a0d002002102a210d0c010b2003280254200a2002102e210d0b200d450d0a200320023602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a20043a0000200320063602402003200736023c200320053602382003200341386a200341d0006a108505024020032d00002205411f470d002011200c41106a220c470d010c030b0b20032d0003210220032f0001210920032802042111200329030821140240200b41106a2013460d00200b41106a210403402004410d6a2d00004102460d01200428020421072004280200210602402004280208220a450d00200a410474210b2006210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441106a210402402007450d002006102c0b20042013470d000b0b2002411074210a02402012450d002008102c0b2009200a72210a02402003280258450d002003280254102c0b2000200a3b0001200020053a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021064101210d4101210c41012104410121050c100b20042013460d0003402004410d6a2d00004102460d01200428020421062004280200210502402004280208220a450d00200a410474210b2005210a03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441106a210402402006450d002005102c0b20042013470d000b0b02402012450d002008102c0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d09200a4101742206200c2006200c4b1b22064100480d0902400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d082004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d08200b410174220a200c200a200c4b1b220a4100480d0802400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d072004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021054101210d4101210b4101210c410121044101210641012112410121100c190b2001410c6a2802002107200141086a2802002108200141046a280200210602400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d07200a410174220c200b200c200b4b1b220c4100480d0702400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d062002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41053a0000200341d0006a410c6a4100360200200342013702542003200236025020062007410c6c6a2102410121054100210a4100210b2007210c034002400240200b200a460d00200a21040c010b200a41016a220d200a490d08200a4101742204200d2004200d4b1b22044100480d0802400240200a0d002004102a21050c010b2005200a2004102e21050b2005450d070b2005200b6a200c41807f72200c41ff0071200c410776220d1b3a0000200b41016a210b2004210a200d210c200d0d000b200320043602582003200b36025c200320053602542006210a02402007450d002007410c6c210d4100210b034002402006200b6a220a41046a280200220c4102470d00200a410c6a210a0c020b2003200a280200200c200a41086a280200200341d0006a109005024020032d00002204411f460d0020032f000120032d00034110747221052003290308211420032802042107200a410c6a210c200d200b6b41746a210a02400340200a450d01200a41746a210a200c280204210b200c410c6a210c200b4102470d000b0b02402008450d002006102c0b02402003280258450d002003280254102c0b200020053b0001200020043a0000200041036a20054110763a0000200041086a2014370000200041046a2007360000410021054101210d4101210c410121040c0f0b200d200b410c6a220b470d000b2002210a0b200a410020076b410c6c6a210b024003402006200b460d01200b410c6a210b200a280204210c200a410c6a210a200c4102470d000b0b02402008450d002006102c0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d08200a4101742206200c2006200c4b1b22064100480d0802400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d072004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d07200b410174220a200c200a200c4b1b220a4100480d0702400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d062004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021104101210d4101210b4101210c4101210441012106410121120c170b2001410c6a2802002109200141086a2802002113200141046a280200210602400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d06200a410174220c200b200c200b4b1b220c4100480d0602400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d052002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41043a0000200341d0006a410c6a4100360200200342013702542003200236025020062009410c6c6a2111410121054100210a4100210b2009210c034002400240200b200a460d00200a21040c010b200a41016a220d200a490d07200a4101742204200d2004200d4b1b22044100480d0702400240200a0d002004102a21050c010b2005200a2004102e21050b2005450d060b2005200b6a200c41807f72200c41ff0071200c410776220d1b3a0000200b41016a210b2004210a200d210c200d0d000b200320043602582003200b36025c200320053602542006210a02402009450d002009410c6c21084100210c034002402006200c6a220b41046a28020022044102470d00200b410c6a210a0c020b200b2802002105200b41086a2802002107024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d08200a4101742202200d2002200d4b1b22024100480d0802400240200a0d002002102a210d0c010b2003280254200a2002102e210d0b200d450d07200320023602582003200d3602540b2003200a41016a36025c200d200a6a41f0003a00002003200520042007200341d0006a109005024020032d0000220d411f460d0020032f000120032d00034110747221042003290308211420032802042105200b410c6a210b2008200c6b41746a210a02400340200a450d01200a41746a210a200b280204210c200b410c6a210b200c4102470d000b0b02402013450d002006102c0b02402003280258450d002003280254102c0b200020043b00012000200d3a0000200041036a20044110763a0000200041086a2014370000200041046a2005360000410021044101210d4101210c0c0d0b2008200c410c6a220c470d000b2011210a0b200a410020096b410c6c6a210b024003402006200b460d01200b410c6a210b200a280204210c200a410c6a210a200c4102470d000b0b02402013450d002006102c0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d07200a4101742206200c2006200c4b1b22064100480d0702400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d062004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d06200b410174220a200c200a200c4b1b220a4100480d0602400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d052004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021124101210d4101210b4101210c41012104410121060c150b2001410c6a2802002106200141086a2802002109200141046a280200210802400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d05200a410174220c200b200c200b4b1b220c4100480d0502400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d042002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41033a0000200820064102746a21074100210c4100210a41002105410121042006210b03400240200a2005470d00200c200a41016a220d200c200d4b1b22054100480d0602400240200c0d002005102a21040c010b2004200a2005102e21040b2004450d050b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200c41026a210c200a41016a210a200d210b200d0d000b02402006450d00200821060340200a410174210c2006280200210b03400240200a2005470d00200a41016a220d200a490d08200c200d200c200d4b1b22054100480d0802400240200a0d002005102a21040c010b2004200a2005102e21040b2004450d070b2004200a6a200b41807f72200b41ff0071200b410776220d1b3a0000200c41026a210c200a41016a210a200d210b200d0d000b200641046a22062007470d000b0b02402009450d002008102c0b200241086a2106200241046a2107200a210c03400240024020072802002006280200220b460d002002280200210d0c010b200b41016a220d200b490d06200b4101742208200d2008200d4b1b22084100480d0602400240200b0d002008102a210d0c010b2002280200200b2008102e210d0b200d450d052002200d360200200720083602002006280200210b0b2006200b41016a360200200d200b6a200c41807f72200c41ff0071200c410776220b1b3a0000200b210c200b0d000b02400240200241046a280200220c200241086a280200220b6b200a490d002002280200210c0c010b200b200a6a220d200b490d05200c410174220b200d200b200d4b1b220b4100480d0502400240200c0d00200b102a210c0c010b2002280200200c200b102e210c0b200c450d042002200c360200200241046a200b360200200241086a280200210b0b200241086a200b200a6a360200200c200b6a2004200a10db051a410021064101210d02402005450d002004102c0b4101210b4101210c410121040c130b2001410c6a2802002106200141086a280200210e200141046a280200210f02400240200241046a280200200241086a280200220a460d002002280200210b0c010b200a41016a220b200a490d04200a410174220c200b200c200b4b1b220c4100480d0402400240200a0d00200c102a210b0c010b2002280200200a200c102e210b0b200b450d032002200b360200200241046a200c360200200241086a280200210a0b200241086a200a41016a360200200b200a6a41023a0000200341dc006a41003602002003420137025420032002360250200f200641286c6a21094100210a4100210b2006210c034002400240200a200b460d002003280254210a0c010b200a41016a220d200a490d05200a4101742204200d2004200d4b1b220d4100480d0502400240200a0d00200d102a210a0c010b2003280254200a200d102e210a0b200a450d042003200d3602582003200a3602540b2003200b41016a36025c200a200b6a200c41807f72200c41ff0071200c410776220c1b3a00000240200c450d002003280258210a200328025c210b200c210c0c010b0b200f2105024002402006450d00200f210503402005220a41286a2105200a2d001822134104460d01200a41196a2f0000200a411b6a2d0000411074722110200a41206a2900002114200a411c6a2800002104200a41146a2802002106200a41106a2802002112200a28020c2108200a2802042111200a2802002102200a2802082207210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d08200a410174220d200c200d200c4b1b220d4100480d0802400240200a0d00200d102a210c0c010b2003280254200a200d102e210c0b200c450d072003200d3602582003200c360254200328025c210a0b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280258220b200328025c220a6b2007490d002003280254210b0c010b200a20076a220c200a490d07200b410174220a200c200a200c4b1b220a4100480d0702400240200b0d00200a102a210b0c010b2003280254200b200a102e210b0b200b450d062003200a3602582003200b360254200328025c210a0b2003200a20076a36025c200b200a6a2002200710db051a02402011450d002002102c0b2006210b0340024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d08200a410174220d200c200d200c4b1b220d4100480d0802400240200a0d00200d102a210c0c010b2003280254200a200d102e210c0b200c450d072003200d3602582003200c360254200328025c210a0b2003200a41016a36025c200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b024002402003280258220b200328025c220a6b2006490d002003280254210b0c010b200a20066a220c200a490d07200b410174220a200c200a200c4b1b220a4100480d0702400240200b0d00200a102a210b0c010b2003280254200b200a102e210b0b200b450d062003200a3602582003200b360254200328025c210a0b2003200a20066a36025c200b200a6a2008200610db051a02402012450d002008102c0b02400240024002400240024020130e0400010203000b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0c200a410174220c200b200c200b4b1b220c4100480d0c02400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d0b2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41003a00000340024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0d200a410174220c200b200c200b4b1b220c4100480d0d02400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d0c2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a200441807f72200441ff00712004410776220a1b3a0000200a2104200a0d000c040b0b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0b200a410174220c200b200c200b4b1b220c4100480d0b02400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d0a2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41013a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0b200a410174220c200b200c200b4b1b220c4100480d0b02400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d0a2003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41f0003a0000200320042014a72014422088a7200341d0006a10900520032d0000220a411f460d0220032f000120032d000341107472210d0c030b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0a200a410174220c200b200c200b4b1b220c4100480d0a02400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d092003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41023a0000200320042014a72014422088a7200341d0006a10900520032d0000220a411f460d0120032f000120032d000341107472210d0c020b024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d09200a410174220c200b200c200b4b1b220c4100480d0902400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d082003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41033a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d09200a410174220c200b200c200b4b1b220c4100480d0902400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d082003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a2010417f73220a413f7141c00072200a2010411874411875417f4a1b3a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d09200a410174220c200b200c200b4b1b220c4100480d0902400240200a0d00200c102a210b0c010b2003280254200a200c102e210b0b200b450d082003200c3602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a20104180fe03714100473a00000b20052009470d010c030b0b2003290308211420032802042104024020052009460d000340200541186a2d00004104460d01200541106a280200210b2005410c6a280200210c0240200541046a280200450d002005280200102c0b0240200b450d00200c102c0b200541286a22052009470d000b0b0240200e450d00200f102c0b02402003280258450d002003280254102c0b2000200d3b00012000200a3a0000200041036a200d4110763a0000200041086a2014370000200041046a20043600004100210c4101210d0c090b20052009460d000340200541186a2d00004104460d01200541106a280200210a2005410c6a280200210b0240200541046a280200450d002005280200102c0b0240200a450d00200b102c0b200541286a22052009470d000b0b0240200e450d00200f102c0b20032802582108200328025421022003280250220441086a210d200441046a2105200328025c2207210b0340024002402005280200200d280200220a460d002004280200210c0c010b200a41016a220c200a490d05200a4101742206200c2006200c4b1b22064100480d0502400240200a0d002006102a210c0c010b2004280200200a2006102e210c0b200c450d042004200c36020020052006360200200d280200210a0b200d200a41016a360200200c200a6a200b41807f72200b41ff0071200b410776220a1b3a0000200a210b200a0d000b02400240200441046a280200220b200441086a280200220a6b2007490d002004280200210b0c010b200a20076a220c200a490d04200b410174220a200c200a200c4b1b220a4100480d0402400240200b0d00200a102a210b0c010b2004280200200b200a102e210b0b200b450d032004200b360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200b200a6a2002200710db051a02402008450d002002102c0b410021044101210d4101210b4101210c0c110b20082010460d0003402008410d6a2d00004105460d010240200841046a280200450d002008280200102c0b200841106a22082010470d000b0b0240200e450d00200f102c0b200241086a2106200241046a2107200b210c03400240024020072802002006280200220a460d002002280200210d0c010b200a41016a220d200a490d03200a4101742208200d2008200d4b1b22084100480d0302400240200a0d002008102a210d0c010b2002280200200a2008102e210d0b200d450d022002200d360200200720083602002006280200210a0b2006200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200241046a280200220c200241086a280200220a6b200b490d002002280200210c0c010b200a200b6a220d200a490d02200c410174220a200d200a200d4b1b220a4100480d0202400240200c0d00200a102a210c0c010b2002280200200c200a102e210c0b200c450d012002200c360200200241046a200a360200200241086a280200210a0b200241086a200a200b6a360200200c200a6a2004200b10db051a4100210c4101210d2005450d022004102c0c020b1033000b1035000b4101210b0c0b0b2000200d3b00012000200a3a0000200041036a200d4110763a0000200041086a2014370000200041046a2004360000410021094101210d4101210c410121044101210541012106410121074101210b41012102410121080c080b4101210c200241086a200a41016a3602004100210d200b200a6a41003a0000200341146a2004360200200341106a20053602002003200636020c200320073602082003200836020420032009360200200341d0006a20032002109405200320032900513703382003200341d0006a41086a29000037003f20032d0050220a411f460d082000200a3a000020002003290338370001200041086a200329003f3700000b410121040b410121050b410121060b410121070b4101210b0b410121020b41012108410121090b20012d0000220a410f4b0d18200a0e100a0b0c0d0e0f101112181318141516170a0b4101210b4100210d4101210c0b410121040b410121060b410121120b410121100b410121050b410121070b410121020b410121080b41012109410121130c0f0b200141086a280200450d10200141046a280200102c0c100b200d450d0f0240200141086a280200450d00200141046a280200102c0b200141146a280200450d0f200141106a280200102c0c0f0b02402001410c6a280200220b450d00200141046a280200210a200b410474210b03400240200a41046a280200450d00200a280200102c0b200a41106a210a200b41706a220b0d000b0b200141086a280200450d0e2001280204102c0c0e0b200c450d0d02402001410c6a280200220b450d00200141046a280200210a200b41286c210b03400240200a41046a280200450d00200a280200102c0b0240200a41106a280200450d00200a410c6a280200102c0b200a41286a210a200b41586a220b0d000b0b200141086a280200450d0d2001280204102c0c0d0b200141086a280200450d0c200141046a280200102c0c0c0b2004450d0b200141086a280200450d0b200141046a280200102c0c0b0b2005450d0a200141086a280200450d0a200141046a280200102c0c0a0b2006450d0902402001410c6a280200220a450d00200141046a2802002204200a4104746a2105034002402004280208220b450d002004280200210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441106a210a0240200441046a280200450d002004280200102c0b200a2104200a2005470d000b0b200141086a280200450d092001280204102c0c090b02402001410c6a280200220b450d00200141046a280200210a200b41146c210b03400240200a41046a280200450d00200a280200102c0b200a41146a210a200b416c6a220b0d000b0b200141086a280200450d082001280204102c0c080b2007450d0702402001410c6a280200220a450d00200141046a2802002204200a411c6c6a2105034002402004280204220a450d0002402004410c6a280200220b450d00200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441086a280200450d002004280204102c0b2004411c6a210a0240200441146a280200450d002004280210102c0b200a2104200a2005470d000b0b200141086a280200450d072001280204102c0c070b200b450d0602402001410c6a280200220a450d00200141046a2802002204200a41186c6a210503400240200441046a280200450d002004280200102c0b0240200441146a280200220b450d00200428020c210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441186a210a0240200441106a280200450d00200428020c102c0b200a2104200a2005470d000b0b200141086a280200450d062001280204102c0c060b2002450d05200141046a220a109805200141086a280200450d05200a280200102c0c050b2008450d040240200141046a280200220a450d00200141086a280200450d00200a102c0b0240200141146a280200220a450d0002402001411c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b200141186a280200450d002001280214102c0b200141246a2802002204450d0402402001412c6a280200220a450d002004200a4104746a210503402004220d41106a21040240200d280204220a450d000240200d410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b200d41086a280200450d00200d280204102c0b20042005470d000b0b200141286a280200450d042001280224102c0c040b2009450d030240200141086a280200450d00200141046a280200102c0b0240200141146a280200220a450d00200141186a280200450d00200a102c0b200141246a280200450d03200141206a280200102c0c030b200110f5040c020b410121110b2000411f3a0000024020012d0000220a410f4b0d0002400240024002400240024002400240024002400240024002400240200a0e100001020304050607080e090e0a0b0c0d000b200b450d0e200141086a280200450d0e200141046a280200102c0c0e0b200d450d0d0240200141086a280200450d00200141046a280200102c0b200141146a280200450d0d200141106a280200102c0c0d0b200c450d0c02402001410c6a280200220b450d00200141046a280200210a200b410474210b03400240200a41046a280200450d00200a280200102c0b200a41106a210a200b41706a220b0d000b0b200141086a280200450d0c2001280204102c0c0c0b2004450d0b02402001410c6a280200220b450d00200141046a280200210a200b41286c210b03400240200a41046a280200450d00200a280200102c0b0240200a41106a280200450d00200a410c6a280200102c0b200a41286a210a200b41586a220b0d000b0b200141086a280200450d0b2001280204102c0c0b0b2006450d0a200141086a280200450d0a200141046a280200102c0c0a0b2012450d09200141086a280200450d09200141046a280200102c0c090b2010450d08200141086a280200450d08200141046a280200102c0c080b2005450d0702402001410c6a280200220a450d00200141046a2802002204200a4104746a2105034002402004280208220b450d002004280200210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441106a210a0240200441046a280200450d002004280200102c0b200a2104200a2005470d000b0b200141086a280200450d072001280204102c0c070b2007450d0602402001410c6a280200220b450d00200141046a280200210a200b41146c210b03400240200a41046a280200450d00200a280200102c0b200a41146a210a200b416c6a220b0d000b0b200141086a280200450d062001280204102c0c060b2002450d0502402001410c6a280200220a450d00200141046a2802002204200a411c6c6a2105034002402004280204220a450d0002402004410c6a280200220b450d00200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441086a280200450d002004280204102c0b2004411c6a210a0240200441146a280200450d002004280210102c0b200a2104200a2005470d000b0b200141086a280200450d052001280204102c0c050b2008450d0402402001410c6a280200220a450d00200141046a2802002204200a41186c6a210503400240200441046a280200450d002004280200102c0b0240200441146a280200220b450d00200428020c210a200b410474210b03400240200a2d00004109470d000240200a41046a220d280200220c28020441ffffffff0371450d00200c280200102c200d280200210c0b200c102c0b200a41106a210a200b41706a220b0d000b0b200441186a210a0240200441106a280200450d00200428020c102c0b200a2104200a2005470d000b0b200141086a280200450d042001280204102c0c040b2009450d03200141046a220a109805200141086a280200450d03200a280200102c0c030b2013450d020240200141046a280200220a450d00200141086a280200450d00200a102c0b0240200141146a280200220a450d0002402001411c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b200141186a280200450d002001280214102c0b200141246a2802002204450d0202402001412c6a280200220a450d002004200a4104746a210503402004220d41106a21040240200d280204220a450d000240200d410c6a280200220b450d00200b410c6c210b03400240200a280200220c450d00200a41046a280200450d00200c102c0b200a410c6a210a200b41746a220b0d000b0b200d41086a280200450d00200d280204102c0b20042005470d000b0b200141286a280200450d022001280224102c0c020b2011450d010240200141086a280200450d00200141046a280200102c0b0240200141146a280200220a450d00200141186a280200450d00200a102c0b200141246a280200450d01200141206a280200102c0c010b200110f5040b200341e0006a24000b13002000410136020420004180bdc5003602000b3400200041a3dbc50036020420004100360200200041146a4104360200200041106a41bcbec500360200200041086a42083702000b130020004101360204200041dce7c5003602000b0c00200028020020011084050bc76501037f230041206b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00000eac010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab0100010b200220012802184193ecc50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000cab010b2002200128021841a4ecc500410b2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000caa010b2002200128021841afecc50041032001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca9010b2002200128021841b2ecc50041052001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41b8ecc500106121000ca8010b2002200128021841c8ecc50041042001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41b8ecc500106121000ca7010b2002200128021841ccecc50041022001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41b8ecc500106121000ca6010b2002200128021841ceecc50041042001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca5010b2002200128021841d2ecc50041032001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca4010b2002200128021841d5ecc50041022001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000ca3010b2002200128021841d7ecc50041042001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000ca2010b2002200128021841dbecc50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41e4ecc500106121000ca1010b2002200128021841f4ecc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000ca0010b2002200128021841faecc50041042001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000c9f010b2002200128021841feecc500410c2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041016a36020c20012002410c6a418cedc500106121000c9e010b20022001280218419cedc50041042001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c9d010b2002200128021841a0edc50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c9c010b2002200128021841a6edc50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000c9b010b2002200128021841aeedc50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000c9a010b2002200128021841b6edc50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000c99010b2002200128021841beedc50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000c98010b2002200128021841c7edc50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000c97010b2002200128021841d0edc50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c96010b2002200128021841d7edc50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c95010b2002200128021841deedc50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c94010b2002200128021841e5edc50041072001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c93010b2002200128021841ecedc50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c92010b2002200128021841f5edc50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c91010b2002200128021841feedc500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c90010b200220012802184188eec500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c8f010b200220012802184192eec50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c8e010b20022001280218419beec50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c8d010b2002200128021841a4eec500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c8c010b2002200128021841aeeec500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c8b010b2002200128021841b8eec500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c8a010b2002200128021841c2eec500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c89010b2002200128021841cceec50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c88010b2002200128021841d4eec50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c87010b2002200128021841dceec50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c86010b2002200128021841e4eec50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c85010b2002200128021841eceec50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c84010b2002200128021841f5eec500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c83010b2002200128021841ffeec50041092001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c82010b200220012802184188efc500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c81010b200220012802184192efc500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121012002200041086a36020c20012002410c6a41dcebc500106121000c80010b20022001280218419cefc500410d2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a418cedc500106121000c7f0b2002200128021841a9efc500410a2001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a418cedc500106121000c7e0b2002200128021841b3efc50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41bcefc500106121000c7d0b2002200128021841ccefc50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41d4efc500106121000c7c0b2002200128021841e4efc50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41dcebc500106121000c7b0b2002200128021841ecefc50041082001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41f4efc500106121000c7a0b200220012802184184f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c790b20022001280218418af0c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c780b20022001280218418ff0c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c770b200220012802184194f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c760b20022001280218419af0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c750b2002200128021841a0f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c740b2002200128021841a6f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c730b2002200128021841acf0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c720b2002200128021841b2f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c710b2002200128021841b8f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c700b2002200128021841bef0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6f0b2002200128021841c4f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6e0b2002200128021841caf0c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6d0b2002200128021841cff0c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6c0b2002200128021841d4f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6b0b2002200128021841daf0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c6a0b2002200128021841e0f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c690b2002200128021841e6f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c680b2002200128021841ecf0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c670b2002200128021841f2f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c660b2002200128021841f8f0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c650b2002200128021841fef0c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c640b200220012802184184f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c630b200220012802184189f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c620b20022001280218418ef1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c610b200220012802184193f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c600b200220012802184198f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5f0b20022001280218419df1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5e0b2002200128021841a2f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5d0b2002200128021841a7f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5c0b2002200128021841acf1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5b0b2002200128021841b1f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c5a0b2002200128021841b6f1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c590b2002200128021841bbf1c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c580b2002200128021841c0f1c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c570b2002200128021841c6f1c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c560b2002200128021841ccf1c50041092001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c550b2002200128021841d5f1c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c540b2002200128021841dbf1c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c530b2002200128021841e1f1c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c520b2002200128021841e7f1c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c510b2002200128021841eef1c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c500b2002200128021841f5f1c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4f0b2002200128021841fcf1c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4e0b200220012802184183f2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4d0b200220012802184189f2c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4c0b20022001280218418ef2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4b0b200220012802184194f2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c4a0b20022001280218419af2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c490b2002200128021841a1f2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c480b2002200128021841a8f2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c470b2002200128021841aff2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c460b2002200128021841b6f2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c450b2002200128021841bcf2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c440b2002200128021841c2f2c50041092001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c430b2002200128021841cbf2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c420b2002200128021841d1f2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c410b2002200128021841d7f2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c400b2002200128021841ddf2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3f0b2002200128021841e4f2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3e0b2002200128021841ebf2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3d0b2002200128021841f2f2c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3c0b2002200128021841f9f2c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3b0b2002200128021841fff2c50041052001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c3a0b200220012802184184f3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c390b20022001280218418af3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c380b200220012802184190f3c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c370b200220012802184197f3c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c360b20022001280218419ef3c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c350b2002200128021841a5f3c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c340b2002200128021841acf3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c330b2002200128021841b2f3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c320b2002200128021841b8f3c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c310b2002200128021841bff3c50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c300b2002200128021841c7f3c50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2f0b2002200128021841cff3c500410a2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2e0b2002200128021841d9f3c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2d0b2002200128021841e0f3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2c0b2002200128021841e6f3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2b0b2002200128021841ecf3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c2a0b2002200128021841f2f3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c290b2002200128021841f8f3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c280b2002200128021841fef3c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c270b200220012802184184f4c500410b2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c260b20022001280218418ff4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c250b200220012802184195f4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c240b20022001280218419bf4c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c230b2002200128021841a2f4c50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c220b2002200128021841aaf4c50041082001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c210b2002200128021841b2f4c500410a2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c200b2002200128021841bcf4c50041072001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1f0b2002200128021841c3f4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1e0b2002200128021841c9f4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1d0b2002200128021841cff4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1c0b2002200128021841d5f4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1b0b2002200128021841dbf4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c1a0b2002200128021841e1f4c50041062001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c190b2002200128021841e7f4c500410b2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c180b2002200128021841f2f4c500410a2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c170b2002200128021841fcf4c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c160b200220012802184188f5c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c150b200220012802184194f5c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c140b2002200128021841a0f5c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c130b2002200128021841acf5c500410d2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c120b2002200128021841b9f5c500410d2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c110b2002200128021841c6f5c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c100b2002200128021841d2f5c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0f0b2002200128021841def5c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0e0b2002200128021841eaf5c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0d0b2002200128021841f6f5c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0c0b200220012802184184f6c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0b0b200220012802184192f6c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c0a0b2002200128021841a0f6c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c090b2002200128021841aef6c500410c2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c080b2002200128021841baf6c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c070b2002200128021841c8f6c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c060b2002200128021841d6f6c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c050b2002200128021841e4f6c500410e2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c040b2002200128021841f2f6c500410d2001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c030b2002200128021841fff6c50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c020b200220012802184190f7c50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000c010b2002200128021841a1f7c50041112001411c6a28020028020c1100003a001820022001360210200241003a001920024100360214200241106a21000b20002d00082101024020002802042203450d00200141ff0171210441012101024020040d00024020034101470d0020002d0009450d00200028020022042d00004104710d004101210120042802184198b0c00041012004411c6a28020028020c1100000d010b2000280200220128021841ec94c60041012001411c6a28020028020c11000021010b200020013a00080b200241206a2400200141ff01714100470bbe04020d7f017e230041c0006b22032400200128020022042001280208220541047422066a210720012802042108200421010240024002402005450d00200641706a2109200341306a410172210a200341306a41026a2106200341206a410172220b41076a210c20042101034020012d000021052006200141036a2d00003a00002003200141016a2f00003b01300240200541ac01470d00200141106a21010c020b2003410c6a41026a20062d0000220d3a0000200320032f0130220e3b010c200141046a280200210f200141086a2903002110200a200e3b0000200a41026a200d3a0000200320053a0030200320103703382003200f360234200341206a200341306a20021086052003200b2900003703102003200c290000370017024020032d00202205411f470d00200941706a2109200141106a22012007470d010c030b0b200020053a000020002003290310370001200041086a200329001737000002402009450d00200141106a210103400240024020012d000022054109460d00200541ac01470d010c030b0240200141046a280200220528020441ffffffff0371450d002005280200102c0b2005102c0b200141106a22012007470d000b0b2008450d022004102c0c020b20012007460d0003400240024020012d000022054109460d00200541ac01470d010c030b0240200141046a280200220528020441ffffffff0371450d002005280200102c0b2005102c0b200141106a22012007470d000b0b02402008450d002004102c0b2000411f3a00000b200341c0006a24000bb4c10202097f017e230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae01200441017422062005200620054b1b22064100480dae010240024020040d002006102a21050c010b200228020420042006102e21050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad01200441017422062005200620054b1b22064100480dad010240024020040d002006102a21050c010b200228020420042006102e21050b2005450dac0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490dac01200441017422082005200820054b1b22084100480dac010240024020040d002008102a21050c010b200628020020042008102e21050b2005450dab0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490dac01200441017422082005200820054b1b22084100480dac010240024020040d002008102a21050c010b200628020020042008102e21050b2005450dab0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490dab01200441017422082005200820054b1b22084100480dab010240024020040d002008102a21050c010b200628020020042008102e21050b2005450daa0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490dab01200441017422082005200820054b1b22084100480dab010240024020040d002008102a21050c010b200628020020042008102e21050b2005450daa0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490daa01200441017422082005200820054b1b22084100480daa010240024020040d002008102a21050c010b200628020020042008102e21050b2005450da90120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490daa01200441017422082005200820054b1b22084100480daa010240024020040d002008102a21050c010b200628020020042008102e21050b2005450da90120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da901200441017422062005200620054b1b22064100480da9010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da80120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da801200441017422062005200620054b1b22064100480da8010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da70120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da701200441017422072006200720064b1b22074100480da7010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da8012004410174220a2006200a20064b1b220a4100480da8010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da701200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da601200441017422072006200720064b1b22074100480da6010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da50120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da7012004410174220a2006200a20064b1b220a4100480da7010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210902400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490da501200441017422062005200620054b1b22064100480da5010240024020040d002006102a21050c010b200928020020042006102e21050b2005450da40120022005360204200241086a20063602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a410e3a0000200320012802042204280204220520042802002204200420054102746a20021087052003210420032d0000411f470dab0120012802042802082105200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da6012004410174220a2006200a20064b1b220a4100480da6010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca3010b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da401200441017422062005200620054b1b22064100480da4010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da301200441017422072006200720064b1b22074100480da3010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da20120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da4012004410174220a2006200a20064b1b220a4100480da4010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da201200441017422072006200720064b1b22074100480da2010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da3012004410174220a2006200a20064b1b220a4100480da3010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490da201200441017422062005200620054b1b22064100480da2010240024020040d002006102a21050c010b200928020020042006102e21050b2005450da10120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da101200441017422062005200620054b1b22064100480da1010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da001200441017422062005200620054b1b22064100480da0010240024020040d002006102a21050c010b200228020420042006102e21050b2005450d9f0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9f01200441017422072006200720064b1b22074100480d9f010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9e0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da0012004410174220a2006200a20064b1b220a4100480da0010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9f01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9e01200441017422072006200720064b1b22074100480d9e010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9d0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9f012004410174220a2006200a20064b1b220a4100480d9f010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9e01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9d01200441017422072006200720064b1b22074100480d9d010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9c0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9e012004410174220a2006200a20064b1b220a4100480d9e010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9d01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9c01200441017422072006200720064b1b22074100480d9c010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9b0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9d012004410174220a2006200a20064b1b220a4100480d9d010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9c01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9b01200441017422072006200720064b1b22074100480d9b010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9a0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9c012004410174220a2006200a20064b1b220a4100480d9c010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9b01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a01200441017422082007200820074b1b22084100480d9a010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d990120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b012004410174220b2007200b20074b1b220b4100480d9b010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9a01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b01200441017422092006200920064b1b22094100480d9b010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d9a012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9901200441017422082007200820074b1b22084100480d99010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d980120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a012004410174220b2007200b20074b1b220b4100480d9a010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a01200441017422092006200920064b1b22094100480d9a010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d99012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9801200441017422082007200820074b1b22084100480d98010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d970120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d99012004410174220b2007200b20074b1b220b4100480d99010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9901200441017422092006200920064b1b22094100480d99010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d98012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9701200441017422082007200820074b1b22084100480d97010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d960120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d98012004410174220b2007200b20074b1b220b4100480d98010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9801200441017422092006200920064b1b22094100480d98010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d97012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9601200441017422082007200820074b1b22084100480d96010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d950120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d97012004410174220b2007200b20074b1b220b4100480d97010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9701200441017422092006200920064b1b22094100480d97010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d96012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9501200441017422082007200820074b1b22084100480d95010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d940120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d96012004410174220b2007200b20074b1b220b4100480d96010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9601200441017422092005200920054b1b22094100480d96010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d95012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c93010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9401200441017422082007200820074b1b22084100480d94010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d930120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d95012004410174220b2007200b20074b1b220b4100480d95010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9501200441017422092005200920054b1b22094100480d95010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d94012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9301200441017422082007200820074b1b22084100480d93010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d920120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d94012004410174220b2007200b20074b1b220b4100480d94010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9401200441017422092006200920064b1b22094100480d94010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d93012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9201200441017422082007200820074b1b22084100480d92010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d910120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d93012004410174220b2007200b20074b1b220b4100480d93010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9301200441017422092006200920064b1b22094100480d93010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d92012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9101200441017422082007200820074b1b22084100480d91010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d900120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d92012004410174220b2007200b20074b1b220b4100480d92010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9201200441017422092005200920054b1b22094100480d92010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d91012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c8f010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9001200441017422082007200820074b1b22084100480d90010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8f0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d91012004410174220b2007200b20074b1b220b4100480d91010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9101200441017422092005200920054b1b22094100480d91010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d90012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8f01200441017422082007200820074b1b22084100480d8f010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8e0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d90012004410174220b2007200b20074b1b220b4100480d90010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8f01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9001200441017422092006200920064b1b22094100480d90010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8f012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8e01200441017422082007200820074b1b22084100480d8e010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8d0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8f012004410174220b2007200b20074b1b220b4100480d8f010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8e01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8f01200441017422092006200920064b1b22094100480d8f010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8e012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8d01200441017422082007200820074b1b22084100480d8d010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8c0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8f012004410174220b2007200b20074b1b220b4100480d8f010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8d01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8f01200441017422092006200920064b1b22094100480d8f010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d90012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8d01200441017422082007200820074b1b22084100480d8d010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8e0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8e012004410174220b2007200b20074b1b220b4100480d8e010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8f01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8e01200441017422092006200920064b1b22094100480d8e010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8f012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8c01200441017422082007200820074b1b22084100480d8c010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8d0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8d012004410174220b2007200b20074b1b220b4100480d8d010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8e01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d8d01200441017422092005200920054b1b22094100480d8d010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d8e012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8b01200441017422082007200820074b1b22084100480d8b010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8c0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8c012004410174220b2007200b20074b1b220b4100480d8c010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8d01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8c01200441017422092006200920064b1b22094100480d8c010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8d012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8a01200441017422082007200820074b1b22084100480d8a010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8b0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8b012004410174220b2007200b20074b1b220b4100480d8b010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8c01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d8b01200441017422092005200920054b1b22094100480d8b010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d8c012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c87010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8901200441017422082007200820074b1b22084100480d89010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8a0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8a012004410174220b2007200b20074b1b220b4100480d8a010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8b01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d8a01200441017422092005200920054b1b22094100480d8a010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d8b012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8801200441017422082007200820074b1b22084100480d88010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d890120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d89012004410174220b2007200b20074b1b220b4100480d89010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8a01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8901200441017422092006200920064b1b22094100480d89010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8a012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8701200441017422082007200820074b1b22084100480d87010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d880120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d88012004410174220b2007200b20074b1b220b4100480d88010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8801200441017422092006200920064b1b22094100480d88010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d89012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8601200441017422082007200820074b1b22084100480d86010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d870120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d87012004410174220b2007200b20074b1b220b4100480d87010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8701200441017422092006200920064b1b22094100480d87010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d88012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8501200441017422082007200820074b1b22084100480d85010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d860120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d86012004410174220b2007200b20074b1b220b4100480d86010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8601200441017422092006200920064b1b22094100480d86010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d87012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d8401200441017422082005200820054b1b22084100480d84010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d850120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d8401200441017422082005200820054b1b22084100480d84010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d850120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d8301200441017422082005200820054b1b22084100480d83010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d840120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d8301200441017422082005200820054b1b22084100480d83010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d840120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8201200441017422072005200720054b1b22074100480d82010240024020040d002007102a21050c010b200228020420042007102e21050b2005450d830120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a00002003200620021088052003210420032d0000411f470d87010c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8101200441017422062005200620054b1b22064100480d81010240024020040d002006102a21050c010b200228020420042006102e21050b2005450d820120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c20021089052003210420032d0000411f470d86010c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d8001200441017422082005200820054b1b22084100480d80010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d810120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d8001200541017422042008200420084b1b22044100480d80010240024020050d002004102a21050c010b200628020020052004102e21050b2005450d810120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d7f200441017422072005200720054b1b22074100480d7f0240024020040d002007102a21050c010b200628020020042007102e21050b2005450d800120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d7f200541017422042007200420074b1b22044100480d7f0240024020050d002004102a21050c010b200628020020052004102e21050b2005450d800120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7e200441017422062005200620054b1b22064100480d7e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7d200441017422062005200620054b1b22064100480d7d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7c200441017422062005200620054b1b22064100480d7c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7b200441017422062005200620054b1b22064100480d7b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7a200441017422062005200620054b1b22064100480d7a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d79200441017422062005200620054b1b22064100480d790240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d78200441017422062005200620054b1b22064100480d780240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d77200441017422062005200620054b1b22064100480d770240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d76200441017422062005200620054b1b22064100480d760240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d75200441017422062005200620054b1b22064100480d750240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d74200441017422062005200620054b1b22064100480d740240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d73200441017422062005200620054b1b22064100480d730240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d72200441017422062005200620054b1b22064100480d720240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d71200441017422062005200620054b1b22064100480d710240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d70200441017422062005200620054b1b22064100480d700240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6f200441017422062005200620054b1b22064100480d6f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6e200441017422062005200620054b1b22064100480d6e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6d200441017422062005200620054b1b22064100480d6d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6c200441017422062005200620054b1b22064100480d6c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6b200441017422062005200620054b1b22064100480d6b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6a200441017422062005200620054b1b22064100480d6a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d69200441017422062005200620054b1b22064100480d690240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d68200441017422062005200620054b1b22064100480d680240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d67200441017422062005200620054b1b22064100480d670240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d66200441017422062005200620054b1b22064100480d660240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d65200441017422062005200620054b1b22064100480d650240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d64200441017422062005200620054b1b22064100480d640240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d63200441017422062005200620054b1b22064100480d630240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d62200441017422062005200620054b1b22064100480d620240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d61200441017422062005200620054b1b22064100480d610240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d60200441017422062005200620054b1b22064100480d600240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5f200441017422062005200620054b1b22064100480d5f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5e200441017422062005200620054b1b22064100480d5e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5d200441017422062005200620054b1b22064100480d5d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5c200441017422062005200620054b1b22064100480d5c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5b200441017422062005200620054b1b22064100480d5b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5c200441017422062005200620054b1b22064100480d5c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5b200441017422062005200620054b1b22064100480d5b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5a200441017422062005200620054b1b22064100480d5a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d59200441017422062005200620054b1b22064100480d590240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d58200441017422062005200620054b1b22064100480d580240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d57200441017422062005200620054b1b22064100480d570240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d56200441017422062005200620054b1b22064100480d560240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d55200441017422062005200620054b1b22064100480d550240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d54200441017422062005200620054b1b22064100480d540240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d53200441017422062005200620054b1b22064100480d530240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d52200441017422062005200620054b1b22064100480d520240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d51200441017422062005200620054b1b22064100480d510240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d50200441017422062005200620054b1b22064100480d500240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4f200441017422062005200620054b1b22064100480d4f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4e200441017422062005200620054b1b22064100480d4e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4d200441017422062005200620054b1b22064100480d4d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4c200441017422062005200620054b1b22064100480d4c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4b200441017422062005200620054b1b22064100480d4b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4a200441017422062005200620054b1b22064100480d4a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d49200441017422062005200620054b1b22064100480d490240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d48200441017422062005200620054b1b22064100480d480240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d47200441017422062005200620054b1b22064100480d470240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d46200441017422062005200620054b1b22064100480d460240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d45200441017422062005200620054b1b22064100480d450240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d44200441017422062005200620054b1b22064100480d440240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d43200441017422062005200620054b1b22064100480d430240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d42200441017422062005200620054b1b22064100480d420240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d41200441017422062005200620054b1b22064100480d410240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d40200441017422062005200620054b1b22064100480d400240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3f200441017422062005200620054b1b22064100480d3f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3e200441017422062005200620054b1b22064100480d3e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3d200441017422062005200620054b1b22064100480d3d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3c200441017422062005200620054b1b22064100480d3c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3b200441017422062005200620054b1b22064100480d3b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3a200441017422062005200620054b1b22064100480d3a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d39200441017422062005200620054b1b22064100480d390240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d38200441017422062005200620054b1b22064100480d380240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d37200441017422062005200620054b1b22064100480d370240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d36200441017422062005200620054b1b22064100480d360240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d35200441017422062005200620054b1b22064100480d350240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d34200441017422062005200620054b1b22064100480d340240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d33200441017422062005200620054b1b22064100480d330240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d32200441017422062005200620054b1b22064100480d320240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d31200441017422062005200620054b1b22064100480d310240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d30200441017422062005200620054b1b22064100480d300240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2f200441017422062005200620054b1b22064100480d2f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2e200441017422062005200620054b1b22064100480d2e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2d200441017422062005200620054b1b22064100480d2d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2c200441017422062005200620054b1b22064100480d2c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2b200441017422062005200620054b1b22064100480d2b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2a200441017422062005200620054b1b22064100480d2a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d29200441017422062005200620054b1b22064100480d290240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d28200441017422062005200620054b1b22064100480d280240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d27200441017422062005200620054b1b22064100480d270240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d26200441017422062005200620054b1b22064100480d260240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d25200441017422062005200620054b1b22064100480d250240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d24200441017422062005200620054b1b22064100480d240240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d23200441017422062005200620054b1b22064100480d230240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d22200441017422062005200620054b1b22064100480d220240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d20200441017422062005200620054b1b22064100480d200240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1f200441017422062005200620054b1b22064100480d1f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1e200441017422062005200620054b1b22064100480d1e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1d200441017422062005200620054b1b22064100480d1d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1c200441017422062005200620054b1b22064100480d1c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1b200441017422062005200620054b1b22064100480d1b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1a200441017422062005200620054b1b22064100480d1a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d19200441017422062005200620054b1b22064100480d190240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d18200441017422062005200620054b1b22064100480d180240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d17200441017422062005200620054b1b22064100480d170240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d16200441017422062005200620054b1b22064100480d160240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d15200441017422062005200620054b1b22064100480d150240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d14200441017422062005200620054b1b22064100480d140240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d13200441017422062005200620054b1b22064100480d130240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d12200441017422062005200620054b1b22064100480d120240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d14200441017422062005200620054b1b22064100480d140240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d13200441017422062005200620054b1b22064100480d130240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d12200441017422062005200620054b1b22064100480d120240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d11200441017422062005200620054b1b22064100480d110240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d10200441017422062005200620054b1b22064100480d100240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0f200441017422062005200620054b1b22064100480d0f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0e200441017422062005200620054b1b22064100480d0e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0d200441017422062005200620054b1b22064100480d0d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0c200441017422062005200620054b1b22064100480d0c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0b200441017422062005200620054b1b22064100480d0b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0a200441017422062005200620054b1b22064100480d0a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d09200441017422062005200620054b1b22064100480d090240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411f3a000020012d00004109470d090240200141046a280200220228020441ffffffff0371450d002002280200102c200128020421020b2002102c0c090b1033000b1035000b1035000b1033000b1035000b1033000b1033000b1035000b20002004290200370200200041086a200441086a29020037020020012d00004109470d000240200141046a280200220228020441ffffffff0371450d002002280200102c200128020421020b2002102c0b200341106a24000ba80301057f2004410c6a2105200441086a210602400240034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d03200741017422092008200920084b1b22094100480d030240024020070d002009102a21080c010b200428020420072009102e21080b2008450d022004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b024020022003460d002004410c6a2105200441086a2106034020022802002101034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d05200741017422092008200920084b1b22094100480d050240024020070d002009102a21080c010b200428020420072009102e21080b2008450d042004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b200241046a22022003470d000b0b2000411f3a00000f0b1033000b1035000ba10301067f02400240024020014107752203200141c00071220472452003417f4720044572460d002002410c6a2105200241086a2106034002400240200628020020052802002204460d00200228020421070c010b200441016a22072004490d04200441017422082007200820074b1b22084100480d040240024020040d002008102a21070c010b200228020420042008102e21070b2007450d032002200736020420062008360200200528020021040b2005200441016a360200200720046a200141807f723a0000200341c000712104200321012003410775220721032007200472452007417f4720044572470d000b0b02400240200241086a2802002002410c6a2802002204460d00200228020421030c010b200441016a22032004490d02200441017422072003200720034b1b22074100480d020240024020040d002007102a21030c010b200228020420042007102e21030b2003450d0120022003360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200320046a200141ff00713a00002000411f3a00000f0b1033000b1035000ba50302017e067f02400240024020014207872203502001a7220441c00071452205712003427f52200572460d002002410c6a2106200241086a2107034002400240200728020020062802002205460d00200228020421080c010b200541016a22082005490d04200541017422092008200920084b1b22094100480d040240024020050d002009102a21080c010b200228020420052009102e21080b2008450d032002200836020420072009360200200628020021050b2006200541016a360200200820056a200441807f723a00002003a72104200342078722012103200150200441c00071452205712001427f52200572470d000b0b02400240200241086a2802002002410c6a2802002205460d00200228020421080c010b200541016a22082005490d02200541017422062008200620084b1b22064100480d020240024020050d002006102a21080c010b200228020420052006102e21080b2008450d0120022008360204200241086a20063602002002410c6a28020021050b2002410c6a200541016a360200200820056a200441ff00713a00002000411f3a00000f0b1033000b1035000bdd03010a7f230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a2001108b05024020022802184101470d002000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d000240200741046a220a280200220528020441ffffffff0371450d002005280200102c200a28020021050b2005102c0b200741106a2107200641706a22060d000b0b2008450d042009102c0c040b200220032900003703082002200429000037000f20022d0020210a2002200229000f37001f200220022903083703180240024020072008470d00200741016a220b2007490d032005200b2005200b4b1b220841ffffffff00712008470d032008410474220b4100480d030240024020070d00200b102a21090c010b20092006200b102e21090b2009450d010b200920066a220b200a3a0000200b41016a2002290318370000200b41086a200229001f370000200541026a2105200641106a2106200741016a2107200a41ff01714106460d030c010b0b1033000b1035000b20002009360204200041003602002000410c6a2007360200200041086a20083602000b200241306a24000bedb501020b7f017e230041f0006b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d02200320054f0d0120052003103f000b200241013a0048200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1037200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c630b2001280200220620046a2d000021072001410c6a2208200536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d0020070ec001b802b802010203b80200000000000405060708090a00000000000000000b0c000000000d0e0f101100000012131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901b8020b2000410b3a000420004101360200200041056a20073a00000cbb020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da202200620056a2c00002101200820093602004100210a0240200141004e0d00411921090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410221070cbe020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a1037200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbe020b4102210a410221070cb9020b4103210a410221070cb8020b4101210a0b410221070cb6020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da202200620056a2c00002101200820093602004100210a0240200141004e0d00411921090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410321070cbd020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a1037200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbd020b4102210a410321070cb8020b4103210a410321070cb7020b4101210a0b410321070cb5020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da202200620056a2c00002101200820093602004100210a0240200141004e0d00411921090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410421070cbc020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a1037200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbc020b4102210a410421070cb7020b4103210a410421070cb6020b4101210a0b410421070cb4020b410621070cb3020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cb7020b410721070cb2020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cb6020b410821070cb1020b200241d8006a2001108c054104210a200228025822074101460da201200241e0006a280200210b41002106200228025c210c02400240200241e4006a280200220941027422050d00410021040c010b2005410275220441ffffffff03712004470dd901200441027422034100480dd9012003102a220a450db2020b02402009450d00200941027421032005417c6a2106200a2109200c2105034020092005280200360200200941046a2109200541046a21052003417c6a22030d000b200641027641016a21060b0240200b450d00200c102c0b20022d005c4105470daf022007450daf0220022802640da3010caf020b410a21070caf020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddc012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cb3020b410b21070cae020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddc012003200541016a22044f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b20014120490d01410d210120074110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cb2020b0240024020032004460d00200441016a22012004490dda01200320014f0d0120012003103f000b200241013a0048200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1037200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000cb2020b200620046a2d0000210520082001360200024020050d00410c21074100210a0cae020b200041163a000420004101360200200041056a20053a00000cb1020b410d21070cac020b410e21070cab020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000caf020b410f21070caa020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cae020b411021070ca9020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cad020b411121070ca8020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cac020b411221070ca7020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000cab020b411321070ca6020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddc01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000caa020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9c010b20032001460d9a012001417f460dd8012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9b010b200aad210d411421070ca5020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddd01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca9020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9d010b20032001460d9b012001417f460dd9012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9c010b200aad210d411521070ca4020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dde01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca8020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9e010b20032001460d9c012001417f460dda012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9d010b200aad210d411621070ca3020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddf01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca7020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9f010b20032001460d9d012001417f460ddb012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9e010b200aad210d411721070ca2020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de001200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca6020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca0010b20032001460d9e012001417f460ddc012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9f010b200aad210d411821070ca1020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de101200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca5020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca1010b20032001460d9f012001417f460ddd012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da0010b200aad210d411921070ca0020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de201200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca4020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca2010b20032001460da0012001417f460dde012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da1010b200aad210d411a21070c9f020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de301200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca3020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca3010b20032001460da1012001417f460ddf012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da2010b200aad210d411b21070c9e020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de401200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca2020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca4010b20032001460da2012001417f460de0012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da3010b200aad210d411c21070c9d020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de501200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca1020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca5010b20032001460da3012001417f460de1012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da4010b200aad210d411d21070c9c020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de601200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca0020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca6010b20032001460da4012001417f460de2012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da5010b200aad210d411e21070c9b020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de701200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9f020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca7010b20032001460da5012001417f460de3012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da6010b200aad210d411f21070c9a020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de801200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9e020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca8010b20032001460da6012001417f460de4012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b41202107024020054120490d00410d21012004410f4b0da7010b200aad210d0c99020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de901200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9d020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca9010b20032001460da7012001417f460de5012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da8010b200aad210d412121070c98020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dea01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9c020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caa010b20032001460da8012001417f460de6012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da9010b200aad210d412221070c97020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450deb01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9b020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cab010b20032001460da9012001417f460de7012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daa010b200aad210d412321070c96020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dec01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9a020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cac010b20032001460daa012001417f460de8012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dab010b200aad210d412421070c95020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ded01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c99020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cad010b20032001460dab012001417f460de9012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dac010b200aad210d412521070c94020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dee01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c98020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cae010b20032001460dac012001417f460dea012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dad010b200aad210d412621070c93020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450def01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c97020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caf010b20032001460dad012001417f460deb012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dae010b200aad210d412721070c92020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df001200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c96020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb0010b20032001460dae012001417f460dec012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daf010b200aad210d412821070c91020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df101200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c95020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb1010b20032001460daf012001417f460ded012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db0010b200aad210d412921070c90020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df201200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c94020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb2010b20032001460db0012001417f460dee012003200141016a2207490d8e02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db1010b200aad210d412a21070c8f020b0240024020032005460d00200441026a21012005417f460def01200320014f0d0120012003103f000b200241013a0048200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1037200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c93020b200620056a2d0000210920082001360200024020090d00412b21074100210a0c8f020b200041153a000420004101360200200041056a20093a00000c92020b0240024020032005460d00200441026a21012005417f460def01200320014f0d0120012003103f000b200241013a0048200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a1037200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c92020b200620056a2d0000210920082001360200024020090d00412c21074100210a0c8e020b200041153a000420004101360200200041056a20093a00000c91020b41002101410021090240024002400340410d210a2001411f4b0d010240024020032005460d002005417f460df3012003200541016a22074f0d01200541016a2003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10374105210a0c020b200620056a2c0000210420082007360200200441ff00712001411f71742009722109200141076a21012007210520044100480d000b200441c00071210502402001411f4b0d0020050d020b0240024020014120490d0020050d010b200441ff01714108490d0320014120490d032005450d010c030b20044180017241ff017141f7014b0d020b2000200a36020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c92020b2009417f2001411f71747221090b412d21070c8c020b4200210d4100210102400240024002400340410e21072001413f4b0d010240024020032005460d002005417f460df4012003200541016a22094f0d01200541016a2003103f000b200241013a0008200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241086a360238200241286a200241d8006a10372002290328210d20022802302101410521070c030b200620056a2d0000210420082009360200200441ff0071220aad2001413f71ad86200d84210d200141076a210120092105200441187441187522094100480d000b200941c00071210502402001413f4b0d0020050d030b02400240200141c000490d0020050d010b200141c000490d0420090d010c040b200a41ff00460d030b0b200020073a0004200020022f00183b000520004101360200200041106a2001360200200041086a200d370200200041076a2002411a6a2d00003a00000c91020b200d427f2001413f71ad8684210d0b412e21070c8b020b02400240200320056b4104490d00200441056a21012005417b4b0def01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a103720004281808080d000370300200041086a2002290328370200200041106a200241286a41086a2802003602000c8f020b200620056a280000210920082001360200412f21070c8a020b02400240200320056b4108490d00200441096a2101200541774b0def01200320014f0d0120012003103f000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10372002290328210d200041106a2002280230360200200041086a200d37020020004281808080d0003703000c8e020b200620056a290000210d20082001360200413021070c89020b413121070c88020b413221070c87020b413321070c86020b413421070c85020b413521070c84020b413621070c83020b413721070c82020b413821070c81020b413921070c80020b413a21070cff010b413b21070cfe010b413c21070cfd010b413d21070cfc010b413e21070cfb010b413f21070cfa010b41c00021070cf9010b41c10021070cf8010b41c20021070cf7010b41c30021070cf6010b41c40021070cf5010b41c50021070cf4010b41c60021070cf3010b41c70021070cf2010b41c80021070cf1010b41c90021070cf0010b41ca0021070cef010b41cb0021070cee010b41cc0021070ced010b41cd0021070cec010b41ce0021070ceb010b41cf0021070cea010b41d00021070ce9010b41d10021070ce8010b41d20021070ce7010b41d30021070ce6010b41d40021070ce5010b41d50021070ce4010b41d60021070ce3010b41d70021070ce2010b41d80021070ce1010b41d90021070ce0010b41da0021070cdf010b41db0021070cde010b41dc0021070cdd010b41dd0021070cdc010b41de0021070cdb010b41df0021070cda010b41e00021070cd9010b41e10021070cd8010b41e20021070cd7010b41e30021070cd6010b41e40021070cd5010b41e50021070cd4010b41e60021070cd3010b41e70021070cd2010b41e80021070cd1010b41e90021070cd0010b41ea0021070ccf010b41eb0021070cce010b41ec0021070ccd010b41ed0021070ccc010b41ee0021070ccb010b41ef0021070cca010b41f00021070cc9010b41f10021070cc8010b41f20021070cc7010b41f30021070cc6010b41f40021070cc5010b41f50021070cc4010b41f60021070cc3010b41f70021070cc2010b41f80021070cc1010b41f90021070cc0010b41fa0021070cbf010b41fb0021070cbe010b41fc0021070cbd010b41fd0021070cbc010b41fe0021070cbb010b41ff0021070cba010b41800121070cb9010b41810121070cb8010b41820121070cb7010b41830121070cb6010b41840121070cb5010b41850121070cb4010b41860121070cb3010b41870121070cb2010b41880121070cb1010b41890121070cb0010b418a0121070caf010b418b0121070cae010b418c0121070cad010b418d0121070cac010b418e0121070cab010b418f0121070caa010b41900121070ca9010b41910121070ca8010b41920121070ca7010b41930121070ca6010b41940121070ca5010b41950121070ca4010b41960121070ca3010b41970121070ca2010b41980121070ca1010b41990121070ca0010b419a0121070c9f010b419b0121070c9e010b419c0121070c9d010b419d0121070c9c010b419e0121070c9b010b419f0121070c9a010b41a00121070c99010b41a10121070c98010b41a20121070c97010b41a30121070c96010b41a40121070c95010b41a50121070c94010b41a60121070c93010b41a70121070c92010b41a80121070c91010b41a90121070c90010b41aa0121070c8f010b41ab0121070c8e010b200041013602002000200241d8006a41047222012902003702042000410c6a200141086a2902003702000c91010b2002280260102c0c8b010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c8e010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c8c010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c8a010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c88010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c86010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c84010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c82010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c80010b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c7e0b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c7c0b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c7a0b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c780b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c760b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c740b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c720b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c700b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c6e0b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c6c0b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c6a0b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c680b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c660b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c640b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a2802003602000c620b417f20051047000b417f20091047000b417f20091047000b417f20091047000b417f200541016a1047000b417f200541016a1047000b1035000b417f200541016a1047000b417f200541016a1047000b417f20011047000b417f200541016a1047000b417f200541016a1047000b417f200541016a1047000b417f200541016a1047000b417f200541016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f200141016a1047000b417f20011047000b417f20011047000b417f200541016a1047000b417f200541016a1047000b200520011047000b200520011047000b20092003103f000b20092003103f000b20092003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b200141016a2003103f000b0240024002400240024020042006460d0020042006490d01024020060d00024020040d004104210a0c020b200a102c4104210a0c010b200a20044102742006410274102e220a450d060b4100210941002104034002402009411f4d0d00410f21010c090b20012802082207200128020c2205460d07200541016a22032005490d0220072003490d03200128020020056a2d0000210520082003360200200541ff00712009411f71742004722104200941076a21092005418001710d000b20094120490d03410d21012005410f4b0d070c030b41b3c7c500412441acfec5001036000b417f20031047000b20032007103f000b410c102a2209450d0120092004360208200920063602042009200a360200410921070b20004100360200200041106a200d3703002000410c6a2009360200200041096a200a3a0000200041086a20073a00000c030b1033000b200241013a0018200241ec006a41013602002002420137025c200241f0f7c5003602582002412b36023c2002200241386a3602682002200241186a360238200241286a200241d8006a1037410521010b2000200136020420004101360200200041086a2002290328370200200041106a200241286a41086a280200360200200641ffffffff0371450d00200a102c0b200241f0006a24000bd20703067f017e067f230041d0006b220224004100210341002104024002400240024002400240024002400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005103f000b200241013a0027200241cc006a41013602002002420137023c200241f0f7c5003602382002412b36021c2002200241186a3602482002200241276a360218200241286a200241386a1037410521030c020b200128020020066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b200241086a41086a200241286a41086a280200220136020020022002290328220837030820002003360204200041086a2008370200200041106a2001360200200041013602000c0a0b20024100360210200242043703082004450d0841042109410021034100210a03402003210b200a220c41016a210a410021034100210503402003411f4b0d04024002402001280208220d200128020c2206460d00200641016a22072006490d05200d20074f0d012007200d103f000b2002200b36020c2002200c360210200241013a0027200241cc006a41013602002002420137023c200241f0f7c5003602382002412b36021c2002200241186a3602482002200241276a360218200241286a200241386a103720022802282103200228022c2106200228023021074100210e410521010c090b200128020020066a2d000021062001200736020c200641ff00712003411f71742005722105200341076a21032006418001710d000b024020034120490d002006410f4d0d002002200b36020c2002200c360210410d21010c070b02400240200c200b460d00200b2103200c210b0c010b200b41016a2203200b490d06200b41017422062003200620034b1b220341ffffffff03712003470d06200341027422064100480d0602400240200b0d002006102a21090c010b2009200b4102742006102e21090b2009450d05200220093602080b2005410876210e2009200b4102746a2005360200200a2004460d080c000b0b417f20071047000b417f20071047000b2002200b36020c2002200c360210410f21010c020b1033000b1035000b0b20004101360200200041106a20073602002000410c6a2006360200200041086a20033602002000200e410874200172360204200b450d022009102c0c020b2002200336020c2002200a3602100b20002002290308370204200041003602002000410c6a200241106a2802003602000b200241d0006a24000bb4c10202097f017e230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae01200441017422062005200620054b1b22064100480dae010240024020040d002006102a21050c010b200228020420042006102e21050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad01200441017422062005200620054b1b22064100480dad010240024020040d002006102a21050c010b200228020420042006102e21050b2005450dac0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490dac01200441017422082005200820054b1b22084100480dac010240024020040d002008102a21050c010b200628020020042008102e21050b2005450dab0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490dac01200441017422082005200820054b1b22084100480dac010240024020040d002008102a21050c010b200628020020042008102e21050b2005450dab0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490dab01200441017422082005200820054b1b22084100480dab010240024020040d002008102a21050c010b200628020020042008102e21050b2005450daa0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490dab01200441017422082005200820054b1b22084100480dab010240024020040d002008102a21050c010b200628020020042008102e21050b2005450daa0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490daa01200441017422082005200820054b1b22084100480daa010240024020040d002008102a21050c010b200628020020042008102e21050b2005450da90120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490daa01200441017422082005200820054b1b22084100480daa010240024020040d002008102a21050c010b200628020020042008102e21050b2005450da90120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da901200441017422062005200620054b1b22064100480da9010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da80120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da801200441017422062005200620054b1b22064100480da8010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da70120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da701200441017422072006200720064b1b22074100480da7010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da8012004410174220a2006200a20064b1b220a4100480da8010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da701200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da601200441017422072006200720064b1b22074100480da6010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da50120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da7012004410174220a2006200a20064b1b220a4100480da7010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210902400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490da501200441017422062005200620054b1b22064100480da5010240024020040d002006102a21050c010b200928020020042006102e21050b2005450da40120022005360204200241086a20063602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a410e3a0000200320012802042204280204220520042802002204200420054102746a20021087052003210420032d0000411f470dab0120012802042802082105200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da6012004410174220a2006200a20064b1b220a4100480da6010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca3010b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da401200441017422062005200620054b1b22064100480da4010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da301200441017422072006200720064b1b22074100480da3010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da20120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da4012004410174220a2006200a20064b1b220a4100480da4010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490da201200441017422072006200720064b1b22074100480da2010240024020040d002007102a21060c010b200928020020042007102e21060b2006450da10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da3012004410174220a2006200a20064b1b220a4100480da3010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450da201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490da201200441017422062005200620054b1b22064100480da2010240024020040d002006102a21050c010b200928020020042006102e21050b2005450da10120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da101200441017422062005200620054b1b22064100480da1010240024020040d002006102a21050c010b200228020420042006102e21050b2005450da00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da001200441017422062005200620054b1b22064100480da0010240024020040d002006102a21050c010b200228020420042006102e21050b2005450d9f0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9f01200441017422072006200720064b1b22074100480d9f010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9e0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490da0012004410174220a2006200a20064b1b220a4100480da0010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9f01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9e01200441017422072006200720064b1b22074100480d9e010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9d0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9f012004410174220a2006200a20064b1b220a4100480d9f010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9e01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9d01200441017422072006200720064b1b22074100480d9d010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9c0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9e012004410174220a2006200a20064b1b220a4100480d9e010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9d01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9c01200441017422072006200720064b1b22074100480d9c010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9b0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9d012004410174220a2006200a20064b1b220a4100480d9d010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9c01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490d9b01200441017422072006200720064b1b22074100480d9b010240024020040d002007102a21060c010b200928020020042007102e21060b2006450d9a0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490d9c012004410174220a2006200a20064b1b220a4100480d9c010240024020040d00200a102a21060c010b20092802002004200a102e21060b2006450d9b01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a01200441017422082007200820074b1b22084100480d9a010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d990120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b012004410174220b2007200b20074b1b220b4100480d9b010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9a01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b01200441017422092006200920064b1b22094100480d9b010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d9a012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9901200441017422082007200820074b1b22084100480d99010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d980120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a012004410174220b2007200b20074b1b220b4100480d9a010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a01200441017422092006200920064b1b22094100480d9a010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d99012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9801200441017422082007200820074b1b22084100480d98010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d970120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d99012004410174220b2007200b20074b1b220b4100480d99010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9901200441017422092006200920064b1b22094100480d99010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d98012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9701200441017422082007200820074b1b22084100480d97010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d960120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d98012004410174220b2007200b20074b1b220b4100480d98010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9801200441017422092006200920064b1b22094100480d98010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d97012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9601200441017422082007200820074b1b22084100480d96010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d950120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d97012004410174220b2007200b20074b1b220b4100480d97010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9701200441017422092006200920064b1b22094100480d97010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d96012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9501200441017422082007200820074b1b22084100480d95010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d940120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d96012004410174220b2007200b20074b1b220b4100480d96010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9601200441017422092005200920054b1b22094100480d96010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d95012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c93010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9401200441017422082007200820074b1b22084100480d94010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d930120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d95012004410174220b2007200b20074b1b220b4100480d95010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9501200441017422092005200920054b1b22094100480d95010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d94012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9301200441017422082007200820074b1b22084100480d93010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d920120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d94012004410174220b2007200b20074b1b220b4100480d94010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9401200441017422092006200920064b1b22094100480d94010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d93012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9201200441017422082007200820074b1b22084100480d92010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d910120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d93012004410174220b2007200b20074b1b220b4100480d93010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9301200441017422092006200920064b1b22094100480d93010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d92012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9101200441017422082007200820074b1b22084100480d91010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d900120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d92012004410174220b2007200b20074b1b220b4100480d92010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9201200441017422092005200920054b1b22094100480d92010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d91012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c8f010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9001200441017422082007200820074b1b22084100480d90010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8f0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d91012004410174220b2007200b20074b1b220b4100480d91010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d9001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9101200441017422092005200920054b1b22094100480d91010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d90012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8f01200441017422082007200820074b1b22084100480d8f010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8e0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d90012004410174220b2007200b20074b1b220b4100480d90010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8f01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9001200441017422092006200920064b1b22094100480d90010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8f012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8e01200441017422082007200820074b1b22084100480d8e010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8d0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8f012004410174220b2007200b20074b1b220b4100480d8f010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8e01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8f01200441017422092006200920064b1b22094100480d8f010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8e012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8d01200441017422082007200820074b1b22084100480d8d010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8c0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8f012004410174220b2007200b20074b1b220b4100480d8f010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8d01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8f01200441017422092006200920064b1b22094100480d8f010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d90012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8d01200441017422082007200820074b1b22084100480d8d010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8e0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8e012004410174220b2007200b20074b1b220b4100480d8e010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8f01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8e01200441017422092006200920064b1b22094100480d8e010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8f012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8c01200441017422082007200820074b1b22084100480d8c010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8d0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8d012004410174220b2007200b20074b1b220b4100480d8d010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8e01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d8d01200441017422092005200920054b1b22094100480d8d010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d8e012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8b01200441017422082007200820074b1b22084100480d8b010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8c0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8c012004410174220b2007200b20074b1b220b4100480d8c010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8d01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8c01200441017422092006200920064b1b22094100480d8c010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8d012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8a01200441017422082007200820074b1b22084100480d8a010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8b0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8b012004410174220b2007200b20074b1b220b4100480d8b010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8c01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d8b01200441017422092005200920054b1b22094100480d8b010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d8c012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c87010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8901200441017422082007200820074b1b22084100480d89010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d8a0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d8a012004410174220b2007200b20074b1b220b4100480d8a010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8b01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d8a01200441017422092005200920054b1b22094100480d8a010240024020040d002009102a21050c010b200a28020020042009102e21050b2005450d8b012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8801200441017422082007200820074b1b22084100480d88010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d890120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d89012004410174220b2007200b20074b1b220b4100480d89010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8a01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8901200441017422092006200920064b1b22094100480d89010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d8a012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8701200441017422082007200820074b1b22084100480d87010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d880120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d88012004410174220b2007200b20074b1b220b4100480d88010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8801200441017422092006200920064b1b22094100480d88010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d89012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8601200441017422082007200820074b1b22084100480d86010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d870120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d87012004410174220b2007200b20074b1b220b4100480d87010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8701200441017422092006200920064b1b22094100480d87010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d88012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d8501200441017422082007200820074b1b22084100480d85010240024020040d002008102a21070c010b200a28020020042008102e21070b2007450d860120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d86012004410174220b2007200b20074b1b220b4100480d86010240024020040d00200b102a21070c010b200a2802002004200b102e21070b2007450d8701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d8601200441017422092006200920064b1b22094100480d86010240024020040d002009102a21060c010b200a28020020042009102e21060b2006450d87012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d8401200441017422082005200820054b1b22084100480d84010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d850120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d8401200441017422082005200820054b1b22084100480d84010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d850120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d8301200441017422082005200820054b1b22084100480d83010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d840120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d8301200441017422082005200820054b1b22084100480d83010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d840120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8201200441017422072005200720054b1b22074100480d82010240024020040d002007102a21050c010b200228020420042007102e21050b2005450d830120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a00002003200620021088052003210420032d0000411f470d87010c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8101200441017422062005200620054b1b22064100480d81010240024020040d002006102a21050c010b200228020420042006102e21050b2005450d820120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c20021089052003210420032d0000411f470d86010c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d8001200441017422082005200820054b1b22084100480d80010240024020040d002008102a21050c010b200628020020042008102e21050b2005450d810120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d8001200541017422042008200420084b1b22044100480d80010240024020050d002004102a21050c010b200628020020052004102e21050b2005450d810120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d7f200441017422072005200720054b1b22074100480d7f0240024020040d002007102a21050c010b200628020020042007102e21050b2005450d800120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d7f200541017422042007200420074b1b22044100480d7f0240024020050d002004102a21050c010b200628020020052004102e21050b2005450d800120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7e200441017422062005200620054b1b22064100480d7e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7d200441017422062005200620054b1b22064100480d7d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7c200441017422062005200620054b1b22064100480d7c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7b200441017422062005200620054b1b22064100480d7b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d7a200441017422062005200620054b1b22064100480d7a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d79200441017422062005200620054b1b22064100480d790240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d78200441017422062005200620054b1b22064100480d780240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d77200441017422062005200620054b1b22064100480d770240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d76200441017422062005200620054b1b22064100480d760240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d75200441017422062005200620054b1b22064100480d750240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d74200441017422062005200620054b1b22064100480d740240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d73200441017422062005200620054b1b22064100480d730240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d72200441017422062005200620054b1b22064100480d720240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d71200441017422062005200620054b1b22064100480d710240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d70200441017422062005200620054b1b22064100480d700240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6f200441017422062005200620054b1b22064100480d6f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d7020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6e200441017422062005200620054b1b22064100480d6e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6d200441017422062005200620054b1b22064100480d6d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6c200441017422062005200620054b1b22064100480d6c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6b200441017422062005200620054b1b22064100480d6b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d6a200441017422062005200620054b1b22064100480d6a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d69200441017422062005200620054b1b22064100480d690240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d68200441017422062005200620054b1b22064100480d680240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d67200441017422062005200620054b1b22064100480d670240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d66200441017422062005200620054b1b22064100480d660240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d65200441017422062005200620054b1b22064100480d650240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d64200441017422062005200620054b1b22064100480d640240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d63200441017422062005200620054b1b22064100480d630240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d62200441017422062005200620054b1b22064100480d620240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d61200441017422062005200620054b1b22064100480d610240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d60200441017422062005200620054b1b22064100480d600240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5f200441017422062005200620054b1b22064100480d5f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d6020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5e200441017422062005200620054b1b22064100480d5e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5d200441017422062005200620054b1b22064100480d5d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5c200441017422062005200620054b1b22064100480d5c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5b200441017422062005200620054b1b22064100480d5b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5c200441017422062005200620054b1b22064100480d5c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5b200441017422062005200620054b1b22064100480d5b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d5a200441017422062005200620054b1b22064100480d5a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d59200441017422062005200620054b1b22064100480d590240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d58200441017422062005200620054b1b22064100480d580240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d57200441017422062005200620054b1b22064100480d570240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d56200441017422062005200620054b1b22064100480d560240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d55200441017422062005200620054b1b22064100480d550240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d54200441017422062005200620054b1b22064100480d540240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d53200441017422062005200620054b1b22064100480d530240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d52200441017422062005200620054b1b22064100480d520240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d51200441017422062005200620054b1b22064100480d510240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d50200441017422062005200620054b1b22064100480d500240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4f200441017422062005200620054b1b22064100480d4f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d5020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4e200441017422062005200620054b1b22064100480d4e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4d200441017422062005200620054b1b22064100480d4d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4c200441017422062005200620054b1b22064100480d4c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4b200441017422062005200620054b1b22064100480d4b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d4a200441017422062005200620054b1b22064100480d4a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d49200441017422062005200620054b1b22064100480d490240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d48200441017422062005200620054b1b22064100480d480240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d47200441017422062005200620054b1b22064100480d470240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d46200441017422062005200620054b1b22064100480d460240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d45200441017422062005200620054b1b22064100480d450240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d44200441017422062005200620054b1b22064100480d440240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d43200441017422062005200620054b1b22064100480d430240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d42200441017422062005200620054b1b22064100480d420240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d41200441017422062005200620054b1b22064100480d410240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d40200441017422062005200620054b1b22064100480d400240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3f200441017422062005200620054b1b22064100480d3f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d4020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3e200441017422062005200620054b1b22064100480d3e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3d200441017422062005200620054b1b22064100480d3d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3c200441017422062005200620054b1b22064100480d3c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3b200441017422062005200620054b1b22064100480d3b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d3a200441017422062005200620054b1b22064100480d3a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d39200441017422062005200620054b1b22064100480d390240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d38200441017422062005200620054b1b22064100480d380240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d37200441017422062005200620054b1b22064100480d370240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d36200441017422062005200620054b1b22064100480d360240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d35200441017422062005200620054b1b22064100480d350240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d34200441017422062005200620054b1b22064100480d340240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d33200441017422062005200620054b1b22064100480d330240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d32200441017422062005200620054b1b22064100480d320240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d31200441017422062005200620054b1b22064100480d310240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d30200441017422062005200620054b1b22064100480d300240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2f200441017422062005200620054b1b22064100480d2f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d3020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2e200441017422062005200620054b1b22064100480d2e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2d200441017422062005200620054b1b22064100480d2d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2c200441017422062005200620054b1b22064100480d2c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2b200441017422062005200620054b1b22064100480d2b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d2a200441017422062005200620054b1b22064100480d2a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d29200441017422062005200620054b1b22064100480d290240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d28200441017422062005200620054b1b22064100480d280240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d27200441017422062005200620054b1b22064100480d270240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d26200441017422062005200620054b1b22064100480d260240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d25200441017422062005200620054b1b22064100480d250240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d24200441017422062005200620054b1b22064100480d240240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d23200441017422062005200620054b1b22064100480d230240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d22200441017422062005200620054b1b22064100480d220240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d21200441017422062005200620054b1b22064100480d210240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d20200441017422062005200620054b1b22064100480d200240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1f200441017422062005200620054b1b22064100480d1f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d2020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1e200441017422062005200620054b1b22064100480d1e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1d200441017422062005200620054b1b22064100480d1d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1c200441017422062005200620054b1b22064100480d1c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1b200441017422062005200620054b1b22064100480d1b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d1a200441017422062005200620054b1b22064100480d1a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d19200441017422062005200620054b1b22064100480d190240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d18200441017422062005200620054b1b22064100480d180240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d17200441017422062005200620054b1b22064100480d170240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d16200441017422062005200620054b1b22064100480d160240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1720022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d15200441017422062005200620054b1b22064100480d150240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1620022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d14200441017422062005200620054b1b22064100480d140240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1520022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d13200441017422062005200620054b1b22064100480d130240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1420022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d12200441017422062005200620054b1b22064100480d120240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1320022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d14200441017422062005200620054b1b22064100480d140240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d13200441017422062005200620054b1b22064100480d130240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1220022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d12200441017422062005200620054b1b22064100480d120240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d11200441017422062005200620054b1b22064100480d110240024020040d002006102a21050c010b200228020420042006102e21050b2005450d1020022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d10200441017422062005200620054b1b22064100480d100240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0f20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0f200441017422062005200620054b1b22064100480d0f0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0e20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0e200441017422062005200620054b1b22064100480d0e0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0d20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0d200441017422062005200620054b1b22064100480d0d0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0c20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0c200441017422062005200620054b1b22064100480d0c0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0b20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0b200441017422062005200620054b1b22064100480d0b0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0a20022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d0a200441017422062005200620054b1b22064100480d0a0240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0920022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d09200441017422062005200620054b1b22064100480d090240024020040d002006102a21050c010b200228020420042006102e21050b2005450d0820022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411f3a000020012d00004109470d090240200141046a280200220228020441ffffffff0371450d002002280200102c200128020421020b2002102c0c090b1033000b1035000b1035000b1033000b1035000b1033000b1033000b1035000b20002004290200370200200041086a200441086a29020037020020012d00004109470d000240200141046a280200220228020441ffffffff0371450d002002280200102c200128020421020b2002102c0b200341106a24000b8207010b7f230041d0086b22022400410021034100210402400240024002400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005103f000b200241013a0089082002411c6a41013602002002420137020c200241f0f7c5003602082002412b36029c08200220024198086a360218200220024189086a36029808200241b8086a200241086a1037410521030c020b2001280200220820066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b2000200336020420004101360200200041086a20022903b808370200200041106a200241b8086a41086a2802003602000c060b024020040d002000428080808010370200200041086a42003702000c060b200241086a410041800810da051a41002106410021094101210a4100210b034002400240200520076b2004200b6b22034180082003418008491b2203490d00200720036a220c2007490d042005200c4f0d01200c2005103f000b200241013a00a708200241cc086a4101360200200242013702bc08200241f0f7c5003602b8082002412b36029c08200220024198086a3602c8082002200241a7086a36029808200241a8086a200241b8086a103720024194086a200241b0086a280200360000200220022903a80837008c08200041053a000420002002290089083700052000410c6a20024190086a290000370000200041013602002009450d07200a102c0c070b200241086a200820076a200310db051a2001200c36020c02400240200920066b2003490d00200620036a210c0c010b200620036a220c2006490d0520094101742207200c2007200c4b1b22074100480d050240024020090d002007102a210a0c010b200a20092007102e210a0b200a450d04200721090b200a20066a200241086a200310db051a20042003200b6a220b4d0d05200128020c21072001280208210520012802002108200c21060c000b0b417f20071047000b2007200c1047000b1033000b1035000b200241086a200a200c1058024020022802084101470d0002402009450d00200a102c0b200041083a0004200041013602000c010b2000200a3602042000410c6a200c360200200041086a2009360200200041003602000b200241d0086a24000b1500200120002802002200280200200028020810480bb30401067f200441046a21050240024002400240200441086a2802002004410c6a2802002206460d00200528020021070c010b200641016a22072006490d02200641017422082007200820074b1b22084100480d020240024020060d002008102a21070c010b200528020020062008102e21070b2007450d0120042007360204200441086a20083602002004410c6a28020021060b2004410c6a2208200641016a360200200720066a20024101463a0000200441086a2109034002400240200928020020082802002206460d00200528020021070c010b200641016a22072006490d032006410174220a2007200a20074b1b220a4100480d030240024020060d00200a102a21070c010b20052802002006200a102e21070b2007450d02200420073602042009200a360200200828020021060b2008200641016a360200200720066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2107200441086a2108034002400240200828020020072802002206460d00200528020021010c010b200641016a22012006490d04200641017422092001200920014b1b22094100480d040240024020060d002009102a21010c010b200528020020062009102e21010b2001450d032004200136020420082009360200200728020021060b2007200641016a360200200120066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411f3a00000f0b1033000b1035000bb007010a7f230041d0006b2202240002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d02200320054f0d0120052003103f000b200241013a001f200241cc006a41013602002002420137023c200241f0f7c5003602382002412b3602342002200241306a36024820022002411f6a360230200241206a200241386a10372002411b6a200241286a28020036000020022002290320370013200220022900103703002002200241176a290000370007200041053a0004200020022903003700052000410c6a2002290007370000200041013602000c040b2001280200220620046a2d000021072001200536020c024020074102490d00200041173a000420004101360200200041056a20073a00000c040b410120036b2108200441026a2104410021054100210902400240034002402005411f4d0d00410f21050c020b02400240200820046a4102460d002004450d06200320044f0d0120042003103f000b200241013a0000200241cc006a41013602002002420137023c200241f0f7c5003602382002412b3602342002200241306a36024820022002360230200241106a200241386a1037410521050c020b200620046a417f6a2d0000210a2001200436020c200a41ff00712005411f71742009722109200441016a2104200541076a2105200a418001710d000b20054120490d01410d2105200a4110490d010b2000200536020420004101360200200041086a2002290310370200200041106a200241106a41086a2802003602000c040b4100210502402007410171450d002004417f6a2104410021054100210b02400240034002402005411f4d0d00410f21040c020b0240024020032004460d002004417f460d082003200441016a22084f0d01200441016a2003103f000b200241013a0000200241cc006a41013602002002420137023c200241f0f7c5003602382002412b3602342002200241306a36024820022002360230200241106a200241386a1037410521040c020b200620046a2d0000210a2001200836020c200a41ff00712005411f7174200b72210b200541076a210520082104200a418001710d000b20054120490d01410d2104200a4110490d010b2000200436020420004101360200200041086a2002290310370200200041106a200241106a41086a2802003602000c050b410121050b20002009360204200041003602002000410c6a200b360200200041086a20053602000c030b417f20051047000b417f20041047000b417f200441016a1047000b200241d0006a24000bee0201067f230041c0006b2202240041002103410021040240024003400240024002402003411f4b0d002001280204220520012802082206460d01200641016a22072006490d04200520074f0d0220072005103f000b200041013602002000410f3a00040c040b200241013a000f200241346a410136020020024201370224200241f0f7c5003602202002412b36023c2002200241386a36023020022002410f6a360238200241106a200241206a10372002410b6a200241186a28020036000020022002290310370003200041053a0004200020022900003700052000410c6a200241076a290000370000200041013602000c030b200128020020066a2d0000210620012007360208200641ff00712003411f71742004722104200341076a21032006418001710d000b0240024020034120490d002006410f4b0d010b20004100360200200020043602040c020b200041013602002000410d3a00040c010b417f20071047000b200241c0006a24000bd307030e7f017e017f200241086a2103200241046a210420012802002205210602400240024002400240034002400240200428020020032802002207460d00200228020021080c010b200741016a22082007490d03200741017422092008200920084b1b22094100480d030240024020070d002009102a21080c010b200228020020072009102e21080b2008450d022002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a21072006450d03200a21072005450d03200b41746a210d200241086a210841002107200a210e0340200e2103024003402003280200220f0d01200741016a2107200b2003410c6a2203470d000c070b0b2003410c6a210e200741016a21102005417f6a2105200341046a2902002111034002400240200241046a220428020020082802002206460d00200228020021090c010b200641016a22092006490d04200641017422012009200120094b1b22014100480d040240024020060d002001102a21090c010b200228020020062001102e21090b2009450d032002200936020020042001360200200828020021060b2008200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2011422088a722122106034002400240200428020020082802002207460d00200228020021090c010b200741016a22092007490d04200741017422012009200120094b1b22014100480d040240024020070d002001102a21090c010b200228020020072001102e21090b2009450d032002200936020020042001360200200828020021070b2008200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b0240024020042802002206200828020022076b2012490d00200228020021060c010b200720126a22092007490d03200641017422072009200720094b1b22074100480d030240024020060d002007102a21060c010b200228020020062007102e21060b2006450d022002200636020020042007360200200828020021070b2008200720126a360200200620076a200f201210db051a02402011a7450d00200f102c0b200d2003460d032010210720050d000c030b0b1033000b1035000b2003410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d002006102c0b2007410c6a2207200b470d000b0b0240200c450d00200a102c0b2000411f3a00000baf06010a7f20012802042103200128020021044100210541002106410021074101210820012802082209210a024002400340024020062007470d002005200641016a220b2005200b4b1b22074100480d030240024020060d002007102a21080c010b200820062007102e21080b2008450d020b200820066a200a41807f72200a41ff0071200a410776220b1b3a0000200541026a2105200641016a2106200b210a200b0d000b02400240200720066b2009490d002007210a0c010b200620096a220a2006490d0220074101742205200a2005200a4b1b220a4100480d020240024020070d00200a102a21080c010b20082007200a102e21080b2008450d010b200820066a2004200910db051a02402003450d002004102c0b200128020c210302400240200a20096b20066b200141146a2802002205490d00200920056a20066a2104200a210c0c010b200920066a220b20056a2204200b490d02200a410174220b2004200b20044b1b220c4100480d0202400240200a0d00200c102a21080c010b2008200a200c102e21080b2008450d010b200820096a20066a2003200510db051a200241086a210b200241046a21072004210a0340024002402007280200200b2802002206460d00200228020021050c010b200641016a22052006490d03200641017422092005200920054b1b22094100480d030240024020060d002009102a21050c010b200228020020062009102e21050b2005450d022002200536020020072009360200200b28020021060b200b200641016a360200200520066a200a41807f72200a41ff0071200a41077622061b3a00002006210a20060d000b02400240200241046a280200220a200241086a28020022066b2004490d002002280200210a0c010b200620046a22052006490d02200a41017422062005200620054b1b22064100480d0202400240200a0d002006102a210a0c010b2002280200200a2006102e210a0b200a450d012002200a360200200241046a2006360200200241086a28020021060b200241086a200620046a360200200a20066a2008200410db051a0240200c450d002008102c0b2000411f3a00000240200141106a280200450d002003102c0b0f0b1033000b1035000bf20103027f017e057f024020002802082201200028020c460d00034020002001411c6a36020820012802102202450d01200141146a2902002103024020012802042204450d00200141086a280200210502402001410c6a2802002201450d0020014104742106200421010340024020012d00004109470d000240200141046a2207280200220828020441ffffffff0371450d002008280200102c200728020021080b2008102c0b200141106a2101200641706a22060d000b0b2005450d002004102c0b02402003a7450d002002102c0b20002802082201200028020c470d000b0b02402000280204450d002000280200102c0b0be50101067f024020002802082201200028020c460d0003402000200141186a36020820012802002202450d01200141146a2802002103200141106a2802002104200128020c210502402001280204450d002002102c0b02402003450d0020034104742103200521010340024020012d00004109470d000240200141046a2206280200220228020441ffffffff0371450d002002280200102c200628020021020b2002102c0b200141106a2101200341706a22030d000b0b02402004450d002005102c0b20002802082201200028020c470d000b0b02402000280204450d002000280200102c0b0bf20103027f017e057f024020002802082201200028020c460d00034020002001411c6a36020820012802102202450d01200141146a2902002103024020012802042204450d00200141086a280200210502402001410c6a2802002201450d0020014104742106200421010340024020012d00004109470d000240200141046a2207280200220828020441ffffffff0371450d002008280200102c200728020021080b2008102c0b200141106a2101200641706a22060d000b0b2005450d002004102c0b02402003a7450d002002102c0b20002802082201200028020c470d000b0b02402000280204450d002000280200102c0b0bce0101057f024020002802082201450d00200028020022022001411c6c6a21030340024020022802042200450d0002402002410c6a2802002201450d00200141047421010340024020002d00004109470d000240200041046a2204280200220528020441ffffffff0371450d002005280200102c200428020021050b2005102c0b200041106a2100200141706a22010d000b0b200241086a280200450d002002280204102c0b2002411c6a21000240200241146a280200450d002002280210102c0b2000210220002003470d000b0b0bef04010b7f230041c080016b2202240020022001109205410121030240024020022802004101470d0020002002290204370204200041013602002000410c6a2002410c6a2902003702000c010b20022802042104200241004180800110da052105410021064100210702400240024002402004450d00410021084100210641012103410021090340024002402001280204220a200128020822076b200420096b220b41808001200b41808001491b220b490d002007200b6a220c2007490d04200a200c4f0d01200c200a103f000b200541013a008f8001200541b480016a4101360200200542013702a48001200541f0f7c5003602a080012005412b3602bc80012005200541b880016a3602b0800120052005418f80016a3602b880012005419080016a200541a080016a10372005418b80016a2005419880016a2802003600002005200529039080013700838001200041053a00042000200529008080013700052000410c6a2005418780016a290000370000200041013602002006450d062003102c0c060b2005200128020020076a200b10db05210a2001200c36020802400240200620086b200b490d002008200b6a21070c010b2008200b6a22072008490d052006410174220c2007200c20074b1b220c4100480d050240024020060d00200c102a21030c010b20032006200c102e21030b2003450d04200c21060b200320086a200a200b10db051a200721082004200b20096a22094b0d000b0b2000200336020420004100360200200041146a2007360200200041106a41003602002000410c6a2007360200200041086a20063602000c030b2007200c1047000b1033000b1035000b200241c080016a24000b8f1f03127f017e037f23004180026b220524000240024020014115490d00410121064101210702400240034020012108200021092006200771410173210a024002400240034002400240024002402004450d00024020064101710d0020002001109b052004417f6a21040b2001410276220741036c210b2007410174210c4100210d20014132490d03200741016a210e200020074103746a220f28020020002007417f6a220d4103746a2210280200201041046a2802002210200f41046a280200220f200f20104b1b10dd052211450d01417f410120114100481b21100c020b20002001109c050c0b0b417f200f201047200f2010491b21100b2007200d2010417f4622101b210f024002402000200e4103746a22112802002000200d200720101b22124103746a2207280200200741046a2802002207201141046a280200220d200d20074b1b10dd052211450d00417f410120114100481b21070c010b417f200d200747200d2007491b21070b4102410120101b20102007417f4622071b210d024002402000200e201220071b22114103746a22102802002000200f4103746a2207280200200741046a2802002207201041046a2802002210201020074b1b10dd05220e450d00417f4101200e4100481b21100c010b417f201020074720102007491b21100b200c4101722107200d2010417f4622126a2113024002402000200c4103746a220d2802002000200c417f6a22104103746a220e280200200e41046a280200220e200d41046a280200220d200d200e4b1b10dd052214450d00417f410120144100481b210e0c010b417f200d200e47200d200e491b210e0b200c2010200e417f46220e1b210d2013200e6a211302400240200020074103746a221428020020002010200c200e1b220e4103746a220c280200200c41046a280200220c201441046a28020022102010200c4b1b10dd052214450d00417f410120144100481b210c0c010b417f2010200c472010200c491b210c0b2013200c417f46220c6a21100240024020002007200e200c1b22134103746a220c2802002000200d4103746a2207280200200741046a2802002207200c41046a280200220c200c20074b1b10dd05220e450d00417f4101200e4100481b210c0c010b417f200c200747200c2007491b210c0b200b41016a21072010200c417f4622146a2115024002402000200b4103746a220e2802002000200b417f6a220c4103746a2210280200201041046a2802002210200e41046a280200220e200e20104b1b10dd052216450d00417f410120164100481b21100c010b417f200e201047200e2010491b21100b200b200c2010417f4622101b210e201520106a211502400240200020074103746a22162802002000200c200b20101b22104103746a220c280200200c41046a280200220c201641046a280200220b200b200c4b1b10dd052216450d00417f410120164100481b210c0c010b417f200b200c47200b200c491b210c0b2015200c417f46220c6a211502400240200020072010200c1b220b4103746a220c2802002000200e4103746a2207280200200741046a2802002207200c41046a280200220c200c20074b1b10dd052210450d00417f410120104100481b21100c010b417f200c200747200c2007491b21100b200f201120121b2107200d201320141b210c200e200b2010417f4622101b210b201520106a210d0b024002402000200c4103746a220e280200200020074103746a2210280200201041046a2802002210200e41046a280200220e200e20104b1b10dd05220f450d00417f4101200f4100481b21100c010b417f200e201047200e2010491b21100b200c20072010417f46220e1b2110200d200e6a210d024002402000200b4103746a220f28020020002007200c200e1b220e4103746a2207280200200741046a2802002207200f41046a280200220c200c20074b1b10dd05220f450d00417f4101200f4100481b21070c010b417f200c200747200c2007491b21070b200d2007417f46220c6a2107024002400240024002402000200b200e200c1b220d4103746a220b280200200020104103746a220c280200200c41046a280200220c200b41046a280200220b200b200c4b1b10dd05220e450d00200e4100480d010c020b200b200c4f0d010b200741016a2207410c490d0102402001410176220b450d00200020014103746a41786a21072000210c0340200c2902002117200c200729020037020020072017370200200c41086a210c200741786a2107200b417f6a220b0d000b0b20012010417f736a2110410121070c020b200d21100b20074521070b0240200745200a724101710d0020002001109d050d090b2003450d010240201020014f0d00024002402003280200200020104103746a2207280200200741046a280200220c200341046a280200220b200b200c4b1b10dd05220e450d00200e41004e0d010c050b200b200c490d040b200029020021172000200729020037020020072017370200200041786a21122000410c6a2113200041086a2114200028020421072000280200210d4100210b2001210e0340024002400240200b200e417f6a22114f0d002013200b4103746a210c034002400240200d200c417c6a280200200c28020022102007200720104b1b10dd05220f450d00200f4100480d030c010b20072010490d020b200c41086a210c2011200b41016a220b470d000c020b0b0240200b20114f0d002012200e4103746a210c2011210e034002400240200d200c280200200c41046a28020022102007200720104b1b10dd05220f450d00200f4100480d010c050b200720104f0d040b200c41786a210c200b200e417f6a220e490d000b0b200b21110b200020073602042000200d36020002402001201141016a2207490d00200020074103746a2100200120076b220141154f0d040c0b0b200720011047000b2014200b4103746a221029020021172010200c290200370200200c2017370200200b41016a210b0c000b0b0b41c4ffc500201020011038000b20080d0141f8fec500410041001038000b20002109200121080b201020084f0d02200929020021172009200920104103746a2207290200370200200720173702002009280204210c2009280200211241002100410021184100211902402008417f6a220e450d002009410c6a21074100211803400240024002402007417c6a2802002012200c2007280200220b200b200c4b1b10dd052210450d00201041004e0d010c020b200b200c490d010b200e21190240200e20184d0d00200920084103746a41786a2107200e211903400240024020072802002012200c200741046a280200220b200b200c4b1b10dd052210450d00201041004e0d010c030b200b200c490d020b200741786a21072019417f6a221920184b0d000b0b0240024020192018490d00200e2019490d010c040b201820191047000b2019200e103f000b200741086a2107200e201841016a2218470d000b200e2118200e21190b200941086a220720194103746a210e41800121144100211141002110410021014180012106200720184103746a221a210d03400240200e200d6b22074187104b220a0d002007410376220741807f6a200720112000492001201049220b72220f1b21070240200f450d0020062007200b1b210620072014200b1b21140c010b2007200741017622066b21140b024020012010470d00024020060d002005221021010c010b4100210720052110200d210b0340201020073a0000200741016a210702400240200b2802002012200c200b41046a280200220f200f200c4b1b10dd052201450d00417f410120014100481b210f0c010b417f200f200c47200f200c491b210f0b200b41086a210b2010200f417f476a211020062007470d000b200521010b024020112000470d00024020140d0020054180016a220021110c010b200e41786a21074100210b20054180016a210003402000200b3a0000200b41016a210b0240024020072802002012200c200741046a280200220f200f200c4b1b10dd052211450d00417f410120114100481b210f0c010b417f200f200c47200f200c491b210f0b200741786a21072000200f417f466a21002014200b470d000b20054180016a21110b0240200020116b2207201020016b220b200b20074b1b2213450d00200d20012d00004103746a22072802042115200728020021162007200e20112d0000417f734103746a290200370200024020134101460d00410021070340200e201120076a220b2d0000417f734103746a200d200120076a41016a220f2d00004103746a290200370200200d200f2d00004103746a200e200b41016a2d0000417f734103746a290200370200200741026a210b200741016a220f2107200b2013490d000b2011200f6a21112001200f6a21010b200e20112d0000417f734103746a2207201536020420072016360200201141016a2111200141016a21010b200e20144103746b200e20112000461b210e200d20064103746a200d20012010461b210d200a0d000b02400240200120104f0d00200e21070340200d2010417f6a22102d00004103746a220b2902002117200b200741786a22072902003702002007201737020020012010490d000c020b0b200d2107201120004f0d000340200729020021172007200e2000417f6a22002d0000417f734103746a220b290200370200200b2017370200200741086a210720112000490d000b0b2009200c36020420092012360200024020082007201a6b41037620186a22014d0d00200929020021172009200920014103746a220729020037020020072017370200200820016b220c450d02200c20012001200c4b1b210b20084103762110200741086a2100024002402001200c417f6a220c490d002000200c200220072004109a05200921000c010b20092001200220032004109a0520072103200c21010b200b20104f2106201920184d2107200141154f0d010c040b0b4188ffc500200120081038000b4198ffc500411c41b4ffc5001036000b4188ffc500201020081038000b20014102490d00200041786a211341002114410121120340201241037421072012417f6a2110201241016a2112024002400240200020076a22072802002211200020104103746a220f280200200f41046a280200220c200741046a280200220b200b200c4b1b10dd05220e450d00200e4100480d010c020b200b200c4f0d010b2007200f29020037020002402010450d002014210c20132107024003400240024020112007280200200741046a280200220e200b200b200e4b1b10dd05220d450d00200d4100480d010c030b200b200e4f0d030b20002010417f6a22104103746a210f200741086a2007290200370200200741786a2107200c41016a220e200c49210d200e210c200d450d000b0b200741086a210f0b200f200b360204200f20113602000b2014417f6a2114201341086a211320122001470d000b0b20054180026a24000bf50202057f017e02400240024020014108490d00200141017641feffffff07712202417f6a220320014f0d022001410d74200173220441117620047322044105742004732205417f2001417f6a677622067122044100200120042001491b6b220420014f0d01200020034103746a220329020021072003200020044103746a220429020037020020042007370200024020022001490d00200221030c030b2005410d7420057322044111762004732204410574200473220520067122044100200120042001491b6b220420014f0d01200020024103746a220329020021072003200020044103746a2204290200370200200420073702002002410172220320014f0d022005410d742005732204411176200473220441057420047320067122044100200120042001491b6b220420014f0d01200020034103746a220129020021072001200020044103746a2200290200370200200020073702000b0f0b4188ffc500200420011038000b41f8fec500200320011038000bb20102037f017e024020014101762202450d00200020012002417f6a109e052002417e6a210203402002417f460d01200020012002109e052002417f6a21020c000b0b0240024020014102490d00200141037420006a41786a21022001210303402003417f6a220420014f0d02200029020021052000200229020037020020022005370200200020044100109e05200241786a210220042103200441014b0d000b0b0f0b4188ffc5002003417f6a20011038000b9a06050a7f017e017f017e037f200041686a2102200041786a2103200141324921044101210541002106024003400240024020052001490d00410021070c010b200320054103746a210841012107034002400240200841086a22092802002008280200200841046a280200220a2008410c6a28020022082008200a4b1b10dd05220b450d00200b4100480d030c010b2008200a490d020b4101210a200541016a220520014921072009210820012005470d000c030b0b2005200146210a20040d0120052001460d01024002400240024002402005417f6a220820014f0d002007410171450d01200020084103746a2208290200210c200820002005410374220d6a220b290200220e370200200b200c37020020054102490d0402400240200ea7220f20002005417e6a220a4103746a2210280200201041046a2802002207200841046a2802002209200920074b1b10dd052211450d0020114100480d010c060b200920074f0d050b20082010290200370200200a450d032002200d6a2108034002400240200f2008280200200841046a28020022072009200920074b1b10dd05220d450d00200d4100480d010c050b200920074f0d050b2000200a417f6a220a4103746a2110200841086a2008290200370200200841786a2108200a0d000c030b0b41f8fec500200820011038000b4188ffc500200520011038000b200841086a21100b201020093602042010200f3602000b200641016a21060240200120056b220d4102490d0002400240200b280208200b280200220f200b41046a2802002209200b410c6a2802002208200820094b1b10dd05220a450d00200a4100480d010c020b200820094f0d010b200b41086a2111200b200b2902083702000240200d4103490d004103210a41022107034002400240200b20074103746a2208280200200f2009200841046a2802002207200720094b1b10dd052210450d00201041004e0d030c010b200720094f0d020b200841786a20082902003702000240200a200d4f0d00200a2107200a41016a210a200821110c010b0b200821110b2011200f360200201120093602040b20064105470d000b4100210a0b200a0bb60202057f017e03402002410174220341017221040240024002400240200341026a220320014f0d00200420014f0d0102400240200020044103746a2205280200200020034103746a2206280200200641046a2802002206200541046a2802002205200520064b1b10dd052207450d00417f410120074100481b21060c010b417f200520064720052006491b21060b200320042006417f461b21040b0240200420014f0d00200220014f0d020240200020024103746a2202280200200020044103746a2203280200200341046a2802002206200241046a2802002205200520064b1b10dd052207450d00200741004e0d010c040b20052006490d030b0f0b41a080c600200420011038000b41b080c600200220011038000b200229020021082002200329020037020020032008370200200421020c000b0b8d0302037f017e230041c0006b22022400200141086a28020021032001280204210420022001280200220136020002400240024002402001418080044b0d002004450d022002200336020402400240200120034b0d002003418080044d0d042002413c6a41013602002002420237022c2002419c98c6003602282002410136020c200241f897c6003602082002200241086a360238200241186a200241286a1037200241186a21010c010b2002413c6a4102360200200241246a41013602002002420237022c2002418c98c6003602282002410136021c2002200241186a360238200220023602202002200241046a360218200241086a200241286a1037200241086a21010b20012902042105200128020021010c010b2002413c6a41013602002002420237022c200241fc97c6003602282002410136020c200241f897c6003602082002200241086a360238200241186a200241286a103720022802182101200229021c21050b2001450d0020002005370204200020013602000c010b200041003602000b200241c0006a24000be00501037f230041f0006b2204240002400240024020012802084102460d00412e102a2201450d01200041013a0000200141266a41002900909a46370000200141206a410029008a9a46370000200141186a41002900829a46370000200141106a41002900fa9946370000200141086a41002900f29946370000200141002900ea9946370000200041086a42ae808080e005370200200041046a20013602000c020b0240024002400240024002400240200128020022052d0000416e6a2201411e4b0d004100210620010e1f03000000000000000000000000000000000000000000000000000006040102030b4120102a2201450d06200041013a0000200141186a41002900b09a46370000200141106a41002900a89a46370000200141086a41002900a09a46370000200141002900989a46370000200041086a42a08080808004370200200041046a20013602000c070b410221060c040b410321060c030b20042005280204220136020c0240024020012003490d0041b89ac6002105200441e8006a2103200441d0006a2101200441c0006a21020c010b200220014101746a22012d0001450d0241c89ac6002105200441386a2103200441206a2101200441106a21020b20034101360204200141146a410136020020012003360210200142023702042001200536020020032004410c6a360200200220011037200041013a00002000410c6a200241086a280200360200200041046a20022902003702000c040b410121060c010b20012d000021060b0240200541106a2d00004106470d00200041003a0000200020063a00010c020b4129102a2201450d00200041013a0000200141286a41002d00809b463a0000200141206a41002900f89a46370000200141186a41002900f09a46370000200141106a41002900e89a46370000200141086a41002900e09a46370000200141002900d89a46370000200041086a42a98080809005370200200041046a20013602000c010b1033000b200441f0006a24000b8f0201017f230041106b220224000240024002400240024020002d00000e0401020300010b2002200128021841e4f7c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c030b2002200128021841e7f7c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c020b2002200128021841eaf7c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b2002200128021841edf7c50041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040b200241106a240020000bfac00103087f027e017f230041f0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00000eac0100c1010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01000b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b4118102a2200450dbe012003421837025c20032000360258200341d8006a4100411810c80520032003280260220041186a3602602000200328025822016a411841ba9dc600411810c9052003200329025c37025c2003200136025841b892c600413b200341d8006a41f492c600103b000b02400240200128022820044103746a22052802002204200141206a220628020022024b0d00200421010c010b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490dc0012007410174220a2009200a20094b1b22094100480dc0010240024020070d002009102a21070c010b200128021820072009102e21070b2007450dbf01200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a220210da051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060cc0010b0240200141306a2802002204200141346a22052802004f0d002002310001210b200141206a350200210c024020042001412c6a280200470d00200441016a22022004490dbf01200441017422052002200520024b1b220241ffffffff01712002470dbf01200241037422054100480dbf010240024020040d002005102a21040c010b200128022820044103742005102e21040b2004450dbe01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200b422886200c84370200200141306a2201200128020041016a3602000cc0010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200536020020032003360268200341106a200341d8006a103720032802102202450dbf012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450dbf012000200b370204200020013602000cc0010b0240200141306a2802002204200141346a22052802004f0d002002310001210b200141206a350200210c024020042001412c6a280200470d00200441016a22022004490dbe01200441017422052002200520024b1b220241ffffffff01712002470dbe01200241037422054100480dbe010240024020040d002005102a21040c010b200128022820044103742005102e21040b2004450dbd01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200b422886200c8442808080803084370200200141306a2201200128020041016a3602000cbf010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200536020020032003360268200341106a200341d8006a103720032802102202450dbe012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450dbe012000200b370204200020013602000cbf010b2002310001210b200341d8006a200141186a200141286a2204410010ca05024020032d00584101470d002000200329025c370200200041086a200341e4006a2802003602000cbf010b0240200141306a2802002202200141346a22052802004f0d00200141206a350200210c024020022001412c6a280200470d00200241016a22052002490dbd01200241017422062005200620054b1b220541ffffffff01712005470dbd01200541037422064100480dbd010240024020020d002006102a21020c010b200428020020024103742006102e21020b2002450dbc01200120023602282001412c6a2005360200200141306a28020021020b200128022820024103746a200b422886200c8442808080801084370200200141306a2201200128020041016a3602000cbe010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200536020020032003360268200341106a200341d8006a103720032802102202450dbd012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450dbd012000200b370204200020013602000cbe010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b4118102a2200450dba012003421837025c20032000360258200341d8006a4100411810c80520032003280260220041186a3602602000200328025822016a411841ba9dc600411810c9052003200329025c37025c20032001360258418493c6004134200341d8006a41f492c600103b000b02400240200141286a220228020020044103746a22042d00044101470d002004310005210b200341d8006a200141186a200210cb052003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cbf010b411a102a2201450dba01200141186a41002f00d093463b0000200141106a41002900c89346370000200141086a41002900c09346370000200141002900b893463700002000429a808080a003370204200020013602000cbe010b0240200141306a2802002204200141346a22052802004f0d00200141206a350200210c024020042001412c6a280200470d00200441016a22052004490dbc01200441017422062005200620054b1b220541ffffffff01712005470dbc01200541037422064100480dbc010240024020040d002006102a21020c010b200228020020044103742006102e21020b2002450dbb01200120023602282001412c6a2005360200200141306a28020021040b200128022820044103746a200b422886200c8442808080802084370200200141306a2201200128020041016a3602000cbd010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200536020020032003360268200341106a200341d8006a103720032802102202450dbc012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450dbc012000200b370204200020013602000cbd010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b4118102a2200450db9012003421837025c20032000360258200341d8006a4100411810c80520032003280260220041186a3602602000200328025822016a411841ba9dc600411810c9052003200329025c37025c20032001360258418493c6004134200341d8006a41f492c600103b000b200141286a220628020020044103746a22042d00052105024020042d00044101470d00200541ff01714104470da6010b0240024020024101460d00200341d8006a200141186a2202200610cb052003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cbe010b20012d003822024104460dbb01200341d8006a200141186a22052006200210ca050240024020032d00584101460d000240200141206a2802002204200141246a22072802004f0d00024020042001411c6a280200470d00200441016a22072004490dbe01200441017422082007200820074b1b22074100480dbe010240024020040d002007102a21040c010b200528020020042007102e21040b2004450dbd01200120043602182001411c6a2007360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cbe010b200341ec006a220241013602002003420137025c200341b49ec6003602582003410136023c200320073602382003200341386a360268200341106a200341d8006a103720032802102204450dbd012003200329021437023c20032004360238200241013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b20020d010cbd010b200328025c2202450dbc01200341e0006a290300210b0b2000200b370204200020023602000cbd010b200541ff01714104460dbb010240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490dbb01200441017422072006200720064b1b22064100480dbb010240024020040d002006102a21020c010b200228020020042006102e21020b2002450dba01200120023602182001411c6a2006360200200141206a28020021040b200128021820046a20053a0000200141206a2201200128020041016a3602000cbc010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200636020020032003360268200341106a200341d8006a103720032802102202450dbb012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450dbb012000200b370204200020013602000cbc010b2003200241046a2802002202360248024002400240200141306a280200220420024d0d0020042002417f736a22022004490d0141969ec600411d1054000b200341ec006a220241023602002003411c6a41013602002003420237025c200341d49dc60036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1037200328023821042003200329023c37023c20032004360238200241013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b20020d010cb8010b200141286a220428020020024103746a22022d00044103460db70120022d0005220241ff01714104460db701200341d8006a200141186a22052004200210ca05024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490dbc01200441017422072006200720064b1b22064100480dbc010240024020040d002006102a21040c010b200528020020042006102e21040b2004450dbb01200120043602182001411c6a2006360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cb9010b200341ec006a220241013602002003420137025c200341b49ec6003602582003410136023c200320063602382003200341386a360268200341106a200341d8006a103720032802102204450db8012003200329021437023c20032004360238200241013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b2002450db8010c010b200328025c2202450db701200341e0006a290300210b0b2000200b370204200020023602000cbb010b200241046a2802002102200341d8006a200141186a2206200141286a2205410010ca05024020032d00584101470d00200341e0006a290300210b200328025c21010cb4010b200141306a28020021042003200236024802400240200420024d0d0020042002417f736a22022004490d0141969ec600411d1054000b200341ec006a220141023602002003411c6a41013602002003420237025c200341d49dc60036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1037200328023821022003200329023c37023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b200328023c450db4012003280238102c20010db5010cba010b200528020020024103746a22022d00044103460db90120022d0005220241ff01714104460db901200341d8006a20062005200210ca05024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490dba01200441017422072005200720054b1b22054100480dba010240024020040d002005102a21040c010b200628020020042005102e21040b2004450db901200120043602182001411c6a2005360200200141206a28020021040b200128021820046a20023a0000200141206a2201200128020041016a3602000cbb010b200341ec006a220141013602002003420137025c200341b49ec6003602582003410136023c200320053602382003200341386a360268200341106a200341d8006a103720032802102202450dba012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b20010db5010cba010b200328025c2201450db901200341e0006a290300210b0cb4010b200241046a280200220228020421062002280200210420032002280208220536024802400240200141306a280200220220054d0d0020022005417f736a22052002490d0141969ec600411d1054000b200341ec006a220441023602002003411c6a41013602002003420237025c200341d49dc60036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1037200328023821022003200329023c37023c20032002360238200441013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b2003200b370204200320023602000cb1010b410421090240200141286a220d280200220720054103746a22052d00044103460d0020052d000521090b200320093a00302006450dac01200941ff0171220a4104460dab01200641027421060340200320042802002205360248200220054d0dae0120022005417f736a220520024f0db201200720054103746a22052d00044103460daf0120052d000522084104460daf01200a2008470daf01200441046a21042006417c6a22060d000cad010b0b20012d003822024104460da901200341d8006a200141186a2205200141286a200210ca050240024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490db901200441017422072006200720064b1b22064100480db9010240024020040d002006102a21040c010b200528020020042006102e21040b2004450db801200120043602182001411c6a2006360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cac010b200341ec006a220241013602002003420137025c200341b49ec6003602582003410136023c200320063602382003200341386a360268200341106a200341d8006a103720032802102204450dab012003200329021437023c20032004360238200241013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b20020d010cab010b200328025c2202450daa01200341e0006a290300210b0b2000200b370204200020023602000cb8010b200128020021042003200241046a2802002202360254024002400240200441386a28020020024b0d00200341ec006a41013602002003420237025c200341889cc600360258200341013602342003200341306a3602682003200341d4006a360230200341386a200341d8006a1037200341186a200329023c370300200341013602102003200328023822043602140c010b2003200428023020024102746a2802002202360200024002402004412c6a28020020024b0d0041012105200341ec006a41013602002003420237025c200341ac9cc6003602582003410136024c2003200341c8006a36026820032003360248200341386a200341d8006a1037200341186a200329023c220b370300200b422088a7210720032802382104200ba721020c010b2003411c6a200428022420024104746a22042d000d22073a0000200341186a2004280208220236020020042802002104410021050b20032005360210200320043602142005450d010b200341186a21010ca7010b02402002450d002004417f6a2104200141286a2105200141186a21060340200341d8006a20062005200420026a2d000010ca05024020032d00584101470d00200341e0006a2101200328025c21040ca9010b2002417f6a22020d000b0b200741ff01714104460db6010240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db601200241017422052004200520044b1b22044100480db6010240024020020d002004102a21020c010b200128021820022004102e21020b2002450db501200120023602182001411c6a2004360200200141206a28020021020b200128021820026a20073a0000200141206a2201200128020041016a3602000cb7010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200436020020032003360268200341106a200341d8006a103720032802102202450db6012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021042003290214210b0240200328023c450d002003280238102c0b2004450db6010ca7010b200241046a280200210620012802002102200341003602380240024002400240200241146a2802000d00200341d8006a41146a41013602002003420237025c200341e89bc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10370c010b200341d8006a200141186a2204200141286a2205410010ca05024020032d00584101470d00200341e0006a290300210b200328025c21010c030b20012802002207412c6a280200210220032006360238200220064b0d01200341ec006a41013602002003420237025c200341ac9cc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10370b200328021021012003290214210b0c010b200728022420064104746a22062d000d2107024020062802082202450d002006280200417f6a21060340200341d8006a20042005200620026a2d000010ca05024020032d00584101470d00200341e0006a290300210b200328025c21010c030b2002417f6a22020d000b0b200741ff01714104460db6010240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490db601200241017422062005200620054b1b22054100480db6010240024020020d002005102a21020c010b200428020020022005102e21020b2002450db501200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20073a0000200141206a2201200128020041016a3602000cb7010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200536020020032003360268200341106a200341d8006a103720032802102202450db6012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b200328023c450d002003280238102c0b2001450db5012000200b370204200020013602000cb6010b200341d8006a200141186a200141286a410410ca0520032d00584101470db401200328025c2201450db4012000200341e0006a290300370204200020013602000cb5010b200341d8006a200141186a2204200141286a2205410010ca05200341d8006a21020240024020032d00584101460d00200341d8006a20042005410410ca05200341d8006a210220032d00584101460d00200341d8006a2004200520032d0059220610ca05200341d8006a210220032d00584101460d000240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490db501200241017422072005200720054b1b22054100480db5010240024020020d002005102a21020c010b200428020020022005102e21020b2002450db401200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20063a0000200141206a2201200128020041016a3602000cb6010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200536020020032003360268200341106a200341d8006a103720032802102202450db5012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b20010d010cb5010b200241046a2802002201450db401200241086a290200210b0b2000200b370204200020013602000cb4010b200341d8006a200141046a200241046a28020010cc050240024020032d00584101460d000240200141206a2802002202200141246a22042802004f0d0020032d00592104024020022001411c6a280200470d00200241016a22052002490db401200241017422062005200620054b1b22054100480db4010240024020020d002005102a21020c010b200128021820022005102e21020b2002450db301200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cb5010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200436020020032003360268200341106a200341d8006a103720032802102202450db4012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b20010d010cb4010b200328025c2201450db301200341e0006a290300210b0b2000200b370204200020013602000cb3010b2003200241046a2802002202360200200341d8006a200141046a200210cc05024020032d00584101470d002003200328025c22013602382003200341e0006a290300220b37023c0ca1010b200320032d005922023a0030200341d8006a200141186a200141286a410410ca05024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380ca0010b200320032d005922013a004820014104460db101200241ff01712001460db101200341106a41146a41323602002003411c6a412c360200200341d8006a41146a41033602002003420337025c200341f493c600360258200341013602142003200341106a3602682003200341c8006a3602202003200341306a36021820032003360210200341386a200341d8006a10370c9f010b200341d8006a200141046a200241046a28020010cc050240024020032d00584101460d00200341d8006a200141186a2205200141286a20032d0059220410ca05024020032d00584101460d000240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490db301200241017422072006200720064b1b22064100480db3010240024020020d002006102a21020c010b200528020020022006102e21020b2002450db201200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cb4010b200341ec006a220141013602002003420137025c200341b49ec6003602582003410136023c200320063602382003200341386a360268200341106a200341d8006a103720032802102202450db3012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b20010d020cb3010b200328025c2201450db201200341e0006a290300210b0c010b200328025c2201450db101200341e0006a290300210b0b2000200b370204200020013602000cb1010b200128020021042003200241046a280200220236023802400240200441206a28020020024d0d000240200141206a2802002205200141246a22062802004f0d00200428021820024101746a2d00002102024020052001411c6a280200470d00200541016a22042005490db101200541017422062004200620044b1b22044100480db1010240024020050d002004102a21050c010b200128021820052004102e21050b2005450db001200120053602182001411c6a2004360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000cb2010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200636020020032003360268200341106a200341d8006a103720032802102202450db1012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b20010d010cb1010b200341ec006a41013602002003420237025c200341cc9cc6003602582003410136024c2003200341c8006a3602682003200341386a360248200341106a200341d8006a103720032802102201450db0012003290214210b0b2000200b370204200020013602000cb0010b2003200241046a28020022023602282001280200210420032002360254024002400240200441206a28020020024b0d00200341ec006a41013602002003420237025c200341cc9cc6003602582003410136024c2003200341c8006a3602682003200341d4006a360248200341106a200341d8006a10370c010b200428021820024101746a22022d00010d01200341ec006a41013602002003420237025c200341dc9cc60036025820034101360204200320033602682003200341d4006a360200200341106a200341d8006a10370b2003280210210120032003290214220b37023c200320013602380c9c010b200320022d000022023a002f200341d8006a200141186a200141286a410410ca05024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380c9b010b200320032d005922013a00002001200241ff0171460dae0120014104460dae01200341106a41146a41323602002003411c6a4132360200200341d8006a41146a41033602002003420337025c2003418c94c600360258200341013602142003200341106a3602682003200336022020032003412f6a3602182003200341286a360210200341386a200341d8006a10370c9a010b200341d8006a2001200241046a2802004104410010ce052003280258450dad0120002003290358370200200041086a200341d8006a41086a2802003602000cae010b200341d8006a2001200241046a2802004108410110ce052003280258450dac0120002003290358370200200041086a200341d8006a41086a2802003602000cad010b200341d8006a2001200241046a2802004104410210ce052003280258450dab0120002003290358370200200041086a200341d8006a41086a2802003602000cac010b200341d8006a2001200241046a2802004108410310ce052003280258450daa0120002003290358370200200041086a200341d8006a41086a2802003602000cab010b200341d8006a2001200241046a2802004101410010ce052003280258450da90120002003290358370200200041086a200341d8006a41086a2802003602000caa010b200341d8006a2001200241046a2802004101410010ce052003280258450da80120002003290358370200200041086a200341d8006a41086a2802003602000ca9010b200341d8006a2001200241046a2802004102410010ce052003280258450da70120002003290358370200200041086a200341d8006a41086a2802003602000ca8010b200341d8006a2001200241046a2802004102410010ce052003280258450da60120002003290358370200200041086a200341d8006a41086a2802003602000ca7010b200341d8006a2001200241046a2802004101410110ce052003280258450da50120002003290358370200200041086a200341d8006a41086a2802003602000ca6010b200341d8006a2001200241046a2802004101410110ce052003280258450da40120002003290358370200200041086a200341d8006a41086a2802003602000ca5010b200341d8006a2001200241046a2802004102410110ce052003280258450da30120002003290358370200200041086a200341d8006a41086a2802003602000ca4010b200341d8006a2001200241046a2802004102410110ce052003280258450da20120002003290358370200200041086a200341d8006a41086a2802003602000ca3010b200341d8006a2001200241046a2802004104410110ce052003280258450da10120002003290358370200200041086a200341d8006a41086a2802003602000ca2010b200341d8006a2001200241046a2802004104410110ce052003280258450da00120002003290358370200200041086a200341d8006a41086a2802003602000ca1010b200341d8006a2001200241046a2802004104410010cf052003280258450d9f0120002003290358370200200041086a200341d8006a41086a2802003602000ca0010b200341d8006a2001200241046a2802004108410110cf052003280258450d9e0120002003290358370200200041086a200341d8006a41086a2802003602000c9f010b200341d8006a2001200241046a2802004104410210cf052003280258450d9d0120002003290358370200200041086a200341d8006a41086a2802003602000c9e010b200341d8006a2001200241046a2802004108410310cf052003280258450d9c0120002003290358370200200041086a200341d8006a41086a2802003602000c9d010b200341d8006a2001200241046a2802004101410010cf052003280258450d9b0120002003290358370200200041086a200341d8006a41086a2802003602000c9c010b200341d8006a2001200241046a2802004102410010cf052003280258450d9a0120002003290358370200200041086a200341d8006a41086a2802003602000c9b010b200341d8006a2001200241046a2802004101410110cf052003280258450d990120002003290358370200200041086a200341d8006a41086a2802003602000c9a010b200341d8006a2001200241046a2802004102410110cf052003280258450d980120002003290358370200200041086a200341d8006a41086a2802003602000c99010b200341d8006a2001200241046a2802004104410110cf052003280258450d970120002003290358370200200041086a200341d8006a41086a2802003602000c98010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c200341b89bc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a103720032802102202450d002003290214210b0c010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490d9701200241017422052004200520044b1b22044100480d97010240024020020d002004102a21020c010b200128021820022004102e21020b2002450d9601200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c98010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200436020020032003360268200341106a200341d8006a103720032802102202450d97012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b2002450d97010b2000200b370204200020023602000c97010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c200341b89bc60036025820034101360204200320033602682003200341386a360200200341106a200341d8006a103720032802102202450d002003290214210b0c010b200341d8006a200141186a2204200141286a410010ca05024020032d00584101460d000240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d9701200241017422062005200620054b1b22054100480d97010240024020020d002005102a21020c010b200428020020022005102e21020b2002450d9601200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c98010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200536020020032003360268200341106a200341d8006a103720032802102202450d97012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b20020d010c97010b200328025c2202450d9601200341e0006a290300210b0b2000200b370204200020023602000c96010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490d9401200241017422052004200520044b1b22044100480d94010240024020020d002004102a21020c010b200128021820022004102e21020b2002450d9301200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c95010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200436020020032003360268200341106a200341d8006a103720032802102202450d94012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450d94012000200b370204200020013602000c95010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490d9301200241017422052004200520044b1b22044100480d93010240024020020d002004102a21020c010b200128021820022004102e21020b2002450d9201200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41013a0000200141206a2201200128020041016a3602000c94010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200436020020032003360268200341106a200341d8006a103720032802102202450d93012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450d93012000200b370204200020013602000c94010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490d9201200241017422052004200520044b1b22044100480d92010240024020020d002004102a21020c010b200128021820022004102e21020b2002450d9101200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41023a0000200141206a2201200128020041016a3602000c93010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200436020020032003360268200341106a200341d8006a103720032802102202450d92012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450d92012000200b370204200020013602000c93010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490d9101200241017422052004200520044b1b22044100480d91010240024020020d002004102a21020c010b200128021820022004102e21020b2002450d9001200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41033a0000200141206a2201200128020041016a3602000c92010b200341ec006a220141013602002003420137025c200341b49ec600360258200341013602042003200436020020032003360268200341106a200341d8006a103720032802102202450d91012003200329021437023c20032002360238200141013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021012003290214210b0240200328023c450d002003280238102c0b2001450d91012000200b370204200020013602000c92010b200341d8006a2001410010d0052003280258450d900120002003290358370200200041086a200341d8006a41086a2802003602000c91010b200341d8006a2001410010d1052003280258450d8f0120002003290358370200200041086a200341d8006a41086a2802003602000c90010b200341d8006a2001410010d1052003280258450d8e0120002003290358370200200041086a200341d8006a41086a2802003602000c8f010b200341d8006a2001410010d1052003280258450d8d0120002003290358370200200041086a200341d8006a41086a2802003602000c8e010b200341d8006a2001410010d1052003280258450d8c0120002003290358370200200041086a200341d8006a41086a2802003602000c8d010b200341d8006a2001410010d1052003280258450d8b0120002003290358370200200041086a200341d8006a41086a2802003602000c8c010b200341d8006a2001410010d1052003280258450d8a0120002003290358370200200041086a200341d8006a41086a2802003602000c8b010b200341d8006a2001410010d1052003280258450d890120002003290358370200200041086a200341d8006a41086a2802003602000c8a010b200341d8006a2001410010d1052003280258450d880120002003290358370200200041086a200341d8006a41086a2802003602000c89010b200341d8006a2001410010d1052003280258450d870120002003290358370200200041086a200341d8006a41086a2802003602000c88010b200341d8006a2001410010d1052003280258450d860120002003290358370200200041086a200341d8006a41086a2802003602000c87010b200341d8006a2001410110d0052003280258450d850120002003290358370200200041086a200341d8006a41086a2802003602000c86010b200341d8006a2001410110d1052003280258450d840120002003290358370200200041086a200341d8006a41086a2802003602000c85010b200341d8006a2001410110d1052003280258450d830120002003290358370200200041086a200341d8006a41086a2802003602000c84010b200341d8006a2001410110d1052003280258450d820120002003290358370200200041086a200341d8006a41086a2802003602000c83010b200341d8006a2001410110d1052003280258450d810120002003290358370200200041086a200341d8006a41086a2802003602000c82010b200341d8006a2001410110d1052003280258450d800120002003290358370200200041086a200341d8006a41086a2802003602000c81010b200341d8006a2001410110d1052003280258450d7f20002003290358370200200041086a200341d8006a41086a2802003602000c80010b200341d8006a2001410110d1052003280258450d7e20002003290358370200200041086a200341d8006a41086a2802003602000c7f0b200341d8006a2001410110d1052003280258450d7d20002003290358370200200041086a200341d8006a41086a2802003602000c7e0b200341d8006a2001410110d1052003280258450d7c20002003290358370200200041086a200341d8006a41086a2802003602000c7d0b200341d8006a2001410110d1052003280258450d7b20002003290358370200200041086a200341d8006a41086a2802003602000c7c0b200341d8006a2001410210d1052003280258450d7a20002003290358370200200041086a200341d8006a41086a2802003602000c7b0b200341d8006a2001410210d1052003280258450d7920002003290358370200200041086a200341d8006a41086a2802003602000c7a0b200341d8006a2001410210d1052003280258450d7820002003290358370200200041086a200341d8006a41086a2802003602000c790b200341d8006a2001410210d1052003280258450d7720002003290358370200200041086a200341d8006a41086a2802003602000c780b200341d8006a2001410210d1052003280258450d7620002003290358370200200041086a200341d8006a41086a2802003602000c770b200341d8006a2001410210d1052003280258450d7520002003290358370200200041086a200341d8006a41086a2802003602000c760b200341d8006a2001410310d1052003280258450d7420002003290358370200200041086a200341d8006a41086a2802003602000c750b200341d8006a2001410310d1052003280258450d7320002003290358370200200041086a200341d8006a41086a2802003602000c740b200341d8006a2001410310d1052003280258450d7220002003290358370200200041086a200341d8006a41086a2802003602000c730b200341d8006a2001410310d1052003280258450d7120002003290358370200200041086a200341d8006a41086a2802003602000c720b200341d8006a2001410310d1052003280258450d7020002003290358370200200041086a200341d8006a41086a2802003602000c710b200341d8006a2001410310d1052003280258450d6f20002003290358370200200041086a200341d8006a41086a2802003602000c700b200341d8006a2001410010d2052003280258450d6e20002003290358370200200041086a200341d8006a41086a2802003602000c6f0b200341d8006a2001410010d2052003280258450d6d20002003290358370200200041086a200341d8006a41086a2802003602000c6e0b200341d8006a2001410010d2052003280258450d6c20002003290358370200200041086a200341d8006a41086a2802003602000c6d0b200341d8006a2001410010d3052003280258450d6b20002003290358370200200041086a200341d8006a41086a2802003602000c6c0b200341d8006a2001410010d3052003280258450d6a20002003290358370200200041086a200341d8006a41086a2802003602000c6b0b200341d8006a2001410010d3052003280258450d6920002003290358370200200041086a200341d8006a41086a2802003602000c6a0b200341d8006a2001410010d3052003280258450d6820002003290358370200200041086a200341d8006a41086a2802003602000c690b200341d8006a2001410010d3052003280258450d6720002003290358370200200041086a200341d8006a41086a2802003602000c680b200341d8006a2001410010d3052003280258450d6620002003290358370200200041086a200341d8006a41086a2802003602000c670b200341d8006a2001410010d3052003280258450d6520002003290358370200200041086a200341d8006a41086a2802003602000c660b200341d8006a2001410010d3052003280258450d6420002003290358370200200041086a200341d8006a41086a2802003602000c650b200341d8006a2001410010d3052003280258450d6320002003290358370200200041086a200341d8006a41086a2802003602000c640b200341d8006a2001410010d3052003280258450d6220002003290358370200200041086a200341d8006a41086a2802003602000c630b200341d8006a2001410010d3052003280258450d6120002003290358370200200041086a200341d8006a41086a2802003602000c620b200341d8006a2001410010d3052003280258450d6020002003290358370200200041086a200341d8006a41086a2802003602000c610b200341d8006a2001410010d3052003280258450d5f20002003290358370200200041086a200341d8006a41086a2802003602000c600b200341d8006a2001410010d3052003280258450d5e20002003290358370200200041086a200341d8006a41086a2802003602000c5f0b200341d8006a2001410010d3052003280258450d5d20002003290358370200200041086a200341d8006a41086a2802003602000c5e0b200341d8006a2001410110d2052003280258450d5c20002003290358370200200041086a200341d8006a41086a2802003602000c5d0b200341d8006a2001410110d2052003280258450d5b20002003290358370200200041086a200341d8006a41086a2802003602000c5c0b200341d8006a2001410110d2052003280258450d5a20002003290358370200200041086a200341d8006a41086a2802003602000c5b0b200341d8006a2001410110d3052003280258450d5920002003290358370200200041086a200341d8006a41086a2802003602000c5a0b200341d8006a2001410110d3052003280258450d5820002003290358370200200041086a200341d8006a41086a2802003602000c590b200341d8006a2001410110d3052003280258450d5720002003290358370200200041086a200341d8006a41086a2802003602000c580b200341d8006a2001410110d3052003280258450d5620002003290358370200200041086a200341d8006a41086a2802003602000c570b200341d8006a2001410110d3052003280258450d5520002003290358370200200041086a200341d8006a41086a2802003602000c560b200341d8006a2001410110d3052003280258450d5420002003290358370200200041086a200341d8006a41086a2802003602000c550b200341d8006a2001410110d3052003280258450d5320002003290358370200200041086a200341d8006a41086a2802003602000c540b200341d8006a2001410110d3052003280258450d5220002003290358370200200041086a200341d8006a41086a2802003602000c530b200341d8006a2001410110d3052003280258450d5120002003290358370200200041086a200341d8006a41086a2802003602000c520b200341d8006a2001410110d3052003280258450d5020002003290358370200200041086a200341d8006a41086a2802003602000c510b200341d8006a2001410110d3052003280258450d4f20002003290358370200200041086a200341d8006a41086a2802003602000c500b200341d8006a2001410110d3052003280258450d4e20002003290358370200200041086a200341d8006a41086a2802003602000c4f0b200341d8006a2001410110d3052003280258450d4d20002003290358370200200041086a200341d8006a41086a2802003602000c4e0b200341d8006a2001410110d3052003280258450d4c20002003290358370200200041086a200341d8006a41086a2802003602000c4d0b200341d8006a2001410110d3052003280258450d4b20002003290358370200200041086a200341d8006a41086a2802003602000c4c0b200341d8006a2001410210d2052003280258450d4a20002003290358370200200041086a200341d8006a41086a2802003602000c4b0b200341d8006a2001410210d2052003280258450d4920002003290358370200200041086a200341d8006a41086a2802003602000c4a0b200341d8006a2001410210d2052003280258450d4820002003290358370200200041086a200341d8006a41086a2802003602000c490b200341d8006a2001410210d2052003280258450d4720002003290358370200200041086a200341d8006a41086a2802003602000c480b200341d8006a2001410210d2052003280258450d4620002003290358370200200041086a200341d8006a41086a2802003602000c470b200341d8006a2001410210d2052003280258450d4520002003290358370200200041086a200341d8006a41086a2802003602000c460b200341d8006a2001410210d2052003280258450d4420002003290358370200200041086a200341d8006a41086a2802003602000c450b200341d8006a2001410210d3052003280258450d4320002003290358370200200041086a200341d8006a41086a2802003602000c440b200341d8006a2001410210d3052003280258450d4220002003290358370200200041086a200341d8006a41086a2802003602000c430b200341d8006a2001410210d3052003280258450d4120002003290358370200200041086a200341d8006a41086a2802003602000c420b200341d8006a2001410210d3052003280258450d4020002003290358370200200041086a200341d8006a41086a2802003602000c410b200341d8006a2001410210d3052003280258450d3f20002003290358370200200041086a200341d8006a41086a2802003602000c400b200341d8006a2001410210d3052003280258450d3e20002003290358370200200041086a200341d8006a41086a2802003602000c3f0b200341d8006a2001410210d3052003280258450d3d20002003290358370200200041086a200341d8006a41086a2802003602000c3e0b200341d8006a2001410310d2052003280258450d3c20002003290358370200200041086a200341d8006a41086a2802003602000c3d0b200341d8006a2001410310d2052003280258450d3b20002003290358370200200041086a200341d8006a41086a2802003602000c3c0b200341d8006a2001410310d2052003280258450d3a20002003290358370200200041086a200341d8006a41086a2802003602000c3b0b200341d8006a2001410310d2052003280258450d3920002003290358370200200041086a200341d8006a41086a2802003602000c3a0b200341d8006a2001410310d2052003280258450d3820002003290358370200200041086a200341d8006a41086a2802003602000c390b200341d8006a2001410310d2052003280258450d3720002003290358370200200041086a200341d8006a41086a2802003602000c380b200341d8006a2001410310d2052003280258450d3620002003290358370200200041086a200341d8006a41086a2802003602000c370b200341d8006a2001410310d3052003280258450d3520002003290358370200200041086a200341d8006a41086a2802003602000c360b200341d8006a2001410310d3052003280258450d3420002003290358370200200041086a200341d8006a41086a2802003602000c350b200341d8006a2001410310d3052003280258450d3320002003290358370200200041086a200341d8006a41086a2802003602000c340b200341d8006a2001410310d3052003280258450d3220002003290358370200200041086a200341d8006a41086a2802003602000c330b200341d8006a2001410310d3052003280258450d3120002003290358370200200041086a200341d8006a41086a2802003602000c320b200341d8006a2001410310d3052003280258450d3020002003290358370200200041086a200341d8006a41086a2802003602000c310b200341d8006a2001410310d3052003280258450d2f20002003290358370200200041086a200341d8006a41086a2802003602000c300b200341d8006a20014101410010d4052003280258450d2e20002003290358370200200041086a200341d8006a41086a2802003602000c2f0b200341d8006a20014102410010d4052003280258450d2d20002003290358370200200041086a200341d8006a41086a2802003602000c2e0b200341d8006a20014102410010d4052003280258450d2c20002003290358370200200041086a200341d8006a41086a2802003602000c2d0b200341d8006a20014103410010d4052003280258450d2b20002003290358370200200041086a200341d8006a41086a2802003602000c2c0b200341d8006a20014103410010d4052003280258450d2a20002003290358370200200041086a200341d8006a41086a2802003602000c2b0b200341d8006a20014100410110d4052003280258450d2920002003290358370200200041086a200341d8006a41086a2802003602000c2a0b200341d8006a20014100410110d4052003280258450d2820002003290358370200200041086a200341d8006a41086a2802003602000c290b200341d8006a20014102410110d4052003280258450d2720002003290358370200200041086a200341d8006a41086a2802003602000c280b200341d8006a20014102410110d4052003280258450d2620002003290358370200200041086a200341d8006a41086a2802003602000c270b200341d8006a20014103410110d4052003280258450d2520002003290358370200200041086a200341d8006a41086a2802003602000c260b200341d8006a20014103410110d4052003280258450d2420002003290358370200200041086a200341d8006a41086a2802003602000c250b200341d8006a20014100410210d4052003280258450d2320002003290358370200200041086a200341d8006a41086a2802003602000c240b200341d8006a20014100410210d4052003280258450d2220002003290358370200200041086a200341d8006a41086a2802003602000c230b200341d8006a20014101410210d4052003280258450d2120002003290358370200200041086a200341d8006a41086a2802003602000c220b200341d8006a20014101410210d4052003280258450d2020002003290358370200200041086a200341d8006a41086a2802003602000c210b200341d8006a20014103410210d4052003280258450d1f20002003290358370200200041086a200341d8006a41086a2802003602000c200b200341d8006a20014100410310d4052003280258450d1e20002003290358370200200041086a200341d8006a41086a2802003602000c1f0b200341d8006a20014100410310d4052003280258450d1d20002003290358370200200041086a200341d8006a41086a2802003602000c1e0b200341d8006a20014101410310d4052003280258450d1c20002003290358370200200041086a200341d8006a41086a2802003602000c1d0b200341d8006a20014101410310d4052003280258450d1b20002003290358370200200041086a200341d8006a41086a2802003602000c1c0b200341d8006a20014102410310d4052003280258450d1a20002003290358370200200041086a200341d8006a41086a2802003602000c1b0b200341d8006a20014102410010d4052003280258450d1920002003290358370200200041086a200341d8006a41086a2802003602000c1a0b200341d8006a20014103410110d4052003280258450d1820002003290358370200200041086a200341d8006a41086a2802003602000c190b200341d8006a20014100410210d4052003280258450d1720002003290358370200200041086a200341d8006a41086a2802003602000c180b200341d8006a20014101410310d40520032802580d010c160b200341ec006a41013602002003420237025c200341d493c6003602582003413336023c2003200441056a3602382003200341386a360268200341106a200341d8006a1037200041086a200341106a41086a280200360200200020032903103702000c160b20002003290358370200200041086a200341d8006a41086a2802003602000c150b200329023c210b200328023821010b2001450d122000200b370204200020013602000c130b200329023c210b200328023821010b2001450d102000200b370204200020013602000c110b2004450d0f2001290200210b0b2000200b370204200020043602000c0f0b024002400240200141306a2802002202417f6a220420024f0d00200420024b0d00200128022820044103746a22052802002204200141206a220628020022024b0d01200421010c020b4118102a2200450d0c2003421837025c20032000360258200341d8006a4100411810c80520032003280260220041186a3602602000200328025822016a411841ba9dc600411810c9052003200329025c37025c2003200136025841b892c600413b200341d8006a41f492c600103b000b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490d0d2007410174220a2009200a20094b1b22094100480d0d0240024020070d002009102a21070c010b200128021820072009102e21070b2007450d0c200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a220210da051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060c0d0b200641027421060340200320042802002205360248200220054d0d0220022005417f736a220520024f0d060240200720054103746a22052d00044103460d0020052d00054104470d040b200441046a21042006417c6a22060d000b410421090b200341d8006a200141186a2202200d410010ca0520032d00584101470d02200341086a200341e4006a2802003602002003200329025c3703000c030b200341ec006a220441023602002003411c6a41013602002003420237025c200341d49dc60036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a1037200328023821022003200329023c37023c20032002360238200441013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b2003200b370204200320023602000c020b2003411c6a4133360200200341ec006a41023602002003420237025c200341e493c6003602582003200541056a360218200341333602142003200341106a3602682003200341306a3602102003200341d8006a10370c010b0240200941ff01714104460d00200341d8006a2002200d200910ca050240024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490d0b200441017422062005200620054b1b22054100480d0b0240024020040d002005102a21020c010b200228020020042005102e21020b2002450d0a200120023602182001411c6a2005360200200141206a28020021040b200128021820046a20093a0000200141206a2202200228020041016a3602000c030b200341ec006a220241013602002003420137025c200341b49ec6003602582003410136023c200320053602382003200341386a360268200341106a200341d8006a103720032802102204450d022003200329021437023c20032004360238200241013602002003420137025c200341e897c6003602582003412d360204200320033602682003200341386a360200200341106a200341d8006a1037200328021021022003290214210b0240200328023c450d002003280238102c0b20020d010c020b200328025c2202450d01200341e0006a290300210b0b2003200b370204200320023602000c010b200341003602000b024020032802002202450d0020002003290204370204200020023602000c090b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b4118102a2200450d052003421837025c20032000360258200341d8006a4100411810c80520032003280260220041186a3602602000200328025822016a411841ba9dc600411810c9052003200329025c37025c2003200136025841b892c600413b200341d8006a41f492c600103b000b02400240200128022820044103746a22052802002204200141206a220628020022024b0d00200421010c010b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490d072007410174220a2009200a20094b1b22094100480d070240024020070d002009102a21070c010b200128021820072009102e21070b2007450d06200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a220210da051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060c070b41969ec600411d1054000b2001450d050b2000200b370204200020013602000c050b024002400240200141306a2802002202417f6a220420024f0d00200420024b0d00200128022820044103746a22052802002204200141206a220628020022024b0d01200421010c020b4118102a2200450d022003421837025c20032000360258200341d8006a4100411810c80520032003280260220041186a3602602000200328025822016a411841ba9dc600411810c9052003200329025c37025c2003200136025841b892c600413b200341d8006a41f492c600103b000b024002402001411c6a280200220720026b200420026b2208490d0020012802182107200221010c010b200220086a22092002490d032007410174220a2009200a20094b1b22094100480d030240024020070d002009102a21070c010b200128021820072009102e21070b2007450d02200120073602182001411c6a2009360200200141206a28020021010b200720016a21090240024020084102490d002009410420042002417f736a220210da051a2007200220016a22016a21090c010b2008450d010b200941043a0000200141016a21010b20062001360200200541013a00060c030b1033000b1035000b200341d8006a200141186a200610cb052003280258450d0020002003290358370200200041086a200341d8006a41086a2802003602000c010b200041003602000b200341f0006a24000b6401017f230041206b2202240020024134360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241d49ec6003602082002200236021820012000200241086a10392101200241206a240020010b19002000200141186a280200360204200020012802103602000bc50201037f230041206b2202240002400240200028020022002d00004104470d002002200128021841c4f7c50041082001411c6a28020028020c11000022003a001820022001360210200241003a0019200241003602140c010b2002200128021841ccf7c50041052001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41d4f7c5001061210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d004101210020042802184198b0c00041012004411c6a28020028020c1100000d010b2001280200220028021841ec94c60041012000411c6a28020028020c11000021000b200120003a00080b200241206a2400200041ff01714100470bc00201037f230041206b220224000240024020002d00004104470d002002200128021841c4f7c50041082001411c6a28020028020c11000022003a001820022001360210200241003a0019200241003602140c010b2002200128021841ccf7c50041052001411c6a28020028020c1100003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41d4f7c5001061210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d004101210020042802184198b0c00041012004411c6a28020028020c1100000d010b2001280200220028021841ec94c60041012000411c6a28020028020c11000021000b200120003a00080b200241206a2400200041ff01714100470bcd0202027f027e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f552001104221000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b20034180011047000b20034180011047000bcd0203027f017e017f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210020034120710d012000ac22042004423f8722047c2004852000417f73411f762001104221000c020b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d022001410141b087c0004102200220006a4180016a410020006b104521000c010b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141b087c0004102200220036a4180016a410020036b104521000b20024180016a240020000f0b20034180011047000b20004180011047000b8a0201027f230041106b2202240020002802002802002100200128021841ecebc500410b2001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200036020c200241f7ebc50041052002410c6a41fcebc500106021012002200041086a36020c2001418cecc50041072002410c6a41dcebc50010601a20022d00042101024020022d0005450d00200141ff0171210041012101024020000d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d0020034192b0c0004102200011000021010c010b20034194b0c0004101200011000021010b200220013a00040b200241106a2400200141ff01714100470bcc0101047f230041106b220224002000280200220041046a28020021032000280200210041012104200128021841d1afc00041012001411c6a28020028020c1100002105200241003a0005200220053a00042002200136020002402003450d002003410274210103402002200036020c20022002410c6a41b4f7c50010621a200041046a21002001417c6a22010d000b20022d000421050b0240200541ff01710d002002280200220028021841d2afc00041012000411c6a28020028020c11000021040b200241106a240020040bc60501087f230041106b220324002002280208220441546a2105200241106a280200220641306c210702400340410021082007450d01200741506a21072005412c6a2109200541306a220a210520092d00004103470d000b200a41086a2802002207450d00200741286c2105200a28020041186a2107410021080340200820072d0000456a2108200741286a2107200541586a22050d000b0b0240024002400240024002400240200120086b220a20014b0d00200641306c2107200441546a210503402007450d02200741506a21072005412c6a2108200541306a2209210520082d0000410c470d000b200941086a280200200a4b0d02411e102a2207450d062000200736020420004101360200200741166a41002900bafa45370000200741106a41002900b4fa45370000200741086a41002900acfa45370000200741002900a4fa45370000200041086a429e808080e0033702000c050b412c102a22070d020c050b412c102a2207450d042000200736020420004101360200200741286a41002800a0fa45360000200741206a4100290098fa45370000200741186a4100290090fa45370000200741106a4100290088fa45370000200741086a4100290080fa45370000200741002900f8f945370000200041086a42ac808080c0053702000c030b2009280200200a41186c6a28020821072003200a200210b30520032802004101460d0120032802042105200041003602002000200520076a3602040c020b2000200736020420004101360200200741286a41002800f4f945360000200741206a41002900ecf945370000200741186a41002900e4f945370000200741106a41002900dcf945370000200741086a41002900d4f945370000200741002900ccf945370000200041086a42ac808080c0053702000c010b20002003290204370204200041013602002000410c6a2003410c6a2802003602000b200341106a24000f0b1033000bdf0902067f017e024020010d00200041ac013a00000f0b02400240024002400240024020012d00002202414f6a41fb004f0d000c010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e312c2c0001022c2c0304052c06072c2c08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292c0b20012d00012103410221020c2b0b20012d00012103410321020c2a0b20012d00012103410421020c290b200141046a2802002104410721020c270b200141046a2802002104410821020c260b200141046a2802002105410c102a2204450d272005280204220641ffffffff03712006470d2820064102742201417f4c0d280240024020010d00410421070c010b2001102a2207450d280b02402006450d00200528020021012006410274210320072102034020022001280200360200200241046a2102200141046a21012003417c6a22030d000b0b200420063602042004200736020020042005280208360208410921020c250b200141046a2802002104410b21020c240b200141046a280200210420012d00012103410c21020c240b200141046a2802002104410f21020c220b200141046a2802002104411021020c210b200141046a2802002104411121020c200b200141046a2802002104411221020c1f0b200141046a2802002104411321020c1e0b200141046a280200210420013502082108411421020c1d0b200141046a280200210420013502082108411521020c1c0b200141046a280200210420013502082108411621020c1b0b200141046a280200210420013502082108411721020c1a0b200141046a280200210420013502082108411821020c190b200141046a280200210420013502082108411921020c180b200141046a280200210420013502082108411a21020c170b200141046a280200210420013502082108411b21020c160b200141046a280200210420013502082108411c21020c150b200141046a280200210420013502082108411d21020c140b200141046a280200210420013502082108411e21020c130b200141046a280200210420013502082108411f21020c120b200141046a280200210420013502082108412021020c110b200141046a280200210420013502082108412121020c100b200141046a280200210420013502082108412221020c0f0b200141046a280200210420013502082108412321020c0e0b200141046a280200210420013502082108412421020c0d0b200141046a280200210420013502082108412521020c0c0b200141046a280200210420013502082108412621020c0b0b200141046a280200210420013502082108412721020c0a0b200141046a280200210420013502082108412821020c090b200141046a280200210420013502082108412921020c080b200141046a280200210420013502082108412a21020c070b20012d00012103412b21020c070b20012d00012103412c21020c060b200141046a2802002104412d21020c040b20012903082108412e21020c020b200141046a2802002104412f21020c020b20012903082108413021020b0b0b200020033a0001200020023a0000200041086a2008370300200041046a20043602000f0b1033000b103a000b890301067f230041106b220224000240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b4104762207490d00200028020021030c010b200420076a22062004490d02200341017422052006200520064b1b220641ffffffff00712006470d02200641047422054100480d020240024020030d002005102a21030c010b200028020020034104742005102e21030b2003450d0120002003360200200041046a2006360200200041086a280200210420012802042105200128020021060b0240024020062005470d00410021060c010b2001200641106a3602000b2002200610ac05024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a29030037030002400240200128020022052001280204470d00410021050c010b2001200541106a3602000b200441016a2104200641106a21062002200510ac0520022d000041ac01470d000b0b200041086a2004360200200241106a24000f0b1033000b1035000b100020002802003502004101200110420ba607010b7f230041e0006b22032400200320013602202002280208220441546a2105200241106a280200220641306c210202400340024020020d00410021070c020b200241506a21022005412c6a2107200541306a2208210520072d00004102470d000b200341186a200810f40420032802182107200328021c21020b2002410020071b2109200641306c2102200441546a21052007410420071b210a02400340024020020d004100210b0c020b200241506a21022005412c6a2107200541306a2208210520072d00004104470d000b200341106a200810f4042003280210210b2003280214210c0b200641306c2102200441546a2105200b4104200b1b210d02400240024002400240024002400240024003402002450d01200241506a21022005412c6a2107200541306a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d01200641306c2102200441546a210503402002450d07200241506a21022005412c6a2107200541306a2208210520072d00004103470d000b200341086a200810f404200328020c220b41286c210520032802082204210703402005450d08200541586a2105200741186a2108200741286a2202210720082d00000d000b20010d02200241586a21020c030b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22020d030b200341cc006a41013602002003420237023c200341e4fbc5003602382003410136022c2003200341286a3602482003200341206a360228200341d0006a200341386a1037200341d0006a21020c030b2004200b41286c6a210803402001417f6a2101034020082002460d06200241186a2105200241286a2207210220052d00000d000b2007210220010d000b200741586a21020b2002411c6a21020b2003200228020022023602240240200920024d0d00200a20024104746a2202450d0020002002360204410021020c040b200341cc006a4102360200200341dc006a41013602002003420337023c200341f4fbc500360238200341013602542003200341d0006a3602482003200341206a3602582003200341246a360250200341286a200341386a1037200341286a21020b20022802002105200041086a200229020437020020002005360204410121020c020b41c2fac50041c2001054000b4184fbc50041dd001054000b20002002360200200341e0006a24000bea0302057f017e02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441c4006a2802002105200441386a2802002106200441346a2802002107200141016a21010c010b02400240200028020022010d002003ad210841002104410021010c010b20003301044220862003ad842108410121040b2000102c2008a72103024002402008422088a7220620012f01064f0d00200121050c010b034002400240200128020022050d002003ad2108410021050c010b200441016a210420013301044220862003ad8421080b2001102c2008a72103200521012008422088a7220620052f01064f0d000b0b200641027420056a4198036a2802002100200520064105746a220141c4006a2802002105200141386a2802002106200141346a280200210702402004417f6a2201450d00034020002802940321002001417f6a22010d000b0b410021010b20054102460d012002417f6a210202402006450d002007102c0b20020d000b0b0240200041d0e1c100460d00200028020021012000102c2001450d00200128020021052001102c2005450d00024020052802002201450d0003402005102c2001210520012802002200210120000d000b0b2005102c0b0bf80d01067f0240024020002d00002201410e4b0d00024002400240024002400240024002400240024002400240024020010e0f0001020304050607080e090e0a0b0c000b200041086a280200450d0d200041046a280200102c0f0b0240200041086a280200450d00200041046a280200102c0b200041146a280200450d0c200041106a280200102c0f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200102c0b200141106a2101200241706a22020d000b0b200041086a280200450d0b2000280204102c0f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200102c0b0240200141106a280200450d002001410c6a280200102c0b200141286a2101200241586a22020d000b0b200041086a280200450d0a2000280204102c0f0b200041086a280200450d09200041046a280200102c0f0b200041086a280200450d08200041046a280200102c0f0b200041086a280200450d07200041046a280200102c0f0b02402000410c6a2802002201450d00200041046a280200220320014104746a21040340024020032802082202450d0020032802002101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102c200528020021060b2006102c0b200141106a2101200241706a22020d000b0b200341106a21010240200341046a280200450d002003280200102c0b2001210320012004470d000b0b200041086a280200450d062000280204102c0f0b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200102c0b200141146a21012002416c6a22020d000b0b200041086a280200450d052000280204102c0f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a21040340024020032802042201450d0002402003410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102c200528020021060b2006102c0b200141106a2101200241706a22020d000b0b200341086a280200450d002003280204102c0b2003411c6a21010240200341146a280200450d002003280210102c0b2001210320012004470d000b0b200041086a280200450d042000280204102c0f0b02402000410c6a2802002201450d00200041046a2802002203200141186c6a210403400240200341046a280200450d002003280200102c0b0240200341146a2802002202450d00200328020c2101200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102c200528020021060b2006102c0b200141106a2101200241706a22020d000b0b200341186a21010240200341106a280200450d00200328020c102c0b2001210320012004470d000b0b200041086a280200450d032000280204102c0f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a21040340024020032802042201450d0002402003410c6a2802002202450d00200241047421020340024020012d00004109470d000240200141046a2205280200220628020441ffffffff0371450d002006280200102c200528020021060b2006102c0b200141106a2101200241706a22020d000b0b200341086a280200450d002003280204102c0b2003411c6a21010240200341146a280200450d002003280210102c0b2001210320012004470d000b0b200041086a280200450d022000280204102c0f0b0240200041046a2802002201450d00200041086a280200450d002001102c0b0240200041146a2802002201450d0002402000411c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102c0b2001410c6a2101200241746a22020d000b0b200041186a280200450d002000280214102c0b200041246a2802002203450d0102402000412c6a2802002201450d00200320014104746a210403402003220541106a2103024020052802042201450d0002402005410c6a2802002202450d002002410c6c21020340024020012802002206450d00200141046a280200450d002006102c0b2001410c6a2101200241746a22020d000b0b200541086a280200450d002005280204102c0b20032004470d000b0b200041286a280200450d012000280224102c0c010b0240200041086a280200450d00200041046a280200102c0b0240200041146a2802002201450d00200041186a280200450d002001102c0b200041246a280200450d00200041206a280200102c0f0b0bd20a01067f02400240024020012d00002202414f6a41fb00490d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e312a2a0001022a2a0304052a06072a2a08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a0b200020012d00013a0001200041023a00000f0b200020012d00013a0001200041033a00000f0b200020012d00013a0001200041043a00000f0b200041046a200141046a280200360200200041073a00000f0b200041046a200141046a280200360200200041083a00000f0b200141046a2802002103410c102a2204450d252003280204220541ffffffff03712005470d2620054102742201417f4c0d260240024020010d00410421060c010b2001102a2206450d260b02402005450d00200328020021012005410274210720062102034020022001280200360200200241046a2102200141046a21012007417c6a22070d000b0b200420053602042004200636020020042003280208360208200041046a2004360200200041093a00000f0b200041046a200141046a2802003602002000410b3a00000f0b200020012d00013a0001200041046a200141046a2802003602002000410c3a00000f0b200041046a200141046a2802003602002000410f3a00000f0b200041046a200141046a280200360200200041103a00000f0b200041046a200141046a280200360200200041113a00000f0b200041046a200141046a280200360200200041123a00000f0b200041046a200141046a280200360200200041133a00000f0b200041046a200141046a290200370200200041143a00000f0b200041046a200141046a290200370200200041153a00000f0b200041046a200141046a290200370200200041163a00000f0b200041046a200141046a290200370200200041173a00000f0b200041046a200141046a290200370200200041183a00000f0b200041046a200141046a290200370200200041193a00000f0b200041046a200141046a2902003702002000411a3a00000f0b200041046a200141046a2902003702002000411b3a00000f0b200041046a200141046a2902003702002000411c3a00000f0b200041046a200141046a2902003702002000411d3a00000f0b200041046a200141046a2902003702002000411e3a00000f0b200041046a200141046a2902003702002000411f3a00000f0b200041046a200141046a290200370200200041203a00000f0b200041046a200141046a290200370200200041213a00000f0b200041046a200141046a290200370200200041223a00000f0b200041046a200141046a290200370200200041233a00000f0b200041046a200141046a290200370200200041243a00000f0b200041046a200141046a290200370200200041253a00000f0b200041046a200141046a290200370200200041263a00000f0b200041046a200141046a290200370200200041273a00000f0b200041046a200141046a290200370200200041283a00000f0b200041046a200141046a290200370200200041293a00000f0b200041046a200141046a2902003702002000412a3a00000f0b200020012d00013a00012000412b3a00000f0b200020012d00013a00012000412c3a00000f0b200041046a200141046a2802003602002000412d3a00000f0b200041086a200141086a2903003703002000412e3a00000f0b200041046a200141046a2802003602002000412f3a00000f0b200041086a200141086a290300370300413021020b200020023a00000f0b1033000b103a000bda60010c7f230041a0016b22032400200320013602242002280208220441546a2105200241106a280200220641306c210102400240024002400240024002400240024003402001450d01200141506a21012005412c6a2107200541306a2208210520072d00004104470d000b200641306c2101200441546a210503402001450d02200141506a21012005412c6a2107200541306a2209210520072d0000410c470d000b200641306c2101200441546a210503402001450d03200141506a21012005412c6a2107200541306a2204210520072d00004102470d000b024041002802d8a1464105490d00200341013602442003200341246a36024041002802e4a146210141002802e0a146210541002802dca146210720034198016a41980136020020034190016a42ee808080103703002003418c016a41b483c60036020020034184016a422537020020034180016a41ac84c600360200200341f8006a4201370300200341e8006a4201370300200341e0006a410a360200200341f4006a200341c0006a360200200341cc81c600360264200341a284c60036025c20034105360258200541ecb3c000200741024622071b200341d8006a200141d4b3c00020071b2802101102000b200341186a200810f404200328021c200328022422014d0d03200328021820014102746a2201450d03200341106a200410f40402402003280214200128020022014d0d00200328021020014104746a22010d050b4125102a2201450d052001411d6a41002900f18146370000200141186a41002900ec8146370000200141106a41002900e48146370000200141086a41002900dc8146370000200141002900d48146370000200041086a42a5808080d00437020020002001360204200041013602000c080b4113102a2201450d042001410f6a41002800a78146360000200141086a41002900a08146370000200141002900988146370000200041086a4293808080b00237020020002001360204200041013602000c070b410f102a2201450d03200141076a41002900b28146370000200141002900ab8146370000200041086a428f808080f00137020020002001360204200041013602000c060b410f102a2201450d02200141076a41002900c18146370000200141002900ba8146370000200041086a428f808080f00137020020002001360204200041013602000c050b4125102a2201450d012001411d6a41002900f18146370000200141186a41002900ec8146370000200141106a41002900e48146370000200141086a41002900dc8146370000200141002900d48146370000200041086a42a5808080d00437020020002001360204200041013602000c040b0240200941086a280200200328022422054b0d004127102a2201450d012001411f6a41002900988246370000200141186a41002900918246370000200141106a41002900898246370000200141086a41002900818246370000200141002900f98146370000200041086a42a7808080f00437020020002001360204200041013602000c040b20092802002109200341286a41086a420037030020034280808080c00037032820012d000d2107410021012003410036024820032007410447220a3602442003200a360240200341003a004c024002400240024041002802d8a14641044b0d00200341d8006a41086a200341c0006a41086a29030037030020032003290340370358200341286a410472210b200341d8006a21070c010b200341353602542003200341c0006a36025041002802e4a146210141002802e0a146210741002802dca146210820034198016a41cb0036020020034190016a42ee808080103703002003418c016a41b483c60036020020034184016a422537020020034180016a41ac84c600360200200341f8006a4201370300200341e8006a4201370300200341d8006a41086a2206410a360200200341f4006a200341d0006a360200200341a082c600360264200341a284c60036025c20034105360258200741ecb3c000200841024622081b200341d8006a200141d4b3c00020081b28021011020020032802342108200328023021012006200341c0006a41086a29030037030020032003290340370358200341286a410472210b200341d8006a210720082001470d010b200141016a22082001490d01200141017422062008200620084b1b220841ffffffff00712008470d01200841047422064100480d010240024020010d002006102a21010c010b200b28020020014104742006102e21010b2001450d02200b200136020020032008360230200328023421080b200b28020020084104746a22012007290200370200200141086a200741086a2902003702002003200328023441016a360234410021072009200541186c6a2201280214450d022009200541186c6a410c6a2109200141146a2108200341d8006a410472210c410021074100210103400240200328022820074d0d00200341d8006a200341286a410010ba05024020032802584101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c060b20072003280228200328025c2d000c1b21070b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001200828020022054f0d002003200928020020014104746a220536023c024041002802d8a1464105490d002003412e36024420032003413c6a36024041002802e4a146210541002802e0a146210641002802dca146210d200341c90136029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d49ec6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328023c21050b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052d000022060eac0102310000003101030405060708090a0b0c0d0e0f1010101010101010101010101010111111111111111111121314141414151616161616161616161615161616161616161616161616161616161616161616161717171818181818181818181818181818181717171818181818181818181818181818181717171717171718181818181818171717171717171818181818181819191919191919191919191919191919191919191919191919020b20052d000121052003200328022836024820032005410447220536024020032006410347200571360244200341003a004c024041002802d8a1464105490d00200341353602542003200341c0006a36025041002802e4a146210541002802e0a146210641002802dca146210d200341cb0036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341a082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341d0006a360274200641ecb3c000200d1b200341d8006a20051102000b200341d8006a41086a2206200341c0006a41086a290300370300200320032903403703580240200328023422052003280230470d00200541016a220d2005490d332005410174220e200d200e200d4b1b220d41ffffffff0071200d470d33200d410474220e4100480d330240024020050d00200e102a21050c010b200b2802002005410474200e102e21050b2005450d34200b20053602002003200d360230200328023421050b200b28020020054104746a22052003290358370200200541086a20062903003702002003200328023441016a3602340c300b41002105024041002802d8a1464105490d00024020032802342206417f6a220d20064b0d00200b280200200d4104746a4100200d2006491b21050b20034136360254200320053602402003200341c0006a36025041002802e4a146210541002802e0a146210641002802dca146210d200341d30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341a882c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341d0006a360274200641ecb3c000200d1b200341d8006a20051102000b024020032802342205450d0020032005417f6a2205360234200b28020020054104746a22052d000c4102470d1a0b4117102a2201450d322001410f6a41002900bf8246370000200141086a41002900b88246370000200141002900b08246370000200041086a4297808080f00237020020002001360204200041013602000c340b024041002802d8a1464105490d0041002802e4a146210541002802e0a146210641002802dca146210d200341c10036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003410036027c2003420437027420034201370368200341c882c6003602642003410a360260200341a284c60036025c20034105360258200641ecb3c000200d410246220d1b200341d8006a200541d4b3c000200d1b2802101102000b024020032802342205417f6a220620054f0d00200620054d0d180b4117102a2201450d312001410f6a41002900bf8246370000200141086a41002900b88246370000200141002900b08246370000200041086a4297808080f00237020020002001360204200041013602000c330b200341d8006a200341286a200541046a28020010ba05024020032802584101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c330b200341d8006a200341286a200328025c28020410bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c330b024041002802d8a1464105490d0041002802e4a146210541002802e0a146210641002802dca146210d200341c10036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003410036027c2003420437027420034201370368200341c882c6003602642003410a360260200341a284c60036025c20034105360258200641ecb3c000200d410246220d1b200341d8006a200541d4b3c000200d1b2802101102000b024020032802342205417f6a220620054f0d00200620054d0d1a0b4117102a2201450d302001410f6a41002900bf8246370000200141086a41002900b88246370000200141002900b08246370000200041086a4297808080f00237020020002001360204200041013602000c320b200341d8006a200341286a200541046a28020010ba05024020032802584101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c320b200341d8006a200341286a200328025c280204220510bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c320b200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c320b20032005360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d19410e102a2201450d2f200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c310b200341d8006a200341286a200541046a28020028020810ba05024020032802584101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c310b200328025c280204210d2005280204220628020441027421052006280200210602400340024020050d00200341d8006a200341286a200d10bc052003280258450d0220002003290358370204200041013602002000410c6a200341e0006a2802003602000c330b200341d8006a200341286a200628020010ba05024020032802584101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c330b2005417c6a2105200641046a2106200328025c280204200d460d000b4127102a2201450d2f2001411f6a41002900858346370000200141186a41002900fe8246370000200141106a41002900f68246370000200141086a41002900ee8246370000200141002900e68246370000200041086a42a7808080f00437020020002001360204200041013602000c310b024041002802d8a1464105490d0041002802e4a146210541002802e0a146210641002802dca146210d200341c10036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003410036027c2003420437027420034201370368200341c882c6003602642003410a360260200341a284c60036025c20034105360258200641ecb3c000200d410246220d1b200341d8006a200541d4b3c000200d1b2802101102000b024020032802342205417f6a220620054f0d00200620054d0d1a0b4117102a2201450d2e2001410f6a41002900bf8246370000200141086a41002900b88246370000200141002900b08246370000200041086a4297808080f00237020020002001360204200041013602000c300b200341d8006a200341286a200a10bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c300b024041002802d8a1464105490d0041002802e4a146210541002802e0a146210641002802dca146210d200341c10036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003410036027c2003420437027420034201370368200341c882c6003602642003410a360260200341a284c60036025c20034105360258200641ecb3c000200d410246220d1b200341d8006a200541d4b3c000200d1b2802101102000b024020032802342205417f6a220620054f0d00200620054d0d1a0b4117102a2201450d2d2001410f6a41002900bf8246370000200141086a41002900b88246370000200141002900b08246370000200041086a4297808080f00237020020002001360204200041013602000c2f0b200341d8006a200541046a280200200210af05024020032802584101470d00200041013602002000200c2902003702042000410c6a200c41086a2802003602000c2f0b200341d8006a200341286a200328025c220528020810bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c2f0b200320052d000d4104472205360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d19410e102a2201450d2c200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c2e0b200341086a200410f40402400240200328020c200541046a28020022054d0d002003280208220620054104746a220d0d010b410e102a2201450d2c200141066a410029009383463700002001410029008d8346370000200041086a428e808080e00137020020002001360204200041013602000c2e0b200341d8006a200341286a200620054104746a28020810bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c2e0b2003200d2d000d4104472205360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d19410e102a2201450d2b200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c2d0b200341d8006a200341286a410110bc052003280258450d2720002003290358370204200041013602002000410c6a200341e0006a2802003602000c2c0b200341d8006a200341286a410210bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c2c0b41012105200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c2c0b20034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d18410e102a2201450d29200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c2b0b4101210520034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d18410e102a2201450d28200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c2a0b200341d8006a200341286a410110bc052003280258450d2420002003290358370204200041013602002000410c6a200341e0006a2802003602000c290b41012105200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c290b20034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d17410e102a2201450d26200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c280b4101210520034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d17410e102a2201450d25200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c270b200341d8006a200341286a410110bc052003280258450d2120002003290358370204200041013602002000410c6a200341e0006a2802003602000c260b41012105200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c260b20034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d16410e102a2201450d23200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c250b200341d8006a200341286a410210bc052003280258450d1f20002003290358370204200041013602002000410c6a200341e0006a2802003602000c240b4101210520034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d21200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c230b41012105200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c230b20034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d20200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c220b4101210520034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d1f200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c210b41012105200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c210b20034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d1e200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c200b200341d8006a200341286a410210bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c200b4101210520034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d1d200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c1f0b41012105200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c1f0b20034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d1c200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c1e0b200341d8006a200341286a410210bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c1e0b4101210520034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d1b200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c1d0b41012105200341d8006a200341286a410110bc0502402003280258450d0020002003290358370204200041013602002000410c6a200341e0006a2802003602000c1d0b20034101360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a2005110200200328025021050b2003280228220620056a220520064f0d15410e102a2201450d1a200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c1c0b200b28020020064104746a41013a000c0c160b20052802002106200320052802082205360240024041002802d8a1464105490d00200341013602542003200341c0006a36025041002802e4a146210541002802e0a146210d41002802dca146210e200341db0036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c6003602800120034201370378200342013703682003419c83c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200e410246220e1b28021021052003200341d0006a360274200d41ecb3c000200e1b200341d8006a2005110200200328024021050b2003200536022820032006360250024041002802d8a1464105490d00200341013602442003200341d0006a36024041002802e4a146210541002802e0a146210641002802dca146210d200341e30036029801200342ee8080801037039001200341b483c60036028c012003422537028401200341ac84c600360280012003420137037820034201370368200341d082c6003602642003410a360260200341a284c60036025c20034105360258200541d4b3c000200d410246220d1b28021021052003200341c0006a360274200641ecb3c000200d1b200341d8006a200511020020032802282105200328025021060b200520066a220620054f0d14410e102a2201450d18200141066a41002900de8246370000200141002900d88246370000200041086a428e808080e00137020020002001360204200041013602000c1a0b41a483c600200120051038000b200b28020020064104746a41013a000c0c130b200320053602280c120b200b28020020064104746a41013a000c0c110b200b28020020064104746a41013a000c0c100b200320053602280c0f0b200320053602280c0e0b200320053602280c0d0b200320053602280c0c0b200320053602280c0b0b200320053602280c0a0b200320053602280c090b200320053602280c080b200320053602280c070b200320053602280c060b200320053602280c050b200320053602280c040b200320053602280c030b200320053602280c020b200320053602280c010b200320063602280b200141016a22012008280200490d000c030b0b1035000b1033000b20004100360200200020073602042003280230450d01200b280200102c0c010b2003280230450d00200b280200102c0b200341a0016a24000b2200200141b2aec00041adaec00020002802002d000022001b4104410520001b10480bd50302047f017e024020014101762202450d0003402002417f6a2202210302400240024003402003410174220441017221050240200441026a220420014f0d00200520014f0d0220042005200020054103746a280200200020044103746a280200491b21050b200520014f0d03200320014f0d02200020034103746a2203280200200020054103746a22042802004f0d03200329020021062003200429020037020020042006370200200521030c000b0b41a080c600200520011038000b41b080c600200320011038000b20020d000b0b0240024020014102490d002001210403402004417f6a220420014f0d02200029020021062000200020044103746a2205290200370200200520063702004100210302400240024003402003410174220241017221050240200241026a220220044f0d00200520044f0d0220022005200020054103746a280200200020024103746a280200491b21050b200520044f0d03200320044f0d02200020034103746a2203280200200020054103746a22022802004f0d03200329020021062003200229020037020020022006370200200521030c000b0b41a080c600200520041038000b41b080c600200320041038000b200441014b0d000b0b0f0b4188ffc500200420011038000bea04050a7f017e017f017e027f200041686a21022001417f6a2103200041086a2104410021052001413249210641012107024003400240024020072001490d00410021080c010b410121082000200741037422096a220a280200220b200a41786a280200490d00200420096a210803404101210a20032007460d03200741016a21072008280200220a200b4f2109200841086a2108200a210b20090d000b200720014921080b2007200146210a20060d0120072001460d010240024002400240024002402007417f6a220b20014f0d002008450d012000200b4103746a220b290200210c200b20002007410374220d6a2208290200220e3702002008200c37020020074102490d0520002007417e6a220a4103746a220f280200200ea722094d0d05200b200f290200370200200a450d0420002007417d6a220a4103746a28020020094d0d042002200d6a210b0340200b41086a200b290200370200200a450d03200a417f6a210a200b41786a220b28020020094b0d000b200a41016a210b0c030b41f8fec500200b20011038000b4188ffc500200720011038000b4100210b0b2000200b4103746a210f0b200f200e3702000b200541016a21050240200120076b220a4102490d00200828020820082802004f0d002008290200210c20082008290208370200200841086a210f0240200a4103490d002008280210200ca722104f0d00200841106a21094103210b4102210d0340200d41037420086a220f41786a2009290200370200200b200a4f0d01200b4103742109200b210d200b41016a210b200820096a22092802002010490d000b0b200f200c3702000b20054105470d000b4100210a0b200a0b02000bcc0201027f230041106b2202240020002802002802002100200128021841c080c60041052001411c6a28020028020c1100002103200241003a0005200220033a00042002200136020020022000410c6a36020c200241c580c600410e2002410c6a41d480c600106021012002200036020c200141e480c60041092002410c6a41f080c600106021012002200041046a36020c2001418081c600410c2002410c6a41f080c600106021012002200041086a36020c2001418c81c600410c2002410c6a41f080c60010601a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d0020034192b0c0004102200111000021000c010b20034194b0c0004101200111000021000b200220003a00040b200241106a2400200041ff01714100470bc20201027f230041106b22022400200128021841c080c60041052001411c6a28020028020c1100002103200241003a0005200220033a00042002200136020020022000410c6a36020c200241c580c600410e2002410c6a41d480c600106021012002200036020c200141e480c60041092002410c6a41f080c600106021012002200041046a36020c2001418081c600410c2002410c6a41f080c600106021012002200041086a36020c2001418c81c600410c2002410c6a41f080c60010601a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d0020034192b0c0004102200111000021000c010b20034194b0c0004101200111000021000b200220003a00040b200241106a2400200041ff01714100470b8d0201027f02400240024002402001410c6a2802002203417f6a220420034d0d004116102a2201450d01200020013602042001410e6a41002900c58546370000200141086a41002900bf8546370000200141002900b78546370000200041086a4296808080e0023702000c030b0240200420026b220220044d0d00411b102a2201450d0120002001360204200141176a41002800e48546360000200141106a41002900dd8546370000200141086a41002900d58546370000200141002900cd8546370000200041086a429b808080b0033702000c030b200320024d0d012000200128020420024104746a360204200041003602000f0b1033000b41d087c600200220031038000b200041013602000bba0201037f230041106b220224000240024020002802000d002002200128021841fe85c60041042001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b20022001280218418286c60041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a418886c6001061210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d004101210020042802184198b0c00041012004411c6a28020028020c1100000d010b2001280200220028021841ec94c60041012000411c6a28020028020c11000021000b200120003a00080b200241106a2400200041ff01714100470bd10401037f230041e0006b220324002003200236020c024041002802d8a1464105490d002003410136021420032003410c6a36021041002802e4a146210241002802e0a146210441002802dca1462105200341d8006a41ef00360200200341d0006a42ee80808010370300200341cc006a41b483c600360200200341c4006a4225370200200341c0006a41ac84c600360200200341386a4201370300200341286a4201370300200341206a410a360200200341346a200341106a360200200341e084c600360224200341a284c60036021c20034105360218200441ecb3c000200541024622051b200341186a200241d4b3c00020051b280210110200200328020c21020b0240024002402002450d00200341186a2001410010ba0520032802184101470d012000200341186a4104722202290200370200200041086a200241086a2802003602000c020b200041003602000c010b024002400240024020012802002202200328021c2204280208460d002002200328020c6b220420024d0d02410f102a22020d010c030b024020042d000c0d004125102a2202450d03200042a5808080d004370204200020023602002002411d6a41002900858546370000200241186a41002900808546370000200241106a41002900f88446370000200241086a41002900f08446370000200241002900e884463700000c040b200041003602000c030b2000428f808080f00137020420002002360200200241076a410029009485463700002002410029008d85463700000c020b20004100360200200120043602000c010b1033000b200341e0006a24000ba30201077f0240024002400240200041086a2802002201450d00410020014102746b2102417f210320002802002204210503402002450d01200341016a2103200241046a210220052802002106200541046a21052006450d000b4100200641004741016a41017122056b2003460d002001200520036a2207490d012001200641004741016a4101716b20036b220541ffffffff03712005470d0220054102742203417f4c0d020240024020030d00410421030c010b2003102a2203450d040b2003200420074102746a4104200641004741016a41017141027420026a6b10db0521020240200041046a280200450d002000280200102c0b20002002360200200041086a2005360200200041046a20053602000b0f0b200720011047000b103a000b1033000bbb0403067f017e097f02400240024002400240200141086a2802002203200241086a2802002204200320044b1b220541016a22064101200641014b1b220741ffffffff03712007470d0020074102742206417f4c0d000240024020060d00410421080c010b200610302208450d020b024020050d00420021090c040b2004417f6a220a20044b210b2002280200210c2003417f6a220d20034b0d022001280200210e20082007417f6a22024102746a210f410021064200210903404100211002402003200d20066b22114d0d00410021102011200d4b0d00200e20114102746a28020021100b410021110240200b0d002004200a20066b22124d0d002012200a4b0d00200c20124102746a28020021110b200720024d0d05200f20092010ad7c2011ad7c22093e0200200f417c6a210f2002417f6a210220094220882109200641016a22062005490d000c040b0b103a000b1033000b20082007417f6a22024102746a21104100210f420021090340410021060240200b0d00410021062004200a200f6b22114d0d00410021062011200a4b0d00200c20114102746a28020021060b200720024d0d02201020092006ad7c22093e02002010417c6a21102002417f6a210220094220882109200f41016a220f2005490d000b0b024020072005417f736a220220074f0d00200020073602082000200736020420002008360200200820024102746a20093e02000240200141046a280200450d002001280200102c0b0f0b41a888c600200220071038000b41a888c600200220071038000bbb04030d7f017e017f02400240200241086a2802002203200141086a28020022046a22054101200541014b1b220641ffffffff03712006470d0020064102742205417f4c0d0002400240024020050d00410421070c010b200510302207450d010b2004450d022001280200210802400240024020030d0020082004417f6a22054102746a210320072006417f6a22024102746a21090340200420054d0d0302402003280200450d00200620024d0d03200941003602000b2003417c6a21032009417c6a21092002417f6a21022005417f6a2205417f470d000c060b0b200641027420076a417c6a210a200341027420022802006a417c6a210b4100210c2006210d03402004200c417f736a220520044f0d020240200820054102746a220e280200220f450d0042002110417f2105200a2102200b2109024003402006200d20056a22114d0d0120022009350200200fad7e20107c20023502007c22103e0200201042208821100240200320056a0d002006200c20036a417f736a220220064f0d05200720024102746a20103e02000c030b2002417c6a21022009417c6a2109200e280200210f20032005417f6a22056a22112003490d000b41d087c600201120031038000b41d087c600201120061038000b200a417c6a210a200d417f6a210d200c41016a220c2004460d050c000b0b41a888c600200220061038000b41d087c600200520041038000b1033000b103a000b2000200636020820002006360204200020073602000240200141046a280200450d002001280200102c0b0bb60302097f017e230041106b2201240002400240024002400240024002402000280200220228020041016a41004c0d002000280204220328020041016a41004c0d012000280208220441086a28020022054101200028020c22062802006b22076a220820054f0d02200720002802142802006b22052000280210220741086a28020022006a220920054f0d03024002402002290308220a42ffffffff0f560d0041002100200a200428020020084102746a3502007e2003290308422086200728020020094102746a35020084580d010b20022802000d052002410036020020022002290308427f7c370308200441086a2802002200200020062802006b22024d0d0620032802000d07200428020020024102746a350200210a200341003602002003200a20032903087c370308410121000b200141106a240020000f0b41c689c6004118200141086a41e089c600103b000b41c689c6004118200141086a41e089c600103b000b41d087c600200820051038000b41d087c600200920001038000b41f089c6004110200141086a41808ac600103b000b41d087c600200220001038000b41f089c6004110200141086a41808ac600103b000b9e0301087f200028020822024102742103410021042000280200220521000240024003402003450d012004417f6a21042003417c6a210320002802002106200041046a21002006450d000b410121072004417f73200641004741016a4101716a21080c010b41002107410020046b21080b200128020822094102742103410021042001280200220121000240024003402003450d012004417f6a21042003417c6a210320002802002106200041046a21002006450d000b410021032004417f73200641004741016a4101716a21000c010b410020046b2100410121030b024020070d00410020034101736b0f0b4101210402400240024020030d0020022008490d0120092000490d02417f200220086b2203200920006b22064720032006491b22040d0020062003200320064b1b2107200120004102746a2103200520084102746a2100417f210103400240200141016a22012007490d0041000f0b2003280200210420002802002106200341046a2103200041046a2100417f200620044720062004491b2204450d000b0b20040f0b200820021047000b200020091047000b100020002802002000280204200110640bfb05010d7f200128000c21022001280204210320012802002104024002400240024002400240024020012d000822054102470d00200320044f0d010c020b20054101710d010b4100210602400240024002404100200320046b2201200120034b1b220741016a220120074f0d000240200420034b200520054102461b22014102460d002001410171450d004104210841002101410021060c070b2003417f732109200241086a210a41002107200321054104210841002106410021010340200920016a220b200a280200220c6a220d200b4f0d022004200549210b2002280200200d4102746a280200210d024020012006470d002006417f417f41002005200b6b220c20046b220e200e200c4b1b220c41016a220e200e200c491b4100200b1b220c41016a220e200e200c491b6a220c2006490d052006410174220e200c200e200c4b1b220c41ffffffff0371200c470d05200c410274220e4100480d050240024020060d00200e102a21080c010b20082006410274200e102e21080b2008450d04200c21060b200820076a200d360200200741046a21072005417f6a2105200141016a2101200b0d000c070b0b024020010d00410421080c050b200141ffffffff03712001470d02200141027422064100480d022006102a2208450d01200121060c040b41d087c600200120036b200c6a417f6a200c1038000b1033000b1035000b41042108410021060b410021012003200449200520054102461b4101710d0002400240200320044d0d002003417f732101200241086a210d200821052003210703402001200d280200220c6a220b20014f0d0420052002280200200b4102746a280200360200200141016a2101200541046a210520042007417f6a2207490d000b200320046b41016a21010c010b20032004470d0141012101200821050b200241086a28020022072004417f736a220420074f0d022005200228020020044102746a2802003602000b2000200136020820002006360204200020083602000f0b41d087c600200b200c1038000b41d087c600200420071038000b7301027f230041106b2203240002404110102a22040d001033000b200420013e020c200420014220883e0208200420023e0204200420024220883e020020034284808080c00037020420032004360200200310bd05200041086a200328020836020020002003290300370200200341106a24000b1c00200128021841b68bc600410f2001411c6a28020028020c1100000bb00301047f230041c0006b2202240020002802002103410121000240200128021841cfaec000410c2001411c6a28020028020c1100000d0002400240200328020822000d0020032802002200200328020428020c11070042e4aec285979ba58811520d012002200036020c2002413036021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241dcaec0003602282002200241106a36023820042005200241286a10390d020c010b2002200036020c2002410836021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241dcaec0003602282002200241106a36023820042005200241286a10390d010b200328020c2100200241106a41146a4101360200200241106a410c6a410136020020022000410c6a3602202002200041086a360218200241043602142002200036021020012802182100200128021c2101200241286a41146a41033602002002420337022c200241ecaec0003602282002200241106a36023820002001200241286a103921000b200241c0006a240020000b21002000417f6a41ff01712002ad4220862001ad842004ad4220862003ad8410000b7d01017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014100480d020240024020030d002001102a21020c010b200028020020032001102e21020b2002450d0120002002360200200041046a20013602000b0f0b1033000b1035000bd90101017f230041e0006b22042400200420013602082004200336020c024020012003470d0020002002200110db051a200441e0006a24000f0b200441286a41146a4109360200200441346a410c360200200441106a41146a410336020020044203370214200441ec9fc6003602102004410c36022c2004200441086a36024020042004410c6a360244200442043703582004420137024c200441c0a0c6003602482004200441286a3602202004200441c8006a3602382004200441c4006a3602302004200441c0006a360228200441106a41fca0c6001041000ba20601037f230041d0006b22042400200420033a000f024002400240024020022802082205417f6a220620054f0d00200620054d0d010b4118102a2202450d012004421837023420042002360230200441306a4100411810c80520042004280238220241186a3602382002200428023022056a411841ba9dc600411810c9052004200429023437023420042005360230418493c6004134200441306a41f492c600103b000b200141086a2802002105200228020020064103746a2206280200210202400240024020062d0006450d0020052002460d010b02400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d00002205417c6a220241014b0d01024020020e020300030b4118102a2202450d04200241106a41002900ca9d46370000200241086a41002900c29d46370000200241002900ba9d4637000020044298808080800337022420042002360220200441c4006a410136020020044201370234200441e897c6003602302004412d36024c2004200441c8006a3602402004200441206a360248200441106a200441306a103702402004280224450d002004280220102c0b200041013a0000200041046a20042903103702002000410c6a200441106a41086a2802003602000c050b412b102a2202450d03200041013a0000200241276a41002800a29746360000200241206a410029009b9746370000200241186a41002900939746370000200241106a410029008b9746370000200241086a41002900839746370000200241002900fb9646370000200041086a42ab808080b005370200200041046a20023602000c040b0240200341ff017122024104460d0020052002470d020b200041003a0000200020053a00010c030b20004180083b01000c020b200420053a0048200441c4006a4102360200200441206a410c6a413236020020044202370234200441a897c600360230200441323602242004200441206a3602402004200441c8006a36022820042004410f6a360220200441106a200441306a10372000410c6a200441186a280200360200200041046a2004290310370200200041013a00000c010b1033000b200441d0006a24000bef0502047f017e230041d0006b2203240002400240024002400240200241086a2802002204417f6a220520044f0d00200520044d0d010b4118102a2202450d01200241106a41002900ca9d46370000200241086a41002900c29d46370000200241002900ba9d4637000020034298808080800337021420032002360210200341cc006a41013602002003420137023c200341e897c6003602382003412d3602342003200341306a3602482003200341106a360230200341206a200341386a1037200041086a200341206a41086a280200360200200020032903203702002003280214450d032003280210102c0c030b0240024002402002280200220620054103746a2d000522054104460d00200341386a20012002200510ca05024020032d00384101470d002000200329023c370200200041086a200341c4006a2802003602000c060b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d010b4118102a2202450d01200241106a41002900ca9d46370000200241086a41002900c29d46370000200241002900ba9d4637000020034298808080800337021420032002360210200341cc006a41013602002003420137023c200341e897c6003602382003412d3602342003200341306a3602482003200341106a360230200341206a200341386a1037200041086a200341206a41086a280200360200200020032903203702002003280214450d032003280210102c0c030b200141086a28020021022003200737030820022007a7470d01200041003602000c020b1033000b200341cc006a41023602002003412c6a41013602002003420237023c200341c896c60036023820034101360224200320023602302003200341206a3602482003200341086a3602282003200341306a360220200341106a200341386a1037200041086a200341106a41086a280200360200200020032903103702000b200341d0006a24000ba80301057f230041c0006b2203240020032002360200024002402001280204220420024b0d002001280208417c6a21052001410c6a280200410374210102400340024020010d00200320043602042003412c6a4102360200200341306a410c6a41013602002003420337021c200341949fc600360218200341013602342003200341306a3602282003200341046a36023820032003360230200341086a200341186a10372000410c6a200341106a280200360200200041046a2003290308370200200041013a00000c040b02402004200541046a2802006a220620044f0d004120102a2204450d02200041013a0000200441186a410029008c9f46370000200441106a41002900849f46370000200441086a41002900fc9e46370000200441002900f49e46370000200041086a42a08080808004370200200041046a20043602000c040b200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a00010c020b1033000b200041003a00002000200128020020026a2d00003a00010b200341c0006a24000bbd0201037f230041106b220224000240024020002d00004104470d002002200128021841a595c60041032001411c6a28020028020c11000022003a000820022001360200200241003a0009200241003602040c010b2002200128021841a895c60041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b095c6001061210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d004101210020042802184198b0c00041012004411c6a28020028020c1100000d010b2001280200220028021841ec94c60041012000411c6a28020028020c11000021000b200120003a00080b200241106a2400200041ff01714100470b820602037f017e230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200541386a200141186a2203200141286a410010ca0520052d00384101470d012000200529023c370200200041086a200541c4006a2802003602000c020b200541cc006a41023602002005411c6a41013602002005420337023c200541a494c600360238200541013602142005200541106a36024820052005410c6a3602182005200541086a360210200541206a200541386a1037200041086a200541206a41086a280200360200200020052903203702000c010b2001280200210220054100360220024020022802080d00200541cc006a41013602002005420237023c200541b89bc600360238200541013602342005200541306a3602482005200541206a360230200541106a200541386a103720052802102202450d0020002005290214370204200020023602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d03200241017422072006200720064b1b22064100480d030240024020020d002006102a21020c010b200328020020022006102e21020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2202200228020041016a3602000c030b200541cc006a220241013602002005420137023c200541b49ec60036023820054101360234200520063602302005200541306a360248200541106a200541386a103720052802102201450d022005200529021437022420052001360220200241013602002005420137023c200541e897c6003602382005412d3602342005200541306a3602482005200541206a360230200541106a200541386a1037200528021021022005290214210802402005280224450d002005280220102c0b2002450d0220002008370204200020023602000c030b1033000b1035000b200041003602000b200541d0006a24000bae0301017f230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200128020021022005410036023420022802080d01200541cc006a41013602002005420237023c200541b89bc600360238200541013602142005200541106a3602482005200541346a360210200541206a200541386a103720052802202202450d0120002005290224370204200020023602000c020b200541cc006a41023602002005412c6a41013602002005420337023c200541a494c600360238200541013602242005200541206a36024820052005410c6a3602282005200541086a360220200541106a200541386a1037200041086a200541106a41086a280200360200200020052903103702000c010b200541386a200141186a2202200141286a2203200410ca05024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200541386a20022003410010ca05024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200041003602000b200541d0006a24000be90302047f017e230041c0006b22032400200341286a200141186a2204200141286a200210ca050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d03200241017422062005200620054b1b22054100480d030240024020020d002005102a21020c010b200428020020022005102e21020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341b49ec60036022820034101360214200320053602102003200341106a360238200341186a200341286a103720032802182202450d022003200329021c37020420032002360200200141013602002003420137022c200341e897c6003602282003412d3602142003200341106a36023820032003360210200341186a200341286a103720032802182101200329021c210702402003280204450d002003280200102c0b2001450d0220002007370204200020013602000c030b1033000b1035000b200041003602000b200341c0006a24000ba20402047f017e230041c0006b22032400200341286a200141186a2204200141286a2205200210ca050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a20042005200210ca05024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d03200241017422062005200620054b1b22054100480d030240024020020d002005102a21020c010b200428020020022005102e21020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341b49ec60036022820034101360214200320053602102003200341106a360238200341186a200341286a103720032802182202450d022003200329021c37020420032002360200200141013602002003420137022c200341e897c6003602282003412d3602142003200341106a36023820032003360210200341186a200341286a103720032802182101200329021c210702402003280204450d002003280200102c0b2001450d0220002007370204200020013602000c030b1033000b1035000b200041003602000b200341c0006a24000be90302057f017e230041c0006b22032400200341286a200141186a2204200141286a200210ca050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d03200541017422072006200720064b1b22064100480d030240024020050d002006102a21050c010b200428020020052006102e21050b2005450d02200120053602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341b49ec60036022820034101360214200320063602102003200341106a360238200341186a200341286a103720032802182202450d022003200329021c37020420032002360200200141013602002003420137022c200341e897c6003602282003412d3602142003200341106a36023820032003360210200341186a200341286a103720032802182101200329021c210802402003280204450d002003280200102c0b2001450d0220002008370204200020013602000c030b1033000b1035000b200041003602000b200341c0006a24000ba20402057f017e230041c0006b22032400200341286a200141186a2204200141286a2205200210ca050240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a20042005200210ca05024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d03200541017422072006200720064b1b22064100480d030240024020050d002006102a21040c010b200428020020052006102e21040b2004450d02200120043602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341b49ec60036022820034101360214200320063602102003200341106a360238200341186a200341286a103720032802182202450d022003200329021c37020420032002360200200141013602002003420137022c200341e897c6003602282003412d3602142003200341106a36023820032003360210200341186a200341286a103720032802182101200329021c210802402003280204450d002003280200102c0b2001450d0220002008370204200020013602000c030b1033000b1035000b200041003602000b200341c0006a24000be90302047f017e230041c0006b22042400200441286a200141186a2205200141286a200210ca050240024020042d00284101470d002000200429022c370200200041086a200441346a2802003602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d03200241017422072006200720064b1b22064100480d030240024020020d002006102a21020c010b200528020020022006102e21020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20033a0000200141206a2201200128020041016a3602000c030b2004413c6a220141013602002004420137022c200441b49ec60036022820044101360214200420063602102004200441106a360238200441186a200441286a103720042802182202450d022004200429021c37020420042002360200200141013602002004420137022c200441e897c6003602282004412d3602142004200441106a36023820042004360210200441186a200441286a103720042802182101200429021c210802402004280204450d002004280200102c0b2001450d0220002008370204200020013602000c030b1033000b1035000b200041003602000b200441c0006a24000b17000240200041046a280200450d002000280200102c0b0b0c002000280200200110a1050b1500200028020022002802002000280208200110640b100020012000280200200028020810480bfb0101027f230041106b220224002002200128021841dc9ec60041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41e49ec60010611a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d004101210120002802184198b0c00041012000411c6a28020028020c1100000d010b2002280200220128021841ec94c60041012001411c6a28020028020c11000021010b200220013a00080b200241106a2400200141ff01714100470b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f0240024020012000490d002002450d01200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000c020b0b2002450d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b20030b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b3e01017f230041106b2205240020052001200220032004410010e305200529030021012000200541086a29030037030820002001370300200541106a24000b4c01017f230041206b22052400200542003703182005420037031020052001200220032004200541106a10e305200529031021012000200529031837030820002001370300200541206a24000be20502037f067e230041306b2206240002400240024002400240024002400240024002402002500d002003500d012004500d02200479a7200279a76b2207413f4b0d0341ff0020076b2108200741016a21070c080b02402004500d0020050d040c060b024002402005450d0020034200510d0620054200370308200520012003823703000c010b20034200510d050b200120038021010c060b2004500d030240024002402001500d0020047b4201510d01200479a7200279a76b2207413e4b0d0241ff0020076b2108200741016a21070c090b02402005450d0020054200370300200520022004823703080b200220048021010c070b02402005450d002005200137030020052004427f7c2002833703080b200220047a423f838821010c060b2005450d040c020b024020037b4201510d0041bf7f200379a7200279a76b22076b2108200741c1006a21070c060b02402005450d002005420037030820052003427f7c2001833703000b20034201510d06200641206a2001200220037aa710df05200641286a2903002102200629032021010c060b2005450d020b2005200137030020052002370308420021010c020b00000b420021010b420021020c010b200620012002200841ff007110de05200641106a20012002200741ff007110df05200641086a2903002102200641106a41086a2903002109200629030021012006290310210a0240024020070d004200210b4200210c0c010b4200210c4200210d03402009420186200a423f8884220b200b427f8520047c200a4201862002423f8884220a427f85220b20037c200b54ad7c423f87220b2004837d200a200b200383220e54ad7d2109200a200e7d210a420020024201862001423f8884842102200d2001420186842101200b420183220b210d2007417f6a22070d000b0b02402005450d002005200a370300200520093703080b200c20024201862001423f8884842102200b20014201868421010b2000200137030020002002370308200641306a24000b0b80a2060300418080c0000bd5a1066361706163697479206f766572666c6f77000000240010001700000009030000050000007372632f6c6962616c6c6f632f7261775f7665632e727300a8001000460000005a0100001300000037000000040000000400000038000000390000003a0000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72003b00000000000000010000003c0000002f72757374632f373661323532656139653762653933613631666664663333623335333365323461396366343539642f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000100210002000000030021000120000003b00000000000000010000003d000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e646578206973203030303130323033303430353036303730383039313031313132313331343135313631373138313932303231323232333234323532363237323832393330333133323333333433353336333733383339343034313432343334343435343634373438343935303531353235333534353535363537353835393630363136323633363436353636363736383639373037313732373337343735373637373738373938303831383238333834383538363837383838393930393139323933393439353936393739383939000044031000060000004a031000220000002c03100018000000690a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e677468208c03100016000000a20310000d0000002c031000180000006f0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d009a0410000b0000001717100016000000af0310000100000084041000160000000408000009000000f51610000e00000003171000040000000717100010000000af031000010000008404100016000000080800000500000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c756500e0161000150000007d010000150000009a0410000b000000a504100026000000cb04100008000000d304100006000000af03100001000000840410001600000015080000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f6620600000001a0510000200000004051000160000005e04000028000000040510001600000053040000280000007372632f6c6962636f72652f666d742f6d6f642e72732e2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20c01010004a0000001013100000020000101510003a00000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e0d0f0410031212130916011705180219031a071c021d011f1620032b042c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f747596972f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b030740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880c73035040a06380846080c06740b1e035a0459098083181c0a16094808808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b02100111041205131114021502170219041c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f906fa020c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1ca8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d00c72a3a4cbcc6e6f5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a808617094e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b602048080a80a65e22450b0a060d1339070a362c041080c03c64530c0180a0451b4808531d398107460a1d03474937030e080a0639070a81361980c7320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140041c97f80882f3a50d811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a0d035d033d391d0d2c040907020e06809a83d60a0d030b05740c59070c140c0438080a0628081e527703310380a60c14040305030d06856a000000a0101000200000002700000019000000a0101000200000002800000020000000a0101000200000002a00000019000000a0101000200000002b00000018000000a0101000200000002c000000200000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21f003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000f0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c833000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d0000000000001e1f202100000000002200230024252600000000270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829000000000000000000000000000000002a2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000002d2e00002f0000000000000000000000000000000000000000000000000000000000003031320000000000000000000000000000000000000000003300000029000000000000340000000000000000000000000000000000000000000000350036000000000000000000000000000000000000000000000000000037380000383838390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff060000f00c01000000fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f0000800000000000000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db0700000000000000f0000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff00007372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f66206066616c736574727565426f72726f774572726f72426f72726f774d75744572726f7270616e69636b65642061742000851710000100000086171000030000005c8f110000000000841710000100000084171000010000003a27272c20000000e016100015000000a4040000050000005c8f110000000000f596100002000000bc17100015000000a5040000050000007372632f6c6962636f72652f726573756c742e72735b5d0a3e0000000c000000040000003f00000040000000410000002c0a2c2037000000040000000400000042000000430000004400000020202020207b20207b0a207d7d28280a2c0000003b000000000000000100000045000000460000004700000037000000040000000400000048000000490000004a00000000000000a41810001000000000000000b4181000010000000000000000000000bc181000010000000000000000000000c41810000f00000000000000d4181000020000000000000000000000e4181000010000000000000045787472696e73696353756363657373011910000c0000000d1910002500000045787472696e7369634661696c6564006b8611000d000000011910000c000000ec1810001500000020416e2065787472696e736963206661696c65642e4469737061746368496e666f20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e52657175697265526f6f744f726967696e526571756972655369676e65644f726967696e526571756972654e6f4f726967696e000000000000004319100013000000000000005c8f11000000000000000000000000003219100011000000000000005c8f1100000000000000000000000000561910000f000000000000005c8f110000000000000000003b00000000000000010000004b0000004c000000470000003b00000000000000010000004b0000004c00000047000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e617373657274696f6e206661696c65643a20696e646578203c206c656e00381a100043000000310b0000300000002f72757374632f373661323532656139653762653933613631666664663333623335333365323461396366343539642f7372632f6c6962616c6c6f632f7665632e727300381a1000430000003d0b00002c00000062656e6566696369617279206163636f756e74206d757374207072652d65786973745374616c6c65643a6772616e6470615f617574686f726974696573546f74616c49737375616e63654672656542616c616e6365526573657276656442616c616e63654c6f636b7300000000000000a81b10000a00000000000000d8ef1000020000000000000000000000b41b1000010000000000000000000000bc1b10000d00000000000000d8ef1000020000000000000000000000cc1b100001000000000000000000000048f310000800000000000000d41b1000040000000000000000000000f41b1000010000000000000000000000fc1b10000a00000000000000081c1000030000000000000000000000201c100001000000000000004e65774163636f756e7400009c1c10001b0000005265617065644163636f756e74000000851c100017000000e252110009000000e2521100090000009b1f1100070000009b1f110007000000591c10002c00000042616c616e63655365740000e2521100090000009b1f1100070000009b1f110007000000281c10003100000020412062616c616e6365207761732073657420627920726f6f74202877686f2c20667265652c207265736572766564292e205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e5265706f72747350656e64696e674368616e67655374617465746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7456657374696e676163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75650000004d00000008000000040000004e0000004f00000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d00000008000000040000004e0000004f00000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e657874466f72636564000000000000b81f10001200000000000000cc1f1000010000000000000000000000e41f100001000000000000007265706f72745f6d69736265686176696f72000000000000052010000700000000000000e960110007000000ec1f100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f727400000000486311000b0000000000000000000000c76c11000d000000000000000000000000000000000000000000000000000000000000005c8f11003c3b100000000000000000007422100004000000000000000100000000000000cb1c1000050000000000000000000000942210001b000000000000000000000000000000000000000000000000000000000000005c8f1100b02210000000000000000000c022100001000000000000000100000000000000be1c10000d0000000000000000000000c822100023000000000000000000000000000000000000000000000000000000000000005c8f1100fc3a10000000000000000000ec22100001000000000000000000000000000000801f10000a00000000000000000000009c6011000e000000000000000000000000000000000000000000000000000000000000005c8f11005c2310000000000000000000f422100001000000000000000000000000000000ae1a1000070000000000000000000000fc22100020000000000000000000000000000000000000000000000000000000000000005c8f11001c23100000000000000000002c23100001000000000000000000000000000000d46c11000c00000000000000000000003423100005000000000000000000000000000000000000000000000000000000000000005c8f11003c23100000000000000000004c23100002000000000000000100000000000000ef6c11000c0000000101000000000000342310000500000000000000e76f11000c000000000000000000000000000000000000005c8f11005c23100000000000000000006c231000010000000000000000000000142510000b0000005c8f1100000000001f25100058000000772510002500000053746f72656453746174653c543a3a426c6f636b4e756d6265723e003b000000000000000100000051000000f02410002400000053746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e00bf24100031000000902410002f00000028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572293b0000000000000001000000520000006c2410002400000053657449640000003b000000000000000100000053000000e4231000570000003b241000310000003b00000000000000010000005200000074231000700000002041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e20546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c69746965732920696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e20607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205374617465206f66207468652063757272656e7420617574686f72697479207365742e20444550524543415445442054686973207573656420746f2073746f7265207468652063757272656e7420617574686f72697479207365742c20776869636820686173206265656e206d6967726174656420746f207468652077656c6c2d6b6e6f776e204752414e4450415f415554484f52495445535f4b455920756e686173686564206b65792e6e6f7420656e6f75676820667265652066756e6473000000000000006426100008000000000000006c2610000200000000000000000000009c261000190000000000000000000000642710000b0000000000000070271000030000000000000000000000b82710000d0000000000000000000000202810000e0000000000000030281000030000000000000000000000782810000200000000000000000000008828100013000000000000006c2610000200000000000000000000009c28100006000000000000007472616e7366657200000000560311000400000000000000b55a11002300000000000000143611000500000000000000f529100013000000cf2b1000360000005c8f110000000000052c100042000000472c1000480000008f2c100045000000d42c10002d0000005c8f110000000000012d1000460000005c8f1100000000002d5a11000b000000472d10004c000000932d100033000000c62d10005a0000005c8f110000000000202e1000130000005c8f110000000000332e100054000000872e10004b000000d22e100035000000072f1000370000003e2f100056000000942f100052000000e62f10003e0000005c8f110000000000a65a11000c0000007365745f62616c616e63650000000000b25a11000300000000000000b55a11002300000000000000bb2b10000800000000000000f52910001300000000000000c32b10000c00000000000000f529100013000000082a1000250000005c8f1100000000002d2a100048000000752a100042000000b72a100046000000fd2a1000400000005c8f1100000000003d2b10002d0000005c8f1100000000002d5a11000b0000006a2b1000200000008a2b100031000000a65a11000c000000666f7263655f7472616e73666572000000000000ef2910000600000000000000b55a11002300000000000000560311000400000000000000b55a11002300000000000000143611000500000000000000f5291000130000009029100054000000e42910000b0000007472616e736665725f6b6565705f616c69766500cc2810005400000020291000100000005c8f110000000000302910002f0000005c8f1100000000005f291000310000002053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665722045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265207370656369666965642e736f75726365436f6d706163743c543a3a42616c616e63653e20536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f667265656e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e2020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c2020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e00000000c91a10000d0000000000000000000000dc3110000a000000000000000000000000000000000000000000000000000000000000005c8f11008c3210000000000000000000e831100001000000000000000100000000000000071d10000700000001010000000000000f5c11000c00000000000000f03110002b000000000000000000000000000000000000005c8f11001c32100000000000000000002c32100001000000000000000000000000000000d61a10000b00000001010000000000000f5c11000c00000000000000dc3110000a000000000000000000000000000000000000005c8f11008c3210000000000000000000343210000b000000000000000100000000000000e11a10000f00000001010000000000000f5c11000c00000000000000dc3110000a000000000000000000000000000000000000005c8f11008c32100000000000000000009c3210000b000000000000000100000000000000f01a10000500000001010000000000000f5c11000c00000000000000f43210002c000000000000000000000000000000000000005c8f110020331000000000000000000030331000010000000000000001000000543a3a42616c616e636500006d3810002600000056657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e003b0000000000000001000000520000003738100036000000b7351000270000005c8f110000000000de351000500000002e3610005d0000008b36100055000000e03610004f0000002f3710005100000080371000150000005c8f110000000000953710005d000000f2371000450000003b000000000000000100000054000000663310005d000000c3331000270000005c8f110000000000ea3310005b00000045341000490000005c8f1100000000008e3410005d000000eb3410002d0000005c8f110000000000183510005900000071351000460000005665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e3b000000000000000100000055000000383310002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e20606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e20606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e00000000003c3910001200000000000000dc3110000a000000000000005c8f110050391000000000000000000060391000010000000000000000000000b81111000b00000000000000dc3110000a000000000000005c8f1100683910000000000000000000c4111100010000000000000000000000cc1111000b00000000000000dc3110000a000000000000005c8f1100683910000000000000000000d811110001000000000000004578697374656e7469616c4465706f73697400003b00000000000000010000005600000078391000350000003b00000000000000010000005700000020546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e00000000000000b71c1000070000000101000000000000b83a10000d00000000000000c53a100034000000000000000000000000000000000000005c8f1100fc3a100000000000000000000c3b100001000000000000000000000000000000143b1000160000000201010000000000cf6e11000400000000000000d36e11000e000000000000002a3b100012000000000000005c8f11003c3b100000000000000000004c3b100001000000000000000100000000000000c56d1100120000000101000000000000cf6e11000400000000000000e960110007000000000000000000000000000000000000005c8f1100543b10000000000000000000643b10000600000000000000010000005265706f727449644f663c543e4f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e0000003b000000000000000100000052000000fd3c100052000000436f6e63757272656e745265706f727473496e6465785665633c5265706f727449644f663c543e3e3b000000000000000100000055000000b33c10004a0000003b000000000000000100000058000000943b1000440000005c8f110000000000d83b10002f0000005c8f110000000000073c100052000000593c10005a00000020456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f6620646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e20546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e696d2d6f6e6c696e653a6f66666c696e676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c75657472616e7366657220776f756c64206b696c6c206163636f756e74486561644f66566f7465734f66566f7465734f663a73657373696f6e3a6b6579734e6578744b6579734b65794f776e6572416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c7265616479206578697374735374616b654f6600000000e03e10000700000000000000e83e1000010000000000000000000000f03e1000020000000000000000000000003f100009000000000000005c8f11000000000000000000000000000c3f1000010000000000000000000000143f10000c000000000000008c521100010000000000000000000000203f1000020000000000000000000000303f10000f000000000000008c521100010000000000000000000000403f1000010000000000000000000000483f10000d00000000000000583f1000030000000000000000000000703f100002000000000000004e65775465726d005d41100019000000b7401000550000000c41100051000000456d7074795465726d00000081401000360000004d656d6265724b69636b65642340100051000000744010000d0000004d656d62657252656e6f756e63656400fb3f100028000000566f7465725265706f72746564000000e252110009000000e2521100090000000353110004000000803f100058000000d83f100023000000204120766f7465722028666972737420656c656d656e742920776173207265706f72746564202862797420746865207365636f6e6420656c656d656e742920776974682074686520746865207265706f7274206265696e67207375636365737366756c206f72206e6f742028746869726420656c656d656e74292e2041206d656d626572206861732072656e6f756e6365642074686569722063616e6469646163792e2041206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f742060456d7074795465726d602e204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e2041206e6577207465726d2077697468206e6577206d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e6469646174657320657869737465642c206e6f74207468617420656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f72207468697320707572706f73652e5665633c284163636f756e7449642c2042616c616e6365293e00003b0000000000000001000000590000003b00000000000000010000005a00000043616e6469646174657352756e6e65727355705175657565644b657973636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e636521000000001442100008000000000000001c4210000200000000000000000000004c4210000a000000000000007365745f6b65797300000000c59b10000400000000000000a54310000700000000000000ac4310000500000000000000e9601100070000009c42100039000000d5421000480000001d431000310000005c8f1100000000004e431000350000005c8f1100000000002d5a11000b0000008343100022000000df2e110016000000a65a11000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e543a3a4b65797370726f6f660000000000000049bc10000a00000000000000000000001c46100013000000000000000000000000000000000000000000000000000000000000005c8f1100f859100000000000000000003046100001000000000000000100000000000000f36e11000c0000000000000000000000e76f11000c000000000000000000000000000000000000000000000000000000000000005c8f1100c059100000000000000000003846100001000000000000000100000000000000ff6e11000d00000000000000000000000353110004000000000000000000000000000000000000000000000000000000000000005c8f11004046100000000000000000005046100002000000000000000100000000000000ab4110000a0000000000000000000000604610001e000000000000000000000000000000000000000000000000000000000000005c8f110080461000000000000000000090461000020000000000000001000000000000000c6f11001200000000000000000000005bc9100008000000000000000000000000000000000000000000000000000000000000005c8f1100f85910000000000000000000a046100003000000000000000100000000000000c33d1000080000000204010000000000e96011000700000000000000106111000e00000000000000a543100007000000000000005c8f1100b84610000000000000000000c846100004000000000000000000000000000000cb3d1000080000000204010000000000e96011000700000000000000e84610001400000000000000106111000e000000000000005c8f1100fc46100000000000000000000c4710000400000000000000000000005665633c543a3a56616c696461746f7249643e00d34910001f000000b54910001e0000003b0000000000000001000000520000003e4910004e0000008c491000290000005665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e00003b000000000000000100000055000000b74810004f00000006491000380000004a481000200000005c8f1100000000006a4810004d0000003b00000000000000010000005200000023481000270000005c8f1100000000007547100056000000cb47100058000000284b65795479706549642c205665633c75383e293b0000000000000001000000520000002c471000490000005c8f1100000000007547100056000000cb4710005800000020546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e20546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f662074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e20496e6469636573206f662064697361626c65642076616c696461746f72732e205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e2054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b6579732077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e20547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f727320686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e0000000000002c4a100010000000000000003c4a100005000000000000005c8f1100444a10000000000000000000544a1000020000000000000044454455505f4b45595f505245464958265b75385d0000003b00000000000000010000005b000000644a100059000000bd4a10000d0000002055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e6368206f662074686520747269652e000000000000802711000400000000000000d44b1000020000000000000000000000044c10000f00000000000000000000007c4c10000c000000000000005c8f1100000000000000000000000000884c1000070000000000000000000000c04c10001400000000000000f0f71000010000000000000000000000d44c10000d00000000000000000000003c4d100010000000000000005c8f11000000000000000000000000004c4d10000d0000000000000000000000b44d100012000000000000005c8f1100000000000000000000000000c84d1000090000000000000000000000487210000d00000000000000104e1000010000000000000000000000284e10000d00000000000000000000007657100005000000000000000c3d110011000000000000001436110005000000000000001936110015000000dc551000410000005c8f1100000000001d561000140000003156100012000000435610002b0000005c8f1100000000006e56100057000000c5561000570000001c571000280000005c8f1100000000002d5a11000b000000eb4f10000b000000d05510000c0000004457100032000000a65a11000c00000072656d6f76655f766f74657288551000480000005c8f1100000000002d5a11000b000000eb4f10000b000000d05510000c000000cf5310000d000000a65a11000c0000007265706f72745f646566756e63745f766f746572dc5310005700000033541000570000008a541000170000005c8f110000000000a154100022000000c354100053000000165510002d0000005c8f1100000000002d5a11000b000000eb4f10000b0000004355100045000000cf5310000d000000a65a11000c0000007375626d69745f63616e6469646163798d5210001e0000005c8f110000000000ab52100019000000c45210003b000000ff5210004b0000004a531000550000009f5310000d0000005c8f1100000000002d5a11000b000000eb4f10000b000000ac53100023000000cf5310000d000000a65a11000c00000072656e6f756e63655f63616e6469646163790000235010005400000077501000100000008750100050000000d75010003d00000014511000560000006a511000210000008b51100053000000de51100056000000345210005900000000000000b25a11000300000000000000b55a110023000000904e100057000000e74e1000200000005c8f110000000000074f1000560000005d4f10003d0000005c8f1100000000009a4f1000510000005c8f1100000000002d5a11000b000000eb4f10000b000000f64f1000160000000c50100017000000a65a11000c0000002052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f6620746865206f7574676f696e67206d656d62657220697320736c61736865642e20496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c6163657320746865206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20726f756e6420697320737461727465642e204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e20232323232053746174652052656164733a204f28646f5f70687261676d656e29205772697465733a204f28646f5f70687261676d656e292052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c206f7574636f6d65732065786973743a202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e202d20606f726967696e6020697320612063757272656e742072756e6e65722075702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e642020206f726967696e2069732072656d6f76656420617320612072756e6e65722e202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e20697320202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e20202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e205375626d6974206f6e6573656c6620666f722063616e6469646163792e20412063616e6469646174652077696c6c206569746865723a2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e2020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c79202020202072656d6f7665642e2052656164733a204f284c6f674e2920476976656e204e2063616e646964617465732e205772697465733a204f283129205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069732072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e6420746865697220626f6e6420697320736c61736865642e204120646566756e637420766f74657220697320646566696e656420746f2062653a2020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6f20202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d6265722e2052656164733a204f284e4c6f674d2920676976656e204d2063757272656e742063616e6469646174657320616e64204e20766f74657320666f722060746172676574602e2052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e2052656164733a204f28312920566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e205468652060766f746573602073686f756c643a2020202d206e6f7420626520656d7074792e2020202d206265206c657373207468616e20746865206e756d626572206f662063616e646964617465732e2055706f6e20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e742069732072657365727665642e2049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636b20616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e205772697465733a204f28562920676976656e2060566020766f7465732e205620697320626f756e6465642062792031362e766f7465730000000000eab210000700000000000000000000008c59100021000000000000000000000000000000000000000000000000000000000000005c8f1100f85910000000000000000000b059100001000000000000000100000000000000a24110000900000000000000000000008c59100021000000000000000000000000000000000000000000000000000000000000005c8f1100f85910000000000000000000b859100001000000000000000100000000000000756b11000e00000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f1100c05910000000000000000000d059100001000000000000000100000000000000af3d10000700000001010100000000000f5c11000c000000000000000c3d110011000000000000000000000000000000000000005c8f1100f85910000000000000000000d859100001000000000000000100000000000000fd3d10000700000001010000000000000f5c11000c00000000000000824711000c000000000000000000000000000000000000005c8f1100e05910000000000000000000f059100001000000000000000100000000000000984110000a00000000000000000000000c3d110011000000000000000000000000000000000000000000000000000000000000005c8f1100f85910000000000000000000085a10000200000000000000010000005665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e000000ac5b10003c0000005a5b1000520000003b00000000000000010000005c0000000a5b100050000000ca5a1000400000003b000000000000000100000054000000b15a1000190000003b000000000000000100000055000000185a100059000000715a100040000000205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742069642e20412063757272656e74206d656d6265722063616e206e6576657220656e746572207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e204c6f636b6564207374616b65206f66206120766f7465722e20566f746573206f66206120706172746963756c617220766f7465722c20776974682074686520726f756e6420696e646578206f662074686520766f7465732e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e00000000005d10000d00000000000000824711000c000000000000005c8f1100105d100000000000000000005c8f1100000000000000000000000000205d10000a00000000000000824711000c000000000000005c8f11002c5d100000000000000000005c8f11000000000000000000000000003c5d10000e000000000000001e61110003000000000000005c8f11004c5d100000000000000000005c8f11000000000000000000000000005c5d100010000000000000001e61110003000000000000005c8f11006c5d100000000000000000005c8f11000000000000000000000000007c5d10000c000000000000009c6011000e000000000000005c8f1100885d100000000000000000005c8f1100000000000000000043616e646964616379426f6e640000003b00000000000000010000005d000000566f74696e67426f6e6400003b000000000000000100000056000000446573697265644d656d6265727300003b00000000000000010000005e0000004465736972656452756e6e65727355703b00000000000000010000005f0000005465726d4475726174696f6e3b0000000000000001000000600000006e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e72656769737465726564206475706c6963617465206b657963616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d6265727320657869737463616e6e6f7420766f7465206d6f7265207468616e2063616e6469646174657363616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765646d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e63616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e6365766f7465722063616e206e6f742070617920766f74696e6720626f6e6463616e6e6f74207265706f72742073656c667265706f72746572206d757374206265206120766f7465726475706c69636174652063616e646964617465207375626d697373696f6e6d656d6265722063616e6e6f742072652d7375626d69742063616e64696461637972756e6e65722063616e6e6f742072652d7375626d69742063616e64696461637963616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64736f726967696e206973206e6f7420612063616e6469646174652c206d656d626572206f7220612072756e6e65722e6d757374206265206120766f74657200000000441d11000800000000000000b0601000010000000000000000000000b8601000010000000000000000000000c06010000800000000000000c8601000010000000000000000000000d0601000010000000000000000000000d86010000700000000000000e0601000030000000000000000000000f8601000010000000000000000000000006110000500000000000000c860100001000000000000000000000008611000010000000000000000000000106110000800000000000000c860100001000000000000000000000018611000010000000000000000000000206110000700000000000000c8601000010000000000000000000000286110000100000000000000a8b210000d000000196210000e0000005370656e64696e679b1f110007000000df6110003a0000004177617264656400a8b210000d0000009b1f110007000000e252110009000000bf611000200000004275726e740000009c61100023000000526f6c6c6f766572506110004c0000004465706f73697400306110002000000020536f6d652066756e64732068617665206265656e206465706f73697465642e205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e6f766572666c6f77206d756c7469706c79696e6720676173206c696d6974206279207072696365656e74697265206e65775f7365742077617320676976656e20746f206275696c645f737570706f72745f6d61703b20656e20656e747279206d757374206265206372656174656420666f722065616368206974656d3b207165640000000000000000617474656d707420746f20646976696465206279207a65726f496e636f6e73697374656e74207374617465202d20636f756c646e277420736574746c6520696d62616c616e636520666f722066756e6473207370656e7420627920747265617375727952616e646f6d4d6174657269616c486973746f726963616c53657373696f6e730000000000b86310000d00000000000000c8631000020000000000000000000000f8631000090000000000000000000000406410000f000000000000005064100001000000000000000000000068641000070000000000000000000000a0641000100000000000000050641000010000000000000000000000b0641000080000000000000070726f706f73655f7370656e64000000000000001436110005000000000000001936110015000000000000008e6610000b00000000000000b55a110023000000bc6510004b000000076610004d00000054661000150000005c8f1100000000002d5a11000b000000385a110008000000405a1100190000006966100025000000a65a11000c00000072656a6563745f70726f706f73616c0000000000b16510000b00000000000000c9b6100016000000726510003f0000005c8f1100000000002d5a11000b000000385a110008000000405a110019000000312f110010000000a65a11000c000000617070726f76655f70726f706f73616cf064100057000000476510002b0000005c8f1100000000002d5a11000b000000385a110008000000405a1100190000004d5b110011000000a65a11000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f69642050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e62656e656669636961727900000000000000ac7411000d0000000000000000000000a8b210000d000000000000000000000000000000000000000000000000000000000000005c8f1100a46710000000000000000000b467100001000000000000000100000000000000e1b21000090000000101000000000000a8b210000d00000000000000bc67100024000000000000000000000000000000000000005c8f1100e06710000000000000000000f067100001000000000000000000000000000000b9741100090000000000000000000000f867100012000000000000000000000000000000000000000000000000000000000000005c8f1100cc6c100000000000000000000c6810000100000000000000010000003b00000000000000010000005c000000716810002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3b000000000000000100000052000000526810001f0000005665633c50726f706f73616c496e6465783e0000146810003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e0000000000007c6910000c000000000000008869100007000000000000005c8f1100906910000000000000000000a0691000020000000000000000000000b06910001300000000000000824711000c000000000000005c8f1100c46910000000000000000000d4691000010000000000000000000000dc6910000b000000000000009c6011000e000000000000005c8f1100e86910000000000000000000f8691000010000000000000000000000006a100004000000000000008869100007000000000000005c8f1100046a10000000000000000000146a1000010000000000000050726f706f73616c426f6e645065726d696c6c003b000000000000000100000061000000d46a100055000000296b10004400000050726f706f73616c426f6e644d696e696d756d003b000000000000000100000056000000826a1000520000005370656e64506572696f64003b000000000000000100000062000000606a1000220000004275726e3b0000000000000001000000630000001c6a1000440000002050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e0000000000000093741100110000000000000000000000c86b10000a000000000000000000000000000000000000000000000000000000000000005c8f1100d46b100000000000000000005c8f11000000000000000000010000004d756c7469706c69657200003b00000000000000010000005300000000000000e01111001200000000000000824711000c000000000000005c8f1100546c10000000000000000000f4111100010000000000000000000000fc1111001200000000000000824711000c000000000000005c8f1100646c100000000000000000002012110001000000000000003b0000000000000001000000570000003b00000000000000010000006400000000000000136310000e000000000000000000000067b810000c000000000000000000000000000000000000000000000000000000000000005c8f1100cc6c10000000000000000000dc6c10000300000000000000010000003b000000000000000100000055000000f46c1000580000004c6d100058000000a46d10001100000020536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e00000000000000c06e10000b000000000000005c8f1100000000000000000000000000cc6e1000010000000000000000000000d46e10000d000000000000005c8f1100000000000000000000000000e46e1000010000000000000000000000ec6e10000e000000000000005c8f1100000000000000000000000000fc6e1000010000000000000000000000046f10000c000000000000005c8f1100000000000000000000000000106f1000010000000000000000000000805211000a000000000000005c8f1100000000000000000000000000186f1000010000000000000000000000206f10000500000000000000286f1000010000000000000000000000306f100001000000000000004d656d6265724164646564005d701000390000004d656d62657252656d6f766564000000227010003b0000004d656d62657273537761707065640000eb6f1000370000004d656d626572735265736574a56f100046000000836f10002200000044756d6d79000000546f10002f000000386f10001c000000205068616e746f6d206d656d6265722c206e6576657220757365642e73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e20546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e2054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e50726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564000000000000000000000000e07010003d000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656400000000000000000000000000000000000000000000000c7210000a000000000000001872100001000000000000000000000030721000030000000000000000000000487210000d000000000000001872100001000000000000000000000058721000030000000000000000000000707210000b000000000000007c721000020000000000000000000000ac721000030000000000000000000000c47210000d00000000000000d4721000010000000000000000000000ec7210000400000000000000000000000c7310000a00000000000000187310000100000000000000000000003073100003000000000000006164645f6d656d626572000000000000b25a110003000000000000000f5c11000c0000001d7510001f0000005c8f1100000000003c7510002d00000072656d6f76655f6d656d626572000000c9741000240000005c8f110000000000ed74100030000000737761705f6d656d6265720000000000c074100006000000000000000f5c11000c00000000000000c674100003000000000000000f5c11000c00000062741000300000005c8f110000000000927410002e00000072657365745f6d656d62657273000000000000005b74100007000000000000000c3d110011000000bb73100056000000117410001b0000005c8f1100000000002c7410002f0000006368616e67655f6b65790000000000005e5b110003000000000000000f5c11000c00000048731000360000005c8f1100000000007e7310003d0000002053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64207061737320606d656d6265727360207072652d736f727465642e204d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e6d656d626572732053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e204d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e72656d6f76656164642052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e204164642061206d656d626572206077686f6020746f20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e496e7374616e6365314d656d6265727368697000000000eab210000700000000000000000000000c3d110011000000000000000000000000000000000000000000000000000000000000005c8f1100d47510000000000000000000e47510000100000000000000010000003b000000000000000100000055000000ec75100032000000205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e616c72656164792061206d656d6265726e6f742061206d656d626572417574686f723b000000000000000100000065000000660000006700000068000000690000006a000000546f6f206d616e7920756e636c65737375627374726174652d6e6f6465000000df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a04000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000cbca25e39f14238701000000687ad44ad37f03c201000000bc9d89904f5b923f0100000068b66ba122c93fa70100000037c8bb1350a9a2a801000000ab3c0572291feb8b010000006772616e62616265696d6f6e617564690000000040787d010065cd1d00e1f505d85aae1ec0542205b0508f1f38e4750488467020d853e903603c5121d0bf760338323222a8591903402013236039cd02480ef423a82a8f0268f8d42470955c02b8dab525c05a3302d8c4962648bd1102e0b27727a855f601e8a05828e8fedf0180773929c0cacd01586d1a2af8f1be019053fb2a50d8b201d00edc2be0fca80138edbc2c48f2a001e06d9d2d80669a01c80d7e2e500f9501c0575e2f08b6900140323f30e0278d0148202031b0418a0108a3ff3120e8870120bedf32f0fb85013856c03398698401f0fda03478218301b8d87f35d8178201d8c26036183d8101b8223e37508d800188d21c38c8fc7f0168b5f93898877f01a829d139d8297f0120d6ab3ab8db7e0168ae803b389d7e0100ca9a3b68957e01000000001198100006000000000000006b000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f000000000000000000000000000000d88210000700000002000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000710000000000000000000000000000006e0000000000000000000000000000006e0000000000000000000000000000003a631100040000000000000072000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000200000000000000000000000000000000000000730000000000000000000000000000006e00000000000000000000000000000079741100090000000000000074000000000000000000000000000000000000000000000000000000000000007500000000000000000000000200000000000000000000000000000000000000760000000000000000000000000000006e000000000000000000000000000000246311000a00000000000000770000000000000000000000000000000000000000000000000000000000000078000000000000000000000002000000000000000000000000000000000000006e0000000000000000000000000000006e000000000000000000000000000000b5b21000070000000000000079000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000007a0000000000000000000000000000006e0000000000000000000000000000006e0000000000000000000000000000008b74110008000000000000007b000000000000000000000000000000000000000000000000000000000000007c0000000000000000000000000000007d0000000000000000000000000000007e0000000000000000000000000000006e000000000000000000000000000000df82100012000000000000007f000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000800000000000000000000000000000006e000000000000000000000000000000167011000700000000000000810000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000830000000000000000000000000000008400000000000000000000000000000085000000000000000000000000000000ec6e1100070000000000000086000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000088000000000000000000000000000000890000000000000000000000000000006e0000000000000000000000000000003a6b110009000000000000008a000000000000000000000000000000000000000000000000000000000000008b0000000000000000000000000000008c0000000000000000000000000000008d0000000000000000000000000000006e000000000000000000000000000000f182100007000000000000008e000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000900000000000000000000000000000006e0000000000000000000000000000006e000000000000000000000000000000f8821000120000000000000091000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000900000000000000000000000000000006e0000000000000000000000000000006e0000000000000000000000000000000a831000090000000000000092000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000094000000000000000000000000000000950000000000000000000000000000006e000000000000000000000000000000138310001300000000000000960000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000980000000000000000000000000000006e0000000000000000000000000000006e000000000000000000000000000000268310000f00000002000000000000000000000000000000000000000000000000000000000000000000000099000000000000000000000002000000000000000000000000000000000000009a0000000000000000000000000000006e0000000000000000000000000000003583100007000000000000009b000000000000000000000000000000000000000000000000000000000000009c0000000000000000000000000000009d0000000000000000000000000000006e0000000000000000000000000000006e000000000000000000000000000000a474110008000000000000009e000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000a0000000000000000000000000000000a1000000000000000000000000000000a20000000000000000000000000000003c8310000900000000000000a300000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000a5000000000000000000000000000000a60000000000000000000000000000006e000000000000000000000000000000af5b11000400000000000000a700000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000a90000000000000000000000000000006e000000000000000000000000000000aa000000000000000000000000000000a36d11000800000000000000ab00000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000ad0000000000000000000000000000006e0000000000000000000000000000006e0000000000000000000000000000000e631100120000000200000000000000000000000000000000000000000000000000000000000000000000006e000000000000000000000002000000000000000000000000000000000000006e0000000000000000000000000000006e000000000000000000000000000000bd6d11000800000000000000ae000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000af0000000000000000000000000000006e0000000000000000000000000000006e000000000000000000000000000000458310001800000000000000b0000000000000000000000000000000000000000000000000000000000000006e000000000000000000000002000000000000000000000000000000000000006e0000000000000000000000000000006e0000000000000000000000000000005d8310000500000000000000b100000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000b3000000000000000000000000000000b40000000000000000000000000000006e00000000000000000000005574696c6974795472616e73616374696f6e5061796d656e74436f756e63696c546563686e6963616c436f6d6d6974746565456c656374696f6e73546563686e6963616c4d656d6265727368697046696e616c697479547261636b65724772616e647061436f6e74726163747352616e646f6d6e657373436f6c6c656374697665466c69704e69636b73000000000000908310000a000000000000009c831000010000000000000000000000b483100001000000000000007365745f756e636c6573000000000000d58310000a00000000000000df8310000e000000bc831000190000002050726f76696465206120736574206f6620756e636c65732e6e65775f756e636c65735665633c543a3a4865616465723e00000000000000f8841000060000000000000000000000fe8410003a000000000000000000000000000000000000000000000000000000000000005c8f110038851000000000000000000048851000010000000000000001000000000000003a7610000600000000000000000000000f5c11000c000000000000000000000000000000000000000000000000000000000000005c8f110050851000000000000000000060851000010000000000000000000000000000002e6311000c00000000000000000000000353110004000000000000000000000000000000000000000000000000000000000000005c8f110068851000000000000000000078851000010000000000000001000000556e636c65735665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e3b000000000000000100000055000000c8851000070000003b000000000000000100000052000000af851000190000003b000000000000000100000052000000808510002f000000205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e20417574686f72206f662063757272656e7420626c6f636b2e20556e636c657372656163686564206d6178696d756d2064657074682c2063616e6e6f7420696e7374616e7469617465b50000001800000004000000b6000000b7000000b8000000b9000000ba000000bb000000696e73756666696369656e742072656d61696e696e672062616c616e63656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665656e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c20666565636f6e747261637420686173206265656e2065766963746564636f6e74726163742063616e6e6f742062652064657374726f79656420647572696e672072656375727369766520657865637574696f6e61206e657374656420657865637574696f6e20636f6e74657874206d7573742068617665206120706172656e743b20716564556e636c657320616c72656164792073657420696e20626c6f636b2e756e636c6520616c726561647920696e636c75646564756e636c652069732067656e65736973756e636c6520697320746f6f206869676820696e20636861696e756e636c6520706172656e74206e6f7420696e20636861696e756e636c65206e6f7420726563656e7420656e6f75676820746f20626520696e636c756465646888100048000000bb0100002d0000002f72757374632f373661323532656139653762653933613631666664663333623335333365323461396366343539642f7372632f6c6962636f72652f6f70732f61726974682e7273617474656d707420746f20646976696465206279207a65726f756e636c6573303066696e616c6e756d000000000000003e6311000a0000000000000000000000480b110003000000000000000000000000000000000000000000000000000000000000005c8f11004c8c10000000000000000000f48b100001000000000000000100000000000000486311000b0000000000000000000000fc8b100027000000000000000000000000000000000000000000000000000000000000005c8f1100248c10000000000000000000348c100001000000000000000100000000000000536311000b0000000000000000000000480b110003000000000000000000000000000000000000000000000000000000000000005c8f11004c8c100000000000000000003c8c1000020000000000000001000000000000005e6311000b0000000000000000000000480b110003000000000000000000000000000000000000000000000000000000000000005c8f11004c8c100000000000000000005c8c100001000000000000000100000000000000696311000a0000000000000000000000648c100008000000000000000000000000000000000000000000000000000000000000005c8f1100bc8c100000000000000000006c8c10000a000000000000000100000000000000736311000e0000000000000000000000648c100008000000000000000000000000000000000000000000000000000000000000005c8f1100bc8c10000000000000000000cc8c100001000000000000000100000000000000816311000c00000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f1100d48c10000000000000000000e48c1000090000000000000001000000000000008d6311001100000001010000000000001e61110003000000000000002c8d10000d000000000000000000000000000000000000005c8f11003c8d100000000000000000005c8f110000000000000000000100000000000000836b11000b00000000000000000000004c8d100008000000000000000000000000000000000000000000000000000000000000005c8f1100548d10000000000000000000648d1000020000000000000000000000af911000150000005665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e003b000000000000000100000055000000949110001b000000329110003e00000070911000240000003b0000000000000001000000530000001d911000150000005b75383b2033325d578f10002e0000005c8f110000000000858f10000b0000005c8f110000000000908f100041000000d18f10003e0000000f9010004500000054901000450000009990100041000000da901000430000003b0000000000000001000000bc000000408f1000170000003b00000000000000010000005c000000fb8d10001f0000005c8f1100000000001a8e10003d000000578e100040000000978e1000250000005c8f110000000000bc8e10003b000000f78e100042000000398f1000070000005665633c5b75383b2033325d3e0000003b0000000000000001000000550000004d617962655672663b000000000000000100000052000000748d100040000000b48d1000470000002054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d6560206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e2057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f2060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e20576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572792065706f63682e204e6578742065706f63682072616e646f6d6e6573732e205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e20232053656375726974792054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e792063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d626572732074686174207468697320286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e20626520757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e2043757272656e7420736c6f74206e756d6265722e2054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e2054686973206973203020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2043757272656e742065706f636820617574686f7269746965732e2043757272656e742065706f636820696e6465782e00000000349210000d00000000000000480b110003000000000000005c8f1100449210000000000000000000549210000200000000000000000000006492100011000000000000002cab100009000000000000005c8f110078921000000000000000000088921000050000000000000045706f63684475726174696f6e0000003b0000000000000001000000bd000000e093100043000000239410003f0000004578706563746564426c6f636b54696d650000003b0000000000000001000000be000000b092100041000000f19210004400000035931000410000007693100042000000b89310002800000020546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e6720626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f7574207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f74206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e20546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746f2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e65706f636820696e64696365732077696c6c206e6576657220726561636820325e3634206265666f726520746865206465617468206f662074686520756e6976657273653b20716564576974686472617720686173206265656e20636865636b65642061626f76653b0a090909647565735f6c696d69746564203c2072656e745f627564676574203c2062616c616e6365202d2073756273697374656e6365203c2062616c616e6365202d206578697374656e7469616c5f6465706f7369743b0a0909097165640000004d0000000800000004000000bf000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a09090909090971656474696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f72215468657265206973206f6e6c79206f6e6520666174616c206572726f723b207165640000004d0000000800000004000000c0000000f79610000d000000da9610001b000000f596100002000000a4961000360000003d020000010000002f686f6d652f6461766964642f6465762f7375627374726174652f62696e2f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f203a20657865637574655f626c6f636b0c97100010000000696e697469616c697a655f626c6f636b249710000f0000006170706c795f65787472696e736963003c97100013000000696e686572656e745f65787472696e7369637300589710000f000000636865636b5f696e686572656e747300709710001400000076616c69646174655f7472616e73616374696f6e8c9710000f0000006f6666636861696e5f776f726b657200a49710000d0000006163636f756e745f6e6f6e6365000000af65110004000000c49710000b0000006765745f73746f7261676500d89710000a00000071756572795f696e666f0000ec9710001500000067656e65726174655f73657373696f6e5f6b6579733a65787472696e7369635f696e64657853797374656d4163636f756e744e6f6e6365426c6f636b486173684e756d626572506172656e744861736845787472696e73696373526f6f74446967657374589810001a0000004552524f523a20436f727275707465642073746174652061742054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b4e6f774d0000000800000004000000bf00000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e7420646174614576656e74734576656e74546f70696373000000000000449a10000a000000000000005c8f1100000000000000000000000000509a1000010000000000000000000000589a10000600000000000000609a1000010000000000000000000000789a1000010000000000000000000000809a10000e00000000000000909a1000010000000000000000000000a89a1000010000000000000000000000b09a10000800000000000000b89a1000010000000000000000000000d09a1000010000000000000000000000d89a10000b00000000000000e49a1000010000000000000000000000fc9a1000010000000000000000000000049b10000c00000000000000109b1000010000000000000000000000289b1000010000000000000000000000309b10000b000000000000003c9b1000010000000000000000000000549b1000010000000000000066696c6c5f626c6f636b0000769c10004800000072656d61726b0000000000006f9c10000700000000000000e960110007000000549c10001b0000007365745f686561705f70616765730000000000004f9c10000500000000000000480b110003000000109c10003f0000007365745f636f6465000000005e5b11000300000000000000e960110007000000fe9b1000120000007365745f73746f726167650000000000ec9b10000500000000000000f19b10000d000000d19b10001b0000006b696c6c5f73746f7261676500000000c59b10000400000000000000c99b100008000000a79b10001e0000006b696c6c5f7072656669780000000000a19b100006000000000000000c5c1100030000005c9b100045000000204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e707265666978204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b20412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e000000000000179810000c00000001010000000000000f5c11000c0000000000000038a1100008000000000000000000000000000000000000005c8f110078a21000000000000000000040a110000100000000000000010000000000000048a110000e00000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f110094a11000000000000000000058a110000100000000000000000000000000000060a1100013000000000000000000000073a1100006000000000000000000000000000000000000000000000000000000000000005c8f110094a1100000000000000000007ca110000100000000000000000000000000000084a110001000000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f110094a110000000000000000000a4a1100001000000000000000000000000000000239810000900000001010000000000009c6011000e000000000000005932110007000000000000000000000000000000000000005c8f1100eca110000000000000000000aca1100001000000000000000100000000000000b4a110000d00000001010000000000001e6111000300000000000000e960110007000000000000000000000000000000000000005c8f1100c4a110000000000000000000d4a11000010000000000000001000000000000002c9810000600000000000000000000009c6011000e000000000000000000000000000000000000000000000000000000000000005c8f110078a210000000000000000000dca1100001000000000000000100000000000000329810000a00000000000000000000005932110007000000000000000000000000000000000000000000000000000000000000005c8f1100eca110000000000000000000e4a11000010000000000000001000000000000003c9810000e00000000000000000000005932110007000000000000000000000000000000000000000000000000000000000000005c8f1100eca110000000000000000000fca11000010000000000000001000000000000004a98100006000000000000000000000004a210000b000000000000000000000000000000000000000000000000000000000000005c8f110010a21000000000000000000020a2100001000000000000000100000000000000fd98100006000000000000000000000028a2100023000000000000000000000000000000000000000000000000000000000000005c8f11004ca2100000000000000000005ca210000100000000000000010000000000000064a210000a00000000000000000000006ea210000a000000000000000000000000000000000000000000000000000000000000005c8f110078a21000000000000000000088a2100001000000000000000100000000000000039910000b000000020101000000000090a21000020000000000000059321100070000000000000092a2100021000000000000005c8f1100b4a210000000000000000000c4a210000d0000000000000001000000543a3a496e64657840a810001f00000045787472696e736963436f756e74000012a810002e000000416c6c45787472696e73696373576569676874576569676874000000cda7100045000000416c6c45787472696e736963734c656e3b0000000000000001000000520000007da710005000000057a710002600000045787472696e736963446174610000003b00000000000000010000005800000008a710004f000000c6a6100042000000aaa610001c0000003b0000000000000001000000c100000065a61000450000004469676573744f663c543e003b00000000000000010000005500000029a610003c0000005665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e003b0000000000000001000000c200000001a61000280000004576656e74436f756e744576656e74496e6465783b00000000000000010000005c000000d3a510002e00000028295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e003b0000000000000001000000550000002ca310004900000075a31000250000005c8f1100000000009aa310004b000000e5a310002a0000005c8f1100000000000fa410005400000063a4100051000000b4a41000390000005c8f110000000000eda410005300000040a510005300000093a5100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e4e6f646520697320636f6e6669677572656420746f20757365207468652073616d6520686173683b20716564003b00000000000000010000003c00000000000000c8a810000300000000000000cca81000010000000000000000000000e4a810000900000000000000736574000000000066aa1000030000000000000069aa1000120000002ca91000160000005c8f11000000000042a910005600000098a91000360000005c8f110000000000cea91000510000001faa1000110000005c8f11000000000030aa10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920604d696e696d756d506572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e00000000009d9810000300000000000000000000002cab100009000000000000000000000000000000000000000000000000000000000000005c8f110038ab1000000000000000000048ab100001000000000000000100000000000000827411000900000000000000000000000353110004000000000000000000000000000000000000000000000000000000000000005c8f110050ab1000000000000000000060ab1000010000000000000001000000543a3a4d6f6d656e740000003b00000000000000010000005300000095ab1000240000003b00000000000000010000005200000068ab10002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e00000000000000f4ab10000d000000000000002cab100009000000000000005c8f110004ac1000000000000000000014ac100004000000000000004d696e696d756d506572696f640000003b0000000000000001000000c300000034ac10005a0000008eac10005a000000e8ac10005900000041ad10001c00000020546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e3a6865617070616765733a636f646554696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b54696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b734469676573744974656d206e6f7420657175616c0000000000002cae10000f000000000000003cae10000200000000000000000000004cae100004000000000000004e65774163636f756e74496e64657800e252110009000000e7ae10000c0000006cae1000220000005c8f1100000000008eae100041000000cfae1000180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e6465780000000000441d11000800000000000000fcaf10000400000000000000000000001cb010000200000000000000000000002cb01000050000000000000034b010000500000000000000000000005cb010000200000000000000000000006cb01000080000000000000090f3100001000000000000000000000074b010000100000000000000000000007cb010000b0000000000000090f3100001000000000000000000000088b01000010000000000000000000000041e1100080000000000000090b01000020000000000000000000000a0b01000010000000000000000000000a8b010000e0000000000000090b01000020000000000000000000000b8b010000100000000000000e252110009000000a8b210000d000000971f1100040000003ab210000b00000045b210005300000098b2100010000000566f746564000000e252110009000000971f11000400000003531100040000003ab210000b0000003ab210000b000000b2b1100042000000f4b1100046000000417070726f76656481b1100031000000446973617070726f766564004cb1100035000000971f11000400000003531100040000000bb11000410000004d656d62657245786563757465640000c0b010004b00000020412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e646578496e64696365734e657874456e756d536574456e756d536574496e7374616e636532436f6c6c65637469766550726f706f73616c734d656d62657273566f74696e670000000000bcb210000b0000000000000000000000a8b310000f000000000000000000000000000000000000000000000000000000000000005c8f110080bb10000000000000000000b8b3100001000000000000000100000000000000c7b21000070000000101000000000000a8b310000f000000000000000c3d110011000000000000000000000000000000000000005c8f110090bb10000000000000000000c0b31000010000000000000001000000543a3a4163636f756e74496e64657800deb310001f000000c8b31000160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e7374616e636531436f6c6c656374697665636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f6465000000000018b510000b0000000000000024b510000100000000000000000000003cb510000400000000000000000000005cb51000070000000000000064b510000100000000000000000000007cb51000030000000000000000000000c8261100070000000000000094b51000020000000000000000000000c4b51000040000000000000000000000802711000400000000000000e4b510000300000000000000000000002cb6100004000000000000007365745f6d656d6265727300000000005cb810000b000000000000000c3d110011000000dbb71000540000002fb81000170000005c8f11000000000046b8100016000000657865637574650000000000d85a1100080000000000000055b710001e00000073b710003d0000005c8f110000000000b0b710002b0000000000000038b71000090000000000000041b710001400000000000000d85a1100080000000000000055b710001e0000002d5a11000b000000e6b61000240000000ab710002e000000a65a11000c00000000000000d85a11000800000000000000593211000700000000000000c4b610000500000000000000c9b610001600000000000000dfb61000070000000000000003531100040000002d5a11000b0000004cb61000230000006fb6100055000000a65a11000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e7468726573686f6c64436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e642070726f76696465206974207072652d736f727465642e20526571756972657320726f6f74206f726967696e2e6e65775f6d656d626572735665633c543a3a486173683e0094b910002400000050726f706f73616c4f663c542061732054726169743c493e3e3a3a50726f706f73616c0061b9100033000000566f7465733c543a3a4163636f756e7449643e0034b910002d00000022b9100012000000d4b810004e000000205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e2050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e00000000e1b2100009000000000000000000000067b810000c000000000000000000000000000000000000000000000000000000000000005c8f110090bb1000000000000000000074b81000010000000000000001000000000000007cb810000a000000010100000000000059321100070000000000000086b8100019000000000000000000000000000000000000005c8f110070bb10000000000000000000a0b8100001000000000000000000000000000000f1b21000060000000101000000000000593211000700000000000000a8b8100013000000000000000000000000000000000000005c8f110070bb10000000000000000000bcb8100001000000000000000000000000000000ac7411000d00000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f110080bb10000000000000000000c4b8100001000000000000000100000000000000eab210000700000000000000000000000c3d110011000000000000000000000000000000000000000000000000000000000000005c8f110090bb10000000000000000000ccb810000100000000000000010000003b0000000000000001000000520000003b00000000000000010000005c0000003b00000000000000010000005500000070726f706f736572206e6f742061206d656d6265726475706c69636174652070726f706f73616c73206e6f7420616c6c6f77656470726f706f73616c206d7573742065786973746d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f726564766f746572206e6f742061206d656d626572486561644f664e6f6d696e61746f72734e6f6d696e61746f7273486561644f6656616c696461746f727356616c696461746f7273426f6e6465644c65646765725374616b65727343757272656e74457261537461727456616c696461746f72536c617368496e4572614e6f6d696e61746f72536c617368496e457261536c617368696e675370616e735370616e536c6173680000000000000038bd1000060000000000000040bd100002000000000000000000000050bd100002000000000000000000000060bd10000500000000000000d8ef100002000000000000000000000068bd100001000000000000000000000070bd10001a00000000000000586f11000100000000000000000000008cbd1000020000000000000052657761726400009b1f1100070000009b1f1100070000003ebe10005400000092be100023000000536c617368000000f5bd1000490000004f6c64536c617368696e675265706f727444697363617264656400009cbd100047000000e3bd10001200000020416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c64206e6f742062652070726f6365737365642e204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e20416c6c2076616c696461746f72732068617665206265656e207265776172646564206279207468652066697273742062616c616e63653b20746865207365636f6e64206973207468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e506179656543757272656e74456c6563746564536c6f745374616b65556e6170706c696564536c617368657300000000000000a4c110000400000000000000a8c11000030000000000000000000000f0c110000f000000000000000000000068c210000a0000000000000074c210000100000000000000000000008cc210000e0000000000000000000000fcc21000060000000000000004c310000100000000000000000000001cc31000170000000000000000000000d4c3100011000000000000005c8f1100000000000000000000000000e8c3100010000000000000000000000068c41000080000000000000070c4100001000000000000000000000088c410000b0000000000000000000000e0c410000800000000000000e8c4100001000000000000000000000000c510000b000000000000000000000058c5100005000000000000005c8f110000000000000000000000000060c510000b0000000000000000000000b8c510000900000000000000c4c51000010000000000000000000000dcc510000b000000000000000000000034c610000e0000000000000044c610000100000000000000000000005cc610000b0000000000000000000000b4c610001300000000000000c8c61000010000000000000000000000e0c61000010000000000000000000000e8c610000d000000000000005c8f1100000000000000000000000000f8c6100005000000000000000000000020c710000d000000000000005c8f110000000000000000000000000030c7100006000000000000000000000060c71000110000000000000074c710000100000000000000000000008cc7100001000000000000000000000094c710000d00000000000000a4c71000010000000000000000000000bcc71000010000000000000000000000c4c7100014000000000000005c8f1100000000000000000000000000d8c7100005000000000000000000000000c81000150000000000000018c8100002000000000000000000000048c810000700000000000000626f6e640000000062cc10000a00000000000000b55a11002300000000000000143611000500000000000000193611001500000000000000efcc10000500000000000000f4cc100011000000c7d510005900000020d61000210000005c8f11000000000041d610004c0000005c8f1100000000008dd61000490000005c8f1100000000002d5a11000b000000d6d6100035000000385a1100080000000bd710001a0000005c8f11000000000025d710005b00000080d7100049000000a65a11000c000000626f6e645f6578747261000000000000b9d510000e00000000000000193611001500000093d4100059000000ecd410000d0000005c8f110000000000f9d41000540000004dd5100059000000a6d51000130000005c8f1100000000007bcb1000550000005c8f1100000000002d5a11000b000000d0cb10003a000000385a110008000000d235110010000000a65a11000c000000756e626f6e640000000000001436110005000000000000001936110015000000b8d01000550000000dd11000400000004dd11000490000005c8f11000000000096d1100052000000e8d11000300000005c8f11000000000018d210004f00000067d210004f000000b6d210003f0000005c8f1100000000009acc1000550000005c8f110000000000f5d21000260000005c8f1100000000002d5a11000b0000001bd31000500000000acc1000260000006bd3100059000000c4d310005c00000020d4100069000000d23511001000000089d410000a00000077697468647261775f756e626f6e646564000000b1ce10004b0000005c8f110000000000fcce10004d00000049cf1000130000005c8f1100000000009acc1000550000005c8f1100000000005ccf10001b0000005c8f1100000000002d5a11000b00000077cf100055000000cccf1000510000001dd010003d0000005ad010005e00000030cc100032000000a65a11000c00000076616c6964617465000000009ece10000500000000000000a3ce10000e00000064ce10003a0000005c8f11000000000044cb1000370000005c8f1100000000009acc1000550000005c8f1100000000002d5a11000b000000d0cb10003a0000000acc10002600000030cc100032000000a65a11000c0000006e6f6d696e6174650000000035ce100007000000000000003cce1000280000004ccd1000440000005c8f11000000000044cb1000370000005c8f1100000000009acc1000550000005c8f1100000000002d5a11000b00000090cd100049000000d9cd100026000000ffcd100036000000a65a11000c0000006368696c6c00000005cd1000320000005c8f11000000000044cb1000370000005c8f1100000000009acc1000550000005c8f1100000000002d5a11000b000000d0cb10003a00000037cd10001500000030cc100032000000a65a11000c0000007365745f706179656500000000000000efcc10000500000000000000f4cc1000110000006ccc10002e0000005c8f11000000000044cb1000370000005c8f1100000000009acc1000550000005c8f1100000000002d5a11000b000000d0cb10003a0000000acc10002600000030cc100032000000a65a11000c0000007365745f636f6e74726f6c6c657200000000000062cc10000a00000000000000b55a11002300000020cb1000240000005c8f11000000000044cb1000370000005c8f1100000000007bcb1000550000005c8f1100000000002d5a11000b000000d0cb10003a0000000acc10002600000030cc100032000000a65a11000c0000007365745f76616c696461746f725f636f756e7400000000005e5b1100030000000000000014cb10000c000000f4ca100020000000666f7263655f6e6f5f65726173000000c8ca10002c0000005c8f1100000000002d5a11000b000000b8ca100010000000a65a11000c000000666f7263655f6e65775f6572610000003dca10005300000090ca1000280000005c8f1100000000002d5a11000b000000b8ca100010000000a65a11000c0000007365745f696e76756c6e657261626c65730000000000000033ca10000a000000000000000c3d11001100000000ca100033000000666f7263655f756e7374616b6500000000000000fbc9100005000000000000000f5c11000c000000b8c9100043000000666f7263655f6e65775f6572615f616c7761797363c91000410000005c8f1100000000002d5a11000b000000a4c9100014000000a65a11000c00000063616e63656c5f64656665727265645f736c6173680000000000000043c91000030000000000000046c9100008000000000000004ec910000d000000000000005bc910000800000080c8100051000000d1c810001c000000edc81000410000005c8f1100000000002d5a11000b0000002ec9100015000000a65a11000c0000002043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e2043616e2062652063616c6c6564206279206569746865722074686520726f6f74206f726967696e206f72207468652060543a3a536c61736843616e63656c4f726967696e602e2070617373696e67207468652065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e202d204f6e652073746f726167652077726974652e657261457261496e646578736c6173685f696e64696365735665633c7533323e20466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e202d204f6e652073746f7261676520777269746520466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e737461736820536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f727320466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c20626520726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e202d204e6f20617267756d656e74732e20466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e2054686520696465616c206e756d626572206f662076616c696461746f72732e436f6d706163743c7533323e202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c6572202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566732052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e2020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c2077686963682069732020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e203c2f7765696768743e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e20556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e00000000000000f36f11000e00000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f11009ce410000000000000000000bce0100001000000000000000100000000000000017011001500000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f1100c4e010000000000000000000d4e0100001000000000000000100000000000000dce010000d00000000000000000000000c3d110011000000000000000000000000000000000000000000000000000000000000005c8f110084e310000000000000000000ece010000300000000000000010000000000000053bc10000600000001010000000000000f5c11000c000000000000000f5c11000c000000000000000000000000000000000000005c8f110038e11000000000000000000004e110000100000000000000000000000000000059bc10000600000001010000000000000f5c11000c000000000000000ce1100029000000000000000000000000000000000000005c8f110038e11000000000000000000048e1100001000000000000000000000000000000b5be10000500000001010000000000000f5c11000c00000000000000f4cc100011000000000000000000000000000000000000005c8f110050e11000000000000000000060e110000100000000000000010000000000000049bc10000a00000001010100000000000f5c11000c00000000000000a3ce10000e000000000000000000000000000000000000005c8f110068e11000000000000000000078e11000010000000000000001000000000000002fbc10000a00000001010100000000000f5c11000c0000000000000080e1100019000000000000000000000000000000000000005c8f11009ce110000000000000000000ace11000040000000000000000000000000000005fbc10000700000001010000000000000f5c11000c00000000000000cce1100024000000000000000000000000000000000000005c8f1100f0e11000000000000000000000e2100004000000000000000100000000000000babe10000e00000000000000000000000c3d110011000000000000000000000000000000000000000000000000000000000000005c8f110084e31000000000000000000020e21000010000000000000001000000000000001d7011000a000000000000000000000046c9100008000000000000000000000000000000000000000000000000000000000000005c8f11009ce41000000000000000000028e210000100000000000000010000000000000066bc10000f000000000000000000000030e210000b000000000000000000000000000000000000000000000000000000000000005c8f11003ce2100000000000000000004ce2100001000000000000000100000000000000277011001b0000000000000000000000e76f11000c000000000000000000000000000000000000000000000000000000000000005c8f11009ce41000000000000000000054e2100001000000000000000100000000000000427011001600000000000000000000005ce2100009000000000000000000000000000000000000000000000000000000000000005c8f110068e21000000000000000000078e2100001000000000000000100000000000000c8be1000090000000000000000000000824711000c000000000000000000000000000000000000000000000000000000000000005c8f1100fce21000000000000000000080e21000030000000000000001000000000000005870110008000000000000000000000098e2100007000000000000000000000000000000000000000000000000000000000000005c8f1100a0e210000000000000000000b0e210000100000000000000010000000000000060701100130000000000000000000000b8e2100007000000000000000000000000000000000000000000000000000000000000005c8f1100c0e210000000000000000000d0e2100003000000000000000100000000000000e8e21000130000000000000000000000824711000c000000000000000000000000000000000000000000000000000000000000005c8f1100fce2100000000000000000000ce3100002000000000000000100000000000000d1be100010000000010100000000000046c9100008000000000000001ce310002f000000000000000000000000000000000000005c8f11004ce3100000000000000000005ce3100001000000000000000100000000000000737011000a000000000000000000000064e310001d000000000000000000000000000000000000000000000000000000000000005c8f110084e31000000000000000000094e310000100000000000000010000000000000075bc100013000000020102000000000046c9100008000000000000000f5c11000c000000000000009ce3100017000000000000005c8f1100b4e310000000000000000000c4e310000200000000000000000000000000000088bc100013000000020102000000000046c9100008000000000000000f5c11000c00000000000000824711000c000000000000005c8f1100d4e310000000000000000000e4e31000010000000000000000000000000000009bbc10000d00000001010000000000000f5c11000c00000000000000ece3100017000000000000000000000000000000000000005c8f110004e41000000000000000000014e4100001000000000000000000000000000000a8bc10000900000001010000000000001ce4100023000000000000003fe4100022000000000000000000000000000000000000005c8f110064e41000000000000000000074e41000020000000000000001000000000000007d70110016000000000000000000000046c9100008000000000000000000000000000000000000000000000000000000000000005c8f110084e41000000000000000000094e4100001000000000000000000000000000000937011000e00000000000000000000001e61110003000000000000000000000000000000000000000000000000000000000000005c8f11009ce410000000000000000000ace4100001000000000000000100000073ed10002a0000003b0000000000000001000000c400000023ed100050000000496e76756c6e657261626c65730000004fec100056000000a5ec100053000000f8ec10002b0000000fec1000400000005374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0000003b000000000000000100000052000000beeb1000510000003b00000000000000010000005200000085eb1000390000003b0000000000000001000000c500000034eb1000510000004e6f6d696e6174696f6e733c543a3a4163636f756e7449643e0000003b00000000000000010000005200000058ea1000590000005c8f110000000000b1ea10004d000000feea1000360000004578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3b0000000000000001000000c60000009be9100053000000eee91000460000005c8f11000000000034ea1000240000005ce910003f00000045e91000170000004d6f6d656e744f663c543e003b00000000000000010000005300000027e910001e000000f3e8100034000000457261506f696e74730000003b0000000000000001000000c7000000b0e810004300000034e810004c0000005c8f11000000000080e8100030000000466f7263696e67003b000000000000000100000052000000ede710004700000050657262696c6c003b00000000000000010000005c00000076e710003e0000005c8f110000000000b4e710003900000043616e63656c6564536c6173685061796f7574003b000000000000000100000054000000f6e61000450000003be710003b0000005665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e003b000000000000000100000055000000c5e61000310000005665633c28457261496e6465782c2053657373696f6e496e646578293e0000003b0000000000000001000000550000007ce61000490000002850657262696c6c2c2042616c616e63654f663c543e29003b0000000000000001000000520000000fe610005100000060e610001c0000003b000000000000000100000052000000b7e5100058000000736c617368696e673a3a536c617368696e675370616e73003b00000000000000010000005200000094e510002300000028543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e64657829736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e0000003b0000000000000001000000c800000017e510004f00000066e510002e0000003b000000000000000100000052000000d8e410003f0000003b00000000000000010000005c000000b4e4100024000000205468652076657273696f6e206f662073746f7261676520666f7220757067726164652e20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2c2061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e20416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e20416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e20616e6420736c6173682076616c7565206f6620746865206572612e2041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e20416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e2054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e74207768696368207761732063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e20546865207374617274206f66207468652063757272656e74206572612e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e204e4f54453a206973207072697661746520736f20746861742077652063616e20656e73757265207570677261646564206265666f726520616c6c207479706963616c2061636365737365732e204469726563742073746f7261676520415049732063616e207374696c6c2062797061737320746869732070726f74656374696f6e2e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e0000000000000010ee10000e00000000000000e76f11000c000000000000005c8f110020ee1000000000000000000030ee100001000000000000000000000038ee10000f0000000000000046c9100008000000000000005c8f110048ee1000000000000000000058ee1000010000000000000053657373696f6e7350657245726100003b0000000000000001000000c900000099ee10001c000000426f6e64696e674475726174696f6e003b0000000000000001000000ca00000060ee100039000000204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e204e756d626572206f662073657373696f6e7320706572206572612e0000000000000094ef100007000000000000008c5211000100000000000000000000009cef1000010000000000000000000000a4ef10000a000000000000008c521100010000000000000000000000b0ef1000010000000000000000000000b8ef10000b000000000000008c521100010000000000000000000000c4ef1000010000000000000000000000ccef10000b00000000000000d8ef1000020000000000000000000000e8ef1000010000000000000000000000f0ef10000a00000000000000d8ef1000020000000000000000000000fcef100001000000000000004e616d655365740097f01000100000004e616d65466f7263656400007ef01000190000004e616d654368616e676564006af01000140000004e616d65436c656172656400e2521100090000009b1f11000700000036f01000340000004e616d654b696c6c6564000004f01000320000002041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e2041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e2041206e616d6520776173206368616e6765642e2041206e616d652077617320666f726369626c79207365742e2041206e616d6520776173207365742e71202f2028712f246d617829203c202832202a20246d6178292e204d6163726f2070726576656e747320616e792074797065206265696e672063726561746564207468617420646f6573206e6f74207361746973667920746869733b207165640018f11000420000006f000000210000002f686f6d652f6461766964642f6465762f7375627374726174652f7072696d6974697665732f61726974686d657469632f7372632f7065725f7468696e67732e7273000000000000617474656d707420746f20646976696465206279207a65726f4661696c656420746f20636f6e76657274456e636f756e7465726564206572726f7220696e206d6967726174696f6e206f66205374616b696e673a3a4e6f6d696e61746f7273206d61702e5374616b696e673a3a4e6f6d696e61746f7273206d6170207265696e697469616c697a656446696e6973686564206d6967726174696e67205374616b696e672073746f7261676520746f2076312e5072697374696e65436f6465436f646553746f72616765436f6e7472616374496e666f4f664761735072696365000000000048f31000080000000000000050f3100003000000000000000000000068f3100001000000000000000000000070f310000c00000000000000301e11000200000000000000000000007cf3100001000000000000000000000084f310000a0000000000000090f3100001000000000000000000000098f31000010000000000000000000000a0f310000f00000000000000b0f31000010000000000000000000000b8f31000010000000000000000000000c0f310000a00000000000000ccf31000020000000000000000000000dcf31000020000000000000000000000646911000800000000000000ecf31000020000000000000000000000fcf3100001000000000000005472616e73666572e252110009000000e2521100090000009b1f11000700000027f510005a000000496e7374616e746961746564f0f4100037000000436f646553746f7265640000971f110004000000c2f410002e0000005363686564756c6555706461746564001e6111000300000092f4100030000000446973706174636865640000e252110009000000035311000400000027f410004e00000075f410001d000000e252110009000000e96011000700000004f410002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060696e7374616e7469617465602e0000004d0000000800000004000000bf0000003b00000000000000010000003c000000acf510001c00000056617269616e74206973206e6576657220636f6e737472756374656473657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a09090971656400000000e8f610000800000000000000f0f6100001000000000000000000000008f7100010000000000000000000000088f710000a000000000000005c8f110000000000000000000000000094f710000a0000000000000000000000e4f710000900000000000000f0f7100001000000000000000000000008f810000d000000000000000000000070f810000a000000000000007cf81000020000000000000000000000acf810000c000000000000007365745f6e616d6500000000166711000400000000000000e96011000700000042fb10005700000099fb1000130000005c8f110000000000acfb1000580000005c8f11000000000004fc1000570000005bfc1000100000005c8f110000000000f9591100340000005c8f1100000000002d5a11000b000000385a110008000000b2f9100021000000d3f910001a000000edf910000d000000a65a11000c000000636c6561725f6e616d650000d5fa1000540000005c8f110000000000f9591100340000005c8f1100000000002d5a11000b000000385a11000800000029fb100019000000d3f910001a000000edf910000d000000a65a11000c0000006b696c6c5f6e616d6500000000000000faf910000600000000000000b55a11002300000000fa1000390000005c8f11000000000039fa1000520000008bfa1000130000005c8f11000000000066f910004c0000005c8f1100000000002d5a11000b000000385a1100080000009efa100037000000d3f910001a000000edf910000d000000a65a11000c000000666f7263655f6e616d65000000000000faf910000600000000000000b55a11002300000000000000166711000400000000000000e9601100070000000cf91000320000005c8f1100000000003ef91000280000005c8f11000000000066f910004c0000005c8f1100000000002d5a11000b000000385a110008000000b2f9100021000000d3f910001a000000edf910000d000000a65a11000c0000002053657420612074686972642d7061727479206163636f756e742773206e616d652077697468206e6f206465706f7369742e204e6f206c656e67746820636865636b696e6720697320646f6e65206f6e20746865206e616d652e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f206f72206d617463682060543a3a466f7263654f726967696e602e202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e2e202d204f6e652073746f7261676520726561642f77726974652e202d204f6e65206576656e742e7461726765742052656d6f766520616e206163636f756e742773206e616d6520616e642074616b6520636861726765206f6620746865206465706f7369742e204661696c73206966206077686f6020686173206e6f74206265656e206e616d65642e20546865206465706f736974206973206465616c742077697468207468726f7567682060543a3a536c61736865646020696d62616c616e63652068616e646c65722e202d204f6e6520756e62616c616e6365642068616e646c6572202870726f6261626c7920612062616c616e6365207472616e736665722920436c65617220616e206163636f756e742773206e616d6520616e642072657475726e20746865206465706f7369742e204661696c7320696620746865206163636f756e7420776173206e6f74206e616d65642e202d204f6e652062616c616e6365206f7065726174696f6e2e2053657420616e206163636f756e742773206e616d652e20546865206e616d652073686f756c642062652061205554462d382d656e636f64656420737472696e6720627920636f6e76656e74696f6e2c2074686f75676820776520646f6e277420636865636b2069742e20546865206e616d65206d6179206e6f74206265206d6f7265207468616e2060543a3a4d61784c656e677468602062797465732c206e6f72206c657373207468616e2060543a3a4d696e4c656e677468602062797465732e20496620746865206163636f756e7420646f65736e277420616c726561647920686176652061206e616d652c207468656e206120666565206f6620605265736572766174696f6e4665656020697320726573657276656420696e20746865206163636f756e742e0000000000c4fc10000600000001010000000000000f5c11000c00000000000000cafc100017000000000000000000000000000000000000005c8f1100e4fc10000000000000000000f4fc10000100000000000000000000004e616d654f66285665633c75383e2c2042616c616e63654f663c543e290000003b0000000000000001000000cb000000fcfc10001c00000020546865206c6f6f6b7570207461626c6520666f72206e616d65732e00000000c0fd10000e00000000000000824711000c000000000000005c8f1100141111000000000000000000d0fd1000010000000000000000000000d8fd100009000000000000001e61110003000000000000005c8f1100e4fd10000000000000000000f4fd1000010000000000000000000000fcfd100009000000000000001e61110003000000000000005c8f110008fe1000000000000000000018fe100001000000000000005265736572766174696f6e466565000064fe1000110000004d696e4c656e6774680000003b0000000000000001000000cc00000042fe1000220000004d61784c656e6774680000003b0000000000000001000000cd00000020fe10002200000020546865206d6178696d756d206c656e6774682061206e616d65206d61792062652e20546865206d696e696d756d206c656e6774682061206e616d65206d61792062652e205265736572766174696f6e206665652e00000000000000a4fe10000500000000000000acfe1000010000000000000000000000c4fe10000100000000000000626174636800000000000000f8fe10000500000000000000fdfe100017000000ccfe10002c0000002053656e642061206261746368206f662064697370617463682063616c6c7320286f6e6c7920726f6f74292e63616c6c735665633c3c542061732054726169743e3a3a43616c6c3e64656661756c743a00000000f8ff10000f0000000000000008001100010000000000000000000000200011000300000000000000000000003800110008000000000000004000110002000000000000000000000070001100020000000000000000000000af651100040000000000000080001100040000000000000000000000e0001100070000000000000000000000180111000b0000000000000024011100040000000000000000000000840111000a0000000000000000000000d40111000f00000000000000e40111000200000000000000000000001402110005000000000000007570646174655f7363686564756c6500000000006408110008000000000000006c08110008000000f40711002d0000005c8f11000000000021081100430000007075745f636f646500000000a20511000900000000000000ab0511000c00000000000000f00711000400000000000000e9601100070000006407110057000000bb0711003500000000000000560311000400000000000000b55a11002300000000000000143611000500000000000000193611001500000000000000a20511000900000000000000ab0511000c00000000000000cb0511000400000000000000e960110007000000cf051100420000005c8f110000000000110611004a0000005b0611002c0000008706110046000000cd061100520000001f07110045000000696e7374616e74696174650000000000990511000900000000000000193611001500000000000000a20511000900000000000000ab0511000c00000000000000b70511000900000000000000c00511000b00000000000000cb0511000400000000000000e960110007000000780311006f0000005c8f110000000000e7031100260000005c8f1100000000000d041100500000005d041100410000009e0411005b000000f904110057000000500511002a0000007a0511001f000000636c61696d5f73757263686172676500000000005603110004000000000000000f5c11000c000000000000005a0311000a0000000000000064031100140000003c0211005c00000098021100450000005c8f110000000000dd0211004e0000002b0311002b00000020416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e646573746175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20496e7374616e7469617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e20496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c4761733e636f64655f68617368436f6465486173683c543e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c65000000006c691100080000000000000000000000dc0a110003000000000000000000000000000000000000000000000000000000000000005c8f11004c0b11000000000000000000e00a110001000000000000000100000000000000746911000f00000000000000000000006c08110008000000000000000000000000000000000000000000000000000000000000005c8f1100e80a11000000000000000000f80a11000100000000000000010000000000000012f210000c0000000101000000000000c00511000b00000000000000e960110007000000000000000000000000000000000000005c8f1100000b11000000000000000000100b1100010000000000000000000000000000001ef210000b0000000101000000000000c00511000b00000000000000180b110016000000000000000000000000000000000000005c8f1100300b11000000000000000000400b110001000000000000000000000000000000836911000e0000000000000000000000480b110003000000000000000000000000000000000000000000000000000000000000005c8f11004c0b110000000000000000005c0b11000100000000000000010000000000000029f210000e00000001010000000000000f5c11000c00000000000000640b11000f000000000000000000000000000000000000005c8f1100740b11000000000000000000840b11000100000000000000000000000000000037f21000080000000000000000000000824711000c000000000000000000000000000000000000000000000000000000000000005c8f11008c0b110000000000000000009c0b110001000000000000000100000047617300d80c1100200000003b0000000000000001000000ce000000b30c1100250000003b0000000000000001000000cf0000005a0c1100590000007761736d3a3a5072656661625761736d4d6f64756c6500003b000000000000000100000052000000010c110059000000753634003b000000000000000100000053000000ec0b110015000000436f6e7472616374496e666f3c543e003b000000000000000100000052000000c20b11002a0000003b0000000000000001000000d0000000a40b11001e00000020546865207072696365206f66206f6e6520756e6974206f66206761732e2054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e000000007810110013000000000000009c6011000e000000000000005c8f11008c10110000000000000000009c101100040000000000000000000000bc1011001000000000000000824711000c000000000000005c8f1100141111000000000000000000cc101100010000000000000000000000d410110011000000000000001e61110003000000000000005c8f1100e81011000000000000000000f8101100020000000000000000000000081111000b00000000000000824711000c000000000000005c8f1100141111000000000000000000241111000100000000000000000000002c1111001100000000000000824711000c000000000000005c8f110040111100000000000000000050111100070000000000000000000000881111000f00000000000000824711000c000000000000005c8f1100981111000000000000000000a8111100020000000000000000000000b81111000b00000000000000824711000c000000000000005c8f1100341211000000000000000000c4111100010000000000000000000000cc1111000b00000000000000824711000c000000000000005c8f1100341211000000000000000000d8111100010000000000000000000000e01111001200000000000000824711000c000000000000005c8f1100341211000000000000000000f4111100010000000000000000000000fc1111001200000000000000824711000c000000000000005c8f110010121100000000000000000020121100010000000000000000000000281211000b00000000000000824711000c000000000000005c8f110034121100000000000000000044121100020000000000000000000000541211000b00000000000000dc0a110003000000000000005c8f110084121100000000000000000060121100020000000000000000000000701211001200000000000000dc0a110003000000000000005c8f110084121100000000000000000094121100020000000000000000000000a412110008000000000000001e61110003000000000000005c8f1100ac1211000000000000000000bc121100020000000000000000000000cc1211000c000000000000001e61110003000000000000005c8f1100d81211000000000000000000e8121100010000000000000000000000f01211000d00000000000000dc0a110003000000000000005c8f11000013110000000000000000001013110002000000000000005369676e6564436c61696d48616e6469636170003b0000000000000001000000d1000000c0181100380000005c8f110000000000f8181100430000003b1911001a000000546f6d6273746f6e654465706f7369748b1811003500000053746f7261676553697a654f66667365740000003b0000000000000001000000d20000000e18110054000000621811002900000052656e7442797465466565003b000000000000000100000056000000c11711004d00000052656e744465706f7369744f66667365740000003b0000000000000001000000d300000049161100410000008a161100160000005c8f110000000000a01611005a000000fa161100560000005017110053000000a31711001e000000537572636861726765526577617264003b0000000000000001000000d4000000f6151100390000002f1611001a0000005472616e7366657246656500d1151100250000004372656174696f6e46656500aa151100270000005472616e73616374696f6e42617365466565000073151100370000005472616e73616374696f6e4279746546656500003b0000000000000001000000640000003015110043000000436f6e7472616374466565003b000000000000000100000057000000d914110050000000291511000700000043616c6c42617365466565008414110047000000cb1411000e000000496e7374616e74696174654261736546656500003b0000000000000001000000d50000002e1411004e0000007c141100080000004d617844657074683b0000000000000001000000d6000000d41311004c000000201411000e0000004d617856616c756553697a653b0000000000000001000000d7000000861311004e000000426c6f636b4761734c696d69740000003b0000000000000001000000d80000002013110049000000691311001d00000020546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e204120726561736f6e61626c652064656661756c742076616c75652069732031305f3030305f3030302e20546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f696e7374616e746961746520737461636b2e204120726561736f6e61626c652064656661756c742076616c7565206973203130302e20546865206261736520666565206368617267656420666f7220696e7374616e74696174696e67206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203137352e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203133352e205468652066656520726571756972656420746f20696e7374616e7469617465206120636f6e747261637420696e7374616e63652e204120726561736f6e61626c652064656661756c742076616c75652069732032312e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f6620696e7374616e746961696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c617943616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e74726163744e616d6520746f6f2073686f72744e616d6520746f6f206c6f6e67626164206f726967696e4e6f74206e616d65646e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e74486561644f6644656c65676174696f6e7344656c65676174696f6e735265666572656e64756d496e666f4f66566f74654f6600000000000000441d110008000000000000004c1d11000200000000000000000000005c1d1100010000000000000000000000641d110006000000000000006c1d1100030000000000000000000000841d11000100000000000000000000008c1d11000e000000000000005c8f11000000000000000000000000009c1d1100010000000000000000000000a41d11000700000000000000ac1d1100020000000000000000000000bc1d1100010000000000000000000000c41d11000600000000000000cc1d1100010000000000000000000000d41d1100010000000000000000000000dc1d11000900000000000000cc1d1100010000000000000000000000e81d1100010000000000000000000000f01d11000900000000000000cc1d1100010000000000000000000000fc1d1100010000000000000000000000041e110008000000000000000c1e11000200000000000000000000001c1e1100010000000000000000000000241e11000900000000000000301e1100020000000000000000000000401e1100010000000000000000000000481e11000b000000000000008c521100010000000000000000000000541e11000100000000000000000000005c1e11000600000000000000641e11000300000000000000000000007c1e1100010000000000000000000000841e11000d00000000000000941e1100030000000000000000000000ac1e1100010000000000000000000000b41e11000c00000000000000941e1100030000000000000000000000c01e1100010000000000000000000000c81e11000f00000000000000d81e1100020000000000000000000000e81e1100010000000000000000000000f01e11000f00000000000000d81e1100020000000000000000000000001f1100010000000000000000000000081f11000e00000000000000181f1100040000000000000000000000381f1100010000000000000050726f706f7365646f221100090000009b1f11000700000086221100300000005461626c656400006f221100090000009b1f110007000000782211000e000000382211003700000045787465726e616c5461626c6564000012221100260000005374617274656400282011000f000000052211000d000000ed211100180000005061737365640000282011000f000000c12111002c0000004e6f74506173736564000000952111002c00000043616e63656c6c656400000074211100210000004578656375746564282011000f0000000353110004000000572111001d00000044656c656761746564000000e252110009000000e2521100090000001f21110038000000556e64656c65676174656400e52011003a0000005665746f65640000e252110009000000971f110004000000da2011000b000000b420110026000000507265696d6167654e6f746564000000971f110004000000e2521100090000009b1f1100070000007c20110038000000507265696d616765557365643720110045000000507265696d616765496e76616c696400971f110004000000282011000f000000e51f110043000000507265696d6167654d697373696e6700a21f110043000000507265696d6167655265617065640000971f110004000000e2521100090000009b1f110007000000e252110009000000401f1100570000002041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c6563746564206279207468652072656170657220286c617374206974656d292e4861736842616c616e636520412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e20412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e5265666572656e64756d496e64657820412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e20412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e20416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e426c6f636b4e756d62657220416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e20416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e20412070726f706f73616c20686173206265656e20656e61637465642e2041207265666572656e64756d20686173206265656e2063616e63656c6c65642e20412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e20412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e2041207265666572656e64756d2068617320626567756e2e566f74655468726573686f6c6420416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e2041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e50726f70496e6465785665633c4163636f756e7449643e2041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e44697370617463685175657565507265696d61676573566f74657273466f725075626c696350726f70734465706f7369744f664e6f207075626c69632070726f706f73616c732077616974696e674e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e6700000000c82611000700000000000000d026110002000000000000000000000000271100060000000000000000000000302711000600000000000000382711000100000000000000000000005027110006000000000000000000000080271100040000000000000084271100020000000000000000000000b4271100070000000000000000000000ec2711000a0000000000000084271100020000000000000000000000f827110007000000000000000000000030281100100000000000000040281100010000000000000000000000582811000200000000000000000000006828110010000000000000007828110001000000000000000000000090281100020000000000000000000000a0281100190000000000000078281100010000000000000000000000bc281100050000000000000000000000e4281100180000000000000078281100010000000000000000000000fc281100050000000000000000000000242911000a000000000000003029110003000000000000000000000078291100090000000000000000000000c02911000d0000000000000078281100010000000000000000000000d0291100010000000000000000000000d82911001100000000000000ec291100010000000000000000000000042a11000100000000000000000000000c2a11000d000000000000001c2a1100010000000000000000000000342a11000100000000000000000000003c2a11000900000000000000482a1100010000000000000000000000602a1100050000000000000000000000882a11000c000000000000005c8f1100000000000000000000000000942a1100050000000000000000000000bc2a11000c00000000000000482a1100010000000000000000000000c82a1100050000000000000000000000f02a11000800000000000000f82a1100020000000000000000000000282b1100050000000000000000000000502b11000a000000000000005c8f11000000000000000000000000005c2b1100050000000000000000000000842b110016000000000000005c8f11000000000000000000000000009c2b1100010000000000000000000000a42b11000d00000000000000b42b1100010000000000000000000000cc2b1100020000000000000000000000dc2b11001600000000000000b42b1100010000000000000000000000f42b1100020000000000000000000000042c11000d0000000000000078281100010000000000000000000000142c1100050000000000000070726f706f736500000000004c3211000d000000000000005932110007000000000000001436110005000000000000001936110015000000aa351100280000005c8f1100000000002d5a11000b000000385a110008000000f435110020000000a65a11000c0000007365636f6e64000000000000d85a11000800000000000000e235110012000000aa351100280000005c8f1100000000002d5a11000b000000385a110008000000d235110010000000a65a11000c000000766f746500000000d42f11000900000000000000dd2f11001800000000000000802711000400000000000000a6351100040000002a3511004d000000773511002f0000005c8f1100000000002d5a11000b000000385a1100080000000b3511001f000000a65a11000c00000070726f78795f766f746500007934110054000000cd3411003e0000005c8f1100000000002d5a11000b000000385a1100080000000b3511001f000000a65a11000c000000656d657267656e63795f63616e63656c00000000d42f11000900000000000000282011000f0000002534110054000000193411000c00000065787465726e616c5f70726f706f7365000000004c3211000d000000000000005932110007000000cd3311004c000000193411000c00000065787465726e616c5f70726f706f73655f6d616a6f726974790000005f33110056000000b5331100180000005c8f110000000000e532110053000000383311002700000065787465726e616c5f70726f706f73655f64656661756c747232110052000000c4321100210000005c8f110000000000e5321100530000003833110027000000666173745f747261636b0000000000004c3211000d00000000000000593211000700000000000000603211000d000000000000009c6011000e000000000000006d32110005000000000000009c6011000e00000024301100540000007830110059000000d13011003b0000005c8f1100000000000c3111003e0000004a31110058000000a231110026000000c8311100550000001d3211002f0000007665746f5f65787465726e616c000000f52f11002f00000063616e63656c5f7265666572656e64756d00000000000000d42f11000900000000000000dd2f110018000000bf2f11001500000063616e63656c5f71756575656400000000000000ba2f11000500000000000000282011000f000000922f1100280000007365745f70726f7879000000000000008d2f110005000000000000000f5c11000c000000672f1100260000005c8f1100000000002d5a11000b000000df2e110016000000a65a11000c00000072657369676e5f70726f7879412f1100260000005c8f1100000000002d5a11000b000000312f110010000000a65a11000c00000072656d6f76655f70726f78790b2f1100260000005c8f1100000000002d5a11000b000000312f110010000000a65a11000c00000064656c656761746500000000f52e110002000000000000000f5c11000c00000000000000f72e11000a00000000000000012f11000a000000d02e11000f0000005c8f1100000000002d5a11000b000000df2e110016000000a65a11000c000000756e64656c65676174650000bf2e1100110000005c8f1100000000002d5a11000b000000385a110008000000a65a11000c000000636c6561725f7075626c69635f70726f706f73616c7300007f2e1100400000006e6f74655f707265696d616765000000000000006f2e11001000000000000000e960110007000000ce2d110058000000262e1100490000006e6f74655f696d6d696e656e745f707265696d6167650000502d110051000000a12d11002d000000726561705f707265696d6167650000003c2c11003d0000005c8f110000000000792c110054000000cd2c110057000000242d11002c0000002052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e20546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d61676520776173206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c7920776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e2052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f20626520696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e2052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f20626520696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e656e636f6465645f70726f706f73616c205665746f20616e6420626c61636b6c697374207468652070726f706f73616c20686173682e204d7573742062652066726f6d20526f6f74206f726967696e2e20556e64656c656761746520766f74652e2044656c656761746520766f74652e202d204f6e6520657874726120444220656e7472792e746f636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e202d204f6e6520444220636c6561722e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e77686963682052656d6f76652061207265666572656e64756d2e7265665f696e646578436f6d706163743c5265666572656e64756d496e6465783e205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c656420696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e6520627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f20202060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e70726f706f73616c5f68617368543a3a48617368766f74696e675f706572696f6464656c6179205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e20556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6520566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e202d204f6e6520444220656e7472792e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e76616c7565436f6d706163743c42616c616e63654f663c543e3e0000000000001c6b11000f00000000000000000000006f22110009000000000000000000000000000000000000000000000000000000000000005c8f1100843c11000000000000000000b03b110001000000000000000100000000000000d52211000b0000000000000000000000b83b110027000000000000000000000000000000000000000000000000000000000000005c8f1100203d11000000000000000000e03b110001000000000000000100000000000000c3221100090000000101000000000000593211000700000000000000e83b110035000000000000000000000000000000000000005c8f1100203c11000000000000000000303c110002000000000000000000000000000000e02211000900000001010000000000006f2211000900000000000000403c110021000000000000000000000000000000000000005c8f1100643c11000000000000000000743c1100010000000000000000000000000000002b6b11000f0000000000000000000000282011000f000000000000000000000000000000000000000000000000000000000000005c8f1100843c110000000000000000007c3c110001000000000000000100000000000000436b11000d0000000000000000000000282011000f000000000000000000000000000000000000000000000000000000000000005c8f1100843c11000000000000000000943c1100020000000000000001000000000000006b1a1100100000000101000000000000282011000f00000000000000a43c110027000000000000000000000000000000000000005c8f1100903d11000000000000000000cc3c110001000000000000000000000000000000b62211000d0000000000000000000000d43c11002f000000000000000000000000000000000000000000000000000000000000005c8f1100203d11000000000000000000043d110001000000000000000100000000000000cc221100090000000101000000000000282011000f000000000000000c3d110011000000000000000000000000000000000000005c8f1100203d11000000000000000000303d1100010000000000000001000000000000007b1a1100060000000101000000000000383d11001f00000000000000a635110004000000000000000000000000000000000000005c8f1100583d11000000000000000000683d110004000000000000000100000000000000883d11000500000001010000000000000f5c11000c000000000000000f5c11000c000000000000000000000000000000000000005c8f1100903d11000000000000000000a03d110002000000000000000000000000000000601a11000b00000001010100000000000f5c11000c00000000000000b03d11001a000000000000000000000000000000000000005c8f1100cc3d11000000000000000000dc3d110001000000000000000100000000000000506b11001500000000000000000000000353110004000000000000000000000000000000000000000000000000000000000000005c8f1100983e11000000000000000000e43d110002000000000000000100000000000000042311000c0000000000000000000000f43d110018000000000000000000000000000000000000000000000000000000000000005c8f11000c3e110000000000000000001c3e1100040000000000000000000000000000003c3e1100090000000101000000000000593211000700000000000000453e110023000000000000000000000000000000000000005c8f1100683e11000000000000000000783e110002000000000000000000000000000000883e11000d00000001010000000000005932110007000000000000000353110004000000000000000000000000000000000000005c8f1100983e11000000000000000000a83e11000100000000000000010000003f4511003d0000005665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e00f744110048000000285665633c75383e2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d626572290000003b0000000000000001000000d90000006644110058000000be441100390000002842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290000003b0000000000000001000000cb0000004544110021000000f94311004c0000003b00000000000000010000005c0000007943110049000000c2431100370000005265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173683e004c4311002d0000005665633c28543a3a426c6f636b4e756d6265722c20543a3a486173682c205265666572656e64756d496e646578293e00fc421100500000005665633c543a3a4163636f756e7449643e0000003b000000000000000100000055000000d342110029000000285265666572656e64756d496e6465782c20543a3a4163636f756e74496429003b0000000000000001000000520000009441110058000000ec411100530000003f42110057000000964211003d00000050726f78790000003b000000000000000100000052000000264111004c000000724111002200000028543a3a4163636f756e7449642c20436f6e76696374696f6e2900003b0000000000000001000000da000000d6401100500000007640110056000000cc4011000a00000028543a3a486173682c20566f74655468726573686f6c64293b000000000000000100000052000000883f110056000000de3f11005500000033401100290000005c4011001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e293b0000000000000001000000cb000000fa3e1100540000004e3f11003a00000043616e63656c6c6174696f6e730000003b000000000000000100000052000000b03e11004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e2053746f726564206f72646572656420627920626c6f636b206e756d6265722e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746f20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742e2054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e00000000044711000f000000000000009c6011000e000000000000005c8f1100144711000000000000000000244711000500000000000000000000004c4711000c000000000000009c6011000e000000000000005c8f1100e8471100000000000000000058471100010000000000000000000000604711000c000000000000009c6011000e000000000000005c8f1100e847110000000000000000006c471100010000000000000000000000744711000e00000000000000824711000c000000000000005c8f1100904711000000000000000000a0471100010000000000000000000000a847110015000000000000009c6011000e000000000000005c8f1100c04711000000000000000000d0471100010000000000000000000000d84711000d000000000000009c6011000e000000000000005c8f1100e84711000000000000000000f8471100010000000000000000000000004811001300000000000000824711000c000000000000005c8f1100144811000000000000000000244811000100000000000000456e6163746d656e74506572696f64003b0000000000000001000000db000000bd4911005c0000005c8f110000000000194a11004c000000654a11005a000000bf4a1100270000004c61756e6368506572696f648449110039000000566f74696e67506572696f64564911002e0000004d696e696d756d4465706f73697442616c616e63654f663c543e00003b0000000000000001000000dc000000094911004d000000456d657267656e6379566f74696e67506572696f640000003b0000000000000001000000dd000000ce4811003b000000436f6f6c6f6666506572696f640000003b0000000000000001000000de0000007648110058000000507265696d616765427974654465706f736974003b0000000000000001000000570000002c4811004a0000002054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e20506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e20546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e2049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e73757265207468617420766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e76616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7763616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f776e6f7420612070726f787963616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365756e6b6e6f776e20696e64657870726f706f73616c20616c7265616479206d61646570726f706f73616c207374696c6c20626c61636b6c69737465646e6f2070726f706f73616c206d6164656e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f72697479696e76616c696420686173686e6f2065787465726e616c2070726f706f73616c756e6b6e6f776e2070726f706f73616c6964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365616c726561647920612070726f787977726f6e672070726f78796e6f742064656c656761746564707265696d61676520616c7265616479206e6f7465646e6f7420696d6d696e656e74746f6f206561726c79696d6d696e656e746e6f7420666f756e6470726f706f73616c206e6f7420666f756e64766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e557064617465526563656e7448696e747346696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b46696e616c697a6564206865696768742061626f766520626c6f636b206e756d62657200370000000400000004000000df000000e0000000e1000000370000000400000004000000e20000004f72646572656448696e74734d656469616e616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400003700000004000000040000002a0000007072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b2071656400404e1100230000005c8f110000000000634e11001e0000004552524f523a20436f727275707465642073746174653a206c696e6b6564206d6170203a206e6578742076616c756520646f65736e277420657869737420617420000000404e1100230000005c8f1100000000009c4e1100220000003a2070726576696f75732076616c756520646f65736e2774206578697374206174200000404e1100230000005c8f110000000000d84e11001e0000003a20686561642076616c756520646f65736e277420657869737420617420506172656e7420686173682073686f756c642062652076616c69642e5472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e00008f4f110032000000446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e53746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e00000000000000f04f11000a00000000000000fc4f110001000000000000000000000014501100020000000000000066696e616c5f68696e740000000000007c50110004000000000000008050110017000000245011003d000000615011001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e74436f6d706163743c543a3a426c6f636b4e756d6265723e0000000000085111000a000000000000009c6011000e000000000000005c8f1100145111000000000000000000245111000100000000000000000000002c5111000d000000000000009c6011000e000000000000005c8f11003c51110000000000000000004c511100010000000000000057696e646f7753697a6500003b0000000000000001000000e30000009b511100460000005265706f72744c6174656e63790000003b0000000000000001000000e40000005451110047000000205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e20546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e000000000000006852110005000000000000007052110001000000000000000000000078521100010000000000000000000000805211000a000000000000008c521100010000000000000000000000945211000100000000000000000000009c5211000a000000000000007052110001000000000000000000000078521100010000000000000053756469640000000353110004000000eb521100180000004b65794368616e6765640000e252110009000000a65211003c0000005375646f4173446f6e6520546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e4163636f756e7449642041207375646f206a75737420746f6f6b20706c6163652e626f6f6c476f7373697041740000000000945311001100000000000000a8531100010000000000000000000000b0531100010000000000000000000000b853110007000000000000005c8f1100000000000000000000000000c0531100010000000000000000000000c85311000b00000000000000d4531100010000000000000000000000dc53110001000000000000004865617274626561745265636569766564000000ad5411000b0000007d54110030000000416c6c476f6f64004854110035000000536f6d654f66666c696e65003054110018000000e45311004c0000002041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e63652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e5665633c4964656e74696669636174696f6e5475706c653e2041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460417574686f726974794964c85411003a00000033000000120000002f686f6d652f6461766964642f6465762f7375627374726174652f7072696d6974697665732f72756e74696d652f7372632f63757276652e7273417574686f726564426c6f636b737061726974792f696d2d6f6e6c696e652d776f726b65722d73746174757300008d551100080000009555110020000000696d6f6e6c696e6570616c6c65745f696d5f6f6e6c696e652f686f6d652f6461766964642f6465762f7375627374726174652f6672616d652f696d2d6f6e6c696e652f7372632f6c69622e72735b696e6465783a205d205265706f7274696e6720696d2d6f6e6c696e6520617420626c6f636b3a20707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090900000000000000305811000400000000000000345811000100000000000000000000004c5811000a00000000000000000000009c5811000700000000000000a4581100010000000000000000000000bc5811000900000000000000000000000459110007000000000000000c5911000200000000000000000000003c5911000b000000000000007375646f00000000d85a11000800000000000000e05a110010000000615b11004e0000005c8f110000000000f9591100340000005c8f1100000000002d5a11000b000000385a110008000000405a110019000000595a110018000000715a110035000000a65a11000c0000007365745f6b657900000000005e5b11000300000000000000b55a110023000000f05a11005d0000005c8f110000000000f9591100340000005c8f1100000000002d5a11000b000000385a110008000000405a1100190000004d5b110011000000a65a11000c0000007375646f5f61730000000000b25a11000300000000000000b55a11002300000000000000d85a11000800000000000000e05a1100100000009459110054000000e8591100110000005c8f110000000000f9591100340000005c8f1100000000002d5a11000b000000385a110008000000405a110019000000595a110018000000715a110035000000a65a11000c0000002041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d206120676976656e206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2023203c7765696768743e202d204f2831292e202d204c696d697465642073746f726167652072656164732e202d204f6e6520444220777269746520286576656e74292e202d20556e6b6e6f776e20776569676874206f662064657269766174697665206070726f706f73616c6020657865637574696f6e2e2023203c2f7765696768743e77686f3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636570726f706f73616c426f783c543a3a50726f706f73616c3e2041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e202d204f6e65204442206368616e67652e6e65772041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e5375646f00000000000c5c11000300000000000000000000000f5c11000c000000000000000000000000000000000000000000000000000000000000005c8f11001c5c110000000000000000002c5c11000100000000000000010000004b6579543a3a4163636f756e744964003b0000000000000001000000bc000000345c1100210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e6d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e65644d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e52657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e72657475726e2074797065206572726f7276616c69646174696f6e206572726f72647572696e6720657865637574696f6e00000000ac5e11000900000000000000b85e11000200000000000000000000005c8f1100000000000000000068656172746265617400000000000000ac5e11000900000000000000e85e11001900000000000000015f11000a000000000000000b5f11002f0000004865617274626561743c543a3a426c6f636b4e756d6265723e5f7369676e61747572653c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e6174757265000000000000075311000800000000000000000000009c6011000e000000000000000000000000000000000000000000000000000000000000005c8f1100246111000000000000000000ac6011000100000000000000010000000000000020631100040000000000000000000000b460110013000000000000000000000000000000000000000000000000000000000000005c8f1100c86011000000000000000000d860110001000000000000000100000000000000ab6d1100120000000201010000000000e76f11000c00000000000000e06011000900000000000000e960110007000000000000005c8f1100f060110000000000000000000061110002000000000000000000000000000000025511000e0000000201010000000000e76f11000c00000000000000106111000e000000000000001e61110003000000000000005c8f110024611100000000000000000034611100020000000000000001000000543a3a426c6f636b4e756d62657200004b621100280000005665633c543a3a417574686f7269747949643e003b000000000000000100000055000000176211003400000041757468496e6465785665633c75383e3b0000000000000001000000cf000000bb61110039000000f461110023000000543a3a56616c696461746f7249647533320000003b00000000000000010000005c0000004461110045000000896111003200000020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e20466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e2054686520626c6f636b206e756d626572207768656e2077652073686f756c6420676f737369702e00be62110023000000946211002a0000003c7f11001e0000000600000032000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e4475706c696361746564206865617274626561742e4e6f6e206578697374656e74207075626c6963206b65792e417574686f72697479446973636f766572794b657973417574686f7273686970446964536574556e636c65734261626545706f6368496e646578417574686f72697469657347656e65736973536c6f7443757272656e74536c6f7452616e646f6d6e6573734e65787452616e646f6d6e6573735365676d656e74496e646578556e646572436f6e737472756374696f6e746f6f206d616e7920696e737472756374696f6e73547269656420746f20736872696e6b20746f2061206c61726765722063617061636974794e6f6e2d656d7074792066756e6374696f6e20626f647920657870656374656400406411000f0000004f641100020000005164110003000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d7074792829417420696e737472756374696f6e202840293a2043616e2774206465636f6465207761736d20636f64654d6f64756c65206973206e6f742076616c69646d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72796d756c7469706c65207461626c6573206465636c617265647461626c652065786365656473206d6178696d756d2073697a6520616c6c6f776564757365206f6620666c6f6174696e6720706f696e74207479706520696e2066756e6374696f6e20747970657320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e206c6f63616c7320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e20676c6f62616c7320697320666f7262696464656e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c656463616c6c6465706c6f796465706c6f792066756e6374696f6e2069736e2774206578706f72746564756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e7366756e6374696f6e206861732061206e6f6e2d6578697374656e7420747970656578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e617475726563616c6c2066756e6374696f6e2069736e2774206578706f727465646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6552657475726e207479706573206c656e6774682073686f756c642062652030206f7220316e616d650000276911001e000000456911001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400000d6911001a000000e86811000a000000f26811001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d000000d768110011000000b76811002000000097681100200000006f681100280000007365676d656e74206f66667365742073686f756c642072657475726e2049333270617373697665206d656d6f7279207365676d656e747320617265206e6f7420737570706f727465647061737369766520656c656d656e74207365676d656e747320617265206e6f7420737570706f72746564746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f72742046756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e20697320436f6e74726163744761735370656e7443757272656e745363686564756c654163636f756e74436f756e7465726578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f696e7374616e74696174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f6d696e696d756d5f62616c616e63656578745f64697370617463685f63616c6c6578745f726573746f72655f746f6578745f736372617463685f73697a656578745f736372617463685f726561646578745f736372617463685f77726974656578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6578745f626c6f636b5f6e756d6265726578745f6765745f72756e74696d655f73746f72616765000000000000000100000002000000040000000800000010000000200000005075626c696350726f70436f756e745265666572656e64756d436f756e7444656d6f63726163794c6f77657374556e62616b65644c6173745461626c656457617345787465726e616c50687261676d656e456c656374696f6e456c656374696f6e526f756e6473496e697469616c697a6564000000000000146c11000e00000000000000246c11000100000000000000000000002c6c1100010000000000000000000000346c110006000000000000005c8f11000000000000000000000000003c6c1100010000000000000000000000446c110007000000000000005c8f11000000000000000000000000004c6c110001000000000000004e6577417574686f7269746965730000c76c11000d000000a36c11002400000050617573656400007c6c110027000000526573756d656400546c1100280000002043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e204e657720617574686f726974792073657420686173206265656e206170706c6965642e417574686f726974794c69737443757272656e7453657449644772616e64706146696e616c697479536574496453657373696f6e4f6666636861696e206572726f723a206665746368696e67206e6574776f726b207374617465206661696c6564214f6666636861696e206572726f723a207369676e696e67206661696c6564214f6666636861696e206572726f723a206465636f64696e6720576f726b6572537461747573206661696c6564214f6666636861696e206572726f723a207375626d697474696e67207472616e73616374696f6e206661696c656421496d4f6e6c696e655265636569766564486561727462656174734f6666656e6365735265706f72747342794b696e64496e6465780000000000046e110007000000000000000c6e11000200000000000000000000001c6e110002000000000000004f6666656e636500cf6e110004000000d36e11000e0000002c6e110055000000816e11004e00000020546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e6420286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e4b696e644f706171756554696d65536c6f7453746f72656452616e676553657373696f6e43757272656e74496e6465785175657565644368616e67656444697361626c656456616c696461746f72730000000000004c6f11000a00000000000000586f1100010000000000000000000000606f110002000000000000004e657753657373696f6e0000e76f11000c000000706f110055000000c56f110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e64657856616c696461746f72436f756e744d696e696d756d56616c696461746f72436f756e745374616b696e6743757272656e7445726143757272656e74457261537461727453657373696f6e496e64657843757272656e74457261506f696e74734561726e6564466f726365457261536c6173685265776172644672616374696f6e426f6e646564457261734561726c69657374556e6170706c696564536c61736853746f7261676556657273696f6e496e73756666696369656e7456616c7565496e76616c6964536c617368496e6465784475706c6963617465496e646578456d707479546172676574734261644f726967696e416c7265616479506169726564416c7265616479426f6e6465644e6f7453746173684e6f74436f6e74726f6c6c65724e6f4d6f72654368756e6b7300000000000000087111000d000000000000003c72110001000000000000000000000000711100080000000000000044721100010000000000000000000000f37011000d000000000000004c721100010000000000000000000000e67011000d0000000000000054721100010000000000000000000000dd70110009000000000000005c721100010000000000000000000000d17011000c0000000000000064721100010000000000000000000000c37011000e000000000000006c721100010000000000000000000000b2701100110000000000000074721100010000000000000000000000a170110011000000000000007c721100010000000000000000000000157111000c00000000000000847211000100000000000000b57311001a000000a0731100150000008773110019000000697311001e000000307311003900000017731100190000000673110011000000e472110022000000b1721100330000008c721100250000002043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e20536c617368207265636f726420696e646578206f7574206f6620626f756e64732e204475706c696361746520696e6465782e20546172676574732063616e6e6f7420626520656d7074792e2053686f756c642062652074686520726f6f74206f726967696e206f72207468652060543a3a536c61736843616e63656c4f726967696e602e20436f6e74726f6c6c657220697320616c7265616479207061697265642e20537461736820697320616c726561647920626f6e6465642e204e6f742061207374617368206163636f756e742e204e6f74206120636f6e74726f6c6c6572206163636f756e742e526571756972655375646f000000000000cf7311000b00000000000000f8731100010000000000000000741100200000002053656e646572206d75737420626520746865205375646f206163636f756e7474696d737461703054696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7044696455706461746542616c616e6365734e6578744665654d756c7469706c696572547265617375727950726f706f73616c436f756e74417070726f76616c73496e73756666696369656e7450726f706f7365727342616c616e6365496e76616c696450726f706f73616c496e646578000000000000c27411001c000000000000002c751100010000000000000000000000de7411001400000000000000347511000100000000000000577511001f0000003c7511001b000000204e6f2070726f706f73616c206174207468617420696e6465782e2050726f706f73657227732062616c616e636520697320746f6f206c6f772e000000000000a47511000d00000000000000b47511000100000000000000000000005c8f1100000000000000000042617463684578656375746564000000bc7511001e0000005665633c526573756c743c28292c2044697370617463684572726f723e3e00003700000004000000040000000c00000042725461626c65446174617461626c65370000000400000004000000e500000064656661756c744636345265696e74657270726574493634556e726561636861626c654e6f70426c6f636b00370000000400000004000000e60000004c6f6f704966456c7365456e6442724272496642725461626c650000370000000400000004000000e700000052657475726e43616c6c43616c6c496e6469726563740000370000000400000004000000e200000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e737400370000000400000004000000e8000000493634436f6e7374370000000400000004000000e9000000463332436f6e7374463634436f6e73743700000004000000040000000e00000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e7465727072657449333200003700000004000000040000000c0000004e6f526573756c7456616c7565000000370000000400000004000000ea000000463634493332493634463332f87b11000b000000492f4f204572726f723a20496e76616c696444617461547261696c696e6744617461556e6578706563746564456f6600657c1100670000001001000020000000407c11002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a202f686f6d652f6461766964642f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e31322e302f7372632f737461636b5f6865696768742f6d6f642e7273546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e647366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a09090909716564000000188e110012000000397e11000f0000000c7e11000a000000167e1100140000002a7e11000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e6564206973206e6f7420646566696e65640d7f1100120000001f7f11000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e64003c7f11001e000000030000000a0000003c3a3a636f72653a3a6d6163726f733a3a70616e6963206d6163726f733e617373657274696f6e206661696c65643a20656e64203c3d206c656e0000e0831100480000000302000023000000e0831100480000000402000023000000617373657274696f6e206661696c65643a206d6964203c3d206c656e8c901100490000000f00000028000000d47f1100490000008e0200001d0000002f72757374632f373661323532656139653762653933613631666664663333623335333365323461396366343539642f7372632f6c6962636f72652f736c6963652f736f72742e7273000000d47f110049000000a100000030000000d47f110049000000a4000000300000004672616d6569735f706f6c796d6f727068696300370000000400000004000000eb000000656e645f61726974790000003700000004000000040000000c0000006272616e63685f617269747973746172745f6865696768744e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e000000f48211000a00000046756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64e88211000c000000ac8211000b000000737461636b206d757374206265206e6f6e2d656d70747900a18211000b0000005882110006000000737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64005182110007000000b48111006e000000c8000000170000002f686f6d652f6461766964642f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e31322e302f7372632f737461636b5f6865696768742f6d61785f6865696768742e72736d61785f686569676874707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768747472756e633a20707573683a2000009c82110005000000747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77706f703a20756e726561636861626c65706f705f6672616d653a20636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e6473707573685f6672616d653a2066756e635f6964783a204e6f6e65536f6d650000370000000400000004000000ec000000656e766761730000308311005e000000120100001c0000002f686f6d652f6461766964642f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e31322e302f7372632f6761732f6d6f642e72736c6173745f696e6465782069732067726561746572207468616e20303b206c6173745f696e64657820697320737461636b2073697a65202d20313b20716564000000e083110048000000ed0a00000a0000002f72757374632f373661323532656139653762653933613631666664663333623335333365323461396366343539642f7372632f6c6962636f72652f736c6963652f6d6f642e7273e083110048000000f30a00000e000000488411003f000000440000000d0000002f686f6d652f6461766964642f6465762f7375627374726174652f7072696d6974697665732f61726974686d657469632f7372632f62696775696e742e7273000000000000000000617474656d707420746f20646976696465206279207a65726f63616e6e6f74206669742061206e756d62657220696e746f2075313238616c7265616479206d757461626c7920626f72726f77656400003b00000000000000010000005a000000616c726561647920626f72726f7765643b00000000000000010000005900000072656d696e646572206f6620646976206279206320697320616c77617973206c657373207468616e20633b20716564004d0000000800000004000000bf000000726573756c742063616e6e6f742066697420696e207531323862616265736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214241424520696e686572656e742064617461206e6f7420666f756e643c7761736d3a73747269707065643e0000003b00000000000000010000003c000000486f737420746f207761736d2076616c7565732061726520656e636f64656420636f72726563746c793b2071656400003b00000000000000010000003c00000072756e74696d6552756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6748617368206e6f7420657175616c496e76616c6964206f726967696e43616e206e6f74206c6f6f6b757044697370617463684572726f725472616e73616374696f6e20776f756c642065786861757374732074686520626c6f636b206c696d6974735472616e73616374696f6e2068617320616e20616e6369656e7420626972746820626c6f636b5472616e73616374696f6e20686173206120626164207369676e61747572655472616e73616374696f6e206973206f757464617465645472616e73616374696f6e2077696c6c2062652076616c696420696e2074686520667574757265496e6162696c69747920746f2070617920736f6d6520666565732028652e672e206163636f756e742062616c616e636520746f6f206c6f77295472616e73616374696f6e2063616c6c206973206e6f74206578706563746564496e76616c69645472616e73616374696f6e20637573746f6d206572726f72436f756c64206e6f742066696e6420616e20756e7369676e65642076616c696461746f7220666f722074686520756e7369676e6564207472616e73616374696f6e436f756c64206e6f74206c6f6f6b757020696e666f726d6174696f6e20726571756972656420746f2076616c696461746520746865207472616e73616374696f6e556e6b6e6f776e5472616e73616374696f6e20637573746f6d206572726f7200617474656d707420746f20646976696465206279207a65726f0000006c88110040000000580000002b0000002f686f6d652f6461766964642f6465762f7375627374726174652f7072696d6974697665732f72756e74696d652f7372632f67656e657269632f6572612e7273696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f6465e4881100430000005a000000120000002f686f6d652f6461766964642f6465762f7375627374726174652f7072696d6974697665732f73616e64626f782f7372632f2e2e2f776974686f75745f7374642e727300e48811004300000068000000120000006d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b00ed0000000c00000004000000ee000000746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000fc8a110047000000438b110005000000c08a110037000000f78a1100050000008e8a110017000000858a110009000000d68c1100140000006d8a110018000000858a110009000000d68c1100140000003c8a11001d000000598a1100130000006c8a110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f73742029547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e795370656369666963370000000400000004000000ea0000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e2042757420697420686173202074797065588b110018000000708b11000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000b88b110017000000cf8b11001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000f08b110007000000537461636b3a2000000001007a8c110024000000508c110006000000568c11000e000000648c1100160000002c8c110024000000508c1100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000b08c110026000000d68c110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e67746820324e6f6e20636f6e7374616e74206f70636f646520696e20696e69742065787072818d110007000000938d110022000000818d110007000000888d11000b00000045787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c20206973206d757461626c6520646f65736e277420657869737473206f72206e6f742079657420646566696e6564000000c88d110010000000d88d11000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300f88d11000f000000d88d11000f0000005461626c6520617420696e6465782000188e110012000000d88d11000f00000046756e6374696f6e20617420696e6465782000003c8e11000e000000d88d11000f0000005479706520617420696e646578200000aa8e110010000000d88d11000f0000007c8e1100100000009c8e11000e0000007c8e1100100000008c8e110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b2065787065637465640000e48e110020000000048f110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f7665003c8f110015000000657863656564656420737461636b206c696d6974200000005c8f1100000000004572726f72000000370000000400000004000000ef0000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765ac8f110022000000ce8f110015000000e38f110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c730000049011002d000000319011000c0000003d90110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20489011003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e677468738c90110049000000170000000d0000002f72757374632f373661323532656139653762653933613631666664663333623335333365323461396366343539642f7372632f6c6962636f72652f6d6163726f732f6d6f642e72730041d8a1c6000b0800000000000000000041e0a1c6000b08e0901100bc19100000b2e003046e616d6501a9e003e40500196578745f6c6f6767696e675f6c6f675f76657273696f6e5f3101196578745f73746f726167655f7365745f76657273696f6e5f31021e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f3103196578745f73746f726167655f6765745f76657273696f6e5f31041d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31051b6578745f73746f726167655f636c6561725f76657273696f6e5f3106206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f3107286578745f73746f726167655f6368696c645f73746f726167655f6b696c6c5f76657273696f6e5f31081f6578745f73746f726167655f6368696c645f6765745f76657273696f6e5f3109216578745f73746f726167655f6368696c645f636c6561725f76657273696f6e5f310a1f6578745f73746f726167655f6368696c645f7365745f76657273696f6e5f310b236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f310c236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f310d226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f310e1c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f310f206578745f73746f726167655f6368696c645f726f6f745f76657273696f6e5f3110206578745f73616e64626f785f6d656d6f72795f6e65775f76657273696f6e5f3111256578745f73616e64626f785f6d656d6f72795f74656172646f776e5f76657273696f6e5f3112216578745f73616e64626f785f696e7374616e74696174655f76657273696f6e5f31131c6578745f73616e64626f785f696e766f6b655f76657273696f6e5f3114276578745f73616e64626f785f696e7374616e63655f74656172646f776e5f76657273696f6e5f31151c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f3116236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f3117286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f3118346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f3119286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f311a256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f311b1a6578745f73746f726167655f726f6f745f76657273696f6e5f311c226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f311d1d6578745f68617368696e675f74776f785f36345f76657273696f6e5f311e206578745f73616e64626f785f6d656d6f72795f6765745f76657273696f6e5f311f206578745f73616e64626f785f6d656d6f72795f7365745f76657273696f6e5f3120256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f3121296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f3122246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f3123286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f3124216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f3125376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31261e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31271c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31281a6578745f73746f726167655f726561645f76657273696f6e5f31292a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f312a0c5f5f727573745f616c6c6f632b0a5f5f72675f616c6c6f632c0e5f5f727573745f6465616c6c6f632d0c5f5f72675f6465616c6c6f632e0e5f5f727573745f7265616c6c6f632f0c5f5f72675f7265616c6c6f6330135f5f727573745f616c6c6f635f7a65726f656431115f5f72675f616c6c6f635f7a65726f65643209686173685f746573743333616c6c6f633a3a616c6c6f633a3a68616e646c655f616c6c6f635f6572726f723a3a68386531316436663965343234316133633408727573745f6f6f6d3534616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68646433393266313964303139366331643629636f72653a3a70616e69636b696e673a3a70616e69633a3a68646239663362643439353762376130343725616c6c6f633a3a666d743a3a666f726d61743a3a68323034353933636463626239393462643836636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68383631343133363633386239663665333923636f72653a3a666d743a3a77726974653a3a68323037613236633066373832626466643a48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303061333839343366393039313364663b2e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68356539626632666462336331346131313c3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68653462323430393966333136316432613d3b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68646135323030363563363762376437333e3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68386133653436393862303536393134353f34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a6864616535356635386637356233376335404e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6861356364353334633165353832626330412d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a6833343531616266633263663866643735422f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68396430343437333539653330323562384311727573745f626567696e5f756e77696e6444313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a68306465666264653633353865346532624535636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68346231353362333663363261326539304643636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a68636435663263333739613934326338624736636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a6865633531326337336339393435393139482c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6830653165663266646261323032306339492e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a68373830313030333831333434633333394a323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68346132653465636539373166306565394b4a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68373230346333363939396432316363634c323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68626461316437313164366434313734314d3d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a68666531353763343132326361303534664e49636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68386432353364353564646635356463334f34636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a686664636138363230366231666565383350453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686437356263616161353161356536653451483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686637323137353036303339613963333352323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683236663030343139663436303834303753323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830323766613761636633313939313735542e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a683439346633653534346562303365373455303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832356262626661663335303532346239562e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6831356139303835666665633534316165578001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68333162396631303565353862363261395827636f72653a3a7374723a3a66726f6d5f757466383a3a68656463376239663161653061646539615930636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303962326434393262333033623434345a533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68386534373166643833366665303436665b2f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a68653166356333646239303739356662375c2e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a68363861383934353839633935346236615d3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68393133616132333339376339373630325e3b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68393861383665653265633764393334315f3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6837396235343665393130333134623937603a636f72653a3a666d743a3a6275696c646572733a3a44656275675374727563743a3a6669656c643a3a68323563343366303238653764323136666139636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68383635363362393137383131326630396237636f72653a3a666d743a3a6275696c646572733a3a44656275675365743a3a656e7472793a3a683461306636396564643136396633346563443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683565343066323335616130366263633564313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863343364336165393861333631646132653e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683762303032383162323938653331643366693c6672616d655f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864343430383733363131356130633333676c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683563363237343830623738666134613768483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683534613837376637396264383661373669693c6672616d655f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68353838343739663861376132386538656a4d3c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a68306165386636316336346635393039636b493c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a68636135366365623135366332353863386c3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68343163306264623062363166373063656d3b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68343862663330313635306635396266346e3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68363930353432666233643862626361326f383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a683238313862343662313536303564313170343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a683530616236323939313234333733653571363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a6862333164356661343665313662356464724b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68356638396639326435623838623831617330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a686430336463636430323333346132666674543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832376266333161303562363034313761756b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834663964643130383738383938396561767d7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c205230293e3a3a6465636f64653a3a683963323330666231336239363963616377543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686132333061656531323733353565396178393c54206173206672616d655f737570706f72743a3a7472616974733a3a4c656e3e3a3a6c656e3a3a6837303736356164313330663732323566794a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68613563343263613066653263313232617a2d616c6c6f633a3a7665633a3a5665633c543e3a3a72657461696e3a3a68613736356662626464666338336134657b403c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68656361313432613134626131383236367c443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68376361336166633531303464366639337d463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68633033353738633737313032626635637e543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68316131303639313834623832666537357f543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68363736666236393566383833643263658001543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68373666366465396330333062333733648101723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68393336333530306432633264646338618201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68623331376664363636316662316262648301543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68663965323763373066663536396232328401513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68313138666430336633636335386634328501513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68346665353961383762616439643537628601513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a686230306437376562393535646164373687013e73705f72756e74696d653a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a686661393233643238653238363565326188017d3c70616c6c65745f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a686566353136646634663031643561663089016f3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68386132626663373539386166616136318a01723c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68653765663236356634633638323963338b016e6e6f64655f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68333165333064613830356366643963638c016f3c285475706c65456c656d656e74302c205475706c65456c656d656e7431292061732073705f72756e74696d653a3a7472616974733a3a4f6e46696e616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68356437666435663339663164366533348d017c3c73705f72756e74696d655f696e746572666163653a3a706173735f62793a3a436f6465633c543e2061732073705f72756e74696d655f696e746572666163653a3a706173735f62793a3a506173734279496d706c3c543e3e3a3a66726f6d5f6666695f76616c75653a3a68343565663838613839626633363333348e01303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68333133343437643730316638633436328f013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68643463343531313334656566616433619001376672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a68333663316437343066623935393036309101463c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68646638643435363731306139376631629201416672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a683063306530376265623663663736393493013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68316333333739613964356239633365359401386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68343039646236663363313730333932619501386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68383837333831363130646230393937649601386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a686664373162643435326636626166633397014373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726561643a3a68316565333932626133303539613138379801386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68343239313931373365623761383630309901386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68346465323032383337353963386430319a01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68316430333866653335663138343932329b013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68323531633533623431656561633261319c01446672616d655f737570706f72743a3a7472616974733a3a43757272656e63793a3a7265736f6c76655f6372656174696e673a3a68386131333538353331323161373439389d018d013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a68376438313366343566316431623337669e01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68303566356530623734396639383534649f01437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839393662316237393066316664663535a00191013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6839313638653738306565656265666462a10183013c70616c6c65745f696e64696365733a3a4d6f64756c653c543e206173206672616d655f73797374656d3a3a4f6e4e65774163636f756e743c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6864383836383962386530353632353663a2014170616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6835313338666439643032343535653336a301796672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6d75746174653a3a6832393134633039333462623539366235a4013870616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6b696c6c5f73746173683a3a6861393137663161336164346338636530a501386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834666137636264363863373563303066a601706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6864326666393133363139633065626565a701386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6863616530373036613163663531666330a801706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6832356264383036636436653834313164a901456672616d655f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643a3a6f6e5f756e62616c616e6365643a3a6835353866363337383464643333383330aa014570616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6865613039313337393166386465653463ab01776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6835646435383164333166636465353034ac0185013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6837616632363936303335623533333161ad0190013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a6839303834316230313031376132323431ae013670616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a6838343861326564663865306137313235af01483c5b543b205f5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830633634376237643965376530353838b001776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6838613531316630623236636436626466b1018a013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a6837653632643137636262613031363264b201776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6833663666656339323366646235353365b3013d70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6831396134393664386334366635333363b401683c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a73697a655f68696e743a3a6831666337613661653736333430396562b501633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6835323864633166373339646430613361b6013e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6835333665613433393335653135326561b70189013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a6836633938613336373464663634663534b80192013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6833373963363530306566633534626163b9013c70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862613731393030316333636235353931ba013e70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6839313861363639386532326433656638bb01703c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637443757272656e7453657449643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861633863303363336665323039623830bc01693c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637453746174653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832323033643161306237326538383833bd0190013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6834666336626662336636623965383362be018d013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6836323838666362353063333662653965bf0195013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6836616164653437646433383931663430c0019a013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726570617472696174655f72657365727665643a3a6866663332393036376463656235623036c1018e013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6865383861633262363230396161626338c20190013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6861626632363534646137316161336362c3013f70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6838353262383938643261313131386230c4014170616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6861653137373131353038303663663230c501723c70616c6c65745f62616c616e6365733a3a5f5f476574427974655374727563744672656542616c616e63653c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836636338326639363038623535666235c6014a70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6837653634303939613038666261616462c7013f70616c6c65745f6f6666656e6365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6839633661663564663930343838303761c801773c70616c6c65745f6f6666656e6365733a3a5f5f476574427974655374727563745265706f72747342794b696e64496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839373966343965326137613666333836c901706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6864656233636538633232653064336636ca014a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6836393761353266313665356235363837cb0168636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743c413e20666f7220266d757420463e3a3a63616c6c5f6d75743a3a6834336138663865626633343830376161cc01860170616c6c65745f7374616b696e673a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7374616b696e673a3a4578706f737572653c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6862636165323734326330623233636332cd0185013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7472616e736665723a3a6861333563393834306164333133353438ce01743c70616c6c65745f62616c616e6365733a3a696d62616c616e6365733a3a4e65676174697665496d62616c616e63653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a54727944726f703e3a3a7472795f64726f703a3a6866653235313532623831613833616438cf014470616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a646f5f70687261676d656e3a3a6838393933303861396138313564666163d001386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832663162306263633063333765366435d101386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834656131616437666564626435636635d2016e6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f686561645f6b65793a3a6865366636363230616261353632656662d301386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837346339313132626362363661323931d40185013c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e756d657261746f723c4b2c562c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6838366339616330333039633436386531d50148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6864353233663731656436383432353734d6014870616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a6c6f636b65645f7374616b655f6f663a3a6832343030366632663731346530666135d7014673705f61726974686d657469633a3a68656c706572735f3132386269743a3a6d756c7469706c795f62795f726174696f6e616c3a3a6835353134353535393430316334656634d801533c73705f61726974686d657469633a3a726174696f6e616c3132383a3a526174696f6e616c31323820617320636f72653a3a636d703a3a4f72643e3a3a636d703a3a6831633661663234643933396130393434d901583c73705f61726974686d657469633a3a726174696f6e616c3132383a3a526174696f6e616c31323820617320636f72653a3a636d703a3a5061727469616c45713e3a3a65713a3a6832363364383365343337653038643535da01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833323065356263636333643861343734db0148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6861666263663262616239656236626335dc014d6672616d655f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733a3a636f6d707574655f6d656d626572735f646966663a3a6831633864336535646266353436643366dd0199013c70616c6c65745f636f6c6c6563746976653a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6368616e67655f6d656d626572735f736f727465643a3a6862336630313761623035303839376230de01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833306536346338363934613533343132df01733c285475706c65456c656d656e74302c205475706c65456c656d656e7431292061732073705f72756e74696d653a3a7472616974733a3a4f6e496e697469616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6865333733346237316534633632636134e0013870616c6c65745f626162653a3a4d6f64756c653c543e3a3a646f5f696e697469616c697a653a3a6836356330663230316131316330623838e10196013c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e2061732070616c6c65745f73657373696f6e3a3a4f6e6553657373696f6e48616e646c65723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6265666f72655f73657373696f6e5f656e64696e673a3a6834623665653766326266386666646534e201726e6f64655f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a53657373696f6e4b6579733e3a3a6465636f64653a3a6832623337306433613839663666613738e3013970616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6e65775f73657373696f6e3a3a6865353938663265303631393834333735e401386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862343339336363643832313933366332e50187013c70616c6c65745f626162653a3a4d6f64756c653c543e2061732070616c6c65745f73657373696f6e3a3a4f6e6553657373696f6e48616e646c65723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f73657373696f6e3a3a6831623032666539306562663966383164e601386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6833643538343436636663663433313933e7013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6861613966336337326535356131323332e8013770616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a617574686f723a3a6830383231323761346165303661383062e9013b70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a7265776172645f62795f6964733a3a6833333663663933643630623863613637ea013f70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a6e6f74655f617574686f72736869703a3a6838363339633762643938353137653461eb017d3c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6866623263616263396637653238303166ec017d3c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6837616365356537623535356139303035ed017f3c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6863303566386538333236373334306236ee01746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a6831646434646235393136353739663061ef0181013c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6866326235313861376333653837303932f00184013c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6832643964383865383738303837363964f101783c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6866363831343764636563336139643037f201723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839623062393265626536373434313032f301456672616d655f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a6831366664393266316161316438353633f401613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6830633566643861636234323761356139f50196013c70616c6c65745f636f6e7472616374733a3a54726965496446726f6d506172656e74436f756e7465723c543e2061732070616c6c65745f636f6e7472616374733a3a54726965496447656e657261746f723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a747269655f69643a3a6830656262386435363030646633653331f601776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6831623066646536306331353062356163f701723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6836663861356565363432666334616339f801776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6834326638633139646663613434336364f901613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6830633532663431626531363739316133fa0181013c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6838346232396366343662383265613533fb0181013c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6835663963333639386637653338633532fc0183013c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6835646363363638383833663163383931fd0185013c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6835333465366564356464636463366332fe0188013c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6830376435323430336631613735326331ff017c3c70616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732070616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a686636663262333930623631386261663880024b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6839366133636637323237386133306636810248616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a68336433636531333435613337633766308202426672616d655f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a686365316264316139636432376131366383024a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68363034336263316162313030386135378402696672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f6b65793a3a683935626565376362613661393064616185023c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686638626533366239636336633339336586023e70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68316635333935303932383531343538318702703c70616c6c65745f73657373696f6e3a3a5f5f4765744279746553747275637443757272656e74496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683535356365333037303664633938306288024770616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a683537323865366234303564636364636289029c013c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a44454455505f4b45595f50524546495844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68666365643239303736623636336130368a023570616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a64697361626c653a3a68376164303935376433636637643430668b023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68623939646631636533663966336630318c029c013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68663162613064613234393664636137628d027a3c70616c6c65745f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68306339313234356565393162613239368e026c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68613132346132366335316664353964658f026b6e6f64655f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a686134653362626437616133643133643690029f013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a683962313166663134646265373937643691023670616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6865373731353265303436643333623936920230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68643033646363643032333334613266669302366672616d655f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a68376162623261356538376234333866639402437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68333264616665366438373961376165659502553c73705f72756e74696d653a3a4d756c74695369676e61747572652061732073705f72756e74696d653a3a7472616974733a3a5665726966793e3a3a7665726966793a3a686330663565643636316364343664643196025170616c6c65745f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a686231356533386139626134646536343697024770616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683237383538393530633536326533343998024970616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a686166373832353964653639336236333799025270616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68663939343634393139373635656637389a02a3013c70616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5465726d4475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68326266396533313137333434363862319b02a7013c70616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4465736972656452756e6e657273557044656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68616535376537303165613565633631639c02a5013c70616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a446573697265644d656d6265727344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68616566333731353238383435343965319d02a4013c70616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616e646964616379426f6e6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68323632633136616330303534666337309e02653c70616c6c65745f656c656374696f6e735f70687261676d656e3a3a43616c6c3c543e2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a68326166326165363135363135646263659f024170616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a69735f766f7465723a3a6839653766623264353832613137613039a002386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839666261323937346333363839353562a1024a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6832383066636230396133363439623830a202cc016672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e636f64654c696b654c696e6b6167653c504b65792c4e4b65792c4b65793e3e3a3a656e636f64655f746f3a3a6837616239353965363534613436613562a302b8016672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4c696e6b6167653c4b65793e3e3a3a656e636f64655f746f3a3a6835343933663330366666313836376332a4024870616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a646f5f72656d6f76655f766f7465723a3a6834323836356565613761663365323365a5025270616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a72656d6f76655f616e645f7265706c6163655f6d656d6265723a3a6830653732313137623839386433666261a6024270616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a69735f6d656d6265723a3a6834653237666566623235646165613763a7024270616c6c65745f656c656374696f6e735f70687261676d656e3a3a4d6f64756c653c543e3a3a69735f72756e6e65723a3a6866396530623538656364363336363066a8026b3c636f72653a3a697465723a3a61646170746572733a3a526573756c745368756e743c492c453e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6865396537393336343463356635336534a9026f3c636f72653a3a697465723a3a61646170746572733a3a526573756c745368756e743c492c453e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6831336330666431616562646432623034aa024b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6834663465346364346331653531663065ab02723c70616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6838616562633439663335306236353433ac025770616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4368617267655472616e73616374696f6e5061796d656e743c543e3a3a636f6d707574655f6665653a3a6865303130633637393339303039333763ad026f3c285475706c65456c656d656e74302c205475706c65456c656d656e7431292061732073705f72756e74696d653a3a7472616974733a3a4f6e46696e616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6836633638626630333532336330343961ae023970616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a6163636f756e745f69643a3a6839386530376138626365323066613534af023870616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6864323337643334373831656534646261b00290013c70616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a52616e646f6d6e6573733c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a486173683e3e3a3a72616e646f6d3a3a6833336433376433663530353965666461b102456672616d655f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643a3a6f6e5f756e62616c616e6365643a3a6832333666613966323330316633313666b2023d70616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861393935656264303538663035333430b3023f70616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833326362346434613366326261333066b4024870616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6837373862666536366461323532396538b50291013c70616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4275726e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836653732326264303864666666393963b60298013c70616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5370656e64506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833353562653966313964306563666265b70299013c70616c6c65745f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f706f73616c426f6e6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865663432333231366431353432373162b802386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832353765396366343065666263363530b9023b70616c6c65745f636f6e7472616374733a3a6761733a3a726566756e645f756e757365645f6761733a3a6863643435613230393965383736653137ba024b3c5b543b205f5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865393737336338636431623037646231bb024a70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6863386239313130306632663938643236bc025370616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6833363963616137666635383631393135bd025170616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6863323731396665323735326164646135be026073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a736563703235366b315f65636473615f7265636f7665725f636f6d707265737365643a3a6866313630303365646533616235313934bf02603c70616c6c65745f74726561737572793a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6862363864373562646461373130353038c002633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a666f6c643a3a6834353636383533386430663333633839c102553c6e6f64655f72756e74696d653a3a43616c6c2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6837353535376334616233343963343864c2026b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839343866616433343436333763333337c302713c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864326561656139613733633032376562c402303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834373363636133666137363238323564c502303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6865376430626436666265346263613032c6024170616c6c65745f6d656d626572736869703a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6839353731313363643838396633313431c7024370616c6c65745f6d656d626572736869703a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6866363737333036626461616265393838c802703c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6830313763613562653063653830613935c902303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832313435353564666632323365643464ca02466e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6672616d655f73797374656d3a3a6830633334326234616237303465636130cb02486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f7574696c6974793a3a6865373134633731386536633331383937cc024170616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6835656566616537343233313161383933cd023f70616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6836393161346461326239343762303465ce02486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f696e64696365733a3a6833303730386534323631333464373165cf02496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f62616c616e6365733a3a6831303733353438323565633533643134d002486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f7374616b696e673a3a6865643064653264313332323239646531d102486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f73657373696f6e3a3a6833356533353435376435343530353037d2024a6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f64656d6f63726163793a3a6832313562303339653333316436656537d302556e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f636f6c6c6563746976655f496e7374616e6365313a3a6836393034363861373333643238613238d402536e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f656c656374696f6e735f70687261676d656e3a3a6831313032646137343336663764623938d502556e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f6d656d626572736869705f496e7374616e6365313a3a6862613534353538353861323662386135d602486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f6772616e6470613a3a6861326334613865323935353039616635d702496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f74726561737572793a3a6839326631656130363733383261316562d8024a6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f636f6e7472616374733a3a6831393337636661376532613237323361d902456e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f7375646f3a3a6836353032636337663735616564626437da024a6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f696d5f6f6e6c696e653a3a6834653435613762353063343464316438db02496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f6f6666656e6365733a3a6834636332373330353961626437303761dc02466e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f6e69636b733a3a6835366535306539333064373565306561dd024f70616c6c65745f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6832326261373632396366303536666431de023370616c6c65745f636f6e7472616374733a3a657865633a3a7472616e736665723a3a6835623733373830633633313532376363df023b70616c6c65745f636f6e7472616374733a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6861346530616266646562646265343466e0025d3c70616c6c65745f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732070616c6c65745f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a6833373936663431656533643961633530e10230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6839323739363932333931323433613236e2024870616c6c65745f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6864633033316339313961306537383037e3024470616c6c65745f636f6e7472616374733a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6861343032333062343565633764656264e402386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836666363343934373036333932653965e502910173705f636f6e73656e7375735f626162653a3a6469676573743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f626162653a3a6469676573743a3a526177426162655072654469676573743e3a3a6465636f64653a3a6839333935336436386439373737303663e6023f7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64655f746f3a3a6830636466336164383938616363636664e7026f3c73705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6838303337333562623237333834313037e8027d70616c6c65745f636f6c6c6563746976653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a656e636f64655f746f3a3a6835323530623238376538306164306265e9027a70616c6c65745f636f6e7472616374733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f636f6e7472616374733a3a5363686564756c653e3a3a656e636f64655f746f3a3a6863663938333065643336333531353234ea026f6e6f64655f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6836376137386661376662656332326335eb028e0170616c6c65745f636f6c6c6563746976653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f636f6c6c6563746976653a3a5261774576656e743c486173682c4163636f756e7449642c493e3e3a3a656e636f64655f746f3a3a6861373230613961613666326630393362ec024b3c5b543b205f5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6833626266343637623864633662303832ed02653c6e6f64655f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6832336466666435336636333730616331ee02437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863346363376138366466373739383636ef02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862303236633536616239323834363663f002386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835656561343837333266623931653131f102437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6837303930386466633335336336656432f2025c3c70616c6c65745f636f6e7472616374733a3a43616c6c3c543e2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6865656235363639326634346438386137f30299013c70616c6c65745f636f6c6c6563746976653a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6368616e67655f6d656d626572735f736f727465643a3a6834346165646331333637666330393339f4022b616c6c6f633a3a736c6963653a3a6d657267655f736f72743a3a6835333462383435623435303537353761f5024b6672616d655f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733a3a7365745f6d656d626572735f736f727465643a3a6864316561613432636663376433366638f6025f3c70616c6c65745f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6833326136393365633364343535313964f7025f3c70616c6c65745f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6839303833346133343935386263613330f8025c3c70616c6c65745f64656d6f63726163793a3a43616c6c3c543e2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6833393336356538306530666639646331f9023470616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6c65646765723a3a6832303532323437303062333262343964fa025a3c70616c6c65745f7374616b696e673a3a43616c6c3c543e2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6836636334343831613130323332643866fb0230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6837656437626162356632326133613931fc0234636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68643033646363643032333334613266662e333032fd027a70616c6c65745f636f6c6c6563746976653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a6465636f64653a3a6832306261393063323066613839316239fe027770616c6c65745f636f6e7472616374733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f636f6e7472616374733a3a5363686564756c653e3a3a6465636f64653a3a6831366564303661643435383133356237ff02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68383165663961363833346332666166308003386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a686532663531626239326664363532653881033b70616c6c65745f626162653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683238326332373939613238356632656482034470616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a686261376330356538333437363534353083039a013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578706563746564426c6f636b54696d6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838666661626565313437643830336339840396013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45706f63684475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68633430313361616334626436636236378503456672616d655f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643a3a6f6e5f756e62616c616e6365643a3a68346332306664653937643966323939308603437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68323965316233633266346264313065378703776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6861643534363365383561386433373535880330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683061373435383062333938666135663989032d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68316537316164363532346138636331338a0334636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a68356562633662353438653161663466308b032e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a68373863666134393263663635343736398c033c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a68613030356137656437373332353862398d032d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68396662356535353162363438653036668e0334636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a68306466626330333061643634633136308f032e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a686532616435636463613333656165366590033c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a683737643433363532356235353363353191036a3c70616c6c65745f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732070616c6c65745f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6834363165613835636565373439396237920381013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a683832393736663563613931663533353493035273705f73616e64626f783a3a696d703a3a456e7669726f6e6d656e74446566696e6974696f6e4275696c6465723c543e3a3a6164645f686f73745f66756e633a3a683164653662653434383832323761346494038d013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a683365663032343431623732303636343795038d013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a6835323430353163376662313831646436960386013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a683766626664346462313633636138656597038d013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7374616e74696174653a3a6833363832333539313136343336653838980388013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a6862636335363630623237373137353964990388013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68633566633035393861633235646461669a0389013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68333563373261613262323631363563369b038b013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68616436363866353038396565626366339c038a013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68623266616534376136306534363761399d0389013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a68393638633730313562363535383131369e0393013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68326138323661303064616435326361339f0388013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a6835393831313365656364343137373933a00385013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a6836333537613832623763353033646637a10391013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6d696e696d756d5f62616c616e63653a3a6836383937636139333363346435333239a2038f013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a6838376337626633363366346235646130a3038c013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f726573746f72655f746f3a3a6830323930633465396639323162386332a4038e013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a6862393135363631396136383463643830a5038e013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f726561643a3a6836333231346432376530313835306265a6038f013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f77726974653a3a6861313535393136363233303965343461a7038f013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6839353962356334663832636563306165a80394013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6832623434366361313532383235666436a90390013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a6866643134383939303937653061666534aa0389013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6830633039663066346632343861356434ab038e013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f626c6f636b5f6e756d6265723a3a6866616661353534323463333564356231ac0395013c70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732070616c6c65745f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f72756e74696d655f73746f726167653a3a6831346233643664396239353666613662ad033273705f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a6839666663363561336466386264343632ae037973705f636f72653a3a73616e64626f783a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f72653a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a6837393965313263323335366439656639af030c436f72655f76657273696f6eb00312436f72655f657865637574655f626c6f636bb1039a0173705f72756e74696d653a3a67656e657269633a3a626c6f636b3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f72756e74696d653a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c4865616465722c45787472696e7369633e3e3a3a6465636f64653a3a6834656533356236393861636630643063b203726672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a6865356133393765316565633933613035b3035373705f696f3a3a747269653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235365f6f7264657265645f726f6f743a3a6865366435356138333535383030323261b4037a6672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6863373833666135386161613735636262b503363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6863633038376137646234363939363637b603346672616d655f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6832316139643461343938383062326630b70315436f72655f696e697469616c697a655f626c6f636bb803114d657461646174615f6d65746164617461b9031c426c6f636b4275696c6465725f6170706c795f65787472696e736963ba03aa0173705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5472616e73616374696f6e56616c69646974794572726f723e3a3a656e636f64655f746f3a3a6862646264323936626664623835636135bb031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bbc035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6832653263383839613739633763303037bd03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836373237343262313464303862323462be03437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835643265366138386162343861346338bf0320426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373c003613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6862353832313833323536613864313866c1033a70616c6c65745f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6838366334646165306539353435363935c2031c426c6f636b4275696c6465725f636865636b5f696e686572656e7473c30318426c6f636b4275696c6465725f72616e646f6d5f73656564c4032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6ec5035373705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a56616c69645472616e73616374696f6e3a3a636f6d62696e655f776974683a3a6863306664353332653331666262396139c6036b3c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e2061732073705f72756e74696d653a3a7472616974733a3a56616c6964617465556e7369676e65643e3a3a76616c69646174655f756e7369676e65643a3a6865656463666265653935343636383731c7036d3c70616c6c65745f636f6e7472616374733a3a436865636b426c6f636b4761734c696d69743c543e2061732073705f72756e74696d653a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a6862373862356461653538383232653237c803214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572c9033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6834306363316462656531303931313862ca035173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7075626c69635f6b6579733a3a6865376563383264373331366537633634cb033d70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a69735f6f6e6c696e655f6175783a3a6862356231353765633561616434363865cc034d73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6574776f726b5f73746174653a3a6830396534323362366564323963366166cd034a73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7369676e3a3a6836663434363937383765343964373930ce0347636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207533323e3a3a666d743a3a6838363464316333323636306339633731cf035273705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7375626d69745f7472616e73616374696f6e3a3a6838623566663034306534376665376361d0031e4772616e6470614170695f6772616e6470615f617574686f726974696573d10315426162654170695f636f6e66696775726174696f6ed20321417574686f72697479446973636f766572794170695f617574686f726974696573d3031d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e6365d40311436f6e7472616374734170695f63616c6cd5033970616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a626172655f63616c6c3a3a6837303661643265393163653731303739d60318436f6e7472616374734170695f6765745f73746f72616765d703205472616e73616374696f6e5061796d656e744170695f71756572795f696e666fd8032153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b657973d903920173705f6170706c69636174696f6e5f63727970746f3a3a737232353531393a3a3c696d706c2073705f6170706c69636174696f6e5f63727970746f3a3a7472616974733a3a52756e74696d655075626c696320666f722073705f636f72653a3a737232353531393a3a5075626c69633e3a3a67656e65726174655f706169723a3a6834303163333038393536343766666465da03437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6837633730653935383335323639393465db03497061726974795f7363616c655f636f6465633a3a656e636f64655f617070656e643a3a657874726163745f6c656e6774685f646174613a3a6865353662303462383663623635643834dc03463c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6831343538373833363663336562346432dd0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864353433303538313032363234343937de033a6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864386131663131646266646566643135df033c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865313863353962636230613764663333e003683c6672616d655f73797374656d3a3a5f5f476574427974655374727563744576656e74733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830376635316334636261383861316336e103703c6672616d655f73797374656d3a3a5f5f4765744279746553747275637445787472696e73696373526f6f743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864353537633762386430363766396665e203703c6672616d655f73797374656d3a3a5f5f4765744279746553747275637445787472696e736963436f756e743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831333131323135376233363736306466e3034b6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a72656769737465725f65787472615f7765696768745f756e636865636b65643a3a6864623034623866663233326632656236e403386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831336139376131376261393035653865e503386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834333832353964653862613233333933e603386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834616230366132303635383439323666e703386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838306363633039626364303834363063e803386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838316464346630313863333664393166e903386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838343164666663366435386465313038ea03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861313831336636616462323432333937eb03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862303162393434313733366532333434ec03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862656434366233353038643332323461ed03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6863343437613134666339636461616164ee03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6863393339373530323237373636313161ef03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6863643837313837313063313765643835f003386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864373336326161363435613535306166f103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864623862613366623331313731343035f203386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864663661393936393464326133626263f303386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6866643363336564353837393337626265f403396672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6830376334313532326432363264313631f5033e70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862346565376563393533383465616432f6034070616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838313838306265303166623134316334f7034970616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864383162383264323863313066363434f8039b013c70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839353334396631633866373439626262f9034a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6834303334303333333138636638653365fa035d3c6672616d655f73797374656d3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6862316332303035363335656234623235fb03723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832313031333834656538356435323836fc03776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6836623432633266666538326130393866fd034a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6833393338393133666462613939666539fe033e70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6831613130346635343136366432353737ff034470616c6c65745f636f6e7472616374733a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a683062356338306265333761343262613180044170616c6c65745f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a683531363032653633613730653236616681044370616c6c65745f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a683035656363373730386634623631336182044370616c6c65745f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6862313966353235666338366535656539830430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683031303437313639323337323264663284046e6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f686561645f6b65793a3a68316234363762666335363161616266308504437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6831613234626632616361366335656232860484016672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654c696e6b65644d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6862373866643537386630656261663333870484016672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654c696e6b65644d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a68396430333035346632326238363964358804776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a68613265636165656463316132646130648904696672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f6b65793a3a68393765326535326461646531313536388a046e6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f686561645f6b65793a3a68343563643637353933386238346335358b04696672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f6b65793a3a68306261336131353364303737316631318c04437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68393466646431643731623663303066358d04706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68613862643263393662326637613766308e04706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68653134613631346330636165323331648f04746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a68636564386664313431313161366366379004746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a68643164663436356636613637383938659104776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a683464666138653137313464393066313792043570616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a686139383637323666383336303063383093043970616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a6864313637336162613732663965646539940485013c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e756d657261746f723c4b2c562c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6836346435353062393966643230353330950485013c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e756d657261746f723c4b2c562c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683937613039363566656465613331623796044270616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a736c61736861626c655f62616c616e63655f6f663a3a683535343366383963303735303564346197043570616c6c65745f7374616b696e673a3a736c617368696e673a3a646f5f736c6173683a3a686332363038393237623837383538336498043470616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a626f6e6465643a3a683839663636636233353533643030313499043b70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a68646265616666346136653666363566309a043c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68656530343266313432613835356430369b043c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a656e737572655f6e65775f6572613a3a68373430373663333833663033646235379c043e70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68346266656333613839663137323063379d046d3c70616c6c65745f7374616b696e673a3a5f5f476574427974655374727563745370616e536c6173683c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68613037346162393261303431376566319e043c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68336365633735643661396262626639669f047a3c70616c6c65745f7374616b696e673a3a5f5f4765744279746553747275637443757272656e74457261506f696e74734561726e65643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863376631626132613433653963313162a0046b3c70616c6c65745f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865613366653531333364636535633362a1046e3c70616c6c65745f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838373665646230666362636430336631a204793c70616c6c65745f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862336465636164303365366134386538a3044770616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863666165643262356336623965333535a4049b013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426f6e64696e674475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830313235303663353735643265623565a5049a013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53657373696f6e7350657245726144656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865373262353738313634366363633364a604f4013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e2061732073705f7374616b696e673a3a6f6666656e63653a3a4f6e4f6666656e636548616e646c65723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449642c283c542061732070616c6c65745f73657373696f6e3a3a54726169743e3a3a56616c696461746f7249642c203c542061732070616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a54726169743e3a3a46756c6c4964656e74696669636174696f6e293e3e3a3a6f6e5f6f6666656e63653a3a6866613737366239346465303632306339a7044970616c6c65745f7374616b696e673a3a736c617368696e673a3a496e7370656374696e675370616e733c543e3a3a6572615f7370616e3a3a6838366262383863623937303464393733a8045e70616c6c65745f7374616b696e673a3a736c617368696e673a3a496e7370656374696e675370616e733c543e3a3a636f6d706172655f616e645f7570646174655f7370616e5f736c6173683a3a6863383939623233616464333339653162a904776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6863376632353462353864303266356330aa04776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6832653435393235636238343838363964ab045f3c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6864663361383665313165326330613131ac047c73705f636f72653a3a73616e64626f783a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073705f636f72653a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6835303033393930366337346337653133ad043a70616c6c65745f6e69636b733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830626331323832373834343462343430ae043c70616c6c65745f6e69636b733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833653564386563643561636636636336af04683c70616c6c65745f6e69636b733a3a5f5f476574427974655374727563744e616d654f663c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862373963653062303932373566306235b0044570616c6c65745f6e69636b733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6836633639623331633931363235663061b10493013c70616c6c65745f6e69636b733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d61784c656e67746844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866613266376537333166366463353638b20493013c70616c6c65745f6e69636b733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e4c656e67746844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862346636666664633532313932643738b30498013c70616c6c65745f6e69636b733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5265736572766174696f6e46656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865326236636531313333333639636137b404a40170616c6c65745f636f6e7472616374733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f636f6e7472616374733a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6863383832643532316638353366336564b5043c70616c6c65745f7574696c6974793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837373430346561386338353634373830b6043e70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863613130306165323039653137616436b7044070616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6863643030636266656532613462616236b8046e3c70616c6c65745f636f6e7472616374733a3a5f5f4765744279746553747275637447617350726963653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836396639353733343466633536306164b904723c70616c6c65745f636f6e7472616374733a3a5f5f476574427974655374727563745072697374696e65436f64653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833656262313563313335653839326638ba04753c70616c6c65745f636f6e7472616374733a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832626137366163666262306131396463bb044970616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6833303766643630326438633661326466bc049b013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b4761734c696d697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835313236386638363365303435313833bd049a013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d617856616c756553697a6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834613938616562663836336338363061be0496013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178446570746844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861336134353736323263333766643566bf0499013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616c6c4261736546656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836316236636438383737666230316232c00499013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a436f6e747261637446656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861656638353163396466666538323832c104a0013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5472616e73616374696f6e4279746546656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865376265633864323265386236313134c2049d013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53757263686172676552657761726444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832616164666265346461626362623061c3049f013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a52656e744465706f7369744f666673657444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865613235623931646333386633323436c4049f013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53746f7261676553697a654f666673657444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833656334373565343933356334366131c504a1013c70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5369676e6564436c61696d48616e646963617044656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837666165316435346538656638616566c6043a70616c6c65745f636f6e7472616374733a3a4d6f64756c653c543e3a3a726573746f72655f746f3a3a6838383834303261633336356464333330c70468636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743c413e20666f7220266d757420463e3a3a63616c6c5f6d75743a3a6832373033646335626530613563333033c804303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6861373566643361323861303633323135c9043f70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a6830663338303335366563386530383330ca044170616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a6863663632336438373165656632373862cb043d70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6866666638326166383835356230343433cc043a70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6830636466323965663165326236616236cd043a70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f746572735f666f723a3a6863393337643463373266393363303938ce043770616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6837616261373761373133353661316435cf043f70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a6837653665313337336138376332386463d0046e6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f686561645f6b65793a3a6866623666376164373336386265346461d10485013c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a456e756d657261746f723c4b2c562c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832623939396139363062356566346663d2044070616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6838626462356637316233626435393362d3044470616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a69735f6163746976655f7265666572656e64756d3a3a6864656636333939636537613131353738d4043e70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a656e6163745f70726f706f73616c3a3a6835303134363437616661373438303239d504696672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6c696e6b65645f6d61703a3a4b6579466f726d61743a3a73746f726167655f6c696e6b65645f6d61705f66696e616c5f6b65793a3a6861656338393461373934303038363231d6043e70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830353630323331353563613139343066d7043f70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6831303532303362366331396534373361d8044070616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6830366365626437653266396564343636d904713c70616c6c65745f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864366330356464303430663562363266da04713c70616c6c65745f64656d6f63726163793a3a5f5f476574427974655374727563745075626c696350726f70733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833313064376238666434646530376638db046f3c70616c6c65745f64656d6f63726163793a3a5f5f47657442797465537472756374507265696d616765733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834313733393265306238336530343933dc044970616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6833306361623563323430306330623664dd049a013c70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4c61756e6368506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830383238616561626231663365663036de04a3013c70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a456d657267656e6379566f74696e67506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830626362633230313966633365356432df049c013c70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d4465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834613932643534346539323537613938e0049d013c70616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a456e6163746d656e74506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834663232623435376330356432373666e1043770616c6c65745f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6864626337643035373335343236353864e204437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6831656534623862623665633334346631e304776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6839363738326133363232653334376463e404776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a72656d6f76653a3a6831373361303363333334633331623939e5043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6831363961323463373930356537373064e6043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6832323266643037313766353134613637e7043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6866636663633838663537623765663538e8044570616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863646134666362383933396130613263e9045070616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6861326334356566666537623665313533ea04a2013c70616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5265706f72744c6174656e637944656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831313036343934373861303836643466eb049f013c70616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a57696e646f7753697a6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836326333306430656431383863383162ec044a70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a726561645f73616e64626f785f6d656d6f72795f61733a3a6834366661323064396162383430356133ed044a70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a726561645f73616e64626f785f6d656d6f72795f61733a3a6831386161383632633430323835326432ee044a70616c6c65745f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a726561645f73616e64626f785f6d656d6f72795f61733a3a6866333037336461633765393935323731ef043970616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863306334643364653439363339646466f0043b70616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6863326633323438653436373337626635f104643c70616c6c65745f7375646f3a3a5f5f476574427974655374727563744b65793c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832346365323165376132336166616565f204443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862626330636137626662343333633462f3046f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6831376163326630616264656532346361f404467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6838663764663834333537393666356633f50430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6835633232633265326565653635323932f604347761736d695f76616c69646174696f6e3a3a76616c69646174655f6d6f64756c653a3a6833396334343731636535336563363663f70448616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6837616265383962626632303261346162f8043c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6834306534616135306130366163616237f904537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6837643333376361303561343432653738fa04a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6866353238366462353563323464653737fb0444707761736d5f7574696c733a3a6761733a3a436f756e7465723a3a66696e616c697a655f6d6574657265645f626c6f636b3a3a6833616433383030346633386133663463fc042d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a6838333631616236366561303832663361fd04507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6865333838353439346263393466356437fe043c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6838396563663863636434633736616265ff046b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683431306363396531343663366661356580053e70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683862623464633534353962353932323281054070616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a686239366639303363363762306263393482055c3c70616c6c65745f7375646f3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68333839643666653565376237396532318305303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68636638346162623137383237333932658405553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68353835616362326562383932396166368505683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683434333430343439303938323330653286056b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683739376236316561353161393636306487057d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683132623563316331616266643862333888056f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683366663537313539366537653830643189056f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343431346439393861623137653161628a056c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68386164666635666263623432383264668b056f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68666337353863623432333063353062628c05793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68313137336462633139616635663038318d056b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68623664626331363265343535626432658e0586017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a68323631383336326636313263303634628f05323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68303764636439303837313166363931669005783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a686164626337643961663935386636383491057c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68663132633033646138343339623933639205743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68303638333134363932333033646137319305713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68393831386362616434633834303464369405713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683436313830336638343234393335633995054b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a686235616630386664353539396565333896054b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683739653534613964373562336230393497054b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68376361323533356363396132313638629805463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68366231383362343032303964383865319905457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a68346661663864393066613365313638389a052d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68626139663135616136343161653235309b0534636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a68353336393865613838643861663834399c052e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a68323633326161326239646165356337649d053c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a68623365383161303365383166636338339e053b636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a7b7b636c6f737572657d7d3a3a68323763393165626334386634386465659f05397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a6864663634333332633766626438633432a005347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a6832326664316639356333636231313630a105553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839666437616538373835366430316461a2054a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a6862323839316131316434336364343133a305473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6864643662363530323039323935373533a405457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6862303131346363663262366537353533a505303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831303336616631333137333866666463a605553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830653437616536336563303965633565a705303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831383035343164353436333434636436a805303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832366364303465616461616238646562a905303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830303337623063666334356336633536aa05303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866633234323466343564323330653732ab0540707761736d5f7574696c733a3a737461636b5f6865696768743a3a636f6d707574655f737461636b5f636f73743a3a6861383435386566663533663265363332ac0533636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a6836626434623761383039383537363662ad05533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6863343831386165383834306263313032ae05323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6833616433306430653031313762633766af053f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6834366532623066383536386231623661b00530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6831623135336435366235333338356637b10530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6862363832646630613931653164303464b205593c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6863653837306165633766323261613863b30541707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6863333935303935633464373936653564b405303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836393136343230633165356432373138b5052e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a6835623233343736336633653430343262b6053c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a6830613931333337636638393664353239b70530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830343934303264626232626362326331b805303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830346632616164323362303163316266b9055a3c707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a4672616d6520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839316133646631363939373530393563ba0546707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6830633432373339383166336635333338bb05453c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834393962336539376330626639376535bc054b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6862333162626434643036653964336633bd053a73705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6c73747269703a3a6834376664393665323232663766656339be053773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6164643a3a6863323963646631616334313266336164bf053773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6d756c3a3a6865353262376135316538336335656365c0054473705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6469763a3a7b7b636c6f737572657d7d3a3a6861346666653066363462623436643663c1054b3c73705f61726974686d657469633a3a62696775696e743a3a42696755696e7420617320636f72653a3a636d703a3a4f72643e3a3a636d703a3a6865623666666435386536323939363233c205303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862323133643330653933653133656533c305513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6835626265366330386465393138313139c4053d73705f61726974686d657469633a3a68656c706572735f3132386269743a3a746f5f6269675f75696e743a3a6862373932666633323261643264313838c505413c73705f696e686572656e74733a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835353763303239663963616564323235c605323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6837393630363235643632323430633336c7054273705f696f3a3a6c6f6767696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f673a3a6837386534633336393930333566653861c80537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6830636362626338393566386263633566c9053b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6864663963663731393765306431373335ca05347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a6834353137643035633663613263643834cb05347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a6838613333333461353062306330353431cc05407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a6833313733656330356634666330323965cd05543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839363837303466613037393139383633ce05537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a6861373464623266646363333161353135cf05547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a6866373436643436323235303932383130d005557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a6838653431343333313362383138613731d105547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a6837393565626431333832336662373036d205537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a6830313438353937363834636364613539d305547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a6837643766643064373634313036636463d405547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6839633331373666373462333563383835d50530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6834373766646265336435653437383130d605303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833356532653635376130666438323431d705303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837303936346436613136313366643164d805453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6832373633323236316338353530643631d9054c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866306332323565353935633565313530da05066d656d736574db05066d656d637079dc05076d656d6d6f7665dd050462636d70de05095f5f6173686c746933df05095f5f6c736872746933e005085f5f6d756c746933e105095f5f75646976746933e205095f5f756d6f64746933e3050c5f5f756469766d6f6474693400550970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d62790105727573746325312e34312e302d6e696768746c79202837366132353265613920323031392d31322d303929", + "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x10c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479e225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41ee410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86cfe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310a", + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xcc2a4f3c61e593c5c704149f3ee3c3028b3b382ba9f42ee767b1953c5fcb8f1f", + "0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b46b1ab1274bcbe3a4176e17eb2917654904f19b3261911ec3f7a30a473a04dcc8": "0x00407a10f35a00000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7": "0x08000000000002006d6f646c70792f747273727900000000000000000000000000000000000000000500000000000000000003006d6f646c70792f7472737279000000000000000000000000000000000000000000407a10f35a0000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973952c9ffc8f4d8900648af298fd29c4312871633ff0e759d98574f05e67ec56bc": "0xcafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367", + "0xf2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b657973e4fe34f5c8499d222649809260ad8db63c739e091b73cda907a2df171176070a": "0x7e8a1b8e637a062656eff12dc94bbbc3e254d9bb93bd44972f0a96c7fdde5b4de225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41ee225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41ee225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41e", + "0xf2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedcac29a0310e1bb45d20cace77ccb62c97d": "0x00e1f505", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc685268962a32b3f1cffce32ce1e5f6d6d3d633f7e21fd4e659402a2c62cab64ca": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe7066e551402e9db966f769da2a411eff2face196c91278147bbfcf405002e875ac": "0xc2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973ddaecd8f3d7c1d983083cdb5cbd354701308d13ec10c81d42da58c5eb1d15264": "0xcafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc604615f785492f37abe2b14d3f286778c2c9752548ca2d011e952c455b2733bfe": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b6579737e0c1544454d51abcabc70ab73b47a3b401c92709958ddab7740094a7135ae16": "0xcafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367", + "0x8985776095addd4789fccbce8ca77b23ba7fb8745735dc3be2a2c61a72c39e78": "0x046e51d621d637695a1c4214ff5b85fb0063fe3908f8b39c380c582011c3807078", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973dfa2eac750730cfcb981664732807d8dff47c246f7d78f6f8bbaaca9f15fd3b0": "0xf417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e29", + "0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x04000000", + "0x26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac": "0x01000000", + "0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000", + "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x04000000", + "0x5f3e4907f716ac89b6347d15ececedca0ea0ecac76457d0f9b39b981dd107012": "0x10cafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367f417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e292a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761dc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a", + "0x34b9dcaacddd89d5a94929dccb7131534a9d2f70e9ee596bc867d128cd9ec759": "0x00ca9a3b000000000000000000000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00401eae822458363600000000000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4e0f0f8a6ceacf3a6c5f142248962532609453d6bbff30954e62c7267960c4624": "0x0000a0dec5adc9353600000000000000", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x10cafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367f417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e292a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761dc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e1690304615f785492f37abe2b14d3f286778c2c9752548ca2d011e952c455b2733bfe": "0x0001f417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e2901dc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a", + "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b65797385268962a32b3f1cffce32ce1e5f6d6d3d633f7e21fd4e659402a2c62cab64ca": "0xf6e62e9231c0424c1b747ffb5ccaedcb9fd6fddc2bfcb2db963c02db74c0c84dfe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310afe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310afe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310a", + "0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x01000000", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70e4fe34f5c8499d222649809260ad8db63c739e091b73cda907a2df171176070a": "0xe225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41e", + "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x10c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479e225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41ee410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86cfe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310a", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4f6ba35a8ebc8b98cc00cf8bebd411ecde353b5cc097d55297f372120235907d6": "0x2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b227610f0000c16ff286230f0000c16ff2862300", + "0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff4e4fe34f5c8499d222649809260ad8db63c739e091b73cda907a2df171176070a": "0x0ff6ffc06ff286230ff6ffc06ff2862300", + "0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4e4fe34f5c8499d222649809260ad8db63c739e091b73cda907a2df171176070a": "0x0000c16ff28623000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b65797304615f785492f37abe2b14d3f286778c2c9752548ca2d011e952c455b2733bfe": "0x5202d3e9c3bf075b44615f9ac4c28b8627079a219ff66e01655487c3bde52eb8e410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86ce410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86ce410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86c", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b65797366e551402e9db966f769da2a411eff2face196c91278147bbfcf405002e875ac": "0xe23578cbc267982cfc0bf7be54cd952fa3c07631850880ca88e395e25f4812c7c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb8842303479", + "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x10c2ecc9feda5c727ce1f77e6a662efd98f39212fea555b286b702eb88423034790100000000000000e225a23a02d254dee5384fe46fc083306e597a85b31c75f4e8674349d8f7a41e0100000000000000e410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86c0100000000000000fe451858d3bff3683df83e029f44d62cc4f285f7a1004542679ffa35ed68310a0100000000000000", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc44bb3d65784ee237cb19a67a937611263a136c75414ebcc385bda1a5c4ceb1edf": "0xf417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e290f0000c16ff286230f0000c16ff2862300", + "0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff466e551402e9db966f769da2a411eff2face196c91278147bbfcf405002e875ac": "0x0ff6ffc06ff286230ff6ffc06ff2862300", + "0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff485268962a32b3f1cffce32ce1e5f6d6d3d633f7e21fd4e659402a2c62cab64ca": "0x0ff6ffc06ff286230ff6ffc06ff2862300", + "0x5f3e4907f716ac89b6347d15ececedca6a93112633bb3354e67952fcdd740cd5": "0xcafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc666e551402e9db966f769da2a411eff2face196c91278147bbfcf405002e875ac": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f", + "0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b485268962a32b3f1cffce32ce1e5f6d6d3d633f7e21fd4e659402a2c62cab64ca": "0x0000c16ff28623000000000000000000", + "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x10dc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761f417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e29cafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903e4fe34f5c8499d222649809260ad8db63c739e091b73cda907a2df171176070a": "0x0001cafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367012a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973a9e863aa4e88bfe99fb4f5250d395dfc9ad8361f732d3f33f982630685e1b467": "0xf417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e29", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b65797333a25791b4e76010f327045d60a8a9b6cbaa4175acec26fc9c64923cb2ed0b33": "0xcafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd367", + "0x34b9dcaacddd89d5a94929dccb713153d2d505c0e6f76fd7ce0796ebe187401c": "0x0000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000008700000000000000af0000000000000001000000000000000100000000000000040000000000010010000000004000000120000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b65797358c81ce9d318af53a0c8e04a468dbe3d064a96be56550cde6a930f94d820eef4": "0x2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761", + "0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff404615f785492f37abe2b14d3f286778c2c9752548ca2d011e952c455b2733bfe": "0x0ff6ffc06ff286230ff6ffc06ff2862300", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98e4fe34f5c8499d222649809260ad8db63c739e091b73cda907a2df171176070a": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4370973789ee011f45a1b1a15e8ca4cb78a4c6002b9dc5c7454f0ddc806bf0415": "0xdc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a0f0000c16ff286230f0000c16ff2862300", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973bb0478b410b24d65023203a9b253562f2dac70ebbbce3493919331ba6d09510e": "0xf417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e29", + "0x26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850": "0x02000000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc473d92918a8bc8bb6704158faa13f857c8503f88a105844949122c4ae959b09ba": "0xcafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd3670f0000c16ff286230f0000c16ff2862300", + "0x5f3e4907f716ac89b6347d15ececedca9cbd2f0b29a008a36009ac44cca0c969": "0xf6ffc06ff28623000000000000000000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e1690385268962a32b3f1cffce32ce1e5f6d6d3d633f7e21fd4e659402a2c62cab64ca": "0x00012a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b2276100", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b65797395a5c6fffae0bd453a2681fc02f692a2ce7e7b27a8b53de6741bccabd205d271": "0x2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973573bf64cfb7e8c308bcf0394ae44b7cbf6c3d1f3574a78f3c565015d96ea9c15": "0x2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761", + "0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b466e551402e9db966f769da2a411eff2face196c91278147bbfcf405002e875ac": "0x0000c16ff28623000000000000000000", + "0xf2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6": "0x00000000", + "0x492a52699edf49c972c21db794cfcf57ba7fb8745735dc3be2a2c61a72c39e78": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe7004615f785492f37abe2b14d3f286778c2c9752548ca2d011e952c455b2733bfe": "0xe410a5800082ee863e06344590e83ef0b60fb6ea2126086ea9bc5c579ff4b86c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973f301a28bea294f7ef32e6577fe7067ce573431f351098b6d032a3319ecfe571a": "0x2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade9866e551402e9db966f769da2a411eff2face196c91278147bbfcf405002e875ac": "0x00", + "0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x00", + "0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b404615f785492f37abe2b14d3f286778c2c9752548ca2d011e952c455b2733bfe": "0x0000c16ff28623000000000000000000", + "0x1a736d37504c2e3fb73dad160c55b291b35b5a09b938edfd10fcbacc615abb0c": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e1690366e551402e9db966f769da2a411eff2face196c91278147bbfcf405002e875ac": "0x000001f417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e29", + "0x11f3ba2e1cdd6d62f2ff9b5589e7ff81ba7fb8745735dc3be2a2c61a72c39e78": "0x046e51d621d637695a1c4214ff5b85fb0063fe3908f8b39c380c582011c3807078", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6e4fe34f5c8499d222649809260ad8db63c739e091b73cda907a2df171176070a": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b6579734d9b18cf80e6a057b2af8cf177dcae65db7aecaf46b2787909eb9f3bcdb662dc": "0xdc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade9804615f785492f37abe2b14d3f286778c2c9752548ca2d011e952c455b2733bfe": "0x00", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c11874611da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x3a6772616e6470615f617574686f726974696573": "0x0110e23578cbc267982cfc0bf7be54cd952fa3c07631850880ca88e395e25f4812c701000000000000007e8a1b8e637a062656eff12dc94bbbc3e254d9bb93bd44972f0a96c7fdde5b4d01000000000000005202d3e9c3bf075b44615f9ac4c28b8627079a219ff66e01655487c3bde52eb80100000000000000f6e62e9231c0424c1b747ffb5ccaedcb9fd6fddc2bfcb2db963c02db74c0c84d0100000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973a1243cfbda382a96e2fffd4d8c847b04aa4ac7719037b42dc283987272fb6852": "0xdc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973b84da33d6821a3ecdab06fb5517b5338b39edf649f3c0cdebf9a6322e2976a2f": "0xdc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973caf51cb2812dec8599a1e85e56ec7627cced6492a6a60f1e70ddcd14e06ae799": "0xdc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a", + "0x1a736d37504c2e3fb73dad160c55b2917ac6a308d645671864cda07d358e751211da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9": "0x186e51d621d637695a1c4214ff5b85fb0063fe3908f8b39c380c582011c3807078dc94ff7f625d9ef7824766f90a5eb8aa03f99b7b28664585950221d0d2358e3a2a009220d327910e8ffd89167b7d96eb8871a37c374ec0adfdf1b6c384b22761f417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e29cafad6120836227e4660c07c046c2b56e8fba10cbf3fcfdcc566d774e14fd3676d6f646c70792f74727372790000000000000000000000000000000000000000", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade9885268962a32b3f1cffce32ce1e5f6d6d3d633f7e21fd4e659402a2c62cab64ca": "0x00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973fdc59ca6b20d398f03a062a5e1bc32e350fe13cda745936e92daa3a75acb8853": "0xf417395797ff444345d7c25355bbab14de5ca8857104a028d969147a4fbd6e29" + }, + "children": {} + } + } +} \ No newline at end of file -- GitLab From 5054bd99b0bafa7b6e594813afa98b482f5c6e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 3 Jan 2020 21:39:30 +0100 Subject: [PATCH 042/296] Make sure docs given to `decl_module!` are passed to the module struct (#4526) --- frame/support/src/dispatch.rs | 13 ++++--------- frame/support/test/src/lib.rs | 17 +++++++++++++++++ frame/support/test/tests/system.rs | 22 ++++++++++++++++++---- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/frame/support/src/dispatch.rs b/frame/support/src/dispatch.rs index f6f42a28ca..3d12d7cf95 100644 --- a/frame/support/src/dispatch.rs +++ b/frame/support/src/dispatch.rs @@ -1075,7 +1075,6 @@ macro_rules! decl_module { // Declare a `Call` variant parameter that should be encoded `compact`. (@create_call_enum - $( #[$attr:meta] )* $call_type:ident; <$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> { $( $other_where_bounds:tt )* } @@ -1089,7 +1088,6 @@ macro_rules! decl_module { ) => { $crate::decl_module! { @create_call_enum - $( #[$attr] )* $call_type; <$trait_instance: $trait_name $(, $instance: $instantiable $(= $module_default_instance)? )?> { $( $other_where_bounds )* } @@ -1107,7 +1105,6 @@ macro_rules! decl_module { // Declare a `Call` variant parameter. (@create_call_enum - $( #[$attr:meta] )* $call_type:ident; <$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> { $( $other_where_bounds:tt )* } @@ -1120,7 +1117,6 @@ macro_rules! decl_module { ) => { $crate::decl_module! { @create_call_enum - $( #[$attr] )* $call_type; <$trait_instance: $trait_name $(, $instance: $instantiable $(= $module_default_instance)? )?> { $( $other_where_bounds )* } @@ -1136,7 +1132,6 @@ macro_rules! decl_module { }; (@create_call_enum - $( #[$attr:meta] )* $call_type:ident; <$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> { $( $other_where_bounds:tt )* } @@ -1151,7 +1146,6 @@ macro_rules! decl_module { ) => { $crate::decl_module! { @create_call_enum - $( #[$attr] )* $call_type; <$trait_instance: $trait_name $(, $instance: $instantiable $(= $module_default_instance)? )?> { $( $other_where_bounds )* } @@ -1172,15 +1166,16 @@ macro_rules! decl_module { }; (@create_call_enum - $( #[$attr:meta] )* $call_type:ident; <$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> { $( $other_where_bounds:tt )* } { $( $generated_variants:tt )* } {} ) => { + /// Dispatchable calls. + /// + /// Each variant of this enum maps to a dispatchable function from the associated module. #[derive($crate::codec::Encode, $crate::codec::Decode)] - $( #[$attr] )* pub enum $call_type<$trait_instance: $trait_name$(, $instance: $instantiable $( = $module_default_instance)?)?> where $( $other_where_bounds )* { @@ -1221,6 +1216,7 @@ macro_rules! decl_module { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq, $crate::RuntimeDebug)] + $( #[$attr] )* pub struct $mod_type< $trait_instance: $trait_name $(, $instance: $instantiable $( = $module_default_instance)?)? @@ -1286,7 +1282,6 @@ macro_rules! decl_module { $crate::decl_module! { @create_call_enum - $( #[$attr] )* $call_type; <$trait_instance: $trait_name $(, $instance: $instantiable $(= $module_default_instance)? )?> { $( $other_where_bounds )* } diff --git a/frame/support/test/src/lib.rs b/frame/support/test/src/lib.rs index c6a93e1b77..ec78a8c400 100644 --- a/frame/support/test/src/lib.rs +++ b/frame/support/test/src/lib.rs @@ -16,3 +16,20 @@ //! Test crate for frame_support. Allow to make use of `frame_support::decl_storage`. //! See tests directory. + +// Make sure we fail compilation on warnings +#![warn(missing_docs)] +#![deny(warnings)] + +/// The configuration trait +pub trait Trait { + /// The runtime origin type. + type Origin; + /// The block number type. + type BlockNumber; +} + +frame_support::decl_module! { + /// Some test module + pub struct Module for enum Call where origin: T::Origin {} +} diff --git a/frame/support/test/tests/system.rs b/frame/support/test/tests/system.rs index 83786538e6..5dff9eef9a 100644 --- a/frame/support/test/tests/system.rs +++ b/frame/support/test/tests/system.rs @@ -1,3 +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 . + use frame_support::codec::{Encode, Decode, EncodeLike}; pub trait Trait: 'static + Eq + Clone { @@ -12,13 +28,11 @@ pub trait Trait: 'static + Eq + Clone { } frame_support::decl_module! { - pub struct Module for enum Call where origin: T::Origin { - } + pub struct Module for enum Call where origin: T::Origin {} } impl Module { - pub fn deposit_event(_event: impl Into) { - } + pub fn deposit_event(_event: impl Into) {} } frame_support::decl_event!( -- GitLab From e2441808516496c5cfc3c0a8652c3b90e2def75b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 3 Jan 2020 21:39:46 +0100 Subject: [PATCH 043/296] Fix `period` of offchain transactions. (#4521) * Fix period of offchain transactions. * Calculate period dynamically. * Convert to u64. --- bin/node/runtime/src/lib.rs | 6 +++++- primitives/runtime/src/generic/era.rs | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 7a8ba7613b..b525546a11 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -500,7 +500,11 @@ impl frame_system::offchain::CreateTransaction for account: AccountId, index: Index, ) -> Option<(Call, ::SignaturePayload)> { - let period = 1 << 8; + // take the biggest period possible. + let period = BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; let current_block = System::block_number().saturated_into::(); let tip = 0; let extra: SignedExtra = ( diff --git a/primitives/runtime/src/generic/era.rs b/primitives/runtime/src/generic/era.rs index c72e8f8b0f..8eeb550b2e 100644 --- a/primitives/runtime/src/generic/era.rs +++ b/primitives/runtime/src/generic/era.rs @@ -40,6 +40,9 @@ pub enum Era { /// implies which block hash is included in the signature material). If the `period` is /// greater than 1 << 12, then it will be a factor of the times greater than 1<<12 that /// `period` is. + /// + /// When used on `FRAME`-based runtimes, `period` cannot exceed `BlockHashCount` parameter + /// of `system` module. Mortal(Period, Phase), } @@ -55,6 +58,10 @@ n = Q(current - phase, period) + phase impl Era { /// Create a new era based on a period (which should be a power of two between 4 and 65536 inclusive) /// and a block number on which it should start (or, for long periods, be shortly after the start). + /// + /// If using `Era` in the context of `FRAME` runtime, make sure that `period` + /// does not exceed `BlockHashCount` parameter passed to `system` module, since that + /// prunes old blocks and renders transactions immediately invalid. pub fn mortal(period: u64, current: u64) -> Self { let period = period.checked_next_power_of_two() .unwrap_or(1 << 16) -- GitLab From e2b23f25b17f62a08785d9f449139b398dcb4fa2 Mon Sep 17 00:00:00 2001 From: Denis Pisarev Date: Fri, 3 Jan 2020 21:40:02 +0100 Subject: [PATCH 044/296] triggers srml-contracts-waterfall ci (#4490) * triggers srml-contracts-waterfall ci * only nightly and merges * substrate does not use tager cache so far --- .gitlab-ci.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f27543026f..0eb7c38c27 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -368,6 +368,17 @@ check_polkadot: - cd - - sccache -s +trigger-contracts-ci: + stage: publish + needs: + - build-linux-substrate + trigger: + project: parity/srml-contracts-waterfall + branch: "master" + only: + - master + - schedules + #### stage: publish .publish-docker-release: &publish-docker-release -- GitLab From bdf6043fb78be6fa7bf87b87d0462af44143f88f Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 3 Jan 2020 21:40:19 +0100 Subject: [PATCH 045/296] client/authority-discovery: Limit number of connections to authorities (#4487) * client/authority-discovery: Limit number of connections to authorities Instead of connecting to all sentry nodes of all authorities, with this patch the authority discovery module does the following: - Choose one sentry node per authority at random. - Choose MAX_NUM_AUTHORITY_CONN out of the above at random. The module uses randomness to prevent hot spots, e.g. all nodes trying to connect to a single node. If the authority discovery module would choose the nodes to connect to at random on each new address that it learns of, the node would go through a lot of connection churn. Instead it creates a random seed at start up and uses this seed for its RNG on each update cycle. * client/authority-discovery: Extract address cache into own module * client/authority-discovery/src/addr_cache: Add basic unit tests * client/authority-discovery: Replace unwrap with expect on [u8] cmp * .maintain/sentry-node/docker-compose.yml: Prefix endpoint flags * client/authority-discovery/src/addr_cache: Use sort_unstable and cmp * client/authority-discovery: Use BTreeMap in addr_cache for sorted iter To reduce connection churn it is preferrable to have `get_subset` of the `addr_cache` to return the same result on repeated calls. `get_subset` iterates a map. To make the process of iteration deterministic, use a `BTreeMap` instead of a `HashMap`. --- .maintain/sentry-node/docker-compose.yml | 12 +- Cargo.lock | 3 +- client/authority-discovery/Cargo.toml | 17 +- client/authority-discovery/src/addr_cache.rs | 200 +++++++++++++++++++ client/authority-discovery/src/error.rs | 4 + client/authority-discovery/src/lib.rs | 180 ++++++++--------- client/authority-discovery/src/tests.rs | 2 +- 7 files changed, 301 insertions(+), 117 deletions(-) create mode 100644 client/authority-discovery/src/addr_cache.rs diff --git a/.maintain/sentry-node/docker-compose.yml b/.maintain/sentry-node/docker-compose.yml index 37f0bea6b4..0ca42613b4 100644 --- a/.maintain/sentry-node/docker-compose.yml +++ b/.maintain/sentry-node/docker-compose.yml @@ -47,8 +47,8 @@ services: - "--reserved-nodes" - "/dns4/sentry-a/tcp/30333/p2p/QmV7EhW6J6KgmNdr558RH1mPx2xGGznW7At4BhXzntRFsi" # Not only bind to localhost. - - "--ws-external" - - "--rpc-external" + - "--unsafe-ws-external" + - "--unsafe-rpc-external" # - "--log" # - "sub-libp2p=trace" # - "--log" @@ -88,8 +88,8 @@ services: - "--rpc-cors" - "all" # Not only bind to localhost. - - "--ws-external" - - "--rpc-external" + - "--unsafe-ws-external" + - "--unsafe-rpc-external" - "--log" - "sub-authority-discovery=trace" - "--sentry" @@ -121,8 +121,8 @@ services: - "--rpc-cors" - "all" # Not only bind to localhost. - - "--ws-external" - - "--rpc-external" + - "--unsafe-ws-external" + - "--unsafe-rpc-external" - "--log" - "sub-authority-discovery=trace" diff --git a/Cargo.lock b/Cargo.lock index 5113c6a5ad..4e7410a9e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4933,9 +4933,10 @@ dependencies = [ "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-keystore 2.0.0", "sc-network 0.8.0", diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index fc1ac95785..6ad25299f0 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -9,26 +9,27 @@ build = "build.rs" prost-build = "0.5.0" [dependencies] -sp-authority-discovery = { version = "2.0.0", path = "../../primitives/authority-discovery" } bytes = "0.4.12" -sc-client-api = { version = "2.0.0", path = "../api" } codec = { package = "parity-scale-codec", default-features = false, version = "1.0.3" } derive_more = "0.99.2" futures = "0.3.1" futures-timer = "2.0" -sc-keystore = { version = "2.0.0", path = "../keystore" } libp2p = { version = "0.13.2", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" -sc-network = { version = "0.8", path = "../network" } -sp-core = { version = "2.0.0", path = "../../primitives/core" } -sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } prost = "0.5.0" +rand = "0.7.2" +sc-client-api = { version = "2.0.0", path = "../api" } +sc-keystore = { version = "2.0.0", path = "../keystore" } +sc-network = { version = "0.8", path = "../network" } serde_json = "1.0.41" +sp-authority-discovery = { version = "2.0.0", path = "../../primitives/authority-discovery" } +sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } [dev-dependencies] env_logger = "0.7.0" -parking_lot = "0.9.0" +quickcheck = "0.9.0" sc-peerset = { version = "2.0.0", path = "../peerset" } -sp-test-primitives = { version = "2.0.0", path = "../../primitives/test-primitives" } sp-api = { version = "2.0.0", path = "../../primitives/api" } +sp-test-primitives = { version = "2.0.0", path = "../../primitives/test-primitives" } diff --git a/client/authority-discovery/src/addr_cache.rs b/client/authority-discovery/src/addr_cache.rs new file mode 100644 index 0000000000..357048de54 --- /dev/null +++ b/client/authority-discovery/src/addr_cache.rs @@ -0,0 +1,200 @@ +// 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 rand::{rngs::StdRng, seq::SliceRandom, Rng, SeedableRng}; +use std::{ + clone::Clone, + cmp::{Eq, Ord, PartialEq}, + collections::BTreeMap, + convert::AsRef, + hash::Hash, +}; + +/// The maximum number of authority connections initialized through the authority discovery module. +/// +/// In other words the maximum size of the `authority` peer set priority group. +const MAX_NUM_AUTHORITY_CONN: usize = 10; + +/// Cache of Multiaddresses of authority nodes or their sentry nodes. +// +// The network peerset interface for priority groups lets us only set an entire group, but we +// retrieve the addresses of other authorities one by one from the network. To use the peerset +// interface we need to cache the addresses and always overwrite the entire peerset priority +// group. To ensure this map doesn't grow indefinitely `purge_old_authorities_from_cache` +// function is called each time we add a new entry. +pub(super) struct AddrCache { + cache: BTreeMap>, + + /// Random number to seed address selection RNG. + /// + /// A node should only try to connect to a subset of all authorities. To choose this subset one + /// uses randomness. The choice should differ between nodes to prevent hot spots, but not within + /// each node between each update to prevent connection churn. Thus before each selection we + /// seed an RNG with the same seed. + rand_addr_selection_seed: u64, +} + +impl AddrCache +where + Id: Clone + Eq + Hash + Ord, + Addr: Clone + PartialEq + AsRef<[u8]>, +{ + pub fn new() -> Self { + AddrCache { + cache: BTreeMap::new(), + rand_addr_selection_seed: rand::thread_rng().gen(), + } + } + + pub fn insert(&mut self, id: Id, mut addresses: Vec) { + if addresses.is_empty() { + return; + } + + addresses.sort_unstable_by(|a, b| a.as_ref().cmp(b.as_ref())); + self.cache.insert(id, addresses); + } + + // Each node should connect to a subset of all authorities. In order to prevent hot spots, this + // selection is based on randomness. Selecting randomly each time we alter the address cache + // would result in connection churn. To reduce this churn a node generates a seed on startup and + // uses this seed for a new rng on each update. (One could as well use ones peer id as a seed. + // Given that the peer id is publicly known, it would make this process predictable by others, + // which might be used as an attack.) + pub fn get_subset(&self) -> Vec { + let mut rng = StdRng::seed_from_u64(self.rand_addr_selection_seed); + + let mut addresses = self + .cache + .iter() + .map(|(_peer_id, addresses)| { + addresses + .choose(&mut rng) + .expect("an empty address vector is never inserted into the cache") + }) + .cloned() + .collect::>(); + + addresses.dedup(); + addresses.sort_unstable_by(|a, b| a.as_ref().cmp(b.as_ref())); + + addresses + .choose_multiple(&mut rng, MAX_NUM_AUTHORITY_CONN) + .cloned() + .collect() + } + + pub fn retain_ids(&mut self, ids: &Vec) { + let to_remove = self + .cache + .iter() + .filter(|(id, _addresses)| !ids.contains(id)) + .map(|entry| entry.0) + .cloned() + .collect::>(); + + for key in to_remove { + self.cache.remove(&key); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use quickcheck::{QuickCheck, TestResult}; + + #[test] + fn returns_addresses_of_same_authorities_on_repeated_calls() { + fn property(input: Vec<(u32, Vec)>) -> TestResult { + // Expect less than 1000 authorities. + if input.len() > 1000 { + return TestResult::discard(); + } + + // Expect less than 100 addresses per authority. + for i in &input { + if i.1.len() > 100 { + return TestResult::discard(); + } + } + + let mut c = AddrCache::new(); + + for (id, addresses) in input { + c.insert(id, addresses); + } + + let result = c.get_subset(); + assert!(result.len() <= MAX_NUM_AUTHORITY_CONN); + + for _ in 1..100 { + assert_eq!(c.get_subset(), result); + } + + TestResult::passed() + } + + QuickCheck::new() + .max_tests(10) + .quickcheck(property as fn(Vec<(u32, Vec)>) -> TestResult) + } + + #[test] + fn returns_same_addresses_of_first_authority_when_second_authority_changes() { + let mut c = AddrCache::new(); + + // Insert addresses of first authority. + let addresses = (1..100) + .map(|i| format!("{:?}", i)) + .collect::>(); + c.insert(1, addresses); + let first_subset = c.get_subset(); + assert_eq!(1, first_subset.len()); + + // Insert address of second authority. + c.insert(2, vec!["a".to_string()]); + let second_subset = c.get_subset(); + assert_eq!(2, second_subset.len()); + + // Expect same address of first authority. + assert!(second_subset.contains(&first_subset[0])); + + // Alter address of second authority. + c.insert(2, vec!["b".to_string()]); + let second_subset = c.get_subset(); + assert_eq!(2, second_subset.len()); + + // Expect same address of first authority. + assert!(second_subset.contains(&first_subset[0])); + } + + #[test] + fn retains_only_entries_of_provided_ids() { + let mut cache = AddrCache::new(); + + cache.insert(1, vec![vec![10]]); + cache.insert(2, vec![vec![20]]); + cache.insert(3, vec![vec![30]]); + + cache.retain_ids(&vec![1, 3]); + + let mut subset = cache.get_subset(); + subset.sort(); + + assert_eq!(vec![vec![10], vec![30]], subset); + } +} diff --git a/client/authority-discovery/src/error.rs b/client/authority-discovery/src/error.rs index fdbd5b31fe..b999df5d97 100644 --- a/client/authority-discovery/src/error.rs +++ b/client/authority-discovery/src/error.rs @@ -22,6 +22,10 @@ pub type Result = std::result::Result; /// Error type for the authority discovery module. #[derive(Debug, derive_more::Display, derive_more::From)] pub enum Error { + /// Received dht value found event with records with different keys. + ReceivingDhtValueFoundEventWithDifferentKeys, + /// Received dht value found event with no records. + ReceivingDhtValueFoundEventWithNoRecords, /// Failed to verify a dht payload with the given signature. VerifyingDhtPayload, /// Failed to hash the authority id to be used as a dht key. diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index fe3da18ca6..3896100c01 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -45,7 +45,6 @@ //! 4. Adds the retrieved external addresses as priority nodes to the peerset. use std::collections::{HashMap, HashSet}; use std::convert::TryInto; -use std::iter::FromIterator; use std::marker::PhantomData; use std::pin::Pin; use std::sync::Arc; @@ -55,26 +54,26 @@ use futures::task::{Context, Poll}; use futures::{Future, FutureExt, Stream, StreamExt}; use futures_timer::Delay; -use sp_authority_discovery::{ - AuthorityDiscoveryApi, AuthorityId, AuthoritySignature, AuthorityPair -}; -use sc_client_api::blockchain::HeaderBackend; use codec::{Decode, Encode}; use error::{Error, Result}; -use log::{debug, error, log_enabled, warn}; use libp2p::Multiaddr; +use log::{debug, error, log_enabled, warn}; +use prost::Message; +use sc_client_api::blockchain::HeaderBackend; use sc_network::specialization::NetworkSpecialization; use sc_network::{DhtEvent, ExHashT, NetworkStateInfo}; +use sp_authority_discovery::{AuthorityDiscoveryApi, AuthorityId, AuthoritySignature, AuthorityPair}; use sp_core::crypto::{key_types, Pair}; use sp_core::traits::BareCryptoStorePtr; -use prost::Message; use sp_runtime::generic::BlockId; use sp_runtime::traits::{Block as BlockT, ProvideRuntimeApi}; +use addr_cache::AddrCache; #[cfg(test)] mod tests; mod error; +mod addr_cache; /// Dht payload schemas generated from Protobuf definitions via Prost crate in build.rs. mod schema { include!(concat!(env!("OUT_DIR"), "/authority_discovery.rs")); @@ -89,12 +88,6 @@ const LIBP2P_KADEMLIA_BOOTSTRAP_TIME: Duration = Duration::from_secs(30); /// discovery module. const AUTHORITIES_PRIORITY_GROUP_NAME: &'static str = "authorities"; -/// The maximum number of sentry node public addresses that we accept per authority. -/// -/// Everything above this threshold should be dropped to prevent a single authority from filling up -/// our peer set priority group. -const MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY: usize = 5; - /// An `AuthorityDiscovery` makes a given authority discoverable and discovers other authorities. pub struct AuthorityDiscovery where @@ -124,12 +117,7 @@ where /// Interval on which to query for addresses of other authorities. query_interval: Interval, - /// The network peerset interface for priority groups lets us only set an entire group, but we - /// retrieve the addresses of other authorities one by one from the network. To use the peerset - /// interface we need to cache the addresses and always overwrite the entire peerset priority - /// group. To ensure this map doesn't grow indefinitely `purge_old_authorities_from_cache` - /// function is called each time we add a new entry. - address_cache: HashMap>, + addr_cache: addr_cache::AddrCache, phantom: PhantomData, } @@ -182,22 +170,12 @@ where } }).collect::>(); - if addrs.len() > MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY { - warn!( - target: "sub-authority-discovery", - "More than MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY ({:?}) were specified. Other \ - nodes will likely ignore the remainder.", - MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY, - ); - } - Some(addrs) } else { None }; - - let address_cache = HashMap::new(); + let addr_cache = AddrCache::new(); AuthorityDiscovery { client, @@ -207,7 +185,7 @@ where key_store, publish_interval, query_interval, - address_cache, + addr_cache, phantom: PhantomData, } } @@ -304,86 +282,70 @@ where &mut self, values: Vec<(libp2p::kad::record::Key, Vec)>, ) -> Result<()> { - debug!(target: "sub-authority-discovery", "Got Dht value from network."); - - let block_id = BlockId::hash(self.client.info().best_hash); - - // From the Dht we only get the hashed authority id. In order to retrieve the actual - // authority id and to ensure it is actually an authority, we match the hash against the - // hash of the authority id of all other authorities. - let authorities = self.client.runtime_api().authorities(&block_id)?; - self.purge_old_authorities_from_cache(&authorities); - - let authorities = authorities - .into_iter() - .map(|id| hash_authority_id(id.as_ref()).map(|h| (h, id))) - .collect::>>()?; - - for (key, value) in values.iter() { - // Check if the event origins from an authority in the current authority set. - let authority_id: &AuthorityId = authorities - .get(key) - .ok_or(Error::MatchingHashedAuthorityIdWithAuthorityId)?; - - let schema::SignedAuthorityAddresses { - signature, - addresses, - } = schema::SignedAuthorityAddresses::decode(value).map_err(Error::DecodingProto)?; - let signature = AuthoritySignature::decode(&mut &signature[..]) - .map_err(Error::EncodingDecodingScale)?; - - if !AuthorityPair::verify(&signature, &addresses, authority_id) { - return Err(Error::VerifyingDhtPayload); + // Ensure `values` is not empty and all its keys equal. + let remote_key = values.iter().fold(Ok(None), |acc, (key, _)| { + match acc { + Ok(None) => Ok(Some(key.clone())), + Ok(Some(ref prev_key)) if prev_key != key => Err( + Error::ReceivingDhtValueFoundEventWithDifferentKeys + ), + x @ Ok(_) => x, + Err(e) => Err(e), } - - let mut addresses: Vec = schema::AuthorityAddresses::decode(addresses) - .map(|a| a.addresses) - .map_err(Error::DecodingProto)? + })?.ok_or(Error::ReceivingDhtValueFoundEventWithNoRecords)?; + + let authorities = { + let block_id = BlockId::hash(self.client.info().best_hash); + // From the Dht we only get the hashed authority id. In order to retrieve the actual + // authority id and to ensure it is actually an authority, we match the hash against the + // hash of the authority id of all other authorities. + let authorities = self.client.runtime_api().authorities(&block_id)?; + self.addr_cache.retain_ids(&authorities); + authorities .into_iter() - .map(|a| a.try_into()) - .collect::>() - .map_err(Error::ParsingMultiaddress)?; - - if addresses.len() > MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY { - warn!( - target: "sub-authority-discovery", - "Got more than MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY ({:?}) for Authority \ - '{:?}' from DHT, dropping the remainder.", - MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY, authority_id, - ); - addresses = addresses.into_iter() - .take(MAX_NUM_SENTRY_ADDRESSES_PER_AUTHORITY) - .collect(); - } + .map(|id| hash_authority_id(id.as_ref()).map(|h| (h, id))) + .collect::>>()? + }; - self.address_cache.insert(authority_id.clone(), addresses); - } + // Check if the event origins from an authority in the current authority set. + let authority_id: &AuthorityId = authorities + .get(&remote_key) + .ok_or(Error::MatchingHashedAuthorityIdWithAuthorityId)?; + + let remote_addresses: Vec = values.into_iter() + .map(|(_k, v)| { + let schema::SignedAuthorityAddresses { + signature, + addresses, + } = schema::SignedAuthorityAddresses::decode(v).map_err(Error::DecodingProto)?; + let signature = AuthoritySignature::decode(&mut &signature[..]) + .map_err(Error::EncodingDecodingScale)?; + + if !AuthorityPair::verify(&signature, &addresses, authority_id) { + return Err(Error::VerifyingDhtPayload); + } - // Let's update the peerset priority group with all the addresses we have in our cache. + let addresses: Vec = schema::AuthorityAddresses::decode(addresses) + .map(|a| a.addresses) + .map_err(Error::DecodingProto)? + .into_iter() + .map(|a| a.try_into()) + .collect::>() + .map_err(Error::ParsingMultiaddress)?; - let addresses = HashSet::from_iter( - self.address_cache - .iter() - .map(|(_peer_id, addresses)| addresses.clone()) - .flatten(), - ); + Ok(addresses) + }) + .collect::>>>()? + .into_iter().flatten().collect(); - debug!( - target: "sub-authority-discovery", - "Applying priority group {:#?} to peerset.", addresses, - ); - self.network - .set_priority_group(AUTHORITIES_PRIORITY_GROUP_NAME.to_string(), addresses) - .map_err(Error::SettingPeersetPriorityGroup)?; + if !remote_addresses.is_empty() { + self.addr_cache.insert(authority_id.clone(), remote_addresses); + self.update_peer_set_priority_group()?; + } Ok(()) } - fn purge_old_authorities_from_cache(&mut self, current_authorities: &Vec) { - self.address_cache - .retain(|peer_id, _addresses| current_authorities.contains(peer_id)) - } - /// Retrieve all local authority discovery private keys that are within the current authority /// set. fn get_priv_keys_within_authority_set(&mut self) -> Result> { @@ -429,6 +391,22 @@ where Ok(intersection) } + + /// Update the peer set 'authority' priority group. + // + fn update_peer_set_priority_group(&self) -> Result<()>{ + let addresses = self.addr_cache.get_subset(); + + debug!( + target: "sub-authority-discovery", + "Applying priority group {:?} to peerset.", addresses, + ); + self.network + .set_priority_group(AUTHORITIES_PRIORITY_GROUP_NAME.to_string(), addresses.into_iter().collect()) + .map_err(Error::SettingPeersetPriorityGroup)?; + + Ok(()) + } } impl Future for AuthorityDiscovery diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs index bd81e791db..b0e841b594 100644 --- a/client/authority-discovery/src/tests.rs +++ b/client/authority-discovery/src/tests.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::sync::{Arc, Mutex}; +use std::{iter::FromIterator, sync::{Arc, Mutex}}; use futures::channel::mpsc::channel; use futures::executor::block_on; -- GitLab From 5842f6ebfa1f0da34c81c554a4640983e0d81c8b Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 3 Jan 2020 23:46:42 +0300 Subject: [PATCH 046/296] Update kvdb-* and trie (#4483) --- Cargo.lock | 88 ++++++++++++----------------- bin/node/cli/Cargo.toml | 2 +- client/Cargo.toml | 4 +- client/api/Cargo.toml | 4 +- client/db/Cargo.toml | 6 +- client/db/src/cache/list_storage.rs | 8 +-- client/db/src/cache/mod.rs | 18 +++--- client/db/src/children.rs | 27 +++++---- client/db/src/lib.rs | 22 ++++---- client/db/src/light.rs | 12 ++-- client/db/src/utils.rs | 38 ++++++------- client/src/leaves.rs | 18 +++--- primitives/state-machine/Cargo.toml | 2 +- primitives/trie/Cargo.toml | 6 +- test-utils/runtime/Cargo.toml | 4 +- 15 files changed, 120 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e7410a9e6..69f168eba2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1011,14 +1011,6 @@ name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "elastic-array" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "enumflags2" version = "0.6.2" @@ -1775,14 +1767,6 @@ dependencies = [ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "heapsize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "heck" version = "0.3.1" @@ -2243,37 +2227,37 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "elastic-array 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kvdb-memorydb" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kvdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kvdb-rocksdb" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "elastic-array 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2830,13 +2814,13 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.15.3" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ahash 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3006,7 +2990,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", @@ -4143,7 +4127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "parity-util-mem" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5055,8 +5039,8 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5091,7 +5075,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5119,9 +5103,9 @@ version = "2.0.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.3.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.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6545,7 +6529,7 @@ dependencies = [ "sp-externalities 2.0.0", "sp-panic-handler 2.0.0", "sp-trie 2.0.0", - "trie-db 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6606,12 +6590,12 @@ dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", - "trie-bench 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-bench 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6829,7 +6813,7 @@ dependencies = [ "frame-system 2.0.0", "frame-system-rpc-runtime-api 2.0.0", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-babe 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6856,7 +6840,7 @@ dependencies = [ "sp-version 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-wasm-builder-runner 1.0.4", - "trie-db 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7405,29 +7389,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trie-bench" -version = "0.17.0" +version = "0.18.0" 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.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-db" -version = "0.16.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "elastic-array 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8255,7 +8239,6 @@ dependencies = [ "checksum doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "923dea538cea0aa3025e8685b20d6ee21ef99c4f77e954a30febbaac5ec73a97" "checksum ed25519-dalek 1.0.0-pre.3 (registry+https://github.com/rust-lang/crates.io-index)" = "978710b352437433c97b2bff193f2fb1dfd58a093f863dd95e225a19baa599a2" "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -"checksum elastic-array 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "580f3768bd6465780d063f5b8213a2ebd506e139b345e4a81eb301ceae3d61e1" "checksum enumflags2 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "33121c8782ba948ba332dab29311b026a8716dc65a1599e5b88f392d38496af8" "checksum enumflags2_derive 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ecf634c5213044b8d54a46dd282cf5dd1f86bb5cb53e92c409cb4680a7fb9894" "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" @@ -8323,7 +8306,6 @@ dependencies = [ "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" "checksum hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" -"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 hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120" "checksum hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" @@ -8369,9 +8351,9 @@ dependencies = [ "checksum keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3468207deea1359a0e921591ae9b4c928733d94eb9d6a2eeda994cfd59f42cf8" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" -"checksum kvdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c1b2f251f01a7224426abdb2563707d856f7de995d821744fd8fa8e2874f69e3" -"checksum kvdb-memorydb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "296c12309ed36cb74d59206406adbf1971c3baa56d5410efdb508d8f1c60a351" -"checksum kvdb-rocksdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d3f82177237c1ae67d6ab208a6f790cab569a1d81c1ba02348e0736a99510be3" +"checksum kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cecee8d85a74f6b8284710d52a7d1196f09e31f8217e1f184a475b509d360554" +"checksum kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a5d70712b1fe0f02ce7ee36a962fcb0b15d0fe11262ba21a4aa839ef22cf60d" +"checksum kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "54cc6b52f7e511de9f07fd77cda70247adfc6b8192e4b5a1b6dbca416dc425b5" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" @@ -8415,7 +8397,7 @@ dependencies = [ "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" -"checksum memory-db 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5dabfe0a8c69954ae3bcfc5fc14260a85fb80e1bf9f86a155f668d10a67e93dd" +"checksum memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "828bdf600636e90c56652689f7c3823ae2072104e4b0b5e83ea984f592f12ab9" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2b0942b357c1b4d0dc43ba724674ec89c3218e6ca2b3e8269e7cb53bcecd2f6e" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" @@ -8457,7 +8439,7 @@ dependencies = [ "checksum parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f9f9d99dae413590a5f37e43cd99b94d4e62a244160562899126913ea7108673" "checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" -"checksum parity-util-mem 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "570093f39f786beea92dcc09e45d8aae7841516ac19a50431953ac82a0e8f85c" +"checksum parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" "checksum parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" "checksum parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" @@ -8639,8 +8621,8 @@ dependencies = [ "checksum tracing-attributes 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a4263b12c3d3c403274493eb805966093b53214124796552d674ca1dd5d27c2b" "checksum tracing-core 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bc913647c520c959b6d21e35ed8fa6984971deca9f0a2fcb8c51207e0c56af1d" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "403d8ec7dbc4b46781ef18cd96b371bb9ce6ec394fe83ece75eb3bc755dfa69f" -"checksum trie-db 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "784a9813d23f18bccab728ab039c39b8a87d0d6956dcdece39e92f5cffe5076e" +"checksum trie-bench 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d276e600d06806a4ac61e5d6b145a620001e6147151e60a4f1f46a784ec4baa" +"checksum trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "191fda5d0106f3ed35a8c6875428b213e15c516e48129cc263dd7ad16e9a665f" "checksum trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b779f7c1c8fe9276365d9d5be5c4b5adeacf545117bb3f64c974305789c5c0b" "checksum trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3161ba520ab28cd8e6b68e1126f1009f6e335339d1a73b978139011703264c8" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index ca12f41b01..c4cb3108de 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -94,7 +94,7 @@ console_log = { version = "0.1.2", optional = true } js-sys = { version = "0.3.22", optional = true } wasm-bindgen = { version = "0.2.45", optional = true } wasm-bindgen-futures = { version = "0.3.22", optional = true } -kvdb-memorydb = { version = "0.1.1", optional = true } +kvdb-memorydb = { version = "0.2.0", optional = true } rand6 = { package = "rand", version = "0.6", features = ["wasm-bindgen"], optional = true } # Imported just for the `wasm-bindgen` feature [dev-dependencies] diff --git a/client/Cargo.toml b/client/Cargo.toml index da4f5e3cc2..2932eff21d 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -18,7 +18,7 @@ hash-db = { version = "0.15.2" } hex-literal = { version = "0.2.1" } sp-inherents = { version = "2.0.0", path = "../primitives/inherents" } sp-keyring = { version = "2.0.0", path = "../primitives/keyring" } -kvdb = "0.1.1" +kvdb = "0.2.0" log = { version = "0.4.8" } parking_lot = { version = "0.9.0" } sp-core = { version = "2.0.0", path = "../primitives/core" } @@ -36,5 +36,5 @@ tracing = "0.1.10" env_logger = "0.7.0" tempfile = "3.1.0" substrate-test-runtime-client = { version = "2.0.0", path = "../test-utils/runtime/client" } -kvdb-memorydb = "0.1.2" +kvdb-memorydb = "0.2.0" sp-panic-handler = { version = "2.0.0", path = "../primitives/panic-handler" } diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index e445e9bc4c..9e2e35e3a2 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -17,7 +17,7 @@ sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } sp-inherents = { version = "2.0.0", default-features = false, path = "../../primitives/inherents" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } -kvdb = "0.1.1" +kvdb = "0.2.0" log = { version = "0.4.8" } parking_lot = { version = "0.9.0" } sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } @@ -31,4 +31,4 @@ sp-trie = { version = "2.0.0", path = "../../primitives/trie" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } [dev-dependencies] -sp-test-primitives = { version = "2.0.0", path = "../../primitives/test-primitives" } \ No newline at end of file +sp-test-primitives = { version = "2.0.0", path = "../../primitives/test-primitives" } diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index 955f6f8e0d..1d1f6448da 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -7,9 +7,9 @@ edition = "2018" [dependencies] parking_lot = "0.9.0" log = "0.4.8" -kvdb = "0.1.1" -kvdb-rocksdb = { version = "0.2", optional = true } -kvdb-memorydb = "0.1.2" +kvdb = "0.2.0" +kvdb-rocksdb = { version = "0.3", optional = true } +kvdb-memorydb = "0.2.0" linked-hash-map = "0.5.2" hash-db = "0.15.2" sc-client-api = { version = "2.0.0", path = "../api" } diff --git a/client/db/src/cache/list_storage.rs b/client/db/src/cache/list_storage.rs index 236feac88a..1d22a664a5 100644 --- a/client/db/src/cache/list_storage.rs +++ b/client/db/src/cache/list_storage.rs @@ -84,13 +84,13 @@ pub trait StorageTransaction { #[derive(Debug)] pub struct DbColumns { /// Column holding cache meta. - pub meta: Option, + pub meta: u32, /// Column holding the mapping of { block number => block hash } for blocks of the best chain. - pub key_lookup: Option, + pub key_lookup: u32, /// Column holding the mapping of { block hash => block header }. - pub header: Option, + pub header: u32, /// Column holding cache entries. - pub cache: Option, + pub cache: u32, } /// Database-backed list cache storage. diff --git a/client/db/src/cache/mod.rs b/client/db/src/cache/mod.rs index a25b4e4fd7..8f443182c2 100644 --- a/client/db/src/cache/mod.rs +++ b/client/db/src/cache/mod.rs @@ -77,9 +77,9 @@ impl CacheItemT for T where T: Clone + Decode + Encode + PartialEq {} pub struct DbCache { cache_at: HashMap, self::list_storage::DbStorage>>, db: Arc, - key_lookup_column: Option, - header_column: Option, - authorities_column: Option, + key_lookup_column: u32, + header_column: u32, + authorities_column: u32, genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, } @@ -88,9 +88,9 @@ impl DbCache { /// Create new cache. pub fn new( db: Arc, - key_lookup_column: Option, - header_column: Option, - authorities_column: Option, + key_lookup_column: u32, + header_column: u32, + authorities_column: u32, genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, ) -> Self { @@ -150,9 +150,9 @@ fn get_cache_helper<'a, Block: BlockT>( cache_at: &'a mut HashMap, self::list_storage::DbStorage>>, name: CacheKeyId, db: &Arc, - key_lookup: Option, - header: Option, - cache: Option, + key_lookup: u32, + header: u32, + cache: u32, best_finalized_block: &ComplexBlockId, ) -> &'a mut ListCache, self::list_storage::DbStorage> { cache_at.entry(name).or_insert_with(|| { diff --git a/client/db/src/children.rs b/client/db/src/children.rs index db0469098b..8598c96d91 100644 --- a/client/db/src/children.rs +++ b/client/db/src/children.rs @@ -21,12 +21,11 @@ use codec::{Encode, Decode}; use sp_blockchain; use std::hash::Hash; - /// Returns the hashes of the children blocks of the block with `parent_hash`. pub fn read_children< K: Eq + Hash + Clone + Encode + Decode, V: Eq + Hash + Clone + Encode + Decode, ->(db: &dyn KeyValueDB, column: Option, prefix: &[u8], parent_hash: K) -> sp_blockchain::Result> { +>(db: &dyn KeyValueDB, column: u32, prefix: &[u8], parent_hash: K) -> sp_blockchain::Result> { let mut buf = prefix.to_vec(); parent_hash.using_encoded(|s| buf.extend(s)); @@ -55,7 +54,7 @@ pub fn write_children< V: Eq + Hash + Clone + Encode + Decode, >( tx: &mut DBTransaction, - column: Option, + column: u32, prefix: &[u8], parent_hash: K, children_hashes: V, @@ -70,7 +69,7 @@ pub fn remove_children< K: Eq + Hash + Clone + Encode + Decode, >( tx: &mut DBTransaction, - column: Option, + column: u32, prefix: &[u8], parent_hash: K, ) { @@ -87,33 +86,33 @@ mod tests { #[test] fn children_write_read_remove() { const PREFIX: &[u8] = b"children"; - let db = ::kvdb_memorydb::create(0); + let db = ::kvdb_memorydb::create(1); let mut tx = DBTransaction::new(); let mut children1 = Vec::new(); children1.push(1_3); children1.push(1_5); - write_children(&mut tx, None, PREFIX, 1_1, children1); + write_children(&mut tx, 0, PREFIX, 1_1, children1); let mut children2 = Vec::new(); children2.push(1_4); children2.push(1_6); - write_children(&mut tx, None, PREFIX, 1_2, children2); + write_children(&mut tx, 0, PREFIX, 1_2, children2); - db.write(tx.clone()).unwrap(); + db.write(tx.clone()).expect("(2) Commiting transaction failed"); - let r1: Vec = read_children(&db, None, PREFIX, 1_1).unwrap(); - let r2: Vec = read_children(&db, None, PREFIX, 1_2).unwrap(); + let r1: Vec = read_children(&db, 0, PREFIX, 1_1).expect("(1) Getting r1 failed"); + let r2: Vec = read_children(&db, 0, PREFIX, 1_2).expect("(1) Getting r2 failed"); assert_eq!(r1, vec![1_3, 1_5]); assert_eq!(r2, vec![1_4, 1_6]); - remove_children(&mut tx, None, PREFIX, 1_2); - db.write(tx).unwrap(); + remove_children(&mut tx, 0, PREFIX, 1_2); + db.write(tx).expect("(2) Commiting transaction failed"); - let r1: Vec = read_children(&db, None, PREFIX, 1_1).unwrap(); - let r2: Vec = read_children(&db, None, PREFIX, 1_2).unwrap(); + let r1: Vec = read_children(&db, 0, PREFIX, 1_1).expect("(2) Getting r1 failed"); + let r2: Vec = read_children(&db, 0, PREFIX, 1_2).expect("(2) Getting r2 failed"); assert_eq!(r1, vec![1_3, 1_5]); assert_eq!(r2.len(), 0); diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 8523ff30a3..e812d2dc46 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -302,18 +302,18 @@ pub fn new_client( } pub(crate) mod columns { - pub const META: Option = crate::utils::COLUMN_META; - pub const STATE: Option = Some(1); - pub const STATE_META: Option = Some(2); + pub const META: u32 = crate::utils::COLUMN_META; + pub const STATE: u32 = 1; + pub const STATE_META: u32 = 2; /// maps hashes to lookup keys and numbers to canon hashes. - pub const KEY_LOOKUP: Option = Some(3); - pub const HEADER: Option = Some(4); - pub const BODY: Option = Some(5); - pub const JUSTIFICATION: Option = Some(6); - pub const CHANGES_TRIE: Option = Some(7); - pub const AUX: Option = Some(8); + pub const KEY_LOOKUP: u32 = 3; + pub const HEADER: u32 = 4; + pub const BODY: u32 = 5; + pub const JUSTIFICATION: u32 = 6; + pub const CHANGES_TRIE: u32 = 7; + pub const AUX: u32 = 8; /// Offchain workers local storage - pub const OFFCHAIN: Option = Some(9); + pub const OFFCHAIN: u32 = 9; } struct PendingBlock { @@ -633,7 +633,7 @@ struct StorageDb { impl sp_state_machine::Storage for StorageDb { fn get(&self, key: &H256, prefix: Prefix) -> Result, String> { let key = prefixed_key::(key, prefix); - self.state_db.get(&key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) + self.state_db.get(&key, self) .map_err(|e| format!("Database backend error: {:?}", e)) } } diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 31ed012622..881e0fd6a6 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -44,12 +44,12 @@ use crate::DatabaseSettings; use log::{trace, warn, debug}; pub(crate) mod columns { - pub const META: Option = crate::utils::COLUMN_META; - pub const KEY_LOOKUP: Option = Some(1); - pub const HEADER: Option = Some(2); - pub const CACHE: Option = Some(3); - pub const CHT: Option = Some(4); - pub const AUX: Option = Some(5); + pub const META: u32 = crate::utils::COLUMN_META; + pub const KEY_LOOKUP: u32 = 1; + pub const HEADER: u32 = 2; + pub const CACHE: u32 = 3; + pub const CHT: u32 = 4; + pub const AUX: u32 = 5; } /// Prefix for headers CHT. diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index c45fe1c064..8277d1d40e 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -38,7 +38,7 @@ use crate::{DatabaseSettings, DatabaseSettingsSrc}; /// Otherwise RocksDb will fail to open database && check its type. pub const NUM_COLUMNS: u32 = 10; /// Meta column. The set of keys in the column is shared by full && light storages. -pub const COLUMN_META: Option = Some(0); +pub const COLUMN_META: u32 = 0; /// Keys of entries in COLUMN_META. pub mod meta_keys { @@ -125,7 +125,7 @@ pub fn lookup_key_to_number(key: &[u8]) -> sp_blockchain::Result where /// Delete number to hash mapping in DB transaction. pub fn remove_number_to_key_mapping>( transaction: &mut DBTransaction, - key_lookup_col: Option, + key_lookup_col: u32, number: N, ) -> sp_blockchain::Result<()> { transaction.delete(key_lookup_col, number_index_key(number)?.as_ref()); @@ -135,7 +135,7 @@ pub fn remove_number_to_key_mapping>( /// Remove key mappings. pub fn remove_key_mappings, H: AsRef<[u8]>>( transaction: &mut DBTransaction, - key_lookup_col: Option, + key_lookup_col: u32, number: N, hash: H, ) -> sp_blockchain::Result<()> { @@ -148,7 +148,7 @@ pub fn remove_key_mappings, H: AsRef<[u8]>>( /// block hash at that position. pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( transaction: &mut DBTransaction, - key_lookup_col: Option, + key_lookup_col: u32, number: N, hash: H, ) -> sp_blockchain::Result<()> { @@ -163,7 +163,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>( transaction: &mut DBTransaction, - key_lookup_col: Option, + key_lookup_col: u32, number: N, hash: H, ) -> sp_blockchain::Result<()> { @@ -180,7 +180,7 @@ pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( /// looks up lookup key by hash from DB as necessary. pub fn block_id_to_lookup_key( db: &dyn KeyValueDB, - key_lookup_col: Option, + key_lookup_col: u32, id: BlockId ) -> Result>, sp_blockchain::Error> where Block: BlockT, @@ -194,7 +194,7 @@ pub fn block_id_to_lookup_key( BlockId::Hash(h) => db.get(key_lookup_col, h.as_ref()), }; - res.map(|v| v.map(|v| v.into_vec())).map_err(db_err) + res.map_err(db_err) } /// Maps database error to client error @@ -205,13 +205,13 @@ pub fn db_err(err: io::Error) -> sp_blockchain::Error { /// Open RocksDB database. pub fn open_database( config: &DatabaseSettings, - col_meta: Option, + col_meta: u32, db_type: &str ) -> sp_blockchain::Result> { let db: Arc = match &config.source { #[cfg(feature = "kvdb-rocksdb")] DatabaseSettingsSrc::Path { path, cache_size } => { - let mut db_config = DatabaseConfig::with_columns(Some(NUM_COLUMNS)); + let mut db_config = DatabaseConfig::with_columns(NUM_COLUMNS); if let Some(cache_size) = cache_size { let state_col_budget = (*cache_size as f64 * 0.9) as usize; @@ -219,10 +219,10 @@ pub fn open_database( let mut memory_budget = std::collections::HashMap::new(); for i in 0..NUM_COLUMNS { - if Some(i) == crate::columns::STATE { - memory_budget.insert(Some(i), state_col_budget); + if i == crate::columns::STATE { + memory_budget.insert(i, state_col_budget); } else { - memory_budget.insert(Some(i), other_col_budget); + memory_budget.insert(i, other_col_budget); } } @@ -261,8 +261,8 @@ pub fn open_database( /// Read database column entry for the given block. pub fn read_db( db: &dyn KeyValueDB, - col_index: Option, - col: Option, + col_index: u32, + col: u32, id: BlockId ) -> sp_blockchain::Result> where @@ -277,8 +277,8 @@ pub fn read_db( /// Read a header from the database. pub fn read_header( db: &dyn KeyValueDB, - col_index: Option, - col: Option, + col_index: u32, + col: u32, id: BlockId, ) -> sp_blockchain::Result> { match read_db(db, col_index, col, id)? { @@ -295,8 +295,8 @@ pub fn read_header( /// Required header from the database. pub fn require_header( db: &dyn KeyValueDB, - col_index: Option, - col: Option, + col_index: u32, + col: u32, id: BlockId, ) -> sp_blockchain::Result { read_header(db, col_index, col, id) @@ -304,7 +304,7 @@ pub fn require_header( } /// Read meta from the database. -pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: Option) -> Result< +pub fn read_meta(db: &dyn KeyValueDB, col_meta: u32, col_header: u32) -> Result< Meta<<::Header as HeaderT>::Number, Block::Hash>, sp_blockchain::Error, > diff --git a/client/src/leaves.rs b/client/src/leaves.rs index 91ea00a2f3..2090ce8791 100644 --- a/client/src/leaves.rs +++ b/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: &dyn KeyValueDB, column: Option, prefix: &[u8]) -> Result { + pub fn read_from_db(db: &dyn KeyValueDB, column: u32, prefix: &[u8]) -> Result { let mut storage = BTreeMap::new(); for (key, value) in db.iter_from_prefix(column, prefix) { @@ -173,7 +173,7 @@ impl LeafSet where } /// Write the leaf list to the database transaction. - pub fn prepare_transaction(&mut self, tx: &mut DBTransaction, column: Option, prefix: &[u8]) { + pub fn prepare_transaction(&mut self, tx: &mut DBTransaction, column: u32, prefix: &[u8]) { let mut buf = prefix.to_vec(); for LeafSetItem { hash, number } in self.pending_added.drain(..) { hash.using_encoded(|s| buf.extend(s)); @@ -277,7 +277,7 @@ mod tests { #[test] fn flush_to_disk() { const PREFIX: &[u8] = b"abcdefg"; - let db = ::kvdb_memorydb::create(0); + let db = ::kvdb_memorydb::create(1); let mut set = LeafSet::new(); set.import(0u32, 0u32, 0u32); @@ -288,10 +288,10 @@ mod tests { let mut tx = DBTransaction::new(); - set.prepare_transaction(&mut tx, None, PREFIX); + set.prepare_transaction(&mut tx, 0, PREFIX); db.write(tx).unwrap(); - let set2 = LeafSet::read_from_db(&db, None, PREFIX).unwrap(); + let set2 = LeafSet::read_from_db(&db, 0, PREFIX).unwrap(); assert_eq!(set, set2); } @@ -311,7 +311,7 @@ mod tests { #[test] fn finalization_consistent_with_disk() { const PREFIX: &[u8] = b"prefix"; - let db = ::kvdb_memorydb::create(0); + let db = ::kvdb_memorydb::create(1); let mut set = LeafSet::new(); set.import(10_1u32, 10u32, 0u32); @@ -322,12 +322,12 @@ mod tests { assert!(set.contains(10, 10_1)); let mut tx = DBTransaction::new(); - set.prepare_transaction(&mut tx, None, PREFIX); + set.prepare_transaction(&mut tx, 0, PREFIX); db.write(tx).unwrap(); let _ = set.finalize_height(11); let mut tx = DBTransaction::new(); - set.prepare_transaction(&mut tx, None, PREFIX); + set.prepare_transaction(&mut tx, 0, PREFIX); db.write(tx).unwrap(); assert!(set.contains(11, 11_1)); @@ -335,7 +335,7 @@ mod tests { assert!(set.contains(12, 12_1)); assert!(!set.contains(10, 10_1)); - let set2 = LeafSet::read_from_db(&db, None, PREFIX).unwrap(); + let set2 = LeafSet::read_from_db(&db, 0, PREFIX).unwrap(); assert_eq!(set, set2); } diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index 777830d5ea..1424845ea6 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" log = "0.4.8" parking_lot = "0.9.0" hash-db = "0.15.2" -trie-db = "0.16.0" +trie-db = "0.18.1" trie-root = "0.15.2" sp-trie = { version = "2.0.0", path = "../trie" } sp-core = { version = "2.0.0", path = "../core" } diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index a4ec923950..78e32e3333 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -15,13 +15,13 @@ harness = false codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } sp-std = { version = "2.0.0", default-features = false, path = "../std" } hash-db = { version = "0.15.2", default-features = false } -trie-db = { version = "0.16.0", default-features = false } +trie-db = { version = "0.18.1", default-features = false } trie-root = { version = "0.15.2", default-features = false } -memory-db = { version = "0.15.2", default-features = false } +memory-db = { version = "0.18.0", default-features = false } sp-core = { version = "2.0.0", default-features = false, path = "../core" } [dev-dependencies] -trie-bench = "0.17.0" +trie-bench = "0.18.0" trie-standardmap = "0.15.2" criterion = "0.2.11" hex-literal = "0.2.1" diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 7d58fe1637..6444c7fcf1 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -16,7 +16,7 @@ frame-executive = { version = "2.0.0", default-features = false, path = "../../f sp-inherents = { version = "2.0.0", default-features = false, path = "../../primitives/inherents" } sp-keyring = { version = "2.0.0", optional = true, path = "../../primitives/keyring" } log = { version = "0.4.8", optional = true } -memory-db = { version = "0.15.2", default-features = false } +memory-db = { version = "0.18.0", default-features = false } sp-offchain = { path = "../../primitives/offchain", default-features = false} sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } @@ -35,7 +35,7 @@ pallet-timestamp = { version = "2.0.0", default-features = false, path = "../../ sc-client = { version = "2.0.0", optional = true, path = "../../client" } sp-trie = { version = "2.0.0", default-features = false, path = "../../primitives/trie" } sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../../primitives/transaction-pool" } -trie-db = { version = "0.16.0", default-features = false } +trie-db = { version = "0.18.1", default-features = false } [dev-dependencies] sc-executor = { version = "2.0.0", path = "../../client/executor" } -- GitLab From 2b1e9ebcd11390b07249346856d7a40e3c99f0de Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 3 Jan 2020 21:47:12 +0100 Subject: [PATCH 047/296] *: Register network event stream for authority discovery (#4344) Previously one would create a sender and receiver channel pair, pass the sender to the `build_network_future` through the service builder and funnel network events returned from polling the network service into the sender to be consumed by the authority discovery module owning the receiver. With recent changes it is now possible to register an `event_stream` with the network service directly, thus one does not need to make the detour through the `build_network_future`. --- bin/node/cli/src/service.rs | 23 +++++++++----------- client/service/src/builder.rs | 40 +---------------------------------- client/service/src/lib.rs | 26 +---------------------- 3 files changed, 12 insertions(+), 77 deletions(-) diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 408f2653ba..063963f7b3 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -113,13 +113,13 @@ macro_rules! new_full_start { /// concrete types instead. macro_rules! new_full { ($config:expr, $with_startup_data: expr) => {{ - use futures01::sync::mpsc; - use sc_network::DhtEvent; + use futures01::Stream; use futures::{ compat::Stream01CompatExt, stream::StreamExt, future::{FutureExt, TryFutureExt}, }; + use sc_network::Event; let ( is_authority, @@ -142,18 +142,10 @@ macro_rules! new_full { let (builder, mut import_setup, inherent_data_providers) = new_full_start!($config); - // Dht event channel from the network to the authority discovery module. Use bounded channel to ensure - // back-pressure. Authority discovery is triggering one event per authority within the current authority set. - // This estimates the authority set size to be somewhere below 10 000 thereby setting the channel buffer size to - // 10 000. - let (dht_event_tx, dht_event_rx) = - mpsc::channel::(10_000); - let service = builder.with_network_protocol(|_| Ok(crate::service::NodeProtocol::new()))? .with_finality_proof_provider(|client, backend| Ok(Arc::new(grandpa::FinalityProofProvider::new(backend, client)) as _) )? - .with_dht_event_tx(dht_event_tx)? .build()?; let (block_import, grandpa_link, babe_link) = import_setup.take() @@ -190,15 +182,20 @@ macro_rules! new_full { let babe = sc_consensus_babe::start_babe(babe_config)?; service.spawn_essential_task(babe); - let future03_dht_event_rx = dht_event_rx.compat() + let network = service.network(); + let dht_event_stream = network.event_stream().filter_map(|e| match e { + Event::Dht(e) => Some(e), + _ => None, + }); + let future03_dht_event_stream = dht_event_stream.compat() .map(|x| x.expect(" never returns an error; qed")) .boxed(); let authority_discovery = sc_authority_discovery::AuthorityDiscovery::new( service.client(), - service.network(), + network, sentry_nodes, service.keystore(), - future03_dht_event_rx, + future03_dht_event_stream, ); let future01_authority_discovery = authority_discovery.map(|x| Ok(x)).compat(); diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 0c50ae3969..e95717ebfa 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -35,7 +35,7 @@ use futures03::{ }; use sc_keystore::{Store as Keystore}; use log::{info, warn, error}; -use sc_network::{FinalityProofProvider, OnDemand, NetworkService, NetworkStateInfo, DhtEvent}; +use sc_network::{FinalityProofProvider, OnDemand, NetworkService, NetworkStateInfo}; use sc_network::{config::BoxFinalityProofRequestBuilder, specialization::NetworkSpecialization}; use parking_lot::{Mutex, RwLock}; use sp_core::{Blake2Hasher, H256, Hasher}; @@ -90,7 +90,6 @@ pub struct ServiceBuilder, rpc_extensions: TRpc, remote_backend: Option>>, - dht_event_tx: Option>, marker: PhantomData<(TBl, TRtApi)>, } @@ -225,7 +224,6 @@ where TGen: RuntimeGenesis, TCSExt: Extension { transaction_pool: Arc::new(()), rpc_extensions: Default::default(), remote_backend: None, - dht_event_tx: None, marker: PhantomData, }) } @@ -303,7 +301,6 @@ where TGen: RuntimeGenesis, TCSExt: Extension { transaction_pool: Arc::new(()), rpc_extensions: Default::default(), remote_backend: Some(remote_blockchain), - dht_event_tx: None, marker: PhantomData, }) } @@ -352,7 +349,6 @@ impl, - ) -> Result, Error> { - Ok(ServiceBuilder { - config: self.config, - client: self.client, - backend: self.backend, - keystore: self.keystore, - fetcher: self.fetcher, - select_chain: self.select_chain, - import_queue: self.import_queue, - finality_proof_request_builder: self.finality_proof_request_builder, - finality_proof_provider: self.finality_proof_provider, - network_protocol: self.network_protocol, - transaction_pool: self.transaction_pool, - rpc_extensions: self.rpc_extensions, - remote_backend: self.remote_backend, - dht_event_tx: Some(dht_event_tx), marker: self.marker, }) } @@ -761,7 +725,6 @@ ServiceBuilder< transaction_pool, rpc_extensions, remote_backend, - dht_event_tx, } = self; sp_session::generate_initial_session_keys( @@ -1051,7 +1014,6 @@ ServiceBuilder< network_status_sinks.clone(), system_rpc_rx, has_bootnodes, - dht_event_tx, ) .map_err(|_| ()) .select(exit.clone().map(Ok).compat()) diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index e383703da7..a22a578f2f 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -44,7 +44,7 @@ use futures03::{ }; use sc_network::{ NetworkService, NetworkState, specialization::NetworkSpecialization, - Event, DhtEvent, PeerId, ReportHandle, + PeerId, ReportHandle, }; use log::{log, warn, debug, error, Level}; use codec::{Encode, Decode}; @@ -375,7 +375,6 @@ fn build_network_future< status_sinks: Arc, NetworkState)>>>, rpc_rx: futures03::channel::mpsc::UnboundedReceiver>, should_have_peers: bool, - dht_event_tx: Option>, ) -> impl Future { // Compatibility shim while we're transitioning to stable Futures. // See https://github.com/paritytech/substrate/issues/3099 @@ -386,9 +385,6 @@ fn build_network_future< let mut finality_notification_stream = client.finality_notification_stream().fuse() .map(|v| Ok::<_, ()>(v)).compat(); - // Initializing a stream in order to obtain DHT events from the network. - let mut event_stream = network.service().event_stream(); - futures::future::poll_fn(move || { let before_polling = Instant::now(); @@ -481,26 +477,6 @@ fn build_network_future< (status, state) }); - // Processing DHT events. - while let Ok(Async::Ready(Some(event))) = event_stream.poll() { - match event { - Event::Dht(event) => { - // Given that client/authority-discovery is the only upper stack consumer of Dht events at the moment, all Dht - // events are being passed on to the authority-discovery module. In the future there might be multiple - // consumers of these events. In that case this would need to be refactored to properly dispatch the events, - // e.g. via a subscriber model. - if let Some(Err(e)) = dht_event_tx.as_ref().map(|c| c.clone().try_send(event)) { - if e.is_full() { - warn!(target: "service", "Dht event channel to authority discovery is full, dropping event."); - } else if e.is_disconnected() { - warn!(target: "service", "Dht event channel to authority discovery is disconnected, dropping event."); - } - } - } - _ => {} - } - } - // Main network polling. if let Ok(Async::Ready(())) = network.poll().map_err(|err| { warn!(target: "service", "Error in network: {:?}", err); -- GitLab From d98ffbf39122b27c5872e4f2f5f71ec695717c01 Mon Sep 17 00:00:00 2001 From: Denis Pisarev Date: Fri, 3 Jan 2020 21:51:26 +0100 Subject: [PATCH 048/296] check_polkadot now runs nightly and on master (merges) only (#4492) --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0eb7c38c27..05834f11d1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -346,11 +346,14 @@ check_warnings: fi allow_failure: true -# Check whether Polkadot 'master' branch builds using this Substrate commit. +# Nightly check whether Polkadot 'master' branch builds. check_polkadot: stage: build <<: *docker-env allow_failure: true + only: + - master + - schedules script: - SUBSTRATE_PATH=$(pwd) # Clone the current Polkadot master branch into ./polkadot. -- GitLab From 64431f6488d819efd7566c57086993d9aa4d1f19 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sat, 4 Jan 2020 16:34:53 +0300 Subject: [PATCH 049/296] fix expect text (#4530) --- primitives/io/src/lib.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index be88907cde..8763a122df 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -590,7 +590,7 @@ pub trait Offchain { /// offchain worker tasks running on the same machine. It IS persisted between runs. fn local_storage_set(&mut self, kind: StorageKind, key: &[u8], value: &[u8]) { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("local_storage_set can be called only in the offchain worker context") .local_storage_set(kind, key, value) } @@ -611,7 +611,7 @@ pub trait Offchain { new_value: &[u8], ) -> bool { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("local_storage_compare_and_set can be called only in the offchain worker context") .local_storage_compare_and_set(kind, key, old_value.as_ref().map(|v| v.deref()), new_value) } @@ -622,7 +622,7 @@ pub trait Offchain { /// offchain worker tasks running on the same machine. It IS persisted between runs. fn local_storage_get(&mut self, kind: StorageKind, key: &[u8]) -> Option> { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("local_storage_get can be called only in the offchain worker context") .local_storage_get(kind, key) } @@ -637,7 +637,7 @@ pub trait Offchain { meta: &[u8], ) -> Result { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("http_request_start can be called only in the offchain worker context") .http_request_start(method, uri, meta) } @@ -649,7 +649,7 @@ pub trait Offchain { value: &str, ) -> Result<(), ()> { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("http_request_add_header can be called only in the offchain worker context") .http_request_add_header(request_id, name, value) } @@ -666,7 +666,7 @@ pub trait Offchain { deadline: Option, ) -> Result<(), HttpError> { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("http_request_write_body can be called only in the offchain worker context") .http_request_write_body(request_id, chunk, deadline) } @@ -683,7 +683,7 @@ pub trait Offchain { deadline: Option, ) -> Vec { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("http_response_wait can be called only in the offchain worker context") .http_response_wait(ids, deadline) } @@ -693,7 +693,7 @@ pub trait Offchain { /// NOTE response headers have to be read before response body. fn http_response_headers(&mut self, request_id: HttpRequestId) -> Vec<(Vec, Vec)> { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("http_response_headers can be called only in the offchain worker context") .http_response_headers(request_id) } @@ -712,7 +712,7 @@ pub trait Offchain { deadline: Option, ) -> Result { self.extension::() - .expect("random_seed can be called only in the offchain worker context") + .expect("http_response_read_body can be called only in the offchain worker context") .http_response_read_body(request_id, buffer, deadline) .map(|r| r as u32) } -- GitLab From 6e0a4877afbe2309e106b84333bb70200531b604 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Sun, 5 Jan 2020 14:05:44 +0100 Subject: [PATCH 050/296] Update copyright year (#4532) --- bin/node-template/runtime/build.rs | 2 +- bin/node/cli/bin/main.rs | 2 +- bin/node/cli/browser-demo/ws.js | 2 +- bin/node/cli/build.rs | 2 +- bin/node/cli/src/browser.rs | 2 +- bin/node/cli/src/chain_spec.rs | 2 +- bin/node/cli/src/cli.rs | 2 +- bin/node/cli/src/factory_impl.rs | 2 +- bin/node/cli/src/lib.rs | 2 +- bin/node/cli/src/service.rs | 2 +- bin/node/executor/benches/bench.rs | 2 +- bin/node/executor/src/lib.rs | 2 +- bin/node/primitives/src/lib.rs | 2 +- bin/node/rpc-client/src/main.rs | 2 +- bin/node/rpc/src/lib.rs | 2 +- bin/node/runtime/build.rs | 2 +- bin/node/runtime/src/constants.rs | 2 +- bin/node/runtime/src/impls.rs | 2 +- bin/node/runtime/src/lib.rs | 2 +- bin/node/testing/src/client.rs | 2 +- bin/node/testing/src/genesis.rs | 2 +- bin/node/testing/src/keyring.rs | 2 +- bin/node/testing/src/lib.rs | 2 +- bin/node/transaction-factory/src/complex_mode.rs | 2 +- bin/node/transaction-factory/src/lib.rs | 2 +- bin/node/transaction-factory/src/modes.rs | 2 +- bin/node/transaction-factory/src/simple_modes.rs | 2 +- bin/utils/chain-spec-builder/build.rs | 2 +- bin/utils/chain-spec-builder/src/main.rs | 2 +- bin/utils/subkey/src/main.rs | 2 +- bin/utils/subkey/src/rpc.rs | 2 +- bin/utils/subkey/src/vanity.rs | 2 +- client/api/src/backend.rs | 2 +- client/api/src/call_executor.rs | 2 +- client/api/src/client.rs | 2 +- client/api/src/execution_extensions.rs | 2 +- client/api/src/lib.rs | 2 +- client/api/src/light.rs | 2 +- client/api/src/notifications.rs | 2 +- client/authority-discovery/src/addr_cache.rs | 2 +- client/authority-discovery/src/error.rs | 2 +- client/authority-discovery/src/lib.rs | 2 +- client/authority-discovery/src/tests.rs | 2 +- client/basic-authorship/src/basic_authorship.rs | 2 +- client/basic-authorship/src/lib.rs | 2 +- client/block-builder/src/lib.rs | 2 +- client/chain-spec/derive/src/impls.rs | 2 +- client/chain-spec/derive/src/lib.rs | 2 +- client/chain-spec/src/chain_spec.rs | 2 +- client/chain-spec/src/extension.rs | 2 +- client/chain-spec/src/lib.rs | 2 +- client/cli/src/error.rs | 2 +- client/cli/src/execution_strategy.rs | 2 +- client/cli/src/informant.rs | 2 +- client/cli/src/informant/display.rs | 2 +- client/cli/src/lib.rs | 2 +- client/cli/src/params.rs | 2 +- client/cli/src/traits.rs | 2 +- client/consensus/aura/src/digest.rs | 2 +- client/consensus/aura/src/lib.rs | 2 +- client/consensus/babe/src/authorship.rs | 2 +- client/consensus/babe/src/aux_schema.rs | 2 +- client/consensus/babe/src/epoch_changes.rs | 2 +- client/consensus/babe/src/lib.rs | 2 +- client/consensus/babe/src/tests.rs | 2 +- client/consensus/babe/src/verification.rs | 2 +- client/consensus/pow/src/lib.rs | 2 +- client/consensus/slots/build.rs | 2 +- client/consensus/slots/src/aux_schema.rs | 2 +- client/consensus/slots/src/lib.rs | 2 +- client/consensus/slots/src/slots.rs | 2 +- client/consensus/uncles/src/lib.rs | 2 +- client/db/src/cache/list_cache.rs | 2 +- client/db/src/cache/list_entry.rs | 2 +- client/db/src/cache/list_storage.rs | 2 +- client/db/src/cache/mod.rs | 2 +- client/db/src/children.rs | 2 +- client/db/src/lib.rs | 2 +- client/db/src/light.rs | 2 +- client/db/src/offchain.rs | 2 +- client/db/src/storage_cache.rs | 2 +- client/db/src/utils.rs | 2 +- client/executor/common/src/allocator.rs | 2 +- client/executor/common/src/error.rs | 2 +- client/executor/common/src/lib.rs | 2 +- client/executor/common/src/sandbox.rs | 2 +- client/executor/common/src/wasm_runtime.rs | 2 +- client/executor/runtime-test/build.rs | 2 +- client/executor/src/deprecated_host_interface.rs | 2 +- client/executor/src/integration_tests/mod.rs | 2 +- client/executor/src/integration_tests/sandbox.rs | 2 +- client/executor/src/lib.rs | 2 +- client/executor/src/native_executor.rs | 2 +- client/executor/src/wasm_runtime.rs | 2 +- client/executor/src/wasm_utils.rs | 2 +- client/executor/wasmi/src/lib.rs | 2 +- client/executor/wasmtime/src/function_executor.rs | 2 +- client/executor/wasmtime/src/lib.rs | 2 +- client/executor/wasmtime/src/runtime.rs | 2 +- client/executor/wasmtime/src/trampoline.rs | 2 +- client/executor/wasmtime/src/util.rs | 2 +- client/finality-grandpa/src/authorities.rs | 2 +- client/finality-grandpa/src/aux_schema.rs | 2 +- client/finality-grandpa/src/communication/gossip.rs | 2 +- client/finality-grandpa/src/communication/mod.rs | 2 +- client/finality-grandpa/src/communication/periodic.rs | 2 +- client/finality-grandpa/src/communication/tests.rs | 2 +- client/finality-grandpa/src/consensus_changes.rs | 2 +- client/finality-grandpa/src/environment.rs | 2 +- client/finality-grandpa/src/finality_proof.rs | 2 +- client/finality-grandpa/src/import.rs | 2 +- client/finality-grandpa/src/justification.rs | 2 +- client/finality-grandpa/src/lib.rs | 2 +- client/finality-grandpa/src/light_import.rs | 2 +- client/finality-grandpa/src/observer.rs | 2 +- client/finality-grandpa/src/tests.rs | 2 +- client/finality-grandpa/src/until_imported.rs | 2 +- client/finality-grandpa/src/voting_rule.rs | 2 +- client/keystore/src/lib.rs | 2 +- client/network-gossip/src/bridge.rs | 2 +- client/network-gossip/src/lib.rs | 2 +- client/network-gossip/src/state_machine.rs | 2 +- client/network/src/behaviour.rs | 2 +- client/network/src/chain.rs | 2 +- client/network/src/config.rs | 2 +- client/network/src/debug_info.rs | 2 +- client/network/src/discovery.rs | 2 +- client/network/src/error.rs | 2 +- client/network/src/lib.rs | 2 +- client/network/src/on_demand_layer.rs | 2 +- client/network/src/protocol.rs | 2 +- client/network/src/protocol/event.rs | 2 +- client/network/src/protocol/legacy_proto.rs | 2 +- client/network/src/protocol/legacy_proto/behaviour.rs | 2 +- client/network/src/protocol/legacy_proto/handler.rs | 2 +- client/network/src/protocol/legacy_proto/tests.rs | 2 +- client/network/src/protocol/legacy_proto/upgrade.rs | 2 +- client/network/src/protocol/light_dispatch.rs | 2 +- client/network/src/protocol/message.rs | 2 +- client/network/src/protocol/specialization.rs | 2 +- client/network/src/protocol/sync.rs | 2 +- client/network/src/protocol/sync/blocks.rs | 2 +- client/network/src/protocol/sync/extra_requests.rs | 2 +- client/network/src/protocol/util.rs | 2 +- client/network/src/service.rs | 2 +- client/network/src/transport.rs | 2 +- client/network/src/utils.rs | 2 +- client/network/test/src/block_import.rs | 2 +- client/network/test/src/lib.rs | 2 +- client/network/test/src/sync.rs | 2 +- client/offchain/src/api.rs | 2 +- client/offchain/src/api/http.rs | 2 +- client/offchain/src/api/http_dummy.rs | 2 +- client/offchain/src/api/timestamp.rs | 2 +- client/offchain/src/lib.rs | 2 +- client/peerset/src/lib.rs | 2 +- client/peerset/src/peersstate.rs | 2 +- client/peerset/tests/fuzz.rs | 2 +- client/rpc-api/src/author/error.rs | 2 +- client/rpc-api/src/author/hash.rs | 2 +- client/rpc-api/src/author/mod.rs | 2 +- client/rpc-api/src/chain/error.rs | 2 +- client/rpc-api/src/chain/mod.rs | 2 +- client/rpc-api/src/errors.rs | 2 +- client/rpc-api/src/helpers.rs | 2 +- client/rpc-api/src/lib.rs | 2 +- client/rpc-api/src/state/error.rs | 2 +- client/rpc-api/src/state/mod.rs | 2 +- client/rpc-api/src/subscriptions.rs | 2 +- client/rpc-api/src/system/error.rs | 2 +- client/rpc-api/src/system/helpers.rs | 2 +- client/rpc-api/src/system/mod.rs | 2 +- client/rpc-servers/src/lib.rs | 2 +- client/rpc/src/author/mod.rs | 2 +- client/rpc/src/author/tests.rs | 2 +- client/rpc/src/chain/chain_full.rs | 2 +- client/rpc/src/chain/chain_light.rs | 2 +- client/rpc/src/chain/mod.rs | 2 +- client/rpc/src/chain/tests.rs | 2 +- client/rpc/src/lib.rs | 2 +- client/rpc/src/metadata.rs | 2 +- client/rpc/src/state/mod.rs | 2 +- client/rpc/src/state/state_full.rs | 2 +- client/rpc/src/state/state_light.rs | 2 +- client/rpc/src/state/tests.rs | 2 +- client/rpc/src/system/mod.rs | 2 +- client/rpc/src/system/tests.rs | 2 +- client/service/src/builder.rs | 2 +- client/service/src/chain_ops.rs | 2 +- client/service/src/config.rs | 2 +- client/service/src/error.rs | 2 +- client/service/src/lib.rs | 2 +- client/service/src/status_sinks.rs | 2 +- client/service/test/src/lib.rs | 2 +- client/src/call_executor.rs | 2 +- client/src/cht.rs | 2 +- client/src/client.rs | 2 +- client/src/genesis.rs | 2 +- client/src/in_mem.rs | 2 +- client/src/leaves.rs | 2 +- client/src/lib.rs | 2 +- client/src/light/backend.rs | 2 +- client/src/light/blockchain.rs | 2 +- client/src/light/call_executor.rs | 2 +- client/src/light/fetcher.rs | 2 +- client/src/light/mod.rs | 2 +- client/state-db/src/lib.rs | 2 +- client/state-db/src/noncanonical.rs | 2 +- client/state-db/src/pruning.rs | 2 +- client/state-db/src/test.rs | 2 +- client/telemetry/src/lib.rs | 2 +- client/telemetry/src/worker.rs | 2 +- client/telemetry/src/worker/node.rs | 2 +- client/tracing/src/lib.rs | 2 +- client/transaction-pool/graph/benches/basics.rs | 2 +- client/transaction-pool/graph/src/base_pool.rs | 2 +- client/transaction-pool/graph/src/error.rs | 2 +- client/transaction-pool/graph/src/future.rs | 2 +- client/transaction-pool/graph/src/lib.rs | 2 +- client/transaction-pool/graph/src/listener.rs | 2 +- client/transaction-pool/graph/src/pool.rs | 2 +- client/transaction-pool/graph/src/ready.rs | 2 +- client/transaction-pool/graph/src/rotator.rs | 2 +- client/transaction-pool/graph/src/validated_pool.rs | 2 +- client/transaction-pool/graph/src/watcher.rs | 2 +- client/transaction-pool/src/api.rs | 2 +- client/transaction-pool/src/error.rs | 2 +- client/transaction-pool/src/lib.rs | 2 +- client/transaction-pool/src/maintainer.rs | 2 +- client/transaction-pool/src/tests.rs | 2 +- docs/license_header.txt | 2 +- frame/assets/src/lib.rs | 2 +- frame/aura/src/lib.rs | 2 +- frame/aura/src/mock.rs | 2 +- frame/aura/src/tests.rs | 2 +- frame/authority-discovery/src/lib.rs | 2 +- frame/authorship/src/lib.rs | 2 +- frame/babe/src/lib.rs | 2 +- frame/babe/src/mock.rs | 2 +- frame/babe/src/tests.rs | 2 +- frame/balances/src/lib.rs | 2 +- frame/balances/src/mock.rs | 2 +- frame/balances/src/tests.rs | 2 +- frame/collective/src/lib.rs | 2 +- frame/contracts/rpc/runtime-api/src/lib.rs | 2 +- frame/contracts/rpc/src/lib.rs | 2 +- frame/contracts/src/account_db.rs | 2 +- frame/contracts/src/exec.rs | 2 +- frame/contracts/src/gas.rs | 2 +- frame/contracts/src/lib.rs | 2 +- frame/contracts/src/rent.rs | 2 +- frame/contracts/src/tests.rs | 2 +- frame/contracts/src/wasm/code_cache.rs | 2 +- frame/contracts/src/wasm/env_def/macros.rs | 2 +- frame/contracts/src/wasm/env_def/mod.rs | 2 +- frame/contracts/src/wasm/mod.rs | 2 +- frame/contracts/src/wasm/prepare.rs | 2 +- frame/contracts/src/wasm/runtime.rs | 2 +- frame/democracy/src/lib.rs | 2 +- frame/democracy/src/vote_threshold.rs | 2 +- frame/elections-phragmen/src/lib.rs | 2 +- frame/elections/src/lib.rs | 2 +- frame/elections/src/mock.rs | 2 +- frame/elections/src/tests.rs | 2 +- frame/evm/src/lib.rs | 2 +- frame/example/src/lib.rs | 2 +- frame/executive/src/lib.rs | 2 +- frame/finality-tracker/src/lib.rs | 2 +- frame/generic-asset/src/lib.rs | 2 +- frame/generic-asset/src/mock.rs | 2 +- frame/generic-asset/src/tests.rs | 2 +- frame/grandpa/src/lib.rs | 2 +- frame/grandpa/src/mock.rs | 2 +- frame/grandpa/src/tests.rs | 2 +- frame/identity/src/lib.rs | 2 +- frame/im-online/src/lib.rs | 2 +- frame/im-online/src/mock.rs | 2 +- frame/im-online/src/tests.rs | 2 +- frame/indices/src/address.rs | 2 +- frame/indices/src/lib.rs | 2 +- frame/indices/src/mock.rs | 2 +- frame/indices/src/tests.rs | 2 +- frame/membership/src/lib.rs | 2 +- frame/metadata/src/lib.rs | 2 +- frame/nicks/src/lib.rs | 2 +- frame/offences/src/lib.rs | 2 +- frame/offences/src/mock.rs | 2 +- frame/offences/src/tests.rs | 2 +- frame/randomness-collective-flip/src/lib.rs | 2 +- frame/scored-pool/src/lib.rs | 2 +- frame/scored-pool/src/mock.rs | 2 +- frame/scored-pool/src/tests.rs | 2 +- frame/session/src/historical.rs | 2 +- frame/session/src/lib.rs | 2 +- frame/session/src/mock.rs | 2 +- frame/staking/reward-curve/tests/test.rs | 2 +- frame/staking/src/inflation.rs | 2 +- frame/staking/src/lib.rs | 2 +- frame/staking/src/migration.rs | 2 +- frame/staking/src/mock.rs | 2 +- frame/staking/src/slashing.rs | 2 +- frame/staking/src/tests.rs | 2 +- frame/sudo/src/lib.rs | 2 +- frame/support/procedural/src/construct_runtime/mod.rs | 2 +- frame/support/procedural/src/construct_runtime/parse.rs | 2 +- frame/support/procedural/src/lib.rs | 2 +- .../procedural/src/storage/genesis_config/builder_def.rs | 2 +- .../procedural/src/storage/genesis_config/genesis_config_def.rs | 2 +- frame/support/procedural/src/storage/genesis_config/mod.rs | 2 +- frame/support/procedural/src/storage/getters.rs | 2 +- frame/support/procedural/src/storage/instance_trait.rs | 2 +- frame/support/procedural/src/storage/metadata.rs | 2 +- frame/support/procedural/src/storage/mod.rs | 2 +- frame/support/procedural/src/storage/parse.rs | 2 +- frame/support/procedural/src/storage/storage_struct.rs | 2 +- frame/support/procedural/src/storage/store_trait.rs | 2 +- frame/support/procedural/tools/derive/src/lib.rs | 2 +- frame/support/procedural/tools/src/lib.rs | 2 +- frame/support/procedural/tools/src/syn_ext.rs | 2 +- frame/support/src/debug.rs | 2 +- frame/support/src/dispatch.rs | 2 +- frame/support/src/error.rs | 2 +- frame/support/src/event.rs | 2 +- frame/support/src/hash.rs | 2 +- frame/support/src/inherent.rs | 2 +- frame/support/src/lib.rs | 2 +- frame/support/src/metadata.rs | 2 +- frame/support/src/origin.rs | 2 +- frame/support/src/storage/child.rs | 2 +- frame/support/src/storage/generator/double_map.rs | 2 +- frame/support/src/storage/generator/linked_map.rs | 2 +- frame/support/src/storage/generator/map.rs | 2 +- frame/support/src/storage/generator/mod.rs | 2 +- frame/support/src/storage/generator/value.rs | 2 +- frame/support/src/storage/hashed.rs | 2 +- frame/support/src/storage/mod.rs | 2 +- frame/support/src/storage/unhashed.rs | 2 +- frame/support/src/traits.rs | 2 +- frame/support/src/unsigned.rs | 2 +- frame/support/src/weights.rs | 2 +- frame/support/test/src/lib.rs | 2 +- frame/support/test/tests/decl_error.rs | 2 +- frame/support/test/tests/decl_storage.rs | 2 +- frame/support/test/tests/decl_storage_ui.rs | 2 +- frame/support/test/tests/decl_storage_ui/config_duplicate.rs | 2 +- .../support/test/tests/decl_storage_ui/config_get_duplicate.rs | 2 +- frame/support/test/tests/decl_storage_ui/get_duplicate.rs | 2 +- frame/support/test/tests/final_keys.rs | 2 +- frame/support/test/tests/genesisconfig.rs | 2 +- frame/support/test/tests/instance.rs | 2 +- frame/support/test/tests/issue2219.rs | 2 +- frame/support/test/tests/reserved_keyword.rs | 2 +- frame/support/test/tests/system.rs | 2 +- frame/system/benches/bench.rs | 2 +- frame/system/rpc/runtime-api/src/lib.rs | 2 +- frame/system/src/lib.rs | 2 +- frame/system/src/offchain.rs | 2 +- frame/timestamp/src/lib.rs | 2 +- frame/transaction-payment/rpc/runtime-api/src/lib.rs | 2 +- frame/transaction-payment/rpc/src/lib.rs | 2 +- frame/transaction-payment/src/lib.rs | 2 +- frame/treasury/src/lib.rs | 2 +- frame/utility/src/lib.rs | 2 +- primitives/api/proc-macro/src/decl_runtime_apis.rs | 2 +- primitives/api/proc-macro/src/impl_runtime_apis.rs | 2 +- primitives/api/proc-macro/src/lib.rs | 2 +- primitives/api/proc-macro/src/utils.rs | 2 +- primitives/api/src/lib.rs | 2 +- primitives/api/test/benches/bench.rs | 2 +- primitives/api/test/tests/decl_and_impl.rs | 2 +- primitives/api/test/tests/runtime_calls.rs | 2 +- primitives/api/test/tests/trybuild.rs | 2 +- primitives/application-crypto/src/ed25519.rs | 2 +- primitives/application-crypto/src/lib.rs | 2 +- primitives/application-crypto/src/sr25519.rs | 2 +- primitives/application-crypto/src/traits.rs | 2 +- primitives/application-crypto/test/src/ed25519.rs | 2 +- primitives/application-crypto/test/src/lib.rs | 2 +- primitives/application-crypto/test/src/sr25519.rs | 2 +- primitives/arithmetic/benches/bench.rs | 2 +- primitives/arithmetic/fuzzer/src/biguint.rs | 2 +- primitives/arithmetic/fuzzer/src/rational128.rs | 2 +- primitives/arithmetic/src/biguint.rs | 2 +- primitives/arithmetic/src/fixed64.rs | 2 +- primitives/arithmetic/src/helpers_128bit.rs | 2 +- primitives/arithmetic/src/lib.rs | 2 +- primitives/arithmetic/src/per_things.rs | 2 +- primitives/arithmetic/src/rational128.rs | 2 +- primitives/arithmetic/src/traits.rs | 2 +- primitives/authority-discovery/src/lib.rs | 2 +- primitives/authorship/src/lib.rs | 2 +- primitives/block-builder/src/lib.rs | 2 +- primitives/blockchain/src/backend.rs | 2 +- primitives/blockchain/src/error.rs | 2 +- primitives/blockchain/src/header_metadata.rs | 2 +- primitives/blockchain/src/lib.rs | 2 +- primitives/consensus/aura/src/inherents.rs | 2 +- primitives/consensus/aura/src/lib.rs | 2 +- primitives/consensus/babe/src/digest.rs | 2 +- primitives/consensus/babe/src/inherents.rs | 2 +- primitives/consensus/babe/src/lib.rs | 2 +- primitives/consensus/common/src/block_import.rs | 2 +- primitives/consensus/common/src/block_validation.rs | 2 +- primitives/consensus/common/src/error.rs | 2 +- primitives/consensus/common/src/evaluation.rs | 2 +- primitives/consensus/common/src/import_queue.rs | 2 +- primitives/consensus/common/src/import_queue/basic_queue.rs | 2 +- primitives/consensus/common/src/import_queue/buffered_link.rs | 2 +- primitives/consensus/common/src/lib.rs | 2 +- primitives/consensus/common/src/offline_tracker.rs | 2 +- primitives/consensus/common/src/select_chain.rs | 2 +- primitives/consensus/pow/src/lib.rs | 2 +- primitives/core/benches/bench.rs | 2 +- primitives/core/src/changes_trie.rs | 2 +- primitives/core/src/crypto.rs | 2 +- primitives/core/src/ecdsa.rs | 2 +- primitives/core/src/ed25519.rs | 2 +- primitives/core/src/hash.rs | 2 +- primitives/core/src/hasher.rs | 2 +- primitives/core/src/hashing.rs | 2 +- primitives/core/src/hexdisplay.rs | 2 +- primitives/core/src/lib.rs | 2 +- primitives/core/src/offchain/mod.rs | 2 +- primitives/core/src/offchain/storage.rs | 2 +- primitives/core/src/offchain/testing.rs | 2 +- primitives/core/src/sandbox.rs | 2 +- primitives/core/src/sr25519.rs | 2 +- primitives/core/src/testing.rs | 2 +- primitives/core/src/tests.rs | 2 +- primitives/core/src/traits.rs | 2 +- primitives/core/src/u32_trait.rs | 2 +- primitives/core/src/uint.rs | 2 +- primitives/debug-derive/src/impls.rs | 2 +- primitives/debug-derive/src/lib.rs | 2 +- primitives/debug-derive/tests/tests.rs | 2 +- primitives/externalities/src/extensions.rs | 2 +- primitives/externalities/src/lib.rs | 2 +- primitives/externalities/src/scope_limited.rs | 2 +- primitives/finality-grandpa/src/lib.rs | 2 +- primitives/finality-tracker/src/lib.rs | 2 +- primitives/inherents/src/lib.rs | 2 +- primitives/io/src/lib.rs | 2 +- primitives/keyring/src/ed25519.rs | 2 +- primitives/keyring/src/lib.rs | 2 +- primitives/keyring/src/sr25519.rs | 2 +- primitives/offchain/src/lib.rs | 2 +- primitives/panic-handler/src/lib.rs | 2 +- primitives/phragmen/benches/phragmen.rs | 2 +- primitives/phragmen/src/lib.rs | 2 +- primitives/phragmen/src/mock.rs | 2 +- primitives/phragmen/src/tests.rs | 2 +- primitives/rpc/src/lib.rs | 2 +- primitives/rpc/src/list.rs | 2 +- primitives/rpc/src/number.rs | 2 +- primitives/runtime-interface/proc-macro/src/lib.rs | 2 +- primitives/runtime-interface/proc-macro/src/pass_by/codec.rs | 2 +- primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs | 2 +- primitives/runtime-interface/proc-macro/src/pass_by/inner.rs | 2 +- primitives/runtime-interface/proc-macro/src/pass_by/mod.rs | 2 +- .../proc-macro/src/runtime_interface/bare_function_interface.rs | 2 +- .../proc-macro/src/runtime_interface/host_function_interface.rs | 2 +- .../runtime-interface/proc-macro/src/runtime_interface/mod.rs | 2 +- .../proc-macro/src/runtime_interface/trait_decl_impl.rs | 2 +- primitives/runtime-interface/proc-macro/src/utils.rs | 2 +- primitives/runtime-interface/src/host.rs | 2 +- primitives/runtime-interface/src/impls.rs | 2 +- primitives/runtime-interface/src/lib.rs | 2 +- primitives/runtime-interface/src/pass_by.rs | 2 +- primitives/runtime-interface/src/util.rs | 2 +- primitives/runtime-interface/src/wasm.rs | 2 +- primitives/runtime-interface/test-wasm/build.rs | 2 +- primitives/runtime-interface/test-wasm/src/lib.rs | 2 +- primitives/runtime-interface/test/src/lib.rs | 2 +- primitives/runtime-interface/tests/ui.rs | 2 +- primitives/runtime/src/curve.rs | 2 +- primitives/runtime/src/generic/block.rs | 2 +- primitives/runtime/src/generic/checked_extrinsic.rs | 2 +- primitives/runtime/src/generic/digest.rs | 2 +- primitives/runtime/src/generic/era.rs | 2 +- primitives/runtime/src/generic/header.rs | 2 +- primitives/runtime/src/generic/mod.rs | 2 +- primitives/runtime/src/generic/tests.rs | 2 +- primitives/runtime/src/generic/unchecked_extrinsic.rs | 2 +- primitives/runtime/src/lib.rs | 2 +- primitives/runtime/src/offchain/http.rs | 2 +- primitives/runtime/src/offchain/mod.rs | 2 +- primitives/runtime/src/random_number_generator.rs | 2 +- primitives/runtime/src/testing.rs | 2 +- primitives/runtime/src/traits.rs | 2 +- primitives/runtime/src/transaction_validity.rs | 2 +- primitives/sandbox/src/lib.rs | 2 +- primitives/sandbox/with_std.rs | 2 +- primitives/sandbox/without_std.rs | 2 +- primitives/serializer/src/lib.rs | 2 +- primitives/session/src/lib.rs | 2 +- primitives/staking/src/lib.rs | 2 +- primitives/staking/src/offence.rs | 2 +- primitives/state-machine/src/backend.rs | 2 +- primitives/state-machine/src/basic.rs | 2 +- primitives/state-machine/src/changes_trie/build.rs | 2 +- primitives/state-machine/src/changes_trie/build_cache.rs | 2 +- primitives/state-machine/src/changes_trie/build_iterator.rs | 2 +- primitives/state-machine/src/changes_trie/changes_iterator.rs | 2 +- primitives/state-machine/src/changes_trie/input.rs | 2 +- primitives/state-machine/src/changes_trie/mod.rs | 2 +- primitives/state-machine/src/changes_trie/prune.rs | 2 +- primitives/state-machine/src/changes_trie/storage.rs | 2 +- primitives/state-machine/src/changes_trie/surface_iterator.rs | 2 +- primitives/state-machine/src/error.rs | 2 +- primitives/state-machine/src/ext.rs | 2 +- primitives/state-machine/src/lib.rs | 2 +- primitives/state-machine/src/overlayed_changes.rs | 2 +- primitives/state-machine/src/proving_backend.rs | 2 +- primitives/state-machine/src/testing.rs | 2 +- primitives/state-machine/src/trie_backend.rs | 2 +- primitives/state-machine/src/trie_backend_essence.rs | 2 +- primitives/std/src/lib.rs | 2 +- primitives/std/with_std.rs | 2 +- primitives/std/without_std.rs | 2 +- primitives/storage/src/lib.rs | 2 +- primitives/test-primitives/src/lib.rs | 2 +- primitives/timestamp/src/lib.rs | 2 +- primitives/transaction-pool/src/error.rs | 2 +- primitives/transaction-pool/src/lib.rs | 2 +- primitives/transaction-pool/src/pool.rs | 2 +- primitives/transaction-pool/src/runtime_api.rs | 2 +- primitives/trie/benches/bench.rs | 2 +- primitives/trie/src/error.rs | 2 +- primitives/trie/src/lib.rs | 2 +- primitives/trie/src/node_codec.rs | 2 +- primitives/trie/src/node_header.rs | 2 +- primitives/trie/src/trie_stream.rs | 2 +- primitives/version/src/lib.rs | 2 +- primitives/wasm-interface/src/lib.rs | 2 +- primitives/wasm-interface/src/wasmi_impl.rs | 2 +- test-utils/client/src/client_ext.rs | 2 +- test-utils/client/src/lib.rs | 2 +- test-utils/runtime/build.rs | 2 +- test-utils/runtime/client/src/block_builder_ext.rs | 2 +- test-utils/runtime/client/src/lib.rs | 2 +- test-utils/runtime/client/src/trait_tests.rs | 2 +- test-utils/runtime/src/genesismap.rs | 2 +- test-utils/runtime/src/lib.rs | 2 +- test-utils/runtime/src/system.rs | 2 +- test-utils/src/lib.rs | 2 +- utils/build-script-utils/src/lib.rs | 2 +- utils/fork-tree/src/lib.rs | 2 +- utils/frame/rpc/support/src/lib.rs | 2 +- utils/frame/rpc/system/src/lib.rs | 2 +- utils/grafana-data-source/src/database.rs | 2 +- utils/grafana-data-source/src/lib.rs | 2 +- utils/grafana-data-source/src/networking.rs | 2 +- utils/grafana-data-source/src/server.rs | 2 +- utils/grafana-data-source/src/types.rs | 2 +- utils/grafana-data-source/test/src/main.rs | 2 +- utils/wasm-builder-runner/src/lib.rs | 2 +- utils/wasm-builder/src/lib.rs | 2 +- utils/wasm-builder/src/prerequisites.rs | 2 +- utils/wasm-builder/src/wasm_project.rs | 2 +- 559 files changed, 559 insertions(+), 559 deletions(-) diff --git a/bin/node-template/runtime/build.rs b/bin/node-template/runtime/build.rs index c5e798c6ef..ed0e28ec0d 100644 --- a/bin/node-template/runtime/build.rs +++ b/bin/node-template/runtime/build.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/bin/main.rs b/bin/node/cli/bin/main.rs index 338fbd081e..c766f3945c 100644 --- a/bin/node/cli/bin/main.rs +++ b/bin/node/cli/bin/main.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/browser-demo/ws.js b/bin/node/cli/browser-demo/ws.js index fa7a499a8a..6da0c56427 100644 --- a/bin/node/cli/browser-demo/ws.js +++ b/bin/node/cli/browser-demo/ws.js @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/build.rs b/bin/node/cli/build.rs index 44bbe8c5db..9e18fc6699 100644 --- a/bin/node/cli/build.rs +++ b/bin/node/cli/build.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/src/browser.rs b/bin/node/cli/src/browser.rs index cd1d453d8b..bd169cfae3 100644 --- a/bin/node/cli/src/browser.rs +++ b/bin/node/cli/src/browser.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index bfab71b553..836ce53996 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 3b11ff3125..8fb95bed68 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/src/factory_impl.rs b/bin/node/cli/src/factory_impl.rs index 2a77bb5caa..a1c5a5f4e0 100644 --- a/bin/node/cli/src/factory_impl.rs +++ b/bin/node/cli/src/factory_impl.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/src/lib.rs b/bin/node/cli/src/lib.rs index 78660ae92e..d3fbf9c1ea 100644 --- a/bin/node/cli/src/lib.rs +++ b/bin/node/cli/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 063963f7b3..69b05083e8 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/executor/benches/bench.rs b/bin/node/executor/benches/bench.rs index 74999a404e..034c7c6759 100644 --- a/bin/node/executor/benches/bench.rs +++ b/bin/node/executor/benches/bench.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/executor/src/lib.rs b/bin/node/executor/src/lib.rs index 2c90371821..e8c8072fec 100644 --- a/bin/node/executor/src/lib.rs +++ b/bin/node/executor/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/primitives/src/lib.rs b/bin/node/primitives/src/lib.rs index 9cd9c047c9..97e8f50c27 100644 --- a/bin/node/primitives/src/lib.rs +++ b/bin/node/primitives/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/rpc-client/src/main.rs b/bin/node/rpc-client/src/main.rs index 3874556ef6..b28c9f8ff6 100644 --- a/bin/node/rpc-client/src/main.rs +++ b/bin/node/rpc-client/src/main.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/rpc/src/lib.rs b/bin/node/rpc/src/lib.rs index 67a349598f..d074a6d89b 100644 --- a/bin/node/rpc/src/lib.rs +++ b/bin/node/rpc/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/runtime/build.rs b/bin/node/runtime/build.rs index d6b0ae626f..1ed2fa43e6 100644 --- a/bin/node/runtime/build.rs +++ b/bin/node/runtime/build.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/runtime/src/constants.rs b/bin/node/runtime/src/constants.rs index fba4c7ac79..b2c880c08b 100644 --- a/bin/node/runtime/src/constants.rs +++ b/bin/node/runtime/src/constants.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/runtime/src/impls.rs b/bin/node/runtime/src/impls.rs index 75aba8b707..646dc24f57 100644 --- a/bin/node/runtime/src/impls.rs +++ b/bin/node/runtime/src/impls.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index b525546a11..2d7c7b13e1 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/testing/src/client.rs b/bin/node/testing/src/client.rs index 4cd193a69e..140d1cbfc3 100644 --- a/bin/node/testing/src/client.rs +++ b/bin/node/testing/src/client.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/testing/src/genesis.rs b/bin/node/testing/src/genesis.rs index 3a7e597ed5..44dd79a7f4 100644 --- a/bin/node/testing/src/genesis.rs +++ b/bin/node/testing/src/genesis.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/testing/src/keyring.rs b/bin/node/testing/src/keyring.rs index b3dd18b539..5b6f7710e0 100644 --- a/bin/node/testing/src/keyring.rs +++ b/bin/node/testing/src/keyring.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/testing/src/lib.rs b/bin/node/testing/src/lib.rs index 71a22d9b57..f4a5e75e49 100644 --- a/bin/node/testing/src/lib.rs +++ b/bin/node/testing/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/transaction-factory/src/complex_mode.rs b/bin/node/transaction-factory/src/complex_mode.rs index 61be2ab987..e8f1da162a 100644 --- a/bin/node/transaction-factory/src/complex_mode.rs +++ b/bin/node/transaction-factory/src/complex_mode.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/transaction-factory/src/lib.rs b/bin/node/transaction-factory/src/lib.rs index effb9c6d80..c8f2891856 100644 --- a/bin/node/transaction-factory/src/lib.rs +++ b/bin/node/transaction-factory/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/transaction-factory/src/modes.rs b/bin/node/transaction-factory/src/modes.rs index a212d6aed8..5deab7635e 100644 --- a/bin/node/transaction-factory/src/modes.rs +++ b/bin/node/transaction-factory/src/modes.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/node/transaction-factory/src/simple_modes.rs b/bin/node/transaction-factory/src/simple_modes.rs index c8ea77f5fe..7a28d3b179 100644 --- a/bin/node/transaction-factory/src/simple_modes.rs +++ b/bin/node/transaction-factory/src/simple_modes.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/utils/chain-spec-builder/build.rs b/bin/utils/chain-spec-builder/build.rs index 36730271c7..513cc234d4 100644 --- a/bin/utils/chain-spec-builder/build.rs +++ b/bin/utils/chain-spec-builder/build.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/utils/chain-spec-builder/src/main.rs b/bin/utils/chain-spec-builder/src/main.rs index c370469d64..b1eab2ebe5 100644 --- a/bin/utils/chain-spec-builder/src/main.rs +++ b/bin/utils/chain-spec-builder/src/main.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index 616b169289..c2fd7e28c2 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/utils/subkey/src/rpc.rs b/bin/utils/subkey/src/rpc.rs index 1b8e46315c..7b3cde5958 100644 --- a/bin/utils/subkey/src/rpc.rs +++ b/bin/utils/subkey/src/rpc.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/bin/utils/subkey/src/vanity.rs b/bin/utils/subkey/src/vanity.rs index ee5a2f2cce..ff8703a990 100644 --- a/bin/utils/subkey/src/vanity.rs +++ b/bin/utils/subkey/src/vanity.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index 963bb6083b..632c5d5b62 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/api/src/call_executor.rs b/client/api/src/call_executor.rs index b54f6f5205..9739fa7b7b 100644 --- a/client/api/src/call_executor.rs +++ b/client/api/src/call_executor.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/api/src/client.rs b/client/api/src/client.rs index 17da85b5de..d941b9d906 100644 --- a/client/api/src/client.rs +++ b/client/api/src/client.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/api/src/execution_extensions.rs b/client/api/src/execution_extensions.rs index e1be4d8ec0..351e9c8914 100644 --- a/client/api/src/execution_extensions.rs +++ b/client/api/src/execution_extensions.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/api/src/lib.rs b/client/api/src/lib.rs index d51157d245..1239374845 100644 --- a/client/api/src/lib.rs +++ b/client/api/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/api/src/light.rs b/client/api/src/light.rs index 073e62e687..fcdba1f627 100644 --- a/client/api/src/light.rs +++ b/client/api/src/light.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/api/src/notifications.rs b/client/api/src/notifications.rs index 88b0b2d307..13bf06396d 100644 --- a/client/api/src/notifications.rs +++ b/client/api/src/notifications.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/authority-discovery/src/addr_cache.rs b/client/authority-discovery/src/addr_cache.rs index 357048de54..96f589c5d3 100644 --- a/client/authority-discovery/src/addr_cache.rs +++ b/client/authority-discovery/src/addr_cache.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/authority-discovery/src/error.rs b/client/authority-discovery/src/error.rs index b999df5d97..d62281c0c2 100644 --- a/client/authority-discovery/src/error.rs +++ b/client/authority-discovery/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index 3896100c01..79f4510bc9 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs index b0e841b594..06498e2feb 100644 --- a/client/authority-discovery/src/tests.rs +++ b/client/authority-discovery/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index 55f358cdd7..ef78fba107 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index 65ac39f9ff..4081d607ab 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/block-builder/src/lib.rs b/client/block-builder/src/lib.rs index ba5c5694c1..96b3f9e78b 100644 --- a/client/block-builder/src/lib.rs +++ b/client/block-builder/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/chain-spec/derive/src/impls.rs b/client/chain-spec/derive/src/impls.rs index fb16823151..2caf1c5a9c 100644 --- a/client/chain-spec/derive/src/impls.rs +++ b/client/chain-spec/derive/src/impls.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/chain-spec/derive/src/lib.rs b/client/chain-spec/derive/src/lib.rs index bcd50c1021..4648e3f78a 100644 --- a/client/chain-spec/derive/src/lib.rs +++ b/client/chain-spec/derive/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/chain-spec/src/chain_spec.rs b/client/chain-spec/src/chain_spec.rs index 0207eaee51..ac6070fdd6 100644 --- a/client/chain-spec/src/chain_spec.rs +++ b/client/chain-spec/src/chain_spec.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/chain-spec/src/extension.rs b/client/chain-spec/src/extension.rs index 8a42408fba..fb73eec9d8 100644 --- a/client/chain-spec/src/extension.rs +++ b/client/chain-spec/src/extension.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/chain-spec/src/lib.rs b/client/chain-spec/src/lib.rs index d8876e8aa8..cce9d5007f 100644 --- a/client/chain-spec/src/lib.rs +++ b/client/chain-spec/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/cli/src/error.rs b/client/cli/src/error.rs index 80fbdd553b..074cb353c3 100644 --- a/client/cli/src/error.rs +++ b/client/cli/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/cli/src/execution_strategy.rs b/client/cli/src/execution_strategy.rs index 93236227e5..fe353da80d 100644 --- a/client/cli/src/execution_strategy.rs +++ b/client/cli/src/execution_strategy.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/cli/src/informant.rs b/client/cli/src/informant.rs index 6f0ed8dcdf..05111cb646 100644 --- a/client/cli/src/informant.rs +++ b/client/cli/src/informant.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/cli/src/informant/display.rs b/client/cli/src/informant/display.rs index 1742becb86..199635e7c7 100644 --- a/client/cli/src/informant/display.rs +++ b/client/cli/src/informant/display.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 19ee599e02..8b44ba3905 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 780dcd4983..07fbe9b738 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/cli/src/traits.rs b/client/cli/src/traits.rs index 2f4007c846..96216a172b 100644 --- a/client/cli/src/traits.rs +++ b/client/cli/src/traits.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/aura/src/digest.rs b/client/consensus/aura/src/digest.rs index b1633fbfc8..8dd42fc01d 100644 --- a/client/consensus/aura/src/digest.rs +++ b/client/consensus/aura/src/digest.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index b0ffa4a6ff..7cc85cb0a4 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/babe/src/authorship.rs b/client/consensus/babe/src/authorship.rs index 52d593c763..62667ef397 100644 --- a/client/consensus/babe/src/authorship.rs +++ b/client/consensus/babe/src/authorship.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/babe/src/aux_schema.rs b/client/consensus/babe/src/aux_schema.rs index 0e37a8b3a5..a2ee053063 100644 --- a/client/consensus/babe/src/aux_schema.rs +++ b/client/consensus/babe/src/aux_schema.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/babe/src/epoch_changes.rs b/client/consensus/babe/src/epoch_changes.rs index 06b459c0f7..8554f88d36 100644 --- a/client/consensus/babe/src/epoch_changes.rs +++ b/client/consensus/babe/src/epoch_changes.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index a2038a003e..0242c0dd1e 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 828fafc5a9..8eed190b3e 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/babe/src/verification.rs b/client/consensus/babe/src/verification.rs index 0717e81a49..ee5a99ec9d 100644 --- a/client/consensus/babe/src/verification.rs +++ b/client/consensus/babe/src/verification.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index b620a78525..ef3847df43 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/slots/build.rs b/client/consensus/slots/build.rs index 36730271c7..513cc234d4 100644 --- a/client/consensus/slots/build.rs +++ b/client/consensus/slots/build.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/slots/src/aux_schema.rs b/client/consensus/slots/src/aux_schema.rs index ada9661550..df4772a8e9 100644 --- a/client/consensus/slots/src/aux_schema.rs +++ b/client/consensus/slots/src/aux_schema.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/slots/src/lib.rs b/client/consensus/slots/src/lib.rs index 9010771145..df184538b9 100644 --- a/client/consensus/slots/src/lib.rs +++ b/client/consensus/slots/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/slots/src/slots.rs b/client/consensus/slots/src/slots.rs index 16d53fc54a..17a931b7c4 100644 --- a/client/consensus/slots/src/slots.rs +++ b/client/consensus/slots/src/slots.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/consensus/uncles/src/lib.rs b/client/consensus/uncles/src/lib.rs index 4a7e8dc0d6..2a129b2000 100644 --- a/client/consensus/uncles/src/lib.rs +++ b/client/consensus/uncles/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/cache/list_cache.rs b/client/db/src/cache/list_cache.rs index 3760838bdf..6345486f17 100644 --- a/client/db/src/cache/list_cache.rs +++ b/client/db/src/cache/list_cache.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/cache/list_entry.rs b/client/db/src/cache/list_entry.rs index e00da3b57c..d3f7dd5769 100644 --- a/client/db/src/cache/list_entry.rs +++ b/client/db/src/cache/list_entry.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/cache/list_storage.rs b/client/db/src/cache/list_storage.rs index 1d22a664a5..9cd3b1049a 100644 --- a/client/db/src/cache/list_storage.rs +++ b/client/db/src/cache/list_storage.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/cache/mod.rs b/client/db/src/cache/mod.rs index 8f443182c2..bef8d9a791 100644 --- a/client/db/src/cache/mod.rs +++ b/client/db/src/cache/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/children.rs b/client/db/src/children.rs index 8598c96d91..c90af66027 100644 --- a/client/db/src/children.rs +++ b/client/db/src/children.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index e812d2dc46..80d71ec149 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 881e0fd6a6..7533ec9d7a 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/offchain.rs b/client/db/src/offchain.rs index 44be8b0768..3d0f8c6795 100644 --- a/client/db/src/offchain.rs +++ b/client/db/src/offchain.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/storage_cache.rs b/client/db/src/storage_cache.rs index 9f28539e3e..8ffec70e3e 100644 --- a/client/db/src/storage_cache.rs +++ b/client/db/src/storage_cache.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index 8277d1d40e..ed7b2220aa 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/common/src/allocator.rs b/client/executor/common/src/allocator.rs index f872eea8a7..feab044f69 100644 --- a/client/executor/common/src/allocator.rs +++ b/client/executor/common/src/allocator.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/common/src/error.rs b/client/executor/common/src/error.rs index 09acbd1684..fca17bd88c 100644 --- a/client/executor/common/src/error.rs +++ b/client/executor/common/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/common/src/lib.rs b/client/executor/common/src/lib.rs index 361a346e29..69f6a710b3 100644 --- a/client/executor/common/src/lib.rs +++ b/client/executor/common/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/common/src/sandbox.rs b/client/executor/common/src/sandbox.rs index 0b1330d27f..e48afd4891 100644 --- a/client/executor/common/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/common/src/wasm_runtime.rs b/client/executor/common/src/wasm_runtime.rs index 0df7d21ac2..78c05c4c29 100644 --- a/client/executor/common/src/wasm_runtime.rs +++ b/client/executor/common/src/wasm_runtime.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/runtime-test/build.rs b/client/executor/runtime-test/build.rs index d6b0ae626f..1ed2fa43e6 100644 --- a/client/executor/runtime-test/build.rs +++ b/client/executor/runtime-test/build.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/src/deprecated_host_interface.rs b/client/executor/src/deprecated_host_interface.rs index 2339dcdf70..6ea0b11f5a 100644 --- a/client/executor/src/deprecated_host_interface.rs +++ b/client/executor/src/deprecated_host_interface.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 24e9e022f7..aefb52c741 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/src/integration_tests/sandbox.rs b/client/executor/src/integration_tests/sandbox.rs index f18291da67..9a9b33608d 100644 --- a/client/executor/src/integration_tests/sandbox.rs +++ b/client/executor/src/integration_tests/sandbox.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index c343e97b44..78586e0fdc 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/src/native_executor.rs b/client/executor/src/native_executor.rs index 73e3e8da8d..86b274eea0 100644 --- a/client/executor/src/native_executor.rs +++ b/client/executor/src/native_executor.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/src/wasm_runtime.rs b/client/executor/src/wasm_runtime.rs index 4c7e80f925..cec7672b02 100644 --- a/client/executor/src/wasm_runtime.rs +++ b/client/executor/src/wasm_runtime.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/src/wasm_utils.rs b/client/executor/src/wasm_utils.rs index 90ab76fda5..539e210a94 100644 --- a/client/executor/src/wasm_utils.rs +++ b/client/executor/src/wasm_utils.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index 9719153104..eebc49f75b 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/wasmtime/src/function_executor.rs b/client/executor/wasmtime/src/function_executor.rs index 5f5a637794..b398ea8476 100644 --- a/client/executor/wasmtime/src/function_executor.rs +++ b/client/executor/wasmtime/src/function_executor.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/wasmtime/src/lib.rs b/client/executor/wasmtime/src/lib.rs index 085a92e2a0..244fca8f84 100644 --- a/client/executor/wasmtime/src/lib.rs +++ b/client/executor/wasmtime/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/wasmtime/src/runtime.rs b/client/executor/wasmtime/src/runtime.rs index 9395d0049c..ae4739d1f1 100644 --- a/client/executor/wasmtime/src/runtime.rs +++ b/client/executor/wasmtime/src/runtime.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/wasmtime/src/trampoline.rs b/client/executor/wasmtime/src/trampoline.rs index cd9666332c..8a21477609 100644 --- a/client/executor/wasmtime/src/trampoline.rs +++ b/client/executor/wasmtime/src/trampoline.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/executor/wasmtime/src/util.rs b/client/executor/wasmtime/src/util.rs index 82df2be1c6..551295911a 100644 --- a/client/executor/wasmtime/src/util.rs +++ b/client/executor/wasmtime/src/util.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/authorities.rs b/client/finality-grandpa/src/authorities.rs index 2f01ce53b8..683ff7e764 100644 --- a/client/finality-grandpa/src/authorities.rs +++ b/client/finality-grandpa/src/authorities.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/aux_schema.rs b/client/finality-grandpa/src/aux_schema.rs index 63394dcbe1..525a4a99ba 100644 --- a/client/finality-grandpa/src/aux_schema.rs +++ b/client/finality-grandpa/src/aux_schema.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/communication/gossip.rs b/client/finality-grandpa/src/communication/gossip.rs index 2ac6c9cf49..1135cc4f86 100644 --- a/client/finality-grandpa/src/communication/gossip.rs +++ b/client/finality-grandpa/src/communication/gossip.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index cfd1bfdbb3..b65f340652 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/communication/periodic.rs b/client/finality-grandpa/src/communication/periodic.rs index 318c84c22c..a31203104b 100644 --- a/client/finality-grandpa/src/communication/periodic.rs +++ b/client/finality-grandpa/src/communication/periodic.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/communication/tests.rs b/client/finality-grandpa/src/communication/tests.rs index 3dafc0ab2c..a016940a05 100644 --- a/client/finality-grandpa/src/communication/tests.rs +++ b/client/finality-grandpa/src/communication/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/consensus_changes.rs b/client/finality-grandpa/src/consensus_changes.rs index c89335e34c..1ce7b551d0 100644 --- a/client/finality-grandpa/src/consensus_changes.rs +++ b/client/finality-grandpa/src/consensus_changes.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index 1d0532cc28..e47a17e2a5 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/finality_proof.rs b/client/finality-grandpa/src/finality_proof.rs index 69d4c77e5f..f5bf9fed53 100644 --- a/client/finality-grandpa/src/finality_proof.rs +++ b/client/finality-grandpa/src/finality_proof.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index cb354c64d9..f5fde25a05 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/justification.rs b/client/finality-grandpa/src/justification.rs index d7650a39f8..2326a502a5 100644 --- a/client/finality-grandpa/src/justification.rs +++ b/client/finality-grandpa/src/justification.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index f123995552..b9af183989 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/light_import.rs b/client/finality-grandpa/src/light_import.rs index 5e69588f2b..66f8a9deef 100644 --- a/client/finality-grandpa/src/light_import.rs +++ b/client/finality-grandpa/src/light_import.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index 6ce91c9e4e..07bf468eae 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index e2ddda7b44..6bf908b0d9 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/until_imported.rs b/client/finality-grandpa/src/until_imported.rs index 23ab5c5daa..f53b651bcf 100644 --- a/client/finality-grandpa/src/until_imported.rs +++ b/client/finality-grandpa/src/until_imported.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/finality-grandpa/src/voting_rule.rs b/client/finality-grandpa/src/voting_rule.rs index 424677433f..8ba52f30f7 100644 --- a/client/finality-grandpa/src/voting_rule.rs +++ b/client/finality-grandpa/src/voting_rule.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/keystore/src/lib.rs b/client/keystore/src/lib.rs index b51ab5a0a0..a4d150a848 100644 --- a/client/keystore/src/lib.rs +++ b/client/keystore/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network-gossip/src/bridge.rs b/client/network-gossip/src/bridge.rs index 70b0f78cf3..d327f82092 100644 --- a/client/network-gossip/src/bridge.rs +++ b/client/network-gossip/src/bridge.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network-gossip/src/lib.rs b/client/network-gossip/src/lib.rs index 86bc41af4b..bc28bbb809 100644 --- a/client/network-gossip/src/lib.rs +++ b/client/network-gossip/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network-gossip/src/state_machine.rs b/client/network-gossip/src/state_machine.rs index e2d1ebc8eb..ad7ce06833 100644 --- a/client/network-gossip/src/state_machine.rs +++ b/client/network-gossip/src/state_machine.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 705fa2a27a..2efdbd98b3 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/chain.rs b/client/network/src/chain.rs index bb952eb86f..9a094ad7be 100644 --- a/client/network/src/chain.rs +++ b/client/network/src/chain.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/config.rs b/client/network/src/config.rs index 199b4abd9d..6a2062ddbf 100644 --- a/client/network/src/config.rs +++ b/client/network/src/config.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/debug_info.rs b/client/network/src/debug_info.rs index daf49df637..1eebf1ffed 100644 --- a/client/network/src/debug_info.rs +++ b/client/network/src/debug_info.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 0e05ff8b03..298d8e7036 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/error.rs b/client/network/src/error.rs index 8f15e318ce..ba5d5c2d0d 100644 --- a/client/network/src/error.rs +++ b/client/network/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/lib.rs b/client/network/src/lib.rs index a60087751f..dd15636033 100644 --- a/client/network/src/lib.rs +++ b/client/network/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/on_demand_layer.rs b/client/network/src/on_demand_layer.rs index db75de5e34..edda140727 100644 --- a/client/network/src/on_demand_layer.rs +++ b/client/network/src/on_demand_layer.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 495fa57a8e..1b30da59de 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/event.rs b/client/network/src/protocol/event.rs index 98aad8c76c..47bf057505 100644 --- a/client/network/src/protocol/event.rs +++ b/client/network/src/protocol/event.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/legacy_proto.rs b/client/network/src/protocol/legacy_proto.rs index eee30117d9..434782f7d5 100644 --- a/client/network/src/protocol/legacy_proto.rs +++ b/client/network/src/protocol/legacy_proto.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/legacy_proto/behaviour.rs b/client/network/src/protocol/legacy_proto/behaviour.rs index 31e162a589..a69622a6b3 100644 --- a/client/network/src/protocol/legacy_proto/behaviour.rs +++ b/client/network/src/protocol/legacy_proto/behaviour.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/legacy_proto/handler.rs b/client/network/src/protocol/legacy_proto/handler.rs index cbd0385734..142f84d7f5 100644 --- a/client/network/src/protocol/legacy_proto/handler.rs +++ b/client/network/src/protocol/legacy_proto/handler.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/legacy_proto/tests.rs b/client/network/src/protocol/legacy_proto/tests.rs index eaf25e5119..a57c4dd7c8 100644 --- a/client/network/src/protocol/legacy_proto/tests.rs +++ b/client/network/src/protocol/legacy_proto/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/legacy_proto/upgrade.rs b/client/network/src/protocol/legacy_proto/upgrade.rs index fdf23ec351..a5eef85580 100644 --- a/client/network/src/protocol/legacy_proto/upgrade.rs +++ b/client/network/src/protocol/legacy_proto/upgrade.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/light_dispatch.rs b/client/network/src/protocol/light_dispatch.rs index 83e0331325..6b446f2075 100644 --- a/client/network/src/protocol/light_dispatch.rs +++ b/client/network/src/protocol/light_dispatch.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/message.rs b/client/network/src/protocol/message.rs index 0bb9d8c64f..30f0c34175 100644 --- a/client/network/src/protocol/message.rs +++ b/client/network/src/protocol/message.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/specialization.rs b/client/network/src/protocol/specialization.rs index 7ccd38740a..9b1452160e 100644 --- a/client/network/src/protocol/specialization.rs +++ b/client/network/src/protocol/specialization.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/sync.rs b/client/network/src/protocol/sync.rs index 4ff87fd17d..dbefa89292 100644 --- a/client/network/src/protocol/sync.rs +++ b/client/network/src/protocol/sync.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/sync/blocks.rs b/client/network/src/protocol/sync/blocks.rs index ef08d7320d..974935f765 100644 --- a/client/network/src/protocol/sync/blocks.rs +++ b/client/network/src/protocol/sync/blocks.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/sync/extra_requests.rs b/client/network/src/protocol/sync/extra_requests.rs index ecd6fdca99..a0ea68af5f 100644 --- a/client/network/src/protocol/sync/extra_requests.rs +++ b/client/network/src/protocol/sync/extra_requests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2018 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/protocol/util.rs b/client/network/src/protocol/util.rs index 5e9e64aae7..9ba9bf6ae8 100644 --- a/client/network/src/protocol/util.rs +++ b/client/network/src/protocol/util.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 8db2bf0ee0..3785335925 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index 24c79bfa30..40e8bb46ce 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/src/utils.rs b/client/network/src/utils.rs index db8bf2086f..8bbba990a7 100644 --- a/client/network/src/utils.rs +++ b/client/network/src/utils.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/test/src/block_import.rs b/client/network/test/src/block_import.rs index 7ea317c2b4..9048445387 100644 --- a/client/network/test/src/block_import.rs +++ b/client/network/test/src/block_import.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 7c281ae1e5..5912933294 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index 7911f76f80..785fd7c8a6 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/offchain/src/api.rs b/client/offchain/src/api.rs index 83e5e8a353..45a82d230c 100644 --- a/client/offchain/src/api.rs +++ b/client/offchain/src/api.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/offchain/src/api/http.rs b/client/offchain/src/api/http.rs index 6744e1b90f..84c3ecd69b 100644 --- a/client/offchain/src/api/http.rs +++ b/client/offchain/src/api/http.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/offchain/src/api/http_dummy.rs b/client/offchain/src/api/http_dummy.rs index 83c3b3c80c..8725c89899 100644 --- a/client/offchain/src/api/http_dummy.rs +++ b/client/offchain/src/api/http_dummy.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/offchain/src/api/timestamp.rs b/client/offchain/src/api/timestamp.rs index 8c45fce0cd..e5494fe70d 100644 --- a/client/offchain/src/api/timestamp.rs +++ b/client/offchain/src/api/timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index fc28455141..2beb8fe6c9 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/peerset/src/lib.rs b/client/peerset/src/lib.rs index ab7942f60d..c958912727 100644 --- a/client/peerset/src/lib.rs +++ b/client/peerset/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/peerset/src/peersstate.rs b/client/peerset/src/peersstate.rs index a1a50750f3..a27d6e616b 100644 --- a/client/peerset/src/peersstate.rs +++ b/client/peerset/src/peersstate.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/peerset/tests/fuzz.rs b/client/peerset/tests/fuzz.rs index 55d8fabbad..b591d83d8f 100644 --- a/client/peerset/tests/fuzz.rs +++ b/client/peerset/tests/fuzz.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/author/error.rs b/client/rpc-api/src/author/error.rs index b1dfcc140a..8ebd06f8de 100644 --- a/client/rpc-api/src/author/error.rs +++ b/client/rpc-api/src/author/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/author/hash.rs b/client/rpc-api/src/author/hash.rs index 9d2f658ae6..4287af8ede 100644 --- a/client/rpc-api/src/author/hash.rs +++ b/client/rpc-api/src/author/hash.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/author/mod.rs b/client/rpc-api/src/author/mod.rs index 8d2b51faf8..cbdbd38154 100644 --- a/client/rpc-api/src/author/mod.rs +++ b/client/rpc-api/src/author/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/chain/error.rs b/client/rpc-api/src/chain/error.rs index 454c0887ab..ffa4d82bdf 100644 --- a/client/rpc-api/src/chain/error.rs +++ b/client/rpc-api/src/chain/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/chain/mod.rs b/client/rpc-api/src/chain/mod.rs index f3c51d3871..0c270a3f70 100644 --- a/client/rpc-api/src/chain/mod.rs +++ b/client/rpc-api/src/chain/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/errors.rs b/client/rpc-api/src/errors.rs index 984a1cd712..9db41d0497 100644 --- a/client/rpc-api/src/errors.rs +++ b/client/rpc-api/src/errors.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/helpers.rs b/client/rpc-api/src/helpers.rs index 2735879daf..912a5664b3 100644 --- a/client/rpc-api/src/helpers.rs +++ b/client/rpc-api/src/helpers.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/lib.rs b/client/rpc-api/src/lib.rs index 12db07633d..c9306f2cdd 100644 --- a/client/rpc-api/src/lib.rs +++ b/client/rpc-api/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/state/error.rs b/client/rpc-api/src/state/error.rs index 553a06e896..4997a728fc 100644 --- a/client/rpc-api/src/state/error.rs +++ b/client/rpc-api/src/state/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/state/mod.rs b/client/rpc-api/src/state/mod.rs index ecc31581c6..b22bacbe87 100644 --- a/client/rpc-api/src/state/mod.rs +++ b/client/rpc-api/src/state/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/subscriptions.rs b/client/rpc-api/src/subscriptions.rs index d5ca74fa60..808c9d5ba4 100644 --- a/client/rpc-api/src/subscriptions.rs +++ b/client/rpc-api/src/subscriptions.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/system/error.rs b/client/rpc-api/src/system/error.rs index 9ea2a2de0d..fbb4e44bcb 100644 --- a/client/rpc-api/src/system/error.rs +++ b/client/rpc-api/src/system/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/system/helpers.rs b/client/rpc-api/src/system/helpers.rs index 10319d57b6..572136aeb6 100644 --- a/client/rpc-api/src/system/helpers.rs +++ b/client/rpc-api/src/system/helpers.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-api/src/system/mod.rs b/client/rpc-api/src/system/mod.rs index 22c1b3bb2a..f12a11e0b3 100644 --- a/client/rpc-api/src/system/mod.rs +++ b/client/rpc-api/src/system/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 8d39386f93..97fb10c15e 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/author/mod.rs b/client/rpc/src/author/mod.rs index 75a5a6a770..20a74c622a 100644 --- a/client/rpc/src/author/mod.rs +++ b/client/rpc/src/author/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/author/tests.rs b/client/rpc/src/author/tests.rs index f672e38fa5..9fe51d62f5 100644 --- a/client/rpc/src/author/tests.rs +++ b/client/rpc/src/author/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/chain/chain_full.rs b/client/rpc/src/chain/chain_full.rs index f0a0b180c3..1ebce983fe 100644 --- a/client/rpc/src/chain/chain_full.rs +++ b/client/rpc/src/chain/chain_full.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/chain/chain_light.rs b/client/rpc/src/chain/chain_light.rs index 0c850153f7..950b5d4cdf 100644 --- a/client/rpc/src/chain/chain_light.rs +++ b/client/rpc/src/chain/chain_light.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/chain/mod.rs b/client/rpc/src/chain/mod.rs index 95e26a8a10..0774393110 100644 --- a/client/rpc/src/chain/mod.rs +++ b/client/rpc/src/chain/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/chain/tests.rs b/client/rpc/src/chain/tests.rs index c07ea2044c..f7e97120df 100644 --- a/client/rpc/src/chain/tests.rs +++ b/client/rpc/src/chain/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/lib.rs b/client/rpc/src/lib.rs index 748a78f131..3a226a6fb3 100644 --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/metadata.rs b/client/rpc/src/metadata.rs index 73bf583765..d35653f8e6 100644 --- a/client/rpc/src/metadata.rs +++ b/client/rpc/src/metadata.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/state/mod.rs b/client/rpc/src/state/mod.rs index f0dce85932..cc1ed5f993 100644 --- a/client/rpc/src/state/mod.rs +++ b/client/rpc/src/state/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/state/state_full.rs b/client/rpc/src/state/state_full.rs index 3095c0eec0..3d13c020df 100644 --- a/client/rpc/src/state/state_full.rs +++ b/client/rpc/src/state/state_full.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/state/state_light.rs b/client/rpc/src/state/state_light.rs index 286242d97c..4821b083e9 100644 --- a/client/rpc/src/state/state_light.rs +++ b/client/rpc/src/state/state_light.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index 78275840be..b1b7e059e3 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/system/mod.rs b/client/rpc/src/system/mod.rs index b6048291aa..3a9ed9f2dc 100644 --- a/client/rpc/src/system/mod.rs +++ b/client/rpc/src/system/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/rpc/src/system/tests.rs b/client/rpc/src/system/tests.rs index f69882cf38..a280110093 100644 --- a/client/rpc/src/system/tests.rs +++ b/client/rpc/src/system/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index e95717ebfa..8e51cf1837 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 512f3888ee..95e1a11e5d 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/service/src/config.rs b/client/service/src/config.rs index 0b5152e248..8bb8dfeb09 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/service/src/error.rs b/client/service/src/error.rs index d1dc827a38..6516b1c62c 100644 --- a/client/service/src/error.rs +++ b/client/service/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index a22a578f2f..5073f09acd 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/service/src/status_sinks.rs b/client/service/src/status_sinks.rs index 8b8f859aa7..205a22d70f 100644 --- a/client/service/src/status_sinks.rs +++ b/client/service/src/status_sinks.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index 9601257f07..cc0e6a72e6 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/call_executor.rs b/client/src/call_executor.rs index 3115c78103..d02718a97d 100644 --- a/client/src/call_executor.rs +++ b/client/src/call_executor.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/cht.rs b/client/src/cht.rs index 7eeea10bb3..86c2ca756b 100644 --- a/client/src/cht.rs +++ b/client/src/cht.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/client.rs b/client/src/client.rs index c8868d4fd2..0bd08548be 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/genesis.rs b/client/src/genesis.rs index 506771217d..b5951056cd 100644 --- a/client/src/genesis.rs +++ b/client/src/genesis.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/in_mem.rs b/client/src/in_mem.rs index 58e88934f3..af3adbbb5c 100644 --- a/client/src/in_mem.rs +++ b/client/src/in_mem.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/leaves.rs b/client/src/leaves.rs index 2090ce8791..8a9df0f071 100644 --- a/client/src/leaves.rs +++ b/client/src/leaves.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/lib.rs b/client/src/lib.rs index 70d1f28659..fb4c198997 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/light/backend.rs b/client/src/light/backend.rs index e6ec2ae2cf..58151ce99a 100644 --- a/client/src/light/backend.rs +++ b/client/src/light/backend.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/light/blockchain.rs b/client/src/light/blockchain.rs index 54cb8d9b09..9e8d14a48b 100644 --- a/client/src/light/blockchain.rs +++ b/client/src/light/blockchain.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/light/call_executor.rs b/client/src/light/call_executor.rs index 656271b932..86b5e8829d 100644 --- a/client/src/light/call_executor.rs +++ b/client/src/light/call_executor.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/light/fetcher.rs b/client/src/light/fetcher.rs index cf08c8b471..df99897e6d 100644 --- a/client/src/light/fetcher.rs +++ b/client/src/light/fetcher.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/src/light/mod.rs b/client/src/light/mod.rs index cc27bc698b..9ab56b824e 100644 --- a/client/src/light/mod.rs +++ b/client/src/light/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/state-db/src/lib.rs b/client/state-db/src/lib.rs index 331da7d575..f2722ae308 100644 --- a/client/state-db/src/lib.rs +++ b/client/state-db/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/state-db/src/noncanonical.rs b/client/state-db/src/noncanonical.rs index 6e4cd079ae..5db47cc219 100644 --- a/client/state-db/src/noncanonical.rs +++ b/client/state-db/src/noncanonical.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/state-db/src/pruning.rs b/client/state-db/src/pruning.rs index 4cb130eff8..a993df4f11 100644 --- a/client/state-db/src/pruning.rs +++ b/client/state-db/src/pruning.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/state-db/src/test.rs b/client/state-db/src/test.rs index dfbb08998b..accafa9bf8 100644 --- a/client/state-db/src/test.rs +++ b/client/state-db/src/test.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/telemetry/src/lib.rs b/client/telemetry/src/lib.rs index bc2e9aa691..775e56ceb5 100644 --- a/client/telemetry/src/lib.rs +++ b/client/telemetry/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/telemetry/src/worker.rs b/client/telemetry/src/worker.rs index 37b21fa73e..dc7277f74a 100644 --- a/client/telemetry/src/worker.rs +++ b/client/telemetry/src/worker.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/telemetry/src/worker/node.rs b/client/telemetry/src/worker/node.rs index 6d9c6c241b..4f62892d93 100644 --- a/client/telemetry/src/worker/node.rs +++ b/client/telemetry/src/worker/node.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/tracing/src/lib.rs b/client/tracing/src/lib.rs index 288d5e7019..cd301041d3 100644 --- a/client/tracing/src/lib.rs +++ b/client/tracing/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/benches/basics.rs b/client/transaction-pool/graph/benches/basics.rs index bd65efe448..557a2ca3d1 100644 --- a/client/transaction-pool/graph/benches/basics.rs +++ b/client/transaction-pool/graph/benches/basics.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 820c1bea73..1da731b71e 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/error.rs b/client/transaction-pool/graph/src/error.rs index 4da1a58624..6fd7748e36 100644 --- a/client/transaction-pool/graph/src/error.rs +++ b/client/transaction-pool/graph/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/future.rs b/client/transaction-pool/graph/src/future.rs index 2902f03b26..d106c65d45 100644 --- a/client/transaction-pool/graph/src/future.rs +++ b/client/transaction-pool/graph/src/future.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/lib.rs b/client/transaction-pool/graph/src/lib.rs index db92bef272..23970ba9b8 100644 --- a/client/transaction-pool/graph/src/lib.rs +++ b/client/transaction-pool/graph/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/listener.rs b/client/transaction-pool/graph/src/listener.rs index a6d65a93ce..dab2a6f5aa 100644 --- a/client/transaction-pool/graph/src/listener.rs +++ b/client/transaction-pool/graph/src/listener.rs @@ -1,5 +1,5 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index 4e4224695e..629bd0a9a9 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/ready.rs b/client/transaction-pool/graph/src/ready.rs index d5f147e034..cdb0076e5a 100644 --- a/client/transaction-pool/graph/src/ready.rs +++ b/client/transaction-pool/graph/src/ready.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/rotator.rs b/client/transaction-pool/graph/src/rotator.rs index 41c1b5842a..e1c852f95a 100644 --- a/client/transaction-pool/graph/src/rotator.rs +++ b/client/transaction-pool/graph/src/rotator.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 49b86bbca0..7af32c8818 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/graph/src/watcher.rs b/client/transaction-pool/graph/src/watcher.rs index ded849e380..f9c234f73c 100644 --- a/client/transaction-pool/graph/src/watcher.rs +++ b/client/transaction-pool/graph/src/watcher.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index 6f4899995f..c2935f6e17 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/src/error.rs b/client/transaction-pool/src/error.rs index 5394393c46..fa48b387c4 100644 --- a/client/transaction-pool/src/error.rs +++ b/client/transaction-pool/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 9ca4cc0a1e..4d71307c0a 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/src/maintainer.rs b/client/transaction-pool/src/maintainer.rs index 799aa8bd12..2414778e8a 100644 --- a/client/transaction-pool/src/maintainer.rs +++ b/client/transaction-pool/src/maintainer.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/client/transaction-pool/src/tests.rs b/client/transaction-pool/src/tests.rs index e6bdffa945..1199e41cf8 100644 --- a/client/transaction-pool/src/tests.rs +++ b/client/transaction-pool/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/docs/license_header.txt b/docs/license_header.txt index 15b7786607..f9c1daa1ad 100644 --- a/docs/license_header.txt +++ b/docs/license_header.txt @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/assets/src/lib.rs b/frame/assets/src/lib.rs index 8cf9e60d44..f77eb663db 100644 --- a/frame/assets/src/lib.rs +++ b/frame/assets/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/aura/src/lib.rs b/frame/aura/src/lib.rs index 462c30b648..1a711f314a 100644 --- a/frame/aura/src/lib.rs +++ b/frame/aura/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/aura/src/mock.rs b/frame/aura/src/mock.rs index fbab5a421c..81366cf084 100644 --- a/frame/aura/src/mock.rs +++ b/frame/aura/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/aura/src/tests.rs b/frame/aura/src/tests.rs index a90ec3a861..a7cb5503c4 100644 --- a/frame/aura/src/tests.rs +++ b/frame/aura/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/authority-discovery/src/lib.rs b/frame/authority-discovery/src/lib.rs index 065005373f..b3911859f4 100644 --- a/frame/authority-discovery/src/lib.rs +++ b/frame/authority-discovery/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/authorship/src/lib.rs b/frame/authorship/src/lib.rs index d8fd742026..1c25b81790 100644 --- a/frame/authorship/src/lib.rs +++ b/frame/authorship/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index cdc29e203c..f249ca9e29 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/babe/src/mock.rs b/frame/babe/src/mock.rs index fb9804dfb7..3f0c42a6cb 100644 --- a/frame/babe/src/mock.rs +++ b/frame/babe/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/babe/src/tests.rs b/frame/babe/src/tests.rs index 1ae57a6d6e..4e47014a8a 100644 --- a/frame/babe/src/tests.rs +++ b/frame/babe/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 8d37ce0f5a..85e5894810 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/balances/src/mock.rs b/frame/balances/src/mock.rs index f5664be7e8..c511b4db18 100644 --- a/frame/balances/src/mock.rs +++ b/frame/balances/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/balances/src/tests.rs b/frame/balances/src/tests.rs index d5cf35a212..175e87aea4 100644 --- a/frame/balances/src/tests.rs +++ b/frame/balances/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/collective/src/lib.rs b/frame/collective/src/lib.rs index 617fb32e4e..0d1032cca4 100644 --- a/frame/collective/src/lib.rs +++ b/frame/collective/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/rpc/runtime-api/src/lib.rs b/frame/contracts/rpc/runtime-api/src/lib.rs index 73e937cf6c..622cac8572 100644 --- a/frame/contracts/rpc/runtime-api/src/lib.rs +++ b/frame/contracts/rpc/runtime-api/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/rpc/src/lib.rs b/frame/contracts/rpc/src/lib.rs index 01d346c66a..3bbcc81acb 100644 --- a/frame/contracts/rpc/src/lib.rs +++ b/frame/contracts/rpc/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/account_db.rs b/frame/contracts/src/account_db.rs index 866733cefa..3615673f2d 100644 --- a/frame/contracts/src/account_db.rs +++ b/frame/contracts/src/account_db.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/exec.rs b/frame/contracts/src/exec.rs index 261e4297b7..2c77173135 100644 --- a/frame/contracts/src/exec.rs +++ b/frame/contracts/src/exec.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/gas.rs b/frame/contracts/src/gas.rs index af9236e2e5..e0cc7d4bfb 100644 --- a/frame/contracts/src/gas.rs +++ b/frame/contracts/src/gas.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index d17f09cda8..df8da88660 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/rent.rs b/frame/contracts/src/rent.rs index c75dd97ff3..59c8b02d19 100644 --- a/frame/contracts/src/rent.rs +++ b/frame/contracts/src/rent.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 7cf86b31c7..ca15898009 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/wasm/code_cache.rs b/frame/contracts/src/wasm/code_cache.rs index ada28ffc15..cb942a2589 100644 --- a/frame/contracts/src/wasm/code_cache.rs +++ b/frame/contracts/src/wasm/code_cache.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/wasm/env_def/macros.rs b/frame/contracts/src/wasm/env_def/macros.rs index e02be90b8e..89a147b2c6 100644 --- a/frame/contracts/src/wasm/env_def/macros.rs +++ b/frame/contracts/src/wasm/env_def/macros.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/wasm/env_def/mod.rs b/frame/contracts/src/wasm/env_def/mod.rs index 30c1b5455d..004308da42 100644 --- a/frame/contracts/src/wasm/env_def/mod.rs +++ b/frame/contracts/src/wasm/env_def/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/wasm/mod.rs b/frame/contracts/src/wasm/mod.rs index 28b05fcd1a..8e02eb482b 100644 --- a/frame/contracts/src/wasm/mod.rs +++ b/frame/contracts/src/wasm/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/wasm/prepare.rs b/frame/contracts/src/wasm/prepare.rs index f9a40489d9..39e1fca79d 100644 --- a/frame/contracts/src/wasm/prepare.rs +++ b/frame/contracts/src/wasm/prepare.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/contracts/src/wasm/runtime.rs b/frame/contracts/src/wasm/runtime.rs index cbf666dde2..81b0809f82 100644 --- a/frame/contracts/src/wasm/runtime.rs +++ b/frame/contracts/src/wasm/runtime.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 61d1dc285e..594c9db7c6 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/democracy/src/vote_threshold.rs b/frame/democracy/src/vote_threshold.rs index d5e215fe32..46612af09a 100644 --- a/frame/democracy/src/vote_threshold.rs +++ b/frame/democracy/src/vote_threshold.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 8c12f314f8..48f5959f98 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index 9b3dc61540..e722c4db80 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/elections/src/mock.rs b/frame/elections/src/mock.rs index 93efb71355..1226c0671c 100644 --- a/frame/elections/src/mock.rs +++ b/frame/elections/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/elections/src/tests.rs b/frame/elections/src/tests.rs index 40acb72f9e..48161bcee4 100644 --- a/frame/elections/src/tests.rs +++ b/frame/elections/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index 891729e71a..6c1f52a642 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index f13a78db56..1d694be27c 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index fd05c410d9..1ac67d05e2 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/finality-tracker/src/lib.rs b/frame/finality-tracker/src/lib.rs index 5fbf2b9531..1489fcd0dd 100644 --- a/frame/finality-tracker/src/lib.rs +++ b/frame/finality-tracker/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index 26f5161d87..ceadd937fc 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 +// Copyright 2019-2020 // by Centrality Investments Ltd. // and Parity Technologies (UK) Ltd. // This file is part of Substrate. diff --git a/frame/generic-asset/src/mock.rs b/frame/generic-asset/src/mock.rs index 09ec8f69fb..6fdf2d2d88 100644 --- a/frame/generic-asset/src/mock.rs +++ b/frame/generic-asset/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2019 +// Copyright 2019-2020 // by Centrality Investments Ltd. // and Parity Technologies (UK) Ltd. // This file is part of Substrate. diff --git a/frame/generic-asset/src/tests.rs b/frame/generic-asset/src/tests.rs index 20647cc6f2..7c12c391bf 100644 --- a/frame/generic-asset/src/tests.rs +++ b/frame/generic-asset/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 +// Copyright 2019-2020 // by Centrality Investments Ltd. // and Parity Technologies (UK) Ltd. // This file is part of Substrate. diff --git a/frame/grandpa/src/lib.rs b/frame/grandpa/src/lib.rs index 99777cb893..f2ef16dc0e 100644 --- a/frame/grandpa/src/lib.rs +++ b/frame/grandpa/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/grandpa/src/mock.rs b/frame/grandpa/src/mock.rs index 87eadea706..0015dd1f50 100644 --- a/frame/grandpa/src/mock.rs +++ b/frame/grandpa/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/grandpa/src/tests.rs b/frame/grandpa/src/tests.rs index 5ad26d22f4..c6728c70c8 100644 --- a/frame/grandpa/src/tests.rs +++ b/frame/grandpa/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 1e98e60b5e..e6bb83dd05 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index b681f7e4bd..64cd9fae6f 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/im-online/src/mock.rs b/frame/im-online/src/mock.rs index 7feed1ecca..387ff47c09 100644 --- a/frame/im-online/src/mock.rs +++ b/frame/im-online/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/im-online/src/tests.rs b/frame/im-online/src/tests.rs index 1b4356aa49..34eac233ae 100644 --- a/frame/im-online/src/tests.rs +++ b/frame/im-online/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/indices/src/address.rs b/frame/indices/src/address.rs index 2f0d343345..f4487eeb69 100644 --- a/frame/indices/src/address.rs +++ b/frame/indices/src/address.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/indices/src/lib.rs b/frame/indices/src/lib.rs index af30d5297e..8d7e37d5df 100644 --- a/frame/indices/src/lib.rs +++ b/frame/indices/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/indices/src/mock.rs b/frame/indices/src/mock.rs index 150664126d..b8c9b0a0ad 100644 --- a/frame/indices/src/mock.rs +++ b/frame/indices/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/indices/src/tests.rs b/frame/indices/src/tests.rs index 3bcf015713..95afcef734 100644 --- a/frame/indices/src/tests.rs +++ b/frame/indices/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index 3a65f1604e..4b15bf02b4 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/metadata/src/lib.rs b/frame/metadata/src/lib.rs index 28ed730b5f..f6e280bed1 100644 --- a/frame/metadata/src/lib.rs +++ b/frame/metadata/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index 997bf74392..d05dc53e98 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/offences/src/lib.rs b/frame/offences/src/lib.rs index 0dc66c72d4..f0a2cb04ee 100644 --- a/frame/offences/src/lib.rs +++ b/frame/offences/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/offences/src/mock.rs b/frame/offences/src/mock.rs index 343fdc88fa..f344206f5c 100644 --- a/frame/offences/src/mock.rs +++ b/frame/offences/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/offences/src/tests.rs b/frame/offences/src/tests.rs index 2cbadf96b5..703361f77f 100644 --- a/frame/offences/src/tests.rs +++ b/frame/offences/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/randomness-collective-flip/src/lib.rs b/frame/randomness-collective-flip/src/lib.rs index 8432a86198..69c1680659 100644 --- a/frame/randomness-collective-flip/src/lib.rs +++ b/frame/randomness-collective-flip/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/scored-pool/src/lib.rs b/frame/scored-pool/src/lib.rs index 685345aff6..a8fc69971a 100644 --- a/frame/scored-pool/src/lib.rs +++ b/frame/scored-pool/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index fe873da26a..542908e062 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/scored-pool/src/tests.rs b/frame/scored-pool/src/tests.rs index 1cecc7b309..d8c887f4ec 100644 --- a/frame/scored-pool/src/tests.rs +++ b/frame/scored-pool/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/session/src/historical.rs b/frame/session/src/historical.rs index 1298111e93..939e6133e8 100644 --- a/frame/session/src/historical.rs +++ b/frame/session/src/historical.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index 79bace0d4a..2c5668f6fa 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/session/src/mock.rs b/frame/session/src/mock.rs index 28c84d7374..7fe9cd01f4 100644 --- a/frame/session/src/mock.rs +++ b/frame/session/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/staking/reward-curve/tests/test.rs b/frame/staking/reward-curve/tests/test.rs index 399bf7b9a7..89f8653fe1 100644 --- a/frame/staking/reward-curve/tests/test.rs +++ b/frame/staking/reward-curve/tests/test.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/staking/src/inflation.rs b/frame/staking/src/inflation.rs index 902cc0a271..9f11fa9845 100644 --- a/frame/staking/src/inflation.rs +++ b/frame/staking/src/inflation.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 34c42da359..d8ce3fa78d 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/staking/src/migration.rs b/frame/staking/src/migration.rs index 0ee52dc337..bb020b0fc0 100644 --- a/frame/staking/src/migration.rs +++ b/frame/staking/src/migration.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 81066f9dd8..2fdd62457e 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/staking/src/slashing.rs b/frame/staking/src/slashing.rs index b4ef364cb3..1263198d86 100644 --- a/frame/staking/src/slashing.rs +++ b/frame/staking/src/slashing.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 9bb10610a0..e550a90c4e 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/sudo/src/lib.rs b/frame/sudo/src/lib.rs index 00a1b72a86..e49596b4bd 100644 --- a/frame/sudo/src/lib.rs +++ b/frame/sudo/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/construct_runtime/mod.rs b/frame/support/procedural/src/construct_runtime/mod.rs index 8472542d16..7e66610641 100644 --- a/frame/support/procedural/src/construct_runtime/mod.rs +++ b/frame/support/procedural/src/construct_runtime/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/construct_runtime/parse.rs b/frame/support/procedural/src/construct_runtime/parse.rs index 14dd18cb06..0559c45bbc 100644 --- a/frame/support/procedural/src/construct_runtime/parse.rs +++ b/frame/support/procedural/src/construct_runtime/parse.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/lib.rs b/frame/support/procedural/src/lib.rs index 477663b681..faac4baec3 100644 --- a/frame/support/procedural/src/lib.rs +++ b/frame/support/procedural/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/genesis_config/builder_def.rs b/frame/support/procedural/src/storage/genesis_config/builder_def.rs index 7edee59de8..59e4368807 100644 --- a/frame/support/procedural/src/storage/genesis_config/builder_def.rs +++ b/frame/support/procedural/src/storage/genesis_config/builder_def.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs b/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs index 2b4b57faeb..100907b292 100644 --- a/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs +++ b/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/genesis_config/mod.rs b/frame/support/procedural/src/storage/genesis_config/mod.rs index 4e91ccd1df..09afcb9a60 100644 --- a/frame/support/procedural/src/storage/genesis_config/mod.rs +++ b/frame/support/procedural/src/storage/genesis_config/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/getters.rs b/frame/support/procedural/src/storage/getters.rs index f30e489eb5..34d182d7f4 100644 --- a/frame/support/procedural/src/storage/getters.rs +++ b/frame/support/procedural/src/storage/getters.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/instance_trait.rs b/frame/support/procedural/src/storage/instance_trait.rs index abc56092e3..b2f0ad9c06 100644 --- a/frame/support/procedural/src/storage/instance_trait.rs +++ b/frame/support/procedural/src/storage/instance_trait.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/metadata.rs b/frame/support/procedural/src/storage/metadata.rs index 17ad250f66..f8dfb10d2e 100644 --- a/frame/support/procedural/src/storage/metadata.rs +++ b/frame/support/procedural/src/storage/metadata.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/mod.rs b/frame/support/procedural/src/storage/mod.rs index ef199c92c4..453cb9c467 100644 --- a/frame/support/procedural/src/storage/mod.rs +++ b/frame/support/procedural/src/storage/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/parse.rs b/frame/support/procedural/src/storage/parse.rs index 2fe37da256..a2d3c67dd2 100644 --- a/frame/support/procedural/src/storage/parse.rs +++ b/frame/support/procedural/src/storage/parse.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/storage_struct.rs b/frame/support/procedural/src/storage/storage_struct.rs index fdb1dbb161..e44863b157 100644 --- a/frame/support/procedural/src/storage/storage_struct.rs +++ b/frame/support/procedural/src/storage/storage_struct.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/src/storage/store_trait.rs b/frame/support/procedural/src/storage/store_trait.rs index 4c9d96b6bb..96281e408e 100644 --- a/frame/support/procedural/src/storage/store_trait.rs +++ b/frame/support/procedural/src/storage/store_trait.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/tools/derive/src/lib.rs b/frame/support/procedural/tools/derive/src/lib.rs index 4bf1a5f44c..e130ffbfa0 100644 --- a/frame/support/procedural/tools/derive/src/lib.rs +++ b/frame/support/procedural/tools/derive/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/tools/src/lib.rs b/frame/support/procedural/tools/src/lib.rs index e1e73af104..102fee0e18 100644 --- a/frame/support/procedural/tools/src/lib.rs +++ b/frame/support/procedural/tools/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/procedural/tools/src/syn_ext.rs b/frame/support/procedural/tools/src/syn_ext.rs index afcda4eebf..d0a5066b80 100644 --- a/frame/support/procedural/tools/src/syn_ext.rs +++ b/frame/support/procedural/tools/src/syn_ext.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/debug.rs b/frame/support/src/debug.rs index 2e64b67c1b..0316fb9797 100644 --- a/frame/support/src/debug.rs +++ b/frame/support/src/debug.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/dispatch.rs b/frame/support/src/dispatch.rs index 3d12d7cf95..7d3750d9d4 100644 --- a/frame/support/src/dispatch.rs +++ b/frame/support/src/dispatch.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/error.rs b/frame/support/src/error.rs index 5461dfaeb7..34de38108f 100644 --- a/frame/support/src/error.rs +++ b/frame/support/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/event.rs b/frame/support/src/event.rs index 1c9a0b66fe..aac3a5955e 100644 --- a/frame/support/src/event.rs +++ b/frame/support/src/event.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/hash.rs b/frame/support/src/hash.rs index 332a8f4e42..aae4aceb7f 100644 --- a/frame/support/src/hash.rs +++ b/frame/support/src/hash.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/inherent.rs b/frame/support/src/inherent.rs index fc11cd0a2e..a21bd361b6 100644 --- a/frame/support/src/inherent.rs +++ b/frame/support/src/inherent.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index 56afc79333..af6eea9c73 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/metadata.rs b/frame/support/src/metadata.rs index ad6a5c797c..110df87c64 100644 --- a/frame/support/src/metadata.rs +++ b/frame/support/src/metadata.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/origin.rs b/frame/support/src/origin.rs index 22e5c99e90..43d2e70953 100644 --- a/frame/support/src/origin.rs +++ b/frame/support/src/origin.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/child.rs b/frame/support/src/storage/child.rs index 5aca2d3125..f549ffc25f 100644 --- a/frame/support/src/storage/child.rs +++ b/frame/support/src/storage/child.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/generator/double_map.rs b/frame/support/src/storage/generator/double_map.rs index 036b1f506e..947235c4bd 100644 --- a/frame/support/src/storage/generator/double_map.rs +++ b/frame/support/src/storage/generator/double_map.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/generator/linked_map.rs b/frame/support/src/storage/generator/linked_map.rs index b4b6daf276..14bef77c9e 100644 --- a/frame/support/src/storage/generator/linked_map.rs +++ b/frame/support/src/storage/generator/linked_map.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/generator/map.rs b/frame/support/src/storage/generator/map.rs index 0a6cc1f9ae..78f261e7da 100644 --- a/frame/support/src/storage/generator/map.rs +++ b/frame/support/src/storage/generator/map.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/generator/mod.rs b/frame/support/src/storage/generator/mod.rs index 27df37a5c5..386e3d1cec 100644 --- a/frame/support/src/storage/generator/mod.rs +++ b/frame/support/src/storage/generator/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/generator/value.rs b/frame/support/src/storage/generator/value.rs index f259b795ce..44641b85f7 100644 --- a/frame/support/src/storage/generator/value.rs +++ b/frame/support/src/storage/generator/value.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/hashed.rs b/frame/support/src/storage/hashed.rs index d4740795db..a3ffddcb84 100644 --- a/frame/support/src/storage/hashed.rs +++ b/frame/support/src/storage/hashed.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index 43be8699f4..53e7ceb45d 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/storage/unhashed.rs b/frame/support/src/storage/unhashed.rs index 55f99f3d81..54910e99a4 100644 --- a/frame/support/src/storage/unhashed.rs +++ b/frame/support/src/storage/unhashed.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index 379f964d27..7d9040ad67 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/unsigned.rs b/frame/support/src/unsigned.rs index 37b66dc4b0..319fa3adb4 100644 --- a/frame/support/src/unsigned.rs +++ b/frame/support/src/unsigned.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/src/weights.rs b/frame/support/src/weights.rs index 84198a7eca..b4b70def1d 100644 --- a/frame/support/src/weights.rs +++ b/frame/support/src/weights.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/src/lib.rs b/frame/support/test/src/lib.rs index ec78a8c400..f62f552268 100644 --- a/frame/support/test/src/lib.rs +++ b/frame/support/test/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/decl_error.rs b/frame/support/test/tests/decl_error.rs index 42a799caad..b90c870c31 100644 --- a/frame/support/test/tests/decl_error.rs +++ b/frame/support/test/tests/decl_error.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/decl_storage.rs b/frame/support/test/tests/decl_storage.rs index 86d351ad6e..b0974fcb82 100644 --- a/frame/support/test/tests/decl_storage.rs +++ b/frame/support/test/tests/decl_storage.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/decl_storage_ui.rs b/frame/support/test/tests/decl_storage_ui.rs index 32c15eb390..3aee5e9866 100644 --- a/frame/support/test/tests/decl_storage_ui.rs +++ b/frame/support/test/tests/decl_storage_ui.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/decl_storage_ui/config_duplicate.rs b/frame/support/test/tests/decl_storage_ui/config_duplicate.rs index e00f9a8f4c..0f2759e740 100644 --- a/frame/support/test/tests/decl_storage_ui/config_duplicate.rs +++ b/frame/support/test/tests/decl_storage_ui/config_duplicate.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs b/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs index 6ce8194b57..a4e0158d5c 100644 --- a/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs +++ b/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/decl_storage_ui/get_duplicate.rs b/frame/support/test/tests/decl_storage_ui/get_duplicate.rs index d593ddc477..9edbc25bf9 100644 --- a/frame/support/test/tests/decl_storage_ui/get_duplicate.rs +++ b/frame/support/test/tests/decl_storage_ui/get_duplicate.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/final_keys.rs b/frame/support/test/tests/final_keys.rs index 3d4c3f5060..71e13f7ced 100644 --- a/frame/support/test/tests/final_keys.rs +++ b/frame/support/test/tests/final_keys.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/genesisconfig.rs b/frame/support/test/tests/genesisconfig.rs index 1b5a935983..04525aa142 100644 --- a/frame/support/test/tests/genesisconfig.rs +++ b/frame/support/test/tests/genesisconfig.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/instance.rs b/frame/support/test/tests/instance.rs index cd14736266..e4b707c1f1 100644 --- a/frame/support/test/tests/instance.rs +++ b/frame/support/test/tests/instance.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/issue2219.rs b/frame/support/test/tests/issue2219.rs index f6679f3498..f3ce4dac80 100644 --- a/frame/support/test/tests/issue2219.rs +++ b/frame/support/test/tests/issue2219.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/reserved_keyword.rs b/frame/support/test/tests/reserved_keyword.rs index 898d61b827..d6cc4bba3b 100644 --- a/frame/support/test/tests/reserved_keyword.rs +++ b/frame/support/test/tests/reserved_keyword.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/support/test/tests/system.rs b/frame/support/test/tests/system.rs index 5dff9eef9a..c5b591642b 100644 --- a/frame/support/test/tests/system.rs +++ b/frame/support/test/tests/system.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/system/benches/bench.rs b/frame/system/benches/bench.rs index 21e9dbb0f2..42a35c49a1 100644 --- a/frame/system/benches/bench.rs +++ b/frame/system/benches/bench.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/system/rpc/runtime-api/src/lib.rs b/frame/system/rpc/runtime-api/src/lib.rs index c3a9595af1..3b05bd1624 100644 --- a/frame/system/rpc/runtime-api/src/lib.rs +++ b/frame/system/rpc/runtime-api/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 903523fdf8..05f6170031 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/system/src/offchain.rs b/frame/system/src/offchain.rs index 32cda26af1..14b57d8903 100644 --- a/frame/system/src/offchain.rs +++ b/frame/system/src/offchain.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/timestamp/src/lib.rs b/frame/timestamp/src/lib.rs index 449e509c23..1c16ed6380 100644 --- a/frame/timestamp/src/lib.rs +++ b/frame/timestamp/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/transaction-payment/rpc/runtime-api/src/lib.rs b/frame/transaction-payment/rpc/runtime-api/src/lib.rs index ea2b7c2677..6e7425f8b8 100644 --- a/frame/transaction-payment/rpc/runtime-api/src/lib.rs +++ b/frame/transaction-payment/rpc/runtime-api/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/transaction-payment/rpc/src/lib.rs b/frame/transaction-payment/rpc/src/lib.rs index e7f4638113..83f5e82b80 100644 --- a/frame/transaction-payment/rpc/src/lib.rs +++ b/frame/transaction-payment/rpc/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 60cd5716d5..c3611640f1 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 121432fd05..7ad011ac95 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index edc75abe53..8103939a5c 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/proc-macro/src/decl_runtime_apis.rs b/primitives/api/proc-macro/src/decl_runtime_apis.rs index b57cc73997..1ffd165c10 100644 --- a/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index 6a18651655..5f8d565052 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/proc-macro/src/lib.rs b/primitives/api/proc-macro/src/lib.rs index 30b1c26945..a1fd11188f 100644 --- a/primitives/api/proc-macro/src/lib.rs +++ b/primitives/api/proc-macro/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index afa4142641..55814c61b5 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index b655cf0939..7918113345 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/test/benches/bench.rs b/primitives/api/test/benches/bench.rs index 395ef7ed20..4bdf6e199c 100644 --- a/primitives/api/test/benches/bench.rs +++ b/primitives/api/test/benches/bench.rs @@ -1,4 +1,4 @@ -// Copyright 2018 - 2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/test/tests/decl_and_impl.rs b/primitives/api/test/tests/decl_and_impl.rs index b25c8c2710..00c0cc732c 100644 --- a/primitives/api/test/tests/decl_and_impl.rs +++ b/primitives/api/test/tests/decl_and_impl.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/test/tests/runtime_calls.rs b/primitives/api/test/tests/runtime_calls.rs index 0dd5ea4c37..5ebba3a20a 100644 --- a/primitives/api/test/tests/runtime_calls.rs +++ b/primitives/api/test/tests/runtime_calls.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/api/test/tests/trybuild.rs b/primitives/api/test/tests/trybuild.rs index 5b14ee81e8..910771f938 100644 --- a/primitives/api/test/tests/trybuild.rs +++ b/primitives/api/test/tests/trybuild.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/application-crypto/src/ed25519.rs b/primitives/application-crypto/src/ed25519.rs index 14796a4b55..159d9ec2a9 100644 --- a/primitives/application-crypto/src/ed25519.rs +++ b/primitives/application-crypto/src/ed25519.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index 0d8df56535..db1bdf0c7a 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/application-crypto/src/sr25519.rs b/primitives/application-crypto/src/sr25519.rs index f3d2a84843..227e7c30b4 100644 --- a/primitives/application-crypto/src/sr25519.rs +++ b/primitives/application-crypto/src/sr25519.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/application-crypto/src/traits.rs b/primitives/application-crypto/src/traits.rs index 982e001013..4b500bb2a6 100644 --- a/primitives/application-crypto/src/traits.rs +++ b/primitives/application-crypto/src/traits.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/application-crypto/test/src/ed25519.rs b/primitives/application-crypto/test/src/ed25519.rs index 40f318509e..d967c3a7d9 100644 --- a/primitives/application-crypto/test/src/ed25519.rs +++ b/primitives/application-crypto/test/src/ed25519.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/application-crypto/test/src/lib.rs b/primitives/application-crypto/test/src/lib.rs index 282ace5b1f..cb045e81a7 100644 --- a/primitives/application-crypto/test/src/lib.rs +++ b/primitives/application-crypto/test/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/application-crypto/test/src/sr25519.rs b/primitives/application-crypto/test/src/sr25519.rs index f0bc3e09b2..0e0c40578b 100644 --- a/primitives/application-crypto/test/src/sr25519.rs +++ b/primitives/application-crypto/test/src/sr25519.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/benches/bench.rs b/primitives/arithmetic/benches/bench.rs index ea6a2d2fd8..1025e883ef 100644 --- a/primitives/arithmetic/benches/bench.rs +++ b/primitives/arithmetic/benches/bench.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/fuzzer/src/biguint.rs b/primitives/arithmetic/fuzzer/src/biguint.rs index c3dbe81212..1e2ec2a502 100644 --- a/primitives/arithmetic/fuzzer/src/biguint.rs +++ b/primitives/arithmetic/fuzzer/src/biguint.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/fuzzer/src/rational128.rs b/primitives/arithmetic/fuzzer/src/rational128.rs index f32caa9010..60aa315c18 100644 --- a/primitives/arithmetic/fuzzer/src/rational128.rs +++ b/primitives/arithmetic/fuzzer/src/rational128.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/src/biguint.rs b/primitives/arithmetic/src/biguint.rs index 9d69ccad81..6c3ca58a52 100644 --- a/primitives/arithmetic/src/biguint.rs +++ b/primitives/arithmetic/src/biguint.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/src/fixed64.rs b/primitives/arithmetic/src/fixed64.rs index 6f906b0b29..eea1ab68a3 100644 --- a/primitives/arithmetic/src/fixed64.rs +++ b/primitives/arithmetic/src/fixed64.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/src/helpers_128bit.rs b/primitives/arithmetic/src/helpers_128bit.rs index 475d802f3f..bf8315b9b6 100644 --- a/primitives/arithmetic/src/helpers_128bit.rs +++ b/primitives/arithmetic/src/helpers_128bit.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/src/lib.rs b/primitives/arithmetic/src/lib.rs index fc1d75ae96..0beef84758 100644 --- a/primitives/arithmetic/src/lib.rs +++ b/primitives/arithmetic/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/src/per_things.rs b/primitives/arithmetic/src/per_things.rs index 47dfc98f3b..8c732248a3 100644 --- a/primitives/arithmetic/src/per_things.rs +++ b/primitives/arithmetic/src/per_things.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/src/rational128.rs b/primitives/arithmetic/src/rational128.rs index a747be84a8..248df70794 100644 --- a/primitives/arithmetic/src/rational128.rs +++ b/primitives/arithmetic/src/rational128.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/arithmetic/src/traits.rs b/primitives/arithmetic/src/traits.rs index d8a46ffd30..ab525527e9 100644 --- a/primitives/arithmetic/src/traits.rs +++ b/primitives/arithmetic/src/traits.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/authority-discovery/src/lib.rs b/primitives/authority-discovery/src/lib.rs index 41ad384f91..fc76da61af 100644 --- a/primitives/authority-discovery/src/lib.rs +++ b/primitives/authority-discovery/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/authorship/src/lib.rs b/primitives/authorship/src/lib.rs index 7494e58338..53dac56dc4 100644 --- a/primitives/authorship/src/lib.rs +++ b/primitives/authorship/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/block-builder/src/lib.rs b/primitives/block-builder/src/lib.rs index 95f187da9a..d963fb7e30 100644 --- a/primitives/block-builder/src/lib.rs +++ b/primitives/block-builder/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/blockchain/src/backend.rs b/primitives/blockchain/src/backend.rs index 0baede8ab2..8571d76801 100644 --- a/primitives/blockchain/src/backend.rs +++ b/primitives/blockchain/src/backend.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/blockchain/src/error.rs b/primitives/blockchain/src/error.rs index ec60533a50..dbab93738e 100644 --- a/primitives/blockchain/src/error.rs +++ b/primitives/blockchain/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/blockchain/src/header_metadata.rs b/primitives/blockchain/src/header_metadata.rs index 450bf70e8e..fcd8062d1d 100644 --- a/primitives/blockchain/src/header_metadata.rs +++ b/primitives/blockchain/src/header_metadata.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/blockchain/src/lib.rs b/primitives/blockchain/src/lib.rs index 2a8a7c96fe..21c5bc99d2 100644 --- a/primitives/blockchain/src/lib.rs +++ b/primitives/blockchain/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/aura/src/inherents.rs b/primitives/consensus/aura/src/inherents.rs index 566ed6ccc4..77ec03c6f4 100644 --- a/primitives/consensus/aura/src/inherents.rs +++ b/primitives/consensus/aura/src/inherents.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/aura/src/lib.rs b/primitives/consensus/aura/src/lib.rs index 770ed47319..4f20456667 100644 --- a/primitives/consensus/aura/src/lib.rs +++ b/primitives/consensus/aura/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/babe/src/digest.rs b/primitives/consensus/babe/src/digest.rs index 343cec4db7..cca088b92b 100644 --- a/primitives/consensus/babe/src/digest.rs +++ b/primitives/consensus/babe/src/digest.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/babe/src/inherents.rs b/primitives/consensus/babe/src/inherents.rs index 5a4e042352..4a460ec6f7 100644 --- a/primitives/consensus/babe/src/inherents.rs +++ b/primitives/consensus/babe/src/inherents.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/babe/src/lib.rs b/primitives/consensus/babe/src/lib.rs index 196f1be1a6..4cdeb072bd 100644 --- a/primitives/consensus/babe/src/lib.rs +++ b/primitives/consensus/babe/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/block_import.rs b/primitives/consensus/common/src/block_import.rs index aab70625ff..133791c9a5 100644 --- a/primitives/consensus/common/src/block_import.rs +++ b/primitives/consensus/common/src/block_import.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/block_validation.rs b/primitives/consensus/common/src/block_validation.rs index 42231bbf4c..e8054f3ae4 100644 --- a/primitives/consensus/common/src/block_validation.rs +++ b/primitives/consensus/common/src/block_validation.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/error.rs b/primitives/consensus/common/src/error.rs index 29e9a3ee92..972e4a2d48 100644 --- a/primitives/consensus/common/src/error.rs +++ b/primitives/consensus/common/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/evaluation.rs b/primitives/consensus/common/src/evaluation.rs index 875ce41e01..5542042fed 100644 --- a/primitives/consensus/common/src/evaluation.rs +++ b/primitives/consensus/common/src/evaluation.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/import_queue.rs b/primitives/consensus/common/src/import_queue.rs index 1d8ea0f0ce..d8c2915638 100644 --- a/primitives/consensus/common/src/import_queue.rs +++ b/primitives/consensus/common/src/import_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/import_queue/basic_queue.rs b/primitives/consensus/common/src/import_queue/basic_queue.rs index 42a31ceb64..f8df421d26 100644 --- a/primitives/consensus/common/src/import_queue/basic_queue.rs +++ b/primitives/consensus/common/src/import_queue/basic_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/import_queue/buffered_link.rs b/primitives/consensus/common/src/import_queue/buffered_link.rs index 4772af92f1..143ab0eef8 100644 --- a/primitives/consensus/common/src/import_queue/buffered_link.rs +++ b/primitives/consensus/common/src/import_queue/buffered_link.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/lib.rs b/primitives/consensus/common/src/lib.rs index 413f541340..772d6da7c1 100644 --- a/primitives/consensus/common/src/lib.rs +++ b/primitives/consensus/common/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate Consensus Common. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/offline_tracker.rs b/primitives/consensus/common/src/offline_tracker.rs index f5adbdc0e0..b4959503b1 100644 --- a/primitives/consensus/common/src/offline_tracker.rs +++ b/primitives/consensus/common/src/offline_tracker.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/common/src/select_chain.rs b/primitives/consensus/common/src/select_chain.rs index da0bae4900..3ce2c6ccd0 100644 --- a/primitives/consensus/common/src/select_chain.rs +++ b/primitives/consensus/common/src/select_chain.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate Consensus Common. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/primitives/consensus/pow/src/lib.rs b/primitives/consensus/pow/src/lib.rs index 6a1c1179ed..fa8f75d1be 100644 --- a/primitives/consensus/pow/src/lib.rs +++ b/primitives/consensus/pow/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/benches/bench.rs b/primitives/core/benches/bench.rs index d03407de5f..36728742d8 100644 --- a/primitives/core/benches/bench.rs +++ b/primitives/core/benches/bench.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies +// Copyright 2019-2020 Parity Technologies // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/primitives/core/src/changes_trie.rs b/primitives/core/src/changes_trie.rs index f746e1dc8d..65619a9d45 100644 --- a/primitives/core/src/changes_trie.rs +++ b/primitives/core/src/changes_trie.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index c5a42243dc..ce2b75c375 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/ecdsa.rs b/primitives/core/src/ecdsa.rs index fbdb8a56f7..afd75dae99 100644 --- a/primitives/core/src/ecdsa.rs +++ b/primitives/core/src/ecdsa.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/ed25519.rs b/primitives/core/src/ed25519.rs index 180e3b0ccb..f3aba47c20 100644 --- a/primitives/core/src/ed25519.rs +++ b/primitives/core/src/ed25519.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/hash.rs b/primitives/core/src/hash.rs index 8b1f9a5233..424fefbe6a 100644 --- a/primitives/core/src/hash.rs +++ b/primitives/core/src/hash.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/hasher.rs b/primitives/core/src/hasher.rs index 4562180a1a..68fce90644 100644 --- a/primitives/core/src/hasher.rs +++ b/primitives/core/src/hasher.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/hashing.rs b/primitives/core/src/hashing.rs index 8fce710230..87f6469b57 100644 --- a/primitives/core/src/hashing.rs +++ b/primitives/core/src/hashing.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/hexdisplay.rs b/primitives/core/src/hexdisplay.rs index 83c2363a4c..14fedc205c 100644 --- a/primitives/core/src/hexdisplay.rs +++ b/primitives/core/src/hexdisplay.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index 00343c0e7f..32e65de40d 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/offchain/mod.rs b/primitives/core/src/offchain/mod.rs index 9c33abb7c1..59a8e74ad2 100644 --- a/primitives/core/src/offchain/mod.rs +++ b/primitives/core/src/offchain/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/offchain/storage.rs b/primitives/core/src/offchain/storage.rs index 60339f7005..31b6423e5d 100644 --- a/primitives/core/src/offchain/storage.rs +++ b/primitives/core/src/offchain/storage.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/offchain/testing.rs b/primitives/core/src/offchain/testing.rs index 0b15c2f314..82438dd6f8 100644 --- a/primitives/core/src/offchain/testing.rs +++ b/primitives/core/src/offchain/testing.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/sandbox.rs b/primitives/core/src/sandbox.rs index cc82b4bd4c..a0673c49db 100644 --- a/primitives/core/src/sandbox.rs +++ b/primitives/core/src/sandbox.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/sr25519.rs b/primitives/core/src/sr25519.rs index c0f71ea83b..6e542f230f 100644 --- a/primitives/core/src/sr25519.rs +++ b/primitives/core/src/sr25519.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/testing.rs b/primitives/core/src/testing.rs index b5a8c0aad6..35286acb63 100644 --- a/primitives/core/src/testing.rs +++ b/primitives/core/src/testing.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/tests.rs b/primitives/core/src/tests.rs index 2dbaed2b0f..1eda2157c4 100644 --- a/primitives/core/src/tests.rs +++ b/primitives/core/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/traits.rs b/primitives/core/src/traits.rs index 2f78c8a708..cd188e3367 100644 --- a/primitives/core/src/traits.rs +++ b/primitives/core/src/traits.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/u32_trait.rs b/primitives/core/src/u32_trait.rs index d8fac34c30..975b4aa909 100644 --- a/primitives/core/src/u32_trait.rs +++ b/primitives/core/src/u32_trait.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/core/src/uint.rs b/primitives/core/src/uint.rs index 330fffb9f1..54ed7ca317 100644 --- a/primitives/core/src/uint.rs +++ b/primitives/core/src/uint.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/debug-derive/src/impls.rs b/primitives/debug-derive/src/impls.rs index decceca044..b0e6dfa3ee 100644 --- a/primitives/debug-derive/src/impls.rs +++ b/primitives/debug-derive/src/impls.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/debug-derive/src/lib.rs b/primitives/debug-derive/src/lib.rs index ac63441124..f338c2869e 100644 --- a/primitives/debug-derive/src/lib.rs +++ b/primitives/debug-derive/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/debug-derive/tests/tests.rs b/primitives/debug-derive/tests/tests.rs index 11f45fcc45..77b3d53a2d 100644 --- a/primitives/debug-derive/tests/tests.rs +++ b/primitives/debug-derive/tests/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/externalities/src/extensions.rs b/primitives/externalities/src/extensions.rs index c5535d0bab..a61c03534f 100644 --- a/primitives/externalities/src/extensions.rs +++ b/primitives/externalities/src/extensions.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/externalities/src/lib.rs b/primitives/externalities/src/lib.rs index 52be547e25..350b65d190 100644 --- a/primitives/externalities/src/lib.rs +++ b/primitives/externalities/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/externalities/src/scope_limited.rs b/primitives/externalities/src/scope_limited.rs index ae185449be..263858aa5f 100644 --- a/primitives/externalities/src/scope_limited.rs +++ b/primitives/externalities/src/scope_limited.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/finality-grandpa/src/lib.rs b/primitives/finality-grandpa/src/lib.rs index ef61092b9c..f1481c0aed 100644 --- a/primitives/finality-grandpa/src/lib.rs +++ b/primitives/finality-grandpa/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/finality-tracker/src/lib.rs b/primitives/finality-tracker/src/lib.rs index 677be24ef5..0c462c4052 100644 --- a/primitives/finality-tracker/src/lib.rs +++ b/primitives/finality-tracker/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/inherents/src/lib.rs b/primitives/inherents/src/lib.rs index b777b64e5e..f79d8357a5 100644 --- a/primitives/inherents/src/lib.rs +++ b/primitives/inherents/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 8763a122df..7189b05042 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/keyring/src/ed25519.rs b/primitives/keyring/src/ed25519.rs index 3b882bfea8..197b9ded87 100644 --- a/primitives/keyring/src/ed25519.rs +++ b/primitives/keyring/src/ed25519.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/keyring/src/lib.rs b/primitives/keyring/src/lib.rs index e4714ad3c4..18f8cdf2c4 100644 --- a/primitives/keyring/src/lib.rs +++ b/primitives/keyring/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/keyring/src/sr25519.rs b/primitives/keyring/src/sr25519.rs index 533a21f55a..27627a0c50 100644 --- a/primitives/keyring/src/sr25519.rs +++ b/primitives/keyring/src/sr25519.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/offchain/src/lib.rs b/primitives/offchain/src/lib.rs index db7efcd0cc..d975e99a78 100644 --- a/primitives/offchain/src/lib.rs +++ b/primitives/offchain/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/panic-handler/src/lib.rs b/primitives/panic-handler/src/lib.rs index 1df05120c1..c0f70d9d14 100644 --- a/primitives/panic-handler/src/lib.rs +++ b/primitives/panic-handler/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/phragmen/benches/phragmen.rs b/primitives/phragmen/benches/phragmen.rs index 33b80ed5a6..7bebda564e 100644 --- a/primitives/phragmen/benches/phragmen.rs +++ b/primitives/phragmen/benches/phragmen.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies +// Copyright 2019-2020 Parity Technologies // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/primitives/phragmen/src/lib.rs b/primitives/phragmen/src/lib.rs index a06ef9497b..d9712d6ffb 100644 --- a/primitives/phragmen/src/lib.rs +++ b/primitives/phragmen/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/phragmen/src/mock.rs b/primitives/phragmen/src/mock.rs index 3074258bbb..32de65f0e6 100644 --- a/primitives/phragmen/src/mock.rs +++ b/primitives/phragmen/src/mock.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/phragmen/src/tests.rs b/primitives/phragmen/src/tests.rs index 09491b3b90..f3974d07d3 100644 --- a/primitives/phragmen/src/tests.rs +++ b/primitives/phragmen/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/rpc/src/lib.rs b/primitives/rpc/src/lib.rs index 74007bea8e..7c22daf5cd 100644 --- a/primitives/rpc/src/lib.rs +++ b/primitives/rpc/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/rpc/src/list.rs b/primitives/rpc/src/list.rs index 5cd7b18705..b8b7c537c4 100644 --- a/primitives/rpc/src/list.rs +++ b/primitives/rpc/src/list.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/rpc/src/number.rs b/primitives/rpc/src/number.rs index 220b221b66..1d41dd234f 100644 --- a/primitives/rpc/src/number.rs +++ b/primitives/rpc/src/number.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/lib.rs b/primitives/runtime-interface/proc-macro/src/lib.rs index af18165457..47c9fd6bb7 100644 --- a/primitives/runtime-interface/proc-macro/src/lib.rs +++ b/primitives/runtime-interface/proc-macro/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs b/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs index c5c6980d2c..5e30870a82 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs b/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs index c650a8cb5c..5d5b3ae43b 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs b/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs index 0ca8cd0b5c..2e1caaa96c 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs b/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs index 23d5111832..1466af598e 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs index 1c662f8802..55b5eb3a4d 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs index 63cb75f667..42bfe3c712 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs index 142fff646e..1c88198d6e 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs index e76daf71bd..af71ba3241 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/proc-macro/src/utils.rs b/primitives/runtime-interface/proc-macro/src/utils.rs index d5ae107e0b..15c65f11ca 100644 --- a/primitives/runtime-interface/proc-macro/src/utils.rs +++ b/primitives/runtime-interface/proc-macro/src/utils.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/src/host.rs b/primitives/runtime-interface/src/host.rs index 10ebd1beec..2fc272165f 100644 --- a/primitives/runtime-interface/src/host.rs +++ b/primitives/runtime-interface/src/host.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index 23929e5b17..23be7fd35a 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/src/lib.rs b/primitives/runtime-interface/src/lib.rs index 4fb906c030..330b1699a6 100644 --- a/primitives/runtime-interface/src/lib.rs +++ b/primitives/runtime-interface/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/src/pass_by.rs b/primitives/runtime-interface/src/pass_by.rs index 000278839e..81da2fe7e6 100644 --- a/primitives/runtime-interface/src/pass_by.rs +++ b/primitives/runtime-interface/src/pass_by.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/src/util.rs b/primitives/runtime-interface/src/util.rs index 992c3b93cf..fa7016a2b0 100644 --- a/primitives/runtime-interface/src/util.rs +++ b/primitives/runtime-interface/src/util.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/src/wasm.rs b/primitives/runtime-interface/src/wasm.rs index 508f0c4f26..476dfb8a4c 100644 --- a/primitives/runtime-interface/src/wasm.rs +++ b/primitives/runtime-interface/src/wasm.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/test-wasm/build.rs b/primitives/runtime-interface/test-wasm/build.rs index ef2650dd5a..8e1d17e821 100644 --- a/primitives/runtime-interface/test-wasm/build.rs +++ b/primitives/runtime-interface/test-wasm/build.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/test-wasm/src/lib.rs b/primitives/runtime-interface/test-wasm/src/lib.rs index f353518019..a7e7e3e983 100644 --- a/primitives/runtime-interface/test-wasm/src/lib.rs +++ b/primitives/runtime-interface/test-wasm/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index fb3d10b023..683a7af297 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime-interface/tests/ui.rs b/primitives/runtime-interface/tests/ui.rs index 5b14ee81e8..910771f938 100644 --- a/primitives/runtime-interface/tests/ui.rs +++ b/primitives/runtime-interface/tests/ui.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/curve.rs b/primitives/runtime/src/curve.rs index f2e1a8b7d5..b45501fdb7 100644 --- a/primitives/runtime/src/curve.rs +++ b/primitives/runtime/src/curve.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/block.rs b/primitives/runtime/src/generic/block.rs index cad166e80c..21e65d1fb5 100644 --- a/primitives/runtime/src/generic/block.rs +++ b/primitives/runtime/src/generic/block.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/checked_extrinsic.rs b/primitives/runtime/src/generic/checked_extrinsic.rs index 3940943a59..b2d247ef5f 100644 --- a/primitives/runtime/src/generic/checked_extrinsic.rs +++ b/primitives/runtime/src/generic/checked_extrinsic.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/digest.rs b/primitives/runtime/src/generic/digest.rs index 9e241d9a48..6653cfb8a8 100644 --- a/primitives/runtime/src/generic/digest.rs +++ b/primitives/runtime/src/generic/digest.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/era.rs b/primitives/runtime/src/generic/era.rs index 8eeb550b2e..238130db00 100644 --- a/primitives/runtime/src/generic/era.rs +++ b/primitives/runtime/src/generic/era.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/header.rs b/primitives/runtime/src/generic/header.rs index 35f2e91afc..e3bb821aa8 100644 --- a/primitives/runtime/src/generic/header.rs +++ b/primitives/runtime/src/generic/header.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/mod.rs b/primitives/runtime/src/generic/mod.rs index 79e0d912b9..2416bb7047 100644 --- a/primitives/runtime/src/generic/mod.rs +++ b/primitives/runtime/src/generic/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/tests.rs b/primitives/runtime/src/generic/tests.rs index fed9f6ec60..de2f4a19d9 100644 --- a/primitives/runtime/src/generic/tests.rs +++ b/primitives/runtime/src/generic/tests.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/generic/unchecked_extrinsic.rs b/primitives/runtime/src/generic/unchecked_extrinsic.rs index 5b760ba7d1..0a43524248 100644 --- a/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 80ef992f6b..198f55869e 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/offchain/http.rs b/primitives/runtime/src/offchain/http.rs index 968d50daee..d7097d5b83 100644 --- a/primitives/runtime/src/offchain/http.rs +++ b/primitives/runtime/src/offchain/http.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/offchain/mod.rs b/primitives/runtime/src/offchain/mod.rs index 07c25570ee..742388f9ec 100644 --- a/primitives/runtime/src/offchain/mod.rs +++ b/primitives/runtime/src/offchain/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/random_number_generator.rs b/primitives/runtime/src/random_number_generator.rs index 487d3b9527..e741aac097 100644 --- a/primitives/runtime/src/random_number_generator.rs +++ b/primitives/runtime/src/random_number_generator.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/testing.rs b/primitives/runtime/src/testing.rs index 4fb7ccade7..516d581126 100644 --- a/primitives/runtime/src/testing.rs +++ b/primitives/runtime/src/testing.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index a0970accd8..d00f4c4380 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/transaction_validity.rs b/primitives/runtime/src/transaction_validity.rs index b08455aab6..6dfb80b6d7 100644 --- a/primitives/runtime/src/transaction_validity.rs +++ b/primitives/runtime/src/transaction_validity.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/sandbox/src/lib.rs b/primitives/sandbox/src/lib.rs index 448cadfe80..86098e73af 100755 --- a/primitives/sandbox/src/lib.rs +++ b/primitives/sandbox/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/sandbox/with_std.rs b/primitives/sandbox/with_std.rs index dacaa3a198..5f20342a5a 100755 --- a/primitives/sandbox/with_std.rs +++ b/primitives/sandbox/with_std.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/sandbox/without_std.rs b/primitives/sandbox/without_std.rs index e76bbe7285..901354aee3 100755 --- a/primitives/sandbox/without_std.rs +++ b/primitives/sandbox/without_std.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/serializer/src/lib.rs b/primitives/serializer/src/lib.rs index 2586d49f00..3138c3e63b 100644 --- a/primitives/serializer/src/lib.rs +++ b/primitives/serializer/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/session/src/lib.rs b/primitives/session/src/lib.rs index f6be084a67..af42d5dae1 100644 --- a/primitives/session/src/lib.rs +++ b/primitives/session/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/staking/src/lib.rs b/primitives/staking/src/lib.rs index 182307cb47..3f6c1873ff 100644 --- a/primitives/staking/src/lib.rs +++ b/primitives/staking/src/lib.rs @@ -1,5 +1,5 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/staking/src/offence.rs b/primitives/staking/src/offence.rs index 33170193ec..cac1ed065c 100644 --- a/primitives/staking/src/offence.rs +++ b/primitives/staking/src/offence.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/backend.rs b/primitives/state-machine/src/backend.rs index 7a5357c398..d19d0a1a58 100644 --- a/primitives/state-machine/src/backend.rs +++ b/primitives/state-machine/src/backend.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/basic.rs b/primitives/state-machine/src/basic.rs index 641d3b531c..c0db807335 100644 --- a/primitives/state-machine/src/basic.rs +++ b/primitives/state-machine/src/basic.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/build.rs b/primitives/state-machine/src/changes_trie/build.rs index 356c8614e2..38e60e8fcf 100644 --- a/primitives/state-machine/src/changes_trie/build.rs +++ b/primitives/state-machine/src/changes_trie/build.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/build_cache.rs b/primitives/state-machine/src/changes_trie/build_cache.rs index f5c7c28b6b..76e3652e16 100644 --- a/primitives/state-machine/src/changes_trie/build_cache.rs +++ b/primitives/state-machine/src/changes_trie/build_cache.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/build_iterator.rs b/primitives/state-machine/src/changes_trie/build_iterator.rs index 36b6dd1983..bb93ce98a8 100644 --- a/primitives/state-machine/src/changes_trie/build_iterator.rs +++ b/primitives/state-machine/src/changes_trie/build_iterator.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/changes_iterator.rs b/primitives/state-machine/src/changes_trie/changes_iterator.rs index f62575f451..9f2d44967d 100644 --- a/primitives/state-machine/src/changes_trie/changes_iterator.rs +++ b/primitives/state-machine/src/changes_trie/changes_iterator.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/input.rs b/primitives/state-machine/src/changes_trie/input.rs index e0bcad18be..9b3341ca58 100644 --- a/primitives/state-machine/src/changes_trie/input.rs +++ b/primitives/state-machine/src/changes_trie/input.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/mod.rs b/primitives/state-machine/src/changes_trie/mod.rs index 54eaa967c7..99ef7fd6ee 100644 --- a/primitives/state-machine/src/changes_trie/mod.rs +++ b/primitives/state-machine/src/changes_trie/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/prune.rs b/primitives/state-machine/src/changes_trie/prune.rs index c6d305ddf9..e16daea158 100644 --- a/primitives/state-machine/src/changes_trie/prune.rs +++ b/primitives/state-machine/src/changes_trie/prune.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/storage.rs b/primitives/state-machine/src/changes_trie/storage.rs index f9a03b6c2e..37dc607f63 100644 --- a/primitives/state-machine/src/changes_trie/storage.rs +++ b/primitives/state-machine/src/changes_trie/storage.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/changes_trie/surface_iterator.rs b/primitives/state-machine/src/changes_trie/surface_iterator.rs index f3583e2f57..02a7c277d9 100644 --- a/primitives/state-machine/src/changes_trie/surface_iterator.rs +++ b/primitives/state-machine/src/changes_trie/surface_iterator.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/error.rs b/primitives/state-machine/src/error.rs index 6e6ce99585..464403c2f8 100644 --- a/primitives/state-machine/src/error.rs +++ b/primitives/state-machine/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index 32dcba634e..2da70eff24 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index 86cae2dfbb..26cdb20ffd 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index f4e0de5045..d8482788a8 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/proving_backend.rs b/primitives/state-machine/src/proving_backend.rs index 92ad2047a5..0eed1cbf62 100644 --- a/primitives/state-machine/src/proving_backend.rs +++ b/primitives/state-machine/src/proving_backend.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/testing.rs b/primitives/state-machine/src/testing.rs index 7bb7e7320b..cb72684b99 100644 --- a/primitives/state-machine/src/testing.rs +++ b/primitives/state-machine/src/testing.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/trie_backend.rs b/primitives/state-machine/src/trie_backend.rs index 4b48bec31b..1920ea40a8 100644 --- a/primitives/state-machine/src/trie_backend.rs +++ b/primitives/state-machine/src/trie_backend.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/state-machine/src/trie_backend_essence.rs b/primitives/state-machine/src/trie_backend_essence.rs index 75601373ed..bd3fca07dd 100644 --- a/primitives/state-machine/src/trie_backend_essence.rs +++ b/primitives/state-machine/src/trie_backend_essence.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/std/src/lib.rs b/primitives/std/src/lib.rs index 18533e041b..3fcf5daeb4 100644 --- a/primitives/std/src/lib.rs +++ b/primitives/std/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/std/with_std.rs b/primitives/std/with_std.rs index e41a9d7ad6..657d51dbf1 100644 --- a/primitives/std/with_std.rs +++ b/primitives/std/with_std.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/std/without_std.rs b/primitives/std/without_std.rs index a35e1395a5..ad587531dd 100755 --- a/primitives/std/without_std.rs +++ b/primitives/std/without_std.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/storage/src/lib.rs b/primitives/storage/src/lib.rs index 491a157ebe..d32c54aae8 100644 --- a/primitives/storage/src/lib.rs +++ b/primitives/storage/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/test-primitives/src/lib.rs b/primitives/test-primitives/src/lib.rs index d95b9cb3e2..5174aac843 100644 --- a/primitives/test-primitives/src/lib.rs +++ b/primitives/test-primitives/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/timestamp/src/lib.rs b/primitives/timestamp/src/lib.rs index 9306e14ca8..50b871d73e 100644 --- a/primitives/timestamp/src/lib.rs +++ b/primitives/timestamp/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/transaction-pool/src/error.rs b/primitives/transaction-pool/src/error.rs index bf1bcf354d..ecce202d7d 100644 --- a/primitives/transaction-pool/src/error.rs +++ b/primitives/transaction-pool/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/transaction-pool/src/lib.rs b/primitives/transaction-pool/src/lib.rs index 29db338b62..9abbcfbdf2 100644 --- a/primitives/transaction-pool/src/lib.rs +++ b/primitives/transaction-pool/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index 52a3282f87..6e68574dde 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/transaction-pool/src/runtime_api.rs b/primitives/transaction-pool/src/runtime_api.rs index 4ca47805b9..e30ce7c828 100644 --- a/primitives/transaction-pool/src/runtime_api.rs +++ b/primitives/transaction-pool/src/runtime_api.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/trie/benches/bench.rs b/primitives/trie/benches/bench.rs index 353644ee1e..72a53c18d2 100644 --- a/primitives/trie/benches/bench.rs +++ b/primitives/trie/benches/bench.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// Copyright 2015-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Parity is free software: you can redistribute it and/or modify diff --git a/primitives/trie/src/error.rs b/primitives/trie/src/error.rs index c18db37f35..2d3a1b7928 100644 --- a/primitives/trie/src/error.rs +++ b/primitives/trie/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2017 Parity Technologies +// Copyright 2015-2020 Parity Technologies (UK) Ltd. // // Licensed under the Apache License, Version 2.0 or the MIT license diff --git a/primitives/trie/src/lib.rs b/primitives/trie/src/lib.rs index 08f26e0063..4ca26542dd 100644 --- a/primitives/trie/src/lib.rs +++ b/primitives/trie/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// Copyright 2015-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Parity is free software: you can redistribute it and/or modify diff --git a/primitives/trie/src/node_codec.rs b/primitives/trie/src/node_codec.rs index 0b48941ca6..8a61f372cf 100644 --- a/primitives/trie/src/node_codec.rs +++ b/primitives/trie/src/node_codec.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// Copyright 2015-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Parity is free software: you can redistribute it and/or modify diff --git a/primitives/trie/src/node_header.rs b/primitives/trie/src/node_header.rs index 43d71e33b3..edcd28a568 100644 --- a/primitives/trie/src/node_header.rs +++ b/primitives/trie/src/node_header.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// Copyright 2015-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Parity is free software: you can redistribute it and/or modify diff --git a/primitives/trie/src/trie_stream.rs b/primitives/trie/src/trie_stream.rs index 926397346f..0c92e673aa 100644 --- a/primitives/trie/src/trie_stream.rs +++ b/primitives/trie/src/trie_stream.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// Copyright 2015-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Parity is free software: you can redistribute it and/or modify diff --git a/primitives/version/src/lib.rs b/primitives/version/src/lib.rs index edb4aa851e..35c6c6dfff 100644 --- a/primitives/version/src/lib.rs +++ b/primitives/version/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/wasm-interface/src/lib.rs b/primitives/wasm-interface/src/lib.rs index b2d57d080d..bc34bfda97 100644 --- a/primitives/wasm-interface/src/lib.rs +++ b/primitives/wasm-interface/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/primitives/wasm-interface/src/wasmi_impl.rs b/primitives/wasm-interface/src/wasmi_impl.rs index be9b724d29..dea8519b71 100644 --- a/primitives/wasm-interface/src/wasmi_impl.rs +++ b/primitives/wasm-interface/src/wasmi_impl.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/client/src/client_ext.rs b/test-utils/client/src/client_ext.rs index f560d0f97b..49d46c8665 100644 --- a/test-utils/client/src/client_ext.rs +++ b/test-utils/client/src/client_ext.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index 2496409f87..665fdf621f 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/runtime/build.rs b/test-utils/runtime/build.rs index 3197a406f2..a90270d85d 100644 --- a/test-utils/runtime/build.rs +++ b/test-utils/runtime/build.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/runtime/client/src/block_builder_ext.rs b/test-utils/runtime/client/src/block_builder_ext.rs index 5b98b1deb3..356ee428d5 100644 --- a/test-utils/runtime/client/src/block_builder_ext.rs +++ b/test-utils/runtime/client/src/block_builder_ext.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/runtime/client/src/lib.rs b/test-utils/runtime/client/src/lib.rs index 988fa56678..28b219ccd4 100644 --- a/test-utils/runtime/client/src/lib.rs +++ b/test-utils/runtime/client/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/runtime/client/src/trait_tests.rs b/test-utils/runtime/client/src/trait_tests.rs index 129c1e4240..3b0b330226 100644 --- a/test-utils/runtime/client/src/trait_tests.rs +++ b/test-utils/runtime/client/src/trait_tests.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/runtime/src/genesismap.rs b/test-utils/runtime/src/genesismap.rs index 62d9b160b9..f6fbcddf44 100644 --- a/test-utils/runtime/src/genesismap.rs +++ b/test-utils/runtime/src/genesismap.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index cfb1f9df53..cf1d76f390 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/runtime/src/system.rs b/test-utils/runtime/src/system.rs index 162f9a8ad6..87b3271e78 100644 --- a/test-utils/runtime/src/system.rs +++ b/test-utils/runtime/src/system.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index f79a5da5c6..c1a18a1fa7 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/build-script-utils/src/lib.rs b/utils/build-script-utils/src/lib.rs index be2f4636b6..1b915bdcaf 100644 --- a/utils/build-script-utils/src/lib.rs +++ b/utils/build-script-utils/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/fork-tree/src/lib.rs b/utils/fork-tree/src/lib.rs index f192ee5478..7bdb2d2dbc 100644 --- a/utils/fork-tree/src/lib.rs +++ b/utils/fork-tree/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/frame/rpc/support/src/lib.rs b/utils/frame/rpc/support/src/lib.rs index 80c0658086..ba467abd92 100644 --- a/utils/frame/rpc/support/src/lib.rs +++ b/utils/frame/rpc/support/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/frame/rpc/system/src/lib.rs b/utils/frame/rpc/system/src/lib.rs index c1d9b1f4f6..3af1f2239b 100644 --- a/utils/frame/rpc/system/src/lib.rs +++ b/utils/frame/rpc/system/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/grafana-data-source/src/database.rs b/utils/grafana-data-source/src/database.rs index 55b48123fa..d4c9c7ce81 100644 --- a/utils/grafana-data-source/src/database.rs +++ b/utils/grafana-data-source/src/database.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/grafana-data-source/src/lib.rs b/utils/grafana-data-source/src/lib.rs index 86c523cc53..fbba064706 100644 --- a/utils/grafana-data-source/src/lib.rs +++ b/utils/grafana-data-source/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/grafana-data-source/src/networking.rs b/utils/grafana-data-source/src/networking.rs index f5bbd21d57..5c8c036d44 100644 --- a/utils/grafana-data-source/src/networking.rs +++ b/utils/grafana-data-source/src/networking.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/grafana-data-source/src/server.rs b/utils/grafana-data-source/src/server.rs index 6553a7b9e0..8ef5e03784 100644 --- a/utils/grafana-data-source/src/server.rs +++ b/utils/grafana-data-source/src/server.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/grafana-data-source/src/types.rs b/utils/grafana-data-source/src/types.rs index 773fcb652d..960fc787e3 100644 --- a/utils/grafana-data-source/src/types.rs +++ b/utils/grafana-data-source/src/types.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/grafana-data-source/test/src/main.rs b/utils/grafana-data-source/test/src/main.rs index a723e7e476..53deaffc3b 100644 --- a/utils/grafana-data-source/test/src/main.rs +++ b/utils/grafana-data-source/test/src/main.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/wasm-builder-runner/src/lib.rs b/utils/wasm-builder-runner/src/lib.rs index 706b623fc3..40016a0159 100644 --- a/utils/wasm-builder-runner/src/lib.rs +++ b/utils/wasm-builder-runner/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/wasm-builder/src/lib.rs b/utils/wasm-builder/src/lib.rs index a689f15b55..80192eb361 100644 --- a/utils/wasm-builder/src/lib.rs +++ b/utils/wasm-builder/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/wasm-builder/src/prerequisites.rs b/utils/wasm-builder/src/prerequisites.rs index 3a7f8387dc..da118a71f9 100644 --- a/utils/wasm-builder/src/prerequisites.rs +++ b/utils/wasm-builder/src/prerequisites.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify diff --git a/utils/wasm-builder/src/wasm_project.rs b/utils/wasm-builder/src/wasm_project.rs index 66da930f3a..a028d00930 100644 --- a/utils/wasm-builder/src/wasm_project.rs +++ b/utils/wasm-builder/src/wasm_project.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify -- GitLab From e89ff862d843f6058961e3418646630008ba8aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Mon, 6 Jan 2020 12:43:25 +0000 Subject: [PATCH 051/296] client: hack around fork blocks deserialization issue (#4539) --- client/api/src/client.rs | 7 +++---- client/src/client.rs | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/client/api/src/client.rs b/client/api/src/client.rs index d941b9d906..ceb3601085 100644 --- a/client/api/src/client.rs +++ b/client/api/src/client.rs @@ -16,12 +16,11 @@ //! A set of APIs supported by the client along with their primitives. -use std::collections::HashMap; use futures::channel::mpsc; use sp_core::storage::StorageKey; use sp_runtime::{ - traits::{Block as BlockT, NumberFor}, - generic::BlockId + traits::{Block as BlockT, NumberFor}, + generic::BlockId }; use sp_consensus::BlockOrigin; @@ -38,7 +37,7 @@ pub type FinalityNotifications = mpsc::UnboundedReceiver = Option, ::Hash>>; +pub type ForkBlocks = Option, ::Hash)>>; /// Figure out the block type for a given type (for now, just a `Client`). pub trait BlockOf { diff --git a/client/src/client.rs b/client/src/client.rs index 0bd08548be..349cd816b2 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1472,7 +1472,10 @@ impl<'a, B, E, Block, RA> sp_consensus::BlockImport for &'a Client Result { let BlockCheckParams { hash, number, parent_hash, allow_missing_state, import_existing } = block; - if let Some(h) = self.fork_blocks.as_ref().and_then(|x| x.get(&number)) { + let fork_block = self.fork_blocks.as_ref() + .and_then(|fs| fs.iter().find(|(n, _)| *n == number)); + + if let Some((_, h)) = fork_block { if &hash != h { trace!( "Rejecting block from known invalid fork. Got {:?}, expected: {:?} at height {}", -- GitLab From 67493b07787e45bfb06fffaa96c60098d0495930 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Mon, 6 Jan 2020 14:07:05 +0100 Subject: [PATCH 052/296] Remove jimpo from CODEOWNERS (#4541) Good night sweet prince --- docs/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index edb10617f4..993a0cab93 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -48,7 +48,7 @@ /client/consensus/slots/ @andresilva @DemiMarie-parity # Contracts -/frame/contracts/ @pepyakin @thiolliere @jimpo +/frame/contracts/ @pepyakin @thiolliere /frame/contracts/src/wasm/runtime.rs @Robbepop # Inflation points -- GitLab From b4503acc1b52c561632e0a8f6e2b17698184bf70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Mon, 6 Jan 2020 14:52:14 +0000 Subject: [PATCH 053/296] client: helper to create standalone client without service (#4536) --- client/service/src/builder.rs | 123 +++++++++++++++++++++------------- client/service/src/lib.rs | 1 + 2 files changed, 78 insertions(+), 46 deletions(-) diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 8e51cf1837..849203b09d 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -139,6 +139,82 @@ pub type TLightCallExecutor = sc_client::light::call_executor::G >, >; +type TFullParts = ( + TFullClient, + Arc>, + Arc>, +); + +/// Creates a new full client for the given config. +pub fn new_full_client( + config: &Configuration, +) -> Result, Error> where + TBl: BlockT, + TExecDisp: NativeExecutionDispatch, + TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, + TCSExt: Extension, +{ + new_full_parts(config).map(|parts| parts.0) +} + +fn new_full_parts( + config: &Configuration, +) -> Result, Error> where + TBl: BlockT, + TExecDisp: NativeExecutionDispatch, + TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, + TCSExt: Extension, +{ + let keystore = Keystore::open( + config.keystore_path.clone().ok_or("No basepath configured")?, + config.keystore_password.clone() + )?; + + let executor = NativeExecutor::::new( + config.wasm_method, + config.default_heap_pages, + ); + + let fork_blocks = config.chain_spec + .extensions() + .get::>() + .cloned() + .unwrap_or_default(); + + let (client, backend) = { + let db_config = sc_client_db::DatabaseSettings { + state_cache_size: config.state_cache_size, + state_cache_child_ratio: + config.state_cache_child_ratio.map(|v| (v, 100)), + pruning: config.pruning.clone(), + source: match &config.database { + DatabaseConfig::Path { path, cache_size } => + sc_client_db::DatabaseSettingsSrc::Path { + path: path.clone(), + cache_size: cache_size.clone().map(|u| u as usize), + }, + DatabaseConfig::Custom(db) => + sc_client_db::DatabaseSettingsSrc::Custom(db.clone()), + }, + }; + + let extensions = sc_client_api::execution_extensions::ExecutionExtensions::new( + config.execution_strategies.clone(), + Some(keystore.clone()), + ); + + sc_client_db::new_client( + db_config, + executor, + &config.chain_spec, + fork_blocks, + extensions, + )? + }; + + Ok((client, backend, keystore)) +} + impl ServiceBuilder<(), (), TCfg, TGen, TCSExt, (), (), (), (), (), (), (), (), (), ()> where TGen: RuntimeGenesis, TCSExt: Extension { /// Start the service builder with a configuration. @@ -161,52 +237,7 @@ where TGen: RuntimeGenesis, TCSExt: Extension { (), TFullBackend, >, Error> { - let keystore = Keystore::open( - config.keystore_path.clone().ok_or("No basepath configured")?, - config.keystore_password.clone() - )?; - - let executor = NativeExecutor::::new( - config.wasm_method, - config.default_heap_pages, - ); - - let fork_blocks = config.chain_spec - .extensions() - .get::>() - .cloned() - .unwrap_or_default(); - - let (client, backend) = { - let db_config = sc_client_db::DatabaseSettings { - state_cache_size: config.state_cache_size, - state_cache_child_ratio: - config.state_cache_child_ratio.map(|v| (v, 100)), - pruning: config.pruning.clone(), - source: match &config.database { - DatabaseConfig::Path { path, cache_size } => - sc_client_db::DatabaseSettingsSrc::Path { - path: path.clone(), - cache_size: cache_size.clone().map(|u| u as usize), - }, - DatabaseConfig::Custom(db) => - sc_client_db::DatabaseSettingsSrc::Custom(db.clone()), - }, - }; - - let extensions = sc_client_api::execution_extensions::ExecutionExtensions::new( - config.execution_strategies.clone(), - Some(keystore.clone()), - ); - - sc_client_db::new_client( - db_config, - executor, - &config.chain_spec, - fork_blocks, - extensions, - )? - }; + let (client, backend, keystore) = new_full_parts(&config)?; let client = Arc::new(client); diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 5073f09acd..dc1966f0ac 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -54,6 +54,7 @@ use sp_runtime::traits::{NumberFor, Block as BlockT}; pub use self::error::Error; pub use self::builder::{ + new_full_client, ServiceBuilder, ServiceBuilderCommand, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, }; -- GitLab From 597df6eb396726f910f1c9da8847f965cf30259b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Mon, 6 Jan 2020 14:58:43 +0000 Subject: [PATCH 054/296] client: allow reverting finalized blocks (#4535) * client: allow reverting blocks past finality * client: fix leaves reversion * client: extend docs on revert * client: add comment on leaves revert --- client/api/src/backend.rs | 10 +++- client/db/src/lib.rs | 91 +++++++++++++++++++++++++------------ client/src/client.rs | 20 ++++++-- client/src/in_mem.rs | 6 ++- client/src/leaves.rs | 35 +++++++++++--- client/src/light/backend.rs | 6 ++- 6 files changed, 125 insertions(+), 43 deletions(-) diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index 632c5d5b62..90a0c9aa7b 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -283,10 +283,16 @@ pub trait Backend: AuxStore + Send + Sync where Ok(()) } - /// Attempts to revert the chain by `n` blocks. + /// Attempts to revert the chain by `n` blocks. If `revert_finalized` is set + /// it will attempt to revert past any finalized block, this is unsafe and + /// can potentially leave the node in an inconsistent state. /// /// Returns the number of blocks that were successfully reverted. - fn revert(&self, n: NumberFor) -> sp_blockchain::Result>; + fn revert( + &self, + n: NumberFor, + revert_finalized: bool, + ) -> sp_blockchain::Result>; /// Insert auxiliary data into key-value store. fn insert_aux< diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 80d71ec149..d8dcf3c0af 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -1484,40 +1484,71 @@ impl sc_client_api::backend::Backend for Backend) -> ClientResult> { - let mut best = self.blockchain.info().best_number; + fn revert(&self, n: NumberFor, revert_finalized: bool) -> ClientResult> { + let mut best_number = self.blockchain.info().best_number; + let mut best_hash = self.blockchain.info().best_hash; let finalized = self.blockchain.info().finalized_number; - let revertible = best - finalized; - let n = if revertible < n { revertible } else { n }; - for c in 0 .. n.saturated_into::() { - if best.is_zero() { - return Ok(c.saturated_into::>()) - } - let mut transaction = DBTransaction::new(); - match self.storage.state_db.revert_one() { - Some(commit) => { - apply_state_commit(&mut transaction, commit); - let removed = self.blockchain.header(BlockId::Number(best))?.ok_or_else( - || sp_blockchain::Error::UnknownBlock( - format!("Error reverting to {}. Block hash not found.", best)))?; - - best -= One::one(); // prev block - let hash = self.blockchain.hash(best)?.ok_or_else( - || sp_blockchain::Error::UnknownBlock( - format!("Error reverting to {}. Block hash not found.", best)))?; - let key = utils::number_and_hash_to_lookup_key(best.clone(), &hash)?; - transaction.put(columns::META, meta_keys::BEST_BLOCK, &key); - transaction.delete(columns::KEY_LOOKUP, removed.hash().as_ref()); - children::remove_children(&mut transaction, columns::META, meta_keys::CHILDREN_PREFIX, hash); - self.storage.db.write(transaction).map_err(db_err)?; - self.blockchain.update_meta(hash, best, true, false); - self.blockchain.leaves.write().revert(removed.hash().clone(), removed.number().clone(), removed.parent_hash().clone()); + let revertible = best_number - finalized; + let n = if !revert_finalized && revertible < n { + revertible + } else { + n + }; + + let mut revert_blocks = || -> ClientResult> { + for c in 0 .. n.saturated_into::() { + if best_number.is_zero() { + return Ok(c.saturated_into::>()) + } + let mut transaction = DBTransaction::new(); + match self.storage.state_db.revert_one() { + Some(commit) => { + apply_state_commit(&mut transaction, commit); + let removed = self.blockchain.header(BlockId::Number(best_number))?.ok_or_else( + || sp_blockchain::Error::UnknownBlock( + format!("Error reverting to {}. Block hash not found.", best_number)))?; + + best_number -= One::one(); // prev block + best_hash = self.blockchain.hash(best_number)?.ok_or_else( + || sp_blockchain::Error::UnknownBlock( + format!("Error reverting to {}. Block hash not found.", best_number)))?; + + let update_finalized = best_number < finalized; + + let key = utils::number_and_hash_to_lookup_key(best_number.clone(), &best_hash)?; + transaction.put(columns::META, meta_keys::BEST_BLOCK, &key); + if update_finalized { + transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &key); + } + transaction.delete(columns::KEY_LOOKUP, removed.hash().as_ref()); + children::remove_children(&mut transaction, columns::META, meta_keys::CHILDREN_PREFIX, best_hash); + self.storage.db.write(transaction).map_err(db_err)?; + self.blockchain.update_meta(best_hash, best_number, true, update_finalized); + } + None => return Ok(c.saturated_into::>()) } - None => return Ok(c.saturated_into::>()) } - } - Ok(n) + + Ok(n) + }; + + let reverted = revert_blocks()?; + + let revert_leaves = || -> ClientResult<()> { + let mut transaction = DBTransaction::new(); + let mut leaves = self.blockchain.leaves.write(); + + leaves.revert(best_hash, best_number); + leaves.prepare_transaction(&mut transaction, columns::META, meta_keys::LEAF_PREFIX); + self.storage.db.write(transaction).map_err(db_err)?; + + Ok(()) + }; + + revert_leaves()?; + + Ok(reverted) } fn blockchain(&self) -> &BlockchainDb { diff --git a/client/src/client.rs b/client/src/client.rs index 349cd816b2..66e031db9f 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1142,10 +1142,24 @@ impl Client where Ok(()) } - /// Attempts to revert the chain by `n` blocks. Returns the number of blocks that were - /// successfully reverted. + /// Attempts to revert the chain by `n` blocks guaranteeing that no block is + /// reverted past the last finalized block. Returns the number of blocks + /// that were successfully reverted. pub fn revert(&self, n: NumberFor) -> sp_blockchain::Result> { - Ok(self.backend.revert(n)?) + Ok(self.backend.revert(n, false)?) + } + + /// Attempts to revert the chain by `n` blocks disregarding finality. This + /// method will revert any finalized blocks as requested and can potentially + /// lead the node in an inconsistent state. Other modules in the system that + /// persist data and that rely on finality (e.g. consensus parts) will be + /// unaffected by the revert. Use this method with caution and making sure + /// that no other data needs to be reverted for consistency aside from the + /// block data. + /// + /// Returns the number of blocks that were successfully reverted. + pub fn unsafe_revert(&self, n: NumberFor) -> sp_blockchain::Result> { + Ok(self.backend.revert(n, true)?) } /// Get usage info about current client. diff --git a/client/src/in_mem.rs b/client/src/in_mem.rs index af3adbbb5c..020f2b9e4e 100644 --- a/client/src/in_mem.rs +++ b/client/src/in_mem.rs @@ -707,7 +707,11 @@ where } } - fn revert(&self, _n: NumberFor) -> sp_blockchain::Result> { + fn revert( + &self, + _n: NumberFor, + _revert_finalized: bool, + ) -> sp_blockchain::Result> { Ok(Zero::zero()) } diff --git a/client/src/leaves.rs b/client/src/leaves.rs index 8a9df0f071..bb556da83a 100644 --- a/client/src/leaves.rs +++ b/client/src/leaves.rs @@ -158,12 +158,35 @@ impl LeafSet where Undo { inner: self } } - /// currently since revert only affects the canonical chain - /// we assume that parent has no further children - /// and we add it as leaf again - pub fn revert(&mut self, hash: H, number: N, parent_hash: H) { - self.insert_leaf(Reverse(number.clone() - N::one()), parent_hash); - self.remove_leaf(&Reverse(number), &hash); + /// Revert to the given block height by dropping all leaves in the leaf set + /// with a block number higher than the target. + pub fn revert(&mut self, best_hash: H, best_number: N) { + let items = self.storage.iter() + .flat_map(|(number, hashes)| hashes.iter().map(move |h| (h.clone(), number.clone()))) + .collect::>(); + + for (hash, number) in &items { + if number.0 > best_number { + assert!( + self.remove_leaf(number, hash), + "item comes from an iterator over storage; qed", + ); + + self.pending_removed.push(hash.clone()); + } + } + + let best_number = Reverse(best_number); + let leaves_contains_best = self.storage + .get(&best_number) + .map_or(false, |hashes| hashes.contains(&best_hash)); + + // we need to make sure that the best block exists in the leaf set as + // this is an invariant of regular block import. + if !leaves_contains_best { + self.insert_leaf(best_number.clone(), best_hash.clone()); + self.pending_added.push(LeafSetItem { hash: best_hash, number: best_number }); + } } /// returns an iterator over all hashes in the leaf set diff --git a/client/src/light/backend.rs b/client/src/light/backend.rs index 58151ce99a..568d290834 100644 --- a/client/src/light/backend.rs +++ b/client/src/light/backend.rs @@ -213,7 +213,11 @@ impl ClientBackend for Backend where Ok(GenesisOrUnavailableState::Unavailable) } - fn revert(&self, _n: NumberFor) -> ClientResult> { + fn revert( + &self, + _n: NumberFor, + _revert_finalized: bool, + ) -> ClientResult> { Err(ClientError::NotAvailableOnLightClient) } -- GitLab From 3e651110aa06aa835790df63410a29676243fc54 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 6 Jan 2020 16:08:11 +0100 Subject: [PATCH 055/296] Spaces to tabs. --- primitives/consensus/babe/src/inherents.rs | 70 +++++++++++----------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/primitives/consensus/babe/src/inherents.rs b/primitives/consensus/babe/src/inherents.rs index 4a460ec6f7..7c0744ac6e 100644 --- a/primitives/consensus/babe/src/inherents.rs +++ b/primitives/consensus/babe/src/inherents.rs @@ -32,59 +32,59 @@ pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; pub type InherentType = u64; /// Auxiliary trait to extract BABE inherent data. pub trait BabeInherentData { - /// Get BABE inherent data. - fn babe_inherent_data(&self) -> Result; - /// Replace BABE inherent data. - fn babe_replace_inherent_data(&mut self, new: InherentType); + /// Get BABE inherent data. + fn babe_inherent_data(&self) -> Result; + /// Replace BABE inherent data. + fn babe_replace_inherent_data(&mut self, new: InherentType); } impl BabeInherentData for InherentData { - fn babe_inherent_data(&self) -> Result { - self.get_data(&INHERENT_IDENTIFIER) - .and_then(|r| r.ok_or_else(|| "BABE inherent data not found".into())) - } + fn babe_inherent_data(&self) -> Result { + self.get_data(&INHERENT_IDENTIFIER) + .and_then(|r| r.ok_or_else(|| "BABE inherent data not found".into())) + } - fn babe_replace_inherent_data(&mut self, new: InherentType) { - self.replace_data(INHERENT_IDENTIFIER, &new); - } + fn babe_replace_inherent_data(&mut self, new: InherentType) { + self.replace_data(INHERENT_IDENTIFIER, &new); + } } /// Provides the slot duration inherent data for BABE. #[cfg(feature = "std")] pub struct InherentDataProvider { - slot_duration: u64, + slot_duration: u64, } #[cfg(feature = "std")] impl InherentDataProvider { - /// Constructs `Self` - pub fn new(slot_duration: u64) -> Self { - Self { slot_duration } - } + /// Constructs `Self` + pub fn new(slot_duration: u64) -> Self { + Self { slot_duration } + } } #[cfg(feature = "std")] impl ProvideInherentData for InherentDataProvider { - fn on_register(&self, providers: &InherentDataProviders) -> Result<(), Error> { - if !providers.has_provider(&sp_timestamp::INHERENT_IDENTIFIER) { - // Add the timestamp inherent data provider, as we require it. - providers.register_provider(sp_timestamp::InherentDataProvider) - } else { - Ok(()) - } - } + fn on_register(&self, providers: &InherentDataProviders) -> Result<(), Error> { + if !providers.has_provider(&sp_timestamp::INHERENT_IDENTIFIER) { + // Add the timestamp inherent data provider, as we require it. + providers.register_provider(sp_timestamp::InherentDataProvider) + } else { + Ok(()) + } + } - fn inherent_identifier(&self) -> &'static InherentIdentifier { - &INHERENT_IDENTIFIER - } + fn inherent_identifier(&self) -> &'static InherentIdentifier { + &INHERENT_IDENTIFIER + } - fn provide_inherent_data(&self, inherent_data: &mut InherentData) -> Result<(), Error> { - let timestamp = inherent_data.timestamp_inherent_data()?; - let slot_number = timestamp / self.slot_duration; - inherent_data.put_data(INHERENT_IDENTIFIER, &slot_number) - } + fn provide_inherent_data(&self, inherent_data: &mut InherentData) -> Result<(), Error> { + let timestamp = inherent_data.timestamp_inherent_data()?; + let slot_number = timestamp / self.slot_duration; + inherent_data.put_data(INHERENT_IDENTIFIER, &slot_number) + } - fn error_to_string(&self, error: &[u8]) -> Option { - Error::decode(&mut &error[..]).map(|e| e.into_string()).ok() - } + fn error_to_string(&self, error: &[u8]) -> Option { + Error::decode(&mut &error[..]).map(|e| e.into_string()).ok() + } } -- GitLab From 18d734c569d2087c75c2249662021d38d8d02e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Mon, 6 Jan 2020 18:03:44 +0000 Subject: [PATCH 056/296] client: add a block blacklist extension (#4544) * client: add a block blacklist extension * test-utils: fix client construction * client: fix rustdoc test --- bin/node/cli/res/flaming-fir.json | 5 +++-- bin/node/cli/src/chain_spec.rs | 3 +++ client/api/src/client.rs | 10 +++++++++- client/db/src/lib.rs | 12 ++++++++++-- client/service/src/builder.rs | 7 +++++++ client/src/client.rs | 29 +++++++++++++++++++++++++++-- client/src/lib.rs | 3 ++- client/src/light/mod.rs | 9 ++++++++- test-utils/client/src/lib.rs | 1 + 9 files changed, 70 insertions(+), 9 deletions(-) diff --git a/bin/node/cli/res/flaming-fir.json b/bin/node/cli/res/flaming-fir.json index 401825b4a6..413fa3b6d7 100644 --- a/bin/node/cli/res/flaming-fir.json +++ b/bin/node/cli/res/flaming-fir.json @@ -22,7 +22,8 @@ "tokenDecimals": 15, "tokenSymbol": "FIR" }, - "fork_blocks": null, + "forkBlocks": null, + "badBlocks": null, "consensusEngine": null, "genesis": { "raw": { @@ -119,4 +120,4 @@ "children": {} } } -} \ No newline at end of file +} diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index 836ce53996..26b1f6d294 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -47,9 +47,12 @@ const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; /// Additional parameters for some Substrate core modules, /// customizable from the chain spec. #[derive(Default, Clone, Serialize, Deserialize, ChainSpecExtension)] +#[serde(rename_all = "camelCase")] pub struct Extensions { /// Block numbers with known hashes. pub fork_blocks: sc_client::ForkBlocks, + /// Known bad block hashes. + pub bad_blocks: sc_client::BadBlocks, } /// Specialized `ChainSpec`. diff --git a/client/api/src/client.rs b/client/api/src/client.rs index ceb3601085..9e095a897f 100644 --- a/client/api/src/client.rs +++ b/client/api/src/client.rs @@ -16,6 +16,7 @@ //! A set of APIs supported by the client along with their primitives. +use std::collections::HashSet; use futures::channel::mpsc; use sp_core::storage::StorageKey; use sp_runtime::{ @@ -36,9 +37,16 @@ pub type FinalityNotifications = mpsc::UnboundedReceiver = Option, ::Hash)>>; +/// Known bad block hashes. +/// +/// This may be used as chain spec extension to filter out known, unwanted forks. +pub type BadBlocks = Option::Hash>>; + /// Figure out the block type for a given type (for now, just a `Client`). pub trait BlockOf { /// The type of the block. diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index d8dcf3c0af..34aec0441f 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -39,7 +39,7 @@ use std::path::PathBuf; use std::io; use std::collections::{HashMap, HashSet}; -use sc_client_api::{execution_extensions::ExecutionExtensions, ForkBlocks}; +use sc_client_api::{execution_extensions::ExecutionExtensions, BadBlocks, ForkBlocks}; use sc_client_api::backend::NewBlockState; use sc_client_api::backend::{StorageCollection, ChildStorageCollection}; use sp_blockchain::{ @@ -276,6 +276,7 @@ pub fn new_client( executor: E, genesis_storage: S, fork_blocks: ForkBlocks, + bad_blocks: BadBlocks, execution_extensions: ExecutionExtensions, ) -> Result<( sc_client::Client< @@ -296,7 +297,14 @@ pub fn new_client( let backend = Arc::new(Backend::new(settings, CANONICALIZATION_DELAY)?); let executor = sc_client::LocalCallExecutor::new(backend.clone(), executor); Ok(( - sc_client::Client::new(backend.clone(), executor, genesis_storage, fork_blocks, execution_extensions)?, + sc_client::Client::new( + backend.clone(), + executor, + genesis_storage, + fork_blocks, + bad_blocks, + execution_extensions, + )?, backend, )) } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 849203b09d..be7a6fb677 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -181,6 +181,12 @@ fn new_full_parts( .cloned() .unwrap_or_default(); + let bad_blocks = config.chain_spec + .extensions() + .get::>() + .cloned() + .unwrap_or_default(); + let (client, backend) = { let db_config = sc_client_db::DatabaseSettings { state_cache_size: config.state_cache_size, @@ -208,6 +214,7 @@ fn new_full_parts( executor, &config.chain_spec, fork_blocks, + bad_blocks, extensions, )? }; diff --git a/client/src/client.rs b/client/src/client.rs index 66e031db9f..234f86436e 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -69,7 +69,7 @@ pub use sc_client_api::{ }, client::{ ImportNotifications, FinalityNotification, FinalityNotifications, BlockImportNotification, - ClientInfo, BlockchainEvents, BlockBody, ProvideUncles, ForkBlocks, + ClientInfo, BlockchainEvents, BlockBody, ProvideUncles, BadBlocks, ForkBlocks, BlockOf, }, execution_extensions::{ExecutionExtensions, ExecutionStrategies}, @@ -101,6 +101,7 @@ pub struct Client where Block: BlockT { // holds the block hash currently being imported. TODO: replace this with block queue importing_block: RwLock>, fork_blocks: ForkBlocks, + bad_blocks: BadBlocks, execution_extensions: ExecutionExtensions, _phantom: PhantomData, } @@ -174,7 +175,14 @@ pub fn new_with_backend( { let call_executor = LocalCallExecutor::new(backend.clone(), executor); let extensions = ExecutionExtensions::new(Default::default(), keystore); - Client::new(backend, call_executor, build_genesis_storage, Default::default(), extensions) + Client::new( + backend, + call_executor, + build_genesis_storage, + Default::default(), + Default::default(), + extensions, + ) } impl BlockOf for Client where @@ -196,6 +204,7 @@ impl Client where executor: E, build_genesis_storage: S, fork_blocks: ForkBlocks, + bad_blocks: BadBlocks, execution_extensions: ExecutionExtensions, ) -> sp_blockchain::Result { if backend.blockchain().header(BlockId::Number(Zero::zero()))?.is_none() { @@ -225,6 +234,7 @@ impl Client where finality_notification_sinks: Default::default(), importing_block: Default::default(), fork_blocks, + bad_blocks, execution_extensions, _phantom: Default::default(), }) @@ -1486,6 +1496,8 @@ impl<'a, B, E, Block, RA> sp_consensus::BlockImport for &'a Client Result { let BlockCheckParams { hash, number, parent_hash, allow_missing_state, import_existing } = block; + // Check the block against white and black lists if any are defined + // (i.e. fork blocks and bad blocks respectively) let fork_block = self.fork_blocks.as_ref() .and_then(|fs| fs.iter().find(|(n, _)| *n == number)); @@ -1501,6 +1513,19 @@ impl<'a, B, E, Block, RA> sp_consensus::BlockImport for &'a Client::default(), //! Default::default(), //! Default::default(), +//! Default::default(), //! ); //! ``` //! @@ -98,7 +99,7 @@ pub use crate::{ new_in_mem, BlockBody, ImportNotifications, FinalityNotifications, BlockchainEvents, BlockImportNotification, Client, ClientInfo, ExecutionStrategies, FinalityNotification, - LongestChain, BlockOf, ProvideUncles, ForkBlocks, apply_aux, + LongestChain, BlockOf, ProvideUncles, BadBlocks, ForkBlocks, apply_aux, }, leaves::LeafSet, }; diff --git a/client/src/light/mod.rs b/client/src/light/mod.rs index 9ab56b824e..ed36bccc11 100644 --- a/client/src/light/mod.rs +++ b/client/src/light/mod.rs @@ -70,7 +70,14 @@ pub fn new_light( { let local_executor = LocalCallExecutor::new(backend.clone(), code_executor); let executor = GenesisCallExecutor::new(backend.clone(), local_executor); - Client::new(backend, executor, genesis_storage, Default::default(), Default::default()) + Client::new( + backend, + executor, + genesis_storage, + Default::default(), + Default::default(), + Default::default(), + ) } /// Create an instance of fetch data checker. diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index 665fdf621f..b9d857e897 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -204,6 +204,7 @@ impl TestClientBuilder executor, storage, Default::default(), + Default::default(), ExecutionExtensions::new( self.execution_strategies, self.keystore.clone(), -- GitLab From 6d292c8fe6b2a2eb1997dd579ea3c6be334d4334 Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Mon, 6 Jan 2020 14:55:39 -0500 Subject: [PATCH 057/296] typo: lead -> leave (#4546) --- client/src/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/client.rs b/client/src/client.rs index 234f86436e..8376abd026 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1161,7 +1161,7 @@ impl Client where /// Attempts to revert the chain by `n` blocks disregarding finality. This /// method will revert any finalized blocks as requested and can potentially - /// lead the node in an inconsistent state. Other modules in the system that + /// leave the node in an inconsistent state. Other modules in the system that /// persist data and that rely on finality (e.g. consensus parts) will be /// unaffected by the revert. Use this method with caution and making sure /// that no other data needs to be reverted for consistency aside from the -- GitLab From ddb309ae7c70e5e51a60879af18819cf28be4a32 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 7 Jan 2020 00:57:32 +0000 Subject: [PATCH 058/296] Fix error message (#4549) --- client/network/src/protocol/sync.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/network/src/protocol/sync.rs b/client/network/src/protocol/sync.rs index dbefa89292..5ae641b475 100644 --- a/client/network/src/protocol/sync.rs +++ b/client/network/src/protocol/sync.rs @@ -926,7 +926,7 @@ impl ChainSync { }, Err(BlockImportError::BadBlock(who)) => { if let Some(peer) = who { - info!("Bad block"); + info!("Block received from peer has been blacklisted"); output.push(Err(BadPeer(peer, rep::BAD_BLOCK))); output.extend(self.restart()); } -- GitLab From 5420775ee9f1f00dfb832132f438a4d23b6f72c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 7 Jan 2020 12:48:05 +0100 Subject: [PATCH 059/296] `decl_event` support trailing comma in args (#4554) --- frame/support/src/event.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frame/support/src/event.rs b/frame/support/src/event.rs index aac3a5955e..3ff6d4ab45 100644 --- a/frame/support/src/event.rs +++ b/frame/support/src/event.rs @@ -304,7 +304,7 @@ macro_rules! __events_to_metadata { ( $( $metadata:expr ),*; $( #[doc = $doc_attr:tt] )* - $event:ident $( ( $( $param:path ),* ) )*, + $event:ident $( ( $( $param:path ),* $(,)? ) )*, $( $rest:tt )* ) => { $crate::__events_to_metadata!( @@ -704,6 +704,10 @@ mod tests { OriginRenamed = ::Origin, { TestEvent(BalanceRenamed, OriginRenamed), + TrailingCommaInArgs( + u32, + u32, + ), } ); } -- GitLab From 9178b420532b0d130cde8c22b6aa99e630b2db58 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 7 Jan 2020 13:17:17 +0100 Subject: [PATCH 060/296] do not chill indirectly-slashed nominators (#4553) * do not chill indirectly-slashed nominators * test nomination non-kick and vote ignoring behavior --- frame/staking/src/slashing.rs | 4 ++-- frame/staking/src/tests.rs | 40 ++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/frame/staking/src/slashing.rs b/frame/staking/src/slashing.rs index 1263198d86..6d591603fd 100644 --- a/frame/staking/src/slashing.rs +++ b/frame/staking/src/slashing.rs @@ -392,9 +392,9 @@ fn slash_nominators( ); if target_span == Some(spans.span_index()) { - // Chill the nominator outright, ending the slashing span. + // End the span, but don't chill the nominator. its nomination + // on this validator will be ignored in the future. spans.end_span(now); - >::chill_stash(stash); } } diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index e550a90c4e..1ab43910c7 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -2531,7 +2531,6 @@ fn remove_multi_deferred() { &[Perbill::from_percent(10)], ); - on_offence_now( &[ OffenceDetails { @@ -2557,3 +2556,42 @@ fn version_initialized() { assert_eq!(::StorageVersion::get(), crate::migration::CURRENT_VERSION); }); } + +#[test] +fn slash_kicks_validators_not_nominators() { + ExtBuilder::default().build().execute_with(|| { + start_era(1); + + assert_eq!(Balances::free_balance(&11), 1000); + + let exposure = Staking::stakers(&11); + assert_eq!(Balances::free_balance(&101), 2000); + let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; + + on_offence_now( + &[ + OffenceDetails { + offender: (11, exposure.clone()), + reporters: vec![], + }, + ], + &[Perbill::from_percent(10)], + ); + + assert_eq!(Balances::free_balance(&11), 900); + assert_eq!(Balances::free_balance(&101), 2000 - (nominated_value / 10)); + + // This is the best way to check that the validator was chilled; `get` will + // return default value. + for (stash, _) in ::Validators::enumerate() { + assert!(stash != 11); + } + + let nominations = ::Nominators::get(&101).unwrap(); + + // and make sure that the vote will be ignored even if the validator + // re-registers. + let last_slash = ::SlashingSpans::get(&11).unwrap().last_start(); + assert!(nominations.submitted_in < last_slash); + }); +} -- GitLab From d41ccd6549f6b8d1320f5620e623b4b9840d3064 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Tue, 7 Jan 2020 15:08:27 +0100 Subject: [PATCH 061/296] Expose load_spec (#4556) --- client/cli/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 8b44ba3905..846f155ded 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -128,7 +128,8 @@ fn generate_node_name() -> String { result } -fn load_spec(cli: &SharedParams, factory: F) -> error::Result> where +/// Load spec give shared params and spec factory. +pub fn load_spec(cli: &SharedParams, factory: F) -> error::Result> where G: RuntimeGenesis, E: ChainSpecExtension, F: FnOnce(&str) -> Result>, String>, -- GitLab From 026fd3f48064b248cadfe63215612ef11dafe879 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Tue, 7 Jan 2020 15:26:40 +0100 Subject: [PATCH 062/296] client/network-gossip: Remove `GossipEngine::abort` method (#4552) `GossipEngine::abort` and thus `ConsensusGossip::abort` are never called. This patch removes both. --- client/network-gossip/src/bridge.rs | 5 ----- client/network-gossip/src/state_machine.rs | 5 ----- 2 files changed, 10 deletions(-) diff --git a/client/network-gossip/src/bridge.rs b/client/network-gossip/src/bridge.rs index d327f82092..7eeb33131d 100644 --- a/client/network-gossip/src/bridge.rs +++ b/client/network-gossip/src/bridge.rs @@ -143,11 +143,6 @@ impl GossipEngine { gossip_engine } - /// Closes all notification streams. - pub fn abort(&self) { - self.inner.lock().state_machine.abort(); - } - pub fn report(&self, who: PeerId, reputation: ReputationChange) { self.inner.lock().context.report_peer(who, reputation); } diff --git a/client/network-gossip/src/state_machine.rs b/client/network-gossip/src/state_machine.rs index ad7ce06833..3e54e452db 100644 --- a/client/network-gossip/src/state_machine.rs +++ b/client/network-gossip/src/state_machine.rs @@ -253,11 +253,6 @@ impl ConsensusGossip { } } - /// Closes all notification streams. - pub fn abort(&mut self) { - self.live_message_sinks.clear(); - } - /// Register message validator for a message type. pub fn register_validator( &mut self, -- GitLab From 7f010fc0e6e76ae660ba02c9c0ede9e356475743 Mon Sep 17 00:00:00 2001 From: Ashley Date: Tue, 7 Jan 2020 16:30:04 +0100 Subject: [PATCH 063/296] Add a `browser-utils` crate (#4394) * Squash * Fix keystore on wasm * Update utils/browser/Cargo.toml Co-Authored-By: Benjamin Kampmann * export console functions * Use an Option in keystore instead of cfg flags * Add a KeystoreConfig * Update libp2p * Bump kvdb-web version * Fix cli * Upgrade versions * Update wasm-bindgen stuff Co-authored-by: Benjamin Kampmann --- Cargo.lock | 158 +++++++++++++++--------- Cargo.toml | 1 + bin/node/cli/Cargo.toml | 21 +--- bin/node/cli/browser-demo/build.sh | 2 +- bin/node/cli/browser-demo/index.html | 4 +- bin/node/cli/src/browser.rs | 142 +++------------------- client/cli/src/lib.rs | 38 +++--- client/keystore/src/lib.rs | 64 ++++++---- client/service/src/builder.rs | 24 ++-- client/service/src/config.rs | 26 +++- client/service/test/src/lib.rs | 8 +- utils/browser/Cargo.toml | 27 +++++ utils/browser/src/lib.rs | 173 +++++++++++++++++++++++++++ 13 files changed, 433 insertions(+), 255 deletions(-) create mode 100644 utils/browser/Cargo.toml create mode 100644 utils/browser/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 69f168eba2..c5a097ff79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -358,6 +358,28 @@ dependencies = [ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "browser-utils" +version = "2.0.0" +dependencies = [ + "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-web 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-chain-spec 2.0.0", + "sc-network 0.8.0", + "sc-service 2.0.0", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bs58" version = "0.2.5" @@ -389,7 +411,7 @@ dependencies = [ [[package]] name = "bumpalo" -version = "2.6.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -558,7 +580,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -567,7 +589,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1621,7 +1643,7 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2084,10 +2106,10 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2260,6 +2282,21 @@ dependencies = [ "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "kvdb-web" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "language-tags" version = "0.2.2" @@ -2559,7 +2596,7 @@ dependencies = [ "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2573,9 +2610,9 @@ dependencies = [ "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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2624,11 +2661,11 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.13.2 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2979,19 +3016,14 @@ dependencies = [ name = "node-cli" version = "2.0.0" dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "browser-utils 2.0.0", "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "frame-support 2.0.0", "frame-system 2.0.0", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", @@ -3006,7 +3038,6 @@ dependencies = [ "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 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 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-authority-discovery 2.0.0", "sc-basic-authority 2.0.0", @@ -3043,8 +3074,8 @@ dependencies = [ "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4633,7 +4664,7 @@ dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4789,7 +4820,7 @@ dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5888,6 +5919,11 @@ name = "send_wrapper" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "send_wrapper" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.103" @@ -7666,25 +7702,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.55" +version = "0.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.55" +version = "0.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7694,40 +7730,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.55" +version = "0.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.55" +version = "0.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.55" +version = "0.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.55" +version = "0.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7736,7 +7783,7 @@ dependencies = [ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7756,11 +7803,11 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7880,14 +7927,14 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.34 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8171,7 +8218,7 @@ dependencies = [ "checksum bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" "checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245" "checksum build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" -"checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708" +"checksum bumpalo 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fe2567a8d8a3aedb4e39aa39e186d5673acfd56393c6ac83b2bc5bd82f4369c" "checksum byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f6209f3b2c1edea170002e016d5ead6903d3bb0a846477f53bbeb614967a52a9" "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" @@ -8338,7 +8385,7 @@ dependencies = [ "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b1d42ef453b30b7387e113da1c83ab1605d90c5b4e0eb8e96d016ed3b8c160" -"checksum js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "1c840fdb2167497b0bd0db43d6dfe61e91637fa72f9d061f8bd17ddc44ba6414" +"checksum js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)" = "c40e7a4fafb6cf0be06d25662fc99aacb25f526eb6e1bc0c24100bde5d6a834e" "checksum jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0a9ae166c4d1f702d297cd76d4b55758ace80272ffc6dbb139fdc1bf810de40b" "checksum jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970" "checksum jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "080dc110be17701097df238fad3c816d4a478a1899dfbcf8ec8957dd40ec7304" @@ -8354,6 +8401,7 @@ dependencies = [ "checksum kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cecee8d85a74f6b8284710d52a7d1196f09e31f8217e1f184a475b509d360554" "checksum kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a5d70712b1fe0f02ce7ee36a962fcb0b15d0fe11262ba21a4aa839ef22cf60d" "checksum kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "54cc6b52f7e511de9f07fd77cda70247adfc6b8192e4b5a1b6dbca416dc425b5" +"checksum kvdb-web 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "90cff04dc606356c88e3fbbf8033040b072cb57d03d6fed8b6d6372587d5931c" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" @@ -8540,6 +8588,7 @@ 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 send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" "checksum serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "1217f97ab8e8904b57dd22eb61cde455fa7446a9c1cf43966066da047c1f3702" "checksum serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0" "checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" @@ -8656,13 +8705,14 @@ dependencies = [ "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" "checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" -"checksum wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "29ae32af33bacd663a9a28241abecf01f2be64e6a185c6139b04f18b6385c5f2" -"checksum wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "1845584bd3593442dc0de6e6d9f84454a59a057722f36f005e44665d6ab19d85" +"checksum wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "701bc20794a7f9e8dcd85984a848f951ef6c5083322b6dd17fe880c99390f7cd" +"checksum wasm-bindgen-backend 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "426315280d373e1a828e1c322507d51aa82e03c2fb1d654720b9e2f2368d291d" "checksum wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)" = "83420b37346c311b9ed822af41ec2e82839bfe99867ec6c54e2da43b7538771c" -"checksum wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "87fcc747e6b73c93d22c947a6334644d22cfec5abd8b66238484dc2b0aeb9fe4" -"checksum wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3dc4b3f2c4078c8c4a5f363b92fcf62604c5913cbd16c6ff5aaf0f74ec03f570" -"checksum wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "ca0b78d6d3be8589b95d1d49cdc0794728ca734adf36d7c9f07e6459508bb53d" -"checksum wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3126356474ceb717c8fb5549ae387c9fbf4872818454f4d87708bee997214bb5" +"checksum wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1de54efe80cb87a8fa1f715d60ab47a5eac6b1447dd68665300773f498c229b1" +"checksum wasm-bindgen-macro 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "d9a8a46373db32c892de910ccca302ecdaf8262abab746324a8a4dac352fc11f" +"checksum wasm-bindgen-macro-support 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "45d1c6c2259c0f4ef3d61ea0976ea075b6f8185497c4a5457793740c2cda6430" +"checksum wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "dd8e108ae395aae8017b091c4766101f08c635a5074e6631e0085e8a839e5810" +"checksum wasm-bindgen-webidl 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "7a38859ace1c29c8ed75cd74940d4c96b980837179355de542a2eab3b435bb5c" "checksum wasm-gc-api 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" "checksum wasm-timer 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "aa3e01d234bb71760e685cfafa5e2c96f8ad877c161a721646356651069e26ac" "checksum wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" @@ -8672,7 +8722,7 @@ dependencies = [ "checksum wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a3947662a0b8e05b1418465e64f16de9114f9fec18cc3f56e0ed5aa7737b89d0" "checksum wasmtime-jit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ed7922689461a7b5bd0d9c7350cac526c8a520a23b3ffd7f5b446ac51dfc51f" "checksum wasmtime-runtime 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "781d6bb8b346efaa3dc39746386957cd79b8d841e8652ed9b02d77bcf64fb514" -"checksum web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "98405c0a2e722ed3db341b4c5b70eb9fe0021621f7350bab76df93b09b649bbf" +"checksum web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ba09295448c0b93bc87d2769614d371a924749e5e6c87e4c1df8b2416b49b775" "checksum webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d7e664e770ac0110e2384769bcc59ed19e329d81f555916a6e072714957b81b4" "checksum webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b" "checksum webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" diff --git a/Cargo.toml b/Cargo.toml index 505cd299d9..7404744a41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -143,6 +143,7 @@ members = [ "test-utils/client", "test-utils/runtime", "test-utils/runtime/client", + "utils/browser", "utils/build-script-utils", "utils/fork-tree", "utils/frame/rpc/support", diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index c4cb3108de..a2b2195404 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -87,15 +87,9 @@ ctrlc = { version = "3.1.3", features = ["termination"], optional = true } node-transaction-factory = { version = "2.0.0", optional = true, path = "../transaction-factory" } # WASM-specific dependencies -libp2p = { version = "0.13.2", default-features = false, optional = true } -clear_on_drop = { version = "0.2.3", features = ["no_cc"], optional = true } # Imported just for the `no_cc` feature -console_error_panic_hook = { version = "0.1.1", optional = true } -console_log = { version = "0.1.2", optional = true } -js-sys = { version = "0.3.22", optional = true } -wasm-bindgen = { version = "0.2.45", optional = true } -wasm-bindgen-futures = { version = "0.3.22", optional = true } -kvdb-memorydb = { version = "0.2.0", optional = true } -rand6 = { package = "rand", version = "0.6", features = ["wasm-bindgen"], optional = true } # Imported just for the `wasm-bindgen` feature +wasm-bindgen = { version = "0.2.57", optional = true } +wasm-bindgen-futures = { version = "0.4.7", optional = true } +browser-utils = { path = "../../../utils/browser", optional = true } [dev-dependencies] sc-keystore = { version = "2.0.0", path = "../../../client/keystore" } @@ -113,16 +107,9 @@ vergen = "3.0.4" [features] default = ["cli"] browser = [ - "clear_on_drop", - "console_error_panic_hook", - "console_log", - "js-sys", - "libp2p", + "browser-utils", "wasm-bindgen", "wasm-bindgen-futures", - "kvdb-memorydb", - "rand/wasm-bindgen", - "rand6" ] cli = [ "sc-cli", diff --git a/bin/node/cli/browser-demo/build.sh b/bin/node/cli/browser-demo/build.sh index c16100794a..059ed9fe42 100755 --- a/bin/node/cli/browser-demo/build.sh +++ b/bin/node/cli/browser-demo/build.sh @@ -1,3 +1,3 @@ #!/usr/bin/env sh wasm-pack build --target web --out-dir ./browser-demo/pkg --no-typescript --release ./.. -- --no-default-features --features "browser" -python -m SimpleHTTPServer 8000 +python -m http.server 8000 diff --git a/bin/node/cli/browser-demo/index.html b/bin/node/cli/browser-demo/index.html index cf107e6456..0b66b612f1 100644 --- a/bin/node/cli/browser-demo/index.html +++ b/bin/node/cli/browser-demo/index.html @@ -19,7 +19,7 @@ async function start() { // Build our client. log('Starting client'); - let client = start_client(ws()); + let client = await start_client(ws()); log('Client started'); client.rpcSubscribe('{"method":"chain_subscribeNewHead","params":[],"id":1,"jsonrpc":"2.0"}', @@ -29,7 +29,7 @@ async function start() { client .rpcSend('{"method":"system_networkState","params":[],"id":1,"jsonrpc":"2.0"}') .then((r) => log("Network state: " + r)); - }, 1000); + }, 20000); } start(); diff --git a/bin/node/cli/src/browser.rs b/bin/node/cli/src/browser.rs index bd169cfae3..9747a583c7 100644 --- a/bin/node/cli/src/browser.rs +++ b/bin/node/cli/src/browser.rs @@ -15,45 +15,31 @@ // along with Substrate. If not, see . use crate::ChainSpec; -use futures01::{prelude::*, sync::oneshot, sync::mpsc}; -use libp2p::wasm_ext; -use log::{debug, info}; -use std::sync::Arc; -use sc_service::{AbstractService, RpcSession, Roles as ServiceRoles, Configuration, config::DatabaseConfig}; +use log::info; use wasm_bindgen::prelude::*; +use sc_service::Configuration; +use browser_utils::{ + Transport, Client, + browser_configuration, set_console_error_panic_hook, init_console_log, +}; /// Starts the client. -/// -/// You must pass a libp2p transport that supports . #[wasm_bindgen] -pub fn start_client(wasm_ext: wasm_ext::ffi::Transport) -> Result { +pub async fn start_client(wasm_ext: Transport) -> Result { start_inner(wasm_ext) + .await .map_err(|err| JsValue::from_str(&err.to_string())) } -fn start_inner(wasm_ext: wasm_ext::ffi::Transport) -> Result> { - console_error_panic_hook::set_once(); - console_log::init_with_level(log::Level::Info); +async fn start_inner(wasm_ext: Transport) -> Result> { + set_console_error_panic_hook(); + init_console_log(log::Level::Info)?; - // Build the configuration to pass to the service. - let config = { - let wasm_ext = wasm_ext::ExtTransport::new(wasm_ext); - let chain_spec = ChainSpec::FlamingFir.load().map_err(|e| format!("{:?}", e))?; - let mut config = Configuration::<(), _, _>::default_with_spec_and_base_path(chain_spec, None); - config.network.transport = sc_network::config::TransportConfig::Normal { - wasm_external_transport: Some(wasm_ext.clone()), - allow_private_ipv4: true, - enable_mdns: false, - }; - config.telemetry_external_transport = Some(wasm_ext); - config.roles = ServiceRoles::LIGHT; - config.name = "Browser node".to_string(); - config.database = { - let db = Arc::new(kvdb_memorydb::create(10)); - DatabaseConfig::Custom(db) - }; - config - }; + let chain_spec = ChainSpec::FlamingFir.load() + .map_err(|e| format!("{:?}", e))?; + + let config: Configuration<(), _, _> = browser_configuration(wasm_ext, chain_spec) + .await?; info!("Substrate browser node"); info!(" version {}", config.full_version()); @@ -63,98 +49,8 @@ fn start_inner(wasm_ext: wasm_ext::ffi::Transport) -> Result(); - wasm_bindgen_futures::spawn_local(futures01::future::poll_fn(move || { - loop { - match rpc_send_rx.poll() { - Ok(Async::Ready(Some(message))) => { - let fut = service.rpc_query(&message.session, &message.rpc_json); - let _ = message.send_back.send(Box::new(fut)); - }, - Ok(Async::NotReady) => break, - Err(_) | Ok(Async::Ready(None)) => return Ok(Async::Ready(())), - } - } - - loop { - match service.poll().map_err(|_| ())? { - Async::Ready(()) => return Ok(Async::Ready(())), - Async::NotReady => break - } - } - - Ok(Async::NotReady) - })); - - Ok(Client { - rpc_send_tx, - }) -} - -/// A running client. -#[wasm_bindgen] -pub struct Client { - rpc_send_tx: mpsc::UnboundedSender, -} - -struct RpcMessage { - rpc_json: String, - session: RpcSession, - send_back: oneshot::Sender, Error = ()>>>, -} - -#[wasm_bindgen] -impl Client { - /// Allows starting an RPC request. Returns a `Promise` containing the result of that request. - #[wasm_bindgen(js_name = "rpcSend")] - pub fn rpc_send(&mut self, rpc: &str) -> js_sys::Promise { - let rpc_session = RpcSession::new(mpsc::channel(1).0); - let (tx, rx) = oneshot::channel(); - let _ = self.rpc_send_tx.unbounded_send(RpcMessage { - rpc_json: rpc.to_owned(), - session: rpc_session, - send_back: tx, - }); - let fut = rx - .map_err(|_| ()) - .and_then(|fut| fut) - .map(|s| JsValue::from_str(&s.unwrap_or(String::new()))) - .map_err(|_| JsValue::NULL); - wasm_bindgen_futures::future_to_promise(fut) - } + let service = crate::service::new_light(config) + .map_err(|e| format!("{:?}", e))?; - /// Subscribes to an RPC pubsub endpoint. - #[wasm_bindgen(js_name = "rpcSubscribe")] - pub fn rpc_subscribe(&mut self, rpc: &str, callback: js_sys::Function) { - let (tx, rx) = mpsc::channel(4); - let rpc_session = RpcSession::new(tx); - let (fut_tx, fut_rx) = oneshot::channel(); - let _ = self.rpc_send_tx.unbounded_send(RpcMessage { - rpc_json: rpc.to_owned(), - session: rpc_session.clone(), - send_back: fut_tx, - }); - let fut_rx = fut_rx - .map_err(|_| ()) - .and_then(|fut| fut); - wasm_bindgen_futures::spawn_local(fut_rx.then(|_| Ok(()))); - wasm_bindgen_futures::spawn_local(rx.for_each(move |s| { - match callback.call1(&callback, &JsValue::from_str(&s)) { - Ok(_) => Ok(()), - Err(_) => Err(()), - } - }).then(move |v| { - // We need to keep `rpc_session` alive. - debug!("RPC subscription has ended"); - drop(rpc_session); - v - })); - } + Ok(browser_utils::start_client(service)) } diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 846f155ded..ebc037a970 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -28,7 +28,7 @@ pub mod informant; use sc_client_api::execution_extensions::ExecutionStrategies; use sc_service::{ - config::{Configuration, DatabaseConfig}, + config::{Configuration, DatabaseConfig, KeystoreConfig}, ServiceBuilderCommand, RuntimeGenesis, ChainSpecExtension, PruningMode, ChainSpec, }; @@ -754,20 +754,22 @@ fn fill_config_keystore_password( config: &mut sc_service::Configuration, cli: &RunCmd, ) -> Result<(), String> { - config.keystore_password = if cli.password_interactive { - #[cfg(not(target_os = "unknown"))] - { - Some(input_keystore_password()?.into()) - } - #[cfg(target_os = "unknown")] - None - } else if let Some(ref file) = cli.password_filename { - Some(fs::read_to_string(file).map_err(|e| format!("{}", e))?.into()) - } else if let Some(ref password) = cli.password { - Some(password.clone().into()) - } else { - None - }; + if let KeystoreConfig::Path { password, .. } = &mut config.keystore { + *password = if cli.password_interactive { + #[cfg(not(target_os = "unknown"))] + { + Some(input_keystore_password()?.into()) + } + #[cfg(target_os = "unknown")] + None + } else if let Some(ref file) = cli.password_filename { + Some(fs::read_to_string(file).map_err(|e| format!("{}", e))?.into()) + } else if let Some(ref password) = cli.password { + Some(password.clone().into()) + } else { + None + }; + } Ok(()) } @@ -873,7 +875,11 @@ where )? } - config.keystore_path = cli.keystore_path.or_else(|| config.in_chain_config_dir(DEFAULT_KEYSTORE_CONFIG_PATH)); + let default_keystore_path = config.in_chain_config_dir(DEFAULT_KEYSTORE_CONFIG_PATH); + + if let KeystoreConfig::Path { path, ..} = &mut config.keystore { + *path = path.clone().or(default_keystore_path); + } // set sentry mode (i.e. act as an authority but **never** actively participate) config.sentry_mode = cli.sentry; diff --git a/client/keystore/src/lib.rs b/client/keystore/src/lib.rs index a4d150a848..f8794aa05e 100644 --- a/client/keystore/src/lib.rs +++ b/client/keystore/src/lib.rs @@ -71,7 +71,7 @@ impl std::error::Error for Error { /// /// Every pair that is being generated by a `seed`, will be placed in memory. pub struct Store { - path: PathBuf, + path: Option, additional: HashMap<(KeyTypeId, Vec), Vec>, password: Option>, } @@ -84,10 +84,19 @@ impl Store { let path = path.into(); fs::create_dir_all(&path)?; - let instance = Self { path, additional: HashMap::new(), password }; + let instance = Self { path: Some(path), additional: HashMap::new(), password }; Ok(Arc::new(RwLock::new(instance))) } + /// Create a new in-memory store. + pub fn new_in_memory() -> KeyStorePtr { + Arc::new(RwLock::new(Self { + path: None, + additional: HashMap::new(), + password: None + })) + } + /// Get the public/private key pair for the given public key and key type. fn get_additional_pair( &self, @@ -113,9 +122,11 @@ impl Store { /// /// Places it into the file system store. fn insert_unknown(&self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> Result<()> { - let mut file = File::create(self.key_file_path(public, key_type)).map_err(Error::Io)?; - serde_json::to_writer(&file, &suri).map_err(Error::Json)?; - file.flush().map_err(Error::Io)?; + if let Some(path) = self.key_file_path(public, key_type) { + let mut file = File::create(path).map_err(Error::Io)?; + serde_json::to_writer(&file, &suri).map_err(Error::Json)?; + file.flush().map_err(Error::Io)?; + } Ok(()) } @@ -144,9 +155,11 @@ impl Store { /// Places it into the file system store. pub fn generate_by_type(&self, key_type: KeyTypeId) -> Result { let (pair, phrase, _) = Pair::generate_with_phrase(self.password.as_ref().map(|p| &***p)); - let mut file = File::create(self.key_file_path(pair.public().as_slice(), key_type))?; - serde_json::to_writer(&file, &phrase)?; - file.flush()?; + if let Some(path) = self.key_file_path(pair.public().as_slice(), key_type) { + let mut file = File::create(path)?; + serde_json::to_writer(&file, &phrase)?; + file.flush()?; + } Ok(pair) } @@ -186,7 +199,8 @@ impl Store { return Ok(pair) } - let path = self.key_file_path(public.as_slice(), key_type); + let path = self.key_file_path(public.as_slice(), key_type) + .ok_or_else(|| Error::Unavailable)?; let file = File::open(path)?; let phrase: String = serde_json::from_reader(&file)?; @@ -219,19 +233,21 @@ impl Store { }) .collect(); - for entry in fs::read_dir(&self.path)? { - let entry = entry?; - let path = entry.path(); - - // skip directories and non-unicode file names (hex is unicode) - if let Some(name) = path.file_name().and_then(|n| n.to_str()) { - match hex::decode(name) { - Ok(ref hex) if hex.len() > 4 => { - if &hex[0..4] != &key_type.0 { continue } - let public = TPublic::from_slice(&hex[4..]); - public_keys.push(public); + if let Some(path) = &self.path { + for entry in fs::read_dir(&path)? { + let entry = entry?; + let path = entry.path(); + + // skip directories and non-unicode file names (hex is unicode) + if let Some(name) = path.file_name().and_then(|n| n.to_str()) { + match hex::decode(name) { + Ok(ref hex) if hex.len() > 4 => { + if &hex[0..4] != &key_type.0 { continue } + let public = TPublic::from_slice(&hex[4..]); + public_keys.push(public); + } + _ => continue, } - _ => continue, } } } @@ -251,12 +267,12 @@ impl Store { } /// Returns the file path for the given public key and key type. - fn key_file_path(&self, public: &[u8], key_type: KeyTypeId) -> PathBuf { - let mut buf = self.path.clone(); + fn key_file_path(&self, public: &[u8], key_type: KeyTypeId) -> Option { + let mut buf = self.path.as_ref()?.clone(); let key_type = hex::encode(key_type.0); let key = hex::encode(public); buf.push(key_type + key.as_str()); - buf + Some(buf) } } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index be7a6fb677..e456efe365 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -17,7 +17,7 @@ use crate::{Service, NetworkStatus, NetworkState, error::Error, DEFAULT_PROTOCOL_ID}; use crate::{SpawnTaskHandle, start_rpc_servers, build_network_future, TransactionPoolAdapter}; use crate::status_sinks; -use crate::config::{Configuration, DatabaseConfig}; +use crate::config::{Configuration, DatabaseConfig, KeystoreConfig}; use sc_client_api::{ self, BlockchainEvents, @@ -165,10 +165,13 @@ fn new_full_parts( TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, TCSExt: Extension, { - let keystore = Keystore::open( - config.keystore_path.clone().ok_or("No basepath configured")?, - config.keystore_password.clone() - )?; + let keystore = match &config.keystore { + KeystoreConfig::Path { path, password } => Keystore::open( + path.clone().ok_or("No basepath configured")?, + password.clone() + )?, + KeystoreConfig::InMemory => Keystore::new_in_memory() + }; let executor = NativeExecutor::::new( config.wasm_method, @@ -286,10 +289,13 @@ where TGen: RuntimeGenesis, TCSExt: Extension { (), TLightBackend, >, Error> { - let keystore = Keystore::open( - config.keystore_path.clone().ok_or("No basepath configured")?, - config.keystore_password.clone() - )?; + let keystore = match &config.keystore { + KeystoreConfig::Path { path, password } => Keystore::open( + path.clone().ok_or("No basepath configured")?, + password.clone() + )?, + KeystoreConfig::InMemory => Keystore::new_in_memory() + }; let executor = NativeExecutor::::new( config.wasm_method, diff --git a/client/service/src/config.rs b/client/service/src/config.rs index 8bb8dfeb09..94872129df 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -45,8 +45,8 @@ pub struct Configuration { pub network: NetworkConfiguration, /// Path to the base configuration directory. pub config_dir: Option, - /// Path to key files. - pub keystore_path: Option, + /// Configuration for the keystore. + pub keystore: KeystoreConfig, /// Configuration for the database. pub database: DatabaseConfig, /// Size of internal state cache in Bytes @@ -92,8 +92,6 @@ pub struct Configuration { pub force_authoring: bool, /// Disable GRANDPA when running in validator mode pub disable_grandpa: bool, - /// Node keystore's password - pub keystore_password: Option>, /// Development key seed. /// /// When running in development mode, the seed will be used to generate authority keys by the keystore. @@ -106,6 +104,20 @@ pub struct Configuration { pub tracing_receiver: sc_tracing::TracingReceiver, } +/// Configuration of the client keystore. +#[derive(Clone)] +pub enum KeystoreConfig { + /// Keystore at a path on-disk. Recommended for native nodes. + Path { + /// The path of the keystore. Will panic if no path is specified. + path: Option, + /// Node keystore's password. + password: Option> + }, + /// In-memory keystore. Recommended for in-browser nodes. + InMemory +} + /// Configuration of the database of the client. #[derive(Clone)] pub enum DatabaseConfig { @@ -138,7 +150,10 @@ impl Configuration where roles: Roles::FULL, transaction_pool: Default::default(), network: Default::default(), - keystore_path: config_dir.map(|c| c.join("keystore")), + keystore: KeystoreConfig::Path { + path: config_dir.map(|c| c.join("keystore")), + password: None + }, database: DatabaseConfig::Path { path: Default::default(), cache_size: Default::default(), @@ -161,7 +176,6 @@ impl Configuration where sentry_mode: false, force_authoring: false, disable_grandpa: false, - keystore_password: None, dev_key_seed: None, tracing_targets: Default::default(), tracing_receiver: Default::default(), diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index cc0e6a72e6..d76064300c 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -29,7 +29,7 @@ use sc_service::{ AbstractService, ChainSpec, Configuration, - config::DatabaseConfig, + config::{DatabaseConfig, KeystoreConfig}, Roles, Error, }; @@ -173,8 +173,10 @@ fn node_config ( roles: role, transaction_pool: Default::default(), network: network_config, - keystore_path: Some(root.join("key")), - keystore_password: None, + keystore: KeystoreConfig::Path { + path: Some(root.join("key")), + password: None + }, config_dir: Some(root.clone()), database: DatabaseConfig::Path { path: root.join("db"), diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml new file mode 100644 index 0000000000..861aae4962 --- /dev/null +++ b/utils/browser/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "browser-utils" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "Utilities for creating a browser light-client." +edition = "2018" + +[dependencies] +futures = "0.3" +futures01 = { package = "futures", version = "0.1.29" } +log = "0.4.8" +libp2p = { version = "0.13.2", default-features = false } +console_error_panic_hook = "0.1.6" +console_log = "0.1.2" +js-sys = "0.3.34" +wasm-bindgen = "0.2.57" +wasm-bindgen-futures = "0.4.7" +kvdb-web = "0.2" +service = { version = "2.0.0", package = "sc-service", path = "../../client/service", default-features = false } +network = { package = "sc-network", path = "../../client/network" } +chain-spec = { package = "sc-chain-spec", path = "../../client/chain-spec" } + +# Imported just for the `no_cc` feature +clear_on_drop = { version = "0.2.3", features = ["no_cc"] } +# Imported just for the `wasm-bindgen` feature +rand6 = { package = "rand", version = "0.6", features = ["wasm-bindgen"] } +rand = { version = "0.7", features = ["wasm-bindgen"] } diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs new file mode 100644 index 0000000000..fd4ad9f69e --- /dev/null +++ b/utils/browser/src/lib.rs @@ -0,0 +1,173 @@ +// 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 futures01::sync::mpsc as mpsc01; +use log::{debug, info}; +use std::sync::Arc; +use service::{ + AbstractService, RpcSession, Roles, Configuration, config::{DatabaseConfig, KeystoreConfig}, + ChainSpec, RuntimeGenesis +}; +use wasm_bindgen::prelude::*; +use futures::{ + TryFutureExt as _, FutureExt as _, Stream as _, Future as _, TryStreamExt as _, + channel::{oneshot, mpsc}, future::{poll_fn, ok}, compat::*, +}; +use std::task::Poll; +use std::pin::Pin; +use chain_spec::Extension; + +pub use libp2p::wasm_ext::{ExtTransport, ffi::Transport}; +pub use console_error_panic_hook::set_once as set_console_error_panic_hook; +pub use console_log::init_with_level as init_console_log; + +/// Create a service configuration from a chain spec and the websocket transport. +/// +/// This configuration contains good defaults for a browser light client. +pub async fn browser_configuration( + transport: Transport, + chain_spec: ChainSpec, +) -> Result, Box> +where + C: Default, + G: RuntimeGenesis, + E: Extension, +{ + let name = chain_spec.name().to_string(); + + let transport = ExtTransport::new(transport); + let mut config = Configuration::default_with_spec_and_base_path(chain_spec, None); + config.network.transport = network::config::TransportConfig::Normal { + wasm_external_transport: Some(transport.clone()), + allow_private_ipv4: true, + enable_mdns: false, + }; + config.telemetry_external_transport = Some(transport); + config.roles = Roles::LIGHT; + config.name = format!("{} (Browser)", name); + config.database = { + info!("Opening Indexed DB database '{}'...", name); + let db = kvdb_web::Database::open(name, 10) + .await?; + DatabaseConfig::Custom(Arc::new(db)) + }; + config.keystore = KeystoreConfig::InMemory; + + Ok(config) +} + +/// A running client. +#[wasm_bindgen] +pub struct Client { + rpc_send_tx: mpsc::UnboundedSender, +} + +struct RpcMessage { + rpc_json: String, + session: RpcSession, + send_back: oneshot::Sender> + Send>>>, +} + +/// Create a Client object that connects to a service. +pub fn start_client(service: impl AbstractService) -> Client { + let mut service = service.compat(); + // We dispatch a background task responsible for processing the service. + // + // The main action performed by the code below consists in polling the service with + // `service.poll()`. + // The rest consists in handling RPC requests. + let (rpc_send_tx, mut rpc_send_rx) = mpsc::unbounded::(); + wasm_bindgen_futures::spawn_local(poll_fn(move |cx| { + loop { + match Pin::new(&mut rpc_send_rx).poll_next(cx) { + Poll::Ready(Some(message)) => { + let fut = service.get_ref() + .rpc_query(&message.session, &message.rpc_json) + .compat() + .unwrap_or_else(|_| None) + .boxed(); + let _ = message.send_back.send(fut); + }, + Poll::Pending => break, + Poll::Ready(None) => return Poll::Ready(()), + } + } + + Pin::new(&mut service) + .poll(cx) + .map(drop) + })); + + Client { + rpc_send_tx, + } +} + +#[wasm_bindgen] +impl Client { + /// Allows starting an RPC request. Returns a `Promise` containing the result of that request. + #[wasm_bindgen(js_name = "rpcSend")] + pub fn rpc_send(&mut self, rpc: &str) -> js_sys::Promise { + let rpc_session = RpcSession::new(mpsc01::channel(1).0); + let (tx, rx) = oneshot::channel(); + let _ = self.rpc_send_tx.unbounded_send(RpcMessage { + rpc_json: rpc.to_owned(), + session: rpc_session, + send_back: tx, + }); + wasm_bindgen_futures::future_to_promise(async { + match rx.await { + Ok(fut) => { + fut.await + .map(|s| JsValue::from_str(&s)) + .ok_or_else(|| JsValue::NULL) + }, + Err(_) => Err(JsValue::NULL) + } + }) + } + + /// Subscribes to an RPC pubsub endpoint. + #[wasm_bindgen(js_name = "rpcSubscribe")] + pub fn rpc_subscribe(&mut self, rpc: &str, callback: js_sys::Function) { + let (tx, rx) = mpsc01::channel(4); + let rpc_session = RpcSession::new(tx); + let (fut_tx, fut_rx) = oneshot::channel(); + let _ = self.rpc_send_tx.unbounded_send(RpcMessage { + rpc_json: rpc.to_owned(), + session: rpc_session.clone(), + send_back: fut_tx, + }); + wasm_bindgen_futures::spawn_local(async { + if let Ok(fut) = fut_rx.await { + fut.await; + } + }); + + wasm_bindgen_futures::spawn_local(async move { + let _ = rx.compat() + .try_for_each(|s| { + let _ = callback.call1(&callback, &JsValue::from_str(&s)); + ok(()) + }) + .await; + + // We need to keep `rpc_session` alive. + debug!("RPC subscription has ended"); + drop(rpc_session); + }); + } +} -- GitLab From f8e5c564533cba8ae32cf97edbf5f28233c12d69 Mon Sep 17 00:00:00 2001 From: Ashley Date: Tue, 7 Jan 2020 16:43:35 +0100 Subject: [PATCH 064/296] Remove timing based bits of grafana test (#4558) --- utils/grafana-data-source/src/database.rs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/utils/grafana-data-source/src/database.rs b/utils/grafana-data-source/src/database.rs index d4c9c7ce81..f20917cf78 100644 --- a/utils/grafana-data-source/src/database.rs +++ b/utils/grafana-data-source/src/database.rs @@ -140,7 +140,6 @@ fn now_millis() -> i64 { #[test] fn test() { let mut database = Database::new(); - let start = now_millis(); database.push("test", 1.0).unwrap(); database.push("test", 2.5).unwrap(); @@ -152,19 +151,4 @@ fn test() { assert_eq!(keys, ["test", "test 2"]); assert_eq!(database.keys_starting_with("test ").collect::>(), ["test 2"]); - - assert_eq!( - database.datapoints_between("test", start - 1000, start + 1000, 4), - Some(vec![(1.0, start), (2.5, start), (2.0, start)]) - ); - - assert_eq!( - database.datapoints_between("test", start - 1000, start + 1000, 3), - Some(vec![(1.0, start), (2.5, start), (2.0, start)]) - ); - - assert_eq!( - database.datapoints_between("test", start - 1000, start + 1000, 2), - Some(vec![(1.0, start), (2.0, start)]) - ); } -- GitLab From 67f9e24f99e4fa7c7b62e8f43b3f15ce0b65af70 Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Tue, 7 Jan 2020 19:09:27 +0200 Subject: [PATCH 065/296] Fix Request::new documentation (#4560) --- primitives/runtime/src/offchain/http.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/runtime/src/offchain/http.rs b/primitives/runtime/src/offchain/http.rs index d7097d5b83..50c4a5eae6 100644 --- a/primitives/runtime/src/offchain/http.rs +++ b/primitives/runtime/src/offchain/http.rs @@ -176,7 +176,7 @@ impl<'a, T> Request<'a, T> { } impl<'a, T: Default> Request<'a, T> { - /// Create new Request builder with given URL and body. + /// Create a new Request builder with the given URL. pub fn new(url: &'a str) -> Self { Request::default().url(url) } -- GitLab From eae576ffbcd0ae62020f2e9f865e3c7b8db00213 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Tue, 7 Jan 2020 21:53:03 +0300 Subject: [PATCH 066/296] i/o stats for backend databases (#4525) --- Cargo.lock | 68 ++++++++++++++++++++++--------- client/Cargo.toml | 4 +- client/api/Cargo.toml | 2 +- client/api/src/backend.rs | 5 ++- client/api/src/client.rs | 59 +++++++++++++++++++++++++-- client/api/src/light.rs | 6 ++- client/cli/src/informant.rs | 7 +++- client/db/Cargo.toml | 10 +++-- client/db/src/lib.rs | 74 ++++++++++++++++++++++++++++++---- client/db/src/light.rs | 30 ++++++++++++-- client/service/src/builder.rs | 15 +++---- client/src/client.rs | 2 +- client/src/in_mem.rs | 7 +++- client/src/light/backend.rs | 5 ++- client/src/light/blockchain.rs | 4 ++ utils/browser/Cargo.toml | 2 +- 16 files changed, 245 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c5a097ff79..f0f096a659 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -368,7 +368,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-web 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2249,33 +2249,36 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kvdb-memorydb" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kvdb-rocksdb" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2284,14 +2287,15 @@ dependencies = [ [[package]] name = "kvdb-web" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4166,6 +4170,29 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-util-mem" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-wasm" version = "0.32.0" @@ -5070,8 +5097,8 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5106,7 +5133,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5134,12 +5161,13 @@ version = "2.0.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-rocksdb 0.4.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.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 2.0.0", @@ -8398,10 +8426,10 @@ dependencies = [ "checksum keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3468207deea1359a0e921591ae9b4c928733d94eb9d6a2eeda994cfd59f42cf8" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" -"checksum kvdb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cecee8d85a74f6b8284710d52a7d1196f09e31f8217e1f184a475b509d360554" -"checksum kvdb-memorydb 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a5d70712b1fe0f02ce7ee36a962fcb0b15d0fe11262ba21a4aa839ef22cf60d" -"checksum kvdb-rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "54cc6b52f7e511de9f07fd77cda70247adfc6b8192e4b5a1b6dbca416dc425b5" -"checksum kvdb-web 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "90cff04dc606356c88e3fbbf8033040b072cb57d03d6fed8b6d6372587d5931c" +"checksum kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8396be0e5561ccd1bf7ff0b2007487cdd7a87a056873fe6ea906b35d4dbf7ed8" +"checksum kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d25ef14155e418515c4839e9144c839de3506e68946f255a32b7f166095493d" +"checksum kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "af488cc16c3801705c8d681c3a32c8faa8fafc7fb5309dee0f573f3c6a19d395" +"checksum kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37a0e36637fb86454de401e7cb88f40eb0ad1b9bcee837d46785e7c451f1ebf4" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" @@ -8488,6 +8516,8 @@ dependencies = [ "checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" +"checksum parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "900dd84654b048e5bad420bb341658fc2c4d7fea628c22bcf4621733e54859b4" +"checksum parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" "checksum parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" "checksum parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" diff --git a/client/Cargo.toml b/client/Cargo.toml index 2932eff21d..eaddd9f3dc 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -18,7 +18,7 @@ hash-db = { version = "0.15.2" } hex-literal = { version = "0.2.1" } sp-inherents = { version = "2.0.0", path = "../primitives/inherents" } sp-keyring = { version = "2.0.0", path = "../primitives/keyring" } -kvdb = "0.2.0" +kvdb = "0.3.0" log = { version = "0.4.8" } parking_lot = { version = "0.9.0" } sp-core = { version = "2.0.0", path = "../primitives/core" } @@ -36,5 +36,5 @@ tracing = "0.1.10" env_logger = "0.7.0" tempfile = "3.1.0" substrate-test-runtime-client = { version = "2.0.0", path = "../test-utils/runtime/client" } -kvdb-memorydb = "0.2.0" +kvdb-memorydb = "0.3.0" sp-panic-handler = { version = "2.0.0", path = "../primitives/panic-handler" } diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 9e2e35e3a2..36360a6fb8 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -17,7 +17,7 @@ sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } sp-inherents = { version = "2.0.0", default-features = false, path = "../../primitives/inherents" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } -kvdb = "0.2.0" +kvdb = "0.3.0" log = { version = "0.4.8" } parking_lot = { version = "0.9.0" } sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index 90a0c9aa7b..a956b9eb22 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -29,6 +29,7 @@ use crate::{ Backend as BlockchainBackend, well_known_cache_keys }, light::RemoteBlockchain, + UsageInfo, }; use sp_blockchain; use sp_consensus::BlockOrigin; @@ -261,8 +262,8 @@ pub trait Backend: AuxStore + Send + Sync where /// Returns reference to blockchain backend. fn blockchain(&self) -> &Self::Blockchain; - /// Returns the used state cache, if existent. - fn used_state_cache_size(&self) -> Option; + /// Returns current usage statistics. + fn usage_info(&self) -> Option; /// Returns reference to changes trie storage. fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage>; diff --git a/client/api/src/client.rs b/client/api/src/client.rs index 9e095a897f..78a70bd5ea 100644 --- a/client/api/src/client.rs +++ b/client/api/src/client.rs @@ -16,7 +16,7 @@ //! A set of APIs supported by the client along with their primitives. -use std::collections::HashSet; +use std::{fmt, collections::HashSet}; use futures::channel::mpsc; use sp_core::storage::StorageKey; use sp_runtime::{ @@ -93,8 +93,61 @@ pub trait ProvideUncles { pub struct ClientInfo { /// Best block hash. pub chain: Info, - /// State Cache Size currently used by the backend - pub used_state_cache_size: Option, + /// Usage info, if backend supports this. + pub usage: Option, +} + +/// Memory statistics for client instance. +#[derive(Default, Clone, Debug)] +pub struct MemoryInfo { + /// Size of state cache. + pub state_cache: usize, + /// Size of backend database cache. + pub database_cache: usize, +} + +/// I/O statistics for client instance. +#[derive(Default, Clone, Debug)] +pub struct IoInfo { + /// Number of transactions. + pub transactions: u64, + /// Total bytes read from disk. + pub bytes_read: u64, + /// Total bytes written to disk. + pub bytes_written: u64, + /// Total key writes to disk. + pub writes: u64, + /// Total key reads from disk. + pub reads: u64, + /// Average size of the transaction. + pub average_transaction_size: u64, +} + +/// Usage statistics for running client instance. +/// +/// Returning backend determines the scope of these stats, +/// but usually it is either from service start or from previous +/// gathering of the statistics. +#[derive(Default, Clone, Debug)] +pub struct UsageInfo { + /// Memory statistics. + pub memory: MemoryInfo, + /// I/O statistics. + pub io: IoInfo, +} + +impl fmt::Display for UsageInfo { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, + "caches: ({} state, {} db overlay), i/o: ({} tx, {} write, {} read, {} tx size)", + self.memory.state_cache, + self.memory.database_cache, + self.io.transactions, + self.io.bytes_written, + self.io.bytes_read, + self.io.average_transaction_size, + ) + } } /// Summary of an imported block diff --git a/client/api/src/light.rs b/client/api/src/light.rs index fcdba1f627..b3e2e686ea 100644 --- a/client/api/src/light.rs +++ b/client/api/src/light.rs @@ -32,7 +32,8 @@ use sp_blockchain::{ HeaderMetadata, well_known_cache_keys, HeaderBackend, Cache as BlockchainCache, Error as ClientError, Result as ClientResult, }; -use crate::backend::{ AuxStore, NewBlockState }; +use crate::{backend::{AuxStore, NewBlockState}, UsageInfo}; + /// Remote call request. #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct RemoteCallRequest { @@ -274,6 +275,9 @@ pub trait Storage: AuxStore + HeaderBackend + HeaderMetada /// Get storage cache. fn cache(&self) -> Option>>; + + /// Get storage usage statistics. + fn usage_info(&self) -> Option; } /// Remote header. diff --git a/client/cli/src/informant.rs b/client/cli/src/informant.rs index 05111cb646..de7c376f09 100644 --- a/client/cli/src/informant.rs +++ b/client/cli/src/informant.rs @@ -18,7 +18,7 @@ use sc_client_api::BlockchainEvents; use futures::{StreamExt, TryStreamExt, FutureExt, future, compat::Stream01CompatExt}; -use log::{info, warn}; +use log::{info, warn, trace}; use sp_runtime::traits::Header; use sc_service::AbstractService; use std::time::Duration; @@ -36,6 +36,11 @@ pub fn build(service: &impl AbstractService) -> impl futures::Future { + at: std::time::Instant, + value: T, +} + +/// Some value frozen for period of time. +/// +/// If time `duration` not passed since the value was instantiated, +/// current frozen value is returned. Otherwise, you have to provide +/// a new value which will be again frozen for `duration`. +pub(crate) struct FrozenForDuration { + duration: std::time::Duration, + value: RwLock>, +} + +impl FrozenForDuration { + fn new(duration: std::time::Duration, initial: T) -> Self { + Self { + duration, + value: Frozen { at: std::time::Instant::now(), value: initial }.into(), + } + } + + fn take_or_else(&self, f: F) -> T where F: FnOnce() -> T { + if self.value.read().at.elapsed() > self.duration { + let mut write_lock = self.value.write(); + let new_value = f(); + write_lock.at = std::time::Instant::now(); + write_lock.value = new_value.clone(); + new_value + } else { + self.value.read().value.clone() + } + } +} + +/// Disk backend. +/// +/// Disk backend keps data in a key-value store. In archive mode, trie nodes are kept from all blocks. /// Otherwise, trie nodes are kept only from some recent blocks. pub struct Backend { storage: Arc>, @@ -845,6 +886,7 @@ pub struct Backend { shared_cache: SharedCache, import_lock: RwLock<()>, is_archive: bool, + io_stats: FrozenForDuration, } impl> Backend { @@ -906,6 +948,7 @@ impl> Backend { ), import_lock: Default::default(), is_archive: is_archive_pruning, + io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), kvdb::IoStats::empty()), }) } @@ -1492,9 +1535,31 @@ impl sc_client_api::backend::Backend for Backend Option { + let io_stats = self.io_stats.take_or_else(|| self.storage.db.io_stats(kvdb::IoStatsKind::SincePrevious)); + let database_cache = parity_util_mem::malloc_size(&*self.storage.db); + let state_cache = (*&self.shared_cache).lock().used_storage_cache_size(); + + Some(UsageInfo { + memory: MemoryInfo { + state_cache, + database_cache, + }, + io: IoInfo { + transactions: io_stats.transactions, + bytes_read: io_stats.bytes_read, + bytes_written: io_stats.bytes_written, + writes: io_stats.writes, + reads: io_stats.reads, + average_transaction_size: io_stats.avg_transaction_size() as u64, + }, + }) + } + fn revert(&self, n: NumberFor, revert_finalized: bool) -> ClientResult> { let mut best_number = self.blockchain.info().best_number; let mut best_hash = self.blockchain.info().best_hash; + let finalized = self.blockchain.info().finalized_number; let revertible = best_number - finalized; @@ -1563,11 +1628,6 @@ impl sc_client_api::backend::Backend for Backend Option { - let used = (*&self.shared_cache).lock().used_storage_cache_size(); - Some(used) - } - fn state_at(&self, block: BlockId) -> ClientResult { use sc_client::blockchain::HeaderBackend as BcHeaderBackend; diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 7533ec9d7a..2885ee5046 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -22,7 +22,7 @@ use parking_lot::RwLock; use kvdb::{KeyValueDB, DBTransaction}; -use sc_client_api::backend::{AuxStore, NewBlockState}; +use sc_client_api::{backend::{AuxStore, NewBlockState}, UsageInfo}; use sc_client::blockchain::{ BlockStatus, Cache as BlockchainCache,Info as BlockchainInfo, }; @@ -30,7 +30,7 @@ use sc_client::cht; use sp_blockchain::{ CachedHeaderMetadata, HeaderMetadata, HeaderMetadataCache, Error as ClientError, Result as ClientResult, - HeaderBackend as BlockchainHeaderBackend, + HeaderBackend as BlockchainHeaderBackend, well_known_cache_keys, }; use sc_client::light::blockchain::Storage as LightBlockchainStorage; @@ -40,7 +40,7 @@ use sp_runtime::generic::{DigestItem, BlockId}; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; 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}; -use crate::DatabaseSettings; +use crate::{DatabaseSettings, FrozenForDuration}; use log::{trace, warn, debug}; pub(crate) mod columns { @@ -64,6 +64,7 @@ pub struct LightStorage { meta: RwLock, Block::Hash>>, cache: Arc>, header_metadata_cache: HeaderMetadataCache, + io_stats: FrozenForDuration, } impl LightStorage @@ -102,6 +103,7 @@ impl LightStorage meta: RwLock::new(meta), cache: Arc::new(DbCacheSync(RwLock::new(cache))), header_metadata_cache: HeaderMetadataCache::default(), + io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), kvdb::IoStats::empty()), }) } @@ -548,6 +550,28 @@ impl LightBlockchainStorage for LightStorage fn cache(&self) -> Option>> { Some(self.cache.clone()) } + + fn usage_info(&self) -> Option { + use sc_client_api::{MemoryInfo, IoInfo}; + + let database_cache = parity_util_mem::malloc_size(&*self.db); + let io_stats = self.io_stats.take_or_else(|| self.db.io_stats(kvdb::IoStatsKind::SincePrevious)); + + Some(UsageInfo { + memory: MemoryInfo { + database_cache, + state_cache: 0, + }, + io: IoInfo { + transactions: io_stats.transactions, + bytes_read: io_stats.bytes_read, + bytes_written: io_stats.bytes_written, + writes: io_stats.writes, + reads: io_stats.reads, + average_transaction_size: io_stats.avg_transaction_size() as u64, + } + }) + } } /// Build the key for inserting header-CHT at given block. diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index e456efe365..8a4d760acc 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -932,11 +932,6 @@ ServiceBuilder< let bandwidth_download = net_status.average_download_per_sec; let bandwidth_upload = net_status.average_upload_per_sec; - let used_state_cache_size = match info.used_state_cache_size { - Some(size) => size, - None => 0, - }; - // get cpu usage and memory usage of this process let (cpu_usage, memory) = if let Some(self_pid) = self_pid { if sys.refresh_process(self_pid) { @@ -959,7 +954,10 @@ ServiceBuilder< "finalized_hash" => ?info.chain.finalized_hash, "bandwidth_download" => bandwidth_download, "bandwidth_upload" => bandwidth_upload, - "used_state_cache_size" => used_state_cache_size, + "used_state_cache_size" => info.usage.as_ref().map(|usage| usage.memory.state_cache).unwrap_or(0), + "used_db_cache_size" => info.usage.as_ref().map(|usage| usage.memory.database_cache).unwrap_or(0), + "disk_read_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_read).unwrap_or(0), + "disk_write_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_written).unwrap_or(0), ); let _ = record_metrics!( "peers" => num_peers, @@ -970,7 +968,10 @@ ServiceBuilder< "finalized_height" => finalized_number, "bandwidth_download" => bandwidth_download, "bandwidth_upload" => bandwidth_upload, - "used_state_cache_size" => used_state_cache_size, + "used_state_cache_size" => info.usage.as_ref().map(|usage| usage.memory.state_cache).unwrap_or(0), + "used_db_cache_size" => info.usage.as_ref().map(|usage| usage.memory.database_cache).unwrap_or(0), + "disk_read_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_read).unwrap_or(0), + "disk_write_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_written).unwrap_or(0), ); Ok(()) diff --git a/client/src/client.rs b/client/src/client.rs index 8376abd026..f99789de7d 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1176,7 +1176,7 @@ impl Client where pub fn usage_info(&self) -> ClientInfo { ClientInfo { chain: self.chain_info(), - used_state_cache_size: self.backend.used_state_cache_size(), + usage: self.backend.usage_info(), } } diff --git a/client/src/in_mem.rs b/client/src/in_mem.rs index 020f2b9e4e..5a54960aa6 100644 --- a/client/src/in_mem.rs +++ b/client/src/in_mem.rs @@ -37,6 +37,7 @@ use sc_client_api::{ blockchain::{ self, BlockStatus, HeaderBackend, well_known_cache_keys::Id as CacheKeyId }, + UsageInfo, }; use crate::leaves::LeafSet; @@ -449,6 +450,10 @@ impl sc_client_api::light::Storage for Blockchain fn cache(&self) -> Option>> { None } + + fn usage_info(&self) -> Option { + None + } } /// In-memory operation. @@ -681,7 +686,7 @@ where &self.blockchain } - fn used_state_cache_size(&self) -> Option { + fn usage_info(&self) -> Option { None } diff --git a/client/src/light/backend.rs b/client/src/light/backend.rs index 568d290834..3f680e6243 100644 --- a/client/src/light/backend.rs +++ b/client/src/light/backend.rs @@ -39,6 +39,7 @@ use sc_client_api::{ HeaderBackend as BlockchainHeaderBackend, well_known_cache_keys, }, light::Storage as BlockchainStorage, + UsageInfo, }; use crate::light::blockchain::Blockchain; use hash_db::Hasher; @@ -186,8 +187,8 @@ impl ClientBackend for Backend where &self.blockchain } - fn used_state_cache_size(&self) -> Option { - None + fn usage_info(&self) -> Option { + self.blockchain.storage().usage_info() } fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage> { diff --git a/client/src/light/blockchain.rs b/client/src/light/blockchain.rs index 9e8d14a48b..1ea4987078 100644 --- a/client/src/light/blockchain.rs +++ b/client/src/light/blockchain.rs @@ -314,5 +314,9 @@ pub mod tests { fn cache(&self) -> Option>> { None } + + fn usage_info(&self) -> Option { + None + } } } diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index 861aae4962..c7703474b7 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -15,7 +15,7 @@ console_log = "0.1.2" js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" -kvdb-web = "0.2" +kvdb-web = "0.3" service = { version = "2.0.0", package = "sc-service", path = "../../client/service", default-features = false } network = { package = "sc-network", path = "../../client/network" } chain-spec = { package = "sc-chain-spec", path = "../../client/chain-spec" } -- GitLab From ff509dab2ca98def7c886251434c33afb356ebc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Tue, 7 Jan 2020 22:34:54 +0000 Subject: [PATCH 067/296] grandpa: guarantee that vote limit is never lower than vote base (#4563) --- client/finality-grandpa/src/authorities.rs | 59 ++++++++++++++++++++-- client/finality-grandpa/src/environment.rs | 30 +++++------ 2 files changed, 66 insertions(+), 23 deletions(-) diff --git a/client/finality-grandpa/src/authorities.rs b/client/finality-grandpa/src/authorities.rs index 683ff7e764..5e295d0bae 100644 --- a/client/finality-grandpa/src/authorities.rs +++ b/client/finality-grandpa/src/authorities.rs @@ -51,9 +51,10 @@ impl SharedAuthoritySet where N: Add + Ord + Clone + Debug, H: Clone + Debug { - /// Get the earliest limit-block number, if any. - pub(crate) fn current_limit(&self) -> Option { - self.inner.read().current_limit() + /// Get the earliest limit-block number that's higher or equal to the given + /// min number, if any. + pub(crate) fn current_limit(&self, min: N) -> Option { + self.inner.read().current_limit(min) } /// Get the current set ID. This is incremented every time the set changes. @@ -224,10 +225,13 @@ where /// Get the earliest limit-block number, if any. If there are pending changes across /// different forks, this method will return the earliest effective number (across the - /// different branches). Only standard changes are taken into account for the current + /// different branches) that is higher or equal to the given min number. + /// + /// Only standard changes are taken into account for the current /// limit, since any existing forced change should preclude the voter from voting. - pub(crate) fn current_limit(&self) -> Option { + pub(crate) fn current_limit(&self, min: N) -> Option { self.pending_standard_changes.roots() + .filter(|&(_, _, c)| c.effective_number() >= min) .min_by_key(|&(_, _, c)| c.effective_number()) .map(|(_, _, c)| c.effective_number()) } @@ -445,6 +449,51 @@ mod tests { move |base, hash| Ok(f(base, hash)) } + #[test] + fn current_limit_filters_min() { + let mut authorities = AuthoritySet { + current_authorities: Vec::new(), + set_id: 0, + pending_standard_changes: ForkTree::new(), + pending_forced_changes: Vec::new(), + }; + + let change = |height| { + PendingChange { + next_authorities: Vec::new(), + delay: 0, + canon_height: height, + canon_hash: height.to_string(), + delay_kind: DelayKind::Finalized, + } + }; + + let is_descendent_of = static_is_descendent_of(false); + + authorities.add_pending_change(change(1), &is_descendent_of).unwrap(); + authorities.add_pending_change(change(2), &is_descendent_of).unwrap(); + + assert_eq!( + authorities.current_limit(0), + Some(1), + ); + + assert_eq!( + authorities.current_limit(1), + Some(1), + ); + + assert_eq!( + authorities.current_limit(2), + Some(2), + ); + + assert_eq!( + authorities.current_limit(3), + None, + ); + } + #[test] fn changes_iterated_in_pre_order() { let mut authorities = AuthoritySet { diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index e47a17e2a5..ac01d5294f 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -432,32 +432,26 @@ where return None; } + let base_header = match self.client.header(&BlockId::Hash(block)).ok()? { + Some(h) => h, + None => { + debug!(target: "afg", "Encountered error finding best chain containing {:?}: couldn't find base block", block); + return None; + } + }; + // we refuse to vote beyond the current limit number where transitions are scheduled to // occur. // once blocks are finalized that make that transition irrelevant or activate it, // we will proceed onwards. most of the time there will be no pending transition. - let limit = self.authority_set.current_limit(); + // the limit, if any, is guaranteed to be higher than or equal to the given base number. + let limit = self.authority_set.current_limit(*base_header.number()); debug!(target: "afg", "Finding best chain containing block {:?} with number limit {:?}", block, limit); match self.select_chain.finality_target(block, None) { Ok(Some(best_hash)) => { - let base_header = self.client.header(&BlockId::Hash(block)).ok()? - .expect("Header known to exist after `best_containing` call; qed"); - - if let Some(limit) = limit { - // this is a rare case which might cause issues, - // might be better to return the header itself. - if *base_header.number() > limit { - debug!(target: "afg", "Encountered error finding best chain containing {:?} with limit {:?}: target block is after limit", - block, - limit, - ); - return None; - } - } - let best_header = self.client.header(&BlockId::Hash(best_hash)).ok()? - .expect("Header known to exist after `best_containing` call; qed"); + .expect("Header known to exist after `finality_target` call; qed"); // check if our vote is currently being limited due to a pending change let limit = limit.filter(|limit| limit < best_header.number()); @@ -481,7 +475,7 @@ where } target_header = self.client.header(&BlockId::Hash(*target_header.parent_hash())).ok()? - .expect("Header known to exist after `best_containing` call; qed"); + .expect("Header known to exist after `finality_target` call; qed"); } target = target_header; -- GitLab From ae46db60594ab195a2b5c90679b55fb5633489c3 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Wed, 8 Jan 2020 09:50:35 +0100 Subject: [PATCH 068/296] Use single map and `remove_all` for `EventTopics` (#4566) --- frame/system/src/lib.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 05f6170031..3187ea2727 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -405,9 +405,6 @@ decl_storage! { /// Mapping between a topic (represented by T::Hash) and a vector of indexes /// of events in the `>` list. /// - /// The first key serves no purpose. This field is declared as double_map just - /// for convenience of using `remove_prefix`. - /// /// All topic vectors have deterministic storage locations depending on the topic. This /// allows light-clients to leverage the changes trie storage tracking mechanism and /// in case of changes fetch the list of events of interest. @@ -415,8 +412,7 @@ decl_storage! { /// The value has the type `(T::BlockNumber, EventIndex)` because if we used only just /// the `EventIndex` then in case if the topic has the same contents on the next block /// no notification will be triggered thus the event might be lost. - EventTopics get(fn event_topics): double_map hasher(blake2_256) (), blake2_256(T::Hash) - => Vec<(T::BlockNumber, EventIndex)>; + EventTopics get(fn event_topics): map T::Hash => Vec<(T::BlockNumber, EventIndex)>; } add_extra_genesis { config(changes_trie_config): Option; @@ -583,7 +579,7 @@ impl Module { let block_no = Self::block_number(); for topic in topics { // The same applies here. - if >::append(&(), topic, &[(block_no, event_idx)]).is_err() { + if >::append(topic, &[(block_no, event_idx)]).is_err() { return; } } @@ -647,7 +643,7 @@ impl Module { >::put(txs_root); >::kill(); EventCount::kill(); - >::remove_prefix(&()); + >::remove_all(); } /// Remove temporary "environment" entries in storage. @@ -1302,15 +1298,15 @@ mod tests { // Check that the topic-events mapping reflects the deposited topics. // Note that these are indexes of the events. assert_eq!( - System::event_topics(&(), &topics[0]), + System::event_topics(&topics[0]), vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 1)], ); assert_eq!( - System::event_topics(&(), &topics[1]), + System::event_topics(&topics[1]), vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 2)], ); assert_eq!( - System::event_topics(&(), &topics[2]), + System::event_topics(&topics[2]), vec![(BLOCK_NUMBER, 0)], ); }); -- GitLab From 240b9c81aae69d53fcbbdac4ac62a5adf21a8dfb Mon Sep 17 00:00:00 2001 From: Weiliang Li Date: Wed, 8 Jan 2020 18:46:56 +0800 Subject: [PATCH 069/296] txpool: unify client generic name (#4565) --- client/transaction-pool/src/api.rs | 38 +++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index c2935f6e17..8979ecc7e0 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -25,23 +25,27 @@ use sc_client_api::{ light::{Fetcher, RemoteCallRequest} }; use sp_core::{H256, Blake2Hasher, Hasher}; -use sp_runtime::{generic::BlockId, traits::{self, Block as BlockT}, transaction_validity::TransactionValidity}; +use sp_runtime::{ + generic::BlockId, + traits::{Block as BlockT, BlockIdTo, ProvideRuntimeApi}, + transaction_validity::TransactionValidity, +}; use sp_transaction_pool::runtime_api::TaggedTransactionQueue; use crate::error::{self, Error}; /// The transaction pool logic for full client. -pub struct FullChainApi { - client: Arc, +pub struct FullChainApi { + client: Arc, pool: ThreadPool, _marker: PhantomData, } -impl FullChainApi where +impl FullChainApi where Block: BlockT, - T: traits::ProvideRuntimeApi + traits::BlockIdTo { + Client: ProvideRuntimeApi + BlockIdTo { /// Create new transaction pool logic. - pub fn new(client: Arc) -> Self { + pub fn new(client: Arc) -> Self { FullChainApi { client, pool: ThreadPoolBuilder::new() @@ -54,11 +58,11 @@ impl FullChainApi where } } -impl sc_transaction_graph::ChainApi for FullChainApi where +impl sc_transaction_graph::ChainApi for FullChainApi where Block: BlockT, - T: traits::ProvideRuntimeApi + traits::BlockIdTo + 'static + Send + Sync, - T::Api: TaggedTransactionQueue, - sp_api::ApiErrorFor: Send, + Client: ProvideRuntimeApi + BlockIdTo + 'static + Send + Sync, + Client::Api: TaggedTransactionQueue, + sp_api::ApiErrorFor: Send, { type Block = Block; type Hash = H256; @@ -112,19 +116,19 @@ impl sc_transaction_graph::ChainApi for FullChainApi where } /// The transaction pool logic for light client. -pub struct LightChainApi { - client: Arc, +pub struct LightChainApi { + client: Arc, fetcher: Arc, _phantom: PhantomData, } -impl LightChainApi where +impl LightChainApi where Block: BlockT, - T: HeaderBackend, + Client: HeaderBackend, F: Fetcher, { /// Create new transaction pool logic. - pub fn new(client: Arc, fetcher: Arc) -> Self { + pub fn new(client: Arc, fetcher: Arc) -> Self { LightChainApi { client, fetcher, @@ -133,9 +137,9 @@ impl LightChainApi where } } -impl sc_transaction_graph::ChainApi for LightChainApi where +impl sc_transaction_graph::ChainApi for LightChainApi where Block: BlockT, - T: HeaderBackend + 'static, + Client: HeaderBackend + 'static, F: Fetcher + 'static, { type Block = Block; -- GitLab From f7890fd3c770ccb2dcd3b7a5a9a5fa46cd0d681c Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Wed, 8 Jan 2020 12:12:11 +0100 Subject: [PATCH 070/296] Bumped runtime version (#4568) --- bin/node/runtime/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 2d7c7b13e1..22d0e4cca3 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -78,8 +78,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 198, - impl_version: 198, + spec_version: 199, + impl_version: 199, apis: RUNTIME_API_VERSIONS, }; -- GitLab From 91ddc4f1ffb3a961c0a39b28a6c6de1c4326d462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 8 Jan 2020 15:19:14 +0100 Subject: [PATCH 071/296] Keystore fix default path (#4570) --- client/cli/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index ebc037a970..18ba347f6e 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -878,7 +878,7 @@ where let default_keystore_path = config.in_chain_config_dir(DEFAULT_KEYSTORE_CONFIG_PATH); if let KeystoreConfig::Path { path, ..} = &mut config.keystore { - *path = path.clone().or(default_keystore_path); + *path = cli.keystore_path.or(default_keystore_path); } // set sentry mode (i.e. act as an authority but **never** actively participate) -- GitLab From fc6b7e867d79dbe73aa058a0d7b2c024a63eb3f7 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 9 Jan 2020 11:18:14 +0100 Subject: [PATCH 072/296] Wasm executor should provide stubs for unknown externs (wasmi) (#4550) Related to #4456 --- client/executor/runtime-test/src/lib.rs | 16 +++ client/executor/src/integration_tests/mod.rs | 84 +++++++++++++- client/executor/src/lib.rs | 3 + client/executor/src/wasm_runtime.rs | 5 +- client/executor/wasmi/src/lib.rs | 111 +++++++++++++++---- primitives/runtime-interface/test/src/lib.rs | 1 + 6 files changed, 194 insertions(+), 26 deletions(-) diff --git a/client/executor/runtime-test/src/lib.rs b/client/executor/runtime-test/src/lib.rs index c49b9e70b4..a8d329cdd9 100644 --- a/client/executor/runtime-test/src/lib.rs +++ b/client/executor/runtime-test/src/lib.rs @@ -18,7 +18,23 @@ use sp_runtime::{print, traits::{BlakeTwo256, Hash}}; #[cfg(not(feature = "std"))] use sp_core::{ed25519, sr25519}; +extern "C" { + #[allow(dead_code)] + fn missing_external(); + + #[allow(dead_code)] + fn yet_another_missing_external(); +} + sp_core::wasm_export_functions! { + fn test_calling_missing_external() { + unsafe { missing_external() } + } + + fn test_calling_yet_another_missing_external() { + unsafe { yet_another_missing_external() } + } + fn test_data_in(input: Vec) -> Vec { print("set_storage"); storage::set(b"input", &input); diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index aefb52c741..2d39cac414 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -32,6 +32,49 @@ use crate::WasmExecutionMethod; pub type TestExternalities = CoreTestExternalities; +#[cfg(feature = "wasmtime")] +mod wasmtime_missing_externals { + use sp_wasm_interface::{Function, FunctionContext, HostFunctions, Result, Signature, Value}; + + pub struct WasmtimeHostFunctions; + + impl HostFunctions for WasmtimeHostFunctions { + fn host_functions() -> Vec<&'static dyn Function> { + vec![MISSING_EXTERNAL_FUNCTION, YET_ANOTHER_MISSING_EXTERNAL_FUNCTION] + } + } + + struct MissingExternalFunction(&'static str); + + impl Function for MissingExternalFunction { + fn name(&self) -> &str { self.0 } + + fn signature(&self) -> Signature { + Signature::new(vec![], None) + } + + fn execute( + &self, + _context: &mut dyn FunctionContext, + _args: &mut dyn Iterator, + ) -> Result> { + panic!("should not be called"); + } + } + + static MISSING_EXTERNAL_FUNCTION: &'static MissingExternalFunction = + &MissingExternalFunction("missing_external"); + static YET_ANOTHER_MISSING_EXTERNAL_FUNCTION: &'static MissingExternalFunction = + &MissingExternalFunction("yet_another_missing_external"); +} + +#[cfg(feature = "wasmtime")] +type HostFunctions = + (wasmtime_missing_externals::WasmtimeHostFunctions, sp_io::SubstrateHostFunctions); + +#[cfg(not(feature = "wasmtime"))] +type HostFunctions = sp_io::SubstrateHostFunctions; + fn call_in_wasm( function: &str, call_data: &[u8], @@ -40,13 +83,14 @@ fn call_in_wasm( code: &[u8], heap_pages: u64, ) -> crate::error::Result> { - crate::call_in_wasm::( + crate::call_in_wasm::( function, call_data, execution_method, ext, code, heap_pages, + true, ) } @@ -68,6 +112,44 @@ fn returning_should_work(wasm_method: WasmExecutionMethod) { assert_eq!(output, vec![0u8; 0]); } +#[test_case(WasmExecutionMethod::Interpreted)] +#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] +#[should_panic(expected = "Function `missing_external` is only a stub. Calling a stub is not allowed.")] +#[cfg(not(feature = "wasmtime"))] +fn call_not_existing_function(wasm_method: WasmExecutionMethod) { + let mut ext = TestExternalities::default(); + let mut ext = ext.ext(); + let test_code = WASM_BINARY; + + call_in_wasm( + "test_calling_missing_external", + &[], + wasm_method, + &mut ext, + &test_code[..], + 8, + ).unwrap(); +} + +#[test_case(WasmExecutionMethod::Interpreted)] +#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] +#[should_panic(expected = "Function `yet_another_missing_external` is only a stub. Calling a stub is not allowed.")] +#[cfg(not(feature = "wasmtime"))] +fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { + let mut ext = TestExternalities::default(); + let mut ext = ext.ext(); + let test_code = WASM_BINARY; + + call_in_wasm( + "test_calling_yet_another_missing_external", + &[], + wasm_method, + &mut ext, + &test_code[..], + 8, + ).unwrap(); +} + #[test_case(WasmExecutionMethod::Interpreted)] #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] fn panicking_should_work(wasm_method: WasmExecutionMethod) { diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index 78586e0fdc..1908eb3688 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -67,12 +67,14 @@ pub fn call_in_wasm( ext: &mut E, code: &[u8], heap_pages: u64, + allow_missing_imports: bool, ) -> error::Result> { let mut instance = wasm_runtime::create_wasm_runtime_with_code( execution_method, heap_pages, code, HF::host_functions(), + allow_missing_imports, )?; instance.call(ext, function, call_data) } @@ -103,6 +105,7 @@ mod tests { &mut ext, &WASM_BINARY, 8, + true, ).unwrap(); assert_eq!(res, vec![0u8; 0]); } diff --git a/client/executor/src/wasm_runtime.rs b/client/executor/src/wasm_runtime.rs index cec7672b02..eef73097f6 100644 --- a/client/executor/src/wasm_runtime.rs +++ b/client/executor/src/wasm_runtime.rs @@ -191,10 +191,11 @@ pub fn create_wasm_runtime_with_code( heap_pages: u64, code: &[u8], host_functions: Vec<&'static dyn Function>, + allow_missing_imports: bool, ) -> Result, WasmError> { match wasm_method { WasmExecutionMethod::Interpreted => - sc_executor_wasmi::create_instance(code, heap_pages, host_functions) + sc_executor_wasmi::create_instance(code, heap_pages, host_functions, allow_missing_imports) .map(|runtime| -> Box { Box::new(runtime) }), #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => @@ -212,7 +213,7 @@ fn create_versioned_wasm_runtime( let code = ext .original_storage(well_known_keys::CODE) .ok_or(WasmError::CodeNotFound)?; - let mut runtime = create_wasm_runtime_with_code(wasm_method, heap_pages, &code, host_functions)?; + let mut runtime = create_wasm_runtime_with_code(wasm_method, heap_pages, &code, host_functions, false)?; // Call to determine runtime version. let version_result = { diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index eebc49f75b..7c6141d6c8 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -21,7 +21,7 @@ use sc_executor_common::{ sandbox, allocator, }; -use std::{str, mem}; +use std::{str, mem, cell::RefCell}; use wasmi::{ Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, ModuleRef, memory_units::Pages, RuntimeValue::{I32, I64, self}, @@ -42,6 +42,8 @@ struct FunctionExecutor<'a> { memory: MemoryRef, table: Option, host_functions: &'a [&'static dyn Function], + allow_missing_imports: bool, + missing_functions: &'a [String], } impl<'a> FunctionExecutor<'a> { @@ -50,6 +52,8 @@ impl<'a> FunctionExecutor<'a> { heap_base: u32, t: Option, host_functions: &'a [&'static dyn Function], + allow_missing_imports: bool, + missing_functions: &'a [String], ) -> Result { Ok(FunctionExecutor { sandbox_store: sandbox::Store::new(), @@ -57,6 +61,8 @@ impl<'a> FunctionExecutor<'a> { memory: m, table: t, host_functions, + allow_missing_imports, + missing_functions, }) } } @@ -269,14 +275,28 @@ impl<'a> Sandbox for FunctionExecutor<'a> { } } -struct Resolver<'a>(&'a[&'static dyn Function]); +struct Resolver<'a> { + host_functions: &'a[&'static dyn Function], + allow_missing_imports: bool, + missing_functions: RefCell>, +} + +impl<'a> Resolver<'a> { + fn new(host_functions: &'a[&'static dyn Function], allow_missing_imports: bool) -> Resolver<'a> { + Resolver { + host_functions, + allow_missing_imports, + missing_functions: RefCell::new(Vec::new()), + } + } +} impl<'a> wasmi::ModuleImportResolver for Resolver<'a> { fn resolve_func(&self, name: &str, signature: &wasmi::Signature) -> std::result::Result { let signature = sp_wasm_interface::Signature::from(signature); - for (function_index, function) in self.0.iter().enumerate() { + for (function_index, function) in self.host_functions.iter().enumerate() { if name == function.name() { if signature == function.signature() { return Ok( @@ -295,9 +315,17 @@ impl<'a> wasmi::ModuleImportResolver for Resolver<'a> { } } - Err(wasmi::Error::Instantiation( - format!("Export {} not found", name), - )) + if self.allow_missing_imports { + trace!(target: "wasm-executor", "Could not find function `{}`, a stub will be provided instead.", name); + let id = self.missing_functions.borrow().len() + self.host_functions.len(); + self.missing_functions.borrow_mut().push(name.to_string()); + + Ok(wasmi::FuncInstance::alloc_host(signature.into(), id)) + } else { + Err(wasmi::Error::Instantiation( + format!("Export {} not found", name), + )) + } } } @@ -306,16 +334,23 @@ impl<'a> wasmi::Externals for FunctionExecutor<'a> { -> Result, wasmi::Trap> { let mut args = args.as_ref().iter().copied().map(Into::into); - let function = self.host_functions.get(index).ok_or_else(|| - Error::from( - format!("Could not find host function with index: {}", index), - ) - )?; - - function.execute(self, &mut args) - .map_err(|msg| Error::FunctionExecution(function.name().to_string(), msg)) - .map_err(wasmi::Trap::from) - .map(|v| v.map(Into::into)) + + if let Some(function) = self.host_functions.get(index) { + function.execute(self, &mut args) + .map_err(|msg| Error::FunctionExecution(function.name().to_string(), msg)) + .map_err(wasmi::Trap::from) + .map(|v| v.map(Into::into)) + } else if self.allow_missing_imports + && index >= self.host_functions.len() + && index < self.host_functions.len() + self.missing_functions.len() + { + Err(Error::from(format!( + "Function `{}` is only a stub. Calling a stub is not allowed.", + self.missing_functions[index - self.host_functions.len()], + )).into()) + } else { + Err(Error::from(format!("Could not find host function with index: {}", index)).into()) + } } } @@ -351,6 +386,8 @@ fn call_in_wasm_module( method: &str, data: &[u8], host_functions: &[&'static dyn Function], + allow_missing_imports: bool, + missing_functions: &Vec, ) -> Result, Error> { // extract a reference to a linear memory, optional reference to a table // and then initialize FunctionExecutor. @@ -360,7 +397,14 @@ fn call_in_wasm_module( .and_then(|e| e.as_table().cloned()); let heap_base = get_heap_base(module_instance)?; - let mut fec = FunctionExecutor::new(memory.clone(), heap_base, table, host_functions)?; + let mut fec = FunctionExecutor::new( + memory.clone(), + heap_base, + table, + host_functions, + allow_missing_imports, + missing_functions, + )?; // Write the call data let offset = fec.allocate_memory(data.len() as u32)?; @@ -397,8 +441,9 @@ fn instantiate_module( heap_pages: usize, module: &Module, host_functions: &[&'static dyn Function], -) -> Result { - let resolver = Resolver(host_functions); + allow_missing_imports: bool, +) -> Result<(ModuleRef, Vec), Error> { + let resolver = Resolver::new(host_functions, allow_missing_imports); // start module instantiation. Don't run 'start' function yet. let intermediate_instance = ModuleInstance::new( module, @@ -416,7 +461,7 @@ fn instantiate_module( // Runtime is not allowed to have the `start` function. Err(Error::RuntimeHasStartFn) } else { - Ok(intermediate_instance.assert_no_start()) + Ok((intermediate_instance.assert_no_start(), resolver.missing_functions.into_inner())) } } @@ -536,6 +581,11 @@ pub struct WasmiRuntime { state_snapshot: StateSnapshot, /// The host functions registered for this instance. host_functions: Vec<&'static dyn Function>, + /// Enable stub generation for functions that are not available in `host_functions`. + /// These stubs will error when the wasm blob tries to call them. + allow_missing_imports: bool, + /// List of missing functions detected during function resolution + missing_functions: Vec, } impl WasmRuntime for WasmiRuntime { @@ -561,7 +611,15 @@ impl WasmRuntime for WasmiRuntime { error!(target: "wasm-executor", "snapshot restoration failed: {}", e); e })?; - call_in_wasm_module(ext, &self.instance, method, data, &self.host_functions) + call_in_wasm_module( + ext, + &self.instance, + method, + data, + &self.host_functions, + self.allow_missing_imports, + &self.missing_functions, + ) } } @@ -569,6 +627,7 @@ pub fn create_instance( code: &[u8], heap_pages: u64, host_functions: Vec<&'static dyn Function>, + allow_missing_imports: bool, ) -> Result { let module = Module::from_buffer(&code).map_err(|_| WasmError::InvalidModule)?; @@ -579,8 +638,12 @@ pub fn create_instance( let data_segments = extract_data_segments(&code)?; // Instantiate this module. - let instance = instantiate_module(heap_pages as usize, &module, &host_functions) - .map_err(|e| WasmError::Instantiation(e.to_string()))?; + let (instance, missing_functions) = instantiate_module( + heap_pages as usize, + &module, + &host_functions, + allow_missing_imports, + ).map_err(|e| WasmError::Instantiation(e.to_string()))?; // Take state snapshot before executing anything. let state_snapshot = StateSnapshot::take(&instance, data_segments, heap_pages) @@ -595,6 +658,8 @@ pub fn create_instance( instance, state_snapshot, host_functions, + allow_missing_imports, + missing_functions, }) } diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index 683a7af297..35a93e2136 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -41,6 +41,7 @@ fn call_wasm_method(method: &str) -> TestExternalities { &mut ext_ext, &WASM_BINARY[..], 8, + false, ).expect(&format!("Executes `{}`", method)); ext -- GitLab From fb1f9804d31443d51431db44ca2dfc385b5b3896 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Thu, 9 Jan 2020 11:29:09 +0100 Subject: [PATCH 073/296] Update `per_thing` docs (#4575) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update `per_thing` docs * Update primitives/arithmetic/src/per_things.rs Co-Authored-By: Bastian Köcher * Update per_things.rs Co-authored-by: Bastian Köcher --- primitives/arithmetic/src/per_things.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/primitives/arithmetic/src/per_things.rs b/primitives/arithmetic/src/per_things.rs index 8c732248a3..f10df9a1c2 100644 --- a/primitives/arithmetic/src/per_things.rs +++ b/primitives/arithmetic/src/per_things.rs @@ -54,7 +54,7 @@ macro_rules! implement_per_thing { Self([parts, $max][(parts > $max) as usize]) } - /// Converts from a percent. Equal to `x / 100`. + /// Converts a percent into `Self`. Equal to `x / 100`. /// /// This can be created at compile time. pub const fn from_percent(x: $type) -> Self { @@ -69,7 +69,7 @@ macro_rules! implement_per_thing { Self::from_rational_approximation(p, q) } - /// Converts a fraction into `Permill`. + /// Converts a fraction into `Self`. #[cfg(feature = "std")] pub fn from_fraction(x: f64) -> Self { Self((x * ($max as f64)) as $type) } -- GitLab From e215bc84eea97923b21820cad15f90b3714e550b Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Thu, 9 Jan 2020 11:33:27 +0100 Subject: [PATCH 074/296] Introduce rebond (#4374) * Implement rebond: allowing to re-bond stake unbonded. --- bin/node/runtime/src/lib.rs | 4 +- frame/staking/src/lib.rs | 48 ++++++++++++- frame/staking/src/tests.rs | 140 ++++++++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+), 3 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 22d0e4cca3..39908cef12 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -78,8 +78,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 199, - impl_version: 199, + spec_version: 200, + impl_version: 200, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index d8ce3fa78d..deb451f35c 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -395,7 +395,7 @@ pub struct StakingLedger { impl< AccountId, - Balance: HasCompact + Copy + Saturating, + Balance: HasCompact + Copy + Saturating + SimpleArithmetic, > StakingLedger { /// Remove entries from `unlocking` that are sufficiently old and reduce the /// total by the sum of their balances. @@ -412,6 +412,30 @@ impl< Self { total, active: self.active, stash: self.stash, unlocking } } + /// Re-bond funds that were scheduled for unlocking. + fn rebond(mut self, value: Balance) -> Self { + let mut unlocking_balance: Balance = Zero::zero(); + + while let Some(last) = self.unlocking.last_mut() { + if unlocking_balance + last.value <= value { + unlocking_balance += last.value; + self.active += last.value; + self.unlocking.pop(); + } else { + let diff = value - unlocking_balance; + + unlocking_balance += diff; + self.active += diff; + last.value -= diff; + } + + if unlocking_balance >= value { + break + } + } + + self + } } impl StakingLedger where @@ -804,6 +828,8 @@ decl_error! { InsufficientValue, /// Can not schedule more unlock chunks. NoMoreChunks, + /// Can not rebond without unlocking chunks. + NoUnlockChunk, } } @@ -959,6 +985,26 @@ decl_module! { } } + /// Rebond a portion of the stash scheduled to be unlocked. + /// + /// # + /// - Time complexity: O(1). Bounded by `MAX_UNLOCKING_CHUNKS`. + /// - Storage changes: Can't increase storage, only decrease it. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] + fn rebond(origin, #[compact] value: BalanceOf) { + let controller = ensure_signed(origin)?; + let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + ensure!( + ledger.unlocking.len() > 0, + Error::::NoUnlockChunk, + ); + + let ledger = ledger.rebond(value); + + Self::update_ledger(&controller, &ledger); + } + /// Remove any unlocked chunks from the `unlocking` queue from our management. /// /// This essentially frees up that balance to be used by the stash account to do diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 1ab43910c7..572a6667ef 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -1196,6 +1196,146 @@ fn too_many_unbond_calls_should_not_work() { }) } +#[test] +fn rebond_works() { + // * Should test + // * Given an account being bonded [and chosen as a validator](not mandatory) + // * it can unbond a portion of its funds from the stash account. + // * it can re-bond a portion of the funds scheduled to unlock. + ExtBuilder::default() + .nominate(false) + .build() + .execute_with(|| { + // Set payee to controller. avoids confusion + assert_ok!(Staking::set_payee( + Origin::signed(10), + RewardDestination::Controller + )); + + // Give account 11 some large free balance greater than total + let _ = Balances::make_free_balance_be(&11, 1000000); + + // confirm that 10 is a normal validator and gets paid at the end of the era. + start_era(1); + + // Initial state of 10 + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 1000, + unlocking: vec![], + }) + ); + + start_era(2); + assert_eq!(Staking::current_era(), 2); + + // Try to rebond some funds. We get an error since no fund is unbonded. + assert_noop!( + Staking::rebond(Origin::signed(10), 500), + Error::::NoUnlockChunk, + ); + + // Unbond almost all of the funds in stash. + Staking::unbond(Origin::signed(10), 900).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 100, + unlocking: vec![UnlockChunk { + value: 900, + era: 2 + 3 + },] + }) + ); + + // Re-bond all the funds unbonded. + Staking::rebond(Origin::signed(10), 900).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 1000, + unlocking: vec![], + }) + ); + + // Unbond almost all of the funds in stash. + Staking::unbond(Origin::signed(10), 900).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 100, + unlocking: vec![UnlockChunk { value: 900, era: 5 }], + }) + ); + + // Re-bond part of the funds unbonded. + Staking::rebond(Origin::signed(10), 500).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 600, + unlocking: vec![UnlockChunk { value: 400, era: 5 }], + }) + ); + + // Re-bond the remainder of the funds unbonded. + Staking::rebond(Origin::signed(10), 500).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 1000, + unlocking: vec![] + }) + ); + + // Unbond parts of the funds in stash. + Staking::unbond(Origin::signed(10), 300).unwrap(); + Staking::unbond(Origin::signed(10), 300).unwrap(); + Staking::unbond(Origin::signed(10), 300).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 100, + unlocking: vec![ + UnlockChunk { value: 300, era: 5 }, + UnlockChunk { value: 300, era: 5 }, + UnlockChunk { value: 300, era: 5 }, + ] + }) + ); + + // Re-bond part of the funds unbonded. + Staking::rebond(Origin::signed(10), 500).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 600, + unlocking: vec![ + UnlockChunk { value: 300, era: 5 }, + UnlockChunk { value: 100, era: 5 }, + ] + }) + ); + }) +} + #[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 e569c031cb4167eb7178bb4ce971b8949c994121 Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Thu, 9 Jan 2020 14:15:47 +0100 Subject: [PATCH 075/296] Add missing weights to Identity module. (#4577) --- frame/identity/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index e6bb83dd05..c23862c4a2 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -540,6 +540,7 @@ decl_module! { /// - At most O(2 * S + 1) storage mutations; codec complexity `O(1 * S + S * 1)`); /// one storage-exists. /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] fn set_subs(origin, subs: Vec<(T::AccountId, Data)>) { let sender = ensure_signed(origin)?; ensure!(>::exists(&sender), Error::::NotFound); @@ -586,6 +587,7 @@ decl_module! { /// - `S + 2` storage deletions. /// - One event. /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] fn clear_identity(origin) { let sender = ensure_signed(origin)?; -- GitLab From e81f7c67a441b4ccb3eea9908354223be00e1750 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 9 Jan 2020 14:39:12 +0100 Subject: [PATCH 076/296] Add tipping into treasury (#4480) * First draft * Initial work on tests * Add tests. * Ensure old members can't tip. * Fix complexity * Update node runtime * Build fix. * build fix * Fix tests * Fix tests * Refactor Contains impl for tests * Introduce new way to avoid impl Contains conflicts * Fixes * Docs. * Docs. * Typo * Whitespace * Docs * Typo * Formatting * Update frame/treasury/src/lib.rs Co-Authored-By: Shawn Tabrizi * Update frame/treasury/src/lib.rs Co-Authored-By: Shawn Tabrizi * Update frame/treasury/src/lib.rs Co-Authored-By: Shawn Tabrizi * Apply suggestions from code review Co-Authored-By: Shawn Tabrizi * Add provisional weights. Co-authored-by: Shawn Tabrizi --- bin/node/runtime/Cargo.toml | 8 +- bin/node/runtime/src/lib.rs | 13 +- frame/democracy/src/lib.rs | 9 +- frame/elections-phragmen/src/lib.rs | 9 +- frame/identity/src/lib.rs | 7 +- frame/membership/src/lib.rs | 10 +- frame/nicks/src/lib.rs | 7 +- frame/scored-pool/src/mock.rs | 9 +- frame/support/src/lib.rs | 25 ++ frame/support/src/traits.rs | 14 +- frame/system/src/lib.rs | 2 +- frame/treasury/src/lib.rs | 653 ++++++++++++++++++++++++---- 12 files changed, 666 insertions(+), 100 deletions(-) diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 33cb7b61db..a8f26d13cb 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -31,6 +31,10 @@ sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../ sp-version = { version = "2.0.0", default-features = false, path = "../../../primitives/version" } # frame dependencies +frame-executive = { version = "2.0.0", default-features = false, path = "../../../frame/executive" } +frame-support = { version = "2.0.0", default-features = false, path = "../../../frame/support" } +frame-system = { version = "2.0.0", default-features = false, path = "../../../frame/system" } +frame-system-rpc-runtime-api = { version = "2.0.0", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } pallet-authority-discovery = { version = "2.0.0", default-features = false, path = "../../../frame/authority-discovery" } pallet-authorship = { version = "2.0.0", default-features = false, path = "../../../frame/authorship" } pallet-babe = { version = "2.0.0", default-features = false, path = "../../../frame/babe" } @@ -40,7 +44,6 @@ pallet-contracts = { version = "2.0.0", default-features = false, path = "../../ pallet-contracts-rpc-runtime-api = { version = "2.0.0", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } pallet-democracy = { version = "2.0.0", default-features = false, path = "../../../frame/democracy" } pallet-elections-phragmen = { version = "2.0.0", default-features = false, path = "../../../frame/elections-phragmen" } -frame-executive = { version = "2.0.0", default-features = false, path = "../../../frame/executive" } pallet-finality-tracker = { version = "2.0.0", default-features = false, path = "../../../frame/finality-tracker" } pallet-grandpa = { version = "2.0.0", default-features = false, path = "../../../frame/grandpa" } pallet-im-online = { version = "2.0.0", default-features = false, path = "../../../frame/im-online" } @@ -53,9 +56,6 @@ pallet-session = { version = "2.0.0", features = ["historical"], path = "../../. pallet-staking = { version = "2.0.0", features = ["migrate"], path = "../../../frame/staking", default-features = false } pallet-staking-reward-curve = { version = "2.0.0", path = "../../../frame/staking/reward-curve" } pallet-sudo = { version = "2.0.0", default-features = false, path = "../../../frame/sudo" } -frame-support = { version = "2.0.0", default-features = false, path = "../../../frame/support" } -frame-system = { version = "2.0.0", default-features = false, path = "../../../frame/system" } -frame-system-rpc-runtime-api = { version = "2.0.0", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } pallet-timestamp = { version = "2.0.0", default-features = false, path = "../../../frame/timestamp" } pallet-treasury = { version = "2.0.0", default-features = false, path = "../../../frame/treasury" } pallet-utility = { version = "2.0.0", default-features = false, path = "../../../frame/utility" } diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 39908cef12..f83800944e 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -29,7 +29,9 @@ use frame_support::{ use sp_core::u32_trait::{_1, _2, _3, _4}; use node_primitives::{AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Moment, Signature}; use sp_api::impl_runtime_apis; -use sp_runtime::{Permill, Perbill, ApplyExtrinsicResult, impl_opaque_keys, generic, create_runtime_str}; +use sp_runtime::{ + Permill, Perbill, Percent, ApplyExtrinsicResult, impl_opaque_keys, generic, create_runtime_str +}; use sp_runtime::curve::PiecewiseLinear; use sp_runtime::transaction_validity::TransactionValidity; use sp_runtime::traits::{ @@ -376,6 +378,10 @@ parameter_types! { pub const ProposalBondMinimum: Balance = 1 * DOLLARS; pub const SpendPeriod: BlockNumber = 1 * DAYS; pub const Burn: Permill = Permill::from_percent(50); + pub const TipCountdown: BlockNumber = 1 * DAYS; + pub const TipFindersFee: Percent = Percent::from_percent(20); + pub const TipReportDepositBase: Balance = 1 * DOLLARS; + pub const TipReportDepositPerByte: Balance = 1 * CENTS; } impl pallet_treasury::Trait for Runtime { @@ -388,6 +394,11 @@ impl pallet_treasury::Trait for Runtime { type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; + type Tippers = Elections; + type TipCountdown = TipCountdown; + type TipFindersFee = TipFindersFee; + type TipReportDepositBase = TipReportDepositBase; + type TipReportDepositPerByte = TipReportDepositPerByte; } parameter_types! { diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 594c9db7c6..3766aa2207 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -1144,8 +1144,7 @@ mod tests { use std::cell::RefCell; use frame_support::{ impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types, - traits::Contains, - weights::Weight, + ord_parameter_types, traits::Contains, weights::Weight, }; use sp_core::H256; use sp_runtime::{ @@ -1221,6 +1220,8 @@ mod tests { pub const MinimumDeposit: u64 = 1; pub const EnactmentPeriod: u64 = 2; pub const CooloffPeriod: u64 = 2; + } + ord_parameter_types! { pub const One: u64 = 1; pub const Two: u64 = 2; pub const Three: u64 = 3; @@ -1229,8 +1230,8 @@ mod tests { } pub struct OneToFive; impl Contains for OneToFive { - fn contains(n: &u64) -> bool { - *n >= 1 && *n <= 5 + fn sorted_members() -> Vec { + vec![1, 2, 3, 4, 5] } } thread_local! { diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 48f5959f98..e3243491b1 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -88,7 +88,7 @@ use frame_support::{ decl_storage, decl_event, ensure, decl_module, decl_error, weights::SimpleDispatchInfo, traits::{ Currency, Get, LockableCurrency, LockIdentifier, ReservableCurrency, WithdrawReasons, - ChangeMembers, OnUnbalanced, WithdrawReason + ChangeMembers, OnUnbalanced, WithdrawReason, Contains } }; use sp_phragmen::ExtendedBalance; @@ -767,6 +767,13 @@ impl Module { } } +impl Contains for Module { + fn contains(who: &T::AccountId) -> bool { + Self::is_member(who) + } + fn sorted_members() -> Vec { Self::members_ids() } +} + #[cfg(test)] mod tests { use super::*; diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index c23862c4a2..1b9b32b234 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -868,7 +868,10 @@ mod tests { use super::*; use sp_runtime::traits::BadOrigin; - use frame_support::{assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight}; + use frame_support::{ + assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight, + ord_parameter_types + }; use sp_core::H256; use frame_system::EnsureSignedBy; // The testing primitives are very useful for avoiding having to work with signatures @@ -931,6 +934,8 @@ mod tests { pub const FieldDeposit: u64 = 10; pub const SubAccountDeposit: u64 = 10; pub const MaximumSubAccounts: u32 = 2; + } + ord_parameter_types! { pub const One: u64 = 1; pub const Two: u64 = 2; } diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index 4b15bf02b4..f089f22912 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -227,11 +227,15 @@ mod tests { use super::*; use std::cell::RefCell; - use frame_support::{assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight}; + use frame_support::{ + assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight, + ord_parameter_types + }; + use frame_support::traits::Contains; use sp_core::H256; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. - use sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header, traits::BadOrigin}; + use sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup, BadOrigin}, testing::Header}; use frame_system::EnsureSignedBy; impl_outer_origin! { @@ -267,7 +271,7 @@ mod tests { type Version = (); type ModuleToIndex = (); } - parameter_types! { + ord_parameter_types! { pub const One: u64 = 1; pub const Two: u64 = 2; pub const Three: u64 = 3; diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index d05dc53e98..bee6629b3b 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -241,7 +241,10 @@ decl_module! { mod tests { use super::*; - use frame_support::{assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight}; + use frame_support::{ + assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight, + ord_parameter_types + }; use sp_core::H256; use frame_system::EnsureSignedBy; // The testing primitives are very useful for avoiding having to work with signatures @@ -303,6 +306,8 @@ mod tests { pub const ReservationFee: u64 = 2; pub const MinLength: usize = 3; pub const MaxLength: usize = 16; + } + ord_parameter_types! { pub const One: u64 = 1; } impl Trait for Test { diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index 542908e062..bc44bf5e62 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -19,7 +19,7 @@ use super::*; use std::cell::RefCell; -use frame_support::{impl_outer_origin, parameter_types, weights::Weight}; +use frame_support::{impl_outer_origin, parameter_types, weights::Weight, ord_parameter_types}; use sp_core::H256; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. @@ -41,9 +41,6 @@ parameter_types! { pub const CandidateDeposit: u64 = 25; pub const Period: u64 = 4; - pub const KickOrigin: u64 = 2; - pub const ScoreOrigin: u64 = 3; - pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: Weight = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; @@ -53,6 +50,10 @@ parameter_types! { pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } +ord_parameter_types! { + pub const KickOrigin: u64 = 2; + pub const ScoreOrigin: u64 = 3; +} impl frame_system::Trait for Test { type Origin = Origin; diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index af6eea9c73..0d769c3335 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -117,6 +117,31 @@ macro_rules! parameter_types { } } +/// Macro for easily creating a new implementation of both the `Get` and `Contains` traits. Use +/// exactly as with `parameter_types`, only the type must be `Ord`. +#[macro_export] +macro_rules! ord_parameter_types { + ( + $( #[ $attr:meta ] )* + $vis:vis const $name:ident: $type:ty = $value:expr; + $( $rest:tt )* + ) => ( + $( #[ $attr ] )* + $vis struct $name; + $crate::parameter_types!{IMPL $name , $type , $value} + $crate::ord_parameter_types!{IMPL $name , $type , $value} + $crate::ord_parameter_types!{ $( $rest )* } + ); + () => (); + (IMPL $name:ident , $type:ty , $value:expr) => { + impl $crate::traits::Contains<$type> for $name { + fn contains(t: &$type) -> bool { &$value == t } + fn sorted_members() -> $crate::sp_std::prelude::Vec<$type> { vec![$value] } + fn count() -> usize { 1 } + } + } +} + #[doc(inline)] pub use frame_support_procedural::{decl_storage, construct_runtime}; diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index 7d9040ad67..51367ee955 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -53,15 +53,15 @@ impl Get for () { /// 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 { +pub trait Contains { /// Return `true` if this "contains" the given value `t`. - fn contains(t: &T) -> bool; -} + fn contains(t: &T) -> bool { Self::sorted_members().binary_search(t).is_ok() } -impl> Contains for T { - fn contains(t: &V) -> bool { - &Self::get() == t - } + /// Get a vector of all members in the set, ordered. + fn sorted_members() -> Vec; + + /// Get the number of items in the set. + fn count() -> usize { Self::sorted_members().len() } } /// The account with the given id was killed. diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 3187ea2727..5c194f6257 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -467,7 +467,7 @@ pub struct EnsureSignedBy(sp_std::marker::PhantomData<(Who, Acco impl< O: Into, O>> + From>, Who: Contains, - AccountId: PartialEq + Clone, + AccountId: PartialEq + Clone + Ord, > EnsureOrigin for EnsureSignedBy { type Success = AccountId; fn try_origin(o: O) -> Result { diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 7ad011ac95..69d43bf4bc 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -25,12 +25,24 @@ //! ## Overview //! //! The Treasury Module itself provides the pot to store funds, and a means for stakeholders to -//! propose, approve, and deny expenditures. The chain will need to provide a method (e.g. +//! propose, approve, and deny expenditures. 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. //! +//! ### Tipping +//! +//! A separate subsystem exists to allow for an agile "tipping" process, whereby a reward may be +//! given without first having a pre-determined stakeholder group come to consensus on how much +//! should be paid. +//! +//! A group of `Tippers` is determined through the config `Trait`. After half of these have declared +//! some amount that they believe a particular reported reason deserves, then a countfown period is +//! entered where any remaining members can declare their tip amounts also. After the close of the +//! countdown period, the median of all declared tips is paid to the reported beneficiary, along +//! with any finders fee, in case of a public (and bonded) original report. +//! //! ### Terminology //! //! - **Proposal:** A suggestion to allocate funds from the pot to a beneficiary. @@ -41,16 +53,34 @@ //! respectively. //! - **Pot:** Unspent funds accumulated by the treasury module. //! +//! Tipping protocol: +//! - **Tipping:** The process of gathering declarations of amounts to tip and taking the median +//! amount to be transferred from the treasury to a beneficiary account. +//! - **Tip Reason:** The reason for a tip; generally a URL which embodies or explains why a +//! particular individual (identified by an account ID) is worthy of a recognition by the +//! treasury. +//! - **Finder:** The original public reporter of some reason for tipping. +//! - **Finders Fee:** Some proportion of the tip amount that is paid to the reporter of the tip, +//! rather than the main beneficiary. +//! //! ## Interface //! //! ### Dispatchable Functions //! +//! General spending/proposal protocol: //! - `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, slashing the deposit. //! - `approve_proposal` - Accept the proposal, returning the deposit. //! +//! Tipping protocol: +//! - `report_awesome` - Report something worthy of a tip and register for a finders fee. +//! - `retract_tip` - Retract a previous (finders fee registered) report. +//! - `tip_new` - Report an item worthy of a tip and declare a specific amount to tip. +//! - `tip` - Declare or redeclare an amount to tip for a particular reason. +//! - `close_tip` - Close and pay out a tip. +//! //! ## GenesisConfig //! //! The Treasury module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). @@ -60,14 +90,15 @@ #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; use sp_std::prelude::*; -use frame_support::{decl_module, decl_storage, decl_event, ensure, print, decl_error}; +use frame_support::{decl_module, decl_storage, decl_event, ensure, print, decl_error, Parameter}; use frame_support::traits::{ - Currency, ExistenceRequirement, Get, Imbalance, OnUnbalanced, + Currency, ExistenceRequirement, Get, Imbalance, OnUnbalanced, ExistenceRequirement::AllowDeath, ReservableCurrency, WithdrawReason }; -use sp_runtime::{Permill, ModuleId}; -use sp_runtime::traits::{Zero, EnsureOrigin, StaticLookup, AccountIdConversion, Saturating}; -use frame_support::weights::SimpleDispatchInfo; +use sp_runtime::{Permill, ModuleId, Percent, RuntimeDebug, traits::{ + Zero, EnsureOrigin, StaticLookup, AccountIdConversion, Saturating, Hash, BadOrigin +}}; +use frame_support::{weights::SimpleDispatchInfo, traits::Contains}; use codec::{Encode, Decode}; use frame_system::{self as system, ensure_signed}; @@ -75,6 +106,7 @@ type BalanceOf = <::Currency as Currency< = <::Currency as Currency<::AccountId>>::PositiveImbalance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +/// The treasury's module id, used for deriving its sovereign account ID. const MODULE_ID: ModuleId = ModuleId(*b"py/trsry"); pub trait Trait: frame_system::Trait { @@ -87,6 +119,21 @@ pub trait Trait: frame_system::Trait { /// Origin from which rejections must come. type RejectOrigin: EnsureOrigin; + /// Origin from which tippers must come. + type Tippers: Contains; + + /// The period for which a tip remains open after is has achieved threshold tippers. + type TipCountdown: Get; + + /// The percent of the final tip which goes to the original reporter of the tip. + type TipFindersFee: Get; + + /// The amount held on deposit for placing a tip report. + type TipReportDepositBase: Get>; + + /// The amount held on deposit per byte within the tip report reason. + type TipReportDepositPerByte: Get>; + /// The overarching event type. type Event: From> + Into<::Event>; @@ -107,7 +154,131 @@ pub trait Trait: frame_system::Trait { type Burn: Get; } -type ProposalIndex = u32; +/// An index of a proposal. Just a `u32`. +pub type ProposalIndex = u32; + +/// A spending proposal. +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +pub struct Proposal { + /// The account proposing it. + proposer: AccountId, + /// The (total) amount that should be paid if the proposal is accepted. + value: Balance, + /// The account to whom the payment should be made if the proposal is accepted. + beneficiary: AccountId, + /// The amount held on deposit (reserved) for making this proposal. + bond: Balance, +} + +/// An open tipping "motion". Retains all details of a tip including information on the finder +/// and the members who have voted. +#[derive(Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug)] +pub struct OpenTip< + AccountId: Parameter, + Balance: Parameter, + BlockNumber: Parameter, + Hash: Parameter, +> { + /// The hash of the reason for the tip. The reason should be a human-readable UTF-8 encoded string. A URL would be + /// sensible. + reason: Hash, + /// The account to be tipped. + who: AccountId, + /// The account who began this tip and the amount held on deposit. + finder: Option<(AccountId, Balance)>, + /// The block number at which this tip will close if `Some`. If `None`, then no closing is + /// scheduled. + closes: Option, + /// The members who have voted for this tip. Sorted by AccountId. + tips: Vec<(AccountId, Balance)>, +} + +decl_storage! { + trait Store for Module as Treasury { + /// Number of proposals that have been made. + ProposalCount get(fn proposal_count): ProposalIndex; + + /// Proposals that have been made. + Proposals get(fn proposals): map ProposalIndex => Option>>; + + /// Proposal indices that have been approved but not yet awarded. + Approvals get(fn approvals): Vec; + + /// Tips that are not yet completed. Keyed by the hash of `(reason, who)` from the value. + /// This has the insecure enumerable hash function since the key itself is already + /// guaranteed to be a secure hash. + pub Tips get(fn tips): map hasher(twox_64_concat) T::Hash + => Option, T::BlockNumber, T::Hash>>; + + /// Simple preimage lookup from the reason's hash to the original data. Again, has an + /// insecure enumerable hash since the key is guaranteed to be the result of a secure hash. + pub Reasons get(fn reasons): map hasher(twox_64_concat) T::Hash => Option>; + } + add_extra_genesis { + build(|_config| { + // Create Treasury account + let _ = T::Currency::make_free_balance_be( + &>::account_id(), + T::Currency::minimum_balance(), + ); + }); + } +} + +decl_event!( + pub enum Event + where + Balance = BalanceOf, + ::AccountId, + ::Hash, + { + /// New proposal. + Proposed(ProposalIndex), + /// We have ended a spend period and will now allocate funds. + Spending(Balance), + /// Some funds have been allocated. + Awarded(ProposalIndex, Balance, AccountId), + /// A proposal was rejected; funds were slashed. + Rejected(ProposalIndex, Balance), + /// Some of our funds have been burnt. + Burnt(Balance), + /// Spending has finished; this is the amount that rolls over until next spend. + Rollover(Balance), + /// Some funds have been deposited. + Deposit(Balance), + /// A new tip suggestion has been opened. + NewTip(Hash), + /// A tip suggestion has reached threshold and is closing. + TipClosing(Hash), + /// A tip suggestion has been closed. + TipClosed(Hash, AccountId, Balance), + /// A tip suggestion has been retracted. + TipRetracted(Hash), + } +); + +decl_error! { + /// Error for the treasury module. + pub enum Error for Module { + /// Proposer's balance is too low. + InsufficientProposersBalance, + /// No proposal at that index. + InvalidProposalIndex, + /// The reason given is just too big. + ReasonTooBig, + /// The tip was already found/started. + AlreadyKnown, + /// The tip hash is unknown. + UnknownTip, + /// The account attempting to retract the tip is not the finder of the tip. + NotFinder, + /// The tip cannot be claimed/closed because there are not enough tippers yet. + StillOpen, + /// The tip cannot be claimed/closed because it's still in the countdown period. + Premature, + } +} decl_module! { pub struct Module for enum Call where origin: T::Origin { @@ -124,10 +295,188 @@ decl_module! { /// Percentage of spare funds (if any) that are burnt per spend period. const Burn: Permill = T::Burn::get(); + /// The period for which a tip remains open after is has achieved threshold tippers. + const TipCountdown: T::BlockNumber = T::TipCountdown::get(); + + /// The amount of the final tip which goes to the original reporter of the tip. + const TipFindersFee: Percent = T::TipFindersFee::get(); + + /// The amount held on deposit for placing a tip report. + const TipReportDepositBase: BalanceOf = T::TipReportDepositBase::get(); + + /// The amount held on deposit per byte within the tip report reason. + const TipReportDepositPerByte: BalanceOf = T::TipReportDepositPerByte::get(); + type Error = Error; fn deposit_event() = default; + /// Report something `reason` that deserves a tip and claim any eventual the finder's fee. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// Payment: `TipReportDepositBase` will be reserved from the origin account, as well as + /// `TipReportDepositPerByte` for each byte in `reason`. + /// + /// - `reason`: The reason for, or the thing that deserves, the tip; generally this will be + /// a UTF-8-encoded URL. + /// - `who`: The account which should be credited for the tip. + /// + /// Emits `NewTip` if successful. + /// + /// # + /// - `O(R)` where `R` length of `reason`. + /// - One balance operation. + /// - One storage mutation (codec `O(R)`). + /// - One event. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] + fn report_awesome(origin, reason: Vec, who: T::AccountId) { + let finder = ensure_signed(origin)?; + + const MAX_SENSIBLE_REASON_LENGTH: usize = 16384; + ensure!(reason.len() <= MAX_SENSIBLE_REASON_LENGTH, Error::::ReasonTooBig); + + let reason_hash = T::Hashing::hash(&reason[..]); + ensure!(!Reasons::::exists(&reason_hash), Error::::AlreadyKnown); + let hash = T::Hashing::hash_of(&(&reason_hash, &who)); + ensure!(!Tips::::exists(&hash), Error::::AlreadyKnown); + + let deposit = T::TipReportDepositBase::get() + + T::TipReportDepositPerByte::get() * (reason.len() as u32).into(); + T::Currency::reserve(&finder, deposit)?; + + Reasons::::insert(&reason_hash, &reason); + let finder = Some((finder, deposit)); + let tip = OpenTip { reason: reason_hash, who, finder, closes: None, tips: vec![] }; + Tips::::insert(&hash, tip); + Self::deposit_event(RawEvent::NewTip(hash)); + } + + /// Retract a prior tip-report from `report_awesome`, and cancel the process of tipping. + /// + /// If successful, the original deposit will be unreserved. + /// + /// The dispatch origin for this call must be _Signed_ and the tip identified by `hash` + /// must have been reported by the signing account through `report_awesome` (and not + /// through `tip_new`). + /// + /// - `hash`: The identity of the open tip for which a tip value is declared. This is formed + /// as the hash of the tuple of the original tip `reason` and the beneficiary account ID. + /// + /// Emits `TipRetracted` if successful. + /// + /// # + /// - `O(T)` + /// - One balance operation. + /// - Two storage removals (one read, codec `O(T)`). + /// - One event. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn retract_tip(origin, hash: T::Hash) { + let who = ensure_signed(origin)?; + let tip = Tips::::get(&hash).ok_or(Error::::UnknownTip)?; + let (finder, deposit) = tip.finder.ok_or(Error::::NotFinder)?; + ensure!(finder == who, Error::::NotFinder); + + Reasons::::remove(&tip.reason); + Tips::::remove(&hash); + let _ = T::Currency::unreserve(&who, deposit); + Self::deposit_event(RawEvent::TipRetracted(hash)); + } + + /// Give a tip for something new; no finder's fee will be taken. + /// + /// The dispatch origin for this call must be _Signed_ and the signing account must be a + /// member of the `Tippers` set. + /// + /// - `reason`: The reason for, or the thing that deserves, the tip; generally this will be + /// a UTF-8-encoded URL. + /// - `who`: The account which should be credited for the tip. + /// - `tip_value`: The amount of tip that the sender would like to give. The median tip + /// value of active tippers will be given to the `who`. + /// + /// Emits `NewTip` if successful. + /// + /// # + /// - `O(R + T)` where `R` length of `reason`, `T` is the number of tippers. `T` is + /// naturally capped as a membership set, `R` is limited through transaction-size. + /// - Two storage insertions (codecs `O(R)`, `O(T)`), one read `O(1)`. + /// - One event. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(150_000)] + fn tip_new(origin, reason: Vec, who: T::AccountId, tip_value: BalanceOf) { + let tipper = ensure_signed(origin)?; + ensure!(T::Tippers::contains(&tipper), BadOrigin); + let reason_hash = T::Hashing::hash(&reason[..]); + ensure!(!Reasons::::exists(&reason_hash), Error::::AlreadyKnown); + let hash = T::Hashing::hash_of(&(&reason_hash, &who)); + + Reasons::::insert(&reason_hash, &reason); + Self::deposit_event(RawEvent::NewTip(hash.clone())); + let tips = vec![(tipper, tip_value)]; + let tip = OpenTip { reason: reason_hash, who, finder: None, closes: None, tips }; + Tips::::insert(&hash, tip); + } + + /// Declare a tip value for an already-open tip. + /// + /// The dispatch origin for this call must be _Signed_ and the signing account must be a + /// member of the `Tippers` set. + /// + /// - `hash`: The identity of the open tip for which a tip value is declared. This is formed + /// as the hash of the tuple of the hash of the original tip `reason` and the beneficiary + /// account ID. + /// - `tip_value`: The amount of tip that the sender would like to give. The median tip + /// value of active tippers will be given to the `who`. + /// + /// Emits `TipClosing` if the threshold of tippers has been reached and the countdown period + /// has started. + /// + /// # + /// - `O(T)` + /// - One storage mutation (codec `O(T)`), one storage read `O(1)`. + /// - Up to one event. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn tip(origin, hash: T::Hash, tip_value: BalanceOf) { + let tipper = ensure_signed(origin)?; + ensure!(T::Tippers::contains(&tipper), BadOrigin); + + let mut tip = Tips::::get(hash).ok_or(Error::::UnknownTip)?; + if Self::insert_tip_and_check_closing(&mut tip, tipper, tip_value) { + Self::deposit_event(RawEvent::TipClosing(hash.clone())); + } + Tips::::insert(&hash, tip); + } + + /// Close and payout a tip. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// The tip identified by `hash` must have finished its countdown period. + /// + /// - `hash`: The identity of the open tip for which a tip value is declared. This is formed + /// as the hash of the tuple of the original tip `reason` and the beneficiary account ID. + /// + /// # + /// - `O(T)` + /// - One storage retrieval (codec `O(T)`) and two removals. + /// - Up to three balance operations. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn close_tip(origin, hash: T::Hash) { + ensure_signed(origin)?; + + let tip = Tips::::get(hash).ok_or(Error::::UnknownTip)?; + let n = tip.closes.as_ref().ok_or(Error::::StillOpen)?; + ensure!(system::Module::::block_number() >= *n, Error::::Premature); + // closed. + Reasons::::remove(&tip.reason); + Tips::::remove(hash); + Self::payout_tip(tip); + } + /// 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. @@ -202,71 +551,6 @@ decl_module! { } } -/// A spending proposal. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, PartialEq, Eq, sp_runtime::RuntimeDebug)] -pub struct Proposal { - proposer: AccountId, - value: Balance, - beneficiary: AccountId, - bond: Balance, -} - -decl_storage! { - trait Store for Module as Treasury { - /// Number of proposals that have been made. - ProposalCount get(fn proposal_count): ProposalIndex; - - /// Proposals that have been made. - Proposals get(fn proposals): map ProposalIndex => Option>>; - - /// Proposal indices that have been approved but not yet awarded. - Approvals get(fn approvals): Vec; - } - add_extra_genesis { - build(|_config| { - // Create Treasury account - let _ = T::Currency::make_free_balance_be( - &>::account_id(), - T::Currency::minimum_balance(), - ); - }); - } -} - -decl_event!( - pub enum Event - where - Balance = BalanceOf, - ::AccountId - { - /// New proposal. - Proposed(ProposalIndex), - /// We have ended a spend period and will now allocate funds. - Spending(Balance), - /// Some funds have been allocated. - Awarded(ProposalIndex, Balance, AccountId), - /// A proposal was rejected; funds were slashed. - Rejected(ProposalIndex, Balance), - /// Some of our funds have been burnt. - Burnt(Balance), - /// Spending has finished; this is the amount that rolls over until next spend. - Rollover(Balance), - /// Some funds have been deposited. - Deposit(Balance), - } -); - -decl_error! { - /// Error for the treasury module. - pub enum Error for Module { - /// Proposer's balance is too low. - InsufficientProposersBalance, - /// No proposal at that index. - InvalidProposalIndex, - } -} - impl Module { // Add public immutables and private mutables. @@ -283,6 +567,76 @@ impl Module { T::ProposalBondMinimum::get().max(T::ProposalBond::get() * value) } + /// Given a mutable reference to an `OpenTip`, insert the tip into it and check whether it + /// closes, if so, then deposit the relevant event and set closing accordingly. + /// + /// `O(T)` and one storage access. + fn insert_tip_and_check_closing( + tip: &mut OpenTip, T::BlockNumber, T::Hash>, + tipper: T::AccountId, + tip_value: BalanceOf, + ) -> bool { + match tip.tips.binary_search_by_key(&&tipper, |x| &x.0) { + Ok(pos) => tip.tips[pos] = (tipper, tip_value), + Err(pos) => tip.tips.insert(pos, (tipper, tip_value)), + } + Self::retain_active_tips(&mut tip.tips); + let threshold = (T::Tippers::count() + 1) / 2; + if tip.tips.len() >= threshold && tip.closes.is_none() { + tip.closes = Some(system::Module::::block_number() + T::TipCountdown::get()); + true + } else { + false + } + } + + /// Remove any non-members of `Tippers` from a `tips` vectr. `O(T)`. + fn retain_active_tips(tips: &mut Vec<(T::AccountId, BalanceOf)>) { + let members = T::Tippers::sorted_members(); + let mut members_iter = members.iter(); + let mut member = members_iter.next(); + tips.retain(|(ref a, _)| loop { + match member { + None => break false, + Some(m) if m > a => break false, + Some(m) => { + member = members_iter.next(); + if m < a { + continue + } else { + break true; + } + } + } + }); + } + + /// Execute the payout of a tip. + /// + /// Up to three balance operations. + /// Plus `O(T)` (`T` is Tippers length). + fn payout_tip(tip: OpenTip, T::BlockNumber, T::Hash>) { + let mut tips = tip.tips; + Self::retain_active_tips(&mut tips); + tips.sort_by_key(|i| i.1); + let treasury = Self::account_id(); + let max_payout = T::Currency::free_balance(&treasury); + let mut payout = tips[tips.len() / 2].1.min(max_payout); + if let Some((finder, deposit)) = tip.finder { + let _ = T::Currency::unreserve(&finder, deposit); + if finder != tip.who { + // pay out the finder's fee. + let finders_fee = T::TipFindersFee::get() * payout; + payout -= finders_fee; + // this should go through given we checked it's at most the free balance, but still + // we only make a best-effort. + let _ = T::Currency::transfer(&treasury, &finder, finders_fee, AllowDeath); + } + } + // same as above: best-effort only. + let _ = T::Currency::transfer(&treasury, &tip.who, payout, AllowDeath); + } + // Spend some money! fn spend_funds() { let mut budget_remaining = Self::pot(); @@ -367,9 +721,10 @@ mod tests { use super::*; use frame_support::{assert_noop, assert_ok, impl_outer_origin, parameter_types, weights::Weight}; + use frame_support::traits::Contains; use sp_core::H256; use sp_runtime::{ - traits::{BlakeTwo256, OnFinalize, IdentityLookup}, testing::Header, Perbill + traits::{BlakeTwo256, OnFinalize, IdentityLookup, BadOrigin}, testing::Header, Perbill }; impl_outer_origin! { @@ -418,16 +773,34 @@ mod tests { type TransferFee = TransferFee; type CreationFee = CreationFee; } + pub struct TenToFourteen; + impl Contains for TenToFourteen { + fn contains(n: &u64) -> bool { + *n >= 10 && *n <= 14 + } + fn sorted_members() -> Vec { + vec![10, 11, 12, 13, 14] + } + } parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: u64 = 1; pub const SpendPeriod: u64 = 2; pub const Burn: Permill = Permill::from_percent(50); + pub const TipCountdown: u64 = 1; + pub const TipFindersFee: Percent = Percent::from_percent(20); + pub const TipReportDepositBase: u64 = 1; + pub const TipReportDepositPerByte: u64 = 1; } impl Trait for Test { type Currency = pallet_balances::Module; type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; + type Tippers = TenToFourteen; + type TipCountdown = TipCountdown; + type TipFindersFee = TipFindersFee; + type TipReportDepositBase = TipReportDepositBase; + type TipReportDepositPerByte = TipReportDepositPerByte; type Event = (); type ProposalRejection = (); type ProposalBond = ProposalBond; @@ -435,6 +808,7 @@ mod tests { type SpendPeriod = SpendPeriod; type Burn = Burn; } + type System = frame_system::Module; type Balances = pallet_balances::Module; type Treasury = Module; @@ -457,6 +831,139 @@ mod tests { }); } + fn tip_hash() -> H256 { + BlakeTwo256::hash_of(&(BlakeTwo256::hash(b"awesome.dot"), 3u64)) + } + + #[test] + fn tip_new_cannot_be_used_twice() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&Treasury::account_id(), 101); + assert_ok!(Treasury::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10)); + assert_noop!( + Treasury::tip_new(Origin::signed(11), b"awesome.dot".to_vec(), 3, 10), + Error::::AlreadyKnown + ); + }); + } + + #[test] + fn report_awesome_and_tip_works() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&Treasury::account_id(), 101); + assert_ok!(Treasury::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3)); + assert_eq!(Balances::reserved_balance(&0), 12); + assert_eq!(Balances::free_balance(&0), 88); + + // other reports don't count. + assert_noop!( + Treasury::report_awesome(Origin::signed(1), b"awesome.dot".to_vec(), 3), + Error::::AlreadyKnown + ); + + let h = tip_hash(); + assert_ok!(Treasury::tip(Origin::signed(10), h.clone(), 10)); + assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 10)); + assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 10)); + assert_noop!(Treasury::tip(Origin::signed(9), h.clone(), 10), BadOrigin); + System::set_block_number(2); + assert_ok!(Treasury::close_tip(Origin::signed(100), h.into())); + assert_eq!(Balances::reserved_balance(&0), 0); + assert_eq!(Balances::free_balance(&0), 102); + assert_eq!(Balances::free_balance(&3), 8); + }); + } + + #[test] + fn report_awesome_from_beneficiary_and_tip_works() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&Treasury::account_id(), 101); + assert_ok!(Treasury::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 0)); + assert_eq!(Balances::reserved_balance(&0), 12); + assert_eq!(Balances::free_balance(&0), 88); + let h = BlakeTwo256::hash_of(&(BlakeTwo256::hash(b"awesome.dot"), 0u64)); + assert_ok!(Treasury::tip(Origin::signed(10), h.clone(), 10)); + assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 10)); + assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 10)); + System::set_block_number(2); + assert_ok!(Treasury::close_tip(Origin::signed(100), h.into())); + assert_eq!(Balances::reserved_balance(&0), 0); + assert_eq!(Balances::free_balance(&0), 110); + }); + } + + #[test] + fn close_tip_works() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&Treasury::account_id(), 101); + assert_eq!(Treasury::pot(), 100); + + assert_ok!(Treasury::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10)); + let h = tip_hash(); + assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 10)); + assert_noop!(Treasury::close_tip(Origin::signed(0), h.into()), Error::::StillOpen); + + assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 10)); + assert_noop!(Treasury::close_tip(Origin::signed(0), h.into()), Error::::Premature); + + System::set_block_number(2); + assert_noop!(Treasury::close_tip(Origin::NONE, h.into()), BadOrigin); + assert_ok!(Treasury::close_tip(Origin::signed(0), h.into())); + assert_eq!(Balances::free_balance(&3), 10); + + assert_noop!(Treasury::close_tip(Origin::signed(100), h.into()), Error::::UnknownTip); + }); + } + + #[test] + fn retract_tip_works() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&Treasury::account_id(), 101); + assert_ok!(Treasury::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3)); + let h = tip_hash(); + assert_ok!(Treasury::tip(Origin::signed(10), h.clone(), 10)); + assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 10)); + assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 10)); + assert_noop!(Treasury::retract_tip(Origin::signed(10), h.clone()), Error::::NotFinder); + assert_ok!(Treasury::retract_tip(Origin::signed(0), h.clone())); + System::set_block_number(2); + assert_noop!(Treasury::close_tip(Origin::signed(0), h.into()), Error::::UnknownTip); + }); + } + + #[test] + fn tip_median_calculation_works() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&Treasury::account_id(), 101); + assert_ok!(Treasury::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 0)); + let h = tip_hash(); + assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 10)); + assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 1000000)); + System::set_block_number(2); + assert_ok!(Treasury::close_tip(Origin::signed(0), h.into())); + assert_eq!(Balances::free_balance(&3), 10); + }); + } + + #[test] + fn tip_changing_works() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&Treasury::account_id(), 101); + assert_ok!(Treasury::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10000)); + let h = tip_hash(); + assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 10000)); + assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 10000)); + assert_ok!(Treasury::tip(Origin::signed(13), h.clone(), 0)); + assert_ok!(Treasury::tip(Origin::signed(14), h.clone(), 0)); + assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 1000)); + assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 100)); + assert_ok!(Treasury::tip(Origin::signed(10), h.clone(), 10)); + System::set_block_number(2); + assert_ok!(Treasury::close_tip(Origin::signed(0), h.into())); + assert_eq!(Balances::free_balance(&3), 10); + }); + } + #[test] fn minting_works() { new_test_ext().execute_with(|| { -- GitLab From f5cdc2fcfd1077c507bb3f0beee0a38b45ade733 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Thu, 9 Jan 2020 15:27:24 +0100 Subject: [PATCH 077/296] Update getting started link (#4581) * Update getting started link * Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 319e7a5dc7..cd00013d1a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Substrate is a next-generation framework for blockchain innovation. ## Trying it out -Simply go to [substrate.dev](https://substrate.dev) and follow the [getting started](https://substrate.dev/docs/en/getting-started/) instructions. +Simply go to [substrate.dev](https://substrate.dev) and follow the [getting started](https://substrate.dev/docs/en/overview/getting-started/) instructions. ## Contributions & Code of Conduct @@ -16,4 +16,4 @@ The security policy and procedures can be found in [`docs/SECURITY.md`](docs/SEC ## License -Substrate is [GPL 3.0 licensed](LICENSE). \ No newline at end of file +Substrate is [GPL 3.0 licensed](LICENSE). -- GitLab From bf3cdc2389d5cb5b9c258ac7bcaa327947a5bb39 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 9 Jan 2020 18:19:11 +0100 Subject: [PATCH 078/296] Add an extra test to check rebond is a LIFO (#4578) --- frame/staking/src/tests.rs | 98 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 572a6667ef..555edac979 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -1336,6 +1336,104 @@ fn rebond_works() { }) } +#[test] +fn rebond_is_fifo() { + // Rebond should proceed by reversing the most recent bond operations. + ExtBuilder::default() + .nominate(false) + .build() + .execute_with(|| { + // Set payee to controller. avoids confusion + assert_ok!(Staking::set_payee( + Origin::signed(10), + RewardDestination::Controller + )); + + // Give account 11 some large free balance greater than total + let _ = Balances::make_free_balance_be(&11, 1000000); + + // confirm that 10 is a normal validator and gets paid at the end of the era. + start_era(1); + + // Initial state of 10 + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 1000, + unlocking: vec![], + }) + ); + + start_era(2); + + // Unbond some of the funds in stash. + Staking::unbond(Origin::signed(10), 400).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 600, + unlocking: vec![ + UnlockChunk { value: 400, era: 2 + 3 }, + ] + }) + ); + + start_era(3); + + // Unbond more of the funds in stash. + Staking::unbond(Origin::signed(10), 300).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 300, + unlocking: vec![ + UnlockChunk { value: 400, era: 2 + 3 }, + UnlockChunk { value: 300, era: 3 + 3 }, + ] + }) + ); + + start_era(4); + + // Unbond yet more of the funds in stash. + Staking::unbond(Origin::signed(10), 200).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 100, + unlocking: vec![ + UnlockChunk { value: 400, era: 2 + 3 }, + UnlockChunk { value: 300, era: 3 + 3 }, + UnlockChunk { value: 200, era: 4 + 3 }, + ] + }) + ); + + // Re-bond half of the unbonding funds. + Staking::rebond(Origin::signed(10), 400).unwrap(); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000, + active: 500, + unlocking: vec![ + UnlockChunk { value: 400, era: 2 + 3 }, + UnlockChunk { value: 100, era: 3 + 3 }, + ] + }) + ); + }) +} + #[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 6da8089fe93332ffec0522bf5365b237183dadd1 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 9 Jan 2020 19:00:57 +0100 Subject: [PATCH 079/296] Prioritize new blocks over old forks when syncing (#4414) * Prioritize new blocks over old forks when syncing * Fixed some test cases --- client/network/src/protocol.rs | 16 +- client/network/src/protocol/sync.rs | 246 ++++++++++++++++------------ client/network/src/service.rs | 5 + client/network/test/src/lib.rs | 3 + 4 files changed, 154 insertions(+), 116 deletions(-) diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 1b30da59de..9287312f09 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -547,6 +547,11 @@ impl, H: ExHashT> Protocol { self.sync.status().queued_blocks } + /// Number of active sync requests. + pub fn num_sync_requests(&self) -> usize { + self.sync.num_sync_requests() + } + /// Starts a new data demand request. /// /// The parameter contains a `Sender` where the result, once received, must be sent. @@ -892,7 +897,7 @@ impl, H: ExHashT> Protocol { } } } else { - match self.sync.on_block_data(peer, request, response) { + match self.sync.on_block_data(peer, Some(request), response) { Ok(sync::OnBlockData::Import(origin, blocks)) => CustomMessageOutcome::BlockImport(origin, blocks), Ok(sync::OnBlockData::Request(peer, req)) => { @@ -1320,14 +1325,7 @@ impl, H: ExHashT> Protocol { // been sent over network (but it is not in our case) let blocks_to_import = self.sync.on_block_data( who.clone(), - message::generic::BlockRequest { - id: 0, - fields: BlockAttributes::HEADER, - from: message::FromBlock::Hash(hash), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }, + None, message::generic::BlockResponse { id: 0, blocks: vec![ diff --git a/client/network/src/protocol/sync.rs b/client/network/src/protocol/sync.rs index 5ae641b475..8929fc75f8 100644 --- a/client/network/src/protocol/sync.rs +++ b/client/network/src/protocol/sync.rs @@ -352,6 +352,11 @@ impl ChainSync { } } + /// Number of active sync requests. + pub fn num_sync_requests(&self) -> usize { + self.fork_targets.len() + } + /// Handle a new connected peer. /// /// Call this method whenever we connect to a new peer. @@ -473,7 +478,7 @@ impl ChainSync { debug!( target: "sync", "Explicit sync request for block {:?} with no peers specified. \ - Syncing from all connected peers {:?} instead.", + Syncing from all connected peers {:?} instead.", hash, peers, ); @@ -588,29 +593,14 @@ impl ChainSync { trace!(target: "sync", "Peer {} is busy", id); return None } - if let Some((hash, req)) = fork_sync_request( - id, - fork_targets, - best_queued, - last_finalized, - attrs, - |hash| if queue.contains(hash) { - BlockStatus::Queued - } else { - client.block_status(&BlockId::Hash(*hash)).unwrap_or(BlockStatus::Unknown) - }, - ) { - trace!(target: "sync", "Downloading fork {:?} from {}", hash, id); - peer.state = PeerSyncState::DownloadingStale(hash); - have_requests = true; - Some((id.clone(), req)) - } else if let Some((range, req)) = peer_block_request( + if let Some((range, req)) = peer_block_request( id, peer, blocks, attrs, max_parallel, - last_finalized + last_finalized, + best_queued, ) { peer.state = PeerSyncState::DownloadingNew(range.start); trace!( @@ -623,6 +613,22 @@ impl ChainSync { ); have_requests = true; Some((id.clone(), req)) + } else if let Some((hash, req)) = fork_sync_request( + id, + fork_targets, + best_queued, + last_finalized, + attrs, + |hash| if queue.contains(hash) { + BlockStatus::Queued + } else { + client.block_status(&BlockId::Hash(*hash)).unwrap_or(BlockStatus::Unknown) + }, + ) { + trace!(target: "sync", "Downloading fork {:?} from {}", hash, id); + peer.state = PeerSyncState::DownloadingStale(hash); + have_requests = true; + Some((id.clone(), req)) } else { None } @@ -636,111 +642,127 @@ impl ChainSync { /// Handle a response from the remote to a block request that we made. /// /// `request` must be the original request that triggered `response`. + /// or `None` if data comes from the block announcement. /// /// If this corresponds to a valid block, this outputs the block that /// must be imported in the import queue. pub fn on_block_data - (&mut self, who: PeerId, request: BlockRequest, response: BlockResponse) -> Result, BadPeer> + (&mut self, who: PeerId, request: Option>, response: BlockResponse) -> Result, BadPeer> { let new_blocks: Vec> = if let Some(peer) = self.peers.get_mut(&who) { let mut blocks = response.blocks; - if request.direction == message::Direction::Descending { + if request.as_ref().map_or(false, |r| r.direction == message::Direction::Descending) { trace!(target: "sync", "Reversing incoming block list"); blocks.reverse() } self.is_idle = false; - match &mut peer.state { - PeerSyncState::DownloadingNew(start_block) => { - self.blocks.clear_peer_download(&who); - self.blocks.insert(*start_block, blocks, who); - peer.state = PeerSyncState::Available; - self.blocks - .drain(self.best_queued_number + One::one()) - .into_iter() - .map(|block_data| { + if request.is_some() { + match &mut peer.state { + PeerSyncState::DownloadingNew(start_block) => { + self.blocks.clear_peer_download(&who); + self.blocks.insert(*start_block, blocks, who); + peer.state = PeerSyncState::Available; + self.blocks + .drain(self.best_queued_number + One::one()) + .into_iter() + .map(|block_data| { + IncomingBlock { + hash: block_data.block.hash, + header: block_data.block.header, + body: block_data.block.body, + justification: block_data.block.justification, + origin: block_data.origin, + allow_missing_state: true, + import_existing: false, + } + }).collect() + } + PeerSyncState::DownloadingStale(_) => { + peer.state = PeerSyncState::Available; + blocks.into_iter().map(|b| { IncomingBlock { - hash: block_data.block.hash, - header: block_data.block.header, - body: block_data.block.body, - justification: block_data.block.justification, - origin: block_data.origin, - allow_missing_state: false, + hash: b.hash, + header: b.header, + body: b.body, + justification: b.justification, + origin: Some(who.clone()), + allow_missing_state: true, import_existing: false, } }).collect() - } - PeerSyncState::DownloadingStale(_) => { - peer.state = PeerSyncState::Available; - blocks.into_iter().map(|b| { - IncomingBlock { - hash: b.hash, - header: b.header, - body: b.body, - justification: b.justification, - origin: Some(who.clone()), - allow_missing_state: true, - import_existing: false, + } + PeerSyncState::AncestorSearch(num, state) => { + let matching_hash = match (blocks.get(0), self.client.block_hash(*num)) { + (Some(block), Ok(maybe_our_block_hash)) => { + trace!(target: "sync", "Got ancestry block #{} ({}) from peer {}", num, block.hash, who); + maybe_our_block_hash.filter(|x| x == &block.hash) + }, + (None, _) => { + debug!(target: "sync", "Invalid response when searching for ancestor from {}", who); + return Err(BadPeer(who, rep::UNKNOWN_ANCESTOR)) + }, + (_, Err(e)) => { + info!("Error answering legitimate blockchain query: {:?}", e); + return Err(BadPeer(who, rep::BLOCKCHAIN_READ_ERROR)) + } + }; + if matching_hash.is_some() && peer.common_number < *num { + peer.common_number = *num; } - }).collect() - } - PeerSyncState::AncestorSearch(num, state) => { - let matching_hash = match (blocks.get(0), self.client.block_hash(*num)) { - (Some(block), Ok(maybe_our_block_hash)) => { - trace!(target: "sync", "Got ancestry block #{} ({}) from peer {}", num, block.hash, who); - maybe_our_block_hash.filter(|x| x == &block.hash) - }, - (None, _) => { - debug!(target: "sync", "Invalid response when searching for ancestor from {}", who); - return Err(BadPeer(who, rep::UNKNOWN_ANCESTOR)) - }, - (_, Err(e)) => { - info!("Error answering legitimate blockchain query: {:?}", e); - return Err(BadPeer(who, rep::BLOCKCHAIN_READ_ERROR)) + if matching_hash.is_none() && num.is_zero() { + trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); + return Err(BadPeer(who, rep::GENESIS_MISMATCH)) } - }; - if matching_hash.is_some() && peer.common_number < *num { - peer.common_number = *num; - } - if matching_hash.is_none() && num.is_zero() { - trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); - return Err(BadPeer(who, rep::GENESIS_MISMATCH)) - } - if let Some((next_state, next_num)) = handle_ancestor_search_state(state, *num, matching_hash.is_some()) { - peer.state = PeerSyncState::AncestorSearch(next_num, next_state); - return Ok(OnBlockData::Request(who, ancestry_request::(next_num))) - } else { - // Ancestry search is complete. Check if peer is on a stale fork unknown to us and - // add it to sync targets if necessary. - trace!(target: "sync", "Ancestry search complete. Ours={} ({}), Theirs={} ({}), Common={:?} ({})", - self.best_queued_hash, - self.best_queued_number, - peer.best_hash, - peer.best_number, - matching_hash, - peer.common_number, - ); - if peer.common_number < peer.best_number - && peer.best_number < self.best_queued_number - { - trace!(target: "sync", "Added fork target {} for {}" , peer.best_hash, who); - self.fork_targets - .entry(peer.best_hash.clone()) - .or_insert_with(|| ForkTarget { - number: peer.best_number, - parent_hash: None, - peers: Default::default(), - }) - .peers.insert(who); + if let Some((next_state, next_num)) = handle_ancestor_search_state(state, *num, matching_hash.is_some()) { + peer.state = PeerSyncState::AncestorSearch(next_num, next_state); + return Ok(OnBlockData::Request(who, ancestry_request::(next_num))) + } else { + // Ancestry search is complete. Check if peer is on a stale fork unknown to us and + // add it to sync targets if necessary. + trace!(target: "sync", "Ancestry search complete. Ours={} ({}), Theirs={} ({}), Common={:?} ({})", + self.best_queued_hash, + self.best_queued_number, + peer.best_hash, + peer.best_number, + matching_hash, + peer.common_number, + ); + if peer.common_number < peer.best_number + && peer.best_number < self.best_queued_number + { + trace!(target: "sync", "Added fork target {} for {}" , peer.best_hash, who); + self.fork_targets + .entry(peer.best_hash.clone()) + .or_insert_with(|| ForkTarget { + number: peer.best_number, + parent_hash: None, + peers: Default::default(), + }) + .peers.insert(who); + } + peer.state = PeerSyncState::Available; + Vec::new() } - peer.state = PeerSyncState::Available; - Vec::new() } - } - | PeerSyncState::Available - | PeerSyncState::DownloadingJustification(..) - | PeerSyncState::DownloadingFinalityProof(..) => Vec::new() + | PeerSyncState::Available + | PeerSyncState::DownloadingJustification(..) + | PeerSyncState::DownloadingFinalityProof(..) => Vec::new() + } + } else { + // When request.is_none() just acccept blocks + blocks.into_iter().map(|b| { + IncomingBlock { + hash: b.hash, + header: b.header, + body: b.body, + justification: b.justification, + origin: Some(who.clone()), + allow_missing_state: true, + import_existing: false, + } + }).collect() } } else { Vec::new() @@ -1255,10 +1277,15 @@ fn peer_block_request( attrs: &message::BlockAttributes, max_parallel_downloads: u32, finalized: NumberFor, + best_num: NumberFor, ) -> Option<(Range>, BlockRequest)> { if peer.common_number < finalized { return None; } + if best_num >= peer.best_number { + // Will be downloaded as alternative fork instead. + return None; + } if let Some(range) = blocks.needed_blocks( id.clone(), MAX_BLOCKS_TO_REQUEST, @@ -1291,11 +1318,16 @@ fn fork_sync_request( check_block: impl Fn(&B::Hash) -> BlockStatus, ) -> Option<(B::Hash, BlockRequest)> { - targets.retain(|hash, r| if r.number > finalized { + targets.retain(|hash, r| { + if r.number <= finalized { + trace!(target: "sync", "Removed expired fork sync request {:?} (#{})", hash, r.number); + return false; + } + if check_block(hash) != BlockStatus::Unknown { + trace!(target: "sync", "Removed obsolete fork sync request {:?} (#{})", hash, r.number); + return false; + } true - } else { - trace!(target: "sync", "Removed expired fork sync request {:?} (#{})", hash, r.number); - false }); for (hash, r) in targets { if !r.peers.contains(id) { diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 3785335925..5f18a5c10c 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -319,6 +319,11 @@ impl, H: ExHashT> NetworkWorker self.network_service.user_protocol().num_queued_blocks() } + /// Number of active sync requests. + pub fn num_sync_requests(&self) -> usize { + self.network_service.user_protocol().num_sync_requests() + } + /// Adds an address for a node. pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { self.network_service.add_known_address(peer_id, addr); diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 5912933294..e76e58d4af 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -689,6 +689,9 @@ pub trait TestNetFactory: Sized { if peer.is_major_syncing() || peer.network.num_queued_blocks() != 0 { return Async::NotReady } + if peer.network.num_sync_requests() != 0 { + return Async::NotReady + } match (highest, peer.client.info().best_hash) { (None, b) => highest = Some(b), (Some(ref a), ref b) if a == b => {}, -- GitLab From 1ec08e88ccfb436da613473c96d01ca6679d5ff8 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 9 Jan 2020 19:01:23 +0100 Subject: [PATCH 080/296] Update networking code to libp2p 0.14 (#4383) * Entirely update substrate-telemetry to futures 0.3 * Add a Closed error * Update to libp2p 0.14 * More work * More work * More work * More work * Fix warnings * Remove unwrap() * Work on tests fixing * Fix network tests * Fix external network tests * Update libp2p and restore Yamux in discovery test * Ignore DNS if initializatio nfails * Restore variables ordering * Forgot browser-utils * Fix downfall after merge * Fix tests --- Cargo.lock | 592 +++++++++--------- bin/node/cli/src/service.rs | 9 +- client/authority-discovery/Cargo.toml | 2 +- client/network-gossip/Cargo.toml | 2 +- client/network-gossip/src/lib.rs | 3 +- client/network/Cargo.toml | 15 +- client/network/src/behaviour.rs | 13 +- client/network/src/debug_info.rs | 63 +- client/network/src/discovery.rs | 133 ++-- client/network/src/on_demand_layer.rs | 47 +- client/network/src/protocol.rs | 44 +- .../src/protocol/legacy_proto/behaviour.rs | 45 +- .../src/protocol/legacy_proto/handler.rs | 92 +-- .../src/protocol/legacy_proto/tests.rs | 86 +-- .../src/protocol/legacy_proto/upgrade.rs | 90 +-- client/network/src/protocol/light_dispatch.rs | 17 +- client/network/src/service.rs | 109 ++-- client/network/src/transport.rs | 12 +- client/network/src/utils.rs | 2 +- client/network/test/Cargo.toml | 2 +- client/network/test/src/lib.rs | 7 +- client/peerset/Cargo.toml | 2 +- client/service/src/lib.rs | 6 +- client/telemetry/Cargo.toml | 9 +- client/telemetry/src/lib.rs | 33 +- client/telemetry/src/worker.rs | 164 ++--- client/telemetry/src/worker/node.rs | 23 +- primitives/consensus/common/Cargo.toml | 2 +- utils/browser/Cargo.toml | 2 +- 29 files changed, 828 insertions(+), 798 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f0f096a659..6cda03cd99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -181,6 +181,17 @@ dependencies = [ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "async-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "atty" version = "0.2.13" @@ -369,7 +380,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -446,7 +457,7 @@ dependencies = [ [[package]] name = "bytes" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1255,11 +1266,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1580,6 +1589,7 @@ dependencies = [ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1594,6 +1604,17 @@ dependencies = [ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "futures_codec" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fxhash" version = "0.2.1" @@ -1740,7 +1761,7 @@ name = "h2" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1861,7 +1882,7 @@ name = "http" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (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)", ] @@ -1882,7 +1903,7 @@ name = "http-body" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1951,7 +1972,7 @@ name = "hyper" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2335,372 +2356,360 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.13.2" +version = "0.14.0-alpha.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.29 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-deflate 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-wasm-ext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.6.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.12.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.7.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (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.9 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.13.2" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.3 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.6 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "multistream-select 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.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.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 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)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.13.0" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-deflate" -version = "0.5.0" +version = "0.6.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.13.0" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.13.1" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-identify" -version = "0.13.2" +version = "0.14.0-alpha.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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-timer 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.13.2" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.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.13 (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)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.13.1" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.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.13 (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.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.13.0" +version = "0.14.0-alpha.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)", + "bytes 0.5.3 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-noise" -version = "0.11.1" +version = "0.12.0-alpha.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)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.6.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 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.13.1" +version = "0.14.0-alpha.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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-timer 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.13.1" +version = "0.14.0-alpha.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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.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)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.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-secio" -version = "0.13.1" +version = "0.14.0-alpha.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)", - "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.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 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-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)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-swarm" -version = "0.3.0" +version = "0.4.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.13.0" +version = "0.14.0-alpha.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.29 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 2.0.2 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-uds" -version = "0.13.0" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.6.0" +version = "0.7.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.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.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-websocket" -version = "0.13.0" +version = "0.14.0-alpha.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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "async-tls 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.2.3 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-yamux" -version = "0.13.0" +version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2761,14 +2770,6 @@ 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 = "lock_api" version = "0.3.2" @@ -2958,15 +2959,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "multistream-select" -version = "0.6.1" +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)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4089,18 +4090,18 @@ dependencies = [ [[package]] name = "parity-multiaddr" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.3.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)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4120,16 +4121,16 @@ dependencies = [ [[package]] name = "parity-multihash" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4217,22 +4218,21 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.8.0" +version = "0.9.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)", + "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.6.2 (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" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4249,13 +4249,12 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (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.66 (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.56 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4264,15 +4263,14 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4541,6 +4539,16 @@ dependencies = [ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "quicksink" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "quote" version = "0.6.13" @@ -4929,12 +4937,11 @@ dependencies = [ [[package]] name = "rw-stream-sink" -version = "0.1.2" +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)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4972,7 +4979,7 @@ dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5467,17 +5474,17 @@ name = "sc-network" version = "0.8.0" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.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.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.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.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5507,9 +5514,7 @@ dependencies = [ "substrate-test-client 2.0.0", "substrate-test-runtime-client 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5521,7 +5526,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5537,7 +5542,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5593,7 +5598,7 @@ name = "sc-peerset" version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5768,20 +5773,19 @@ dependencies = [ name = "sc-telemetry" version = "2.0.0" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6105,21 +6109,21 @@ dependencies = [ [[package]] name = "soketto" -version = "0.2.3" +version = "0.3.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)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (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.13 (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)", + "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6259,7 +6263,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7175,7 +7179,7 @@ name = "tokio" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7210,17 +7214,6 @@ dependencies = [ "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-dns-unofficial" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-executor" version = "0.1.9" @@ -7396,7 +7389,7 @@ name = "tokio-util" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7608,9 +7601,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "unsigned-varint" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unsigned-varint" +version = "0.3.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)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7751,18 +7750,6 @@ dependencies = [ "wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "wasm-bindgen-futures" version = "0.4.7" @@ -7827,14 +7814,16 @@ dependencies = [ [[package]] name = "wasm-timer" -version = "0.1.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-utils 0.1.0-alpha.4 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8135,18 +8124,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.2.2" +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.29 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (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)", + "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8222,6 +8209,7 @@ dependencies = [ "checksum async-macros 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "644a5a8de80f2085a1e7e57cd1544a2a7438f6e003c0790999bd43b92a77cdb2" "checksum async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "513ee3c49800679a319912340f5601afda9e72848d7dea3a48bab489e8c1a46f" "checksum async-task 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de6bd58f7b9cc49032559422595c81cbfcf04db2f2133592f70af19e258a1ced" +"checksum async-tls 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce6977f57fa68da77ffe5542950d47e9c23d65f5bc7cb0a9f8700996913eec7" "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" "checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" @@ -8252,7 +8240,7 @@ dependencies = [ "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "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 bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c85319f157e4e26c703678e68e26ab71a46c0199286fa670b21cc9fec13d895" +"checksum bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10004c15deb332055f7a4a208190aed362cf9a7c2f6ab70a305fba50e1105f38" "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cargo_metadata 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "46e3374c604fb39d1a2f35ed5e4a4e30e60d01fab49446e08f1b3e9a90aef202" @@ -8363,6 +8351,7 @@ dependencies = [ "checksum futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" "checksum futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76" "checksum futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "5ce968633c17e5f97936bd2797b6e38fb56cf16a7422319f7ec2e30d3c470e8d" +"checksum futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" "checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" @@ -8435,33 +8424,32 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" "checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -"checksum libp2p 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4674c6738fdd8b1cf7104dd046abcef78dc932fe25f8eb40f3a8e71341717d" -"checksum libp2p-core 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "01efc769c392d0d8863a7160d266f9b9f794968554f87490c8af4aa34ccaa94f" -"checksum libp2p-core-derive 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eeb2704ac14c60f31967e351ed928b848526a5fc6db4104520020665012826f" -"checksum libp2p-deflate 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef2b0bf5d37692ac90e2bffa436bec26c0b0def6c0cab7ea85ff67a353d58aaa" -"checksum libp2p-dns 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3175fb0fc9016c95c8517a297bbdb5fb6bfbd5665bacd2eb23495d1cbdeb033" -"checksum libp2p-floodsub 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b360bbaad2560d6b8a905bd63528273d933fe54475a44def47f31e23108b3683" -"checksum libp2p-identify 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c087bcd044a6f67a994573a92a109487a902a31555e4e63bcc4ae144c45594fe" -"checksum libp2p-kad 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dcaf76a5b33b6c0203e85d450ae1855cae6860dc82eb0174ac1fee8bf68f7af5" -"checksum libp2p-mdns 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c4c2e225a7dfc571c3ad77a0a5ecccc9537afe42d72289ac9f19768567cd677d" -"checksum libp2p-mplex 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2fe584816d993dc0f893396521a3c93191d78a6f28a892b150baa714a12c3e5" -"checksum libp2p-noise 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d50494fcba7cdab08390d72b3cb9d2c72fcf178e6a0c1043855ab259d818b972" -"checksum libp2p-ping 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5b975ad345eb9bb29ddc64670664a50a8ab3e66e28357abb0f83cfc0a9ca2d78" -"checksum libp2p-plaintext 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f07be6983e1c00e8f6a5676da54ed3a8cae7fb50f1fb6ea163414613ca656cc" -"checksum libp2p-secio 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04aa6d67a5fb2b36241a1ba54037a13deb2594cf141e43b597ce379521d530a8" -"checksum libp2p-swarm 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd55bc9f5f9eac2bb1ff24ca3c8a655810a566ac38c7a6ee1f30aced5a62905b" -"checksum libp2p-tcp 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "234a7093d05651ab5630db926a4a42ca8978a65bab8c27c2ce2b66b200c76989" -"checksum libp2p-uds 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e2fe0648967da3e56e4a55055c857c8c48326b66be0047d0e04c8ca60d34630" -"checksum libp2p-wasm-ext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f7b8f2bd81fb356e81352d4513856bc21215ecf91502aa1f55b6449642a9acf" -"checksum libp2p-websocket 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d74d4fc229ad7e8d1a973178786bdcd5dadbdd7b9822c4477c8687df6f82f66" -"checksum libp2p-yamux 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1913eb7dd6eb5515957b6f1770296f6921968db87bc9b985f0e974b6657e1003" +"checksum libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c85f850649e7533db125207d86bc2180faf7a962ea07686011031b71cbb3540" +"checksum libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "187ac3f588a74d48f163a8899fddafef4dc9796cad7b73ae754d9e928cebbbe7" +"checksum libp2p-core-derive 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b674da01855701636371b3d5f0e6b38bf5a74d283de705c1f66fab9980da8943" +"checksum libp2p-deflate 0.6.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f83cefe9f01a4a7012c1285e20fca4f193c46526a350679465150035afc5a97" +"checksum libp2p-dns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67d5a6d0905479ee4c6bcfaeab597d506f3447e5eb09b84aff1ed5e6d834b221" +"checksum libp2p-floodsub 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "462f310a152433a94d4e9766aa8366e4770084f67b9a17289a9667a7b0780714" +"checksum libp2p-identify 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8269e7b673cf0fbce1cbfedf61708e860aeb4b2ad3ca2df54586f1e810b9fbc9" +"checksum libp2p-kad 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90fdc0027f76b50b0822f489f5b8a83664b71c6087e67e8e9e53e6c255b069b3" +"checksum libp2p-mdns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be0b7cdeb0ad2c009099eaed258ef18b308c1e3f56d8f57668a868305f1c4caa" +"checksum libp2p-mplex 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "54c2ca42c7511fddc566af2259b81749d36011fefab1e99d9bf77bdc6210a5bd" +"checksum libp2p-noise 0.12.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8ff485bebd3181fc7f0c8ca7d11dde6231c132bbfb5d26c0e3a568e1a58b450" +"checksum libp2p-ping 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9061919a24a74760610c860e67cdb44ae4fd3cffe34c3b3a916f21ec68d9d50a" +"checksum libp2p-plaintext 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e9bf4b832590e0bf7efc09ff91c2d4cda0737f29b44356ef0cc3aecc08ed54a" +"checksum libp2p-secio 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2aa7599c5413cbc3de7138d64b932a26e86f8897ef3722f18840ed12ad54ea43" +"checksum libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea29f98b08c7a5113a787bce1a44d33fca6cf9f680f99812b50555e50baf408" +"checksum libp2p-tcp 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a4e0d1f322101d81c26782e76c523043f96fe53fa41962fd2c2193a709985186" +"checksum libp2p-uds 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d5620aca9d9f85158b934be33a25a6310f1ca6a038392498eb7f35d35063aee9" +"checksum libp2p-wasm-ext 0.7.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2dfe80dd0d2cb6412b57fffeb3db2dc36f7ea23566ed94011e0e07ff948f9624" +"checksum libp2p-websocket 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ac2a4974254a91f5291ef8493e6377380473334ba166ea0487e898364931dd61" +"checksum libp2p-yamux 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ef3277eaffc7c3a0ad0c115dcbe3cbeb0e3a953a18b959d05081835fc2cf2ff9" "checksum librocksdb-sys 6.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0785e816e1e11e7599388a492c61ef80ddc2afc91e313e61662cce537809be" "checksum libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "df6edf84fd62aad1c93932b39324eaeda3912c1d26bc18dfaee6293848e49a50" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" "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 lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e57b3997725d2b60dbec1297f6c2e2957cc383db1cebd6be812163f969c7d586" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" @@ -8484,7 +8472,7 @@ dependencies = [ "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" "checksum multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb04b9f127583ed176e163fb9ec6f3e793b87e21deedd5734a69386a18a0151" -"checksum multistream-select 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fc3ef54aab1b2e37e911bcb99e376dbe4c1e0710afcdb8428608e4f993b39c47" +"checksum multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f938ffe420493e77c8b6cbcc3f282283f68fc889c5dcbc8e51668d5f3a01ad94" "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" @@ -8509,9 +8497,9 @@ dependencies = [ "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c276d76c5333b8c2579e02d49a06733a55b8282d2d9b13e8d53b6406bd7e30a" "checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" -"checksum parity-multiaddr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82afcb7461eae5d122543d8be1c57d306ed89af2d6ff7f8b0f5a3cc8f7e511bc" +"checksum parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6de20a133b50f5120c6b8284ee88c5017fb167149208b3ee2e95f8719a434dc4" "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" -"checksum parity-multihash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c70cad855872dd51ce6679e823efb6434061a2c1782a1686438aabf506392cdd" +"checksum parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" "checksum parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f9f9d99dae413590a5f37e43cd99b94d4e62a244160562899126913ea7108673" "checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" @@ -8520,12 +8508,12 @@ dependencies = [ "checksum parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" "checksum parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" "checksum parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" +"checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" "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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" "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 parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" +"checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" "checksum paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "423a519e1c6e828f1e73b720f9d9ed2fa643dce8a7737fb43235ce0b41eeaa49" "checksum paste-impl 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4214c9e912ef61bf42b81ba9a47e8aad1b2ffaf739ab162bf96d1e011f54e6c5" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" @@ -8558,6 +8546,7 @@ dependencies = [ "checksum pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5ca504a2fdaa08d3517f442fbbba91ac24d1ec4c51ea68688a038765e3b2662" +"checksum quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8461ef7445f61fd72d8dcd0629ce724b9131b3c2eb36e83a5d3d4161c127530" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" @@ -8600,7 +8589,7 @@ dependencies = [ "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" "checksum rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c48f91977f4ef3be5358c15d131d3f663f6b4d7a112555bf3bf52ad23b6659e5" -"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "761d4727649dc004ee5555a0779afd53963efafd2218c969a2c5e323cdf73a09" "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" @@ -8636,7 +8625,7 @@ dependencies = [ "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" "checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86" "checksum snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" -"checksum soketto 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bceb1a3a15232d013d9a3b7cac9e5ce8e2313f348f01d4bc1097e5e53aa07095" +"checksum soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3caa0ad6b765419f21e4cfa490ec7514a9fae4af986adef168a69477ba528671" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" @@ -8678,7 +8667,6 @@ dependencies = [ "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" "checksum tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" "checksum tokio-executor 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" @@ -8720,6 +8708,7 @@ dependencies = [ "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" "checksum unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f0023a96687fe169081e8adce3f65e3874426b7886e9234d490af2dc077959" +"checksum unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c689459fbaeb50e56c6749275f084decfd02194ac5852e6617d95d0d3cf02eaf" "checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61" @@ -8737,14 +8726,13 @@ dependencies = [ "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" "checksum wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "701bc20794a7f9e8dcd85984a848f951ef6c5083322b6dd17fe880c99390f7cd" "checksum wasm-bindgen-backend 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "426315280d373e1a828e1c322507d51aa82e03c2fb1d654720b9e2f2368d291d" -"checksum wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)" = "83420b37346c311b9ed822af41ec2e82839bfe99867ec6c54e2da43b7538771c" "checksum wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1de54efe80cb87a8fa1f715d60ab47a5eac6b1447dd68665300773f498c229b1" "checksum wasm-bindgen-macro 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "d9a8a46373db32c892de910ccca302ecdaf8262abab746324a8a4dac352fc11f" "checksum wasm-bindgen-macro-support 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "45d1c6c2259c0f4ef3d61ea0976ea075b6f8185497c4a5457793740c2cda6430" "checksum wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "dd8e108ae395aae8017b091c4766101f08c635a5074e6631e0085e8a839e5810" "checksum wasm-bindgen-webidl 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "7a38859ace1c29c8ed75cd74940d4c96b980837179355de542a2eab3b435bb5c" "checksum wasm-gc-api 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" -"checksum wasm-timer 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "aa3e01d234bb71760e685cfafa5e2c96f8ad877c161a721646356651069e26ac" +"checksum wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" "checksum wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" "checksum wasmi-validation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" "checksum wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c702914acda5feeeffbc29e4d953e5b9ce79d8b98da4dbf18a77086e116c5470" @@ -8771,7 +8759,7 @@ dependencies = [ "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" -"checksum yamux 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2758f29014c1cb7a6e74c1b1160ac8c8203be342d35b73462fc6a13cc6385423" +"checksum yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "809f4388471d280173404e3d4f889e2d36004960a37d822ce5637fbef33a0ce4" "checksum zeroize 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "45af6a010d13e4cf5b54c94ba5a2b2eba5596b9e46bf5875612d332a1f2b3f86" "checksum zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" "checksum zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 69b05083e8..49ccd15644 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -183,19 +183,16 @@ macro_rules! new_full { service.spawn_essential_task(babe); let network = service.network(); - let dht_event_stream = network.event_stream().filter_map(|e| match e { + let dht_event_stream = network.event_stream().filter_map(|e| async move { match e { Event::Dht(e) => Some(e), _ => None, - }); - let future03_dht_event_stream = dht_event_stream.compat() - .map(|x| x.expect(" never returns an error; qed")) - .boxed(); + }}).boxed(); let authority_discovery = sc_authority_discovery::AuthorityDiscovery::new( service.client(), network, sentry_nodes, service.keystore(), - future03_dht_event_stream, + dht_event_stream, ); let future01_authority_discovery = authority_discovery.map(|x| Ok(x)).compat(); diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 6ad25299f0..854ebff87a 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -14,7 +14,7 @@ codec = { package = "parity-scale-codec", default-features = false, version = "1 derive_more = "0.99.2" futures = "0.3.1" futures-timer = "2.0" -libp2p = { version = "0.13.2", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" prost = "0.5.0" rand = "0.7.2" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index e5df654a03..cf8d31c6d3 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -12,7 +12,7 @@ futures01 = { package = "futures", version = "0.1.29" } futures = { version = "0.3.1", features = ["compat"] } futures-timer = "0.4.0" lru = "0.1.2" -libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } sc-network = { version = "0.8", path = "../network" } parking_lot = "0.9.0" sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/network-gossip/src/lib.rs b/client/network-gossip/src/lib.rs index bc28bbb809..f7b360f939 100644 --- a/client/network-gossip/src/lib.rs +++ b/client/network-gossip/src/lib.rs @@ -59,6 +59,7 @@ pub use self::state_machine::{TopicNotification, MessageIntent}; pub use self::state_machine::{Validator, ValidatorContext, ValidationResult}; pub use self::state_machine::DiscardAll; +use futures::prelude::*; use sc_network::{specialization::NetworkSpecialization, Event, ExHashT, NetworkService, PeerId, ReputationChange}; use sp_runtime::{traits::Block as BlockT, ConsensusEngineId}; use std::sync::Arc; @@ -97,7 +98,7 @@ pub trait Network { impl, H: ExHashT> Network for Arc> { fn event_stream(&self) -> Box + Send> { - Box::new(NetworkService::event_stream(self)) + Box::new(NetworkService::event_stream(self).map(|v| Ok::<_, ()>(v)).compat()) } fn report_peer(&self, peer_id: PeerId, reputation: ReputationChange) { diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index e143806414..d24f986f4c 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -7,22 +7,22 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -bytes = "0.4.12" +bytes = "0.5.0" derive_more = "0.99.2" either = "1.5.3" log = "0.4.8" parking_lot = "0.9.0" bitflags = "1.2.0" fnv = "1.0.6" -futures = "0.1.29" -futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } +futures = "0.3.1" +futures_codec = "0.3.3" futures-timer = "0.4.0" linked-hash-map = "0.5.2" linked_hash_set = "0.1.3" lru = "0.4.0" rustc-hex = "2.0.1" rand = "0.7.2" -libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } sc-client = { version = "2.0.0", path = "../" } @@ -39,9 +39,7 @@ serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } slog_derive = "0.2.0" smallvec = "0.6.10" -tokio-io = "0.1.12" -tokio = { version = "0.1.22", optional = true } -unsigned-varint = { version = "0.2.2", features = ["codec"] } +unsigned-varint = { version = "0.3.0", features = ["codec"] } sp-keyring = { version = "2.0.0", optional = true, path = "../../primitives/keyring" } substrate-test-client = { version = "2.0.0", optional = true, path = "../../test-utils/client" } substrate-test-runtime-client = { version = "2.0.0", optional = true, path = "../../test-utils/runtime/client" } @@ -57,8 +55,7 @@ sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } quickcheck = "0.9.0" rand = "0.7.2" tempfile = "3.1.0" -tokio = "0.1.22" [features] default = [] -test-helpers = ["sp-keyring", "substrate-test-runtime-client", "tokio"] +test-helpers = ["sp-keyring", "substrate-test-runtime-client"] diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 2efdbd98b3..7cc9eee74d 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -20,7 +20,6 @@ use crate::{ }; use crate::{ExHashT, specialization::NetworkSpecialization}; use crate::protocol::{CustomMessageOutcome, Protocol}; -use futures::prelude::*; use libp2p::NetworkBehaviour; use libp2p::core::{Multiaddr, PeerId, PublicKey}; use libp2p::kad::record; @@ -29,7 +28,7 @@ use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; use log::{debug, warn}; use sp_consensus::{BlockOrigin, import_queue::{IncomingBlock, Origin}}; use sp_runtime::{traits::{Block as BlockT, NumberFor}, Justification}; -use std::iter; +use std::{iter, task::Context, task::Poll}; use void; /// General behaviour of the network. Combines all protocols together. @@ -59,7 +58,7 @@ pub enum BehaviourOut { impl, H: ExHashT> Behaviour { /// Builds a new `Behaviour`. - pub fn new( + pub async fn new( substrate: Protocol, user_agent: String, local_public_key: PublicKey, @@ -75,7 +74,7 @@ impl, H: ExHashT> Behaviour { known_addresses, enable_mdns, allow_private_ipv4 - ), + ).await, events: Vec::new(), } } @@ -212,11 +211,11 @@ impl, H: ExHashT> NetworkBehaviourEventPr } impl, H: ExHashT> Behaviour { - fn poll(&mut self) -> Async>> { + fn poll(&mut self, _: &mut Context) -> Poll>> { if !self.events.is_empty() { - return Async::Ready(NetworkBehaviourAction::GenerateEvent(self.events.remove(0))) + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(self.events.remove(0))) } - Async::NotReady + Poll::Pending } } diff --git a/client/network/src/debug_info.rs b/client/network/src/debug_info.rs index 1eebf1ffed..9cc39baae6 100644 --- a/client/network/src/debug_info.rs +++ b/client/network/src/debug_info.rs @@ -16,7 +16,6 @@ use fnv::FnvHashMap; use futures::prelude::*; -use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::Multiaddr; use libp2p::core::{ConnectedPoint, either::EitherOutput, PeerId, PublicKey}; use libp2p::swarm::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; @@ -25,8 +24,9 @@ use libp2p::identify::{Identify, IdentifyEvent, IdentifyInfo}; use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; use log::{debug, trace, error}; use std::collections::hash_map::Entry; +use std::pin::Pin; +use std::task::{Context, Poll}; use std::time::{Duration, Instant}; -use tokio_io::{AsyncRead, AsyncWrite}; use crate::utils::interval; /// Time after we disconnect from a node before we purge its information from the cache. @@ -44,7 +44,7 @@ pub struct DebugInfoBehaviour { /// Information that we know about all nodes. nodes_info: FnvHashMap, /// Interval at which we perform garbage collection in `nodes_info`. - garbage_collect: Box + Send>, + garbage_collect: Pin + Send>>, } /// Information about a node we're connected to. @@ -76,7 +76,7 @@ impl DebugInfoBehaviour { ping: Ping::new(PingConfig::new()), identify, nodes_info: FnvHashMap::default(), - garbage_collect: Box::new(interval(GARBAGE_COLLECT_INTERVAL).map(|()| Ok(())).compat()), + garbage_collect: Box::pin(interval(GARBAGE_COLLECT_INTERVAL)), } } @@ -149,7 +149,7 @@ pub enum DebugInfoEvent { } impl NetworkBehaviour for DebugInfoBehaviour -where TSubstream: AsyncRead + AsyncWrite { +where TSubstream: AsyncRead + AsyncWrite + Unpin + Send + 'static { type ProtocolsHandler = IntoProtocolsHandlerSelect< as NetworkBehaviour>::ProtocolsHandler, as NetworkBehaviour>::ProtocolsHandler @@ -253,70 +253,71 @@ where TSubstream: AsyncRead + AsyncWrite { fn poll( &mut self, + cx: &mut Context, params: &mut impl PollParameters - ) -> Async< + ) -> Poll< NetworkBehaviourAction< <::Handler as ProtocolsHandler>::InEvent, Self::OutEvent > > { loop { - match self.ping.poll(params) { - Async::NotReady => break, - Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { + match self.ping.poll(cx, params) { + Poll::Pending => break, + Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { if let PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } = ev { self.handle_ping_report(&peer, rtt) } }, - Async::Ready(NetworkBehaviourAction::DialAddress { address }) => - return Async::Ready(NetworkBehaviourAction::DialAddress { address }), - Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => - return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), - Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => - return Async::Ready(NetworkBehaviourAction::SendEvent { + Poll::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Poll::Ready(NetworkBehaviourAction::DialAddress { address }), + Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Poll::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Poll::Ready(NetworkBehaviourAction::SendEvent { peer_id, event: EitherOutput::First(event) }), - Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => - return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), } } loop { - match self.identify.poll(params) { - Async::NotReady => break, - Async::Ready(NetworkBehaviourAction::GenerateEvent(event)) => { + match self.identify.poll(cx, params) { + Poll::Pending => break, + Poll::Ready(NetworkBehaviourAction::GenerateEvent(event)) => { match event { IdentifyEvent::Received { peer_id, info, .. } => { self.handle_identify_report(&peer_id, &info); let event = DebugInfoEvent::Identified { peer_id, info }; - return Async::Ready(NetworkBehaviourAction::GenerateEvent(event)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(event)); } IdentifyEvent::Error { peer_id, error } => debug!(target: "sub-libp2p", "Identification with peer {:?} failed => {}", peer_id, error), IdentifyEvent::Sent { .. } => {} } }, - 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 { + Poll::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Poll::Ready(NetworkBehaviourAction::DialAddress { address }), + Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Poll::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Poll::Ready(NetworkBehaviourAction::SendEvent { peer_id, event: EitherOutput::Second(event) }), - Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => - return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), } } - while let Ok(Async::Ready(Some(_))) = self.garbage_collect.poll() { + while let Poll::Ready(Some(())) = self.garbage_collect.poll_next_unpin(cx) { self.nodes_info.retain(|_, node| { node.info_expire.as_ref().map(|exp| *exp >= Instant::now()).unwrap_or(true) }); } - Async::NotReady + Poll::Pending } } diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 298d8e7036..11f687616e 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -47,7 +47,6 @@ use futures::prelude::*; use futures_timer::Delay; -use futures03::{compat::Compat, TryFutureExt as _}; use libp2p::core::{ConnectedPoint, Multiaddr, PeerId, PublicKey}; use libp2p::swarm::{ProtocolsHandler, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use libp2p::kad::{Kademlia, KademliaEvent, Quorum, Record}; @@ -62,7 +61,7 @@ use libp2p::mdns::{Mdns, MdnsEvent}; use libp2p::multiaddr::Protocol; use log::{debug, info, trace, warn}; use std::{cmp, collections::VecDeque, time::Duration}; -use tokio_io::{AsyncRead, AsyncWrite}; +use std::task::{Context, Poll}; use sp_core::hexdisplay::HexDisplay; /// Implementation of `NetworkBehaviour` that discovers the nodes on the network. @@ -76,7 +75,7 @@ pub struct DiscoveryBehaviour { #[cfg(not(target_os = "unknown"))] mdns: Toggle>>, /// Stream that fires when we need to perform the next random Kademlia query. - next_kad_random_query: Compat, + next_kad_random_query: Delay, /// After `next_kad_random_query` triggers, the next one triggers after this duration. duration_to_next_kad: Duration, /// Discovered nodes to return. @@ -94,7 +93,7 @@ impl DiscoveryBehaviour { /// Builds a new `DiscoveryBehaviour`. /// /// `user_defined` is a list of known address for nodes that never expire. - pub fn new( + pub async fn new( local_public_key: PublicKey, user_defined: Vec<(PeerId, Multiaddr)>, enable_mdns: bool, @@ -115,7 +114,7 @@ impl DiscoveryBehaviour { DiscoveryBehaviour { user_defined, kademlia, - next_kad_random_query: Delay::new(Duration::new(0, 0)).compat(), + next_kad_random_query: Delay::new(Duration::new(0, 0)), duration_to_next_kad: Duration::from_secs(1), discoveries: VecDeque::new(), local_peer_id: local_public_key.into_peer_id(), @@ -123,7 +122,7 @@ impl DiscoveryBehaviour { allow_private_ipv4, #[cfg(not(target_os = "unknown"))] mdns: if enable_mdns { - match Mdns::new() { + match Mdns::new().await { Ok(mdns) => Some(mdns).into(), Err(err) => { warn!(target: "sub-libp2p", "Failed to initialize mDNS: {:?}", err); @@ -206,7 +205,7 @@ pub enum DiscoveryOut { impl NetworkBehaviour for DiscoveryBehaviour where - TSubstream: AsyncRead + AsyncWrite, + TSubstream: AsyncRead + AsyncWrite + Unpin, { type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; type OutEvent = DiscoveryOut; @@ -287,8 +286,9 @@ where fn poll( &mut self, + cx: &mut Context, params: &mut impl PollParameters, - ) -> Async< + ) -> Poll< NetworkBehaviourAction< ::InEvent, Self::OutEvent, @@ -297,45 +297,35 @@ where // Immediately process the content of `discovered`. if let Some(peer_id) = self.discoveries.pop_front() { let ev = DiscoveryOut::Discovered(peer_id); - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } // 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.get_closest_peers(random_peer_id); - - // Schedule the next random query with exponentially increasing delay, - // capped at 60 seconds. - self.next_kad_random_query = Delay::new(self.duration_to_next_kad).compat(); - 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 - } - } + while let Poll::Ready(_) = self.next_kad_random_query.poll_unpin(cx) { + let random_peer_id = PeerId::random(); + debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ + {:?}", random_peer_id); + + self.kademlia.get_closest_peers(random_peer_id); + + // Schedule the next random query with exponentially increasing delay, + // capped at 60 seconds. + self.next_kad_random_query = Delay::new(self.duration_to_next_kad); + self.duration_to_next_kad = cmp::min(self.duration_to_next_kad * 2, + Duration::from_secs(60)); } // Poll Kademlia. - loop { - match self.kademlia.poll(params) { - Async::NotReady => break, - Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => match ev { + while let Poll::Ready(ev) = self.kademlia.poll(cx, params) { + match ev { + NetworkBehaviourAction::GenerateEvent(ev) => match ev { KademliaEvent::UnroutablePeer { peer, .. } => { let ev = DiscoveryOut::UnroutablePeer(peer); - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } KademliaEvent::RoutingUpdated { peer, .. } => { let ev = DiscoveryOut::Discovered(peer); - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } KademliaEvent::GetClosestPeersResult(res) => { match res { @@ -369,7 +359,7 @@ where DiscoveryOut::ValueNotFound(e.into_key()) } }; - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } KademliaEvent::PutRecordResult(res) => { let ev = match res { @@ -378,7 +368,7 @@ where DiscoveryOut::ValuePutFailed(e.into_key()) } }; - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } KademliaEvent::RepublishRecordResult(res) => { match res { @@ -398,46 +388,45 @@ where warn!(target: "sub-libp2p", "Libp2p => Unhandled Kademlia event: {:?}", e) } }, - 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 }), + NetworkBehaviourAction::DialAddress { address } => + return Poll::Ready(NetworkBehaviourAction::DialAddress { address }), + NetworkBehaviourAction::DialPeer { peer_id } => + return Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + NetworkBehaviourAction::SendEvent { peer_id, event } => + return Poll::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }), + NetworkBehaviourAction::ReportObservedAddr { address } => + return Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), } } // Poll mDNS. #[cfg(not(target_os = "unknown"))] - loop { - match self.mdns.poll(params) { - Async::NotReady => break, - Async::Ready(NetworkBehaviourAction::GenerateEvent(event)) => { + while let Poll::Ready(ev) = self.mdns.poll(cx, params) { + match ev { + NetworkBehaviourAction::GenerateEvent(event) => { match event { MdnsEvent::Discovered(list) => { self.discoveries.extend(list.into_iter().map(|(peer_id, _)| peer_id)); if let Some(peer_id) = self.discoveries.pop_front() { let ev = DiscoveryOut::Discovered(peer_id); - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } }, MdnsEvent::Expired(_) => {} } }, - 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 { event, .. }) => + NetworkBehaviourAction::DialAddress { address } => + return Poll::Ready(NetworkBehaviourAction::DialAddress { address }), + NetworkBehaviourAction::DialPeer { peer_id } => + return Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + NetworkBehaviourAction::SendEvent { event, .. } => match event {}, // `event` is an enum with no variant - Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => - return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + NetworkBehaviourAction::ReportObservedAddr { address } => + return Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), } } - Async::NotReady + Poll::Pending } } @@ -450,7 +439,7 @@ mod tests { use libp2p::core::transport::{Transport, MemoryTransport}; use libp2p::core::upgrade::{InboundUpgradeExt, OutboundUpgradeExt}; use libp2p::swarm::Swarm; - use std::collections::HashSet; + use std::{collections::HashSet, task::Poll}; use super::{DiscoveryBehaviour, DiscoveryOut}; #[test] @@ -469,7 +458,7 @@ mod tests { out, secio, endpoint, - libp2p::core::upgrade::Version::V1 + upgrade::Version::V1 ) }) .and_then(move |(peer_id, stream), endpoint| { @@ -477,10 +466,16 @@ mod tests { let upgrade = libp2p::yamux::Config::default() .map_inbound(move |muxer| (peer_id, muxer)) .map_outbound(move |muxer| (peer_id2, muxer)); - upgrade::apply(stream, upgrade, endpoint, libp2p::core::upgrade::Version::V1) + upgrade::apply(stream, upgrade, endpoint, upgrade::Version::V1) }); - let behaviour = DiscoveryBehaviour::new(keypair.public(), user_defined.clone(), false, true); + let behaviour = futures::executor::block_on({ + let user_defined = user_defined.clone(); + let keypair_public = keypair.public(); + async move { + DiscoveryBehaviour::new(keypair_public, user_defined, false, true).await + } + }); let mut swarm = Swarm::new(transport, behaviour, keypair.public().into_peer_id()); let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); @@ -499,11 +494,11 @@ mod tests { .collect::>() }).collect::>(); - let fut = futures::future::poll_fn::<_, (), _>(move || { + let fut = futures::future::poll_fn(move |cx| { 'polling: loop { for swarm_n in 0..swarms.len() { - match swarms[swarm_n].0.poll().unwrap() { - Async::Ready(Some(e)) => { + match swarms[swarm_n].0.poll_next_unpin(cx) { + Poll::Ready(Some(e)) => { match e { DiscoveryOut::UnroutablePeer(other) => { // Call `add_self_reported_address` to simulate identify happening. @@ -530,12 +525,12 @@ mod tests { } if to_discover.iter().all(|l| l.is_empty()) { - Ok(Async::Ready(())) + Poll::Ready(()) } else { - Ok(Async::NotReady) + Poll::Pending } }); - tokio::runtime::Runtime::new().unwrap().block_on(fut).unwrap(); + futures::executor::block_on(fut); } } diff --git a/client/network/src/on_demand_layer.rs b/client/network/src/on_demand_layer.rs index edda140727..87f48ded67 100644 --- a/client/network/src/on_demand_layer.rs +++ b/client/network/src/on_demand_layer.rs @@ -17,10 +17,8 @@ //! On-demand requests service. use crate::protocol::light_dispatch::RequestData; -use std::collections::HashMap; -use std::sync::Arc; -use futures::{prelude::*, sync::mpsc, sync::oneshot}; -use futures03::compat::{Compat01As03, Future01CompatExt as _}; +use std::{collections::HashMap, pin::Pin, sync::Arc, task::Context, task::Poll}; +use futures::{prelude::*, channel::mpsc, channel::oneshot}; use parking_lot::Mutex; use sp_blockchain::Error as ClientError; use sc_client_api::{Fetcher, FetchChecker, RemoteHeaderRequest, @@ -84,22 +82,22 @@ impl Fetcher for OnDemand where B: BlockT, B::Header: HeaderT, { - type RemoteHeaderResult = Compat01As03>; - type RemoteReadResult = Compat01As03, Option>>>>; - type RemoteCallResult = Compat01As03>>; - type RemoteChangesResult = Compat01As03, u32)>>>; - type RemoteBodyResult = Compat01As03>>; + type RemoteHeaderResult = RemoteResponse; + type RemoteReadResult = RemoteResponse, Option>>>; + 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 }.compat() + 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 }.compat() + RemoteResponse { receiver } } fn remote_read_child( @@ -108,25 +106,25 @@ impl Fetcher for OnDemand where ) -> Self::RemoteReadResult { let (sender, receiver) = oneshot::channel(); let _ = self.requests_send.unbounded_send(RequestData::RemoteReadChild(request, sender)); - RemoteResponse { receiver }.compat() + 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 }.compat() + 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 }.compat() + 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 }.compat() + RemoteResponse { receiver } } } @@ -136,16 +134,13 @@ pub struct RemoteResponse { } 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), - }) + type Output = Result; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll { + match self.receiver.poll_unpin(cx) { + Poll::Ready(Ok(res)) => Poll::Ready(res), + Poll::Ready(Err(_)) => Poll::Ready(Err(From::from(ClientError::RemoteFetchCancelled))), + Poll::Pending => Poll::Pending, + } } } diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 9287312f09..983cdd25a8 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -19,7 +19,6 @@ use legacy_proto::{LegacyProto, LegacyProtoOut}; use crate::utils::interval; use bytes::{Bytes, BytesMut}; use futures::prelude::*; -use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::{Multiaddr, PeerId}; use libp2p::core::{ConnectedPoint, nodes::Substream, muxing::StreamMuxerBox}; use libp2p::swarm::{ProtocolsHandler, IntoProtocolsHandler}; @@ -47,7 +46,7 @@ use rustc_hex::ToHex; use std::collections::{BTreeMap, HashMap, HashSet}; use std::sync::Arc; use std::fmt::Write; -use std::{cmp, num::NonZeroUsize, time}; +use std::{cmp, num::NonZeroUsize, pin::Pin, task::Poll, time}; use log::{log, Level, trace, debug, warn, error}; use crate::chain::{Client, FinalityProofProvider}; use sc_client_api::{FetchChecker, ChangesProof, StorageProof}; @@ -124,9 +123,9 @@ mod rep { // Lock must always be taken in order declared here. pub struct Protocol, H: ExHashT> { /// Interval at which we call `tick`. - tick_timeout: Box + Send>, + tick_timeout: Pin + Send>>, /// Interval at which we call `propagate_extrinsics`. - propagate_timeout: Box + Send>, + propagate_timeout: Pin + Send>>, config: ProtocolConfig, /// Handler for light client requests. light_dispatch: LightDispatch, @@ -464,8 +463,8 @@ impl, H: ExHashT> Protocol { let behaviour = LegacyProto::new(protocol_id, versions, peerset); let protocol = Protocol { - tick_timeout: Box::new(interval(TICK_TIMEOUT).map(|v| Ok::<_, ()>(v)).compat()), - propagate_timeout: Box::new(interval(PROPAGATE_TIMEOUT).map(|v| Ok::<_, ()>(v)).compat()), + tick_timeout: Box::pin(interval(TICK_TIMEOUT)), + propagate_timeout: Box::pin(interval(PROPAGATE_TIMEOUT)), config, context_data: ContextData { peers: HashMap::new(), @@ -1884,18 +1883,19 @@ Protocol { fn poll( &mut self, + cx: &mut std::task::Context, params: &mut impl PollParameters, - ) -> Async< + ) -> Poll< NetworkBehaviourAction< <::Handler as ProtocolsHandler>::InEvent, Self::OutEvent > > { - while let Ok(Async::Ready(_)) = self.tick_timeout.poll() { + while let Poll::Ready(Some(())) = self.tick_timeout.poll_next_unpin(cx) { self.tick(); } - while let Ok(Async::Ready(_)) = self.propagate_timeout.poll() { + while let Poll::Ready(Some(())) = self.propagate_timeout.poll_next_unpin(cx) { self.propagate_extrinsics(); } @@ -1926,17 +1926,17 @@ Protocol { GenericMessage::FinalityProofRequest(r)) } - let event = match self.behaviour.poll(params) { - Async::NotReady => return Async::NotReady, - Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => ev, - 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 }), + let event = match self.behaviour.poll(cx, params) { + Poll::Pending => return Poll::Pending, + Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => ev, + Poll::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Poll::Ready(NetworkBehaviourAction::DialAddress { address }), + Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Poll::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Poll::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Poll::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }), + Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Poll::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), }; let outcome = match event { @@ -1970,9 +1970,9 @@ Protocol { }; if let CustomMessageOutcome::None = outcome { - Async::NotReady + Poll::Pending } else { - Async::Ready(NetworkBehaviourAction::GenerateEvent(outcome)) + Poll::Ready(NetworkBehaviourAction::GenerateEvent(outcome)) } } diff --git a/client/network/src/protocol/legacy_proto/behaviour.rs b/client/network/src/protocol/legacy_proto/behaviour.rs index a69622a6b3..b4047f320a 100644 --- a/client/network/src/protocol/legacy_proto/behaviour.rs +++ b/client/network/src/protocol/legacy_proto/behaviour.rs @@ -20,7 +20,6 @@ use crate::protocol::legacy_proto::upgrade::RegisteredProtocol; use bytes::BytesMut; use fnv::FnvHashMap; use futures::prelude::*; -use futures03::{compat::Compat, TryFutureExt as _, StreamExt as _, TryStreamExt as _}; use libp2p::core::{ConnectedPoint, Multiaddr, PeerId}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use log::{debug, error, trace, warn}; @@ -28,7 +27,7 @@ use rand::distributions::{Distribution as _, Uniform}; use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; use std::time::{Duration, Instant}; -use tokio_io::{AsyncRead, AsyncWrite}; +use std::task::{Context, Poll}; /// Network behaviour that handles opening substreams for custom protocols with other nodes. /// @@ -103,7 +102,7 @@ enum PeerState { /// The peerset requested that we connect to this peer. We are not connected to this node. PendingRequest { /// When to actually start dialing. - timer: Compat, + timer: futures_timer::Delay, /// When the `timer` will trigger. timer_deadline: Instant, }, @@ -135,7 +134,7 @@ enum PeerState { /// state mismatch. open: bool, /// When to enable this remote. - timer: Compat, + timer: futures_timer::Delay, /// When the `timer` will trigger. timer_deadline: Instant, }, @@ -388,7 +387,7 @@ impl LegacyProto { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \ until {:?}", occ_entry.key(), until); *occ_entry.into_mut() = PeerState::PendingRequest { - timer: futures_timer::Delay::new_at(until.clone()).compat(), + timer: futures_timer::Delay::new_at(until.clone()), timer_deadline: until.clone(), }; }, @@ -407,7 +406,7 @@ impl LegacyProto { *occ_entry.into_mut() = PeerState::DisabledPendingEnable { connected_point: connected_point.clone(), open, - timer: futures_timer::Delay::new_at(banned.clone()).compat(), + timer: futures_timer::Delay::new_at(banned.clone()), timer_deadline: banned.clone(), }; }, @@ -616,7 +615,7 @@ impl DiscoveryNetBehaviour for LegacyProto { impl NetworkBehaviour for LegacyProto where - TSubstream: AsyncRead + AsyncWrite, + TSubstream: AsyncRead + AsyncWrite + Unpin, { type ProtocolsHandler = CustomProtoHandlerProto; type OutEvent = LegacyProtoOut; @@ -951,8 +950,9 @@ where fn poll( &mut self, + cx: &mut Context, _params: &mut impl PollParameters, - ) -> Async< + ) -> Poll< NetworkBehaviourAction< CustomProtoHandlerIn, Self::OutEvent, @@ -961,38 +961,31 @@ where // Poll for instructions from the peerset. // Note that the peerset is a *best effort* crate, and we have to use defensive programming. loop { - let mut peerset01 = futures03::stream::poll_fn(|cx| - futures03::Stream::poll_next(Pin::new(&mut self.peerset), cx) - ).map(|v| Ok::<_, ()>(v)).compat(); - match peerset01.poll() { - Ok(Async::Ready(Some(sc_peerset::Message::Accept(index)))) => { + match futures::Stream::poll_next(Pin::new(&mut self.peerset), cx) { + Poll::Ready(Some(sc_peerset::Message::Accept(index))) => { self.peerset_report_accept(index); } - Ok(Async::Ready(Some(sc_peerset::Message::Reject(index)))) => { + Poll::Ready(Some(sc_peerset::Message::Reject(index))) => { self.peerset_report_reject(index); } - Ok(Async::Ready(Some(sc_peerset::Message::Connect(id)))) => { + Poll::Ready(Some(sc_peerset::Message::Connect(id))) => { self.peerset_report_connect(id); } - Ok(Async::Ready(Some(sc_peerset::Message::Drop(id)))) => { + Poll::Ready(Some(sc_peerset::Message::Drop(id))) => { self.peerset_report_disconnect(id); } - Ok(Async::Ready(None)) => { + Poll::Ready(None) => { error!(target: "sub-libp2p", "Peerset receiver stream has returned None"); break; } - Ok(Async::NotReady) => break, - Err(err) => { - error!(target: "sub-libp2p", "Peerset receiver stream has errored: {:?}", err); - break - } + Poll::Pending => break, } } for (peer_id, peer_state) in self.peers.iter_mut() { match mem::replace(peer_state, PeerState::Poisoned) { PeerState::PendingRequest { mut timer, timer_deadline } => { - if let Ok(Async::NotReady) = timer.poll() { + if let Poll::Pending = Pin::new(&mut timer).poll(cx) { *peer_state = PeerState::PendingRequest { timer, timer_deadline }; continue; } @@ -1003,7 +996,7 @@ where } PeerState::DisabledPendingEnable { mut timer, connected_point, open, timer_deadline } => { - if let Ok(Async::NotReady) = timer.poll() { + if let Poll::Pending = Pin::new(&mut timer).poll(cx) { *peer_state = PeerState::DisabledPendingEnable { timer, connected_point, @@ -1026,9 +1019,9 @@ where } if !self.events.is_empty() { - return Async::Ready(self.events.remove(0)) + return Poll::Ready(self.events.remove(0)) } - Async::NotReady + Poll::Pending } } diff --git a/client/network/src/protocol/legacy_proto/handler.rs b/client/network/src/protocol/legacy_proto/handler.rs index 142f84d7f5..f042d1b889 100644 --- a/client/network/src/protocol/legacy_proto/handler.rs +++ b/client/network/src/protocol/legacy_proto/handler.rs @@ -17,7 +17,6 @@ use super::upgrade::{RegisteredProtocol, RegisteredProtocolEvent, RegisteredProtocolSubstream}; use bytes::BytesMut; use futures::prelude::*; -use futures03::{compat::Compat, TryFutureExt as _}; use futures_timer::Delay; use libp2p::core::{ConnectedPoint, PeerId, Endpoint}; use libp2p::core::upgrade::{InboundUpgrade, OutboundUpgrade}; @@ -31,7 +30,7 @@ use libp2p::swarm::{ use log::{debug, error}; use smallvec::{smallvec, SmallVec}; use std::{borrow::Cow, error, fmt, io, marker::PhantomData, mem, time::Duration}; -use tokio_io::{AsyncRead, AsyncWrite}; +use std::{pin::Pin, task::{Context, Poll}}; /// Implements the `IntoProtocolsHandler` trait of libp2p. /// @@ -97,7 +96,7 @@ pub struct CustomProtoHandlerProto { impl CustomProtoHandlerProto where - TSubstream: AsyncRead + AsyncWrite, + TSubstream: AsyncRead + AsyncWrite + Unpin, { /// Builds a new `CustomProtoHandlerProto`. pub fn new(protocol: RegisteredProtocol) -> Self { @@ -110,7 +109,7 @@ where impl IntoProtocolsHandler for CustomProtoHandlerProto where - TSubstream: AsyncRead + AsyncWrite, + TSubstream: AsyncRead + AsyncWrite + Unpin, { type Handler = CustomProtoHandler; @@ -125,7 +124,7 @@ where remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), - init_deadline: Delay::new(Duration::from_secs(5)).compat() + init_deadline: Delay::new(Duration::from_secs(5)) }, events_queue: SmallVec::new(), } @@ -152,7 +151,7 @@ pub struct CustomProtoHandler { /// /// This queue must only ever be modified to insert elements at the back, or remove the first /// element. - events_queue: SmallVec<[ProtocolsHandlerEvent; 16]>, + events_queue: SmallVec<[ProtocolsHandlerEvent; 16]>, } /// State of the handler. @@ -162,14 +161,14 @@ enum ProtocolState { /// List of substreams opened by the remote but that haven't been processed yet. substreams: SmallVec<[RegisteredProtocolSubstream; 6]>, /// Deadline after which the initialization is abnormally long. - init_deadline: Compat, + init_deadline: Delay, }, /// Handler is opening a substream in order to activate itself. /// If we are in this state, we haven't sent any `CustomProtocolOpen` yet. Opening { /// Deadline after which the opening is abnormally long. - deadline: Compat, + deadline: Delay, }, /// Normal operating mode. Contains the substreams that are open. @@ -260,7 +259,7 @@ pub enum CustomProtoHandlerOut { impl CustomProtoHandler where - TSubstream: AsyncRead + AsyncWrite, + TSubstream: AsyncRead + AsyncWrite + Unpin, { /// Enables the handler. fn enable(&mut self) { @@ -280,7 +279,7 @@ where }); } ProtocolState::Opening { - deadline: Delay::new(Duration::from_secs(60)).compat() + deadline: Delay::new(Duration::from_secs(60)) } } else { @@ -337,8 +336,8 @@ where /// Polls the state for events. Optionally returns an event to produce. #[must_use] - fn poll_state(&mut self) - -> Option> { + fn poll_state(&mut self, cx: &mut Context) + -> Option> { match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", @@ -348,14 +347,14 @@ where } ProtocolState::Init { substreams, mut init_deadline } => { - match init_deadline.poll() { - Ok(Async::Ready(())) => { - init_deadline = Delay::new(Duration::from_secs(60)).compat(); + match Pin::new(&mut init_deadline).poll(cx) { + Poll::Ready(Ok(())) => { + init_deadline = Delay::new(Duration::from_secs(60)); error!(target: "sub-libp2p", "Handler initialization process is too long \ with {:?}", self.remote_peer_id) }, - Ok(Async::NotReady) => {} - Err(_) => error!(target: "sub-libp2p", "Tokio timer has errored") + Poll::Pending => {} + Poll::Ready(Err(_)) => error!(target: "sub-libp2p", "Tokio timer has errored") } self.state = ProtocolState::Init { substreams, init_deadline }; @@ -363,9 +362,9 @@ where } ProtocolState::Opening { mut deadline } => { - match deadline.poll() { - Ok(Async::Ready(())) => { - deadline = Delay::new(Duration::from_secs(60)).compat(); + match Pin::new(&mut deadline).poll(cx) { + Poll::Ready(Ok(())) => { + deadline = Delay::new(Duration::from_secs(60)); let event = CustomProtoHandlerOut::ProtocolError { is_severe: true, error: "Timeout when opening protocol".to_string().into(), @@ -373,13 +372,13 @@ where self.state = ProtocolState::Opening { deadline }; Some(ProtocolsHandlerEvent::Custom(event)) }, - Ok(Async::NotReady) => { + Poll::Pending => { self.state = ProtocolState::Opening { deadline }; None }, - Err(_) => { + Poll::Ready(Err(_)) => { error!(target: "sub-libp2p", "Tokio timer has errored"); - deadline = Delay::new(Duration::from_secs(60)).compat(); + deadline = Delay::new(Duration::from_secs(60)); self.state = ProtocolState::Opening { deadline }; None }, @@ -389,9 +388,9 @@ where ProtocolState::Normal { mut substreams, mut shutdown } => { for n in (0..substreams.len()).rev() { let mut substream = substreams.swap_remove(n); - match substream.poll() { - Ok(Async::NotReady) => substreams.push(substream), - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { + match Pin::new(&mut substream).poll_next(cx) { + Poll::Pending => substreams.push(substream), + Poll::Ready(Some(Ok(RegisteredProtocolEvent::Message(message)))) => { let event = CustomProtoHandlerOut::CustomMessage { message }; @@ -399,7 +398,7 @@ where self.state = ProtocolState::Normal { substreams, shutdown }; return Some(ProtocolsHandlerEvent::Custom(event)); }, - Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages }))) => { + Poll::Ready(Some(Ok(RegisteredProtocolEvent::Clogged { messages }))) => { let event = CustomProtoHandlerOut::Clogged { messages, }; @@ -407,7 +406,7 @@ where self.state = ProtocolState::Normal { substreams, shutdown }; return Some(ProtocolsHandlerEvent::Custom(event)); } - Ok(Async::Ready(None)) => { + Poll::Ready(None) => { shutdown.push(substream); if substreams.is_empty() { let event = CustomProtoHandlerOut::CustomProtocolClosed { @@ -420,7 +419,7 @@ where return Some(ProtocolsHandlerEvent::Custom(event)); } } - Err(err) => { + Poll::Ready(Some(Err(err))) => { if substreams.is_empty() { let event = CustomProtoHandlerOut::CustomProtocolClosed { reason: format!("Error on the last substream: {:?}", err).into(), @@ -443,12 +442,12 @@ where } ProtocolState::Disabled { mut shutdown, reenable } => { - shutdown_list(&mut shutdown); + shutdown_list(&mut shutdown, cx); // If `reenable` is `true`, that means we should open the substreams system again // after all the substreams are closed. if reenable && shutdown.is_empty() { self.state = ProtocolState::Opening { - deadline: Delay::new(Duration::from_secs(60)).compat() + deadline: Delay::new(Duration::from_secs(60)) }; Some(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), @@ -524,7 +523,7 @@ where } impl ProtocolsHandler for CustomProtoHandler -where TSubstream: AsyncRead + AsyncWrite { +where TSubstream: AsyncRead + AsyncWrite + Unpin { type InEvent = CustomProtoHandlerIn; type OutEvent = CustomProtoHandlerOut; type Substream = TSubstream; @@ -585,33 +584,33 @@ where TSubstream: AsyncRead + AsyncWrite { fn poll( &mut self, + cx: &mut Context, ) -> Poll< - ProtocolsHandlerEvent, - Self::Error, + ProtocolsHandlerEvent > { // Flush the events queue if necessary. if !self.events_queue.is_empty() { let event = self.events_queue.remove(0); - return Ok(Async::Ready(event)) + return Poll::Ready(event) } // Kill the connection if needed. if let ProtocolState::KillAsap = self.state { - return Err(ConnectionKillError); + return Poll::Ready(ProtocolsHandlerEvent::Close(ConnectionKillError)); } // Process all the substreams. - if let Some(event) = self.poll_state() { - return Ok(Async::Ready(event)) + if let Some(event) = self.poll_state(cx) { + return Poll::Ready(event) } - Ok(Async::NotReady) + Poll::Pending } } impl fmt::Debug for CustomProtoHandler where - TSubstream: AsyncRead + AsyncWrite, + TSubstream: AsyncRead + AsyncWrite + Unpin, { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { f.debug_struct("CustomProtoHandler") @@ -622,15 +621,16 @@ where /// Given a list of substreams, tries to shut them down. The substreams that have been successfully /// shut down are removed from the list. fn shutdown_list - (list: &mut SmallVec>>) -where TSubstream: AsyncRead + AsyncWrite { + (list: &mut SmallVec>>, + cx: &mut Context) +where TSubstream: AsyncRead + AsyncWrite + Unpin { 'outer: for n in (0..list.len()).rev() { let mut substream = list.swap_remove(n); loop { - match substream.poll() { - Ok(Async::Ready(Some(_))) => {} - Ok(Async::NotReady) => break, - Err(_) | Ok(Async::Ready(None)) => continue 'outer, + match substream.poll_next_unpin(cx) { + Poll::Ready(Some(Ok(_))) => {} + Poll::Pending => break, + Poll::Ready(Some(Err(_))) | Poll::Ready(None) => continue 'outer, } } list.push(substream); diff --git a/client/network/src/protocol/legacy_proto/tests.rs b/client/network/src/protocol/legacy_proto/tests.rs index a57c4dd7c8..6a2174f30c 100644 --- a/client/network/src/protocol/legacy_proto/tests.rs +++ b/client/network/src/protocol/legacy_proto/tests.rs @@ -16,7 +16,7 @@ #![cfg(test)] -use futures::{future, prelude::*, try_ready}; +use futures::{prelude::*, ready}; use codec::{Encode, Decode}; use libp2p::core::nodes::Substream; use libp2p::core::{ConnectedPoint, transport::boxed::Boxed, muxing::StreamMuxerBox}; @@ -24,7 +24,7 @@ use libp2p::swarm::{Swarm, ProtocolsHandler, IntoProtocolsHandler}; use libp2p::swarm::{PollParameters, NetworkBehaviour, NetworkBehaviourAction}; use libp2p::{PeerId, Multiaddr, Transport}; use rand::seq::SliceRandom; -use std::{io, time::Duration, time::Instant}; +use std::{io, task::Context, task::Poll, time::Duration}; use crate::message::Message; use crate::protocol::legacy_proto::{LegacyProto, LegacyProtoOut}; use sp_test_primitives::Block; @@ -62,7 +62,7 @@ fn build_nodes() endpoint, libp2p::core::upgrade::Version::V1 ) - .map(|muxer| (peer_id, libp2p::core::muxing::StreamMuxerBox::new(muxer))) + .map_ok(|muxer| (peer_id, libp2p::core::muxing::StreamMuxerBox::new(muxer))) }) .timeout(Duration::from_secs(20)) .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) @@ -170,14 +170,15 @@ impl NetworkBehaviour for CustomProtoWithAddr { fn poll( &mut self, + cx: &mut Context, params: &mut impl PollParameters - ) -> Async< + ) -> Poll< NetworkBehaviourAction< <::Handler as ProtocolsHandler>::InEvent, Self::OutEvent > > { - self.inner.poll(params) + self.inner.poll(cx, params) } fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { @@ -216,9 +217,9 @@ fn two_nodes_transfer_lots_of_packets() { let (mut service1, mut service2) = build_nodes(); - let fut1 = future::poll_fn(move || -> io::Result<_> { + let fut1 = future::poll_fn(move |cx| -> Poll<()> { loop { - match try_ready!(service1.poll()) { + match ready!(service1.poll_next_unpin(cx)) { Some(LegacyProtoOut::CustomProtocolOpen { peer_id, .. }) => { for n in 0 .. NUM_PACKETS { service1.send_packet( @@ -233,9 +234,9 @@ fn two_nodes_transfer_lots_of_packets() { }); let mut packet_counter = 0u32; - let fut2 = future::poll_fn(move || -> io::Result<_> { + let fut2 = future::poll_fn(move |cx| { loop { - match try_ready!(service2.poll()) { + match ready!(service2.poll_next_unpin(cx)) { Some(LegacyProtoOut::CustomProtocolOpen { .. }) => {}, Some(LegacyProtoOut::CustomMessage { message, .. }) => { match Message::::decode(&mut &message[..]).unwrap() { @@ -243,7 +244,7 @@ fn two_nodes_transfer_lots_of_packets() { assert_eq!(message.len(), 1); packet_counter += 1; if packet_counter == NUM_PACKETS { - return Ok(Async::Ready(())) + return Poll::Ready(()) } }, _ => panic!(), @@ -254,8 +255,9 @@ fn two_nodes_transfer_lots_of_packets() { } }); - let combined = fut1.select(fut2).map_err(|(err, _)| err); - let _ = tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap(); + futures::executor::block_on(async move { + future::select(fut1, fut2).await; + }); } #[test] @@ -277,9 +279,9 @@ fn basic_two_nodes_requests_in_parallel() { let mut to_receive = to_send.clone(); to_send.shuffle(&mut rand::thread_rng()); - let fut1 = future::poll_fn(move || -> io::Result<_> { + let fut1 = future::poll_fn(move |cx| -> Poll<()> { loop { - match try_ready!(service1.poll()) { + match ready!(service1.poll_next_unpin(cx)) { Some(LegacyProtoOut::CustomProtocolOpen { peer_id, .. }) => { for msg in to_send.drain(..) { service1.send_packet(&peer_id, msg.encode()); @@ -290,15 +292,15 @@ fn basic_two_nodes_requests_in_parallel() { } }); - let fut2 = future::poll_fn(move || -> io::Result<_> { + let fut2 = future::poll_fn(move |cx| { loop { - match try_ready!(service2.poll()) { + match ready!(service2.poll_next_unpin(cx)) { Some(LegacyProtoOut::CustomProtocolOpen { .. }) => {}, Some(LegacyProtoOut::CustomMessage { message, .. }) => { let pos = to_receive.iter().position(|m| m.encode() == message).unwrap(); to_receive.remove(pos); if to_receive.is_empty() { - return Ok(Async::Ready(())) + return Poll::Ready(()) } } _ => panic!(), @@ -306,8 +308,9 @@ fn basic_two_nodes_requests_in_parallel() { } }); - let combined = fut1.select(fut2).map_err(|(err, _)| err); - let _ = tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap(); + futures::executor::block_on(async move { + future::select(fut1, fut2).await; + }); } #[test] @@ -317,9 +320,6 @@ fn reconnect_after_disconnect() { 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(); - // For this test, the services can be in the following states. #[derive(Debug, Copy, Clone, PartialEq, Eq)] enum ServiceState { NotConnected, FirstConnec, Disconnected, ConnectedAgain } @@ -327,12 +327,12 @@ fn reconnect_after_disconnect() { let mut service2_state = ServiceState::NotConnected; // Run the events loops. - runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { + futures::executor::block_on(future::poll_fn(|cx| -> Poll> { loop { let mut service1_not_ready = false; - match service1.poll().unwrap() { - Async::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { + match service1.poll_next_unpin(cx) { + Poll::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { match service1_state { ServiceState::NotConnected => { service1_state = ServiceState::FirstConnec; @@ -344,19 +344,19 @@ fn reconnect_after_disconnect() { ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { + Poll::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { match service1_state { ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | ServiceState::Disconnected => panic!(), } }, - Async::NotReady => service1_not_ready = true, + Poll::Pending => service1_not_ready = true, _ => panic!() } - match service2.poll().unwrap() { - Async::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { + match service2.poll_next_unpin(cx) { + Poll::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { match service2_state { ServiceState::NotConnected => { service2_state = ServiceState::FirstConnec; @@ -368,43 +368,43 @@ fn reconnect_after_disconnect() { ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { + Poll::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { match service2_state { ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | ServiceState::Disconnected => panic!(), } }, - Async::NotReady if service1_not_ready => break, - Async::NotReady => {} + Poll::Pending if service1_not_ready => break, + Poll::Pending => {} _ => panic!() } } if service1_state == ServiceState::ConnectedAgain && service2_state == ServiceState::ConnectedAgain { - Ok(Async::Ready(())) + Poll::Ready(Ok(())) } else { - Ok(Async::NotReady) + Poll::Pending } })).unwrap(); // Do a second 3-seconds run to make sure we don't get disconnected immediately again. - let mut delay = tokio::timer::Delay::new(Instant::now() + Duration::from_secs(3)); - runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { - match service1.poll().unwrap() { - Async::NotReady => {}, + let mut delay = futures_timer::Delay::new(Duration::from_secs(3)); + futures::executor::block_on(future::poll_fn(|cx| -> Poll> { + match service1.poll_next_unpin(cx) { + Poll::Pending => {}, _ => panic!() } - match service2.poll().unwrap() { - Async::NotReady => {}, + match service2.poll_next_unpin(cx) { + Poll::Pending => {}, _ => panic!() } - if let Async::Ready(()) = delay.poll().unwrap() { - Ok(Async::Ready(())) + if let Poll::Ready(Ok(_)) = delay.poll_unpin(cx) { + Poll::Ready(Ok(())) } else { - Ok(Async::NotReady) + Poll::Pending } })).unwrap(); } diff --git a/client/network/src/protocol/legacy_proto/upgrade.rs b/client/network/src/protocol/legacy_proto/upgrade.rs index a5eef85580..c021d5917f 100644 --- a/client/network/src/protocol/legacy_proto/upgrade.rs +++ b/client/network/src/protocol/legacy_proto/upgrade.rs @@ -15,12 +15,12 @@ // along with Substrate. If not, see . use crate::config::ProtocolId; -use bytes::{Bytes, BytesMut}; +use bytes::BytesMut; +use futures::prelude::*; +use futures_codec::Framed; use libp2p::core::{Negotiated, Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; -use libp2p::tokio_codec::Framed; -use std::{collections::VecDeque, io, vec::IntoIter as VecIntoIter}; -use futures::{prelude::*, future, stream}; -use tokio_io::{AsyncRead, AsyncWrite}; +use std::{collections::VecDeque, io, pin::Pin, vec::IntoIter as VecIntoIter}; +use std::task::{Context, Poll}; use unsigned_varint::codec::UviBytes; /// Connection upgrade for a single protocol. @@ -32,7 +32,7 @@ pub struct RegisteredProtocol { id: ProtocolId, /// Base name of the protocol as advertised on the network. /// Ends with `/` so that we can append a version number behind. - base_name: Bytes, + base_name: Vec, /// List of protocol versions that we support. /// Ordered in descending order so that the best comes first. supported_versions: Vec, @@ -44,7 +44,7 @@ impl RegisteredProtocol { pub fn new(protocol: impl Into, versions: &[u8]) -> Self { let protocol = protocol.into(); - let mut base_name = Bytes::from_static(b"/substrate/"); + let mut base_name = b"/substrate/".to_vec(); base_name.extend_from_slice(protocol.as_bytes()); base_name.extend_from_slice(b"/"); @@ -78,11 +78,11 @@ pub struct RegisteredProtocolSubstream { /// the remote (listener). endpoint: Endpoint, /// Buffer of packets to send. - send_queue: VecDeque>, + send_queue: VecDeque, /// If true, we should call `poll_complete` on the inner sink. - requires_poll_complete: bool, + requires_poll_flush: bool, /// The underlying substream. - inner: stream::Fuse, UviBytes>>>, + inner: stream::Fuse, UviBytes>>, /// 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 @@ -119,7 +119,7 @@ impl RegisteredProtocolSubstream { return } - self.send_queue.push_back(data); + self.send_queue.push_back(From::from(&data[..])); } } @@ -138,25 +138,31 @@ pub enum RegisteredProtocolEvent { } impl Stream for RegisteredProtocolSubstream -where TSubstream: AsyncRead + AsyncWrite { - type Item = RegisteredProtocolEvent; - type Error = io::Error; +where TSubstream: AsyncRead + AsyncWrite + Unpin { + type Item = Result; - fn poll(&mut self) -> Poll, Self::Error> { + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { // Flushing the local queue. - while let Some(packet) = self.send_queue.pop_front() { - match self.inner.start_send(packet)? { - AsyncSink::NotReady(packet) => { - self.send_queue.push_front(packet); - break - }, - AsyncSink::Ready => self.requires_poll_complete = true, + while !self.send_queue.is_empty() { + match Pin::new(&mut self.inner).poll_ready(cx) { + Poll::Ready(Ok(())) => {}, + Poll::Ready(Err(err)) => return Poll::Ready(Some(Err(err))), + Poll::Pending => break, + } + + if let Some(packet) = self.send_queue.pop_front() { + Pin::new(&mut self.inner).start_send(packet)?; + self.requires_poll_flush = true; } } // If we are closing, close as soon as the Sink is closed. if self.is_closing { - return Ok(self.inner.close()?.map(|()| None)) + return match Pin::new(&mut self.inner).poll_close(cx) { + Poll::Pending => Poll::Pending, + Poll::Ready(Ok(_)) => Poll::Ready(None), + Poll::Ready(Err(err)) => Poll::Ready(Some(Err(err))), + } } // Indicating that the remote is clogged if that's the case. @@ -166,9 +172,9 @@ where TSubstream: AsyncRead + AsyncWrite { // if you remove the fuse, then we will always return early from this function and // thus never read any message from the network. self.clogged_fuse = true; - return Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { + return Poll::Ready(Some(Ok(RegisteredProtocolEvent::Clogged { messages: self.send_queue.iter() - .map(|m| m.clone()) + .map(|m| m.clone().to_vec()) .collect(), }))) } @@ -177,25 +183,25 @@ where TSubstream: AsyncRead + AsyncWrite { } // Flushing if necessary. - if self.requires_poll_complete { - if let Async::Ready(()) = self.inner.poll_complete()? { - self.requires_poll_complete = false; + if self.requires_poll_flush { + if let Poll::Ready(()) = Pin::new(&mut self.inner).poll_flush(cx)? { + self.requires_poll_flush = false; } } // Receiving incoming packets. // Note that `inner` is wrapped in a `Fuse`, therefore we can poll it forever. - match self.inner.poll()? { - Async::Ready(Some(data)) => { - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(data)))) + match Pin::new(&mut self.inner).poll_next(cx)? { + Poll::Ready(Some(data)) => { + Poll::Ready(Some(Ok(RegisteredProtocolEvent::Message(data)))) } - Async::Ready(None) => - if !self.requires_poll_complete && self.send_queue.is_empty() { - Ok(Async::Ready(None)) + Poll::Ready(None) => + if !self.requires_poll_flush && self.send_queue.is_empty() { + Poll::Ready(None) } else { - Ok(Async::NotReady) + Poll::Pending } - Async::NotReady => Ok(Async::NotReady), + Poll::Pending => Poll::Pending, } } } @@ -224,7 +230,7 @@ impl UpgradeInfo for RegisteredProtocol { #[derive(Debug, Clone)] pub struct RegisteredProtocolName { /// Protocol name, as advertised on the wire. - name: Bytes, + name: Vec, /// Version number. Stored in string form in `name`, but duplicated here for easier retrieval. version: u8, } @@ -236,10 +242,10 @@ impl ProtocolName for RegisteredProtocolName { } impl InboundUpgrade for RegisteredProtocol -where TSubstream: AsyncRead + AsyncWrite, +where TSubstream: AsyncRead + AsyncWrite + Unpin, { type Output = RegisteredProtocolSubstream; - type Future = future::FutureResult; + type Future = future::Ready>; type Error = io::Error; fn upgrade_inbound( @@ -257,7 +263,7 @@ where TSubstream: AsyncRead + AsyncWrite, is_closing: false, endpoint: Endpoint::Listener, send_queue: VecDeque::new(), - requires_poll_complete: false, + requires_poll_flush: false, inner: framed.fuse(), protocol_version: info.version, clogged_fuse: false, @@ -266,7 +272,7 @@ where TSubstream: AsyncRead + AsyncWrite, } impl OutboundUpgrade for RegisteredProtocol -where TSubstream: AsyncRead + AsyncWrite, +where TSubstream: AsyncRead + AsyncWrite + Unpin, { type Output = >::Output; type Future = >::Future; @@ -283,7 +289,7 @@ where TSubstream: AsyncRead + AsyncWrite, is_closing: false, endpoint: Endpoint::Dialer, send_queue: VecDeque::new(), - requires_poll_complete: false, + requires_poll_flush: false, inner: framed.fuse(), protocol_version: info.version, clogged_fuse: false, diff --git a/client/network/src/protocol/light_dispatch.rs b/client/network/src/protocol/light_dispatch.rs index 6b446f2075..dd94abc2a4 100644 --- a/client/network/src/protocol/light_dispatch.rs +++ b/client/network/src/protocol/light_dispatch.rs @@ -23,7 +23,7 @@ use std::collections::{HashMap, VecDeque}; use std::sync::Arc; use std::time::{Instant, Duration}; use log::{trace, info}; -use futures::sync::oneshot::{Sender as OneShotSender}; +use futures::channel::oneshot::{Sender as OneShotSender}; use linked_hash_map::{Entry, LinkedHashMap}; use sp_blockchain::Error as ClientError; use sc_client_api::{FetchChecker, RemoteHeaderRequest, @@ -680,7 +680,7 @@ pub mod tests { use std::collections::{HashMap, HashSet}; use std::sync::Arc; use std::time::Instant; - use futures::{Future, sync::oneshot}; + use futures::channel::oneshot; use sp_core::storage::ChildInfo; use sp_runtime::traits::{Block as BlockT, NumberFor, Header as HeaderT}; use sp_blockchain::{Error as ClientError, Result as ClientResult}; @@ -999,7 +999,7 @@ pub mod tests { }, tx)); receive_call_response(&mut network_interface, &mut light_dispatch, peer0.clone(), 0); - assert_eq!(response.wait().unwrap().unwrap(), vec![42]); + assert_eq!(futures::executor::block_on(response).unwrap().unwrap(), vec![42]); } #[test] @@ -1021,7 +1021,10 @@ pub mod tests { id: 0, proof: StorageProof::empty(), }); - assert_eq!(response.wait().unwrap().unwrap().remove(b":key".as_ref()).unwrap(), Some(vec![42])); + assert_eq!( + futures::executor::block_on(response).unwrap().unwrap().remove(b":key".as_ref()).unwrap(), + Some(vec![42]) + ); } #[test] @@ -1049,7 +1052,7 @@ pub mod tests { id: 0, proof: StorageProof::empty(), }); - assert_eq!(response.wait().unwrap().unwrap().remove(b":key".as_ref()).unwrap(), Some(vec![42])); + assert_eq!(futures::executor::block_on(response).unwrap().unwrap().remove(b":key".as_ref()).unwrap(), Some(vec![42])); } #[test] @@ -1078,7 +1081,7 @@ pub mod tests { proof: StorageProof::empty(), }); assert_eq!( - response.wait().unwrap().unwrap().hash(), + futures::executor::block_on(response).unwrap().unwrap().hash(), "6443a0b46e0412e626363028115a9f2cf963eeed526b8b33e5316f08b50d0dc3".parse().unwrap(), ); } @@ -1109,7 +1112,7 @@ pub mod tests { roots: vec![], roots_proof: StorageProof::empty(), }); - assert_eq!(response.wait().unwrap().unwrap(), vec![(100, 2)]); + assert_eq!(futures::executor::block_on(response).unwrap().unwrap(), vec![(100, 2)]); } #[test] diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 5f18a5c10c..4e923a51a1 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -27,11 +27,12 @@ use std::{collections::{HashMap, HashSet}, fs, marker::PhantomData, io, path::Path}; use std::sync::{Arc, atomic::{AtomicBool, AtomicUsize, Ordering}}; +use std::pin::Pin; +use std::task::Poll; use sp_consensus::import_queue::{ImportQueue, Link}; use sp_consensus::import_queue::{BlockImportResult, BlockImportError}; -use futures::{prelude::*, sync::mpsc}; -use futures03::TryFutureExt as _; +use futures::{prelude::*, channel::mpsc}; use log::{warn, error, info}; use libp2p::{PeerId, Multiaddr, kad::record}; use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; @@ -216,7 +217,7 @@ impl, H: ExHashT> NetworkWorker params.network_config.client_version, params.network_config.node_name ); - let behaviour = Behaviour::new( + let behaviour = futures::executor::block_on(Behaviour::new( protocol, user_agent, local_public, @@ -229,7 +230,7 @@ impl, H: ExHashT> NetworkWorker TransportConfig::MemoryOnly => false, TransportConfig::Normal { allow_private_ipv4, .. } => allow_private_ipv4, }, - ); + )); let (transport, bandwidth) = { let (config_mem, config_wasm) = match params.network_config.transport { TransportConfig::MemoryOnly => (true, None), @@ -451,7 +452,7 @@ impl, H: ExHashT> NetworkServic /// If this method is called multiple times, the events are duplicated. /// /// The stream never ends (unless the `NetworkWorker` gets shut down). - pub fn event_stream(&self) -> impl Stream { + pub fn event_stream(&self) -> impl Stream { // Note: when transitioning to stable futures, remove the `Error` entirely let (tx, rx) = mpsc::unbounded(); let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::EventStream(tx)); @@ -711,106 +712,106 @@ pub struct NetworkWorker, H: Ex } impl, H: ExHashT> Future for NetworkWorker { - type Item = (); - type Error = io::Error; + type Output = Result<(), io::Error>; + + fn poll(mut self: Pin<&mut Self>, cx: &mut std::task::Context) -> Poll { + let this = &mut *self; - fn poll(&mut self) -> Poll { // Poll the import queue for actions to perform. - let _ = futures03::future::poll_fn(|cx| { - self.import_queue.poll_actions(cx, &mut NetworkLink { - protocol: &mut self.network_service, - }); - std::task::Poll::Pending::> - }).compat().poll(); + this.import_queue.poll_actions(cx, &mut NetworkLink { + protocol: &mut this.network_service, + }); // Check for new incoming light client requests. - if let Some(light_client_rqs) = self.light_client_rqs.as_mut() { - while let Ok(Async::Ready(Some(rq))) = light_client_rqs.poll() { - self.network_service.user_protocol_mut().add_light_client_request(rq); + if let Some(light_client_rqs) = this.light_client_rqs.as_mut() { + while let Poll::Ready(Some(rq)) = light_client_rqs.poll_next_unpin(cx) { + this.network_service.user_protocol_mut().add_light_client_request(rq); } } loop { // Process the next message coming from the `NetworkService`. - let msg = match self.from_worker.poll() { - Ok(Async::Ready(Some(msg))) => msg, - Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), - Ok(Async::NotReady) => break, + let msg = match this.from_worker.poll_next_unpin(cx) { + Poll::Ready(Some(msg)) => msg, + Poll::Ready(None) => return Poll::Ready(Ok(())), + Poll::Pending => break, }; match msg { ServiceToWorkerMsg::ExecuteWithSpec(task) => { - let protocol = self.network_service.user_protocol_mut(); + let protocol = this.network_service.user_protocol_mut(); let (mut context, spec) = protocol.specialization_lock(); task(spec, &mut context); }, ServiceToWorkerMsg::AnnounceBlock(hash, data) => - self.network_service.user_protocol_mut().announce_block(hash, data), + this.network_service.user_protocol_mut().announce_block(hash, data), ServiceToWorkerMsg::RequestJustification(hash, number) => - self.network_service.user_protocol_mut().request_justification(&hash, number), + this.network_service.user_protocol_mut().request_justification(&hash, number), ServiceToWorkerMsg::PropagateExtrinsics => - self.network_service.user_protocol_mut().propagate_extrinsics(), + this.network_service.user_protocol_mut().propagate_extrinsics(), ServiceToWorkerMsg::GetValue(key) => - self.network_service.get_value(&key), + this.network_service.get_value(&key), ServiceToWorkerMsg::PutValue(key, value) => - self.network_service.put_value(key, value), + this.network_service.put_value(key, value), ServiceToWorkerMsg::AddKnownAddress(peer_id, addr) => - self.network_service.add_known_address(peer_id, addr), + this.network_service.add_known_address(peer_id, addr), ServiceToWorkerMsg::SyncFork(peer_ids, hash, number) => - self.network_service.user_protocol_mut().set_sync_fork_request(peer_ids, &hash, number), + this.network_service.user_protocol_mut().set_sync_fork_request(peer_ids, &hash, number), ServiceToWorkerMsg::EventStream(sender) => - self.event_streams.push(sender), + this.event_streams.push(sender), ServiceToWorkerMsg::WriteNotification { message, engine_id, target } => - self.network_service.user_protocol_mut().write_notification(target, engine_id, message), + this.network_service.user_protocol_mut().write_notification(target, engine_id, message), ServiceToWorkerMsg::RegisterNotifProtocol { engine_id } => { - let events = self.network_service.user_protocol_mut().register_notifications_protocol(engine_id); + let events = this.network_service.user_protocol_mut().register_notifications_protocol(engine_id); for event in events { - self.event_streams.retain(|sender| sender.unbounded_send(event.clone()).is_ok()); + this.event_streams.retain(|sender| sender.unbounded_send(event.clone()).is_ok()); } }, ServiceToWorkerMsg::DisconnectPeer(who) => - self.network_service.user_protocol_mut().disconnect_peer(&who), + this.network_service.user_protocol_mut().disconnect_peer(&who), } } loop { // Process the next action coming from the network. - let poll_value = self.network_service.poll(); + let poll_value = this.network_service.poll_next_unpin(cx); match poll_value { - Ok(Async::NotReady) => break, - Ok(Async::Ready(Some(BehaviourOut::BlockImport(origin, blocks)))) => - self.import_queue.import_blocks(origin, blocks), - Ok(Async::Ready(Some(BehaviourOut::JustificationImport(origin, hash, nb, justification)))) => - self.import_queue.import_justification(origin, hash, nb, justification), - Ok(Async::Ready(Some(BehaviourOut::FinalityProofImport(origin, hash, nb, proof)))) => - self.import_queue.import_finality_proof(origin, hash, nb, proof), - Ok(Async::Ready(Some(BehaviourOut::Event(ev)))) => { - self.event_streams.retain(|sender| sender.unbounded_send(ev.clone()).is_ok()); + Poll::Pending => break, + Poll::Ready(Some(BehaviourOut::BlockImport(origin, blocks))) => + this.import_queue.import_blocks(origin, blocks), + Poll::Ready(Some(BehaviourOut::JustificationImport(origin, hash, nb, justification))) => + this.import_queue.import_justification(origin, hash, nb, justification), + Poll::Ready(Some(BehaviourOut::FinalityProofImport(origin, hash, nb, proof))) => + this.import_queue.import_finality_proof(origin, hash, nb, proof), + Poll::Ready(Some(BehaviourOut::Event(ev))) => { + this.event_streams.retain(|sender| sender.unbounded_send(ev.clone()).is_ok()); + }, + Poll::Ready(None) => { + error!(target: "sync", "Network events stream has returned None"); + break; }, - Ok(Async::Ready(None)) => {}, - Err(err) => { - error!(target: "sync", "Error in the network: {:?}", err); - return Err(err) - } }; } // Update the variables shared with the `NetworkService`. - self.num_connected.store(self.network_service.user_protocol_mut().num_connected_peers(), Ordering::Relaxed); + this.num_connected.store(this.network_service.user_protocol_mut().num_connected_peers(), Ordering::Relaxed); { - let external_addresses = Swarm::::external_addresses(&self.network_service).cloned().collect(); - *self.external_addresses.lock() = external_addresses; + let external_addresses = Swarm::::external_addresses(&this.network_service).cloned().collect(); + *this.external_addresses.lock() = external_addresses; } - self.is_major_syncing.store(match self.network_service.user_protocol_mut().sync_state() { + this.is_major_syncing.store(match this.network_service.user_protocol_mut().sync_state() { SyncState::Idle => false, SyncState::Downloading => true, }, Ordering::Relaxed); - Ok(Async::NotReady) + Poll::Pending } } +impl, H: ExHashT> Unpin for NetworkWorker { +} + /// The libp2p swarm, customized for our needs. type Swarm = libp2p::swarm::Swarm< Boxed<(PeerId, StreamMuxerBox), io::Error>, diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index 40e8bb46ce..d632f9b75c 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -71,7 +71,11 @@ pub fn build_transport( let desktop_trans = tcp::TcpConfig::new(); let desktop_trans = websocket::WsConfig::new(desktop_trans.clone()) .or_transport(desktop_trans); - OptionalTransport::some(dns::DnsConfig::new(desktop_trans)) + OptionalTransport::some(if let Ok(dns) = dns::DnsConfig::new(desktop_trans.clone()) { + dns.boxed() + } else { + desktop_trans.map_err(dns::DnsErr::Underlying).boxed() + }) } else { OptionalTransport::none() }); @@ -91,7 +95,7 @@ pub fn build_transport( let transport = transport.and_then(move |stream, endpoint| { let upgrade = core::upgrade::SelectUpgrade::new(noise_config, secio_config); core::upgrade::apply(stream, upgrade, endpoint, upgrade::Version::V1) - .and_then(|out| match out { + .map(|out| match out? { // We negotiated noise EitherOutput::First((remote_id, out)) => { let remote_key = match remote_id { @@ -110,7 +114,7 @@ pub fn build_transport( #[cfg(target_os = "unknown")] let transport = transport.and_then(move |stream, endpoint| { core::upgrade::apply(stream, secio_config, endpoint, upgrade::Version::V1) - .and_then(|(id, stream)| Ok((stream, id))) + .map_ok(|(id, stream)| ((stream, id))) }); // Multiplexing @@ -121,7 +125,7 @@ pub fn build_transport( .map_outbound(move |muxer| (peer_id2, muxer)); core::upgrade::apply(stream, upgrade, endpoint, upgrade::Version::V1) - .map(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer))) + .map_ok(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer))) }) .timeout(Duration::from_secs(20)) diff --git a/client/network/src/utils.rs b/client/network/src/utils.rs index 8bbba990a7..f13505d012 100644 --- a/client/network/src/utils.rs +++ b/client/network/src/utils.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use std::time::Duration; -use futures03::{FutureExt, Stream, StreamExt, stream::unfold}; +use futures::{FutureExt, Stream, StreamExt, stream::unfold}; use futures_timer::Delay; pub fn interval(duration: Duration) -> impl Stream + Unpin { diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 1d37196724..381276ecfa 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -14,7 +14,7 @@ futures = "0.1.29" futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } futures-timer = "0.4.0" rand = "0.7.2" -libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } sc-client = { version = "2.0.0", path = "../../" } sc-client-api = { version = "2.0.0", path = "../../api" } diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index e76e58d4af..8116fd7c94 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -22,6 +22,7 @@ mod block_import; mod sync; use std::collections::HashMap; +use std::pin::Pin; use std::sync::Arc; use libp2p::build_multiaddr; @@ -48,7 +49,7 @@ use sp_consensus::block_import::{BlockImport, ImportResult}; use sp_consensus::Error as ConsensusError; use sp_consensus::{BlockOrigin, ForkChoiceStrategy, BlockImportParams, BlockCheckParams, JustificationImport}; use futures::prelude::*; -use futures03::{StreamExt as _, TryStreamExt as _}; +use futures03::{Future as _, FutureExt as _, TryFutureExt as _, StreamExt as _, TryStreamExt as _}; use sc_network::{NetworkWorker, NetworkStateInfo, NetworkService, ReportHandle, config::ProtocolId}; use sc_network::config::{NetworkConfiguration, TransportConfig, BoxFinalityProofRequestBuilder}; use libp2p::PeerId; @@ -713,7 +714,9 @@ pub trait TestNetFactory: Sized { self.mut_peers(|peers| { for peer in peers { trace!(target: "sync", "-- Polling {}", peer.id()); - peer.network.poll().unwrap(); + futures03::future::poll_fn(|cx| Pin::new(&mut peer.network).poll(cx)) + .map(|item| Ok::<_, ()>(item)) + .compat().poll().unwrap(); trace!(target: "sync", "-- Polling complete {}", peer.id()); // We poll `imported_blocks_stream`. diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index 7a8607daee..90f44418c7 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" [dependencies] futures = "0.3.1" -libp2p = { version = "0.13.2", default-features = false } +libp2p = { version = "0.14.0-alpha.1", default-features = false } log = "0.4.8" serde_json = "1.0.41" diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index dc1966f0ac..e4d6419e30 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -27,7 +27,7 @@ pub mod error; mod builder; mod status_sinks; -use std::io; +use std::{io, pin::Pin}; use std::marker::PhantomData; use std::net::SocketAddr; use std::collections::HashMap; @@ -479,7 +479,9 @@ fn build_network_future< }); // Main network polling. - if let Ok(Async::Ready(())) = network.poll().map_err(|err| { + let mut net_poll = futures03::future::poll_fn(|cx| futures03::future::Future::poll(Pin::new(&mut network), cx)) + .compat(); + if let Ok(Async::Ready(())) = net_poll.poll().map_err(|err| { warn!(target: "service", "Error in network: {:?}", err); }) { return Ok(Async::Ready(())); diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 6163e90581..c536b7599b 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -6,18 +6,17 @@ description = "Telemetry utils" edition = "2018" [dependencies] -bytes = "0.4.12" +bytes = "0.5" parking_lot = "0.9.0" -futures01 = { package = "futures", version = "0.1" } -futures = { version = "0.3.1", features = ["compat"] } +futures = "0.3.1" futures-timer = "2.0.0" -libp2p = { version = "0.13.2", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } log = "0.4.8" +pin-project = "0.4.6" rand = "0.7.2" serde = { version = "1.0.101", features = ["derive"] } slog = { version = "2.5.2", features = ["nested-values"] } slog-json = { version = "2.3.0", features = ["nested-values"] } slog-scope = "4.1.2" -tokio-io = "0.1.12" take_mut = "0.2.2" void = "1.0.2" diff --git a/client/telemetry/src/lib.rs b/client/telemetry/src/lib.rs index 775e56ceb5..906df545e2 100644 --- a/client/telemetry/src/lib.rs +++ b/client/telemetry/src/lib.rs @@ -60,11 +60,12 @@ use futures::{prelude::*, channel::mpsc}; use libp2p::{Multiaddr, wasm_ext}; -use log::warn; +use log::{error, warn}; use parking_lot::Mutex; use serde::{Serialize, Deserialize}; use std::{pin::Pin, sync::Arc, task::{Context, Poll}, time::{Duration, Instant}}; +pub use libp2p::wasm_ext::ExtTransport; pub use slog_scope::with_logger; pub use slog; @@ -129,8 +130,8 @@ pub struct Telemetry { /// where we extract the telemetry registration so that it continues running during the shutdown /// process. struct TelemetryInner { - /// Worker for the telemetry. - worker: worker::TelemetryWorker, + /// Worker for the telemetry. `None` if it failed to initialize. + worker: Option, /// Receives log entries for them to be dispatched to the worker. receiver: mpsc::Receiver, } @@ -162,9 +163,17 @@ pub fn init_telemetry(config: TelemetryConfig) -> Telemetry { slog_scope::set_global_logger(root) }; + let worker = match worker::TelemetryWorker::new(endpoints, config.wasm_external_transport) { + Ok(w) => Some(w), + Err(err) => { + error!(target: "telemetry", "Failed to initialize telemetry worker: {:?}", err); + None + } + }; + Telemetry { inner: Arc::new(Mutex::new(TelemetryInner { - worker: worker::TelemetryWorker::new(endpoints, config.wasm_external_transport), + worker, receiver, })), _guard: Arc::new(guard), @@ -209,15 +218,19 @@ impl Stream for Telemetry { // The polling pattern is: poll the worker so that it processes its queue, then add one // message from the receiver (if possible), then poll the worker again, and so on. loop { - while let Poll::Ready(event) = inner.worker.poll(cx) { - // 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; + if let Some(worker) = inner.worker.as_mut() { + while let Poll::Ready(event) = worker.poll(cx) { + // 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; + } } if let Poll::Ready(Some(log_entry)) = Stream::poll_next(Pin::new(&mut inner.receiver), cx) { - log_entry.as_record_values(|rec, val| { let _ = inner.worker.log(rec, val); }); + if let Some(worker) = inner.worker.as_mut() { + log_entry.as_record_values(|rec, val| { let _ = worker.log(rec, val); }); + } } else { break; } diff --git a/client/telemetry/src/worker.rs b/client/telemetry/src/worker.rs index dc7277f74a..8f43bb612a 100644 --- a/client/telemetry/src/worker.rs +++ b/client/telemetry/src/worker.rs @@ -27,8 +27,8 @@ //! use bytes::BytesMut; -use futures::compat::Compat01As03Sink; -use libp2p::{core::transport::OptionalTransport, core::ConnectedPoint, Multiaddr, Transport, wasm_ext}; +use futures::{prelude::*, ready}; +use libp2p::{core::transport::OptionalTransport, Multiaddr, Transport, wasm_ext}; use log::{trace, warn, error}; use slog::Drain; use std::{io, pin::Pin, task::Context, task::Poll, time}; @@ -54,33 +54,16 @@ pub struct TelemetryWorker { 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::map::Map< - libp2p::core::transport::OrTransport< - libp2p::core::transport::map::Map< - OptionalTransport, - fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink - >, - libp2p::websocket::framed::WsConfig> - >, - fn(libp2p::core::either::EitherOutput, - libp2p::websocket::framed::BytesConnection>, ConnectedPoint) - -> Compat01As03Sink, - libp2p::websocket::framed::BytesConnection>, BytesMut> - > ->; -#[cfg(target_os = "unknown")] -type WsTrans = libp2p::core::transport::timeout::TransportTimeout< - libp2p::core::transport::map::Map< - libp2p::core::transport::map::Map< - OptionalTransport, - fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink - >, - fn(StreamSink, ConnectedPoint) - -> Compat01As03Sink, BytesMut> - > +trait StreamAndSink: Stream + Sink {} +impl, I> StreamAndSink for T {} + +type WsTrans = libp2p::core::transport::boxed::Boxed< + Pin, + Error = io::Error + > + Send>>, + io::Error >; impl TelemetryWorker { @@ -92,31 +75,48 @@ impl TelemetryWorker { pub fn new( endpoints: impl IntoIterator, wasm_external_transport: impl Into> - ) -> Self { + ) -> Result { let transport = match wasm_external_transport.into() { Some(t) => OptionalTransport::some(t), None => OptionalTransport::none() - }.map((|inner, _| StreamSink(inner)) as fn(_, _) -> _); + }.map((|inner, _| StreamSink::from(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()); + let inner = libp2p::dns::DnsConfig::new(libp2p::tcp::TcpConfig::new())?; libp2p::websocket::framed::WsConfig::new(inner) + .and_then(|connec, _| { + let connec = connec + .with(|item: BytesMut| { + let item = libp2p::websocket::framed::OutgoingData::Binary(item); + future::ready(Ok::<_, io::Error>(item)) + }) + .try_filter(|item| future::ready(item.is_data())) + .map_ok(|data| BytesMut::from(data.as_ref())); + future::ready(Ok::<_, io::Error>(connec)) + }) }); let transport = transport - .map((|inner, _| Compat01As03Sink::new(inner)) as fn(_, _) -> _) - .timeout(CONNECT_TIMEOUT); + .timeout(CONNECT_TIMEOUT) + .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) + .map(|out, _| { + let out = out + .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) + .sink_map_err(|err| io::Error::new(io::ErrorKind::Other, err)); + Box::pin(out) as Pin> + }) + .boxed(); - TelemetryWorker { + Ok(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. @@ -174,7 +174,7 @@ impl TelemetryWorker { } // `send_message` returns an error if we're not connected, which we silently ignore. - let _ = node.send_message(serialized.clone()); + let _ = node.send_message(&serialized.clone()[..]); } Ok(()) @@ -186,50 +186,74 @@ impl TelemetryWorker { /// /// 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); +#[pin_project::pin_project] +struct StreamSink(#[pin] T, Option); -impl futures01::Stream for StreamSink { - type Item = BytesMut; - type Error = io::Error; +impl From for StreamSink { + fn from(inner: T) -> StreamSink { + StreamSink(inner, None) + } +} - fn poll(&mut self) -> futures01::Poll, Self::Error> { +impl Stream for StreamSink { + type Item = Result; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + let this = self.project(); let mut buf = [0; 128]; - Ok(self.0.poll_read(&mut buf)? - .map(|n| - if n == 0 { - None - } else { - let buf: BytesMut = buf[..n].into(); - Some(buf) - } - )) + match ready!(AsyncRead::poll_read(this.0, cx, &mut buf)) { + Ok(0) => Poll::Ready(None), + Ok(n) => { + let buf: BytesMut = buf[..n].into(); + Poll::Ready(Some(Ok(buf))) + }, + Err(err) => Poll::Ready(Some(Err(err))), + } } } -impl futures01::Sink for StreamSink { - type SinkItem = BytesMut; - type SinkError = io::Error; +impl StreamSink { + fn poll_flush_buffer(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + let this = self.project(); - fn start_send(&mut self, item: Self::SinkItem) - -> Result, io::Error> { - match self.0.write(&item[..]) { - Ok(n) if n == item.len() => Ok(futures01::AsyncSink::Ready), - Ok(_) => { + if let Some(buffer) = this.1 { + if ready!(this.0.poll_write(cx, &buffer[..]))? != buffer.len() { 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(futures01::AsyncSink::NotReady(item)), - Err(err) => Err(err), + let err = io::Error::new(io::ErrorKind::Other, "Internal buffering detected"); + return Poll::Ready(Err(err)); + } } + + *this.1 = None; + Poll::Ready(Ok(())) } +} - fn poll_complete(&mut self) -> futures01::Poll<(), io::Error> { - match self.0.flush() { - Ok(()) => Ok(futures01::Async::Ready(())), - Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Ok(futures01::Async::NotReady), - Err(err) => Err(err), - } +impl Sink for StreamSink { + type Error = io::Error; + + fn poll_ready(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + ready!(StreamSink::poll_flush_buffer(self, cx))?; + Poll::Ready(Ok(())) + } + + fn start_send(self: Pin<&mut Self>, item: BytesMut) -> Result<(), Self::Error> { + let this = self.project(); + debug_assert!(this.1.is_none()); + *this.1 = Some(item); + Ok(()) + } + + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + ready!(self.as_mut().poll_flush_buffer(cx))?; + let this = self.project(); + AsyncWrite::poll_flush(this.0, cx) + } + + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + ready!(self.as_mut().poll_flush_buffer(cx))?; + let this = self.project(); + AsyncWrite::poll_close(this.0, cx) } } diff --git a/client/telemetry/src/worker/node.rs b/client/telemetry/src/worker/node.rs index 4f62892d93..58e9f20bd5 100644 --- a/client/telemetry/src/worker/node.rs +++ b/client/telemetry/src/worker/node.rs @@ -17,7 +17,7 @@ //! Contains the `Node` struct, which handles communications with a single telemetry endpoint. use bytes::BytesMut; -use futures::{prelude::*, compat::{Future01CompatExt as _, Compat01As03}}; +use futures::prelude::*; use futures_timer::Delay; use libp2p::Multiaddr; use libp2p::core::transport::Transport; @@ -42,7 +42,7 @@ enum NodeSocket { /// We're connected to the node. This is the normal state. Connected(NodeSocketConnected), /// We are currently dialing the node. - Dialing(Compat01As03), + Dialing(TTrans::Dial), /// A new connection should be started as soon as possible. ReconnectNow, /// Waiting before attempting to dial again. @@ -76,6 +76,9 @@ pub enum NodeEvent { pub enum ConnectionError { /// The connection timed-out. Timeout, + /// Reading from the socket returned and end-of-file, indicating that the socket has been + /// closed. + Closed, /// The sink errored. Sink(TSinkErr), } @@ -106,7 +109,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, /// 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<(), ()> { + pub fn send_message(&mut self, payload: impl Into) -> 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); @@ -163,7 +166,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, NodeSocket::ReconnectNow => match self.transport.clone().dial(self.addr.clone()) { Ok(d) => { debug!(target: "telemetry", "Started dialing {}", self.addr); - socket = NodeSocket::Dialing(d.compat()); + socket = NodeSocket::Dialing(d); } Err(err) => { warn!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); @@ -212,10 +215,13 @@ where TTrans::Output: Sink ) -> Poll>> { while let Some(item) = self.pending.pop_front() { - if let Poll::Ready(_) = Sink::poll_ready(Pin::new(&mut self.sink), cx) { + if let Poll::Ready(result) = Sink::poll_ready(Pin::new(&mut self.sink), cx) { + if let Err(err) = result { + return Poll::Ready(Err(ConnectionError::Sink(err))) + } + let item_len = item.len(); if let Err(err) = Sink::start_send(Pin::new(&mut self.sink), item) { - self.timeout = None; return Poll::Ready(Err(ConnectionError::Sink(err))) } trace!( @@ -270,7 +276,10 @@ where TTrans::Output: Sink Poll::Ready(Some(Err(err))) => { return Poll::Ready(Err(ConnectionError::Sink(err))) }, - Poll::Pending | Poll::Ready(None) => {}, + Poll::Ready(None) => { + return Poll::Ready(Err(ConnectionError::Closed)) + }, + Poll::Pending => {}, } Poll::Pending diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index c781ce2100..d767cd2ca4 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] derive_more = "0.99.2" -libp2p = { version = "0.13.2", default-features = false } +libp2p = { version = "0.14.0-alpha.1", default-features = false } log = "0.4.8" sp-core = { path= "../../core" } sp-inherents = { version = "2.0.0", path = "../../inherents" } diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index c7703474b7..b58774075b 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" futures = "0.3" futures01 = { package = "futures", version = "0.1.29" } log = "0.4.8" -libp2p = { version = "0.13.2", default-features = false } +libp2p = { version = "0.14.0-alpha.1", default-features = false } console_error_panic_hook = "0.1.6" console_log = "0.1.2" js-sys = "0.3.34" -- GitLab From d4e3ed7139b6361b9edcd1bc4e0381206e154dce Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 9 Jan 2020 19:23:51 +0100 Subject: [PATCH 081/296] Enabled wasmtime (#4569) --- bin/node/cli/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index a2b2195404..1f7c90bc3a 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -105,7 +105,7 @@ structopt = "=0.3.7" vergen = "3.0.4" [features] -default = ["cli"] +default = ["cli", "wasmtime"] browser = [ "browser-utils", "wasm-bindgen", -- GitLab From 860b79b2bd05815401f807409f2c0be14688e332 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 9 Jan 2020 19:24:51 +0100 Subject: [PATCH 082/296] Clean-ups in the network-gossip crate (#4542) * Remove usage of sc_network::Context trait * Remove Context::send_consensus * Pass &mut dyn Network instead of &dyn Network * Move Validator traits and related to separate module --- client/network-gossip/src/bridge.rs | 78 ++-------- client/network-gossip/src/lib.rs | 6 +- client/network-gossip/src/state_machine.rs | 173 +++++---------------- client/network-gossip/src/validator.rs | 103 ++++++++++++ client/network/src/protocol.rs | 34 ---- 5 files changed, 159 insertions(+), 235 deletions(-) create mode 100644 client/network-gossip/src/validator.rs diff --git a/client/network-gossip/src/bridge.rs b/client/network-gossip/src/bridge.rs index 7eeb33131d..2b0b19b876 100644 --- a/client/network-gossip/src/bridge.rs +++ b/client/network-gossip/src/bridge.rs @@ -14,10 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::Network; -use crate::state_machine::{ConsensusGossip, Validator, TopicNotification}; +use crate::{Network, Validator}; +use crate::state_machine::{ConsensusGossip, TopicNotification}; -use sc_network::Context; use sc_network::message::generic::ConsensusMessage; use sc_network::{Event, ReputationChange}; @@ -36,37 +35,29 @@ pub struct GossipEngine { struct GossipEngineInner { state_machine: ConsensusGossip, - context: Box + Send>, - context_ext: Box + Send>, + network: Box + Send>, } impl GossipEngine { /// Create a new instance. pub fn new + Send + Clone + 'static>( - network: N, + mut network: N, executor: &impl futures::task::Spawn, engine_id: ConsensusEngineId, validator: Arc>, ) -> Self where B: 'static { let mut state_machine = ConsensusGossip::new(); - let mut context = Box::new(ContextOverService { - network: network.clone(), - }); - let context_ext = Box::new(ContextOverService { - network: network.clone(), - }); // We grab the event stream before registering the notifications protocol, otherwise we // might miss events. let event_stream = network.event_stream(); network.register_notifications_protocol(engine_id); - state_machine.register_validator(&mut *context, engine_id, validator); + state_machine.register_validator(&mut network, engine_id, validator); let inner = Arc::new(Mutex::new(GossipEngineInner { state_machine, - context, - context_ext, + network: Box::new(network), })); let gossip_engine = GossipEngine { @@ -82,7 +73,7 @@ impl GossipEngine { if let Some(inner) = inner.upgrade() { let mut inner = inner.lock(); let inner = &mut *inner; - inner.state_machine.tick(&mut *inner.context); + inner.state_machine.tick(&mut *inner.network); } else { // We reach this branch if the `Arc` has no reference // left. We can now let the task end. @@ -107,7 +98,7 @@ impl GossipEngine { } let mut inner = inner.lock(); let inner = &mut *inner; - inner.state_machine.new_peer(&mut *inner.context, remote, roles); + inner.state_machine.new_peer(&mut *inner.network, remote, roles); } Event::NotificationsStreamClosed { remote, engine_id: msg_engine_id } => { if msg_engine_id != engine_id { @@ -115,13 +106,13 @@ impl GossipEngine { } let mut inner = inner.lock(); let inner = &mut *inner; - inner.state_machine.peer_disconnected(&mut *inner.context, remote); + inner.state_machine.peer_disconnected(&mut *inner.network, remote); }, Event::NotificationsReceived { remote, messages } => { let mut inner = inner.lock(); let inner = &mut *inner; inner.state_machine.on_incoming( - &mut *inner.context, + &mut *inner.network, remote, messages.into_iter() .filter_map(|(engine, data)| if engine == engine_id { @@ -144,7 +135,7 @@ impl GossipEngine { } pub fn report(&self, who: PeerId, reputation: ReputationChange) { - self.inner.lock().context.report_peer(who, reputation); + self.inner.lock().network.report_peer(who, reputation); } /// Registers a message without propagating it to any peers. The message @@ -169,7 +160,7 @@ impl GossipEngine { pub fn broadcast_topic(&self, topic: B::Hash, force: bool) { let mut inner = self.inner.lock(); let inner = &mut *inner; - inner.state_machine.broadcast_topic(&mut *inner.context, topic, force); + inner.state_machine.broadcast_topic(&mut *inner.network, topic, force); } /// Get data of valid, incoming messages for a topic (but might have expired meanwhile). @@ -188,7 +179,7 @@ impl GossipEngine { ) { let mut inner = self.inner.lock(); let inner = &mut *inner; - inner.state_machine.send_topic(&mut *inner.context, who, topic, self.engine_id, force) + inner.state_machine.send_topic(&mut *inner.network, who, topic, self.engine_id, force) } /// Multicast a message to all peers. @@ -205,7 +196,7 @@ impl GossipEngine { let mut inner = self.inner.lock(); let inner = &mut *inner; - inner.state_machine.multicast(&mut *inner.context, topic, message, force) + inner.state_machine.multicast(&mut *inner.network, topic, message, force) } /// Send addressed message to the given peers. The message is not kept or multicast @@ -215,7 +206,7 @@ impl GossipEngine { let inner = &mut *inner; for who in &who { - inner.state_machine.send_message(&mut *inner.context, who, ConsensusMessage { + inner.state_machine.send_message(&mut *inner.network, who, ConsensusMessage { engine_id: self.engine_id, data: data.clone(), }); @@ -227,7 +218,7 @@ impl GossipEngine { /// Note: this method isn't strictly related to gossiping and should eventually be moved /// somewhere else. pub fn announce(&self, block: B::Hash, associated_data: Vec) { - self.inner.lock().context_ext.announce(block, associated_data); + self.inner.lock().network.announce(block, associated_data); } } @@ -239,40 +230,3 @@ impl Clone for GossipEngine { } } } - -struct ContextOverService { - network: N, -} - -impl> Context for ContextOverService { - fn report_peer(&mut self, who: PeerId, reputation: ReputationChange) { - self.network.report_peer(who, reputation); - } - - fn disconnect_peer(&mut self, who: PeerId) { - self.network.disconnect_peer(who) - } - - fn send_consensus(&mut self, who: PeerId, messages: Vec) { - for message in messages { - self.network.write_notification(who.clone(), message.engine_id, message.data); - } - } - - fn send_chain_specific(&mut self, _: PeerId, _: Vec) { - log::error!( - target: "sub-libp2p", - "send_chain_specific has been called in a context where it shouldn't" - ); - } -} - -trait ContextExt { - fn announce(&self, block: B::Hash, associated_data: Vec); -} - -impl> ContextExt for ContextOverService { - fn announce(&self, block: B::Hash, associated_data: Vec) { - Network::announce(&self.network, block, associated_data) - } -} diff --git a/client/network-gossip/src/lib.rs b/client/network-gossip/src/lib.rs index f7b360f939..705a27210a 100644 --- a/client/network-gossip/src/lib.rs +++ b/client/network-gossip/src/lib.rs @@ -55,9 +55,8 @@ //! used to inform peers of a current view of protocol state. pub use self::bridge::GossipEngine; -pub use self::state_machine::{TopicNotification, MessageIntent}; -pub use self::state_machine::{Validator, ValidatorContext, ValidationResult}; -pub use self::state_machine::DiscardAll; +pub use self::state_machine::TopicNotification; +pub use self::validator::{DiscardAll, MessageIntent, Validator, ValidatorContext, ValidationResult}; use futures::prelude::*; use sc_network::{specialization::NetworkSpecialization, Event, ExHashT, NetworkService, PeerId, ReputationChange}; @@ -66,6 +65,7 @@ use std::sync::Arc; mod bridge; mod state_machine; +mod validator; /// Abstraction over a network. pub trait Network { diff --git a/client/network-gossip/src/state_machine.rs b/client/network-gossip/src/state_machine.rs index 3e54e452db..d1931b1bd2 100644 --- a/client/network-gossip/src/state_machine.rs +++ b/client/network-gossip/src/state_machine.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use crate::{Network, MessageIntent, Validator, ValidatorContext, ValidationResult}; + use std::collections::{HashMap, HashSet, hash_map::Entry}; use std::sync::Arc; use std::iter; @@ -25,7 +27,6 @@ use libp2p::PeerId; use sp_runtime::traits::{Block as BlockT, Hash, HashFor}; use sp_runtime::ConsensusEngineId; pub use sc_network::message::generic::{Message, ConsensusMessage}; -use sc_network::Context; use sc_network::config::Roles; // FIXME: Add additional spam/DoS attack protection: https://github.com/paritytech/substrate/issues/1115 @@ -67,62 +68,23 @@ struct MessageEntry { sender: Option, } -/// The reason for sending out the message. -#[derive(Eq, PartialEq, Copy, Clone)] -#[cfg_attr(test, derive(Debug))] -pub enum MessageIntent { - /// Requested broadcast. - Broadcast, - /// Requested broadcast to all peers. - ForcedBroadcast, - /// Periodic rebroadcast of all messages to all peers. - PeriodicRebroadcast, -} - -/// Message validation result. -pub enum ValidationResult { - /// Message should be stored and propagated under given topic. - ProcessAndKeep(H), - /// Message should be processed, but not propagated. - ProcessAndDiscard(H), - /// Message should be ignored. - Discard, -} - -impl MessageIntent { - fn broadcast() -> MessageIntent { - MessageIntent::Broadcast - } -} - -/// Validation context. Allows reacting to incoming messages by sending out further messages. -pub trait ValidatorContext { - /// Broadcast all messages with given topic to peers that do not have it yet. - fn broadcast_topic(&mut self, topic: B::Hash, force: bool); - /// Broadcast a message to all peers that have not received it previously. - fn broadcast_message(&mut self, topic: B::Hash, message: Vec, force: bool); - /// Send addressed message to a peer. - fn send_message(&mut self, who: &PeerId, message: Vec); - /// Send all messages with given topic to a peer. - fn send_topic(&mut self, who: &PeerId, topic: B::Hash, force: bool); -} - +/// Local implementation of `ValidatorContext`. struct NetworkContext<'g, 'p, B: BlockT> { gossip: &'g mut ConsensusGossip, - protocol: &'p mut dyn Context, + network: &'p mut dyn Network, engine_id: ConsensusEngineId, } impl<'g, 'p, B: BlockT> ValidatorContext for NetworkContext<'g, 'p, B> { /// Broadcast all messages with given topic to peers that do not have it yet. fn broadcast_topic(&mut self, topic: B::Hash, force: bool) { - self.gossip.broadcast_topic(self.protocol, topic, force); + self.gossip.broadcast_topic(self.network, topic, force); } /// Broadcast a message to all peers that have not received it previously. fn broadcast_message(&mut self, topic: B::Hash, message: Vec, force: bool) { self.gossip.multicast( - self.protocol, + self.network, topic, ConsensusMessage{ data: message, engine_id: self.engine_id.clone() }, force, @@ -131,20 +93,17 @@ impl<'g, 'p, B: BlockT> ValidatorContext for NetworkContext<'g, 'p, B> { /// Send addressed message to a peer. fn send_message(&mut self, who: &PeerId, message: Vec) { - self.protocol.send_consensus(who.clone(), vec![ConsensusMessage { - engine_id: self.engine_id, - data: message, - }]); + self.network.write_notification(who.clone(), self.engine_id, message); } /// Send all messages with given topic to a peer. fn send_topic(&mut self, who: &PeerId, topic: B::Hash, force: bool) { - self.gossip.send_topic(self.protocol, who, topic, self.engine_id, force); + self.gossip.send_topic(self.network, who, topic, self.engine_id, force); } } fn propagate<'a, B: BlockT, I>( - protocol: &mut dyn Context, + network: &mut dyn Network, messages: I, intent: MessageIntent, peers: &mut HashMap>, @@ -168,7 +127,6 @@ fn propagate<'a, B: BlockT, I>( }; for (id, ref mut peer) in peers.iter_mut() { - let mut batch = Vec::new(); for (message_hash, topic, message) in messages.clone() { let intent = match intent { MessageIntent::Broadcast { .. } => @@ -195,38 +153,8 @@ fn propagate<'a, B: BlockT, I>( peer.known_messages.insert(message_hash.clone()); trace!(target: "gossip", "Propagating to {}: {:?}", id, message); - batch.push(message.clone()) + network.write_notification(id.clone(), message.engine_id, message.data.clone()); } - protocol.send_consensus(id.clone(), batch); - } -} - -/// Validates consensus messages. -pub trait Validator: Send + Sync { - /// New peer is connected. - fn new_peer(&self, _context: &mut dyn ValidatorContext, _who: &PeerId, _roles: Roles) { - } - - /// New connection is dropped. - fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, _who: &PeerId) { - } - - /// Validate consensus message. - 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> { - Box::new(move |_topic, _data| false) - } - - /// Produce a closure for filtering egress messages. - fn message_allowed<'a>(&'a self) -> Box bool + 'a> { - Box::new(move |_who, _intent, _topic, _data| true) } } @@ -256,14 +184,14 @@ impl ConsensusGossip { /// Register message validator for a message type. pub fn register_validator( &mut self, - protocol: &mut dyn Context, + network: &mut dyn Network, 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 { - let mut context = NetworkContext { gossip: self, protocol, engine_id: engine_id.clone() }; + let mut context = NetworkContext { gossip: self, network, engine_id: engine_id.clone() }; validator.new_peer(&mut context, &id, roles); } } @@ -273,7 +201,7 @@ impl ConsensusGossip { } /// Handle new connected peer. - pub fn new_peer(&mut self, protocol: &mut dyn Context, who: PeerId, roles: Roles) { + pub fn new_peer(&mut self, network: &mut dyn Network, who: PeerId, roles: Roles) { // light nodes are not valid targets for consensus gossip messages if !roles.is_full() { return; @@ -285,7 +213,7 @@ impl ConsensusGossip { roles, }); for (engine_id, v) in self.validators.clone() { - let mut context = NetworkContext { gossip: self, protocol, engine_id: engine_id.clone() }; + let mut context = NetworkContext { gossip: self, network, engine_id: engine_id.clone() }; v.new_peer(&mut context, &who, roles); } } @@ -322,37 +250,37 @@ impl ConsensusGossip { } /// Call when a peer has been disconnected to stop tracking gossip status. - pub fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) { + pub fn peer_disconnected(&mut self, network: &mut dyn Network, who: PeerId) { for (engine_id, v) in self.validators.clone() { - let mut context = NetworkContext { gossip: self, protocol, engine_id: engine_id.clone() }; + let mut context = NetworkContext { gossip: self, network, engine_id: engine_id.clone() }; v.peer_disconnected(&mut context, &who); } } /// Perform periodic maintenance - pub fn tick(&mut self, protocol: &mut dyn Context) { + pub fn tick(&mut self, network: &mut dyn Network) { self.collect_garbage(); if time::Instant::now() >= self.next_broadcast { - self.rebroadcast(protocol); + self.rebroadcast(network); self.next_broadcast = time::Instant::now() + REBROADCAST_INTERVAL; } } /// Rebroadcast all messages to all peers. - fn rebroadcast(&mut self, protocol: &mut dyn Context) { + fn rebroadcast(&mut self, network: &mut dyn Network) { let messages = self.messages.iter() .map(|entry| (&entry.message_hash, &entry.topic, &entry.message)); - propagate(protocol, messages, MessageIntent::PeriodicRebroadcast, &mut self.peers, &self.validators); + propagate(network, messages, MessageIntent::PeriodicRebroadcast, &mut self.peers, &self.validators); } /// Broadcast all messages with given topic. - pub fn broadcast_topic(&mut self, protocol: &mut dyn Context, topic: B::Hash, force: bool) { + pub fn broadcast_topic(&mut self, network: &mut dyn Network, 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 } ); - let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::broadcast() }; - propagate(protocol, messages, intent, &mut self.peers, &self.validators); + let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::Broadcast }; + propagate(network, messages, intent, &mut self.peers, &self.validators); } /// Prune old or no longer relevant consensus messages. Provide a predicate @@ -420,7 +348,7 @@ impl ConsensusGossip { /// in all other cases. pub fn on_incoming( &mut self, - protocol: &mut dyn Context, + network: &mut dyn Network, who: PeerId, messages: Vec, ) { @@ -430,7 +358,7 @@ impl ConsensusGossip { if self.known_messages.contains(&message_hash) { trace!(target:"gossip", "Ignored already known message from {}", who); - protocol.report_peer(who.clone(), rep::DUPLICATE_GOSSIP); + network.report_peer(who.clone(), rep::DUPLICATE_GOSSIP); continue; } @@ -439,7 +367,7 @@ impl ConsensusGossip { let validation = self.validators.get(&engine_id) .cloned() .map(|v| { - let mut context = NetworkContext { gossip: self, protocol, engine_id }; + let mut context = NetworkContext { gossip: self, network, engine_id }; v.validate(&mut context, &who, &message.data) }); @@ -449,14 +377,14 @@ impl ConsensusGossip { Some(ValidationResult::Discard) => None, None => { trace!(target:"gossip", "Unknown message engine id {:?} from {}", engine_id, who); - protocol.report_peer(who.clone(), rep::UNKNOWN_GOSSIP); - protocol.disconnect_peer(who.clone()); + network.report_peer(who.clone(), rep::UNKNOWN_GOSSIP); + network.disconnect_peer(who.clone()); continue; } }; if let Some((topic, keep)) = validation_result { - protocol.report_peer(who.clone(), rep::GOSSIP_SUCCESS); + network.report_peer(who.clone(), rep::GOSSIP_SUCCESS); if let Some(ref mut peer) = self.peers.get_mut(&who) { peer.known_messages.insert(message_hash); if let Entry::Occupied(mut entry) = self.live_message_sinks.entry((engine_id, topic)) { @@ -479,7 +407,7 @@ impl ConsensusGossip { } } else { trace!(target:"gossip", "Ignored statement from unregistered peer {}", who); - protocol.report_peer(who.clone(), rep::UNREGISTERED_TOPIC); + network.report_peer(who.clone(), rep::UNREGISTERED_TOPIC); } } else { trace!(target:"gossip", "Handled valid one hop message from peer {}", who); @@ -490,7 +418,7 @@ impl ConsensusGossip { /// Send all messages with given topic to a peer. pub fn send_topic( &mut self, - protocol: &mut dyn Context, + network: &mut dyn Network, who: &PeerId, topic: B::Hash, engine_id: ConsensusEngineId, @@ -503,7 +431,6 @@ impl ConsensusGossip { }; if let Some(ref mut peer) = self.peers.get_mut(who) { - let mut batch = Vec::new(); for entry in self.messages.iter().filter(|m| m.topic == topic && m.message.engine_id == engine_id) { let intent = if force { MessageIntent::ForcedBroadcast @@ -522,34 +449,30 @@ impl ConsensusGossip { peer.known_messages.insert(entry.message_hash.clone()); trace!(target: "gossip", "Sending topic message to {}: {:?}", who, entry.message); - batch.push(ConsensusMessage { - engine_id: engine_id.clone(), - data: entry.message.data.clone(), - }); + network.write_notification(who.clone(), engine_id, entry.message.data.clone()); } - protocol.send_consensus(who.clone(), batch); } } /// Multicast a message to all peers. pub fn multicast( &mut self, - protocol: &mut dyn Context, + network: &mut dyn Network, topic: B::Hash, message: ConsensusMessage, force: bool, ) { let message_hash = HashFor::::hash(&message.data); self.register_message_hashed(message_hash, topic, message.clone(), None); - let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::broadcast() }; - propagate(protocol, iter::once((&message_hash, &topic, &message)), intent, &mut self.peers, &self.validators); + let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::Broadcast }; + propagate(network, iter::once((&message_hash, &topic, &message)), intent, &mut self.peers, &self.validators); } /// Send addressed message to a peer. The message is not kept or multicast /// later on. pub fn send_message( &mut self, - protocol: &mut dyn Context, + network: &mut dyn Network, who: &PeerId, message: ConsensusMessage, ) { @@ -563,29 +486,7 @@ impl ConsensusGossip { trace!(target: "gossip", "Sending direct to {}: {:?}", who, message); peer.known_messages.insert(message_hash); - protocol.send_consensus(who.clone(), vec![message.clone()]); - } -} - -/// A gossip message validator that discards all messages. -pub struct DiscardAll; - -impl Validator for DiscardAll { - fn validate( - &self, - _context: &mut dyn ValidatorContext, - _sender: &PeerId, - _data: &[u8], - ) -> ValidationResult { - ValidationResult::Discard - } - - fn message_expired<'a>(&'a self) -> Box bool + 'a> { - Box::new(move |_topic, _data| true) - } - - fn message_allowed<'a>(&'a self) -> Box bool + 'a> { - Box::new(move |_who, _intent, _topic, _data| false) + network.write_notification(who.clone(), message.engine_id, message.data); } } diff --git a/client/network-gossip/src/validator.rs b/client/network-gossip/src/validator.rs new file mode 100644 index 0000000000..74b5307ee9 --- /dev/null +++ b/client/network-gossip/src/validator.rs @@ -0,0 +1,103 @@ +// Copyright 2017-2020 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 sc_network::{config::Roles, PeerId}; +use sp_runtime::traits::Block as BlockT; + +/// Validates consensus messages. +pub trait Validator: Send + Sync { + /// New peer is connected. + fn new_peer(&self, _context: &mut dyn ValidatorContext, _who: &PeerId, _roles: Roles) { + } + + /// New connection is dropped. + fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, _who: &PeerId) { + } + + /// Validate consensus message. + 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> { + Box::new(move |_topic, _data| false) + } + + /// Produce a closure for filtering egress messages. + fn message_allowed<'a>(&'a self) -> Box bool + 'a> { + Box::new(move |_who, _intent, _topic, _data| true) + } +} + +/// Validation context. Allows reacting to incoming messages by sending out further messages. +pub trait ValidatorContext { + /// Broadcast all messages with given topic to peers that do not have it yet. + fn broadcast_topic(&mut self, topic: B::Hash, force: bool); + /// Broadcast a message to all peers that have not received it previously. + fn broadcast_message(&mut self, topic: B::Hash, message: Vec, force: bool); + /// Send addressed message to a peer. + fn send_message(&mut self, who: &PeerId, message: Vec); + /// Send all messages with given topic to a peer. + fn send_topic(&mut self, who: &PeerId, topic: B::Hash, force: bool); +} + +/// The reason for sending out the message. +#[derive(Eq, PartialEq, Copy, Clone)] +#[cfg_attr(test, derive(Debug))] +pub enum MessageIntent { + /// Requested broadcast. + Broadcast, + /// Requested broadcast to all peers. + ForcedBroadcast, + /// Periodic rebroadcast of all messages to all peers. + PeriodicRebroadcast, +} + +/// Message validation result. +pub enum ValidationResult { + /// Message should be stored and propagated under given topic. + ProcessAndKeep(H), + /// Message should be processed, but not propagated. + ProcessAndDiscard(H), + /// Message should be ignored. + Discard, +} + +/// A gossip message validator that discards all messages. +pub struct DiscardAll; + +impl Validator for DiscardAll { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + _data: &[u8], + ) -> ValidationResult { + ValidationResult::Discard + } + + fn message_expired<'a>(&'a self) -> Box bool + 'a> { + Box::new(move |_topic, _data| true) + } + + fn message_allowed<'a>(&'a self) -> Box bool + 'a> { + Box::new(move |_who, _intent, _topic, _data| false) + } +} diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 983cdd25a8..b712ebe515 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -80,8 +80,6 @@ pub(crate) const MIN_VERSION: u32 = 3; // Maximum allowed entries in `BlockResponse` const MAX_BLOCK_DATA_RESPONSE: u32 = 128; -// Maximum allowed entries in `ConsensusBatch` -const MAX_CONSENSUS_MESSAGES: usize = 256; /// When light node connects to the full node and the full node is behind light node /// for at least `LIGHT_MAXIMAL_BLOCKS_DIFFERENCE` blocks, we consider it unuseful /// and disconnect to free connection slot. @@ -327,9 +325,6 @@ pub trait Context { /// 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. - fn send_consensus(&mut self, who: PeerId, messages: Vec); - /// Send a chain-specific message to a peer. fn send_chain_specific(&mut self, who: PeerId, message: Vec); } @@ -360,35 +355,6 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, self.behaviour.disconnect_peer(&who) } - fn send_consensus(&mut self, who: PeerId, messages: Vec) { - if self.context_data.peers.get(&who).map_or(false, |peer| peer.info.protocol_version > 4) { - let mut batch = Vec::new(); - let len = messages.len(); - for (index, message) in messages.into_iter().enumerate() { - batch.reserve(MAX_CONSENSUS_MESSAGES); - batch.push(message); - if batch.len() == MAX_CONSENSUS_MESSAGES || index == len - 1 { - send_message:: ( - self.behaviour, - &mut self.context_data.stats, - &who, - GenericMessage::ConsensusBatch(std::mem::replace(&mut batch, Vec::new())), - ) - } - } - } else { - // Backwards compatibility - for message in messages { - send_message:: ( - self.behaviour, - &mut self.context_data.stats, - &who, - GenericMessage::Consensus(message) - ) - } - } - } - fn send_chain_specific(&mut self, who: PeerId, message: Vec) { send_message:: ( self.behaviour, -- GitLab From 01cec5b27e9a2a9143559bab96cd7a9b307b2385 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 10 Jan 2020 01:28:04 +0300 Subject: [PATCH 083/296] fix race in light_peer_imports_header_from_announce (#4579) --- client/api/src/light.rs | 8 +++--- client/db/src/light.rs | 47 +++++++++++++++++++++------------- client/src/cht.rs | 29 +++++++++++++++++++++ client/src/in_mem.rs | 6 +++-- client/src/light/blockchain.rs | 10 +++++--- client/src/light/fetcher.rs | 5 ++-- 6 files changed, 76 insertions(+), 29 deletions(-) diff --git a/client/api/src/light.rs b/client/api/src/light.rs index b3e2e686ea..fb3aeeab7c 100644 --- a/client/api/src/light.rs +++ b/client/api/src/light.rs @@ -259,19 +259,19 @@ pub trait Storage: AuxStore + HeaderBackend + HeaderMetada /// Get last finalized header. 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). + /// Get headers CHT root for given block. Returns None if the block is not pruned (not a part of any CHT). fn header_cht_root( &self, cht_size: NumberFor, block: NumberFor, - ) -> ClientResult; + ) -> ClientResult>; - /// Get changes trie CHT root for given block. Fails if the block is not pruned (not a part of any CHT). + /// Get changes trie CHT root for given block. Returns None if the block is not pruned (not a part of any CHT). fn changes_trie_cht_root( &self, cht_size: NumberFor, block: NumberFor, - ) -> ClientResult; + ) -> ClientResult>; /// Get storage cache. fn cache(&self) -> Option>>; diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 2885ee5046..f6f176ae79 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -365,14 +365,22 @@ impl LightStorage { cht_type: u8, cht_size: NumberFor, block: NumberFor - ) -> ClientResult { - let no_cht_for_block = || ClientError::Backend(format!("CHT for block {} not exists", block)); + ) -> ClientResult> { + let no_cht_for_block = || ClientError::Backend(format!("Missing CHT for block {}", block)); + let meta = self.meta.read(); + let max_cht_number = cht::max_cht_number(cht_size, meta.finalized_number); let cht_number = cht::block_to_cht_number(cht_size, block).ok_or_else(no_cht_for_block)?; + match max_cht_number { + Some(max_cht_number) if cht_number <= max_cht_number => (), + _ => return Ok(None), + } + let cht_start = cht::start_number(cht_size, cht_number); self.db.get(columns::CHT, &cht_key(cht_type, cht_start)?).map_err(db_err)? .ok_or_else(no_cht_for_block) .and_then(|hash| Block::Hash::decode(&mut &*hash).map_err(|_| no_cht_for_block())) + .map(Some) } } @@ -505,7 +513,7 @@ impl LightBlockchainStorage for LightStorage &self, cht_size: NumberFor, block: NumberFor, - ) -> ClientResult { + ) -> ClientResult> { self.read_cht_root(HEADER_CHT_PREFIX, cht_size, block) } @@ -513,7 +521,7 @@ impl LightBlockchainStorage for LightStorage &self, cht_size: NumberFor, block: NumberFor, - ) -> ClientResult { + ) -> ClientResult> { self.read_cht_root(CHANGES_TRIE_CHT_PREFIX, cht_size, block) } @@ -763,20 +771,20 @@ pub(crate) mod tests { 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 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.header_cht_root(cht_size, cht_size / 2).unwrap().is_some()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).unwrap().is_none()); 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!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).unwrap().is_none()); // 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::CHT).count(), 2); 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()); + assert!(db.header_cht_root(cht_size, cht_size / 2).unwrap().is_some()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).unwrap().is_none()); + assert!(db.changes_trie_cht_root(cht_size, cht_size / 2).unwrap().is_some()); + assert!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).unwrap().is_none()); } #[test] @@ -787,7 +795,7 @@ pub(crate) mod tests { #[test] fn get_cht_fails_for_non_existant_cht() { let cht_size: u64 = cht::size(); - assert!(LightStorage::::new_test().header_cht_root(cht_size, cht_size / 2).is_err()); + assert!(LightStorage::::new_test().header_cht_root(cht_size, cht_size / 2).unwrap().is_none()); } #[test] @@ -803,15 +811,18 @@ pub(crate) mod tests { 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).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().unwrap(); + let cht_root_2 = db.header_cht_root(cht_size, cht::start_number(cht_size, 0) + cht_size / 2).unwrap().unwrap(); + let cht_root_3 = db.header_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap().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).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().unwrap(); + let cht_root_2 = db.changes_trie_cht_root( + cht_size, + cht::start_number(cht_size, 0) + cht_size / 2, + ).unwrap().unwrap(); + let cht_root_3 = db.changes_trie_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap().unwrap(); assert_eq!(cht_root_1, cht_root_2); assert_eq!(cht_root_2, cht_root_3); } diff --git a/client/src/cht.rs b/client/src/cht.rs index 86c2ca756b..7189360174 100644 --- a/client/src/cht.rs +++ b/client/src/cht.rs @@ -62,6 +62,19 @@ pub fn is_build_required(cht_size: N, block_num: N) -> Option Some(block_cht_num - two) } +/// Returns Some(max_cht_number) if CHT has ever been built given maximal canonical block number. +pub fn max_cht_number(cht_size: N, max_canonical_block: N) -> Option + where + N: Clone + SimpleArithmetic, +{ + let max_cht_number = block_to_cht_number(cht_size, max_canonical_block)?; + let two = N::one() + N::one(); + if max_cht_number < two { + return None; + } + Some(max_cht_number - two) +} + /// Compute a CHT root from an iterator of block hashes. Fails if shorter than /// SIZE items. The items are assumed to proceed sequentially from `start_number(cht_num)`. /// Discards the trie's nodes. @@ -329,8 +342,24 @@ mod tests { assert_eq!(is_build_required(SIZE, SIZE + 1), None); assert_eq!(is_build_required(SIZE, 2 * SIZE), None); assert_eq!(is_build_required(SIZE, 2 * SIZE + 1), Some(0)); + assert_eq!(is_build_required(SIZE, 2 * SIZE + 2), None); assert_eq!(is_build_required(SIZE, 3 * SIZE), None); assert_eq!(is_build_required(SIZE, 3 * SIZE + 1), Some(1)); + assert_eq!(is_build_required(SIZE, 3 * SIZE + 2), None); + } + + #[test] + fn max_cht_number_works() { + assert_eq!(max_cht_number(SIZE, 0u32.into()), None); + assert_eq!(max_cht_number(SIZE, 1u32.into()), None); + assert_eq!(max_cht_number(SIZE, SIZE), None); + assert_eq!(max_cht_number(SIZE, SIZE + 1), None); + assert_eq!(max_cht_number(SIZE, 2 * SIZE), None); + assert_eq!(max_cht_number(SIZE, 2 * SIZE + 1), Some(0)); + assert_eq!(max_cht_number(SIZE, 2 * SIZE + 2), Some(0)); + assert_eq!(max_cht_number(SIZE, 3 * SIZE), Some(0)); + assert_eq!(max_cht_number(SIZE, 3 * SIZE + 1), Some(1)); + assert_eq!(max_cht_number(SIZE, 3 * SIZE + 2), Some(1)); } #[test] diff --git a/client/src/in_mem.rs b/client/src/in_mem.rs index 5a54960aa6..a65084c17c 100644 --- a/client/src/in_mem.rs +++ b/client/src/in_mem.rs @@ -433,18 +433,20 @@ impl sc_client_api::light::Storage for Blockchain &self, _cht_size: NumberFor, block: NumberFor, - ) -> sp_blockchain::Result { + ) -> sp_blockchain::Result> { self.storage.read().header_cht_roots.get(&block).cloned() .ok_or_else(|| sp_blockchain::Error::Backend(format!("Header CHT for block {} not exists", block))) + .map(Some) } fn changes_trie_cht_root( &self, _cht_size: NumberFor, block: NumberFor, - ) -> sp_blockchain::Result { + ) -> sp_blockchain::Result> { self.storage.read().changes_trie_cht_roots.get(&block).cloned() .ok_or_else(|| sp_blockchain::Error::Backend(format!("Changes trie CHT for block {} not exists", block))) + .map(Some) } fn cache(&self) -> Option>> { diff --git a/client/src/light/blockchain.rs b/client/src/light/blockchain.rs index 1ea4987078..756147c941 100644 --- a/client/src/light/blockchain.rs +++ b/client/src/light/blockchain.rs @@ -164,7 +164,10 @@ impl RemoteBlockchain for Blockchain } Ok(LocalOrRemote::Remote(RemoteHeaderRequest { - cht_root: self.storage.header_cht_root(cht::size(), number)?, + cht_root: match self.storage.header_cht_root(cht::size(), number)? { + Some(cht_root) => cht_root, + None => return Ok(LocalOrRemote::Unknown), + }, block: number, retry_count: None, })) @@ -298,17 +301,18 @@ pub mod tests { Err(ClientError::Backend("Test error".into())) } - fn header_cht_root(&self, _cht_size: u64, _block: u64) -> ClientResult { + fn header_cht_root(&self, _cht_size: u64, _block: u64) -> ClientResult> { Err(ClientError::Backend("Test error".into())) } - fn changes_trie_cht_root(&self, cht_size: u64, block: u64) -> ClientResult { + fn changes_trie_cht_root(&self, cht_size: u64, block: u64) -> ClientResult> { cht::block_to_cht_number(cht_size, block) .and_then(|cht_num| self.changes_tries_cht_roots.get(&cht_num)) .cloned() .ok_or_else(|| ClientError::Backend( format!("Test error: CHT for block #{} not found", block) ).into()) + .map(Some) } fn cache(&self) -> Option>> { diff --git a/client/src/light/fetcher.rs b/client/src/light/fetcher.rs index df99897e6d..3dd0b344b8 100644 --- a/client/src/light/fetcher.rs +++ b/client/src/light/fetcher.rs @@ -153,7 +153,7 @@ impl> LightDataChecker { // all the checks are sharing the same storage let storage = create_proof_check_backend_storage(remote_roots_proof); - // we remote_roots.keys() are sorted => we can use this to group changes tries roots + // remote_roots.keys() are sorted => we can use this to group changes tries roots // that are belongs to the same CHT let blocks = remote_roots.keys().cloned(); cht::for_each_cht_group::(cht_size, blocks, |mut storage, _, cht_blocks| { @@ -162,7 +162,8 @@ impl> LightDataChecker { // when required header has been pruned (=> replaced with CHT) let first_block = cht_blocks.first().cloned() .expect("for_each_cht_group never calls callback with empty groups"); - let local_cht_root = self.blockchain.storage().changes_trie_cht_root(cht_size, first_block)?; + let local_cht_root = self.blockchain.storage().changes_trie_cht_root(cht_size, first_block)? + .ok_or(ClientError::InvalidCHTProof)?; // check changes trie root for every block within CHT range for block in cht_blocks { -- GitLab From dd72e2a057561d3e06532f3b677220e7e141f741 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Fri, 10 Jan 2020 00:09:23 +0100 Subject: [PATCH 084/296] Fix some entries in CODEOWNERS (#4584) --- docs/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 993a0cab93..bc4559805b 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -56,13 +56,13 @@ # NPoS and Governance /frame/staking/ @kianenigma -/frame/election/ @kianenigma +/frame/elections/ @kianenigma # End to end testing of substrate node /bin/node/executor/ @kianenigma # Transaction weight stuff -/primitives/runtime/src/weights.rs @kianenigma +/frame/support/src/weights.rs @kianenigma # Support crates /frame/support/ @thiolliere @kianenigma -- GitLab From f1cc6715149f867259d8d56ea9ca96a11902dfe9 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 10 Jan 2020 01:46:23 +0100 Subject: [PATCH 085/296] Introduce `OnReapAccount` (#4585) * Initial run and gun at `OnReapAccount` * Fix some imports * More fixes * Whitespace * More wack-a-mole * Gotta catch em all * Update lib.rs * Small doc update * Whitespace --- bin/node-template/runtime/src/lib.rs | 2 ++ bin/node/runtime/src/lib.rs | 1 + frame/balances/src/lib.rs | 18 ++++++++++++++++-- frame/balances/src/mock.rs | 1 + frame/contracts/src/tests.rs | 1 + frame/democracy/src/lib.rs | 1 + frame/elections-phragmen/src/lib.rs | 1 + frame/elections/src/mock.rs | 1 + frame/example/src/lib.rs | 2 ++ frame/executive/src/lib.rs | 1 + frame/identity/src/lib.rs | 2 ++ frame/nicks/src/lib.rs | 2 ++ frame/scored-pool/src/mock.rs | 6 +++++- frame/staking/src/mock.rs | 1 + frame/support/src/traits.rs | 9 ++++++++- frame/system/src/lib.rs | 9 ++++++++- frame/transaction-payment/src/lib.rs | 1 + frame/treasury/src/lib.rs | 1 + frame/utility/src/lib.rs | 2 ++ 19 files changed, 57 insertions(+), 5 deletions(-) diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 8580bfd895..0aaf319336 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -205,6 +205,8 @@ impl balances::Trait for Runtime { type Balance = Balance; /// What to do if an account's free balance gets zeroed. type OnFreeBalanceZero = (); + /// What to do if an account is fully reaped from the system. + type OnReapAccount = System; /// What to do if a new account is created. type OnNewAccount = Indices; /// The ubiquitous event type. diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index f83800944e..dba5c703b6 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -174,6 +174,7 @@ parameter_types! { impl pallet_balances::Trait for Runtime { type Balance = Balance; type OnFreeBalanceZero = ((Staking, Contracts), Session); + type OnReapAccount = System; type OnNewAccount = Indices; type Event = Event; type DustRemoval = (); diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 85e5894810..1f8e099880 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -165,7 +165,7 @@ use codec::{Codec, Encode, Decode}; use frame_support::{ StorageValue, Parameter, decl_event, decl_storage, decl_module, decl_error, traits::{ - UpdateBalanceOutcome, Currency, OnFreeBalanceZero, OnUnbalanced, TryDrop, + UpdateBalanceOutcome, Currency, OnFreeBalanceZero, OnReapAccount, OnUnbalanced, TryDrop, WithdrawReason, WithdrawReasons, LockIdentifier, LockableCurrency, ExistenceRequirement, Imbalance, SignedImbalance, ReservableCurrency, Get, VestingCurrency, }, @@ -198,6 +198,12 @@ pub trait Subtrait: frame_system::Trait { /// Gives a chance to clean up resources associated with the given account. type OnFreeBalanceZero: OnFreeBalanceZero; + /// A function that is invoked when the free-balance and the reserved-balance has fallen below + /// the existential deposit and both have been reduced to zero. + /// + /// All resources should be cleaned up all resources associated with the given account. + type OnReapAccount: OnReapAccount; + /// Handler for when a new account is created. type OnNewAccount: OnNewAccount; @@ -222,6 +228,12 @@ pub trait Trait: frame_system::Trait { /// Gives a chance to clean up resources associated with the given account. type OnFreeBalanceZero: OnFreeBalanceZero; + /// A function that is invoked when the free-balance and the reserved-balance has fallen below + /// the existential deposit and both have been reduced to zero. + /// + /// All resources should be cleaned up all resources associated with the given account. + type OnReapAccount: OnReapAccount; + /// Handler for when a new account is created. type OnNewAccount: OnNewAccount; @@ -248,6 +260,7 @@ pub trait Trait: frame_system::Trait { impl, I: Instance> Subtrait for T { type Balance = T::Balance; type OnFreeBalanceZero = T::OnFreeBalanceZero; + type OnReapAccount = T::OnReapAccount; type OnNewAccount = T::OnNewAccount; type ExistentialDeposit = T::ExistentialDeposit; type TransferFee = T::TransferFee; @@ -597,7 +610,7 @@ impl, I: Instance> Module { /// /// This just removes the nonce and leaves an event. fn reap_account(who: &T::AccountId, dust: T::Balance) { - >::remove(who); + T::OnReapAccount::on_reap_account(who); Self::deposit_event(RawEvent::ReapedAccount(who.clone(), dust)); } @@ -850,6 +863,7 @@ impl, I: Instance> frame_system::Trait for ElevatedTrait { impl, I: Instance> Trait for ElevatedTrait { type Balance = T::Balance; type OnFreeBalanceZero = T::OnFreeBalanceZero; + type OnReapAccount = T::OnReapAccount; type OnNewAccount = T::OnNewAccount; type Event = (); type TransferPayment = (); diff --git a/frame/balances/src/mock.rs b/frame/balances/src/mock.rs index c511b4db18..5a3d671e8d 100644 --- a/frame/balances/src/mock.rs +++ b/frame/balances/src/mock.rs @@ -93,6 +93,7 @@ impl pallet_transaction_payment::Trait for Test { impl Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type DustRemoval = (); diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index ca15898009..ebc7218cc1 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -122,6 +122,7 @@ impl frame_system::Trait for Test { impl pallet_balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = Contract; + type OnReapAccount = System; type OnNewAccount = (); type Event = MetaEvent; type DustRemoval = (); diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 3766aa2207..354e93cc29 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -1205,6 +1205,7 @@ mod tests { impl pallet_balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index e3243491b1..18b010295c 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -824,6 +824,7 @@ mod tests { type Balance = u64; type OnNewAccount = (); type OnFreeBalanceZero = (); + type OnReapAccount = System; type Event = Event; type TransferPayment = (); type DustRemoval = (); diff --git a/frame/elections/src/mock.rs b/frame/elections/src/mock.rs index 1226c0671c..178637e088 100644 --- a/frame/elections/src/mock.rs +++ b/frame/elections/src/mock.rs @@ -65,6 +65,7 @@ impl pallet_balances::Trait for Test { type Balance = u64; type OnNewAccount = (); type OnFreeBalanceZero = (); + type OnReapAccount = System; type Event = Event; type TransferPayment = (); type DustRemoval = (); diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index 1d694be27c..853674f6fd 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -695,6 +695,7 @@ mod tests { impl pallet_balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); @@ -706,6 +707,7 @@ mod tests { impl Trait for Test { type Event = (); } + type System = frame_system::Module; type Example = Module; // This function basically just builds a genesis storage key/value store according to diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 1ac67d05e2..a7dc021aea 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -425,6 +425,7 @@ mod tests { impl pallet_balances::Trait for Runtime { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = MetaEvent; type DustRemoval = (); diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 1b9b32b234..38aa3f9771 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -921,6 +921,7 @@ mod tests { impl pallet_balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); @@ -950,6 +951,7 @@ mod tests { type RegistrarOrigin = EnsureSignedBy; type ForceOrigin = EnsureSignedBy; } + type System = frame_system::Module; type Balances = pallet_balances::Module; type Identity = Module; diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index bee6629b3b..de39736a5a 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -294,6 +294,7 @@ mod tests { impl pallet_balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); @@ -319,6 +320,7 @@ mod tests { type MinLength = MinLength; type MaxLength = MaxLength; } + type System = frame_system::Module; type Balances = pallet_balances::Module; type Nicks = Module; diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index bc44bf5e62..dd59bbc84f 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -77,6 +77,7 @@ impl frame_system::Trait for Test { impl pallet_balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); @@ -118,13 +119,16 @@ impl Trait for Test { type KickOrigin = EnsureSignedBy; type MembershipInitialized = TestChangeMembers; type MembershipChanged = TestChangeMembers; - type Currency = pallet_balances::Module; + type Currency = Balances; type CandidateDeposit = CandidateDeposit; type Period = Period; type Score = u64; type ScoreOrigin = EnsureSignedBy; } +type System = frame_system::Module; +type Balances = pallet_balances::Module; + // This function basically just builds a genesis storage key/value store according to // our desired mockup. pub fn new_test_ext() -> sp_io::TestExternalities { diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 2fdd62457e..3c238b56ed 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -146,6 +146,7 @@ parameter_types! { impl pallet_balances::Trait for Test { type Balance = Balance; type OnFreeBalanceZero = Staking; + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index 51367ee955..eaaad7b8c4 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -67,10 +67,17 @@ pub trait Contains { /// The account with the given id was killed. #[impl_trait_for_tuples::impl_for_tuples(30)] pub trait OnFreeBalanceZero { - /// The account was the given id was killed. + /// The account with the given id was killed. fn on_free_balance_zero(who: &AccountId); } +/// The account with the given id was reaped. +#[impl_trait_for_tuples::impl_for_tuples(30)] +pub trait OnReapAccount { + /// The account with the given id was reaped. + fn on_reap_account(who: &AccountId); +} + /// Outcome of a balance update. pub enum UpdateBalanceOutcome { /// Account balance was simply updated. diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 5c194f6257..f2902a11cf 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -113,7 +113,7 @@ use sp_runtime::{ use sp_core::storage::well_known_keys; use frame_support::{ decl_module, decl_event, decl_storage, decl_error, storage, Parameter, - traits::{Contains, Get, ModuleToIndex}, + traits::{Contains, Get, ModuleToIndex, OnReapAccount}, weights::{Weight, DispatchInfo, DispatchClass, SimpleDispatchInfo}, }; use codec::{Encode, Decode}; @@ -789,6 +789,13 @@ impl Module { } } +impl OnReapAccount for Module { + /// Remove the nonce for the account. Account is considered fully removed from the system. + fn on_reap_account(who: &T::AccountId) { + >::remove(who); + } +} + /// resource limit check. #[derive(Encode, Decode, Clone, Eq, PartialEq)] pub struct CheckWeight(PhantomData); diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index c3611640f1..bae3096f3c 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -311,6 +311,7 @@ mod tests { impl pallet_balances::Trait for Runtime { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 69d43bf4bc..f86c538326 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -766,6 +766,7 @@ mod tests { type Balance = u64; type OnNewAccount = (); type OnFreeBalanceZero = (); + type OnReapAccount = System; type Event = (); type TransferPayment = (); type DustRemoval = (); diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index 8103939a5c..ddbebda31f 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -698,6 +698,7 @@ mod tests { impl pallet_balances::Trait for Test { type Balance = u64; type OnFreeBalanceZero = (); + type OnReapAccount = System; type OnNewAccount = (); type Event = TestEvent; type TransferPayment = (); @@ -719,6 +720,7 @@ mod tests { type MultisigDepositFactor = MultisigDepositFactor; type MaxSignatories = MaxSignatories; } + type System = frame_system::Module; type Balances = pallet_balances::Module; type Utility = Module; -- GitLab From 8974349874588de655b7350737bba45032bb2548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 10 Jan 2020 01:46:55 +0100 Subject: [PATCH 086/296] Add documentation to SubmitSignedTransaction and actually make it work (#4200) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add documentation to signed transactions and actually make them work. * Fix naming and bounds. * Forgotten import. * Remove warning. * Make accounts optional, fix logic. * Split the method to avoid confusing type error message. * Move executor tests to integration. * Add submit transactions tests. * Make `submit_transaction` tests compile * Remove a file that was accidently committed * Add can_sign helper function. * Fix compilation. * Add a key to keystore. * Fix the tests. * Remove env_logger. * Fix sending multiple transactions. * Remove commented code. * Bring back criterion. * Remove stray debug log. * Apply suggestions from code review Co-Authored-By: Bastian Köcher * Make sure to initialize block correctly. * Initialize block for offchain workers. * Add test for transaction validity. * Fix tests. * Review suggestions. * Remove redundant comment. * Make sure to use correct block number of authoring. * Change the runtime API. * Support both versions. * Bump spec version, fix RPC test. Co-authored-by: Hernando Castano Co-authored-by: Gavin Wood Co-authored-by: Bastian Köcher --- Cargo.lock | 2 + bin/node-template/runtime/src/lib.rs | 6 +- bin/node/executor/Cargo.toml | 30 +- bin/node/executor/src/lib.rs | 1227 ----------------- bin/node/executor/tests/basic.rs | 836 +++++++++++ bin/node/executor/tests/common.rs | 154 +++ bin/node/executor/tests/fees.rs | 332 +++++ bin/node/executor/tests/submit_transaction.rs | 184 +++ bin/node/runtime/src/lib.rs | 56 +- bin/node/testing/src/keyring.rs | 4 +- client/offchain/src/lib.rs | 52 +- client/rpc/src/state/tests.rs | 2 +- client/service/src/builder.rs | 10 +- frame/authorship/src/lib.rs | 20 +- frame/babe/src/tests.rs | 8 +- frame/contracts/src/tests.rs | 36 +- frame/executive/Cargo.toml | 16 +- frame/executive/src/lib.rs | 50 +- frame/finality-tracker/src/lib.rs | 16 +- frame/grandpa/src/tests.rs | 48 +- frame/im-online/src/lib.rs | 12 +- frame/randomness-collective-flip/src/lib.rs | 8 +- frame/system/src/lib.rs | 49 +- frame/system/src/offchain.rs | 290 +++- primitives/core/src/offchain/mod.rs | 1 + primitives/offchain/src/lib.rs | 6 + primitives/runtime/src/traits.rs | 6 +- primitives/transaction-pool/src/pool.rs | 24 +- test-utils/runtime/src/lib.rs | 8 +- 29 files changed, 2088 insertions(+), 1405 deletions(-) create mode 100644 bin/node/executor/tests/basic.rs create mode 100644 bin/node/executor/tests/common.rs create mode 100644 bin/node/executor/tests/fees.rs create mode 100644 bin/node/executor/tests/submit_transaction.rs diff --git a/Cargo.lock b/Cargo.lock index 6cda03cd99..6916305a57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3096,6 +3096,7 @@ dependencies = [ "pallet-balances 2.0.0", "pallet-contracts 2.0.0", "pallet-grandpa 2.0.0", + "pallet-im-online 2.0.0", "pallet-indices 2.0.0", "pallet-session 2.0.0", "pallet-timestamp 2.0.0", @@ -3103,6 +3104,7 @@ dependencies = [ "pallet-treasury 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor 2.0.0", + "sp-application-crypto 2.0.0", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 0aaf319336..4416cbf13e 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -15,7 +15,7 @@ use sp_runtime::{ impl_opaque_keys, MultiSignature }; use sp_runtime::traits::{ - NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify, ConvertInto, IdentifyAccount + BlakeTwo256, Block as BlockT, StaticLookup, Verify, ConvertInto, IdentifyAccount }; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -341,8 +341,8 @@ impl_runtime_apis! { } impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(number: NumberFor) { - Executive::offchain_worker(number) + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) } } diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 24f593d1ce..0c594a95f9 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -6,32 +6,34 @@ description = "Substrate node implementation in Rust." edition = "2018" [dependencies] -trie-root = "0.15.2" codec = { package = "parity-scale-codec", version = "1.0.0" } -sp-io = { version = "2.0.0", path = "../../../primitives/io" } -sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } +node-primitives = { version = "2.0.0", path = "../primitives" } +node-runtime = { version = "2.0.0", path = "../runtime" } sc-executor = { version = "2.0.0", path = "../../../client/executor" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sp-io = { version = "2.0.0", path = "../../../primitives/io" } +sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } sp-trie = { version = "2.0.0", path = "../../../primitives/trie" } -node-primitives = { version = "2.0.0", path = "../primitives" } -node-runtime = { version = "2.0.0", path = "../runtime" } +trie-root = "0.15.2" [dev-dependencies] -node-testing = { version = "2.0.0", path = "../testing" } -substrate-test-client = { version = "2.0.0", path = "../../../test-utils/client" } -sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +criterion = "0.3.0" frame-support = { version = "2.0.0", path = "../../../frame/support" } -pallet-balances = { version = "2.0.0", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transaction-payment" } -pallet-session = { version = "2.0.0", path = "../../../frame/session" } frame-system = { version = "2.0.0", path = "../../../frame/system" } -pallet-timestamp = { version = "2.0.0", path = "../../../frame/timestamp" } -pallet-treasury = { version = "2.0.0", path = "../../../frame/treasury" } +node-testing = { version = "2.0.0", path = "../testing" } +pallet-balances = { version = "2.0.0", path = "../../../frame/balances" } pallet-contracts = { version = "2.0.0", path = "../../../frame/contracts" } pallet-grandpa = { version = "2.0.0", path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0", path = "../../../frame/im-online" } pallet-indices = { version = "2.0.0", path = "../../../frame/indices" } +pallet-session = { version = "2.0.0", path = "../../../frame/session" } +pallet-timestamp = { version = "2.0.0", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0", path = "../../../frame/treasury" } +sp-application-crypto = { version = "2.0.0", path = "../../../primitives/application-crypto" } +sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +substrate-test-client = { version = "2.0.0", path = "../../../test-utils/client" } wabt = "0.9.2" -criterion = "0.3.0" [features] wasmtime = [ diff --git a/bin/node/executor/src/lib.rs b/bin/node/executor/src/lib.rs index e8c8072fec..deb947fdd1 100644 --- a/bin/node/executor/src/lib.rs +++ b/bin/node/executor/src/lib.rs @@ -28,1230 +28,3 @@ native_executor_instance!( node_runtime::native_version ); -#[cfg(test)] -mod tests { - use sc_executor::error::Result; - use super::Executor; - use codec::{Encode, Decode, Joiner}; - use frame_support::{ - Hashable, StorageValue, StorageMap, - traits::Currency, - weights::{GetDispatchInfo, DispatchInfo, DispatchClass}, - }; - use sp_state_machine::TestExternalities as CoreTestExternalities; - use sp_core::{ - Blake2Hasher, NeverNativeValue, NativeOrEncoded, map, - traits::{CodeExecutor, Externalities}, storage::{well_known_keys, Storage}, - }; - use sp_runtime::{ - Fixed64, traits::{Header as HeaderT, Hash as HashT, Convert}, ApplyExtrinsicResult, - transaction_validity::InvalidTransaction, - }; - use pallet_contracts::ContractAddressFor; - use sc_executor::{NativeExecutor, WasmExecutionMethod}; - use frame_system::{EventRecord, Phase}; - use node_runtime::{ - Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, BuildStorage, - System, TransactionPayment, Event, TransferFee, TransactionBaseFee, TransactionByteFee, - WeightFeeCoefficient, constants::currency::*, - }; - use node_runtime::impls::LinearWeightToFee; - use node_primitives::{Balance, Hash, BlockNumber}; - use node_testing::keyring::*; - use wabt; - - /// 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] = node_runtime::WASM_BINARY; - - /// 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] = node_runtime::WASM_BINARY_BLOATY; - - const GENESIS_HASH: [u8; 32] = [69u8; 32]; - - const VERSION: u32 = node_runtime::VERSION.spec_version; - - type TestExternalities = CoreTestExternalities; - - fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { - node_testing::keyring::sign(xt, VERSION, GENESIS_HASH) - } - - /// Default transfer fee - fn transfer_fee(extrinsic: &E, fee_multiplier: Fixed64) -> Balance { - let length_fee = TransactionByteFee::get() * (extrinsic.encode().len() as Balance); - - let weight = default_transfer_call().get_dispatch_info().weight; - let weight_fee = ::WeightToFee::convert(weight); - - let base_fee = TransactionBaseFee::get(); - - base_fee + fee_multiplier.saturated_multiply_accumulate(length_fee + weight_fee) + TransferFee::get() - } - - fn default_transfer_call() -> pallet_balances::Call { - pallet_balances::Call::transfer::(bob().into(), 69 * DOLLARS) - } - - fn xt() -> UncheckedExtrinsic { - sign(CheckedExtrinsic { - signed: Some((alice(), signed_extra(0, 0))), - function: Call::Balances(default_transfer_call()), - }) - } - - fn from_block_number(n: u32) -> Header { - Header::new(n, Default::default(), Default::default(), [69; 32].into(), Default::default()) - } - - fn executor() -> NativeExecutor { - NativeExecutor::new(WasmExecutionMethod::Interpreted, None) - } - - fn set_heap_pages(ext: &mut E, heap_pages: u64) { - ext.place_storage(well_known_keys::HEAP_PAGES.to_vec(), Some(heap_pages.encode())); - } - - fn executor_call< - R:Decode + Encode + PartialEq, - NC: FnOnce() -> std::result::Result + std::panic::UnwindSafe - >( - t: &mut TestExternalities, - method: &str, - data: &[u8], - use_native: bool, - native_call: Option, - ) -> (Result>, bool) { - let mut t = t.ext(); - executor().call::<_, R, NC>( - &mut t, - method, - data, - use_native, - native_call, - ) - } - - #[test] - fn panic_execution_with_foreign_code_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - 69_u128.encode() - }, - >::hashed_key().to_vec() => { - 69_u128.encode() - }, - >::hashed_key().to_vec() => { - 0_u128.encode() - }, - >::hashed_key_for(0) => { - vec![0u8; 32] - } - ], - children: map![], - }); - - let r = executor_call:: _>( - &mut t, - "Core_initialize_block", - &vec![].and(&from_block_number(1u32)), - true, - None, - ).0; - assert!(r.is_ok()); - let v = executor_call:: _>( - &mut t, - "BlockBuilder_apply_extrinsic", - &vec![].and(&xt()), - true, - None, - ).0.unwrap(); - let r = ApplyExtrinsicResult::decode(&mut &v.as_encoded()[..]).unwrap(); - assert_eq!(r, Err(InvalidTransaction::Payment.into())); - } - - #[test] - fn bad_extrinsic_with_native_equivalent_code_gives_error() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - 69_u128.encode() - }, - >::hashed_key().to_vec() => { - 69_u128.encode() - }, - >::hashed_key().to_vec() => { - 0_u128.encode() - }, - >::hashed_key_for(0) => { - vec![0u8; 32] - } - ], - children: map![], - }); - - let r = executor_call:: _>( - &mut t, - "Core_initialize_block", - &vec![].and(&from_block_number(1u32)), - true, - None, - ).0; - assert!(r.is_ok()); - let v = executor_call:: _>( - &mut t, - "BlockBuilder_apply_extrinsic", - &vec![].and(&xt()), - true, - None, - ).0.unwrap(); - let r = ApplyExtrinsicResult::decode(&mut &v.as_encoded()[..]).unwrap(); - assert_eq!(r, Err(InvalidTransaction::Payment.into())); - } - - #[test] - fn successful_execution_with_native_equivalent_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (111 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => { - (111 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => vec![0u8; 16], - >::hashed_key_for(0) => vec![0u8; 32] - ], - children: map![], - }); - - let r = executor_call:: _>( - &mut t, - "Core_initialize_block", - &vec![].and(&from_block_number(1u32)), - true, - None, - ).0; - assert!(r.is_ok()); - - let fm = t.execute_with(TransactionPayment::next_fee_multiplier); - - let r = executor_call:: _>( - &mut t, - "BlockBuilder_apply_extrinsic", - &vec![].and(&xt()), - true, - None, - ).0; - assert!(r.is_ok()); - - t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); - assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); - }); - } - - #[test] - fn successful_execution_with_foreign_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (111 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => { - (111 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => vec![0u8; 16], - >::hashed_key_for(0) => vec![0u8; 32] - ], - children: map![], - }); - - let r = executor_call:: _>( - &mut t, - "Core_initialize_block", - &vec![].and(&from_block_number(1u32)), - true, - None, - ).0; - assert!(r.is_ok()); - - let fm = t.execute_with(TransactionPayment::next_fee_multiplier); - - let r = executor_call:: _>( - &mut t, - "BlockBuilder_apply_extrinsic", - &vec![].and(&xt()), - true, - None, - ).0; - assert!(r.is_ok()); - - t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); - assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); - }); - } - - fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { - let mut ext = TestExternalities::new_with_code( - code, - node_testing::genesis::config(support_changes_trie, Some(code)).build_storage().unwrap(), - ); - ext.changes_trie_storage().insert(0, GENESIS_HASH.into(), Default::default()); - ext - } - - fn construct_block( - env: &mut TestExternalities, - number: BlockNumber, - parent_hash: Hash, - extrinsics: Vec, - ) -> (Vec, Hash) { - use sp_trie::{TrieConfiguration, trie_types::Layout}; - - // sign extrinsics. - let extrinsics = extrinsics.into_iter().map(sign).collect::>(); - - // calculate the header fields that we can. - let extrinsics_root = Layout::::ordered_trie_root( - extrinsics.iter().map(Encode::encode) - ).to_fixed_bytes() - .into(); - - let header = Header { - parent_hash, - number, - extrinsics_root, - state_root: Default::default(), - digest: Default::default(), - }; - - // execute the block to get the real header. - executor_call:: _>( - env, - "Core_initialize_block", - &header.encode(), - true, - None, - ).0.unwrap(); - - for i in extrinsics.iter() { - executor_call:: _>( - env, - "BlockBuilder_apply_extrinsic", - &i.encode(), - true, - None, - ).0.unwrap(); - } - - let header = match executor_call:: _>( - env, - "BlockBuilder_finalize_block", - &[0u8;0], - true, - None, - ).0.unwrap() { - NativeOrEncoded::Native(_) => unreachable!(), - NativeOrEncoded::Encoded(h) => Header::decode(&mut &h[..]).unwrap(), - }; - - let hash = header.blake2_256(); - (Block { header, extrinsics }.encode(), hash.into()) - } - - fn changes_trie_block() -> (Vec, Hash) { - construct_block( - &mut new_test_ext(COMPACT_CODE, true), - 1, - GENESIS_HASH.into(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), - }, - CheckedExtrinsic { - signed: Some((alice(), signed_extra(0, 0))), - function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 69 * DOLLARS)), - }, - ] - ) - } - - // block 1 and 2 must be created together to ensure transactions are only signed once (since they - // are not guaranteed to be deterministic) and to ensure that the correct state is propagated - // from block1's execution to block2 to derive the correct storage_root. - fn blocks() -> ((Vec, Hash), (Vec, Hash)) { - let mut t = new_test_ext(COMPACT_CODE, false); - let block1 = construct_block( - &mut t, - 1, - GENESIS_HASH.into(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), - }, - CheckedExtrinsic { - signed: Some((alice(), signed_extra(0, 0))), - function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 69 * DOLLARS)), - }, - ] - ); - let block2 = construct_block( - &mut t, - 2, - block1.1.clone(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(52 * 1000)), - }, - CheckedExtrinsic { - signed: Some((bob(), signed_extra(0, 0))), - function: Call::Balances(pallet_balances::Call::transfer(alice().into(), 5 * DOLLARS)), - }, - CheckedExtrinsic { - signed: Some((alice(), signed_extra(1, 0))), - function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 15 * DOLLARS)), - } - ] - ); - - // session change => consensus authorities change => authorities change digest item appears - let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; - assert_eq!(digest.logs().len(), 0); - - (block1, block2) - } - - fn block_with_size(time: u64, nonce: u32, size: usize) -> (Vec, Hash) { - construct_block( - &mut new_test_ext(COMPACT_CODE, false), - 1, - GENESIS_HASH.into(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(time * 1000)), - }, - CheckedExtrinsic { - signed: Some((alice(), signed_extra(nonce, 0))), - function: Call::System(frame_system::Call::remark(vec![0; size])), - } - ] - ) - } - - #[test] - fn full_native_block_import_works() { - let mut t = new_test_ext(COMPACT_CODE, false); - - let (block1, block2) = blocks(); - - let mut alice_last_known_balance: Balance = Default::default(); - let mut fm = t.execute_with(TransactionPayment::next_fee_multiplier); - - executor_call:: _>( - &mut t, - "Core_execute_block", - &block1.0, - true, - None, - ).0.unwrap(); - - t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); - assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); - alice_last_known_balance = Balances::total_balance(&alice()); - let events = vec![ - EventRecord { - phase: Phase::ApplyExtrinsic(0), - event: Event::system(frame_system::Event::ExtrinsicSuccess( - DispatchInfo { weight: 10000, class: DispatchClass::Operational, pays_fee: true } - )), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::pallet_treasury(pallet_treasury::RawEvent::Deposit(1984800000000)), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::pallet_balances(pallet_balances::RawEvent::Transfer( - alice().into(), - bob().into(), - 69 * DOLLARS, - 1 * CENTS, - )), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::system(frame_system::Event::ExtrinsicSuccess( - DispatchInfo { weight: 1000000, class: DispatchClass::Normal, pays_fee: true } - )), - topics: vec![], - }, - ]; - assert_eq!(System::events(), events); - }); - - fm = t.execute_with(TransactionPayment::next_fee_multiplier); - - executor_call:: _>( - &mut t, - "Core_execute_block", - &block2.0, - true, - None, - ).0.unwrap(); - - t.execute_with(|| { - assert_eq!( - Balances::total_balance(&alice()), - alice_last_known_balance - 10 * DOLLARS - transfer_fee(&xt(), fm), - ); - assert_eq!( - Balances::total_balance(&bob()), - 179 * DOLLARS - transfer_fee(&xt(), fm), - ); - let events = vec![ - EventRecord { - phase: Phase::ApplyExtrinsic(0), - event: Event::system(frame_system::Event::ExtrinsicSuccess( - DispatchInfo { weight: 10000, class: DispatchClass::Operational, pays_fee: true } - )), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::pallet_treasury(pallet_treasury::RawEvent::Deposit(1984788199392)), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::pallet_balances( - pallet_balances::RawEvent::Transfer( - bob().into(), - alice().into(), - 5 * DOLLARS, - 1 * CENTS, - ) - ), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::system(frame_system::Event::ExtrinsicSuccess( - DispatchInfo { weight: 1000000, class: DispatchClass::Normal, pays_fee: true } - )), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(2), - event: Event::pallet_treasury(pallet_treasury::RawEvent::Deposit(1984788199392)), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(2), - event: Event::pallet_balances( - pallet_balances::RawEvent::Transfer( - alice().into(), - bob().into(), - 15 * DOLLARS, - 1 * CENTS, - ) - ), - topics: vec![], - }, - EventRecord { - phase: Phase::ApplyExtrinsic(2), - event: Event::system(frame_system::Event::ExtrinsicSuccess( - DispatchInfo { weight: 1000000, class: DispatchClass::Normal, pays_fee: true } - )), - topics: vec![], - }, - ]; - assert_eq!(System::events(), events); - }); - } - - #[test] - fn full_wasm_block_import_works() { - let mut t = new_test_ext(COMPACT_CODE, false); - - let (block1, block2) = blocks(); - - let mut alice_last_known_balance: Balance = Default::default(); - let mut fm = t.execute_with(TransactionPayment::next_fee_multiplier); - - executor_call:: _>( - &mut t, - "Core_execute_block", - &block1.0, - false, - None, - ).0.unwrap(); - - t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); - assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); - alice_last_known_balance = Balances::total_balance(&alice()); - }); - - fm = t.execute_with(TransactionPayment::next_fee_multiplier); - - executor_call:: _>( - &mut t, - "Core_execute_block", - &block2.0, - false, - None, - ).0.unwrap(); - - t.execute_with(|| { - assert_eq!( - Balances::total_balance(&alice()), - alice_last_known_balance - 10 * DOLLARS - transfer_fee(&xt(), fm), - ); - assert_eq!( - Balances::total_balance(&bob()), - 179 * DOLLARS - 1 * transfer_fee(&xt(), fm), - ); - }); - } - - const CODE_TRANSFER: &str = r#" -(module - ;; ext_call( - ;; callee_ptr: u32, - ;; callee_len: u32, - ;; gas: u64, - ;; value_ptr: u32, - ;; value_len: u32, - ;; input_data_ptr: u32, - ;; input_data_len: u32 - ;; ) -> u32 - (import "env" "ext_call" (func $ext_call (param i32 i32 i64 i32 i32 i32 i32) (result i32))) - (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - (func (export "deploy") - ) - (func (export "call") - (block $fail - ;; load and check the input data (which is stored in the scratch buffer). - ;; fail if the input size is not != 4 - (br_if $fail - (i32.ne - (i32.const 4) - (call $ext_scratch_size) - ) - ) - - (call $ext_scratch_read - (i32.const 0) - (i32.const 0) - (i32.const 4) - ) - - - (br_if $fail - (i32.ne - (i32.load8_u (i32.const 0)) - (i32.const 0) - ) - ) - (br_if $fail - (i32.ne - (i32.load8_u (i32.const 1)) - (i32.const 1) - ) - ) - (br_if $fail - (i32.ne - (i32.load8_u (i32.const 2)) - (i32.const 2) - ) - ) - (br_if $fail - (i32.ne - (i32.load8_u (i32.const 3)) - (i32.const 3) - ) - ) - - (drop - (call $ext_call - (i32.const 4) ;; Pointer to "callee" address. - (i32.const 32) ;; Length of "callee" address. - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 36) ;; Pointer to the buffer with value to transfer - (i32.const 16) ;; Length of the buffer with value to transfer. - (i32.const 0) ;; Pointer to input data buffer address - (i32.const 0) ;; Length of input data buffer - ) - ) - - (return) - ) - unreachable - ) - ;; 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" - ) - ;; 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" - ) -) -"#; - - #[test] - fn deploying_wasm_contract_should_work() { - let transfer_code = wabt::wat2wasm(CODE_TRANSFER).unwrap(); - let transfer_ch = ::Hashing::hash(&transfer_code); - - let addr = ::DetermineContractAddress::contract_address_for( - &transfer_ch, - &[], - &charlie(), - ); - - let b = construct_block( - &mut new_test_ext(COMPACT_CODE, false), - 1, - GENESIS_HASH.into(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), - }, - CheckedExtrinsic { - signed: Some((charlie(), signed_extra(0, 0))), - function: Call::Contracts( - pallet_contracts::Call::put_code::(10_000, transfer_code) - ), - }, - CheckedExtrinsic { - signed: Some((charlie(), signed_extra(1, 0))), - function: Call::Contracts( - pallet_contracts::Call::instantiate::(1 * DOLLARS, 10_000, transfer_ch, Vec::new()) - ), - }, - CheckedExtrinsic { - signed: Some((charlie(), signed_extra(2, 0))), - function: Call::Contracts( - pallet_contracts::Call::call::( - pallet_indices::address::Address::Id(addr.clone()), - 10, - 10_000, - vec![0x00, 0x01, 0x02, 0x03] - ) - ), - }, - ] - ); - - let mut t = new_test_ext(COMPACT_CODE, false); - - executor_call:: _>( - &mut t, - "Core_execute_block", - &b.0, - false, - None, - ).0.unwrap(); - - t.execute_with(|| { - // Verify that the contract constructor worked well and code of TRANSFER contract is actually deployed. - assert_eq!( - &pallet_contracts::ContractInfoOf::::get(addr) - .and_then(|c| c.get_alive()) - .unwrap() - .code_hash, - &transfer_ch - ); - }); - } - - #[test] - fn wasm_big_block_import_fails() { - let mut t = new_test_ext(COMPACT_CODE, false); - - set_heap_pages(&mut t.ext(), 4); - - let result = executor_call:: _>( - &mut t, - "Core_execute_block", - &block_with_size(42, 0, 120_000).0, - false, - None, - ).0; - assert!(result.is_err()); // Err(Wasmi(Trap(Trap { kind: Host(AllocatorOutOfSpace) }))) - } - - #[test] - fn native_big_block_import_succeeds() { - let mut t = new_test_ext(COMPACT_CODE, false); - - executor_call:: _>( - &mut t, - "Core_execute_block", - &block_with_size(42, 0, 120_000).0, - true, - None, - ).0.unwrap(); - } - - #[test] - fn native_big_block_import_fails_on_fallback() { - let mut t = new_test_ext(COMPACT_CODE, false); - - assert!( - executor_call:: _>( - &mut t, - "Core_execute_block", - &block_with_size(42, 0, 120_000).0, - false, - None, - ).0.is_err() - ); - } - - #[test] - fn panic_execution_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - 0_u128.encode() - }, - >::hashed_key().to_vec() => { - 0_u128.encode() - }, - >::hashed_key().to_vec() => vec![0u8; 16], - >::hashed_key_for(0) => vec![0u8; 32] - ], - children: map![], - }); - - let r = executor_call:: _>( - &mut t, - "Core_initialize_block", - &vec![].and(&from_block_number(1u32)), - false, - None, - ).0; - assert!(r.is_ok()); - let r = executor_call:: _>( - &mut t, - "BlockBuilder_apply_extrinsic", - &vec![].and(&xt()), - false, - None, - ).0.unwrap().into_encoded(); - let r = ApplyExtrinsicResult::decode(&mut &r[..]).unwrap(); - assert_eq!(r, Err(InvalidTransaction::Payment.into())); - } - - #[test] - fn successful_execution_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (111 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => { - (111 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => vec![0u8; 16], - >::hashed_key_for(0) => vec![0u8; 32] - ], - children: map![], - }); - - let r = executor_call:: _>( - &mut t, - "Core_initialize_block", - &vec![].and(&from_block_number(1u32)), - false, - None, - ).0; - assert!(r.is_ok()); - let fm = t.execute_with(TransactionPayment::next_fee_multiplier); - let r = executor_call:: _>( - &mut t, - "BlockBuilder_apply_extrinsic", - &vec![].and(&xt()), - false, - None, - ).0.unwrap().into_encoded(); - ApplyExtrinsicResult::decode(&mut &r[..]) - .unwrap() - .expect("Extrinsic could be applied") - .expect("Extrinsic did not fail"); - - t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * transfer_fee(&xt(), fm)); - assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); - }); - } - - #[test] - fn full_native_block_import_works_with_changes_trie() { - let block1 = changes_trie_block(); - let block_data = block1.0; - let block = Block::decode(&mut &block_data[..]).unwrap(); - - let mut t = new_test_ext(COMPACT_CODE, true); - executor_call:: _>( - &mut t, - "Core_execute_block", - &block.encode(), - true, - None, - ).0.unwrap(); - - assert!(t.ext().storage_changes_root(&GENESIS_HASH.encode()).unwrap().is_some()); - } - - #[test] - fn full_wasm_block_import_works_with_changes_trie() { - let block1 = changes_trie_block(); - - let mut t = new_test_ext(COMPACT_CODE, true); - executor_call:: _>( - &mut t, - "Core_execute_block", - &block1.0, - false, - None, - ).0.unwrap(); - - assert!(t.ext().storage_changes_root(&GENESIS_HASH.encode()).unwrap().is_some()); - } - - #[test] - fn should_import_block_with_test_client() { - use node_testing::client::{ - ClientExt, TestClientBuilderExt, TestClientBuilder, sp_consensus::BlockOrigin - }; - - let client = TestClientBuilder::new().build(); - let block1 = changes_trie_block(); - let block_data = block1.0; - let block = node_primitives::Block::decode(&mut &block_data[..]).unwrap(); - - client.import(BlockOrigin::Own, block).unwrap(); - } - - - #[test] - fn fee_multiplier_increases_and_decreases_on_big_weight() { - let mut t = new_test_ext(COMPACT_CODE, false); - - // initial fee multiplier must be zero - let mut prev_multiplier = Fixed64::from_parts(0); - - t.execute_with(|| { - assert_eq!(TransactionPayment::next_fee_multiplier(), prev_multiplier); - }); - - let mut tt = new_test_ext(COMPACT_CODE, false); - - // big one in terms of weight. - let block1 = construct_block( - &mut tt, - 1, - GENESIS_HASH.into(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), - }, - CheckedExtrinsic { - signed: Some((charlie(), signed_extra(0, 0))), - function: Call::System(frame_system::Call::fill_block()), - } - ] - ); - - // small one in terms of weight. - let block2 = construct_block( - &mut tt, - 2, - block1.1.clone(), - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(52 * 1000)), - }, - CheckedExtrinsic { - signed: Some((charlie(), signed_extra(1, 0))), - function: Call::System(frame_system::Call::remark(vec![0; 1])), - } - ] - ); - - println!("++ Block 1 size: {} / Block 2 size {}", block1.0.encode().len(), block2.0.encode().len()); - - // execute a big block. - executor_call:: _>( - &mut t, - "Core_execute_block", - &block1.0, - true, - None, - ).0.unwrap(); - - // weight multiplier is increased for next block. - t.execute_with(|| { - let fm = TransactionPayment::next_fee_multiplier(); - println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); - assert!(fm > prev_multiplier); - prev_multiplier = fm; - }); - - // execute a big block. - executor_call:: _>( - &mut t, - "Core_execute_block", - &block2.0, - true, - None, - ).0.unwrap(); - - // weight multiplier is increased for next block. - t.execute_with(|| { - let fm = TransactionPayment::next_fee_multiplier(); - println!("After a small block: {:?} -> {:?}", prev_multiplier, fm); - assert!(fm < prev_multiplier); - }); - } - - #[test] - fn transaction_fee_is_correct_ultimate() { - // This uses the exact values of substrate-node. - // - // weight of transfer call as of now: 1_000_000 - // if weight of the cheapest weight would be 10^7, this would be 10^9, which is: - // - 1 MILLICENTS in substrate node. - // - 1 milli-dot based on current polkadot runtime. - // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (100 * DOLLARS).encode() - }, - >::hashed_key_for(bob()) => { - (10 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => { - (110 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => vec![0u8; 16], - >::hashed_key_for(0) => vec![0u8; 32] - ], - children: map![], - }); - - let tip = 1_000_000; - let xt = sign(CheckedExtrinsic { - signed: Some((alice(), signed_extra(0, tip))), - function: Call::Balances(default_transfer_call()), - }); - - let r = executor_call:: _>( - &mut t, - "Core_initialize_block", - &vec![].and(&from_block_number(1u32)), - true, - None, - ).0; - - assert!(r.is_ok()); - let r = executor_call:: _>( - &mut t, - "BlockBuilder_apply_extrinsic", - &vec![].and(&xt.clone()), - true, - None, - ).0; - assert!(r.is_ok()); - - t.execute_with(|| { - assert_eq!(Balances::total_balance(&bob()), (10 + 69) * DOLLARS); - // Components deducted from alice's balances: - // - Weight fee - // - Length fee - // - Tip - // - Creation-fee of bob's account. - let mut balance_alice = (100 - 69) * DOLLARS; - - let length_fee = TransactionBaseFee::get() + - TransactionByteFee::get() * - (xt.clone().encode().len() as Balance); - balance_alice -= length_fee; - - let weight = default_transfer_call().get_dispatch_info().weight; - let weight_fee = LinearWeightToFee::::convert(weight); - - // we know that weight to fee multiplier is effect-less in block 1. - assert_eq!(weight_fee as Balance, MILLICENTS); - balance_alice -= weight_fee; - - balance_alice -= tip; - balance_alice -= TransferFee::get(); - - assert_eq!(Balances::total_balance(&alice()), balance_alice); - }); - } - - #[test] - #[should_panic] - #[cfg(feature = "stress-test")] - fn block_weight_capacity_report() { - // Just report how many transfer calls you could fit into a block. The number should at least - // be a few hundred (250 at the time of writing but can change over time). Runs until panic. - use node_primitives::Index; - - // execution ext. - let mut t = new_test_ext(COMPACT_CODE, false); - // setup ext. - let mut tt = new_test_ext(COMPACT_CODE, false); - - let factor = 50; - let mut time = 10; - let mut nonce: Index = 0; - let mut block_number = 1; - let mut previous_hash: Hash = GENESIS_HASH.into(); - - loop { - let num_transfers = block_number * factor; - let mut xts = (0..num_transfers).map(|i| CheckedExtrinsic { - signed: Some((charlie(), signed_extra(nonce + i as Index, 0))), - function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 0)), - }).collect::>(); - - xts.insert(0, CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(time * 1000)), - }); - - // NOTE: this is super slow. Can probably be improved. - let block = construct_block( - &mut tt, - block_number, - previous_hash, - xts - ); - - let len = block.0.len(); - print!( - "++ Executing block with {} transfers. Block size = {} bytes / {} kb / {} mb", - num_transfers, - len, - len / 1024, - len / 1024 / 1024, - ); - - let r = executor_call:: _>( - &mut t, - "Core_execute_block", - &block.0, - true, - None, - ).0; - - println!(" || Result = {:?}", r); - assert!(r.is_ok()); - - previous_hash = block.1; - nonce += num_transfers; - time += 10; - block_number += 1; - } - } - - #[test] - #[should_panic] - #[cfg(feature = "stress-test")] - fn block_length_capacity_report() { - // Just report how big a block can get. Executes until panic. Should be ignored unless if - // manually inspected. The number should at least be a few megabytes (5 at the time of - // writing but can change over time). - use node_primitives::Index; - - // execution ext. - let mut t = new_test_ext(COMPACT_CODE, false); - // setup ext. - let mut tt = new_test_ext(COMPACT_CODE, false); - - let factor = 256 * 1024; - let mut time = 10; - let mut nonce: Index = 0; - let mut block_number = 1; - let mut previous_hash: Hash = GENESIS_HASH.into(); - - loop { - // NOTE: this is super slow. Can probably be improved. - let block = construct_block( - &mut tt, - block_number, - previous_hash, - vec![ - CheckedExtrinsic { - signed: None, - function: Call::Timestamp(pallet_timestamp::Call::set(time * 1000)), - }, - CheckedExtrinsic { - signed: Some((charlie(), signed_extra(nonce, 0))), - function: Call::System(frame_system::Call::remark(vec![0u8; (block_number * factor) as usize])), - }, - ] - ); - - let len = block.0.len(); - print!( - "++ Executing block with big remark. Block size = {} bytes / {} kb / {} mb", - len, - len / 1024, - len / 1024 / 1024, - ); - - let r = executor_call:: _>( - &mut t, - "Core_execute_block", - &block.0, - true, - None, - ).0; - - println!(" || Result = {:?}", r); - assert!(r.is_ok()); - - previous_hash = block.1; - nonce += 1; - time += 10; - block_number += 1; - } - } -} diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs new file mode 100644 index 0000000000..504b6853e1 --- /dev/null +++ b/bin/node/executor/tests/basic.rs @@ -0,0 +1,836 @@ +// Copyright 2018-2020 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 codec::{Encode, Decode, Joiner}; +use frame_support::{ + StorageValue, StorageMap, + traits::Currency, + weights::{GetDispatchInfo, DispatchInfo, DispatchClass}, +}; +use sp_core::{ + Blake2Hasher, NeverNativeValue, map, + traits::Externalities, + storage::{well_known_keys, Storage}, +}; +use sp_runtime::{ + ApplyExtrinsicResult, Fixed64, + traits::{Hash as HashT, Convert}, + transaction_validity::InvalidTransaction, +}; +use pallet_contracts::ContractAddressFor; +use frame_system::{self, EventRecord, Phase}; + +use node_runtime::{ + Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, + System, TransactionPayment, Event, + TransferFee, TransactionBaseFee, TransactionByteFee, + constants::currency::*, +}; +use node_primitives::{Balance, Hash}; +use wabt; +use node_testing::keyring::*; + +mod common; +use self::common::{*, sign}; + +/// 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. +pub const BLOATY_CODE: &[u8] = node_runtime::WASM_BINARY_BLOATY; + +/// Default transfer fee +fn transfer_fee(extrinsic: &E, fee_multiplier: Fixed64) -> Balance { + let length_fee = TransactionByteFee::get() * (extrinsic.encode().len() as Balance); + + let weight = default_transfer_call().get_dispatch_info().weight; + let weight_fee = + ::WeightToFee::convert(weight); + + let base_fee = TransactionBaseFee::get(); + base_fee + fee_multiplier.saturated_multiply_accumulate(length_fee + weight_fee) + TransferFee::get() +} + +fn xt() -> UncheckedExtrinsic { + sign(CheckedExtrinsic { + signed: Some((alice(), signed_extra(0, 0))), + function: Call::Balances(default_transfer_call()), + }) +} + +fn set_heap_pages(ext: &mut E, heap_pages: u64) { + ext.place_storage(well_known_keys::HEAP_PAGES.to_vec(), Some(heap_pages.encode())); +} + +fn changes_trie_block() -> (Vec, Hash) { + construct_block( + &mut new_test_ext(COMPACT_CODE, true), + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), + }, + CheckedExtrinsic { + signed: Some((alice(), signed_extra(0, 0))), + function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 69 * DOLLARS)), + }, + ] + ) +} + + +/// block 1 and 2 must be created together to ensure transactions are only signed once (since they +/// are not guaranteed to be deterministic) and to ensure that the correct state is propagated +/// from block1's execution to block2 to derive the correct storage_root. +fn blocks() -> ((Vec, Hash), (Vec, Hash)) { + let mut t = new_test_ext(COMPACT_CODE, false); + let block1 = construct_block( + &mut t, + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), + }, + CheckedExtrinsic { + signed: Some((alice(), signed_extra(0, 0))), + function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 69 * DOLLARS)), + }, + ] + ); + let block2 = construct_block( + &mut t, + 2, + block1.1.clone(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(52 * 1000)), + }, + CheckedExtrinsic { + signed: Some((bob(), signed_extra(0, 0))), + function: Call::Balances(pallet_balances::Call::transfer(alice().into(), 5 * DOLLARS)), + }, + CheckedExtrinsic { + signed: Some((alice(), signed_extra(1, 0))), + function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 15 * DOLLARS)), + } + ] + ); + + // session change => consensus authorities change => authorities change digest item appears + let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; + assert_eq!(digest.logs().len(), 0); + + (block1, block2) +} + +fn block_with_size(time: u64, nonce: u32, size: usize) -> (Vec, Hash) { + construct_block( + &mut new_test_ext(COMPACT_CODE, false), + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(time * 1000)), + }, + CheckedExtrinsic { + signed: Some((alice(), signed_extra(nonce, 0))), + function: Call::System(frame_system::Call::remark(vec![0; size])), + } + ] + ) +} + +#[test] +fn panic_execution_with_foreign_code_gives_error() { + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { + top: map![ + >::hashed_key_for(alice()) => { + 69_u128.encode() + }, + >::hashed_key().to_vec() => { + 69_u128.encode() + }, + >::hashed_key().to_vec() => { + 0_u128.encode() + }, + >::hashed_key_for(0) => { + vec![0u8; 32] + } + ], + children: map![], + }); + + let r = executor_call:: _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + true, + None, + ).0; + assert!(r.is_ok()); + let v = executor_call:: _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt()), + true, + None, + ).0.unwrap(); + let r = ApplyExtrinsicResult::decode(&mut &v.as_encoded()[..]).unwrap(); + assert_eq!(r, Err(InvalidTransaction::Payment.into())); +} + +#[test] +fn bad_extrinsic_with_native_equivalent_code_gives_error() { + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { + top: map![ + >::hashed_key_for(alice()) => { + 69_u128.encode() + }, + >::hashed_key().to_vec() => { + 69_u128.encode() + }, + >::hashed_key().to_vec() => { + 0_u128.encode() + }, + >::hashed_key_for(0) => { + vec![0u8; 32] + } + ], + children: map![], + }); + + let r = executor_call:: _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + true, + None, + ).0; + assert!(r.is_ok()); + let v = executor_call:: _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt()), + true, + None, + ).0.unwrap(); + let r = ApplyExtrinsicResult::decode(&mut &v.as_encoded()[..]).unwrap(); + assert_eq!(r, Err(InvalidTransaction::Payment.into())); +} + +#[test] +fn successful_execution_with_native_equivalent_code_gives_ok() { + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { + top: map![ + >::hashed_key_for(alice()) => { + (111 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => { + (111 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => vec![0u8; 16], + >::hashed_key_for(0) => vec![0u8; 32] + ], + children: map![], + }); + + let r = executor_call:: _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + true, + None, + ).0; + assert!(r.is_ok()); + + let fm = t.execute_with(TransactionPayment::next_fee_multiplier); + + let r = executor_call:: _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt()), + true, + None, + ).0; + assert!(r.is_ok()); + + t.execute_with(|| { + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); + assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); + }); +} + +#[test] +fn successful_execution_with_foreign_code_gives_ok() { + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { + top: map![ + >::hashed_key_for(alice()) => { + (111 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => { + (111 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => vec![0u8; 16], + >::hashed_key_for(0) => vec![0u8; 32] + ], + children: map![], + }); + + let r = executor_call:: _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + true, + None, + ).0; + assert!(r.is_ok()); + + let fm = t.execute_with(TransactionPayment::next_fee_multiplier); + + let r = executor_call:: _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt()), + true, + None, + ).0; + assert!(r.is_ok()); + + t.execute_with(|| { + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); + assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); + }); +} + +#[test] +fn full_native_block_import_works() { + let mut t = new_test_ext(COMPACT_CODE, false); + + let (block1, block2) = blocks(); + + let mut alice_last_known_balance: Balance = Default::default(); + let mut fm = t.execute_with(TransactionPayment::next_fee_multiplier); + + executor_call:: _>( + &mut t, + "Core_execute_block", + &block1.0, + true, + None, + ).0.unwrap(); + + t.execute_with(|| { + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); + assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); + alice_last_known_balance = Balances::total_balance(&alice()); + let events = vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: Event::system(frame_system::Event::ExtrinsicSuccess( + DispatchInfo { weight: 10000, class: DispatchClass::Operational, pays_fee: true } + )), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: Event::pallet_treasury(pallet_treasury::RawEvent::Deposit(1984800000000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: Event::pallet_balances(pallet_balances::RawEvent::Transfer( + alice().into(), + bob().into(), + 69 * DOLLARS, + 1 * CENTS, + )), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: Event::system(frame_system::Event::ExtrinsicSuccess( + DispatchInfo { weight: 1000000, class: DispatchClass::Normal, pays_fee: true } + )), + topics: vec![], + }, + ]; + assert_eq!(System::events(), events); + }); + + fm = t.execute_with(TransactionPayment::next_fee_multiplier); + + executor_call:: _>( + &mut t, + "Core_execute_block", + &block2.0, + true, + None, + ).0.unwrap(); + + t.execute_with(|| { + assert_eq!( + Balances::total_balance(&alice()), + alice_last_known_balance - 10 * DOLLARS - transfer_fee(&xt(), fm), + ); + assert_eq!( + Balances::total_balance(&bob()), + 179 * DOLLARS - transfer_fee(&xt(), fm), + ); + let events = vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: Event::system(frame_system::Event::ExtrinsicSuccess( + DispatchInfo { weight: 10000, class: DispatchClass::Operational, pays_fee: true } + )), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: Event::pallet_treasury(pallet_treasury::RawEvent::Deposit(1984788199392)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: Event::pallet_balances( + pallet_balances::RawEvent::Transfer( + bob().into(), + alice().into(), + 5 * DOLLARS, + 1 * CENTS, + ) + ), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: Event::system(frame_system::Event::ExtrinsicSuccess( + DispatchInfo { weight: 1000000, class: DispatchClass::Normal, pays_fee: true } + )), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(2), + event: Event::pallet_treasury(pallet_treasury::RawEvent::Deposit(1984788199392)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(2), + event: Event::pallet_balances( + pallet_balances::RawEvent::Transfer( + alice().into(), + bob().into(), + 15 * DOLLARS, + 1 * CENTS, + ) + ), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(2), + event: Event::system(frame_system::Event::ExtrinsicSuccess( + DispatchInfo { weight: 1000000, class: DispatchClass::Normal, pays_fee: true } + )), + topics: vec![], + }, + ]; + assert_eq!(System::events(), events); + }); +} + +#[test] +fn full_wasm_block_import_works() { + let mut t = new_test_ext(COMPACT_CODE, false); + + let (block1, block2) = blocks(); + + let mut alice_last_known_balance: Balance = Default::default(); + let mut fm = t.execute_with(TransactionPayment::next_fee_multiplier); + + executor_call:: _>( + &mut t, + "Core_execute_block", + &block1.0, + false, + None, + ).0.unwrap(); + + t.execute_with(|| { + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); + assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); + alice_last_known_balance = Balances::total_balance(&alice()); + }); + + fm = t.execute_with(TransactionPayment::next_fee_multiplier); + + executor_call:: _>( + &mut t, + "Core_execute_block", + &block2.0, + false, + None, + ).0.unwrap(); + + t.execute_with(|| { + assert_eq!( + Balances::total_balance(&alice()), + alice_last_known_balance - 10 * DOLLARS - transfer_fee(&xt(), fm), + ); + assert_eq!( + Balances::total_balance(&bob()), + 179 * DOLLARS - 1 * transfer_fee(&xt(), fm), + ); + }); +} + +const CODE_TRANSFER: &str = r#" +(module +;; ext_call( +;; callee_ptr: u32, +;; callee_len: u32, +;; gas: u64, +;; value_ptr: u32, +;; value_len: u32, +;; input_data_ptr: u32, +;; input_data_len: u32 +;; ) -> u32 +(import "env" "ext_call" (func $ext_call (param i32 i32 i64 i32 i32 i32 i32) (result i32))) +(import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) +(import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) +(import "env" "memory" (memory 1 1)) +(func (export "deploy") +) +(func (export "call") + (block $fail + ;; load and check the input data (which is stored in the scratch buffer). + ;; fail if the input size is not != 4 + (br_if $fail + (i32.ne + (i32.const 4) + (call $ext_scratch_size) + ) + ) + + (call $ext_scratch_read + (i32.const 0) + (i32.const 0) + (i32.const 4) + ) + + + (br_if $fail + (i32.ne + (i32.load8_u (i32.const 0)) + (i32.const 0) + ) + ) + (br_if $fail + (i32.ne + (i32.load8_u (i32.const 1)) + (i32.const 1) + ) + ) + (br_if $fail + (i32.ne + (i32.load8_u (i32.const 2)) + (i32.const 2) + ) + ) + (br_if $fail + (i32.ne + (i32.load8_u (i32.const 3)) + (i32.const 3) + ) + ) + + (drop + (call $ext_call + (i32.const 4) ;; Pointer to "callee" address. + (i32.const 32) ;; Length of "callee" address. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 36) ;; Pointer to the buffer with value to transfer + (i32.const 16) ;; Length of the buffer with value to transfer. + (i32.const 0) ;; Pointer to input data buffer address + (i32.const 0) ;; Length of input data buffer + ) + ) + + (return) + ) + unreachable +) +;; 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" +) +;; 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" +) +) +"#; + +#[test] +fn deploying_wasm_contract_should_work() { + let transfer_code = wabt::wat2wasm(CODE_TRANSFER).unwrap(); + let transfer_ch = ::Hashing::hash(&transfer_code); + + let addr = ::DetermineContractAddress::contract_address_for( + &transfer_ch, + &[], + &charlie(), + ); + + let b = construct_block( + &mut new_test_ext(COMPACT_CODE, false), + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(0, 0))), + function: Call::Contracts( + pallet_contracts::Call::put_code::(10_000, transfer_code) + ), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(1, 0))), + function: Call::Contracts( + pallet_contracts::Call::instantiate::(1 * DOLLARS, 10_000, transfer_ch, Vec::new()) + ), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(2, 0))), + function: Call::Contracts( + pallet_contracts::Call::call::( + pallet_indices::address::Address::Id(addr.clone()), + 10, + 10_000, + vec![0x00, 0x01, 0x02, 0x03] + ) + ), + }, + ] + ); + + let mut t = new_test_ext(COMPACT_CODE, false); + + executor_call:: _>( + &mut t, + "Core_execute_block", + &b.0, + false, + None, + ).0.unwrap(); + + t.execute_with(|| { + // Verify that the contract constructor worked well and code of TRANSFER contract is actually deployed. + assert_eq!( + &pallet_contracts::ContractInfoOf::::get(addr) + .and_then(|c| c.get_alive()) + .unwrap() + .code_hash, + &transfer_ch + ); + }); +} + +#[test] +fn wasm_big_block_import_fails() { + let mut t = new_test_ext(COMPACT_CODE, false); + + set_heap_pages(&mut t.ext(), 4); + + let result = executor_call:: _>( + &mut t, + "Core_execute_block", + &block_with_size(42, 0, 120_000).0, + false, + None, + ).0; + assert!(result.is_err()); // Err(Wasmi(Trap(Trap { kind: Host(AllocatorOutOfSpace) }))) +} + +#[test] +fn native_big_block_import_succeeds() { + let mut t = new_test_ext(COMPACT_CODE, false); + + executor_call:: _>( + &mut t, + "Core_execute_block", + &block_with_size(42, 0, 120_000).0, + true, + None, + ).0.unwrap(); +} + +#[test] +fn native_big_block_import_fails_on_fallback() { + let mut t = new_test_ext(COMPACT_CODE, false); + + assert!( + executor_call:: _>( + &mut t, + "Core_execute_block", + &block_with_size(42, 0, 120_000).0, + false, + None, + ).0.is_err() + ); +} + +#[test] +fn panic_execution_gives_error() { + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { + top: map![ + >::hashed_key_for(alice()) => { + 0_u128.encode() + }, + >::hashed_key().to_vec() => { + 0_u128.encode() + }, + >::hashed_key().to_vec() => vec![0u8; 16], + >::hashed_key_for(0) => vec![0u8; 32] + ], + children: map![], + }); + + let r = executor_call:: _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + false, + None, + ).0; + assert!(r.is_ok()); + let r = executor_call:: _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt()), + false, + None, + ).0.unwrap().into_encoded(); + let r = ApplyExtrinsicResult::decode(&mut &r[..]).unwrap(); + assert_eq!(r, Err(InvalidTransaction::Payment.into())); +} + +#[test] +fn successful_execution_gives_ok() { + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { + top: map![ + >::hashed_key_for(alice()) => { + (111 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => { + (111 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => vec![0u8; 16], + >::hashed_key_for(0) => vec![0u8; 32] + ], + children: map![], + }); + + let r = executor_call:: _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + false, + None, + ).0; + assert!(r.is_ok()); + let fm = t.execute_with(TransactionPayment::next_fee_multiplier); + let r = executor_call:: _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt()), + false, + None, + ).0.unwrap().into_encoded(); + ApplyExtrinsicResult::decode(&mut &r[..]) + .unwrap() + .expect("Extrinsic could be applied") + .expect("Extrinsic did not fail"); + + t.execute_with(|| { + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * transfer_fee(&xt(), fm)); + assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); + }); +} + +#[test] +fn full_native_block_import_works_with_changes_trie() { + let block1 = changes_trie_block(); + let block_data = block1.0; + let block = Block::decode(&mut &block_data[..]).unwrap(); + + let mut t = new_test_ext(COMPACT_CODE, true); + executor_call:: _>( + &mut t, + "Core_execute_block", + &block.encode(), + true, + None, + ).0.unwrap(); + + assert!(t.ext().storage_changes_root(&GENESIS_HASH).unwrap().is_some()); +} + +#[test] +fn full_wasm_block_import_works_with_changes_trie() { + let block1 = changes_trie_block(); + + let mut t = new_test_ext(COMPACT_CODE, true); + executor_call:: _>( + &mut t, + "Core_execute_block", + &block1.0, + false, + None, + ).0.unwrap(); + + assert!(t.ext().storage_changes_root(&GENESIS_HASH).unwrap().is_some()); +} + +#[test] +fn should_import_block_with_test_client() { + use node_testing::client::{ + ClientExt, TestClientBuilderExt, TestClientBuilder, + sp_consensus::BlockOrigin, + }; + + let client = TestClientBuilder::new().build(); + let block1 = changes_trie_block(); + let block_data = block1.0; + let block = node_primitives::Block::decode(&mut &block_data[..]).unwrap(); + + client.import(BlockOrigin::Own, block).unwrap(); +} + + diff --git a/bin/node/executor/tests/common.rs b/bin/node/executor/tests/common.rs new file mode 100644 index 0000000000..d580e7c545 --- /dev/null +++ b/bin/node/executor/tests/common.rs @@ -0,0 +1,154 @@ +// Copyright 2018-2020 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 codec::{Encode, Decode}; +use frame_support::{ + Hashable, +}; +use sp_state_machine::TestExternalities as CoreTestExternalities; +use sp_core::{ + Blake2Hasher, NeverNativeValue, NativeOrEncoded, + traits::CodeExecutor, +}; +use sp_runtime::traits::{Header as HeaderT}; +use sc_executor::{NativeExecutor, WasmExecutionMethod}; +use sc_executor::error::Result; + +use node_executor::Executor; +use node_runtime::{ + Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Runtime, BuildStorage, + constants::currency::*, +}; +use node_primitives::{Hash, BlockNumber}; +use node_testing::keyring::*; + +/// 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. +pub const COMPACT_CODE: &[u8] = node_runtime::WASM_BINARY; + +pub const GENESIS_HASH: [u8; 32] = [69u8; 32]; + +pub const VERSION: u32 = node_runtime::VERSION.spec_version; + +pub type TestExternalities = CoreTestExternalities; + +pub fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { + node_testing::keyring::sign(xt, VERSION, GENESIS_HASH) +} + +pub fn default_transfer_call() -> pallet_balances::Call { + pallet_balances::Call::transfer::(bob().into(), 69 * DOLLARS) +} + +pub fn from_block_number(n: u32) -> Header { + Header::new(n, Default::default(), Default::default(), [69; 32].into(), Default::default()) +} + +pub fn executor() -> NativeExecutor { + NativeExecutor::new(WasmExecutionMethod::Interpreted, None) +} + +pub fn executor_call< + R:Decode + Encode + PartialEq, + NC: FnOnce() -> std::result::Result + std::panic::UnwindSafe +>( + t: &mut TestExternalities, + method: &str, + data: &[u8], + use_native: bool, + native_call: Option, +) -> (Result>, bool) { + let mut t = t.ext(); + executor().call::<_, R, NC>( + &mut t, + method, + data, + use_native, + native_call, + ) +} + +pub fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { + let mut ext = TestExternalities::new_with_code( + code, + node_testing::genesis::config(support_changes_trie, Some(code)).build_storage().unwrap(), + ); + ext.changes_trie_storage().insert(0, GENESIS_HASH.into(), Default::default()); + ext +} + +pub fn construct_block( + env: &mut TestExternalities, + number: BlockNumber, + parent_hash: Hash, + extrinsics: Vec, +) -> (Vec, Hash) { + use sp_trie::{TrieConfiguration, trie_types::Layout}; + + // sign extrinsics. + let extrinsics = extrinsics.into_iter().map(sign).collect::>(); + + // calculate the header fields that we can. + let extrinsics_root = Layout::::ordered_trie_root( + extrinsics.iter().map(Encode::encode) + ).to_fixed_bytes() + .into(); + + let header = Header { + parent_hash, + number, + extrinsics_root, + state_root: Default::default(), + digest: Default::default(), + }; + + // execute the block to get the real header. + executor_call:: _>( + env, + "Core_initialize_block", + &header.encode(), + true, + None, + ).0.unwrap(); + + for i in extrinsics.iter() { + executor_call:: _>( + env, + "BlockBuilder_apply_extrinsic", + &i.encode(), + true, + None, + ).0.unwrap(); + } + + let header = match executor_call:: _>( + env, + "BlockBuilder_finalize_block", + &[0u8;0], + true, + None, + ).0.unwrap() { + NativeOrEncoded::Native(_) => unreachable!(), + NativeOrEncoded::Encoded(h) => Header::decode(&mut &h[..]).unwrap(), + }; + + let hash = header.blake2_256(); + (Block { header, extrinsics }.encode(), hash.into()) +} diff --git a/bin/node/executor/tests/fees.rs b/bin/node/executor/tests/fees.rs new file mode 100644 index 0000000000..1210812c05 --- /dev/null +++ b/bin/node/executor/tests/fees.rs @@ -0,0 +1,332 @@ +// Copyright 2018-2020 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 codec::{Encode, Joiner}; +use frame_support::{ + StorageValue, StorageMap, + traits::Currency, + weights::GetDispatchInfo, +}; +use sp_core::{ + Blake2Hasher, NeverNativeValue, map, + storage::Storage, +}; +use sp_runtime::{ + Fixed64, + traits::Convert, +}; +use node_runtime::{ + CheckedExtrinsic, Call, Runtime, Balances, + TransactionPayment, TransferFee, TransactionBaseFee, TransactionByteFee, + WeightFeeCoefficient, constants::currency::*, +}; +use node_runtime::impls::LinearWeightToFee; +use node_primitives::Balance; +use node_testing::keyring::*; + +mod common; +use self::common::{*, sign}; + +#[test] +fn fee_multiplier_increases_and_decreases_on_big_weight() { + let mut t = new_test_ext(COMPACT_CODE, false); + + // initial fee multiplier must be zero + let mut prev_multiplier = Fixed64::from_parts(0); + + t.execute_with(|| { + assert_eq!(TransactionPayment::next_fee_multiplier(), prev_multiplier); + }); + + let mut tt = new_test_ext(COMPACT_CODE, false); + + // big one in terms of weight. + let block1 = construct_block( + &mut tt, + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(42 * 1000)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(0, 0))), + function: Call::System(frame_system::Call::fill_block()), + } + ] + ); + + // small one in terms of weight. + let block2 = construct_block( + &mut tt, + 2, + block1.1.clone(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(52 * 1000)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(1, 0))), + function: Call::System(frame_system::Call::remark(vec![0; 1])), + } + ] + ); + + println!("++ Block 1 size: {} / Block 2 size {}", block1.0.encode().len(), block2.0.encode().len()); + + // execute a big block. + executor_call:: _>( + &mut t, + "Core_execute_block", + &block1.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + t.execute_with(|| { + let fm = TransactionPayment::next_fee_multiplier(); + println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm > prev_multiplier); + prev_multiplier = fm; + }); + + // execute a big block. + executor_call:: _>( + &mut t, + "Core_execute_block", + &block2.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + t.execute_with(|| { + let fm = TransactionPayment::next_fee_multiplier(); + println!("After a small block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm < prev_multiplier); + }); +} + +#[test] +fn transaction_fee_is_correct_ultimate() { + // This uses the exact values of substrate-node. + // + // weight of transfer call as of now: 1_000_000 + // if weight of the cheapest weight would be 10^7, this would be 10^9, which is: + // - 1 MILLICENTS in substrate node. + // - 1 milli-dot based on current polkadot runtime. + // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { + top: map![ + >::hashed_key_for(alice()) => { + (100 * DOLLARS).encode() + }, + >::hashed_key_for(bob()) => { + (10 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => { + (110 * DOLLARS).encode() + }, + >::hashed_key().to_vec() => vec![0u8; 16], + >::hashed_key_for(0) => vec![0u8; 32] + ], + children: map![], + }); + + let tip = 1_000_000; + let xt = sign(CheckedExtrinsic { + signed: Some((alice(), signed_extra(0, tip))), + function: Call::Balances(default_transfer_call()), + }); + + let r = executor_call:: _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + true, + None, + ).0; + + assert!(r.is_ok()); + let r = executor_call:: _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt.clone()), + true, + None, + ).0; + assert!(r.is_ok()); + + t.execute_with(|| { + assert_eq!(Balances::total_balance(&bob()), (10 + 69) * DOLLARS); + // Components deducted from alice's balances: + // - Weight fee + // - Length fee + // - Tip + // - Creation-fee of bob's account. + let mut balance_alice = (100 - 69) * DOLLARS; + + let length_fee = TransactionBaseFee::get() + + TransactionByteFee::get() * + (xt.clone().encode().len() as Balance); + balance_alice -= length_fee; + + let weight = default_transfer_call().get_dispatch_info().weight; + let weight_fee = LinearWeightToFee::::convert(weight); + + // we know that weight to fee multiplier is effect-less in block 1. + assert_eq!(weight_fee as Balance, MILLICENTS); + balance_alice -= weight_fee; + + balance_alice -= tip; + balance_alice -= TransferFee::get(); + + assert_eq!(Balances::total_balance(&alice()), balance_alice); + }); +} + +#[test] +#[should_panic] +#[cfg(feature = "stress-test")] +fn block_weight_capacity_report() { + // Just report how many transfer calls you could fit into a block. The number should at least + // be a few hundred (250 at the time of writing but can change over time). Runs until panic. + use node_primitives::Index; + + // execution ext. + let mut t = new_test_ext(COMPACT_CODE, false); + // setup ext. + let mut tt = new_test_ext(COMPACT_CODE, false); + + let factor = 50; + let mut time = 10; + let mut nonce: Index = 0; + let mut block_number = 1; + let mut previous_hash: Hash = GENESIS_HASH.into(); + + loop { + let num_transfers = block_number * factor; + let mut xts = (0..num_transfers).map(|i| CheckedExtrinsic { + signed: Some((charlie(), signed_extra(nonce + i as Index, 0))), + function: Call::Balances(pallet_balances::Call::transfer(bob().into(), 0)), + }).collect::>(); + + xts.insert(0, CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(time * 1000)), + }); + + // NOTE: this is super slow. Can probably be improved. + let block = construct_block( + &mut tt, + block_number, + previous_hash, + xts + ); + + let len = block.0.len(); + print!( + "++ Executing block with {} transfers. Block size = {} bytes / {} kb / {} mb", + num_transfers, + len, + len / 1024, + len / 1024 / 1024, + ); + + let r = executor_call:: _>( + &mut t, + "Core_execute_block", + &block.0, + true, + None, + ).0; + + println!(" || Result = {:?}", r); + assert!(r.is_ok()); + + previous_hash = block.1; + nonce += num_transfers; + time += 10; + block_number += 1; + } +} + +#[test] +#[should_panic] +#[cfg(feature = "stress-test")] +fn block_length_capacity_report() { + // Just report how big a block can get. Executes until panic. Should be ignored unless if + // manually inspected. The number should at least be a few megabytes (5 at the time of + // writing but can change over time). + use node_primitives::Index; + + // execution ext. + let mut t = new_test_ext(COMPACT_CODE, false); + // setup ext. + let mut tt = new_test_ext(COMPACT_CODE, false); + + let factor = 256 * 1024; + let mut time = 10; + let mut nonce: Index = 0; + let mut block_number = 1; + let mut previous_hash: Hash = GENESIS_HASH.into(); + + loop { + // NOTE: this is super slow. Can probably be improved. + let block = construct_block( + &mut tt, + block_number, + previous_hash, + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(pallet_timestamp::Call::set(time * 1000)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(nonce, 0))), + function: Call::System(frame_system::Call::remark(vec![0u8; (block_number * factor) as usize])), + }, + ] + ); + + let len = block.0.len(); + print!( + "++ Executing block with big remark. Block size = {} bytes / {} kb / {} mb", + len, + len / 1024, + len / 1024 / 1024, + ); + + let r = executor_call:: _>( + &mut t, + "Core_execute_block", + &block.0, + true, + None, + ).0; + + println!(" || Result = {:?}", r); + assert!(r.is_ok()); + + previous_hash = block.1; + nonce += 1; + time += 10; + block_number += 1; + } +} diff --git a/bin/node/executor/tests/submit_transaction.rs b/bin/node/executor/tests/submit_transaction.rs new file mode 100644 index 0000000000..43702dbb35 --- /dev/null +++ b/bin/node/executor/tests/submit_transaction.rs @@ -0,0 +1,184 @@ +// Copyright 2018-2020 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 node_runtime::{ + Call, Executive, Indices, Runtime, SubmitTransaction, UncheckedExtrinsic, +}; +use sp_application_crypto::AppKey; +use sp_core::testing::KeyStore; +use sp_core::traits::KeystoreExt; +use sp_core::offchain::{ + TransactionPoolExt, + testing::TestTransactionPoolExt, +}; +use frame_system::offchain::{SubmitSignedTransaction, SubmitUnsignedTransaction}; +use pallet_im_online::sr25519::AuthorityPair as Key; +use codec::Decode; + +mod common; +use self::common::*; + +#[test] +fn should_submit_unsigned_transaction() { + let mut t = new_test_ext(COMPACT_CODE, false); + let (pool, state) = TestTransactionPoolExt::new(); + t.register_extension(TransactionPoolExt::new(pool)); + + t.execute_with(|| { + let signature = Default::default(); + let heartbeat_data = pallet_im_online::Heartbeat { + block_number: 1, + network_state: Default::default(), + session_index: 1, + authority_index: 0, + }; + + let call = pallet_im_online::Call::heartbeat(heartbeat_data, signature); + > + ::submit_unsigned(call) + .unwrap(); + + assert_eq!(state.read().transactions.len(), 1) + }); +} + +const PHRASE: &str = "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; + +#[test] +fn should_submit_signed_transaction() { + let mut t = new_test_ext(COMPACT_CODE, false); + let (pool, state) = TestTransactionPoolExt::new(); + t.register_extension(TransactionPoolExt::new(pool)); + + let keystore = KeyStore::new(); + keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap(); + keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter2", PHRASE))).unwrap(); + keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter3", PHRASE))).unwrap(); + t.register_extension(KeystoreExt(keystore)); + + t.execute_with(|| { + let keys = > + ::find_all_local_keys(); + assert_eq!(keys.len(), 3, "Missing keys: {:?}", keys); + + let can_sign = > + ::can_sign(); + assert!(can_sign, "Since there are keys, `can_sign` should return true"); + + let call = pallet_balances::Call::transfer(Default::default(), Default::default()); + let results = + >::submit_signed(call); + + let len = results.len(); + assert_eq!(len, 3); + assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len); + assert_eq!(state.read().transactions.len(), len); + }); +} + +#[test] +fn should_submit_signed_twice_from_the_same_account() { + let mut t = new_test_ext(COMPACT_CODE, false); + let (pool, state) = TestTransactionPoolExt::new(); + t.register_extension(TransactionPoolExt::new(pool)); + + let keystore = KeyStore::new(); + keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap(); + t.register_extension(KeystoreExt(keystore)); + + t.execute_with(|| { + let call = pallet_balances::Call::transfer(Default::default(), Default::default()); + let results = + >::submit_signed(call); + + let len = results.len(); + assert_eq!(len, 1); + assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len); + assert_eq!(state.read().transactions.len(), 1); + + // submit another one from the same account. The nonce should be incremented. + let call = pallet_balances::Call::transfer(Default::default(), Default::default()); + let results = + >::submit_signed(call); + + let len = results.len(); + assert_eq!(len, 1); + assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len); + assert_eq!(state.read().transactions.len(), 2); + + // now check that the transaction nonces are not equal + let s = state.read(); + fn nonce(tx: UncheckedExtrinsic) -> frame_system::CheckNonce { + let extra = tx.signature.unwrap().2; + extra.3 + } + let nonce1 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[0]).unwrap()); + let nonce2 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[1]).unwrap()); + assert!( + nonce1 != nonce2, + "Transactions should have different nonces. Got: {:?}", nonce1 + ); + }); +} + +#[test] +fn submitted_transaction_should_be_valid() { + use codec::Encode; + use frame_support::storage::StorageMap; + use sp_runtime::transaction_validity::ValidTransaction; + use sp_runtime::traits::StaticLookup; + + let mut t = new_test_ext(COMPACT_CODE, false); + let (pool, state) = TestTransactionPoolExt::new(); + t.register_extension(TransactionPoolExt::new(pool)); + + let keystore = KeyStore::new(); + keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap(); + t.register_extension(KeystoreExt(keystore)); + + t.execute_with(|| { + let call = pallet_balances::Call::transfer(Default::default(), Default::default()); + let results = + >::submit_signed(call); + let len = results.len(); + assert_eq!(len, 1); + assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len); + }); + + // check that transaction is valid, but reset environment storage, + // since CreateTransaction increments the nonce + let tx0 = state.read().transactions[0].clone(); + let mut t = new_test_ext(COMPACT_CODE, false); + t.execute_with(|| { + let extrinsic = UncheckedExtrinsic::decode(&mut &*tx0).unwrap(); + // add balance to the account + let author = extrinsic.signature.clone().unwrap().0; + let address = Indices::lookup(author).unwrap(); + >::insert(&address, 5_000_000_000_000); + + // check validity + let res = Executive::validate_transaction(extrinsic); + + assert_eq!(res.unwrap(), ValidTransaction { + priority: 2_411_002_000_000, + requires: vec![], + provides: vec![(address, 0).encode()], + longevity: 127, + propagate: true, + }); + }); +} + diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index dba5c703b6..f2c50ba72f 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -22,7 +22,7 @@ use sp_std::prelude::*; use frame_support::{ - construct_runtime, parameter_types, + construct_runtime, parameter_types, debug, weights::Weight, traits::{SplitTwoWays, Currency, Randomness}, }; @@ -35,7 +35,7 @@ use sp_runtime::{ use sp_runtime::curve::PiecewiseLinear; use sp_runtime::transaction_validity::TransactionValidity; use sp_runtime::traits::{ - self, BlakeTwo256, Block as BlockT, NumberFor, StaticLookup, SaturatedConversion, + self, BlakeTwo256, Block as BlockT, StaticLookup, SaturatedConversion, OpaqueKeys, }; use sp_version::RuntimeVersion; @@ -448,7 +448,8 @@ impl pallet_sudo::Trait for Runtime { type Proposal = Call; } -type SubmitTransaction = TransactionSubmitter; +/// A runtime transaction submitter. +pub type SubmitTransaction = TransactionSubmitter; parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_SLOTS as _; @@ -517,7 +518,11 @@ impl frame_system::offchain::CreateTransaction for .checked_next_power_of_two() .map(|c| c / 2) .unwrap_or(2) as u64; - let current_block = System::block_number().saturated_into::(); + let current_block = System::block_number() + .saturated_into::() + // The `System::block_number` is initialized with `n+1`, + // so the actual block number is `n`. + .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( frame_system::CheckVersion::::new(), @@ -528,7 +533,9 @@ impl frame_system::offchain::CreateTransaction for pallet_transaction_payment::ChargeTransactionPayment::::from(tip), Default::default(), ); - let raw_payload = SignedPayload::new(call, extra).ok()?; + let raw_payload = SignedPayload::new(call, extra).map_err(|e| { + debug::warn!("Unable to create signed payload: {:?}", e); + }).ok()?; let signature = TSigner::sign(public, &raw_payload)?; let address = Indices::unlookup(account); let (call, extra, _) = raw_payload.deconstruct(); @@ -649,8 +656,8 @@ impl_runtime_apis! { } impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(number: NumberFor) { - Executive::offchain_worker(number) + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) } } @@ -750,22 +757,29 @@ impl_runtime_apis! { #[cfg(test)] mod tests { use super::*; - use frame_system::offchain::SubmitSignedTransaction; - - fn is_submit_signed_transaction(_arg: T) where - T: SubmitSignedTransaction< - Runtime, - Call, - Extrinsic=UncheckedExtrinsic, - CreateTransaction=Runtime, - Signer=ImOnlineId, - >, - {} + use frame_system::offchain::{SignAndSubmitTransaction, SubmitSignedTransaction}; #[test] - fn validate_bounds() { - let x = SubmitTransaction::default(); - is_submit_signed_transaction(x); + fn validate_transaction_submitter_bounds() { + fn is_submit_signed_transaction() where + T: SubmitSignedTransaction< + Runtime, + Call, + >, + {} + + fn is_sign_and_submit_transaction() where + T: SignAndSubmitTransaction< + Runtime, + Call, + Extrinsic=UncheckedExtrinsic, + CreateTransaction=Runtime, + Signer=ImOnlineId, + >, + {} + + is_submit_signed_transaction::(); + is_sign_and_submit_transaction::(); } #[test] diff --git a/bin/node/testing/src/keyring.rs b/bin/node/testing/src/keyring.rs index 5b6f7710e0..6b0d06875d 100644 --- a/bin/node/testing/src/keyring.rs +++ b/bin/node/testing/src/keyring.rs @@ -23,7 +23,9 @@ use sp_runtime::generic::Era; use codec::Encode; /// Alice's account id. -pub fn alice() -> AccountId { AccountKeyring::Alice.into() } +pub fn alice() -> AccountId { + AccountKeyring::Alice.into() +} /// Bob's account id. pub fn bob() -> AccountId { diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index 2beb8fe6c9..e4bf1bb75c 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -42,7 +42,7 @@ use futures::future::Future; use log::{debug, warn}; use sc_network::NetworkStateInfo; use sp_core::{offchain::{self, OffchainStorage}, ExecutionContext}; -use sp_runtime::{generic::BlockId, traits::{self, ProvideRuntimeApi}}; +use sp_runtime::{generic::BlockId, traits::{self, ProvideRuntimeApi, Header}}; mod api; @@ -92,33 +92,47 @@ impl OffchainWorkers< #[must_use] pub fn on_block_imported( &self, - number: &::Number, + header: &Block::Header, network_state: Arc, is_validator: bool, ) -> impl Future { let runtime = self.client.runtime_api(); - let at = BlockId::number(*number); - let has_api = runtime.has_api::>(&at); - debug!("Checking offchain workers at {:?}: {:?}", at, has_api); - - if has_api.unwrap_or(false) { + let at = BlockId::number(*header.number()); + let has_api_v1 = runtime.has_api_with::, _>( + &at, |v| v == 1 + ); + let has_api_v2 = runtime.has_api::>(&at); + let version = match (has_api_v1, has_api_v2) { + (_, Ok(true)) => 2, + (Ok(true), _) => 1, + _ => 0, + }; + + debug!("Checking offchain workers at {:?}: version:{}", at, version); + if version > 0 { let (api, runner) = api::AsyncApi::new( self.db.clone(), network_state.clone(), is_validator, ); debug!("Spawning offchain workers at {:?}", at); - let number = *number; + let header = header.clone(); let client = self.client.clone(); self.spawn_worker(move || { let runtime = client.runtime_api(); let api = Box::new(api); debug!("Running offchain workers at {:?}", at); - let run = runtime.offchain_worker_with_context( - &at, - ExecutionContext::OffchainCall(Some((api, offchain::Capabilities::all()))), - number, - ); + let context = ExecutionContext::OffchainCall(Some( + (api, offchain::Capabilities::all()) + )); + let run = if version == 2 { + runtime.offchain_worker_with_context(&at, context, &header) + } else { + #[allow(deprecated)] + runtime.offchain_worker_before_version_2_with_context( + &at, context, *header.number() + ) + }; if let Err(e) = run { log::error!("Error running offchain workers at {:?}: {:?}", at, e); } @@ -150,6 +164,7 @@ mod tests { use substrate_test_runtime_client::runtime::Block; use sc_transaction_pool::{BasicPool, FullChainApi}; use sp_transaction_pool::{TransactionPool, InPoolTransaction}; + use sp_runtime::{generic::Header, traits::Header as _}; struct MockNetworkStateInfo(); @@ -169,7 +184,7 @@ mod tests { fn submit_at( &self, at: &BlockId, - extrinsic: ::Extrinsic, + extrinsic: ::Extrinsic, ) -> Result<(), ()> { futures::executor::block_on(self.0.submit_one(&at, extrinsic)) .map(|_| ()) @@ -187,10 +202,17 @@ mod tests { .register_transaction_pool(Arc::downgrade(&pool.clone()) as _); let db = sc_client_db::offchain::LocalStorage::new_test(); let network_state = Arc::new(MockNetworkStateInfo()); + let header = Header::new( + 0u64, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); // when let offchain = OffchainWorkers::new(client, db); - futures::executor::block_on(offchain.on_block_imported(&0u64, network_state, false)); + futures::executor::block_on(offchain.on_block_imported(&header, network_state, false)); // then assert_eq!(pool.0.status().ready, 1); diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index b1b7e059e3..6101724a83 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -400,7 +400,7 @@ fn should_return_runtime_version() { \"specVersion\":1,\"implVersion\":1,\"apis\":[[\"0xdf6acb689907609b\",2],\ [\"0x37e397fc7c91f5e4\",1],[\"0xd2bc9897eed08f15\",1],[\"0x40fe3ad401f8959a\",4],\ [\"0xc6e9a76309f39b09\",1],[\"0xdd718d5cc53262d4\",1],[\"0xcbca25e39f142387\",1],\ - [\"0xf78b278be53f454c\",1],[\"0xab3c0572291feb8b\",1],[\"0xbc9d89904f5b923f\",1]]}"; + [\"0xf78b278be53f454c\",2],[\"0xab3c0572291feb8b\",1],[\"0xbc9d89904f5b923f\",1]]}"; let runtime_version = api.runtime_version(None.into()).wait().unwrap(); let serialized = serde_json::to_string(&runtime_version).unwrap(); diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 8a4d760acc..1608a51feb 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -43,7 +43,7 @@ use sc_rpc; use sp_api::ConstructRuntimeApi; use sp_runtime::generic::BlockId; use sp_runtime::traits::{ - Block as BlockT, ProvideRuntimeApi, NumberFor, Header, SaturatedConversion, + Block as BlockT, ProvideRuntimeApi, NumberFor, SaturatedConversion, }; use sc_executor::{NativeExecutor, NativeExecutionDispatch}; use std::{ @@ -867,7 +867,6 @@ ServiceBuilder< let events = client.import_notification_stream() .map(|v| Ok::<_, ()>(v)).compat() .for_each(move |notification| { - let number = *notification.header.number(); let txpool = txpool.upgrade(); if let Some(txpool) = txpool.as_ref() { @@ -880,8 +879,11 @@ ServiceBuilder< let offchain = offchain.as_ref().and_then(|o| o.upgrade()); if let Some(offchain) = offchain { - let future = offchain.on_block_imported(&number, network_state_info.clone(), is_validator) - .map(|()| Ok(())); + let future = offchain.on_block_imported( + ¬ification.header, + network_state_info.clone(), + is_validator + ).map(|()| Ok(())); let _ = to_spawn_tx_.unbounded_send(Box::new(Compat::new(future))); } diff --git a/frame/authorship/src/lib.rs b/frame/authorship/src/lib.rs index 1c25b81790..216f5c729a 100644 --- a/frame/authorship/src/lib.rs +++ b/frame/authorship/src/lib.rs @@ -571,14 +571,22 @@ mod tests { inner: vec![seal_header(create_header(0, Default::default(), Default::default()), 999)], }; + let initialize_block = |number, hash: H256| System::initialize( + &number, + &hash, + &Default::default(), + &Default::default(), + Default::default() + ); + for number in 1..8 { - System::initialize(&number, &canon_chain.best_hash(), &Default::default(), &Default::default()); + initialize_block(number, canon_chain.best_hash()); let header = seal_header(System::finalize(), author_a); canon_chain.push(header); } // initialize so system context is set up correctly. - System::initialize(&8, &canon_chain.best_hash(), &Default::default(), &Default::default()); + initialize_block(8, canon_chain.best_hash()); // 2 of the same uncle at once { @@ -663,7 +671,13 @@ mod tests { ); header.digest_mut().pop(); // pop the seal off. - System::initialize(&1, &Default::default(), &Default::default(), header.digest()); + System::initialize( + &1, + &Default::default(), + &Default::default(), + header.digest(), + Default::default(), + ); assert_eq!(Authorship::author(), author); }); diff --git a/frame/babe/src/tests.rs b/frame/babe/src/tests.rs index 4e47014a8a..dbd6123816 100644 --- a/frame/babe/src/tests.rs +++ b/frame/babe/src/tests.rs @@ -81,7 +81,13 @@ fn first_block_epoch_zero_start() { ); assert_eq!(Babe::genesis_slot(), 0); - System::initialize(&1, &Default::default(), &Default::default(), &pre_digest); + System::initialize( + &1, + &Default::default(), + &Default::default(), + &pre_digest, + Default::default(), + ); // see implementation of the function for details why: we issue an // epoch-change digest but don't do it via the normal session mechanism. diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index ebc7218cc1..91679a9216 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -861,6 +861,16 @@ fn storage_size() { }); } +fn initialize_block(number: u64) { + System::initialize( + &number, + &[0u8; 32].into(), + &[0u8; 32].into(), + &Default::default(), + Default::default(), + ); +} + #[test] fn deduct_blocks() { let (wasm, code_hash) = compile_module::(CODE_SET_RENT).unwrap(); @@ -881,7 +891,7 @@ fn deduct_blocks() { assert_eq!(bob_contract.rent_allowance, 1_000); // Advance 4 blocks - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(5); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -896,7 +906,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(), &Default::default()); + initialize_block(12); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -971,7 +981,7 @@ fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) )); // Advance blocks - System::initialize(&blocks, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(blocks); // Trigger rent through call assert!(trigger_call()); @@ -1011,7 +1021,7 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(Balances::free_balance(&BOB), 100); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(10); // Trigger rent through call assert!(trigger_call()); @@ -1019,7 +1029,7 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(Balances::free_balance(&BOB), subsistence_threshold); // Advance blocks - System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(20); // Trigger rent must have no effect assert!(trigger_call()); @@ -1045,7 +1055,7 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(Balances::free_balance(&BOB), 1_000); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(10); // Trigger rent through call assert!(trigger_call()); @@ -1054,7 +1064,7 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(Balances::free_balance(&BOB), 900); // Advance blocks - System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(20); // Trigger rent must have no effect assert!(trigger_call()); @@ -1085,7 +1095,7 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(Balances::free_balance(&BOB), Balances::minimum_balance()); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(10); // Trigger rent through call assert!(trigger_call()); @@ -1093,7 +1103,7 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(Balances::free_balance(&BOB), Balances::minimum_balance()); // Advance blocks - System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(20); // Trigger rent must have no effect assert!(trigger_call()); @@ -1122,7 +1132,7 @@ fn call_removed_contract() { assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(10); // Calling contract should remove contract and fail. assert_err!( @@ -1209,7 +1219,7 @@ fn default_rent_allowance_on_instantiate() { assert_eq!(bob_contract.rent_allowance, >::max_value()); // Advance blocks - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(5); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -1355,7 +1365,7 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: } // Advance 4 blocks, to the 5th. - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(5); // Call `BOB`, which makes it pay rent. Since the rent allowance is set to 0 // we expect that it will get removed leaving tombstone. @@ -1384,7 +1394,7 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: if !test_restore_to_with_dirty_storage { // Advance 1 block, to the 6th. - System::initialize(&6, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + initialize_block(6); } // Perform a call to `DJANGO`. This should either perform restoration successfully or diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index b58d4a6790..b2b30edd1c 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -5,13 +5,13 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } -sp-io ={ path = "../../primitives/io", default-features = false } -sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } frame-support = { version = "2.0.0", default-features = false, path = "../support" } frame-system = { version = "2.0.0", default-features = false, path = "../system" } +serde = { version = "1.0.101", optional = true } +sp-io ={ path = "../../primitives/io", default-features = false } +sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } [dev-dependencies] hex-literal = "0.2.1" @@ -23,11 +23,11 @@ pallet-transaction-payment = { version = "2.0.0", path = "../transaction-payment [features] default = ["std"] std = [ - "sp-std/std", + "codec/std", "frame-support/std", + "frame-system/std", "serde", - "codec/std", - "sp-runtime/std", "sp-io/std", - "frame-system/std", + "sp-runtime/std", + "sp-std/std", ] diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index a7dc021aea..0507946ef5 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -82,7 +82,7 @@ use sp_runtime::{ generic::Digest, ApplyExtrinsicResult, traits::{ self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, OnInitialize, - NumberFor, Block as BlockT, OffchainWorker, Dispatchable, + NumberFor, Block as BlockT, OffchainWorker, Dispatchable, Saturating, }, transaction_validity::TransactionValidity, }; @@ -154,9 +154,23 @@ where { /// Start the execution of a particular block. pub fn initialize_block(header: &System::Header) { - 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); + let digests = Self::extract_pre_digest(&header); + Self::initialize_block_impl( + header.number(), + header.parent_hash(), + header.extrinsics_root(), + &digests + ); + } + + fn extract_pre_digest(header: &System::Header) -> DigestOf { + let mut digest = >::default(); + header.digest().logs() + .iter() + .for_each(|d| if d.as_pre_runtime().is_some() { + digest.push(d.clone()) + }); + digest } fn initialize_block_impl( @@ -165,7 +179,13 @@ where extrinsics_root: &System::Hash, digest: &Digest, ) { - >::initialize(block_number, parent_hash, extrinsics_root, digest); + >::initialize( + block_number, + parent_hash, + extrinsics_root, + digest, + frame_system::InitKind::Full, + ); >::on_initialize(*block_number); >::register_extra_weight_unchecked( >::on_initialize(*block_number) @@ -310,8 +330,24 @@ where } /// Start an offchain worker and generate extrinsics. - pub fn offchain_worker(n: System::BlockNumber) { - >::offchain_worker(n) + pub fn offchain_worker(header: &System::Header) { + // We need to keep events available for offchain workers, + // hence we initialize the block manually. + // OffchainWorker RuntimeApi should skip initialization. + let digests = Self::extract_pre_digest(header); + + >::initialize( + header.number(), + header.parent_hash(), + header.extrinsics_root(), + &digests, + frame_system::InitKind::Inspection, + ); + >::offchain_worker( + // to maintain backward compatibility we call module offchain workers + // with parent block number. + header.number().saturating_sub(1.into()) + ) } } diff --git a/frame/finality-tracker/src/lib.rs b/frame/finality-tracker/src/lib.rs index 1489fcd0dd..c9c9fbb0b5 100644 --- a/frame/finality-tracker/src/lib.rs +++ b/frame/finality-tracker/src/lib.rs @@ -291,7 +291,13 @@ mod tests { TestExternalities::new(t).execute_with(|| { let mut parent_hash = System::parent_hash(); for i in 2..106 { - System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); + System::initialize( + &i, + &parent_hash, + &Default::default(), + &Default::default(), + Default::default() + ); FinalityTracker::on_finalize(i); let hdr = System::finalize(); parent_hash = hdr.hash(); @@ -310,7 +316,13 @@ mod tests { TestExternalities::new(t).execute_with(|| { let mut parent_hash = System::parent_hash(); for i in 2..106 { - System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); + System::initialize( + &i, + &parent_hash, + &Default::default(), + &Default::default(), + Default::default(), + ); assert_ok!(FinalityTracker::dispatch( Call::final_hint(i-1), Origin::NONE, diff --git a/frame/grandpa/src/tests.rs b/frame/grandpa/src/tests.rs index c6728c70c8..ff3841b8d4 100644 --- a/frame/grandpa/src/tests.rs +++ b/frame/grandpa/src/tests.rs @@ -18,17 +18,27 @@ #![cfg(test)] -use sp_runtime::{testing::Digest, traits::{Header, OnFinalize}}; +use sp_runtime::{testing::{H256, Digest}, traits::{Header, OnFinalize}}; use crate::mock::*; use frame_system::{EventRecord, Phase}; use codec::{Decode, Encode}; use fg_primitives::ScheduledChange; use super::*; +fn initialize_block(number: u64, parent_hash: H256) { + System::initialize( + &number, + &parent_hash, + &Default::default(), + &Default::default(), + Default::default(), + ); +} + #[test] fn authorities_change_logged() { new_test_ext(vec![(1, 1), (2, 1), (3, 1)]).execute_with(|| { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + initialize_block(1, Default::default()); Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 0, None).unwrap(); System::note_finished_extrinsics(); @@ -56,7 +66,7 @@ fn authorities_change_logged() { #[test] fn authorities_change_logged_after_delay() { new_test_ext(vec![(1, 1), (2, 1), (3, 1)]).execute_with(|| { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + initialize_block(1, Default::default()); Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 1, None).unwrap(); Grandpa::on_finalize(1); let header = System::finalize(); @@ -71,7 +81,7 @@ fn authorities_change_logged_after_delay() { // no change at this height. assert_eq!(System::events(), vec![]); - System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); + initialize_block(2, header.hash()); System::note_finished_extrinsics(); Grandpa::on_finalize(2); @@ -89,7 +99,7 @@ fn authorities_change_logged_after_delay() { #[test] fn cannot_schedule_change_when_one_pending() { new_test_ext(vec![(1, 1), (2, 1), (3, 1)]).execute_with(|| { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + initialize_block(1, Default::default()); 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()); @@ -97,14 +107,14 @@ fn cannot_schedule_change_when_one_pending() { Grandpa::on_finalize(1); let header = System::finalize(); - System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); + initialize_block(2, header.hash()); 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()); + initialize_block(3, header.hash()); assert!(!>::exists()); assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_ok()); @@ -132,7 +142,7 @@ fn new_decodes_from_old() { #[test] fn dispatch_forced_change() { new_test_ext(vec![(1, 1), (2, 1), (3, 1)]).execute_with(|| { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + initialize_block(1, Default::default()); Grandpa::schedule_change( to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 5, @@ -146,7 +156,7 @@ fn dispatch_forced_change() { let mut header = System::finalize(); for i in 2..7 { - System::initialize(&i, &header.hash(), &Default::default(), &Default::default()); + initialize_block(i, header.hash()); assert!(>::get().unwrap().forced.is_some()); assert_eq!(Grandpa::next_forced(), Some(11)); assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err()); @@ -159,7 +169,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(), &Default::default()); + initialize_block(7, header.hash()); 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()); @@ -169,7 +179,7 @@ fn dispatch_forced_change() { // run the normal change. { - System::initialize(&8, &header.hash(), &Default::default(), &Default::default()); + initialize_block(8, header.hash()); 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()); @@ -180,7 +190,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(), &Default::default()); + initialize_block(i, header.hash()); assert!(!>::exists()); assert_eq!(Grandpa::grandpa_authorities(), to_authorities(vec![(5, 1)])); assert_eq!(Grandpa::next_forced(), Some(11)); @@ -190,7 +200,7 @@ fn dispatch_forced_change() { } { - System::initialize(&11, &header.hash(), &Default::default(), &Default::default()); + initialize_block(11, header.hash()); 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)); @@ -205,7 +215,7 @@ fn dispatch_forced_change() { fn schedule_pause_only_when_live() { new_test_ext(vec![(1, 1), (2, 1), (3, 1)]).execute_with(|| { // we schedule a pause at block 1 with delay of 1 - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + initialize_block(1, Default::default()); Grandpa::schedule_pause(1).unwrap(); // we've switched to the pending pause state @@ -220,7 +230,7 @@ fn schedule_pause_only_when_live() { Grandpa::on_finalize(1); let _ = System::finalize(); - System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); + initialize_block(2, Default::default()); // signaling a pause now should fail assert!(Grandpa::schedule_pause(1).is_err()); @@ -239,7 +249,7 @@ fn schedule_pause_only_when_live() { #[test] fn schedule_resume_only_when_paused() { new_test_ext(vec![(1, 1), (2, 1), (3, 1)]).execute_with(|| { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + initialize_block(1, Default::default()); // the set is currently live, resuming it is an error assert!(Grandpa::schedule_resume(1).is_err()); @@ -260,16 +270,16 @@ fn schedule_resume_only_when_paused() { ); // we schedule the set to go back live in 2 blocks - System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); + initialize_block(2, Default::default()); Grandpa::schedule_resume(2).unwrap(); Grandpa::on_finalize(2); let _ = System::finalize(); - System::initialize(&3, &Default::default(), &Default::default(), &Default::default()); + initialize_block(3, Default::default()); Grandpa::on_finalize(3); let _ = System::finalize(); - System::initialize(&4, &Default::default(), &Default::default(), &Default::default()); + initialize_block(4, Default::default()); Grandpa::on_finalize(4); let _ = System::finalize(); diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index 64cd9fae6f..62d0ec6ac4 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -171,10 +171,14 @@ pub type AuthIndex = u32; pub struct Heartbeat where BlockNumber: PartialEq + Eq + Decode + Encode, { - block_number: BlockNumber, - network_state: OpaqueNetworkState, - session_index: SessionIndex, - authority_index: AuthIndex, + /// Block number at the time heartbeat is created.. + pub block_number: BlockNumber, + /// A state of local network (peer id and external addresses) + pub network_state: OpaqueNetworkState, + /// Index of the current session. + pub session_index: SessionIndex, + /// An index of the authority on the list of validators. + pub authority_index: AuthIndex, } pub trait Trait: frame_system::Trait + pallet_session::historical::Trait { diff --git a/frame/randomness-collective-flip/src/lib.rs b/frame/randomness-collective-flip/src/lib.rs index 69c1680659..c7f7bb0db7 100644 --- a/frame/randomness-collective-flip/src/lib.rs +++ b/frame/randomness-collective-flip/src/lib.rs @@ -210,7 +210,13 @@ mod tests { let mut parent_hash = System::parent_hash(); for i in 1 .. (blocks + 1) { - System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); + System::initialize( + &i, + &parent_hash, + &Default::default(), + &Default::default(), + frame_system::InitKind::Full, + ); CollectiveFlip::on_initialize(i); let header = System::finalize(); diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index f2902a11cf..10c0bdfc51 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -531,6 +531,27 @@ pub fn ensure_none(o: OuterOrigin) -> Result<(), BadOrig } } +/// A type of block initialization to perform. +pub enum InitKind { + /// Leave inspectable storage entries in state. + /// + /// i.e. `Events` are not being reset. + /// Should only be used for off-chain calls, + /// regular block execution should clear those. + Inspection, + + /// Reset also inspectable storage entries. + /// + /// This should be used for regular block execution. + Full, +} + +impl Default for InitKind { + fn default() -> Self { + InitKind::Full + } +} + impl Module { /// Deposits an event into this block's event record. pub fn deposit_event(event: impl Into) { @@ -633,6 +654,7 @@ impl Module { parent_hash: &T::Hash, txs_root: &T::Hash, digest: &DigestOf, + kind: InitKind, ) { // populate environment storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); @@ -641,9 +663,12 @@ impl Module { >::put(parent_hash); >::insert(*number - One::one(), parent_hash); >::put(txs_root); - >::kill(); - EventCount::kill(); - >::remove_all(); + + if let InitKind::Full = kind { + >::kill(); + EventCount::kill(); + >::remove_all(); + } } /// Remove temporary "environment" entries in storage. @@ -1220,7 +1245,13 @@ mod tests { #[test] fn deposit_event_should_work() { new_test_ext().execute_with(|| { - System::initialize(&1, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + System::initialize( + &1, + &[0u8; 32].into(), + &[0u8; 32].into(), + &Default::default(), + InitKind::Full, + ); System::note_finished_extrinsics(); System::deposit_event(1u16); System::finalize(); @@ -1235,7 +1266,13 @@ mod tests { ] ); - System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + System::initialize( + &2, + &[0u8; 32].into(), + &[0u8; 32].into(), + &Default::default(), + InitKind::Full, + ); System::deposit_event(42u16); System::note_applied_extrinsic(&Ok(()), 0, Default::default()); System::note_applied_extrinsic(&Err(DispatchError::BadOrigin), 0, Default::default()); @@ -1264,6 +1301,7 @@ mod tests { &[0u8; 32].into(), &[0u8; 32].into(), &Default::default(), + InitKind::Full, ); System::note_finished_extrinsics(); @@ -1329,6 +1367,7 @@ mod tests { &[n as u8 - 1; 32].into(), &[0u8; 32].into(), &Default::default(), + InitKind::Full, ); System::finalize(); diff --git a/frame/system/src/offchain.rs b/frame/system/src/offchain.rs index 14b57d8903..f5fda34585 100644 --- a/frame/system/src/offchain.rs +++ b/frame/system/src/offchain.rs @@ -14,17 +14,55 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Module helpers for offchain calls. +//! Module helpers for off-chain calls. use codec::Encode; -use sp_runtime::app_crypto::{self, RuntimeAppPublic}; +use sp_std::convert::TryInto; +use sp_std::prelude::Vec; +use sp_runtime::app_crypto::{RuntimeAppPublic, AppPublic, AppSignature}; use sp_runtime::traits::{Extrinsic as ExtrinsicT, IdentifyAccount}; +use frame_support::debug; + +/// Creates runtime-specific signed transaction. +/// +/// This trait should be implemented by your `Runtime` to be able +/// to submit `SignedTransaction`s` to the pool from off-chain code. +pub trait CreateTransaction { + /// A `Public` key representing a particular `AccountId`. + type Public: IdentifyAccount + Clone; + /// A `Signature` generated by the `Signer`. + type Signature; + + /// Attempt to create signed extrinsic data that encodes call from given account. + /// + /// Runtime implementation is free to construct the payload to sign and the signature + /// in any way it wants. + /// Returns `None` if signed extrinsic could not be created (either because signing failed + /// or because of any other runtime-specific reason). + fn create_transaction>( + call: Extrinsic::Call, + public: Self::Public, + account: T::AccountId, + nonce: T::Index, + ) -> Option<(Extrinsic::Call, Extrinsic::SignaturePayload)>; +} /// A trait responsible for signing a payload using given account. +/// +/// This trait is usually going to represent a local public key +/// that has ability to sign arbitrary `Payloads`. +/// +/// NOTE: Most likely you don't need to implement this trait manually. +/// It has a blanket implementation for all `RuntimeAppPublic` types, +/// so it's enough to pass an application-specific crypto type. +/// +/// To easily create `SignedTransaction`s have a look at the +/// [`TransactionSubmitter`] type. pub trait Signer { /// Sign any encodable payload with given account and produce a signature. /// - /// Returns `Some` if signing succeeded and `None` in case the `account` couldn't be used. + /// Returns `Some` if signing succeeded and `None` in case the `account` couldn't + /// be used (for instance we couldn't convert it to required application specific crypto). fn sign(public: Public, payload: &Payload) -> Option; } @@ -33,22 +71,22 @@ pub trait Signer { /// This implementation additionaly supports conversion to/from multi-signature/multi-signer /// wrappers. /// If the wrapped crypto doesn't match `AppPublic`s crypto `None` is returned. -impl Signer for AppPublic where - AppPublic: RuntimeAppPublic - + app_crypto::AppPublic - + From<::Generic>, - ::Signature: app_crypto::AppSignature, +impl Signer for TAnyAppPublic where + TAnyAppPublic: RuntimeAppPublic + + AppPublic + + From<::Generic>, + ::Signature: AppSignature, Signature: From< - <::Signature as app_crypto::AppSignature>::Generic + <::Signature as AppSignature>::Generic >, - Public: sp_std::convert::TryInto<::Generic> + Public: TryInto<::Generic> { fn sign(public: Public, raw_payload: &Payload) -> Option { raw_payload.using_encoded(|payload| { let public = public.try_into().ok()?; - AppPublic::from(public).sign(&payload) + TAnyAppPublic::from(public).sign(&payload) .map( - <::Signature as app_crypto::AppSignature> + <::Signature as AppSignature> ::Generic::from ) .map(Signature::from) @@ -56,36 +94,20 @@ impl Signer for AppPublic where } } -/// Creates a runtime-specific signed transaction. -pub trait CreateTransaction { - /// A `Public` key representing a particular `AccountId`. - type Public: IdentifyAccount + Clone; - /// A `Signature` generated by the `Signer`. - type Signature; - - /// Attempt to create signed extrinsic data that encodes call from given account. - /// - /// Runtime implementation is free to construct the payload to sign and the signature - /// in any way it wants. - /// Returns `None` if signed extrinsic could not be created (either because signing failed - /// or because of any other runtime-specific reason). - fn create_transaction>( - call: Extrinsic::Call, - public: Self::Public, - account: T::AccountId, - nonce: T::Index, - ) -> Option<(Extrinsic::Call, Extrinsic::SignaturePayload)>; -} - -type PublicOf = < - >::CreateTransaction as CreateTransaction< - T, - >::Extrinsic, - > +/// Retrieves a public key type for given `SignAndSubmitTransaction`. +pub type PublicOf = < + >::CreateTransaction + as + CreateTransaction>::Extrinsic> >::Public; -/// A trait to sign and submit transactions in offchain calls. -pub trait SubmitSignedTransaction { +/// A trait to sign and submit transactions in off-chain calls. +/// +/// NOTE: Most likely you should not implement this trait yourself. +/// There is an implementation for +/// [`TransactionSubmitter`] type, which +/// you should use. +pub trait SignAndSubmitTransaction { /// Unchecked extrinsic type. type Extrinsic: ExtrinsicT + codec::Encode; @@ -107,15 +129,30 @@ pub trait SubmitSignedTransaction { let call = call.into(); let id = public.clone().into_account(); let expected = >::account_nonce(&id); + debug::native::debug!( + target: "offchain", + "Creating signed transaction from account: {:?} (nonce: {:?})", + id, + expected, + ); let (call, signature_data) = Self::CreateTransaction - ::create_transaction::(call, public, id, expected) + ::create_transaction::(call, public, id.clone(), expected) .ok_or(())?; + // increment the nonce. This is fine, since the code should always + // be running in off-chain context, so we NEVER persists data. + >::inc_account_nonce(&id); + let xt = Self::Extrinsic::new(call, Some(signature_data)).ok_or(())?; sp_io::offchain::submit_transaction(xt.encode()) } } /// A trait to submit unsigned transactions in off-chain calls. +/// +/// NOTE: Most likely you should not implement this trait yourself. +/// There is an implementation for +/// [`TransactionSubmitter`] type, which +/// you should use. pub trait SubmitUnsignedTransaction { /// Unchecked extrinsic type. type Extrinsic: ExtrinsicT + codec::Encode; @@ -130,9 +167,114 @@ pub trait SubmitUnsignedTransaction { } } +/// A utility trait to easily create signed transactions +/// from accounts in node's local keystore. +/// +/// NOTE: Most likely you should not implement this trait yourself. +/// There is an implementation for +/// [`TransactionSubmitter`] type, which +/// you should use. +pub trait SubmitSignedTransaction { + /// A `SignAndSubmitTransaction` implementation. + type SignAndSubmit: SignAndSubmitTransaction; + + /// Find local keys that match given list of accounts. + /// + /// Technically it finds an intersection between given list of `AccountId`s + /// and accounts that are represented by public keys in local keystore. + /// If `None` is passed it returns all accounts in the keystore. + /// + /// Returns both public keys and `AccountId`s of accounts that are available. + /// Such accounts can later be used to sign a payload or send signed transactions. + fn find_local_keys(accounts: Option>) -> Vec<( + T::AccountId, + PublicOf, + )>; + + /// Find all available local keys. + /// + /// This is equivalent of calling `find_local_keys(None)`. + fn find_all_local_keys() -> Vec<(T::AccountId, PublicOf)> { + Self::find_local_keys(None as Option>) + } + + /// Check if there are keys for any of given accounts that could be used to send a transaction. + /// + /// This check can be used as an early-exit condition to avoid doing too + /// much work, before we actually realise that there are no accounts that you + /// we could use for signing. + fn can_sign_with(accounts: Option>) -> bool { + !Self::find_local_keys(accounts).is_empty() + } + + /// Check if there are any keys that could be used for signing. + /// + /// This is equivalent of calling `can_sign_with(None)`. + fn can_sign() -> bool { + Self::can_sign_with(None as Option>) + } + + /// Create and submit signed transactions from supported accounts. + /// + /// This method should intersect given list of accounts with the ones + /// supported locally and submit signed transaction containing given `Call` + /// with every of them. + /// + /// Returns a vector of results and account ids that were supported. + #[must_use] + fn submit_signed_from( + call: impl Into + Clone, + accounts: impl IntoIterator, + ) -> Vec<(T::AccountId, Result<(), ()>)> { + let keys = Self::find_local_keys(Some(accounts)); + keys.into_iter().map(|(account, pub_key)| { + let call = call.clone().into(); + ( + account, + Self::SignAndSubmit::sign_and_submit(call, pub_key) + ) + }).collect() + } + + /// Create and submit signed transactions from all local accounts. + /// + /// This method submits a signed transaction from all local accounts + /// for given application crypto. + /// + /// Returns a vector of results and account ids that were supported. + #[must_use] + fn submit_signed( + call: impl Into + Clone, + ) -> Vec<(T::AccountId, Result<(), ()>)> { + let keys = Self::find_all_local_keys(); + keys.into_iter().map(|(account, pub_key)| { + let call = call.clone().into(); + ( + account, + Self::SignAndSubmit::sign_and_submit(call, pub_key) + ) + }).collect() + } +} + /// A default type used to submit transactions to the pool. -pub struct TransactionSubmitter { - _signer: sp_std::marker::PhantomData<(S, C, E)>, +/// +/// This is passed into each runtime as an opaque associated type that can have either of: +/// - [`SignAndSubmitTransaction`] +/// - [`SubmitUnsignedTransaction`] +/// - [`SubmitSignedTransaction`] +/// and used accordingly. +/// +/// This struct should be constructed by providing the following generic parameters: +/// * `Signer` - Usually the application specific key type (see `app_crypto`). +/// * `CreateTransaction` - A type that is able to produce signed transactions, +/// usually it's going to be the entire `Runtime` object. +/// * `Extrinsic` - A runtime-specific type for in-block extrinsics. +/// +/// If you only need the ability to submit unsigned transactions, +/// you may substitute both `Signer` and `CreateTransaction` with any type. +pub struct TransactionSubmitter { + _signer: sp_std::marker::PhantomData<(Signer, CreateTransaction, Extrinsic)>, } impl Default for TransactionSubmitter { @@ -144,7 +286,7 @@ impl Default for TransactionSubmitter { } /// A blanket implementation to simplify creation of transaction signer & submitter in the runtime. -impl SubmitSignedTransaction for TransactionSubmitter where +impl SignAndSubmitTransaction for TransactionSubmitter where T: crate::Trait, C: CreateTransaction, S: Signer<>::Public, >::Signature>, @@ -155,10 +297,68 @@ impl SubmitSignedTransaction for TransactionSubmitter type Signer = S; } -/// A blanket impl to use the same submitter for usigned transactions as well. +/// A blanket implementation to use the same submitter for unsigned transactions as well. impl SubmitUnsignedTransaction for TransactionSubmitter where T: crate::Trait, E: ExtrinsicT + codec::Encode, { type Extrinsic = E; } + +/// A blanket implementation to support local keystore of application-crypto types. +impl SubmitSignedTransaction for TransactionSubmitter where + T: crate::Trait, + C: CreateTransaction, + E: ExtrinsicT + codec::Encode, + S: Signer<>::Public, >::Signature>, + // Make sure we can unwrap the app crypto key. + S: RuntimeAppPublic + AppPublic + Into<::Generic>, + // Make sure we can convert from wrapped crypto to public key (e.g. `MultiSigner`) + S::Generic: Into>, + // For simplicity we require the same trait to implement `SignAndSubmitTransaction` too. + Self: SignAndSubmitTransaction, +{ + type SignAndSubmit = Self; + + fn find_local_keys(accounts: Option>) -> Vec<( + T::AccountId, + PublicOf, + )> { + // Convert app-specific keys into generic ones. + let local_accounts_and_keys = S::all() + .into_iter() + .map(|app_key| { + // unwrap app-crypto + let generic_pub_key: ::Generic = app_key.into(); + // convert to expected public key type (might be MultiSigner) + let signer_pub_key: PublicOf = generic_pub_key.into(); + // lookup accountid for that pubkey + let account = signer_pub_key.clone().into_account(); + (account, signer_pub_key) + }).collect::>(); + + if let Some(accounts) = accounts { + let mut local_accounts_and_keys = local_accounts_and_keys; + // sort by accountId to allow bin-search. + local_accounts_and_keys.sort_by(|a, b| a.0.cmp(&b.0)); + + // get all the matching accounts + accounts.into_iter().filter_map(|acc| { + let idx = local_accounts_and_keys.binary_search_by(|a| a.0.cmp(&acc)).ok()?; + local_accounts_and_keys.get(idx).cloned() + }).collect() + } else { + // just return all account ids and keys + local_accounts_and_keys + } + } + + fn can_sign_with(accounts: Option>) -> bool { + // early exit if we care about any account. + if accounts.is_none() { + !S::all().is_empty() + } else { + !Self::find_local_keys(accounts).is_empty() + } + } +} diff --git a/primitives/core/src/offchain/mod.rs b/primitives/core/src/offchain/mod.rs index 59a8e74ad2..e2e00c36e0 100644 --- a/primitives/core/src/offchain/mod.rs +++ b/primitives/core/src/offchain/mod.rs @@ -174,6 +174,7 @@ impl TryFrom for HttpRequestStatus { /// A blob to hold information about the local node's network state /// without committing to its format. #[derive(Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, PassByCodec)] +#[cfg_attr(feature = "std", derive(Default))] pub struct OpaqueNetworkState { /// PeerId of the local node. pub peer_id: OpaquePeerId, diff --git a/primitives/offchain/src/lib.rs b/primitives/offchain/src/lib.rs index d975e99a78..1dd20db0dd 100644 --- a/primitives/offchain/src/lib.rs +++ b/primitives/offchain/src/lib.rs @@ -26,9 +26,15 @@ pub const STORAGE_PREFIX: &[u8] = b"storage"; sp_api::decl_runtime_apis! { /// The offchain worker api. + #[api_version(2)] pub trait OffchainWorkerApi { /// Starts the off-chain task for given block number. #[skip_initialize_block] + #[changed_in(2)] fn offchain_worker(number: NumberFor); + + /// Starts the off-chain task for given block header. + #[skip_initialize_block] + fn offchain_worker(header: &Block::Header); } } diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index d00f4c4380..8babfa47ff 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -23,7 +23,7 @@ use sp_io; use std::fmt::Display; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; -use sp_core::{self, Hasher, Blake2Hasher, TypeId}; +use sp_core::{self, Hasher, Blake2Hasher, TypeId, RuntimeDebug}; use crate::codec::{Codec, Encode, Decode}; use crate::transaction_validity::{ ValidTransaction, TransactionValidity, TransactionValidityError, UnknownTransaction, @@ -157,7 +157,7 @@ pub trait EnsureOrigin { } /// An error that indicates that a lookup failed. -#[derive(Encode, Decode)] +#[derive(Encode, Decode, RuntimeDebug)] pub struct LookupError; impl From for &'static str { @@ -391,7 +391,7 @@ pub trait Hash: 'static + MaybeSerializeDeserialize + Debug + Clone + Eq + Parti } /// Blake2-256 Hash implementation. -#[derive(PartialEq, Eq, Clone, sp_core::RuntimeDebug)] +#[derive(PartialEq, Eq, Clone, RuntimeDebug)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct BlakeTwo256; diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index 6e68574dde..e67a989075 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -163,6 +163,8 @@ pub trait TransactionPool: Send + Sync { /// Error type. type Error: From + crate::error::IntoPoolError; + // Networking + /// Returns a future that imports a bunch of unverified transactions to the pool. fn submit_at( &self, @@ -183,6 +185,8 @@ pub trait TransactionPool: Send + Sync { Self::Error >> + Send + Unpin>; + // RPC + /// Returns a future that import a single transaction and starts to watch their progress in the pool. fn submit_and_watch( &self, @@ -190,23 +194,35 @@ pub trait TransactionPool: Send + Sync { xt: TransactionFor, ) -> Box>, Self::Error>> + Send + Unpin>; + + // Block production / Networking + + /// Get an iterator for ready transactions ordered by priority + fn ready(&self) -> Box>>; + + + // Block production + /// Remove transactions identified by given hashes (and dependent transactions) from the pool. fn remove_invalid(&self, hashes: &[TxHash]) -> Vec>; + // logging + /// Returns pool status. fn status(&self) -> PoolStatus; - /// Get an iterator for ready transactions ordered by priority - fn ready(&self) -> Box>>; + // logging / RPC / networking /// Return an event stream of transactions imported to the pool. fn import_notification_stream(&self) -> ImportNotificationStream; - /// Returns transaction hash - fn hash_of(&self, xt: &TransactionFor) -> TxHash; + // networking /// Notify the pool about transactions broadcast. fn on_broadcasted(&self, propagations: HashMap, Vec>); + + /// Returns transaction hash + fn hash_of(&self, xt: &TransactionFor) -> TxHash; } /// An abstraction for transaction pool. diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index cf1d76f390..3fa2fc6246 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -623,8 +623,8 @@ cfg_if! { } impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(block: u64) { - let ex = Extrinsic::IncludeData(block.encode()); + fn offchain_worker(header: &::Header) { + let ex = Extrinsic::IncludeData(header.number.encode()); sp_io::offchain::submit_transaction(ex.encode()).unwrap(); } } @@ -839,8 +839,8 @@ cfg_if! { } impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(block: u64) { - let ex = Extrinsic::IncludeData(block.encode()); + fn offchain_worker(header: &::Header) { + let ex = Extrinsic::IncludeData(header.number.encode()); sp_io::offchain::submit_transaction(ex.encode()).unwrap() } } -- GitLab From 4ed0ad6fbd8b25b63105dc21710ace3c329de0d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 10 Jan 2020 10:48:32 +0100 Subject: [PATCH 087/296] Remove requirement on `Hash = H256`, make `Proposer` return `StorageChanges` and `Proof` (#3860) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Extend `Proposer` to optionally generate a proof of the proposal * Something * Refactor sr-api to not depend on client anymore * Fix benches * Apply suggestions from code review Co-Authored-By: Tomasz Drwięga * Apply suggestions from code review * Introduce new `into_storage_changes` function * Switch to runtime api for `execute_block` and don't require `H256` anywhere in the code * Put the `StorageChanges` into the `Proposal` * Move the runtime api error to its own trait * Adds `StorageTransactionCache` to the runtime api This requires that we add `type NodeBlock = ` to the `impl_runtime_apis!` macro to work around some bugs in rustc :( * Remove `type NodeBlock` and switch to a "better" hack * Start using the transaction cache from the runtime api * Make it compile * Move `InMemory` to its own file * Make all tests work again * Return block, storage_changes and proof from Blockbuilder::bake() * Make sure that we use/set `storage_changes` when possible * Add test * Fix deadlock * Remove accidentally added folders * Introduce `RecordProof` as argument type to be more explicit * Update client/src/client.rs Co-Authored-By: Tomasz Drwięga * Update primitives/state-machine/src/ext.rs Co-Authored-By: Tomasz Drwięga * Integrates review feedback * Remove `unsafe` usage * Update client/block-builder/src/lib.rs Co-Authored-By: Benjamin Kampmann * Update client/src/call_executor.rs * Bump versions Co-authored-by: Tomasz Drwięga Co-authored-by: Benjamin Kampmann --- Cargo.lock | 16 +- bin/node-template/src/service.rs | 2 +- bin/node/cli/src/service.rs | 11 +- bin/node/executor/Cargo.toml | 2 +- bin/node/executor/src/lib.rs | 1 - bin/node/executor/tests/basic.rs | 6 +- bin/node/executor/tests/common.rs | 6 +- bin/node/executor/tests/fees.rs | 2 +- bin/node/executor/tests/submit_transaction.rs | 2 +- bin/node/rpc/Cargo.toml | 1 + bin/node/rpc/src/lib.rs | 4 +- bin/node/runtime/src/lib.rs | 4 +- .../transaction-factory/src/complex_mode.rs | 18 +- bin/node/transaction-factory/src/lib.rs | 55 +- .../transaction-factory/src/simple_modes.rs | 18 +- client/api/src/backend.rs | 96 +- client/api/src/call_executor.rs | 60 +- client/api/src/lib.rs | 14 +- client/authority-discovery/Cargo.toml | 4 +- client/authority-discovery/src/lib.rs | 18 +- client/authority-discovery/src/tests.rs | 34 +- client/basic-authorship/Cargo.toml | 1 + .../basic-authorship/src/basic_authorship.rs | 176 +++- client/basic-authorship/src/lib.rs | 7 +- client/block-builder/Cargo.toml | 6 +- client/block-builder/src/lib.rs | 114 ++- client/consensus/aura/src/lib.rs | 135 ++- client/consensus/babe/src/epoch_changes.rs | 11 +- client/consensus/babe/src/lib.rs | 153 +-- client/consensus/babe/src/tests.rs | 63 +- client/consensus/pow/Cargo.toml | 1 + client/consensus/pow/src/lib.rs | 81 +- client/consensus/slots/Cargo.toml | 2 + client/consensus/slots/src/lib.rs | 59 +- client/db/src/lib.rs | 235 +++-- client/db/src/light.rs | 7 +- client/db/src/storage_cache.rs | 402 ++++++-- client/finality-grandpa/src/environment.rs | 35 +- client/finality-grandpa/src/finality_proof.rs | 28 +- client/finality-grandpa/src/import.rs | 62 +- client/finality-grandpa/src/justification.rs | 7 +- client/finality-grandpa/src/lib.rs | 83 +- client/finality-grandpa/src/light_import.rs | 148 ++- client/finality-grandpa/src/observer.rs | 42 +- client/finality-grandpa/src/tests.rs | 131 ++- client/network/src/chain.rs | 31 +- client/network/src/on_demand_layer.rs | 7 +- client/network/test/src/block_import.rs | 4 +- client/network/test/src/lib.rs | 182 +++- client/network/test/src/sync.rs | 2 +- client/offchain/src/lib.rs | 6 +- client/rpc/src/author/mod.rs | 27 +- client/rpc/src/chain/chain_full.rs | 12 +- client/rpc/src/chain/chain_light.rs | 13 +- client/rpc/src/chain/mod.rs | 31 +- client/rpc/src/chain/tests.rs | 47 +- client/rpc/src/state/mod.rs | 39 +- client/rpc/src/state/state_full.rs | 29 +- client/rpc/src/state/state_light.rs | 27 +- client/rpc/src/state/tests.rs | 16 +- client/service/src/builder.rs | 46 +- client/service/src/chain_ops.rs | 8 +- client/service/src/lib.rs | 22 +- client/src/call_executor.rs | 105 +- client/src/cht.rs | 11 +- client/src/client.rs | 945 ++++++++++-------- client/src/genesis.rs | 17 +- client/src/in_mem.rs | 159 ++- client/src/lib.rs | 2 +- client/src/light/backend.rs | 92 +- client/src/light/call_executor.rs | 130 +-- client/src/light/fetcher.rs | 23 +- client/src/light/mod.rs | 27 +- client/transaction-pool/src/api.rs | 27 +- client/transaction-pool/src/maintainer.rs | 41 +- frame/contracts/rpc/Cargo.toml | 1 + frame/contracts/rpc/src/lib.rs | 10 +- frame/membership/src/lib.rs | 1 - frame/system/src/lib.rs | 2 +- frame/transaction-payment/rpc/Cargo.toml | 1 + frame/transaction-payment/rpc/src/lib.rs | 10 +- primitives/api/Cargo.toml | 2 + .../api/proc-macro/src/decl_runtime_apis.rs | 97 +- .../api/proc-macro/src/impl_runtime_apis.rs | 237 +++-- primitives/api/proc-macro/src/utils.rs | 39 +- primitives/api/src/lib.rs | 188 +++- primitives/api/test/benches/bench.rs | 3 +- primitives/api/test/tests/decl_and_impl.rs | 12 +- primitives/api/test/tests/runtime_calls.rs | 10 +- .../test/tests/ui/declaring_old_block.stderr | 12 +- .../ui/impl_incorrect_method_signature.rs | 2 +- .../ui/impl_incorrect_method_signature.stderr | 10 +- .../ui/impl_two_traits_with_same_name.rs | 2 +- .../ui/impl_two_traits_with_same_name.stderr | 74 +- .../test/tests/ui/invalid_api_version.stderr | 28 - .../tests/ui/invalid_api_version_2.stderr | 28 - .../tests/ui/invalid_api_version_3.stderr | 28 - .../ui/missing_block_generic_parameter.stderr | 6 - ...ype_reference_in_impl_runtime_apis_call.rs | 2 +- ...reference_in_impl_runtime_apis_call.stderr | 10 +- primitives/application-crypto/src/ed25519.rs | 1 - primitives/application-crypto/src/sr25519.rs | 2 +- primitives/application-crypto/test/Cargo.toml | 1 + .../application-crypto/test/src/ed25519.rs | 3 +- .../application-crypto/test/src/sr25519.rs | 3 +- primitives/consensus/common/Cargo.toml | 1 + .../consensus/common/src/block_import.rs | 62 +- .../consensus/common/src/import_queue.rs | 16 +- .../common/src/import_queue/basic_queue.rs | 60 +- primitives/consensus/common/src/lib.rs | 80 +- primitives/io/src/lib.rs | 3 +- primitives/runtime-interface/test/src/lib.rs | 2 + primitives/runtime/src/generic/header.rs | 2 +- primitives/runtime/src/traits.rs | 50 +- primitives/session/src/lib.rs | 10 +- primitives/sr-api/proc-macro/src/lib.rs | 189 ++++ primitives/state-machine/src/backend.rs | 357 +------ primitives/state-machine/src/basic.rs | 4 +- .../state-machine/src/changes_trie/build.rs | 10 +- .../state-machine/src/changes_trie/mod.rs | 70 +- .../state-machine/src/changes_trie/storage.rs | 2 +- primitives/state-machine/src/ext.rs | 153 +-- .../state-machine/src/in_memory_backend.rs | 378 +++++++ primitives/state-machine/src/lib.rs | 209 ++-- .../state-machine/src/overlayed_changes.rs | 234 ++++- .../state-machine/src/proving_backend.rs | 24 +- primitives/state-machine/src/testing.rs | 50 +- .../state-machine/src/trie_backend_essence.rs | 45 +- primitives/test-primitives/src/lib.rs | 4 +- primitives/version/src/lib.rs | 23 +- test-utils/client/src/client_ext.rs | 168 +++- test-utils/client/src/lib.rs | 40 +- test-utils/runtime/client/Cargo.toml | 1 + .../runtime/client/src/block_builder_ext.rs | 19 +- test-utils/runtime/client/src/lib.rs | 101 +- test-utils/runtime/client/src/trait_tests.rs | 251 +++-- test-utils/runtime/src/lib.rs | 26 +- test-utils/runtime/src/system.rs | 66 +- utils/frame/rpc/system/Cargo.toml | 1 + utils/frame/rpc/system/src/lib.rs | 2 +- 140 files changed, 4775 insertions(+), 3254 deletions(-) create mode 100644 primitives/sr-api/proc-macro/src/lib.rs create mode 100644 primitives/state-machine/src/in_memory_backend.rs diff --git a/Cargo.lock b/Cargo.lock index 6916305a57..eb8d93ddba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3135,6 +3135,7 @@ dependencies = [ "pallet-contracts-rpc 2.0.0", "pallet-transaction-payment-rpc 2.0.0", "sc-client 2.0.0", + "sp-api 2.0.0", "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", "substrate-frame-rpc-system 2.0.0", @@ -3632,6 +3633,7 @@ dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-rpc 2.0.0", @@ -4019,6 +4021,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-rpc 2.0.0", @@ -4998,7 +5001,7 @@ dependencies = [ "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", - "sp-test-primitives 2.0.0", + "substrate-test-runtime-client 2.0.0", ] [[package]] @@ -5014,6 +5017,7 @@ dependencies = [ "sc-client-api 2.0.0", "sc-telemetry 2.0.0", "sc-transaction-pool 2.0.0", + "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-core 2.0.0", @@ -5029,9 +5033,11 @@ name = "sc-block-builder" version = "2.0.0" dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-client-api 2.0.0", "sp-api 2.0.0", "sp-block-builder 2.0.0", "sp-blockchain 2.0.0", + "sp-consensus 0.8.0", "sp-core 2.0.0", "sp-runtime 2.0.0", "sp-state-machine 2.0.0", @@ -5290,6 +5296,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", + "sp-api 2.0.0", "sp-block-builder 2.0.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", @@ -5311,11 +5318,13 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-telemetry 2.0.0", + "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-core 2.0.0", "sp-inherents 2.0.0", "sp-runtime 2.0.0", + "sp-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", ] @@ -6137,6 +6146,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "sp-api" version = "2.0.0" dependencies = [ + "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api-proc-macro 2.0.0", "sp-core 2.0.0", @@ -6190,6 +6200,7 @@ dependencies = [ name = "sp-application-crypto-test" version = "2.0.0" dependencies = [ + "sp-api 2.0.0", "sp-application-crypto 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -6272,6 +6283,7 @@ dependencies = [ "sp-core 2.0.0", "sp-inherents 2.0.0", "sp-runtime 2.0.0", + "sp-state-machine 2.0.0", "sp-std 2.0.0", "sp-test-primitives 2.0.0", "sp-version 2.0.0", @@ -6847,6 +6859,7 @@ dependencies = [ "sc-client 2.0.0", "sc-transaction-pool 2.0.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -6922,6 +6935,7 @@ dependencies = [ "sc-block-builder 2.0.0", "sc-client 2.0.0", "sc-client-api 2.0.0", + "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index 92574704f7..92db95b5c7 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -118,7 +118,7 @@ pub fn new_full(config: Configuration( + let aura = sc_consensus_aura::start_aura::<_, _, _, _, _, AuraPair, _, _, _>( sc_consensus_aura::SlotDuration::get_or_compute(&*client)?, client, select_chain, diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 49ccd15644..97ecb7a38f 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -39,7 +39,6 @@ use sp_runtime::traits::Block as BlockT; use node_executor::NativeExecutor; use sc_network::NetworkService; use sc_offchain::OffchainWorkers; -use sp_core::Blake2Hasher; construct_simple_protocol! { /// Demo protocol attachment for substrate. @@ -113,9 +112,7 @@ macro_rules! new_full_start { /// concrete types instead. macro_rules! new_full { ($config:expr, $with_startup_data: expr) => {{ - use futures01::Stream; use futures::{ - compat::Stream01CompatExt, stream::StreamExt, future::{FutureExt, TryFutureExt}, }; @@ -300,7 +297,7 @@ pub fn new_full(config: NodeConfiguration) ConcreteTransactionPool, OffchainWorkers< ConcreteClient, - >::OffchainStorage, + >::OffchainStorage, ConcreteBlock, > >, @@ -387,6 +384,7 @@ mod tests { use sc_consensus_babe::CompatibleDigestItem; use sp_consensus::{ Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy, BlockImport, + RecordProof, }; use node_primitives::{Block, DigestItem, Signature}; use node_runtime::{BalancesCall, Call, UncheckedExtrinsic, Address}; @@ -439,6 +437,7 @@ mod tests { internal_justification: Vec::new(), finalized: false, body: Some(block.extrinsics), + storage_changes: None, header: block.header, auxiliary: Vec::new(), } @@ -540,7 +539,8 @@ mod tests { inherent_data, digest, std::time::Duration::from_secs(1), - )).expect("Error making test block"); + RecordProof::Yes, + )).expect("Error making test block").block; let (new_header, new_body) = new_block.deconstruct(); let pre_hash = new_header.hash(); @@ -559,6 +559,7 @@ mod tests { justification: None, post_digests: vec![item], body: Some(new_body), + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 0c594a95f9..3aa7ad780a 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -37,7 +37,7 @@ wabt = "0.9.2" [features] wasmtime = [ - "sc-executor/wasmtime", + "sc-executor/wasmtime", ] wasmi-errno = [ "sc-executor/wasmi-errno", diff --git a/bin/node/executor/src/lib.rs b/bin/node/executor/src/lib.rs index deb947fdd1..812c018502 100644 --- a/bin/node/executor/src/lib.rs +++ b/bin/node/executor/src/lib.rs @@ -27,4 +27,3 @@ native_executor_instance!( node_runtime::api::dispatch, node_runtime::native_version ); - diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs index 504b6853e1..817ebbb173 100644 --- a/bin/node/executor/tests/basic.rs +++ b/bin/node/executor/tests/basic.rs @@ -43,7 +43,7 @@ use node_primitives::{Balance, Hash}; use wabt; use node_testing::keyring::*; -mod common; +pub mod common; use self::common::{*, sign}; /// The wasm runtime binary which hasn't undergone the compacting process. @@ -821,11 +821,11 @@ fn full_wasm_block_import_works_with_changes_trie() { #[test] fn should_import_block_with_test_client() { use node_testing::client::{ - ClientExt, TestClientBuilderExt, TestClientBuilder, + ClientBlockImportExt, TestClientBuilderExt, TestClientBuilder, sp_consensus::BlockOrigin, }; - let client = TestClientBuilder::new().build(); + let mut client = TestClientBuilder::new().build(); let block1 = changes_trie_block(); let block_data = block1.0; let block = node_primitives::Block::decode(&mut &block_data[..]).unwrap(); diff --git a/bin/node/executor/tests/common.rs b/bin/node/executor/tests/common.rs index d580e7c545..52f8b65654 100644 --- a/bin/node/executor/tests/common.rs +++ b/bin/node/executor/tests/common.rs @@ -15,15 +15,13 @@ // along with Substrate. If not, see . use codec::{Encode, Decode}; -use frame_support::{ - Hashable, -}; +use frame_support::Hashable; use sp_state_machine::TestExternalities as CoreTestExternalities; use sp_core::{ Blake2Hasher, NeverNativeValue, NativeOrEncoded, traits::CodeExecutor, }; -use sp_runtime::traits::{Header as HeaderT}; +use sp_runtime::traits::Header as HeaderT; use sc_executor::{NativeExecutor, WasmExecutionMethod}; use sc_executor::error::Result; diff --git a/bin/node/executor/tests/fees.rs b/bin/node/executor/tests/fees.rs index 1210812c05..ca34452031 100644 --- a/bin/node/executor/tests/fees.rs +++ b/bin/node/executor/tests/fees.rs @@ -37,7 +37,7 @@ use node_runtime::impls::LinearWeightToFee; use node_primitives::Balance; use node_testing::keyring::*; -mod common; +pub mod common; use self::common::{*, sign}; #[test] diff --git a/bin/node/executor/tests/submit_transaction.rs b/bin/node/executor/tests/submit_transaction.rs index 43702dbb35..9e91ffc76b 100644 --- a/bin/node/executor/tests/submit_transaction.rs +++ b/bin/node/executor/tests/submit_transaction.rs @@ -28,7 +28,7 @@ use frame_system::offchain::{SubmitSignedTransaction, SubmitUnsignedTransaction} use pallet_im_online::sr25519::AuthorityPair as Key; use codec::Decode; -mod common; +pub mod common; use self::common::*; #[test] diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index 634a946bb7..8c96542a8e 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -10,6 +10,7 @@ jsonrpc-core = "14.0.3" node-primitives = { version = "2.0.0", path = "../primitives" } node-runtime = { version = "2.0.0", path = "../runtime" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../../primitives/api" } pallet-contracts-rpc = { version = "2.0.0", path = "../../../frame/contracts/rpc/" } pallet-transaction-payment-rpc = { version = "2.0.0", path = "../../../frame/transaction-payment/rpc/" } substrate-frame-rpc-system = { version = "2.0.0", path = "../../../utils/frame/rpc/system" } diff --git a/bin/node/rpc/src/lib.rs b/bin/node/rpc/src/lib.rs index d074a6d89b..a473b43a7f 100644 --- a/bin/node/rpc/src/lib.rs +++ b/bin/node/rpc/src/lib.rs @@ -33,7 +33,7 @@ use std::sync::Arc; use node_primitives::{Block, AccountId, Index, Balance}; use node_runtime::UncheckedExtrinsic; -use sp_runtime::traits::ProvideRuntimeApi; +use sp_api::ProvideRuntimeApi; use sp_transaction_pool::TransactionPool; /// Light client extra dependencies. @@ -62,7 +62,7 @@ pub fn create( pool: Arc

, light_deps: Option>, ) -> jsonrpc_core::IoHandler where - C: ProvideRuntimeApi, + C: ProvideRuntimeApi, C: sc_client::blockchain::HeaderBackend, C: Send + Sync + 'static, C::Api: substrate_frame_rpc_system::AccountNonceApi, diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index f2c50ba72f..b277ac8438 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 200, - impl_version: 200, + spec_version: 201, + impl_version: 201, apis: RUNTIME_API_VERSIONS, }; diff --git a/bin/node/transaction-factory/src/complex_mode.rs b/bin/node/transaction-factory/src/complex_mode.rs index e8f1da162a..6d7e60c8d3 100644 --- a/bin/node/transaction-factory/src/complex_mode.rs +++ b/bin/node/transaction-factory/src/complex_mode.rs @@ -43,10 +43,9 @@ use std::sync::Arc; use log::info; use sc_client::Client; use sp_block_builder::BlockBuilder; -use sp_api::ConstructRuntimeApi; -use sp_core::{Blake2Hasher, Hasher}; +use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi}; use sp_runtime::generic::BlockId; -use sp_runtime::traits::{Block as BlockT, ProvideRuntimeApi, One, Zero}; +use sp_runtime::traits::{Block as BlockT, One, Zero}; use crate::{RuntimeAdapter, create_block}; @@ -59,12 +58,13 @@ pub fn next( prior_block_id: BlockId, ) -> Option where - Block: BlockT::Out>, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilder, + Block: BlockT, + Exec: sc_client::CallExecutor + Send + Sync + Clone, + Backend: sc_client_api::backend::Backend + Send, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + BlockBuilder + + sp_api::ApiExt, RtApi: ConstructRuntimeApi> + Send + Sync, RA: RuntimeAdapter, { diff --git a/bin/node/transaction-factory/src/lib.rs b/bin/node/transaction-factory/src/lib.rs index c8f2891856..f3dcdb0875 100644 --- a/bin/node/transaction-factory/src/lib.rs +++ b/bin/node/transaction-factory/src/lib.rs @@ -28,18 +28,16 @@ use log::info; use sc_client::Client; use sp_block_builder::BlockBuilder; -use sp_api::ConstructRuntimeApi; +use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi, ApiExt}; use sp_consensus::{ BlockOrigin, BlockImportParams, InherentData, ForkChoiceStrategy, SelectChain }; use sp_consensus::block_import::BlockImport; use codec::{Decode, Encode}; -use sp_core::{Blake2Hasher, Hasher}; use sp_runtime::generic::BlockId; use sp_runtime::traits::{ - Block as BlockT, Header as HeaderT, ProvideRuntimeApi, SimpleArithmetic, - One, Zero, + Block as BlockT, Header as HeaderT, SimpleArithmetic, One, Zero, }; pub use crate::modes::Mode; @@ -100,16 +98,17 @@ pub fn factory( select_chain: &Sc, ) -> sc_cli::error::Result<()> where - Block: BlockT::Out>, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilder, + Block: BlockT, + Exec: sc_client::CallExecutor + Send + Sync + Clone, + Backend: sc_client_api::backend::Backend + Send, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + BlockBuilder + + ApiExt, RtApi: ConstructRuntimeApi> + Send + Sync, Sc: SelectChain, - RA: RuntimeAdapter, - <::Block as BlockT>::Hash: From, + RA: RuntimeAdapter, + Block::Hash: From, { if *factory_state.mode() != Mode::MasterToNToM && factory_state.rounds() > RA::Number::one() { let msg = "The factory can only be used with rounds set to 1 in this mode.".into(); @@ -144,7 +143,7 @@ where } { best_hash = block.header().hash(); best_block_id = BlockId::::hash(best_hash); - import_block(&client, block); + import_block(client.clone(), block); info!("Imported block at {}", factory_state.block_no()); } @@ -159,13 +158,14 @@ pub fn create_block( inherent_extrinsics: Vec<::Extrinsic>, ) -> Block where - Block: BlockT::Out>, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, + Block: BlockT, + Exec: sc_client::CallExecutor + Send + Sync + Clone, + Backend: sc_client_api::backend::Backend + Send, + Client: ProvideRuntimeApi, RtApi: ConstructRuntimeApi> + Send + Sync, - as ProvideRuntimeApi>::Api: - BlockBuilder, + as ProvideRuntimeApi>::Api: + BlockBuilder + + ApiExt, RA: RuntimeAdapter, { let mut block = client.new_block(Default::default()).expect("Failed to create new block"); @@ -178,22 +178,27 @@ where block.push(inherent).expect("Failed ..."); } - block.bake().expect("Failed to bake block") + block.build().expect("Failed to bake block").block } fn import_block( - client: &Arc>, + mut client: Arc>, block: Block ) -> () where - Block: BlockT::Out>, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, + Block: BlockT, + Exec: sc_client::CallExecutor + Send + Sync + Clone, + Backend: sc_client_api::backend::Backend + Send, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + sp_api::Core + + ApiExt, { let import = BlockImportParams { origin: BlockOrigin::File, header: block.header().clone(), post_digests: Vec::new(), body: Some(block.extrinsics().to_vec()), + storage_changes: None, finalized: false, justification: None, auxiliary: Vec::new(), @@ -201,5 +206,5 @@ fn import_block( allow_missing_state: false, import_existing: false, }; - (&**client).import_block(import, HashMap::new()).expect("Failed to import block"); + client.import_block(import, HashMap::new()).expect("Failed to import block"); } diff --git a/bin/node/transaction-factory/src/simple_modes.rs b/bin/node/transaction-factory/src/simple_modes.rs index 7a28d3b179..fba328731a 100644 --- a/bin/node/transaction-factory/src/simple_modes.rs +++ b/bin/node/transaction-factory/src/simple_modes.rs @@ -38,9 +38,8 @@ use std::sync::Arc; use log::info; use sc_client::Client; use sp_block_builder::BlockBuilder; -use sp_api::ConstructRuntimeApi; -use sp_core::{Blake2Hasher, Hasher}; -use sp_runtime::traits::{Block as BlockT, ProvideRuntimeApi, One}; +use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi}; +use sp_runtime::traits::{Block as BlockT, One}; use sp_runtime::generic::BlockId; use crate::{Mode, RuntimeAdapter, create_block}; @@ -54,12 +53,13 @@ pub fn next( prior_block_id: BlockId, ) -> Option where - Block: BlockT::Out>, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilder, + Block: BlockT, + Exec: sc_client::CallExecutor + Send + Sync + Clone, + Backend: sc_client_api::backend::Backend + Send, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + BlockBuilder + + sp_api::ApiExt, RtApi: ConstructRuntimeApi> + Send + Sync, RA: RuntimeAdapter, { diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index a956b9eb22..292031a4cb 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -21,8 +21,7 @@ use std::collections::HashMap; use sp_core::ChangesTrieConfiguration; use sp_core::offchain::OffchainStorage; use sp_runtime::{generic::BlockId, Justification, Storage}; -use sp_runtime::traits::{Block as BlockT, NumberFor}; -use sp_state_machine::backend::Backend as StateBackend; +use sp_runtime::traits::{Block as BlockT, NumberFor, HasherFor}; use sp_state_machine::{ChangesTrieStorage as StateChangesTrieStorage, ChangesTrieTransaction}; use crate::{ blockchain::{ @@ -33,9 +32,19 @@ use crate::{ }; use sp_blockchain; use sp_consensus::BlockOrigin; -use hash_db::Hasher; use parking_lot::RwLock; +pub use sp_state_machine::Backend as StateBackend; + +/// Extracts the state backend type for the given backend. +pub type StateBackendFor = >::State; + +/// Extracts the transaction for the given state backend. +pub type TransactionForSB = >>::Transaction; + +/// Extracts the transaction for the given backend. +pub type TransactionFor = TransactionForSB, Block>; + /// In memory array of storage values. pub type StorageCollection = Vec<(Vec, Option>)>; @@ -62,11 +71,7 @@ pub struct ImportSummary { } /// Import operation wrapper -pub struct ClientImportOperation< - Block: BlockT, - H: Hasher, - B: Backend, -> { +pub struct ClientImportOperation> { /// DB Operation. pub op: B::BlockImportOperation, /// Summary of imported block. @@ -107,12 +112,9 @@ impl NewBlockState { /// Block insertion operation. /// /// Keeps hold if the inserted block state and data. -pub trait BlockImportOperation where - Block: BlockT, - H: Hasher, -{ +pub trait BlockImportOperation { /// Associated state backend type. - type State: StateBackend; + type State: StateBackend>; /// Returns pending state. /// @@ -132,10 +134,13 @@ pub trait BlockImportOperation where fn update_cache(&mut self, cache: HashMap>); /// Inject storage data into the database. - fn update_db_storage(&mut self, update: >::Transaction) -> sp_blockchain::Result<()>; + fn update_db_storage( + &mut self, + update: TransactionForSB, + ) -> sp_blockchain::Result<()>; /// Inject storage data into the database replacing any existing data. - fn reset_storage(&mut self, storage: Storage) -> sp_blockchain::Result; + fn reset_storage(&mut self, storage: Storage) -> sp_blockchain::Result; /// Set storage changes. fn update_storage( @@ -145,7 +150,10 @@ pub trait BlockImportOperation where ) -> sp_blockchain::Result<()>; /// Inject changes trie data into the database. - fn update_changes_trie(&mut self, update: ChangesTrieTransaction>) -> sp_blockchain::Result<()>; + fn update_changes_trie( + &mut self, + update: ChangesTrieTransaction, NumberFor>, + ) -> sp_blockchain::Result<()>; /// Insert auxiliary keys. /// @@ -154,13 +162,18 @@ pub trait BlockImportOperation where where I: IntoIterator, Option>)>; /// Mark a block as finalized. - fn mark_finalized(&mut self, id: BlockId, justification: Option) -> sp_blockchain::Result<()>; - /// Mark a block as new head. If both block import and set head are specified, set head overrides block import's best block rule. + fn mark_finalized( + &mut self, + id: BlockId, + justification: Option, + ) -> sp_blockchain::Result<()>; + /// Mark a block as new head. If both block import and set head are specified, set head + /// overrides block import's best block rule. fn mark_head(&mut self, id: BlockId) -> sp_blockchain::Result<()>; } /// Finalize Facilities -pub trait Finalizer, B: Backend> { +pub trait Finalizer> { /// Mark all blocks up to given as finalized in operation. /// /// If `justification` is provided it is stored with the given finalized @@ -172,7 +185,7 @@ pub trait Finalizer, B: Backend, + operation: &mut ClientImportOperation, id: BlockId, justification: Option, notify: bool, @@ -226,20 +239,17 @@ pub trait AuxStore { /// should not be pruned. The backend should internally reference-count /// its state objects. /// -/// The same applies for live `BlockImportOperation`s: while an import operation building on a parent `P` -/// is alive, the state for `P` should not be pruned. -pub trait Backend: AuxStore + Send + Sync where - Block: BlockT, - H: Hasher, -{ +/// The same applies for live `BlockImportOperation`s: while an import operation building on a +/// parent `P` is alive, the state for `P` should not be pruned. +pub trait Backend: AuxStore + Send + Sync { /// Associated block insertion operation type. - type BlockImportOperation: BlockImportOperation; + type BlockImportOperation: BlockImportOperation; /// Associated blockchain backend type. type Blockchain: BlockchainBackend; /// Associated state backend type. - type State: StateBackend; + type State: StateBackend> + Send; /// Changes trie storage. - type ChangesTrieStorage: PrunableStateChangesTrieStorage; + type ChangesTrieStorage: PrunableStateChangesTrieStorage; /// Offchain workers local storage. type OffchainStorage: OffchainStorage; @@ -249,7 +259,11 @@ pub trait Backend: AuxStore + Send + Sync where fn begin_operation(&self) -> sp_blockchain::Result; /// Note an operation to contain state transition. - fn begin_state_operation(&self, operation: &mut Self::BlockImportOperation, block: BlockId) -> sp_blockchain::Result<()>; + fn begin_state_operation( + &self, + operation: &mut Self::BlockImportOperation, + block: BlockId, + ) -> sp_blockchain::Result<()>; /// Commit block insertion. fn commit_operation(&self, transaction: Self::BlockImportOperation) -> sp_blockchain::Result<()>; @@ -257,7 +271,11 @@ pub trait Backend: AuxStore + Send + Sync where /// Finalize block with given Id. /// /// This should only be called if the parent of the given block has been finalized. - fn finalize_block(&self, block: BlockId, justification: Option) -> sp_blockchain::Result<()>; + fn finalize_block( + &self, + block: BlockId, + justification: Option, + ) -> sp_blockchain::Result<()>; /// Returns reference to blockchain backend. fn blockchain(&self) -> &Self::Blockchain; @@ -321,8 +339,8 @@ pub trait Backend: AuxStore + Send + Sync where } /// Changes trie storage that supports pruning. -pub trait PrunableStateChangesTrieStorage: - StateChangesTrieStorage> +pub trait PrunableStateChangesTrieStorage: + StateChangesTrieStorage, NumberFor> { /// Get number block of oldest, non-pruned changes trie. fn oldest_changes_trie_block( @@ -333,18 +351,10 @@ pub trait PrunableStateChangesTrieStorage: } /// Mark for all Backend implementations, that are making use of state data, stored locally. -pub trait LocalBackend: Backend -where - Block: BlockT, - H: Hasher, -{} +pub trait LocalBackend: Backend {} /// Mark for all Backend implementations, that are fetching required state data from remote nodes. -pub trait RemoteBackend: Backend -where - Block: BlockT, - H: Hasher, -{ +pub trait RemoteBackend: Backend { /// Returns true if the state for given block is available locally. fn is_local_state_available(&self, block: &BlockId) -> bool; diff --git a/client/api/src/call_executor.rs b/client/api/src/call_executor.rs index 9739fa7b7b..aff38a26aa 100644 --- a/client/api/src/call_executor.rs +++ b/client/api/src/call_executor.rs @@ -16,33 +16,28 @@ //! A method call executor interface. -use std::{cmp::Ord, panic::UnwindSafe, result, cell::RefCell}; +use std::{panic::UnwindSafe, result, cell::RefCell}; use codec::{Encode, Decode}; use sp_runtime::{ - generic::BlockId, traits::Block as BlockT, traits::NumberFor, + generic::BlockId, traits::{Block as BlockT, HasherFor}, }; use sp_state_machine::{ - self, OverlayedChanges, ExecutionManager, ExecutionStrategy, - ChangesTrieTransaction, StorageProof, + OverlayedChanges, ExecutionManager, ExecutionStrategy, StorageProof, }; use sc_executor::{RuntimeVersion, NativeVersion}; use sp_externalities::Extensions; -use hash_db::Hasher; -use sp_core::{Blake2Hasher, NativeOrEncoded}; +use sp_core::NativeOrEncoded; -use sp_api::{ProofRecorder, InitializeBlock}; -use sp_blockchain; +use sp_api::{ProofRecorder, InitializeBlock, StorageTransactionCache}; /// Method call executor. -pub trait CallExecutor -where - B: BlockT, - H: Hasher, - H::Out: Ord, -{ +pub trait CallExecutor { /// Externalities error type. type Error: sp_state_machine::Error; + /// The backend used by the node. + type Backend: crate::backend::Backend; + /// Execute a call to a contract on top of state in a block of given hash. /// /// No changes are made. @@ -76,6 +71,9 @@ where method: &str, call_data: &[u8], changes: &RefCell, + storage_transaction_cache: Option<&RefCell< + StorageTransactionCache>::State>, + >>, initialize_block: InitializeBlock<'a, B>, execution_manager: ExecutionManager, native_call: Option, @@ -88,38 +86,10 @@ where /// No changes are made. fn runtime_version(&self, id: &BlockId) -> Result; - /// Execute a call to a contract on top of given state. - /// - /// No changes are made. - fn call_at_state< - S: sp_state_machine::Backend, - F: FnOnce( - Result, Self::Error>, - Result, Self::Error>, - ) -> Result, Self::Error>, - R: Encode + Decode + PartialEq, - NC: FnOnce() -> result::Result + UnwindSafe, - >(&self, - state: &S, - overlay: &mut OverlayedChanges, - method: &str, - call_data: &[u8], - manager: ExecutionManager, - native_call: Option, - extensions: Option, - ) -> Result< - ( - NativeOrEncoded, - (S::Transaction, H::Out), - Option>> - ), - sp_blockchain::Error, - >; - /// Execute a call to a contract on top of given state, gathering execution proof. /// /// No changes are made. - fn prove_at_state>( + fn prove_at_state>>( &self, mut state: S, overlay: &mut OverlayedChanges, @@ -137,9 +107,9 @@ where /// Execute a call to a contract on top of given trie state, gathering execution proof. /// /// No changes are made. - fn prove_at_trie_state>( + fn prove_at_trie_state>>( &self, - trie_state: &sp_state_machine::TrieBackend, + trie_state: &sp_state_machine::TrieBackend>, overlay: &mut OverlayedChanges, method: &str, call_data: &[u8] diff --git a/client/api/src/lib.rs b/client/api/src/lib.rs index 1239374845..69d0c94ac2 100644 --- a/client/api/src/lib.rs +++ b/client/api/src/lib.rs @@ -34,12 +34,10 @@ pub use notifications::*; pub use sp_state_machine::{StorageProof, ExecutionStrategy}; - /// Utility methods for the client. pub mod utils { - use sp_blockchain::{HeaderBackend, HeaderMetadata, Error}; - use sp_core::H256; - use sp_runtime::traits::{Block as BlockT}; + use sp_blockchain::{HeaderBackend, HeaderMetadata, Error}; + use sp_runtime::traits::Block as BlockT; use std::borrow::Borrow; /// Returns a function for checking block ancestry, the returned function will @@ -48,11 +46,11 @@ pub mod utils { /// represent the current block `hash` and its `parent hash`, if given the /// function that's returned will assume that `hash` isn't part of the local DB /// yet, and all searches in the DB will instead reference the parent. - pub fn is_descendent_of<'a, Block: BlockT, T, H: Borrow + 'a>( + pub fn is_descendent_of<'a, Block: BlockT, T>( client: &'a T, - current: Option<(H, H)>, - ) -> impl Fn(&H256, &H256) -> Result + 'a - where T: HeaderBackend + HeaderMetadata, + current: Option<(Block::Hash, Block::Hash)>, + ) -> impl Fn(&Block::Hash, &Block::Hash) -> Result + 'a + where T: HeaderBackend + HeaderMetadata, { move |base, hash| { if base == hash { return Ok(false); } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 854ebff87a..767be822d7 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -26,10 +26,10 @@ sp-authority-discovery = { version = "2.0.0", path = "../../primitives/authority sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../primitives/api" } [dev-dependencies] env_logger = "0.7.0" quickcheck = "0.9.0" sc-peerset = { version = "2.0.0", path = "../peerset" } -sp-api = { version = "2.0.0", path = "../../primitives/api" } -sp-test-primitives = { version = "2.0.0", path = "../../primitives/test-primitives" } +substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client"} diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index 79f4510bc9..ee2b655b92 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -65,8 +65,8 @@ use sc_network::{DhtEvent, ExHashT, NetworkStateInfo}; use sp_authority_discovery::{AuthorityDiscoveryApi, AuthorityId, AuthoritySignature, AuthorityPair}; use sp_core::crypto::{key_types, Pair}; use sp_core::traits::BareCryptoStorePtr; -use sp_runtime::generic::BlockId; -use sp_runtime::traits::{Block as BlockT, ProvideRuntimeApi}; +use sp_runtime::{traits::Block as BlockT, generic::BlockId}; +use sp_api::ProvideRuntimeApi; use addr_cache::AddrCache; #[cfg(test)] @@ -93,8 +93,8 @@ pub struct AuthorityDiscovery where Block: BlockT + 'static, Network: NetworkProvider, - Client: ProvideRuntimeApi + Send + Sync + 'static + HeaderBackend, - ::Api: AuthorityDiscoveryApi, + Client: ProvideRuntimeApi + Send + Sync + 'static + HeaderBackend, + >::Api: AuthorityDiscoveryApi, { client: Arc, @@ -126,8 +126,9 @@ impl AuthorityDiscovery where Block: BlockT + Unpin + 'static, Network: NetworkProvider, - Client: ProvideRuntimeApi + Send + Sync + 'static + HeaderBackend, - ::Api: AuthorityDiscoveryApi, + Client: ProvideRuntimeApi + Send + Sync + 'static + HeaderBackend, + >::Api: + AuthorityDiscoveryApi, Self: Future, { /// Return a new authority discovery. @@ -413,8 +414,9 @@ impl Future for AuthorityDiscovery, - ::Api: AuthorityDiscoveryApi, + Client: ProvideRuntimeApi + Send + Sync + 'static + HeaderBackend, + >::Api: + AuthorityDiscoveryApi, { type Output = (); diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs index 06498e2feb..07e1c943be 100644 --- a/client/authority-discovery/src/tests.rs +++ b/client/authority-discovery/src/tests.rs @@ -21,11 +21,10 @@ use futures::executor::block_on; use futures::future::poll_fn; use libp2p::{kad, PeerId}; -use sp_api::{ApiExt, Core, RuntimeVersion, StorageProof}; +use sp_api::{ApiExt, ApiErrorExt, Core, RuntimeVersion, StorageProof, ProvideRuntimeApi, ApiRef}; use sp_core::{testing::KeyStore, ExecutionContext, NativeOrEncoded}; -use sp_runtime::traits::Zero; -use sp_runtime::traits::{ApiRef, Block as BlockT, NumberFor, ProvideRuntimeApi}; -use sp_test_primitives::Block; +use sp_runtime::traits::{Zero, Block as BlockT, NumberFor}; +use substrate_test_runtime_client::runtime::Block; use super::*; @@ -94,7 +93,7 @@ struct TestApi { authorities: Vec, } -impl ProvideRuntimeApi for TestApi { +impl ProvideRuntimeApi for TestApi { type Api = RuntimeApi; fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api> { @@ -182,12 +181,18 @@ impl Core for RuntimeApi { } } -impl ApiExt for RuntimeApi { +impl ApiErrorExt for RuntimeApi { type Error = sp_blockchain::Error; +} + +impl ApiExt for RuntimeApi { + type StateBackend = < + substrate_test_runtime_client::Backend as sc_client_api::backend::Backend + >::State; fn map_api_result std::result::Result, R, E>( &self, - _: F, + _: F ) -> std::result::Result { unimplemented!("Not required for testing!") } @@ -195,7 +200,7 @@ impl ApiExt for RuntimeApi { fn runtime_version_at( &self, _: &BlockId, - ) -> std::result::Result { + ) -> std::result::Result { unimplemented!("Not required for testing!") } @@ -206,6 +211,19 @@ impl ApiExt for RuntimeApi { fn extract_proof(&mut self) -> Option { unimplemented!("Not required for testing!") } + + fn into_storage_changes< + T: sp_api::ChangesTrieStorage, sp_api::NumberFor> + >( + &self, + _: &Self::StateBackend, + _: Option<&T>, + _: ::Hash, + ) -> std::result::Result, String> + where Self: Sized + { + unimplemented!("Not required for testing!") + } } impl AuthorityDiscoveryApi for RuntimeApi { diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index a93ca94282..4cdef01afd 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" log = "0.4.8" futures = "0.3.1" codec = { package = "parity-scale-codec", version = "1.0.0" } +sp-api = { version = "2.0.0", path = "../../primitives/api" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index ef78fba107..543428b073 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -19,23 +19,21 @@ // FIXME #1021 move this into sp-consensus use std::{time, sync::Arc}; -use sc_client_api::CallExecutor; -use sp_blockchain; +use sc_client_api::{CallExecutor, backend}; use sc_client::Client as SubstrateClient; use codec::Decode; -use sp_consensus::{evaluation}; +use sp_consensus::{evaluation, Proposal, RecordProof}; use sp_inherents::InherentData; use log::{error, info, debug, trace}; -use sp_core::{H256, Blake2Hasher, ExecutionContext}; +use sp_core::ExecutionContext; use sp_runtime::{ - traits::{ - Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, DigestFor, BlakeTwo256 - }, + traits::{Block as BlockT, Hash as HashT, Header as HeaderT, DigestFor, BlakeTwo256}, generic::BlockId, }; use sp_transaction_pool::{TransactionPool, InPoolTransaction}; use sc_telemetry::{telemetry, CONSENSUS_INFO}; use sc_block_builder::BlockBuilderApi; +use sp_api::{ProvideRuntimeApi, ApiExt}; /// Proposer factory. pub struct ProposerFactory where A: TransactionPool { @@ -46,15 +44,16 @@ pub struct ProposerFactory where A: TransactionPool { } impl ProposerFactory, A> -where - A: TransactionPool + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, - RA: Send + Sync + 'static, - SubstrateClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilderApi, + where + A: TransactionPool + 'static, + B: backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + BlockBuilderApi + + ApiExt>, { pub fn init_with_now( &mut self, @@ -83,16 +82,17 @@ where } impl sp_consensus::Environment for -ProposerFactory, A> -where - A: TransactionPool + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, - RA: Send + Sync + 'static, - SubstrateClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilderApi, + ProposerFactory, A> + where + A: TransactionPool + 'static, + B: backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + BlockBuilderApi + + ApiExt>, { type Proposer = Proposer, A>; type Error = sp_blockchain::Error; @@ -121,18 +121,22 @@ struct ProposerInner { } impl sp_consensus::Proposer for -Proposer, A> -where - A: TransactionPool + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, - RA: Send + Sync + 'static, - SubstrateClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilderApi, + Proposer, A> + where + A: TransactionPool + 'static, + B: backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + BlockBuilderApi + + ApiExt>, { - type Create = tokio_executor::blocking::Blocking>; + type Transaction = backend::TransactionFor; + type Proposal = tokio_executor::blocking::Blocking< + Result, Self::Error> + >; type Error = sp_blockchain::Error; fn propose( @@ -140,38 +144,45 @@ where inherent_data: InherentData, inherent_digests: DigestFor, max_duration: time::Duration, - ) -> Self::Create { + record_proof: RecordProof, + ) -> Self::Proposal { let inner = self.inner.clone(); tokio_executor::blocking::run(move || { // leave some time for evaluation and block finalization (33%) let deadline = (inner.now)() + max_duration - max_duration / 3; - inner.propose_with(inherent_data, inherent_digests, deadline) + inner.propose_with(inherent_data, inherent_digests, deadline, record_proof) }) } } -impl ProposerInner, A> where - A: TransactionPool + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, +impl ProposerInner, A> where + A: TransactionPool, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, RA: Send + Sync + 'static, - SubstrateClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilderApi, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + BlockBuilderApi + + ApiExt>, { fn propose_with( &self, inherent_data: InherentData, inherent_digests: DigestFor, deadline: time::Instant, - ) -> Result { + record_proof: RecordProof, + ) -> Result>, sp_blockchain::Error> { /// If the block is full we will attempt to push at most /// this number of transactions before quitting for real. /// It allows us to increase block utilization. const MAX_SKIPPED_TRANSACTIONS: usize = 8; - let mut block_builder = self.client.new_block_at(&self.parent_id, inherent_digests)?; + let mut block_builder = self.client.new_block_at( + &self.parent_id, + inherent_digests, + record_proof, + )?; // We don't check the API versions any further here since the dispatch compatibility // check should be enough. @@ -194,7 +205,10 @@ impl ProposerInner, debug!("Attempting to push transactions from the pool."); for pending_tx in pending_iterator { if (self.now)() > deadline { - debug!("Consensus deadline reached when pushing block transactions, proceeding with proposing."); + debug!( + "Consensus deadline reached when pushing block transactions, \ + proceeding with proposing." + ); break; } @@ -232,7 +246,7 @@ impl ProposerInner, self.transaction_pool.remove_invalid(&unqueue_invalid); - let block = block_builder.bake()?; + let (block, storage_changes, proof) = block_builder.build()?.into_inner(); info!("Prepared block for proposing at {} [hash: {:?}; parent_hash: {}; extrinsics: [{}]]", block.header().number(), @@ -257,7 +271,7 @@ impl ProposerInner, error!("Failed to evaluate authored block: {:?}", err); } - Ok(block) + Ok(Proposal { block, proof, storage_changes }) } } @@ -267,8 +281,14 @@ mod tests { use parking_lot::Mutex; use sp_consensus::Proposer; - use substrate_test_runtime_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; + use substrate_test_runtime_client::{ + runtime::{Extrinsic, Transfer}, AccountKeyring, DefaultTestClientBuilderExt, + TestClientBuilderExt, + }; use sc_transaction_pool::{BasicPool, FullChainApi}; + use sp_api::Core; + use backend::Backend; + use sp_blockchain::HeaderBackend; fn extrinsic(nonce: u64) -> Extrinsic { Transfer { @@ -308,12 +328,58 @@ mod tests { // when let deadline = time::Duration::from_secs(3); - let block = futures::executor::block_on(proposer.propose(Default::default(), Default::default(), deadline)) - .unwrap(); + let block = futures::executor::block_on( + proposer.propose(Default::default(), Default::default(), deadline, RecordProof::No) + ).map(|r| r.block).unwrap(); // then // block should have some extrinsics although we have some more in the pool. assert_eq!(block.extrinsics().len(), 1); assert_eq!(txpool.ready().count(), 2); } + + #[test] + fn proposed_storage_changes_should_match_execute_block_storage_changes() { + let (client, backend) = substrate_test_runtime_client::TestClientBuilder::new() + .build_with_backend(); + let client = Arc::new(client); + let txpool = Arc::new(BasicPool::new(Default::default(), FullChainApi::new(client.clone()))); + let genesis_hash = client.info().best_hash; + let block_id = BlockId::Hash(genesis_hash); + + futures::executor::block_on( + txpool.submit_at(&BlockId::number(0), vec![extrinsic(0)]), + ).unwrap(); + + let mut proposer_factory = ProposerFactory { + client: client.clone(), + transaction_pool: txpool.clone(), + }; + + let mut proposer = proposer_factory.init_with_now( + &client.header(&block_id).unwrap().unwrap(), + Box::new(move || time::Instant::now()), + ).unwrap(); + + let deadline = time::Duration::from_secs(9); + let proposal = futures::executor::block_on( + proposer.propose(Default::default(), Default::default(), deadline, RecordProof::No), + ).unwrap(); + + assert_eq!(proposal.block.extrinsics().len(), 1); + + let api = client.runtime_api(); + api.execute_block(&block_id, proposal.block).unwrap(); + + let state = backend.state_at(block_id).unwrap(); + let changes_trie_storage = backend.changes_trie_storage(); + + let storage_changes = api.into_storage_changes(&state, changes_trie_storage, genesis_hash) + .unwrap(); + + assert_eq!( + proposal.storage_changes.transaction_storage_root, + storage_changes.transaction_storage_root, + ); + } } diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index 4081d607ab..cf77c8a3f3 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -20,7 +20,7 @@ //! //! ``` //! # use sc_basic_authority::ProposerFactory; -//! # use sp_consensus::{Environment, Proposer}; +//! # use sp_consensus::{Environment, Proposer, RecordProof}; //! # use sp_runtime::generic::BlockId; //! # use std::{sync::Arc, time::Duration}; //! # use substrate_test_runtime_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; @@ -43,12 +43,13 @@ //! let future = proposer.propose( //! Default::default(), //! Default::default(), -//! Duration::from_secs(2) +//! Duration::from_secs(2), +//! RecordProof::Yes, //! ); //! //! // We wait until the proposition is performed. //! let block = futures::executor::block_on(future).unwrap(); -//! println!("Generated block: {:?}", block); +//! println!("Generated block: {:?}", block.block); //! ``` //! diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index 157fa54960..1dcc9b05f5 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -7,8 +7,10 @@ edition = "2018" [dependencies] sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../primitives/api" } +sp-consensus = { version = "0.8.0", path = "../../primitives/consensus/common" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } sp-core = { version = "2.0.0", path = "../../primitives/core" } -codec = { package = "parity-scale-codec", version = "1.0.6", features = ["derive"] } sp-block-builder = { version = "2.0.0", path = "../../primitives/block-builder" } -sp-api = { version = "2.0.0", path = "../../primitives/api" } +sc-client-api = { version = "2.0.0", path = "../api" } +codec = { package = "parity-scale-codec", version = "1.0.6", features = ["derive"] } diff --git a/client/block-builder/src/lib.rs b/client/block-builder/src/lib.rs index 96b3f9e78b..f59f88f5ba 100644 --- a/client/block-builder/src/lib.rs +++ b/client/block-builder/src/lib.rs @@ -29,32 +29,56 @@ use codec::Encode; use sp_runtime::{ generic::BlockId, traits::{ - Header as HeaderT, Hash, Block as BlockT, HashFor, ProvideRuntimeApi, ApiRef, DigestFor, - NumberFor, One, - } + Header as HeaderT, Hash, Block as BlockT, HashFor, DigestFor, NumberFor, One, HasherFor, + }, }; use sp_blockchain::{ApplyExtrinsicFailed, Error}; use sp_core::ExecutionContext; -use sp_state_machine::StorageProof; -use sp_api::{Core, ApiExt, ApiErrorFor}; +use sp_api::{Core, ApiExt, ApiErrorFor, ApiRef, ProvideRuntimeApi, StorageChanges, StorageProof}; +use sp_consensus::RecordProof; pub use sp_block_builder::BlockBuilder as BlockBuilderApi; +use sc_client_api::backend; + +/// A block that was build by [`BlockBuilder`] plus some additional data. +/// +/// This additional data includes the `storage_changes`, these changes can be applied to the +/// backend to get the state of the block. Furthermore an optional `proof` is included which +/// can be used to proof that the build block contains the expected data. The `proof` will +/// only be set when proof recording was activated. +pub struct BuiltBlock>> { + /// The actual block that was build. + pub block: Block, + /// The changes that need to be applied to the backend to get the state of the build block. + pub storage_changes: StorageChanges, + /// An optional proof that was recorded while building the block. + pub proof: Option, +} + +impl>> BuiltBlock { + /// Convert into the inner values. + pub fn into_inner(self) -> (Block, StorageChanges, Option) { + (self.block, self.storage_changes, self.proof) + } +} /// Utility for building new (valid) blocks from a stream of extrinsics. -pub struct BlockBuilder<'a, Block: BlockT, A: ProvideRuntimeApi> { - header: Block::Header, +pub struct BlockBuilder<'a, Block: BlockT, A: ProvideRuntimeApi, B> { extrinsics: Vec, api: ApiRef<'a, A::Api>, block_id: BlockId, + parent_hash: Block::Hash, + backend: &'a B, } -impl<'a, Block, A> BlockBuilder<'a, Block, A> +impl<'a, Block, A, B> BlockBuilder<'a, Block, A, B> where Block: BlockT, - A: ProvideRuntimeApi + 'a, - A::Api: BlockBuilderApi, - ApiErrorFor: From, + A: ProvideRuntimeApi + 'a, + A::Api: BlockBuilderApi + + ApiExt>, + B: backend::Backend, { /// Create a new instance of builder based on the given `parent_hash` and `parent_number`. /// @@ -65,8 +89,9 @@ where api: &'a A, parent_hash: Block::Hash, parent_number: NumberFor, - proof_recording: bool, + record_proof: RecordProof, inherent_digests: DigestFor, + backend: &'a B, ) -> Result> { let header = <::Header as HeaderT>::new( parent_number + One::one(), @@ -78,7 +103,7 @@ where let mut api = api.runtime_api(); - if proof_recording { + if record_proof.yes() { api.record_proof(); } @@ -89,10 +114,11 @@ where )?; Ok(Self { - header, + parent_hash, extrinsics: Vec::new(), api, block_id, + backend, }) } @@ -122,7 +148,7 @@ where extrinsics.push(xt); Ok(()) } - Err(e) => Err(ApplyExtrinsicFailed::from(e).into())?, + Err(e) => Err(ApplyExtrinsicFailed::from(e).into()), } }) } else { @@ -136,44 +162,56 @@ where extrinsics.push(xt); Ok(()) } - Err(tx_validity) => Err(ApplyExtrinsicFailed::Validity(tx_validity).into())?, + Err(tx_validity) => Err(ApplyExtrinsicFailed::Validity(tx_validity).into()), } }) } } - /// Consume the builder to return a valid `Block` containing all pushed extrinsics. - pub fn bake(mut self) -> Result> { - self.bake_impl()?; - Ok(::new(self.header, self.extrinsics)) - } - - fn bake_impl(&mut self) -> Result<(), ApiErrorFor> { - self.header = self.api.finalize_block_with_context( + /// Consume the builder to build a valid `Block` containing all pushed extrinsics. + /// + /// Returns the build `Block`, the changes to the storage and an optional `StorageProof` + /// supplied by `self.api`, combined as [`BuiltBlock`]. + /// The storage proof will be `Some(_)` when proof recording was enabled. + pub fn build(mut self) -> Result< + BuiltBlock>, + ApiErrorFor + > { + let header = self.api.finalize_block_with_context( &self.block_id, ExecutionContext::BlockConstruction )?; debug_assert_eq!( - self.header.extrinsics_root().clone(), + header.extrinsics_root().clone(), HashFor::::ordered_trie_root( self.extrinsics.iter().map(Encode::encode).collect(), ), ); - Ok(()) - } + let proof = self.api.extract_proof(); - /// Consume the builder to return a valid `Block` containing all pushed extrinsics - /// and the generated proof. - /// - /// The proof will be `Some(_)`, if proof recording was enabled while creating - /// the block builder. - pub fn bake_and_extract_proof(mut self) - -> Result<(Block, Option), ApiErrorFor> - { - self.bake_impl()?; + let state = self.backend.state_at(self.block_id)?; + let changes_trie_storage = self.backend.changes_trie_storage(); + let parent_hash = self.parent_hash; - let proof = self.api.extract_proof(); - Ok((::new(self.header, self.extrinsics), proof)) + // The unsafe is required because the consume requires that we drop/consume the inner api + // (what we do here). + let storage_changes = self.api.into_storage_changes( + &state, + changes_trie_storage, + parent_hash, + ); + + // We need to destroy the state, before we check if `storage_changes` is `Ok(_)` + { + let _lock = self.backend.get_import_lock().read(); + self.backend.destroy_state(state)?; + } + + Ok(BuiltBlock { + block: ::new(header, self.extrinsics), + storage_changes: storage_changes?, + proof, + }) } } diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 7cc85cb0a4..13a4c5a777 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -54,15 +54,20 @@ use sp_blockchain::{ }; use sp_block_builder::BlockBuilder as BlockBuilderApi; use sp_runtime::{generic::{BlockId, OpaqueDigestItemId}, Justification}; -use sp_runtime::traits::{Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; +use sp_runtime::traits::{Block as BlockT, Header, DigestItemFor, Zero, Member}; +use sp_api::ProvideRuntimeApi; + use sp_core::crypto::Pair; use sp_inherents::{InherentDataProviders, InherentData}; use sp_timestamp::{ TimestampInherentData, InherentType as TimestampInherent, InherentError as TIError }; use sc_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_INFO}; -use sc_consensus_slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible}; -use sc_consensus_slots::check_equivocation; + +use sc_consensus_slots::{ + CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, StorageChanges, check_equivocation, +}; + use sc_keystore::KeyStorePtr; use sp_api::ApiExt; @@ -91,7 +96,7 @@ impl SlotDuration { where A: Codec, B: BlockT, - C: AuxStore + ProvideRuntimeApi, + C: AuxStore + ProvideRuntimeApi, C::Api: AuraApi, { sc_consensus_slots::SlotDuration::get_or_compute(client, |a, b| a.slot_duration(b)).map(Self) @@ -137,7 +142,7 @@ impl SlotCompatible for AuraSlotCompatible { } /// Start the aura worker. The returned future should be run in a futures executor. -pub fn start_aura( +pub fn start_aura( slot_duration: SlotDuration, client: Arc, select_chain: SC, @@ -149,19 +154,17 @@ pub fn start_aura( keystore: KeyStorePtr, can_author_with: CAW, ) -> Result, sp_consensus::Error> where - B: BlockT, - C: ProvideRuntimeApi + BlockOf + ProvideCache + AuxStore + Send + Sync, + B: BlockT, + C: ProvideRuntimeApi + BlockOf + ProvideCache + AuxStore + Send + Sync, C::Api: AuraApi>, SC: SelectChain, - E: Environment + Send + Sync + 'static, - E::Proposer: Proposer, - >::Create: Unpin + Send, + E: Environment + Send + Sync + 'static, + E::Proposer: Proposer>, P: Pair + Send + Sync, P::Public: Hash + Member + Encode + Decode, P::Signature: Hash + Member + Encode + Decode, - H: Header, - I: BlockImport + Send + Sync + 'static, - Error: ::std::error::Error + Send + From<::sp_consensus::Error> + From + 'static, + I: BlockImport> + Send + Sync + 'static, + Error: std::error::Error + Send + From + 'static, SO: SyncOracle + Send + Sync + Clone, CAW: CanAuthorWith + Send, { @@ -199,20 +202,18 @@ struct AuraWorker { _key_type: PhantomData

, } -impl sc_consensus_slots::SimpleSlotWorker for AuraWorker where - B: BlockT, - C: ProvideRuntimeApi + BlockOf + ProvideCache + Sync, +impl sc_consensus_slots::SimpleSlotWorker for AuraWorker where + B: BlockT, + C: ProvideRuntimeApi + BlockOf + ProvideCache + Sync, C::Api: AuraApi>, - E: Environment, - E::Proposer: Proposer, - >::Create: Unpin + Send, - H: Header, - I: BlockImport + Send + Sync + 'static, + E: Environment, + E::Proposer: Proposer>, + I: BlockImport> + Send + Sync + 'static, P: Pair + Send + Sync, P::Public: Member + Encode + Decode + Hash, P::Signature: Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Clone, - Error: ::std::error::Error + Send + From<::sp_consensus::Error> + From + 'static, + Error: std::error::Error + Send + From + 'static, { type BlockImport = I; type SyncOracle = SO; @@ -228,7 +229,11 @@ impl sc_consensus_slots::SimpleSlotWorker for Au self.block_import.clone() } - fn epoch_data(&self, header: &B::Header, _slot_number: u64) -> Result { + fn epoch_data( + &self, + header: &B::Header, + _slot_number: u64, + ) -> Result { authorities(self.client.as_ref(), &BlockId::Hash(header.hash())) } @@ -250,7 +255,11 @@ impl sc_consensus_slots::SimpleSlotWorker for Au }) } - fn pre_digest_data(&self, slot_number: u64, _claim: &Self::Claim) -> Vec> { + fn pre_digest_data( + &self, + slot_number: u64, + _claim: &Self::Claim, + ) -> Vec> { vec![ as CompatibleDigestItem

>::aura_pre_digest(slot_number), ] @@ -260,9 +269,10 @@ impl sc_consensus_slots::SimpleSlotWorker for Au B::Header, &B::Hash, Vec, + StorageChanges, B>, Self::Claim, - ) -> sp_consensus::BlockImportParams + Send> { - Box::new(|header, header_hash, body, pair| { + ) -> sp_consensus::BlockImportParams> + Send> { + Box::new(|header, header_hash, body, storage_changes, pair| { // sign the pre-sealed hash of the block and then // add it to a digest item. let signature = pair.sign(header_hash.as_ref()); @@ -274,6 +284,7 @@ impl sc_consensus_slots::SimpleSlotWorker for Au justification: None, post_digests: vec![signature_digest_item], body: Some(body), + storage_changes: Some(storage_changes), finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -324,20 +335,18 @@ impl sc_consensus_slots::SimpleSlotWorker for Au } } -impl SlotWorker for AuraWorker where - B: BlockT, - C: ProvideRuntimeApi + BlockOf + ProvideCache + Sync + Send, +impl SlotWorker for AuraWorker where + B: BlockT, + C: ProvideRuntimeApi + BlockOf + ProvideCache + Sync + Send, C::Api: AuraApi>, - E: Environment + Send + Sync, - E::Proposer: Proposer, - >::Create: Unpin + Send + 'static, - H: Header, - I: BlockImport + Send + Sync + 'static, + E: Environment + Send + Sync, + E::Proposer: Proposer>, + I: BlockImport> + Send + Sync + 'static, P: Pair + Send + Sync, P::Public: Member + Encode + Decode + Hash, P::Signature: Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Sync + Clone, - Error: ::std::error::Error + Send + From<::sp_consensus::Error> + From + 'static, + Error: std::error::Error + Send + From + 'static, { type OnSlot = Pin> + Send>>; @@ -489,7 +498,7 @@ impl AuraVerifier inherent_data: InherentData, timestamp_now: u64, ) -> Result<(), Error> - where C: ProvideRuntimeApi, C::Api: BlockBuilderApi + where C: ProvideRuntimeApi, C::Api: BlockBuilderApi { const MAX_TIMESTAMP_DRIFT_SECS: u64 = 60; @@ -535,7 +544,12 @@ impl AuraVerifier #[forbid(deprecated)] impl Verifier for AuraVerifier where - C: ProvideRuntimeApi + Send + Sync + sc_client_api::backend::AuxStore + ProvideCache + BlockOf, + C: ProvideRuntimeApi + + Send + + Sync + + sc_client_api::backend::AuxStore + + ProvideCache + + BlockOf, C::Api: BlockBuilderApi + AuraApi> + ApiExt, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, @@ -549,7 +563,7 @@ impl Verifier for AuraVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(BlockImportParams, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { let mut inherent_data = self.inherent_data_providers .create_inherent_data() .map_err(|e| e.into_string())?; @@ -623,6 +637,7 @@ impl Verifier for AuraVerifier where header: pre_header, post_digests: vec![seal], body, + storage_changes: None, finalized: false, justification, auxiliary: Vec::new(), @@ -647,7 +662,7 @@ impl Verifier for AuraVerifier where fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where A: Codec, B: BlockT, - C: ProvideRuntimeApi + BlockOf + ProvideCache, + C: ProvideRuntimeApi + BlockOf + ProvideCache, C::Api: AuraApi, { // no cache => no initialization @@ -681,7 +696,7 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusErro fn authorities(client: &C, at: &BlockId) -> Result, ConsensusError> where A: Codec, B: BlockT, - C: ProvideRuntimeApi + BlockOf + ProvideCache, + C: ProvideRuntimeApi + BlockOf + ProvideCache, C::Api: AuraApi, { client @@ -695,7 +710,7 @@ fn authorities(client: &C, at: &BlockId) -> Result, Consensus } /// The Aura import queue type. -pub type AuraImportQueue = BasicQueue; +pub type AuraImportQueue = BasicQueue; /// Register the aura inherent data provider, if not registered already. fn register_aura_inherent_data_provider( @@ -744,14 +759,15 @@ impl, P> AuraBlockImport } impl BlockImport for AuraBlockImport where - I: BlockImport + Send + Sync, + I: BlockImport> + Send + Sync, I::Error: Into, - C: HeaderBackend, + C: HeaderBackend + ProvideRuntimeApi, P: Pair + Send + Sync + 'static, P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, P::Signature: Encode + Decode, { type Error = ConsensusError; + type Transaction = sp_api::TransactionFor; fn check_block( &mut self, @@ -762,7 +778,7 @@ impl BlockImport for AuraBlockImport, + block: BlockImportParams, new_cache: HashMap>, ) -> Result { let hash = block.post_header().hash(); @@ -790,8 +806,7 @@ impl BlockImport for AuraBlockImport( client: Arc, inherent_data_providers: InherentDataProviders, transaction_pool: Option>, -) -> Result, sp_consensus::Error> where +) -> Result>, sp_consensus::Error> where B: BlockT, C::Api: BlockBuilderApi + AuraApi> + ApiExt, - C: 'static + ProvideRuntimeApi + BlockOf + ProvideCache + Send + Sync + AuxStore + HeaderBackend, - I: BlockImport + Send + Sync + 'static, + C: 'static + ProvideRuntimeApi + BlockOf + ProvideCache + Send + Sync + AuxStore + HeaderBackend, + I: BlockImport> + Send + Sync + 'static, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, @@ -835,7 +850,7 @@ pub fn import_queue( #[cfg(test)] mod tests { use super::*; - use sp_consensus::NoNetwork as DummyOracle; + use sp_consensus::{NoNetwork as DummyOracle, Proposal, RecordProof}; use sc_network_test::{Block as TestBlock, *}; use sp_runtime::traits::{Block as BlockT, DigestFor}; use sc_network::config::ProtocolConfig; @@ -870,16 +885,26 @@ mod tests { impl Proposer for DummyProposer { type Error = Error; - type Create = future::Ready>; + type Transaction = sc_client_api::TransactionFor< + substrate_test_runtime_client::Backend, + TestBlock + >; + type Proposal = future::Ready, Error>>; fn propose( &mut self, _: InherentData, digests: DigestFor, _: Duration, - ) -> Self::Create { - let r = self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()); - future::ready(r) + _: RecordProof, + ) -> Self::Proposal { + let r = self.1.new_block(digests).unwrap().build().map_err(|e| e.into()); + + future::ready(r.map(|b| Proposal { + block: b.block, + proof: b.proof, + storage_changes: b.storage_changes, + })) } } @@ -983,7 +1008,7 @@ mod tests { &inherent_data_providers, slot_duration.get() ).expect("Registers aura inherent data provider"); - let aura = start_aura::<_, _, _, _, _, AuthorityPair, _, _, _, _>( + let aura = start_aura::<_, _, _, _, _, AuthorityPair, _, _, _>( slot_duration, client.clone(), select_chain, diff --git a/client/consensus/babe/src/epoch_changes.rs b/client/consensus/babe/src/epoch_changes.rs index 8554f88d36..6e35546949 100644 --- a/client/consensus/babe/src/epoch_changes.rs +++ b/client/consensus/babe/src/epoch_changes.rs @@ -27,7 +27,6 @@ use sp_runtime::traits::{Block as BlockT, NumberFor, One, Zero}; use codec::{Encode, Decode}; use sc_client_api::utils::is_descendent_of; use sp_blockchain::{HeaderMetadata, HeaderBackend, Error as ClientError}; -use sp_core::H256; use std::ops::Add; /// A builder for `is_descendent_of` functions. @@ -57,17 +56,15 @@ pub(crate) fn descendent_query(client: &H) -> HeaderBackendDescendentB /// `IsDescendentOfBuilder` for header backends. pub(crate) struct HeaderBackendDescendentBuilder(H, std::marker::PhantomData); -// TODO: relying on Hash = H256 is awful. -// https://github.com/paritytech/substrate/issues/3624 -impl<'a, H, Block> IsDescendentOfBuilder +impl<'a, H, Block> IsDescendentOfBuilder for HeaderBackendDescendentBuilder<&'a H, Block> where H: HeaderBackend + HeaderMetadata, - Block: BlockT, + Block: BlockT, { type Error = ClientError; - type IsDescendentOf = Box Result + 'a>; + type IsDescendentOf = Box Result + 'a>; - fn build_is_descendent_of(&self, current: Option<(H256, H256)>) + fn build_is_descendent_of(&self, current: Option<(Block::Hash, Block::Hash)>) -> Self::IsDescendentOf { Box::new(is_descendent_of(self.0, current)) diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 0242c0dd1e..bbf19b7066 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -69,14 +69,14 @@ use sp_consensus::{ImportResult, CanAuthorWith}; use sp_consensus::import_queue::{ BoxJustificationImport, BoxFinalityProofImport, }; -use sp_runtime::{generic::{BlockId, OpaqueDigestItemId}, Justification}; -use sp_runtime::traits::{ - Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, - Zero, +use sp_runtime::{ + generic::{BlockId, OpaqueDigestItemId}, Justification, + traits::{Block as BlockT, Header, DigestItemFor, Zero}, }; +use sp_api::ProvideRuntimeApi; use sc_keystore::KeyStorePtr; use parking_lot::Mutex; -use sp_core::{Blake2Hasher, H256, Pair}; +use sp_core::Pair; use sp_inherents::{InherentDataProviders, InherentData}; use sc_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG}; use sp_consensus::{ @@ -96,10 +96,11 @@ use sc_client::Client; use sp_block_builder::BlockBuilder as BlockBuilderApi; -use sc_consensus_slots::{CheckedHeader, check_equivocation}; use futures::prelude::*; use log::{warn, debug, info, trace}; -use sc_consensus_slots::{SlotWorker, SlotInfo, SlotCompatible}; +use sc_consensus_slots::{ + SlotWorker, SlotInfo, SlotCompatible, StorageChanges, CheckedHeader, check_equivocation, +}; use epoch_changes::descendent_query; use sp_blockchain::{ Result as ClientResult, Error as ClientError, @@ -207,7 +208,7 @@ impl Config { /// Either fetch the slot duration from disk or compute it from the genesis /// state. pub fn get_or_compute(client: &C) -> ClientResult where - C: AuxStore + ProvideRuntimeApi, C::Api: BabeApi, + C: AuxStore + ProvideRuntimeApi, C::Api: BabeApi, { trace!(target: "babe", "Getting slot duration"); match sc_consensus_slots::SlotDuration::get_or_compute(client, |a, b| a.configuration(b)).map(Self) { @@ -291,16 +292,16 @@ pub fn start_babe(BabeParams { impl futures01::Future, sp_consensus::Error, > where - B: BlockT, - C: ProvideRuntimeApi + ProvideCache + ProvideUncles + BlockchainEvents - + HeaderBackend + HeaderMetadata + Send + Sync + 'static, + B: BlockT, + C: ProvideRuntimeApi + ProvideCache + ProvideUncles + BlockchainEvents + + HeaderBackend + HeaderMetadata + Send + Sync + 'static, C::Api: BabeApi, SC: SelectChain + 'static, - E: Environment + Send + Sync, - E::Proposer: Proposer, - >::Create: Unpin + Send + 'static, - I: BlockImport + Send + Sync + 'static, - Error: std::error::Error + Send + From<::sp_consensus::Error> + From + 'static, + E: Environment + Send + Sync, + E::Proposer: Proposer>, + I: BlockImport> + Send + + Sync + 'static, + Error: std::error::Error + Send + From + From + 'static, SO: SyncOracle + Send + Sync + Clone, CAW: CanAuthorWith + Send, { @@ -349,15 +350,17 @@ struct BabeWorker { } impl sc_consensus_slots::SimpleSlotWorker for BabeWorker where - B: BlockT, - C: ProvideRuntimeApi + ProvideCache + HeaderBackend + HeaderMetadata, + B: BlockT, + C: ProvideRuntimeApi + + ProvideCache + + HeaderBackend + + HeaderMetadata, C::Api: BabeApi, - E: Environment, - E::Proposer: Proposer, - >::Create: Unpin + Send + 'static, - I: BlockImport + Send + Sync + 'static, + E: Environment, + E::Proposer: Proposer>, + I: BlockImport> + Send + Sync + 'static, SO: SyncOracle + Send + Clone, - Error: std::error::Error + Send + From<::sp_consensus::Error> + From + 'static, + Error: std::error::Error + Send + From + From + 'static, { type EpochData = Epoch; type Claim = (BabePreDigest, AuthorityPair); @@ -373,7 +376,11 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork self.block_import.clone() } - fn epoch_data(&self, parent: &B::Header, slot_number: u64) -> Result { + fn epoch_data( + &self, + parent: &B::Header, + slot_number: u64, + ) -> Result { self.epoch_changes.lock().epoch_for_child_of( descendent_query(&*self.client), &parent.hash(), @@ -411,7 +418,11 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork s } - fn pre_digest_data(&self, _slot_number: u64, claim: &Self::Claim) -> Vec> { + fn pre_digest_data( + &self, + _slot_number: u64, + claim: &Self::Claim, + ) -> Vec> { vec![ as CompatibleDigestItem>::babe_pre_digest(claim.0.clone()), ] @@ -421,20 +432,22 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork B::Header, &B::Hash, Vec, + StorageChanges, Self::Claim, - ) -> sp_consensus::BlockImportParams + Send> { - Box::new(|header, header_hash, body, (_, pair)| { + ) -> sp_consensus::BlockImportParams + Send> { + Box::new(|header, header_hash, body, storage_changes, (_, pair)| { // sign the pre-sealed hash of the block and then // add it to a digest item. let signature = pair.sign(header_hash.as_ref()); - let signature_digest_item = as CompatibleDigestItem>::babe_seal(signature); + let digest_item = as CompatibleDigestItem>::babe_seal(signature); BlockImportParams { origin: BlockOrigin::Own, header, justification: None, - post_digests: vec![signature_digest_item], + post_digests: vec![digest_item], body: Some(body), + storage_changes: Some(storage_changes), finalized: false, auxiliary: Vec::new(), // block-weight is written in block import. // TODO: block-import handles fork choice and this shouldn't even have the @@ -500,15 +513,17 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork } impl SlotWorker for BabeWorker where - B: BlockT, - C: ProvideRuntimeApi + ProvideCache + HeaderBackend + HeaderMetadata + Send + Sync, + B: BlockT, + C: ProvideRuntimeApi + + ProvideCache + + HeaderBackend + + HeaderMetadata + Send + Sync, C::Api: BabeApi, - E: Environment + Send + Sync, - E::Proposer: Proposer, - >::Create: Unpin + Send + 'static, - I: BlockImport + Send + Sync + 'static, + E: Environment + Send + Sync, + E::Proposer: Proposer>, + I: BlockImport> + Send + Sync + 'static, SO: SyncOracle + Send + Sync + Clone, - Error: std::error::Error + Send + From<::sp_consensus::Error> + From + 'static, + Error: std::error::Error + Send + From + From + 'static, { type OnSlot = Pin> + Send>>; @@ -603,7 +618,9 @@ impl BabeVerifier { block_id: BlockId, inherent_data: InherentData, ) -> Result<(), Error> - where PRA: ProvideRuntimeApi, PRA::Api: BlockBuilderApi + where + PRA: ProvideRuntimeApi, + PRA::Api: BlockBuilderApi { let inherent_res = self.api.runtime_api().check_inherents( &block_id, @@ -667,11 +684,11 @@ fn median_algorithm( } impl Verifier for BabeVerifier where - Block: BlockT, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + Block: BlockT, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, - PRA: ProvideRuntimeApi + Send + Sync + AuxStore + ProvideCache, + PRA: ProvideRuntimeApi + Send + Sync + AuxStore + ProvideCache, PRA::Api: BlockBuilderApi + BabeApi, { @@ -681,7 +698,7 @@ impl Verifier for BabeVerifier, mut body: Option>, - ) -> Result<(BlockImportParams, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { trace!( target: "babe", "Verifying origin: {:?} header: {:?} justification: {:?} body: {:?}", @@ -785,6 +802,7 @@ impl Verifier for BabeVerifier Verifier for BabeVerifier = BasicQueue; +pub type BabeImportQueue = BasicQueue; /// Register the babe inherent data provider, if not registered already. fn register_babe_inherent_data_provider( @@ -875,20 +893,22 @@ impl BabeBlockImport { } impl BlockImport for BabeBlockImport where - Block: BlockT, - I: BlockImport + Send + Sync, + Block: BlockT, + I: BlockImport> + Send + Sync, I::Error: Into, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + Client: AuxStore, RA: Send + Sync, - PRA: ProvideRuntimeApi + ProvideCache, - PRA::Api: BabeApi, + PRA: ProvideRuntimeApi + ProvideCache, + PRA::Api: BabeApi + ApiExt, { type Error = ConsensusError; + type Transaction = sp_api::TransactionFor; fn import_block( &mut self, - mut block: BlockImportParams, + mut block: BlockImportParams, new_cache: HashMap>, ) -> Result { let hash = block.post_header().hash(); @@ -1099,9 +1119,9 @@ fn prune_finalized( client: &Client, epoch_changes: &mut EpochChangesFor, ) -> Result<(), ConsensusError> where - Block: BlockT, - E: CallExecutor + Send + Sync, - B: Backend, + Block: BlockT, + E: CallExecutor + Send + Sync, + B: Backend, RA: Send + Sync, { let info = client.chain_info(); @@ -1133,15 +1153,16 @@ fn prune_finalized( /// /// Also returns a link object used to correctly instantiate the import queue /// and background worker. -pub fn block_import, I, RA, PRA>( +pub fn block_import( config: Config, wrapped_block_import: I, client: Arc>, api: Arc, ) -> ClientResult<(BabeBlockImport, BabeLink)> where - B: Backend, - E: CallExecutor + Send + Sync, + B: Backend, + E: CallExecutor + Send + Sync, RA: Send + Sync, + Client: AuxStore, { let epoch_changes = aux_schema::load_epoch_changes(&*client)?; let link = BabeLink { @@ -1178,7 +1199,7 @@ pub fn block_import, I, RA, PRA>( /// /// The block import object provided must be the `BabeBlockImport` or a wrapper /// of it, otherwise crucial import logic will be omitted. -pub fn import_queue, I, RA, PRA>( +pub fn import_queue( babe_link: BabeLink, block_import: I, justification_import: Option>, @@ -1186,12 +1207,13 @@ pub fn import_queue, I, RA, PRA>( client: Arc>, api: Arc, inherent_data_providers: InherentDataProviders, -) -> ClientResult> where - B: Backend + 'static, - I: BlockImport + Send + Sync + 'static, - E: CallExecutor + Clone + Send + Sync + 'static, +) -> ClientResult>> where + B: Backend + 'static, + I: BlockImport> + + Send + Sync + 'static, + E: CallExecutor + Clone + Send + Sync + 'static, RA: Send + Sync + 'static, - PRA: ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore + 'static, + PRA: ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore + 'static, PRA::Api: BlockBuilderApi + BabeApi + ApiExt, { register_babe_inherent_data_provider(&inherent_data_providers, babe_link.config.slot_duration)?; @@ -1227,8 +1249,11 @@ pub mod test_helpers { keystore: &KeyStorePtr, link: &BabeLink, ) -> Option where - B: BlockT, - C: ProvideRuntimeApi + ProvideCache + HeaderBackend + HeaderMetadata, + B: BlockT, + C: ProvideRuntimeApi + + ProvideCache + + HeaderBackend + + HeaderMetadata, C::Api: BabeApi, { let epoch = link.epoch_changes.lock().epoch_for_child_of( diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 8eed190b3e..2ddb67fe47 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -24,16 +24,16 @@ use authorship::claim_slot; use sp_consensus_babe::{AuthorityPair, SlotNumber}; use sc_block_builder::BlockBuilder; -use sp_consensus::NoNetwork as DummyOracle; -use sp_consensus::import_queue::{ - BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport, +use sp_consensus::{ + NoNetwork as DummyOracle, Proposal, RecordProof, + import_queue::{BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport}, }; use sc_network_test::*; use sc_network_test::{Block as TestBlock, PeersClient}; use sc_network::config::{BoxFinalityProofRequestBuilder, ProtocolConfig}; use sp_runtime::{generic::DigestItem, traits::{Block as BlockT, DigestFor}}; use tokio::runtime::current_thread; -use sc_client_api::BlockchainEvents; +use sc_client_api::{BlockchainEvents, backend::TransactionFor}; use log::debug; use std::{time::Duration, cell::RefCell}; @@ -94,16 +94,25 @@ impl Environment for DummyFactory { impl DummyProposer { fn propose_with(&mut self, pre_digests: DigestFor) - -> future::Ready> + -> future::Ready< + Result< + Proposal< + TestBlock, + sc_client_api::TransactionFor + >, + Error + > + > { use codec::Encode; let block_builder = self.factory.client.new_block_at( &BlockId::Hash(self.parent_hash), pre_digests, + false, ).unwrap(); - let mut block = match block_builder.bake().map_err(|e| e.into()) { - Ok(b) => b, + let mut block = match block_builder.build().map_err(|e| e.into()) { + Ok(b) => b.block, Err(e) => return future::ready(Err(e)), }; @@ -142,20 +151,22 @@ impl DummyProposer { // mutate the block header according to the mutator. (self.factory.mutator)(&mut block.header, Stage::PreSeal); - future::ready(Ok(block)) + future::ready(Ok(Proposal { block, proof: None, storage_changes: Default::default() })) } } impl Proposer for DummyProposer { type Error = Error; - type Create = future::Ready>; + type Transaction = sc_client_api::TransactionFor; + type Proposal = future::Ready, Error>>; fn propose( &mut self, _: InherentData, pre_digests: DigestFor, _: Duration, - ) -> Self::Create { + _: RecordProof, + ) -> Self::Proposal { self.propose_with(pre_digests) } } @@ -169,10 +180,11 @@ struct PanickingBlockImport(B); impl> BlockImport for PanickingBlockImport { type Error = B::Error; + type Transaction = B::Transaction; fn import_block( &mut self, - block: BlockImportParams, + block: BlockImportParams, new_cache: HashMap>, ) -> Result { Ok(self.0.import_block(block, new_cache).expect("importing block failed")) @@ -214,7 +226,7 @@ impl Verifier for TestVerifier { mut header: TestHeader, justification: Option, body: Option>, - ) -> Result<(BlockImportParams, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { // apply post-sealing mutations (i.e. stripping seal, if desired). (self.mutator)(&mut header, Stage::PostSeal); Ok(self.inner.verify(origin, header, justification, body).expect("verification failed!")) @@ -224,7 +236,9 @@ impl Verifier for TestVerifier { pub struct PeerData { link: BabeLink, inherent_data_providers: InherentDataProviders, - block_import: Mutex>>, + block_import: Mutex< + Option>> + >, } impl TestNetFactory for BabeTestNet { @@ -240,9 +254,9 @@ impl TestNetFactory for BabeTestNet { } } - fn make_block_import(&self, client: PeersClient) + fn make_block_import(&self, client: PeersClient) -> ( - BoxBlockImport, + BlockImportAdapter, Option>, Option>, Option>, @@ -262,9 +276,11 @@ impl TestNetFactory for BabeTestNet { let block_import = PanickingBlockImport(block_import); - let data_block_import = Mutex::new(Some(Box::new(block_import.clone()) as BoxBlockImport<_>)); + let data_block_import = Mutex::new( + Some(Box::new(block_import.clone()) as BoxBlockImport<_, _>) + ); ( - Box::new(block_import), + BlockImportAdapter::new_full(block_import), None, None, None, @@ -322,8 +338,8 @@ impl TestNetFactory for BabeTestNet { fn rejects_empty_block() { env_logger::try_init().unwrap(); let mut net = BabeTestNet::new(3); - let block_builder = |builder: BlockBuilder<_, _>| { - builder.bake().unwrap() + let block_builder = |builder: BlockBuilder<_, _, _>| { + builder.build().unwrap().block }; net.mut_peers(|peer| { peer[0].generate_blocks(1, BlockOrigin::NetworkInitialSync, block_builder); @@ -525,12 +541,12 @@ fn can_author_block() { } // Propose and import a new BABE block on top of the given parent. -fn propose_and_import_block( +fn propose_and_import_block( parent: &TestHeader, slot_number: Option, proposer_factory: &mut DummyFactory, - block_import: &mut BoxBlockImport, -) -> H256 { + block_import: &mut BoxBlockImport, +) -> sp_core::H256 { let mut proposer = proposer_factory.init(parent).unwrap(); let slot_number = slot_number.unwrap_or_else(|| { @@ -549,7 +565,7 @@ fn propose_and_import_block( ], }; - let mut block = futures::executor::block_on(proposer.propose_with(pre_digest)).unwrap(); + let mut block = futures::executor::block_on(proposer.propose_with(pre_digest)).unwrap().block; let seal = { // sign the pre-sealed hash of the block and then @@ -574,6 +590,7 @@ fn propose_and_import_block( justification: None, post_digests: vec![seal], body: Some(block.extrinsics), + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index c7c4eeb6ff..bf0efa6c08 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -10,6 +10,7 @@ codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../../primitives/api" } sc-client-api = { version = "2.0.0", path = "../../api" } sp-block-builder = { version = "2.0.0", path = "../../../primitives/block-builder" } sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index ef3847df43..5c491057e5 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -37,19 +37,19 @@ use sp_blockchain::{HeaderBackend, ProvideCache, well_known_cache_keys::Id as Ca use sp_block_builder::BlockBuilder as BlockBuilderApi; use sp_runtime::{Justification, RuntimeString}; use sp_runtime::generic::{BlockId, Digest, DigestItem}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, ProvideRuntimeApi}; -use sp_timestamp::{TimestampInherentData, InherentError as TIError}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; +use sp_api::ProvideRuntimeApi; use sp_consensus_pow::{Seal, TotalDifficulty, POW_ENGINE_ID}; -use sp_core::H256; use sp_inherents::{InherentDataProviders, InherentData}; use sp_consensus::{ BlockImportParams, BlockOrigin, ForkChoiceStrategy, SyncOracle, Environment, Proposer, - SelectChain, Error as ConsensusError, CanAuthorWith, + SelectChain, Error as ConsensusError, CanAuthorWith, RecordProof, }; use sp_consensus::import_queue::{BoxBlockImport, BasicQueue, Verifier}; use codec::{Encode, Decode}; use sc_client_api; use log::*; +use sp_timestamp::{InherentError as TIError, TimestampInherentData}; #[derive(derive_more::Display, Debug)] pub enum Error { @@ -93,9 +93,8 @@ impl std::convert::From> for String { pub const POW_AUX_PREFIX: [u8; 4] = *b"PoW:"; /// Get the auxiliary storage key used by engine to store total difficulty. -fn aux_key(hash: &H256) -> Vec { - POW_AUX_PREFIX.iter().chain(&hash[..]) - .cloned().collect::>() +fn aux_key>(hash: &T) -> Vec { + POW_AUX_PREFIX.iter().chain(hash.as_ref()).copied().collect() } /// Auxiliary storage data for PoW. @@ -111,12 +110,11 @@ impl PowAux where Difficulty: Decode + Default, { /// Read the auxiliary from client. - pub fn read(client: &C, hash: &H256) -> Result> { - let key = aux_key(hash); + pub fn read(client: &C, hash: &B::Hash) -> Result> { + let key = aux_key(&hash); match client.get_aux(&key).map_err(Error::Client)? { - Some(bytes) => Self::decode(&mut &bytes[..]) - .map_err(Error::Codec), + Some(bytes) => Self::decode(&mut &bytes[..]).map_err(Error::Codec), None => Ok(Self::default()), } } @@ -133,7 +131,7 @@ pub trait PowAlgorithm { fn verify( &self, parent: &BlockId, - pre_hash: &H256, + pre_hash: &B::Hash, seal: &Seal, difficulty: Self::Difficulty, ) -> Result>; @@ -141,14 +139,14 @@ pub trait PowAlgorithm { fn mine( &self, parent: &BlockId, - pre_hash: &H256, + pre_hash: &B::Hash, difficulty: Self::Difficulty, round: u32, ) -> Result, Error>; } /// A verifier for PoW blocks. -pub struct PowVerifier, C, S, Algorithm> { +pub struct PowVerifier { client: Arc, algorithm: Algorithm, inherent_data_providers: sp_inherents::InherentDataProviders, @@ -156,7 +154,7 @@ pub struct PowVerifier, C, S, Algorithm> { check_inherents_after: <::Header as HeaderT>::Number, } -impl, C, S, Algorithm> PowVerifier { +impl PowVerifier { pub fn new( client: Arc, algorithm: Algorithm, @@ -171,7 +169,7 @@ impl, C, S, Algorithm> PowVerifier { &self, mut header: B::Header, parent_block_id: BlockId, - ) -> Result<(B::Header, Algorithm::Difficulty, DigestItem), Error> where + ) -> Result<(B::Header, Algorithm::Difficulty, DigestItem), Error> where Algorithm: PowAlgorithm, { let hash = header.hash(); @@ -209,7 +207,7 @@ impl, C, S, Algorithm> PowVerifier { inherent_data: InherentData, timestamp_now: u64, ) -> Result<(), Error> where - C: ProvideRuntimeApi, C::Api: BlockBuilderApi + C: ProvideRuntimeApi, C::Api: BlockBuilderApi { const MAX_TIMESTAMP_DRIFT_SECS: u64 = 60; @@ -245,8 +243,8 @@ impl, C, S, Algorithm> PowVerifier { } } -impl, C, S, Algorithm> Verifier for PowVerifier where - C: ProvideRuntimeApi + Send + Sync + HeaderBackend + AuxStore + ProvideCache + BlockOf, +impl Verifier for PowVerifier where + C: ProvideRuntimeApi + Send + Sync + HeaderBackend + AuxStore + ProvideCache + BlockOf, C::Api: BlockBuilderApi, S: SelectChain, Algorithm: PowAlgorithm + Send + Sync, @@ -257,7 +255,7 @@ impl, C, S, Algorithm> Verifier for PowVerifier, mut body: Option>, - ) -> Result<(BlockImportParams, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { let inherent_data = self.inherent_data_providers .create_inherent_data().map_err(|e| e.into_string())?; let timestamp_now = inherent_data.timestamp_inherent_data().map_err(|e| e.into_string())?; @@ -290,19 +288,22 @@ impl, C, S, Algorithm> Verifier for PowVerifier best_aux.total_difficulty), + fork_choice: ForkChoiceStrategy::Custom( + aux.total_difficulty > best_aux.total_difficulty + ), allow_missing_state: false, import_existing: false, }; @@ -326,19 +327,22 @@ pub fn register_pow_inherent_data_provider( } /// The PoW import queue type. -pub type PowImportQueue = BasicQueue; +pub type PowImportQueue = BasicQueue; /// Import queue for PoW engine. pub fn import_queue( - block_import: BoxBlockImport, + block_import: BoxBlockImport>, client: Arc, algorithm: Algorithm, check_inherents_after: <::Header as HeaderT>::Number, select_chain: Option, inherent_data_providers: InherentDataProviders, -) -> Result, sp_consensus::Error> where - B: BlockT, - C: ProvideRuntimeApi + HeaderBackend + BlockOf + ProvideCache + AuxStore, +) -> Result< + PowImportQueue>, + sp_consensus::Error +> where + B: BlockT, + C: ProvideRuntimeApi + HeaderBackend + BlockOf + ProvideCache + AuxStore, C: Send + Sync + AuxStore + 'static, C::Api: BlockBuilderApi, Algorithm: PowAlgorithm + Send + Sync + 'static, @@ -372,8 +376,8 @@ pub fn import_queue( /// information, or just be a graffiti. `round` is for number of rounds the /// CPU miner runs each time. This parameter should be tweaked so that each /// mining round is within sub-second time. -pub fn start_mine, C, Algorithm, E, SO, S, CAW>( - mut block_import: BoxBlockImport, +pub fn start_mine( + mut block_import: BoxBlockImport>, client: Arc, algorithm: Algorithm, mut env: E, @@ -385,10 +389,11 @@ pub fn start_mine, C, Algorithm, E, SO, S, CAW>( inherent_data_providers: sp_inherents::InherentDataProviders, can_author_with: CAW, ) where - C: HeaderBackend + AuxStore + 'static, + C: HeaderBackend + AuxStore + ProvideRuntimeApi + 'static, Algorithm: PowAlgorithm + Send + Sync + 'static, E: Environment + Send + Sync + 'static, E::Error: std::fmt::Debug, + E::Proposer: Proposer>, SO: SyncOracle + Send + Sync + 'static, S: SelectChain + 'static, CAW: CanAuthorWith + Send + 'static, @@ -423,8 +428,8 @@ pub fn start_mine, C, Algorithm, E, SO, S, CAW>( }); } -fn mine_loop, C, Algorithm, E, SO, S, CAW>( - block_import: &mut BoxBlockImport, +fn mine_loop( + block_import: &mut BoxBlockImport>, client: &C, algorithm: &Algorithm, env: &mut E, @@ -436,12 +441,14 @@ fn mine_loop, C, Algorithm, E, SO, S, CAW>( inherent_data_providers: &sp_inherents::InherentDataProviders, can_author_with: &CAW, ) -> Result<(), Error> where - C: HeaderBackend + AuxStore, + C: HeaderBackend + AuxStore + ProvideRuntimeApi, Algorithm: PowAlgorithm, E: Environment, + E::Proposer: Proposer>, E::Error: std::fmt::Debug, SO: SyncOracle, S: SelectChain, + sp_api::TransactionFor: 'static, CAW: CanAuthorWith, { 'outer: loop { @@ -488,13 +495,14 @@ fn mine_loop, C, Algorithm, E, SO, S, CAW>( if let Some(preruntime) = &preruntime { inherent_digest.push(DigestItem::PreRuntime(POW_ENGINE_ID, preruntime.to_vec())); } - let block = futures::executor::block_on(proposer.propose( + let proposal = futures::executor::block_on(proposer.propose( inherent_data, inherent_digest, build_time.clone(), + RecordProof::No, )).map_err(|e| Error::BlockProposingError(format!("{:?}", e)))?; - let (header, body) = block.deconstruct(); + let (header, body) = proposal.block.deconstruct(); let (difficulty, seal) = { let difficulty = algorithm.difficulty( &BlockId::Hash(best_hash), @@ -546,6 +554,7 @@ fn mine_loop, C, Algorithm, E, SO, S, CAW>( justification: None, post_digests: vec![DigestItem::Seal(POW_ENGINE_ID, seal)], body: Some(body), + storage_changes: Some(proposal.storage_changes), finalized: false, auxiliary: vec![(key, Some(aux.encode()))], fork_choice: ForkChoiceStrategy::Custom(true), diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index 510ea72abc..3f1a572249 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -12,6 +12,8 @@ sc-client-api = { version = "2.0.0", path = "../../api" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } +sp-api = { version = "2.0.0", path = "../../../primitives/api" } sc-telemetry = { version = "2.0.0", path = "../../telemetry" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } diff --git a/client/consensus/slots/src/lib.rs b/client/consensus/slots/src/lib.rs index df184538b9..a69c710a7e 100644 --- a/client/consensus/slots/src/lib.rs +++ b/client/consensus/slots/src/lib.rs @@ -31,17 +31,23 @@ use slots::Slots; pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; use codec::{Decode, Encode}; -use sp_consensus::{BlockImport, Proposer, SyncOracle, SelectChain, CanAuthorWith, SlotData}; +use sp_consensus::{BlockImport, Proposer, SyncOracle, SelectChain, CanAuthorWith, SlotData, RecordProof}; use futures::{prelude::*, future::{self, Either}}; use futures_timer::Delay; use sp_inherents::{InherentData, InherentDataProviders}; use log::{debug, error, info, warn}; use sp_runtime::generic::BlockId; -use sp_runtime::traits::{ApiRef, Block as BlockT, Header, ProvideRuntimeApi}; +use sp_runtime::traits::{Block as BlockT, Header, HasherFor, NumberFor}; +use sp_api::{ProvideRuntimeApi, ApiRef}; use std::{fmt::Debug, ops::Deref, pin::Pin, sync::Arc, time::{Instant, Duration}}; use sc_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; use parking_lot::Mutex; -use sc_client_api; + +/// The changes that need to applied to the storage to create the state for a block. +/// +/// See [`state_machine::StorageChanges`] for more information. +pub type StorageChanges = + sp_state_machine::StorageChanges, NumberFor>; /// A worker that should be invoked at every new slot. pub trait SlotWorker { @@ -58,7 +64,8 @@ pub trait SlotWorker { /// out if block production takes too long. pub trait SimpleSlotWorker { /// A handle to a `BlockImport`. - type BlockImport: BlockImport + Send + 'static; + type BlockImport: BlockImport>::Transaction> + + Send + 'static; /// A handle to a `SyncOracle`. type SyncOracle: SyncOracle; @@ -94,15 +101,26 @@ pub trait SimpleSlotWorker { ) -> Option; /// Return the pre digest data to include in a block authored with the given claim. - fn pre_digest_data(&self, slot_number: u64, claim: &Self::Claim) -> Vec>; + fn pre_digest_data( + &self, + slot_number: u64, + claim: &Self::Claim, + ) -> Vec>; /// Returns a function which produces a `BlockImportParams`. - fn block_import_params(&self) -> Box, - Self::Claim, - ) -> sp_consensus::BlockImportParams + Send>; + fn block_import_params(&self) -> Box< + dyn Fn( + B::Header, + &B::Hash, + Vec, + StorageChanges<>::Transaction, B>, + Self::Claim, + ) -> sp_consensus::BlockImportParams< + B, + >::Transaction + > + + Send + >; /// Whether to force authoring if offline. fn force_authoring(&self) -> bool; @@ -136,7 +154,7 @@ pub trait SimpleSlotWorker { fn on_slot(&mut self, chain_head: B::Header, slot_info: SlotInfo) -> Pin> + Send>> where Self: Send + Sync, - >::Create: Unpin + Send + 'static, + >::Proposal: Unpin + Send + 'static, { let (timestamp, slot_number, slot_duration) = (slot_info.timestamp, slot_info.number, slot_info.duration); @@ -222,6 +240,7 @@ pub trait SimpleSlotWorker { logs, }, slot_remaining_duration, + RecordProof::No, ).map_err(|e| sp_consensus::Error::ClientImport(format!("{:?}", e))); let delay: Box + Unpin + Send> = match proposing_remaining_duration { Some(r) => Box::new(Delay::new(r)), @@ -247,8 +266,8 @@ pub trait SimpleSlotWorker { let block_import = self.block_import(); let logging_target = self.logging_target(); - Box::pin(proposal_work.map_ok(move |(block, claim)| { - let (header, body) = block.deconstruct(); + Box::pin(proposal_work.map_ok(move |(proposal, claim)| { + let (header, body) = proposal.block.deconstruct(); let header_num = *header.number(); let header_hash = header.hash(); let parent_hash = *header.parent_hash(); @@ -257,13 +276,15 @@ pub trait SimpleSlotWorker { header, &header_hash, body, + proposal.storage_changes, claim, ); - info!("Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", - header_num, - block_import_params.post_header().hash(), - header_hash, + info!( + "Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + header_num, + block_import_params.post_header().hash(), + header_hash, ); telemetry!(CONSENSUS_INFO; "slots.pre_sealed_block"; @@ -418,7 +439,7 @@ impl SlotDuration { /// compile-time constant. pub fn get_or_compute(client: &C, cb: CB) -> sp_blockchain::Result where C: sc_client_api::backend::AuxStore, - C: ProvideRuntimeApi, + C: ProvideRuntimeApi, CB: FnOnce(ApiRef, &BlockId) -> sp_blockchain::Result, T: SlotData + Encode + Decode + Debug, { diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index e39bec7380..3a7f090e60 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -47,18 +47,18 @@ use sp_blockchain::{ well_known_cache_keys, HeaderBackend, }; use codec::{Decode, Encode}; -use hash_db::{Hasher, Prefix}; +use hash_db::Prefix; use kvdb::{KeyValueDB, DBTransaction}; use sp_trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; use parking_lot::{Mutex, RwLock}; -use sp_core::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash, traits::CodeExecutor}; +use sp_core::{ChangesTrieConfiguration, convert_hash, traits::CodeExecutor}; use sp_core::storage::{well_known_keys, ChildInfo}; use sp_runtime::{ generic::{BlockId, DigestItem}, Justification, Storage, BuildStorage, }; use sp_runtime::traits::{ - Block as BlockT, Header as HeaderT, NumberFor, Zero, One, SaturatedConversion + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, SaturatedConversion, HasherFor, }; use sc_executor::RuntimeInfo; use sp_state_machine::{ @@ -83,7 +83,9 @@ const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u32 = 32768; 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 = sp_state_machine::TrieBackend>, Blake2Hasher>; +pub type DbState = sp_state_machine::TrieBackend< + Arc>>, HasherFor +>; /// Re-export the KVDB trait so that one can pass an implementation of it. pub use kvdb; @@ -93,17 +95,13 @@ pub use kvdb; /// It makes sure that the hash we are using stays pinned in storage /// until this structure is dropped. pub struct RefTrackingState { - state: DbState, + state: DbState, storage: Arc>, parent_hash: Option, } impl RefTrackingState { - fn new( - state: DbState, - storage: Arc>, - parent_hash: Option, - ) -> RefTrackingState { + fn new(state: DbState, storage: Arc>, parent_hash: Option) -> Self { RefTrackingState { state, parent_hash, @@ -126,16 +124,16 @@ impl std::fmt::Debug for RefTrackingState { } } -impl StateBackend for RefTrackingState { - type Error = >::Error; - type Transaction = >::Transaction; - type TrieBackendStorage = >::TrieBackendStorage; +impl StateBackend> for RefTrackingState { + type Error = as StateBackend>>::Error; + type Transaction = as StateBackend>>::Transaction; + type TrieBackendStorage = as StateBackend>>::TrieBackendStorage; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { self.state.storage(key) } - fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { + fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { self.state.storage_hash(key) } @@ -201,7 +199,7 @@ impl StateBackend for RefTrackingState { self.state.for_child_keys_with_prefix(storage_key, child_info, prefix, f) } - fn storage_root(&self, delta: I) -> (H256, Self::Transaction) + fn storage_root(&self, delta: I) -> (B::Hash, Self::Transaction) where I: IntoIterator, Option>)> { @@ -213,7 +211,7 @@ impl StateBackend for RefTrackingState { storage_key: &[u8], child_info: ChildInfo, delta: I, - ) -> (H256, bool, Self::Transaction) + ) -> (B::Hash, bool, Self::Transaction) where I: IntoIterator, Option>)>, { @@ -237,9 +235,9 @@ impl StateBackend for RefTrackingState { self.state.child_keys(storage_key, child_info, prefix) } - fn as_trie_backend( - &mut self, - ) -> Option<&sp_state_machine::TrieBackend> { + fn as_trie_backend(&mut self) + -> Option<&sp_state_machine::TrieBackend>> + { self.state.as_trie_backend() } } @@ -290,7 +288,7 @@ pub fn new_client( sp_blockchain::Error, > where - Block: BlockT, + Block: BlockT, E: CodeExecutor + RuntimeInfo, S: BuildStorage, { @@ -505,13 +503,13 @@ impl HeaderMetadata for BlockchainDb { } /// Database transaction -pub struct BlockImportOperation { - old_state: CachingState, Block>, - db_updates: PrefixedMemoryDB, +pub struct BlockImportOperation { + old_state: CachingState, Block>, + db_updates: PrefixedMemoryDB>, storage_updates: StorageCollection, child_storage_updates: ChildStorageCollection, - changes_trie_updates: MemoryDB, - changes_trie_cache_update: Option>>, + changes_trie_updates: MemoryDB>, + changes_trie_cache_update: Option>>, pending_block: Option>, aux_ops: Vec<(Vec, Option>)>, finalized_blocks: Vec<(BlockId, Option)>, @@ -519,7 +517,7 @@ pub struct BlockImportOperation { commit_state: bool, } -impl BlockImportOperation { +impl BlockImportOperation { fn apply_aux(&mut self, transaction: &mut DBTransaction) { for (key, maybe_val) in self.aux_ops.drain(..) { match maybe_val { @@ -530,10 +528,8 @@ impl BlockImportOperation { } } -impl sc_client_api::backend::BlockImportOperation - for BlockImportOperation where Block: BlockT, -{ - type State = CachingState, Block>; +impl sc_client_api::backend::BlockImportOperation for BlockImportOperation { + type State = CachingState, Block>; fn state(&self) -> ClientResult> { Ok(Some(&self.old_state)) @@ -560,7 +556,7 @@ impl sc_client_api::backend::BlockImportOperation // Currently cache isn't implemented on full nodes. } - fn update_db_storage(&mut self, update: PrefixedMemoryDB) -> ClientResult<()> { + fn update_db_storage(&mut self, update: PrefixedMemoryDB>) -> ClientResult<()> { self.db_updates = update; Ok(()) } @@ -568,7 +564,7 @@ impl sc_client_api::backend::BlockImportOperation fn reset_storage( &mut self, storage: Storage, - ) -> ClientResult { + ) -> ClientResult { if storage.top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { return Err(sp_blockchain::Error::GenesisInvalid.into()); @@ -597,7 +593,7 @@ impl sc_client_api::backend::BlockImportOperation fn update_changes_trie( &mut self, - update: ChangesTrieTransaction>, + update: ChangesTrieTransaction, NumberFor>, ) -> ClientResult<()> { self.changes_trie_updates = update.0; self.changes_trie_cache_update = Some(update.1); @@ -621,7 +617,11 @@ impl sc_client_api::backend::BlockImportOperation Ok(()) } - fn mark_finalized(&mut self, block: BlockId, justification: Option) -> ClientResult<()> { + fn mark_finalized( + &mut self, + block: BlockId, + justification: Option, + ) -> ClientResult<()> { self.finalized_blocks.push((block, justification)); Ok(()) } @@ -638,9 +638,9 @@ struct StorageDb { pub state_db: StateDb>, } -impl sp_state_machine::Storage for StorageDb { - fn get(&self, key: &H256, prefix: Prefix) -> Result, String> { - let key = prefixed_key::(key, prefix); +impl sp_state_machine::Storage> for StorageDb { + fn get(&self, key: &Block::Hash, prefix: Prefix) -> Result, String> { + let key = prefixed_key::>(key, prefix); self.state_db.get(&key, self) .map_err(|e| format!("Database backend error: {:?}", e)) } @@ -655,19 +655,19 @@ impl sc_state_db::NodeDb for StorageDb { } } -struct DbGenesisStorage(pub H256); +struct DbGenesisStorage(pub Block::Hash); -impl DbGenesisStorage { +impl DbGenesisStorage { pub fn new() -> Self { - let mut root = H256::default(); - let mut mdb = MemoryDB::::default(); - sp_state_machine::TrieDBMut::::new(&mut mdb, &mut root); + let mut root = Block::Hash::default(); + let mut mdb = MemoryDB::>::default(); + sp_state_machine::TrieDBMut::>::new(&mut mdb, &mut root); DbGenesisStorage(root) } } -impl sp_state_machine::Storage for DbGenesisStorage { - fn get(&self, _key: &H256, _prefix: Prefix) -> Result, String> { +impl sp_state_machine::Storage> for DbGenesisStorage { + fn get(&self, _key: &Block::Hash, _prefix: Prefix) -> Result, String> { Ok(None) } } @@ -678,14 +678,13 @@ pub struct DbChangesTrieStorage { meta: Arc, Block::Hash>>>, min_blocks_to_keep: Option, cache: RwLock>>, - _phantom: ::std::marker::PhantomData, } -impl> DbChangesTrieStorage { +impl DbChangesTrieStorage { /// Commit new changes trie. - pub fn commit(&self, tx: &mut DBTransaction, mut changes_trie: MemoryDB) { + pub fn commit(&self, tx: &mut DBTransaction, mut changes_trie: MemoryDB>) { for (key, (val, _)) in changes_trie.drain() { - tx.put(columns::CHANGES_TRIE, &key[..], &val); + tx.put(columns::CHANGES_TRIE, key.as_ref(), &val); } } @@ -720,10 +719,8 @@ impl> DbChangesTrieStorage { } } -impl sc_client_api::backend::PrunableStateChangesTrieStorage +impl sc_client_api::backend::PrunableStateChangesTrieStorage for DbChangesTrieStorage -where - Block: BlockT, { fn oldest_changes_trie_block( &self, @@ -741,16 +738,19 @@ where } } -impl sp_state_machine::ChangesTrieRootsStorage> +impl sp_state_machine::ChangesTrieRootsStorage, NumberFor> 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)) + hash: Block::Hash, + ) -> 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| sp_state_machine::ChangesTrieAnchorBlockId { @@ -762,12 +762,14 @@ where fn root( &self, - anchor: &sp_state_machine::ChangesTrieAnchorBlockId>, + anchor: &sp_state_machine::ChangesTrieAnchorBlockId>, block: NumberFor, - ) -> Result, String> { + ) -> 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)); + 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 @@ -801,33 +803,40 @@ where } }; - Ok(utils::require_header::(&*self.db, columns::KEY_LOOKUP, columns::HEADER, block_id) + Ok( + utils::require_header::( + &*self.db, + columns::KEY_LOOKUP, + columns::HEADER, + block_id, + ) .map_err(|e| e.to_string())? - .digest().log(DigestItem::as_changes_trie_root) - .map(|root| H256::from_slice(root.as_ref()))) + .digest() + .log(DigestItem::as_changes_trie_root) + .cloned() + ) } } -impl sp_state_machine::ChangesTrieStorage> +impl sp_state_machine::ChangesTrieStorage, NumberFor> for DbChangesTrieStorage -where - Block: BlockT, { - fn as_roots_storage(&self) -> &dyn sp_state_machine::ChangesTrieRootsStorage> { + fn as_roots_storage(&self) + -> &dyn sp_state_machine::ChangesTrieRootsStorage, NumberFor> + { self } fn with_cached_changed_keys( &self, - root: &H256, + root: &Block::Hash, functor: &mut dyn FnMut(&HashMap>, HashSet>>), ) -> bool { self.cache.read().with_changed_keys(root, functor) } - fn get(&self, key: &H256, _prefix: Prefix) -> Result, String> { - self.db.get(columns::CHANGES_TRIE, &key[..]) - .map_err(|err| format!("{}", err)) + fn get(&self, key: &Block::Hash, _prefix: Prefix) -> Result, String> { + self.db.get(columns::CHANGES_TRIE, key.as_ref()).map_err(|err| format!("{}", err)) } } @@ -883,13 +892,13 @@ pub struct Backend { changes_trie_config: Mutex>>, blockchain: BlockchainDb, canonicalization_delay: u64, - shared_cache: SharedCache, + shared_cache: SharedCache, import_lock: RwLock<()>, is_archive: bool, io_stats: FrozenForDuration, } -impl> Backend { +impl Backend { /// Create a new instance of database backend. /// /// The pruning window is how old a block must be before the state is pruned. @@ -915,13 +924,16 @@ impl> Backend { fn from_kvdb( db: Arc, canonicalization_delay: u64, - config: &DatabaseSettings + config: &DatabaseSettings, ) -> ClientResult { let is_archive_pruning = config.pruning.is_archive(); let blockchain = BlockchainDb::new(db.clone())?; let meta = blockchain.meta.clone(); - let map_e = |e: sc_state_db::Error| ::sp_blockchain::Error::from(format!("State database error: {:?}", e)); - let state_db: StateDb<_, _> = StateDb::new(config.pruning.clone(), &StateMetaDb(&*db)).map_err(map_e)?; + let map_e = |e: sc_state_db::Error| sp_blockchain::Error::from( + format!("State database error: {:?}", 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, @@ -930,9 +942,12 @@ impl> Backend { let changes_tries_storage = DbChangesTrieStorage { db, meta, - min_blocks_to_keep: if is_archive_pruning { None } else { Some(MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR) }, + min_blocks_to_keep: if is_archive_pruning { + None + } else { + Some(MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR) + }, cache: RwLock::new(ChangesTrieBuildCache::new()), - _phantom: Default::default(), }; Ok(Backend { @@ -952,13 +967,13 @@ impl> Backend { }) } - /// Returns in-memory blockchain that contains the same set of blocks that the self. + /// Returns in-memory blockchain that contains the same set of blocks as self. #[cfg(feature = "test-helpers")] - pub fn as_in_memory(&self) -> InMemoryBackend { + pub fn as_in_memory(&self) -> InMemoryBackend { use sc_client_api::backend::{Backend as ClientBackend, BlockImportOperation}; use sc_client::blockchain::Backend as BlockchainBackend; - let inmem = InMemoryBackend::::new(); + let inmem = InMemoryBackend::::new(); // get all headers hashes && sort them by number (could be duplicate) let mut headers: Vec<(NumberFor, Block::Hash, Block::Header)> = Vec::new(); @@ -1174,7 +1189,7 @@ impl> Backend { Ok(()) } - fn try_commit_operation(&self, mut operation: BlockImportOperation) + fn try_commit_operation(&self, mut operation: BlockImportOperation) -> ClientResult<()> { let mut transaction = DBTransaction::new(); @@ -1375,9 +1390,7 @@ impl> Backend { f_header: &Block::Header, f_hash: Block::Hash, displaced: &mut Option>> - ) -> ClientResult<()> where - Block: BlockT, - { + ) -> ClientResult<()> { let f_num = f_header.number().clone(); if self.storage.state_db.best_canonical().map(|c| f_num.saturated_into::() > c).unwrap_or(true) { @@ -1421,7 +1434,7 @@ fn apply_state_commit(transaction: &mut DBTransaction, commit: sc_state_db::Comm } } -impl sc_client_api::backend::AuxStore for Backend where Block: BlockT { +impl sc_client_api::backend::AuxStore for Backend where Block: BlockT { fn insert_aux< 'a, 'b: 'a, @@ -1445,10 +1458,10 @@ impl sc_client_api::backend::AuxStore for Backend where Block: Blo } } -impl sc_client_api::backend::Backend for Backend where Block: BlockT { - type BlockImportOperation = BlockImportOperation; +impl sc_client_api::backend::Backend for Backend { + type BlockImportOperation = BlockImportOperation; type Blockchain = BlockchainDb; - type State = CachingState, Block>; + type State = CachingState, Block>; type ChangesTrieStorage = DbChangesTrieStorage; type OffchainStorage = offchain::LocalStorage; @@ -1634,9 +1647,9 @@ impl sc_client_api::backend::Backend for Backend { - let genesis_storage = DbGenesisStorage::new(); + let genesis_storage = DbGenesisStorage::::new(); let root = genesis_storage.0.clone(); - let db_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)); }, @@ -1647,18 +1660,34 @@ impl sc_client_api::backend::Backend for Backend { let hash = hdr.hash(); if !self.have_state_at(&hash, *hdr.number()) { - return Err(sp_blockchain::Error::UnknownBlock(format!("State already discarded for {:?}", block))) + return Err( + sp_blockchain::Error::UnknownBlock( + format!("State already discarded for {:?}", block) + ) + ) } if let Ok(()) = self.storage.state_db.pin(&hash) { - let root = H256::from_slice(hdr.state_root().as_ref()); - let db_state = DbState::new(self.storage.clone(), root); - let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash.clone())); + let root = hdr.state_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(sp_blockchain::Error::UnknownBlock(format!("State already discarded for {:?}", block))) + Err( + sp_blockchain::Error::UnknownBlock( + format!("State already discarded for {:?}", block) + ) + ) } }, - Ok(None) => Err(sp_blockchain::Error::UnknownBlock(format!("Unknown state for block {:?}", block))), + Ok(None) => Err( + sp_blockchain::Error::UnknownBlock( + format!("Unknown state for block {:?}", block) + ) + ), Err(e) => Err(e), } } @@ -1667,7 +1696,11 @@ impl sc_client_api::backend::Backend for Backend { - sp_state_machine::Storage::get(self.storage.as_ref(), &header.state_root(), (&[], None)).unwrap_or(None).is_some() + sp_state_machine::Storage::get( + self.storage.as_ref(), + &header.state_root(), + (&[], None), + ).unwrap_or(None).is_some() }, _ => false, } @@ -1689,8 +1722,7 @@ impl sc_client_api::backend::Backend for Backend sc_client_api::backend::LocalBackend for Backend -where Block: BlockT {} +impl sc_client_api::backend::LocalBackend for Backend {} /// TODO: remove me in #3201 pub fn unused_sink(cache_tx: crate::cache::DbCacheTransaction) { @@ -1703,6 +1735,7 @@ mod tests { use hash_db::{HashDB, EMPTY_PREFIX}; use super::*; use crate::columns; + use sp_core::{Blake2Hasher, H256}; use sc_client_api::backend::{Backend as BTrait, BlockImportOperation as Op}; use sc_client::blockchain::Backend as BLBTrait; use sp_runtime::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; diff --git a/client/db/src/light.rs b/client/db/src/light.rs index f6f176ae79..7a79885fad 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -35,9 +35,8 @@ use sp_blockchain::{ }; use sc_client::light::blockchain::Storage as LightBlockchainStorage; use codec::{Decode, Encode}; -use sp_core::Blake2Hasher; use sp_runtime::generic::{DigestItem, BlockId}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor, HasherFor}; 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}; use crate::{DatabaseSettings, FrozenForDuration}; @@ -306,7 +305,7 @@ impl LightStorage { Some(old_current_num) }); - let new_header_cht_root = cht::compute_root::( + let new_header_cht_root = cht::compute_root::, _>( cht::size(), new_cht_number, cht_range.map(|num| self.hash(num)) )?; transaction.put( @@ -323,7 +322,7 @@ impl LightStorage { current_num = current_num + One::one(); Some(old_current_num) }); - let new_changes_trie_cht_root = cht::compute_root::( + let new_changes_trie_cht_root = cht::compute_root::, _>( cht::size(), new_cht_number, cht_range .map(|num| self.changes_trie_root(BlockId::Number(num))) )?; diff --git a/client/db/src/storage_cache.rs b/client/db/src/storage_cache.rs index 8ffec70e3e..1921dcc7af 100644 --- a/client/db/src/storage_cache.rs +++ b/client/db/src/storage_cache.rs @@ -21,7 +21,7 @@ use std::sync::Arc; use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard}; use linked_hash_map::{LinkedHashMap, Entry}; use hash_db::Hasher; -use sp_runtime::traits::{Block as BlockT, Header}; +use sp_runtime::traits::{Block as BlockT, Header, HasherFor, NumberFor}; use sp_core::hexdisplay::HexDisplay; use sp_core::storage::ChildInfo; use sp_state_machine::{backend::Backend as StateBackend, TrieBackend}; @@ -36,11 +36,11 @@ type ChildStorageKey = (Vec, Vec); type StorageValue = Vec; /// Shared canonical state cache. -pub struct Cache { +pub struct Cache { /// Storage cache. `None` indicates that key is known to be missing. lru_storage: LRUMap>, /// Storage hashes cache. `None` indicates that key is known to be missing. - lru_hashes: LRUMap>, + 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 @@ -147,7 +147,7 @@ impl LRUMap { } -impl Cache { +impl Cache { /// Returns the used memory size of the storage cache in bytes. pub fn used_storage_cache_size(&self) -> usize { self.lru_storage.used_size() @@ -215,25 +215,31 @@ impl Cache { } } -pub type SharedCache = Arc>>; +pub type SharedCache = Arc>>; /// 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( +pub fn new_shared_cache( shared_cache_size: usize, child_ratio: (usize, usize), -) -> SharedCache { +) -> SharedCache { let top = child_ratio.1.saturating_sub(child_ratio.0); - Arc::new(Mutex::new(Cache { - 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(), - })) + Arc::new( + Mutex::new( + Cache { + 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(), + } + ) + ) } #[derive(Debug)] @@ -270,11 +276,11 @@ struct LocalCache { } /// Cache changes. -pub struct CacheChanges { +pub struct CacheChanges { /// Shared canonical state cache. - shared_cache: SharedCache, + shared_cache: SharedCache, /// Local cache of values for this state. - local_cache: RwLock>, + 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, @@ -289,20 +295,20 @@ pub struct CacheChanges { /// For canonical instances local cache is accumulated and applied /// in `sync_cache` along with the change overlay. /// For non-canonical clones local cache and changes are dropped. -pub struct CachingState, B: BlockT> { +pub struct CachingState>, B: BlockT> { /// Backing state. state: S, /// Cache data. - pub cache: CacheChanges + pub cache: CacheChanges, } -impl, B: BlockT> std::fmt::Debug for CachingState { +impl>, B: BlockT> std::fmt::Debug for CachingState { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "Block {:?}", self.cache.parent_hash) } } -impl CacheChanges { +impl CacheChanges { /// Propagate local cache into the shared cache and synchronize /// the shared cache with the best block state. /// @@ -317,11 +323,17 @@ impl CacheChanges { changes: StorageCollection, child_changes: ChildStorageCollection, commit_hash: Option, - commit_number: Option<::Number>, + commit_number: Option>, is_best: bool, ) { let mut cache = self.shared_cache.lock(); - trace!("Syncing cache, id = (#{:?}, {:?}), parent={:?}, best={}", commit_number, commit_hash, self.parent_hash, is_best); + trace!( + "Syncing cache, id = (#{:?}, {:?}), parent={:?}, best={}", + commit_number, + commit_hash, + self.parent_hash, + is_best, + ); let cache = &mut *cache; // Filter out commiting block if any. let enacted: Vec<_> = enacted @@ -405,9 +417,9 @@ impl CacheChanges { } -impl, B: BlockT> CachingState { +impl>, B: BlockT> CachingState { /// Create a new instance wrapping generic State and shared cache. - pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> CachingState { + pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> Self { CachingState { state, cache: CacheChanges { @@ -468,12 +480,12 @@ impl, B: BlockT> CachingState { } /// Dispose state and return cache data. - pub fn release(self) -> CacheChanges { + pub fn release(self) -> CacheChanges { self.cache } } -impl, B: BlockT> StateBackend for CachingState { +impl>, B: BlockT> StateBackend> for CachingState { type Error = S::Error; type Transaction = S::Transaction; type TrieBackendStorage = S::TrieBackendStorage; @@ -498,7 +510,7 @@ impl, B: BlockT> StateBackend for CachingState< Ok(value) } - fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { + fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { 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: {:?}", HexDisplay::from(&key)); @@ -595,10 +607,9 @@ impl, B: BlockT> StateBackend for CachingState< self.state.for_child_keys_with_prefix(storage_key, child_info, prefix, f) } - fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) + fn storage_root(&self, delta: I) -> (B::Hash, Self::Transaction) where I: IntoIterator, Option>)>, - H::Out: Ord { self.state.storage_root(delta) } @@ -608,10 +619,9 @@ impl, B: BlockT> StateBackend for CachingState< storage_key: &[u8], child_info: ChildInfo, delta: I, - ) -> (H::Out, bool, Self::Transaction) + ) -> (B::Hash, bool, Self::Transaction) where I: IntoIterator, Option>)>, - H::Out: Ord { self.state.child_storage_root(storage_key, child_info, delta) } @@ -633,7 +643,7 @@ impl, B: BlockT> StateBackend for CachingState< self.state.child_keys(storage_key, child_info, prefix) } - fn as_trie_backend(&mut self) -> Option<&TrieBackend> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend>> { self.state.as_trie_backend() } } @@ -642,7 +652,7 @@ impl, B: BlockT> StateBackend for CachingState< mod tests { use super::*; use sp_runtime::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; - use sp_state_machine::backend::InMemory; + use sp_state_machine::InMemoryBackend; use sp_core::Blake2Hasher; type Block = RawBlock>; @@ -660,43 +670,119 @@ mod tests { let h3a = H256::random(); let h3b = H256::random(); - let shared = new_shared_cache::(256*1024, (0,1)); + 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)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], vec![], Some(h0), Some(0), true); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(root_parent), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![2]))], + vec![], + Some(h0), + Some(0), + true, + ); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h0), + ); s.cache.sync_cache(&[], &[], vec![], vec![], Some(h1a), Some(1), true); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], vec![], Some(h1b), Some(1), false); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h0), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![3]))], + vec![], + Some(h1b), + 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]))], vec![], Some(h2b), Some(2), false); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1b), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![4]))], + vec![], + Some(h2b), + 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]))], vec![], Some(h2a), Some(2), true); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1a), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![5]))], + vec![], + Some(h2a), + Some(2), + true, + ); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2a)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h2a), + ); s.cache.sync_cache(&[], &[], vec![], vec![], Some(h3a), Some(3), true); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h3a), + ); assert_eq!(s.storage(&key).unwrap().unwrap(), vec![5]); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1a)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1a), + ); assert!(s.storage(&key).unwrap().is_none()); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2b)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h2b), + ); assert!(s.storage(&key).unwrap().is_none()); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1b)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1b), + ); assert!(s.storage(&key).unwrap().is_none()); // reorg to 3b // blocks [ 3b(c) 3a 2a 2b(c) 1b 1a 0 ] - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2b)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h2b), + ); s.cache.sync_cache( &[h1b, h2b, h3b], &[h1a, h2a, h3a], @@ -706,7 +792,11 @@ mod tests { Some(3), true, ); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h3a), + ); assert!(s.storage(&key).unwrap().is_none()); } @@ -721,21 +811,65 @@ mod tests { let h2b = H256::random(); let h3b = H256::random(); - let shared = new_shared_cache::(256*1024, (0,1)); + let shared = new_shared_cache::(256*1024, (0,1)); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], vec![], Some(h1), Some(1), true); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(root_parent), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![2]))], + vec![], + Some(h1), + Some(1), + true, + ); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1), + ); s.cache.sync_cache(&[], &[], vec![], vec![], Some(h2a), Some(2), true); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], vec![], Some(h2b), Some(2), false); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![3]))], + vec![], + Some(h2b), + Some(2), + false, + ); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2b)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], vec![], Some(h3b), Some(2), false); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h2b), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![3]))], + vec![], + Some(h3b), + Some(2), + false, + ); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2a)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h2a), + ); assert_eq!(s.storage(&key).unwrap().unwrap(), vec![2]); } @@ -749,34 +883,76 @@ mod tests { let h3a = H256::random(); let h3b = H256::random(); - let shared = new_shared_cache::(256*1024, (0,1)); + let shared = new_shared_cache::(256*1024, (0,1)); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(root_parent), + ); s.cache.sync_cache(&[], &[], vec![], vec![], Some(h1), Some(1), true); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1), + ); s.cache.sync_cache(&[], &[], vec![], vec![], Some(h2a), Some(2), true); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2a)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], vec![], Some(h3a), Some(3), true); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h2a), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![2]))], + vec![], + Some(h3a), + Some(3), + true, + ); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1), + ); s.cache.sync_cache(&[], &[], vec![], vec![], Some(h2b), Some(2), false); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2b)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], vec![], Some(h3b), Some(3), false); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h2b), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![3]))], + vec![], + Some(h3b), + Some(3), + false, + ); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h3a), + ); assert_eq!(s.storage(&key).unwrap().unwrap(), vec![2]); } #[test] fn should_track_used_size_correctly() { let root_parent = H256::random(); - let shared = new_shared_cache::(109, ((109-36), 109)); + 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)); + let mut s = CachingState::new( + InMemoryBackend::::default(), shared.clone(), Some(root_parent.clone()), + ); let key = H256::random()[..].to_vec(); let s_key = H256::random()[..].to_vec(); @@ -809,10 +985,14 @@ mod tests { #[test] fn should_remove_lru_items_based_on_tracking_used_size() { let root_parent = H256::random(); - let shared = new_shared_cache::(36*3, (2,3)); + 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)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(root_parent), + ); let key = H256::random()[..].to_vec(); s.cache.sync_cache( @@ -851,14 +1031,42 @@ mod tests { let h0 = H256::random(); let h1 = H256::random(); - let shared = new_shared_cache::(256*1024, (0, 1)); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], vec![], Some(h0), Some(0), true); + let shared = new_shared_cache::(256 * 1024, (0, 1)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(root_parent.clone()), + ); + 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)); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], vec![], Some(h1), Some(1), true); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h0), + ); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![3]))], + vec![], + Some(h1), + Some(1), + true, + ); - let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1)); + let mut s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1), + ); assert_eq!(s.storage(&key).unwrap(), Some(vec![3])); // Restart (or unknown block?), clear caches. @@ -877,7 +1085,11 @@ mod tests { // New value is propagated. s.cache.sync_cache(&[], &[], vec![], vec![], None, None, true); - let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1)); + let s = CachingState::new( + InMemoryBackend::::default(), + shared.clone(), + Some(h1), + ); assert_eq!(s.storage(&key).unwrap(), None); } } @@ -890,7 +1102,7 @@ mod qc { use super::*; use sp_runtime::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; - use sp_state_machine::backend::InMemory; + use sp_state_machine::InMemoryBackend; use sp_core::Blake2Hasher; type Block = RawBlock>; @@ -1002,14 +1214,14 @@ mod qc { } struct Mutator { - shared: SharedCache, + shared: SharedCache, canon: Vec, forks: HashMap>, } impl Mutator { fn new_empty() -> Self { - let shared = new_shared_cache::(256*1024, (0,1)); + let shared = new_shared_cache::(256*1024, (0,1)); Self { shared, @@ -1018,19 +1230,22 @@ mod qc { } } - fn head_state(&self, hash: H256) -> CachingState, Block> { + fn head_state(&self, hash: H256) -> CachingState, Block> { CachingState::new( - InMemory::::default(), + InMemoryBackend::::default(), self.shared.clone(), Some(hash) ) } - fn canon_head_state(&self) -> CachingState, Block> { + fn canon_head_state(&self) -> CachingState, Block> { self.head_state(self.canon.last().expect("Expected to be one commit").hash) } - fn mutate_static(&mut self, action: Action) -> CachingState, Block> { + fn mutate_static( + &mut self, + action: Action, + ) -> CachingState, Block> { self.mutate(action).expect("Expected to provide only valid actions to the mutate_static") } @@ -1046,7 +1261,10 @@ mod qc { (0u8..255).map(|x| vec![x]).collect() } - fn mutate(&mut self, action: Action) -> Result, Block>, ()> { + fn mutate( + &mut self, + action: Action, + ) -> Result, Block>, ()> { let state = match action { Action::Fork { depth, hash, changes } => { let pos = self.canon.len() as isize - depth as isize; @@ -1083,7 +1301,7 @@ mod qc { }; let mut state = CachingState::new( - InMemory::::default(), + InMemoryBackend::::default(), self.shared.clone(), Some(parent) ); @@ -1122,7 +1340,7 @@ mod qc { } let mut state = CachingState::new( - InMemory::::default(), + InMemoryBackend::::default(), self.shared.clone(), Some(parent_hash) ); @@ -1169,7 +1387,7 @@ mod qc { self.canon.push(node); let mut state = CachingState::new( - InMemory::::default(), + InMemoryBackend::::default(), self.shared.clone(), Some(fork_at) ); diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index ac01d5294f..d708e00bfd 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -29,7 +29,7 @@ use sp_blockchain::{HeaderBackend, Error as ClientError}; use sc_client_api::{ BlockchainEvents, - backend::{Backend}, + backend::{AuxStore, Backend}, Finalizer, call_executor::CallExecutor, utils::is_descendent_of, @@ -41,7 +41,7 @@ use finality_grandpa::{ BlockNumberOps, Equivocation, Error as GrandpaError, round::State as RoundState, voter, voter_set::VoterSet, }; -use sp_core::{Blake2Hasher, H256, Pair}; +use sp_core::Pair; use sp_runtime::generic::BlockId; use sp_runtime::traits::{ Block as BlockT, Header as HeaderT, NumberFor, One, Zero, @@ -406,13 +406,13 @@ impl, RA, SC, VR> Environment, B, E, N, RA, SC, VR> +impl finality_grandpa::Chain> for Environment where Block: 'static, - B: Backend + 'static, - E: CallExecutor + Send + Sync + 'static, + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, N: NetworkT + 'static + Send, SC: SelectChain + 'static, VR: VotingRule>, @@ -519,13 +519,13 @@ where } -pub(crate) fn ancestry, E, RA>( +pub(crate) fn ancestry( client: &Client, base: Block::Hash, block: Block::Hash, ) -> Result, GrandpaError> where - B: Backend, - E: CallExecutor, + B: Backend, + E: CallExecutor, { if base == block { return Err(GrandpaError::NotDescendent) } @@ -550,18 +550,19 @@ pub(crate) fn ancestry, E, RA>( Ok(tree_route.retracted().iter().skip(1).map(|e| e.hash).collect()) } -impl, N, RA, SC, VR> +impl voter::Environment> for Environment where Block: 'static, - B: Backend + 'static, - E: CallExecutor + 'static + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Send + Sync, N: NetworkT + 'static + Send, RA: 'static + Send + Sync, SC: SelectChain + 'static, VR: VotingRule>, NumberFor: BlockNumberOps, + Client: AuxStore, { type Timer = Box + Send>; type Id = AuthorityId; @@ -940,7 +941,7 @@ impl From> for JustificationOrCommit< /// authority set change is enacted then a justification is created (if not /// given) and stored with the block when finalizing it. /// This method assumes that the block being finalized has already been imported. -pub(crate) fn finalize_block, E, RA>( +pub(crate) fn finalize_block( client: &Client, authority_set: &SharedAuthoritySet>, consensus_changes: &SharedConsensusChanges>, @@ -949,8 +950,8 @@ pub(crate) fn finalize_block, E, RA>( number: NumberFor, justification_or_commit: JustificationOrCommit, ) -> Result<(), CommandOrError>> where - B: Backend, - E: CallExecutor + Send + Sync, + B: Backend, + E: CallExecutor + Send + Sync, RA: Send + Sync, { // NOTE: lock must be held through writing to DB to avoid race. this lock @@ -988,7 +989,7 @@ pub(crate) fn finalize_block, E, RA>( let status = authority_set.apply_standard_changes( hash, number, - &is_descendent_of::<_, _, Block::Hash>(client, None), + &is_descendent_of::(client, None), ).map_err(|e| Error::Safety(e.to_string()))?; // check if this is this is the first finalization of some consensus changes @@ -1124,8 +1125,8 @@ pub(crate) fn finalize_block, E, RA>( /// Using the given base get the block at the given height on this chain. The /// target block must be an ancestor of base, therefore `height <= base.height`. -pub(crate) fn canonical_at_height, C: HeaderBackend>( - provider: C, +pub(crate) fn canonical_at_height>( + provider: &C, base: (Block::Hash, NumberFor), base_is_canonical: bool, height: NumberFor, diff --git a/client/finality-grandpa/src/finality_proof.rs b/client/finality-grandpa/src/finality_proof.rs index f5bf9fed53..fb0f7fd4a9 100644 --- a/client/finality-grandpa/src/finality_proof.rs +++ b/client/finality-grandpa/src/finality_proof.rs @@ -50,7 +50,7 @@ use sp_runtime::{ Justification, generic::BlockId, traits::{NumberFor, Block as BlockT, Header as HeaderT, One}, }; -use sp_core::{H256, Blake2Hasher, storage::StorageKey}; +use sp_core::storage::StorageKey; use sc_telemetry::{telemetry, CONSENSUS_INFO}; use sp_finality_grandpa::{AuthorityId, AuthorityList, VersionedAuthorityList, GRANDPA_AUTHORITIES_KEY}; @@ -68,10 +68,10 @@ pub trait AuthoritySetForFinalityProver: Send + Sync { } /// Client-based implementation of AuthoritySetForFinalityProver. -impl, RA> AuthoritySetForFinalityProver for Client +impl AuthoritySetForFinalityProver for Client where - B: Backend + Send + Sync + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, { fn authorities(&self, block: &BlockId) -> ClientResult { @@ -134,13 +134,13 @@ impl AuthoritySetForFinalityChecker for Arc> { +pub struct FinalityProofProvider { backend: Arc, authority_provider: Arc>, } -impl> FinalityProofProvider - where B: Backend + Send + Sync + 'static +impl FinalityProofProvider + where B: Backend + Send + Sync + 'static { /// Create new finality proof provider using: /// @@ -156,9 +156,9 @@ impl> FinalityProofProvider impl sc_network::FinalityProofProvider for FinalityProofProvider where - Block: BlockT, + Block: BlockT, NumberFor: BlockNumberOps, - B: Backend + Send + Sync + 'static, + B: Backend + Send + Sync + 'static, { fn prove_finality( &self, @@ -252,7 +252,7 @@ pub(crate) fn make_finality_proof_request(last_finalized: H, /// It is assumed that the caller already knows all blocks in the range (begin; end]. /// /// Returns None if there are no finalized blocks unknown to the caller. -pub(crate) fn prove_finality, B: BlockchainBackend, J>( +pub(crate) fn prove_finality, J>( blockchain: &B, authorities_provider: &dyn AuthoritySetForFinalityProver, authorities_set_id: u64, @@ -410,7 +410,7 @@ pub(crate) fn prove_finality, B: BlockchainBackend, B>( +pub(crate) fn check_finality_proof( blockchain: &B, current_set_id: u64, current_authorities: AuthorityList, @@ -429,7 +429,7 @@ pub(crate) fn check_finality_proof, B>( remote_proof) } -fn do_check_finality_proof, B, J>( +fn do_check_finality_proof( blockchain: &B, current_set_id: u64, current_authorities: AuthorityList, @@ -484,7 +484,7 @@ fn do_check_finality_proof, B, J>( } /// Check finality proof for the single block. -fn check_finality_proof_fragment, B, J>( +fn check_finality_proof_fragment( blockchain: &B, authority_set: AuthoritiesOrEffects, authorities_provider: &dyn AuthoritySetForFinalityChecker, @@ -569,7 +569,7 @@ pub(crate) trait ProvableJustification: Encode + Decode { } } -impl> ProvableJustification for GrandpaJustification +impl ProvableJustification for GrandpaJustification where NumberFor: BlockNumberOps, { diff --git a/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index f5fde25a05..ad1b2b1a87 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -22,7 +22,7 @@ use futures::sync::mpsc; use parking_lot::RwLockWriteGuard; use sp_blockchain::{HeaderBackend, BlockStatus, well_known_cache_keys}; -use sc_client_api::{backend::Backend, CallExecutor, utils::is_descendent_of}; +use sc_client_api::{backend::{TransactionFor, Backend}, CallExecutor, utils::is_descendent_of}; use sc_client::Client; use sp_consensus::{ BlockImport, Error as ConsensusError, @@ -35,7 +35,6 @@ use sp_runtime::generic::{BlockId, OpaqueDigestItemId}; use sp_runtime::traits::{ Block as BlockT, DigestFor, Header as HeaderT, NumberFor, Zero, }; -use sp_core::{H256, Blake2Hasher}; use crate::{Error, CommandOrError, NewAuthoritySet, VoterCommand}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, DelayKind, PendingChange}; @@ -52,7 +51,7 @@ use crate::justification::GrandpaJustification; /// /// When using GRANDPA, the block import worker should be using this block import /// object. -pub struct GrandpaBlockImport, RA, SC> { +pub struct GrandpaBlockImport { inner: Arc>, select_chain: SC, authority_set: SharedAuthoritySet>, @@ -60,7 +59,7 @@ pub struct GrandpaBlockImport, RA, SC> { consensus_changes: SharedConsensusChanges>, } -impl, RA, SC: Clone> Clone for +impl Clone for GrandpaBlockImport { fn clone(&self) -> Self { @@ -74,11 +73,11 @@ impl, RA, SC: Clone> Clone for } } -impl, RA, SC> JustificationImport +impl JustificationImport for GrandpaBlockImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, SC: SelectChain, @@ -201,12 +200,12 @@ fn find_forced_change(header: &B::Header) header.digest().convert_first(|l| l.try_to(id).and_then(filter_log)) } -impl, RA, SC> +impl GrandpaBlockImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, { @@ -236,9 +235,11 @@ where }) } - fn make_authorities_changes<'a>(&'a self, block: &mut BlockImportParams, hash: Block::Hash) - -> Result, ConsensusError> - { + fn make_authorities_changes<'a>( + &'a self, + block: &mut BlockImportParams>, + hash: Block::Hash, + ) -> Result, ConsensusError> { // when we update the authorities, we need to hold the lock // until the block is written to prevent a race if we need to restore // the old authority set on error or panic. @@ -285,7 +286,7 @@ where // returns a function for checking whether a block is a descendent of another // consistent with querying client directly after importing the block. let parent_hash = *block.header.parent_hash(); - let is_descendent_of = is_descendent_of(&*self.inner, Some((&hash, &parent_hash))); + let is_descendent_of = is_descendent_of(&*self.inner, Some((hash, parent_hash))); let mut guard = InnerGuard { guard: Some(self.authority_set.inner().write()), @@ -379,19 +380,22 @@ where } } -impl, RA, SC> BlockImport +impl BlockImport for GrandpaBlockImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, + for<'a> &'a Client: + BlockImport>, { type Error = ConsensusError; + type Transaction = TransactionFor; fn import_block( &mut self, - mut block: BlockImportParams, + mut block: BlockImportParams, new_cache: HashMap>, ) -> Result { let hash = block.post_header().hash(); @@ -416,12 +420,20 @@ impl, RA, SC> BlockImport match import_result { Ok(ImportResult::Imported(aux)) => aux, Ok(r) => { - debug!(target: "afg", "Restoring old authority set after block import result: {:?}", r); + debug!( + target: "afg", + "Restoring old authority set after block import result: {:?}", + r, + ); pending_changes.revert(); return Ok(r); }, Err(e) => { - debug!(target: "afg", "Restoring old authority set after block import error: {:?}", e); + debug!( + target: "afg", + "Restoring old authority set after block import error: {:?}", + e, + ); pending_changes.revert(); return Err(ConsensusError::ClientImport(e.to_string()).into()); }, @@ -509,9 +521,7 @@ impl, RA, SC> BlockImport } } -impl, RA, SC> - GrandpaBlockImport -{ +impl GrandpaBlockImport { pub(crate) fn new( inner: Arc>, select_chain: SC, @@ -529,12 +539,12 @@ impl, RA, SC> } } -impl, RA, SC> +impl GrandpaBlockImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, { diff --git a/client/finality-grandpa/src/justification.rs b/client/finality-grandpa/src/justification.rs index 2326a502a5..308056725f 100644 --- a/client/finality-grandpa/src/justification.rs +++ b/client/finality-grandpa/src/justification.rs @@ -24,7 +24,6 @@ use finality_grandpa::voter_set::VoterSet; use finality_grandpa::{Error as GrandpaError}; use sp_runtime::generic::BlockId; use sp_runtime::traits::{NumberFor, Block as BlockT, Header as HeaderT}; -use sp_core::{H256, Blake2Hasher}; use sp_finality_grandpa::AuthorityId; use crate::{Commit, Error}; @@ -45,7 +44,7 @@ pub struct GrandpaJustification { votes_ancestries: Vec, } -impl> GrandpaJustification { +impl GrandpaJustification { /// Create a GRANDPA justification from the given commit. This method /// assumes the commit is valid and well-formed. pub(crate) fn from_commit( @@ -53,8 +52,8 @@ impl> GrandpaJustification { round: u64, commit: Commit, ) -> Result, Error> where - B: Backend, - E: CallExecutor + Send + Sync, + B: Backend, + E: CallExecutor + Send + Sync, RA: Send + Sync, { let mut votes_ancestries_hashes = HashSet::new(); diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index b9af183989..809e0ab88a 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -55,7 +55,7 @@ use futures::prelude::*; use log::{debug, error, info}; use futures::sync::mpsc; -use sc_client_api::{BlockchainEvents, CallExecutor, backend::Backend, ExecutionStrategy}; +use sc_client_api::{BlockchainEvents, CallExecutor, backend::{AuxStore, Backend}, ExecutionStrategy}; use sp_blockchain::{HeaderBackend, Error as ClientError}; use sc_client::Client; use parity_scale_codec::{Decode, Encode}; @@ -64,7 +64,7 @@ use sp_runtime::traits::{NumberFor, Block as BlockT, DigestFor, Zero}; use sc_keystore::KeyStorePtr; use sp_inherents::InherentDataProviders; use sp_consensus::SelectChain; -use sp_core::{H256, Blake2Hasher, Pair}; +use sp_core::Pair; use sc_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG, CONSENSUS_WARN}; use serde_json; @@ -252,9 +252,9 @@ pub(crate) trait BlockStatus { fn block_number(&self, hash: Block::Hash) -> Result>, Error>; } -impl, RA> BlockStatus for Arc> where - B: Backend, - E: CallExecutor + Send + Sync, +impl BlockStatus for Arc> where + B: Backend, + E: CallExecutor + Send + Sync, RA: Send + Sync, NumberFor: BlockNumberOps, { @@ -355,7 +355,7 @@ impl fmt::Display for CommandOrError { } } -pub struct LinkHalf, RA, SC> { +pub struct LinkHalf { client: Arc>, select_chain: SC, persistent_data: PersistentData, @@ -368,10 +368,10 @@ pub trait GenesisAuthoritySetProvider { fn get(&self) -> Result; } -impl, RA> GenesisAuthoritySetProvider for Client +impl GenesisAuthoritySetProvider for Client where - B: Backend + Send + Sync + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, { fn get(&self) -> Result { @@ -397,7 +397,7 @@ impl, RA> GenesisAuthoritySetProvider for /// Make block importer and link half necessary to tie the background voter /// to it. -pub fn block_import, RA, SC>( +pub fn block_import( client: Arc>, genesis_authorities_provider: &dyn GenesisAuthoritySetProvider, select_chain: SC, @@ -406,10 +406,11 @@ pub fn block_import, RA, SC>( LinkHalf ), ClientError> where - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, SC: SelectChain, + Client: AuxStore, { let chain_info = client.chain_info(); let genesis_hash = chain_info.genesis_hash; @@ -446,7 +447,7 @@ where )) } -fn global_communication, B, E, N, RA>( +fn global_communication( set_id: SetId, voters: &Arc>, client: &Arc>, @@ -454,16 +455,16 @@ fn global_communication, B, E, N, RA>( keystore: &Option, ) -> ( impl Stream< - Item = CommunicationInH, - Error = CommandOrError>, + Item = CommunicationInH, + Error = CommandOrError>, >, impl Sink< - SinkItem = CommunicationOutH, - SinkError = CommandOrError>, + SinkItem = CommunicationOutH, + SinkError = CommandOrError>, >, ) where - B: Backend, - E: CallExecutor + Send + Sync, + B: Backend, + E: CallExecutor + Send + Sync, N: NetworkT, RA: Send + Sync, NumberFor: BlockNumberOps, @@ -494,12 +495,12 @@ fn global_communication, B, E, N, RA>( /// Register the finality tracker inherent data provider (which is used by /// GRANDPA), if not registered already. -fn register_finality_tracker_inherent_data_provider, RA>( +fn register_finality_tracker_inherent_data_provider( client: Arc>, inherent_data_providers: &InherentDataProviders, ) -> Result<(), sp_consensus::Error> where - B: Backend + 'static, - E: CallExecutor + Send + Sync + 'static, + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, RA: Send + Sync + 'static, { if !inherent_data_providers.has_provider(&sp_finality_tracker::INHERENT_IDENTIFIER) { @@ -522,7 +523,7 @@ fn register_finality_tracker_inherent_data_provider, N, RA, SC, VR, X, Sp> { +pub struct GrandpaParams { /// Configuration for the GRANDPA service. pub config: Config, /// A link to the block import worker. @@ -543,12 +544,12 @@ pub struct GrandpaParams, N, RA, SC, VR, X, Sp> { /// Run a GRANDPA voter as a task. Provide configuration and a link to a /// block import worker that has already been instantiated with `block_import`. -pub fn run_grandpa_voter, N, RA, SC, VR, X, Sp>( +pub fn run_grandpa_voter( grandpa_params: GrandpaParams, ) -> sp_blockchain::Result + Send + 'static> where Block::Hash: Ord, - B: Backend + 'static, - E: CallExecutor + Send + Sync + 'static, + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, N: NetworkT + Send + Sync + Clone + 'static, SC: SelectChain + 'static, VR: VotingRule> + Clone + 'static, @@ -556,6 +557,7 @@ pub fn run_grandpa_voter, N, RA, SC, VR, X, Sp>( DigestFor: Encode, RA: Send + Sync + 'static, X: futures03::Future + Clone + Send + Unpin + 'static, + Client: AuxStore, Sp: futures03::task::Spawn + 'static, { let GrandpaParams { @@ -650,14 +652,15 @@ struct VoterWork, RA, SC, VR> { impl VoterWork where - Block: BlockT, + Block: BlockT, N: NetworkT + Sync, NumberFor: BlockNumberOps, RA: 'static + Send + Sync, - E: CallExecutor + Send + Sync + 'static, - B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + B: Backend + 'static, SC: SelectChain + 'static, VR: VotingRule> + Clone + 'static, + Client: AuxStore, { fn new( client: Arc>, @@ -825,14 +828,15 @@ where impl Future for VoterWork where - Block: BlockT, + Block: BlockT, N: NetworkT + Sync, NumberFor: BlockNumberOps, RA: 'static + Send + Sync, - E: CallExecutor + Send + Sync + 'static, - B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + B: Backend + 'static, SC: SelectChain + 'static, VR: VotingRule> + Clone + 'static, + Client: AuxStore, { type Item = (); type Error = Error; @@ -877,12 +881,12 @@ where } #[deprecated(since = "1.1.0", note = "Please switch to run_grandpa_voter.")] -pub fn run_grandpa, N, RA, SC, VR, X, Sp>( +pub fn run_grandpa( grandpa_params: GrandpaParams, -) -> ::sp_blockchain::Result + Send + 'static> where +) -> sp_blockchain::Result + Send + 'static> where Block::Hash: Ord, - B: Backend + 'static, - E: CallExecutor + Send + Sync + 'static, + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, N: NetworkT + Send + Sync + Clone + 'static, SC: SelectChain + 'static, NumberFor: BlockNumberOps, @@ -890,6 +894,7 @@ pub fn run_grandpa, N, RA, SC, VR, X, Sp>( RA: Send + Sync + 'static, VR: VotingRule> + Clone + 'static, X: futures03::Future + Clone + Send + Unpin + 'static, + Client: AuxStore, Sp: futures03::task::Spawn + 'static, { run_grandpa_voter(grandpa_params) @@ -901,13 +906,13 @@ pub fn run_grandpa, N, RA, SC, VR, X, Sp>( /// discards all GRANDPA messages (otherwise, we end up banning nodes that send /// us a `Neighbor` message, since there is no registered gossip validator for /// the engine id defined in the message.) -pub fn setup_disabled_grandpa, RA, N>( +pub fn setup_disabled_grandpa( client: Arc>, inherent_data_providers: &InherentDataProviders, network: N, ) -> Result<(), sp_consensus::Error> where - B: Backend + 'static, - E: CallExecutor + Send + Sync + 'static, + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, RA: Send + Sync + 'static, N: NetworkT + Send + Clone + 'static, { diff --git a/client/finality-grandpa/src/light_import.rs b/client/finality-grandpa/src/light_import.rs index 66f8a9deef..0da2248778 100644 --- a/client/finality-grandpa/src/light_import.rs +++ b/client/finality-grandpa/src/light_import.rs @@ -19,7 +19,7 @@ use std::sync::Arc; use log::{info, trace, warn}; use parking_lot::RwLock; use sc_client::Client; -use sc_client_api::{CallExecutor, backend::{AuxStore, Backend, Finalizer}}; +use sc_client_api::{CallExecutor, backend::{AuxStore, Backend, Finalizer, TransactionFor}}; use sp_blockchain::{HeaderBackend, Error as ClientError, well_known_cache_keys}; use parity_scale_codec::{Encode, Decode}; use sp_consensus::{ @@ -32,7 +32,6 @@ use sp_runtime::Justification; use sp_runtime::traits::{NumberFor, Block as BlockT, Header as HeaderT, DigestFor}; use sp_finality_grandpa::{self, AuthorityList}; use sp_runtime::generic::BlockId; -use sp_core::{H256, Blake2Hasher}; use crate::GenesisAuthoritySetProvider; use crate::aux_schema::load_decode; @@ -49,16 +48,17 @@ const LIGHT_AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; const LIGHT_CONSENSUS_CHANGES_KEY: &[u8] = b"grandpa_consensus_changes"; /// Create light block importer. -pub fn light_block_import, RA>( +pub fn light_block_import( client: Arc>, backend: Arc, genesis_authorities_provider: &dyn GenesisAuthoritySetProvider, authority_set_provider: Arc>, ) -> Result, ClientError> where - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, + Client: AuxStore, { let info = client.info(); let import_data = load_aux_import_data( @@ -79,14 +79,14 @@ pub fn light_block_import, RA>( /// It is responsible for: /// - checking GRANDPA justifications; /// - fetching finality proofs for blocks that are enacting consensus changes. -pub struct GrandpaLightBlockImport, RA> { +pub struct GrandpaLightBlockImport { client: Arc>, backend: Arc, authority_set_provider: Arc>, data: Arc>>, } -impl, RA> Clone for GrandpaLightBlockImport { +impl Clone for GrandpaLightBlockImport { fn clone(&self) -> Self { GrandpaLightBlockImport { client: self.client.clone(), @@ -98,7 +98,7 @@ impl, RA> Clone for GrandpaLightBlockImport> { +struct LightImportData { last_finalized: Block::Hash, authority_set: LightAuthoritySet, consensus_changes: ConsensusChanges>, @@ -111,26 +111,31 @@ struct LightAuthoritySet { authorities: AuthorityList, } -impl, RA> GrandpaLightBlockImport { +impl GrandpaLightBlockImport { /// Create finality proof request builder. pub fn create_finality_proof_request_builder(&self) -> BoxFinalityProofRequestBuilder { Box::new(GrandpaFinalityProofRequestBuilder(self.data.clone())) as _ } } -impl, RA> BlockImport +impl BlockImport for GrandpaLightBlockImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, + for<'a> &'a Client: + BlockImport> + + Finalizer + + AuxStore, { type Error = ConsensusError; + type Transaction = TransactionFor; fn import_block( &mut self, - block: BlockImportParams, + block: BlockImportParams, new_cache: HashMap>, ) -> Result { do_import_block::<_, _, _, GrandpaJustification>( @@ -146,13 +151,17 @@ impl, RA> BlockImport } } -impl, RA> FinalityProofImport +impl FinalityProofImport for GrandpaLightBlockImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, + for<'a> &'a Client: + BlockImport> + + Finalizer + + AuxStore, { type Error = ConsensusError; @@ -162,7 +171,9 @@ impl, RA> FinalityProofImport let data = self.data.read(); for (pending_number, pending_hash) in data.consensus_changes.pending_changes() { - if *pending_number > chain_info.finalized_number && *pending_number <= chain_info.best_number { + if *pending_number > chain_info.finalized_number + && *pending_number <= chain_info.best_number + { out.push((pending_hash.clone(), *pending_number)); } } @@ -216,9 +227,9 @@ impl LightAuthoritySet { } } -struct GrandpaFinalityProofRequestBuilder>(Arc>>); +struct GrandpaFinalityProofRequestBuilder(Arc>>); -impl> FinalityProofRequestBuilder for GrandpaFinalityProofRequestBuilder { +impl FinalityProofRequestBuilder for GrandpaFinalityProofRequestBuilder { fn build_request_data(&mut self, _hash: &B::Hash) -> Vec { let data = self.0.read(); make_finality_proof_request( @@ -229,19 +240,19 @@ impl> FinalityProofRequestBuilder for GrandpaFinalityPro } /// Try to import new block. -fn do_import_block, J>( +fn do_import_block( mut client: C, data: &mut LightImportData, - mut block: BlockImportParams, + mut block: BlockImportParams>, new_cache: HashMap>, ) -> Result where C: HeaderBackend + AuxStore - + Finalizer - + BlockImport + + Finalizer + + BlockImport> + Clone, - B: Backend + 'static, + B: Backend + 'static, NumberFor: finality_grandpa::BlockNumberOps, DigestFor: Encode, J: ProvableJustification, @@ -288,7 +299,7 @@ fn do_import_block, J>( } /// Try to import finality proof. -fn do_import_finality_proof, J>( +fn do_import_finality_proof( client: C, backend: Arc, authority_set_provider: &dyn AuthoritySetForFinalityChecker, @@ -301,10 +312,10 @@ fn do_import_finality_proof, J>( where C: HeaderBackend + AuxStore - + Finalizer - + BlockImport + + Finalizer + + BlockImport> + Clone, - B: Backend + 'static, + B: Backend + 'static, DigestFor: Encode, NumberFor: finality_grandpa::BlockNumberOps, J: ProvableJustification, @@ -322,15 +333,27 @@ fn do_import_finality_proof, J>( // try to import all new headers let block_origin = BlockOrigin::NetworkBroadcast; for header_to_import in finality_effects.headers_to_import { - let (block_to_import, new_authorities) = verifier.verify(block_origin, header_to_import, None, None) - .map_err(|e| ConsensusError::ClientImport(e))?; - assert!(block_to_import.justification.is_none(), "We have passed None as justification to verifier.verify"); + let (block_to_import, new_authorities) = verifier.verify( + block_origin, + header_to_import, + None, + None, + ).map_err(|e| ConsensusError::ClientImport(e))?; + assert!( + block_to_import.justification.is_none(), + "We have passed None as justification to verifier.verify", + ); let mut cache = HashMap::new(); if let Some(authorities) = new_authorities { cache.insert(well_known_cache_keys::AUTHORITIES, authorities.encode()); } - do_import_block::<_, _, _, J>(client.clone(), data, block_to_import, cache)?; + do_import_block::<_, _, _, J>( + client.clone(), + data, + block_to_import.convert_transaction(), + cache, + )?; } // try to import latest justification @@ -356,7 +379,7 @@ fn do_import_finality_proof, J>( } /// Try to import justification. -fn do_import_justification, J>( +fn do_import_justification( client: C, data: &mut LightImportData, hash: Block::Hash, @@ -366,9 +389,9 @@ fn do_import_justification, J>( where C: HeaderBackend + AuxStore - + Finalizer + + Finalizer + Clone, - B: Backend + 'static, + B: Backend + 'static, NumberFor: finality_grandpa::BlockNumberOps, J: ProvableJustification, { @@ -427,7 +450,7 @@ fn do_import_justification, J>( } /// Finalize the block. -fn do_finalize_block>( +fn do_finalize_block( client: C, data: &mut LightImportData, hash: Block::Hash, @@ -437,9 +460,9 @@ fn do_finalize_block>( where C: HeaderBackend + AuxStore - + Finalizer + + Finalizer + Clone, - B: Backend + 'static, + B: Backend + 'static, NumberFor: finality_grandpa::BlockNumberOps, { // finalize the block @@ -450,7 +473,10 @@ fn do_finalize_block>( // forget obsoleted consensus changes let consensus_finalization_res = data.consensus_changes - .finalize((number, hash), |at_height| canonical_at_height(client.clone(), (hash, number), true, at_height)); + .finalize( + (number, hash), + |at_height| canonical_at_height(&client, (hash, number), true, at_height) + ); match consensus_finalization_res { Ok((true, _)) => require_insert_aux( &client, @@ -470,13 +496,14 @@ fn do_finalize_block>( } /// Load light import aux data from the store. -fn load_aux_import_data>( +fn load_aux_import_data( last_finalized: Block::Hash, aux_store: &B, genesis_authorities_provider: &dyn GenesisAuthoritySetProvider, ) -> Result, ClientError> where B: AuxStore, + Block: BlockT, { let authority_set = match load_decode(aux_store, LIGHT_AUTHORITY_SET_KEY)? { Some(authority_set) => authority_set, @@ -548,15 +575,15 @@ pub mod tests { use crate::tests::TestApi; use crate::finality_proof::tests::TestJustification; - pub struct NoJustificationsImport, RA>( + pub struct NoJustificationsImport( pub GrandpaLightBlockImport ); - impl, RA> Clone + impl Clone for NoJustificationsImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, { @@ -565,19 +592,24 @@ pub mod tests { } } - impl, RA> BlockImport + impl BlockImport for NoJustificationsImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, + for<'a> &'a Client: + BlockImport> + + Finalizer + + AuxStore, { type Error = ConsensusError; + type Transaction = TransactionFor; fn import_block( &mut self, - mut block: BlockImportParams, + mut block: BlockImportParams, new_cache: HashMap>, ) -> Result { block.justification.take(); @@ -592,13 +624,17 @@ pub mod tests { } } - impl, RA> FinalityProofImport + impl FinalityProofImport for NoJustificationsImport where NumberFor: finality_grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, RA: Send + Sync, + for<'a> &'a Client: + BlockImport> + + Finalizer + + AuxStore, { type Error = ConsensusError; @@ -618,16 +654,19 @@ pub mod tests { } /// Creates light block import that ignores justifications that came outside of finality proofs. - pub fn light_block_import_without_justifications, RA>( + pub fn light_block_import_without_justifications( client: Arc>, backend: Arc, genesis_authorities_provider: &dyn GenesisAuthoritySetProvider, authority_set_provider: Arc>, ) -> Result, ClientError> where - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, RA: Send + Sync, + Client: BlockImport + + Finalizer + + AuxStore, { light_block_import(client, backend, genesis_authorities_provider, authority_set_provider) .map(NoJustificationsImport) @@ -655,6 +694,7 @@ pub mod tests { justification, post_digests: Vec::new(), body: None, + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index 07bf468eae..3dbb2aff6a 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -25,10 +25,9 @@ use finality_grandpa::{ use log::{debug, info, warn}; use sp_consensus::SelectChain; -use sc_client_api::{CallExecutor, backend::Backend}; +use sc_client_api::{CallExecutor, backend::{Backend, AuxStore}}; use sc_client::Client; use sp_runtime::traits::{NumberFor, Block as BlockT}; -use sp_core::{H256, Blake2Hasher}; use crate::{ global_communication, CommandOrError, CommunicationIn, Config, environment, @@ -41,10 +40,10 @@ use sp_finality_grandpa::AuthorityId; struct ObserverChain<'a, Block: BlockT, B, E, RA>(&'a Client); -impl<'a, Block: BlockT, B, E, RA> finality_grandpa::Chain> +impl<'a, Block: BlockT, B, E, RA> finality_grandpa::Chain> for ObserverChain<'a, Block, B, E, RA> where - B: Backend, - E: CallExecutor, + B: Backend, + E: CallExecutor, NumberFor: BlockNumberOps, { fn ancestry(&self, base: Block::Hash, block: Block::Hash) -> Result, GrandpaError> { @@ -57,7 +56,7 @@ impl<'a, Block: BlockT, B, E, RA> finality_grandpa::Chain, RA, S, F>( +fn grandpa_observer( client: &Arc>, authority_set: &SharedAuthoritySet>, consensus_changes: &SharedConsensusChanges>, @@ -65,10 +64,10 @@ fn grandpa_observer, RA, S, F>( last_finalized_number: NumberFor, commits: S, note_round: F, -) -> impl Future>> where +) -> impl Future>> where NumberFor: BlockNumberOps, - B: Backend, - E: CallExecutor + Send + Sync, + B: Backend, + E: CallExecutor + Send + Sync, RA: Send + Sync, S: Stream< Item = CommunicationIn, @@ -151,20 +150,21 @@ fn grandpa_observer, RA, S, F>( /// listening for and validating GRANDPA commits instead of following the full /// protocol. Provide configuration and a link to a block import worker that has /// already been instantiated with `block_import`. -pub fn run_grandpa_observer, N, RA, SC, Sp>( +pub fn run_grandpa_observer( config: Config, link: LinkHalf, network: N, on_exit: impl futures03::Future + Clone + Send + Unpin + 'static, executor: Sp, -) -> ::sp_blockchain::Result + Send + 'static> where - B: Backend + 'static, - E: CallExecutor + Send + Sync + 'static, +) -> sp_blockchain::Result + Send + 'static> where + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, N: NetworkT + Send + Clone + 'static, SC: SelectChain + 'static, NumberFor: BlockNumberOps, RA: Send + Sync + 'static, Sp: futures03::task::Spawn + 'static, + Client: AuxStore, { let LinkHalf { client, @@ -202,7 +202,7 @@ pub fn run_grandpa_observer, N, RA, SC, Sp>( /// Future that powers the observer. #[must_use] -struct ObserverWork, N: NetworkT, E, Backend, RA> { +struct ObserverWork, E, Backend, RA> { observer: Box>> + Send>, client: Arc>, network: NetworkBridge, @@ -213,12 +213,13 @@ struct ObserverWork, N: NetworkT, E, Backend, RA> { impl ObserverWork where - B: BlockT, + B: BlockT, N: NetworkT, NumberFor: BlockNumberOps, RA: 'static + Send + Sync, - E: CallExecutor + Send + Sync + 'static, - Bk: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + Bk: Backend + 'static, + Client: AuxStore, { fn new( client: Arc>, @@ -328,12 +329,13 @@ where impl Future for ObserverWork where - B: BlockT, + B: BlockT, N: NetworkT, NumberFor: BlockNumberOps, RA: 'static + Send + Sync, - E: CallExecutor + Send + Sync + 'static, - Bk: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + Bk: Backend + 'static, + Client: AuxStore, { type Item = (); type Error = Error; diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 6bf908b0d9..4ad08c8868 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -18,8 +18,10 @@ use super::*; use environment::HasVoted; -use sc_network_test::{Block, DummySpecialization, Hash, TestNetFactory, Peer, PeersClient}; -use sc_network_test::{PassThroughVerifier}; +use sc_network_test::{ + Block, DummySpecialization, Hash, TestNetFactory, BlockImportAdapter, Peer, + PeersClient, PassThroughVerifier, +}; use sc_network::config::{ProtocolConfig, Roles, BoxFinalityProofRequestBuilder}; use parking_lot::Mutex; use futures_timer::Delay; @@ -27,23 +29,28 @@ use futures03::{StreamExt as _, TryStreamExt as _}; use tokio::runtime::current_thread; use sp_keyring::Ed25519Keyring; use sc_client::LongestChain; +use sc_client_api::backend::TransactionFor; use sp_blockchain::Result; -use sp_api::{Core, RuntimeVersion, ApiExt, StorageProof}; -use substrate_test_runtime_client::{self, runtime::BlockNumber}; -use sp_consensus::{BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, ImportResult}; -use sp_consensus::import_queue::{BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport}; +use sp_api::{ApiRef, ApiErrorExt, Core, RuntimeVersion, ApiExt, StorageProof, ProvideRuntimeApi}; +use substrate_test_runtime_client::runtime::BlockNumber; +use sp_consensus::{ + BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, ImportResult, BlockImport, + import_queue::{BoxJustificationImport, BoxFinalityProofImport}, +}; use std::collections::{HashMap, HashSet}; use std::result; use parity_scale_codec::Decode; -use sp_runtime::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; +use sp_runtime::traits::{Header as HeaderT, HasherFor}; use sp_runtime::generic::{BlockId, DigestItem}; -use sp_core::{NativeOrEncoded, ExecutionContext, crypto::Public}; +use sp_core::{H256, NativeOrEncoded, ExecutionContext, crypto::Public}; use sp_finality_grandpa::{GRANDPA_ENGINE_ID, AuthorityList, GrandpaApi}; -use sp_state_machine::{backend::InMemory, prove_read, read_proof_check}; +use sp_state_machine::{InMemoryBackend, prove_read, read_proof_check}; use std::{pin::Pin, task}; use authorities::AuthoritySet; -use finality_proof::{FinalityProofProvider, AuthoritySetForFinalityProver, AuthoritySetForFinalityChecker}; +use finality_proof::{ + FinalityProofProvider, AuthoritySetForFinalityProver, AuthoritySetForFinalityChecker, +}; use consensus_changes::ConsensusChanges; type PeerData = @@ -108,9 +115,9 @@ impl TestNetFactory for GrandpaTestNet { PassThroughVerifier(false) // use non-instant finality. } - fn make_block_import(&self, client: PeersClient) + fn make_block_import(&self, client: PeersClient) -> ( - BoxBlockImport, + BlockImportAdapter, Option>, Option>, Option>, @@ -125,8 +132,13 @@ impl TestNetFactory for GrandpaTestNet { LongestChain::new(backend.clone()), ).expect("Could not create block import for fresh peer."); let justification_import = Box::new(import.clone()); - let block_import = Box::new(import); - (block_import, Some(justification_import), None, None, Mutex::new(Some(link))) + ( + BlockImportAdapter::new_full(import), + Some(justification_import), + None, + None, + Mutex::new(Some(link)), + ) }, PeersClient::Light(ref client, ref backend) => { use crate::light_import::tests::light_block_import_without_justifications; @@ -142,8 +154,13 @@ impl TestNetFactory for GrandpaTestNet { ).expect("Could not create block import for fresh peer."); let finality_proof_req_builder = import.0.create_finality_proof_request_builder(); let proof_import = Box::new(import.clone()); - let block_import = Box::new(import); - (block_import, None, Some(proof_import), Some(finality_proof_req_builder), Mutex::new(None)) + ( + BlockImportAdapter::new_light(import), + None, + Some(proof_import), + Some(finality_proof_req_builder), + Mutex::new(None), + ) }, } } @@ -202,7 +219,7 @@ pub(crate) struct RuntimeApi { inner: TestApi, } -impl ProvideRuntimeApi for TestApi { +impl ProvideRuntimeApi for TestApi { type Api = RuntimeApi; fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api> { @@ -242,8 +259,14 @@ impl Core for RuntimeApi { } } -impl ApiExt for RuntimeApi { +impl ApiErrorExt for RuntimeApi { type Error = sp_blockchain::Error; +} + +impl ApiExt for RuntimeApi { + type StateBackend = < + substrate_test_runtime_client::Backend as sc_client_api::backend::Backend + >::State; fn map_api_result result::Result, R, E>( &self, @@ -263,6 +286,19 @@ impl ApiExt for RuntimeApi { fn extract_proof(&mut self) -> Option { unimplemented!("Not required for testing!") } + + fn into_storage_changes< + T: sp_api::ChangesTrieStorage, sp_api::NumberFor> + >( + &self, + _: &Self::StateBackend, + _: Option<&T>, + _: ::Hash, + ) -> std::result::Result, String> + where Self: Sized + { + unimplemented!("Not required for testing!") + } } impl GrandpaApi for RuntimeApi { @@ -290,7 +326,7 @@ impl AuthoritySetForFinalityProver for TestApi { fn prove_authorities(&self, block: &BlockId) -> Result { let authorities = self.authorities(block)?; - let backend = >::from(vec![ + let backend = >>::from(vec![ (None, vec![(b"authorities".to_vec(), Some(authorities.encode()))]) ]); let proof = prove_read(backend, vec![b"authorities"]) @@ -306,7 +342,7 @@ impl AuthoritySetForFinalityChecker for TestApi { header: ::Header, proof: StorageProof, ) -> Result { - let results = read_proof_check::( + let results = read_proof_check::, _>( *header.state_root(), proof, vec![b"authorities"] ) .expect("failure checking read proof for authorities"); @@ -629,7 +665,7 @@ fn transition_3_voters_twice_1_full_observer() { 14 => { // generate transition at block 15, applied at 20. net.lock().peer(0).generate_blocks(1, BlockOrigin::File, |builder| { - let mut block = builder.bake().unwrap(); + let mut block = builder.build().unwrap().block; add_scheduled_change(&mut block, ScheduledChange { next_authorities: make_ids(peers_b), delay: 4, @@ -643,7 +679,7 @@ fn transition_3_voters_twice_1_full_observer() { // at block 21 we do another transition, but this time instant. // add more until we have 30. net.lock().peer(0).generate_blocks(1, BlockOrigin::File, |builder| { - let mut block = builder.bake().unwrap(); + let mut block = builder.build().unwrap().block; add_scheduled_change(&mut block, ScheduledChange { next_authorities: make_ids(&peers_c), delay: 0, @@ -808,7 +844,7 @@ fn sync_justifications_on_change_blocks() { // at block 21 we do add a transition which is instant net.peer(0).generate_blocks(1, BlockOrigin::File, |builder| { - let mut block = builder.bake().unwrap(); + let mut block = builder.build().unwrap().block; add_scheduled_change(&mut block, ScheduledChange { next_authorities: make_ids(peers_b), delay: 0, @@ -870,7 +906,7 @@ fn finalizes_multiple_pending_changes_in_order() { // at block 21 we do add a transition which is instant net.peer(0).generate_blocks(1, BlockOrigin::File, |builder| { - let mut block = builder.bake().unwrap(); + let mut block = builder.build().unwrap().block; add_scheduled_change(&mut block, ScheduledChange { next_authorities: make_ids(peers_b), delay: 0, @@ -883,7 +919,7 @@ fn finalizes_multiple_pending_changes_in_order() { // at block 26 we add another which is enacted at block 30 net.peer(0).generate_blocks(1, BlockOrigin::File, |builder| { - let mut block = builder.bake().unwrap(); + let mut block = builder.build().unwrap().block; add_scheduled_change(&mut block, ScheduledChange { next_authorities: make_ids(peers_c), delay: 4, @@ -927,7 +963,7 @@ fn force_change_to_new_set() { let net = Arc::new(Mutex::new(net)); net.lock().peer(0).generate_blocks(1, BlockOrigin::File, |builder| { - let mut block = builder.bake().unwrap(); + let mut block = builder.build().unwrap().block; // add a forced transition at block 12. add_forced_change(&mut block, 0, ScheduledChange { @@ -973,11 +1009,15 @@ fn allows_reimporting_change_blocks() { let mut net = GrandpaTestNet::new(api.clone(), 3); let client = net.peer(0).client().clone(); - let (mut block_import, ..) = net.make_block_import(client.clone()); + let (mut block_import, ..) = net.make_block_import::< + TransactionFor + >( + client.clone(), + ); let full_client = client.as_full().unwrap(); - let builder = full_client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); - let mut block = builder.bake().unwrap(); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default(), false).unwrap(); + let mut block = builder.build().unwrap().block; add_scheduled_change(&mut block, ScheduledChange { next_authorities: make_ids(peers_b), delay: 0, @@ -991,6 +1031,7 @@ fn allows_reimporting_change_blocks() { justification: None, post_digests: Vec::new(), body: Some(block.extrinsics), + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -1026,11 +1067,15 @@ fn test_bad_justification() { let mut net = GrandpaTestNet::new(api.clone(), 3); let client = net.peer(0).client().clone(); - let (mut block_import, ..) = net.make_block_import(client.clone()); + let (mut block_import, ..) = net.make_block_import::< + TransactionFor + >( + 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), Default::default()).unwrap(); - let mut block = builder.bake().unwrap(); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default(), false).unwrap(); + let mut block = builder.build().unwrap().block; add_scheduled_change(&mut block, ScheduledChange { next_authorities: make_ids(peers_b), @@ -1045,6 +1090,7 @@ fn test_bad_justification() { justification: Some(Vec::new()), post_digests: Vec::new(), body: Some(block.extrinsics), + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -1136,7 +1182,10 @@ fn voter_persists_its_votes() { Ok(Async::NotReady) => {} Ok(Async::Ready(Some(()))) => { let (_block_import, _, _, _, link) = - self.net.lock().make_block_import(self.client.clone()); + self.net.lock() + .make_block_import::< + TransactionFor + >(self.client.clone()); let link = link.lock().take().unwrap(); let grandpa_params = GrandpaParams { @@ -1209,7 +1258,10 @@ fn voter_persists_its_votes() { }; let set_state = { - let (_, _, _, _, link) = net.lock().make_block_import(client); + let (_, _, _, _, link) = net.lock() + .make_block_import::< + TransactionFor + >(client); let LinkHalf { persistent_data, .. } = link.lock().take().unwrap(); let PersistentData { set_state, .. } = persistent_data; set_state @@ -1439,7 +1491,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // best is #1 net.lock().peer(0).generate_blocks(1, BlockOrigin::File, |builder| { // add a forced transition at block 5. - let mut block = builder.bake().unwrap(); + let mut block = builder.build().unwrap().block; if FORCE_CHANGE { add_forced_change(&mut block, 0, ScheduledChange { next_authorities: voters.clone(), @@ -1728,11 +1780,13 @@ fn imports_justification_for_regular_blocks_on_import() { let mut net = GrandpaTestNet::new(api.clone(), 1); let client = net.peer(0).client().clone(); - let (mut block_import, ..) = net.make_block_import(client.clone()); + let (mut block_import, ..) = net.make_block_import::< + TransactionFor + >(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), Default::default()).unwrap(); - let block = builder.bake().unwrap(); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default(), false).unwrap(); + let block = builder.build().unwrap().block; let block_hash = block.hash(); @@ -1776,6 +1830,7 @@ fn imports_justification_for_regular_blocks_on_import() { justification: Some(justification.encode()), post_digests: Vec::new(), body: Some(block.extrinsics), + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, diff --git a/client/network/src/chain.rs b/client/network/src/chain.rs index 9a094ad7be..b991a0e652 100644 --- a/client/network/src/chain.rs +++ b/client/network/src/chain.rs @@ -20,10 +20,9 @@ use sc_client::Client as SubstrateClient; use sp_blockchain::{Error, Info as BlockchainInfo}; use sc_client_api::{ChangesProof, StorageProof, CallExecutor}; use sp_consensus::{BlockImport, BlockStatus, Error as ConsensusError}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use sp_runtime::generic::{BlockId}; use sp_runtime::Justification; -use sp_core::{H256, Blake2Hasher}; use sp_core::storage::{StorageKey, ChildInfo}; /// Local client abstraction for the network. @@ -35,7 +34,7 @@ pub trait Client: Send + Sync { fn block_status(&self, id: &BlockId) -> Result; /// Get block hash by number. - fn block_hash(&self, block_number: ::Number) -> Result, Error>; + fn block_hash(&self, block_number: NumberFor) -> Result, Error>; /// Get block header. fn header(&self, id: &BlockId) -> Result, Error>; @@ -47,7 +46,7 @@ pub trait Client: Send + Sync { fn justification(&self, id: &BlockId) -> Result, Error>; /// Get block header proof. - fn header_proof(&self, block_number: ::Number) + fn header_proof(&self, block_number: NumberFor) -> Result<(Block::Header, StorageProof), Error>; /// Get storage read execution proof. @@ -93,10 +92,10 @@ impl FinalityProofProvider for () { } impl Client for SubstrateClient where - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, Self: BlockImport, - Block: BlockT, + Block: BlockT, RA: Send + Sync { fn info(&self) -> BlockchainInfo { @@ -107,7 +106,10 @@ impl Client for SubstrateClient where (self as &SubstrateClient).block_status(id) } - fn block_hash(&self, block_number: ::Number) -> Result, Error> { + fn block_hash( + &self, + block_number: ::Number, + ) -> Result, Error> { (self as &SubstrateClient).block_hash(block_number) } @@ -144,8 +146,17 @@ impl Client for SubstrateClient where .read_child_proof(&BlockId::Hash(block.clone()), storage_key, child_info, keys) } - fn execution_proof(&self, block: &Block::Hash, method: &str, data: &[u8]) -> Result<(Vec, StorageProof), Error> { - (self as &SubstrateClient).execution_proof(&BlockId::Hash(block.clone()), method, data) + fn execution_proof( + &self, + block: &Block::Hash, + method: &str, + data: &[u8], + ) -> Result<(Vec, StorageProof), Error> { + (self as &SubstrateClient).execution_proof( + &BlockId::Hash(block.clone()), + method, + data, + ) } fn key_changes_proof( diff --git a/client/network/src/on_demand_layer.rs b/client/network/src/on_demand_layer.rs index 87f48ded67..d672ed0b7f 100644 --- a/client/network/src/on_demand_layer.rs +++ b/client/network/src/on_demand_layer.rs @@ -21,9 +21,10 @@ use std::{collections::HashMap, pin::Pin, sync::Arc, task::Context, task::Poll}; use futures::{prelude::*, channel::mpsc, channel::oneshot}; use parking_lot::Mutex; use sp_blockchain::Error as ClientError; -use sc_client_api::{Fetcher, FetchChecker, RemoteHeaderRequest, - RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, - RemoteReadChildRequest, RemoteBodyRequest}; +use sc_client_api::{ + Fetcher, FetchChecker, RemoteHeaderRequest, RemoteCallRequest, RemoteReadRequest, + RemoteChangesRequest, RemoteReadChildRequest, RemoteBodyRequest, +}; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; /// Implements the `Fetcher` trait of the client. Makes it possible for the light client to perform diff --git a/client/network/test/src/block_import.rs b/client/network/test/src/block_import.rs index 9048445387..5b2a1266c6 100644 --- a/client/network/test/src/block_import.rs +++ b/client/network/test/src/block_import.rs @@ -26,8 +26,8 @@ use sp_runtime::generic::BlockId; use super::*; fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) { - let client = substrate_test_runtime_client::new(); - let block = client.new_block(Default::default()).unwrap().bake().unwrap(); + let mut client = substrate_test_runtime_client::new(); + let block = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::File, block).unwrap(); let (hash, number) = (client.block_hash(1).unwrap().unwrap(), 1); diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 8116fd7c94..f1b7fa478c 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -21,9 +21,7 @@ mod block_import; #[cfg(test)] mod sync; -use std::collections::HashMap; -use std::pin::Pin; -use std::sync::Arc; +use std::{collections::HashMap, pin::Pin, sync::Arc, marker::PhantomData}; use libp2p::build_multiaddr; use log::trace; @@ -35,15 +33,14 @@ use sc_client_api::{ BlockchainEvents, BlockImportNotification, FinalityNotifications, ImportNotifications, FinalityNotification, - backend::{AuxStore, Backend, Finalizer} + backend::{TransactionFor, AuxStore, Backend, Finalizer}, }; use sc_block_builder::BlockBuilder; use sc_client::LongestChain; use sc_network::config::Roles; use sp_consensus::block_validation::DefaultBlockAnnounceValidator; -use sp_consensus::import_queue::BasicQueue; use sp_consensus::import_queue::{ - BoxBlockImport, BoxJustificationImport, Verifier, BoxFinalityProofImport, + BasicQueue, BoxJustificationImport, Verifier, BoxFinalityProofImport, }; use sp_consensus::block_import::{BlockImport, ImportResult}; use sp_consensus::Error as ConsensusError; @@ -57,7 +54,7 @@ use parking_lot::Mutex; use sp_core::H256; use sc_network::{Context, ProtocolConfig}; use sp_runtime::generic::{BlockId, OpaqueDigestItemId}; -use sp_runtime::traits::{Block as BlockT, Header, NumberFor}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use sp_runtime::Justification; use sc_network::TransactionPool; use sc_network::specialization::NetworkSpecialization; @@ -81,7 +78,7 @@ impl Verifier for PassThroughVerifier { header: B::Header, justification: Option, body: Option> - ) -> Result<(BlockImportParams, Option)>>), String> { + ) -> Result<(BlockImportParams, 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"))) @@ -92,6 +89,7 @@ impl Verifier for PassThroughVerifier { origin, header, body, + storage_changes: None, finalized: self.0, justification, post_digests: vec![], @@ -148,10 +146,12 @@ impl PeersClient { } } - pub fn as_block_import(&self) -> BoxBlockImport { + pub fn as_block_import(&self) -> BlockImportAdapter { match *self { - PeersClient::Full(ref client, ref _backend) => Box::new(client.clone()) as _, - PeersClient::Light(ref client, ref _backend) => Box::new(client.clone()) as _, + PeersClient::Full(ref client, ref _backend) => + BlockImportAdapter::new_full(client.clone()), + PeersClient::Light(ref client, ref _backend) => + BlockImportAdapter::Light(Arc::new(Mutex::new(client.clone())), PhantomData), } } @@ -218,7 +218,7 @@ pub struct Peer> { verifier: VerifierAdapter>, /// We keep a copy of the block_import so that we can invoke it for locally-generated blocks, /// instead of going through the import queue. - block_import: Box>, + block_import: BlockImportAdapter<()>, select_chain: Option>, backend: Option>, network: NetworkWorker::Hash>, @@ -269,7 +269,7 @@ impl> Peer { /// Add blocks to the peer -- edit the block before adding pub fn generate_blocks(&mut self, count: usize, origin: BlockOrigin, edit_block: F) -> H256 - where F: FnMut(BlockBuilder) -> Block + where F: FnMut(BlockBuilder) -> Block { let best_hash = self.client.info().best_hash; self.generate_blocks_at(BlockId::Hash(best_hash), count, origin, edit_block) @@ -283,11 +283,15 @@ impl> Peer { count: usize, origin: BlockOrigin, mut edit_block: F - ) -> H256 where F: FnMut(BlockBuilder) -> Block { - let full_client = self.client.as_full().expect("blocks could only be generated by full clients"); + ) -> H256 where F: FnMut(BlockBuilder) -> Block { + let full_client = self.client.as_full() + .expect("blocks could only be generated by full clients"); let mut at = full_client.header(&at).unwrap().unwrap().hash(); for _ in 0..count { - let builder = full_client.new_block_at(&BlockId::Hash(at), Default::default() + let builder = full_client.new_block_at( + &BlockId::Hash(at), + Default::default(), + false, ).unwrap(); let block = edit_block(builder); let hash = block.header.hash(); @@ -296,7 +300,7 @@ impl> Peer { "Generating {}, (#{}, parent={})", hash, block.header.number, - block.header.parent_hash + block.header.parent_hash, ); let header = block.header.clone(); let (import_block, cache) = self.verifier.verify( @@ -339,17 +343,22 @@ impl> Peer { }; builder.push(transfer.into_signed_tx()).unwrap(); nonce = nonce + 1; - builder.bake().unwrap() + builder.build().unwrap().block }) } else { - self.generate_blocks_at(at, count, BlockOrigin::File, |builder| builder.bake().unwrap()) + self.generate_blocks_at( + at, + count, + BlockOrigin::File, + |builder| builder.build().unwrap().block, + ) } } pub fn push_authorities_change_block(&mut self, new_authorities: Vec) -> H256 { self.generate_blocks(1, BlockOrigin::File, |mut builder| { builder.push(Extrinsic::AuthoritiesChange(new_authorities.clone())).unwrap(); - builder.bake().unwrap() + builder.build().unwrap().block }) } @@ -418,33 +427,90 @@ impl SpecializationFactory for DummySpecialization { } } -/// Implements `BlockImport` on an `Arc>`. Used internally. Necessary to overcome the way the -/// `TestNet` trait is designed, more specifically `make_block_import` returning a `Box` makes it -/// impossible to clone the underlying object. -struct BlockImportAdapter(Arc>>); +/// Implements `BlockImport` for any `Transaction`. Internally the transaction is +/// "converted", aka the field is set to `None`. +/// +/// This is required as the `TestNetFactory` trait does not distinguish between +/// full and light nodes. +pub enum BlockImportAdapter { + Full( + Arc, + Error = ConsensusError + > + Send>>, + PhantomData, + ), + Light( + Arc, + Error = ConsensusError + > + Send>>, + PhantomData, + ), +} + +impl BlockImportAdapter { + /// Create a new instance of `Self::Full`. + pub fn new_full( + full: impl BlockImport< + Block, + Transaction = TransactionFor, + Error = ConsensusError + > + + 'static + + Send + ) -> Self { + Self::Full(Arc::new(Mutex::new(full)), PhantomData) + } + + /// Create a new instance of `Self::Light`. + pub fn new_light( + light: impl BlockImport< + Block, + Transaction = TransactionFor, + Error = ConsensusError + > + + 'static + + Send + ) -> Self { + Self::Light(Arc::new(Mutex::new(light)), PhantomData) + } +} -impl Clone for BlockImportAdapter { +impl Clone for BlockImportAdapter { fn clone(&self) -> Self { - BlockImportAdapter(self.0.clone()) + match self { + Self::Full(full, _) => Self::Full(full.clone(), PhantomData), + Self::Light(light, _) => Self::Light(light.clone(), PhantomData), + } } } -impl> BlockImport for BlockImportAdapter { - type Error = T::Error; +impl BlockImport for BlockImportAdapter { + type Error = ConsensusError; + type Transaction = Transaction; fn check_block( &mut self, block: BlockCheckParams, ) -> Result { - self.0.lock().check_block(block) + match self { + Self::Full(full, _) => full.lock().check_block(block), + Self::Light(light, _) => light.lock().check_block(block), + } } fn import_block( &mut self, - block: BlockImportParams, + block: BlockImportParams, cache: HashMap>, ) -> Result { - self.0.lock().import_block(block, cache) + match self { + Self::Full(full, _) => full.lock().import_block(block.convert_transaction(), cache), + Self::Light(light, _) => light.lock().import_block(block.convert_transaction(), cache), + } } } @@ -464,7 +530,7 @@ impl> Verifier for VerifierAdapter { header: B::Header, justification: Option, body: Option> - ) -> Result<(BlockImportParams, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { self.0.lock().verify(origin, header, justification, body) } } @@ -486,12 +552,15 @@ pub trait TestNetFactory: Sized { /// Get reference to peer. fn peer(&mut self, i: usize) -> &mut Peer; fn peers(&self) -> &Vec>; - fn mut_peers>)>(&mut self, closure: F); + fn mut_peers>)>( + &mut self, + closure: F, + ); /// Get custom block import handle for fresh client, along with peer data. - fn make_block_import(&self, client: PeersClient) + fn make_block_import(&self, client: PeersClient) -> ( - BoxBlockImport, + BlockImportAdapter, Option>, Option>, Option>, @@ -502,7 +571,10 @@ 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 } @@ -544,7 +616,6 @@ pub trait TestNetFactory: Sized { finality_proof_request_builder, data, ) = self.make_block_import(PeersClient::Full(client.clone(), backend.clone())); - let block_import = BlockImportAdapter(Arc::new(Mutex::new(block_import))); let verifier = self.make_verifier( PeersClient::Full(client.clone(), backend.clone()), @@ -570,7 +641,9 @@ pub trait TestNetFactory: Sized { ..NetworkConfiguration::default() }, chain: client.clone(), - finality_proof_provider: self.make_finality_proof_provider(PeersClient::Full(client.clone(), backend.clone())), + finality_proof_provider: self.make_finality_proof_provider( + PeersClient::Full(client.clone(), backend.clone()), + ), finality_proof_request_builder, on_demand: None, transaction_pool: Arc::new(EmptyTransactionPool), @@ -597,7 +670,7 @@ pub trait TestNetFactory: Sized { backend: Some(backend), imported_blocks_stream, finality_notification_stream, - block_import: Box::new(block_import), + block_import, verifier, network, }); @@ -618,7 +691,6 @@ pub trait TestNetFactory: Sized { finality_proof_request_builder, data, ) = self.make_block_import(PeersClient::Light(client.clone(), backend.clone())); - let block_import = BlockImportAdapter(Arc::new(Mutex::new(block_import))); let verifier = self.make_verifier( PeersClient::Light(client.clone(), backend.clone()), @@ -644,7 +716,9 @@ pub trait TestNetFactory: Sized { ..NetworkConfiguration::default() }, chain: client.clone(), - finality_proof_provider: self.make_finality_proof_provider(PeersClient::Light(client.clone(), backend.clone())), + finality_proof_provider: self.make_finality_proof_provider( + PeersClient::Light(client.clone(), backend.clone()) + ), finality_proof_request_builder, on_demand: None, transaction_pool: Arc::new(EmptyTransactionPool), @@ -669,7 +743,7 @@ pub trait TestNetFactory: Sized { verifier, select_chain: None, backend: None, - block_import: Box::new(block_import), + block_import, client: PeersClient::Light(client, backend), imported_blocks_stream, finality_notification_stream, @@ -721,7 +795,12 @@ pub trait TestNetFactory: Sized { // We poll `imported_blocks_stream`. while let Ok(Async::Ready(Some(notification))) = peer.imported_blocks_stream.poll() { - peer.network.on_block_imported(notification.hash, notification.header, Vec::new(), true); + peer.network.on_block_imported( + notification.hash, + notification.header, + Vec::new(), + true, + ); } // We poll `finality_notification_stream`, but we only take the last event. @@ -811,19 +890,28 @@ impl TestNetFactory for JustificationTestNet { self.0.peers() } - fn mut_peers>)>(&mut self, closure: F) { + fn mut_peers>, + )>(&mut self, closure: F) { self.0.mut_peers(closure) } - fn make_block_import(&self, client: PeersClient) + fn make_block_import(&self, client: PeersClient) -> ( - BoxBlockImport, + BlockImportAdapter, Option>, Option>, Option>, Self::PeerData, ) { - (client.as_block_import(), Some(Box::new(ForceFinalized(client))), None, None, Default::default()) + ( + client.as_block_import(), + Some(Box::new(ForceFinalized(client))), + None, + None, + Default::default(), + ) } } diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index 785fd7c8a6..d738eb3d6c 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -370,7 +370,7 @@ fn own_blocks_are_announced() { let mut runtime = current_thread::Runtime::new().unwrap(); let mut net = TestNet::new(3); net.block_until_sync(&mut runtime); // connect'em - net.peer(0).generate_blocks(1, BlockOrigin::Own, |builder| builder.bake().unwrap()); + net.peer(0).generate_blocks(1, BlockOrigin::Own, |builder| builder.build().unwrap().block); net.block_until_sync(&mut runtime); diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index e4bf1bb75c..e25072d42d 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -37,12 +37,12 @@ use std::{fmt, marker::PhantomData, sync::Arc}; use parking_lot::Mutex; use threadpool::ThreadPool; -use sp_api::ApiExt; +use sp_api::{ApiExt, ProvideRuntimeApi}; use futures::future::Future; use log::{debug, warn}; use sc_network::NetworkStateInfo; use sp_core::{offchain::{self, OffchainStorage}, ExecutionContext}; -use sp_runtime::{generic::BlockId, traits::{self, ProvideRuntimeApi, Header}}; +use sp_runtime::{generic::BlockId, traits::{self, Header}}; mod api; @@ -84,7 +84,7 @@ impl OffchainWorkers< Block, > where Block: traits::Block, - Client: ProvideRuntimeApi + Send + Sync + 'static, + Client: ProvideRuntimeApi + Send + Sync + 'static, Client::Api: OffchainWorkerApi, Storage: OffchainStorage + 'static, { diff --git a/client/rpc/src/author/mod.rs b/client/rpc/src/author/mod.rs index 20a74c622a..9891abc47d 100644 --- a/client/rpc/src/author/mod.rs +++ b/client/rpc/src/author/mod.rs @@ -34,9 +34,9 @@ use futures::future::{ready, FutureExt, TryFutureExt}; use sc_rpc_api::Subscriptions; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; use codec::{Encode, Decode}; -use sp_core::{Bytes, Blake2Hasher, H256, traits::BareCryptoStorePtr}; -use sp_api::ConstructRuntimeApi; -use sp_runtime::{generic, traits::{self, ProvideRuntimeApi}}; +use sp_core::{Bytes, traits::BareCryptoStorePtr}; +use sp_api::ProvideRuntimeApi; +use sp_runtime::{generic, traits}; use sp_transaction_pool::{ TransactionPool, InPoolTransaction, TransactionStatus, BlockHash, TxHash, TransactionFor, error::IntoPoolError, @@ -76,15 +76,18 @@ impl Author { } } -impl AuthorApi for Author where - Block: traits::Block, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client_api::CallExecutor + Clone + Send + Sync + 'static, - P: TransactionPool + Sync + Send + 'static, - RA: ConstructRuntimeApi> + Send + Sync + 'static, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - SessionKeys, +impl AuthorApi, BlockHash

> + for Author::Block, RA> +where + B: sc_client_api::backend::Backend<

::Block> + Send + Sync + 'static, + E: sc_client::CallExecutor<

::Block> + Send + Sync + 'static, + P: TransactionPool + Sync + Send + 'static, + P::Block: traits::Block, + P::Error: 'static, + RA: Send + Sync + 'static, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + SessionKeys, { type Metadata = crate::metadata::Metadata; diff --git a/client/rpc/src/chain/chain_full.rs b/client/rpc/src/chain/chain_full.rs index 1ebce983fe..ff732368fe 100644 --- a/client/rpc/src/chain/chain_full.rs +++ b/client/rpc/src/chain/chain_full.rs @@ -22,11 +22,7 @@ use rpc::futures::future::result; use sc_rpc_api::Subscriptions; use sc_client_api::{CallExecutor, backend::Backend}; use sc_client::Client; -use sp_core::{H256, Blake2Hasher}; -use sp_runtime::{ - generic::{BlockId, SignedBlock}, - traits::{Block as BlockT}, -}; +use sp_runtime::{generic::{BlockId, SignedBlock}, traits::{Block as BlockT}}; use super::{ChainBackend, client_err, error::FutureResult}; @@ -49,9 +45,9 @@ impl FullChain { } impl ChainBackend for FullChain where - Block: BlockT + 'static, - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, + Block: BlockT + 'static, + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, RA: Send + Sync + 'static, { fn client(&self) -> &Arc> { diff --git a/client/rpc/src/chain/chain_light.rs b/client/rpc/src/chain/chain_light.rs index 950b5d4cdf..3e26bd24bb 100644 --- a/client/rpc/src/chain/chain_light.rs +++ b/client/rpc/src/chain/chain_light.rs @@ -22,13 +22,8 @@ use rpc::futures::future::{result, Future, Either}; use sc_rpc_api::Subscriptions; use sc_client::{ - self, Client, - light::{ - fetcher::{Fetcher, RemoteBodyRequest}, - blockchain::RemoteBlockchain, - }, + Client, light::{fetcher::{Fetcher, RemoteBodyRequest}, blockchain::RemoteBlockchain}, }; -use sp_core::{H256, Blake2Hasher}; use sp_runtime::{ generic::{BlockId, SignedBlock}, traits::{Block as BlockT}, @@ -67,9 +62,9 @@ impl> LightChain } impl ChainBackend for LightChain where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client::CallExecutor + Send + Sync + 'static, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: sc_client::CallExecutor + Send + Sync + 'static, RA: Send + Sync + 'static, F: Fetcher + Send + Sync + 'static, { diff --git a/client/rpc/src/chain/mod.rs b/client/rpc/src/chain/mod.rs index 0774393110..a2971983c7 100644 --- a/client/rpc/src/chain/mod.rs +++ b/client/rpc/src/chain/mod.rs @@ -36,7 +36,6 @@ use sc_client::{ light::{fetcher::Fetcher, blockchain::RemoteBlockchain}, }; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use sp_core::{H256, Blake2Hasher}; use sp_rpc::{number::NumberOrHex, list::ListOrValue}; use sp_runtime::{ generic::{BlockId, SignedBlock}, @@ -50,9 +49,9 @@ pub use sc_rpc_api::chain::*; /// Blockchain backend API trait ChainBackend: Send + Sync + 'static where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client::CallExecutor + Send + Sync + 'static, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: sc_client::CallExecutor + Send + Sync + 'static, { /// Get client reference. fn client(&self) -> &Arc>; @@ -155,9 +154,9 @@ pub fn new_full( subscriptions: Subscriptions, ) -> Chain where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client::CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: sc_client::CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, { Chain { @@ -173,9 +172,9 @@ pub fn new_light>( fetcher: Arc, ) -> Chain where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client::CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: sc_client::CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, F: Send + Sync + 'static, { @@ -195,9 +194,9 @@ pub struct Chain { } impl ChainApi, Block::Hash, Block::Header, SignedBlock> for Chain where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client::CallExecutor + Send + Sync + 'static, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: sc_client::CallExecutor + Send + Sync + 'static, RA: Send + Sync + 'static { type Metadata = crate::metadata::Metadata; @@ -255,9 +254,9 @@ fn subscribe_headers( best_block_hash: G, stream: F, ) where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client::CallExecutor + Send + Sync + 'static, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: sc_client::CallExecutor + Send + Sync + 'static, F: FnOnce() -> S, G: FnOnce() -> Block::Hash, ERR: ::std::fmt::Debug, diff --git a/client/rpc/src/chain/tests.rs b/client/rpc/src/chain/tests.rs index f7e97120df..eb05639018 100644 --- a/client/rpc/src/chain/tests.rs +++ b/client/rpc/src/chain/tests.rs @@ -25,7 +25,7 @@ use sp_rpc::list::ListOrValue; #[test] fn should_return_header() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); let client = Arc::new(substrate_test_runtime_client::new()); @@ -37,7 +37,8 @@ fn should_return_header() { parent_hash: H256::from_low_u64_be(0), number: 0, state_root: x.state_root.clone(), - extrinsics_root: "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), + extrinsics_root: + "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), digest: Default::default(), } ); @@ -48,26 +49,24 @@ fn should_return_header() { parent_hash: H256::from_low_u64_be(0), number: 0, state_root: x.state_root.clone(), - extrinsics_root: "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), + extrinsics_root: + "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), digest: Default::default(), } ); - assert_matches!( - api.header(Some(H256::from_low_u64_be(5)).into()).wait(), - Ok(None) - ); + assert_matches!(api.header(Some(H256::from_low_u64_be(5)).into()).wait(), Ok(None)); } #[test] fn should_return_a_block() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); - let client = Arc::new(substrate_test_runtime_client::new()); + let mut client = Arc::new(substrate_test_runtime_client::new()); let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); - let block = client.new_block(Default::default()).unwrap().bake().unwrap(); + let block = client.new_block(Default::default()).unwrap().build().unwrap().block; let block_hash = block.hash(); client.import(BlockOrigin::Own, block).unwrap(); @@ -84,7 +83,8 @@ fn should_return_a_block() { parent_hash: client.genesis_hash(), number: 1, state_root: x.block.header.state_root.clone(), - extrinsics_root: "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), + extrinsics_root: + "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), digest: Default::default(), }, extrinsics: vec![], @@ -98,7 +98,8 @@ fn should_return_a_block() { parent_hash: client.genesis_hash(), number: 1, state_root: x.block.header.state_root.clone(), - extrinsics_root: "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), + extrinsics_root: + "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314".parse().unwrap(), digest: Default::default(), }, extrinsics: vec![], @@ -116,7 +117,7 @@ fn should_return_block_hash() { let core = ::tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); - let client = Arc::new(substrate_test_runtime_client::new()); + let mut client = Arc::new(substrate_test_runtime_client::new()); let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); assert_matches!( @@ -135,7 +136,7 @@ fn should_return_block_hash() { Ok(ListOrValue::Value(None)) ); - let block = client.new_block(Default::default()).unwrap().bake().unwrap(); + let block = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, block.clone()).unwrap(); assert_matches!( @@ -163,7 +164,7 @@ fn should_return_finalized_hash() { let core = ::tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); - let client = Arc::new(substrate_test_runtime_client::new()); + let mut client = Arc::new(substrate_test_runtime_client::new()); let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); assert_matches!( @@ -172,8 +173,8 @@ fn should_return_finalized_hash() { ); // import new block - let builder = client.new_block(Default::default()).unwrap(); - client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); + let block = client.new_block(Default::default()).unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); // no finalization yet assert_matches!( api.finalized_head(), @@ -195,7 +196,7 @@ fn should_notify_about_latest_block() { let (subscriber, id, transport) = Subscriber::new_test("test"); { - let client = Arc::new(substrate_test_runtime_client::new()); + let mut client = Arc::new(substrate_test_runtime_client::new()); let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); api.subscribe_new_heads(Default::default(), subscriber); @@ -203,8 +204,8 @@ fn should_notify_about_latest_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = client.new_block(Default::default()).unwrap(); - client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); + let block = client.new_block(Default::default()).unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); } // assert initial head sent. @@ -224,7 +225,7 @@ fn should_notify_about_finalized_block() { let (subscriber, id, transport) = Subscriber::new_test("test"); { - let client = Arc::new(substrate_test_runtime_client::new()); + let mut client = Arc::new(substrate_test_runtime_client::new()); let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); api.subscribe_finalized_heads(Default::default(), subscriber); @@ -232,8 +233,8 @@ fn should_notify_about_finalized_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = client.new_block(Default::default()).unwrap(); - client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); + let block = client.new_block(Default::default()).unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); client.finalize_block(BlockId::number(1), None).unwrap(); } diff --git a/client/rpc/src/state/mod.rs b/client/rpc/src/state/mod.rs index cc1ed5f993..f8f8fe4223 100644 --- a/client/rpc/src/state/mod.rs +++ b/client/rpc/src/state/mod.rs @@ -28,16 +28,11 @@ use rpc::{Result as RpcResult, futures::Future}; use sc_rpc_api::Subscriptions; use sc_client::{Client, CallExecutor, light::{blockchain::RemoteBlockchain, fetcher::Fetcher}}; -use sp_core::{ - Blake2Hasher, Bytes, H256, - storage::{StorageKey, StorageData, StorageChangeSet}, -}; +use sp_core::{Bytes, storage::{StorageKey, StorageData, StorageChangeSet}}; use sp_version::RuntimeVersion; -use sp_runtime::{ - traits::{Block as BlockT, ProvideRuntimeApi}, -}; +use sp_runtime::traits::Block as BlockT; -use sp_api::Metadata; +use sp_api::{Metadata, ProvideRuntimeApi}; use self::error::{Error, FutureResult}; @@ -46,9 +41,9 @@ pub use sc_rpc_api::state::*; /// State backend API. pub trait StateBackend: Send + Sync + 'static where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: sc_client::CallExecutor + Send + Sync + 'static, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: sc_client::CallExecutor + Send + Sync + 'static, RA: Send + Sync + 'static, { /// Call runtime method at given block. @@ -186,12 +181,12 @@ pub fn new_full( subscriptions: Subscriptions, ) -> State where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: Metadata, { State { @@ -207,9 +202,9 @@ pub fn new_light>( fetcher: Arc, ) -> State where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, F: Send + Sync + 'static, { @@ -230,9 +225,9 @@ pub struct State { impl StateApi for State where - Block: BlockT + 'static, - B: sc_client_api::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT + 'static, + B: sc_client_api::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, { type Metadata = crate::metadata::Metadata; diff --git a/client/rpc/src/state/state_full.rs b/client/rpc/src/state/state_full.rs index 3d13c020df..e42e6b722e 100644 --- a/client/rpc/src/state/state_full.rs +++ b/client/rpc/src/state/state_full.rs @@ -22,10 +22,7 @@ use std::ops::Range; use futures::{future, StreamExt as _, TryStreamExt as _}; use log::warn; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use rpc::{ - Result as RpcResult, - futures::{stream, Future, Sink, Stream, future::result}, -}; +use rpc::{Result as RpcResult, futures::{stream, Future, Sink, Stream, future::result}}; use sc_rpc_api::Subscriptions; use sc_client_api::backend::Backend; @@ -36,17 +33,15 @@ use sc_client::{ Client, CallExecutor, BlockchainEvents, }; use sp_core::{ - H256, Blake2Hasher, Bytes, - storage::{well_known_keys, StorageKey, StorageData, StorageChangeSet, ChildInfo}, + Bytes, storage::{well_known_keys, StorageKey, StorageData, StorageChangeSet, ChildInfo}, }; use sp_version::RuntimeVersion; use sp_state_machine::ExecutionStrategy; use sp_runtime::{ - generic::BlockId, - traits::{Block as BlockT, NumberFor, ProvideRuntimeApi, SaturatedConversion}, + generic::BlockId, traits::{Block as BlockT, NumberFor, SaturatedConversion}, }; -use sp_api::Metadata; +use sp_api::{Metadata, ProvideRuntimeApi}; use super::{StateBackend, error::{FutureResult, Error, Result}, client_err, child_resolution_error}; @@ -72,9 +67,9 @@ pub struct FullState { impl FullState where - Block: BlockT + 'static, - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT + 'static, + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, { /// Create new state API backend for full nodes. pub fn new(client: Arc>, subscriptions: Subscriptions) -> Self { @@ -220,12 +215,12 @@ impl FullState impl StateBackend for FullState where - Block: BlockT + 'static, - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT + 'static, + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: Metadata, { fn call( diff --git a/client/rpc/src/state/state_light.rs b/client/rpc/src/state/state_light.rs index 4821b083e9..abf4631bb8 100644 --- a/client/rpc/src/state/state_light.rs +++ b/client/rpc/src/state/state_light.rs @@ -49,14 +49,10 @@ use sc_client::{ }, }; use sp_core::{ - H256, Blake2Hasher, Bytes, OpaqueMetadata, - storage::{StorageKey, StorageData, StorageChangeSet}, + Bytes, OpaqueMetadata, storage::{StorageKey, StorageData, StorageChangeSet}, }; use sp_version::RuntimeVersion; -use sp_runtime::{ - generic::BlockId, - traits::Block as BlockT, -}; +use sp_runtime::{generic::BlockId, traits::{Block as BlockT, HasherFor}}; use super::{StateBackend, error::{FutureResult, Error}, client_err}; @@ -140,9 +136,9 @@ impl SharedRequests for SimpleSubscriptions where impl + 'static, B, E, RA> LightState where - Block: BlockT, - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT, + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, { /// Create new state API backend for light nodes. @@ -174,9 +170,9 @@ impl + 'static, B, E, RA> LightState StateBackend for LightState where - Block: BlockT, - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, + Block: BlockT, + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, RA: Send + Sync + 'static, F: Fetcher + 'static { @@ -227,7 +223,7 @@ impl StateBackend for LightState::hash(&storage.0)))) ) ) } @@ -288,7 +284,7 @@ impl StateBackend for LightState::hash(&storage.0)))) ) ) } @@ -602,7 +598,7 @@ fn subscription_stream< issue_request: IssueRequest, compare_values: CompareValues, ) -> impl Stream where - Block: BlockT, + Block: BlockT, Requests: 'static + SharedRequests, FutureBlocksStream: Stream, V: Send + 'static + Clone, @@ -712,6 +708,7 @@ fn ignore_error(future: F) -> impl std::future::Future) { + fn run_tests(mut client: Arc) { let core = tokio::runtime::Runtime::new().unwrap(); let api = new_full(client.clone(), Subscriptions::new(Arc::new(core.executor()))); - let add_block = |nonce| { + let mut add_block = |nonce| { let mut builder = client.new_block(Default::default()).unwrap(); // fake change: None -> None -> None builder.push_storage_change(vec![1], None).unwrap(); @@ -225,7 +227,7 @@ fn should_query_storage() { 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 block = builder.build().unwrap().block; let hash = block.header.hash(); client.import(BlockOrigin::Own, block).unwrap(); hash diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 1608a51feb..3a3702bc19 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -38,13 +38,11 @@ use log::{info, warn, error}; use sc_network::{FinalityProofProvider, OnDemand, NetworkService, NetworkStateInfo}; use sc_network::{config::BoxFinalityProofRequestBuilder, specialization::NetworkSpecialization}; use parking_lot::{Mutex, RwLock}; -use sp_core::{Blake2Hasher, H256, Hasher}; -use sc_rpc; -use sp_api::ConstructRuntimeApi; use sp_runtime::generic::BlockId; use sp_runtime::traits::{ - Block as BlockT, ProvideRuntimeApi, NumberFor, SaturatedConversion, + Block as BlockT, NumberFor, SaturatedConversion, HasherFor, }; +use sp_api::ProvideRuntimeApi; use sc_executor::{NativeExecutor, NativeExecutionDispatch}; use std::{ io::{Read, Write, Seek}, @@ -121,19 +119,19 @@ pub type TLightClient = Client< /// Light client backend type. pub type TLightBackend = sc_client::light::backend::Backend< sc_client_db::light::LightStorage, - Blake2Hasher, + HasherFor, >; /// Light call executor type. pub type TLightCallExecutor = sc_client::light::call_executor::GenesisCallExecutor< sc_client::light::backend::Backend< sc_client_db::light::LightStorage, - Blake2Hasher + HasherFor >, sc_client::LocalCallExecutor< sc_client::light::backend::Backend< sc_client_db::light::LightStorage, - Blake2Hasher + HasherFor >, NativeExecutor >, @@ -149,7 +147,7 @@ type TFullParts = ( pub fn new_full_client( config: &Configuration, ) -> Result, Error> where - TBl: BlockT, + TBl: BlockT, TExecDisp: NativeExecutionDispatch, TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, TCSExt: Extension, @@ -160,7 +158,7 @@ pub fn new_full_client( fn new_full_parts( config: &Configuration, ) -> Result, Error> where - TBl: BlockT, + TBl: BlockT, TExecDisp: NativeExecutionDispatch, TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, TCSExt: Extension, @@ -228,7 +226,7 @@ fn new_full_parts( impl ServiceBuilder<(), (), TCfg, TGen, TCSExt, (), (), (), (), (), (), (), (), (), ()> where TGen: RuntimeGenesis, TCSExt: Extension { /// Start the service builder with a configuration. - pub fn new_full, TRtApi, TExecDisp: NativeExecutionDispatch>( + pub fn new_full( config: Configuration ) -> Result, TRtApi, TExecDisp: NativeExecutionDispatch + 'static>( + pub fn new_light( config: Configuration ) -> Result( + light_blockchain.clone(), + executor.clone(), + ), + ); let fetcher = Arc::new(sc_network::OnDemand::new(fetch_checker)); let backend = sc_client::light::new_light_backend(light_blockchain); let remote_blockchain = backend.remote_blockchain(); @@ -718,20 +721,21 @@ ServiceBuilder< TRpc, TBackend, > where - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: sp_api::Metadata + sc_offchain::OffchainWorkerApi + sp_transaction_pool::runtime_api::TaggedTransactionQueue + sp_session::SessionKeys + - sp_api::ApiExt, - TBl: BlockT::Out>, - TRtApi: ConstructRuntimeApi> + 'static + Send + Sync, + sp_api::ApiErrorExt + + sp_api::ApiExt, + TBl: BlockT, + TRtApi: 'static + Send + Sync, TCfg: Default, TGen: RuntimeGenesis, TCSExt: Extension, - TBackend: 'static + sc_client_api::backend::Backend + Send, - TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, + TBackend: 'static + sc_client_api::backend::Backend + Send, + TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, TSc: Clone, TImpQu: 'static + ImportQueue, TNetP: NetworkSpecialization, @@ -850,7 +854,7 @@ ServiceBuilder< Some(Arc::new(sc_offchain::OffchainWorkers::new(client.clone(), db))) }, (true, None) => { - log::warn!("Offchain workers disabled, due to lack of offchain storage support in backend."); + warn!("Offchain workers disabled, due to lack of offchain storage support in backend."); None }, _ => None, @@ -1124,7 +1128,7 @@ ServiceBuilder< }).compat(); let _ = to_spawn_tx.unbounded_send(Box::new(future)); - } + } // Instrumentation if let Some(tracing_targets) = config.tracing_targets.as_ref() { diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 95e1a11e5d..0b86fb366f 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -25,7 +25,6 @@ use futures::{future, prelude::*}; use futures03::{ TryFutureExt as _, }; -use sp_core::{Blake2Hasher, Hasher}; use sp_runtime::traits::{ Block as BlockT, NumberFor, One, Zero, Header, SaturatedConversion }; @@ -57,9 +56,9 @@ impl< TBl, TRtApi, TCfg, TGen, TCSExt, Client, TFchr, TSc, TImpQu, TFprb, TFpp, TNetP, TExPool, TRpc, Backend > where - TBl: BlockT::Out>, - TBackend: 'static + sc_client_api::backend::Backend + Send, - TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, + TBl: BlockT, + TBackend: 'static + sc_client_api::backend::Backend + Send, + TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, TImpQu: 'static + ImportQueue, TRtApi: 'static + Send + Sync, { @@ -310,4 +309,3 @@ impl< } } } - diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index e4d6419e30..7a3c6fc9ea 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -48,7 +48,6 @@ use sc_network::{ }; use log::{log, warn, debug, error, Level}; use codec::{Encode, Decode}; -use sp_core::{Blake2Hasher, H256}; use sp_runtime::generic::BlockId; use sp_runtime::traits::{NumberFor, Block as BlockT}; @@ -147,11 +146,11 @@ impl futures03::task::Spawn for SpawnTaskHandle { pub trait AbstractService: 'static + Future + Executor + Send>> + Send { /// Type of block of this chain. - type Block: BlockT; + type Block: BlockT; /// Backend storage for the client. - type Backend: 'static + sc_client_api::backend::Backend; + type Backend: 'static + sc_client_api::backend::Backend; /// How to execute calls towards the runtime. - type CallExecutor: 'static + sc_client::CallExecutor + Send + Sync + Clone; + type CallExecutor: 'static + sc_client::CallExecutor + Send + Sync + Clone; /// API that the runtime provides. type RuntimeApi: Send + Sync; /// Chain selection algorithm. @@ -200,7 +199,8 @@ pub trait AbstractService: 'static + Future + fn select_chain(&self) -> Option; /// Get shared network instance. - fn network(&self) -> Arc>; + fn network(&self) + -> Arc::Hash>>; /// Returns a receiver that periodically receives a status of the network. fn network_status(&self, interval: Duration) -> mpsc::UnboundedReceiver<(NetworkStatus, NetworkState)>; @@ -214,11 +214,11 @@ pub trait AbstractService: 'static + Future + impl AbstractService for Service, TSc, NetworkStatus, - NetworkService, TExPool, TOc> + NetworkService, TExPool, TOc> where - TBl: BlockT, - TBackend: 'static + sc_client_api::backend::Backend, - TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, + TBl: BlockT, + TBackend: 'static + sc_client_api::backend::Backend, + TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, TRtApi: 'static + Send + Sync, TSc: sp_consensus::SelectChain + 'static + Clone + Send, TExPool: 'static + TransactionPool @@ -288,7 +288,9 @@ where self.select_chain.clone() } - fn network(&self) -> Arc> { + fn network(&self) + -> Arc::Hash>> + { self.network.clone() } diff --git a/client/src/call_executor.rs b/client/src/call_executor.rs index d02718a97d..6a41eba010 100644 --- a/client/src/call_executor.rs +++ b/client/src/call_executor.rs @@ -17,20 +17,16 @@ use std::{sync::Arc, panic::UnwindSafe, result, cell::RefCell}; use codec::{Encode, Decode}; use sp_runtime::{ - generic::BlockId, traits::Block as BlockT, traits::NumberFor, + generic::BlockId, traits::{Block as BlockT, HasherFor}, }; use sp_state_machine::{ self, OverlayedChanges, Ext, ExecutionManager, StateMachine, ExecutionStrategy, - backend::Backend as _, ChangesTrieTransaction, StorageProof, + backend::Backend as _, StorageProof, }; use sc_executor::{RuntimeVersion, RuntimeInfo, NativeVersion}; use sp_externalities::Extensions; -use hash_db::Hasher; -use sp_core::{ - H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue, - traits::CodeExecutor, -}; -use sp_api::{ProofRecorder, InitializeBlock}; +use sp_core::{NativeOrEncoded, NeverNativeValue, traits::CodeExecutor}; +use sp_api::{ProofRecorder, InitializeBlock, StorageTransactionCache}; use sc_client_api::{backend, call_executor::CallExecutor}; /// Call executor that executes methods locally, querying all required @@ -62,14 +58,16 @@ impl Clone for LocalCallExecutor where E: Clone { } } -impl CallExecutor for LocalCallExecutor - where - B: backend::Backend, - E: CodeExecutor + RuntimeInfo, - Block: BlockT, +impl CallExecutor for LocalCallExecutor +where + B: backend::Backend, + E: CodeExecutor + RuntimeInfo, + Block: BlockT, { type Error = E::Error; + type Backend = B; + fn call( &self, id: &BlockId, @@ -90,10 +88,8 @@ impl CallExecutor for LocalCallExecutor extensions.unwrap_or_default(), ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( strategy.get_manager(), - false, None, - ) - .map(|(result, _, _)| result)?; + )?; { let _lock = self.backend.get_import_lock().read(); self.backend.destroy_state(state)?; @@ -117,6 +113,9 @@ impl CallExecutor for LocalCallExecutor method: &str, call_data: &[u8], changes: &RefCell, + storage_transaction_cache: Option<&RefCell< + StorageTransactionCache + >>, initialize_block: InitializeBlock<'a, Block>, execution_manager: ExecutionManager, native_call: Option, @@ -134,6 +133,8 @@ impl CallExecutor for LocalCallExecutor let mut state = self.backend.state_at(*at)?; + let mut storage_transaction_cache = storage_transaction_cache.map(|c| c.borrow_mut()); + let result = match recorder { Some(recorder) => { let trie_state = state.as_trie_backend() @@ -144,7 +145,7 @@ impl CallExecutor for LocalCallExecutor let backend = sp_state_machine::ProvingBackend::new_with_recorder( trie_state, - recorder.clone() + recorder.clone(), ); StateMachine::new( @@ -156,13 +157,9 @@ impl CallExecutor for LocalCallExecutor call_data, extensions.unwrap_or_default(), ) - .execute_using_consensus_failure_handler( - execution_manager, - false, - native_call, - ) - .map(|(result, _, _)| result) - .map_err(Into::into) + // TODO: https://github.com/paritytech/substrate/issues/4455 + // .with_storage_transaction_cache(storage_transaction_cache.as_mut().map(|c| &mut **c)) + .execute_using_consensus_failure_handler(execution_manager, native_call) } None => StateMachine::new( &state, @@ -173,12 +170,8 @@ impl CallExecutor for LocalCallExecutor call_data, extensions.unwrap_or_default(), ) - .execute_using_consensus_failure_handler( - execution_manager, - false, - native_call, - ) - .map(|(result, _, _)| result) + .with_storage_transaction_cache(storage_transaction_cache.as_mut().map(|c| &mut **c)) + .execute_using_consensus_failure_handler(execution_manager, native_call) }?; { let _lock = self.backend.get_import_lock().read(); @@ -190,9 +183,11 @@ impl CallExecutor for LocalCallExecutor fn runtime_version(&self, id: &BlockId) -> sp_blockchain::Result { let mut overlay = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; + let mut cache = StorageTransactionCache::::default(); let mut ext = Ext::new( &mut overlay, + &mut cache, &state, self.backend.changes_trie_storage(), None, @@ -205,51 +200,9 @@ impl CallExecutor for LocalCallExecutor version.map_err(|e| sp_blockchain::Error::VersionInvalid(format!("{:?}", e)).into()) } - fn call_at_state< - S: sp_state_machine::Backend, - F: FnOnce( - Result, Self::Error>, - Result, Self::Error>, - ) -> Result, Self::Error>, - R: Encode + Decode + PartialEq, - NC: FnOnce() -> result::Result + UnwindSafe, - >(&self, - state: &S, - changes: &mut OverlayedChanges, - method: &str, - call_data: &[u8], - manager: ExecutionManager, - native_call: Option, - extensions: Option, - ) -> sp_blockchain::Result<( - NativeOrEncoded, - (S::Transaction, ::Out), - Option>>, - )> { - StateMachine::new( - state, - self.backend.changes_trie_storage(), - changes, - &self.executor, - method, - call_data, - extensions.unwrap_or_default(), - ).execute_using_consensus_failure_handler( - manager, - true, - native_call, - ) - .map(|(result, storage_tx, changes_tx)| ( - result, - storage_tx.expect("storage_tx is always computed when compute_tx is true; qed"), - changes_tx, - )) - .map_err(Into::into) - } - - fn prove_at_trie_state>( + fn prove_at_trie_state>>( &self, - trie_state: &sp_state_machine::TrieBackend, + trie_state: &sp_state_machine::TrieBackend>, overlay: &mut OverlayedChanges, method: &str, call_data: &[u8] @@ -271,9 +224,9 @@ impl CallExecutor for LocalCallExecutor impl sp_version::GetRuntimeVersion for LocalCallExecutor where - B: backend::Backend, + B: backend::Backend, E: CodeExecutor + RuntimeInfo, - Block: BlockT, + Block: BlockT, { fn native_version(&self) -> &sp_version::NativeVersion { self.executor.native_version() diff --git a/client/src/cht.rs b/client/src/cht.rs index 7189360174..29f19a7750 100644 --- a/client/src/cht.rs +++ b/client/src/cht.rs @@ -29,9 +29,10 @@ use sp_trie; use sp_core::{H256, convert_hash}; use sp_runtime::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; -use sp_state_machine::backend::InMemory as InMemoryState; -use sp_state_machine::{MemoryDB, TrieBackend, Backend as StateBackend, StorageProof, - prove_read_on_trie_backend, read_proof_check, read_proof_check_on_proving_backend}; +use sp_state_machine::{ + MemoryDB, TrieBackend, Backend as StateBackend, StorageProof, InMemoryBackend, + prove_read_on_trie_backend, read_proof_check, read_proof_check_on_proving_backend +}; use sp_blockchain::{Error as ClientError, Result as ClientResult}; @@ -113,7 +114,7 @@ pub fn build_proof( .into_iter() .map(|(k, v)| (k, Some(v))) .collect::>(); - let mut storage = InMemoryState::::default().update(vec![(None, transaction)]); + let mut storage = InMemoryBackend::::default().update(vec![(None, transaction)]); let trie_storage = storage.as_trie_backend() .expect("InMemoryState::as_trie_backend always returns Some; qed"); prove_read_on_trie_backend( @@ -330,7 +331,7 @@ pub fn decode_cht_value(value: &[u8]) -> Option { #[cfg(test)] mod tests { - use sp_core::{Blake2Hasher}; + use sp_core::Blake2Hasher; use substrate_test_runtime_client::runtime::Header; use super::*; diff --git a/client/src/client.rs b/client/src/client.rs index f99789de7d..2babf6f3e9 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -17,40 +17,37 @@ //! Substrate Client use std::{ - marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, - panic::UnwindSafe, result, cell::RefCell, + marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, panic::UnwindSafe, + result, }; use log::{info, trace, warn}; use futures::channel::mpsc; use parking_lot::{Mutex, RwLock}; use codec::{Encode, Decode}; -use hash_db::{Hasher, Prefix}; +use hash_db::Prefix; use sp_core::{ - Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, - NeverNativeValue, ExecutionContext, NativeOrEncoded, - storage::{StorageKey, StorageData, well_known_keys, ChildInfo}, - traits::CodeExecutor, + ChangesTrieConfiguration, convert_hash, traits::CodeExecutor, + NativeOrEncoded, storage::{StorageKey, StorageData, well_known_keys, ChildInfo}, }; use sc_telemetry::{telemetry, SUBSTRATE_INFO}; use sp_runtime::{ Justification, BuildStorage, generic::{BlockId, SignedBlock, DigestItem}, traits::{ - Block as BlockT, Header as HeaderT, Zero, NumberFor, - ApiRef, ProvideRuntimeApi, SaturatedConversion, One, DigestFor, + Block as BlockT, Header as HeaderT, Zero, NumberFor, HasherFor, SaturatedConversion, One, + DigestFor, }, }; use sp_state_machine::{ - DBValue, Backend as StateBackend, ChangesTrieAnchorBlockId, ExecutionStrategy, ExecutionManager, + DBValue, Backend as StateBackend, ChangesTrieAnchorBlockId, prove_read, prove_child_read, ChangesTrieRootsStorage, ChangesTrieStorage, - ChangesTrieTransaction, ChangesTrieConfigurationRange, key_changes, key_changes_proof, - OverlayedChanges, BackendTrustLevel, StorageProof, merge_storage_proofs, + ChangesTrieConfigurationRange, key_changes, key_changes_proof, StorageProof, + merge_storage_proofs, }; use sc_executor::{RuntimeVersion, RuntimeInfo}; use sp_consensus::{ - Error as ConsensusError, BlockStatus, BlockImportParams, BlockCheckParams, - ImportResult, BlockOrigin, ForkChoiceStrategy, - SelectChain, self, + Error as ConsensusError, BlockStatus, BlockImportParams, BlockCheckParams, ImportResult, + BlockOrigin, ForkChoiceStrategy, SelectChain, RecordProof, }; use sp_blockchain::{self as blockchain, Backend as ChainBackend, @@ -59,7 +56,10 @@ use sp_blockchain::{self as blockchain, HeaderMetadata, CachedHeaderMetadata, }; -use sp_api::{CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, InitializeBlock}; +use sp_api::{ + CallApiAt, ConstructRuntimeApi, Core as CoreApi, ApiExt, ApiRef, ProvideRuntimeApi, + CallApiAtParams, +}; use sc_block_builder::BlockBuilderApi; pub use sc_client_api::{ @@ -84,13 +84,6 @@ use crate::{ in_mem, genesis, cht, }; -type StorageUpdate = < - < - >::BlockImportOperation - as BlockImportOperation - >::State as sp_state_machine::Backend>::Transaction; -type ChangesUpdate = ChangesTrieTransaction>; - /// Substrate Client pub struct Client where Block: BlockT { backend: Arc, @@ -116,14 +109,6 @@ enum PrePostHeader { } impl PrePostHeader { - // get a reference to the "pre-header" -- the header as it should be just after the runtime. - fn pre(&self) -> &H { - match *self { - PrePostHeader::Same(ref h) => h, - PrePostHeader::Different(ref h, _) => h, - } - } - // get a reference to the "post-header" -- the header as it should be after all changes are applied. fn post(&self) -> &H { match *self { @@ -147,14 +132,14 @@ pub fn new_in_mem( genesis_storage: S, keystore: Option, ) -> sp_blockchain::Result, - LocalCallExecutor, E>, + in_mem::Backend, + LocalCallExecutor, E>, Block, RA >> where E: CodeExecutor + RuntimeInfo, S: BuildStorage, - Block: BlockT, + Block: BlockT, { new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage, keystore) } @@ -170,8 +155,8 @@ pub fn new_with_backend( where E: CodeExecutor + RuntimeInfo, S: BuildStorage, - Block: BlockT, - B: backend::LocalBackend + Block: BlockT, + B: backend::LocalBackend { let call_executor = LocalCallExecutor::new(backend.clone(), executor); let extensions = ExecutionExtensions::new(Default::default(), keystore); @@ -186,17 +171,17 @@ pub fn new_with_backend( } impl BlockOf for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { type Type = Block; } impl Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { /// Creates new Substrate Client with given blockchain and code executor. pub fn new( @@ -404,7 +389,12 @@ impl Client where 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)?; + let proof = cht::build_proof::, _, _>( + cht_size, + cht_num, + std::iter::once(block_num), + headers, + )?; Ok((header, proof)) } @@ -453,7 +443,7 @@ impl Client where end: None, }; - key_changes::( + key_changes::, _>( config_range, &*storage, first, @@ -506,21 +496,25 @@ impl Client where cht_size: NumberFor, ) -> sp_blockchain::Result> { struct AccessedRootsRecorder<'a, Block: BlockT> { - storage: &'a dyn ChangesTrieStorage>, + storage: &'a dyn ChangesTrieStorage, NumberFor>, min: NumberFor, - required_roots_proofs: Mutex, H256>>, + required_roots_proofs: Mutex, Block::Hash>>, }; - impl<'a, Block: BlockT> ChangesTrieRootsStorage> for AccessedRootsRecorder<'a, Block> { - fn build_anchor(&self, hash: H256) -> Result>, String> { + impl<'a, Block: BlockT> ChangesTrieRootsStorage, NumberFor> for + AccessedRootsRecorder<'a, Block> + { + fn build_anchor(&self, hash: Block::Hash) + -> Result>, String> + { self.storage.build_anchor(hash) } fn root( &self, - anchor: &ChangesTrieAnchorBlockId>, + anchor: &ChangesTrieAnchorBlockId>, block: NumberFor, - ) -> Result, String> { + ) -> Result, String> { let root = self.storage.root(anchor, block)?; if block < self.min { if let Some(ref root) = root { @@ -534,20 +528,24 @@ impl Client where } } - impl<'a, Block: BlockT> ChangesTrieStorage> for AccessedRootsRecorder<'a, Block> { - fn as_roots_storage(&self) -> &dyn sp_state_machine::ChangesTrieRootsStorage> { + impl<'a, Block: BlockT> ChangesTrieStorage, NumberFor> for + AccessedRootsRecorder<'a, Block> + { + fn as_roots_storage(&self) + -> &dyn sp_state_machine::ChangesTrieRootsStorage, NumberFor> + { self } fn with_cached_changed_keys( &self, - root: &H256, + root: &Block::Hash, functor: &mut dyn FnMut(&HashMap>, HashSet>>), ) -> bool { self.storage.with_cached_changed_keys(root, functor) } - fn get(&self, key: &H256, prefix: Prefix) -> Result, String> { + fn get(&self, key: &Block::Hash, prefix: Prefix) -> Result, String> { self.storage.get(key, prefix) } } @@ -561,7 +559,7 @@ impl Client where required_roots_proofs: Mutex::new(BTreeMap::new()), }; - let max_number = ::std::cmp::min( + let max_number = std::cmp::min( self.backend.blockchain().info().best_number, self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(max))?, ); @@ -578,7 +576,7 @@ impl Client where .expect_block_number_from_id(&BlockId::Hash(first))?; let last_number = self.backend.blockchain() .expect_block_number_from_id(&BlockId::Hash(last))?; - let key_changes_proof = key_changes_proof::( + let key_changes_proof = key_changes_proof::, _>( config_range, &recording_storage, first_number, @@ -640,8 +638,15 @@ impl Client where }); 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)?; + .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) } @@ -659,69 +664,54 @@ impl Client where pub fn new_block( &self, inherent_digests: DigestFor, - ) -> sp_blockchain::Result> where + ) -> sp_blockchain::Result> where E: Clone + Send + Sync, RA: Send + Sync, - Self: ProvideRuntimeApi, - ::Api: BlockBuilderApi + Self: ProvideRuntimeApi, + >::Api: BlockBuilderApi + + ApiExt> { let info = self.chain_info(); sc_block_builder::BlockBuilder::new( self, info.best_hash, info.best_number, - false, + RecordProof::No, inherent_digests, + &self.backend, ) } /// Create a new block, built on top of `parent`. - pub fn new_block_at( - &self, - parent: &BlockId, - inherent_digests: DigestFor, - ) -> sp_blockchain::Result> where - E: Clone + Send + Sync, - RA: Send + Sync, - Self: ProvideRuntimeApi, - ::Api: BlockBuilderApi - { - sc_block_builder::BlockBuilder::new( - self, - self.expect_block_hash_from_id(parent)?, - self.expect_block_number_from_id(parent)?, - false, - inherent_digests, - ) - } - - /// Create a new block, built on top of `parent` with proof recording enabled. /// - /// While proof recording is enabled, all accessed trie nodes are saved. + /// When proof recording is enabled, all accessed trie nodes are saved. /// These recorded trie nodes can be used by a third party to proof the /// output of this block builder without having access to the full storage. - pub fn new_block_at_with_proof_recording( + pub fn new_block_at>( &self, parent: &BlockId, inherent_digests: DigestFor, - ) -> sp_blockchain::Result> where + record_proof: R, + ) -> sp_blockchain::Result> where E: Clone + Send + Sync, RA: Send + Sync, - Self: ProvideRuntimeApi, - ::Api: BlockBuilderApi + Self: ProvideRuntimeApi, + >::Api: BlockBuilderApi + + ApiExt> { sc_block_builder::BlockBuilder::new( self, self.expect_block_hash_from_id(parent)?, self.expect_block_number_from_id(parent)?, - true, + record_proof.into(), inherent_digests, + &self.backend ) } /// Lock the import lock, and run operations inside. pub fn lock_import_and_run(&self, f: F) -> Result where - F: FnOnce(&mut ClientImportOperation) -> Result, + F: FnOnce(&mut ClientImportOperation) -> Result, Err: From, { let inner = || { @@ -756,11 +746,14 @@ impl Client where /// then `finalized` *must* be true. fn apply_block( &self, - operation: &mut ClientImportOperation, - import_block: BlockImportParams, + operation: &mut ClientImportOperation, + import_block: BlockImportParams>, new_cache: HashMap>, ) -> sp_blockchain::Result where - E: CallExecutor + Send + Sync + Clone, + E: CallExecutor + Send + Sync + Clone, + Self: ProvideRuntimeApi, + >::Api: CoreApi + + ApiExt, { let BlockImportParams { origin, @@ -768,28 +761,16 @@ impl Client where justification, post_digests, body, + storage_changes, finalized, auxiliary, fork_choice, - allow_missing_state, import_existing, + .. } = import_block; assert!(justification.is_some() && finalized || justification.is_none()); - let parent_hash = header.parent_hash().clone(); - let mut enact_state = true; - - match self.block_status(&BlockId::Hash(parent_hash))? { - BlockStatus::Unknown => return Ok(ImportResult::UnknownParent), - BlockStatus::InChainWithState | BlockStatus::Queued => {}, - BlockStatus::InChainPruned if allow_missing_state => { - enact_state = false; - }, - BlockStatus::InChainPruned => return Ok(ImportResult::MissingState), - BlockStatus::KnownBad => return Ok(ImportResult::KnownBad), - } - let import_headers = if post_digests.is_empty() { PrePostHeader::Same(header) } else { @@ -812,11 +793,11 @@ impl Client where import_headers, justification, body, + storage_changes, new_cache, finalized, auxiliary, fork_choice, - enact_state, import_existing, ); @@ -835,20 +816,23 @@ impl Client where fn execute_and_import_block( &self, - operation: &mut ClientImportOperation, + operation: &mut ClientImportOperation, origin: BlockOrigin, hash: Block::Hash, import_headers: PrePostHeader, justification: Option, body: Option>, + storage_changes: Option, Block>>, new_cache: HashMap>, finalized: bool, aux: Vec<(Vec, Option>)>, fork_choice: ForkChoiceStrategy, - enact_state: bool, import_existing: bool, ) -> sp_blockchain::Result where - E: CallExecutor + Send + Sync + Clone, + E: CallExecutor + Send + Sync + Clone, + Self: ProvideRuntimeApi, + >::Api: CoreApi + + ApiExt, { let parent_hash = import_headers.post().parent_hash().clone(); let status = self.backend.blockchain().status(BlockId::Hash(hash))?; @@ -856,7 +840,8 @@ impl Client where (false, blockchain::BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), (false, blockchain::BlockStatus::Unknown) => {}, (true, blockchain::BlockStatus::InChain) => {}, - (true, blockchain::BlockStatus::Unknown) => return Err(Error::UnknownBlock(format!("{:?}", hash))), + (true, blockchain::BlockStatus::Unknown) => + return Err(Error::UnknownBlock(format!("{:?}", hash))), } let info = self.backend.blockchain().info(); @@ -875,38 +860,36 @@ impl Client where BlockOrigin::Genesis | BlockOrigin::NetworkInitialSync | BlockOrigin::File => false, }; - let storage_changes = match &body { - Some(body) if enact_state => { + let storage_changes = match storage_changes { + Some(storage_changes) => { self.backend.begin_state_operation(&mut operation.op, BlockId::Hash(parent_hash))?; // ensure parent block is finalized to maintain invariant that // finality is called sequentially. if finalized { - self.apply_finality_with_block_hash(operation, parent_hash, None, info.best_hash, make_notifications)?; + self.apply_finality_with_block_hash( + operation, + parent_hash, + None, + info.best_hash, + make_notifications, + )?; } - // FIXME #1232: correct path logic for when to execute this function - let (storage_update, changes_update, storage_changes) = self.block_execution( - &operation.op, - &import_headers, - origin, - hash, - &body, - )?; - operation.op.update_cache(new_cache); - if let Some(storage_update) = storage_update { - operation.op.update_db_storage(storage_update)?; - } - if let Some(storage_changes) = storage_changes.clone() { - 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)?; + + let (main_sc, child_sc, tx, _, changes_trie_tx) = storage_changes.into_inner(); + + operation.op.update_db_storage(tx)?; + operation.op.update_storage(main_sc.clone(), child_sc.clone())?; + + if let Some(changes_trie_transaction) = changes_trie_tx { + operation.op.update_changes_trie(changes_trie_transaction)?; } - storage_changes + + Some((main_sc, child_sc)) }, - _ => None, + None => None, }; let is_new_best = finalized || match fork_choice { @@ -933,7 +916,13 @@ impl Client where Vec::default() }; - trace!("Imported {}, (#{}), best={}, origin={:?}", hash, import_headers.post().number(), is_new_best, origin); + trace!( + "Imported {}, (#{}), best={}, origin={:?}", + hash, + import_headers.post().number(), + is_new_best, + origin, + ); operation.op.set_block_data( import_headers.post().clone(), @@ -962,86 +951,82 @@ impl Client where Ok(ImportResult::imported(is_new_best)) } - fn block_execution( + /// Prepares the storage changes for a block. + /// + /// It checks if the state should be enacted and if the `import_block` maybe already provides + /// the required storage changes. If the state should be enacted and the storage changes are not + /// provided, the block is re-executed to get the storage changes. + fn prepare_block_storage_changes( &self, - transaction: &B::BlockImportOperation, - import_headers: &PrePostHeader, - origin: BlockOrigin, - hash: Block::Hash, - body: &[Block::Extrinsic], - ) -> sp_blockchain::Result<( - Option>, - Option>>, - Option<( - Vec<(Vec, Option>)>, - Vec<(Vec, Vec<(Vec, Option>)>)> - )> - )> + import_block: &mut BlockImportParams>, + ) -> sp_blockchain::Result> where - E: CallExecutor + Send + Sync + Clone, + Self: ProvideRuntimeApi, + >::Api: CoreApi + + ApiExt, { - match transaction.state()? { - Some(transaction_state) => { - let mut overlay = Default::default(); - let get_execution_manager = |execution_strategy: ExecutionStrategy| { - match execution_strategy { - ExecutionStrategy::NativeElseWasm => ExecutionManager::NativeElseWasm, - ExecutionStrategy::AlwaysWasm => ExecutionManager::AlwaysWasm(BackendTrustLevel::Trusted), - ExecutionStrategy::NativeWhenPossible => ExecutionManager::NativeWhenPossible, - ExecutionStrategy::Both => ExecutionManager::Both(|wasm_result, native_result| { - let header = import_headers.post(); - warn!("Consensus error between wasm and native block execution at block {}", hash); - warn!(" Header {:?}", header); - warn!(" Native result {:?}", native_result); - warn!(" Wasm result {:?}", wasm_result); - telemetry!(SUBSTRATE_INFO; "block.execute.consensus_failure"; - "hash" => ?hash, - "origin" => ?origin, - "header" => ?header - ); - wasm_result - }), - } - }; + let parent_hash = import_block.header.parent_hash(); + let at = BlockId::Hash(*parent_hash); + let enact_state = match self.block_status(&at)? { + BlockStatus::Unknown => return Ok(Some(ImportResult::UnknownParent)), + BlockStatus::InChainWithState | BlockStatus::Queued => true, + BlockStatus::InChainPruned if import_block.allow_missing_state => false, + BlockStatus::InChainPruned => return Ok(Some(ImportResult::MissingState)), + BlockStatus::KnownBad => return Ok(Some(ImportResult::KnownBad)), + }; - let encoded_block = ::encode_from( - import_headers.pre(), - body, - ); + match (enact_state, &mut import_block.storage_changes, &mut import_block.body) { + // We have storage changes and should enact the state, so we don't need to do anything + // here + (true, Some(_), _) => {}, + // We should enact state, but don't have any storage changes, so we need to execute the + // block. + (true, ref mut storage_changes @ None, Some(ref body)) => { + let runtime_api = self.runtime_api(); + + runtime_api.execute_block( + &at, + Block::new(import_block.header.clone(), body.clone()), + )?; - let (_, storage_update, changes_update) = self.executor - .call_at_state::<_, _, NeverNativeValue, fn() -> _>( - transaction_state, - &mut overlay, - "Core_execute_block", - &encoded_block, - match origin { - BlockOrigin::NetworkInitialSync => get_execution_manager( - self.execution_extensions().strategies().syncing, - ), - _ => get_execution_manager(self.execution_extensions().strategies().importing), - }, - None, - None, - )?; + let state = self.backend.state_at(at)?; - overlay.commit_prospective(); + let gen_storage_changes = runtime_api.into_storage_changes( + &state, + self.backend.changes_trie_storage(), + *parent_hash, + ); - let (top, children) = overlay.into_committed(); - let children = children.map(|(sk, it)| (sk, it.0.collect())).collect(); - if import_headers.post().state_root() != &storage_update.1 { - return Err(sp_blockchain::Error::InvalidStateRoot); + { + let _lock = self.backend.get_import_lock().read(); + self.backend.destroy_state(state)?; } - Ok((Some(storage_update.0), Some(changes_update), Some((top.collect(), children)))) + // Make sure to consume the error, only after we have destroyed the state. + let gen_storage_changes = gen_storage_changes?; + + if import_block.header.state_root() + != &gen_storage_changes.transaction_storage_root + { + return Err(Error::InvalidStateRoot) + } else { + **storage_changes = Some(gen_storage_changes); + } }, - None => Ok((None, None, None)) - } + // No block body, no storage changes + (true, None, None) => {}, + // We should not enact the state, so we set the storage changes to `None`. + (false, changes, _) => { + changes.take(); + } + }; + + Ok(None) } fn apply_finality_with_block_hash( &self, - operation: &mut ClientImportOperation, + operation: &mut ClientImportOperation, block: Block::Hash, justification: Option, best_block: Block::Hash, @@ -1287,9 +1272,9 @@ impl Client where } impl HeaderMetadata for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { type Error = sp_blockchain::Error; @@ -1307,9 +1292,9 @@ impl HeaderMetadata for Client where } impl ProvideUncles for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { fn uncles(&self, target_hash: Block::Hash, max_generation: NumberFor) -> sp_blockchain::Result> { Ok(Client::uncles(self, target_hash, max_generation)? @@ -1321,9 +1306,9 @@ impl ProvideUncles for Client where } impl ChainHeaderBackend for Client where - B: backend::Backend, - E: CallExecutor + Send + Sync, - Block: BlockT, + B: backend::Backend, + E: CallExecutor + Send + Sync, + Block: BlockT, RA: Send + Sync, { fn header(&self, id: BlockId) -> sp_blockchain::Result> { @@ -1348,9 +1333,9 @@ impl ChainHeaderBackend for Client wher } impl sp_runtime::traits::BlockIdTo for Client where - B: backend::Backend, - E: CallExecutor + Send + Sync, - Block: BlockT, + B: backend::Backend, + E: CallExecutor + Send + Sync, + Block: BlockT, RA: Send + Sync, { type Error = Error; @@ -1365,9 +1350,9 @@ impl sp_runtime::traits::BlockIdTo for Client ChainHeaderBackend for &Client where - B: backend::Backend, - E: CallExecutor + Send + Sync, - Block: BlockT, + B: backend::Backend, + E: CallExecutor + Send + Sync, + Block: BlockT, RA: Send + Sync, { fn header(&self, id: BlockId) -> sp_blockchain::Result> { @@ -1392,19 +1377,19 @@ impl ChainHeaderBackend for &Client whe } impl ProvideCache for Client where - B: backend::Backend, - Block: BlockT, + B: backend::Backend, + Block: BlockT, { fn cache(&self) -> Option>> { self.backend.blockchain().cache() } } -impl ProvideRuntimeApi for Client where - B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, - Block: BlockT, - RA: ConstructRuntimeApi +impl ProvideRuntimeApi for Client where + B: backend::Backend, + E: CallExecutor + Clone + Send + Sync, + Block: BlockT, + RA: ConstructRuntimeApi, { type Api = >::RuntimeApi; @@ -1413,12 +1398,13 @@ impl ProvideRuntimeApi for Client where } } -impl CallRuntimeAt for Client where - B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, - Block: BlockT, +impl CallApiAt for Client where + B: backend::Backend, + E: CallExecutor + Clone + Send + Sync, + Block: BlockT, { type Error = Error; + type StateBackend = B::State; fn call_api_at< 'a, @@ -1427,27 +1413,27 @@ impl CallRuntimeAt for Client where C: CoreApi, >( &self, - core_api: &C, - at: &BlockId, - function: &'static str, - args: Vec, - changes: &RefCell, - initialize_block: InitializeBlock<'a, Block>, - native_call: Option, - context: ExecutionContext, - recorder: &Option>, + params: CallApiAtParams<'a, Block, C, NC, B::State>, ) -> sp_blockchain::Result> { - let (manager, extensions) = self.execution_extensions.manager_and_extensions(at, context); + let core_api = params.core_api; + let at = params.at; + + let (manager, extensions) = self.execution_extensions.manager_and_extensions( + at, + params.context, + ); + self.executor.contextual_call::<_, fn(_,_) -> _,_,_>( || core_api.initialize_block(at, &self.prepare_environment_block(at)?), at, - function, - &args, - changes, - initialize_block, + params.function, + ¶ms.arguments, + params.overlayed_changes, + Some(params.storage_transaction_cache), + params.initialize_block, manager, - native_call, - recorder, + params.native_call, + params.recorder, Some(extensions), ) } @@ -1460,12 +1446,16 @@ impl CallRuntimeAt for Client where /// NOTE: only use this implementation when you are sure there are NO consensus-level BlockImport /// objects. Otherwise, importing blocks directly into the client would be bypassing /// important verification work. -impl<'a, B, E, Block, RA> sp_consensus::BlockImport for &'a Client where - B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, - Block: BlockT, +impl sp_consensus::BlockImport for &Client where + B: backend::Backend, + E: CallExecutor + Clone + Send + Sync, + Block: BlockT, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: CoreApi + + ApiExt, { type Error = ConsensusError; + type Transaction = backend::TransactionFor; /// Import a checked and validated block. If a justification is provided in /// `BlockImportParams` then `finalized` *must* be true. @@ -1478,9 +1468,16 @@ impl<'a, B, E, Block, RA> sp_consensus::BlockImport for &'a Client, + mut import_block: BlockImportParams>, new_cache: HashMap>, ) -> Result { + if let Some(res) = self.prepare_block_storage_changes(&mut import_block).map_err(|e| { + warn!("Block prepare storage changes error:\n{:?}", e); + ConsensusError::ClientImport(e.to_string()) + })? { + return Ok(res) + } + self.lock_import_and_run(|operation| { self.apply_block(operation, import_block, new_cache) }).map_err(|e| { @@ -1554,15 +1551,19 @@ impl<'a, B, E, Block, RA> sp_consensus::BlockImport for &'a Client sp_consensus::BlockImport for Client where - B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, - Block: BlockT, + B: backend::Backend, + E: CallExecutor + Clone + Send + Sync, + Block: BlockT, + Self: ProvideRuntimeApi, + >::Api: CoreApi + + ApiExt, { type Error = ConsensusError; + type Transaction = backend::TransactionFor; fn import_block( &mut self, - import_block: BlockImportParams, + import_block: BlockImportParams, new_cache: HashMap>, ) -> Result { (&*self).import_block(import_block, new_cache) @@ -1576,38 +1577,50 @@ impl sp_consensus::BlockImport for Client Finalizer for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, +impl Finalizer for Client where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { fn apply_finality( &self, - operation: &mut ClientImportOperation, + operation: &mut ClientImportOperation, id: BlockId, justification: Option, notify: bool, ) -> sp_blockchain::Result<()> { 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) + self.apply_finality_with_block_hash( + operation, + to_finalize_hash, + justification, + last_best, + notify, + ) } - fn finalize_block(&self, id: BlockId, justification: Option, notify: bool) -> sp_blockchain::Result<()> { + fn finalize_block( + &self, + id: BlockId, + justification: Option, + notify: bool, + ) -> sp_blockchain::Result<()> { self.lock_import_and_run(|operation| { self.apply_finality(operation, id, justification, notify) }) } } -impl Finalizer for &Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + +impl Finalizer for &Client where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { fn apply_finality( &self, - operation: &mut ClientImportOperation, + operation: &mut ClientImportOperation, id: BlockId, justification: Option, notify: bool, @@ -1615,15 +1628,20 @@ impl Finalizer for &Client, justification: Option, notify: bool) -> sp_blockchain::Result<()> { + fn finalize_block( + &self, + id: BlockId, + justification: Option, + notify: bool, + ) -> sp_blockchain::Result<()> { (**self).finalize_block(id, justification, notify) } } impl BlockchainEvents for Client where - E: CallExecutor, - Block: BlockT, + E: CallExecutor, + Block: BlockT, { /// Get block import event stream. fn import_notification_stream(&self) -> ImportNotifications { @@ -1667,8 +1685,8 @@ impl Clone for LongestChain { impl LongestChain where - B: backend::Backend, - Block: BlockT, + B: backend::Backend, + Block: BlockT, { /// Instantiate a new LongestChain for Backend B pub fn new(backend: Arc) -> Self { @@ -1695,8 +1713,8 @@ where impl SelectChain for LongestChain where - B: backend::Backend, - Block: BlockT, + B: backend::Backend, + Block: BlockT, { fn leaves(&self) -> Result::Hash>, ConsensusError> { @@ -1724,20 +1742,25 @@ where impl BlockBody for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { - fn block_body(&self, id: &BlockId) -> sp_blockchain::Result::Extrinsic>>> { + fn block_body( + &self, + id: &BlockId, + ) -> sp_blockchain::Result::Extrinsic>>> { self.body(id) } } impl backend::AuxStore for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, + Self: ProvideRuntimeApi, + >::Api: CoreApi, { /// Insert auxiliary data into key-value store. fn insert_aux< @@ -1761,14 +1784,14 @@ impl backend::AuxStore for Client } } - impl backend::AuxStore for &Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: CoreApi, { - fn insert_aux< 'a, 'b: 'a, @@ -1784,16 +1807,16 @@ impl backend::AuxStore for &Client } } + /// Helper function to apply auxiliary data insertion into an operation. -pub fn apply_aux<'a, 'b: 'a, 'c: 'a, B, Block, H, D, I>( - operation: &mut ClientImportOperation, +pub fn apply_aux<'a, 'b: 'a, 'c: 'a, B, Block, D, I>( + operation: &mut ClientImportOperation, insert: I, - delete: D + delete: D, ) -> sp_blockchain::Result<()> where Block: BlockT, - H: Hasher, - B: backend::Backend, + B: backend::Backend, I: IntoIterator, D: IntoIterator, { @@ -1805,12 +1828,14 @@ where } impl sp_consensus::block_validation::Chain for Client - where - BE: backend::Backend, - E: CallExecutor, - B: BlockT + where BE: backend::Backend, + E: CallExecutor, + B: BlockT { - fn block_status(&self, id: &BlockId) -> Result> { + fn block_status( + &self, + id: &BlockId, + ) -> Result> { Client::block_status(self, id).map_err(|e| Box::new(e) as Box<_>) } } @@ -1819,7 +1844,7 @@ impl sp_consensus::block_validation::Chain for Client = Default::default(); for (i, block_transfers) in blocks_transfers.into_iter().enumerate() { let mut builder = remote_client.new_block(Default::default()).unwrap(); @@ -1860,7 +1885,8 @@ pub(crate) mod tests { nonce: *nonces.entry(from).and_modify(|n| { *n = *n + 1 }).or_default(), }).unwrap(); } - remote_client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); + let block = builder.build().unwrap().block; + remote_client.import(BlockOrigin::Own, block).unwrap(); let header = remote_client.header(&BlockId::Number(i as u64 + 1)).unwrap().unwrap(); let trie_root = header.digest().log(DigestItem::as_changes_trie_root) @@ -1924,18 +1950,18 @@ pub(crate) mod tests { #[test] fn block_builder_works_with_no_transactions() { - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); - let builder = client.new_block(Default::default()).unwrap(); + let block = client.new_block(Default::default()).unwrap().build().unwrap().block; - client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); + client.import(BlockOrigin::Own, block).unwrap(); assert_eq!(client.chain_info().best_number, 1); } #[test] fn block_builder_works_with_transactions() { - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); let mut builder = client.new_block(Default::default()).unwrap(); @@ -1946,7 +1972,8 @@ pub(crate) mod tests { nonce: 0, }).unwrap(); - client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); + let block = builder.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); assert_eq!(client.chain_info().best_number, 1); assert_ne!( @@ -1971,7 +1998,7 @@ pub(crate) mod tests { #[test] fn block_builder_does_not_include_invalid() { - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); let mut builder = client.new_block(Default::default()).unwrap(); @@ -1982,14 +2009,17 @@ pub(crate) mod tests { nonce: 0, }).unwrap(); - assert!(builder.push_transfer(Transfer { - from: AccountKeyring::Eve.into(), - to: AccountKeyring::Alice.into(), - amount: 42, - nonce: 0, - }).is_err()); + assert!( + builder.push_transfer(Transfer { + from: AccountKeyring::Eve.into(), + to: AccountKeyring::Alice.into(), + amount: 42, + nonce: 0, + }).is_err() + ); - client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); + let block = builder.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); assert_eq!(client.chain_info().best_number, 1); assert_ne!( @@ -2021,7 +2051,7 @@ pub(crate) mod tests { let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); - let uninserted_block = client.new_block(Default::default()).unwrap().bake().unwrap(); + let uninserted_block = client.new_block(Default::default()).unwrap().build().unwrap().block; assert_eq!( None, @@ -2033,14 +2063,14 @@ pub(crate) mod tests { fn uncles_with_only_ancestors() { // block tree: // G -> A1 -> A2 - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); let v: Vec = Vec::new(); assert_eq!(v, client.uncles(a2.hash(), 3).unwrap()); @@ -2053,30 +2083,50 @@ pub(crate) mod tests { // A1 -> B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); + let a3 = client.new_block_at( + &BlockId::Hash(a2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); + let a4 = client.new_block_at( + &BlockId::Hash(a3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); + let a5 = client.new_block_at( + &BlockId::Hash(a4.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -2084,19 +2134,31 @@ pub(crate) mod tests { amount: 41, nonce: 0, }).unwrap(); - let b2 = builder.bake().unwrap(); + let b2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); + let b3 = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); + let b4 = client.new_block_at( + &BlockId::Hash(b3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).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(), @@ -2104,11 +2166,15 @@ pub(crate) mod tests { amount: 1, nonce: 1, }).unwrap(); - let c3 = builder.bake().unwrap(); + let c3 = builder.build().unwrap().block; client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -2116,7 +2182,7 @@ pub(crate) mod tests { amount: 1, nonce: 0, }).unwrap(); - let d2 = builder.bake().unwrap(); + let d2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, d2.clone()).unwrap(); let genesis_hash = client.chain_info().genesis_hash; @@ -2145,14 +2211,14 @@ pub(crate) mod tests { // block tree: // G -> A1 -> A2 - let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); + let (mut client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.chain_info().genesis_hash; @@ -2169,30 +2235,50 @@ pub(crate) mod tests { // A1 -> B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); + let (mut client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); + let a3 = client.new_block_at( + &BlockId::Hash(a2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); + let a4 = client.new_block_at( + &BlockId::Hash(a3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); + let a5 = client.new_block_at( + &BlockId::Hash(a4.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -2200,19 +2286,31 @@ pub(crate) mod tests { amount: 41, nonce: 0, }).unwrap(); - let b2 = builder.bake().unwrap(); + let b2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); + let b3 = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); + let b4 = client.new_block_at( + &BlockId::Hash(b3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).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(), @@ -2220,11 +2318,15 @@ pub(crate) mod tests { amount: 1, nonce: 1, }).unwrap(); - let c3 = builder.bake().unwrap(); + let c3 = builder.build().unwrap().block; client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -2232,7 +2334,7 @@ pub(crate) mod tests { amount: 1, nonce: 0, }).unwrap(); - let d2 = builder.bake().unwrap(); + let d2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, d2.clone()).unwrap(); assert_eq!(client.chain_info().best_hash, a5.hash()); @@ -2453,14 +2555,14 @@ pub(crate) mod tests { // block tree: // G -> A1 -> A2 - let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); + let (mut client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.chain_info().genesis_hash; @@ -2490,19 +2592,27 @@ pub(crate) mod tests { #[test] fn import_with_justification() { - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; 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()), Default::default()).unwrap().bake().unwrap(); + let a3 = client.new_block_at( + &BlockId::Hash(a2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import_justified(BlockOrigin::Own, a3.clone(), justification.clone()).unwrap(); assert_eq!( @@ -2528,19 +2638,30 @@ pub(crate) mod tests { #[test] fn importing_diverged_finalized_block_should_trigger_reorg() { - - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); // G -> A1 -> A2 // \ // -> B1 - let a1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block_at( + &BlockId::Number(0), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + let mut b1 = client.new_block_at( + &BlockId::Number(0), + Default::default(), + false, + ).unwrap(); // needed to make sure B1 gets a different hash from A1 b1.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2549,7 +2670,7 @@ pub(crate) mod tests { nonce: 0, }).unwrap(); // create but don't import B1 just yet - let b1 = b1.bake().unwrap(); + let b1 = b1.build().unwrap().block; // A2 is the current best since it's the longest chain assert_eq!( @@ -2575,18 +2696,30 @@ pub(crate) mod tests { #[test] fn finalizing_diverged_block_should_trigger_reorg() { - let (client, select_chain) = TestClientBuilder::new().build_with_longest_chain(); + let (mut client, select_chain) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 -> A2 // \ // -> B1 -> B2 - let a1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block_at( + &BlockId::Number(0), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + let mut b1 = client.new_block_at( + &BlockId::Number(0), + Default::default(), + false, + ).unwrap(); // needed to make sure B1 gets a different hash from A1 b1.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2594,10 +2727,14 @@ pub(crate) mod tests { amount: 1, nonce: 0, }).unwrap(); - let b1 = b1.bake().unwrap(); + let b1 = b1.build().unwrap().block; client.import(BlockOrigin::Own, b1.clone()).unwrap(); - let b2 = client.new_block_at(&BlockId::Hash(b1.hash()), Default::default()).unwrap().bake().unwrap(); + let b2 = client.new_block_at( + &BlockId::Hash(b1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b2.clone()).unwrap(); // A2 is the current best since it's the longest chain @@ -2634,7 +2771,8 @@ pub(crate) mod tests { let b3 = client.new_block_at( &BlockId::Hash(b2.hash()), Default::default(), - ).unwrap().bake().unwrap(); + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b3.clone()).unwrap(); assert_eq!( @@ -2656,9 +2794,9 @@ pub(crate) mod tests { #[test] fn state_reverted_on_reorg() { let _ = env_logger::try_init(); - let client = substrate_test_runtime_client::new(); + let mut client = substrate_test_runtime_client::new(); - let current_balance = || + let current_balance = |client: &substrate_test_runtime_client::TestClient| client.runtime_api().balance_of( &BlockId::number(client.chain_info().best_number), AccountKeyring::Alice.into() ).unwrap(); @@ -2666,38 +2804,51 @@ pub(crate) mod tests { // G -> A1 -> A2 // \ // -> B1 - let mut a1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + let mut a1 = client.new_block_at( + &BlockId::Number(0), + Default::default(), + false, + ).unwrap(); a1.push_transfer(Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Bob.into(), amount: 10, nonce: 0, }).unwrap(); - let a1 = a1.bake().unwrap(); + let a1 = a1.build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); - let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + let mut b1 = client.new_block_at( + &BlockId::Number(0), + Default::default(), + false, + ).unwrap(); b1.push_transfer(Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), amount: 50, nonce: 0, }).unwrap(); - let b1 = b1.bake().unwrap(); + let b1 = b1.build().unwrap().block; // Reorg to B1 client.import_as_best(BlockOrigin::Own, b1.clone()).unwrap(); - assert_eq!(950, current_balance()); - let mut a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + assert_eq!(950, current_balance(&client)); + let mut a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap(); a2.push_transfer(Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Charlie.into(), amount: 10, nonce: 1, }).unwrap(); + let a2 = a2.build().unwrap().block; // Re-org to A2 - client.import_as_best(BlockOrigin::Own, a2.bake().unwrap()).unwrap(); - assert_eq!(980, current_balance()); + client.import_as_best(BlockOrigin::Own, a2).unwrap(); + assert_eq!(980, current_balance(&client)); } #[test] @@ -2720,7 +2871,7 @@ pub(crate) mod tests { u64::max_value(), ).unwrap()); - let client = TestClientBuilder::with_backend(backend).build(); + let mut client = TestClientBuilder::with_backend(backend).build(); // -> C1 // / @@ -2728,15 +2879,21 @@ pub(crate) mod tests { // \ // -> B1 -> B2 -> B3 - let a1 = client.new_block_at(&BlockId::Number(0), Default::default()) - .unwrap().bake().unwrap(); + let a1 = client.new_block_at( + &BlockId::Number(0), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()) - .unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default(), false).unwrap(); // needed to make sure B1 gets a different hash from A1 b1.push_transfer(Transfer { @@ -2745,19 +2902,19 @@ pub(crate) mod tests { amount: 1, nonce: 0, }).unwrap(); - let b1 = b1.bake().unwrap(); + let b1 = b1.build().unwrap().block; client.import(BlockOrigin::Own, b1.clone()).unwrap(); - let b2 = client.new_block_at(&BlockId::Hash(b1.hash()), Default::default()) - .unwrap().bake().unwrap(); + let b2 = client.new_block_at(&BlockId::Hash(b1.hash()), Default::default(), false) + .unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b2.clone()).unwrap(); // we will finalize A2 which should make it impossible to import a new // B3 at the same height but that doesnt't include it ClientExt::finalize_block(&client, BlockId::Hash(a2.hash()), None).unwrap(); - let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()) - .unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default(), false) + .unwrap().build().unwrap().block; let import_err = client.import(BlockOrigin::Own, b3).err().unwrap(); let expected_err = ConsensusError::ClientImport( @@ -2771,7 +2928,7 @@ pub(crate) mod tests { // adding a C1 block which is lower than the last finalized should also // fail (with a cheaper check that doesn't require checking ancestry). - let mut c1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + let mut c1 = client.new_block_at(&BlockId::Number(0), Default::default(), false).unwrap(); // needed to make sure C1 gets a different hash from A1 and B1 c1.push_transfer(Transfer { @@ -2780,7 +2937,7 @@ pub(crate) mod tests { amount: 2, nonce: 0, }).unwrap(); - let c1 = c1.bake().unwrap(); + let c1 = c1.build().unwrap().block; let import_err = client.import(BlockOrigin::Own, c1).err().unwrap(); let expected_err = ConsensusError::ClientImport( @@ -2815,10 +2972,10 @@ pub(crate) mod tests { let mut client = TestClientBuilder::with_backend(backend).build(); - let a1 = client.new_block_at(&BlockId::Number(0), Default::default()) - .unwrap().bake().unwrap(); + let a1 = client.new_block_at(&BlockId::Number(0), Default::default(), false) + .unwrap().build().unwrap().block; - let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default(), false).unwrap(); // b1 is created, but not imported b1.push_transfer(Transfer { @@ -2827,7 +2984,7 @@ pub(crate) mod tests { amount: 1, nonce: 0, }).unwrap(); - let b1 = b1.bake().unwrap(); + let b1 = b1.build().unwrap().block; let check_block_a1 = BlockCheckParams { hash: a1.hash().clone(), @@ -2845,8 +3002,8 @@ pub(crate) mod tests { assert_eq!(client.check_block(check_block_a1.clone()).unwrap(), ImportResult::AlreadyInChain); assert_eq!(client.block_status(&BlockId::hash(check_block_a1.hash)).unwrap(), BlockStatus::InChainWithState); - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()) - .unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default(), false) + .unwrap().build().unwrap().block; client.import_as_final(BlockOrigin::Own, a2.clone()).unwrap(); let check_block_a2 = BlockCheckParams { @@ -2862,8 +3019,8 @@ pub(crate) mod tests { assert_eq!(client.check_block(check_block_a2.clone()).unwrap(), ImportResult::AlreadyInChain); assert_eq!(client.block_status(&BlockId::hash(check_block_a2.hash)).unwrap(), BlockStatus::InChainWithState); - let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()) - .unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default(), false) + .unwrap().build().unwrap().block; client.import_as_final(BlockOrigin::Own, a3.clone()).unwrap(); let check_block_a3 = BlockCheckParams { diff --git a/client/src/genesis.rs b/client/src/genesis.rs index b5951056cd..ab89bdd4d5 100644 --- a/client/src/genesis.rs +++ b/client/src/genesis.rs @@ -46,8 +46,8 @@ mod tests { use sc_executor::native_executor_instance; use sp_state_machine::{ StateMachine, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage, + InMemoryBackend, }; - use sp_state_machine::backend::InMemory; use substrate_test_runtime_client::{ runtime::genesismap::{GenesisConfig, insert_genesis_block}, runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest}, @@ -67,7 +67,7 @@ mod tests { } fn construct_block( - backend: &InMemory, + backend: &InMemoryBackend, number: BlockNumber, parent_hash: Hash, state_root: Hash, @@ -116,7 +116,7 @@ mod tests { ).unwrap(); } - let (ret_data, _, _) = StateMachine::new( + let ret_data = StateMachine::new( backend, Some(&InMemoryChangesTrieStorage::<_, u64>::new()), &mut overlay, @@ -132,7 +132,7 @@ mod tests { (vec![].and(&Block { header, extrinsics: transactions }), hash) } - fn block1(genesis_hash: Hash, backend: &InMemory) -> (Vec, Hash) { + fn block1(genesis_hash: Hash, backend: &InMemoryBackend) -> (Vec, Hash) { construct_block( backend, 1, @@ -149,7 +149,8 @@ mod tests { #[test] fn construct_genesis_should_work_with_native() { - let mut storage = GenesisConfig::new(false, + let mut storage = GenesisConfig::new( + false, vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 1000, @@ -158,7 +159,7 @@ mod tests { ).genesis_map(); let genesis_hash = insert_genesis_block(&mut storage); - let backend = InMemory::from(storage); + let backend = InMemoryBackend::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); let mut overlay = OverlayedChanges::default(); @@ -186,7 +187,7 @@ mod tests { ).genesis_map(); let genesis_hash = insert_genesis_block(&mut storage); - let backend = InMemory::from(storage); + let backend = InMemoryBackend::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); let mut overlay = OverlayedChanges::default(); @@ -214,7 +215,7 @@ mod tests { ).genesis_map(); let genesis_hash = insert_genesis_block(&mut storage); - let backend = InMemory::from(storage); + let backend = InMemoryBackend::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); let mut overlay = OverlayedChanges::default(); diff --git a/client/src/in_mem.rs b/client/src/in_mem.rs index a65084c17c..5d0d14c1cb 100644 --- a/client/src/in_mem.rs +++ b/client/src/in_mem.rs @@ -24,11 +24,13 @@ use sp_core::offchain::storage::{ InMemOffchainStorage as OffchainStorage }; use sp_runtime::generic::{BlockId, DigestItem}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor, HasherFor}; use sp_runtime::{Justification, Storage}; -use sp_state_machine::backend::{Backend as StateBackend, InMemory}; -use sp_state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId, ChangesTrieTransaction}; -use hash_db::{Hasher, Prefix}; +use sp_state_machine::{ + InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId, ChangesTrieTransaction, + InMemoryBackend, Backend as StateBackend, +}; +use hash_db::Prefix; use sp_trie::MemoryDB; use sp_blockchain::{CachedHeaderMetadata, HeaderMetadata}; @@ -459,25 +461,21 @@ impl sc_client_api::light::Storage for Blockchain } /// In-memory operation. -pub struct BlockImportOperation { +pub struct BlockImportOperation { pending_block: Option>, pending_cache: HashMap>, - old_state: InMemory, - new_state: Option>, - changes_trie_update: Option>, + old_state: InMemoryBackend>, + new_state: Option>>, + changes_trie_update: Option>>, aux: Vec<(Vec, Option>)>, finalized_blocks: Vec<(BlockId, Option)>, set_head: Option>, } -impl backend::BlockImportOperation for BlockImportOperation -where - Block: BlockT, - H: Hasher, - - H::Out: Ord, +impl backend::BlockImportOperation for BlockImportOperation where + Block::Hash: Ord, { - type State = InMemory; + type State = InMemoryBackend>; fn state(&self) -> sp_blockchain::Result> { Ok(Some(&self.old_state)) @@ -502,17 +500,23 @@ where self.pending_cache = cache; } - fn update_db_storage(&mut self, update: as StateBackend>::Transaction) -> sp_blockchain::Result<()> { + fn update_db_storage( + &mut self, + update: > as StateBackend>>::Transaction, + ) -> sp_blockchain::Result<()> { self.new_state = Some(self.old_state.update(update)); Ok(()) } - fn update_changes_trie(&mut self, update: ChangesTrieTransaction>) -> sp_blockchain::Result<()> { + fn update_changes_trie( + &mut self, + update: ChangesTrieTransaction, NumberFor>, + ) -> sp_blockchain::Result<()> { self.changes_trie_update = Some(update.0); Ok(()) } - fn reset_storage(&mut self, storage: Storage) -> sp_blockchain::Result { + fn reset_storage(&mut self, storage: Storage) -> sp_blockchain::Result { check_genesis_storage(&storage)?; let child_delta = storage.children.into_iter() @@ -524,7 +528,7 @@ where child_delta ); - self.new_state = Some(InMemory::from(transaction)); + self.new_state = Some(InMemoryBackend::from(transaction)); Ok(root) } @@ -543,7 +547,11 @@ where Ok(()) } - fn mark_finalized(&mut self, block: BlockId, justification: Option) -> sp_blockchain::Result<()> { + fn mark_finalized( + &mut self, + block: BlockId, + justification: Option, + ) -> sp_blockchain::Result<()> { self.finalized_blocks.push((block, justification)); Ok(()) } @@ -559,26 +567,16 @@ where /// /// > **Warning**: Doesn't support all the features necessary for a proper database. Only use this /// > struct for testing purposes. Do **NOT** use in production. -pub struct Backend -where - Block: BlockT, - H: Hasher, - H::Out: Ord, -{ - states: RwLock>>, - changes_trie_storage: ChangesTrieStorage, +pub struct Backend where Block::Hash: Ord { + states: RwLock>>>, + changes_trie_storage: ChangesTrieStorage, blockchain: Blockchain, import_lock: RwLock<()>, } -impl Backend -where - Block: BlockT, - H: Hasher, - H::Out: Ord, -{ +impl Backend where Block::Hash: Ord { /// Create a new instance of in-mem backend. - pub fn new() -> Backend { + pub fn new() -> Self { Backend { states: RwLock::new(HashMap::new()), changes_trie_storage: ChangesTrieStorage(InMemoryChangesTrieStorage::new()), @@ -588,12 +586,7 @@ where } } -impl backend::AuxStore for Backend -where - Block: BlockT, - H: Hasher, - H::Out: Ord, -{ +impl backend::AuxStore for Backend where Block::Hash: Ord { fn insert_aux< 'a, 'b: 'a, @@ -609,16 +602,11 @@ where } } -impl backend::Backend for Backend -where - Block: BlockT, - H: Hasher, - H::Out: Ord, -{ - type BlockImportOperation = BlockImportOperation; +impl backend::Backend for Backend where Block::Hash: Ord { + type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; - type State = InMemory; - type ChangesTrieStorage = ChangesTrieStorage; + type State = InMemoryBackend>; + type ChangesTrieStorage = ChangesTrieStorage; type OffchainStorage = OffchainStorage; fn begin_operation(&self) -> sp_blockchain::Result { @@ -635,7 +623,11 @@ where }) } - fn begin_state_operation(&self, operation: &mut Self::BlockImportOperation, block: BlockId) -> sp_blockchain::Result<()> { + fn begin_state_operation( + &self, + operation: &mut Self::BlockImportOperation, + block: BlockId, + ) -> sp_blockchain::Result<()> { operation.old_state = self.state_at(block)?; Ok(()) } @@ -680,7 +672,11 @@ where Ok(()) } - fn finalize_block(&self, block: BlockId, justification: Option) -> sp_blockchain::Result<()> { + fn finalize_block( + &self, + block: BlockId, + justification: Option, + ) -> sp_blockchain::Result<()> { self.blockchain.finalize_header(block, justification) } @@ -727,19 +723,9 @@ where } } -impl backend::LocalBackend for Backend -where - Block: BlockT, - H: Hasher, - H::Out: Ord, -{} - -impl backend::RemoteBackend for Backend -where - Block: BlockT, - H: Hasher, - H::Out: Ord, -{ +impl backend::LocalBackend for Backend where Block::Hash: Ord {} + +impl backend::RemoteBackend for Backend where Block::Hash: Ord { fn is_local_state_available(&self, block: &BlockId) -> bool { self.blockchain.expect_block_number_from_id(block) .map(|num| num.is_zero()) @@ -752,8 +738,11 @@ where } /// Prunable in-memory changes trie storage. -pub struct ChangesTrieStorage(InMemoryChangesTrieStorage>); -impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { +pub struct ChangesTrieStorage( + InMemoryChangesTrieStorage, NumberFor> +); + +impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { fn oldest_changes_trie_block( &self, _config: &ChangesTrieConfiguration, @@ -763,45 +752,47 @@ impl backend::PrunableStateChangesTrieStorage sp_state_machine::ChangesTrieRootsStorage> for ChangesTrieStorage - where - Block: BlockT, - H: Hasher, +impl sp_state_machine::ChangesTrieRootsStorage, NumberFor> for + ChangesTrieStorage { fn build_anchor( &self, - _hash: H::Out, - ) -> Result>, String> { + _hash: Block::Hash, + ) -> Result>, String> { Err("Dummy implementation".into()) } fn root( &self, - _anchor: &ChangesTrieAnchorBlockId>, + _anchor: &ChangesTrieAnchorBlockId>, _block: NumberFor, - ) -> Result, String> { + ) -> Result, String> { Err("Dummy implementation".into()) } } -impl sp_state_machine::ChangesTrieStorage> for ChangesTrieStorage - where - Block: BlockT, - H: Hasher, +impl sp_state_machine::ChangesTrieStorage, NumberFor> for + ChangesTrieStorage { - fn as_roots_storage(&self) -> &dyn sp_state_machine::ChangesTrieRootsStorage> { + fn as_roots_storage(&self) + -> &dyn sp_state_machine::ChangesTrieRootsStorage, NumberFor> + { self } fn with_cached_changed_keys( &self, - _root: &H::Out, + _root: &Block::Hash, _functor: &mut dyn FnMut(&HashMap>, HashSet>>), ) -> bool { false } - fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { + fn get( + &self, + key: &Block::Hash, + prefix: Prefix, + ) -> Result, String> { self.0.get(key, prefix) } } @@ -823,10 +814,8 @@ pub fn check_genesis_storage(storage: &Storage) -> sp_blockchain::Result<()> { mod tests { use sp_core::offchain::{OffchainStorage, storage::InMemOffchainStorage}; use std::sync::Arc; - use substrate_test_runtime_client; - use sp_core::Blake2Hasher; - type TestBackend = substrate_test_runtime_client::sc_client::in_mem::Backend; + type TestBackend = substrate_test_runtime_client::sc_client::in_mem::Backend; #[test] fn test_leaves_with_complex_block_tree() { diff --git a/client/src/lib.rs b/client/src/lib.rs index 13afbe1865..cfaf08ca7e 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -57,7 +57,7 @@ //! // from your runtime. //! use substrate_test_runtime_client::{LocalExecutor, runtime::Block, runtime::RuntimeApi}; //! -//! let backend = Arc::new(Backend::::new()); +//! let backend = Arc::new(Backend::::new()); //! let client = Client::<_, _, _, RuntimeApi>::new( //! backend.clone(), //! LocalCallExecutor::new( diff --git a/client/src/light/backend.rs b/client/src/light/backend.rs index 3f680e6243..65fd94e323 100644 --- a/client/src/light/backend.rs +++ b/client/src/light/backend.rs @@ -24,12 +24,12 @@ use parking_lot::RwLock; use sp_core::storage::{ChildInfo, OwnedChildInfo}; use sp_core::offchain::storage::InMemOffchainStorage; use sp_state_machine::{ - Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState, ChangesTrieTransaction + Backend as StateBackend, TrieBackend, InMemoryBackend, ChangesTrieTransaction }; use sp_runtime::{generic::BlockId, Justification, Storage}; -use sp_runtime::traits::{Block as BlockT, NumberFor, Zero, Header}; +use sp_runtime::traits::{Block as BlockT, NumberFor, Zero, Header, HasherFor}; use crate::in_mem::{self, check_genesis_storage}; -use sp_blockchain::{ Error as ClientError, Result as ClientResult }; +use sp_blockchain::{Error as ClientError, Result as ClientResult}; use sc_client_api::{ backend::{ AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState, @@ -43,33 +43,32 @@ use sc_client_api::{ }; use crate::light::blockchain::Blockchain; use hash_db::Hasher; -use sp_trie::MemoryDB; const IN_MEMORY_EXPECT_PROOF: &str = "InMemory state backend has Void error type and always succeeds; qed"; /// Light client backend. pub struct Backend { blockchain: Arc>, - genesis_state: RwLock>>, + genesis_state: RwLock>>, import_lock: RwLock<()>, } /// Light block (header and justification) import operation. -pub struct ImportOperation { +pub struct ImportOperation { header: Option, cache: HashMap>, leaf_state: NewBlockState, aux_ops: Vec<(Vec, Option>)>, finalized_blocks: Vec>, set_head: Option>, - storage_update: Option>, - _phantom: ::std::marker::PhantomData, + storage_update: Option>>, + _phantom: std::marker::PhantomData, } /// Either in-memory genesis state, or locally-unavailable state. pub enum GenesisOrUnavailableState { /// Genesis state - storage values are stored in-memory. - Genesis(InMemoryState), + Genesis(InMemoryBackend), /// We know that state exists, but all calls will fail with error, because it /// isn't locally available. Unavailable, @@ -107,16 +106,16 @@ impl AuxStore for Backend { } } -impl ClientBackend for Backend where - Block: BlockT, - S: BlockchainStorage, - H: Hasher, - H::Out: Ord, +impl ClientBackend for Backend> + where + Block: BlockT, + S: BlockchainStorage, + Block::Hash: Ord, { - type BlockImportOperation = ImportOperation; + type BlockImportOperation = ImportOperation; type Blockchain = Blockchain; - type State = GenesisOrUnavailableState; - type ChangesTrieStorage = in_mem::ChangesTrieStorage; + type State = GenesisOrUnavailableState>; + type ChangesTrieStorage = in_mem::ChangesTrieStorage; type OffchainStorage = InMemOffchainStorage; fn begin_operation(&self) -> ClientResult { @@ -179,7 +178,11 @@ impl ClientBackend for Backend where Ok(()) } - fn finalize_block(&self, block: BlockId, _justification: Option) -> ClientResult<()> { + fn finalize_block( + &self, + block: BlockId, + _justification: Option, + ) -> ClientResult<()> { self.blockchain.storage().finalize_header(block) } @@ -227,12 +230,11 @@ impl ClientBackend for Backend where } } -impl RemoteBackend for Backend +impl RemoteBackend for Backend> where Block: BlockT, S: BlockchainStorage + 'static, - H: Hasher, - H::Out: Ord, + Block::Hash: Ord, { fn is_local_state_available(&self, block: &BlockId) -> bool { self.genesis_state.read().is_some() @@ -246,14 +248,13 @@ where } } -impl BlockImportOperation for ImportOperation -where - Block: BlockT, - S: BlockchainStorage, - H: Hasher, - H::Out: Ord, +impl BlockImportOperation for ImportOperation + where + Block: BlockT, + S: BlockchainStorage, + Block::Hash: Ord, { - type State = GenesisOrUnavailableState; + type State = GenesisOrUnavailableState>; fn state(&self) -> ClientResult> { // None means 'locally-stateless' backend @@ -276,17 +277,23 @@ where self.cache = cache; } - fn update_db_storage(&mut self, _update: >::Transaction) -> ClientResult<()> { + fn update_db_storage( + &mut self, + _update: >>::Transaction, + ) -> ClientResult<()> { // we're not storing anything locally => ignore changes Ok(()) } - fn update_changes_trie(&mut self, _update: ChangesTrieTransaction>) -> ClientResult<()> { + fn update_changes_trie( + &mut self, + _update: ChangesTrieTransaction, NumberFor>, + ) -> ClientResult<()> { // we're not storing anything locally => ignore changes Ok(()) } - fn reset_storage(&mut self, input: Storage) -> ClientResult { + fn reset_storage(&mut self, input: Storage) -> ClientResult { check_genesis_storage(&input)?; // this is only called when genesis block is imported => shouldn't be performance bottleneck @@ -303,8 +310,8 @@ where storage.insert(Some((child_key, storage_child.child_info)), storage_child.data); } - let storage_update: InMemoryState = storage.into(); - let (storage_root, _) = storage_update.full_storage_root(::std::iter::empty(), child_delta); + let storage_update = InMemoryBackend::from(storage); + let (storage_root, _) = storage_update.full_storage_root(std::iter::empty(), child_delta); self.storage_update = Some(storage_update); Ok(storage_root) @@ -351,8 +358,8 @@ impl StateBackend for GenesisOrUnavailableState H::Out: Ord + codec::Codec, { type Error = ClientError; - type Transaction = (); - type TrieBackendStorage = MemoryDB; + type Transaction = as StateBackend>::Transaction; + type TrieBackendStorage = as StateBackend>::TrieBackendStorage; fn storage(&self, key: &[u8]) -> ClientResult>> { match *self { @@ -445,8 +452,8 @@ impl StateBackend for GenesisOrUnavailableState { match *self { GenesisOrUnavailableState::Genesis(ref state) => - (state.storage_root(delta).0, ()), - GenesisOrUnavailableState::Unavailable => (H::Out::default(), ()), + state.storage_root(delta), + GenesisOrUnavailableState::Unavailable => Default::default(), } } @@ -462,9 +469,10 @@ impl StateBackend for GenesisOrUnavailableState match *self { GenesisOrUnavailableState::Genesis(ref state) => { let (root, is_equal, _) = state.child_storage_root(storage_key, child_info, delta); - (root, is_equal, ()) + (root, is_equal, Default::default()) }, - GenesisOrUnavailableState::Unavailable => (H::Out::default(), true, ()), + GenesisOrUnavailableState::Unavailable => + (H::Out::default(), true, Default::default()), } } @@ -528,9 +536,9 @@ mod tests { #[test] fn light_aux_store_is_updated_via_non_importing_op() { let backend = Backend::new(Arc::new(DummyBlockchain::new(DummyStorage::new()))); - let mut op = ClientBackend::::begin_operation(&backend).unwrap(); - BlockImportOperation::::insert_aux(&mut op, vec![(vec![1], Some(vec![2]))]).unwrap(); - ClientBackend::::commit_operation(&backend, op).unwrap(); + let mut op = ClientBackend::::begin_operation(&backend).unwrap(); + BlockImportOperation::::insert_aux(&mut op, vec![(vec![1], Some(vec![2]))]).unwrap(); + ClientBackend::::commit_operation(&backend, op).unwrap(); assert_eq!(AuxStore::get_aux(&backend, &[1]).unwrap(), Some(vec![2])); } diff --git a/client/src/light/call_executor.rs b/client/src/light/call_executor.rs index 86b5e8829d..45d9bf303c 100644 --- a/client/src/light/call_executor.rs +++ b/client/src/light/call_executor.rs @@ -21,22 +21,19 @@ use std::{ }; use codec::{Encode, Decode}; -use sp_core::{ - H256, Blake2Hasher, convert_hash, NativeOrEncoded, - traits::CodeExecutor, -}; +use sp_core::{convert_hash, NativeOrEncoded, traits::CodeExecutor}; use sp_runtime::{ - generic::BlockId, traits::{One, Block as BlockT, Header as HeaderT, NumberFor}, + generic::BlockId, traits::{One, Block as BlockT, Header as HeaderT, HasherFor}, }; use sp_externalities::Extensions; use sp_state_machine::{ self, Backend as StateBackend, OverlayedChanges, ExecutionStrategy, create_proof_check_backend, - execution_proof_check_on_trie_backend, ExecutionManager, ChangesTrieTransaction, StorageProof, + execution_proof_check_on_trie_backend, ExecutionManager, StorageProof, merge_storage_proofs, }; use hash_db::Hasher; -use sp_api::{ProofRecorder, InitializeBlock}; +use sp_api::{ProofRecorder, InitializeBlock, StorageTransactionCache}; use sp_blockchain::{Error as ClientError, Result as ClientResult}; @@ -71,15 +68,17 @@ impl Clone for GenesisCallExecutor { } } -impl CallExecutor for +impl CallExecutor for GenesisCallExecutor where - Block: BlockT, - B: RemoteBackend, - Local: CallExecutor, + Block: BlockT, + B: RemoteBackend, + Local: CallExecutor, { type Error = ClientError; + type Backend = B; + fn call( &self, id: &BlockId, @@ -110,6 +109,7 @@ impl CallExecutor for method: &str, call_data: &[u8], changes: &RefCell, + _: Option<&RefCell>>, initialize_block: InitializeBlock<'a, Block>, _manager: ExecutionManager, native_call: Option, @@ -135,6 +135,7 @@ impl CallExecutor for method, call_data, changes, + None, initialize_block, ExecutionManager::NativeWhenPossible, native_call, @@ -152,36 +153,12 @@ impl CallExecutor for } } - fn call_at_state< - S: StateBackend, - FF: FnOnce( - Result, Self::Error>, - Result, Self::Error> - ) -> Result, Self::Error>, - R: Encode + Decode + PartialEq, - NC: FnOnce() -> result::Result + UnwindSafe, - >(&self, - _state: &S, - _changes: &mut OverlayedChanges, - _method: &str, - _call_data: &[u8], - _manager: ExecutionManager, - _native_call: Option, - _extensions: Option, - ) -> ClientResult<( - NativeOrEncoded, - (S::Transaction, ::Out), - Option>>, - )> { - Err(ClientError::NotAvailableOnLightClient) - } - - fn prove_at_trie_state>( + fn prove_at_trie_state>>( &self, - _state: &sp_state_machine::TrieBackend, + _state: &sp_state_machine::TrieBackend>, _changes: &mut OverlayedChanges, _method: &str, - _call_data: &[u8] + _call_data: &[u8], ) -> ClientResult<(Vec, StorageProof)> { Err(ClientError::NotAvailableOnLightClient) } @@ -203,12 +180,15 @@ pub fn prove_execution( call_data: &[u8], ) -> ClientResult<(Vec, StorageProof)> where - Block: BlockT, - S: StateBackend, - E: CallExecutor, + Block: BlockT, + S: StateBackend>, + E: CallExecutor, { let trie_state = state.as_trie_backend() - .ok_or_else(|| Box::new(sp_state_machine::ExecutionError::UnableToGenerateProof) as Box)?; + .ok_or_else(|| + Box::new(sp_state_machine::ExecutionError::UnableToGenerateProof) as + Box + )?; // prepare execution environment + record preparation proof let mut changes = Default::default(); @@ -220,7 +200,12 @@ pub fn prove_execution( )?; // execute method + record execution proof - let (result, exec_proof) = executor.prove_at_trie_state(&trie_state, &mut changes, method, call_data)?; + let (result, exec_proof) = executor.prove_at_trie_state( + &trie_state, + &mut changes, + method, + call_data, + )?; let total_proof = merge_storage_proofs(vec![init_proof, exec_proof]); Ok((result, total_proof)) @@ -238,7 +223,8 @@ pub fn check_execution_proof( where Header: HeaderT, E: CodeExecutor, - H: Hasher, + H: Hasher, + H::Out: Ord + codec::Codec + 'static, { check_execution_proof_with_make_header::( executor, @@ -263,7 +249,8 @@ fn check_execution_proof_with_make_header, + H: Hasher, + H::Out: Ord + codec::Codec + 'static, { let local_state_root = request.header.state_root(); let root: H::Out = convert_hash(&local_state_root); @@ -294,17 +281,21 @@ fn check_execution_proof_with_make_header for DummyCallExecutor { + impl CallExecutor for DummyCallExecutor { type Error = ClientError; + type Backend = substrate_test_runtime_client::Backend; + fn call( &self, _id: &BlockId, @@ -332,6 +323,12 @@ mod tests { _method: &str, _call_data: &[u8], _changes: &RefCell, + _storage_transaction_cache: Option<&RefCell< + StorageTransactionCache< + Block, + >::State, + > + >>, _initialize_block: InitializeBlock<'a, Block>, _execution_manager: ExecutionManager, _native_call: Option, @@ -345,36 +342,9 @@ mod tests { unreachable!() } - fn call_at_state< - S: sp_state_machine::Backend, - F: FnOnce( - Result, Self::Error>, - Result, Self::Error> - ) -> Result, Self::Error>, - R: Encode + Decode + PartialEq, - NC: FnOnce() -> result::Result + UnwindSafe, - >(&self, - _state: &S, - _overlay: &mut OverlayedChanges, - _method: &str, - _call_data: &[u8], - _manager: ExecutionManager, - _native_call: Option, - _extensions: Option, - ) -> Result< - ( - NativeOrEncoded, - (S::Transaction, H256), - Option>>, - ), - ClientError, - > { - unreachable!() - } - - fn prove_at_trie_state>( + fn prove_at_trie_state>>( &self, - _trie_state: &sp_state_machine::TrieBackend, + _trie_state: &sp_state_machine::TrieBackend>, _overlay: &mut OverlayedChanges, _method: &str, _call_data: &[u8] @@ -457,13 +427,13 @@ mod tests { } // prepare remote client - let remote_client = substrate_test_runtime_client::new(); + let mut remote_client = substrate_test_runtime_client::new(); for i in 1u32..3u32 { let mut digest = Digest::default(); digest.push(sp_runtime::generic::DigestItem::Other::(i.to_le_bytes().to_vec())); remote_client.import_justified( BlockOrigin::Own, - remote_client.new_block(digest).unwrap().bake().unwrap(), + remote_client.new_block(digest).unwrap().build().unwrap().block, Default::default(), ).unwrap(); } @@ -494,7 +464,7 @@ mod tests { #[test] fn code_is_executed_at_genesis_only() { - let backend = Arc::new(InMemBackend::::new()); + let backend = Arc::new(InMemBackend::::new()); let def = H256::default(); let header0 = substrate_test_runtime_client::runtime::Header::new(0, def, def, def, Default::default()); let hash0 = header0.hash(); diff --git a/client/src/light/fetcher.rs b/client/src/light/fetcher.rs index 3dd0b344b8..d746b3abe5 100644 --- a/client/src/light/fetcher.rs +++ b/client/src/light/fetcher.rs @@ -22,7 +22,7 @@ use std::marker::PhantomData; use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; use codec::{Decode, Encode}; -use sp_core::{convert_hash, traits::CodeExecutor, H256}; +use sp_core::{convert_hash, traits::CodeExecutor}; use sp_runtime::traits::{ Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, SimpleArithmetic, CheckedConversion, Zero, @@ -198,7 +198,8 @@ impl FetchChecker for LightDataChecker where Block: BlockT, E: CodeExecutor, - H: Hasher, + H: Hasher, + H::Out: Ord + codec::Codec + 'static, S: BlockchainStorage, { fn check_header_proof( @@ -214,8 +215,8 @@ impl FetchChecker for LightDataChecker request.cht_root, request.block, remote_header_hash, - remote_proof) - .map(|_| remote_header) + remote_proof, + ).map(|_| remote_header) } fn check_read_proof( @@ -331,7 +332,7 @@ pub mod tests { use sp_blockchain::Error as ClientError; use sc_client_api::backend::NewBlockState; use substrate_test_runtime_client::{ - self, ClientExt, blockchain::HeaderBackend, AccountKeyring, + blockchain::HeaderBackend, AccountKeyring, ClientBlockImportExt, runtime::{self, Hash, Block, Header, Extrinsic} }; use sp_consensus::BlockOrigin; @@ -442,13 +443,15 @@ pub mod tests { fn prepare_for_header_proof_check(insert_cht: bool) -> (TestChecker, Hash, Header, StorageProof) { // prepare remote client - let remote_client = substrate_test_runtime_client::new(); + let mut remote_client = substrate_test_runtime_client::new(); let mut local_headers_hashes = Vec::new(); for i in 0..4 { - 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()))); + let block = remote_client.new_block(Default::default()).unwrap().build().unwrap().block; + remote_client.import(BlockOrigin::Own, block).unwrap(); + local_headers_hashes.push( + remote_client.block_hash(i + 1) + .map_err(|_| ClientError::Backend("TestError".into())) + ); } // 'fetch' header proof from remote node diff --git a/client/src/light/mod.rs b/client/src/light/mod.rs index ed36bccc11..5052b36d7f 100644 --- a/client/src/light/mod.rs +++ b/client/src/light/mod.rs @@ -24,9 +24,9 @@ pub mod fetcher; use std::sync::Arc; use sc_executor::RuntimeInfo; -use sp_core::{H256, Blake2Hasher, traits::CodeExecutor}; +use sp_core::traits::CodeExecutor; use sp_runtime::BuildStorage; -use sp_runtime::traits::Block as BlockT; +use sp_runtime::traits::{Block as BlockT, HasherFor}; use sp_blockchain::Result as ClientResult; use crate::call_executor::LocalCallExecutor; @@ -45,7 +45,7 @@ pub fn new_light_blockchain>(storage: S) -> A } /// Create an instance of light client backend. -pub fn new_light_backend(blockchain: Arc>) -> Arc> +pub fn new_light_backend(blockchain: Arc>) -> Arc>> where B: BlockT, S: BlockchainStorage, @@ -55,15 +55,22 @@ pub fn new_light_backend(blockchain: Arc>) -> Arc( - backend: Arc>, + backend: Arc>>, genesis_storage: GS, code_executor: E, -) -> ClientResult, GenesisCallExecutor< - Backend, - LocalCallExecutor, E> ->, B, RA>> +) -> ClientResult< + Client< + Backend>, + GenesisCallExecutor< + Backend>, + LocalCallExecutor>, E> + >, + B, + RA + > + > where - B: BlockT, + B: BlockT, S: BlockchainStorage + 'static, GS: BuildStorage, E: CodeExecutor + RuntimeInfo, @@ -84,7 +91,7 @@ pub fn new_light( pub fn new_fetch_checker>( blockchain: Arc>, executor: E, -) -> LightDataChecker +) -> LightDataChecker, B, S> where E: CodeExecutor, { diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index 8979ecc7e0..8495b8b65f 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -18,19 +18,21 @@ use std::{marker::PhantomData, pin::Pin, sync::Arc}; use codec::{Decode, Encode}; -use futures::{channel::oneshot, executor::{ThreadPool, ThreadPoolBuilder}, future::{Future, FutureExt, ready}}; +use futures::{ + channel::oneshot, executor::{ThreadPool, ThreadPoolBuilder}, future::{Future, FutureExt, ready}, +}; use sc_client_api::{ blockchain::HeaderBackend, light::{Fetcher, RemoteCallRequest} }; -use sp_core::{H256, Blake2Hasher, Hasher}; +use sp_core::Hasher; use sp_runtime::{ - generic::BlockId, - traits::{Block as BlockT, BlockIdTo, ProvideRuntimeApi}, + generic::BlockId, traits::{self, Block as BlockT, BlockIdTo, Header as HeaderT, Hash as HashT}, transaction_validity::TransactionValidity, }; use sp_transaction_pool::runtime_api::TaggedTransactionQueue; +use sp_api::ProvideRuntimeApi; use crate::error::{self, Error}; @@ -43,7 +45,8 @@ pub struct FullChainApi { impl FullChainApi where Block: BlockT, - Client: ProvideRuntimeApi + BlockIdTo { + Client: ProvideRuntimeApi + BlockIdTo, +{ /// Create new transaction pool logic. pub fn new(client: Arc) -> Self { FullChainApi { @@ -59,13 +62,13 @@ impl FullChainApi where } impl sc_transaction_graph::ChainApi for FullChainApi where - Block: BlockT, - Client: ProvideRuntimeApi + BlockIdTo + 'static + Send + Sync, + Block: BlockT, + Client: ProvideRuntimeApi + BlockIdTo + 'static + Send + Sync, Client::Api: TaggedTransactionQueue, sp_api::ApiErrorFor: Send, { type Block = Block; - type Hash = H256; + type Hash = Block::Hash; type Error = error::Error; type ValidationFuture = Pin> + Send>>; @@ -110,7 +113,7 @@ impl sc_transaction_graph::ChainApi for FullChainApi) -> (Self::Hash, usize) { ex.using_encoded(|x| { - (Blake2Hasher::hash(x), x.len()) + (traits::HasherFor::::hash(x), x.len()) }) } } @@ -138,12 +141,12 @@ impl LightChainApi where } impl sc_transaction_graph::ChainApi for LightChainApi where - Block: BlockT, + Block: BlockT, Client: HeaderBackend + 'static, F: Fetcher + 'static, { type Block = Block; - type Hash = H256; + type Hash = Block::Hash; type Error = error::Error; type ValidationFuture = Box> + Send + Unpin>; @@ -191,7 +194,7 @@ impl sc_transaction_graph::ChainApi for LightChainApi) -> (Self::Hash, usize) { ex.using_encoded(|x| { - (Blake2Hasher::hash(x), x.len()) + (<::Hashing as HashT>::hash(x), x.len()) }) } } diff --git a/client/transaction-pool/src/maintainer.rs b/client/transaction-pool/src/maintainer.rs index 2414778e8a..7ad9ed3cbf 100644 --- a/client/transaction-pool/src/maintainer.rs +++ b/client/transaction-pool/src/maintainer.rs @@ -30,14 +30,13 @@ use sc_client_api::{ client::BlockBody, light::{Fetcher, RemoteBodyRequest}, }; -use sp_core::{Blake2Hasher, H256}; use sp_runtime::{ generic::BlockId, - traits::{Block as BlockT, Extrinsic, Header, NumberFor, ProvideRuntimeApi, SimpleArithmetic}, + traits::{Block as BlockT, Extrinsic, Header, NumberFor, SimpleArithmetic}, }; use sp_blockchain::HeaderBackend; -use sp_transaction_pool::TransactionPoolMaintainer; -use sp_transaction_pool::runtime_api::TaggedTransactionQueue; +use sp_transaction_pool::{TransactionPoolMaintainer, runtime_api::TaggedTransactionQueue}; +use sp_api::ProvideRuntimeApi; use sc_transaction_graph::{self, ChainApi}; @@ -61,10 +60,10 @@ impl TransactionPoolMaintainer for FullBasicPoolMaintainer where - Block: BlockT::Out>, - Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, + Block: BlockT, + Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, Client::Api: TaggedTransactionQueue, - PoolApi: ChainApi + 'static, + PoolApi: ChainApi + 'static, { type Block = Block; type Hash = Block::Hash; @@ -154,10 +153,10 @@ pub struct LightBasicPoolMaintainer impl LightBasicPoolMaintainer where - Block: BlockT::Out>, - Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, + Block: BlockT, + Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, Client::Api: TaggedTransactionQueue, - PoolApi: ChainApi + 'static, + PoolApi: ChainApi + 'static, F: Fetcher + 'static, { /// Create light pool maintainer with default constants. @@ -261,10 +260,10 @@ impl TransactionPoolMaintainer for LightBasicPoolMaintainer where - Block: BlockT::Out>, - Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, + Block: BlockT, + Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, Client::Api: TaggedTransactionQueue, - PoolApi: ChainApi + 'static, + PoolApi: ChainApi + 'static, F: Fetcher + 'static, { type Block = Block; @@ -362,7 +361,7 @@ mod tests { #[test] fn should_remove_transactions_from_the_full_pool() { let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let client = Arc::new(client); + let mut client = Arc::new(client); let pool = sc_transaction_graph::Pool::new(Default::default(), FullChainApi::new(client.clone())); let pool = Arc::new(pool); let transaction = Transfer { @@ -379,7 +378,7 @@ mod tests { // import the block let mut builder = client.new_block(Default::default()).unwrap(); builder.push(transaction.clone()).unwrap(); - let block = builder.bake().unwrap(); + let block = builder.build().unwrap().block; let id = BlockId::hash(block.header().hash()); client.import(BlockOrigin::Own, block).unwrap(); @@ -562,7 +561,7 @@ mod tests { #[test] fn should_add_reverted_transactions_to_the_pool() { let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let client = Arc::new(client); + let mut client = Arc::new(client); let pool = sc_transaction_graph::Pool::new(Default::default(), FullChainApi::new(client.clone())); let pool = Arc::new(pool); let transaction = Transfer { @@ -579,7 +578,7 @@ mod tests { // import the block let mut builder = client.new_block(Default::default()).unwrap(); builder.push(transaction.clone()).unwrap(); - let block = builder.bake().unwrap(); + let block = builder.build().unwrap().block; let block1_hash = block.header().hash(); let id = BlockId::hash(block1_hash.clone()); client.import(BlockOrigin::Own, block).unwrap(); @@ -593,8 +592,12 @@ mod tests { assert_eq!(pool.status().future, 0); // import second block - let builder = client.new_block_at(&BlockId::hash(best.hash()), Default::default()).unwrap(); - let block = builder.bake().unwrap(); + let builder = client.new_block_at( + &BlockId::hash(best.hash()), + Default::default(), + false, + ).unwrap(); + let block = builder.build().unwrap().block; let id = BlockId::hash(block.header().hash()); client.import(BlockOrigin::Own, block).unwrap(); diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index 3b5b495b0c..c563d9f727 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -14,6 +14,7 @@ sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-rpc = { version = "2.0.0", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../../primitives/api" } pallet-contracts-rpc-runtime-api = { version = "2.0.0", path = "./runtime-api" } [dev-dependencies] diff --git a/frame/contracts/rpc/src/lib.rs b/frame/contracts/rpc/src/lib.rs index 3bbcc81acb..4c39bc9516 100644 --- a/frame/contracts/rpc/src/lib.rs +++ b/frame/contracts/rpc/src/lib.rs @@ -25,10 +25,8 @@ use jsonrpc_derive::rpc; use sp_core::{H256, Bytes}; use sp_rpc::number; use serde::{Deserialize, Serialize}; -use sp_runtime::{ - generic::BlockId, - traits::{Block as BlockT, ProvideRuntimeApi}, -}; +use sp_runtime::{generic::BlockId, traits::Block as BlockT}; +use sp_api::ProvideRuntimeApi; pub use self::gen_client::Client as ContractsClient; pub use pallet_contracts_rpc_runtime_api::{ @@ -156,9 +154,7 @@ impl ContractsApi<::Hash, Account for Contracts where Block: BlockT, - C: Send + Sync + 'static, - C: ProvideRuntimeApi, - C: HeaderBackend, + C: Send + Sync + 'static + ProvideRuntimeApi + HeaderBackend, C::Api: ContractsRuntimeApi, AccountId: Codec, Balance: Codec, diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index f089f22912..3880b6cbb8 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -231,7 +231,6 @@ mod tests { assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight, ord_parameter_types }; - use frame_support::traits::Contains; use sp_core::H256; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 10c0bdfc51..9e7678a7ed 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -178,7 +178,7 @@ pub trait Trait: 'static + Eq + Clone { /// The output of the `Hashing` function. type Hash: - Parameter + Member + MaybeSerializeDeserialize + Debug + MaybeDisplay + SimpleBitOps + Parameter + Member + MaybeSerializeDeserialize + Debug + MaybeDisplay + SimpleBitOps + Ord + Default + Copy + CheckEqual + sp_std::hash::Hash + AsRef<[u8]> + AsMut<[u8]>; /// The hashing system (algorithm) being used in the runtime (e.g. Blake2). diff --git a/frame/transaction-payment/rpc/Cargo.toml b/frame/transaction-payment/rpc/Cargo.toml index f7e886fd0d..b8d1c35492 100644 --- a/frame/transaction-payment/rpc/Cargo.toml +++ b/frame/transaction-payment/rpc/Cargo.toml @@ -13,5 +13,6 @@ sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-rpc = { version = "2.0.0", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../../primitives/api" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0", path = "./runtime-api" } diff --git a/frame/transaction-payment/rpc/src/lib.rs b/frame/transaction-payment/rpc/src/lib.rs index 83f5e82b80..aadc33759e 100644 --- a/frame/transaction-payment/rpc/src/lib.rs +++ b/frame/transaction-payment/rpc/src/lib.rs @@ -21,10 +21,8 @@ use codec::{Codec, Decode}; use sp_blockchain::HeaderBackend; use jsonrpc_core::{Error as RpcError, ErrorCode, Result}; use jsonrpc_derive::rpc; -use sp_runtime::{ - generic::BlockId, - traits::{Block as BlockT, ProvideRuntimeApi, UniqueSaturatedInto}, -}; +use sp_runtime::{generic::BlockId, traits::{Block as BlockT, UniqueSaturatedInto}}; +use sp_api::ProvideRuntimeApi; use sp_core::Bytes; use pallet_transaction_payment_rpc_runtime_api::CappedDispatchInfo; pub use pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi as TransactionPaymentRuntimeApi; @@ -74,9 +72,7 @@ impl TransactionPaymentApi<::Hash for TransactionPayment where Block: BlockT, - C: Send + Sync + 'static, - C: ProvideRuntimeApi, - C: HeaderBackend, + C: Send + Sync + 'static + ProvideRuntimeApi + HeaderBackend, C::Api: TransactionPaymentRuntimeApi, Balance: Codec + UniqueSaturatedInto, Extrinsic: Codec + Send + Sync + 'static, diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index 5085e8faf3..1e3e555456 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -12,6 +12,7 @@ sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-runtime = { version = "2.0.0", default-features = false, path = "../runtime" } sp-version = { version = "2.0.0", default-features = false, path = "../version" } sp-state-machine = { version = "2.0.0", optional = true, path = "../../primitives/state-machine" } +hash-db = { version = "0.15.2", optional = true } [dev-dependencies] sp-test-primitives = { version = "2.0.0", path = "../test-primitives" } @@ -25,4 +26,5 @@ std = [ "sp-runtime/std", "sp-state-machine", "sp-version/std", + "hash-db", ] diff --git a/primitives/api/proc-macro/src/decl_runtime_apis.rs b/primitives/api/proc-macro/src/decl_runtime_apis.rs index 1ffd165c10..459707bdb5 100644 --- a/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -16,7 +16,7 @@ use crate::utils::{ generate_crate_access, generate_hidden_includes, generate_runtime_mod_name_for_trait, - fold_fn_decl_for_client_side, unwrap_or_error, extract_parameter_names_types_and_borrows, + fold_fn_decl_for_client_side, extract_parameter_names_types_and_borrows, generate_native_call_generator_fn_name, return_type_extract_type, generate_method_runtime_api_impl_name, generate_call_api_at_fn_name, prefix_function_with_trait, replace_wild_card_parameter_names, @@ -399,7 +399,7 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { R: #crate_::Encode + #crate_::Decode + PartialEq, NC: FnOnce() -> std::result::Result + std::panic::UnwindSafe, Block: #crate_::BlockT, - T: #crate_::CallRuntimeAt, + T: #crate_::CallApiAt, C: #crate_::Core, >( call_runtime_at: &T, @@ -407,6 +407,9 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { at: &#crate_::BlockId, args: Vec, changes: &std::cell::RefCell<#crate_::OverlayedChanges>, + storage_transaction_cache: &std::cell::RefCell< + #crate_::StorageTransactionCache + >, initialized_block: &std::cell::RefCell>>, native_call: Option, context: #crate_::ExecutionContext, @@ -426,34 +429,40 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { if version.apis.iter().any(|(s, v)| { s == &ID && *v < #versions }) { - let ret = call_runtime_at.call_api_at:: _, _>( + let params = #crate_::CallApiAtParams::<_, _, fn() -> _, _> { core_api, at, - #old_names, - args, - changes, + function: #old_names, + native_call: None, + arguments: args, + overlayed_changes: changes, + storage_transaction_cache, initialize_block, - None, context, recorder, - )?; + }; + + let ret = call_runtime_at.call_api_at(params)?; update_initialized_block(); - return Ok(ret); + return Ok(ret) } )* - let ret = call_runtime_at.call_api_at( + let params = #crate_::CallApiAtParams { core_api, at, - #trait_fn_name, - args, - changes, - initialize_block, + function: #trait_fn_name, native_call, + arguments: args, + overlayed_changes: changes, + storage_transaction_cache, + initialize_block, context, recorder, - )?; + }; + + let ret = call_runtime_at.call_api_at(params)?; update_initialized_block(); Ok(ret) @@ -465,7 +474,7 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { } /// Generate the declaration of the trait for the runtime. -fn generate_runtime_decls(decls: &[ItemTrait]) -> TokenStream { +fn generate_runtime_decls(decls: &[ItemTrait]) -> Result { let mut result = Vec::new(); for decl in decls { @@ -473,12 +482,12 @@ fn generate_runtime_decls(decls: &[ItemTrait]) -> TokenStream { extend_generics_with_block(&mut decl.generics); let mod_name = generate_runtime_mod_name_for_trait(&decl.ident); let found_attributes = remove_supported_attributes(&mut decl.attrs); - let api_version = unwrap_or_error(get_api_version(&found_attributes).map(|v| { + let api_version = get_api_version(&found_attributes).map(|v| { generate_runtime_api_version(v as u32) - })); + })?; let id = generate_runtime_api_id(&decl.ident.to_string()); - let call_api_at_calls = unwrap_or_error(generate_call_api_at_calls(&decl)); + let call_api_at_calls = generate_call_api_at_calls(&decl)?; // Remove methods that have the `changed_in` attribute as they are not required for the // runtime anymore. @@ -495,7 +504,7 @@ fn generate_runtime_decls(decls: &[ItemTrait]) -> TokenStream { r => Some(r.clone()), }).collect(); - let native_call_generators = unwrap_or_error(generate_native_call_generators(&decl)); + let native_call_generators = generate_native_call_generators(&decl)?; result.push(quote!( #[doc(hidden)] @@ -517,7 +526,7 @@ fn generate_runtime_decls(decls: &[ItemTrait]) -> TokenStream { )); } - quote!( #( #result )* ) + Ok(quote!( #( #result )* )) } /// Modify the given runtime api declaration to be usable on the client side. @@ -722,7 +731,7 @@ impl<'a> Fold for ToClientSideDecl<'a> { 'static + Send + Sync - + #crate_::ApiExt<#block_ident> + + #crate_::ApiErrorExt ); } else { // Add the `Core` runtime api as super trait. @@ -823,7 +832,7 @@ fn get_api_version(found_attributes: &HashMap<&'static str, Attribute>) -> Resul } /// Generate the declaration of the trait for the client side. -fn generate_client_side_decls(decls: &[ItemTrait]) -> TokenStream { +fn generate_client_side_decls(decls: &[ItemTrait]) -> Result { let mut result = Vec::new(); for decl in decls { @@ -848,14 +857,12 @@ fn generate_client_side_decls(decls: &[ItemTrait]) -> TokenStream { let api_version = get_api_version(&found_attributes); - let runtime_info = unwrap_or_error( - api_version.map(|v| generate_runtime_info_impl(&decl, v)) - ); + let runtime_info = api_version.map(|v| generate_runtime_info_impl(&decl, v))?; result.push(quote!( #decl #runtime_info #( #errors )* )); } - quote!( #( #result )* ) + Ok(quote!( #( #result )* )) } /// Checks that a trait declaration is in the format we expect. @@ -908,15 +915,17 @@ impl<'ast> Visit<'ast> for CheckTraitDecl { } /// Check that the trait declarations are in the format we expect. -fn check_trait_decls(decls: &[ItemTrait]) -> Option { +fn check_trait_decls(decls: &[ItemTrait]) -> Result<()> { let mut checker = CheckTraitDecl { errors: Vec::new() }; decls.iter().for_each(|decl| visit::visit_item_trait(&mut checker, &decl)); - if checker.errors.is_empty() { - None + if let Some(err) = checker.errors.pop() { + Err(checker.errors.into_iter().fold(err, |mut err, other| { + err.combine(other); + err + })) } else { - let errors = checker.errors.into_iter().map(|e| e.to_compile_error()); - Some(quote!( #( #errors )* )) + Ok(()) } } @@ -925,19 +934,23 @@ pub fn decl_runtime_apis_impl(input: proc_macro::TokenStream) -> proc_macro::Tok // Parse all trait declarations let RuntimeApiDecls { decls: api_decls } = parse_macro_input!(input as RuntimeApiDecls); - if let Some(errors) = check_trait_decls(&api_decls) { - return errors.into(); - } + decl_runtime_apis_impl_inner(&api_decls).unwrap_or_else(|e| e.to_compile_error()).into() +} + +fn decl_runtime_apis_impl_inner(api_decls: &[ItemTrait]) -> Result { + check_trait_decls(&api_decls)?; let hidden_includes = generate_hidden_includes(HIDDEN_INCLUDES_ID); - let runtime_decls = generate_runtime_decls(&api_decls); - let client_side_decls = generate_client_side_decls(&api_decls); + let runtime_decls = generate_runtime_decls(api_decls)?; + let client_side_decls = generate_client_side_decls(api_decls)?; - quote!( - #hidden_includes + Ok( + quote!( + #hidden_includes - #runtime_decls + #runtime_decls - #client_side_decls - ).into() + #client_side_decls + ) + ) } diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index 5f8d565052..dc4031fbc4 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -15,10 +15,11 @@ // along with Substrate. If not, see . use crate::utils::{ - unwrap_or_error, generate_crate_access, generate_hidden_includes, + generate_crate_access, generate_hidden_includes, generate_runtime_mod_name_for_trait, generate_method_runtime_api_impl_name, extract_parameter_names_types_and_borrows, generate_native_call_generator_fn_name, return_type_extract_type, generate_call_api_at_fn_name, prefix_function_with_trait, + extract_all_signature_types, }; use proc_macro2::{Span, TokenStream}; @@ -28,7 +29,7 @@ use quote::quote; use syn::{ spanned::Spanned, parse_macro_input, Ident, Type, ItemImpl, Path, Signature, ImplItem, parse::{Parse, ParseStream, Result, Error}, PathArguments, GenericArgument, TypePath, - fold::{self, Fold}, parse_quote + fold::{self, Fold}, parse_quote, }; use std::{collections::HashSet, iter}; @@ -49,7 +50,11 @@ impl Parse for RuntimeApiImpls { impls.push(ItemImpl::parse(input)?); } - Ok(Self { impls }) + if impls.is_empty() { + Err(Error::new(Span::call_site(), "No api implementation given!")) + } else { + Ok(Self { impls }) + } } } @@ -222,59 +227,69 @@ fn generate_wasm_interface(impls: &[ItemImpl]) -> Result { Ok(quote!( #( #impl_calls )* )) } -fn generate_block_and_block_id_ty( - runtime: &Type, - trait_: &'static str, - assoc_type: &'static str, -) -> (TokenStream, TokenStream) { +fn generate_runtime_api_base_structures() -> Result { let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); - let trait_ = Ident::new(trait_, Span::call_site()); - let assoc_type = Ident::new(assoc_type, Span::call_site()); - - let block = quote!( <#runtime as #crate_::#trait_>::#assoc_type ); - let block_id = quote!( #crate_::BlockId<#block> ); - - (block, block_id) -} - -fn generate_node_block_and_block_id_ty(runtime: &Type) -> (TokenStream, TokenStream) { - generate_block_and_block_id_ty(runtime, "GetNodeBlockType", "NodeBlock") -} - -fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result { - let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); - let runtime = &impls.get(0).ok_or_else(|| - Error::new(Span::call_site(), "No api implementation given!") - )?.self_ty; - let (block, block_id) = generate_node_block_and_block_id_ty(runtime); Ok(quote!( pub struct RuntimeApi {} /// Implements all runtime apis for the client side. #[cfg(any(feature = "std", test))] - pub struct RuntimeApiImpl + 'static> { + pub struct RuntimeApiImpl + 'static> + where + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + C::StateBackend: #crate_::StateBackend<#crate_::HasherFor>, + { call: &'static C, commit_on_success: std::cell::RefCell, - initialized_block: std::cell::RefCell>, + initialized_block: std::cell::RefCell>>, changes: std::cell::RefCell<#crate_::OverlayedChanges>, - recorder: Option<#crate_::ProofRecorder<#block>>, + storage_transaction_cache: std::cell::RefCell< + #crate_::StorageTransactionCache + >, + recorder: Option<#crate_::ProofRecorder>, } // `RuntimeApi` itself is not threadsafe. However, an instance is only available in a // `ApiRef` object and `ApiRef` also has an associated lifetime. This lifetimes makes it // impossible to move `RuntimeApi` into another thread. #[cfg(any(feature = "std", test))] - unsafe impl> Send for RuntimeApiImpl {} + unsafe impl> Send + for RuntimeApiImpl + where + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + C::StateBackend: #crate_::StateBackend<#crate_::HasherFor>, + {} + #[cfg(any(feature = "std", test))] - unsafe impl> Sync for RuntimeApiImpl {} + unsafe impl> Sync + for RuntimeApiImpl + where + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + C::StateBackend: #crate_::StateBackend<#crate_::HasherFor>, + {} #[cfg(any(feature = "std", test))] - impl> #crate_::ApiExt<#block> for RuntimeApiImpl { + impl> #crate_::ApiErrorExt + for RuntimeApiImpl + where + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + C::StateBackend: #crate_::StateBackend<#crate_::HasherFor>, + { type Error = C::Error; + } + + #[cfg(any(feature = "std", test))] + impl> #crate_::ApiExt for + RuntimeApiImpl + where + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + C::StateBackend: #crate_::StateBackend<#crate_::HasherFor>, + { + type StateBackend = C::StateBackend; fn map_api_result std::result::Result, R, E>( &self, - map_call: F + map_call: F, ) -> std::result::Result where Self: Sized { *self.commit_on_success.borrow_mut() = false; let res = map_call(self); @@ -287,7 +302,7 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result, ) -> std::result::Result<#crate_::RuntimeVersion, C::Error> { self.call.runtime_version_at(at) } @@ -307,13 +322,37 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result, #crate_::NumberFor> + >( + &self, + backend: &Self::StateBackend, + changes_trie_storage: Option<&T>, + parent_hash: Block::Hash, + ) -> std::result::Result< + #crate_::StorageChanges, + String + > where Self: Sized { + self.initialized_block.borrow_mut().take(); + self.changes.replace(Default::default()).into_storage_changes( + backend, + changes_trie_storage, + parent_hash, + self.storage_transaction_cache.replace(Default::default()), + ) + } } #[cfg(any(feature = "std", test))] - impl + 'static> #crate_::ConstructRuntimeApi<#block, C> + impl #crate_::ConstructRuntimeApi for RuntimeApi + where + C: #crate_::CallApiAt + 'static, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + C::StateBackend: #crate_::StateBackend<#crate_::HasherFor>, { - type RuntimeApi = RuntimeApiImpl; + type RuntimeApi = RuntimeApiImpl; fn construct_runtime_api<'a>( call: &'a C, @@ -324,20 +363,26 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result> RuntimeApiImpl { + impl> RuntimeApiImpl + where + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + C::StateBackend: #crate_::StateBackend<#crate_::HasherFor>, + { fn call_api_at< R: #crate_::Encode + #crate_::Decode + PartialEq, F: FnOnce( &C, &Self, &std::cell::RefCell<#crate_::OverlayedChanges>, - &std::cell::RefCell>>, - &Option<#crate_::ProofRecorder<#block>>, + &std::cell::RefCell<#crate_::StorageTransactionCache>, + &std::cell::RefCell>>, + &Option<#crate_::ProofRecorder>, ) -> std::result::Result<#crate_::NativeOrEncoded, E>, E, >( @@ -348,6 +393,7 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result Result { /// `impl Api for Runtime` with `impl Api for RuntimeApi` and replace the method implementations /// with code that calls into the runtime. struct ApiRuntimeImplToApiRuntimeApiImpl<'a> { - node_block: &'a TokenStream, runtime_block: &'a TypePath, - node_block_id: &'a TokenStream, runtime_mod_path: &'a Path, runtime_type: &'a Type, trait_generic_arguments: &'a [GenericArgument], @@ -425,8 +469,7 @@ struct ApiRuntimeImplToApiRuntimeApiImpl<'a> { impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { fn fold_type_path(&mut self, input: TypePath) -> TypePath { let new_ty_path = if input == *self.runtime_block { - let node_block = self.node_block; - parse_quote!( #node_block ) + parse_quote!( __SR_API_BLOCK__ ) } else { input }; @@ -442,9 +485,7 @@ impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { generate_native_call_generator_fn_name(&input.sig.ident); let call_api_at_call = generate_call_api_at_fn_name(&input.sig.ident); let trait_generic_arguments = self.trait_generic_arguments; - let node_block = self.node_block; let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); - let block_id = self.node_block_id; // Generate the access to the native parameters let param_tuple_access = if input.sig.inputs.len() == 1 { @@ -471,7 +512,7 @@ impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { // Rewrite the input parameters. input.sig.inputs = parse_quote! { &self, - at: &#block_id, + at: &#crate_::BlockId<__SR_API_BLOCK__>, context: #crate_::ExecutionContext, params: Option<( #( #param_types ),* )>, params_encoded: Vec, @@ -495,17 +536,25 @@ impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { #error self.call_api_at( - |call_runtime_at, core_api, changes, initialized_block, recorder| { + | + call_runtime_at, + core_api, + changes, + storage_transaction_cache, + initialized_block, + recorder + | { #runtime_mod_path #call_api_at_call( call_runtime_at, core_api, at, params_encoded, changes, + storage_transaction_cache, initialized_block, params.map(|p| { #runtime_mod_path #native_call_generator_ident :: - <#runtime, #node_block #(, #trait_generic_arguments )*> ( + <#runtime, __SR_API_BLOCK__ #(, #trait_generic_arguments )*> ( #( #param_tuple_access ),* ) }), @@ -526,13 +575,50 @@ impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { } fn fold_item_impl(&mut self, mut input: ItemImpl) -> ItemImpl { - // Implement the trait for the `RuntimeApiImpl` - input.self_ty = Box::new(parse_quote!( RuntimeApiImpl )); + // All this `UnwindSafe` magic below here is required for this rust bug: + // https://github.com/rust-lang/rust/issues/24159 + // Before we directly had the final block type and rust could determine that it is unwind + // safe, but now we just have a generic parameter `Block`. let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); - let block = self.node_block; + + // Implement the trait for the `RuntimeApiImpl` + input.self_ty = Box::new( + parse_quote!( RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall> ) + ); + input.generics.params.push( - parse_quote!( RuntimeApiImplCall: #crate_::CallRuntimeAt<#block> + 'static ) + parse_quote!( + __SR_API_BLOCK__: #crate_::BlockT + std::panic::UnwindSafe + + std::panic::RefUnwindSafe + ) + ); + input.generics.params.push( + parse_quote!( RuntimeApiImplCall: #crate_::CallApiAt<__SR_API_BLOCK__> + 'static ) + ); + + let where_clause = input.generics.make_where_clause(); + + where_clause.predicates.push( + parse_quote! { + RuntimeApiImplCall::StateBackend: + #crate_::StateBackend<#crate_::HasherFor<__SR_API_BLOCK__>> + } + ); + + // Require that all types used in the function signatures are unwind safe. + extract_all_signature_types(&input.items).iter().for_each(|i| { + where_clause.predicates.push( + parse_quote! { + #i: std::panic::UnwindSafe + std::panic::RefUnwindSafe + } + ); + }); + + where_clause.predicates.push( + parse_quote! { + __SR_API_BLOCK__::Header: std::panic::UnwindSafe + std::panic::RefUnwindSafe + } ); // The implementation for the `RuntimeApiImpl` is only required when compiling with @@ -555,7 +641,6 @@ fn generate_api_impl_for_runtime_api(impls: &[ItemImpl]) -> Result .ok_or_else(|| Error::new(impl_trait_path.span(), "Empty trait path not possible!"))? .clone(); let runtime_block = extract_runtime_block_ident(impl_trait_path)?; - let (node_block, node_block_id) = generate_node_block_and_block_id_ty(&impl_.self_ty); let runtime_type = &impl_.self_ty; let mut runtime_mod_path = extend_with_runtime_decl_path(impl_trait_path.clone()); // remove the trait to get just the module path @@ -568,8 +653,6 @@ fn generate_api_impl_for_runtime_api(impls: &[ItemImpl]) -> Result let mut visitor = ApiRuntimeImplToApiRuntimeApiImpl { runtime_block, - node_block: &node_block, - node_block_id: &node_block_id, runtime_mod_path: &runtime_mod_path, runtime_type: &*runtime_type, trait_generic_arguments: &trait_generic_arguments, @@ -627,31 +710,37 @@ pub fn impl_runtime_apis_impl(input: proc_macro::TokenStream) -> proc_macro::Tok // Parse all impl blocks let RuntimeApiImpls { impls: api_impls } = parse_macro_input!(input as RuntimeApiImpls); - let dispatch_impl = unwrap_or_error(generate_dispatch_function(&api_impls)); - let api_impls_for_runtime = unwrap_or_error(generate_api_impl_for_runtime(&api_impls)); - let base_runtime_api = unwrap_or_error(generate_runtime_api_base_structures(&api_impls)); + impl_runtime_apis_impl_inner(&api_impls).unwrap_or_else(|e| e.to_compile_error()).into() +} + +fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { + let dispatch_impl = generate_dispatch_function(api_impls)?; + let api_impls_for_runtime = generate_api_impl_for_runtime(api_impls)?; + let base_runtime_api = generate_runtime_api_base_structures()?; let hidden_includes = generate_hidden_includes(HIDDEN_INCLUDES_ID); - let runtime_api_versions = unwrap_or_error(generate_runtime_api_versions(&api_impls)); - let wasm_interface = unwrap_or_error(generate_wasm_interface(&api_impls)); - let api_impls_for_runtime_api = unwrap_or_error(generate_api_impl_for_runtime_api(&api_impls)); + let runtime_api_versions = generate_runtime_api_versions(api_impls)?; + let wasm_interface = generate_wasm_interface(api_impls)?; + let api_impls_for_runtime_api = generate_api_impl_for_runtime_api(api_impls)?; - quote!( - #hidden_includes + Ok( + quote!( + #hidden_includes - #base_runtime_api + #base_runtime_api - #api_impls_for_runtime + #api_impls_for_runtime - #api_impls_for_runtime_api + #api_impls_for_runtime_api - #runtime_api_versions + #runtime_api_versions - pub mod api { - use super::*; + pub mod api { + use super::*; - #dispatch_impl + #dispatch_impl - #wasm_interface - } - ).into() + #wasm_interface + } + ) + ) } diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 55814c61b5..8330624bf2 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -18,6 +18,7 @@ use proc_macro2::{TokenStream, Span}; use syn::{ Result, Ident, Signature, parse_quote, Type, Pat, spanned::Spanned, FnArg, Error, token::And, + ImplItem, ReturnType, }; use quote::quote; @@ -26,11 +27,6 @@ use std::env; use proc_macro_crate::crate_name; -/// Unwrap the given result, if it is an error, `compile_error!` will be generated. -pub fn unwrap_or_error(res: Result) -> TokenStream { - res.unwrap_or_else(|e| e.to_compile_error()) -} - fn generate_hidden_includes_mod_name(unique_id: &'static str) -> Ident { Ident::new(&format!("sp_api_hidden_includes_{}", unique_id), Span::call_site()) } @@ -81,10 +77,10 @@ pub fn generate_method_runtime_api_impl_name(trait_: &Ident, method: &Ident) -> } /// Get the type of a `syn::ReturnType`. -pub fn return_type_extract_type(rt: &syn::ReturnType) -> Type { +pub fn return_type_extract_type(rt: &ReturnType) -> Type { match rt { - syn::ReturnType::Default => parse_quote!( () ), - syn::ReturnType::Type(_, ref ty) => *ty.clone(), + ReturnType::Default => parse_quote!( () ), + ReturnType::Type(_, ref ty) => *ty.clone(), } } @@ -176,3 +172,30 @@ pub fn generate_call_api_at_fn_name(fn_name: &Ident) -> Ident { pub fn prefix_function_with_trait(trait_: &Ident, function: &F) -> String { format!("{}_{}", trait_.to_string(), function.to_string()) } + +/// Extract all types that appear in signatures in the given `ImplItem`'s. +/// +/// If a type is a reference, the inner type is extracted (without the reference). +pub fn extract_all_signature_types(items: &[ImplItem]) -> Vec { + items.iter() + .filter_map(|i| match i { + ImplItem::Method(method) => Some(&method.sig), + _ => None, + }) + .map(|sig| { + let ret_ty = match &sig.output { + ReturnType::Default => None, + ReturnType::Type(_, ty) => Some((**ty).clone()), + }; + + sig.inputs.iter().filter_map(|i| match i { + FnArg::Typed(arg) => Some(&arg.ty), + _ => None, + }).map(|ty| match &**ty { + Type::Reference(t) => (*t.elem).clone(), + _ => (**ty).clone(), + }).chain(ret_ty) + }) + .flatten() + .collect() +} diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index 7918113345..122e863228 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -26,7 +26,7 @@ //! functionality that every runtime needs to export. //! //! Besides the macros and the [`Core`] runtime api, this crates provides the [`Metadata`] runtime -//! api, the [`ApiExt`] trait, the [`CallRuntimeAt`] trait and the [`ConstructRuntimeApi`] trait. +//! api, the [`ApiExt`] trait, the [`CallApiAt`] trait and the [`ConstructRuntimeApi`] trait. #![cfg_attr(not(feature = "std"), no_std)] @@ -35,18 +35,23 @@ extern crate self as sp_api; #[doc(hidden)] #[cfg(feature = "std")] -pub use sp_state_machine::{OverlayedChanges, StorageProof}; +pub use sp_state_machine::{ + OverlayedChanges, StorageProof, Backend as StateBackend, ChangesTrieStorage, +}; #[doc(hidden)] #[cfg(feature = "std")] pub use sp_core::NativeOrEncoded; #[doc(hidden)] +#[cfg(feature = "std")] +pub use hash_db::Hasher; +#[doc(hidden)] #[cfg(not(feature = "std"))] pub use sp_core::to_substrate_wasm_fn_return_value; #[doc(hidden)] pub use sp_runtime::{ traits::{ - Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, - Header as HeaderT, ApiRef, RuntimeApiInfo, Hash as HashT, + Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, HasherFor, NumberFor, + Header as HeaderT, Hash as HashT, }, generic::BlockId, transaction_validity::TransactionValidity, }; @@ -157,8 +162,8 @@ pub use sp_api_proc_macro::decl_runtime_apis; /// ```rust /// use sp_version::create_runtime_str; /// # -/// # use sp_runtime::traits::GetNodeBlockType; -/// # use sp_test_primitives::{Block, Header}; +/// # use sp_runtime::traits::{GetNodeBlockType, Block as BlockT}; +/// # use sp_test_primitives::Block; /// # /// # /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` /// # /// trait are done by the `construct_runtime!` macro in a real runtime. @@ -187,7 +192,7 @@ pub use sp_api_proc_macro::decl_runtime_apis; /// # unimplemented!() /// # } /// # fn execute_block(_block: Block) {} -/// # fn initialize_block(_header: &Header) {} +/// # fn initialize_block(_header: &::Header) {} /// # } /// /// impl self::Balance for Runtime { @@ -221,27 +226,60 @@ pub use sp_api_proc_macro::decl_runtime_apis; /// ``` pub use sp_api_proc_macro::impl_runtime_apis; -#[cfg(feature = "std")] /// A type that records all accessed trie nodes and generates a proof out of it. +#[cfg(feature = "std")] pub type ProofRecorder = sp_state_machine::ProofRecorder< <<::Header as HeaderT>::Hashing as HashT>::Hasher >; +/// A type that is used as cache for the storage transactions. +#[cfg(feature = "std")] +pub type StorageTransactionCache = + sp_state_machine::StorageTransactionCache< + >>::Transaction, HasherFor, NumberFor + >; + +#[cfg(feature = "std")] +pub type StorageChanges = + sp_state_machine::StorageChanges< + >>::Transaction, + HasherFor, + NumberFor + >; + +/// Extract the state backend type for a type that implements `ProvideRuntimeApi`. +#[cfg(feature = "std")] +pub type StateBackendFor = + <

>::Api as ApiExt>::StateBackend; + +/// Extract the state backend transaction type for a type that implements `ProvideRuntimeApi`. +#[cfg(feature = "std")] +pub type TransactionFor = + as StateBackend>>::Transaction; + /// Something that can be constructed to a runtime api. #[cfg(feature = "std")] -pub trait ConstructRuntimeApi> { +pub trait ConstructRuntimeApi> { /// The actual runtime api that will be constructed. - type RuntimeApi; + type RuntimeApi: ApiExt; /// Construct an instance of the runtime api. fn construct_runtime_api<'a>(call: &'a C) -> ApiRef<'a, Self::RuntimeApi>; } -/// An extension for the `RuntimeApi`. +/// Extends the runtime api traits with an associated error type. This trait is given as super +/// trait to every runtime api trait. #[cfg(feature = "std")] -pub trait ApiExt { - /// Error type used by the interface. +pub trait ApiErrorExt { + /// Error type used by the runtime apis. type Error: std::fmt::Debug + From; +} + +/// Extends the runtime api implementation with some common functionality. +#[cfg(feature = "std")] +pub trait ApiExt: ApiErrorExt { + /// The state backend that is used to store the block states. + type StateBackend: StateBackend>; /// The given closure will be called with api instance. Inside the closure any api call is /// allowed. After doing the api call, the closure is allowed to map the `Result` to a @@ -250,15 +288,15 @@ pub trait ApiExt { /// On `Ok`, the structure commits the changes to an internal buffer. fn map_api_result result::Result, R, E>( &self, - map_call: F + map_call: F, ) -> result::Result where Self: Sized; /// Checks if the given api is implemented and versions match. fn has_api( &self, - at: &BlockId + at: &BlockId, ) -> Result where Self: Sized { - self.runtime_version_at(at).map(|v| v.has_api::()) + self.runtime_version_at(at).map(|v| v.has_api_with(&A::ID, |v| v == A::VERSION)) } /// Check if the given api is implemented and the version passes a predicate. @@ -267,7 +305,7 @@ pub trait ApiExt { at: &BlockId, pred: P, ) -> Result where Self: Sized { - self.runtime_version_at(at).map(|v| v.has_api_with::(pred)) + self.runtime_version_at(at).map(|v| v.has_api_with(&A::ID, pred)) } /// Returns the runtime version at the given block id. @@ -277,8 +315,22 @@ pub trait ApiExt { fn record_proof(&mut self); /// Extract the recorded proof. + /// /// This stops the proof recording. + /// + /// If `record_proof` was not called before, this will return `None`. fn extract_proof(&mut self) -> Option; + + /// Convert the api object into the storage changes that were done while executing runtime + /// api functions. + /// + /// After executing this function, all collected changes are reset. + fn into_storage_changes, NumberFor>>( + &self, + backend: &Self::StateBackend, + changes_trie_storage: Option<&T>, + parent_hash: Block::Hash, + ) -> Result, String> where Self: Sized; } /// Before calling any runtime api function, the runtime need to be initialized @@ -301,12 +353,44 @@ pub enum InitializeBlock<'a, Block: BlockT> { Do(&'a RefCell>>), } -/// Something that can call into the runtime at a given block. +/// Parameters for [`CallApiAt::call_api_at`]. +#[cfg(feature = "std")] +pub struct CallApiAtParams<'a, Block: BlockT, C, NC, Backend: StateBackend>> { + /// A reference to something that implements the [`Core`] api. + pub core_api: &'a C, + /// The block id that determines the state that should be setup when calling the function. + pub at: &'a BlockId, + /// The name of the function that should be called. + pub function: &'static str, + /// An optional native call that calls the `function`. This is an optimization to call into a + /// native runtime without requiring to encode/decode the parameters. The native runtime can + /// still be called when this value is `None`, we then just fallback to encoding/decoding the + /// parameters. + pub native_call: Option, + /// The encoded arguments of the function. + pub arguments: Vec, + /// The overlayed changes that are on top of the state. + pub overlayed_changes: &'a RefCell, + /// The cache for storage transactions. + pub storage_transaction_cache: &'a RefCell>, + /// Determines if the function requires that `initialize_block` should be called before calling + /// the actual function. + pub initialize_block: InitializeBlock<'a, Block>, + /// The context this function is executed in. + pub context: ExecutionContext, + /// The optional proof recorder for recording storage accesses. + pub recorder: &'a Option>, +} + +/// Something that can call into the an api at a given block. #[cfg(feature = "std")] -pub trait CallRuntimeAt { - /// Error type used by the interface. +pub trait CallApiAt { + /// Error type used by the implementation. type Error: std::fmt::Debug + From; + /// The state backend that is used to store the block states. + type StateBackend: StateBackend>; + /// Calls the given api function with the given encoded arguments at the given block and returns /// the encoded result. fn call_api_at< @@ -316,26 +400,66 @@ pub trait CallRuntimeAt { C: Core, >( &self, - core_api: &C, - at: &BlockId, - function: &'static str, - args: Vec, - changes: &RefCell, - initialize_block: InitializeBlock<'a, Block>, - native_call: Option, - context: ExecutionContext, - recorder: &Option>, + params: CallApiAtParams<'a, Block, C, NC, Self::StateBackend>, ) -> Result, Self::Error>; /// Returns the runtime version at the given block. fn runtime_version_at(&self, at: &BlockId) -> Result; } +/// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. +#[cfg(feature = "std")] +pub struct ApiRef<'a, T>(T, std::marker::PhantomData<&'a ()>); + +#[cfg(feature = "std")] +impl<'a, T> From for ApiRef<'a, T> { + fn from(api: T) -> Self { + ApiRef(api, Default::default()) + } +} + +#[cfg(feature = "std")] +impl<'a, T> std::ops::Deref for ApiRef<'a, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +#[cfg(feature = "std")] +impl<'a, T> std::ops::DerefMut for ApiRef<'a, T> { + fn deref_mut(&mut self) -> &mut T { + &mut self.0 + } +} + +/// Something that provides a runtime api. +#[cfg(feature = "std")] +pub trait ProvideRuntimeApi { + /// The concrete type that provides the api. + type Api: ApiExt; + + /// Returns the runtime api. + /// The returned instance will keep track of modifications to the storage. Any successful + /// call to an api function, will `commit` its changes to an internal buffer. Otherwise, + /// the modifications will be `discarded`. The modifications will not be applied to the + /// storage, even on a `commit`. + fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api>; +} + +/// Something that provides information about a runtime api. +#[cfg(feature = "std")] +pub trait RuntimeApiInfo { + /// The identifier of the runtime api. + const ID: [u8; 8]; + /// The version of the runtime api. + const VERSION: u32; +} + /// Extracts the `Api::Error` for a type that provides a runtime api. #[cfg(feature = "std")] -pub type ApiErrorFor = < - ::Api as ApiExt ->::Error; +pub type ApiErrorFor = <>::Api as ApiErrorExt>::Error; decl_runtime_apis! { /// The `Core` runtime api that every Substrate runtime needs to implement. diff --git a/primitives/api/test/benches/bench.rs b/primitives/api/test/benches/bench.rs index 4bdf6e199c..9a90ca6e38 100644 --- a/primitives/api/test/benches/bench.rs +++ b/primitives/api/test/benches/bench.rs @@ -19,8 +19,9 @@ use substrate_test_runtime_client::{ DefaultTestClientBuilderExt, TestClientBuilder, TestClientBuilderExt, runtime::TestAPI, }; -use sp_runtime::{generic::BlockId, traits::ProvideRuntimeApi}; +use sp_runtime::generic::BlockId; use sp_state_machine::ExecutionStrategy; +use sp_api::ProvideRuntimeApi; fn sp_api_benchmark(c: &mut Criterion) { c.bench_function("add one with same runtime api", |b| { diff --git a/primitives/api/test/tests/decl_and_impl.rs b/primitives/api/test/tests/decl_and_impl.rs index 00c0cc732c..d5a668dec1 100644 --- a/primitives/api/test/tests/decl_and_impl.rs +++ b/primitives/api/test/tests/decl_and_impl.rs @@ -90,16 +90,16 @@ type TestClient = substrate_test_runtime_client::sc_client::Client< #[test] fn test_client_side_function_signature() { - let _test: fn(&RuntimeApiImpl, &BlockId, u64) -> Result<()> = - RuntimeApiImpl::::test; + let _test: fn(&RuntimeApiImpl, &BlockId, u64) -> Result<()> = + RuntimeApiImpl::::test; let _something_with_block: - fn(&RuntimeApiImpl, &BlockId, Block) -> Result = - RuntimeApiImpl::::something_with_block; + fn(&RuntimeApiImpl, &BlockId, Block) -> Result = + RuntimeApiImpl::::something_with_block; #[allow(deprecated)] let _same_name_before_version_2: - fn(&RuntimeApiImpl, &BlockId) -> Result = - RuntimeApiImpl::::same_name_before_version_2; + fn(&RuntimeApiImpl, &BlockId) -> Result = + RuntimeApiImpl::::same_name_before_version_2; } #[test] diff --git a/primitives/api/test/tests/runtime_calls.rs b/primitives/api/test/tests/runtime_calls.rs index 5ebba3a20a..f45df7c517 100644 --- a/primitives/api/test/tests/runtime_calls.rs +++ b/primitives/api/test/tests/runtime_calls.rs @@ -14,15 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use sp_api::ProvideRuntimeApi; use substrate_test_runtime_client::{ prelude::*, DefaultTestClientBuilderExt, TestClientBuilder, runtime::{TestAPI, DecodeFails, Transfer, Header}, }; -use sp_runtime::{ - generic::BlockId, - traits::{ProvideRuntimeApi, Header as HeaderT, Hash as HashT}, -}; +use sp_runtime::{generic::BlockId, traits::{Header as HeaderT, Hash as HashT}}; use sp_state_machine::{ ExecutionStrategy, create_proof_check_backend, execution_proof_check_on_trie_backend, @@ -174,10 +172,10 @@ fn record_proof_works() { // Build the block and record proof let mut builder = client - .new_block_at_with_proof_recording(&block_id, Default::default()) + .new_block_at(&block_id, Default::default(), true) .expect("Creates block builder"); builder.push(transaction.clone()).unwrap(); - let (block, proof) = builder.bake_and_extract_proof().expect("Bake block"); + let (block, _, proof) = builder.build().expect("Bake block").into_inner(); let backend = create_proof_check_backend::<<

::Hashing as HashT>::Hasher>( storage_root, diff --git a/primitives/api/test/tests/ui/declaring_old_block.stderr b/primitives/api/test/tests/ui/declaring_old_block.stderr index 373e669c78..448dc38594 100644 --- a/primitives/api/test/tests/ui/declaring_old_block.stderr +++ b/primitives/api/test/tests/ui/declaring_old_block.stderr @@ -1,15 +1,15 @@ -error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! - --> $DIR/declaring_old_block.rs:4:16 - | -4 | pub trait Api { - | ^^^^^ - error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. --> $DIR/declaring_old_block.rs:4:23 | 4 | pub trait Api { | ^^^^^^ +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! + --> $DIR/declaring_old_block.rs:4:16 + | +4 | pub trait Api { + | ^^^^^ + warning: unused import: `sp_runtime::traits::Block as BlockT` --> $DIR/declaring_old_block.rs:1:5 | diff --git a/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs b/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs index e4eba99d9e..19dfdda836 100644 --- a/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs +++ b/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs @@ -20,7 +20,7 @@ sp_api::impl_runtime_apis! { } impl sp_api::Core for Runtime { - fn version() -> runtime_api::RuntimeVersion { + fn version() -> sp_api::RuntimeVersion { unimplemented!() } fn execute_block(_: Block) { diff --git a/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr b/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr index d55e686a11..ca7e519344 100644 --- a/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr +++ b/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr @@ -1,9 +1,3 @@ -error[E0433]: failed to resolve: use of undeclared type or module `runtime_api` - --> $DIR/impl_incorrect_method_signature.rs:23:19 - | -23 | fn version() -> runtime_api::RuntimeVersion { - | ^^^^^^^^^^^ use of undeclared type or module `runtime_api` - error[E0053]: method `test` has an incompatible type for trait --> $DIR/impl_incorrect_method_signature.rs:19:17 | @@ -39,8 +33,8 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr 33 | | } | |_- in this macro invocation | - = note: expected type `fn(&RuntimeApiImpl, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, , substrate_test_runtime::Extrinsic>>>::Error>` - found type `fn(&RuntimeApiImpl, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, , substrate_test_runtime::Extrinsic>>>::Error>` + = note: expected type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, >::Error>` + found type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, >::Error>` error[E0308]: mismatched types --> $DIR/impl_incorrect_method_signature.rs:17:1 diff --git a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs index 9c01dc0e92..2122a6991a 100644 --- a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs +++ b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs @@ -17,7 +17,7 @@ sp_api::decl_runtime_apis! { mod second { use super::*; - decl_runtime_apis! { + sp_api::decl_runtime_apis! { pub trait Api { fn test2(data: u64); } diff --git a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr index cc267aaee0..24ee66f84b 100644 --- a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr +++ b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr @@ -4,74 +4,10 @@ error: Two traits with the same name detected! The trait name is used to generat 32 | impl second::Api for Runtime { | ^^^ -error: cannot find macro `decl_runtime_apis` in this scope - --> $DIR/impl_two_traits_with_same_name.rs:20:2 +warning: unused import: `super::*` + --> $DIR/impl_two_traits_with_same_name.rs:18:6 | -20 | decl_runtime_apis! { - | ^^^^^^^^^^^^^^^^^ - -error[E0425]: cannot find function `test2_call_api_at` in `second::runtime_decl_for_Api` - --> $DIR/impl_two_traits_with_same_name.rs:27:1 - | -27 | / sp_api::impl_runtime_apis! { -28 | | impl self::Api for Runtime { -29 | | fn test(data: u64) {} -30 | | } -... | -34 | | } -35 | | } - | | ^ - | | | - | |_not found in `second::runtime_decl_for_Api` - | in this macro invocation - -error[E0425]: cannot find function `test2_native_call_generator` in `second::runtime_decl_for_Api` - --> $DIR/impl_two_traits_with_same_name.rs:27:1 - | -27 | / sp_api::impl_runtime_apis! { -28 | | impl self::Api for Runtime { -29 | | fn test(data: u64) {} -30 | | } -... | -34 | | } -35 | | } - | | ^ - | | | - | |_not found in `second::runtime_decl_for_Api` - | in this macro invocation - -error[E0576]: cannot find method or associated constant `test2` in `second::runtime_decl_for_Api::Api` - --> $DIR/impl_two_traits_with_same_name.rs:33:6 - | -33 | fn test2(data: u64) {} - | ^^^^^ not found in `second::runtime_decl_for_Api::Api` - -error[E0603]: module `runtime_decl_for_Api` is private - --> $DIR/impl_two_traits_with_same_name.rs:27:1 +18 | use super::*; + | ^^^^^^^^ | -27 | / sp_api::impl_runtime_apis! { -28 | | impl self::Api for Runtime { -29 | | fn test(data: u64) {} -30 | | } -... | -34 | | } -35 | | } - | |_^ - -error[E0119]: conflicting implementations of trait `runtime_decl_for_Api::Api, substrate_test_runtime::Extrinsic>>` for type `Runtime`: - --> $DIR/impl_two_traits_with_same_name.rs:32:2 - | -28 | impl self::Api for Runtime { - | --------------------------------- first implementation here -... -32 | impl second::Api for Runtime { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Runtime` - -error[E0119]: conflicting implementations of trait `Api, substrate_test_runtime::Extrinsic>>` for type `RuntimeApiImpl<_>`: - --> $DIR/impl_two_traits_with_same_name.rs:32:2 - | -28 | impl self::Api for Runtime { - | --------------------------------- first implementation here -... -32 | impl second::Api for Runtime { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `RuntimeApiImpl<_>` + = note: `#[warn(unused_imports)]` on by default diff --git a/primitives/api/test/tests/ui/invalid_api_version.stderr b/primitives/api/test/tests/ui/invalid_api_version.stderr index 6d0bb8d9f3..7770bc70e7 100644 --- a/primitives/api/test/tests/ui/invalid_api_version.stderr +++ b/primitives/api/test/tests/ui/invalid_api_version.stderr @@ -1,31 +1,3 @@ -error: can't qualify macro invocation with `pub` - --> $DIR/invalid_api_version.rs:1:1 - | -1 | / sp_api::decl_runtime_apis! { -2 | | #[api_version] -3 | | pub trait Api { -4 | | fn test(data: u64); -5 | | } -6 | | } - | | ^ in this macro invocation - | |_| - | - | - = help: try adjusting the macro to put `pub` inside the invocation - -error: Unexpected `api_version` attribute. The supported format is `api_version(1)` - --> $DIR/invalid_api_version.rs:1:1 - | -1 | / sp_api::decl_runtime_apis! { -2 | | #[api_version] -3 | | pub trait Api { -4 | | fn test(data: u64); -5 | | } -6 | | } - | | ^ in this macro invocation - | |_| - | - error: Unexpected `api_version` attribute. The supported format is `api_version(1)` --> $DIR/invalid_api_version.rs:2:4 | diff --git a/primitives/api/test/tests/ui/invalid_api_version_2.stderr b/primitives/api/test/tests/ui/invalid_api_version_2.stderr index 60d33bff41..7ca6a7eebe 100644 --- a/primitives/api/test/tests/ui/invalid_api_version_2.stderr +++ b/primitives/api/test/tests/ui/invalid_api_version_2.stderr @@ -1,31 +1,3 @@ -error: can't qualify macro invocation with `pub` - --> $DIR/invalid_api_version_2.rs:1:1 - | -1 | / sp_api::decl_runtime_apis! { -2 | | #[api_version("1")] -3 | | pub trait Api { -4 | | fn test(data: u64); -5 | | } -6 | | } - | | ^ in this macro invocation - | |_| - | - | - = help: try adjusting the macro to put `pub` inside the invocation - -error: Unexpected `api_version` attribute. The supported format is `api_version(1)` - --> $DIR/invalid_api_version_2.rs:1:1 - | -1 | / sp_api::decl_runtime_apis! { -2 | | #[api_version("1")] -3 | | pub trait Api { -4 | | fn test(data: u64); -5 | | } -6 | | } - | | ^ in this macro invocation - | |_| - | - error: Unexpected `api_version` attribute. The supported format is `api_version(1)` --> $DIR/invalid_api_version_2.rs:2:4 | diff --git a/primitives/api/test/tests/ui/invalid_api_version_3.stderr b/primitives/api/test/tests/ui/invalid_api_version_3.stderr index c2b64657ff..cef4763a6d 100644 --- a/primitives/api/test/tests/ui/invalid_api_version_3.stderr +++ b/primitives/api/test/tests/ui/invalid_api_version_3.stderr @@ -1,31 +1,3 @@ -error: can't qualify macro invocation with `pub` - --> $DIR/invalid_api_version_3.rs:1:1 - | -1 | / sp_api::decl_runtime_apis! { -2 | | #[api_version()] -3 | | pub trait Api { -4 | | fn test(data: u64); -5 | | } -6 | | } - | | ^ in this macro invocation - | |_| - | - | - = help: try adjusting the macro to put `pub` inside the invocation - -error: Unexpected `api_version` attribute. The supported format is `api_version(1)` - --> $DIR/invalid_api_version_3.rs:1:1 - | -1 | / sp_api::decl_runtime_apis! { -2 | | #[api_version()] -3 | | pub trait Api { -4 | | fn test(data: u64); -5 | | } -6 | | } - | | ^ in this macro invocation - | |_| - | - error: Unexpected `api_version` attribute. The supported format is `api_version(1)` --> $DIR/invalid_api_version_3.rs:2:4 | diff --git a/primitives/api/test/tests/ui/missing_block_generic_parameter.stderr b/primitives/api/test/tests/ui/missing_block_generic_parameter.stderr index 61311c14b8..d626eda249 100644 --- a/primitives/api/test/tests/ui/missing_block_generic_parameter.stderr +++ b/primitives/api/test/tests/ui/missing_block_generic_parameter.stderr @@ -3,9 +3,3 @@ error: Missing `Block` generic parameter. | 18 | impl self::Api for Runtime { | ^^^ - -error[E0107]: wrong number of type arguments: expected 1, found 0 - --> $DIR/missing_block_generic_parameter.rs:18:7 - | -18 | impl self::Api for Runtime { - | ^^^^^^^^^ expected 1 type argument diff --git a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs index f45f0844c6..a82fb9a159 100644 --- a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs +++ b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs @@ -22,7 +22,7 @@ sp_api::impl_runtime_apis! { } impl sp_api::Core for Runtime { - fn version() -> runtime_api::RuntimeVersion { + fn version() -> sp_api::RuntimeVersion { unimplemented!() } fn execute_block(_: Block) { diff --git a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr index 5129bb6c15..b793d832ff 100644 --- a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr +++ b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr @@ -1,9 +1,3 @@ -error[E0433]: failed to resolve: use of undeclared type or module `runtime_api` - --> $DIR/type_reference_in_impl_runtime_apis_call.rs:25:19 - | -25 | fn version() -> runtime_api::RuntimeVersion { - | ^^^^^^^^^^^ use of undeclared type or module `runtime_api` - error[E0053]: method `test` has an incompatible type for trait --> $DIR/type_reference_in_impl_runtime_apis_call.rs:19:17 | @@ -39,8 +33,8 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr 35 | | } | |_- in this macro invocation | - = note: expected type `fn(&RuntimeApiImpl, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, , substrate_test_runtime::Extrinsic>>>::Error>` - found type `fn(&RuntimeApiImpl, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option<&u64>, std::vec::Vec) -> std::result::Result, , substrate_test_runtime::Extrinsic>>>::Error>` + = note: expected type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, >::Error>` + found type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option<&u64>, std::vec::Vec) -> std::result::Result, >::Error>` error[E0308]: mismatched types --> $DIR/type_reference_in_impl_runtime_apis_call.rs:17:1 diff --git a/primitives/application-crypto/src/ed25519.rs b/primitives/application-crypto/src/ed25519.rs index 159d9ec2a9..c92c70495e 100644 --- a/primitives/application-crypto/src/ed25519.rs +++ b/primitives/application-crypto/src/ed25519.rs @@ -54,4 +54,3 @@ impl RuntimePublic for Public { sp_io::crypto::ed25519_verify(&signature, msg.as_ref(), self) } } - diff --git a/primitives/application-crypto/src/sr25519.rs b/primitives/application-crypto/src/sr25519.rs index 227e7c30b4..34d9797bd4 100644 --- a/primitives/application-crypto/src/sr25519.rs +++ b/primitives/application-crypto/src/sr25519.rs @@ -53,4 +53,4 @@ impl RuntimePublic for Public { fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { sp_io::crypto::sr25519_verify(&signature, msg.as_ref(), self) } -} \ No newline at end of file +} diff --git a/primitives/application-crypto/test/Cargo.toml b/primitives/application-crypto/test/Cargo.toml index dabdc1d6e9..1931e6f84b 100644 --- a/primitives/application-crypto/test/Cargo.toml +++ b/primitives/application-crypto/test/Cargo.toml @@ -10,4 +10,5 @@ publish = false sp-core = { version = "2.0.0", default-features = false, path = "../../core" } substrate-test-runtime-client = { version = "2.0.0", path = "../../../test-utils/runtime/client" } sp-runtime = { version = "2.0.0", path = "../../runtime" } +sp-api = { version = "2.0.0", path = "../../api" } sp-application-crypto = { version = "2.0.0", path = "../" } diff --git a/primitives/application-crypto/test/src/ed25519.rs b/primitives/application-crypto/test/src/ed25519.rs index d967c3a7d9..400edfd6ae 100644 --- a/primitives/application-crypto/test/src/ed25519.rs +++ b/primitives/application-crypto/test/src/ed25519.rs @@ -16,12 +16,13 @@ //! Integration tests for ed25519 -use sp_runtime::{generic::BlockId, traits::ProvideRuntimeApi}; +use sp_runtime::generic::BlockId; use sp_core::{testing::{KeyStore, ED25519}, crypto::Pair}; use substrate_test_runtime_client::{ TestClientBuilder, DefaultTestClientBuilderExt, TestClientBuilderExt, runtime::TestAPI, }; +use sp_api::ProvideRuntimeApi; use sp_application_crypto::ed25519::{AppPair, AppPublic}; #[test] diff --git a/primitives/application-crypto/test/src/sr25519.rs b/primitives/application-crypto/test/src/sr25519.rs index 0e0c40578b..49bb3c2a83 100644 --- a/primitives/application-crypto/test/src/sr25519.rs +++ b/primitives/application-crypto/test/src/sr25519.rs @@ -17,12 +17,13 @@ //! Integration tests for sr25519 -use sp_runtime::{generic::BlockId, traits::ProvideRuntimeApi}; +use sp_runtime::generic::BlockId; use sp_core::{testing::{KeyStore, SR25519}, crypto::Pair}; use substrate_test_runtime_client::{ TestClientBuilder, DefaultTestClientBuilderExt, TestClientBuilderExt, runtime::TestAPI, }; +use sp_api::ProvideRuntimeApi; use sp_application_crypto::sr25519::{AppPair, AppPublic}; #[test] diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index d767cd2ca4..4c38e31914 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -11,6 +11,7 @@ libp2p = { version = "0.14.0-alpha.1", default-features = false } log = "0.4.8" sp-core = { path= "../../core" } sp-inherents = { version = "2.0.0", path = "../../inherents" } +sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } futures = { version = "0.3.1", features = ["thread-pool"] } futures-timer = "0.4.0" sp-std = { version = "2.0.0", path = "../../std" } diff --git a/primitives/consensus/common/src/block_import.rs b/primitives/consensus/common/src/block_import.rs index 133791c9a5..f8d05e1054 100644 --- a/primitives/consensus/common/src/block_import.rs +++ b/primitives/consensus/common/src/block_import.rs @@ -16,8 +16,10 @@ //! Block import helpers. -use sp_runtime::traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor}; -use sp_runtime::Justification; +use sp_runtime::{ + Justification, + traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor, HasherFor}, +}; use std::borrow::Cow; use std::collections::HashMap; use std::sync::Arc; @@ -110,7 +112,7 @@ pub struct BlockCheckParams { } /// Data required to import a Block. -pub struct BlockImportParams { +pub struct BlockImportParams { /// Origin of the Block pub origin: BlockOrigin, /// The header, without consensus post-digests applied. This should be in the same @@ -130,8 +132,13 @@ pub struct BlockImportParams { /// Digest items that have been added after the runtime for external /// work, like a consensus signature. pub post_digests: Vec>, - /// Block's body + /// The body of the block. pub body: Option>, + /// The changes to the storage to create the state for the block. If this is `Some(_)`, + /// the block import will not need to re-execute the block for importing it. + pub storage_changes: Option< + sp_state_machine::StorageChanges, NumberFor> + >, /// Is this block finalized already? /// `true` implies instant finality. pub finalized: bool, @@ -148,7 +155,7 @@ pub struct BlockImportParams { pub import_existing: bool, } -impl BlockImportParams { +impl BlockImportParams { /// Deconstruct the justified header into parts. pub fn into_inner(self) -> ( @@ -156,7 +163,8 @@ impl BlockImportParams { ::Header, Option, Vec>, - Option::Extrinsic>>, + Option>, + Option, NumberFor>>, bool, Vec<(Vec, Option>)>, ) { @@ -166,6 +174,7 @@ impl BlockImportParams { self.justification, self.post_digests, self.body, + self.storage_changes, self.finalized, self.auxiliary, ) @@ -186,11 +195,34 @@ impl BlockImportParams { }) } } + + /// Auxiliary function for "converting" the transaction type. + /// + /// Actually this just sets `storage_changes` to `None` and makes rustc think that `Self` now + /// uses a different transaction type. + pub fn convert_transaction(self) -> BlockImportParams { + BlockImportParams { + origin: self.origin, + header: self.header, + justification: self.justification, + post_digests: self.post_digests, + body: self.body, + storage_changes: None, + finalized: self.finalized, + auxiliary: self.auxiliary, + allow_missing_state: self.allow_missing_state, + fork_choice: self.fork_choice, + import_existing: self.import_existing, + } + } } /// Block import trait. pub trait BlockImport { - type Error: ::std::error::Error + Send + 'static; + /// The error type. + type Error: std::error::Error + Send + 'static; + /// The transaction type used by the backend. + type Transaction; /// Check block preconditions. fn check_block( @@ -203,13 +235,14 @@ pub trait BlockImport { /// Cached data can be accessed through the blockchain cache. fn import_block( &mut self, - block: BlockImportParams, + block: BlockImportParams, cache: HashMap>, ) -> Result; } -impl BlockImport for crate::import_queue::BoxBlockImport { +impl BlockImport for crate::import_queue::BoxBlockImport { type Error = crate::error::Error; + type Transaction = Transaction; /// Check block preconditions. fn check_block( @@ -224,17 +257,18 @@ impl BlockImport for crate::import_queue::BoxBlockImport { /// Cached data can be accessed through the blockchain cache. fn import_block( &mut self, - block: BlockImportParams, + block: BlockImportParams, cache: HashMap>, ) -> Result { (**self).import_block(block, cache) } } -impl BlockImport for Arc -where for<'r> &'r T: BlockImport +impl BlockImport for Arc + where for<'r> &'r T: BlockImport { type Error = E; + type Transaction = Transaction; fn check_block( &mut self, @@ -245,7 +279,7 @@ where for<'r> &'r T: BlockImport fn import_block( &mut self, - block: BlockImportParams, + block: BlockImportParams, cache: HashMap>, ) -> Result { (&**self).import_block(block, cache) @@ -254,7 +288,7 @@ where for<'r> &'r T: BlockImport /// Justification import trait pub trait JustificationImport { - type Error: ::std::error::Error + Send + 'static; + type Error: std::error::Error + Send + 'static; /// Called by the import queue when it is started. Returns a list of justifications to request /// from the network. diff --git a/primitives/consensus/common/src/import_queue.rs b/primitives/consensus/common/src/import_queue.rs index d8c2915638..2da0bcac0c 100644 --- a/primitives/consensus/common/src/import_queue.rs +++ b/primitives/consensus/common/src/import_queue.rs @@ -39,13 +39,17 @@ mod basic_queue; pub mod buffered_link; /// Shared block import struct used by the queue. -pub type BoxBlockImport = Box + Send + Sync>; +pub type BoxBlockImport = Box< + dyn BlockImport + Send + Sync +>; /// Shared justification import struct used by the queue. pub type BoxJustificationImport = Box + Send + Sync>; /// Shared finality proof import struct used by the queue. -pub type BoxFinalityProofImport = Box + Send + Sync>; +pub type BoxFinalityProofImport = Box< + dyn FinalityProofImport + Send + Sync +>; /// Maps to the Origin used by the network. pub type Origin = libp2p::PeerId; @@ -83,7 +87,7 @@ pub trait Verifier: Send + Sync { header: B::Header, justification: Option, body: Option>, - ) -> Result<(BlockImportParams, Option)>>), String>; + ) -> Result<(BlockImportParams, Option)>>), String>; } /// Blocks import queue API. @@ -176,8 +180,8 @@ pub enum BlockImportError { } /// Single block import function. -pub fn import_single_block>( - import_handle: &mut dyn BlockImport, +pub fn import_single_block, Transaction>( + import_handle: &mut dyn BlockImport, block_origin: BlockOrigin, block: IncomingBlock, verifier: &mut V, @@ -254,5 +258,5 @@ pub fn import_single_block>( } import_block.allow_missing_state = block.allow_missing_state; - import_error(import_handle.import_block(import_block, cache)) + import_error(import_handle.import_block(import_block.convert_transaction(), cache)) } diff --git a/primitives/consensus/common/src/import_queue/basic_queue.rs b/primitives/consensus/common/src/import_queue/basic_queue.rs index f8df421d26..4dcb7eeb45 100644 --- a/primitives/consensus/common/src/import_queue/basic_queue.rs +++ b/primitives/consensus/common/src/import_queue/basic_queue.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{mem, pin::Pin, time::Duration}; +use std::{mem, pin::Pin, time::Duration, marker::PhantomData}; use futures::{prelude::*, channel::mpsc, task::Context, task::Poll}; use futures_timer::Delay; use sp_runtime::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; @@ -29,7 +29,7 @@ use crate::import_queue::{ /// Interface to a basic block import queue that is importing blocks sequentially in a separate /// task, with pluggable verification. -pub struct BasicQueue { +pub struct BasicQueue { /// Channel to send messages to the background task. sender: mpsc::UnboundedSender>, /// Results coming from the worker task. @@ -40,16 +40,17 @@ pub struct BasicQueue { manual_poll: Option + Send>>>, /// A thread pool where the background worker is being run. pool: Option, + _phantom: PhantomData, } -impl BasicQueue { +impl BasicQueue { /// Instantiate a new basic queue, with given verifier. /// /// This creates a background task, and calls `on_start` on the justification importer and /// finality proof importer. pub fn new>( verifier: V, - block_import: BoxBlockImport, + block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, ) -> Self { @@ -81,11 +82,12 @@ impl BasicQueue { result_port, manual_poll, pool, + _phantom: PhantomData, } } } -impl ImportQueue for BasicQueue { +impl ImportQueue for BasicQueue { fn import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { if blocks.is_empty() { return; @@ -102,12 +104,24 @@ impl ImportQueue for BasicQueue { number: NumberFor, justification: Justification ) { - let _ = self.sender.unbounded_send(ToWorkerMsg::ImportJustification(who.clone(), hash, number, justification)); + let _ = self.sender + .unbounded_send( + ToWorkerMsg::ImportJustification(who.clone(), hash, number, justification) + ); } - fn import_finality_proof(&mut 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, + ) { trace!(target: "sync", "Scheduling finality proof of {}/{} for import", number, hash); - let _ = self.sender.unbounded_send(ToWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof)); + let _ = self.sender + .unbounded_send( + ToWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof) + ); } fn poll_actions(&mut self, cx: &mut Context, link: &mut dyn Link) { @@ -132,18 +146,19 @@ enum ToWorkerMsg { ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), } -struct BlockImportWorker { +struct BlockImportWorker { result_sender: BufferedLinkSender, justification_import: Option>, finality_proof_import: Option>, delay_between_blocks: Duration, + _phantom: PhantomData, } -impl BlockImportWorker { +impl BlockImportWorker { fn new>( result_sender: BufferedLinkSender, verifier: V, - block_import: BoxBlockImport, + block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, ) -> (impl Future + Send, mpsc::UnboundedSender>) { @@ -154,6 +169,7 @@ impl BlockImportWorker { justification_import, finality_proof_import, delay_between_blocks: Duration::new(0, 0), + _phantom: PhantomData, }; // Let's initialize `justification_import` and `finality_proof_import`. @@ -237,11 +253,11 @@ impl BlockImportWorker { /// yielded back in the output once the import is finished. fn import_a_batch_of_blocks>( &mut self, - block_import: BoxBlockImport, + block_import: BoxBlockImport, verifier: V, origin: BlockOrigin, blocks: Vec> - ) -> impl Future, V)> { + ) -> impl Future, V)> { let mut result_sender = self.result_sender.clone(); import_many_blocks(block_import, origin, blocks, verifier, self.delay_between_blocks) @@ -309,16 +325,22 @@ impl BlockImportWorker { /// /// The returned `Future` yields at every imported block, which makes the execution more /// fine-grained and making it possible to interrupt the process. -fn import_many_blocks>( - import_handle: BoxBlockImport, +fn import_many_blocks, Transaction>( + import_handle: BoxBlockImport, blocks_origin: BlockOrigin, blocks: Vec>, verifier: V, delay_between_blocks: Duration, -) -> impl Future>, BlockImportError>, - B::Hash, -)>, BoxBlockImport, V)> { +) -> impl Future< + Output = ( + usize, + usize, + Vec<(Result>, BlockImportError>, B::Hash,)>, + BoxBlockImport, + V + ) +> +{ let count = blocks.len(); let blocks_range = match ( diff --git a/primitives/consensus/common/src/lib.rs b/primitives/consensus/common/src/lib.rs index 772d6da7c1..1b98ede376 100644 --- a/primitives/consensus/common/src/lib.rs +++ b/primitives/consensus/common/src/lib.rs @@ -31,7 +31,9 @@ use std::sync::Arc; use std::time::Duration; -use sp_runtime::{traits::{Block as BlockT, DigestFor}, generic::BlockId}; +use sp_runtime::{ + generic::BlockId, traits::{Block as BlockT, DigestFor, NumberFor, HasherFor}, +}; use futures::prelude::*; pub use sp_inherents::InherentData; @@ -48,10 +50,11 @@ const MAX_BLOCK_SIZE: usize = 4 * 1024 * 1024 + 512; pub use self::error::Error; pub use block_import::{ - BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, BlockCheckParams, ImportResult, - JustificationImport, FinalityProofImport, + BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, BlockCheckParams, + ImportResult, JustificationImport, FinalityProofImport, }; pub use select_chain::SelectChain; +pub use sp_state_machine::Backend as StateBackend; /// Block status. #[derive(Debug, PartialEq, Eq)] @@ -71,14 +74,56 @@ pub enum BlockStatus { /// Environment producer for a Consensus instance. Creates proposer instance and communication streams. pub trait Environment { /// The proposer type this creates. - type Proposer: Proposer; + type Proposer: Proposer + 'static; /// Error which can occur upon creation. - type Error: From; + type Error: From + std::fmt::Debug + 'static; /// Initialize the proposal logic on top of a specific header. Provide /// the authorities at that header. - fn init(&mut self, parent_header: &B::Header) - -> Result; + fn init(&mut self, parent_header: &B::Header) -> Result; +} + +/// A proposal that is created by a [`Proposer`]. +pub struct Proposal { + /// The block that was build. + pub block: Block, + /// Optional proof that was recorded while building the block. + pub proof: Option, + /// The storage changes while building this block. + pub storage_changes: sp_state_machine::StorageChanges, NumberFor>, +} + +/// Used as parameter to [`Proposer`] to tell the requirement on recording a proof. +/// +/// When `RecordProof::Yes` is given, all accessed trie nodes should be saved. These recorded +/// trie nodes can be used by a third party to proof this proposal without having access to the +/// full storage. +#[derive(Copy, Clone, PartialEq)] +pub enum RecordProof { + /// `Yes`, record a proof. + Yes, + /// `No`, don't record any proof. + No, +} + +impl RecordProof { + /// Returns if `Self` == `Yes`. + pub fn yes(&self) -> bool { + match self { + Self::Yes => true, + Self::No => false, + } + } +} + +impl From for RecordProof { + fn from(val: bool) -> Self { + if val { + Self::Yes + } else { + Self::No + } + } } /// Logic for a proposer. @@ -89,16 +134,29 @@ pub trait Environment { /// Proposers are generic over bits of "consensus data" which are engine-specific. pub trait Proposer { /// Error type which can occur when proposing or evaluating. - type Error: From + ::std::fmt::Debug + 'static; - /// Future that resolves to a committed proposal. - type Create: Future>; + type Error: From + std::fmt::Debug + 'static; + /// The transaction type used by the backend. + type Transaction: Default + Send + 'static; + /// Future that resolves to a committed proposal with an optional proof. + type Proposal: Future, Self::Error>> + + Send + Unpin + 'static; + /// Create a proposal. + /// + /// Gets the `inherent_data` and `inherent_digests` as input for the proposal. Additionally + /// a maximum duration for building this proposal is given. If building the proposal takes + /// longer than this maximum, the proposal will be very likely discarded. + /// + /// # Return + /// + /// Returns a future that resolves to a [`Proposal`] or to [`Self::Error`]. fn propose( &mut self, inherent_data: InherentData, inherent_digests: DigestFor, max_duration: Duration, - ) -> Self::Create; + record_proof: RecordProof, + ) -> Self::Proposal; } /// An oracle for when major synchronization work is being undertaken. diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 7189b05042..96c42b074d 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -290,7 +290,8 @@ pub trait Storage { /// /// Returns an `Option` that holds the SCALE encoded hash. fn changes_root(&mut self, parent_hash: &[u8]) -> Option> { - self.storage_changes_root(parent_hash).ok().and_then(|h| h) + self.storage_changes_root(parent_hash) + .expect("Invalid `parent_hash` given to `changes_root`.") } /// Get the next key in storage after the given one in lexicographic order. diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index 35a93e2136..3cfb589b05 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -17,6 +17,8 @@ //! Integration tests for runtime interface primitives #![cfg(test)] +#![cfg(test)] + use sp_runtime_interface::*; use sp_runtime_interface_test_wasm::{WASM_BINARY, test_api::HostFunctions}; use sp_wasm_interface::HostFunctions as HostFunctionsT; diff --git a/primitives/runtime/src/generic/header.rs b/primitives/runtime/src/generic/header.rs index e3bb821aa8..51f31af078 100644 --- a/primitives/runtime/src/generic/header.rs +++ b/primitives/runtime/src/generic/header.rs @@ -107,7 +107,7 @@ impl traits::Header for Header where Number: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + MaybeDisplay + SimpleArithmetic + Codec + Copy + Into + TryFrom + sp_std::str::FromStr, Hash: HashT, - Hash::Output: Default + sp_std::hash::Hash + Copy + Member + + Hash::Output: Default + sp_std::hash::Hash + Copy + Member + Ord + MaybeSerialize + Debug + MaybeDisplay + SimpleBitOps + Codec, { type Number = Number; diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 8babfa47ff..c02856d20d 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -526,7 +526,7 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + 's type Number: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec + sp_std::str::FromStr; /// Header hash type - type Hash: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + type Hash: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + Ord + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; /// Hashing algorithm type Hashing: Hash; @@ -581,7 +581,7 @@ pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + 'st /// Header type. type Header: Header; /// Block hash type. - type Hash: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + type Hash: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + Ord + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; /// Returns a reference to the header. @@ -626,6 +626,8 @@ pub trait Extrinsic: Sized { fn new(_call: Self::Call, _signed_data: Option) -> Option { None } } +/// Extract the hasher type for a block. +pub type HasherFor = as Hash>::Hasher; /// Extract the hashing type for a block. pub type HashFor = <::Header as Header>::Hashing; /// Extract the number type for a block. @@ -889,42 +891,6 @@ pub trait Applyable: Sized + Send + Sync { ) -> crate::ApplyExtrinsicResult; } -/// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. -pub struct ApiRef<'a, T>(T, sp_std::marker::PhantomData<&'a ()>); - -impl<'a, T> From for ApiRef<'a, T> { - fn from(api: T) -> Self { - ApiRef(api, Default::default()) - } -} - -impl<'a, T> sp_std::ops::Deref for ApiRef<'a, T> { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl<'a, T> sp_std::ops::DerefMut for ApiRef<'a, T> { - fn deref_mut(&mut self) -> &mut T { - &mut self.0 - } -} - -/// Something that provides a runtime api. -pub trait ProvideRuntimeApi { - /// The concrete type that provides the api. - type Api; - - /// Returns the runtime api. - /// The returned instance will keep track of modifications to the storage. Any successful - /// call to an api function, will `commit` its changes to an internal buffer. Otherwise, - /// the modifications will be `discarded`. The modifications will not be applied to the - /// storage, even on a `commit`. - fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api>; -} - /// A marker trait for something that knows the type of the runtime block. pub trait GetRuntimeBlockType { /// The `RuntimeBlock` type. @@ -937,14 +903,6 @@ pub trait GetNodeBlockType { type NodeBlock: self::Block; } -/// Something that provides information about a runtime api. -pub trait RuntimeApiInfo { - /// The identifier of the runtime api. - const ID: [u8; 8]; - /// The version of the runtime api. - const VERSION: u32; -} - /// Something that can validate unsigned extrinsics for the transaction pool. /// /// Note that any checks done here are only used for determining the validity of diff --git a/primitives/session/src/lib.rs b/primitives/session/src/lib.rs index af42d5dae1..c61218ca6b 100644 --- a/primitives/session/src/lib.rs +++ b/primitives/session/src/lib.rs @@ -21,7 +21,9 @@ use sp_std::vec::Vec; #[cfg(feature = "std")] -use sp_runtime::{generic::BlockId, traits::{ProvideRuntimeApi, Block as BlockT}}; +use sp_runtime::{generic::BlockId, traits::Block as BlockT}; +#[cfg(feature = "std")] +use sp_api::ProvideRuntimeApi; sp_api::decl_runtime_apis! { /// Session keys runtime api. @@ -44,11 +46,11 @@ pub fn generate_initial_session_keys( client: std::sync::Arc, at: &BlockId, seeds: Vec, -) -> Result<(), <::Api as sp_api::ApiExt>::Error> +) -> Result<(), sp_api::ApiErrorFor> where Block: BlockT, - T: ProvideRuntimeApi, - ::Api: SessionKeys, + T: ProvideRuntimeApi, + T::Api: SessionKeys, { let runtime_api = client.runtime_api(); diff --git a/primitives/sr-api/proc-macro/src/lib.rs b/primitives/sr-api/proc-macro/src/lib.rs new file mode 100644 index 0000000000..589d0749a0 --- /dev/null +++ b/primitives/sr-api/proc-macro/src/lib.rs @@ -0,0 +1,189 @@ +// 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 . + +//! Macros for declaring and implementing runtime apis. + +#![recursion_limit = "512"] +extern crate proc_macro; + +use proc_macro::TokenStream; + +mod impl_runtime_apis; +mod decl_runtime_apis; +mod utils; + +/// Tags given trait implementations as runtime apis. +/// +/// All traits given to this macro, need to be declared with the `decl_runtime_apis!` macro. +/// The implementation of the trait should follow the declaration given to the `decl_runtime_apis!` +/// macro, besides the `Block` type that is required as first generic parameter for each runtime +/// api trait. When implementing a runtime api trait, it is required that the trait is referenced +/// by a path, e.g. `impl my_trait::MyTrait for Runtime`. The macro will use this path to access +/// the declaration of the trait for the runtime side. +/// +/// The macro also generates the api implementations for the client side and provides it through +/// the `RuntimeApi` type. The `RuntimeApi` is hidden behind a `feature` called `std`. +/// +/// To expose version information about all implemented api traits, the constant +/// `RUNTIME_API_VERSIONS` is generated. This constant should be used to instantiate the `apis` +/// field of `RuntimeVersion`. +/// +/// # Example +/// +/// ```rust +/// use sp_version::create_runtime_str; +/// # +/// # use sp_runtime::traits::{GetNodeBlockType, Block as BlockT}; +/// # use test_client::runtime::Block; +/// # +/// # /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// # /// trait are done by the `construct_runtime!` macro in a real runtime. +/// # pub struct Runtime {} +/// # impl GetNodeBlockType for Runtime { +/// # type NodeBlock = Block; +/// # } +/// # +/// # sp_api::decl_runtime_apis! { +/// # /// Declare the api trait. +/// # pub trait Balance { +/// # /// Get the balance. +/// # fn get_balance() -> u64; +/// # /// Set the balance. +/// # fn set_balance(val: u64); +/// # } +/// # pub trait BlockBuilder { +/// # fn build_block() -> Block; +/// # } +/// # } +/// +/// /// All runtime api implementations need to be done in one call of the macro! +/// sp_api::impl_runtime_apis! { +/// # impl sp_api::Core for Runtime { +/// # fn version() -> sp_version::RuntimeVersion { +/// # unimplemented!() +/// # } +/// # fn execute_block(_block: Block) {} +/// # fn initialize_block(_header: &::Header) {} +/// # } +/// +/// impl self::Balance for Runtime { +/// fn get_balance() -> u64 { +/// 1 +/// } +/// fn set_balance(_bal: u64) { +/// // Store the balance +/// } +/// } +/// +/// impl self::BlockBuilder for Runtime { +/// fn build_block() -> Block { +/// unimplemented!("Please implement me!") +/// } +/// } +/// } +/// +/// /// Runtime version. This needs to be declared for each runtime. +/// pub const VERSION: sp_version::RuntimeVersion = sp_version::RuntimeVersion { +/// spec_name: create_runtime_str!("node"), +/// impl_name: create_runtime_str!("test-node"), +/// authoring_version: 1, +/// spec_version: 1, +/// impl_version: 0, +/// // Here we are exposing the runtime api versions. +/// apis: RUNTIME_API_VERSIONS, +/// }; +/// +/// # fn main() {} +/// ``` +#[proc_macro] +pub fn impl_runtime_apis(input: TokenStream) -> TokenStream { + impl_runtime_apis::impl_runtime_apis_impl(input) +} + +/// Declares given traits as runtime apis. +/// +/// The macro will create two declarations, one for using on the client side and one for using +/// on the runtime side. The declaration for the runtime side is hidden in its own module. +/// The client side declaration gets two extra parameters per function, +/// `&self` and `at: &BlockId`. The runtime side declaration will match the given trait +/// declaration. Besides one exception, the macro adds an extra generic parameter `Block: BlockT` +/// to the client side and the runtime side. This generic parameter is usable by the user. +/// +/// For implementing these macros you should use the `impl_runtime_apis!` macro. +/// +/// # Example +/// +/// ```rust +/// sp_api::decl_runtime_apis! { +/// /// Declare the api trait. +/// pub trait Balance { +/// /// Get the balance. +/// fn get_balance() -> u64; +/// /// Set the balance. +/// fn set_balance(val: u64); +/// } +/// +/// /// You can declare multiple api traits in one macro call. +/// /// In one module you can call the macro at maximum one time. +/// pub trait BlockBuilder { +/// /// The macro adds an explicit `Block: BlockT` generic parameter for you. +/// /// You can use this generic parameter as you would defined it manually. +/// fn build_block() -> Block; +/// } +/// } +/// +/// # fn main() {} +/// ``` +/// +/// # Runtime api trait versioning +/// +/// To support versioning of the traits, the macro supports the attribute `#[api_version(1)]`. +/// The attribute supports any `u32` as version. By default, each trait is at version `1`, if no +/// version is provided. We also support changing the signature of a method. This signature +/// change is highlighted with the `#[changed_in(2)]` attribute above a method. A method that is +/// tagged with this attribute is callable by the name `METHOD_before_version_VERSION`. This +/// method will only support calling into wasm, trying to call into native will fail (change the +/// spec version!). Such a method also does not need to be implemented in the runtime. +/// +/// ```rust +/// sp_api::decl_runtime_apis! { +/// /// Declare the api trait. +/// #[api_version(2)] +/// pub trait Balance { +/// /// Get the balance. +/// fn get_balance() -> u64; +/// /// Set balance. +/// fn set_balance(val: u64); +/// /// Set balance, old version. +/// /// +/// /// Is callable by `set_balance_before_version_2`. +/// #[changed_in(2)] +/// fn set_balance(val: u16); +/// /// In version 2, we added this new function. +/// fn increase_balance(val: u64); +/// } +/// } +/// +/// # fn main() {} +/// ``` +/// +/// To check if a given runtime implements a runtime api trait, the `RuntimeVersion` has the +/// function `has_api()`. Also the `ApiExt` provides a function `has_api(at: &BlockId)` to +/// check if the runtime at the given block id implements the requested runtime api trait. +#[proc_macro] +pub fn decl_runtime_apis(input: TokenStream) -> TokenStream { + decl_runtime_apis::decl_runtime_apis_impl(input) +} diff --git a/primitives/state-machine/src/backend.rs b/primitives/state-machine/src/backend.rs index d19d0a1a58..d542dab8ad 100644 --- a/primitives/state-machine/src/backend.rs +++ b/primitives/state-machine/src/backend.rs @@ -16,17 +16,13 @@ //! State machine backends. These manage the code and storage of contracts. -use std::{error, fmt, cmp::Ord, collections::{HashMap, BTreeMap}, marker::PhantomData, ops}; use log::warn; use hash_db::Hasher; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::TrieBackendStorage; -use sp_trie::{ - TrieMut, MemoryDB, child_trie_root, default_child_trie_root, TrieConfiguration, - trie_types::{TrieDBMut, Layout}, -}; -use codec::{Encode, Codec}; -use sp_core::storage::{ChildInfo, OwnedChildInfo, Storage}; +use sp_trie::{TrieMut, MemoryDB, trie_types::TrieDBMut}; +use codec::Encode; +use sp_core::storage::{ChildInfo, OwnedChildInfo}; /// A state backend is used to read state data and can have changes committed /// to it. @@ -37,7 +33,7 @@ pub trait Backend: std::fmt::Debug { type Error: super::Error; /// Storage changes to be applied if committing - type Transaction: Consolidate + Default; + type Transaction: Consolidate + Default + Send; /// Type of trie backend storage. type TrieBackendStorage: TrieBackendStorage; @@ -317,329 +313,6 @@ impl> Consolidate for sp_trie::GenericMem } } -/// Error impossible. -// FIXME: use `!` type when stabilized. https://github.com/rust-lang/rust/issues/35121 -#[derive(Debug)] -pub enum Void {} - -impl fmt::Display for Void { - fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { - match *self {} - } -} - -impl error::Error for Void { - fn description(&self) -> &str { "unreachable error" } -} - -/// In-memory backend. Fully recomputes tries each time `as_trie_backend` is called but useful for -/// tests and proof checking. -pub struct InMemory { - inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>>, - // This field is only needed for returning reference in `as_trie_backend`. - trie: Option, H>>, - _hasher: PhantomData, -} - -impl std::fmt::Debug for InMemory { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "InMemory ({} values)", self.inner.len()) - } -} - -impl Default for InMemory { - fn default() -> Self { - InMemory { - inner: Default::default(), - trie: None, - _hasher: PhantomData, - } - } -} - -impl Clone for InMemory { - fn clone(&self) -> Self { - InMemory { - inner: self.inner.clone(), - trie: None, - _hasher: PhantomData, - } - } -} - -impl PartialEq for InMemory { - fn eq(&self, other: &Self) -> bool { - self.inner.eq(&other.inner) - } -} - -impl InMemory where H::Out: Codec { - /// Copy the state, with applied updates - pub fn update(&self, changes: >::Transaction) -> Self { - let mut inner = self.inner.clone(); - for (child_info, key_values) in changes { - let entry = inner.entry(child_info).or_default(); - for (key, val) in key_values { - match val { - Some(v) => { entry.insert(key, v); }, - None => { entry.remove(&key); }, - } - } - } - inner.into() - } -} - -impl From, OwnedChildInfo)>, BTreeMap, Vec>>> for InMemory { - fn from(inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>>) -> Self { - InMemory { - inner: inner, - trie: None, - _hasher: PhantomData, - } - } -} - -impl From for InMemory { - fn from(inners: Storage) -> Self { - let mut inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>> - = inners.children.into_iter().map(|(k, c)| (Some((k, c.child_info)), c.data)).collect(); - inner.insert(None, inners.top); - InMemory { - inner: inner, - trie: None, - _hasher: PhantomData, - } - } -} - -impl From, Vec>> for InMemory { - fn from(inner: BTreeMap, Vec>) -> Self { - let mut expanded = HashMap::new(); - expanded.insert(None, inner); - InMemory { - inner: expanded, - trie: None, - _hasher: PhantomData, - } - } -} - -impl From, OwnedChildInfo)>, Vec<(Vec, Option>)>)>> - for InMemory { - fn from( - inner: Vec<(Option<(Vec, OwnedChildInfo)>, Vec<(Vec, Option>)>)>, - ) -> Self { - let mut expanded: HashMap, OwnedChildInfo)>, BTreeMap, Vec>> - = HashMap::new(); - for (child_info, key_values) in inner { - let entry = expanded.entry(child_info).or_default(); - for (key, value) in key_values { - if let Some(value) = value { - entry.insert(key, value); - } - } - } - expanded.into() - } -} - -impl InMemory { - /// child storage key iterator - pub fn child_storage_keys(&self) -> impl Iterator { - self.inner.iter().filter_map(|item| - item.0.as_ref().map(|v|(&v.0[..], v.1.as_ref())) - ) - } -} - -impl Backend for InMemory where H::Out: Codec { - type Error = Void; - type Transaction = Vec<( - Option<(Vec, OwnedChildInfo)>, - Vec<(Vec, Option>)>, - )>; - type TrieBackendStorage = MemoryDB; - - fn storage(&self, key: &[u8]) -> Result>, Self::Error> { - Ok(self.inner.get(&None).and_then(|map| map.get(key).map(Clone::clone))) - } - - fn child_storage( - &self, - storage_key: &[u8], - child_info: ChildInfo, - key: &[u8], - ) -> Result>, Self::Error> { - Ok(self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) - .and_then(|map| map.get(key).map(Clone::clone))) - } - - fn exists_storage(&self, key: &[u8]) -> Result { - Ok(self.inner.get(&None).map(|map| map.get(key).is_some()).unwrap_or(false)) - } - - fn next_storage_key(&self, key: &[u8]) -> Result>, Self::Error> { - let range = (ops::Bound::Excluded(key), ops::Bound::Unbounded); - let next_key = self.inner.get(&None) - .and_then(|map| map.range::<[u8], _>(range).next().map(|(k, _)| k).cloned()); - - Ok(next_key) - } - - fn next_child_storage_key( - &self, - storage_key: &[u8], - child_info: ChildInfo, - key: &[u8], - ) -> Result>, Self::Error> { - let range = (ops::Bound::Excluded(key), ops::Bound::Unbounded); - let next_key = self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) - .and_then(|map| map.range::<[u8], _>(range).next().map(|(k, _)| k).cloned()); - - Ok(next_key) - } - - fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { - self.inner.get(&None).map(|map| map.keys().filter(|key| key.starts_with(prefix)).map(|k| &**k).for_each(f)); - } - - fn for_key_values_with_prefix(&self, prefix: &[u8], mut f: F) { - self.inner.get(&None).map(|map| map.iter().filter(|(key, _val)| key.starts_with(prefix)) - .for_each(|(k, v)| f(k, v))); - } - - fn for_keys_in_child_storage( - &self, - storage_key: &[u8], - child_info: ChildInfo, - mut f: F, - ) { - self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) - .map(|map| map.keys().for_each(|k| f(&k))); - } - - fn for_child_keys_with_prefix( - &self, - storage_key: &[u8], - child_info: ChildInfo, - prefix: &[u8], - f: F, - ) { - self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) - .map(|map| map.keys().filter(|key| key.starts_with(prefix)).map(|k| &**k).for_each(f)); - } - - fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) - where - I: IntoIterator, Option>)>, - ::Out: Ord, - { - let existing_pairs = self.inner.get(&None) - .into_iter() - .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); - - let transaction: Vec<_> = delta.into_iter().collect(); - let root = Layout::::trie_root(existing_pairs.chain(transaction.iter().cloned()) - .collect::>() - .into_iter() - .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) - ); - - let full_transaction = transaction.into_iter().collect(); - - (root, vec![(None, full_transaction)]) - } - - fn child_storage_root( - &self, - storage_key: &[u8], - child_info: ChildInfo, - delta: I, - ) -> (H::Out, bool, Self::Transaction) - where - I: IntoIterator, Option>)>, - H::Out: Ord - { - let storage_key = storage_key.to_vec(); - let child_info = Some((storage_key.clone(), child_info.to_owned())); - - - let existing_pairs = self.inner.get(&child_info) - .into_iter() - .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); - - let transaction: Vec<_> = delta.into_iter().collect(); - let root = child_trie_root::, _, _, _>( - &storage_key, - existing_pairs.chain(transaction.iter().cloned()) - .collect::>() - .into_iter() - .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) - ); - - let full_transaction = transaction.into_iter().collect(); - - let is_default = root == default_child_trie_root::>(&storage_key); - - (root, is_default, vec![(child_info, full_transaction)]) - } - - fn pairs(&self) -> Vec<(Vec, Vec)> { - self.inner.get(&None) - .into_iter() - .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))) - .collect() - } - - fn keys(&self, prefix: &[u8]) -> Vec> { - self.inner.get(&None) - .into_iter() - .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) - .collect() - } - - fn child_keys( - &self, - storage_key: &[u8], - child_info: ChildInfo, - prefix: &[u8], - ) -> Vec> { - self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) - .into_iter() - .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) - .collect() - } - - fn as_trie_backend(&mut self)-> Option<&TrieBackend> { - let mut mdb = MemoryDB::default(); - let mut new_child_roots = Vec::new(); - let mut root_map = None; - for (child_info, map) in &self.inner { - if let Some((storage_key, _child_info)) = child_info.as_ref() { - // no need to use child_info at this point because we use a MemoryDB for - // proof (with PrefixedMemoryDB it would be needed). - 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); - } - } - let root = match root_map { - Some(map) => insert_into_memory_db::( - &mut mdb, - map.clone().into_iter().chain(new_child_roots.into_iter()), - )?, - None => insert_into_memory_db::( - &mut mdb, - new_child_roots.into_iter(), - )?, - }; - self.trie = Some(TrieBackend::new(mdb, root)); - self.trie.as_ref() - } -} - /// Insert input pairs into memory db. pub(crate) fn insert_into_memory_db(mdb: &mut MemoryDB, input: I) -> Option where @@ -659,25 +332,3 @@ pub(crate) fn insert_into_memory_db(mdb: &mut MemoryDB, input: I) -> Op Some(root) } - -#[cfg(test)] -mod tests { - use super::*; - - /// Assert in memory backend with only child trie keys works as trie backend. - #[test] - fn in_memory_with_child_trie_only() { - let storage = InMemory::::default(); - let child_info = OwnedChildInfo::new_default(b"unique_id_1".to_vec()); - let mut storage = storage.update( - vec![( - Some((b"1".to_vec(), child_info.clone())), - vec![(b"2".to_vec(), Some(b"3".to_vec()))] - )] - ); - let trie_backend = storage.as_trie_backend().unwrap(); - assert_eq!(trie_backend.child_storage(b"1", child_info.as_ref(), b"2").unwrap(), - Some(b"3".to_vec())); - assert!(trie_backend.storage(b"1").unwrap().is_some()); - } -} diff --git a/primitives/state-machine/src/basic.rs b/primitives/state-machine/src/basic.rs index c0db807335..d06aedfc4b 100644 --- a/primitives/state-machine/src/basic.rs +++ b/primitives/state-machine/src/basic.rs @@ -19,7 +19,7 @@ use std::{ collections::BTreeMap, any::{TypeId, Any}, iter::FromIterator, ops::Bound }; -use crate::backend::{Backend, InMemory}; +use crate::{Backend, InMemoryBackend}; use hash_db::Hasher; use sp_trie::{TrieConfiguration, default_child_trie_root}; use sp_trie::trie_types::Layout; @@ -288,7 +288,7 @@ impl Externalities for BasicExternalities { if let Some(child) = self.inner.children.get(storage_key.as_ref()) { let delta = child.data.clone().into_iter().map(|(k, v)| (k, Some(v))); - InMemory::::default() + InMemoryBackend::::default() .child_storage_root(storage_key.as_ref(), child.child_info.as_ref(), delta).0 } else { default_child_trie_root::>(storage_key.as_ref()) diff --git a/primitives/state-machine/src/changes_trie/build.rs b/primitives/state-machine/src/changes_trie/build.rs index 38e60e8fcf..ded8e4f6d1 100644 --- a/primitives/state-machine/src/changes_trie/build.rs +++ b/primitives/state-machine/src/changes_trie/build.rs @@ -339,9 +339,9 @@ fn prepare_digest_input<'a, H, Number>( mod test { use codec::Encode; use sp_core::Blake2Hasher; - use sp_core::storage::well_known_keys::{EXTRINSIC_INDEX}; + use sp_core::storage::well_known_keys::EXTRINSIC_INDEX; use sp_core::storage::ChildInfo; - use crate::backend::InMemory; + use crate::InMemoryBackend; use crate::changes_trie::{RootsStorage, Configuration, storage::InMemoryStorage}; use crate::changes_trie::build_cache::{IncompleteCacheAction, IncompleteCachedBuildData}; use crate::overlayed_changes::{OverlayedValue, OverlayedChangeSet}; @@ -351,20 +351,20 @@ mod test { const CHILD_INFO_2: ChildInfo<'static> = ChildInfo::new_default(b"unique_id_2"); fn prepare_for_build(zero: u64) -> ( - InMemory, + InMemoryBackend, InMemoryStorage, OverlayedChanges, Configuration, ) { let config = Configuration { digest_interval: 4, digest_levels: 2 }; - let backend: InMemory<_> = vec![ + let backend: InMemoryBackend<_> = vec![ (vec![100], vec![255]), (vec![101], vec![255]), (vec![102], vec![255]), (vec![103], vec![255]), (vec![104], vec![255]), (vec![105], vec![255]), - ].into_iter().collect::<::std::collections::BTreeMap<_, _>>().into(); + ].into_iter().collect::>().into(); let child_trie_key1 = b"1".to_vec(); let child_trie_key2 = b"2".to_vec(); let storage = InMemoryStorage::with_inputs(vec![ diff --git a/primitives/state-machine/src/changes_trie/mod.rs b/primitives/state-machine/src/changes_trie/mod.rs index 99ef7fd6ee..cb19d157dd 100644 --- a/primitives/state-machine/src/changes_trie/mod.rs +++ b/primitives/state-machine/src/changes_trie/mod.rs @@ -84,37 +84,37 @@ 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 + + std::fmt::Display + Clone + From + TryInto + One + Zero + PartialEq + Ord + - ::std::hash::Hash + - ::std::ops::Add + ::std::ops::Sub + - ::std::ops::Mul + ::std::ops::Div + - ::std::ops::Rem + - ::std::ops::AddAssign + + std::hash::Hash + + 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 + + std::fmt::Display + Clone + From + TryInto + One + Zero + PartialEq + Ord + - ::std::hash::Hash + - ::std::ops::Add + ::std::ops::Sub + - ::std::ops::Mul + ::std::ops::Div + - ::std::ops::Rem + - ::std::ops::AddAssign + + std::hash::Hash + + 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. @@ -173,12 +173,14 @@ pub struct ConfigurationRange<'a, N> { /// Compute the changes trie root and transaction for given block. /// 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 OR if insert to MemoryDB fails. +/// Panics if background storage returns an error (and `panic_on_storage_error` is `true`) OR +/// if insert to MemoryDB fails. pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, Number: BlockNumber>( backend: &B, storage: Option<&'a S>, changes: &OverlayedChanges, parent_hash: H::Out, + panic_on_storage_error: bool, ) -> Result, H::Out, CacheAction)>, ()> where H::Out: Ord + 'static + Encode, @@ -188,6 +190,19 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N _ => return Ok(None), }; + /// Panics when `res.is_err() && panic`, otherwise it returns `Err(())` on an error. + fn maybe_panic( + res: std::result::Result, + panic: bool, + ) -> std::result::Result { + res.map(Ok) + .unwrap_or_else(|e| if panic { + panic!("changes trie: storage access is not allowed to fail within runtime: {:?}", e) + } else { + Err(()) + }) + } + // FIXME: remove this in https://github.com/paritytech/substrate/pull/3201 let config = ConfigurationRange { config, @@ -200,13 +215,16 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N let block = parent.number.clone() + One::one(); // storage errors are considered fatal (similar to situations when runtime fetches values from storage) - let (input_pairs, child_input_pairs, digest_input_blocks) = prepare_input::( - backend, - storage, - config.clone(), - changes, - &parent, - ).expect("changes trie: storage access is not allowed to fail within runtime"); + let (input_pairs, child_input_pairs, digest_input_blocks) = maybe_panic( + prepare_input::( + backend, + storage, + config.clone(), + changes, + &parent, + ), + panic_on_storage_error, + )?; // prepare cached data let mut cache_action = prepare_cached_build_data(config, block.clone()); @@ -230,8 +248,7 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N let (key, value) = input_pair.into(); not_empty = true; - trie.insert(&key, &value) - .expect("changes trie: insertion to trie is not allowed to fail within runtime"); + maybe_panic(trie.insert(&key, &value), panic_on_storage_error)?; } cache_action = cache_action.insert( @@ -247,8 +264,7 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N { let mut trie = TrieDBMut::::new(&mut mdb, &mut root); for (key, value) in child_roots.into_iter().map(Into::into) { - trie.insert(&key, &value) - .expect("changes trie: insertion to trie is not allowed to fail within runtime"); + maybe_panic(trie.insert(&key, &value), panic_on_storage_error)?; } let mut storage_changed_keys = HashSet::new(); @@ -260,9 +276,9 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N } let (key, value) = input_pair.into(); - trie.insert(&key, &value) - .expect("changes trie: insertion to trie is not allowed to fail within runtime"); + maybe_panic(trie.insert(&key, &value), panic_on_storage_error)?; } + cache_action = cache_action.insert( None, storage_changed_keys, diff --git a/primitives/state-machine/src/changes_trie/storage.rs b/primitives/state-machine/src/changes_trie/storage.rs index 37dc607f63..163ea7f412 100644 --- a/primitives/state-machine/src/changes_trie/storage.rs +++ b/primitives/state-machine/src/changes_trie/storage.rs @@ -38,7 +38,7 @@ pub struct InMemoryStorage { /// Adapter for using changes trie storage as a TrieBackendEssence' storage. pub struct TrieBackendAdapter<'a, H: Hasher, Number: BlockNumber> { storage: &'a dyn Storage, - _hasher: ::std::marker::PhantomData<(H, Number)>, + _hasher: std::marker::PhantomData<(H, Number)>, } struct InMemoryStorageData { diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index 2da70eff24..6fc4312d10 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -17,18 +17,16 @@ //! Concrete externalities implementation. use crate::{ - backend::Backend, OverlayedChanges, - changes_trie::{ - Storage as ChangesTrieStorage, CacheAction as ChangesTrieCacheAction, build_changes_trie, - }, + backend::Backend, OverlayedChanges, StorageTransactionCache, + changes_trie::Storage as ChangesTrieStorage, }; use hash_db::Hasher; use sp_core::{ storage::{ChildStorageKey, well_known_keys::is_child_storage_key, ChildInfo}, - traits::Externalities, hexdisplay::HexDisplay, hash::H256, + traits::Externalities, hexdisplay::HexDisplay, }; -use sp_trie::{trie_types::Layout, MemoryDB, default_child_trie_root}; +use sp_trie::{trie_types::Layout, default_child_trie_root}; use sp_externalities::Extensions; use codec::{Decode, Encode}; @@ -67,23 +65,20 @@ impl error::Error for Error { } /// Wraps a read-only backend, call executor, and current overlayed changes. -pub struct Ext<'a, H, N, B, T> where H: Hasher, B: 'a + Backend { +pub struct Ext<'a, H, N, B, T> + where + H: Hasher, + B: 'a + Backend, + N: crate::changes_trie::BlockNumber, +{ /// The overlayed changes to write to. overlay: &'a mut OverlayedChanges, /// The storage backend to read from. backend: &'a B, - /// The storage transaction necessary to commit to the backend. Is cached when - /// `storage_root` is called and the cache is cleared on every subsequent change. - storage_transaction: Option<(B::Transaction, H::Out)>, + /// The cache for the storage transactions. + storage_transaction_cache: &'a mut StorageTransactionCache, /// Changes trie storage to read from. changes_trie_storage: Option<&'a T>, - /// The changes trie transaction necessary to commit to the changes trie backend. - /// Set to Some when `storage_changes_root` is called. Could be replaced later - /// by calling `storage_changes_root` again => never used as cache. - /// 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<(MemoryDB, H::Out, ChangesTrieCacheAction)>, /// Pseudo-unique id used for tracing. pub id: u16, /// Dummy usage of N arg. @@ -94,7 +89,8 @@ pub struct Ext<'a, H, N, B, T> where H: Hasher, B: 'a + Backend { impl<'a, H, N, B, T> Ext<'a, H, N, B, T> where - H: Hasher, + H: Hasher, + H::Out: Ord + 'static + codec::Codec, B: 'a + Backend, T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, @@ -103,6 +99,7 @@ where /// Create a new `Ext` from overlayed changes and read-only backend pub fn new( overlay: &'a mut OverlayedChanges, + storage_transaction_cache: &'a mut StorageTransactionCache, backend: &'a B, changes_trie_storage: Option<&'a T>, extensions: Option<&'a mut Extensions>, @@ -110,49 +107,27 @@ where Ext { overlay, backend, - storage_transaction: None, changes_trie_storage, - changes_trie_transaction: None, + storage_transaction_cache, id: rand::random(), _phantom: Default::default(), extensions, } } - /// Get the transaction necessary to update the backend. - pub fn transaction(&mut self) -> ( - (B::Transaction, H256), - Option>, - ) { - let _ = self.storage_root(); - - let (storage_transaction, changes_trie_transaction) = ( - self.storage_transaction - .take() - .expect("storage_transaction always set after calling storage root; qed"), - self.changes_trie_transaction - .take() - .map(|(tx, _, cache)| (tx, cache)), - ); - - ( - storage_transaction, - changes_trie_transaction, - ) - } - /// Invalidates the currently cached storage root and the db transaction. /// /// Called when there are changes that likely will invalidate the storage root. fn mark_dirty(&mut self) { - self.storage_transaction = None; + self.storage_transaction_cache.reset(); } } #[cfg(test)] impl<'a, H, N, B, T> Ext<'a, H, N, B, T> where - H: Hasher, + H: Hasher, + H::Out: Ord + 'static, B: 'a + Backend, T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, @@ -173,7 +148,8 @@ where impl<'a, H, B, T, N> Externalities for Ext<'a, H, N, B, T> where - H: Hasher, + H: Hasher, + H::Out: Ord + 'static + codec::Codec, B: 'a + Backend, T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, @@ -295,6 +271,7 @@ where HexDisplay::from(&key), result.as_ref().map(HexDisplay::from), ); + result } @@ -330,8 +307,8 @@ where HexDisplay::from(&key), result, ); - result + result } fn exists_child_storage( @@ -499,7 +476,7 @@ where fn storage_root(&mut self) -> Vec { let _guard = sp_panic_handler::AbortGuard::force_abort(); - if let Some((_, ref root)) = self.storage_transaction { + if let Some(ref root) = self.storage_transaction_cache.transaction_storage_root { trace!(target: "state-trace", "{:04x}: Root (cached) {}", self.id, HexDisplay::from(&root.as_ref()), @@ -507,35 +484,8 @@ where return root.encode(); } - let child_storage_keys = self.overlay.prospective.children.keys() - .chain(self.overlay.committed.children.keys()); - let child_delta_iter = child_storage_keys.map(|storage_key| - ( - storage_key.clone(), - self.overlay.committed.children.get(storage_key) - .into_iter() - .flat_map(|(map, _)| map.iter().map(|(k, v)| (k.clone(), v.value.clone()))) - .chain( - self.overlay.prospective.children.get(storage_key) - .into_iter() - .flat_map(|(map, _)| map.iter().map(|(k, v)| (k.clone(), v.value.clone()))) - ), - self.overlay.child_info(storage_key).cloned() - .expect("child info initialized in either committed or prospective"), - ) - ); - - - // compute and memoize - let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) - .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); - - let (root, transaction) = self.backend.full_storage_root(delta, child_delta_iter); - self.storage_transaction = Some((transaction, root)); - trace!(target: "state-trace", "{:04x}: Root {}", - self.id, - HexDisplay::from(&root.as_ref()), - ); + let root = self.overlay.storage_root(self.backend, self.storage_transaction_cache); + trace!(target: "state-trace", "{:04x}: Root {}", self.id, HexDisplay::from(&root.as_ref())); root.encode() } @@ -544,7 +494,7 @@ where storage_key: ChildStorageKey, ) -> Vec { let _guard = sp_panic_handler::AbortGuard::force_abort(); - if self.storage_transaction.is_some() { + if self.storage_transaction_cache.transaction_storage_root.is_some() { let root = self .storage(storage_key.as_ref()) .and_then(|k| Decode::decode(&mut &k[..]).ok()) @@ -612,35 +562,33 @@ where fn storage_changes_root(&mut self, parent_hash: &[u8]) -> Result>, ()> { let _guard = sp_panic_handler::AbortGuard::force_abort(); - - self.changes_trie_transaction = build_changes_trie::<_, T, H, N>( + let root = self.overlay.changes_trie_root( self.backend, self.changes_trie_storage.clone(), - self.overlay, - H256::decode(&mut &parent_hash[..]).map_err(|e| + Decode::decode(&mut &parent_hash[..]).map_err(|e| trace!( target: "state-trace", "Failed to decode changes root parent hash: {}", e, ) )?, - )?; - let result = Ok( - self.changes_trie_transaction.as_ref().map(|(_, root, _)| root.encode()) + true, + self.storage_transaction_cache, ); trace!(target: "state-trace", "{:04x}: ChangesRoot({}) {:?}", self.id, - HexDisplay::from(&parent_hash.as_ref()), - result, + HexDisplay::from(&parent_hash), + root, ); - result + + root.map(|r| r.map(|o| o.encode())) } } impl<'a, H, B, T, N> sp_externalities::ExtensionStore for Ext<'a, H, N, B, T> where - H: Hasher, + H: Hasher, B: 'a + Backend, T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, @@ -655,16 +603,16 @@ mod tests { use super::*; use hex_literal::hex; use codec::Encode; - use sp_core::{Blake2Hasher, storage::well_known_keys::EXTRINSIC_INDEX, map}; + use sp_core::{H256, Blake2Hasher, storage::well_known_keys::EXTRINSIC_INDEX, map}; use crate::{ changes_trie::{ Configuration as ChangesTrieConfiguration, InMemoryStorage as InMemoryChangesTrieStorage, - }, backend::InMemory, overlayed_changes::OverlayedValue, + }, InMemoryBackend, overlayed_changes::OverlayedValue, }; use sp_core::storage::{Storage, StorageChild}; - type TestBackend = InMemory; + type TestBackend = InMemoryBackend; type TestChangesTrieStorage = InMemoryChangesTrieStorage; type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend, TestChangesTrieStorage>; @@ -691,27 +639,30 @@ mod tests { #[test] fn storage_changes_root_is_none_when_storage_is_not_provided() { let mut overlay = prepare_overlay_with_changes(); + let mut cache = StorageTransactionCache::default(); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, None, None); + let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, None, None); assert_eq!(ext.storage_changes_root(&H256::default().encode()).unwrap(), None); } #[test] fn storage_changes_root_is_none_when_extrinsic_changes_are_none() { let mut overlay = prepare_overlay_with_changes(); + let mut cache = StorageTransactionCache::default(); overlay.changes_trie_config = None; let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, Some(&storage), None); assert_eq!(ext.storage_changes_root(&H256::default().encode()).unwrap(), None); } #[test] fn storage_changes_root_is_some_when_extrinsic_changes_are_non_empty() { let mut overlay = prepare_overlay_with_changes(); + let mut cache = StorageTransactionCache::default(); let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, Some(&storage), None); assert_eq!( ext.storage_changes_root(&H256::default().encode()).unwrap(), Some(hex!("bb0c2ef6e1d36d5490f9766cfcc7dfe2a6ca804504c3bb206053890d6dd02376").to_vec()), @@ -721,10 +672,11 @@ mod tests { #[test] fn storage_changes_root_is_some_when_extrinsic_changes_are_empty() { let mut overlay = prepare_overlay_with_changes(); + let mut cache = StorageTransactionCache::default(); overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, Some(&storage), None); assert_eq!( ext.storage_changes_root(&H256::default().encode()).unwrap(), Some(hex!("96f5aae4690e7302737b6f9b7f8567d5bbb9eac1c315f80101235a92d9ec27f4").to_vec()), @@ -733,6 +685,7 @@ mod tests { #[test] fn next_storage_key_works() { + let mut cache = StorageTransactionCache::default(); let mut overlay = OverlayedChanges::default(); overlay.set_storage(vec![20], None); overlay.set_storage(vec![30], Some(vec![31])); @@ -745,7 +698,7 @@ mod tests { children: map![] }.into(); - let ext = TestExt::new(&mut overlay, &backend, None, None); + let ext = TestExt::new(&mut overlay, &mut cache, &backend, None, None); // next_backend < next_overlay assert_eq!(ext.next_storage_key(&[5]), Some(vec![10])); @@ -761,7 +714,7 @@ mod tests { drop(ext); overlay.set_storage(vec![50], Some(vec![50])); - let ext = TestExt::new(&mut overlay, &backend, None, None); + let ext = TestExt::new(&mut overlay, &mut cache, &backend, None, None); // next_overlay exist but next_backend doesn't exist assert_eq!(ext.next_storage_key(&[40]), Some(vec![50])); @@ -774,7 +727,7 @@ mod tests { const CHILD_UUID_1: &[u8] = b"unique_id_1"; const CHILD_INFO_1: ChildInfo<'static> = ChildInfo::new_default(CHILD_UUID_1); - + let mut cache = StorageTransactionCache::default(); let child = || ChildStorageKey::from_slice(CHILD_KEY_1).unwrap(); let mut overlay = OverlayedChanges::default(); overlay.set_child_storage(child().as_ref().to_vec(), CHILD_INFO_1, vec![20], None); @@ -794,7 +747,7 @@ mod tests { }.into(); - let ext = TestExt::new(&mut overlay, &backend, None, None); + let ext = TestExt::new(&mut overlay, &mut cache, &backend, None, None); // next_backend < next_overlay assert_eq!(ext.next_child_storage_key(child(), CHILD_INFO_1, &[5]), Some(vec![10])); @@ -810,7 +763,7 @@ mod tests { drop(ext); overlay.set_child_storage(child().as_ref().to_vec(), CHILD_INFO_1, vec![50], Some(vec![50])); - let ext = TestExt::new(&mut overlay, &backend, None, None); + let ext = TestExt::new(&mut overlay, &mut cache, &backend, None, None); // next_overlay exist but next_backend doesn't exist assert_eq!(ext.next_child_storage_key(child(), CHILD_INFO_1, &[40]), Some(vec![50])); diff --git a/primitives/state-machine/src/in_memory_backend.rs b/primitives/state-machine/src/in_memory_backend.rs new file mode 100644 index 0000000000..ae1a214a72 --- /dev/null +++ b/primitives/state-machine/src/in_memory_backend.rs @@ -0,0 +1,378 @@ +// 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 . + +//! State machine in memory backend. + +use crate::{trie_backend::TrieBackend, backend::{Backend, insert_into_memory_db}}; +use std::{error, fmt, collections::{BTreeMap, HashMap}, marker::PhantomData, ops}; +use hash_db::Hasher; +use sp_trie::{ + MemoryDB, child_trie_root, default_child_trie_root, TrieConfiguration, trie_types::Layout, +}; +use codec::Codec; +use sp_core::storage::{ChildInfo, OwnedChildInfo, Storage}; + +/// Error impossible. +// FIXME: use `!` type when stabilized. https://github.com/rust-lang/rust/issues/35121 +#[derive(Debug)] +pub enum Void {} + +impl fmt::Display for Void { + fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { + match *self {} + } +} + +impl error::Error for Void { + fn description(&self) -> &str { "unreachable error" } +} + +/// In-memory backend. Fully recomputes tries each time `as_trie_backend` is called but useful for +/// tests and proof checking. +pub struct InMemory { + inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>>, + // This field is only needed for returning reference in `as_trie_backend`. + trie: Option, H>>, + _hasher: PhantomData, +} + +impl std::fmt::Debug for InMemory { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "InMemory ({} values)", self.inner.len()) + } +} + +impl Default for InMemory { + fn default() -> Self { + InMemory { + inner: Default::default(), + trie: None, + _hasher: PhantomData, + } + } +} + +impl Clone for InMemory { + fn clone(&self) -> Self { + InMemory { + inner: self.inner.clone(), + trie: None, + _hasher: PhantomData, + } + } +} + +impl PartialEq for InMemory { + fn eq(&self, other: &Self) -> bool { + self.inner.eq(&other.inner) + } +} + +impl InMemory { + /// Copy the state, with applied updates + pub fn update< + T: IntoIterator, OwnedChildInfo)>, Vec<(Vec, Option>)>)> + >( + &self, + changes: T, + ) -> Self { + let mut inner = self.inner.clone(); + for (child_info, key_values) in changes.into_iter() { + let entry = inner.entry(child_info).or_default(); + for (key, val) in key_values { + match val { + Some(v) => { entry.insert(key, v); }, + None => { entry.remove(&key); }, + } + } + } + inner.into() + } +} + +impl From, OwnedChildInfo)>, BTreeMap, Vec>>> + for InMemory +{ + fn from(inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>>) -> Self { + InMemory { + inner, + trie: None, + _hasher: PhantomData, + } + } +} + +impl From for InMemory { + fn from(inners: Storage) -> Self { + let mut inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>> + = inners.children.into_iter().map(|(k, c)| (Some((k, c.child_info)), c.data)).collect(); + inner.insert(None, inners.top); + InMemory { + inner, + trie: None, + _hasher: PhantomData, + } + } +} + +impl From, Vec>> for InMemory { + fn from(inner: BTreeMap, Vec>) -> Self { + let mut expanded = HashMap::new(); + expanded.insert(None, inner); + InMemory { + inner: expanded, + trie: None, + _hasher: PhantomData, + } + } +} + +impl From, OwnedChildInfo)>, Vec<(Vec, Option>)>)>> + for InMemory { + fn from( + inner: Vec<(Option<(Vec, OwnedChildInfo)>, Vec<(Vec, Option>)>)>, + ) -> Self { + let mut expanded: HashMap, OwnedChildInfo)>, BTreeMap, Vec>> + = HashMap::new(); + for (child_info, key_values) in inner { + let entry = expanded.entry(child_info).or_default(); + for (key, value) in key_values { + if let Some(value) = value { + entry.insert(key, value); + } + } + } + expanded.into() + } +} + +impl InMemory { + /// child storage key iterator + pub fn child_storage_keys(&self) -> impl Iterator { + self.inner.iter().filter_map(|item| + item.0.as_ref().map(|v|(&v.0[..], v.1.as_ref())) + ) + } +} + +impl Backend for InMemory where H::Out: Codec { + type Error = Void; + type Transaction = Vec<( + Option<(Vec, OwnedChildInfo)>, + Vec<(Vec, Option>)>, + )>; + type TrieBackendStorage = MemoryDB; + + fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + Ok(self.inner.get(&None).and_then(|map| map.get(key).map(Clone::clone))) + } + + fn child_storage( + &self, + storage_key: &[u8], + child_info: ChildInfo, + key: &[u8], + ) -> Result>, Self::Error> { + Ok(self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) + .and_then(|map| map.get(key).map(Clone::clone))) + } + + fn exists_storage(&self, key: &[u8]) -> Result { + Ok(self.inner.get(&None).map(|map| map.get(key).is_some()).unwrap_or(false)) + } + + fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { + self.inner.get(&None) + .map(|map| map.keys().filter(|key| key.starts_with(prefix)).map(|k| &**k).for_each(f)); + } + + fn for_key_values_with_prefix(&self, prefix: &[u8], mut f: F) { + self.inner.get(&None).map(|map| map.iter().filter(|(key, _val)| key.starts_with(prefix)) + .for_each(|(k, v)| f(k, v))); + } + + fn for_keys_in_child_storage( + &self, + storage_key: &[u8], + child_info: ChildInfo, + mut f: F, + ) { + self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) + .map(|map| map.keys().for_each(|k| f(&k))); + } + + fn for_child_keys_with_prefix( + &self, + storage_key: &[u8], + child_info: ChildInfo, + prefix: &[u8], + f: F, + ) { + self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) + .map(|map| map.keys().filter(|key| key.starts_with(prefix)).map(|k| &**k).for_each(f)); + } + + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) + where + I: IntoIterator, Option>)>, + ::Out: Ord, + { + let existing_pairs = self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + + let transaction: Vec<_> = delta.into_iter().collect(); + let root = Layout::::trie_root(existing_pairs.chain(transaction.iter().cloned()) + .collect::>() + .into_iter() + .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) + ); + + let full_transaction = transaction.into_iter().collect(); + + (root, vec![(None, full_transaction)]) + } + + fn child_storage_root( + &self, + storage_key: &[u8], + child_info: ChildInfo, + delta: I, + ) -> (H::Out, bool, Self::Transaction) + where + I: IntoIterator, Option>)>, + H::Out: Ord + { + let storage_key = storage_key.to_vec(); + let child_info = Some((storage_key.clone(), child_info.to_owned())); + + let existing_pairs = self.inner.get(&child_info) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + + let transaction: Vec<_> = delta.into_iter().collect(); + let root = child_trie_root::, _, _, _>( + &storage_key, + existing_pairs.chain(transaction.iter().cloned()) + .collect::>() + .into_iter() + .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) + ); + + let full_transaction = transaction.into_iter().collect(); + + let is_default = root == default_child_trie_root::>(&storage_key); + + (root, is_default, vec![(child_info, full_transaction)]) + } + + fn next_storage_key(&self, key: &[u8]) -> Result>, Self::Error> { + let range = (ops::Bound::Excluded(key), ops::Bound::Unbounded); + let next_key = self.inner.get(&None) + .and_then(|map| map.range::<[u8], _>(range).next().map(|(k, _)| k).cloned()); + + Ok(next_key) + } + + fn next_child_storage_key( + &self, + storage_key: &[u8], + child_info: ChildInfo, + key: &[u8], + ) -> Result>, Self::Error> { + let range = (ops::Bound::Excluded(key), ops::Bound::Unbounded); + let next_key = self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) + .and_then(|map| map.range::<[u8], _>(range).next().map(|(k, _)| k).cloned()); + + Ok(next_key) + } + + fn pairs(&self) -> Vec<(Vec, Vec)> { + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))) + .collect() + } + + fn keys(&self, prefix: &[u8]) -> Vec> { + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() + } + + fn child_keys( + &self, + storage_key: &[u8], + child_info: ChildInfo, + prefix: &[u8], + ) -> Vec> { + self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() + } + + fn as_trie_backend(&mut self)-> Option<&TrieBackend> { + let mut mdb = MemoryDB::default(); + let mut new_child_roots = Vec::new(); + let mut root_map = None; + for (child_info, map) in &self.inner { + if let Some((storage_key, _child_info)) = child_info.as_ref() { + // no need to use child_info at this point because we use a MemoryDB for + // proof (with PrefixedMemoryDB it would be needed). + 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); + } + } + let root = match root_map { + Some(map) => insert_into_memory_db::( + &mut mdb, + map.clone().into_iter().chain(new_child_roots.into_iter()), + )?, + None => insert_into_memory_db::( + &mut mdb, + new_child_roots.into_iter(), + )?, + }; + self.trie = Some(TrieBackend::new(mdb, root)); + self.trie.as_ref() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Assert in memory backend with only child trie keys works as trie backend. + #[test] + fn in_memory_with_child_trie_only() { + let storage = InMemory::::default(); + let child_info = OwnedChildInfo::new_default(b"unique_id_1".to_vec()); + let mut storage = storage.update( + vec![( + Some((b"1".to_vec(), child_info.clone())), + vec![(b"2".to_vec(), Some(b"3".to_vec()))] + )] + ); + let trie_backend = storage.as_trie_backend().unwrap(); + assert_eq!(trie_backend.child_storage(b"1", child_info.as_ref(), b"2").unwrap(), + Some(b"3".to_vec())); + assert!(trie_backend.storage(b"1").unwrap().is_some()); + } +} diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index 26cdb20ffd..f89bc0631f 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -24,12 +24,13 @@ use hash_db::Hasher; use codec::{Decode, Encode, Codec}; use sp_core::{ storage::{well_known_keys, ChildInfo}, NativeOrEncoded, NeverNativeValue, - traits::CodeExecutor, hexdisplay::HexDisplay, hash::H256, + traits::CodeExecutor, hexdisplay::HexDisplay }; use overlayed_changes::OverlayedChangeSet; use sp_externalities::Extensions; pub mod backend; +mod in_memory_backend; mod changes_trie; mod error; mod ext; @@ -56,8 +57,9 @@ pub use changes_trie::{ key_changes, key_changes_proof, key_changes_proof_check, prune as prune_changes_tries, oldest_non_pruned_trie as oldest_non_pruned_changes_trie, + BlockNumber as ChangesTrieBlockNumber, }; -pub use overlayed_changes::OverlayedChanges; +pub use overlayed_changes::{OverlayedChanges, StorageChanges, StorageTransactionCache}; pub use proving_backend::{ create_proof_check_backend, create_proof_check_backend_storage, merge_storage_proofs, ProofRecorder, ProvingBackend, ProvingBackendRecorder, StorageProof, @@ -65,6 +67,7 @@ pub use proving_backend::{ pub use trie_backend_essence::{TrieBackendStorage, Storage}; pub use trie_backend::TrieBackend; pub use error::{Error, ExecutionError}; +pub use in_memory_backend::InMemory as InMemoryBackend; type CallResult = Result, E>; @@ -140,8 +143,10 @@ impl ExecutionStrategy { warn!( "Consensus error between wasm {:?} and native {:?}. Using wasm.", wasm_result, - native_result + native_result, ); + warn!(" Native result {:?}", native_result); + warn!(" Wasm result {:?}", wasm_result); wasm_result }), } @@ -164,7 +169,12 @@ fn always_untrusted_wasm() -> ExecutionManager where H: Hasher, B: Backend { +pub struct StateMachine<'a, B, H, N, T, Exec> + where + H: Hasher, + B: Backend, + N: ChangesTrieBlockNumber, +{ backend: &'a B, exec: &'a Exec, method: &'a str, @@ -173,10 +183,12 @@ pub struct StateMachine<'a, B, H, N, T, Exec> where H: Hasher, B: Back extensions: Extensions, changes_trie_storage: Option<&'a T>, _marker: PhantomData<(H, N)>, + storage_transaction_cache: Option<&'a mut StorageTransactionCache>, } impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where - H: Hasher, + H: Hasher, + H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor, B: Backend, T: ChangesTrieStorage, @@ -201,51 +213,61 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where overlay, changes_trie_storage, _marker: PhantomData, + storage_transaction_cache: None, } } + /// Use given `cache` as storage transaction cache. + /// + /// The cache will be used to cache storage transactions that can be build while executing a + /// function in the runtime. For example, when calculating the storage root a transaction is + /// build that will be cached. + pub fn with_storage_transaction_cache( + mut self, + cache: Option<&'a mut StorageTransactionCache>, + ) -> Self { + self.storage_transaction_cache = cache; + self + } + /// 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 - /// to the backing store, such as the disk. /// /// On an error, no prospective changes are written to the overlay. /// /// Note: changes to code will be in place if this call is made again. For running partial /// blocks (e.g. a transaction at a time), ensure a different method is used. - pub fn execute(&mut self, strategy: ExecutionStrategy) -> Result< - (Vec, (B::Transaction, H::Out), Option>), - Box, - > { + /// + /// Returns the SCALE encoded result of the executed function. + pub fn execute(&mut self, strategy: ExecutionStrategy) -> Result, 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() -> _>( strategy.get_manager(), - true, None, - ) - .map(|(result, storage_tx, changes_tx)| ( - result.into_encoded(), - storage_tx.expect("storage_tx is always computed when compute_tx is true; qed"), - changes_tx, - )) + ).map(NativeOrEncoded::into_encoded) } fn execute_aux( &mut self, - compute_tx: bool, use_native: bool, native_call: Option, ) -> ( CallResult, bool, - Option<(B::Transaction, H::Out)>, - Option>, ) where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, { + let mut cache = StorageTransactionCache::default(); + + let cache = match self.storage_transaction_cache.as_mut() { + Some(cache) => cache, + None => &mut cache, + }; + let mut ext = Ext::new( self.overlay, + cache, self.backend, self.changes_trie_storage.clone(), Some(&mut self.extensions), @@ -268,13 +290,6 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where native_call, ); - let (storage_delta, changes_delta) = if compute_tx { - let (storage_delta, changes_delta) = ext.transaction(); - (Some(storage_delta), changes_delta) - } else { - (None, None) - }; - trace!( target: "state-trace", "{:04x}: Return. Native={:?}, Result={:?}", id, @@ -282,37 +297,28 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where result, ); - (result, was_native, storage_delta, changes_delta) + (result, was_native) } fn execute_call_with_both_strategy( &mut self, - compute_tx: bool, mut native_call: Option, orig_prospective: OverlayedChangeSet, on_consensus_failure: Handler, - ) -> ( - CallResult, - Option<(B::Transaction, H::Out)>, - Option>, - ) where - R: Decode + Encode + PartialEq, - NC: FnOnce() -> result::Result + UnwindSafe, - Handler: FnOnce( - CallResult, - CallResult, - ) -> CallResult + ) -> CallResult + where + R: Decode + Encode + PartialEq, + NC: FnOnce() -> result::Result + UnwindSafe, + Handler: FnOnce( + CallResult, + CallResult, + ) -> CallResult { - let (result, was_native, storage_delta, changes_delta) = self.execute_aux( - compute_tx, - true, - native_call.take(), - ); + let (result, was_native) = self.execute_aux(true, native_call.take()); if was_native { self.overlay.prospective = orig_prospective.clone(); - let (wasm_result, _, wasm_storage_delta, wasm_changes_delta) = self.execute_aux( - compute_tx, + let (wasm_result, _) = self.execute_aux( false, native_call, ); @@ -321,71 +327,62 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where && result.as_ref().ok() == wasm_result.as_ref().ok()) || result.is_err() && wasm_result.is_err() { - (result, storage_delta, changes_delta) + result } else { - (on_consensus_failure(wasm_result, result), wasm_storage_delta, wasm_changes_delta) + on_consensus_failure(wasm_result, result) } } else { - (result, storage_delta, changes_delta) + result } } fn execute_call_with_native_else_wasm_strategy( &mut self, - compute_tx: bool, mut native_call: Option, orig_prospective: OverlayedChangeSet, - ) -> ( - CallResult, - Option<(B::Transaction, H::Out)>, - Option>, - ) where - R: Decode + Encode + PartialEq, - NC: FnOnce() -> result::Result + UnwindSafe, + ) -> CallResult + where + R: Decode + Encode + PartialEq, + NC: FnOnce() -> result::Result + UnwindSafe, { - let (result, was_native, storage_delta, changes_delta) = self.execute_aux( - compute_tx, + let (result, was_native) = self.execute_aux( true, native_call.take(), ); if !was_native || result.is_ok() { - (result, storage_delta, changes_delta) + result } else { self.overlay.prospective = orig_prospective.clone(); - let (wasm_result, _, wasm_storage_delta, wasm_changes_delta) = self.execute_aux( - compute_tx, + let (wasm_result, _) = self.execute_aux( false, native_call, ); - (wasm_result, wasm_storage_delta, wasm_changes_delta) + wasm_result } } /// 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 - /// to the backing store, such as the disk. /// /// On an error, no prospective changes are written to the overlay. /// /// Note: changes to code will be in place if this call is made again. For running partial /// blocks (e.g. a transaction at a time), ensure a different method is used. + /// + /// Returns the result of the executed function either in native reprensentation `R` or + /// in SCALE encoded representation. pub fn execute_using_consensus_failure_handler( &mut self, manager: ExecutionManager, - compute_tx: bool, mut native_call: Option, - ) -> Result<( - NativeOrEncoded, - Option<(B::Transaction, H::Out)>, - Option>, - ), Box> where - R: Decode + Encode + PartialEq, - NC: FnOnce() -> result::Result + UnwindSafe, - Handler: FnOnce( - CallResult, - CallResult, - ) -> CallResult + ) -> Result, Box> + where + R: Decode + Encode + PartialEq, + NC: FnOnce() -> result::Result + UnwindSafe, + Handler: FnOnce( + CallResult, + CallResult, + ) -> CallResult { // read changes trie configuration. The reason why we're doing it here instead of the // `OverlayedChanges` constructor is that we need proofs for this read as a part of @@ -405,10 +402,9 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where let result = { let orig_prospective = self.overlay.prospective.clone(); - let (result, storage_delta, changes_delta) = match manager { + match manager { ExecutionManager::Both(on_consensus_failure) => { self.execute_call_with_both_strategy( - compute_tx, native_call.take(), orig_prospective, on_consensus_failure, @@ -416,7 +412,6 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where }, ExecutionManager::NativeElseWasm => { self.execute_call_with_native_else_wasm_strategy( - compute_tx, native_call.take(), orig_prospective, ) @@ -426,15 +421,12 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where BackendTrustLevel::Trusted => None, BackendTrustLevel::Untrusted => Some(sp_panic_handler::AbortGuard::never_abort()), }; - let res = self.execute_aux(compute_tx, false, native_call); - (res.0, res.2, res.3) + self.execute_aux(false, native_call).0 }, ExecutionManager::NativeWhenPossible => { - let res = self.execute_aux(compute_tx, true, native_call); - (res.0, res.2, res.3) + self.execute_aux(true, native_call).0 }, - }; - result.map(move |out| (out, storage_delta, changes_delta)) + } }; if result.is_ok() { @@ -455,7 +447,8 @@ pub fn prove_execution( ) -> Result<(Vec, StorageProof), Box> where B: Backend, - H: Hasher, + H: Hasher, + H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor, { let trie_backend = backend.as_trie_backend() @@ -481,7 +474,8 @@ pub fn prove_execution_on_trie_backend( ) -> Result<(Vec, StorageProof), Box> where S: trie_backend_essence::TrieBackendStorage, - H: Hasher, + H: Hasher, + H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor, { let proving_backend = proving_backend::ProvingBackend::new(trie_backend); @@ -489,9 +483,8 @@ where &proving_backend, None, overlay, exec, method, call_data, Extensions::default(), ); - let (result, _, _) = sm.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( + let result = sm.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( always_wasm(), - false, None, )?; let proof = sm.backend.extract_proof(); @@ -508,9 +501,9 @@ pub fn execution_proof_check( call_data: &[u8], ) -> Result, Box> where - H: Hasher, + H: Hasher, Exec: CodeExecutor, - H::Out: Ord + 'static, + H::Out: Ord + 'static + codec::Codec, { let trie_backend = create_proof_check_backend::(root.into(), proof)?; execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) @@ -525,7 +518,8 @@ pub fn execution_proof_check_on_trie_backend( call_data: &[u8], ) -> Result, Box> where - H: Hasher, + H: Hasher, + H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor, { let mut sm = StateMachine::<_, H, _, InMemoryChangesTrieStorage, Exec>::new( @@ -534,9 +528,8 @@ where sm.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( always_untrusted_wasm(), - false, None, - ).map(|(result, _, _)| result.into_encoded()) + ).map(NativeOrEncoded::into_encoded) } /// Generate storage read proof. @@ -546,8 +539,8 @@ pub fn prove_read( ) -> Result> where B: Backend, - H: Hasher, - H::Out: Ord, + H: Hasher, + H::Out: Ord + Codec, I: IntoIterator, I::Item: AsRef<[u8]>, { @@ -739,7 +732,6 @@ mod tests { use codec::Encode; use overlayed_changes::OverlayedValue; use super::*; - use super::backend::InMemory; use super::ext::Ext; use super::changes_trie::{ InMemoryStorage as InMemoryChangesTrieStorage, @@ -825,7 +817,7 @@ mod tests { ); assert_eq!( - state_machine.execute(ExecutionStrategy::NativeWhenPossible).unwrap().0, + state_machine.execute(ExecutionStrategy::NativeWhenPossible).unwrap(), vec![66], ); } @@ -852,7 +844,7 @@ mod tests { Default::default(), ); - assert_eq!(state_machine.execute(ExecutionStrategy::NativeElseWasm).unwrap().0, vec![66]); + assert_eq!(state_machine.execute(ExecutionStrategy::NativeElseWasm).unwrap(), vec![66]); } #[test] @@ -883,7 +875,6 @@ mod tests { consensus_failed = true; we }), - true, None, ).is_err() ); @@ -933,7 +924,7 @@ mod tests { b"abc".to_vec() => b"2".to_vec(), b"bbb".to_vec() => b"3".to_vec() ]; - let mut state = InMemory::::from(initial); + let mut state = InMemoryBackend::::from(initial); let backend = state.as_trie_backend().unwrap(); let mut overlay = OverlayedChanges { committed: map![ @@ -949,8 +940,10 @@ mod tests { { let changes_trie_storage = InMemoryChangesTrieStorage::::new(); + let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, + &mut cache, backend, Some(&changes_trie_storage), None, @@ -975,12 +968,14 @@ mod tests { #[test] fn set_child_storage_works() { - let mut state = InMemory::::default(); + let mut state = InMemoryBackend::::default(); let backend = state.as_trie_backend().unwrap(); let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut overlay = OverlayedChanges::default(); + let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, + &mut cache, backend, Some(&changes_trie_storage), None, @@ -1104,8 +1099,10 @@ mod tests { let mut transaction = { let backend = test_trie(); let changes_trie_storage = InMemoryChangesTrieStorage::::new(); + let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, + &mut cache, &backend, Some(&changes_trie_storage), None, @@ -1113,7 +1110,7 @@ mod tests { ext.set_child_storage(subtrie1, CHILD_INFO_1, b"abc".to_vec(), b"def".to_vec()); ext.set_child_storage(subtrie2, CHILD_INFO_2, b"abc".to_vec(), b"def".to_vec()); ext.storage_root(); - (ext.transaction().0).0 + cache.transaction.unwrap() }; let mut duplicate = false; for (k, (value, rc)) in transaction.drain().iter() { diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index d8482788a8..eafd312410 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -16,14 +16,23 @@ //! The overlayed changes to state. +use crate::{ + backend::Backend, ChangesTrieTransaction, + changes_trie::{ + NO_EXTRINSIC_INDEX, Configuration as ChangesTrieConfig, BlockNumber, build_changes_trie, + Storage as ChangesTrieStorage, + }, +}; + #[cfg(test)] use std::iter::FromIterator; use std::collections::{HashMap, BTreeMap, BTreeSet}; -use codec::Decode; -use crate::changes_trie::{NO_EXTRINSIC_INDEX, Configuration as ChangesTrieConfig}; +use codec::{Decode, Encode}; use sp_core::storage::{well_known_keys::EXTRINSIC_INDEX, OwnedChildInfo, ChildInfo}; use std::{mem, ops}; +use hash_db::Hasher; + /// The overlayed changes to state to be queried on top of the backend. /// /// A transaction shares all prospective changes within an inner overlay @@ -60,6 +69,92 @@ pub struct OverlayedChangeSet { pub children: HashMap, (BTreeMap, OverlayedValue>, OwnedChildInfo)>, } +/// A storage changes structure that can be generated by the data collected in [`OverlayedChanges`]. +/// +/// This contains all the changes to the storage and transactions to apply theses changes to the +/// backend. +pub struct StorageChanges { + /// All changes to the main storage. + /// + /// A value of `None` means that it was deleted. + pub main_storage_changes: Vec<(Vec, Option>)>, + /// All changes to the child storages. + pub child_storage_changes: Vec<(Vec, Vec<(Vec, Option>)>)>, + /// A transaction for the backend that contains all changes from + /// [`main_storage_changes`](Self::main_storage_changes) and from + /// [`child_storage_changes`](Self::child_storage_changes). + pub transaction: Transaction, + /// The storage root after applying the transaction. + pub transaction_storage_root: H::Out, + /// Contains the transaction for the backend for the changes trie. + /// + /// If changes trie is disabled the value is set to `None`. + pub changes_trie_transaction: Option>, +} + +impl StorageChanges { + /// Deconstruct into the inner values + pub fn into_inner(self) -> ( + Vec<(Vec, Option>)>, + Vec<(Vec, Vec<(Vec, Option>)>)>, + Transaction, + H::Out, + Option>, + ) { + ( + self.main_storage_changes, + self.child_storage_changes, + self.transaction, + self.transaction_storage_root, + self.changes_trie_transaction, + ) + } +} + +/// The storage transaction are calculated as part of the `storage_root` and +/// `changes_trie_storage_root`. These transactions can be reused for importing the block into the +/// storage. So, we cache them to not require a recomputation of those transactions. +pub struct StorageTransactionCache { + /// Contains the changes for the main and the child storages as one transaction. + pub(crate) transaction: Option, + /// The storage root after applying the transaction. + pub(crate) transaction_storage_root: Option, + /// Contains the changes trie transaction. + pub(crate) changes_trie_transaction: Option>>, + /// The storage root after applying the changes trie transaction. + pub(crate) changes_trie_transaction_storage_root: Option>, +} + +impl StorageTransactionCache { + /// Reset the cached transactions. + pub fn reset(&mut self) { + *self = Self::default(); + } +} + +impl Default for StorageTransactionCache { + fn default() -> Self { + Self { + transaction: None, + transaction_storage_root: None, + changes_trie_transaction: None, + changes_trie_transaction_storage_root: None, + } + } +} + +impl Default for StorageChanges { + fn default() -> Self { + Self { + main_storage_changes: Default::default(), + child_storage_changes: Default::default(), + transaction: Default::default(), + transaction_storage_root: Default::default(), + changes_trie_transaction: None, + } + } +} + #[cfg(test)] impl FromIterator<(Vec, OverlayedValue)> for OverlayedChangeSet { fn from_iter, OverlayedValue)>>(iter: T) -> Self { @@ -105,7 +200,7 @@ impl OverlayedChanges { true } - /// Returns a double-Option: None if the key is unknown (i.e. and the query should be refered + /// Returns a double-Option: None if the key is unknown (i.e. and the query should be referred /// to the backend); Some(None) if the key has been deleted. Some(Some(...)) for a key whose /// value has been set. pub fn storage(&self, key: &[u8]) -> Option> { @@ -114,7 +209,7 @@ impl OverlayedChanges { .map(|x| x.value.as_ref().map(AsRef::as_ref)) } - /// Returns a double-Option: None if the key is unknown (i.e. and the query should be refered + /// Returns a double-Option: None if the key is unknown (i.e. and the query should be referred /// to the backend); Some(None) if the key has been deleted. Some(Some(...)) for a key whose /// value has been set. pub fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Option> { @@ -237,7 +332,7 @@ impl OverlayedChanges { } } - // Then do the same with keys from commited changes. + // Then do the same with keys from committed changes. // NOTE that we are making changes in the prospective change set. for key in self.committed.top.keys() { if key.starts_with(prefix) { @@ -338,15 +433,61 @@ impl OverlayedChanges { impl Iterator, (impl Iterator, Option>)>, OwnedChildInfo))>, ){ 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, ci))| (sk, (v.into_iter().map(|(k, v)| (k, v.value)), ci)))) + .map(|(sk, (v, ci))| (sk, (v.into_iter().map(|(k, v)| (k, v.value)), ci))) + ) + } + + /// Convert this instance with all changes into a [`StorageChanges`] instance. + pub fn into_storage_changes< + B: Backend, H: Hasher, N: BlockNumber, T: ChangesTrieStorage + >( + self, + backend: &B, + changes_trie_storage: Option<&T>, + parent_hash: H::Out, + mut cache: StorageTransactionCache, + ) -> Result, String> where H::Out: Ord + Encode + 'static { + // If the transaction does not exist, we generate it. + if cache.transaction.is_none() { + self.storage_root(backend, &mut cache); + } + + let (transaction, transaction_storage_root) = cache.transaction.take() + .and_then(|t| cache.transaction_storage_root.take().map(|tr| (t, tr))) + .expect("Transaction was be generated as part of `storage_root`; qed"); + + // If the transaction does not exist, we generate it. + if cache.changes_trie_transaction.is_none() { + self.changes_trie_root( + backend, + changes_trie_storage, + parent_hash, + false, + &mut cache, + ).map_err(|_| "Failed to generate changes trie transaction")?; + } + + let changes_trie_transaction = cache.changes_trie_transaction + .take() + .expect("Changes trie transaction was generated by `changes_trie_root`; qed"); + + let (main_storage_changes, child_storage_changes) = self.into_committed(); + + Ok(StorageChanges { + main_storage_changes: main_storage_changes.collect(), + child_storage_changes: child_storage_changes.map(|(sk, it)| (sk, it.0.collect())).collect(), + transaction, + transaction_storage_root, + changes_trie_transaction, + }) } /// Inserts storage entry responsible for current extrinsic index. #[cfg(test)] pub(crate) fn set_extrinsic_index(&mut self, extrinsic_index: u32) { - use codec::Encode; self.prospective.top.insert(EXTRINSIC_INDEX.to_vec(), OverlayedValue { value: Some(extrinsic_index.encode()), extrinsics: None, @@ -356,7 +497,7 @@ impl OverlayedChanges { /// Returns current extrinsic index to use in changes trie construction. /// None is returned if it is not set or changes trie config is not set. /// Persistent value (from the backend) can be ignored because runtime must - /// set this index before first and unset after last extrinsic is executied. + /// set this index before first and unset after last extrinsic is executed. /// Changes that are made outside of extrinsics, are marked with /// `NO_EXTRINSIC_INDEX` index. fn extrinsic_index(&self) -> Option { @@ -369,6 +510,75 @@ impl OverlayedChanges { } } + /// Generate the storage root using `backend` and all changes from `prospective` and `committed`. + /// + /// Returns the storage root and caches storage transaction in the given `cache`. + pub fn storage_root>( + &self, + backend: &B, + cache: &mut StorageTransactionCache, + ) -> H::Out + where H::Out: Ord + Encode, + { + let child_storage_keys = self.prospective.children.keys() + .chain(self.committed.children.keys()); + let child_delta_iter = child_storage_keys.map(|storage_key| + ( + storage_key.clone(), + self.committed.children.get(storage_key) + .into_iter() + .flat_map(|(map, _)| map.iter().map(|(k, v)| (k.clone(), v.value.clone()))) + .chain( + self.prospective.children.get(storage_key) + .into_iter() + .flat_map(|(map, _)| map.iter().map(|(k, v)| (k.clone(), v.value.clone()))) + ), + self.child_info(storage_key).cloned() + .expect("child info initialized in either committed or prospective"), + ) + ); + + // compute and memoize + let delta = self.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) + .chain(self.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); + + let (root, transaction) = backend.full_storage_root(delta, child_delta_iter); + + cache.transaction = Some(transaction); + cache.transaction_storage_root = Some(root); + + root + } + + /// Generate the changes trie root. + /// + /// Returns the changes trie root and caches the storage transaction into the given `cache`. + /// + /// # Panics + /// + /// Panics on storage error, when `panic_on_storage_error` is set. + pub fn changes_trie_root, T: ChangesTrieStorage>( + &self, + backend: &B, + changes_trie_storage: Option<&T>, + parent_hash: H::Out, + panic_on_storage_error: bool, + cache: &mut StorageTransactionCache, + ) -> Result, ()> where H::Out: Ord + Encode + 'static { + build_changes_trie::<_, T, H, N>( + backend, + changes_trie_storage, + self, + parent_hash, + panic_on_storage_error, + ).map(|r| { + let root = r.as_ref().map(|r| r.1).clone(); + cache.changes_trie_transaction = Some(r.map(|(db, _, cache)| (db, cache))); + cache.changes_trie_transaction_storage_root = Some(root); + root + }) + } + /// Get child info for a storage key. /// Take the latest value so prospective first. pub fn child_info(&self, storage_key: &[u8]) -> Option<&OwnedChildInfo> { @@ -445,7 +655,7 @@ mod tests { use sp_core::{ Blake2Hasher, traits::Externalities, storage::well_known_keys::EXTRINSIC_INDEX, }; - use crate::backend::InMemory; + use crate::InMemoryBackend; use crate::changes_trie::InMemoryStorage as InMemoryChangesTrieStorage; use crate::ext::Ext; use super::*; @@ -494,7 +704,7 @@ mod tests { (b"dogglesworth".to_vec(), b"catXXX".to_vec()), (b"doug".to_vec(), b"notadog".to_vec()), ].into_iter().collect(); - let backend = InMemory::::from(initial); + let backend = InMemoryBackend::::from(initial); let mut overlay = OverlayedChanges { committed: vec![ (b"dog".to_vec(), Some(b"puppy".to_vec()).into()), @@ -509,8 +719,10 @@ mod tests { }; let changes_trie_storage = InMemoryChangesTrieStorage::::new(); + let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, + &mut cache, &backend, Some(&changes_trie_storage), None, diff --git a/primitives/state-machine/src/proving_backend.rs b/primitives/state-machine/src/proving_backend.rs index 0eed1cbf62..70124927fd 100644 --- a/primitives/state-machine/src/proving_backend.rs +++ b/primitives/state-machine/src/proving_backend.rs @@ -22,8 +22,8 @@ use codec::{Decode, Encode, Codec}; use log::debug; use hash_db::{Hasher, HashDB, EMPTY_PREFIX, Prefix}; use sp_trie::{ - MemoryDB, PrefixedMemoryDB, default_child_trie_root, - read_trie_value_with, read_child_trie_value_with, record_all_keys + MemoryDB, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, + record_all_keys }; pub use sp_trie::Recorder; pub use sp_trie::trie_types::{Layout, TrieError}; @@ -136,7 +136,7 @@ impl<'a, S, H> ProvingBackendRecorder<'a, S, H> &eph, self.backend.root(), key, - &mut *self.proof_recorder + &mut *self.proof_recorder, ).map_err(map_e) } @@ -238,7 +238,9 @@ impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> ProvingBackend<'a, S, H> } } -impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> TrieBackendStorage for ProofRecorderBackend<'a, S, H> { +impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> TrieBackendStorage + for ProofRecorderBackend<'a, S, H> +{ type Overlay = S::Overlay; fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { @@ -251,7 +253,9 @@ impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> TrieBackendStorage fo } } -impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> std::fmt::Debug for ProvingBackend<'a, S, H> { +impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> std::fmt::Debug + for ProvingBackend<'a, S, H> +{ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "ProvingBackend") } @@ -265,7 +269,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> { type Error = String; type Transaction = S::Overlay; - type TrieBackendStorage = PrefixedMemoryDB; + type TrieBackendStorage = S; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { self.0.storage(key) @@ -391,11 +395,12 @@ where #[cfg(test)] mod tests { - use crate::backend::{InMemory}; + use crate::InMemoryBackend; use crate::trie_backend::tests::test_trie; use super::*; use sp_core::{Blake2Hasher, storage::ChildStorageKey}; use crate::proving_backend::create_proof_check_backend; + use sp_trie::PrefixedMemoryDB; const CHILD_INFO_1: ChildInfo<'static> = ChildInfo::new_default(b"unique_id_1"); const CHILD_INFO_2: ChildInfo<'static> = ChildInfo::new_default(b"unique_id_2"); @@ -446,7 +451,7 @@ mod tests { #[test] fn proof_recorded_and_checked() { let contents = (0..64).map(|i| (vec![i], Some(vec![i]))).collect::>(); - let in_memory = InMemory::::default(); + let in_memory = InMemoryBackend::::default(); let mut in_memory = in_memory.update(vec![(None, 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])); @@ -478,7 +483,7 @@ mod tests { (Some((own2.clone(), CHILD_INFO_2.to_owned())), (10..15).map(|i| (vec![i], Some(vec![i]))).collect()), ]; - let in_memory = InMemory::::default(); + let in_memory = InMemoryBackend::::default(); let mut in_memory = in_memory.update(contents); let in_memory_root = in_memory.full_storage_root::<_, Vec<_>, _>( ::std::iter::empty(), @@ -533,5 +538,4 @@ mod tests { vec![64] ); } - } diff --git a/primitives/state-machine/src/testing.rs b/primitives/state-machine/src/testing.rs index cb72684b99..1baf6d6b4d 100644 --- a/primitives/state-machine/src/testing.rs +++ b/primitives/state-machine/src/testing.rs @@ -19,36 +19,45 @@ use std::any::{Any, TypeId}; use hash_db::Hasher; use crate::{ - backend::{InMemory, Backend}, OverlayedChanges, + backend::Backend, OverlayedChanges, StorageTransactionCache, ext::Ext, InMemoryBackend, changes_trie::{ InMemoryStorage as ChangesTrieInMemoryStorage, BlockNumber as ChangesTrieBlockNumber, }, - ext::Ext, }; use sp_core::{ storage::{ well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES, is_child_storage_key}, Storage, }, - hash::H256, Blake2Hasher, + Blake2Hasher, }; use codec::Encode; use sp_externalities::{Extensions, Extension}; /// Simple HashMap-based Externalities impl. -pub struct TestExternalities=Blake2Hasher, N: ChangesTrieBlockNumber=u64> { +pub struct TestExternalities +where + H::Out: codec::Codec, +{ overlay: OverlayedChanges, - backend: InMemory, + storage_transaction_cache: StorageTransactionCache< + as Backend>::Transaction, H, N + >, + backend: InMemoryBackend, changes_trie_storage: ChangesTrieInMemoryStorage, extensions: Extensions, } -impl, N: ChangesTrieBlockNumber> TestExternalities { +impl TestExternalities + where + H::Out: Ord + 'static + codec::Codec +{ /// Get externalities implementation. - pub fn ext(&mut self) -> Ext, ChangesTrieInMemoryStorage> { + pub fn ext(&mut self) -> Ext, ChangesTrieInMemoryStorage> { Ext::new( &mut self.overlay, + &mut self.storage_transaction_cache, &self.backend, Some(&self.changes_trie_storage), Some(&mut self.extensions), @@ -81,6 +90,7 @@ impl, N: ChangesTrieBlockNumber> TestExternalities { changes_trie_storage: ChangesTrieInMemoryStorage::new(), backend: storage.into(), extensions: Default::default(), + storage_transaction_cache: Default::default(), } } @@ -100,7 +110,7 @@ impl, N: ChangesTrieBlockNumber> TestExternalities { } /// Return a new backend with all pending value. - pub fn commit_all(&self) -> InMemory { + pub fn commit_all(&self) -> InMemoryBackend { let top: Vec<_> = self.overlay.committed.top.clone().into_iter() .chain(self.overlay.prospective.top.clone().into_iter()) .map(|(k, v)| (k, v.value)).collect(); @@ -129,13 +139,18 @@ impl, N: ChangesTrieBlockNumber> TestExternalities { } } -impl, N: ChangesTrieBlockNumber> std::fmt::Debug for TestExternalities { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Debug for TestExternalities + where H::Out: codec::Codec, +{ + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "overlay: {:?}\nbackend: {:?}", self.overlay, self.backend.pairs()) } } -impl, N: ChangesTrieBlockNumber> PartialEq for TestExternalities { +impl PartialEq for TestExternalities + where + H::Out: Ord + 'static + codec::Codec +{ /// 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 { @@ -143,18 +158,25 @@ impl, N: ChangesTrieBlockNumber> PartialEq for TestExternali } } -impl, N: ChangesTrieBlockNumber> Default for TestExternalities { +impl Default for TestExternalities + where + H::Out: Ord + 'static + codec::Codec, +{ fn default() -> Self { Self::new(Default::default()) } } -impl, N: ChangesTrieBlockNumber> From for TestExternalities { +impl From for TestExternalities + where + H::Out: Ord + 'static + codec::Codec, +{ fn from(storage: Storage) -> Self { Self::new(storage) } } impl sp_externalities::ExtensionStore for TestExternalities where - H: Hasher, + H: Hasher, + H::Out: codec::Codec, N: ChangesTrieBlockNumber, { fn extension_by_type_id(&mut self, type_id: TypeId) -> Option<&mut dyn Any> { diff --git a/primitives/state-machine/src/trie_backend_essence.rs b/primitives/state-machine/src/trie_backend_essence.rs index bd3fca07dd..f7f5006f41 100644 --- a/primitives/state-machine/src/trie_backend_essence.rs +++ b/primitives/state-machine/src/trie_backend_essence.rs @@ -237,7 +237,6 @@ impl, H: Hasher> TrieBackendEssence where H::Out: self.keys_values_with_prefix_inner(&self.root, prefix, |k, _v| f(k), None) } - fn keys_values_with_prefix_inner( &self, root: &H::Out, @@ -285,7 +284,6 @@ impl, H: Hasher> TrieBackendEssence where H::Out: pub fn for_key_values_with_prefix(&self, prefix: &[u8], f: F) { self.keys_values_with_prefix_inner(&self.root, prefix, f, None) } - } pub(crate) struct Ephemeral<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { @@ -293,20 +291,16 @@ pub(crate) struct Ephemeral<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { overlay: &'a mut S::Overlay, } -impl<'a, - S: 'a + TrieBackendStorage, - H: 'a + Hasher -> hash_db::AsPlainDB +impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> hash_db::AsPlainDB for Ephemeral<'a, S, H> { 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 } + fn as_plain_db_mut<'b>(&'b mut self) -> &'b mut (dyn hash_db::PlainDB + 'b) { + self + } } -impl<'a, - S: 'a + TrieBackendStorage, - H: 'a + Hasher -> hash_db::AsHashDB +impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> hash_db::AsHashDB for Ephemeral<'a, S, H> { fn as_hash_db<'b>(&'b self) -> &'b (dyn hash_db::HashDB + 'b) { self } @@ -322,10 +316,7 @@ impl<'a, S: TrieBackendStorage, H: Hasher> Ephemeral<'a, S, H> { } } -impl<'a, - S: 'a + TrieBackendStorage, - H: Hasher -> hash_db::PlainDB +impl<'a, S: 'a + TrieBackendStorage, H: Hasher> hash_db::PlainDB for Ephemeral<'a, S, H> { fn get(&self, key: &H::Out) -> Option { @@ -355,20 +346,14 @@ impl<'a, } } -impl<'a, - S: 'a + TrieBackendStorage, - H: Hasher -> hash_db::PlainDBRef +impl<'a, S: 'a + TrieBackendStorage, H: Hasher> hash_db::PlainDBRef for Ephemeral<'a, S, H> { fn get(&self, key: &H::Out) -> Option { hash_db::PlainDB::get(self, key) } fn contains(&self, key: &H::Out) -> bool { hash_db::PlainDB::contains(self, key) } } -impl<'a, - S: 'a + TrieBackendStorage, - H: Hasher -> hash_db::HashDB +impl<'a, S: 'a + TrieBackendStorage, H: Hasher> hash_db::HashDB for Ephemeral<'a, S, H> { fn get(&self, key: &H::Out, prefix: Prefix) -> Option { @@ -402,14 +387,16 @@ impl<'a, } } -impl<'a, - S: 'a + TrieBackendStorage, - H: Hasher -> hash_db::HashDBRef +impl<'a, S: 'a + TrieBackendStorage, H: Hasher> hash_db::HashDBRef for Ephemeral<'a, S, H> { - fn get(&self, key: &H::Out, prefix: Prefix) -> Option { hash_db::HashDB::get(self, key, prefix) } - fn contains(&self, key: &H::Out, prefix: Prefix) -> bool { hash_db::HashDB::contains(self, key, prefix) } + fn get(&self, key: &H::Out, prefix: Prefix) -> Option { + hash_db::HashDB::get(self, key, prefix) + } + + fn contains(&self, key: &H::Out, prefix: Prefix) -> bool { + hash_db::HashDB::contains(self, key, prefix) + } } /// Key-value pairs storage that is used by trie backend essence. diff --git a/primitives/test-primitives/src/lib.rs b/primitives/test-primitives/src/lib.rs index 5174aac843..74115bdb8f 100644 --- a/primitives/test-primitives/src/lib.rs +++ b/primitives/test-primitives/src/lib.rs @@ -40,7 +40,6 @@ impl serde::Serialize for Extrinsic { } } - impl ExtrinsicT for Extrinsic { type Call = Extrinsic; type SignaturePayload = (); @@ -77,11 +76,10 @@ pub type Block = sp_runtime::generic::Block; /// A test block's header. pub type Header = sp_runtime::generic::Header; - /// Changes trie configuration (optionally) used in tests. pub fn changes_trie_config() -> sp_core::ChangesTrieConfiguration { sp_core::ChangesTrieConfiguration { digest_interval: 4, digest_levels: 2, } -} \ No newline at end of file +} diff --git a/primitives/version/src/lib.rs b/primitives/version/src/lib.rs index 35c6c6dfff..3211c46253 100644 --- a/primitives/version/src/lib.rs +++ b/primitives/version/src/lib.rs @@ -24,8 +24,6 @@ use serde::{Serialize, Deserialize}; use std::fmt; #[cfg(feature = "std")] use std::collections::HashSet; -#[cfg(feature = "std")] -use sp_runtime::traits::RuntimeApiInfo; use codec::Encode; #[cfg(feature = "std")] @@ -42,7 +40,7 @@ pub type ApiId = [u8; 8]; /// A vector of pairs of `ApiId` and a `u32` for version. For `"std"` builds, this /// is a `Cow`. #[cfg(feature = "std")] -pub type ApisVec = ::std::borrow::Cow<'static, [(ApiId, u32)]>; +pub type ApisVec = std::borrow::Cow<'static, [(ApiId, u32)]>; /// A vector of pairs of `ApiId` and a `u32` for version. For `"no-std"` builds, this /// is just a reference. #[cfg(not(feature = "std"))] @@ -131,21 +129,14 @@ impl RuntimeVersion { self.authoring_version == other.authoring_version } - /// Check if this version supports a particular API. - pub fn has_api(&self) -> bool { - self.apis.iter().any(|(s, v)| { - s == &A::ID && *v == A::VERSION - }) - } - - /// Check if the given api is implemented and the version passes a predicate. - pub fn has_api_with bool>( + /// Check if the given api with `api_id` is implemented and the version passes the given + /// `predicate`. + pub fn has_api_with bool>( &self, - pred: P, + id: &ApiId, + predicate: P, ) -> bool { - self.apis.iter().any(|(s, v)| { - s == &A::ID && pred(*v) - }) + self.apis.iter().any(|(s, v)| s == id && predicate(*v)) } } diff --git a/test-utils/client/src/client_ext.rs b/test-utils/client/src/client_ext.rs index 49d46c8665..67d08c5fa6 100644 --- a/test-utils/client/src/client_ext.rs +++ b/test-utils/client/src/client_ext.rs @@ -22,56 +22,70 @@ use sp_consensus::{ BlockImportParams, BlockImport, BlockOrigin, Error as ConsensusError, ForkChoiceStrategy, }; -use hash_db::Hasher; use sp_runtime::Justification; use sp_runtime::traits::{Block as BlockT}; use sp_runtime::generic::BlockId; -use sp_core::Blake2Hasher; use codec::alloc::collections::hash_map::HashMap; /// Extension trait for a test client. pub trait ClientExt: Sized { + /// Finalize a block. + fn finalize_block( + &self, + id: BlockId, + justification: Option, + ) -> sp_blockchain::Result<()>; + + /// Returns hash of the genesis block. + fn genesis_hash(&self) -> ::Hash; +} + +/// Extension trait for a test client around block importing. +pub trait ClientBlockImportExt: Sized { /// Import block to the chain. No finality. - fn import(&self, origin: BlockOrigin, block: Block) - -> Result<(), ConsensusError>; + fn import(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError>; /// Import a block and make it our best block if possible. - fn import_as_best(&self, origin: BlockOrigin, block: Block) - -> Result<(), ConsensusError>; + fn import_as_best(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError>; /// Import a block and finalize it. - fn import_as_final(&self, origin: BlockOrigin, block: Block) + fn import_as_final(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError>; /// Import block with justification, finalizes block. fn import_justified( - &self, + &mut self, origin: BlockOrigin, block: Block, justification: Justification ) -> Result<(), ConsensusError>; +} - /// Finalize a block. +impl ClientExt for Client + where + B: sc_client_api::backend::Backend, + E: sc_client::CallExecutor, + Self: BlockImport, + Block: BlockT, +{ fn finalize_block( &self, id: BlockId, justification: Option, - ) -> sp_blockchain::Result<()>; + ) -> sp_blockchain::Result<()> { + Finalizer::finalize_block(self, id, justification, true) + } - /// Returns hash of the genesis block. - fn genesis_hash(&self) -> ::Hash; + fn genesis_hash(&self) -> ::Hash { + self.block_hash(0.into()).unwrap().unwrap() + } } -impl ClientExt for Client - where - B: sc_client_api::backend::Backend, - E: sc_client::CallExecutor, - for<'r> &'r Self: BlockImport, - Block: BlockT::Out>, +/// This implementation is required, because of the weird api requirements around `BlockImport`. +impl ClientBlockImportExt for std::sync::Arc + where for<'r> &'r T: BlockImport { - fn import(&self, origin: BlockOrigin, block: Block) - -> Result<(), ConsensusError> - { + fn import(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); let import = BlockImportParams { origin, @@ -79,6 +93,7 @@ impl ClientExt for Client justification: None, post_digests: vec![], body: Some(extrinsics), + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -86,12 +101,10 @@ impl ClientExt for Client import_existing: false, }; - BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) } - fn import_as_best(&self, origin: BlockOrigin, block: Block) - -> Result<(), ConsensusError> - { + fn import_as_best(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); let import = BlockImportParams { origin, @@ -99,6 +112,7 @@ impl ClientExt for Client justification: None, post_digests: vec![], body: Some(extrinsics), + storage_changes: None, finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::Custom(true), @@ -106,12 +120,10 @@ impl ClientExt for Client import_existing: false, }; - BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) } - fn import_as_final(&self, origin: BlockOrigin, block: Block) - -> Result<(), ConsensusError> - { + fn import_as_final(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); let import = BlockImportParams { origin, @@ -119,6 +131,7 @@ impl ClientExt for Client justification: None, post_digests: vec![], body: Some(extrinsics), + storage_changes: None, finalized: true, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::Custom(true), @@ -126,11 +139,11 @@ impl ClientExt for Client import_existing: false, }; - BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) } fn import_justified( - &self, + &mut self, origin: BlockOrigin, block: Block, justification: Justification, @@ -142,6 +155,7 @@ impl ClientExt for Client justification: Some(justification), post_digests: vec![], body: Some(extrinsics), + storage_changes: None, finalized: true, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -149,18 +163,92 @@ impl ClientExt for Client import_existing: false, }; - BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) } +} - fn finalize_block( - &self, - id: BlockId, - justification: Option, - ) -> sp_blockchain::Result<()> { - Finalizer::finalize_block(self, id, justification, true) +impl ClientBlockImportExt for Client + where + Self: BlockImport, +{ + fn import(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); + let import = BlockImportParams { + origin, + header, + justification: None, + post_digests: vec![], + body: Some(extrinsics), + storage_changes: None, + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + allow_missing_state: false, + import_existing: false, + }; + + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) } - fn genesis_hash(&self) -> ::Hash { - self.block_hash(0.into()).unwrap().unwrap() + fn import_as_best(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); + let import = BlockImportParams { + origin, + header, + justification: None, + post_digests: vec![], + body: Some(extrinsics), + storage_changes: None, + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::Custom(true), + allow_missing_state: false, + import_existing: false, + }; + + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) + } + + fn import_as_final(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); + let import = BlockImportParams { + origin, + header, + justification: None, + post_digests: vec![], + body: Some(extrinsics), + storage_changes: None, + finalized: true, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::Custom(true), + allow_missing_state: false, + import_existing: false, + }; + + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) + } + + fn import_justified( + &mut self, + origin: BlockOrigin, + block: Block, + justification: Justification, + ) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); + let import = BlockImportParams { + origin, + header, + justification: Some(justification), + post_digests: vec![], + body: Some(extrinsics), + storage_changes: None, + finalized: true, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + allow_missing_state: false, + import_existing: false, + }; + + BlockImport::import_block(self, import, HashMap::new()).map(|_| ()) } } diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index b9d857e897..ac1cfe4d6b 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -34,11 +34,10 @@ pub use sp_core::{Blake2Hasher, traits::BareCryptoStorePtr}; pub use sp_runtime::{Storage, StorageChild}; pub use sp_state_machine::ExecutionStrategy; -pub use self::client_ext::ClientExt; +pub use self::client_ext::{ClientExt, ClientBlockImportExt}; use std::sync::Arc; use std::collections::HashMap; -use hash_db::Hasher; use sp_core::storage::{well_known_keys, ChildInfo}; use sp_runtime::traits::Block as BlockT; use sc_client::LocalCallExecutor; @@ -71,36 +70,20 @@ pub struct TestClientBuilder { keystore: Option, } -impl Default for TestClientBuilder< - Executor, - Backend, - G, -> where - Block: BlockT::Out>, -{ +impl Default + for TestClientBuilder, G> { fn default() -> Self { Self::with_default_backend() } } -impl TestClientBuilder< - Executor, - Backend, - G, -> where - Block: BlockT::Out>, -{ +impl TestClientBuilder, G> { /// 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) } - /// Give access to the underlying backend of these clients - pub fn backend(&self) -> Arc> { - self.backend.clone() - } - /// Create new `TestClientBuilder` with default backend and pruning window size pub fn with_pruning_window(keep_blocks: u32) -> Self { let backend = Arc::new(Backend::new_test(keep_blocks, 0)); @@ -132,6 +115,11 @@ impl TestClientBuilder &mut self.genesis_init } + /// Give access to the underlying backend of these clients + pub fn backend(&self) -> Arc { + self.backend.clone() + } + /// Extend child storage pub fn add_child_storage( mut self, @@ -177,9 +165,9 @@ impl TestClientBuilder >, sc_client::LongestChain, ) where - Executor: sc_client::CallExecutor, - Backend: sc_client_api::backend::Backend, - Block: BlockT::Out>, + Executor: sc_client::CallExecutor, + Backend: sc_client_api::backend::Backend, + Block: BlockT, { let storage = { @@ -237,8 +225,8 @@ impl TestClientBuilder< ) where I: Into>>, E: sc_executor::NativeExecutionDispatch, - Backend: sc_client_api::backend::Backend, - Block: BlockT::Out>, + Backend: sc_client_api::backend::Backend, + Block: BlockT, { let executor = executor.into().unwrap_or_else(|| NativeExecutor::new(WasmExecutionMethod::Interpreted, None) diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index 760aa44379..8e08f6a1b5 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -10,6 +10,7 @@ substrate-test-client = { version = "2.0.0", path = "../../client" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } substrate-test-runtime = { version = "2.0.0", path = "../../runtime" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../../primitives/api" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } codec = { package = "parity-scale-codec", version = "1.0.0" } sc-client-api = { version = "2.0.0", path = "../../../client/api" } diff --git a/test-utils/runtime/client/src/block_builder_ext.rs b/test-utils/runtime/client/src/block_builder_ext.rs index 356ee428d5..7626ac2ffa 100644 --- a/test-utils/runtime/client/src/block_builder_ext.rs +++ b/test-utils/runtime/client/src/block_builder_ext.rs @@ -16,8 +16,9 @@ //! Block Builder extensions for tests. -use substrate_test_runtime; -use sp_runtime::traits::ProvideRuntimeApi; +use sp_api::{ApiExt, ProvideRuntimeApi}; +use sc_client_api::backend; +use sp_runtime::traits::HasherFor; use sc_block_builder::BlockBuilderApi; @@ -33,9 +34,17 @@ pub trait BlockBuilderExt { ) -> Result<(), sp_blockchain::Error>; } -impl<'a, A> BlockBuilderExt for sc_block_builder::BlockBuilder<'a, substrate_test_runtime::Block, A> where - A: ProvideRuntimeApi + 'a, - A::Api: BlockBuilderApi, +impl<'a, A, B> BlockBuilderExt for sc_block_builder::BlockBuilder<'a, substrate_test_runtime::Block, A, B> where + A: ProvideRuntimeApi + 'a, + A::Api: BlockBuilderApi + + ApiExt< + substrate_test_runtime::Block, + StateBackend = backend::StateBackendFor + >, + B: backend::Backend, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + backend::StateBackendFor: + sp_api::StateBackend>, { fn push_transfer(&mut self, transfer: substrate_test_runtime::Transfer) -> Result<(), sp_blockchain::Error> { self.push(transfer.into_signed_tx()) diff --git a/test-utils/runtime/client/src/lib.rs b/test-utils/runtime/client/src/lib.rs index 28b219ccd4..1e05f95681 100644 --- a/test-utils/runtime/client/src/lib.rs +++ b/test-utils/runtime/client/src/lib.rs @@ -32,7 +32,7 @@ pub use self::block_builder_ext::BlockBuilderExt; use sp_core::sr25519; use sp_core::storage::{ChildInfo, Storage, StorageChild}; use substrate_test_runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor, HasherFor}; use sc_client::{ light::fetcher::{ Fetcher, @@ -45,7 +45,10 @@ use sc_client::{ /// A prelude to import in tests. pub mod prelude { // Trait extensions - pub use super::{BlockBuilderExt, DefaultTestClientBuilderExt, TestClientBuilderExt, ClientExt}; + pub use super::{ + BlockBuilderExt, DefaultTestClientBuilderExt, TestClientBuilderExt, ClientExt, + ClientBlockImportExt, + }; // Client structs pub use super::{ TestClient, TestClientBuilder, Backend, LightBackend, @@ -88,7 +91,7 @@ pub type LightExecutor = sc_client::light::call_executor::GenesisCallExecutor< sc_client::LocalCallExecutor< sc_client::light::backend::Backend< sc_client_db::light::LightStorage, - Blake2Hasher, + HasherFor >, NativeExecutor > @@ -165,10 +168,7 @@ pub trait DefaultTestClientBuilderExt: Sized { fn new() -> Self; } -impl DefaultTestClientBuilderExt for TestClientBuilder< - Executor, - Backend, -> { +impl DefaultTestClientBuilderExt for TestClientBuilder { fn new() -> Self { Self::with_default_backend() } @@ -176,11 +176,20 @@ impl DefaultTestClientBuilderExt for TestClientBuilder< /// A `test-runtime` extensions to `TestClientBuilder`. pub trait TestClientBuilderExt: Sized { + /// Returns a mutable reference to the genesis parameters. + fn genesis_init_mut(&mut self) -> &mut GenesisParameters; + /// Enable or disable support for changes trie in genesis. - fn set_support_changes_trie(self, support_changes_trie: bool) -> Self; + fn set_support_changes_trie(mut self, support_changes_trie: bool) -> Self { + self.genesis_init_mut().support_changes_trie = support_changes_trie; + self + } /// Override the default value for Wasm heap pages. - fn set_heap_pages(self, heap_pages: u64) -> Self; + fn set_heap_pages(mut self, heap_pages: u64) -> Self { + self.genesis_init_mut().heap_pages_override = Some(heap_pages); + self + } /// Add an extra value into the genesis storage. /// @@ -188,19 +197,36 @@ pub trait TestClientBuilderExt: Sized { /// /// Panics if the key is empty. fn add_extra_child_storage>, K: Into>, V: Into>>( - self, + mut self, storage_key: SK, child_info: ChildInfo, key: K, value: V, - ) -> Self; + ) -> Self { + let storage_key = storage_key.into(); + let key = key.into(); + assert!(!storage_key.is_empty()); + assert!(!key.is_empty()); + self.genesis_init_mut().extra_storage.children + .entry(storage_key) + .or_insert_with(|| StorageChild { + data: Default::default(), + child_info: child_info.to_owned(), + }).data.insert(key, value.into()); + self + } /// Add an extra child value into the genesis storage. /// /// # Panics /// /// Panics if the key is empty. - fn add_extra_storage>, V: Into>>(self, key: K, value: V) -> Self; + fn add_extra_storage>, V: Into>>(mut self, key: K, value: V) -> Self { + let key = key.into(); + assert!(!key.is_empty()); + self.genesis_init_mut().extra_storage.top.insert(key, value.into()); + self + } /// Build the test client. fn build(self) -> Client { @@ -209,55 +235,32 @@ pub trait TestClientBuilderExt: Sized { /// Build the test client and longest chain selector. fn build_with_longest_chain(self) -> (Client, sc_client::LongestChain); + + /// Build the test client and the backend. + fn build_with_backend(self) -> (Client, Arc); } impl TestClientBuilderExt for TestClientBuilder< sc_client::LocalCallExecutor>, B > where - B: sc_client_api::backend::Backend, + B: sc_client_api::backend::Backend, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + >::State: + sp_api::StateBackend>, { - fn set_heap_pages(mut self, heap_pages: u64) -> Self { - self.genesis_init_mut().heap_pages_override = Some(heap_pages); - self - } - - fn set_support_changes_trie(mut self, support_changes_trie: bool) -> Self { - self.genesis_init_mut().support_changes_trie = support_changes_trie; - self - } - - fn add_extra_storage>, V: Into>>(mut self, key: K, value: V) -> Self { - let key = key.into(); - assert!(!key.is_empty()); - self.genesis_init_mut().extra_storage.top.insert(key, value.into()); - self - } - - fn add_extra_child_storage>, K: Into>, V: Into>>( - mut self, - storage_key: SK, - child_info: ChildInfo, - key: K, - value: V, - ) -> Self { - let storage_key = storage_key.into(); - let key = key.into(); - assert!(!storage_key.is_empty()); - assert!(!key.is_empty()); - self.genesis_init_mut().extra_storage.children - .entry(storage_key) - .or_insert_with(|| StorageChild { - data: Default::default(), - child_info: child_info.to_owned(), - }).data.insert(key, value.into()); - self + fn genesis_init_mut(&mut self) -> &mut GenesisParameters { + Self::genesis_init_mut(self) } - fn build_with_longest_chain(self) -> (Client, sc_client::LongestChain) { self.build_with_native_executor(None) } + + fn build_with_backend(self) -> (Client, Arc) { + let backend = self.backend(); + (self.build_with_native_executor(None).0, backend) + } } /// Type of optional fetch callback. diff --git a/test-utils/runtime/client/src/trait_tests.rs b/test-utils/runtime/client/src/trait_tests.rs index 3b0b330226..05db43298f 100644 --- a/test-utils/runtime/client/src/trait_tests.rs +++ b/test-utils/runtime/client/src/trait_tests.rs @@ -21,19 +21,22 @@ use std::sync::Arc; -use sc_client_api::backend::LocalBackend; -use crate::block_builder_ext::BlockBuilderExt; +use crate::{ + AccountKeyring, ClientBlockImportExt, BlockBuilderExt, TestClientBuilder, TestClientBuilderExt, +}; +use sc_client_api::backend; use sc_client_api::blockchain::{Backend as BlockChainBackendT, HeaderBackend}; -use crate::{AccountKeyring, ClientExt, TestClientBuilder, TestClientBuilderExt}; use substrate_test_client::sp_consensus::BlockOrigin; -use sp_core::Blake2Hasher; use substrate_test_runtime::{self, Transfer}; use sp_runtime::generic::BlockId; -use sp_runtime::traits::Block as BlockT; +use sp_runtime::traits::{Block as BlockT, HasherFor}; /// helper to test the `leaves` implementation for various backends pub fn test_leaves_for_backend(backend: Arc) where - B: LocalBackend, + B: backend::Backend, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + backend::StateBackendFor: + sp_api::StateBackend>, { // block tree: // G -> A1 -> A2 -> A3 -> A4 -> A5 @@ -41,7 +44,7 @@ pub fn test_leaves_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = TestClientBuilder::with_backend(backend.clone()).build(); + let mut client = TestClientBuilder::with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); let genesis_hash = client.chain_info().genesis_hash; @@ -51,44 +54,72 @@ pub fn test_leaves_for_backend(backend: Arc) where vec![genesis_hash]); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a1.hash()]); + vec![a1.hash()], + ); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); #[allow(deprecated)] assert_eq!( blockchain.leaves().unwrap(), - vec![a2.hash()]); + vec![a2.hash()], + ); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); + let a3 = client.new_block_at( + &BlockId::Hash(a2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a3.clone()).unwrap(); + assert_eq!( blockchain.leaves().unwrap(), - vec![a3.hash()]); + vec![a3.hash()], + ); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); + let a4 = client.new_block_at( + &BlockId::Hash(a3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a4.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a4.hash()]); + vec![a4.hash()], + ); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); + let a5 = client.new_block_at( + &BlockId::Hash(a4.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, a5.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a5.hash()]); + vec![a5.hash()], + ); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -96,28 +127,44 @@ pub fn test_leaves_for_backend(backend: Arc) where amount: 41, nonce: 0, }).unwrap(); - let b2 = builder.bake().unwrap(); + let b2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, b2.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a5.hash(), b2.hash()]); + vec![a5.hash(), b2.hash()], + ); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); + let b3 = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, b3.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a5.hash(), b3.hash()]); + vec![a5.hash(), b3.hash()], + ); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); + let b4 = client.new_block_at( + &BlockId::Hash(b3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b4.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a5.hash(), b4.hash()]); + vec![a5.hash(), b4.hash()], + ); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).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(), @@ -125,14 +172,19 @@ pub fn test_leaves_for_backend(backend: Arc) where amount: 1, nonce: 1, }).unwrap(); - let c3 = builder.bake().unwrap(); + let c3 = builder.build().unwrap().block; client.import(BlockOrigin::Own, c3.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a5.hash(), b4.hash(), c3.hash()]); + vec![a5.hash(), b4.hash(), c3.hash()], + ); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -140,16 +192,20 @@ pub fn test_leaves_for_backend(backend: Arc) where amount: 1, nonce: 0, }).unwrap(); - let d2 = builder.bake().unwrap(); + let d2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, d2.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), - vec![a5.hash(), b4.hash(), c3.hash(), d2.hash()]); + vec![a5.hash(), b4.hash(), c3.hash(), d2.hash()], + ); } /// helper to test the `children` implementation for various backends pub fn test_children_for_backend(backend: Arc) where - B: LocalBackend, + B: backend::LocalBackend, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + >::State: + sp_api::StateBackend>, { // block tree: // G -> A1 -> A2 -> A3 -> A4 -> A5 @@ -157,31 +213,51 @@ pub fn test_children_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = TestClientBuilder::with_backend(backend.clone()).build(); + let mut client = TestClientBuilder::with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); + let a3 = client.new_block_at( + &BlockId::Hash(a2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); + let a4 = client.new_block_at( + &BlockId::Hash(a3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); + let a5 = client.new_block_at( + &BlockId::Hash(a4.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -189,19 +265,31 @@ pub fn test_children_for_backend(backend: Arc) where amount: 41, nonce: 0, }).unwrap(); - let b2 = builder.bake().unwrap(); + let b2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); + let b3 = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); + let b4 = client.new_block_at( + &BlockId::Hash(b3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).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(), @@ -209,11 +297,15 @@ pub fn test_children_for_backend(backend: Arc) where amount: 1, nonce: 1, }).unwrap(); - let c3 = builder.bake().unwrap(); + let c3 = builder.build().unwrap().block; client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -221,7 +313,7 @@ pub fn test_children_for_backend(backend: Arc) where amount: 1, nonce: 0, }).unwrap(); - let d2 = builder.bake().unwrap(); + let d2 = builder.build().unwrap().block; client.import(BlockOrigin::Own, d2.clone()).unwrap(); let genesis_hash = client.chain_info().genesis_hash; @@ -240,38 +332,61 @@ pub fn test_children_for_backend(backend: Arc) where } pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc) where - B: LocalBackend, + B: backend::LocalBackend, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + >::State: + sp_api::StateBackend>, { // block tree: // G -> A1 -> A2 -> A3 -> A4 -> A5 // A1 -> B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = TestClientBuilder::with_backend(backend.clone()).build(); + let mut client = TestClientBuilder::with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); // G -> A1 - let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); + let a2 = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); + let a3 = client.new_block_at( + &BlockId::Hash(a2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); + let a4 = client.new_block_at( + &BlockId::Hash(a3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); + let a5 = client.new_block_at( + &BlockId::Hash(a4.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -279,19 +394,31 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); + let b3 = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); + let b4 = client.new_block_at( + &BlockId::Hash(b3.hash()), + Default::default(), + false, + ).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(b2.hash()), + Default::default(), + false, + ).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(), @@ -299,11 +426,15 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + let mut builder = client.new_block_at( + &BlockId::Hash(a1.hash()), + Default::default(), + false, + ).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(), @@ -311,7 +442,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc>(); - let txs_root = BlakeTwo256::ordered_trie_root(txs); - info_expect_equal_hash(&txs_root, &header.extrinsics_root); - if let Mode::Overwrite = mode { - header.extrinsics_root = txs_root; - } else { - assert!(txs_root == header.extrinsics_root, "Transaction trie root must be valid."); - } - - // try to read something that depends on current header digest - // so that it'll be included in execution proof - if let Some(generic::DigestItem::Other(v)) = header.digest().logs().iter().next() { - let _: Option = storage::unhashed::get(&v); - } + initialize_block(header); // execute transactions - block.extrinsics.iter().enumerate().for_each(|(i, e)| { - storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); - let _ = execute_transaction_backend(e).unwrap_or_else(|_| panic!("Invalid transaction")); - storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); + block.extrinsics.iter().for_each(|e| { + let _ = execute_transaction(e.clone()).unwrap_or_else(|_| panic!("Invalid transaction")); }); - let o_new_authorities = ::take(); - let storage_root = Hash::decode(&mut &storage_root()[..]) - .expect("`storage_root` is a valid hash"); + let new_header = finalize_block(); if let Mode::Overwrite = mode { - header.state_root = storage_root; + header.state_root = new_header.state_root; } else { - // check storage root. - info_expect_equal_hash(&storage_root, &header.state_root); - assert!(storage_root == header.state_root, "Storage root must match that calculated."); + info_expect_equal_hash(&new_header.state_root, &header.state_root); + assert!( + new_header.state_root == header.state_root, + "Storage root must match that calculated.", + ); } - // check digest - let digest = &mut header.digest; - if let Some(storage_changes_root) = storage_changes_root(&header.parent_hash.encode()) { - digest.push( - generic::DigestItem::ChangesTrieRoot( - Hash::decode(&mut &storage_changes_root[..]) - .expect("`storage_changes_root` is a valid hash") - ) + if let Mode::Overwrite = mode { + header.extrinsics_root = new_header.extrinsics_root; + } else { + info_expect_equal_hash(&new_header.extrinsics_root, &header.extrinsics_root); + assert!( + new_header.extrinsics_root == header.extrinsics_root, + "Transaction trie root must be valid.", ); } - if let Some(new_authorities) = o_new_authorities { - digest.push(generic::DigestItem::Consensus(*b"aura", new_authorities.encode())); - digest.push(generic::DigestItem::Consensus(*b"babe", new_authorities.encode())); - } } /// The block executor. @@ -224,7 +200,7 @@ pub fn execute_transaction(utx: Extrinsic) -> ApplyExtrinsicResult { pub fn finalize_block() -> Header { let extrinsic_index: u32 = storage::unhashed::take(well_known_keys::EXTRINSIC_INDEX).unwrap(); let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); - let extrinsics_root = BlakeTwo256::ordered_trie_root(txs).into(); + let extrinsics_root = trie::blake2_256_ordered_root(txs).into(); 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`"); diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index 45e1af6f76..1a479c54e5 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -14,6 +14,7 @@ jsonrpc-derive = "14.0.3" log = "0.4.8" serde = { version = "1.0.101", features = ["derive"] } sp-runtime = { version = "2.0.0", path = "../../../../primitives/runtime" } +sp-api = { version = "2.0.0", path = "../../../../primitives/api" } frame-system-rpc-runtime-api = { version = "2.0.0", path = "../../../../frame/system/rpc/runtime-api" } sp-core = { version = "2.0.0", path = "../../../../primitives/core" } sp-blockchain = { version = "2.0.0", path = "../../../../primitives/blockchain" } diff --git a/utils/frame/rpc/system/src/lib.rs b/utils/frame/rpc/system/src/lib.rs index 3af1f2239b..f909e66fd6 100644 --- a/utils/frame/rpc/system/src/lib.rs +++ b/utils/frame/rpc/system/src/lib.rs @@ -80,7 +80,7 @@ impl FullSystem { impl SystemApi for FullSystem where - C: traits::ProvideRuntimeApi, + C: sp_api::ProvideRuntimeApi, C: HeaderBackend, C: Send + Sync + 'static, C::Api: AccountNonceApi, -- GitLab From cdceee247f46e2270db06fc69b9fa8c6f7e490da Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 10 Jan 2020 10:55:16 +0100 Subject: [PATCH 088/296] Society pallet (#4170) * Introduce efficient Hash-based RNG streamer * Initial draft of the society module * Introduce a test * Dual-pot logic * Vouching * Use chacha * Half way through moving to cliff payout. * Fixes * Add some tests * Remove printlns * Merge remote-tracking branch 'origin/gav-verified-id' into gav-verified-id # Conflicts: # frame/identity/src/lib.rs * Merge remote-tracking branch 'origin/gav-verified-id' into gav-verified-id # Conflicts: # frame/identity/src/lib.rs * Fix `slash_payout`, add test * Test for multi-slash_payout * Add docs to `put_bid` function and `bidding_works` test * Add strikes to test * Add comments to `rotate_period` * Implement `suspend_member` * Off chain iteration of suspended members using linked_map * Half of suspended candidate * Finish suspend_candidate, need tests * Resolve mistakes and feedback, add `suspended_candidate_rejected` test * Remove logic which increases payout time after un-suspension * Fix error in `slash_suspended_candidates`, add member check to `vote` * Fix vouch rewards, dont create zero payouts, add tests for vouch * Test unvouch * Unbid tests * Add lifecycle events, fix `add_member` to update `MembershipChanged` * Head cannot be removed from society * Use `add_member` in `found` to ensure `MembershipChanged` is triggered * Use `Judgement` enum for suspended candidate judgement * Make society instantiable * Implement challenges * Remove extra text in test * Remove `BlockNumber` return from `slash_payout` * Add bad vote causes slash test * Update frame/society/src/lib.rs Co-Authored-By: thiolliere * Add consts to module metadata * Check `suspended_member` cant bid * Increase strength of payout check, **must** be a member. * Start pallet documentation * Finish docs * Update library names, use decl_error * Prevent double bids, add test * Use `map` for vouching member, and introduce banned vouchers * Remove leftover docs * Vouching handles removed member lifecycles w/ tests * `take` the votes when tallying, add comprehensive checks before vouch or bid * Check votes are cleaned up * Check vote is for a valid candidate, add vote event * Defender vote event * Fix `judge_suspended_candidate`, add weight docs * First pass fixes (blank lines, formatting, no operational) * Bump copyright year * Make `add_member` infallible * More feedback updates * Add storage access complexity * Fix logic for AutoUnbid * Complete weight documentation * Optimize logic which used to result in double storage read. * Use Bid struct rather than tuple * Introduce `MaxMembers` configuration constant * Add comment about fringe scenario where `MaxMembers` could go over, NBD * Change MaxMembership to configurable storage item with ability for root to update * Make membership challenges skew toward failure. If no one at all votes, or the vote is tied, the user will be suspended from society. This means, that the user simply needs to vote for themselves to stay in society assuming no one else participates. * Refactor `is_candidate`as to avoid possible double storage reads in the future. * Blank lines Co-authored-by: Shawn Tabrizi Co-authored-by: thiolliere --- Cargo.lock | 16 + Cargo.toml | 1 + frame/society/Cargo.toml | 32 + frame/society/src/lib.rs | 1507 +++++++++++++++++++++++++++++++++++ frame/society/src/mock.rs | 204 +++++ frame/society/src/tests.rs | 744 +++++++++++++++++ frame/support/src/traits.rs | 8 +- 7 files changed, 2511 insertions(+), 1 deletion(-) create mode 100644 frame/society/Cargo.toml create mode 100644 frame/society/src/lib.rs create mode 100644 frame/society/src/mock.rs create mode 100644 frame/society/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index eb8d93ddba..d649721e43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3930,6 +3930,22 @@ dependencies = [ "sp-trie 2.0.0", ] +[[package]] +name = "pallet-society" +version = "2.0.0" +dependencies = [ + "frame-support 2.0.0", + "frame-system 2.0.0", + "pallet-balances 2.0.0", + "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-runtime 2.0.0", + "sp-std 2.0.0", +] + [[package]] name = "pallet-staking" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index 7404744a41..ade5cd24e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -80,6 +80,7 @@ members = [ "frame/randomness-collective-flip", "frame/scored-pool", "frame/session", + "frame/society", "frame/staking", "frame/staking/reward-curve", "frame/sudo", diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml new file mode 100644 index 0000000000..94000e898d --- /dev/null +++ b/frame/society/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "pallet-society" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +serde = { version = "1.0.101", optional = true } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +sp-io ={ path = "../../primitives/io", default-features = false } +sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0", default-features = false, path = "../support" } +frame-system = { version = "2.0.0", default-features = false, path = "../system" } +rand_chacha = { version = "0.2", default-features = false } + +[dev-dependencies] +sp-core = { version = "2.0.0", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0", path = "../balances" } + +[features] +default = ["std"] +std = [ + "codec/std", + "serde", + "sp-io/std", + "sp-runtime/std", + "rand_chacha/std", + "sp-std/std", + "frame-support/std", + "frame-system/std", +] diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs new file mode 100644 index 0000000000..d5bf0bcf4e --- /dev/null +++ b/frame/society/src/lib.rs @@ -0,0 +1,1507 @@ +// Copyright 2020 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 . + +//! # Society Module +//! +//! - [`society::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! +//! ## Overview +//! +//! The Society module is an economic game which incentivizes users to participate +//! and maintain a membership society. +//! +//! ### User Types +//! +//! At any point, a user in the society can be one of a: +//! * Bidder - A user who has submitted intention of joining the society. +//! * Candidate - A user who will be voted on to join the society. +//! * Suspended Candidate - A user who failed to win a vote. +//! * Member - A user who is a member of the society. +//! * Suspended Member - A member of the society who has accumulated too many strikes +//! or failed their membership challenge. +//! +//! Of the non-suspended members, there is always a: +//! * Head - A member who is exempt from suspension. +//! * Defender - A member whose membership is under question and voted on again. +//! +//! Of the non-suspended members of the society, a random set of them are chosen as +//! "skeptics". The mechanics of skeptics is explained in the +//! [member phase](#member-phase) below. +//! +//! ### Mechanics +//! +//! #### Rewards +//! +//! Members are incentivized to participate in the society through rewards paid +//! by the Society treasury. These payments have a maturity period that the user +//! must wait before they are able to access the funds. +//! +//! #### Punishments +//! +//! Members can be punished by slashing the reward payouts that have not been +//! collected. Additionally, members can accumulate "strikes", and when they +//! reach a max strike limit, they become suspended. +//! +//! #### Skeptics +//! +//! During the voting period, a random set of members are selected as "skeptics". +//! These skeptics are expected to vote on the current candidates. If they do not vote, +//! their skeptic status is treated as a rejection vote, the member is deemed +//! "lazy", and are given a strike per missing vote. +//! +//! #### Membership Challenges +//! +//! Every challenge rotation period, an existing member will be randomly selected +//! to defend their membership into society. Then, other members can vote whether +//! this defender should stay in society. A simple majority wins vote will determine +//! the outcome of the user. Ties are treated as a failure of the challenge, but +//! assuming no one else votes, the defender always get a free vote on their +//! own challenge keeping them in the society. The Head member is exempt from the +//! negative outcome of a membership challenge. +//! +//! #### Society Treasury +//! +//! The membership society is independently funded by a treasury managed by this +//! module. Some subset of this treasury is placed in a Society Pot, which is used +//! to determine the number of accepted bids. +//! +//! #### Rate of Growth +//! +//! The membership society can grow at a rate of 10 accepted candidates per rotation period up +//! to the max membership threshold. Once this threshold is met, candidate selections +//! are stalled until there is space for new members to join. This can be resolved by +//! voting out existing members through the random challenges or by using governance +//! to increase the maximum membership count. +//! +//! ### User Life Cycle +//! +//! A user can go through the following phases: +//! +//! ```ignore +//! +-------> User <----------+ +//! | + | +//! | | | +//! +----------------------------------------------+ +//! | | | | | +//! | | v | | +//! | | Bidder <-----------+ | +//! | | + | | +//! | | | + | +//! | | v Suspended | +//! | | Candidate +----> Candidate | +//! | | + + | +//! | | | | | +//! | + | | | +//! | Suspended +------>| | | +//! | Member | | | +//! | ^ | | | +//! | | v | | +//! | +-------+ Member <----------+ | +//! | | +//! | | +//! +------------------Society---------------------+ +//! ``` +//! +//! #### Initialization +//! +//! The society is initialized with a single member who is automatically chosen as the Head. +//! +//! #### Bid Phase +//! +//! New users must have a bid to join the society. +//! +//! A user can make a bid by reserving a deposit. Alternatively, an already existing member +//! can create a bid on a user's behalf by "vouching" for them. +//! +//! A bid includes reward information that the user would like to receive for joining +//! the society. A vouching bid can additionally request some portion of that reward as a tip +//! to the voucher for vouching for the prospective candidate. +//! +//! Every rotation period, Bids are ordered by reward amount, and the module +//! selects as many bids the Society Pot can support for that period. +//! +//! These selected bids become candidates and move on to the Candidate phase. +//! Bids that were not selected stay in the bidder pool until they are selected or +//! a user chooses to "unbid". +//! +//! #### Candidate Phase +//! +//! Once a bidder becomes a candidate, members vote whether to approve or reject +//! that candidate into society. This voting process also happens during a rotation period. +//! +//! The approval and rejection criteria for candidates are not set on chain, +//! and may change for different societies. +//! +//! At the end of the rotation period, we collect the votes for a candidate +//! and randomly select a vote as the final outcome. +//! +//! ```ignore +//! [ a-accept, r-reject, s-skeptic ] +//! +----------------------------------+ +//! | | +//! | Member |0|1|2|3|4|5|6|7|8|9| | +//! | ----------------------------- | +//! | Vote |a|a|a|r|s|r|a|a|s|a| | +//! | ----------------------------- | +//! | Selected | | | |x| | | | | | | | +//! | | +//! +----------------------------------+ +//! +//! Result: Rejected +//! ``` +//! +//! Each member that voted opposite to this randomly selected vote is punished by +//! slashing their unclaimed payouts and increasing the number of strikes they have. +//! +//! These slashed funds are given to a random user who voted the same as the +//! selected vote as a reward for participating in the vote. +//! +//! If the candidate wins the vote, they receive their bid reward as a future payout. +//! If the bid was placed by a voucher, they will receive their portion of the reward, +//! before the rest is paid to the winning candidate. +//! +//! One winning candidate is selected as the Head of the members. This is randomly +//! chosen, weighted by the number of approvals the winning candidates accumulated. +//! +//! If the candidate loses the vote, they are suspended and it is up to the Suspension +//! Judgement origin to determine if the candidate should go through the bidding process +//! again, should be accepted into the membership society, or rejected and their deposit +//! slashed. +//! +//! #### Member Phase +//! +//! Once a candidate becomes a member, their role is to participate in society. +//! +//! Regular participation involves voting on candidates who want to join the membership +//! society, and by voting in the right way, a member will accumulate future payouts. +//! When a payout matures, members are able to claim those payouts. +//! +//! Members can also vouch for users to join the society, and request a "tip" from +//! the fees the new member would collect by joining the society. This vouching +//! process is useful in situations where a user may not have enough balance to +//! satisfy the bid deposit. A member can only vouch one user at a time. +//! +//! During rotation periods, a random group of members are selected as "skeptics". +//! These skeptics are expected to vote on the current candidates. If they do not vote, +//! their skeptic status is treated as a rejection vote, the member is deemed +//! "lazy", and are given a strike per missing vote. +//! +//! There is a challenge period in parallel to the rotation period. During a challenge period, +//! a random member is selected to defend their membership to the society. Other members +//! make a traditional majority-wins vote to determine if the member should stay in the society. +//! Ties are treated as a failure of the challenge. +//! +//! If a member accumulates too many strikes or fails their membership challenge, +//! they will become suspended. While a member is suspended, they are unable to +//! claim matured payouts. It is up to the Suspension Judgement origin to determine +//! if the member should re-enter society or be removed from society with all their +//! future payouts slashed. +//! +//! ## Interface +//! +//! ### Dispatchable Functions +//! +//! #### For General Users +//! +//! * `bid` - A user can make a bid to join the membership society by reserving a deposit. +//! * `unbid` - A user can withdraw their bid for entry, the deposit is returned. +//! +//! #### For Members +//! +//! * `vouch` - A member can place a bid on behalf of a user to join the membership society. +//! * `unvouch` - A member can revoke their vouch for a user. +//! * `vote` - A member can vote to approve or reject a candidate's request to join the society. +//! * `defender_vote` - A member can vote to approve or reject a defender's continued membership +//! to the society. +//! * `payout` - A member can claim their first matured payment. +//! +//! #### For Super Users +//! +//! * `found` - The founder origin can initiate this society. Useful for bootstrapping the Society +//! pallet on an already running chain. +//! * `judge_suspended_member` - The suspension judgement origin is able to make +//! judgement on a suspended member. +//! * `judge_suspended_candidate` - The suspension judgement origin is able to +//! make judgement on a suspended candidate. +//! * `set_max_membership` - The ROOT origin can update the maximum member count for the society. +//! The max membership count must be greater than 1. + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod tests; + +use rand_chacha::{rand_core::{RngCore, SeedableRng}, ChaChaRng}; +use sp_std::prelude::*; +use codec::{Encode, Decode}; +use sp_runtime::{Percent, ModuleId, RuntimeDebug, + traits::{ + StaticLookup, AccountIdConversion, Saturating, Zero, IntegerSquareRoot, + TrailingZeroInput, CheckedSub, EnsureOrigin + } +}; +use frame_support::{decl_error, decl_module, decl_storage, decl_event, ensure, dispatch::DispatchResult}; +use frame_support::weights::SimpleDispatchInfo; +use frame_support::traits::{ + Currency, ReservableCurrency, Randomness, Get, ChangeMembers, + ExistenceRequirement::{KeepAlive, AllowDeath}, +}; +use frame_system::{self as system, ensure_signed, ensure_root}; + +type BalanceOf = <>::Currency as Currency<::AccountId>>::Balance; + +const MODULE_ID: ModuleId = ModuleId(*b"py/socie"); + +/// The module's configuration trait. +pub trait Trait: system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + + /// The currency type used for bidding. + type Currency: ReservableCurrency; + + /// Something that provides randomness in the runtime. + type Randomness: Randomness; + + /// The minimum amount of a deposit required for a bid to be made. + type CandidateDeposit: Get>; + + /// The amount of the unpaid reward that gets deducted in the case that either a skeptic + /// doesn't vote or someone votes in the wrong way. + type WrongSideDeduction: Get>; + + /// The number of times a member may vote the wrong way (or not at all, when they are a skeptic) + /// before they become suspended. + type MaxStrikes: Get; + + /// The amount of incentive paid within each period. Doesn't include VoterTip. + type PeriodSpend: Get>; + + /// The receiver of the signal for when the members have changed. + type MembershipChanged: ChangeMembers; + + /// The number of blocks between candidate/membership rotation periods. + type RotationPeriod: Get; + + /// The maximum duration of the payout lock. + type MaxLockDuration: Get; + + /// The origin that is allowed to call `found`. + type FounderOrigin: EnsureOrigin; + + /// The origin that is allowed to make suspension judgements. + type SuspensionJudgementOrigin: EnsureOrigin; + + /// The number of blocks between membership challenges. + type ChallengePeriod: Get; +} + +/// A vote by a member on a candidate application. +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] +pub enum Vote { + /// The member has been chosen to be skeptic and has not yet taken any action. + Skeptic, + /// The member has rejected the candidate's application. + Reject, + /// The member approves of the candidate's application. + Approve, +} + +/// A judgement by the suspension judgement origin on a suspended candidate. +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] +pub enum Judgement { + /// The suspension judgement origin takes no direct judgment + /// and places the candidate back into the bid pool. + Rebid, + /// The suspension judgement origin has rejected the candidate's application. + Reject, + /// The suspension judgement origin approves of the candidate's application. + Approve, +} + +/// Details of a payout given as a per-block linear "trickle". +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug, Default)] +pub struct Payout { + /// Total value of the payout. + value: Balance, + /// Block number at which the payout begins. + begin: BlockNumber, + /// Total number of blocks over which the payout is spread. + duration: BlockNumber, + /// Total value paid out so far. + paid: Balance, +} + +/// Status of a vouching member. +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] +pub enum VouchingStatus { + /// Member is currently vouching for a user. + Vouching, + /// Member is banned from vouching for other members. + Banned, +} + +/// Number of strikes that a member has against them. +pub type StrikeCount = u32; + +/// A bid for entry into society. +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug,)] +pub struct Bid { + /// The bidder/candidate trying to enter society + who: AccountId, + /// The kind of bid placed for this bidder/candidate. See `BidKind`. + kind: BidKind, + /// The reward that the bidder has requested for successfully joining the society. + value: Balance, +} + +/// A vote by a member on a candidate application. +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] +pub enum BidKind { + /// The CandidateDeposit was paid for this bid. + Deposit(Balance), + /// A member vouched for this bid. The account should be reinstated into `Members` once the + /// bid is successful (or if it is rescinded prior to launch). + Vouch(AccountId, Balance), +} + +impl BidKind { + fn check_voucher(&self, v: &AccountId) -> DispatchResult { + if let BidKind::Vouch(ref a, _) = self { + if a == v { + Ok(()) + } else { + Err("incorrect identity")? + } + } else { + Err("not vouched")? + } + } +} + +// This module's storage items. +decl_storage! { + trait Store for Module, I: Instance=DefaultInstance> as Society { + /// The current set of candidates; bidders that are attempting to become members. + pub Candidates get(candidates): Vec>>; + + /// The set of suspended candidates. + pub SuspendedCandidates get(suspended_candidate): + map T::AccountId => Option<(BalanceOf, BidKind>)>; + + /// Amount of our account balance that is specifically for the next round's bid(s). + pub Pot get(fn pot) config(): BalanceOf; + + /// The most primary from the most recently approved members. + pub Head get(head) build(|config: &GenesisConfig| config.members.first().cloned()): + Option; + + /// The current set of members, ordered. + pub Members get(fn members) build(|config: &GenesisConfig| { + let mut m = config.members.clone(); + m.sort(); + m + }): Vec; + + /// The set of suspended members. + pub SuspendedMembers get(fn suspended_member): map T::AccountId => Option<()>; + + /// The current bids, stored ordered by the value of the bid. + Bids: Vec>>; + + /// Members currently vouching or banned from vouching again + Vouching get(fn vouching): map T::AccountId => Option; + + /// Pending payouts; ordered by block number, with the amount that should be paid out. + Payouts: map T::AccountId => Vec<(T::BlockNumber, BalanceOf)>; + + /// The ongoing number of losing votes cast by the member. + Strikes: map T::AccountId => StrikeCount; + + /// Double map from Candidate -> Voter -> (Maybe) Vote. + Votes: double_map + hasher(twox_64_concat) T::AccountId, + twox_64_concat(T::AccountId) + => Option; + + /// The defending member currently being challenged. + Defender get(fn defender): Option; + + /// Votes for the defender. + DefenderVotes: map hasher(twox_64_concat) T::AccountId => Option; + + /// The max number of members for the society at one time. + MaxMembers get(fn max_members) config(): u32; + } + add_extra_genesis { + config(members): Vec; + } +} + +// The module's dispatchable functions. +decl_module! { + /// The module declaration. + pub struct Module, I: Instance=DefaultInstance> for enum Call where origin: T::Origin { + type Error = Error; + /// The minimum amount of a deposit required for a bid to be made. + const CandidateDeposit: BalanceOf = T::CandidateDeposit::get(); + + /// The amount of the unpaid reward that gets deducted in the case that either a skeptic + /// doesn't vote or someone votes in the wrong way. + const WrongSideDeduction: BalanceOf = T::WrongSideDeduction::get(); + + /// The number of times a member may vote the wrong way (or not at all, when they are a skeptic) + /// before they become suspended. + const MaxStrikes: u32 = T::MaxStrikes::get(); + + /// The amount of incentive paid within each period. Doesn't include VoterTip. + const PeriodSpend: BalanceOf = T::PeriodSpend::get(); + + /// The number of blocks between candidate/membership rotation periods. + const RotationPeriod: T::BlockNumber = T::RotationPeriod::get(); + + /// The number of blocks between membership challenges. + const ChallengePeriod: T::BlockNumber = T::ChallengePeriod::get(); + + // Used for handling module events. + fn deposit_event() = default; + + /// A user outside of the society can make a bid for entry. + /// + /// Payment: `CandidateDeposit` will be reserved for making a bid. It is returned + /// when the bid becomes a member, or if the bid calls `unbid`. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// Parameters: + /// - `value`: A one time payment the bid would like to receive when joining the society. + /// + /// # + /// Key: B (len of bids), C (len of candidates), M (len of members), X (balance reserve) + /// - Storage Reads: + /// - One storage read to check for suspended candidate. O(1) + /// - One storage read to check for suspended member. O(1) + /// - One storage read to retrieve all current bids. O(B) + /// - One storage read to retrieve all current candidates. O(C) + /// - One storage read to retrieve all members. O(M) + /// - Storage Writes: + /// - One storage mutate to add a new bid to the vector O(B) (TODO: possible optimization w/ read) + /// - Up to one storage removal if bid.len() > MAX_BID_COUNT. O(1) + /// - Notable Computation: + /// - O(B + C + log M) search to check user is not already a part of society. + /// - O(log B) search to insert the new bid sorted. + /// - External Module Operations: + /// - One balance reserve operation. O(X) + /// - Up to one balance unreserve operation if bids.len() > MAX_BID_COUNT. + /// - Events: + /// - One event for new bid. + /// - Up to one event for AutoUnbid if bid.len() > MAX_BID_COUNT. + /// + /// Total Complexity: O(M + B + C + logM + logB + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + pub fn bid(origin, value: BalanceOf) -> DispatchResult { + let who = ensure_signed(origin)?; + ensure!(!>::exists(&who), Error::::Suspended); + ensure!(!>::exists(&who), Error::::Suspended); + let bids = >::get(); + ensure!(!Self::is_bid(&bids, &who), Error::::AlreadyBid); + let candidates = >::get(); + ensure!(!Self::is_candidate(&candidates, &who), Error::::AlreadyCandidate); + let members = >::get(); + ensure!(!Self::is_member(&members ,&who), Error::::AlreadyMember); + + let deposit = T::CandidateDeposit::get(); + T::Currency::reserve(&who, deposit)?; + + Self::put_bid(bids, &who, value.clone(), BidKind::Deposit(deposit)); + Self::deposit_event(RawEvent::Bid(who, value)); + Ok(()) + } + + /// A bidder can remove their bid for entry into society. + /// By doing so, they will have their candidate deposit returned or + /// they will unvouch their voucher. + /// + /// Payment: The bid deposit is unreserved if the user made a bid. + /// + /// The dispatch origin for this call must be _Signed_ and a bidder. + /// + /// Parameters: + /// - `pos`: Position in the `Bids` vector of the bid who wants to unbid. + /// + /// # + /// Key: B (len of bids), X (balance unreserve) + /// - One storage read and write to retrieve and update the bids. O(B) + /// - Either one unreserve balance action O(X) or one vouching storage removal. O(1) + /// - One event. + /// + /// Total Complexity: O(B + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(20_000)] + pub fn unbid(origin, pos: u32) -> DispatchResult { + let who = ensure_signed(origin)?; + + let pos = pos as usize; + >::mutate(|b| + if pos < b.len() && b[pos].who == who { + // Either unreserve the deposit or free up the vouching member. + // In neither case can we do much if the action isn't completable, but there's + // no reason that either should fail. + match b.remove(pos).kind { + BidKind::Deposit(deposit) => { + let _ = T::Currency::unreserve(&who, deposit); + } + BidKind::Vouch(voucher, _) => { + >::remove(&voucher); + } + } + Self::deposit_event(RawEvent::Unbid(who)); + Ok(()) + } else { + Err(Error::::BadPosition)? + } + ) + } + + /// As a member, vouch for someone to join society by placing a bid on their behalf. + /// + /// There is no deposit required to vouch for a new bid, but a member can only vouch for + /// one bid at a time. If the bid becomes a suspended candidate and ultimately rejected by + /// the suspension judgement origin, the member will be banned from vouching again. + /// + /// As a vouching member, you can claim a tip if the candidate is accepted. This tip will + /// be paid as a portion of the reward the member will receive for joining the society. + /// + /// The dispatch origin for this call must be _Signed_ and a member. + /// + /// Parameters: + /// - `who`: The user who you would like to vouch for. + /// - `value`: The total reward to be paid between you and the candidate if they become + /// a member in the society. + /// - `tip`: Your cut of the total `value` payout when the candidate is inducted into + /// the society. Tips larger than `value` will be saturated upon payout. + /// + /// # + /// Key: B (len of bids), C (len of candidates), M (len of members) + /// - Storage Reads: + /// - One storage read to retrieve all members. O(M) + /// - One storage read to check member is not already vouching. O(1) + /// - One storage read to check for suspended candidate. O(1) + /// - One storage read to check for suspended member. O(1) + /// - One storage read to retrieve all current bids. O(B) + /// - One storage read to retrieve all current candidates. O(C) + /// - Storage Writes: + /// - One storage write to insert vouching status to the member. O(1) + /// - One storage mutate to add a new bid to the vector O(B) (TODO: possible optimization w/ read) + /// - Up to one storage removal if bid.len() > MAX_BID_COUNT. O(1) + /// - Notable Computation: + /// - O(log M) search to check sender is a member. + /// - O(B + C + log M) search to check user is not already a part of society. + /// - O(log B) search to insert the new bid sorted. + /// - External Module Operations: + /// - One balance reserve operation. O(X) + /// - Up to one balance unreserve operation if bids.len() > MAX_BID_COUNT. + /// - Events: + /// - One event for vouch. + /// - Up to one event for AutoUnbid if bid.len() > MAX_BID_COUNT. + /// + /// Total Complexity: O(M + B + C + logM + logB + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + pub fn vouch(origin, who: T::AccountId, value: BalanceOf, tip: BalanceOf) -> DispatchResult { + let voucher = ensure_signed(origin)?; + // Check user is not suspended. + ensure!(!>::exists(&who), Error::::Suspended); + ensure!(!>::exists(&who), Error::::Suspended); + // Check user is not a bid or candidate. + let bids = >::get(); + ensure!(!Self::is_bid(&bids, &who), Error::::AlreadyBid); + let candidates = >::get(); + ensure!(!Self::is_candidate(&candidates, &who), Error::::AlreadyCandidate); + // Check user is not already a member. + let members = >::get(); + ensure!(!Self::is_member(&members, &who), Error::::AlreadyMember); + // Check sender can vouch. + ensure!(Self::is_member(&members, &voucher), Error::::NotMember); + ensure!(!>::exists(&voucher), Error::::AlreadyVouching); + + >::insert(&voucher, VouchingStatus::Vouching); + Self::put_bid(bids, &who, value.clone(), BidKind::Vouch(voucher.clone(), tip)); + Self::deposit_event(RawEvent::Vouch(who, value, voucher)); + Ok(()) + } + + /// As a vouching member, unvouch a bid. This only works while vouched user is + /// only a bidder (and not a candidate). + /// + /// The dispatch origin for this call must be _Signed_ and a vouching member. + /// + /// Parameters: + /// - `pos`: Position in the `Bids` vector of the bid who should be unvouched. + /// + /// # + /// Key: B (len of bids) + /// - One storage read O(1) to check the signer is a vouching member. + /// - One storage mutate to retrieve and update the bids. O(B) + /// - One vouching storage removal. O(1) + /// - One event. + /// + /// Total Complexity: O(B) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(20_000)] + pub fn unvouch(origin, pos: u32) -> DispatchResult { + let voucher = ensure_signed(origin)?; + ensure!(Self::vouching(&voucher) == Some(VouchingStatus::Vouching), Error::::NotVouching); + + let pos = pos as usize; + >::mutate(|b| + if pos < b.len() { + b[pos].kind.check_voucher(&voucher)?; + >::remove(&voucher); + let who = b.remove(pos).who; + Self::deposit_event(RawEvent::Unvouch(who)); + Ok(()) + } else { + Err(Error::::BadPosition)? + } + ) + } + + /// As a member, vote on a candidate. + /// + /// The dispatch origin for this call must be _Signed_ and a member. + /// + /// Parameters: + /// - `candidate`: The candidate that the member would like to bid on. + /// - `approve`: A boolean which says if the candidate should be + /// approved (`true`) or rejected (`false`). + /// + /// # + /// Key: C (len of candidates), M (len of members) + /// - One storage read O(M) and O(log M) search to check user is a member. + /// - One account lookup. + /// - One storage read O(C) and O(C) search to check that user is a candidate. + /// - One storage write to add vote to votes. O(1) + /// - One event. + /// + /// Total Complexity: O(M + logM + C) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(30_000)] + pub fn vote(origin, candidate: ::Source, approve: bool) { + let voter = ensure_signed(origin)?; + let candidate = T::Lookup::lookup(candidate)?; + let candidates = >::get(); + ensure!(Self::is_candidate(&candidates, &candidate), Error::::NotCandidate); + let members = >::get(); + ensure!(Self::is_member(&members, &voter), Error::::NotMember); + + let vote = if approve { Vote::Approve } else { Vote::Reject }; + >::insert(&candidate, &voter, vote); + + Self::deposit_event(RawEvent::Vote(candidate, voter, approve)); + } + + /// As a member, vote on the defender. + /// + /// The dispatch origin for this call must be _Signed_ and a member. + /// + /// Parameters: + /// - `approve`: A boolean which says if the candidate should be + /// approved (`true`) or rejected (`false`). + /// + /// # + /// - Key: M (len of members) + /// - One storage read O(M) and O(log M) search to check user is a member. + /// - One storage write to add vote to votes. O(1) + /// - One event. + /// + /// Total Complexity: O(M + logM) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(20_000)] + pub fn defender_vote(origin, approve: bool) { + let voter = ensure_signed(origin)?; + let members = >::get(); + ensure!(Self::is_member(&members, &voter), Error::::NotMember); + + let vote = if approve { Vote::Approve } else { Vote::Reject }; + >::insert(&voter, vote); + + Self::deposit_event(RawEvent::DefenderVote(voter, approve)); + } + + /// Transfer the first matured payout for the sender and remove it from the records. + /// + /// NOTE: This extrinsic needs to be called multiple times to claim multiple matured payouts. + /// + /// Payment: The member will receive a payment equal to their first matured + /// payout to their free balance. + /// + /// The dispatch origin for this call must be _Signed_ and a member with + /// payouts remaining. + /// + /// # + /// Key: M (len of members), P (number of payouts for a particular member) + /// - One storage read O(M) and O(log M) search to check signer is a member. + /// - One storage read O(P) to get all payouts for a member. + /// - One storage read O(1) to get the current block number. + /// - One currency transfer call. O(X) + /// - One storage write or removal to update the member's payouts. O(P) + /// + /// Total Complexity: O(M + logM + P + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(30_000)] + pub fn payout(origin) { + let who = ensure_signed(origin)?; + + let members = >::get(); + ensure!(Self::is_member(&members, &who), Error::::NotMember); + + let mut payouts = >::get(&who); + if let Some((when, amount)) = payouts.first() { + if when <= &>::block_number() { + T::Currency::transfer(&Self::payouts(), &who, *amount, KeepAlive)?; + payouts.remove(0); + if payouts.is_empty() { + >::remove(&who); + } else { + >::insert(&who, payouts); + } + return Ok(()) + } + } + Err(Error::::NoPayout)? + } + + /// Found the society. + /// + /// This is done as a discrete action in order to allow for the + /// module to be included into a running chain and can only be done once. + /// + /// The dispatch origin for this call must be from the _FounderOrigin_. + /// + /// Parameters: + /// - `founder` - The first member and head of the newly founded society. + /// + /// # + /// - One storage read to check `Head`. O(1) + /// - One storage write to add the first member to society. O(1) + /// - One storage write to add new Head. O(1) + /// - One event. + /// + /// Total Complexity: O(1) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] + fn found(origin, founder: T::AccountId) { + T::FounderOrigin::ensure_origin(origin)?; + ensure!(!>::exists(), Error::::AlreadyFounded); + // This should never fail in the context of this function... + Self::add_member(&founder)?; + >::put(&founder); + Self::deposit_event(RawEvent::Founded(founder)); + } + /// Allow suspension judgement origin to make judgement on a suspended member. + /// + /// If a suspended member is forgiven, we simply add them back as a member, not affecting + /// any of the existing storage items for that member. + /// + /// If a suspended member is rejected, remove all associated storage items, including + /// their payouts, and remove any vouched bids they currently have. + /// + /// The dispatch origin for this call must be from the _SuspensionJudgementOrigin_. + /// + /// Parameters: + /// - `who` - The suspended member to be judged. + /// - `forgive` - A boolean representing whether the suspension judgement origin + /// forgives (`true`) or rejects (`false`) a suspended member. + /// + /// # + /// Key: B (len of bids), M (len of members) + /// - One storage read to check `who` is a suspended member. O(1) + /// - Up to one storage write O(M) with O(log M) binary search to add a member back to society. + /// - Up to 3 storage removals O(1) to clean up a removed member. + /// - Up to one storage write O(B) with O(B) search to remove vouched bid from bids. + /// - Up to one additional event if unvouch takes place. + /// - One storage removal. O(1) + /// - One event for the judgement. + /// + /// Total Complexity: O(M + logM + B) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(30_000)] + fn judge_suspended_member(origin, who: T::AccountId, forgive: bool) { + T::SuspensionJudgementOrigin::ensure_origin(origin)?; + ensure!(>::exists(&who), Error::::NotSuspended); + + if forgive { + // Try to add member back to society. Can fail with `MaxMembers` limit. + Self::add_member(&who)?; + } else { + // Cancel a suspended member's membership, remove their payouts. + >::remove(&who); + >::remove(&who); + // Remove their vouching status, potentially unbanning them in the future. + if >::take(&who) == Some(VouchingStatus::Vouching) { + // Try to remove their bid if they are vouching. + // If their vouch is already a candidate, do nothing. + >::mutate(|bids| + // Try to find the matching bid + if let Some(pos) = bids.iter().position(|b| b.kind.check_voucher(&who).is_ok()) { + // Remove the bid, and emit an event + let vouched = bids.remove(pos).who; + Self::deposit_event(RawEvent::Unvouch(vouched)); + } + ); + } + } + + >::remove(&who); + Self::deposit_event(RawEvent::SuspendedMemberJudgement(who, forgive)); + } + + /// Allow suspended judgement origin to make judgement on a suspended candidate. + /// + /// If the judgement is `Approve`, we add them to society as a member with the appropriate + /// payment for joining society. + /// + /// If the judgement is `Reject`, we either slash the deposit of the bid, giving it back + /// to the society treasury, or we ban the voucher from vouching again. + /// + /// If the judgement is `Rebid`, we put the candidate back in the bid pool and let them go + /// through the induction process again. + /// + /// The dispatch origin for this call must be from the _SuspensionJudgementOrigin_. + /// + /// Parameters: + /// - `who` - The suspended candidate to be judged. + /// - `judgement` - `Approve`, `Reject`, or `Rebid`. + /// + /// # + /// Key: B (len of bids), M (len of members), X (balance action) + /// - One storage read to check `who` is a suspended candidate. + /// - One storage removal of the suspended candidate. + /// - Approve Logic + /// - One storage read to get the available pot to pay users with. O(1) + /// - One storage write to update the available pot. O(1) + /// - One storage read to get the current block number. O(1) + /// - One storage read to get all members. O(M) + /// - Up to one unreserve currency action. + /// - Up to two new storage writes to payouts. + /// - Up to one storage write with O(log M) binary search to add a member to society. + /// - Reject Logic + /// - Up to one repatriate reserved currency action. O(X) + /// - Up to one storage write to ban the vouching member from vouching again. + /// - Rebid Logic + /// - Storage mutate with O(log B) binary search to place the user back into bids. + /// - Up to one additional event if unvouch takes place. + /// - One storage removal. + /// - One event for the judgement. + /// + /// Total Complexity: O(M + logM + B + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn judge_suspended_candidate(origin, who: T::AccountId, judgement: Judgement) { + T::SuspensionJudgementOrigin::ensure_origin(origin)?; + if let Some((value, kind)) = >::get(&who) { + match judgement { + Judgement::Approve => { + // Suspension Judgement origin has approved this candidate + // Make sure we can pay them + let pot = Self::pot(); + ensure!(pot >= value, Error::::InsufficientPot); + // Try to add user as a member! Can fail with `MaxMember` limit. + Self::add_member(&who)?; + // Reduce next pot by payout + >::put(pot - value); + // Add payout for new candidate + let maturity = >::block_number() + + Self::lock_duration(Self::members().len() as u32); + Self::pay_accepted_candidate(&who, value, kind, maturity); + } + Judgement::Reject => { + // Founder has rejected this candidate + match kind { + BidKind::Deposit(deposit) => { + // Slash deposit and move it to the society account + let _ = T::Currency::repatriate_reserved(&who, &Self::account_id(), deposit); + } + BidKind::Vouch(voucher, _) => { + // Ban the voucher from vouching again + >::insert(&voucher, VouchingStatus::Banned); + } + } + } + Judgement::Rebid => { + // Founder has taken no judgement, and candidate is placed back into the pool. + let bids = >::get(); + Self::put_bid(bids, &who, value, kind); + } + } + + // Remove suspended candidate + >::remove(who); + } else { + Err(Error::::NotSuspended)? + } + } + + /// Allows root origin to change the maximum number of members in society. + /// Max membership count must be greater than 1. + /// + /// The dispatch origin for this call must be from _ROOT_. + /// + /// Parameters: + /// - `max` - The maximum number of members for the society. + /// + /// # + /// - One storage write to update the max. O(1) + /// - One event. + /// + /// Total Complexity: O(1) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] + fn set_max_members(origin, max: u32) { + ensure_root(origin)?; + ensure!(max > 1, Error::::MaxMembers); + MaxMembers::::put(max); + Self::deposit_event(RawEvent::NewMaxMembers(max)); + } + + fn on_initialize(n: T::BlockNumber) { + let mut members = vec![]; + + // Run a candidate/membership rotation + if (n % T::RotationPeriod::get()).is_zero() { + members = >::get(); + Self::rotate_period(&mut members); + } + + // Run a challenge rotation + if (n % T::ChallengePeriod::get()).is_zero() { + // Only read members if not already read. + if members.is_empty() { + members = >::get(); + } + Self::rotate_challenge(&mut members); + } + } + } +} + +decl_error! { + /// Errors for this module. + pub enum Error for Module, I: Instance> { + /// An incorrect position was provided. + BadPosition, + /// User is not a member + NotMember, + /// User is already a member + AlreadyMember, + /// User is suspended + Suspended, + /// User is not suspended + NotSuspended, + /// Nothing to payout + NoPayout, + /// Society already founded + AlreadyFounded, + /// Not enough in pot to accept candidate + InsufficientPot, + /// Member is already vouching or banned from vouching again + AlreadyVouching, + /// Member is not vouching + NotVouching, + /// Cannot remove head + Head, + /// User has already made a bid + AlreadyBid, + /// User is already a candidate + AlreadyCandidate, + /// User is not a candidate + NotCandidate, + /// Too many members in the society + MaxMembers, + } +} + +decl_event! { + /// Events for this module. + pub enum Event where + AccountId = ::AccountId, + Balance = BalanceOf + { + /// The society is founded by the given identity. + Founded(AccountId), + /// A membership bid just happened. The given account is the candidate's ID and their offer + /// is the second. + Bid(AccountId, Balance), + /// A membership bid just happened by vouching. The given account is the candidate's ID and + /// their offer is the second. The vouching party is the third. + Vouch(AccountId, Balance, AccountId), + /// A candidate was dropped (due to an excess of bids in the system). + AutoUnbid(AccountId), + /// A candidate was dropped (by their request). + Unbid(AccountId), + /// A candidate was dropped (by request of who vouched for them). + Unvouch(AccountId), + /// A group of candidates have been inducted. The batch's primary is the first value, the + /// batch in full is the second. + Inducted(AccountId, Vec), + /// A suspended member has been judged + SuspendedMemberJudgement(AccountId, bool), + /// A candidate has been suspended + CandidateSuspended(AccountId), + /// A member has been suspended + MemberSuspended(AccountId), + /// A member has been challenged + Challenged(AccountId), + /// A vote has been placed (candidate, voter, vote) + Vote(AccountId, AccountId, bool), + /// A vote has been placed for a defending member (voter, vote) + DefenderVote(AccountId, bool), + /// A new max member count has been set + NewMaxMembers(u32), + } +} + +/// Pick an item at pseudo-random from the slice, given the `rng`. `None` iff the slice is empty. +fn pick_item<'a, R: RngCore, T>(rng: &mut R, items: &'a [T]) -> Option<&'a T> { + if items.is_empty() { + None + } else { + Some(&items[pick_usize(rng, items.len() - 1)]) + } +} + +/// Pick a new PRN, in the range [0, `max`] (inclusive). +fn pick_usize<'a, R: RngCore>(rng: &mut R, max: usize) -> usize { + + (rng.next_u32() % (max as u32 + 1)) as usize +} + +impl, I: Instance> Module { + /// Puts a bid into storage ordered by smallest to largest value. + /// Allows a maximum of 1000 bids in queue, removing largest value people first. + fn put_bid( + mut bids: Vec>>, + who: &T::AccountId, + value: BalanceOf, + bid_kind: BidKind> + ) { + const MAX_BID_COUNT: usize = 1000; + + match bids.binary_search_by(|bid| bid.value.cmp(&value)) { + Ok(pos) | Err(pos) => bids.insert(pos, Bid { + value, + who: who.clone(), + kind: bid_kind, + }), + } + // Keep it reasonably small. + if bids.len() > MAX_BID_COUNT { + let Bid { who: popped, kind, .. } = bids.pop().expect("b.len() > 1000; qed"); + match kind { + BidKind::Deposit(deposit) => { + let _ = T::Currency::unreserve(&popped, deposit); + } + BidKind::Vouch(voucher, _) => { + >::remove(&voucher); + } + } + Self::deposit_event(RawEvent::AutoUnbid(popped)); + } + + >::put(bids); + } + + /// Check a user is a bid. + fn is_bid(bids: &Vec>>, who: &T::AccountId) -> bool { + // Bids are ordered by `value`, so we cannot binary search for a user. + bids.iter().find(|bid| bid.who == *who).is_some() + } + + /// Check a user is a candidate. + fn is_candidate(candidates: &Vec>>, who: &T::AccountId) -> bool { + // Looking up a candidate is the same as looking up a bid + Self::is_bid(candidates, who) + } + + /// Check a user is a member. + fn is_member(members: &Vec, who: &T::AccountId) -> bool { + members.binary_search(who).is_ok() + } + + /// Add a member to the sorted members list. If the user is already a member, do nothing. + /// Can fail when `MaxMember` limit is reached, but has no side-effects. + fn add_member(who: &T::AccountId) -> DispatchResult { + let mut members = >::get(); + ensure!(members.len() < MaxMembers::::get() as usize, Error::::MaxMembers); + match members.binary_search(who) { + // Add the new member + Err(i) => { + members.insert(i, who.clone()); + T::MembershipChanged::change_members_sorted(&[who.clone()], &[], &members); + >::put(members); + Ok(()) + }, + // User is already a member, do nothing. + Ok(_) => Ok(()), + } + } + + /// Remove a member from the members list, except the Head. + /// + /// NOTE: This does not correctly clean up a member from storage. It simply + /// removes them from the Members storage item. + pub fn remove_member(m: &T::AccountId) -> DispatchResult { + ensure!(Self::head() != Some(m.clone()), Error::::Head); + + >::mutate(|members| + match members.binary_search(&m) { + Err(_) => Err(Error::::NotMember)?, + Ok(i) => { + members.remove(i); + T::MembershipChanged::change_members_sorted(&[], &[m.clone()], members); + Ok(()) + } + } + ) + } + + /// End the current period and begin a new one. + fn rotate_period(members: &mut Vec) { + let phrase = b"society_rotation"; + + let mut pot = >::get(); + + // we'll need a random seed here. + let seed = T::Randomness::random(phrase); + // seed needs to be guaranteed to be 32 bytes. + let seed = <[u8; 32]>::decode(&mut TrailingZeroInput::new(seed.as_ref())) + .expect("input is padded with zeroes; qed"); + let mut rng = ChaChaRng::from_seed(seed); + + // we assume there's at least one member or this logic won't work. + if !members.is_empty() { + let candidates = >::take(); + // NOTE: This may cause member length to surpass `MaxMembers`, but results in no consensus + // critical issues or side-effects. This is auto-correcting as members fall out of society. + members.reserve(candidates.len()); + + let maturity = >::block_number() + + Self::lock_duration(members.len() as u32); + + let mut rewardees = Vec::new(); + let mut total_approvals = 0; + let mut total_slash = >::zero(); + let mut total_payouts = >::zero(); + + let accepted = candidates.into_iter().filter_map(|Bid {value, who: candidate, kind }| { + let mut approval_count = 0; + + // Creates a vector of (vote, member) for the given candidate + // and tallies total number of approve votes for that candidate. + let votes = members.iter() + .filter_map(|m| >::take(&candidate, m).map(|v| (v, m))) + .inspect(|&(v, _)| if v == Vote::Approve { approval_count += 1 }) + .collect::>(); + + // Select one of the votes at random. + // Note that `Vote::Skeptical` and `Vote::Reject` both reject the candidate. + let is_accepted = pick_item(&mut rng, &votes).map(|x| x.0) == Some(Vote::Approve); + + let matching_vote = if is_accepted { Vote::Approve } else { Vote::Reject }; + + let bad_vote = |m: &T::AccountId| { + // Voter voted wrong way (or was just a lazy skeptic) then reduce their payout + // and increase their strikes. after MaxStrikes then they go into suspension. + let amount = Self::slash_payout(m, T::WrongSideDeduction::get()); + + let strikes = >::mutate(m, |s| { + *s += 1; + *s + }); + if strikes >= T::MaxStrikes::get() { + Self::suspend_member(m); + } + amount + }; + + // Collect the voters who had a matching vote. + rewardees.extend(votes.into_iter() + .filter_map(|(v, m)| + if v == matching_vote { Some(m) } else { + total_slash += bad_vote(m); + None + } + ).cloned() + ); + + if is_accepted { + total_approvals += approval_count; + total_payouts += value; + members.push(candidate.clone()); + + Self::pay_accepted_candidate(&candidate, value, kind, maturity); + + // We track here the total_approvals so that every candidate has a unique range + // of numbers from 0 to `total_approvals` with length `approval_count` so each + // candidate is proportionally represented when selecting a "primary" below. + Some((candidate, total_approvals)) + } else { + // Suspend Candidate + >::insert(&candidate, (value, kind)); + Self::deposit_event(RawEvent::CandidateSuspended(candidate)); + None + } + }).collect::>(); + + // Reward one of the voters who voted the right way. + if !total_slash.is_zero() { + if let Some(winner) = pick_item(&mut rng, &rewardees) { + // If we can't reward them, not much that can be done. + Self::bump_payout(winner, maturity, total_slash); + } else { + // Move the slashed amount back from payouts account to local treasury. + let _ = T::Currency::transfer(&Self::payouts(), &Self::account_id(), total_slash, AllowDeath); + } + } + + // Fund the total payouts from the local treasury. + if !total_payouts.is_zero() { + // remove payout from pot and shift needed funds to the payout account. + pot = pot.saturating_sub(total_payouts); + + // this should never fail since we ensure we can afford the payouts in a previous + // block, but there's not much we can do to recover if it fails anyway. + let _ = T::Currency::transfer(&Self::account_id(), &Self::payouts(), total_payouts, AllowDeath); + } + + // if at least one candidate was accepted... + if !accepted.is_empty() { + // select one as primary, randomly chosen from the accepted, weighted by approvals. + // Choose a random number between 0 and `total_approvals` + let primary_point = pick_usize(&mut rng, total_approvals - 1); + // Find the user who falls on that point + let primary = accepted.iter().find(|e| e.1 > primary_point) + .expect("e.1 of final item == total_approvals; \ + worst case find will always return that item; qed") + .0.clone(); + + let accounts = accepted.into_iter().map(|x| x.0).collect::>(); + + // Then write everything back out, signal the changed membership and leave an event. + members.sort(); + // NOTE: This may cause member length to surpass `MaxMembers`, but results in no consensus + // critical issues or side-effects. This is auto-correcting as members fall out of society. + >::put(&members[..]); + >::put(&primary); + + T::MembershipChanged::change_members_sorted(&accounts, &[], &members); + Self::deposit_event(RawEvent::Inducted(primary, accounts)); + } + + // Bump the pot by at most PeriodSpend, but less if there's not very much left in our + // account. + let unaccounted = T::Currency::free_balance(&Self::account_id()).saturating_sub(pot); + pot += T::PeriodSpend::get().min(unaccounted / 2u8.into()); + + >::put(&pot); + } + + // Setup the candidates for the new intake + let candidates = Self::take_selected(members.len(), pot); + >::put(&candidates); + + // Select sqrt(n) random members from the society and make them skeptics. + let pick_member = |_| pick_item(&mut rng, &members[..]).expect("exited if members empty; qed"); + for skeptic in (0..members.len().integer_sqrt()).map(pick_member) { + for Bid{ who: c, .. } in candidates.iter() { + >::insert(c, skeptic, Vote::Skeptic); + } + } + } + + /// Attempt to slash the payout of some member. Return the total amount that was deducted. + fn slash_payout(who: &T::AccountId, value: BalanceOf) -> BalanceOf { + let mut rest = value; + let mut payouts = >::get(who); + if !payouts.is_empty() { + let mut dropped = 0; + for (_, amount) in payouts.iter_mut() { + if let Some(new_rest) = rest.checked_sub(&amount) { + // not yet totally slashed after this one; drop it completely. + rest = new_rest; + dropped += 1; + } else { + // whole slash is accounted for. + *amount -= rest; + rest = Zero::zero(); + break; + } + } + >::insert(who, &payouts[dropped..]); + } + value - rest + } + + /// Bump the payout amount of `who`, to be unlocked at the given block number. + fn bump_payout(who: &T::AccountId, when: T::BlockNumber, value: BalanceOf) { + if !value.is_zero(){ + >::mutate(who, |payouts| match payouts.binary_search_by_key(&when, |x| x.0) { + Ok(index) => payouts[index].1 += value, + Err(index) => payouts.insert(index, (when, value)), + }); + } + } + + /// Suspend a user, removing them from the member list. + fn suspend_member(who: &T::AccountId) { + if Self::remove_member(&who).is_ok() { + >::insert(who, ()); + >::remove(who); + Self::deposit_event(RawEvent::MemberSuspended(who.clone())); + } + } + + /// Pay an accepted candidate their bid value. + fn pay_accepted_candidate( + candidate: &T::AccountId, + value: BalanceOf, + kind: BidKind>, + maturity: T::BlockNumber, + ) { + let value = match kind { + BidKind::Deposit(deposit) => { + // In the case that a normal deposit bid is accepted we unreserve + // the deposit. + let _ = T::Currency::unreserve(candidate, deposit); + value + } + BidKind::Vouch(voucher, tip) => { + // Check that the voucher is still vouching, else some other logic may have removed their status. + if >::take(&voucher) == Some(VouchingStatus::Vouching) { + // In the case that a vouched-for bid is accepted we unset the + // vouching status and transfer the tip over to the voucher. + Self::bump_payout(&voucher, maturity, tip.min(value)); + value.saturating_sub(tip) + } else { + value + } + } + }; + + Self::bump_payout(candidate, maturity, value); + } + + /// End the current challenge period and start a new one. + fn rotate_challenge(members: &mut Vec) { + // Assume there are members, else don't run this logic. + if !members.is_empty() { + // End current defender rotation + if let Some(defender) = Self::defender() { + let mut approval_count = 0; + let mut rejection_count = 0; + // Tallies total number of approve and reject votes for the defender. + members.iter() + .filter_map(|m| >::get(m)) + .for_each(|v| { + match v { + Vote::Approve => approval_count += 1, + _ => rejection_count += 1, + } + }); + + if approval_count <= rejection_count { + // User has failed the challenge + Self::suspend_member(&defender); + *members = Self::members(); + } + } + + // Start a new defender rotation + let phrase = b"society_challenge"; + // we'll need a random seed here. + let seed = T::Randomness::random(phrase); + // seed needs to be guaranteed to be 32 bytes. + let seed = <[u8; 32]>::decode(&mut TrailingZeroInput::new(seed.as_ref())) + .expect("input is padded with zeroes; qed"); + let mut rng = ChaChaRng::from_seed(seed); + let chosen = pick_item(&mut rng, &members).expect("exited if members empty; qed"); + + >::put(&chosen); + Self::deposit_event(RawEvent::Challenged(chosen.clone())); + } + } + + /// The account ID of the treasury pot. + /// + /// This actually does computation. If you need to keep using it, then make sure you cache the + /// value and only call this once. + pub fn account_id() -> T::AccountId { + MODULE_ID.into_account() + } + + /// The account ID of the payouts pot. This is where payouts are made from. + /// + /// This actually does computation. If you need to keep using it, then make sure you cache the + /// value and only call this once. + pub fn payouts() -> T::AccountId { + MODULE_ID.into_sub_account(b"payouts") + } + + /// Return the duration of the lock, in blocks, with the given number of members. + /// + /// This is a rather opaque calculation based on the formula here: + /// https://www.desmos.com/calculator/9itkal1tce + fn lock_duration(x: u32) -> T::BlockNumber { + let lock_pc = 100 - 50_000 / (x + 500); + Percent::from_percent(lock_pc as u8) * T::MaxLockDuration::get() + } + + /// Get a selection of bidding accounts such that the total bids is no greater than `Pot` and + /// the number of bids would not surpass `MaxMembers` if all were accepted. + /// + /// May be empty. + pub fn take_selected(members_len: usize, pot: BalanceOf) -> Vec>> + { + let max_members = MaxMembers::::get() as usize; + // No more than 10 will be returned. + let max_selections: usize = 10.min(max_members.saturating_sub(members_len)); + + // Get the number of left-most bidders whose bids add up to less than `pot`. + let mut bids = >::get(); + let taken = bids.iter() + .scan(>::zero(), |total, bid| { + *total = total.saturating_add(bid.value); + Some((*total, bid.who.clone(), bid.kind.clone())) + }) + .take(max_selections) + .take_while(|x| pot >= x.0) + .count(); + + // No need to reset Bids if we're not taking anything. + if taken > 0 { + >::put(&bids[taken..]); + } + bids.truncate(taken); + bids + } +} diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs new file mode 100644 index 0000000000..24eac4c5af --- /dev/null +++ b/frame/society/src/mock.rs @@ -0,0 +1,204 @@ +// Copyright 2020 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 + +use super::*; + +use frame_support::{impl_outer_origin, parameter_types}; +use sp_core::H256; +// The testing primitives are very useful for avoiding having to work with signatures +// or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. +use sp_runtime::{ + Perbill, traits::{BlakeTwo256, IdentityLookup, OnInitialize, OnFinalize}, testing::Header, +}; +use frame_system::EnsureSignedBy; + +impl_outer_origin! { + pub enum Origin for Test {} +} + +// For testing the module, we construct most of a mock runtime. This means +// first constructing a configuration type (`Test`) which `impl`s each of the +// configuration traits of modules we want to use. +#[derive(Clone, Eq, PartialEq)] +pub struct Test; +parameter_types! { + pub const CandidateDeposit: u64 = 25; + pub const WrongSideDeduction: u64 = 2; + pub const MaxStrikes: u32 = 2; + pub const RotationPeriod: u64 = 4; + pub const PeriodSpend: u64 = 1000; + pub const MaxLockDuration: u64 = 100; + pub const FounderSetAccount: u64 = 1; + pub const SuspensionJudgementSetAccount: u64 = 2; + pub const ChallengePeriod: u64 = 8; + pub const MaxMembers: u32 = 100; + + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); + + pub const ExistentialDeposit: u64 = 0; + pub const TransferFee: u64 = 0; + pub const CreationFee: u64 = 0; +} + +impl frame_system::Trait for Test { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Call = (); + type Hashing = BlakeTwo256; + type AccountId = u128; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type ModuleToIndex = (); +} + +impl pallet_balances::Trait for Test { + type Balance = u64; + type OnFreeBalanceZero = (); + type OnNewAccount = (); + type Event = (); + type TransferPayment = (); + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type TransferFee = TransferFee; + type CreationFee = CreationFee; +} + +impl Trait for Test { + type Event = (); + type Currency = pallet_balances::Module; + type Randomness = (); + type CandidateDeposit = CandidateDeposit; + type WrongSideDeduction = WrongSideDeduction; + type MaxStrikes = MaxStrikes; + type PeriodSpend = PeriodSpend; + type MembershipChanged = (); + type RotationPeriod = RotationPeriod; + type MaxLockDuration = MaxLockDuration; + type FounderOrigin = EnsureSignedBy; + type SuspensionJudgementOrigin = EnsureSignedBy; + type ChallengePeriod = ChallengePeriod; +} + +pub type Society = Module; +pub type System = frame_system::Module; +pub type Balances = pallet_balances::Module; + +pub struct EnvBuilder { + members: Vec, + balance: u64, + balances: Vec<(u128, u64)>, + pot: u64, + max_members: u32, +} + +impl EnvBuilder { + pub fn new() -> Self { + Self { + members: vec![10], + balance: 10_000, + balances: vec![ + (10, 50), + (20, 50), + (30, 50), + (40, 50), + (50, 50), + (60, 50), + ], + pot: 0, + max_members: 100, + } + } + + pub fn execute R>(mut self, f: F) -> R { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + self.balances.push((Society::account_id(), self.balance.max(self.pot))); + pallet_balances::GenesisConfig:: { + balances: self.balances, + vesting: vec![], + }.assimilate_storage(&mut t).unwrap(); + GenesisConfig::{ + members: self.members, + pot: self.pot, + max_members: self.max_members, + }.assimilate_storage(&mut t).unwrap(); + let mut ext: sp_io::TestExternalities = t.into(); + ext.execute_with(f) + } + #[allow(dead_code)] + pub fn with_members(mut self, m: Vec) -> Self { + self.members = m; + self + } + #[allow(dead_code)] + pub fn with_balances(mut self, b: Vec<(u128, u64)>) -> Self { + self.balances = b; + self + } + #[allow(dead_code)] + pub fn with_pot(mut self, p: u64) -> Self { + self.pot = p; + self + } + #[allow(dead_code)] + pub fn with_balance(mut self, b: u64) -> Self { + self.balance = b; + self + } + #[allow(dead_code)] + pub fn with_max_members(mut self, n: u32) -> Self { + self.max_members = n; + self + } +} + +/// Run until a particular block. +pub fn run_to_block(n: u64) { + while System::block_number() < n { + if System::block_number() > 1 { + System::on_finalize(System::block_number()); + } + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Society::on_initialize(System::block_number()); + } +} + +/// Creates a bid struct using input parameters. +pub fn create_bid( + value: Balance, + who: AccountId, + kind: BidKind +) -> Bid +{ + Bid { + who, + kind, + value + } +} diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs new file mode 100644 index 0000000000..61bb1fd232 --- /dev/null +++ b/frame/society/src/tests.rs @@ -0,0 +1,744 @@ +// Copyright 2020 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. + +use super::*; +use mock::*; + +use frame_support::{assert_ok, assert_noop}; +use sp_runtime::traits::BadOrigin; + +#[test] +fn founding_works() { + EnvBuilder::new().with_members(vec![]).execute(|| { + // Account 1 is set as the founder origin + // Account 5 cannot start a society + assert_noop!(Society::found(Origin::signed(5), 20), BadOrigin); + // Account 1 can start a society, where 10 is the founding member + assert_ok!(Society::found(Origin::signed(1), 10)); + // Society members only include 10 + assert_eq!(Society::members(), vec![10]); + // 10 is the head of the society + assert_eq!(Society::head(), Some(10)); + // Cannot start another society + assert_noop!(Society::found(Origin::signed(1), 20), Error::::AlreadyFounded); + }); +} + +#[test] +fn basic_new_member_works() { + EnvBuilder::new().execute(|| { + assert_eq!(Balances::free_balance(20), 50); + // Bid causes Candidate Deposit to be reserved. + assert_ok!(Society::bid(Origin::signed(20), 0)); + assert_eq!(Balances::free_balance(20), 25); + assert_eq!(Balances::reserved_balance(20), 25); + // Rotate period every 4 blocks + run_to_block(4); + // 20 is now a candidate + assert_eq!(Society::candidates(), vec![create_bid(0, 20, BidKind::Deposit(25))]); + // 10 (a member) can vote for the candidate + assert_ok!(Society::vote(Origin::signed(10), 20, true)); + // Rotate period every 4 blocks + run_to_block(8); + // 20 is now a member of the society + assert_eq!(Society::members(), vec![10, 20]); + // Reserved balance is returned + assert_eq!(Balances::free_balance(20), 50); + assert_eq!(Balances::reserved_balance(20), 0); + }); +} + +#[test] +fn bidding_works() { + EnvBuilder::new().execute(|| { + // Users make bids of various amounts + assert_ok!(Society::bid(Origin::signed(60), 1900)); + assert_ok!(Society::bid(Origin::signed(50), 500)); + assert_ok!(Society::bid(Origin::signed(40), 400)); + assert_ok!(Society::bid(Origin::signed(30), 300)); + // Rotate period + run_to_block(4); + // Pot is 1000 after "PeriodSpend" + assert_eq!(Society::pot(), 1000); + assert_eq!(Balances::free_balance(Society::account_id()), 10_000); + // Choose smallest bidding users whose total is less than pot + assert_eq!(Society::candidates(), vec![ + create_bid(300, 30, BidKind::Deposit(25)), + create_bid(400, 40, BidKind::Deposit(25)), + ]); + // A member votes for these candidates to join the society + assert_ok!(Society::vote(Origin::signed(10), 30, true)); + assert_ok!(Society::vote(Origin::signed(10), 40, true)); + run_to_block(8); + // Candidates become members after a period rotation + assert_eq!(Society::members(), vec![10, 30, 40]); + // Pot is increased by 1000, but pays out 700 to the members + assert_eq!(Balances::free_balance(Society::account_id()), 9_300); + assert_eq!(Society::pot(), 1_300); + // Left over from the original bids is 50 who satisfies the condition of bid less than pot. + assert_eq!(Society::candidates(), vec![ create_bid(500, 50, BidKind::Deposit(25)) ]); + // 40, now a member, can vote for 50 + assert_ok!(Society::vote(Origin::signed(40), 50, true)); + run_to_block(12); + // 50 is now a member + assert_eq!(Society::members(), vec![10, 30, 40, 50]); + // Pot is increased by 1000, and 500 is paid out. Total payout so far is 1200. + assert_eq!(Society::pot(), 1_800); + assert_eq!(Balances::free_balance(Society::account_id()), 8_800); + // No more candidates satisfy the requirements + assert_eq!(Society::candidates(), vec![]); + assert_ok!(Society::defender_vote(Origin::signed(10), true)); // Keep defender around + // Next period + run_to_block(16); + // Same members + assert_eq!(Society::members(), vec![10, 30, 40, 50]); + // Pot is increased by 1000 again + assert_eq!(Society::pot(), 2_800); + // No payouts + assert_eq!(Balances::free_balance(Society::account_id()), 8_800); + // Candidate 60 now qualifies based on the increased pot size. + assert_eq!(Society::candidates(), vec![ create_bid(1900, 60, BidKind::Deposit(25)) ]); + // Candidate 60 is voted in. + assert_ok!(Society::vote(Origin::signed(50), 60, true)); + run_to_block(20); + // 60 joins as a member + assert_eq!(Society::members(), vec![10, 30, 40, 50, 60]); + // Pay them + assert_eq!(Society::pot(), 1_900); + assert_eq!(Balances::free_balance(Society::account_id()), 6_900); + }); +} + +#[test] +fn unbidding_works() { + EnvBuilder::new().execute(|| { + // 20 and 30 make bids + assert_ok!(Society::bid(Origin::signed(20), 1000)); + assert_ok!(Society::bid(Origin::signed(30), 0)); + // Balances are reserved + assert_eq!(Balances::free_balance(30), 25); + assert_eq!(Balances::reserved_balance(30), 25); + // Must know right position to unbid + cannot unbid someone else + assert_noop!(Society::unbid(Origin::signed(30), 1), Error::::BadPosition); + // Can unbid themselves with the right position + assert_ok!(Society::unbid(Origin::signed(30), 0)); + // Balance is returned + assert_eq!(Balances::free_balance(30), 50); + assert_eq!(Balances::reserved_balance(30), 0); + // 20 wins candidacy + run_to_block(4); + assert_eq!(Society::candidates(), vec![ create_bid(1000, 20, BidKind::Deposit(25)) ]); + }); +} + +#[test] +fn payout_works() { + EnvBuilder::new().execute(|| { + // Original balance of 50 + assert_eq!(Balances::free_balance(20), 50); + assert_ok!(Society::bid(Origin::signed(20), 1000)); + run_to_block(4); + assert_ok!(Society::vote(Origin::signed(10), 20, true)); + run_to_block(8); + // payout not ready + assert_noop!(Society::payout(Origin::signed(20)), Error::::NoPayout); + run_to_block(9); + // payout should be here + assert_ok!(Society::payout(Origin::signed(20))); + assert_eq!(Balances::free_balance(20), 1050); + }); +} + +#[test] +fn basic_new_member_skeptic_works() { + EnvBuilder::new().execute(|| { + assert_eq!(Strikes::::get(10), 0); + assert_ok!(Society::bid(Origin::signed(20), 0)); + run_to_block(4); + assert_eq!(Society::candidates(), vec![create_bid(0, 20, BidKind::Deposit(25))]); + run_to_block(8); + assert_eq!(Society::members(), vec![10]); + assert_eq!(Strikes::::get(10), 1); + }); +} + +#[test] +fn basic_new_member_reject_works() { + EnvBuilder::new().execute(|| { + // Starting Balance + assert_eq!(Balances::free_balance(20), 50); + // 20 makes a bid + assert_ok!(Society::bid(Origin::signed(20), 0)); + assert_eq!(Balances::free_balance(20), 25); + assert_eq!(Balances::reserved_balance(20), 25); + // Rotation Period + run_to_block(4); + assert_eq!(Society::candidates(), vec![create_bid(0, 20, BidKind::Deposit(25))]); + // We say no + assert_ok!(Society::vote(Origin::signed(10), 20, false)); + run_to_block(8); + // User is not added as member + assert_eq!(Society::members(), vec![10]); + // User is suspended + assert_eq!(Society::candidates(), vec![]); + assert_eq!(Society::suspended_candidate(20).is_some(), true); + }); +} + +#[test] +fn slash_payout_works() { + EnvBuilder::new().execute(|| { + assert_eq!(Balances::free_balance(20), 50); + assert_ok!(Society::bid(Origin::signed(20), 1000)); + run_to_block(4); + assert_ok!(Society::vote(Origin::signed(10), 20, true)); + run_to_block(8); + // payout in queue + assert_eq!(Payouts::::get(20), vec![(9, 1000)]); + assert_noop!(Society::payout(Origin::signed(20)), Error::::NoPayout); + // slash payout + assert_eq!(Society::slash_payout(&20, 500), 500); + assert_eq!(Payouts::::get(20), vec![(9, 500)]); + run_to_block(9); + // payout should be here, but 500 less + assert_ok!(Society::payout(Origin::signed(20))); + assert_eq!(Balances::free_balance(20), 550); + }); +} + +#[test] +fn slash_payout_multi_works() { + EnvBuilder::new().execute(|| { + assert_eq!(Balances::free_balance(20), 50); + // create a few payouts + Society::bump_payout(&20, 5, 100); + Society::bump_payout(&20, 10, 100); + Society::bump_payout(&20, 15, 100); + Society::bump_payout(&20, 20, 100); + // payouts in queue + assert_eq!(Payouts::::get(20), vec![(5, 100), (10, 100), (15, 100), (20, 100)]); + // slash payout + assert_eq!(Society::slash_payout(&20, 250), 250); + assert_eq!(Payouts::::get(20), vec![(15, 50), (20, 100)]); + // slash again + assert_eq!(Society::slash_payout(&20, 50), 50); + assert_eq!(Payouts::::get(20), vec![(20, 100)]); + }); +} + +#[test] +fn suspended_member_lifecycle_works() { + EnvBuilder::new().execute(|| { + // Add 20 to members, who is not the head and can be suspended/removed. + assert_ok!(Society::add_member(&20)); + assert_eq!(>::get(), vec![10, 20]); + assert_eq!(Strikes::::get(20), 0); + assert_eq!(>::get(20), None); + + // Let's suspend account 20 by giving them 2 strikes by not voting + assert_ok!(Society::bid(Origin::signed(30), 0)); + run_to_block(8); + assert_eq!(Strikes::::get(20), 1); + assert_ok!(Society::bid(Origin::signed(40), 0)); + run_to_block(16); + + // Strike 2 is accumulated, and 20 is suspended :( + assert_eq!(>::get(20), Some(())); + assert_eq!(>::get(), vec![10]); + + // Suspended members cannot get payout + Society::bump_payout(&20, 10, 100); + assert_noop!(Society::payout(Origin::signed(20)), Error::::NotMember); + + // Normal people cannot make judgement + assert_noop!(Society::judge_suspended_member(Origin::signed(20), 20, true), BadOrigin); + + // Suspension judgment origin can judge thee + // Suspension judgement origin forgives the suspended member + assert_ok!(Society::judge_suspended_member(Origin::signed(2), 20, true)); + assert_eq!(>::get(20), None); + assert_eq!(>::get(), vec![10, 20]); + + // Let's suspend them again, directly + Society::suspend_member(&20); + assert_eq!(>::get(20), Some(())); + // Suspension judgement origin does not forgive the suspended member + assert_ok!(Society::judge_suspended_member(Origin::signed(2), 20, false)); + // Cleaned up + assert_eq!(>::get(20), None); + assert_eq!(>::get(), vec![10]); + assert_eq!(>::get(20), vec![]); + }); +} + +#[test] +fn suspended_candidate_rejected_works() { + EnvBuilder::new().execute(|| { + // Starting Balance + assert_eq!(Balances::free_balance(20), 50); + assert_eq!(Balances::free_balance(Society::account_id()), 10000); + // 20 makes a bid + assert_ok!(Society::bid(Origin::signed(20), 0)); + assert_eq!(Balances::free_balance(20), 25); + assert_eq!(Balances::reserved_balance(20), 25); + // Rotation Period + run_to_block(4); + assert_eq!(Society::candidates(), vec![create_bid(0, 20, BidKind::Deposit(25))]); + // We say no + assert_ok!(Society::vote(Origin::signed(10), 20, false)); + run_to_block(8); + // User is not added as member + assert_eq!(Society::members(), vec![10]); + // User is suspended + assert_eq!(Society::candidates(), vec![]); + assert_eq!(Society::suspended_candidate(20).is_some(), true); + + // Normal user cannot make judgement on suspended candidate + assert_noop!(Society::judge_suspended_candidate(Origin::signed(20), 20, Judgement::Approve), BadOrigin); + + // Suspension judgement origin makes no direct judgement + assert_ok!(Society::judge_suspended_candidate(Origin::signed(2), 20, Judgement::Rebid)); + // They are placed back in bid pool, repeat suspension process + // Rotation Period + run_to_block(12); + assert_eq!(Society::candidates(), vec![create_bid(0, 20, BidKind::Deposit(25))]); + // We say no + assert_ok!(Society::vote(Origin::signed(10), 20, false)); + run_to_block(16); + // User is not added as member + assert_eq!(Society::members(), vec![10]); + // User is suspended + assert_eq!(Society::candidates(), vec![]); + assert_eq!(Society::suspended_candidate(20).is_some(), true); + + // Suspension judgement origin rejects the candidate + assert_ok!(Society::judge_suspended_candidate(Origin::signed(2), 20, Judgement::Reject)); + // User is slashed + assert_eq!(Balances::free_balance(20), 25); + assert_eq!(Balances::reserved_balance(20), 0); + // Funds are deposited to society account + assert_eq!(Balances::free_balance(Society::account_id()), 10025); + // Cleaned up + assert_eq!(Society::candidates(), vec![]); + assert_eq!(>::get(20), None); + }); +} + +#[test] +fn vouch_works() { + EnvBuilder::new().execute(|| { + // 10 is the only member + assert_eq!(Society::members(), vec![10]); + // A non-member cannot vouch + assert_noop!(Society::vouch(Origin::signed(1), 20, 1000, 100), Error::::NotMember); + // A member can though + assert_ok!(Society::vouch(Origin::signed(10), 20, 1000, 100)); + assert_eq!(>::get(10), Some(VouchingStatus::Vouching)); + // A member cannot vouch twice at the same time + assert_noop!(Society::vouch(Origin::signed(10), 30, 100, 0), Error::::AlreadyVouching); + // Vouching creates the right kind of bid + assert_eq!(>::get(), vec![create_bid(1000, 20, BidKind::Vouch(10, 100))]); + // Vouched user can become candidate + run_to_block(4); + assert_eq!(Society::candidates(), vec![create_bid(1000, 20, BidKind::Vouch(10, 100))]); + // Vote yes + assert_ok!(Society::vote(Origin::signed(10), 20, true)); + // Vouched user can win + run_to_block(8); + assert_eq!(Society::members(), vec![10, 20]); + // Voucher wins a portion of the payment + assert_eq!(>::get(10), vec![(9, 100)]); + // Vouched user wins the rest + assert_eq!(>::get(20), vec![(9, 900)]); + // 10 is no longer vouching + assert_eq!(>::get(10), None); + }); +} + +#[test] +fn voucher_cannot_win_more_than_bid() { + EnvBuilder::new().execute(|| { + // 10 is the only member + assert_eq!(Society::members(), vec![10]); + // 10 vouches, but asks for more than the bid + assert_ok!(Society::vouch(Origin::signed(10), 20, 100, 1000)); + // Vouching creates the right kind of bid + assert_eq!(>::get(), vec![create_bid(100, 20, BidKind::Vouch(10, 1000))]); + // Vouched user can become candidate + run_to_block(4); + assert_eq!(Society::candidates(), vec![create_bid(100, 20, BidKind::Vouch(10, 1000))]); + // Vote yes + assert_ok!(Society::vote(Origin::signed(10), 20, true)); + // Vouched user can win + run_to_block(8); + assert_eq!(Society::members(), vec![10, 20]); + // Voucher wins as much as the bid + assert_eq!(>::get(10), vec![(9, 100)]); + // Vouched user gets nothing + assert_eq!(>::get(20), vec![]); + }); +} + +#[test] +fn unvouch_works() { + EnvBuilder::new().execute(|| { + // 10 is the only member + assert_eq!(Society::members(), vec![10]); + // 10 vouches for 20 + assert_ok!(Society::vouch(Origin::signed(10), 20, 100, 0)); + // 20 has a bid + assert_eq!(>::get(), vec![create_bid(100, 20, BidKind::Vouch(10, 0))]); + // 10 is vouched + assert_eq!(>::get(10), Some(VouchingStatus::Vouching)); + // To unvouch, you must know the right bid position + assert_noop!(Society::unvouch(Origin::signed(10), 2), Error::::BadPosition); + // 10 can unvouch with the right position + assert_ok!(Society::unvouch(Origin::signed(10), 0)); + // 20 no longer has a bid + assert_eq!(>::get(), vec![]); + // 10 is no longer vouching + assert_eq!(>::get(10), None); + + // Cannot unvouch after they become candidate + assert_ok!(Society::vouch(Origin::signed(10), 20, 100, 0)); + run_to_block(4); + assert_eq!(Society::candidates(), vec![create_bid(100, 20, BidKind::Vouch(10, 0))]); + assert_noop!(Society::unvouch(Origin::signed(10), 0), Error::::BadPosition); + // 10 is still vouching until candidate is approved or rejected + assert_eq!(>::get(10), Some(VouchingStatus::Vouching)); + run_to_block(8); + // In this case candidate is denied and suspended + assert!(Society::suspended_candidate(&20).is_some()); + assert_eq!(Society::members(), vec![10]); + // User is stuck vouching until judgement origin resolves suspended candidate + assert_eq!(>::get(10), Some(VouchingStatus::Vouching)); + // Judge denies candidate + assert_ok!(Society::judge_suspended_candidate(Origin::signed(2), 20, Judgement::Reject)); + // 10 is banned from vouching + assert_eq!(>::get(10), Some(VouchingStatus::Banned)); + assert_eq!(Society::members(), vec![10]); + + // 10 cannot vouch again + assert_noop!(Society::vouch(Origin::signed(10), 30, 100, 0), Error::::AlreadyVouching); + // 10 cannot unvouch either, so they are banned forever. + assert_noop!(Society::unvouch(Origin::signed(10), 0), Error::::NotVouching); + }); +} + +#[test] +fn unbid_vouch_works() { + EnvBuilder::new().execute(|| { + // 10 is the only member + assert_eq!(Society::members(), vec![10]); + // 10 vouches for 20 + assert_ok!(Society::vouch(Origin::signed(10), 20, 100, 0)); + // 20 has a bid + assert_eq!(>::get(), vec![create_bid(100, 20, BidKind::Vouch(10, 0))]); + // 10 is vouched + assert_eq!(>::get(10), Some(VouchingStatus::Vouching)); + // 20 doesn't want to be a member and can unbid themselves. + assert_ok!(Society::unbid(Origin::signed(20), 0)); + // Everything is cleaned up + assert_eq!(>::get(10), None); + assert_eq!(>::get(), vec![]); + }); +} + +#[test] +fn head_cannot_be_removed() { + EnvBuilder::new().execute(|| { + // 10 is the only member and head + assert_eq!(Society::members(), vec![10]); + assert_eq!(Society::head(), Some(10)); + // 10 can still accumulate strikes + assert_ok!(Society::bid(Origin::signed(20), 0)); + run_to_block(8); + assert_eq!(Strikes::::get(10), 1); + assert_ok!(Society::bid(Origin::signed(30), 0)); + run_to_block(16); + assert_eq!(Strikes::::get(10), 2); + // Awkwardly they can obtain more than MAX_STRIKES... + assert_ok!(Society::bid(Origin::signed(40), 0)); + run_to_block(24); + assert_eq!(Strikes::::get(10), 3); + + // Replace the head + assert_ok!(Society::bid(Origin::signed(50), 0)); + run_to_block(28); + assert_ok!(Society::vote(Origin::signed(10), 50, true)); + assert_ok!(Society::defender_vote(Origin::signed(10), true)); // Keep defender around + run_to_block(32); + assert_eq!(Society::members(), vec![10, 50]); + assert_eq!(Society::head(), Some(50)); + + // 10 can now be suspended for strikes + assert_ok!(Society::bid(Origin::signed(60), 0)); + run_to_block(36); + // The candidate is rejected, so voting approve will give a strike + assert_ok!(Society::vote(Origin::signed(10), 60, true)); + run_to_block(40); + assert_eq!(Strikes::::get(10), 0); + assert_eq!(>::get(10), Some(())); + assert_eq!(Society::members(), vec![50]); + }); +} + +#[test] +fn challenges_work() { + EnvBuilder::new().execute(|| { + // Add some members + assert_ok!(Society::add_member(&20)); + assert_ok!(Society::add_member(&30)); + assert_ok!(Society::add_member(&40)); + // Check starting point + assert_eq!(Society::members(), vec![10, 20, 30, 40]); + assert_eq!(Society::defender(), None); + // 20 will be challenged during the challenge rotation + run_to_block(8); + assert_eq!(Society::defender(), Some(20)); + // They can always free vote for themselves + assert_ok!(Society::defender_vote(Origin::signed(20), true)); + // If no one else votes, nothing happens + run_to_block(16); + assert_eq!(Society::members(), vec![10, 20, 30, 40]); + // New challenge period + assert_eq!(Society::defender(), Some(20)); + // Non-member cannot challenge + assert_noop!(Society::defender_vote(Origin::signed(1), true), Error::::NotMember); + // 3 people say accept, 1 reject + assert_ok!(Society::defender_vote(Origin::signed(10), true)); + assert_ok!(Society::defender_vote(Origin::signed(20), true)); + assert_ok!(Society::defender_vote(Origin::signed(30), true)); + assert_ok!(Society::defender_vote(Origin::signed(40), false)); + run_to_block(24); + // 20 survives + assert_eq!(Society::members(), vec![10, 20, 30, 40]); + // One more time + assert_eq!(Society::defender(), Some(20)); + // 2 people say accept, 2 reject + assert_ok!(Society::defender_vote(Origin::signed(10), true)); + assert_ok!(Society::defender_vote(Origin::signed(20), true)); + assert_ok!(Society::defender_vote(Origin::signed(30), false)); + assert_ok!(Society::defender_vote(Origin::signed(40), false)); + run_to_block(32); + // 20 is suspended + assert_eq!(Society::members(), vec![10, 30, 40]); + assert_eq!(Society::suspended_member(20), Some(())); + // New defender is chosen + assert_eq!(Society::defender(), Some(40)); + }); +} + +#[test] +fn bad_vote_slash_works() { + EnvBuilder::new().execute(|| { + // Add some members + assert_ok!(Society::add_member(&20)); + assert_ok!(Society::add_member(&30)); + assert_ok!(Society::add_member(&40)); + // Create some payouts + Society::bump_payout(&10, 5, 100); + Society::bump_payout(&20, 5, 100); + Society::bump_payout(&30, 5, 100); + Society::bump_payout(&40, 5, 100); + // Check starting point + assert_eq!(Society::members(), vec![10, 20, 30, 40]); + assert_eq!(>::get(10), vec![(5, 100)]); + assert_eq!(>::get(20), vec![(5, 100)]); + assert_eq!(>::get(30), vec![(5, 100)]); + assert_eq!(>::get(40), vec![(5, 100)]); + // Create a new bid + assert_ok!(Society::bid(Origin::signed(50), 1000)); + run_to_block(4); + assert_ok!(Society::vote(Origin::signed(10), 50, false)); + assert_ok!(Society::vote(Origin::signed(20), 50, true)); + assert_ok!(Society::vote(Origin::signed(30), 50, false)); + assert_ok!(Society::vote(Origin::signed(40), 50, false)); + run_to_block(8); + // Wrong voter gained a strike + assert_eq!(>::get(10), 0); + assert_eq!(>::get(20), 1); + assert_eq!(>::get(30), 0); + assert_eq!(>::get(40), 0); + // Their payout is slashed, a random person is rewarded + assert_eq!(>::get(10), vec![(5, 100), (9,2)]); + assert_eq!(>::get(20), vec![(5, 98)]); + assert_eq!(>::get(30), vec![(5, 100)]); + assert_eq!(>::get(40), vec![(5, 100)]); + }); +} + +#[test] +fn user_cannot_bid_twice() { + EnvBuilder::new().execute(|| { + // Cannot bid twice + assert_ok!(Society::bid(Origin::signed(20), 100)); + assert_noop!(Society::bid(Origin::signed(20), 100), Error::::AlreadyBid); + // Cannot bid when vouched + assert_ok!(Society::vouch(Origin::signed(10), 30, 100, 100)); + assert_noop!(Society::bid(Origin::signed(30), 100), Error::::AlreadyBid); + // Cannot vouch when already bid + assert_ok!(Society::add_member(&50)); + assert_noop!(Society::vouch(Origin::signed(50), 20, 100, 100), Error::::AlreadyBid); + }); +} + +#[test] +fn vouching_handles_removed_member_with_bid() { + EnvBuilder::new().execute(|| { + // Add a member + assert_ok!(Society::add_member(&20)); + // Have that member vouch for a user + assert_ok!(Society::vouch(Origin::signed(20), 30, 1000, 100)); + // That user is now a bid and the member is vouching + assert_eq!(>::get(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); + assert_eq!(>::get(20), Some(VouchingStatus::Vouching)); + // Suspend that member + Society::suspend_member(&20); + assert_eq!(>::get(20), Some(())); + // Nothing changes yet + assert_eq!(>::get(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); + assert_eq!(>::get(20), Some(VouchingStatus::Vouching)); + // Remove member + assert_ok!(Society::judge_suspended_member(Origin::signed(2), 20, false)); + // Bid is removed, vouching status is removed + assert_eq!(>::get(), vec![]); + assert_eq!(>::get(20), None); + }); +} + +#[test] +fn vouching_handles_removed_member_with_candidate() { + EnvBuilder::new().execute(|| { + // Add a member + assert_ok!(Society::add_member(&20)); + // Have that member vouch for a user + assert_ok!(Society::vouch(Origin::signed(20), 30, 1000, 100)); + // That user is now a bid and the member is vouching + assert_eq!(>::get(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); + assert_eq!(>::get(20), Some(VouchingStatus::Vouching)); + // Make that bid a candidate + run_to_block(4); + assert_eq!(Society::candidates(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); + // Suspend that member + Society::suspend_member(&20); + assert_eq!(>::get(20), Some(())); + // Nothing changes yet + assert_eq!(Society::candidates(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); + assert_eq!(>::get(20), Some(VouchingStatus::Vouching)); + // Remove member + assert_ok!(Society::judge_suspended_member(Origin::signed(2), 20, false)); + // Vouching status is removed, but candidate is still in the queue + assert_eq!(>::get(20), None); + assert_eq!(Society::candidates(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); + // Candidate wins + assert_ok!(Society::vote(Origin::signed(10), 30, true)); + run_to_block(8); + assert_eq!(Society::members(), vec![10, 30]); + // Payout does not go to removed member + assert_eq!(>::get(20), vec![]); + assert_eq!(>::get(30), vec![(9, 1000)]); + }); +} + +#[test] +fn votes_are_working() { + EnvBuilder::new().execute(|| { + // Users make bids of various amounts + assert_ok!(Society::bid(Origin::signed(50), 500)); + assert_ok!(Society::bid(Origin::signed(40), 400)); + assert_ok!(Society::bid(Origin::signed(30), 300)); + // Rotate period + run_to_block(4); + // A member votes for these candidates to join the society + assert_ok!(Society::vote(Origin::signed(10), 30, true)); + assert_ok!(Society::vote(Origin::signed(10), 40, true)); + // You cannot vote for a non-candidate + assert_noop!(Society::vote(Origin::signed(10), 50, true), Error::::NotCandidate); + // Votes are stored + assert_eq!(>::get(30, 10), Some(Vote::Approve)); + assert_eq!(>::get(40, 10), Some(Vote::Approve)); + assert_eq!(>::get(50, 10), None); + run_to_block(8); + // Candidates become members after a period rotation + assert_eq!(Society::members(), vec![10, 30, 40]); + // Votes are cleaned up + assert_eq!(>::get(30, 10), None); + assert_eq!(>::get(40, 10), None); + }); +} + +#[test] +fn max_limits_work() { + EnvBuilder::new().with_pot(100000).execute(|| { + // Max bids is 1000, when extra bids come in, it pops the larger ones off the stack. + // Try to put 1010 users into the bid pool + for i in (100..1110).rev() { + // Give them some funds + let _ = Balances::make_free_balance_be(&(i as u128), 1000); + assert_ok!(Society::bid(Origin::signed(i as u128), i)); + } + let bids = >::get(); + // Length is 1000 + assert_eq!(bids.len(), 1000); + // First bid is smallest number (100) + assert_eq!(bids[0], create_bid(100, 100, BidKind::Deposit(25))); + // Last bid is smallest number + 99 (1099) + assert_eq!(bids[999], create_bid(1099, 1099, BidKind::Deposit(25))); + // Rotate period + run_to_block(4); + // Max of 10 candidates + assert_eq!(Society::candidates().len(), 10); + // Fill up membership, max 100, we will do just 95 + for i in 2000..2095 { + assert_ok!(Society::add_member(&(i as u128))); + } + // Remember there was 1 original member, so 96 total + assert_eq!(Society::members().len(), 96); + // Rotate period + run_to_block(8); + // Only of 4 candidates possible now + assert_eq!(Society::candidates().len(), 4); + // Fill up members with suspended candidates from the first rotation + for i in 100..104 { + assert_ok!(Society::judge_suspended_candidate(Origin::signed(2), i, Judgement::Approve)); + } + assert_eq!(Society::members().len(), 100); + // Can't add any more members + assert_noop!(Society::add_member(&98), Error::::MaxMembers); + // However, a fringe scenario allows for in-progress candidates to increase the membership + // pool, but it has no real after-effects. + for i in Society::members().iter() { + assert_ok!(Society::vote(Origin::signed(*i), 110, true)); + assert_ok!(Society::vote(Origin::signed(*i), 111, true)); + assert_ok!(Society::vote(Origin::signed(*i), 112, true)); + } + // Rotate period + run_to_block(12); + // Members length is over 100, no problem... + assert_eq!(Society::members().len(), 103); + // No candidates because full + assert_eq!(Society::candidates().len(), 0); + // Increase member limit + assert_ok!(Society::set_max_members(Origin::ROOT, 200)); + // Rotate period + run_to_block(16); + // Candidates are back! + assert_eq!(Society::candidates().len(), 10); + }); +} diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index eaaad7b8c4..cb22283924 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -23,7 +23,7 @@ use codec::{FullCodec, Codec, Encode, Decode}; use sp_core::u32_trait::Value as U32; use sp_runtime::{ ConsensusEngineId, DispatchResult, DispatchError, - traits::{MaybeSerializeDeserialize, SimpleArithmetic, Saturating}, + traits::{MaybeSerializeDeserialize, SimpleArithmetic, Saturating, TrailingZeroInput}, }; use crate::dispatch::Parameter; @@ -777,6 +777,12 @@ pub trait Randomness { } } +impl Randomness for () { + fn random(subject: &[u8]) -> Output { + Output::decode(&mut TrailingZeroInput::new(subject)).unwrap_or_default() + } +} + /// Implementors of this trait provide information about whether or not some validator has /// been registered with them. The [Session module](../../pallet_session/index.html) is an implementor. pub trait ValidatorRegistration { -- GitLab From 7883b9d35e893672ee11699ab39b46e748c64015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 10 Jan 2020 11:31:42 +0100 Subject: [PATCH 089/296] Fix pallet-society on master (#4588) --- frame/society/src/mock.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index 24eac4c5af..fc46561fd4 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -18,7 +18,7 @@ use super::*; -use frame_support::{impl_outer_origin, parameter_types}; +use frame_support::{impl_outer_origin, parameter_types, ord_parameter_types}; use sp_core::H256; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. @@ -43,8 +43,6 @@ parameter_types! { pub const RotationPeriod: u64 = 4; pub const PeriodSpend: u64 = 1000; pub const MaxLockDuration: u64 = 100; - pub const FounderSetAccount: u64 = 1; - pub const SuspensionJudgementSetAccount: u64 = 2; pub const ChallengePeriod: u64 = 8; pub const MaxMembers: u32 = 100; @@ -58,6 +56,11 @@ parameter_types! { pub const CreationFee: u64 = 0; } +ord_parameter_types! { + pub const FounderSetAccount: u128 = 1; + pub const SuspensionJudgementSetAccount: u128 = 2; +} + impl frame_system::Trait for Test { type Origin = Origin; type Index = u64; @@ -87,6 +90,7 @@ impl pallet_balances::Trait for Test { type ExistentialDeposit = ExistentialDeposit; type TransferFee = TransferFee; type CreationFee = CreationFee; + type OnReapAccount = System; } impl Trait for Test { @@ -201,4 +205,4 @@ pub fn create_bid( kind, value } -} +} -- GitLab From ae9c6eac90606c7e612df52d37e89ff1e6d9203b Mon Sep 17 00:00:00 2001 From: thiolliere Date: Fri, 10 Jan 2020 11:52:56 +0100 Subject: [PATCH 090/296] Modify doublemap syntax (#4576) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * modify doublemap syntax * Apply suggestions from code review Co-Authored-By: Bastian Köcher Co-authored-by: Bastian Köcher --- frame/evm/src/lib.rs | 2 +- frame/generic-asset/src/lib.rs | 4 ++-- frame/im-online/src/lib.rs | 7 +++---- frame/offences/src/lib.rs | 2 +- frame/session/src/lib.rs | 6 ++++-- frame/staking/src/lib.rs | 4 ++-- frame/support/procedural/src/lib.rs | 8 +++----- frame/support/procedural/src/storage/parse.rs | 13 +++++++------ frame/support/src/lib.rs | 8 ++++---- frame/support/test/tests/decl_storage.rs | 6 +++--- frame/support/test/tests/final_keys.rs | 12 ++++++------ frame/support/test/tests/genesisconfig.rs | 2 +- frame/support/test/tests/instance.rs | 2 +- frame/utility/src/lib.rs | 3 ++- utils/frame/rpc/support/src/lib.rs | 2 +- 15 files changed, 41 insertions(+), 40 deletions(-) diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index 6c1f52a642..48b54a8c86 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -165,7 +165,7 @@ decl_storage! { trait Store for Module as Example { Accounts get(fn accounts) config(): map H160 => Account; AccountCodes: map H160 => Vec; - AccountStorages: double_map H160, blake2_256(H256) => H256; + AccountStorages: double_map H160, H256 => H256; } } diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index ceadd937fc..0a0209b20f 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -492,10 +492,10 @@ decl_storage! { }): map T::AssetId => T::Balance; /// The free balance of a given asset under an account. - pub FreeBalance: double_map T::AssetId, twox_128(T::AccountId) => T::Balance; + pub FreeBalance: double_map T::AssetId, hasher(twox_128) T::AccountId => T::Balance; /// The reserved balance of a given asset under an account. - pub ReservedBalance: double_map T::AssetId, twox_128(T::AccountId) => T::Balance; + pub ReservedBalance: double_map T::AssetId, hasher(twox_128) T::AccountId => T::Balance; /// Next available ID for user-created asset. pub NextAssetId get(fn next_asset_id) config(): T::AssetId; diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index 62d0ec6ac4..065ca7e3bf 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -233,13 +233,12 @@ decl_storage! { /// For each session index, we keep a mapping of `AuthIndex` /// to `offchain::OpaqueNetworkState`. - ReceivedHeartbeats get(fn received_heartbeats): double_map SessionIndex, - blake2_256(AuthIndex) => Option>; + ReceivedHeartbeats get(fn received_heartbeats): double_map SessionIndex, AuthIndex + => Option>; /// For each session index, we keep a mapping of `T::ValidatorId` to the /// number of blocks authored by the given authority. - AuthoredBlocks get(fn authored_blocks): double_map SessionIndex, - blake2_256(T::ValidatorId) => u32; + AuthoredBlocks get(fn authored_blocks): double_map SessionIndex, T::ValidatorId => u32; } add_extra_genesis { config(keys): Vec; diff --git a/frame/offences/src/lib.rs b/frame/offences/src/lib.rs index f0a2cb04ee..310c018d76 100644 --- a/frame/offences/src/lib.rs +++ b/frame/offences/src/lib.rs @@ -57,7 +57,7 @@ decl_storage! { Reports get(fn reports): map ReportIdOf => Option>; /// A vector of reports of the same kind that happened at the same time slot. - ConcurrentReportsIndex: double_map Kind, blake2_256(OpaqueTimeSlot) => Vec>; + ConcurrentReportsIndex: double_map Kind, OpaqueTimeSlot => Vec>; /// Enumerates all reports of a kind along with the time they happened. /// diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index 2c5668f6fa..2200221af4 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -398,13 +398,15 @@ decl_storage! { /// /// The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of /// the trie. Having all data in the same branch should prevent slowing down other queries. - NextKeys: double_map hasher(twox_64_concat) Vec, blake2_256(T::ValidatorId) => Option; + NextKeys: double_map hasher(twox_64_concat) Vec, hasher(blake2_256) T::ValidatorId + => Option; /// The owner of a key. The second key is the `KeyTypeId` + the encoded key. /// /// The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of /// the trie. Having all data in the same branch should prevent slowing down other queries. - KeyOwner: double_map hasher(twox_64_concat) Vec, blake2_256((KeyTypeId, Vec)) => Option; + KeyOwner: double_map hasher(twox_64_concat) Vec, hasher(blake2_256) (KeyTypeId, Vec) + => Option; } add_extra_genesis { config(keys): Vec<(T::ValidatorId, T::Keys)>; diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index deb451f35c..1331f869b7 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -738,11 +738,11 @@ decl_storage! { /// All slashing events on validators, mapped by era to the highest slash proportion /// and slash value of the era. ValidatorSlashInEra: - double_map EraIndex, twox_128(T::AccountId) => Option<(Perbill, BalanceOf)>; + double_map EraIndex, hasher(twox_128) T::AccountId => Option<(Perbill, BalanceOf)>; /// All slashing events on nominators, mapped by era to the highest slash value of the era. NominatorSlashInEra: - double_map EraIndex, twox_128(T::AccountId) => Option>; + double_map EraIndex, hasher(twox_128) T::AccountId => Option>; /// Slashing spans for stash accounts. SlashingSpans: map T::AccountId => Option; diff --git a/frame/support/procedural/src/lib.rs b/frame/support/procedural/src/lib.rs index faac4baec3..7c27bc2a04 100644 --- a/frame/support/procedural/src/lib.rs +++ b/frame/support/procedural/src/lib.rs @@ -117,7 +117,7 @@ use proc_macro::TokenStream; /// Twox128(module_prefix) ++ Twox128(head_prefix) /// ``` /// -/// * Double map: `Foo: double_map hasher($hash1) u32, $hash2(u32) => u32`: Implements the +/// * Double map: `Foo: double_map hasher($hash1) u32, hasher($hash2) u32 => u32`: Implements the /// [`StorageDoubleMap`](../frame_support/storage/trait.StorageDoubleMap.html) trait using the /// [`StorageDoubleMap generator`](../frame_support/storage/generator/trait.StorageDoubleMap.html). /// And [`StoragePrefixedMap`](../frame_support/storage/trait.StoragePrefixedMap.html). @@ -126,10 +126,8 @@ use proc_macro::TokenStream; /// [`Hashable`](../frame_support/trait.Hashable.html) trait. They must be choosen with care, see /// generator documentation. /// -/// `hasher($hash)` is optional and its default is `blake2_256`. -/// -/// `hasher($hash)` is optional and its default is `blake2_256`. One should use another hasher -/// with care, see generator documentation. +/// `hasher($hash1)` and `hasher($hash2) are optional and default to `blake2_256`. +/// One should use another hasher with care, see generator documentation. /// /// If the first key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. /// Otherwise, other values of all storage items can be compromised. diff --git a/frame/support/procedural/src/storage/parse.rs b/frame/support/procedural/src/storage/parse.rs index a2d3c67dd2..5d91fbcc0e 100644 --- a/frame/support/procedural/src/storage/parse.rs +++ b/frame/support/procedural/src/storage/parse.rs @@ -167,11 +167,11 @@ struct DeclStorageLinkedMap { #[derive(Parse, ToTokens, Debug)] struct DeclStorageDoubleMap { pub map_keyword: keyword::double_map, - pub hasher: ext::Opt, + pub hasher1: ext::Opt, pub key1: syn::Type, pub comma_keyword: Token![,], - pub key2_hasher: Hasher, - pub key2: ext::Parens, + pub hasher2: ext::Opt, + pub key2: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, } @@ -380,11 +380,12 @@ fn parse_storage_line_defs( ), DeclStorageType::DoubleMap(map) => super::StorageLineTypeDef::DoubleMap( super::DoubleMapDef { - hasher1: map.hasher.inner.map(Into::into) + hasher1: map.hasher1.inner.map(Into::into) + .unwrap_or(super::HasherKind::Blake2_256), + hasher2: map.hasher2.inner.map(Into::into) .unwrap_or(super::HasherKind::Blake2_256), - hasher2: map.key2_hasher.into(), key1: map.key1, - key2: map.key2.content, + key2: map.key2, value: map.value, } ), diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index 0d769c3335..ebfc7bbe97 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -261,12 +261,12 @@ mod tests { pub GetterNoFnKeyword get(no_fn): Option; pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]): - double_map hasher(twox_64_concat) u32, blake2_256(u32) => u64; + double_map hasher(twox_64_concat) u32, hasher(blake2_256) u32 => u64; pub GenericDataDM: - double_map T::BlockNumber, twox_128(T::BlockNumber) => T::BlockNumber; + double_map T::BlockNumber, hasher(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; + double_map T::BlockNumber, hasher(twox_256) T::BlockNumber => Option; + pub AppendableDM: double_map u32, T::BlockNumber => Vec; } } diff --git a/frame/support/test/tests/decl_storage.rs b/frame/support/test/tests/decl_storage.rs index b0974fcb82..15a0807fa5 100644 --- a/frame/support/test/tests/decl_storage.rs +++ b/frame/support/test/tests/decl_storage.rs @@ -562,9 +562,9 @@ mod test_append_and_len { MapVecWithDefault: map u32 => Vec = vec![6, 9]; OptionMapVec: map u32 => Option>; - DoubleMapVec: double_map u32, blake2_256(u32) => Vec; - DoubleMapVecWithDefault: double_map u32, blake2_256(u32) => Vec = vec![6, 9]; - OptionDoubleMapVec: double_map u32, blake2_256(u32) => Option>; + DoubleMapVec: double_map u32, u32 => Vec; + DoubleMapVecWithDefault: double_map u32, u32 => Vec = vec![6, 9]; + OptionDoubleMapVec: double_map u32, u32 => Option>; LinkedMapVec: linked_map u32 => Vec; LinkedMapVecWithDefault: linked_map u32 => Vec = vec![6, 9]; diff --git a/frame/support/test/tests/final_keys.rs b/frame/support/test/tests/final_keys.rs index 71e13f7ced..9f1b379e25 100644 --- a/frame/support/test/tests/final_keys.rs +++ b/frame/support/test/tests/final_keys.rs @@ -41,12 +41,12 @@ mod no_instance { pub LinkedMap: linked_map u32 => u32; pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; - pub DoubleMap: double_map u32, blake2_256(u32) => u32; - pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32; + pub DoubleMap: double_map u32, u32 => u32; + pub DoubleMap2: double_map hasher(twox_128) u32, hasher(blake2_128) u32 => u32; pub TestGenericValue get(fn test_generic_value) config(): Option; pub TestGenericDoubleMap get(fn foo2) config(test_generic_double_map): - double_map u32, blake2_256(T::BlockNumber) => Option; + double_map u32, T::BlockNumber => Option; } } } @@ -71,12 +71,12 @@ mod instance { pub LinkedMap: linked_map u32 => u32; pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; - pub DoubleMap: double_map u32, blake2_256(u32) => u32; - pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32; + pub DoubleMap: double_map u32, u32 => u32; + pub DoubleMap2: double_map hasher(twox_128) u32, hasher(blake2_128) u32 => u32; pub TestGenericValue get(fn test_generic_value) config(): Option; pub TestGenericDoubleMap get(fn foo2) config(test_generic_double_map): - double_map u32, blake2_256(T::BlockNumber) => Option; + double_map u32, T::BlockNumber => Option; } add_extra_genesis { // See `decl_storage` limitation. diff --git a/frame/support/test/tests/genesisconfig.rs b/frame/support/test/tests/genesisconfig.rs index 04525aa142..dee7aefe0a 100644 --- a/frame/support/test/tests/genesisconfig.rs +++ b/frame/support/test/tests/genesisconfig.rs @@ -25,7 +25,7 @@ frame_support::decl_module! { frame_support::decl_storage! { trait Store for Module as Example { - pub AppendableDM config(t): double_map u32, blake2_256(T::BlockNumber) => Vec; + pub AppendableDM config(t): double_map u32, T::BlockNumber => Vec; } } diff --git a/frame/support/test/tests/instance.rs b/frame/support/test/tests/instance.rs index e4b707c1f1..879ef4fa68 100644 --- a/frame/support/test/tests/instance.rs +++ b/frame/support/test/tests/instance.rs @@ -138,7 +138,7 @@ mod module2 { pub Value config(value): T::Amount; pub Map config(map): map u64 => u64; pub LinkedMap config(linked_map): linked_map u64 => Vec; - pub DoubleMap config(double_map): double_map u64, blake2_256(u64) => u64; + pub DoubleMap config(double_map): double_map u64, u64 => u64; } } diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index ddbebda31f..1f7e861373 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -127,7 +127,8 @@ pub struct Multisig { decl_storage! { trait Store for Module as Utility { /// The set of open multisig operations. - pub Multisigs: double_map hasher(twox_64_concat) T::AccountId, blake2_128_concat([u8; 32]) + pub Multisigs: double_map + hasher(twox_64_concat) T::AccountId, hasher(blake2_128_concat) [u8; 32] => Option, T::AccountId>>; } } diff --git a/utils/frame/rpc/support/src/lib.rs b/utils/frame/rpc/support/src/lib.rs index ba467abd92..1e29c4e91b 100644 --- a/utils/frame/rpc/support/src/lib.rs +++ b/utils/frame/rpc/support/src/lib.rs @@ -67,7 +67,7 @@ use sc_rpc_api::state::StateClient; /// pub LastActionId: u64; /// pub Voxels: map Loc => Block; /// pub Actions: linked_map u64 => Loc; -/// pub Prefab: double_map u128, blake2_256((i8, i8, i8)) => Block; +/// pub Prefab: double_map u128, (i8, i8, i8) => Block; /// } /// } /// -- GitLab From d302c58063d3e0238fc3322c8d66be89eaedaf78 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Fri, 10 Jan 2020 15:10:16 +0100 Subject: [PATCH 091/296] fix society (#4594) --- frame/society/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index d5bf0bcf4e..005746aeb4 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -439,7 +439,7 @@ decl_storage! { /// Double map from Candidate -> Voter -> (Maybe) Vote. Votes: double_map hasher(twox_64_concat) T::AccountId, - twox_64_concat(T::AccountId) + hasher(twox_64_concat) T::AccountId => Option; /// The defending member currently being challenged. -- GitLab From dc4216a51a8e69729c208685eaceae2f929738ff Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Fri, 10 Jan 2020 15:26:12 +0100 Subject: [PATCH 092/296] Fix runners-up candidacy submission check in council (#4592) * fix is_runner() * add a test * Bump --- bin/node/runtime/src/lib.rs | 4 ++-- frame/elections-phragmen/src/lib.rs | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index b277ac8438..b3ff8b1628 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 201, - impl_version: 201, + spec_version: 202, + impl_version: 202, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 18b010295c..078c659509 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -161,8 +161,8 @@ decl_storage! { /// Locked stake of a voter. pub StakeOf get(fn stake_of): map T::AccountId => BalanceOf; - /// The present candidate list. Sorted based on account id. A current member can never enter - /// this vector and is always implicitly assumed to be a candidate. + /// The present candidate list. Sorted based on account-id. A current member or a runner can + /// never enter this vector and is always implicitly assumed to be a candidate. pub Candidates get(fn candidates): Vec; } } @@ -535,7 +535,7 @@ impl Module { /// /// Limited number of runners-up. Binary search. Constant time factor. O(1) fn is_runner(who: &T::AccountId) -> bool { - Self::runners_up().binary_search_by(|(a, _b)| a.cmp(who)).is_ok() + Self::runners_up().iter().position(|(a, _b)| a == who).is_some() } /// Returns number of desired members. @@ -2080,4 +2080,23 @@ mod tests { ); }) } + + #[test] + fn behavior_with_dupe_candidate() { + ExtBuilder::default().desired_runners_up(2).build().execute_with(|| { + >::put(vec![1, 1, 2, 3, 4]); + + assert_ok!(Elections::vote(Origin::signed(5), vec![1], 50)); + assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); + assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); + + System::set_block_number(5); + assert_ok!(Elections::end_block(System::block_number())); + + assert_eq!(Elections::members_ids(), vec![1, 1]); + assert_eq!(Elections::runners_up_ids(), vec![4, 3]); + assert_eq!(Elections::candidates(), vec![]); + }) + } } -- GitLab From fd01451def6804d6948cdc38ec4bd9b31cb82ea7 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 10 Jan 2020 18:06:23 +0100 Subject: [PATCH 093/296] Fix tests (#4597) --- frame/elections-phragmen/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 078c659509..1d9573cbbf 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -2094,8 +2094,8 @@ mod tests { System::set_block_number(5); assert_ok!(Elections::end_block(System::block_number())); - assert_eq!(Elections::members_ids(), vec![1, 1]); - assert_eq!(Elections::runners_up_ids(), vec![4, 3]); + assert_eq!(Elections::members_ids(), vec![1, 4]); + assert_eq!(Elections::runners_up_ids(), vec![2, 3]); assert_eq!(Elections::candidates(), vec![]); }) } -- GitLab From 8dc5675beef4a1006e76778d4757d551a994a323 Mon Sep 17 00:00:00 2001 From: Igor Matuszewski Date: Fri, 10 Jan 2020 18:35:23 +0100 Subject: [PATCH 094/296] Remove now unused `lang_items` feature in IO primitives (#4596) We don't use any explicit `#[lang = ...]` items anymore (`panic_fmt` is replaced with now-stable `#[panic_implementation]`, OOM is handled via `alloc_error_handler` directly etc.), so I thought it'd be good to remove it for clarity to limit used nightly features. --- primitives/io/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 96c42b074d..7ac2ae1012 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -19,7 +19,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(lang_items))] #![cfg_attr(not(feature = "std"), feature(alloc_error_handler))] #![cfg_attr(not(feature = "std"), feature(core_intrinsics))] -- GitLab From effe489951d1edab9d34846b1eefdfaf9511dab9 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 10 Jan 2020 19:23:20 +0100 Subject: [PATCH 095/296] Fixes for pallets (#4595) * Move rebond to the end * Fix identity module * Fix order of things in tresury * Fixes * Fix. * Fix test * Fix test --- frame/identity/src/lib.rs | 23 ++++--- frame/staking/src/lib.rs | 40 ++++++------ frame/treasury/src/lib.rs | 130 +++++++++++++++++++------------------- 3 files changed, 96 insertions(+), 97 deletions(-) diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 38aa3f9771..b23407406b 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -323,7 +323,7 @@ pub struct IdentityInfo { /// /// NOTE: This is stored separately primarily to facilitate the addition of extra fields in a /// backwards compatible way through a specialized `Decode` impl. -#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug)] +#[derive(Clone, Encode, Eq, PartialEq, RuntimeDebug)] pub struct Registration< Balance: Encode + Decode + Copy + Clone + Debug + Eq + PartialEq > { @@ -348,8 +348,17 @@ impl < } } +impl< + Balance: Encode + Decode + Copy + Clone + Debug + Eq + PartialEq, +> Decode for Registration { + fn decode(input: &mut I) -> sp_std::result::Result { + let (judgements, deposit, info) = Decode::decode(&mut AppendZerosInput::new(input))?; + Ok(Self { judgements, deposit, info }) + } +} + /// Information concerning a registrar. -#[derive(Clone, Encode, Eq, PartialEq, RuntimeDebug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug)] pub struct RegistrarInfo< Balance: Encode + Decode + Clone + Debug + Eq + PartialEq, AccountId: Encode + Decode + Clone + Debug + Eq + PartialEq @@ -365,16 +374,6 @@ pub struct RegistrarInfo< pub fields: IdentityFields, } -impl< - Balance: Encode + Decode + Clone + Debug + Eq + PartialEq, - AccountId: Encode + Decode + Clone + Debug + Eq + PartialEq -> Decode for RegistrarInfo { - fn decode(input: &mut I) -> sp_std::result::Result { - let (account, fee, fields) = Decode::decode(&mut AppendZerosInput::new(input))?; - Ok(Self { account, fee, fields }) - } -} - decl_storage! { trait Store for Module as Sudo { /// Information that is pertinent to identify the entity behind an account. diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 1331f869b7..eef00a7c24 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -985,26 +985,6 @@ decl_module! { } } - /// Rebond a portion of the stash scheduled to be unlocked. - /// - /// # - /// - Time complexity: O(1). Bounded by `MAX_UNLOCKING_CHUNKS`. - /// - Storage changes: Can't increase storage, only decrease it. - /// # - #[weight = SimpleDispatchInfo::FixedNormal(500_000)] - fn rebond(origin, #[compact] value: BalanceOf) { - let controller = ensure_signed(origin)?; - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - ensure!( - ledger.unlocking.len() > 0, - Error::::NoUnlockChunk, - ); - - let ledger = ledger.rebond(value); - - Self::update_ledger(&controller, &ledger); - } - /// Remove any unlocked chunks from the `unlocking` queue from our management. /// /// This essentially frees up that balance to be used by the stash account to do @@ -1256,6 +1236,26 @@ decl_module! { ::UnappliedSlashes::insert(&era, &unapplied); } + + /// Rebond a portion of the stash scheduled to be unlocked. + /// + /// # + /// - Time complexity: O(1). Bounded by `MAX_UNLOCKING_CHUNKS`. + /// - Storage changes: Can't increase storage, only decrease it. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] + fn rebond(origin, #[compact] value: BalanceOf) { + let controller = ensure_signed(origin)?; + let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + ensure!( + ledger.unlocking.len() > 0, + Error::::NoUnlockChunk, + ); + + let ledger = ledger.rebond(value); + + Self::update_ledger(&controller, &ledger); + } } } diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index f86c538326..1800d0ad04 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -311,6 +311,71 @@ decl_module! { fn deposit_event() = default; + /// 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. + /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] + fn propose_spend( + origin, + #[compact] value: BalanceOf, + beneficiary: ::Source + ) { + let proposer = ensure_signed(origin)?; + let beneficiary = T::Lookup::lookup(beneficiary)?; + + let bond = Self::calculate_bond(value); + T::Currency::reserve(&proposer, bond) + .map_err(|_| Error::::InsufficientProposersBalance)?; + + let c = Self::proposal_count(); + ProposalCount::put(c + 1); + >::insert(c, Proposal { proposer, value, beneficiary, bond }); + + Self::deposit_event(RawEvent::Proposed(c)); + } + + /// Reject a proposed spend. The original deposit will be slashed. + /// + /// # + /// - O(1). + /// - Limited storage reads. + /// - One DB clear. + /// # + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] + fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { + T::RejectOrigin::ensure_origin(origin)?; + let proposal = >::take(&proposal_id).ok_or(Error::::InvalidProposalIndex)?; + + let value = proposal.bond; + let imbalance = T::Currency::slash_reserved(&proposal.proposer, value).0; + T::ProposalRejection::on_unbalanced(imbalance); + + Self::deposit_event(Event::::Rejected(proposal_id, value)); + } + + /// 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. + /// # + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] + fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { + T::ApproveOrigin::ensure_origin(origin)?; + + ensure!(>::exists(proposal_id), Error::::InvalidProposalIndex); + + Approvals::mutate(|v| v.push(proposal_id)); + } + /// Report something `reason` that deserves a tip and claim any eventual the finder's fee. /// /// The dispatch origin for this call must be _Signed_. @@ -477,71 +542,6 @@ decl_module! { Self::payout_tip(tip); } - /// 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. - /// # - #[weight = SimpleDispatchInfo::FixedNormal(500_000)] - fn propose_spend( - origin, - #[compact] value: BalanceOf, - beneficiary: ::Source - ) { - let proposer = ensure_signed(origin)?; - let beneficiary = T::Lookup::lookup(beneficiary)?; - - let bond = Self::calculate_bond(value); - T::Currency::reserve(&proposer, bond) - .map_err(|_| Error::::InsufficientProposersBalance)?; - - let c = Self::proposal_count(); - ProposalCount::put(c + 1); - >::insert(c, Proposal { proposer, value, beneficiary, bond }); - - Self::deposit_event(RawEvent::Proposed(c)); - } - - /// Reject a proposed spend. The original deposit will be slashed. - /// - /// # - /// - O(1). - /// - Limited storage reads. - /// - One DB clear. - /// # - #[weight = SimpleDispatchInfo::FixedOperational(100_000)] - fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { - T::RejectOrigin::ensure_origin(origin)?; - let proposal = >::take(&proposal_id).ok_or(Error::::InvalidProposalIndex)?; - - let value = proposal.bond; - let imbalance = T::Currency::slash_reserved(&proposal.proposer, value).0; - T::ProposalRejection::on_unbalanced(imbalance); - - Self::deposit_event(Event::::Rejected(proposal_id, value)); - } - - /// 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. - /// # - #[weight = SimpleDispatchInfo::FixedOperational(100_000)] - fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { - T::ApproveOrigin::ensure_origin(origin)?; - - ensure!(>::exists(proposal_id), Error::::InvalidProposalIndex); - - Approvals::mutate(|v| v.push(proposal_id)); - } - fn on_finalize(n: T::BlockNumber) { // Check to see if we should spend some funds! if (n % T::SpendPeriod::get()).is_zero() { -- GitLab From 4a23a319ded69b8d484f4d678d3040c3049e83fa Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sat, 11 Jan 2020 19:22:08 +0300 Subject: [PATCH 096/296] Refactor some tests in tx-pool (#4603) * add test setup * tests with setup --- client/transaction-pool/src/maintainer.rs | 148 +++++++++++++--------- test-utils/runtime/client/src/lib.rs | 1 + 2 files changed, 92 insertions(+), 57 deletions(-) diff --git a/client/transaction-pool/src/maintainer.rs b/client/transaction-pool/src/maintainer.rs index 7ad9ed3cbf..97dc7e10a6 100644 --- a/client/transaction-pool/src/maintainer.rs +++ b/client/transaction-pool/src/maintainer.rs @@ -354,41 +354,91 @@ mod tests { use super::*; use futures::executor::block_on; use codec::Encode; - use substrate_test_runtime_client::{prelude::*, runtime::{Block, Transfer}, sp_consensus::{BlockOrigin, SelectChain}}; + use substrate_test_runtime_client::{ + prelude::*, Client, runtime::{Block, Transfer}, sp_consensus::{BlockOrigin, SelectChain}, + LongestChain, + }; use sp_transaction_pool::PoolStatus; use crate::api::{FullChainApi, LightChainApi}; + struct TestSetup { + client: Arc>, + longest_chain: LongestChain, + pool: Arc>, + } + + impl TestSetup { + fn new() -> TestSetup, Block>> { + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); + let pool = Arc::new( + sc_transaction_graph::Pool::new(Default::default(), FullChainApi::new(client.clone())), + ); + TestSetup { + client, + longest_chain, + pool, + } + } + + fn new_light(fetcher: Arc) -> TestSetup, F, Block>> + where F: Fetcher + 'static, + { + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); + let pool = Arc::new( + sc_transaction_graph::Pool::new( + Default::default(), + LightChainApi::new(client.clone(), fetcher) + ), + ); + TestSetup { + client, + longest_chain, + pool, + } + } + } + + fn setup() -> TestSetup, Block>> { + TestSetup::, Block>>::new() + } + + fn setup_light(fetcher: Arc) -> TestSetup, F, Block>> + where F: Fetcher + 'static, + { + TestSetup::, F, Block>>::new_light(fetcher) + } + #[test] fn should_remove_transactions_from_the_full_pool() { - let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let mut client = Arc::new(client); - let pool = sc_transaction_graph::Pool::new(Default::default(), FullChainApi::new(client.clone())); - let pool = Arc::new(pool); + let mut setup = setup(); + let transaction = Transfer { amount: 5, nonce: 0, from: AccountKeyring::Alice.into(), to: Default::default(), }.into_signed_tx(); - let best = longest_chain.best_chain().unwrap(); + let best = setup.longest_chain.best_chain().unwrap(); // store the transaction in the pool - block_on(pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); + block_on(setup.pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); // import the block - let mut builder = client.new_block(Default::default()).unwrap(); + let mut builder = setup.client.new_block(Default::default()).unwrap(); builder.push(transaction.clone()).unwrap(); let block = builder.build().unwrap().block; let id = BlockId::hash(block.header().hash()); - client.import(BlockOrigin::Own, block).unwrap(); + setup.client.import(BlockOrigin::Own, block).unwrap(); // fire notification - this should clean up the queue - assert_eq!(pool.status().ready, 1); - block_on(FullBasicPoolMaintainer::new(pool.clone(), client).maintain(&id, &[])); + assert_eq!(setup.pool.status().ready, 1); + block_on(FullBasicPoolMaintainer::new(setup.pool.clone(), setup.client.clone()).maintain(&id, &[])); // then - assert_eq!(pool.status().ready, 0); - assert_eq!(pool.status().future, 0); + assert_eq!(setup.pool.status().ready, 0); + assert_eq!(setup.pool.status().future, 0); } #[test] @@ -414,28 +464,22 @@ mod tests { Ok(validity.encode()) })))); - let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let client = Arc::new(client); - let pool = sc_transaction_graph::Pool::new(Default::default(), LightChainApi::new( - client.clone(), - fetcher.clone(), - )); - let pool = Arc::new(pool); - let best = longest_chain.best_chain().unwrap(); + let setup = setup_light(fetcher.clone()); + let best = setup.longest_chain.best_chain().unwrap(); // store the transaction in the pool - block_on(pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); + block_on(setup.pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); // fire notification - this should clean up the queue - assert_eq!(pool.status().ready, 1); - block_on(LightBasicPoolMaintainer::with_defaults(pool.clone(), client.clone(), fetcher).maintain( + assert_eq!(setup.pool.status().ready, 1); + block_on(LightBasicPoolMaintainer::with_defaults(setup.pool.clone(), setup.client.clone(), fetcher).maintain( &BlockId::Number(0), &[], )); // then - assert_eq!(pool.status().ready, 0); - assert_eq!(pool.status().future, 0); + assert_eq!(setup.pool.status().ready, 0); + assert_eq!(setup.pool.status().future, 0); } #[test] @@ -499,21 +543,13 @@ mod tests { revalidate_block_period: Option, prepare_maintainer: impl Fn(&Mutex>), ) -> PoolStatus { - let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let client = Arc::new(client); - - // now let's prepare pool - let pool = sc_transaction_graph::Pool::new(Default::default(), LightChainApi::new( - client.clone(), - fetcher.clone(), - )); - let pool = Arc::new(pool); - let best = longest_chain.best_chain().unwrap(); + let setup = setup_light(fetcher.clone()); + let best = setup.longest_chain.best_chain().unwrap(); // let's prepare maintainer let maintainer = LightBasicPoolMaintainer::new( - pool.clone(), - client, + setup.pool.clone(), + setup.client.clone(), fetcher, revalidate_time_period, revalidate_block_period, @@ -521,7 +557,7 @@ mod tests { prepare_maintainer(&*maintainer.revalidation_status); // store the transaction in the pool - block_on(pool.submit_one( + block_on(setup.pool.submit_one( &BlockId::hash(best.hash()), Transfer { amount: 5, @@ -534,7 +570,7 @@ mod tests { // and run maintain procedures block_on(maintainer.maintain(&BlockId::Number(0), &[])); - pool.status() + setup.pool.status() } // when revalidation is never required - nothing happens @@ -560,52 +596,50 @@ mod tests { #[test] fn should_add_reverted_transactions_to_the_pool() { - let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let mut client = Arc::new(client); - let pool = sc_transaction_graph::Pool::new(Default::default(), FullChainApi::new(client.clone())); - let pool = Arc::new(pool); + let mut setup = setup(); + let transaction = Transfer { amount: 5, nonce: 0, from: AccountKeyring::Alice.into(), to: Default::default(), }.into_signed_tx(); - let best = longest_chain.best_chain().unwrap(); + let best = setup.longest_chain.best_chain().unwrap(); // store the transaction in the pool - block_on(pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); + block_on(setup.pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); // import the block - let mut builder = client.new_block(Default::default()).unwrap(); + let mut builder = setup.client.new_block(Default::default()).unwrap(); builder.push(transaction.clone()).unwrap(); let block = builder.build().unwrap().block; let block1_hash = block.header().hash(); let id = BlockId::hash(block1_hash.clone()); - client.import(BlockOrigin::Own, block).unwrap(); + setup.client.import(BlockOrigin::Own, block).unwrap(); // fire notification - this should clean up the queue - assert_eq!(pool.status().ready, 1); - block_on(FullBasicPoolMaintainer::new(pool.clone(), client.clone()).maintain(&id, &[])); + assert_eq!(setup.pool.status().ready, 1); + block_on(FullBasicPoolMaintainer::new(setup.pool.clone(), setup.client.clone()).maintain(&id, &[])); // then - assert_eq!(pool.status().ready, 0); - assert_eq!(pool.status().future, 0); + assert_eq!(setup.pool.status().ready, 0); + assert_eq!(setup.pool.status().future, 0); // import second block - let builder = client.new_block_at( + let builder = setup.client.new_block_at( &BlockId::hash(best.hash()), Default::default(), false, ).unwrap(); let block = builder.build().unwrap().block; let id = BlockId::hash(block.header().hash()); - client.import(BlockOrigin::Own, block).unwrap(); + setup.client.import(BlockOrigin::Own, block).unwrap(); // fire notification - this should add the transaction back to the pool. - block_on(FullBasicPoolMaintainer::new(pool.clone(), client).maintain(&id, &[block1_hash])); + block_on(FullBasicPoolMaintainer::new(setup.pool.clone(), setup.client.clone()).maintain(&id, &[block1_hash])); // then - assert_eq!(pool.status().ready, 1); - assert_eq!(pool.status().future, 0); + assert_eq!(setup.pool.status().ready, 1); + assert_eq!(setup.pool.status().future, 0); } } diff --git a/test-utils/runtime/client/src/lib.rs b/test-utils/runtime/client/src/lib.rs index 1e05f95681..4faf7f8ab4 100644 --- a/test-utils/runtime/client/src/lib.rs +++ b/test-utils/runtime/client/src/lib.rs @@ -26,6 +26,7 @@ use std::sync::Arc; use std::collections::HashMap; pub use substrate_test_client::*; pub use substrate_test_runtime as runtime; +pub use sc_client::LongestChain; pub use self::block_builder_ext::BlockBuilderExt; -- GitLab From 4c9c6dfc70334485bfdc562634adb5e26da62210 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sat, 11 Jan 2020 20:22:40 +0300 Subject: [PATCH 097/296] avoid timer in light client (#4602) --- client/db/src/light.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 7a79885fad..7550daf894 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -63,6 +63,8 @@ pub struct LightStorage { meta: RwLock, Block::Hash>>, cache: Arc>, header_metadata_cache: HeaderMetadataCache, + + #[cfg(not(target_os = "unknown"))] io_stats: FrozenForDuration, } @@ -102,6 +104,7 @@ impl LightStorage meta: RwLock::new(meta), cache: Arc::new(DbCacheSync(RwLock::new(cache))), header_metadata_cache: HeaderMetadataCache::default(), + #[cfg(not(target_os = "unknown"))] io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), kvdb::IoStats::empty()), }) } @@ -558,6 +561,7 @@ impl LightBlockchainStorage for LightStorage Some(self.cache.clone()) } + #[cfg(not(target_os = "unknown"))] fn usage_info(&self) -> Option { use sc_client_api::{MemoryInfo, IoInfo}; @@ -579,6 +583,11 @@ impl LightBlockchainStorage for LightStorage } }) } + + #[cfg(target_os = "unknown")] + fn usage_info(&self) -> Option { + None + } } /// Build the key for inserting header-CHT at given block. -- GitLab From 022013790abc452743129fd5b16c98086c51d27b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 11 Jan 2020 18:23:04 +0100 Subject: [PATCH 098/296] Add test files I forgot to commit with #4520 (#4598) --- .../default_module_invalid_arg.rs | 14 ++++++++++++++ .../default_module_invalid_arg.stderr | 5 +++++ .../construct_runtime_ui/invalid_module_entry.rs | 14 ++++++++++++++ .../invalid_module_entry.stderr | 5 +++++ 4 files changed, 38 insertions(+) create mode 100644 frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.rs create mode 100644 frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.stderr create mode 100644 frame/support/test/tests/construct_runtime_ui/invalid_module_entry.rs create mode 100644 frame/support/test/tests/construct_runtime_ui/invalid_module_entry.stderr diff --git a/frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.rs b/frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.rs new file mode 100644 index 0000000000..92a5ffff73 --- /dev/null +++ b/frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.rs @@ -0,0 +1,14 @@ +use frame_support::construct_runtime; + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + System: system, + Balance: balances::{default, Error}, + } +} + +fn main() {} diff --git a/frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.stderr b/frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.stderr new file mode 100644 index 0000000000..d4a46a3491 --- /dev/null +++ b/frame/support/test/tests/construct_runtime_ui/default_module_invalid_arg.stderr @@ -0,0 +1,5 @@ +error: Only the following modules are allowed: `Module`, `Call`, `Storage`, `Event`, `Config`, `Origin`, `Inherent`, `ValidateUnsigned` + --> $DIR/default_module_invalid_arg.rs:10:32 + | +10 | Balance: balances::{default, Error}, + | ^^^^^ diff --git a/frame/support/test/tests/construct_runtime_ui/invalid_module_entry.rs b/frame/support/test/tests/construct_runtime_ui/invalid_module_entry.rs new file mode 100644 index 0000000000..db1250cdf4 --- /dev/null +++ b/frame/support/test/tests/construct_runtime_ui/invalid_module_entry.rs @@ -0,0 +1,14 @@ +use frame_support::construct_runtime; + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + System: system, + Balance: balances::{Error}, + } +} + +fn main() {} diff --git a/frame/support/test/tests/construct_runtime_ui/invalid_module_entry.stderr b/frame/support/test/tests/construct_runtime_ui/invalid_module_entry.stderr new file mode 100644 index 0000000000..da38a82d7e --- /dev/null +++ b/frame/support/test/tests/construct_runtime_ui/invalid_module_entry.stderr @@ -0,0 +1,5 @@ +error: Only the following modules are allowed: `Module`, `Call`, `Storage`, `Event`, `Config`, `Origin`, `Inherent`, `ValidateUnsigned` + --> $DIR/invalid_module_entry.rs:10:23 + | +10 | Balance: balances::{Error}, + | ^^^^^ -- GitLab From 9ded493bac83f9d2a66e6afce068e2ead2bd20ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 11 Jan 2020 18:47:26 +0100 Subject: [PATCH 099/296] Add test for cli keystore path generation (#4571) * Add test for cli keystore path generation * Fix test --- client/chain-spec/src/chain_spec.rs | 2 +- client/cli/src/lib.rs | 98 +++++++++--- client/service/src/builder.rs | 10 +- client/service/src/config.rs | 23 ++- client/service/test/src/lib.rs | 2 +- primitives/runtime/src/lib.rs | 10 ++ utils/browser/src/lib.rs | 236 ++++++++++++++-------------- 7 files changed, 225 insertions(+), 156 deletions(-) diff --git a/client/chain-spec/src/chain_spec.rs b/client/chain-spec/src/chain_spec.rs index ac6070fdd6..6e58083e8c 100644 --- a/client/chain-spec/src/chain_spec.rs +++ b/client/chain-spec/src/chain_spec.rs @@ -228,7 +228,7 @@ impl ChainSpec { let client_spec = ClientSpec { name: name.to_owned(), id: id.to_owned(), - boot_nodes: boot_nodes, + boot_nodes, telemetry_endpoints, protocol_id: protocol_id.map(str::to_owned), properties, diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 18ba347f6e..620a90c514 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -351,7 +351,10 @@ impl<'a> ParseAndPrepareBuildSpec<'a> { if spec.boot_nodes().is_empty() && !self.params.disable_default_bootnode { let base_path = base_path(&self.params.shared_params, self.version); - let cfg = sc_service::Configuration::::default_with_spec_and_base_path(spec.clone(), Some(base_path)); + let cfg = sc_service::Configuration::::default_with_spec_and_base_path( + spec.clone(), + Some(base_path), + ); let node_key = node_key_config( self.params.node_key_params, &Some(cfg.in_chain_config_dir(DEFAULT_NETWORK_CONFIG_PATH).expect("We provided a base_path")) @@ -750,26 +753,33 @@ fn input_keystore_password() -> Result { } /// Fill the password field of the given config instance. -fn fill_config_keystore_password( +fn fill_config_keystore_password_and_path( config: &mut sc_service::Configuration, cli: &RunCmd, ) -> Result<(), String> { - if let KeystoreConfig::Path { password, .. } = &mut config.keystore { - *password = if cli.password_interactive { - #[cfg(not(target_os = "unknown"))] - { - Some(input_keystore_password()?.into()) - } - #[cfg(target_os = "unknown")] - None - } else if let Some(ref file) = cli.password_filename { - Some(fs::read_to_string(file).map_err(|e| format!("{}", e))?.into()) - } else if let Some(ref password) = cli.password { - Some(password.clone().into()) - } else { - None - }; - } + let password = if cli.password_interactive { + #[cfg(not(target_os = "unknown"))] + { + Some(input_keystore_password()?.into()) + } + #[cfg(target_os = "unknown")] + None + } else if let Some(ref file) = cli.password_filename { + Some(fs::read_to_string(file).map_err(|e| format!("{}", e))?.into()) + } else if let Some(ref password) = cli.password { + Some(password.clone().into()) + } else { + None + }; + + let path = cli.keystore_path.clone().or( + config.in_chain_config_dir(DEFAULT_KEYSTORE_CONFIG_PATH) + ); + + config.keystore = KeystoreConfig::Path { + path: path.ok_or_else(|| "No `base_path` provided to create keystore path!")?, + password, + }; Ok(()) } @@ -840,7 +850,7 @@ where { let mut config = create_config_with_db_path(spec_factory, &cli.shared_params, &version)?; - fill_config_keystore_password(&mut config, &cli)?; + fill_config_keystore_password_and_path(&mut config, &cli)?; let is_dev = cli.shared_params.dev; let is_authority = cli.validator || cli.sentry || is_dev || cli.keyring.account.is_some(); @@ -875,12 +885,6 @@ where )? } - let default_keystore_path = config.in_chain_config_dir(DEFAULT_KEYSTORE_CONFIG_PATH); - - if let KeystoreConfig::Path { path, ..} = &mut config.keystore { - *path = cli.keystore_path.or(default_keystore_path); - } - // set sentry mode (i.e. act as an authority but **never** actively participate) config.sentry_mode = cli.sentry; @@ -1205,4 +1209,48 @@ mod tests { assert!(no_config_dir().is_ok()); assert!(some_config_dir("x".to_string()).is_ok()); } + + #[test] + fn keystore_path_is_generated_correctly() { + let chain_spec = ChainSpec::from_genesis( + "test", + "test-id", + || (), + Vec::new(), + None, + None, + None, + None, + ); + + let version_info = VersionInfo { + name: "test", + version: "42", + commit: "234234", + executable_name: "test", + description: "cool test", + author: "universe", + support_url: "com", + }; + + for keystore_path in vec![None, Some("/keystore/path")] { + let mut run_cmds = RunCmd::from_args(); + run_cmds.shared_params.base_path = Some(PathBuf::from("/test/path")); + run_cmds.keystore_path = keystore_path.clone().map(PathBuf::from); + + let node_config = create_run_node_config::<(), _, _, _>( + run_cmds.clone(), + |_| Ok(Some(chain_spec.clone())), + "test", + &version_info, + ).unwrap(); + + let expected_path = match keystore_path { + Some(path) => PathBuf::from(path), + None => PathBuf::from("/test/path/chains/test-id/keystore"), + }; + + assert_eq!(expected_path, node_config.keystore.path().unwrap().to_owned()); + } + } } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 3a3702bc19..6eb0259b79 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -165,10 +165,11 @@ fn new_full_parts( { let keystore = match &config.keystore { KeystoreConfig::Path { path, password } => Keystore::open( - path.clone().ok_or("No basepath configured")?, + path.clone(), password.clone() )?, - KeystoreConfig::InMemory => Keystore::new_in_memory() + KeystoreConfig::InMemory => Keystore::new_in_memory(), + KeystoreConfig::None => return Err("No keystore config provided!".into()), }; let executor = NativeExecutor::::new( @@ -289,10 +290,11 @@ where TGen: RuntimeGenesis, TCSExt: Extension { >, Error> { let keystore = match &config.keystore { KeystoreConfig::Path { path, password } => Keystore::open( - path.clone().ok_or("No basepath configured")?, + path.clone(), password.clone() )?, - KeystoreConfig::InMemory => Keystore::new_in_memory() + KeystoreConfig::InMemory => Keystore::new_in_memory(), + KeystoreConfig::None => return Err("No keystore config provided!".into()), }; let executor = NativeExecutor::::new( diff --git a/client/service/src/config.rs b/client/service/src/config.rs index 94872129df..75c6268214 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -21,7 +21,7 @@ pub use sc_client_db::{kvdb::KeyValueDB, PruningMode}; pub use sc_network::config::{ExtTransport, NetworkConfiguration, Roles}; pub use sc_executor::WasmExecutionMethod; -use std::{path::PathBuf, net::SocketAddr, sync::Arc}; +use std::{path::{PathBuf, Path}, net::SocketAddr, sync::Arc}; pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; use sc_chain_spec::{ChainSpec, RuntimeGenesis, Extension, NoExtension}; use sp_core::crypto::Protected; @@ -107,10 +107,12 @@ pub struct Configuration { /// Configuration of the client keystore. #[derive(Clone)] pub enum KeystoreConfig { + /// No config supplied. + None, /// Keystore at a path on-disk. Recommended for native nodes. Path { - /// The path of the keystore. Will panic if no path is specified. - path: Option, + /// The path of the keystore. + path: PathBuf, /// Node keystore's password. password: Option> }, @@ -118,6 +120,16 @@ pub enum KeystoreConfig { InMemory } +impl KeystoreConfig { + /// Returns the path for the keystore. + pub fn path(&self) -> Option<&Path> { + match self { + Self::Path { path, .. } => Some(&path), + Self::None | Self::InMemory => None, + } + } +} + /// Configuration of the database of the client. #[derive(Clone)] pub enum DatabaseConfig { @@ -150,10 +162,7 @@ impl Configuration where roles: Roles::FULL, transaction_pool: Default::default(), network: Default::default(), - keystore: KeystoreConfig::Path { - path: config_dir.map(|c| c.join("keystore")), - password: None - }, + keystore: KeystoreConfig::None, database: DatabaseConfig::Path { path: Default::default(), cache_size: Default::default(), diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index d76064300c..06a1edd189 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -174,7 +174,7 @@ fn node_config ( transaction_pool: Default::default(), network: network_config, keystore: KeystoreConfig::Path { - path: Some(root.join("key")), + path: root.join("key"), password: None }, config_dir: Some(root.clone()), diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 198f55869e..c010ea0456 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -165,6 +165,16 @@ impl BuildStorage for sp_core::storage::Storage { } } +#[cfg(feature = "std")] +impl BuildStorage for () { + fn assimilate_storage( + &self, + _: &mut sp_core::storage::Storage, + )-> Result<(), String> { + Err("`assimilate_storage` not implemented for `()`".into()) + } +} + /// Consensus engine unique ID. pub type ConsensusEngineId = [u8; 4]; diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs index fd4ad9f69e..e404c66129 100644 --- a/utils/browser/src/lib.rs +++ b/utils/browser/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. +// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -18,13 +18,13 @@ use futures01::sync::mpsc as mpsc01; use log::{debug, info}; use std::sync::Arc; use service::{ - AbstractService, RpcSession, Roles, Configuration, config::{DatabaseConfig, KeystoreConfig}, - ChainSpec, RuntimeGenesis + AbstractService, RpcSession, Roles, Configuration, config::{DatabaseConfig, KeystoreConfig}, + ChainSpec, RuntimeGenesis }; use wasm_bindgen::prelude::*; use futures::{ - TryFutureExt as _, FutureExt as _, Stream as _, Future as _, TryStreamExt as _, - channel::{oneshot, mpsc}, future::{poll_fn, ok}, compat::*, + TryFutureExt as _, FutureExt as _, Stream as _, Future as _, TryStreamExt as _, + channel::{oneshot, mpsc}, future::{poll_fn, ok}, compat::*, }; use std::task::Poll; use std::pin::Pin; @@ -38,136 +38,136 @@ pub use console_log::init_with_level as init_console_log; /// /// This configuration contains good defaults for a browser light client. pub async fn browser_configuration( - transport: Transport, - chain_spec: ChainSpec, + transport: Transport, + chain_spec: ChainSpec, ) -> Result, Box> where - C: Default, - G: RuntimeGenesis, - E: Extension, + C: Default, + G: RuntimeGenesis, + E: Extension, { - let name = chain_spec.name().to_string(); - - let transport = ExtTransport::new(transport); - let mut config = Configuration::default_with_spec_and_base_path(chain_spec, None); - config.network.transport = network::config::TransportConfig::Normal { - wasm_external_transport: Some(transport.clone()), - allow_private_ipv4: true, - enable_mdns: false, - }; - config.telemetry_external_transport = Some(transport); - config.roles = Roles::LIGHT; - config.name = format!("{} (Browser)", name); - config.database = { - info!("Opening Indexed DB database '{}'...", name); - let db = kvdb_web::Database::open(name, 10) - .await?; - DatabaseConfig::Custom(Arc::new(db)) - }; - config.keystore = KeystoreConfig::InMemory; - - Ok(config) + let name = chain_spec.name().to_string(); + + let transport = ExtTransport::new(transport); + let mut config = Configuration::default_with_spec_and_base_path(chain_spec, None); + config.network.transport = network::config::TransportConfig::Normal { + wasm_external_transport: Some(transport.clone()), + allow_private_ipv4: true, + enable_mdns: false, + }; + config.telemetry_external_transport = Some(transport); + config.roles = Roles::LIGHT; + config.name = format!("{} (Browser)", name); + config.database = { + info!("Opening Indexed DB database '{}'...", name); + let db = kvdb_web::Database::open(name, 10) + .await?; + DatabaseConfig::Custom(Arc::new(db)) + }; + config.keystore = KeystoreConfig::InMemory; + + Ok(config) } /// A running client. #[wasm_bindgen] pub struct Client { - rpc_send_tx: mpsc::UnboundedSender, + rpc_send_tx: mpsc::UnboundedSender, } struct RpcMessage { - rpc_json: String, - session: RpcSession, - send_back: oneshot::Sender> + Send>>>, + rpc_json: String, + session: RpcSession, + send_back: oneshot::Sender> + Send>>>, } /// Create a Client object that connects to a service. pub fn start_client(service: impl AbstractService) -> Client { - let mut service = service.compat(); - // We dispatch a background task responsible for processing the service. - // - // The main action performed by the code below consists in polling the service with - // `service.poll()`. - // The rest consists in handling RPC requests. - let (rpc_send_tx, mut rpc_send_rx) = mpsc::unbounded::(); - wasm_bindgen_futures::spawn_local(poll_fn(move |cx| { - loop { - match Pin::new(&mut rpc_send_rx).poll_next(cx) { - Poll::Ready(Some(message)) => { - let fut = service.get_ref() - .rpc_query(&message.session, &message.rpc_json) - .compat() - .unwrap_or_else(|_| None) - .boxed(); - let _ = message.send_back.send(fut); - }, - Poll::Pending => break, - Poll::Ready(None) => return Poll::Ready(()), - } - } - - Pin::new(&mut service) - .poll(cx) - .map(drop) - })); - - Client { - rpc_send_tx, - } + let mut service = service.compat(); + // We dispatch a background task responsible for processing the service. + // + // The main action performed by the code below consists in polling the service with + // `service.poll()`. + // The rest consists in handling RPC requests. + let (rpc_send_tx, mut rpc_send_rx) = mpsc::unbounded::(); + wasm_bindgen_futures::spawn_local(poll_fn(move |cx| { + loop { + match Pin::new(&mut rpc_send_rx).poll_next(cx) { + Poll::Ready(Some(message)) => { + let fut = service.get_ref() + .rpc_query(&message.session, &message.rpc_json) + .compat() + .unwrap_or_else(|_| None) + .boxed(); + let _ = message.send_back.send(fut); + }, + Poll::Pending => break, + Poll::Ready(None) => return Poll::Ready(()), + } + } + + Pin::new(&mut service) + .poll(cx) + .map(drop) + })); + + Client { + rpc_send_tx, + } } #[wasm_bindgen] impl Client { - /// Allows starting an RPC request. Returns a `Promise` containing the result of that request. - #[wasm_bindgen(js_name = "rpcSend")] - pub fn rpc_send(&mut self, rpc: &str) -> js_sys::Promise { - let rpc_session = RpcSession::new(mpsc01::channel(1).0); - let (tx, rx) = oneshot::channel(); - let _ = self.rpc_send_tx.unbounded_send(RpcMessage { - rpc_json: rpc.to_owned(), - session: rpc_session, - send_back: tx, - }); - wasm_bindgen_futures::future_to_promise(async { - match rx.await { - Ok(fut) => { - fut.await - .map(|s| JsValue::from_str(&s)) - .ok_or_else(|| JsValue::NULL) - }, - Err(_) => Err(JsValue::NULL) - } - }) - } - - /// Subscribes to an RPC pubsub endpoint. - #[wasm_bindgen(js_name = "rpcSubscribe")] - pub fn rpc_subscribe(&mut self, rpc: &str, callback: js_sys::Function) { - let (tx, rx) = mpsc01::channel(4); - let rpc_session = RpcSession::new(tx); - let (fut_tx, fut_rx) = oneshot::channel(); - let _ = self.rpc_send_tx.unbounded_send(RpcMessage { - rpc_json: rpc.to_owned(), - session: rpc_session.clone(), - send_back: fut_tx, - }); - wasm_bindgen_futures::spawn_local(async { - if let Ok(fut) = fut_rx.await { - fut.await; - } - }); - - wasm_bindgen_futures::spawn_local(async move { - let _ = rx.compat() - .try_for_each(|s| { - let _ = callback.call1(&callback, &JsValue::from_str(&s)); - ok(()) - }) - .await; - - // We need to keep `rpc_session` alive. - debug!("RPC subscription has ended"); - drop(rpc_session); - }); - } + /// Allows starting an RPC request. Returns a `Promise` containing the result of that request. + #[wasm_bindgen(js_name = "rpcSend")] + pub fn rpc_send(&mut self, rpc: &str) -> js_sys::Promise { + let rpc_session = RpcSession::new(mpsc01::channel(1).0); + let (tx, rx) = oneshot::channel(); + let _ = self.rpc_send_tx.unbounded_send(RpcMessage { + rpc_json: rpc.to_owned(), + session: rpc_session, + send_back: tx, + }); + wasm_bindgen_futures::future_to_promise(async { + match rx.await { + Ok(fut) => { + fut.await + .map(|s| JsValue::from_str(&s)) + .ok_or_else(|| JsValue::NULL) + }, + Err(_) => Err(JsValue::NULL) + } + }) + } + + /// Subscribes to an RPC pubsub endpoint. + #[wasm_bindgen(js_name = "rpcSubscribe")] + pub fn rpc_subscribe(&mut self, rpc: &str, callback: js_sys::Function) { + let (tx, rx) = mpsc01::channel(4); + let rpc_session = RpcSession::new(tx); + let (fut_tx, fut_rx) = oneshot::channel(); + let _ = self.rpc_send_tx.unbounded_send(RpcMessage { + rpc_json: rpc.to_owned(), + session: rpc_session.clone(), + send_back: fut_tx, + }); + wasm_bindgen_futures::spawn_local(async { + if let Ok(fut) = fut_rx.await { + fut.await; + } + }); + + wasm_bindgen_futures::spawn_local(async move { + let _ = rx.compat() + .try_for_each(|s| { + let _ = callback.call1(&callback, &JsValue::from_str(&s)); + ok(()) + }) + .await; + + // We need to keep `rpc_session` alive. + debug!("RPC subscription has ended"); + drop(rpc_session); + }); + } } -- GitLab From f84170a09165912d4f6f22f92dbd55f34aa927ec Mon Sep 17 00:00:00 2001 From: kaichao Date: Mon, 13 Jan 2020 13:16:05 +0800 Subject: [PATCH 100/296] remove duplicaate test. (#4607) --- primitives/arithmetic/src/per_things.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/primitives/arithmetic/src/per_things.rs b/primitives/arithmetic/src/per_things.rs index f10df9a1c2..554f3c3c21 100644 --- a/primitives/arithmetic/src/per_things.rs +++ b/primitives/arithmetic/src/per_things.rs @@ -299,7 +299,6 @@ macro_rules! implement_per_thing { assert_eq!($name::from_percent(34) * 10u64, 3); assert_eq!($name::from_percent(35) * 10u64, 3); assert_eq!($name::from_percent(36) * 10u64, 4); - assert_eq!($name::from_percent(36) * 10u64, 4); } #[test] -- GitLab From 4646ff85f658bfb2fa9b75ca0bd12fac3a760492 Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Mon, 13 Jan 2020 20:48:34 +1300 Subject: [PATCH 101/296] Improve PaysFee trait and dispatch info logic in utility module (#4606) * pass target to PaysFee trait and allow batch call to be free if all its calls are free * bump version * fix error --- bin/node/runtime/src/lib.rs | 4 ++-- frame/evm/src/lib.rs | 4 ++-- frame/example/src/lib.rs | 4 ++-- frame/support/src/dispatch.rs | 10 +++++---- frame/support/src/weights.rs | 8 ++++---- frame/utility/src/lib.rs | 38 +++++++++++++++++++++-------------- 6 files changed, 39 insertions(+), 29 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index b3ff8b1628..4266ad7459 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 202, - impl_version: 202, + spec_version: 203, + impl_version: 203, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index 48b54a8c86..8d50412724 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -141,8 +141,8 @@ impl ClassifyDispatch for WeightForCallCreate { } } -impl PaysFee for WeightForCallCreate { - fn pays_fee(&self) -> bool { +impl PaysFee for WeightForCallCreate { + fn pays_fee(&self, _: T) -> bool { true } } diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index 853674f6fd..80569a1b57 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -301,8 +301,8 @@ impl ClassifyDispatch<(&BalanceOf,)> for WeightFor } } -impl PaysFee for WeightForSetDummy { - fn pays_fee(&self) -> bool { +impl PaysFee<(&BalanceOf,)> for WeightForSetDummy { + fn pays_fee(&self, _target: (&BalanceOf,)) -> bool { true } } diff --git a/frame/support/src/dispatch.rs b/frame/support/src/dispatch.rs index 7d3750d9d4..b2d7e6e1d4 100644 --- a/frame/support/src/dispatch.rs +++ b/frame/support/src/dispatch.rs @@ -1312,8 +1312,9 @@ macro_rules! decl_module { &$weight, ($( $param_name, )*) ); - let pays_fee = ::pays_fee( - &$weight + let pays_fee = >::pays_fee( + &$weight, + ($( $param_name, )*) ); return $crate::dispatch::DispatchInfo { weight, class, pays_fee }; } @@ -1331,8 +1332,9 @@ macro_rules! decl_module { &$crate::dispatch::SimpleDispatchInfo::default(), () ); - let pays_fee = ::pays_fee( - &$crate::dispatch::SimpleDispatchInfo::default() + let pays_fee = >::pays_fee( + &$crate::dispatch::SimpleDispatchInfo::default(), + () ); $crate::dispatch::DispatchInfo { weight, class, pays_fee } diff --git a/frame/support/src/weights.rs b/frame/support/src/weights.rs index b4b70def1d..f1092b5002 100644 --- a/frame/support/src/weights.rs +++ b/frame/support/src/weights.rs @@ -78,8 +78,8 @@ pub trait WeighBlock { /// Indicates if dispatch function should pay fees or not. /// If set to false, the block resource limits are applied, yet no fee is deducted. -pub trait PaysFee { - fn pays_fee(&self) -> bool { +pub trait PaysFee { + fn pays_fee(&self, _target: T) -> bool { true } } @@ -208,8 +208,8 @@ impl ClassifyDispatch for SimpleDispatchInfo { } } -impl PaysFee for SimpleDispatchInfo { - fn pays_fee(&self) -> bool { +impl PaysFee for SimpleDispatchInfo { + fn pays_fee(&self, _: T) -> bool { match self { SimpleDispatchInfo::FixedNormal(_) => true, SimpleDispatchInfo::MaxNormal => true, diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index 1f7e861373..9ab2975e29 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -204,9 +204,9 @@ impl ClassifyDispatch<(&u16, &Box)> for Passthrough call.get_dispatch_info().class } } -impl PaysFee for Passthrough { - fn pays_fee(&self) -> bool { - true +impl PaysFee<(&u16, &Box)> for Passthrough { + fn pays_fee(&self, (_, call): (&u16, &Box)) -> bool { + call.get_dispatch_info().pays_fee } } @@ -226,13 +226,21 @@ impl WeighData<(&Vec,)> for BatchPassthrough } } impl ClassifyDispatch<(&Vec,)> for BatchPassthrough { - fn classify_dispatch(&self, (_,): (&Vec,)) -> DispatchClass { - DispatchClass::Normal + fn classify_dispatch(&self, (calls,): (&Vec,)) -> DispatchClass { + let all_operational = calls.iter() + .map(|call| call.get_dispatch_info().class) + .all(|class| class == DispatchClass::Operational); + if all_operational { + DispatchClass::Operational + } else { + DispatchClass::Normal + } } } -impl PaysFee for BatchPassthrough { - fn pays_fee(&self) -> bool { - true +impl PaysFee<(&Vec,)> for BatchPassthrough { + fn pays_fee(&self, (calls,): (&Vec,)) -> bool { + calls.iter() + .any(|call| call.get_dispatch_info().pays_fee) } } @@ -254,16 +262,16 @@ for MultiPassthrough impl ClassifyDispatch<(&u16, &Vec, &Timepoint, &Box)> for MultiPassthrough { - fn classify_dispatch(&self, (_, _, _, _): (&u16, &Vec, &Timepoint, &Box)) + fn classify_dispatch(&self, (_, _, _, call): (&u16, &Vec, &Timepoint, &Box)) -> DispatchClass { - DispatchClass::Normal + call.get_dispatch_info().class } } -impl PaysFee +impl PaysFee<(&u16, &Vec, &Timepoint, &Box)> for MultiPassthrough { - fn pays_fee(&self) -> bool { + fn pays_fee(&self, _: (&u16, &Vec, &Timepoint, &Box)) -> bool { true } } @@ -286,16 +294,16 @@ for SigsLen impl ClassifyDispatch<(&u16, &Vec, &Timepoint, &[u8; 32])> for SigsLen { - fn classify_dispatch(&self, (_, _, _, _): (&u16, &Vec, &Timepoint, &[u8; 32])) + fn classify_dispatch(&self, _: (&u16, &Vec, &Timepoint, &[u8; 32])) -> DispatchClass { DispatchClass::Normal } } -impl PaysFee +impl PaysFee<(&u16, &Vec, &Timepoint, &[u8; 32])> for SigsLen { - fn pays_fee(&self) -> bool { + fn pays_fee(&self, _: (&u16, &Vec, &Timepoint, &[u8; 32])) -> bool { true } } -- GitLab From e8ba500a9943a06a84e221643c96a55317df8c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Mon, 13 Jan 2020 07:51:48 +0000 Subject: [PATCH 102/296] fork tree: rebalance fork tree by max fork depth (#4605) * fork-tree: rebalance fork tree by maximum branch height * fork-tree: add docs for tree rebalancing * fork-tree: add test * babe: rebalance epoch changes tree on deserialization * fork-tree: fix doc * fork-tree: fix test --- client/consensus/babe/src/aux_schema.rs | 6 ++ client/consensus/babe/src/epoch_changes.rs | 6 ++ utils/fork-tree/src/lib.rs | 75 ++++++++++++++++++++-- 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/client/consensus/babe/src/aux_schema.rs b/client/consensus/babe/src/aux_schema.rs index a2ee053063..170c2bf42d 100644 --- a/client/consensus/babe/src/aux_schema.rs +++ b/client/consensus/babe/src/aux_schema.rs @@ -59,6 +59,12 @@ pub(crate) fn load_epoch_changes( SharedEpochChanges::new() }); + // rebalance the tree after deserialization. this isn't strictly necessary + // since the tree is now rebalanced on every update operation. but since the + // tree wasn't rebalanced initially it's useful to temporarily leave it here + // to avoid having to wait until an import for rebalancing. + epoch_changes.lock().rebalance(); + Ok(epoch_changes) } diff --git a/client/consensus/babe/src/epoch_changes.rs b/client/consensus/babe/src/epoch_changes.rs index 6e35546949..01e957c499 100644 --- a/client/consensus/babe/src/epoch_changes.rs +++ b/client/consensus/babe/src/epoch_changes.rs @@ -185,6 +185,12 @@ impl EpochChanges where EpochChanges { inner: ForkTree::new() } } + /// Rebalances the tree of epoch changes so that it is sorted by length of + /// fork (longest fork first). + pub fn rebalance(&mut self) { + self.inner.rebalance() + } + /// Prune out finalized epochs, except for the ancestor of the finalized /// block. The given slot should be the slot number at which the finalized /// block was authored. diff --git a/utils/fork-tree/src/lib.rs b/utils/fork-tree/src/lib.rs index 7bdb2d2dbc..1aa085c3da 100644 --- a/utils/fork-tree/src/lib.rs +++ b/utils/fork-tree/src/lib.rs @@ -19,6 +19,7 @@ #![warn(missing_docs)] +use std::cmp::Reverse; use std::fmt; use codec::{Decode, Encode}; @@ -124,6 +125,8 @@ impl ForkTree where self.roots = vec![root]; } + self.rebalance(); + Ok(()) } } @@ -140,6 +143,22 @@ impl ForkTree where } } + /// Rebalance the tree, i.e. sort child nodes by max branch depth + /// (decreasing). + /// + /// Most operations in the tree are performed with depth-first search + /// starting from the leftmost node at every level, since this tree is meant + /// to be used in a blockchain context, a good heuristic is that the node + /// we'll be looking + /// for at any point will likely be in one of the deepest chains (i.e. the + /// longest ones). + pub fn rebalance(&mut self) { + self.roots.sort_by_key(|n| Reverse(n.max_depth())); + for root in &mut self.roots { + root.rebalance(); + } + } + /// Import a new node into the tree. The given function `is_descendent_of` /// should return `true` if the second hash (target) is a descendent of the /// first hash (base). This method assumes that nodes in the same branch are @@ -184,6 +203,8 @@ impl ForkTree where children: Vec::new(), }); + self.rebalance(); + Ok(true) } @@ -523,6 +544,25 @@ mod node_implementation { } impl Node { + /// Rebalance the tree, i.e. sort child nodes by max branch depth (decreasing). + pub fn rebalance(&mut self) { + self.children.sort_by_key(|n| Reverse(n.max_depth())); + for child in &mut self.children { + child.rebalance(); + } + } + + /// Finds the max depth among all branches descendent from this node. + pub fn max_depth(&self) -> usize { + let mut max = 0; + + for node in &self.children { + max = node.max_depth().max(max) + } + + max + 1 + } + pub fn import( &mut self, mut hash: H, @@ -638,7 +678,10 @@ impl<'a, H, N, V> Iterator for ForkTreeIterator<'a, H, N, V> { fn next(&mut self) -> Option { self.stack.pop().map(|node| { - self.stack.extend(node.children.iter()); + // child nodes are stored ordered by max branch height (decreasing), + // we want to keep this ordering while iterating but since we're + // using a stack for iterator state we need to reverse it. + self.stack.extend(node.children.iter().rev()); node }) } @@ -1091,12 +1134,12 @@ mod test { tree.iter().map(|(h, n, _)| (h.clone(), n.clone())).collect::>(), vec![ ("A", 1), - ("J", 2), ("K", 3), - ("F", 2), ("H", 3), ("L", 4), ("O", 5), - ("M", 5), - ("I", 4), - ("G", 3), ("B", 2), ("C", 3), ("D", 4), ("E", 5), + ("F", 2), + ("G", 3), + ("H", 3), ("I", 4), + ("L", 4), ("M", 5), ("O", 5), + ("J", 2), ("K", 3) ], ); } @@ -1261,4 +1304,24 @@ mod test { assert_eq!(node.unwrap().hash, "B"); } + + #[test] + fn tree_rebalance() { + let (mut tree, _) = test_fork_tree(); + + assert_eq!( + tree.iter().map(|(h, _, _)| *h).collect::>(), + vec!["A", "B", "C", "D", "E", "F", "G", "H", "I", "L", "M", "O", "J", "K"], + ); + + // after rebalancing the tree we should iterate in preorder exploring + // the longest forks first. check the ascii art above to understand the + // expected output below. + tree.rebalance(); + + assert_eq!( + tree.iter().map(|(h, _, _)| *h).collect::>(), + ["A", "B", "C", "D", "E", "F", "H", "L", "M", "O", "I", "G", "J", "K"] + ); + } } -- GitLab From 8be0d69ec41d57a60891f58eb4bd02237200fc32 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Mon, 13 Jan 2020 08:52:11 +0100 Subject: [PATCH 103/296] Fixed state pinning in state-db (#4557) * Account for references when pinning * Fixed pinned state issues * Fixes --- client/state-db/src/noncanonical.rs | 152 +++++++++++++++++++++++----- 1 file changed, 124 insertions(+), 28 deletions(-) diff --git a/client/state-db/src/noncanonical.rs b/client/state-db/src/noncanonical.rs index 5db47cc219..373c1aa0da 100644 --- a/client/state-db/src/noncanonical.rs +++ b/client/state-db/src/noncanonical.rs @@ -37,7 +37,9 @@ pub struct NonCanonicalOverlay { pending_canonicalizations: Vec, pending_insertions: Vec, values: HashMap, //ref counted - pinned: HashMap>, //would be deleted but kept around because block is pinned + //would be deleted but kept around because block is pinned, ref counted. + pinned: HashMap, + pinned_insertions: HashMap>, } #[derive(Encode, Decode)] @@ -68,21 +70,14 @@ fn insert_values(values: &mut HashMap, inserted: } } -fn discard_values( - values: &mut HashMap, - inserted: Vec, - mut into: Option<&mut HashMap>, -) { +fn discard_values(values: &mut HashMap, inserted: Vec) { for k in inserted { match values.entry(k) { Entry::Occupied(mut e) => { let (ref mut counter, _) = e.get_mut(); *counter -= 1; if *counter == 0 { - let (key, (_, value)) = e.remove_entry(); - if let Some(ref mut into) = into { - into.insert(key, value); - } + e.remove_entry(); } }, Entry::Vacant(_) => { @@ -97,7 +92,8 @@ fn discard_descendants( mut values: &mut HashMap, index: usize, parents: &mut HashMap, - pinned: &mut HashMap>, + pinned: &HashMap, + pinned_insertions: &mut HashMap>, hash: &BlockHash, ) { let mut discarded = Vec::new(); @@ -105,9 +101,15 @@ fn discard_descendants( *level = level.drain(..).filter_map(|overlay| { let parent = parents.get(&overlay.hash).expect("there is a parent entry for each entry in levels; qed").clone(); if parent == *hash { - parents.remove(&overlay.hash); - discarded.push(overlay.hash); - discard_values(&mut values, overlay.inserted, pinned.get_mut(hash)); + discarded.push(overlay.hash.clone()); + if pinned.contains_key(&overlay.hash) { + // save to be discarded later. + pinned_insertions.insert(overlay.hash.clone(), overlay.inserted); + } else { + // discard immediatelly. + parents.remove(&overlay.hash); + discard_values(&mut values, overlay.inserted); + } None } else { Some(overlay) @@ -115,7 +117,7 @@ fn discard_descendants( }).collect(); } for hash in discarded { - discard_descendants(levels, values, index + 1, parents, pinned, &hash); + discard_descendants(levels, values, index + 1, parents, pinned, pinned_insertions, &hash); } } @@ -176,6 +178,7 @@ impl NonCanonicalOverlay { pending_canonicalizations: Default::default(), pending_insertions: Default::default(), pinned: Default::default(), + pinned_insertions: Default::default(), values: values, }) } @@ -339,18 +342,23 @@ impl NonCanonicalOverlay { // discard unfinalized overlays and values for (i, overlay) in level.into_iter().enumerate() { - self.parents.remove(&overlay.hash); if i != index { discard_descendants( &mut self.levels, &mut self.values, 0, &mut self.parents, - &mut self.pinned, + &self.pinned, + &mut self.pinned_insertions, &overlay.hash, ); } - discard_values(&mut self.values, overlay.inserted, self.pinned.get_mut(&overlay.hash)); + if self.pinned.contains_key(&overlay.hash) { + self.pinned_insertions.insert(overlay.hash.clone(), overlay.inserted); + } else { + self.parents.remove(&overlay.hash); + discard_values(&mut self.values, overlay.inserted); + } } } if let Some(hash) = last { @@ -364,11 +372,6 @@ impl NonCanonicalOverlay { if let Some((_, value)) = self.values.get(&key) { return Some(value.clone()); } - for pinned in self.pinned.values() { - if let Some(value) = pinned.get(&key) { - return Some(value.clone()); - } - } None } @@ -385,7 +388,7 @@ impl NonCanonicalOverlay { for overlay in level.into_iter() { commit.meta.deleted.push(overlay.journal_key); self.parents.remove(&overlay.hash); - discard_values(&mut self.values, overlay.inserted, None); + discard_values(&mut self.values, overlay.inserted); } commit }) @@ -402,7 +405,7 @@ impl NonCanonicalOverlay { .expect("Hash is added in insert"); let overlay = self.levels[level_index].pop().expect("Empty levels are not allowed in self.levels"); - discard_values(&mut self.values, overlay.inserted, None); + discard_values(&mut self.values, overlay.inserted); if self.levels[level_index].is_empty() { debug_assert_eq!(level_index, self.levels.len() - 1); self.levels.pop_back(); @@ -424,12 +427,43 @@ impl NonCanonicalOverlay { /// Pin state values in memory pub fn pin(&mut self, hash: &BlockHash) { - self.pinned.insert(hash.clone(), HashMap::default()); + if self.pending_insertions.contains(hash) { + debug_assert!(false, "Trying to pin pending state"); + return; + } + // Also pin all parents + let mut parent = Some(hash); + while let Some(hash) = parent { + let refs = self.pinned.entry(hash.clone()).or_default(); + if *refs == 0 { + trace!(target: "state-db", "Pinned non-canon block: {:?}", hash); + } + *refs += 1; + parent = self.parents.get(hash); + } } /// Discard pinned state pub fn unpin(&mut self, hash: &BlockHash) { - self.pinned.remove(hash); + // Also unpin all parents + let mut parent = Some(hash.clone()); + while let Some(hash) = parent { + parent = self.parents.get(&hash).cloned(); + match self.pinned.entry(hash.clone()) { + Entry::Occupied(mut entry) => { + *entry.get_mut() -= 1; + if *entry.get() == 0 { + entry.remove(); + if let Some(inserted) = self.pinned_insertions.remove(&hash) { + trace!(target: "state-db", "Discarding unpinned non-canon block: {:?}", hash); + discard_values(&mut self.values, inserted); + self.parents.remove(&hash); + } + } + }, + Entry::Vacant(_) => {}, + } + } } } @@ -801,7 +835,7 @@ mod tests { fn keeps_pinned() { let mut db = make_db(&[]); - // - 1 - 1_1 + // - 0 - 1_1 // \ 1_2 let (h_1, c_1) = (H256::random(), make_changeset(&[1], &[])); @@ -810,6 +844,7 @@ mod tests { let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); db.commit(&overlay.insert::(&h_1, 1, &H256::default(), c_1).unwrap()); db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); + overlay.apply_pending(); overlay.pin(&h_1); @@ -821,4 +856,65 @@ mod tests { overlay.unpin(&h_1); assert!(!contains(&overlay, 1)); } + + #[test] + fn keeps_pinned_ref_count() { + let mut db = make_db(&[]); + + // - 0 - 1_1 + // \ 1_2 + // \ 1_3 + + // 1_1 and 1_2 both make the same change + let (h_1, c_1) = (H256::random(), make_changeset(&[1], &[])); + let (h_2, c_2) = (H256::random(), make_changeset(&[1], &[])); + let (h_3, c_3) = (H256::random(), make_changeset(&[], &[])); + + let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); + db.commit(&overlay.insert::(&h_1, 1, &H256::default(), c_1).unwrap()); + db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); + db.commit(&overlay.insert::(&h_3, 1, &H256::default(), c_3).unwrap()); + overlay.apply_pending(); + + overlay.pin(&h_1); + + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_3, &mut commit).unwrap(); + db.commit(&commit); + overlay.apply_pending(); // 1_2 should be discarded, 1_1 is pinned + + assert!(contains(&overlay, 1)); + overlay.unpin(&h_1); + assert!(!contains(&overlay, 1)); + } + + #[test] + fn pin_keeps_parent() { + let mut db = make_db(&[]); + + // - 0 - 1_1 - 2_1 + // \ 1_2 + + let (h_11, c_11) = (H256::random(), make_changeset(&[1], &[])); + let (h_12, c_12) = (H256::random(), make_changeset(&[], &[])); + let (h_21, c_21) = (H256::random(), make_changeset(&[], &[])); + + let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); + db.commit(&overlay.insert::(&h_11, 1, &H256::default(), c_11).unwrap()); + db.commit(&overlay.insert::(&h_12, 1, &H256::default(), c_12).unwrap()); + db.commit(&overlay.insert::(&h_21, 2, &h_11, c_21).unwrap()); + overlay.apply_pending(); + + overlay.pin(&h_21); + + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_12, &mut commit).unwrap(); + db.commit(&commit); + overlay.apply_pending(); // 1_1 and 2_1 should be both pinned + + assert!(contains(&overlay, 1)); + overlay.unpin(&h_21); + assert!(!contains(&overlay, 1)); + assert!(overlay.pinned.is_empty()); + } } -- GitLab From bd540a67464ccfd24e0fec9081171dab7857183e Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 13 Jan 2020 11:10:39 +0300 Subject: [PATCH 104/296] State-db I/o metrics (#4562) * add usage mod to sp-state-machine * State usage tracking finalized. * fix spaces * add license preamble * imporove output * review suggestions * update naming * merge fixes * Update client/db/src/light.rs Co-Authored-By: Gavin Wood Co-authored-by: Gavin Wood --- client/api/src/client.rs | 8 +- client/db/src/lib.rs | 33 +++++++- client/db/src/light.rs | 3 + client/db/src/stats.rs | 102 ++++++++++++++++++++++++ client/db/src/storage_cache.rs | 24 +++++- primitives/state-machine/src/backend.rs | 25 +++++- primitives/state-machine/src/lib.rs | 2 + primitives/state-machine/src/stats.rs | 62 ++++++++++++++ 8 files changed, 248 insertions(+), 11 deletions(-) create mode 100644 client/db/src/stats.rs create mode 100644 primitives/state-machine/src/stats.rs diff --git a/client/api/src/client.rs b/client/api/src/client.rs index 78a70bd5ea..65952ce787 100644 --- a/client/api/src/client.rs +++ b/client/api/src/client.rs @@ -121,6 +121,10 @@ pub struct IoInfo { pub reads: u64, /// Average size of the transaction. pub average_transaction_size: u64, + /// State reads (keys) + pub state_reads: u64, + /// State reads (keys) from cache. + pub state_reads_cache: u64, } /// Usage statistics for running client instance. @@ -139,13 +143,15 @@ pub struct UsageInfo { impl fmt::Display for UsageInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, - "caches: ({} state, {} db overlay), i/o: ({} tx, {} write, {} read, {} tx size)", + "caches: ({} state, {} db overlay), i/o: ({} tx, {} write, {} read, {} avg tx, {}/{} key cache reads/total)", self.memory.state_cache, self.memory.database_cache, self.io.transactions, self.io.bytes_written, self.io.bytes_read, self.io.average_transaction_size, + self.io.state_reads_cache, + self.io.state_reads, ) } } diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 3a7f090e60..06d0dc18ff 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -33,6 +33,7 @@ mod children; mod cache; mod storage_cache; mod utils; +mod stats; use std::sync::Arc; use std::path::PathBuf; @@ -63,13 +64,14 @@ use sp_runtime::traits::{ use sc_executor::RuntimeInfo; use sp_state_machine::{ DBValue, ChangesTrieTransaction, ChangesTrieCacheAction, ChangesTrieBuildCache, - backend::Backend as StateBackend, + backend::Backend as StateBackend, UsageInfo as StateUsageInfo, }; use crate::utils::{Meta, db_err, meta_keys, read_db, read_meta}; use sc_client::leaves::{LeafSet, FinalizationDisplaced}; use sc_state_db::StateDb; use sp_blockchain::{CachedHeaderMetadata, HeaderMetadata, HeaderMetadataCache}; use crate::storage_cache::{CachingState, SharedCache, new_shared_cache}; +use crate::stats::StateUsageStats; use log::{trace, debug, warn}; pub use sc_state_db::PruningMode; @@ -895,7 +897,8 @@ pub struct Backend { shared_cache: SharedCache, import_lock: RwLock<()>, is_archive: bool, - io_stats: FrozenForDuration, + io_stats: FrozenForDuration<(kvdb::IoStats, StateUsageInfo)>, + state_usage: StateUsageStats, } impl Backend { @@ -963,7 +966,8 @@ impl Backend { ), import_lock: Default::default(), is_archive: is_archive_pruning, - io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), kvdb::IoStats::empty()), + io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), (kvdb::IoStats::empty(), StateUsageInfo::empty())), + state_usage: StateUsageStats::new(), }) } @@ -1257,13 +1261,23 @@ impl Backend { let finalized = if operation.commit_state { let mut changeset: sc_state_db::ChangeSet> = sc_state_db::ChangeSet::default(); + let mut ops: u64 = 0; + let mut bytes: u64 = 0; for (key, (val, rc)) in operation.db_updates.drain() { if rc > 0 { + ops += 1; + bytes += key.len() as u64 + val.len() as u64; + changeset.inserted.push((key, val.to_vec())); } else if rc < 0 { + ops += 1; + bytes += key.len() as u64; + changeset.deleted.push(key); } } + self.state_usage.tally_writes(ops, bytes); + 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: sc_state_db::Error| sp_blockchain::Error::from(format!("State database error: {:?}", e)))?; @@ -1495,6 +1509,9 @@ impl sc_client_api::backend::Backend for Backend { fn commit_operation(&self, operation: Self::BlockImportOperation) -> ClientResult<()> { + let usage = operation.old_state.usage_info(); + self.state_usage.merge_sm(usage); + match self.try_commit_operation(operation) { Ok(_) => { self.storage.state_db.apply_pending(); @@ -1548,8 +1565,14 @@ impl sc_client_api::backend::Backend for Backend { Some(self.offchain_storage.clone()) } + fn usage_info(&self) -> Option { - let io_stats = self.io_stats.take_or_else(|| self.storage.db.io_stats(kvdb::IoStatsKind::SincePrevious)); + let (io_stats, state_stats) = self.io_stats.take_or_else(|| + ( + self.storage.db.io_stats(kvdb::IoStatsKind::SincePrevious), + self.state_usage.take(), + ) + ); let database_cache = parity_util_mem::malloc_size(&*self.storage.db); let state_cache = (*&self.shared_cache).lock().used_storage_cache_size(); @@ -1565,6 +1588,8 @@ impl sc_client_api::backend::Backend for Backend { writes: io_stats.writes, reads: io_stats.reads, average_transaction_size: io_stats.avg_transaction_size() as u64, + state_reads: state_stats.reads.ops, + state_reads_cache: state_stats.cache_reads.ops, }, }) } diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 7550daf894..8277f20b8d 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -580,6 +580,9 @@ impl LightBlockchainStorage for LightStorage writes: io_stats.writes, reads: io_stats.reads, average_transaction_size: io_stats.avg_transaction_size() as u64, + // Light client does not track those + state_reads: 0, + state_reads_cache: 0, } }) } diff --git a/client/db/src/stats.rs b/client/db/src/stats.rs new file mode 100644 index 0000000000..805a0f498f --- /dev/null +++ b/client/db/src/stats.rs @@ -0,0 +1,102 @@ +// Copyright 2017-2020 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 . + +//! Database usage statistics + +use std::sync::atomic::{AtomicU64, Ordering as AtomicOrdering}; + +/// Accumulated usage statistics for state queries. +pub struct StateUsageStats { + started: std::time::Instant, + reads: AtomicU64, + bytes_read: AtomicU64, + writes: AtomicU64, + bytes_written: AtomicU64, + reads_cache: AtomicU64, + bytes_read_cache: AtomicU64, +} + +impl StateUsageStats { + /// New empty usage stats. + pub fn new() -> Self { + Self { + started: std::time::Instant::now(), + reads: 0.into(), + bytes_read: 0.into(), + writes: 0.into(), + bytes_written: 0.into(), + reads_cache: 0.into(), + bytes_read_cache: 0.into(), + } + } + + /// Tally one read operation, of some length. + pub fn tally_read(&self, data_bytes: u64, cache: bool) { + self.reads.fetch_add(1, AtomicOrdering::Relaxed); + self.bytes_read.fetch_add(data_bytes, AtomicOrdering::Relaxed); + if cache { + self.reads_cache.fetch_add(1, AtomicOrdering::Relaxed); + self.bytes_read_cache.fetch_add(data_bytes, AtomicOrdering::Relaxed); + } + } + + /// Tally one key read. + pub fn tally_key_read(&self, key: &[u8], val: Option<&Vec>, cache: bool) { + self.tally_read(key.len() as u64 + val.as_ref().map(|x| x.len() as u64).unwrap_or(0), cache); + } + + /// Tally one child key read. + pub fn tally_child_key_read(&self, key: &(Vec, Vec), val: Option>, cache: bool) -> Option> { + self.tally_read(key.0.len() as u64 + key.1.len() as u64 + val.as_ref().map(|x| x.len() as u64).unwrap_or(0), cache); + val + } + + /// Tally some write operations, including their byte count. + pub fn tally_writes(&self, ops: u64, data_bytes: u64) { + self.writes.fetch_add(ops, AtomicOrdering::Relaxed); + self.bytes_written.fetch_add(data_bytes, AtomicOrdering::Relaxed); + } + + /// Merge state machine usage info. + pub fn merge_sm(&self, info: sp_state_machine::UsageInfo) { + self.reads.fetch_add(info.reads.ops, AtomicOrdering::Relaxed); + self.bytes_read.fetch_add(info.reads.bytes, AtomicOrdering::Relaxed); + self.writes.fetch_add(info.writes.ops, AtomicOrdering::Relaxed); + self.bytes_written.fetch_add(info.writes.bytes, AtomicOrdering::Relaxed); + self.reads_cache.fetch_add(info.cache_reads.ops, AtomicOrdering::Relaxed); + self.bytes_read_cache.fetch_add(info.cache_reads.bytes, AtomicOrdering::Relaxed); + } + + pub fn take(&self) -> sp_state_machine::UsageInfo { + use sp_state_machine::UsageUnit; + + fn unit(ops: &AtomicU64, bytes: &AtomicU64) -> UsageUnit { + UsageUnit { ops: ops.swap(0, AtomicOrdering::Relaxed), bytes: bytes.swap(0, AtomicOrdering::Relaxed) } + } + + sp_state_machine::UsageInfo { + reads: unit(&self.reads, &self.bytes_read), + writes: unit(&self.writes, &self.bytes_written), + cache_reads: unit(&self.reads_cache, &self.bytes_read_cache), + // TODO: Proper tracking state of memory footprint here requires + // imposing `MallocSizeOf` requirement on half of the codebase, + // so it is an open question how to do it better + memory: 0, + started: self.started, + span: self.started.elapsed(), + } + } +} diff --git a/client/db/src/storage_cache.rs b/client/db/src/storage_cache.rs index 1921dcc7af..4f7e906a0a 100644 --- a/client/db/src/storage_cache.rs +++ b/client/db/src/storage_cache.rs @@ -28,6 +28,7 @@ use sp_state_machine::{backend::Backend as StateBackend, TrieBackend}; use log::trace; use sc_client_api::backend::{StorageCollection, ChildStorageCollection}; use std::hash::Hash as StdHash; +use crate::stats::StateUsageStats; const STATE_CACHE_BLOCKS: usize = 12; @@ -296,6 +297,8 @@ pub struct CacheChanges { /// in `sync_cache` along with the change overlay. /// For non-canonical clones local cache and changes are dropped. pub struct CachingState>, B: BlockT> { + /// Usage statistics + usage: StateUsageStats, /// Backing state. state: S, /// Cache data. @@ -421,6 +424,7 @@ impl>, B: BlockT> CachingState { /// Create a new instance wrapping generic State and shared cache. pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> Self { CachingState { + usage: StateUsageStats::new(), state, cache: CacheChanges { shared_cache, @@ -495,18 +499,22 @@ impl>, B: BlockT> StateBackend> for Ca // 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: {:?}", HexDisplay::from(&key)); + self.usage.tally_key_read(key, entry.as_ref(), true); + return Ok(entry) } let mut cache = self.cache.shared_cache.lock(); 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: {:?}", HexDisplay::from(&key)); + self.usage.tally_key_read(key, entry.as_ref(), true); return Ok(entry) } } trace!("Cache miss: {:?}", HexDisplay::from(&key)); let value = self.state.storage(key)?; RwLockUpgradableReadGuard::upgrade(local_cache).storage.insert(key.to_vec(), value.clone()); + self.usage.tally_key_read(key, value.as_ref(), false); Ok(value) } @@ -539,17 +547,25 @@ impl>, B: BlockT> StateBackend> for Ca 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) + return Ok( + self.usage.tally_child_key_read(&key, entry, true) + ) } 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) + return Ok( + self.usage.tally_child_key_read(&key, entry, true) + ) } } trace!("Cache miss: {:?}", key); let value = self.state.child_storage(storage_key, child_info, &key.1[..])?; + + // just pass it through the usage counter + let value = self.usage.tally_child_key_read(&key, value, false); + RwLockUpgradableReadGuard::upgrade(local_cache).child_storage.insert(key, value.clone()); Ok(value) } @@ -646,6 +662,10 @@ impl>, B: BlockT> StateBackend> for Ca fn as_trie_backend(&mut self) -> Option<&TrieBackend>> { self.state.as_trie_backend() } + + fn usage_info(&self) -> sp_state_machine::UsageInfo { + self.usage.take() + } } #[cfg(test)] diff --git a/primitives/state-machine/src/backend.rs b/primitives/state-machine/src/backend.rs index d542dab8ad..75733d68b3 100644 --- a/primitives/state-machine/src/backend.rs +++ b/primitives/state-machine/src/backend.rs @@ -18,11 +18,16 @@ use log::warn; use hash_db::Hasher; -use crate::trie_backend::TrieBackend; -use crate::trie_backend_essence::TrieBackendStorage; -use sp_trie::{TrieMut, MemoryDB, trie_types::TrieDBMut}; use codec::Encode; + use sp_core::storage::{ChildInfo, OwnedChildInfo}; +use sp_trie::{TrieMut, MemoryDB, trie_types::TrieDBMut}; + +use crate::{ + trie_backend::TrieBackend, + trie_backend_essence::TrieBackendStorage, + UsageInfo, +}; /// A state backend is used to read state data and can have changes committed /// to it. @@ -200,6 +205,14 @@ pub trait Backend: std::fmt::Debug { txs.consolidate(parent_txs); (root, txs) } + + /// Query backend usage statistics (i/o, memory) + /// + /// Not all implementations are expected to be able to do this. In the + /// case when thay don't, empty statistics is returned. + fn usage_info(&self) -> UsageInfo { + UsageInfo::empty() + } } impl<'a, T: Backend, H: Hasher> Backend for &'a T { @@ -284,7 +297,11 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { fn for_key_values_with_prefix(&self, prefix: &[u8], f: F) { (*self).for_key_values_with_prefix(prefix, f); } -} + + fn usage_info(&self) -> UsageInfo { + (*self).usage_info() + } + } /// Trait that allows consolidate two transactions together. pub trait Consolidate { diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index f89bc0631f..c8329178c6 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -40,6 +40,7 @@ mod overlayed_changes; mod proving_backend; mod trie_backend; mod trie_backend_essence; +mod stats; pub use sp_trie::{trie_types::{Layout, TrieDBMut}, TrieMut, DBValue, MemoryDB}; pub use testing::TestExternalities; @@ -68,6 +69,7 @@ pub use trie_backend_essence::{TrieBackendStorage, Storage}; pub use trie_backend::TrieBackend; pub use error::{Error, ExecutionError}; pub use in_memory_backend::InMemory as InMemoryBackend; +pub use stats::{UsageInfo, UsageUnit}; type CallResult = Result, E>; diff --git a/primitives/state-machine/src/stats.rs b/primitives/state-machine/src/stats.rs new file mode 100644 index 0000000000..38286be545 --- /dev/null +++ b/primitives/state-machine/src/stats.rs @@ -0,0 +1,62 @@ +// Copyright 2017-2020 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 . + +//! Usage statistics for state db + +use std::time::{Instant, Duration}; + +/// Measured count of operations and total bytes. +#[derive(Clone, Debug, Default)] +pub struct UsageUnit { + /// Number of operations. + pub ops: u64, + /// Number of bytes. + pub bytes: u64, +} + +/// Usage statistics for state backend. +#[derive(Clone, Debug)] +pub struct UsageInfo { + /// Read statistics (total). + pub reads: UsageUnit, + /// Write statistics. + pub writes: UsageUnit, + /// Cache read statistics. + pub cache_reads: UsageUnit, + /// Memory used. + pub memory: usize, + + /// Moment at which current statistics has been started being collected. + pub started: Instant, + /// Timespan of the statistics. + pub span: Duration, +} + +impl UsageInfo { + /// Empty statistics. + /// + /// Means no data was collected. + pub fn empty() -> Self { + Self { + reads: UsageUnit::default(), + writes: UsageUnit::default(), + cache_reads: UsageUnit::default(), + memory: 0, + started: Instant::now(), + span: Default::default(), + } + } +} \ No newline at end of file -- GitLab From 8e254d821926c42e40322959bee02247219cbe73 Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Mon, 13 Jan 2020 12:07:54 +0100 Subject: [PATCH 105/296] Allow node to add externalities extensions (#4583) * allow extensions to be extensible from the outside --- client/api/src/execution_extensions.rs | 26 ++++++++++++++++++++++++-- client/service/src/builder.rs | 8 ++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/client/api/src/execution_extensions.rs b/client/api/src/execution_extensions.rs index 351e9c8914..1a986a23a4 100644 --- a/client/api/src/execution_extensions.rs +++ b/client/api/src/execution_extensions.rs @@ -62,6 +62,18 @@ impl Default for ExecutionStrategies { } } +/// Generate the starting set of ExternalitiesExtensions based upon the given capabilities +pub trait ExtensionsFactory: Send + Sync { + /// Make `Extensions` for given Capapbilities + fn extensions_for(&self, capabilities: offchain::Capabilities) -> Extensions; +} + +impl ExtensionsFactory for () { + fn extensions_for(&self, _capabilities: offchain::Capabilities) -> Extensions { + Extensions::new() + } +} + /// A producer of execution extensions for offchain calls. /// /// This crate aggregates extensions available for the offchain calls @@ -70,7 +82,10 @@ impl Default for ExecutionStrategies { pub struct ExecutionExtensions { strategies: ExecutionStrategies, keystore: Option, + // FIXME: these two are only RwLock because of https://github.com/paritytech/substrate/issues/4587 + // remove when fixed. transaction_pool: RwLock>>>, + extensions_factory: RwLock>, } impl Default for ExecutionExtensions { @@ -79,6 +94,7 @@ impl Default for ExecutionExtensions { strategies: Default::default(), keystore: None, transaction_pool: RwLock::new(None), + extensions_factory: RwLock::new(Box::new(())), } } } @@ -90,7 +106,8 @@ impl ExecutionExtensions { keystore: Option, ) -> Self { let transaction_pool = RwLock::new(None); - Self { strategies, keystore, transaction_pool } + let extensions_factory = Box::new(()); + Self { strategies, keystore, extensions_factory: RwLock::new(extensions_factory), transaction_pool } } /// Get a reference to the execution strategies. @@ -98,6 +115,11 @@ impl ExecutionExtensions { &self.strategies } + /// Set the new extensions_factory + pub fn set_extensions_factory(&self, maker: Box) { + *self.extensions_factory.write() = maker; + } + /// Register transaction pool extension. /// /// To break retain cycle between `Client` and `TransactionPool` we require this @@ -135,7 +157,7 @@ impl ExecutionExtensions { let capabilities = context.capabilities(); - let mut extensions = Extensions::new(); + let mut extensions = self.extensions_factory.read().extensions_for(capabilities); if capabilities.has(offchain::Capability::Keystore) { if let Some(keystore) = self.keystore.as_ref() { diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 6eb0259b79..0160da9bbe 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -22,6 +22,7 @@ use sc_client_api::{ self, BlockchainEvents, backend::RemoteBackend, light::RemoteBlockchain, + execution_extensions::ExtensionsFactory, }; use sc_client::Client; use sc_chain_spec::{RuntimeGenesis, Extension}; @@ -746,6 +747,13 @@ ServiceBuilder< + TransactionPoolMaintainer::Hash>, TRpc: sc_rpc::RpcExtension + Clone, { + + /// Set an ExecutionExtensionsFactory + pub fn with_execution_extensions_factory(self, execution_extensions_factory: Box) -> Result { + self.client.execution_extensions().set_extensions_factory(execution_extensions_factory); + Ok(self) + } + /// Builds the service. pub fn build(self) -> Result Date: Mon, 13 Jan 2020 12:14:44 +0100 Subject: [PATCH 106/296] Add translate function for storage prefixed map. (#4555) * translace values for prefixed storages * improve doc * new impl * update test --- frame/support/src/storage/mod.rs | 72 ++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index 53e7ceb45d..0908adae3b 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -403,6 +403,7 @@ pub trait StoragePrefixedMap { /// Storage prefix. Used for generating final key. fn storage_prefix() -> &'static [u8]; + /// Final full prefix that prefixes all keys. fn final_prefix() -> [u8; 32] { let mut final_key = [0u8; 32]; final_key[0..16].copy_from_slice(&Twox128::hash(Self::module_prefix())); @@ -410,10 +411,12 @@ pub trait StoragePrefixedMap { final_key } + /// Remove all value of the storage. fn remove_all() { sp_io::storage::clear_prefix(&Self::final_prefix()) } + /// Iter over all value of the storage. fn iter() -> PrefixIterator { let prefix = Self::final_prefix(); PrefixIterator { @@ -422,6 +425,51 @@ pub trait StoragePrefixedMap { phantom_data: Default::default(), } } + + /// Translate the values from some previous `OldValue` to the current type. + /// + /// `TV` translates values. + /// + /// Returns `Err` if the map could not be interpreted as the old type, and Ok if it could. + /// The `Err` contains the number of value that couldn't be interpreted, those value are + /// removed from the map. + /// + /// # Warning + /// + /// This function must be used with care, before being updated the storage still contains the + /// old type, thus other calls (such as `get`) will fail at decoding it. + /// + /// # Usage + /// + /// This would typically be called inside the module implementation of on_initialize, while + /// ensuring **no usage of this storage are made before the call to `on_initialize`**. (More + /// precisely prior initialized modules doesn't make use of this storage). + fn translate_values(translate_val: TV) -> Result<(), u32> + where OldValue: Decode, TV: Fn(OldValue) -> Value + { + let prefix = Self::final_prefix(); + let mut previous_key = prefix.to_vec(); + let mut errors = 0; + while let Some(next_key) = sp_io::storage::next_key(&previous_key) + .filter(|n| n.starts_with(&prefix[..])) + { + if let Some(value) = unhashed::get(&next_key) { + unhashed::put(&next_key[..], &translate_val(value)); + } else { + // We failed to read the value. Remove the key and increment errors. + unhashed::kill(&next_key[..]); + errors += 1; + } + + previous_key = next_key; + } + + if errors == 0 { + Ok(()) + } else { + Err(errors) + } + } } #[cfg(test)] @@ -463,6 +511,7 @@ mod test { let k = [twox_128(b"MyModule"), twox_128(b"MyStorage")].concat(); assert_eq!(MyStorage::final_prefix().to_vec(), k); + // test iteration assert_eq!(MyStorage::iter().collect::>(), vec![]); unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u64); @@ -472,9 +521,32 @@ mod test { assert_eq!(MyStorage::iter().collect::>(), vec![1, 2, 3, 4]); + // test removal MyStorage::remove_all(); + assert_eq!(MyStorage::iter().collect::>(), vec![]); + + // test migration + unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u32); + unhashed::put(&[&k[..], &vec![8][..]].concat(), &2u32); assert_eq!(MyStorage::iter().collect::>(), vec![]); + MyStorage::translate_values(|v: u32| v as u64).unwrap(); + assert_eq!(MyStorage::iter().collect::>(), vec![1, 2]); + MyStorage::remove_all(); + + // test migration 2 + unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u128); + unhashed::put(&[&k[..], &vec![1, 1][..]].concat(), &2u64); + unhashed::put(&[&k[..], &vec![8][..]].concat(), &3u128); + unhashed::put(&[&k[..], &vec![10][..]].concat(), &4u32); + + // (contains some value that successfully decoded to u64) + assert_eq!(MyStorage::iter().collect::>(), vec![1, 2, 3]); + assert_eq!(MyStorage::translate_values(|v: u128| v as u64), Err(2)); + assert_eq!(MyStorage::iter().collect::>(), vec![1, 3]); + MyStorage::remove_all(); + + // test that other values are not modified. assert_eq!(unhashed::get(&key_before[..]), Some(32u64)); assert_eq!(unhashed::get(&key_after[..]), Some(33u64)); }); -- GitLab From d63ff7b9ac8d766b87a7a2cd99d5d73a521f97a9 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 13 Jan 2020 12:49:52 +0100 Subject: [PATCH 107/296] Disable equalize, avoiding consensus issue (#4608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Disable equalize, avoiding consensus issue * Update frame/staking/Cargo.toml Co-authored-by: Bastian Köcher --- frame/staking/Cargo.toml | 3 +-- frame/staking/src/lib.rs | 34 ---------------------------------- 2 files changed, 1 insertion(+), 36 deletions(-) diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index 8cf6d9f80e..e3e6fcbe7b 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -27,9 +27,8 @@ pallet-staking-reward-curve = { version = "2.0.0", path = "../staking/reward-cu substrate-test-utils = { version = "2.0.0", path = "../../test-utils" } [features] -equalize = [] migrate = [] -default = ["std", "equalize"] +default = ["std"] std = [ "serde", "safe-mix/std", diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index eef00a7c24..f2f3fdfb70 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1519,40 +1519,6 @@ impl Module { Self::slashable_balance_of, ); - if cfg!(feature = "equalize") { - let mut staked_assignments - : Vec<(T::AccountId, Vec>)> - = Vec::with_capacity(assignments.len()); - for (n, assignment) in assignments.iter() { - let mut staked_assignment - : Vec> - = Vec::with_capacity(assignment.len()); - - // If this is a self vote, then we don't need to equalise it at all. While the - // staking system does not allow nomination and validation at the same time, - // this must always be 100% support. - if assignment.len() == 1 && assignment[0].0 == *n { - continue; - } - for (c, per_thing) in assignment.iter() { - let nominator_stake = to_votes(Self::slashable_balance_of(n)); - let other_stake = *per_thing * nominator_stake; - staked_assignment.push((c.clone(), other_stake)); - } - staked_assignments.push((n.clone(), staked_assignment)); - } - - let tolerance = 0_u128; - let iterations = 2_usize; - sp_phragmen::equalize::<_, _, T::CurrencyToVote, _>( - staked_assignments, - &mut supports, - tolerance, - iterations, - Self::slashable_balance_of, - ); - } - // Clear Stakers. for v in Self::current_elected().iter() { >::remove(v); -- GitLab From 6688c3be1ff71803d5963935df7a0d646b2d50d2 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Mon, 13 Jan 2020 16:48:00 +0100 Subject: [PATCH 108/296] Remove wrong assertion from phragmen (#4515) * remove assertion --- frame/nicks/src/lib.rs | 2 +- frame/staking/src/lib.rs | 24 ++++++--- primitives/phragmen/src/lib.rs | 30 +++-------- primitives/phragmen/src/mock.rs | 2 +- primitives/phragmen/src/tests.rs | 91 +++++++++++++++++++++++++++++++- 5 files changed, 117 insertions(+), 32 deletions(-) diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index de39736a5a..1d33d12ae4 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -145,7 +145,7 @@ decl_module! { fn set_name(origin, name: Vec) { let sender = ensure_signed(origin)?; - ensure!(name.len() >= T::MinLength::get(), Error::::TooShort,); + ensure!(name.len() >= T::MinLength::get(), Error::::TooShort); ensure!(name.len() <= T::MaxLength::get(), Error::::TooLong); let deposit = if let Some((_, deposit)) = >::get(&sender) { diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index f2f3fdfb70..a59aa5d0c8 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1528,18 +1528,30 @@ impl Module { let mut slot_stake = BalanceOf::::max_value(); for (c, s) in supports.into_iter() { // build `struct exposure` from `support` + let mut others = Vec::new(); + let mut own: BalanceOf = Zero::zero(); + let mut total: BalanceOf = Zero::zero(); + s.voters + .into_iter() + .map(|(who, value)| (who, to_balance(value))) + .for_each(|(who, value)| { + if who == c { + own = own.saturating_add(value); + } else { + others.push(IndividualExposure { who, value }); + } + total = total.saturating_add(value); + }); let exposure = Exposure { - own: to_balance(s.own), + own, + others, // This might reasonably saturate and we cannot do much about it. The sum of // someone's stake might exceed the balance type if they have the maximum amount // of balance and receive some support. This is super unlikely to happen, yet // we simulate it in some tests. - total: to_balance(s.total), - others: s.others - .into_iter() - .map(|(who, value)| IndividualExposure { who, value: to_balance(value) }) - .collect::>>(), + total, }; + if exposure.total < slot_stake { slot_stake = exposure.total; } diff --git a/primitives/phragmen/src/lib.rs b/primitives/phragmen/src/lib.rs index d9712d6ffb..c13654543d 100644 --- a/primitives/phragmen/src/lib.rs +++ b/primitives/phragmen/src/lib.rs @@ -118,14 +118,12 @@ pub struct PhragmenResult { /// This, at the current version, resembles the `Exposure` defined in the staking SRML module, yet /// they do not necessarily have to be the same. #[derive(Default, RuntimeDebug)] -#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize, Eq, PartialEq))] pub struct Support { - /// The amount of support as the effect of self-vote. - pub own: ExtendedBalance, /// Total support. pub total: ExtendedBalance, /// Support from voters. - pub others: Vec>, + pub voters: Vec>, } /// A linkage from a candidate and its [`Support`]. @@ -368,20 +366,8 @@ pub fn build_support_map( // per-things to be sound. let other_stake = *per_thing * nominator_stake; if let Some(support) = supports.get_mut(c) { - if c == n { - // This is a nomination from `n` to themselves. This will increase both the - // `own` and `total` field. - debug_assert!(*per_thing == Perbill::one()); // TODO: deal with this: do we want it? - support.own = support.own.saturating_add(other_stake); - support.total = support.total.saturating_add(other_stake); - } else { - // This is a nomination from `n` to someone else. Increase `total` and add an entry - // inside `others`. - // For an astronomically rich validator with more astronomically rich - // set of nominators, this might saturate. - support.total = support.total.saturating_add(other_stake); - support.others.push((n.clone(), other_stake)); - } + support.voters.push((n.clone(), other_stake)); + support.total = support.total.saturating_add(other_stake); } } } @@ -450,8 +436,8 @@ fn do_equalize( let budget = to_votes(budget_balance); // Nothing to do. This voter had nothing useful. - // Defensive only. Assignment list should always be populated. - if elected_edges.is_empty() { return 0; } + // Defensive only. Assignment list should always be populated. 1 might happen for self vote. + if elected_edges.is_empty() || elected_edges.len() == 1 { return 0; } let stake_used = elected_edges .iter() @@ -492,7 +478,7 @@ fn do_equalize( elected_edges.iter_mut().for_each(|e| { if let Some(support) = support_map.get_mut(&e.0) { support.total = support.total.saturating_sub(e.1); - support.others.retain(|i_support| i_support.0 != *voter); + support.voters.retain(|i_support| i_support.0 != *voter); } e.1 = 0; }); @@ -529,7 +515,7 @@ fn do_equalize( .saturating_add(last_stake) .saturating_sub(support.total); support.total = support.total.saturating_add(e.1); - support.others.push((voter.clone(), e.1)); + support.voters.push((voter.clone(), e.1)); } }); diff --git a/primitives/phragmen/src/mock.rs b/primitives/phragmen/src/mock.rs index 32de65f0e6..59b8d4eb5c 100644 --- a/primitives/phragmen/src/mock.rs +++ b/primitives/phragmen/src/mock.rs @@ -375,7 +375,7 @@ pub(crate) fn run_and_compare( check_assignments(assignments); } -pub(crate) fn build_support_map( +pub(crate) fn build_support_map_float( result: &mut _PhragmenResult, stake_of: FS, ) -> _SupportMap diff --git a/primitives/phragmen/src/tests.rs b/primitives/phragmen/src/tests.rs index f3974d07d3..b182cfca05 100644 --- a/primitives/phragmen/src/tests.rs +++ b/primitives/phragmen/src/tests.rs @@ -19,7 +19,7 @@ #![cfg(test)] use crate::mock::*; -use crate::{elect, PhragmenResult}; +use crate::{elect, PhragmenResult, PhragmenStakedAssignment, build_support_map, Support, equalize}; use substrate_test_utils::assert_eq_uvec; use sp_runtime::Perbill; @@ -46,7 +46,7 @@ fn float_phragmen_poc_works() { ] ); - let mut support_map = build_support_map(&mut phragmen_result, &stake_of); + let mut support_map = build_support_map_float(&mut phragmen_result, &stake_of); assert_eq!( support_map.get(&2).unwrap(), @@ -405,3 +405,90 @@ fn minimum_to_elect_is_respected() { assert!(maybe_result.is_none()); } + +#[test] +fn self_votes_should_be_kept() { + let candidates = vec![5, 10, 20, 30]; + let voters = vec![ + (5, vec![5]), + (10, vec![10]), + (20, vec![20]), + (1, vec![10, 20]) + ]; + let stake_of = create_stake_of(&[ + (5, 5), + (10, 10), + (20, 20), + (1, 8), + ]); + + let result = elect::<_, _, _, TestCurrencyToVote>( + 2, + 2, + candidates, + voters, + &stake_of, + ).unwrap(); + + assert_eq!(result.winners, vec![(20, 28), (10, 18)]); + assert_eq!( + result.assignments, + vec![ + (10, vec![(10, Perbill::from_percent(100))]), + (20, vec![(20, Perbill::from_percent(100))]), + (1, vec![ + (10, Perbill::from_percent(50)), + (20, Perbill::from_percent(50)) + ] + ) + ], + ); + + let mut supports = build_support_map::< + Balance, + AccountId, + _, + TestCurrencyToVote + >( + &result.winners.into_iter().map(|(who, _)| who).collect(), + &result.assignments, + &stake_of + ); + + assert_eq!(supports.get(&5u64), None); + assert_eq!( + supports.get(&10u64).unwrap(), + &Support { total: 14u128, voters: vec![(10u64, 10u128), (1u64, 4u128)] }, + ); + assert_eq!( + supports.get(&20u64).unwrap(), + &Support { total: 24u128, voters: vec![(20u64, 20u128), (1u64, 4u128)] }, + ); + + let assignments = result.assignments; + let mut staked_assignments + : Vec<(AccountId, Vec>)> + = Vec::with_capacity(assignments.len()); + for (n, assignment) in assignments.iter() { + let mut staked_assignment + : Vec> + = Vec::with_capacity(assignment.len()); + let stake = stake_of(&n); + for (c, per_thing) in assignment.iter() { + let vote_stake = *per_thing * stake; + staked_assignment.push((c.clone(), vote_stake)); + } + staked_assignments.push((n.clone(), staked_assignment)); + } + + equalize::(staked_assignments, &mut supports, 0, 2usize, &stake_of); + + assert_eq!( + supports.get(&10u64).unwrap(), + &Support { total: 18u128, voters: vec![(10u64, 10u128), (1u64, 8u128)] }, + ); + assert_eq!( + supports.get(&20u64).unwrap(), + &Support { total: 20u128, voters: vec![(20u64, 20u128)] }, + ); +} -- GitLab From 3ed7c8b385f2cb133afcf6302e976beb8328e29c Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Mon, 13 Jan 2020 17:52:04 +0100 Subject: [PATCH 109/296] A Social Account Recovery Pallet (#4531) * Initial sketch of social recovery pallet * Fix compilation issues * Use a single total delay, rename stuff * Check possible overflow * Copyright bump * Add mock for tests * Add basic end to end test * Add `create_recovery` tests * Add malicious recovery lifecycle test * Make clear we check for sorted and unique friends * Work on some tests, clean up imports * Change `if let Some(_)` to `ok_or()` * More tests * Finish tests, except issue with `on_free_balance_zero` * Fix `on_free_balance_zero` * Pallet docs * Add function/weight docs * Fix merge master * OnReapAccount for System too * Update weight docs * Allow passthrough to support fee-less extrinsics --- Cargo.lock | 16 + Cargo.toml | 1 + frame/recovery/Cargo.toml | 31 ++ frame/recovery/src/lib.rs | 666 ++++++++++++++++++++++++++++++++++++ frame/recovery/src/mock.rs | 143 ++++++++ frame/recovery/src/tests.rs | 383 +++++++++++++++++++++ 6 files changed, 1240 insertions(+) create mode 100644 frame/recovery/Cargo.toml create mode 100644 frame/recovery/src/lib.rs create mode 100644 frame/recovery/src/mock.rs create mode 100644 frame/recovery/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index d649721e43..82f43ac5d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3894,6 +3894,22 @@ dependencies = [ "sp-std 2.0.0", ] +[[package]] +name = "pallet-recovery" +version = "2.0.0" +dependencies = [ + "enumflags2 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "frame-support 2.0.0", + "frame-system 2.0.0", + "pallet-balances 2.0.0", + "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-runtime 2.0.0", + "sp-std 2.0.0", +] + [[package]] name = "pallet-scored-pool" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index ade5cd24e5..f6e521b9c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,6 +78,7 @@ members = [ "frame/nicks", "frame/offences", "frame/randomness-collective-flip", + "frame/recovery", "frame/scored-pool", "frame/session", "frame/society", diff --git a/frame/recovery/Cargo.toml b/frame/recovery/Cargo.toml new file mode 100644 index 0000000000..9f2f50ab06 --- /dev/null +++ b/frame/recovery/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "pallet-recovery" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +serde = { version = "1.0.101", optional = true } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +enumflags2 = { version = "0.6.2" } +sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0", default-features = false, path = "../support" } +frame-system = { version = "2.0.0", default-features = false, path = "../system" } + +[dev-dependencies] +sp-core = { version = "2.0.0", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0", path = "../balances" } + +[features] +default = ["std"] +std = [ + "serde", + "codec/std", + "sp-std/std", + "sp-io/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", +] diff --git a/frame/recovery/src/lib.rs b/frame/recovery/src/lib.rs new file mode 100644 index 0000000000..d0b5783587 --- /dev/null +++ b/frame/recovery/src/lib.rs @@ -0,0 +1,666 @@ +// Copyright 2020 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 . + +//! # Recovery Pallet +//! +//! - [`recovery::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! +//! ## Overview +//! +//! The Recovery pallet is an M-of-N social recovery tool for users to gain +//! access to their accounts if the private key or other authentication mechanism +//! is lost. Through this pallet, a user is able to make calls on-behalf-of another +//! account which they have recovered. The recovery process is protected by trusted +//! "friends" whom the original account owner chooses. A threshold (M) out of N +//! friends are needed to give another account access to the recoverable account. +//! +//! ### Recovery Configuration +//! +//! The recovery process for each recoverable account can be configured by the account owner. +//! They are able to choose: +//! * `friends` - The list of friends that the account owner trusts to protect the +//! recovery process for their account. +//! * `threshold` - The number of friends that need to approve a recovery process for +//! the account to be successfully recovered. +//! * `delay_period` - The minimum number of blocks after the beginning of the recovery +//! process that need to pass before the account can be successfully recovered. +//! +//! There is a configurable deposit that all users need to pay to create a recovery +//! configuration. This deposit is composed of a base deposit plus a multiplier for +//! the number of friends chosen. This deposit is returned in full when the account +//! owner removes their recovery configuration. +//! +//! ### Recovery Lifecycle +//! +//! The intended lifecycle of a successful recovery takes the following steps: +//! 1. The account owner calls `create_recovery` to set up a recovery configuration +//! for their account. +//! 2. At some later time, the account owner loses access to their account and wants +//! to recover it. Likely, they will need to create a new account and fund it with +//! enough balance to support the transaction fees and the deposit for the +//! recovery process. +//! 3. Using this new account, they call `initiate_recovery`. +//! 4. Then the account owner would contact their configured friends to vouch for +//! the recovery attempt. The account owner would provide their old account id +//! and the new account id, and friends would call `vouch_recovery` with those +//! parameters. +//! 5. Once a threshold number of friends have vouched for the recovery attempt, +//! the account owner needs to wait until the delay period has passed, starting +//! when they initiated the recovery process. +//! 6. Now the account owner is able to call `claim_recovery`, which subsequently +//! allows them to call `as_recovered` and directly make calls on-behalf-of the lost +//! account. +//! 7. Using the now recovered account, the account owner can call `close_recovery` +//! on the recovery process they opened, reclaiming the recovery deposit they +//! placed. +//! 8. Then the account owner should then call `remove_recovery` to remove the recovery +//! configuration on the recovered account and reclaim the recovery configuration +//! deposit they placed. +//! 9. Using `as_recovered`, the account owner is able to call any other pallets +//! to clean up their state and reclaim any reserved or locked funds. They +//! can then transfer all funds from the recovered account to the new account. +//! 10. When the recovered account becomes reaped (i.e. its free and reserved +//! balance drops to zero), the final recovery link is removed. +//! +//! ### Malicious Recovery Attempts +//! +//! Initializing a the recovery process for a recoverable account is open and +//! permissionless. However, the recovery deposit is an economic deterrent that +//! should disincentivize would-be attackers from trying to maliciously recover +//! accounts. +//! +//! The recovery deposit can always be claimed by the account which is trying to +//! to be recovered. In the case of a malicious recovery attempt, the account +//! owner who still has access to their account can claim the deposit and +//! essentially punish the malicious user. +//! +//! Furthermore, the malicious recovery attempt can only be successful if the +//! attacker is also able to get enough friends to vouch for the recovery attempt. +//! In the case where the account owner prevents a malicious recovery process, +//! this pallet makes it near-zero cost to re-configure the recovery settings and +//! remove/replace friends who are acting inappropriately. +//! +//! ### Safety Considerations +//! +//! It is important to note that this is a powerful pallet that can compromise the +//! security of an account if used incorrectly. Some recommended practices for users +//! of this pallet are: +//! +//! * Configure a significant `delay_period` for your recovery process: As long as you +//! have access to your recoverable account, you need only check the blockchain once +//! every `delay_period` blocks to ensure that no recovery attempt is successful +//! against your account. Using off-chain notification systems can help with this, +//! but ultimately, setting a large `delay_period` means that even the most skilled +//! attacker will need to wait this long before they can access your account. +//! * Use a high threshold of approvals: Setting a value of 1 for the threshold means +//! that any of your friends would be able to recover your account. They would +//! simply need to start a recovery process and approve their own process. Similarly, +//! a threshold of 2 would mean that any 2 friends could work together to gain +//! access to your account. The only way to prevent against these kinds of attacks +//! is to choose a high threshold of approvals and select from a diverse friend +//! group that would not be able to reasonably coordinate with one another. +//! * Reset your configuration over time: Since the entire deposit of creating a +//! recovery configuration is returned to the user, the only cost of updating +//! your recovery configuration is the transaction fees for the calls. Thus, +//! it is strongly encouraged to regularly update your recovery configuration +//! as your life changes and your relationship with new and existing friends +//! change as well. +//! +//! ## Interface +//! +//! ### Dispatchable Functions +//! +//! #### For General Users +//! +//! * `create_recovery` - Create a recovery configuration for your account and make it recoverable. +//! * `initiate_recovery` - Start the recovery process for a recoverable account. +//! +//! #### For Friends of a Recoverable Account +//! * `vouch_recovery` - As a `friend` of a recoverable account, vouch for a recovery attempt on the account. +//! +//! #### For a User Who Successfully Recovered an Account +//! +//! * `claim_recovery` - Claim access to the account that you have successfully completed the recovery process for. +//! * `as_recovered` - Send a transaction as an account that you have recovered. See other functions below. +//! +//! #### For the Recoverable Account +//! +//! * `close_recovery` - Close an active recovery process for your account and reclaim the recovery deposit. +//! * `remove_recovery` - Remove the recovery configuration from the account, making it un-recoverable. +//! +//! #### For Super Users +//! +//! * `set_recovered` - The ROOT origin is able to skip the recovery process and directly allow +//! one account to access another. + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +use sp_std::prelude::*; +use sp_runtime::{ + traits::{Dispatchable, SaturatedConversion, CheckedAdd, CheckedMul}, + DispatchResult +}; +use codec::{Encode, Decode}; + +use frame_support::{ + decl_module, decl_event, decl_storage, decl_error, ensure, + Parameter, RuntimeDebug, + weights::{ + GetDispatchInfo, PaysFee, DispatchClass, ClassifyDispatch, Weight, WeighData, + SimpleDispatchInfo, + }, + traits::{Currency, ReservableCurrency, Get, OnReapAccount}, +}; +use frame_system::{self as system, ensure_signed, ensure_root}; + +#[cfg(test)] +mod mock; +#[cfg(test)] +mod tests; + +type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +/// Configuration trait. +pub trait Trait: frame_system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + + /// The overarching call type. + type Call: Parameter + Dispatchable + GetDispatchInfo; + + /// The currency mechanism. + type Currency: ReservableCurrency; + + /// The base amount of currency needed to reserve for creating a recovery configuration. + /// + /// This is held for an additional storage item whose value size is + /// `2 + sizeof(BlockNumber, Balance)` bytes. + type ConfigDepositBase: Get>; + + /// The amount of currency needed per additional user when creating a recovery configuration. + /// + /// This is held for adding `sizeof(AccountId)` bytes more into a pre-existing storage value. + type FriendDepositFactor: Get>; + + /// The maximum amount of friends allowed in a recovery configuration. + type MaxFriends: Get; + + /// The base amount of currency needed to reserve for starting a recovery. + /// + /// This is primarily held for deterring malicious recovery attempts, and should + /// have a value large enough that a bad actor would choose not to place this + /// deposit. It also acts to fund additional storage item whose value size is + /// `sizeof(BlockNumber, Balance + T * AccountId)` bytes. Where T is a configurable + /// threshold. + type RecoveryDeposit: Get>; +} + +/// An active recovery process. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Default, RuntimeDebug)] +pub struct ActiveRecovery { + /// The block number when the recovery process started. + created: BlockNumber, + /// The amount held in reserve of the `depositor`, + /// To be returned once this recovery process is closed. + deposit: Balance, + /// The friends which have vouched so far. Always sorted. + friends: Vec, +} + +/// Configuration for recovering an account. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Default, RuntimeDebug)] +pub struct RecoveryConfig { + /// The minimum number of blocks since the start of the recovery process before the account + /// can be recovered. + delay_period: BlockNumber, + /// The amount held in reserve of the `depositor`, + /// to be returned once this configuration is removed. + deposit: Balance, + /// The list of friends which can help recover an account. Always sorted. + friends: Vec, + /// The number of approving friends needed to recover an account. + threshold: u16, +} + +decl_storage! { + trait Store for Module as Recovery { + /// The set of recoverable accounts and their recovery configuration. + pub Recoverable get(fn recovery_config): + map T::AccountId => Option, T::AccountId>>; + /// Active recovery attempts. + /// + /// First account is the account to be recovered, and the second account + /// is the user trying to recover the account. + pub ActiveRecoveries get(fn active_recovery): + double_map hasher(twox_64_concat) T::AccountId, hasher(twox_64_concat) T::AccountId => + Option, T::AccountId>>; + /// The final list of recovered accounts. + /// + /// Map from the recovered account to the user who can access it. + pub Recovered get(fn recovered_account): map T::AccountId => Option; + } +} + +decl_event! { + /// Events type. + pub enum Event where + AccountId = ::AccountId, + { + /// A recovery process has been set up for an account + RecoveryCreated(AccountId), + /// A recovery process has been initiated for account_1 by account_2 + RecoveryInitiated(AccountId, AccountId), + /// A recovery process for account_1 by account_2 has been vouched for by account_3 + RecoveryVouched(AccountId, AccountId, AccountId), + /// A recovery process for account_1 by account_2 has been closed + RecoveryClosed(AccountId, AccountId), + /// Account_1 has been successfully recovered by account_2 + AccountRecovered(AccountId, AccountId), + /// A recovery process has been removed for an account + RecoveryRemoved(AccountId), + } +} + +decl_error! { + pub enum Error for Module { + /// User is not allowed to make a call on behalf of this account + NotAllowed, + /// Threshold must be greater than zero + ZeroThreshold, + /// Friends list must be greater than zero and threshold + NotEnoughFriends, + /// Friends list must be less than max friends + MaxFriends, + /// Friends list must be sorted and free of duplicates + NotSorted, + /// This account is not set up for recovery + NotRecoverable, + /// This account is already set up for recovery + AlreadyRecoverable, + /// A recovery process has already started for this account + AlreadyStarted, + /// A recovery process has not started for this rescuer + NotStarted, + /// This account is not a friend who can vouch + NotFriend, + /// The friend must wait until the delay period to vouch for this recovery + DelayPeriod, + /// This user has already vouched for this recovery + AlreadyVouched, + /// The threshold for recovering this account has not been met + Threshold, + /// There are still active recovery attempts that need to be closed + StillActive, + /// There was an overflow in a calculation + Overflow, + } +} + +decl_module! { + pub struct Module for enum Call where origin: T::Origin { + /// Deposit one of this module's events by using the default implementation. + fn deposit_event() = default; + + /// Send a call through a recovered account. + /// + /// The dispatch origin for this call must be _Signed_ and registered to + /// be able to make calls on behalf of the recovered account. + /// + /// Parameters: + /// - `account`: The recovered account you want to make a call on-behalf-of. + /// - `call`: The call you want to make with the recovered account. + /// + /// # + /// - The weight of the `call`. + /// - One storage lookup to check account is recovered by `who`. O(1) + /// # + #[weight = ::Call>>::new()] + fn as_recovered(origin, + account: T::AccountId, + call: Box<::Call> + ) -> DispatchResult { + let who = ensure_signed(origin)?; + // Check `who` is allowed to make a call on behalf of `account` + ensure!(Self::recovered_account(&account) == Some(who), Error::::NotAllowed); + call.dispatch(frame_system::RawOrigin::Signed(account).into()) + } + + /// Allow ROOT to bypass the recovery process and set an a rescuer account + /// for a lost account directly. + /// + /// The dispatch origin for this call must be _ROOT_. + /// + /// Parameters: + /// - `lost`: The "lost account" to be recovered. + /// - `rescuer`: The "rescuer account" which can call as the lost account. + /// + /// # + /// - One storage write O(1) + /// - One event + /// # + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] + fn set_recovered(origin, lost: T::AccountId, rescuer: T::AccountId) { + ensure_root(origin)?; + // Create the recovery storage item. + >::insert(&lost, &rescuer); + Self::deposit_event(RawEvent::AccountRecovered(lost, rescuer)); + } + + /// Create a recovery configuration for your account. This makes your account recoverable. + /// + /// Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance + /// will be reserved for storing the recovery configuration. This deposit is returned + /// in full when the user calls `remove_recovery`. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// Parameters: + /// - `friends`: A list of friends you trust to vouch for recovery attempts. + /// Should be ordered and contain no duplicate values. + /// - `threshold`: The number of friends that must vouch for a recovery attempt + /// before the account can be recovered. Should be less than or equal to + /// the length of the list of friends. + /// - `delay_period`: The number of blocks after a recovery attempt is initialized + /// that needs to pass before the account can be recovered. + /// + /// # + /// - Key: F (len of friends) + /// - One storage read to check that account is not already recoverable. O(1). + /// - A check that the friends list is sorted and unique. O(F) + /// - One currency reserve operation. O(X) + /// - One storage write. O(1). Codec O(F). + /// - One event. + /// + /// Total Complexity: O(F + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] + fn create_recovery(origin, + friends: Vec, + threshold: u16, + delay_period: T::BlockNumber + ) { + let who = ensure_signed(origin)?; + // Check account is not already set up for recovery + ensure!(!>::exists(&who), Error::::AlreadyRecoverable); + // Check user input is valid + ensure!(threshold >= 1, Error::::ZeroThreshold); + ensure!(!friends.is_empty(), Error::::NotEnoughFriends); + ensure!(threshold as usize <= friends.len(), Error::::NotEnoughFriends); + let max_friends = T::MaxFriends::get() as usize; + ensure!(friends.len() <= max_friends, Error::::MaxFriends); + ensure!(Self::is_sorted_and_unique(&friends), Error::::NotSorted); + // Total deposit is base fee + number of friends * factor fee + let friend_deposit = T::FriendDepositFactor::get() + .checked_mul(&friends.len().saturated_into()) + .ok_or(Error::::Overflow)?; + let total_deposit = T::ConfigDepositBase::get() + .checked_add(&friend_deposit) + .ok_or(Error::::Overflow)?; + // Reserve the deposit + T::Currency::reserve(&who, total_deposit)?; + // Create the recovery configuration + let recovery_config = RecoveryConfig { + delay_period, + deposit: total_deposit, + friends, + threshold, + }; + // Create the recovery configuration storage item + >::insert(&who, recovery_config); + Self::deposit_event(RawEvent::RecoveryCreated(who)); + } + + /// Initiate the process for recovering a recoverable account. + /// + /// Payment: `RecoveryDeposit` balance will be reserved for initiating the + /// recovery process. This deposit will always be repatriated to the account + /// trying to be recovered. See `close_recovery`. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// Parameters: + /// - `account`: The lost account that you want to recover. This account + /// needs to be recoverable (i.e. have a recovery configuration). + /// + /// # + /// - One storage read to check that account is recoverable. O(F) + /// - One storage read to check that this recovery process hasn't already started. O(1) + /// - One currency reserve operation. O(X) + /// - One storage read to get the current block number. O(1) + /// - One storage write. O(1). + /// - One event. + /// + /// Total Complexity: O(F + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] + fn initiate_recovery(origin, account: T::AccountId) { + let who = ensure_signed(origin)?; + // Check that the account is recoverable + ensure!(>::exists(&account), Error::::NotRecoverable); + // Check that the recovery process has not already been started + ensure!(!>::exists(&account, &who), Error::::AlreadyStarted); + // Take recovery deposit + let recovery_deposit = T::RecoveryDeposit::get(); + T::Currency::reserve(&who, recovery_deposit)?; + // Create an active recovery status + let recovery_status = ActiveRecovery { + created: >::block_number(), + deposit: recovery_deposit, + friends: vec![], + }; + // Create the active recovery storage item + >::insert(&account, &who, recovery_status); + Self::deposit_event(RawEvent::RecoveryInitiated(account, who)); + } + + /// Allow a "friend" of a recoverable account to vouch for an active recovery + /// process for that account. + /// + /// The dispatch origin for this call must be _Signed_ and must be a "friend" + /// for the recoverable account. + /// + /// Parameters: + /// - `lost`: The lost account that you want to recover. + /// - `rescuer`: The account trying to rescue the lost account that you + /// want to vouch for. + /// + /// The combination of these two parameters must point to an active recovery + /// process. + /// + /// # + /// Key: F (len of friends in config), V (len of vouching friends) + /// - One storage read to get the recovery configuration. O(1), Codec O(F) + /// - One storage read to get the active recovery process. O(1), Codec O(V) + /// - One binary search to confirm caller is a friend. O(logF) + /// - One binary search to confirm caller has not already vouched. O(logV) + /// - One storage write. O(1), Codec O(V). + /// - One event. + /// + /// Total Complexity: O(F + logF + V + logV) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] + fn vouch_recovery(origin, lost: T::AccountId, rescuer: T::AccountId) { + let who = ensure_signed(origin)?; + // Get the recovery configuration for the lost account. + let recovery_config = Self::recovery_config(&lost).ok_or(Error::::NotRecoverable)?; + // Get the active recovery process for the rescuer. + let mut active_recovery = Self::active_recovery(&lost, &rescuer).ok_or(Error::::NotStarted)?; + // Make sure the voter is a friend + ensure!(Self::is_friend(&recovery_config.friends, &who), Error::::NotFriend); + // Either insert the vouch, or return an error that the user already vouched. + match active_recovery.friends.binary_search(&who) { + Ok(_pos) => Err(Error::::AlreadyVouched)?, + Err(pos) => active_recovery.friends.insert(pos, who.clone()), + } + // Update storage with the latest details + >::insert(&lost, &rescuer, active_recovery); + Self::deposit_event(RawEvent::RecoveryVouched(lost, rescuer, who)); + } + + /// Allow a successful rescuer to claim their recovered account. + /// + /// The dispatch origin for this call must be _Signed_ and must be a "rescuer" + /// who has successfully completed the account recovery process: collected + /// `threshold` or more vouches, waited `delay_period` blocks since initiation. + /// + /// Parameters: + /// - `account`: The lost account that you want to claim has been successfully + /// recovered by you. + /// + /// # + /// Key: F (len of friends in config), V (len of vouching friends) + /// - One storage read to get the recovery configuration. O(1), Codec O(F) + /// - One storage read to get the active recovery process. O(1), Codec O(V) + /// - One storage read to get the current block number. O(1) + /// - One storage write. O(1), Codec O(V). + /// - One event. + /// + /// Total Complexity: O(F + V) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] + fn claim_recovery(origin, account: T::AccountId) { + let who = ensure_signed(origin)?; + // Get the recovery configuration for the lost account + let recovery_config = Self::recovery_config(&account).ok_or(Error::::NotRecoverable)?; + // Get the active recovery process for the rescuer + let active_recovery = Self::active_recovery(&account, &who).ok_or(Error::::NotStarted)?; + // Make sure the delay period has passed + let current_block_number = >::block_number(); + let recoverable_block_number = active_recovery.created + .checked_add(&recovery_config.delay_period) + .ok_or(Error::::Overflow)?; + ensure!(recoverable_block_number <= current_block_number, Error::::DelayPeriod); + // Make sure the threshold is met + ensure!( + recovery_config.threshold as usize <= active_recovery.friends.len(), + Error::::Threshold + ); + // Create the recovery storage item + >::insert(&account, &who); + Self::deposit_event(RawEvent::AccountRecovered(account, who)); + } + + /// As the controller of a recoverable account, close an active recovery + /// process for your account. + /// + /// Payment: By calling this function, the recoverable account will receive + /// the recovery deposit `RecoveryDeposit` placed by the rescuer. + /// + /// The dispatch origin for this call must be _Signed_ and must be a + /// recoverable account with an active recovery process for it. + /// + /// Parameters: + /// - `rescuer`: The account trying to rescue this recoverable account. + /// + /// # + /// Key: V (len of vouching friends) + /// - One storage read/remove to get the active recovery process. O(1), Codec O(V) + /// - One balance call to repatriate reserved. O(X) + /// - One event. + /// + /// Total Complexity: O(V + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(30_000)] + fn close_recovery(origin, rescuer: T::AccountId) { + let who = ensure_signed(origin)?; + // Take the active recovery process started by the rescuer for this account. + let active_recovery = >::take(&who, &rescuer).ok_or(Error::::NotStarted)?; + // Move the reserved funds from the rescuer to the rescued account. + // Acts like a slashing mechanism for those who try to maliciously recover accounts. + let _ = T::Currency::repatriate_reserved(&rescuer, &who, active_recovery.deposit); + Self::deposit_event(RawEvent::RecoveryClosed(who, rescuer)); + } + + /// Remove the recovery process for your account. + /// + /// NOTE: The user must make sure to call `close_recovery` on all active + /// recovery attempts before calling this function else it will fail. + /// + /// Payment: By calling this function the recoverable account will unreserve + /// their recovery configuration deposit. + /// (`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends) + /// + /// The dispatch origin for this call must be _Signed_ and must be a + /// recoverable account (i.e. has a recovery configuration). + /// + /// # + /// Key: F (len of friends) + /// - One storage read to get the prefix iterator for active recoveries. O(1) + /// - One storage read/remove to get the recovery configuration. O(1), Codec O(F) + /// - One balance call to unreserved. O(X) + /// - One event. + /// + /// Total Complexity: O(F + X) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(30_000)] + fn remove_recovery(origin) { + let who = ensure_signed(origin)?; + // Check there are no active recoveries + let mut active_recoveries = >::iter_prefix(&who); + ensure!(active_recoveries.next().is_none(), Error::::StillActive); + // Take the recovery configuration for this account. + let recovery_config = >::take(&who).ok_or(Error::::NotRecoverable)?; + // Unreserve the initial deposit for the recovery configuration. + T::Currency::unreserve(&who, recovery_config.deposit); + Self::deposit_event(RawEvent::RecoveryRemoved(who)); + } + } +} + +impl Module { + /// Check that friends list is sorted and has no duplicates. + fn is_sorted_and_unique(friends: &Vec) -> bool { + friends.windows(2).all(|w| w[0] < w[1]) + } + + /// Check that a user is a friend in the friends list. + fn is_friend(friends: &Vec, friend: &T::AccountId) -> bool { + friends.binary_search(&friend).is_ok() + } +} + +impl OnReapAccount for Module { + /// Remove any existing access another account might have when the account is reaped. + /// This removes the final storage item managed by this module for any given account. + fn on_reap_account(who: &T::AccountId) { + >::remove(who); + } +} + +/// Simple pass through for the weight functions. +struct Passthrough(sp_std::marker::PhantomData<(AccountId, Call)>); + +impl Passthrough { + fn new() -> Self { Self(Default::default()) } +} +impl WeighData<(&AccountId, &Box)> for Passthrough { + fn weigh_data(&self, (_, call): (&AccountId, &Box)) -> Weight { + call.get_dispatch_info().weight + 10_000 + } +} +impl ClassifyDispatch<(&AccountId, &Box)> for Passthrough { + fn classify_dispatch(&self, (_, call): (&AccountId, &Box)) -> DispatchClass { + call.get_dispatch_info().class + } +} +impl PaysFee<(&AccountId, &Box)> for Passthrough { + fn pays_fee(&self, (_, call): (&AccountId, &Box)) -> bool { + call.get_dispatch_info().pays_fee + } +} diff --git a/frame/recovery/src/mock.rs b/frame/recovery/src/mock.rs new file mode 100644 index 0000000000..be9ed5c97e --- /dev/null +++ b/frame/recovery/src/mock.rs @@ -0,0 +1,143 @@ +// Copyright 2020 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 + +use super::*; + +use frame_support::{ + impl_outer_origin, impl_outer_dispatch, impl_outer_event, parameter_types, + weights::Weight, +}; +use sp_core::H256; +// The testing primitives are very useful for avoiding having to work with signatures +// or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. +use sp_runtime::{ + Perbill, traits::{BlakeTwo256, IdentityLookup, OnInitialize, OnFinalize}, testing::Header, +}; +use crate as recovery; + +impl_outer_origin! { + pub enum Origin for Test where system = frame_system {} +} + +impl_outer_event! { + pub enum TestEvent for Test { + pallet_balances, + recovery, + } +} +impl_outer_dispatch! { + pub enum Call for Test where origin: Origin { + pallet_balances::Balances, + recovery::Recovery, + } +} + +// For testing the module, we construct most of a mock runtime. This means +// first constructing a configuration type (`Test`) which `impl`s each of the +// configuration traits of modules we want to use. +#[derive(Clone, Eq, PartialEq)] +pub struct Test; + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); +} + +impl frame_system::Trait for Test { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Call = Call; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = TestEvent; + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type ModuleToIndex = (); +} + +parameter_types! { + pub const ExistentialDeposit: u64 = 1; + pub const TransferFee: u64 = 0; + pub const CreationFee: u64 = 0; +} + +impl pallet_balances::Trait for Test { + type Balance = u128; + type OnFreeBalanceZero = (); + type OnReapAccount = (System, Recovery); + type OnNewAccount = (); + type Event = TestEvent; + type TransferPayment = (); + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type TransferFee = TransferFee; + type CreationFee = CreationFee; +} + +parameter_types! { + pub const ConfigDepositBase: u64 = 10; + pub const FriendDepositFactor: u64 = 1; + pub const MaxFriends: u16 = 3; + pub const RecoveryDeposit: u64 = 10; +} + +impl Trait for Test { + type Event = TestEvent; + type Call = Call; + type Currency = Balances; + type ConfigDepositBase = ConfigDepositBase; + type FriendDepositFactor = FriendDepositFactor; + type MaxFriends = MaxFriends; + type RecoveryDeposit = RecoveryDeposit; +} + +pub type Recovery = Module; +pub type System = frame_system::Module; +pub type Balances = pallet_balances::Module; + +pub type BalancesCall = pallet_balances::Call; +pub type RecoveryCall = super::Call; + +pub fn new_test_ext() -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + pallet_balances::GenesisConfig:: { + balances: vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)], + vesting: vec![], + }.assimilate_storage(&mut t).unwrap(); + t.into() +} + +/// Run until a particular block. +pub fn run_to_block(n: u64) { + while System::block_number() < n { + if System::block_number() > 1 { + System::on_finalize(System::block_number()); + } + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + } +} diff --git a/frame/recovery/src/tests.rs b/frame/recovery/src/tests.rs new file mode 100644 index 0000000000..76f05156ef --- /dev/null +++ b/frame/recovery/src/tests.rs @@ -0,0 +1,383 @@ +// Copyright 2020 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. + +use super::*; +use mock::{ + Recovery, Balances, Test, Origin, Call, BalancesCall, RecoveryCall, + new_test_ext, run_to_block +}; +use sp_runtime::traits::{BadOrigin}; +use frame_support::{ + assert_noop, assert_ok, + traits::{Currency}, +}; + +#[test] +fn basic_setup_works() { + new_test_ext().execute_with(|| { + // Nothing in storage to start + assert_eq!(Recovery::recovered_account(&1), None); + assert_eq!(Recovery::active_recovery(&1, &2), None); + assert_eq!(Recovery::recovery_config(&1), None); + // Everyone should have starting balance of 100 + assert_eq!(Balances::free_balance(&1), 100); + }); +} + +#[test] +fn set_recovered_works() { + new_test_ext().execute_with(|| { + // Not accessible by a normal user + assert_noop!(Recovery::set_recovered(Origin::signed(1), 5, 1), BadOrigin); + // Root can set a recovered account though + assert_ok!(Recovery::set_recovered(Origin::ROOT, 5, 1)); + // Account 1 should now be able to make a call through account 5 + let call = Box::new(Call::Balances(BalancesCall::transfer(1, 100))); + assert_ok!(Recovery::as_recovered(Origin::signed(1), 5, call)); + // Account 1 has successfully drained the funds from account 5 + assert_eq!(Balances::free_balance(1), 200); + assert_eq!(Balances::free_balance(5), 0); + }); +} + +#[test] +fn recovery_lifecycle_works() { + new_test_ext().execute_with(|| { + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + // Account 5 sets up a recovery configuration on their account + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends, threshold, delay_period)); + // Some time has passed, and the user lost their keys! + run_to_block(10); + // Using account 1, the user begins the recovery process to recover the lost account + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + // Off chain, the user contacts their friends and asks them to vouch for the recovery attempt + assert_ok!(Recovery::vouch_recovery(Origin::signed(2), 5, 1)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(3), 5, 1)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(4), 5, 1)); + // We met the threshold, lets try to recover the account...? + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::DelayPeriod); + // We need to wait at least the delay_period number of blocks before we can recover + run_to_block(20); + assert_ok!(Recovery::claim_recovery(Origin::signed(1), 5)); + // Account 1 can use account 5 to close the active recovery process, claiming the deposited + // funds used to initiate the recovery process into account 5. + let call = Box::new(Call::Recovery(RecoveryCall::close_recovery(1))); + assert_ok!(Recovery::as_recovered(Origin::signed(1), 5, call)); + // Account 1 can then use account 5 to remove the recovery configuration, claiming the + // deposited funds used to create the recovery configuration into account 5. + let call = Box::new(Call::Recovery(RecoveryCall::remove_recovery())); + assert_ok!(Recovery::as_recovered(Origin::signed(1), 5, call)); + // Account 1 should now be able to make a call through account 5 to get all of their funds + assert_eq!(Balances::free_balance(5), 110); + let call = Box::new(Call::Balances(BalancesCall::transfer(1, 110))); + assert_ok!(Recovery::as_recovered(Origin::signed(1), 5, call)); + // All funds have been fully recovered! + assert_eq!(Balances::free_balance(1), 200); + assert_eq!(Balances::free_balance(5), 0); + // All storage items are removed from the module + assert!(!>::exists(&5, &1)); + assert!(!>::exists(&5)); + assert!(!>::exists(&5)); + }); +} + +#[test] +fn malicious_recovery_fails() { + new_test_ext().execute_with(|| { + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + // Account 5 sets up a recovery configuration on their account + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends, threshold, delay_period)); + // Some time has passed, and account 1 wants to try and attack this account! + run_to_block(10); + // Using account 1, the malicious user begins the recovery process on account 5 + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + // Off chain, the user **tricks** their friends and asks them to vouch for the recovery + assert_ok!(Recovery::vouch_recovery(Origin::signed(2), 5, 1)); // shame on you + assert_ok!(Recovery::vouch_recovery(Origin::signed(3), 5, 1)); // shame on you + assert_ok!(Recovery::vouch_recovery(Origin::signed(4), 5, 1)); // shame on you + // We met the threshold, lets try to recover the account...? + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::DelayPeriod); + // Account 1 needs to wait... + run_to_block(19); + // One more block to wait! + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::DelayPeriod); + // Account 5 checks their account every `delay_period` and notices the malicious attack! + // Account 5 can close the recovery process before account 1 can claim it + assert_ok!(Recovery::close_recovery(Origin::signed(5), 1)); + // By doing so, account 5 has now claimed the deposit originally reserved by account 1 + assert_eq!(Balances::total_balance(&1), 90); + // Thanks for the free money! + assert_eq!(Balances::total_balance(&5), 110); + // The recovery process has been closed, so account 1 can't make the claim + run_to_block(20); + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::NotStarted); + // Account 5 can remove their recovery config and pick some better friends + assert_ok!(Recovery::remove_recovery(Origin::signed(5))); + assert_ok!(Recovery::create_recovery(Origin::signed(5), vec![22, 33, 44], threshold, delay_period)); + }); +} + +#[test] +fn create_recovery_handles_basic_errors() { + new_test_ext().execute_with(|| { + // No friends + assert_noop!( + Recovery::create_recovery(Origin::signed(5), vec![], 1, 0), + Error::::NotEnoughFriends + ); + // Zero threshold + assert_noop!( + Recovery::create_recovery(Origin::signed(5), vec![2], 0, 0), + Error::::ZeroThreshold + ); + // Threshold greater than friends length + assert_noop!( + Recovery::create_recovery(Origin::signed(5), vec![2, 3, 4], 4, 0), + Error::::NotEnoughFriends + ); + // Too many friends + assert_noop!( + Recovery::create_recovery(Origin::signed(5), vec![1, 2, 3, 4], 4, 0), + Error::::MaxFriends + ); + // Unsorted friends + assert_noop!( + Recovery::create_recovery(Origin::signed(5), vec![3, 2, 4], 3, 0), + Error::::NotSorted + ); + // Duplicate friends + assert_noop!( + Recovery::create_recovery(Origin::signed(5), vec![2, 2, 4], 3, 0), + Error::::NotSorted + ); + // Already configured + assert_ok!( + Recovery::create_recovery(Origin::signed(5), vec![2, 3, 4], 3, 10) + ); + assert_noop!( + Recovery::create_recovery(Origin::signed(5), vec![2, 3, 4], 3, 10), + Error::::AlreadyRecoverable + ); + }); +} + +#[test] +fn create_recovery_works() { + new_test_ext().execute_with(|| { + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + // Account 5 sets up a recovery configuration on their account + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + // Deposit is taken, and scales with the number of friends they pick + // Base 10 + 1 per friends = 13 total reserved + assert_eq!(Balances::reserved_balance(5), 13); + // Recovery configuration is correctly stored + let recovery_config = RecoveryConfig { + delay_period, + deposit: 13, + friends: friends.clone(), + threshold, + }; + assert_eq!(Recovery::recovery_config(5), Some(recovery_config)); + }); +} + +#[test] +fn initiate_recovery_handles_basic_errors() { + new_test_ext().execute_with(|| { + // No recovery process set up for the account + assert_noop!( + Recovery::initiate_recovery(Origin::signed(1), 5), + Error::::NotRecoverable + ); + // Create a recovery process for next test + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + // Same user cannot recover same account twice + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + assert_noop!(Recovery::initiate_recovery(Origin::signed(1), 5), Error::::AlreadyStarted); + // No double deposit + assert_eq!(Balances::reserved_balance(&1), 10); + }); +} + +#[test] +fn initiate_recovery_works() { + new_test_ext().execute_with(|| { + // Create a recovery process for the test + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + // Recovery can be initiated + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + // Deposit is reserved + assert_eq!(Balances::reserved_balance(&1), 10); + // Recovery status object is created correctly + let recovery_status = ActiveRecovery { + created: 1, + deposit: 10, + friends: vec![], + }; + assert_eq!(>::get(&5, &1), Some(recovery_status)); + // Multiple users can attempt to recover the same account + assert_ok!(Recovery::initiate_recovery(Origin::signed(2), 5)); + }); +} + +#[test] +fn vouch_recovery_handles_basic_errors() { + new_test_ext().execute_with(|| { + // Cannot vouch for non-recoverable account + assert_noop!(Recovery::vouch_recovery(Origin::signed(2), 5, 1), Error::::NotRecoverable); + // Create a recovery process for next tests + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + // Cannot vouch a recovery process that has not started + assert_noop!(Recovery::vouch_recovery(Origin::signed(2), 5, 1), Error::::NotStarted); + // Initiate a recovery process + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + // Cannot vouch if you are not a friend + assert_noop!(Recovery::vouch_recovery(Origin::signed(22), 5, 1), Error::::NotFriend); + // Cannot vouch twice + assert_ok!(Recovery::vouch_recovery(Origin::signed(2), 5, 1)); + assert_noop!(Recovery::vouch_recovery(Origin::signed(2), 5, 1), Error::::AlreadyVouched); + }); +} + +#[test] +fn vouch_recovery_works() { + new_test_ext().execute_with(|| { + // Create and initiate a recovery process for the test + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + // Vouching works + assert_ok!(Recovery::vouch_recovery(Origin::signed(2), 5, 1)); + // Handles out of order vouches + assert_ok!(Recovery::vouch_recovery(Origin::signed(4), 5, 1)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(3), 5, 1)); + // Final recovery status object is updated correctly + let recovery_status = ActiveRecovery { + created: 1, + deposit: 10, + friends: vec![2, 3, 4], + }; + assert_eq!(>::get(&5, &1), Some(recovery_status)); + }); +} + +#[test] +fn claim_recovery_handles_basic_errors() { + new_test_ext().execute_with(|| { + // Cannot claim a non-recoverable account + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::NotRecoverable); + // Create a recovery process for the test + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + // Cannot claim an account which has not started the recovery process + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::NotStarted); + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + // Cannot claim an account which has not passed the delay period + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::DelayPeriod); + run_to_block(11); + // Cannot claim an account which has not passed the threshold number of votes + assert_ok!(Recovery::vouch_recovery(Origin::signed(2), 5, 1)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(3), 5, 1)); + // Only 2/3 is not good enough + assert_noop!(Recovery::claim_recovery(Origin::signed(1), 5), Error::::Threshold); + }); +} + +#[test] +fn claim_recovery_works() { + new_test_ext().execute_with(|| { + // Create, initiate, and vouch recovery process for the test + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(2), 5, 1)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(3), 5, 1)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(4), 5, 1)); + + run_to_block(11); + + // Account can be recovered. + assert_ok!(Recovery::claim_recovery(Origin::signed(1), 5)); + // Recovered storage item is correctly created + assert_eq!(>::get(&5), Some(1)); + // Account could be re-recovered in the case that the recoverer account also gets lost. + assert_ok!(Recovery::initiate_recovery(Origin::signed(4), 5)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(2), 5, 4)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(3), 5, 4)); + assert_ok!(Recovery::vouch_recovery(Origin::signed(4), 5, 4)); + + run_to_block(21); + + // Account is re-recovered. + assert_ok!(Recovery::claim_recovery(Origin::signed(4), 5)); + // Recovered storage item is correctly updated + assert_eq!(>::get(&5), Some(4)); + }); +} + +#[test] +fn close_recovery_handles_basic_errors() { + new_test_ext().execute_with(|| { + // Cannot close a non-active recovery + assert_noop!(Recovery::close_recovery(Origin::signed(5), 1), Error::::NotStarted); + }); +} + +#[test] +fn remove_recovery_works() { + new_test_ext().execute_with(|| { + // Cannot remove an unrecoverable account + assert_noop!(Recovery::remove_recovery(Origin::signed(5)), Error::::NotRecoverable); + // Create and initiate a recovery process for the test + let friends = vec![2, 3, 4]; + let threshold = 3; + let delay_period = 10; + assert_ok!(Recovery::create_recovery(Origin::signed(5), friends.clone(), threshold, delay_period)); + assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); + assert_ok!(Recovery::initiate_recovery(Origin::signed(2), 5)); + // Cannot remove a recovery when there are active recoveries. + assert_noop!(Recovery::remove_recovery(Origin::signed(5)), Error::::StillActive); + assert_ok!(Recovery::close_recovery(Origin::signed(5), 1)); + // Still need to remove one more! + assert_noop!(Recovery::remove_recovery(Origin::signed(5)), Error::::StillActive); + assert_ok!(Recovery::close_recovery(Origin::signed(5), 2)); + // Finally removed + assert_ok!(Recovery::remove_recovery(Origin::signed(5))); + }); +} -- GitLab From 70f1d8d968f374f09b395420901c0926a2d874f7 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Mon, 13 Jan 2020 19:00:04 +0100 Subject: [PATCH 110/296] Additional zero bid logic for Society pallet (#4604) * Select only one zero bid, better ordering of new bids * Select zero bid as head * Update comment * Update frame/society/src/tests.rs * Add new test, logic not updated yet * Implement `put_bid` to order same value bids Note that this extra logic currently does not do anything per the implementation of `binary_search` in Rust. --- frame/society/src/lib.rs | 106 +++++++++++++++++++++++++++++-------- frame/society/src/tests.rs | 65 +++++++++++++++++++++++ 2 files changed, 149 insertions(+), 22 deletions(-) diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index 005746aeb4..27051e4caf 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -1108,7 +1108,36 @@ impl, I: Instance> Module { const MAX_BID_COUNT: usize = 1000; match bids.binary_search_by(|bid| bid.value.cmp(&value)) { - Ok(pos) | Err(pos) => bids.insert(pos, Bid { + // Insert new elements after the existing ones. This ensures new bids + // with the same bid value are further down the list than existing ones. + Ok(pos) => { + let different_bid = bids.iter() + // Easily extract the index we are on + .enumerate() + // Skip ahead to the suggested position + .skip(pos) + // Keep skipping ahead until the position changes + .skip_while(|(_, x)| x.value <= bids[pos].value) + // Get the element when things changed + .next(); + // If the element is not at the end of the list, insert the new element + // in the spot. + if let Some((p, _)) = different_bid { + bids.insert(p, Bid { + value, + who: who.clone(), + kind: bid_kind, + }); + // If the element is at the end of the list, push the element on the end. + } else { + bids.push(Bid { + value, + who: who.clone(), + kind: bid_kind, + }); + } + }, + Err(pos) => bids.insert(pos, Bid { value, who: who.clone(), kind: bid_kind, @@ -1264,7 +1293,7 @@ impl, I: Instance> Module { // We track here the total_approvals so that every candidate has a unique range // of numbers from 0 to `total_approvals` with length `approval_count` so each // candidate is proportionally represented when selecting a "primary" below. - Some((candidate, total_approvals)) + Some((candidate, total_approvals, value)) } else { // Suspend Candidate >::insert(&candidate, (value, kind)); @@ -1299,8 +1328,8 @@ impl, I: Instance> Module { // select one as primary, randomly chosen from the accepted, weighted by approvals. // Choose a random number between 0 and `total_approvals` let primary_point = pick_usize(&mut rng, total_approvals - 1); - // Find the user who falls on that point - let primary = accepted.iter().find(|e| e.1 > primary_point) + // Find the zero bid or the user who falls on that point + let primary = accepted.iter().find(|e| e.2.is_zero() || e.1 > primary_point) .expect("e.1 of final item == total_approvals; \ worst case find will always return that item; qed") .0.clone(); @@ -1484,24 +1513,57 @@ impl, I: Instance> Module { { let max_members = MaxMembers::::get() as usize; // No more than 10 will be returned. - let max_selections: usize = 10.min(max_members.saturating_sub(members_len)); - - // Get the number of left-most bidders whose bids add up to less than `pot`. - let mut bids = >::get(); - let taken = bids.iter() - .scan(>::zero(), |total, bid| { - *total = total.saturating_add(bid.value); - Some((*total, bid.who.clone(), bid.kind.clone())) - }) - .take(max_selections) - .take_while(|x| pot >= x.0) - .count(); - - // No need to reset Bids if we're not taking anything. - if taken > 0 { - >::put(&bids[taken..]); + let mut max_selections: usize = 10.min(max_members.saturating_sub(members_len)); + + if max_selections > 0 { + // Get the number of left-most bidders whose bids add up to less than `pot`. + let mut bids = >::get(); + + // The list of selected candidates + let mut selected = Vec::new(); + + if bids.len() > 0 { + // Can only select at most the length of bids + max_selections = max_selections.min(bids.len()); + // Number of selected bids so far + let mut count = 0; + // Check if we have already selected a candidate with zero bid + let mut zero_selected = false; + // A running total of the cost to onboard these bids + let mut total_cost: BalanceOf = Zero::zero(); + + bids.retain(|bid| { + if count < max_selections { + // Handle zero bids. We only want one of them. + if bid.value.is_zero() { + // Select only the first zero bid + if !zero_selected { + selected.push(bid.clone()); + zero_selected = true; + count += 1; + return false + } + } else { + total_cost += bid.value; + // Select only as many users as the pot can support. + if total_cost <= pot { + selected.push(bid.clone()); + count += 1; + return false + } + } + } + true + }); + + // No need to reset Bids if we're not taking anything. + if count > 0 { + >::put(bids); + } + } + selected + } else { + vec![] } - bids.truncate(taken); - bids } } diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs index 61bb1fd232..7d3ee06a2a 100644 --- a/frame/society/src/tests.rs +++ b/frame/society/src/tests.rs @@ -742,3 +742,68 @@ fn max_limits_work() { assert_eq!(Society::candidates().len(), 10); }); } + +#[test] +fn zero_bid_works() { + // This tests: + // * Only one zero bid is selected. + // * That zero bid is placed as head when accepted. + EnvBuilder::new().execute(|| { + // Users make bids of various amounts + assert_ok!(Society::bid(Origin::signed(60), 400)); + assert_ok!(Society::bid(Origin::signed(50), 300)); + assert_ok!(Society::bid(Origin::signed(30), 0)); + assert_ok!(Society::bid(Origin::signed(20), 0)); + assert_ok!(Society::bid(Origin::signed(40), 0)); + + // Rotate period + run_to_block(4); + // Pot is 1000 after "PeriodSpend" + assert_eq!(Society::pot(), 1000); + assert_eq!(Balances::free_balance(Society::account_id()), 10_000); + // Choose smallest bidding users whose total is less than pot, with only one zero bid. + assert_eq!(Society::candidates(), vec![ + create_bid(0, 30, BidKind::Deposit(25)), + create_bid(300, 50, BidKind::Deposit(25)), + create_bid(400, 60, BidKind::Deposit(25)), + ]); + assert_eq!(>::get(), vec![ + create_bid(0, 20, BidKind::Deposit(25)), + create_bid(0, 40, BidKind::Deposit(25)), + ]); + // A member votes for these candidates to join the society + assert_ok!(Society::vote(Origin::signed(10), 30, true)); + assert_ok!(Society::vote(Origin::signed(10), 50, true)); + assert_ok!(Society::vote(Origin::signed(10), 60, true)); + run_to_block(8); + // Candidates become members after a period rotation + assert_eq!(Society::members(), vec![10, 30, 50, 60]); + // The zero bid is selected as head + assert_eq!(Society::head(), Some(30)); + }); +} + +#[test] +fn bids_ordered_correctly() { + // This tests that bids with the same value are placed in the list ordered + // with bidders who bid first earlier on the list. + EnvBuilder::new().execute(|| { + for i in 0..5 { + for j in 0..5 { + // Give them some funds + let _ = Balances::make_free_balance_be(&(100 + (i * 5 + j) as u128), 1000); + assert_ok!(Society::bid(Origin::signed(100 + (i * 5 + j) as u128), j)); + } + } + + let mut final_list = Vec::new(); + + for j in 0..5 { + for i in 0..5 { + final_list.push(create_bid(j, 100 + (i * 5 + j) as u128, BidKind::Deposit(25))); + } + } + + assert_eq!(>::get(), final_list); + }); +} -- GitLab From c93a0a3104c2b2710e9a30e67a545f0ebab37104 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Tue, 14 Jan 2020 08:41:18 +0100 Subject: [PATCH 111/296] custom weight function wrapper (#4158) * custom weight function wrapper * dox * Better tests. * remove u8 encoding * Update frame/support/src/weights.rs Co-Authored-By: thiolliere * fix pays fee Co-authored-by: thiolliere --- frame/staking/src/lib.rs | 1 - frame/staking/src/slashing.rs | 3 -- frame/support/src/weights.rs | 73 +++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index a59aa5d0c8..94618c9349 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1628,7 +1628,6 @@ impl Module { /// For each element in the iterator the given number of points in u32 is added to the /// validator, thus duplicates are handled. pub fn reward_by_indices(validators_points: impl IntoIterator) { - // TODO: This can be optimised once #3302 is implemented. let current_elected_len = >::current_elected().len() as u32; CurrentEraPointsEarned::mutate(|rewards| { diff --git a/frame/staking/src/slashing.rs b/frame/staking/src/slashing.rs index 6d591603fd..7322b9a1d3 100644 --- a/frame/staking/src/slashing.rs +++ b/frame/staking/src/slashing.rs @@ -649,9 +649,6 @@ fn pay_reporters( T::Slash::on_unbalanced(value_slashed); } -// TODO: function for undoing a slash. -// - #[cfg(test)] mod tests { use super::*; diff --git a/frame/support/src/weights.rs b/frame/support/src/weights.rs index f1092b5002..e44ab16458 100644 --- a/frame/support/src/weights.rs +++ b/frame/support/src/weights.rs @@ -236,6 +236,36 @@ impl SimpleDispatchInfo { } } +/// A struct to represent a weight which is a function of the input arguments. The given items have +/// the following types: +/// +/// - `F`: a closure with the same argument list as the dispatched, wrapped in a tuple. +/// - `DispatchClass`: class of the dispatch. +/// - `bool`: whether this dispatch pays fee or not. +pub struct FunctionOf(pub F, pub DispatchClass, pub bool); + +impl WeighData for FunctionOf +where + F : Fn(Args) -> Weight +{ + fn weigh_data(&self, args: Args) -> Weight { + (self.0)(args) + } +} + +impl ClassifyDispatch for FunctionOf { + fn classify_dispatch(&self, _: Args) -> DispatchClass { + self.1.clone() + } +} + +impl PaysFee for FunctionOf { + fn pays_fee(&self, _: T) -> bool { + self.2 + } +} + + /// Implementation for unchecked extrinsic. impl GetDispatchInfo for UncheckedExtrinsic @@ -271,3 +301,46 @@ impl GetDispatchInfo for sp_runtime::testing::TestX } } } + +#[cfg(test)] +#[allow(dead_code)] +mod tests { + use crate::decl_module; + use super::*; + + pub trait Trait { + type Origin; + type Balance; + type BlockNumber; + } + + pub struct TraitImpl {} + + impl Trait for TraitImpl { + type Origin = u32; + type BlockNumber = u32; + type Balance = u32; + } + + decl_module! { + pub struct Module for enum Call where origin: T::Origin { + // no arguments, fixed weight + #[weight = SimpleDispatchInfo::FixedNormal(1000)] + fn f0(_origin) { unimplemented!(); } + + // weight = a x 10 + b + #[weight = FunctionOf(|args: (&u32, &u32)| args.0 * 10 + args.1, DispatchClass::Normal, true)] + fn f11(_origin, _a: u32, _eb: u32) { unimplemented!(); } + + #[weight = FunctionOf(|_: (&u32, &u32)| 0, DispatchClass::Operational, true)] + fn f12(_origin, _a: u32, _eb: u32) { unimplemented!(); } + } + } + + #[test] + fn weights_are_correct() { + assert_eq!(Call::::f11(10, 20).get_dispatch_info().weight, 120); + assert_eq!(Call::::f11(10, 20).get_dispatch_info().class, DispatchClass::Normal); + assert_eq!(Call::::f0().get_dispatch_info().weight, 1000); + } +} -- GitLab From b443ddad65f2ffed68db4973b7b78231c6fc3674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 14 Jan 2020 11:18:56 +0100 Subject: [PATCH 112/296] Take `genesis_storage` by ref (#4617) Instead of having these weird implementation of `BuildStorage for &ChainSpec` we should just take the `genesis_storage` by ref. The `BuildStorage` trait changed some time ago to take a self ref anyway, instead of a self value. Also fixes warnings in frame-staking --- client/chain-spec/src/chain_spec.rs | 2 +- client/db/src/lib.rs | 2 +- client/src/client.rs | 6 +++--- client/src/lib.rs | 2 +- client/src/light/mod.rs | 2 +- frame/staking/src/lib.rs | 6 ++---- test-utils/client/src/lib.rs | 2 +- 7 files changed, 10 insertions(+), 12 deletions(-) diff --git a/client/chain-spec/src/chain_spec.rs b/client/chain-spec/src/chain_spec.rs index 6e58083e8c..81cbce5ea7 100644 --- a/client/chain-spec/src/chain_spec.rs +++ b/client/chain-spec/src/chain_spec.rs @@ -70,7 +70,7 @@ impl GenesisSource { } } -impl<'a, G: RuntimeGenesis, E> BuildStorage for &'a ChainSpec { +impl BuildStorage for ChainSpec { fn build_storage(&self) -> Result { match self.genesis.resolve()? { Genesis::Runtime(gc) => gc.build_storage(), diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 06d0dc18ff..b4eae2db2b 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -274,7 +274,7 @@ pub enum DatabaseSettingsSrc { pub fn new_client( settings: DatabaseSettings, executor: E, - genesis_storage: S, + genesis_storage: &S, fork_blocks: ForkBlocks, bad_blocks: BadBlocks, execution_extensions: ExecutionExtensions, diff --git a/client/src/client.rs b/client/src/client.rs index 2babf6f3e9..aeca433184 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -129,7 +129,7 @@ impl PrePostHeader { /// Create an instance of in-memory client. pub fn new_in_mem( executor: E, - genesis_storage: S, + genesis_storage: &S, keystore: Option, ) -> sp_blockchain::Result, @@ -149,7 +149,7 @@ pub fn new_in_mem( pub fn new_with_backend( backend: Arc, executor: E, - build_genesis_storage: S, + build_genesis_storage: &S, keystore: Option, ) -> sp_blockchain::Result, Block, RA>> where @@ -187,7 +187,7 @@ impl Client where pub fn new( backend: Arc, executor: E, - build_genesis_storage: S, + build_genesis_storage: &S, fork_blocks: ForkBlocks, bad_blocks: BadBlocks, execution_extensions: ExecutionExtensions, diff --git a/client/src/lib.rs b/client/src/lib.rs index cfaf08ca7e..db2d4785a2 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -65,7 +65,7 @@ //! NativeExecutor::::new(WasmExecutionMethod::Interpreted, None), //! ), //! // This parameter provides the storage for the chain genesis. -//! ::default(), +//! &::default(), //! Default::default(), //! Default::default(), //! Default::default(), diff --git a/client/src/light/mod.rs b/client/src/light/mod.rs index 5052b36d7f..c067fc9caa 100644 --- a/client/src/light/mod.rs +++ b/client/src/light/mod.rs @@ -56,7 +56,7 @@ pub fn new_light_backend(blockchain: Arc>) -> Arc( backend: Arc>>, - genesis_storage: GS, + genesis_storage: &GS, code_executor: E, ) -> ClientResult< Client< diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 94618c9349..326a015990 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -283,7 +283,7 @@ use sp_staking::{ use sp_runtime::{Serialize, Deserialize}; use frame_system::{self as system, ensure_signed, ensure_root}; -use sp_phragmen::{ExtendedBalance, PhragmenStakedAssignment}; +use sp_phragmen::ExtendedBalance; const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4; const MAX_NOMINATIONS: usize = 16; @@ -1508,12 +1508,10 @@ impl Module { .collect::>(); let assignments = phragmen_result.assignments; - let to_votes = |b: BalanceOf| - , u64>>::convert(b) as ExtendedBalance; let to_balance = |e: ExtendedBalance| >>::convert(e); - let mut supports = sp_phragmen::build_support_map::<_, _, _, T::CurrencyToVote>( + let supports = sp_phragmen::build_support_map::<_, _, _, T::CurrencyToVote>( &elected_stashes, &assignments, Self::slashable_balance_of, diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index ac1cfe4d6b..c8d3a809a7 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -190,7 +190,7 @@ impl TestClientBuilder let client = sc_client::Client::new( self.backend.clone(), executor, - storage, + &storage, Default::default(), Default::default(), ExecutionExtensions::new( -- GitLab From 012c5ef1f999174a12efe4f7646666b2ec2a146c Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 14 Jan 2020 15:07:47 +0100 Subject: [PATCH 113/296] Add trivial EnsureFounder verifier to society (#4615) * Add trivial EnsureFounder verifier to society * Fix potential panic * Keep founder account around. * Cleanups * Fix. * Fix tests Co-authored-by: Shawn Tabrizi --- frame/society/src/lib.rs | 177 +++++++++++++++++++++---------------- frame/society/src/mock.rs | 5 +- frame/society/src/tests.rs | 46 +++++++--- 3 files changed, 139 insertions(+), 89 deletions(-) diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index 27051e4caf..8c99e5b81a 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -15,17 +15,17 @@ // along with Substrate. If not, see . //! # Society Module -//! +//! //! - [`society::Trait`](./trait.Trait.html) //! - [`Call`](./enum.Call.html) -//! +//! //! ## Overview -//! +//! //! The Society module is an economic game which incentivizes users to participate -//! and maintain a membership society. -//! +//! and maintain a membership society. +//! //! ### User Types -//! +//! //! At any point, a user in the society can be one of a: //! * Bidder - A user who has submitted intention of joining the society. //! * Candidate - A user who will be voted on to join the society. @@ -33,31 +33,31 @@ //! * Member - A user who is a member of the society. //! * Suspended Member - A member of the society who has accumulated too many strikes //! or failed their membership challenge. -//! +//! //! Of the non-suspended members, there is always a: //! * Head - A member who is exempt from suspension. //! * Defender - A member whose membership is under question and voted on again. -//! +//! //! Of the non-suspended members of the society, a random set of them are chosen as //! "skeptics". The mechanics of skeptics is explained in the //! [member phase](#member-phase) below. -//! +//! //! ### Mechanics -//! +//! //! #### Rewards -//! +//! //! Members are incentivized to participate in the society through rewards paid //! by the Society treasury. These payments have a maturity period that the user //! must wait before they are able to access the funds. -//! +//! //! #### Punishments -//! +//! //! Members can be punished by slashing the reward payouts that have not been //! collected. Additionally, members can accumulate "strikes", and when they //! reach a max strike limit, they become suspended. -//! +//! //! #### Skeptics -//! +//! //! During the voting period, a random set of members are selected as "skeptics". //! These skeptics are expected to vote on the current candidates. If they do not vote, //! their skeptic status is treated as a rejection vote, the member is deemed @@ -72,7 +72,7 @@ //! assuming no one else votes, the defender always get a free vote on their //! own challenge keeping them in the society. The Head member is exempt from the //! negative outcome of a membership challenge. -//! +//! //! #### Society Treasury //! //! The membership society is independently funded by a treasury managed by this @@ -80,17 +80,17 @@ //! to determine the number of accepted bids. //! //! #### Rate of Growth -//! +//! //! The membership society can grow at a rate of 10 accepted candidates per rotation period up //! to the max membership threshold. Once this threshold is met, candidate selections //! are stalled until there is space for new members to join. This can be resolved by //! voting out existing members through the random challenges or by using governance //! to increase the maximum membership count. -//! +//! //! ### User Life Cycle -//! +//! //! A user can go through the following phases: -//! +//! //! ```ignore //! +-------> User <----------+ //! | + | @@ -115,40 +115,40 @@ //! | | //! +------------------Society---------------------+ //! ``` -//! +//! //! #### Initialization -//! +//! //! The society is initialized with a single member who is automatically chosen as the Head. -//! +//! //! #### Bid Phase -//! +//! //! New users must have a bid to join the society. -//! +//! //! A user can make a bid by reserving a deposit. Alternatively, an already existing member //! can create a bid on a user's behalf by "vouching" for them. -//! +//! //! A bid includes reward information that the user would like to receive for joining //! the society. A vouching bid can additionally request some portion of that reward as a tip //! to the voucher for vouching for the prospective candidate. -//! +//! //! Every rotation period, Bids are ordered by reward amount, and the module //! selects as many bids the Society Pot can support for that period. -//! +//! //! These selected bids become candidates and move on to the Candidate phase. //! Bids that were not selected stay in the bidder pool until they are selected or //! a user chooses to "unbid". -//! +//! //! #### Candidate Phase -//! +//! //! Once a bidder becomes a candidate, members vote whether to approve or reject //! that candidate into society. This voting process also happens during a rotation period. -//! +//! //! The approval and rejection criteria for candidates are not set on chain, //! and may change for different societies. -//! +//! //! At the end of the rotation period, we collect the votes for a candidate //! and randomly select a vote as the final outcome. -//! +//! //! ```ignore //! [ a-accept, r-reject, s-skeptic ] //! +----------------------------------+ @@ -163,63 +163,63 @@ //! //! Result: Rejected //! ``` -//! +//! //! Each member that voted opposite to this randomly selected vote is punished by //! slashing their unclaimed payouts and increasing the number of strikes they have. -//! +//! //! These slashed funds are given to a random user who voted the same as the //! selected vote as a reward for participating in the vote. -//! +//! //! If the candidate wins the vote, they receive their bid reward as a future payout. //! If the bid was placed by a voucher, they will receive their portion of the reward, //! before the rest is paid to the winning candidate. //! //! One winning candidate is selected as the Head of the members. This is randomly //! chosen, weighted by the number of approvals the winning candidates accumulated. -//! +//! //! If the candidate loses the vote, they are suspended and it is up to the Suspension //! Judgement origin to determine if the candidate should go through the bidding process //! again, should be accepted into the membership society, or rejected and their deposit //! slashed. -//! +//! //! #### Member Phase -//! +//! //! Once a candidate becomes a member, their role is to participate in society. -//! +//! //! Regular participation involves voting on candidates who want to join the membership //! society, and by voting in the right way, a member will accumulate future payouts. //! When a payout matures, members are able to claim those payouts. -//! +//! //! Members can also vouch for users to join the society, and request a "tip" from //! the fees the new member would collect by joining the society. This vouching //! process is useful in situations where a user may not have enough balance to //! satisfy the bid deposit. A member can only vouch one user at a time. -//! +//! //! During rotation periods, a random group of members are selected as "skeptics". //! These skeptics are expected to vote on the current candidates. If they do not vote, //! their skeptic status is treated as a rejection vote, the member is deemed //! "lazy", and are given a strike per missing vote. -//! +//! //! There is a challenge period in parallel to the rotation period. During a challenge period, //! a random member is selected to defend their membership to the society. Other members //! make a traditional majority-wins vote to determine if the member should stay in the society. //! Ties are treated as a failure of the challenge. -//! +//! //! If a member accumulates too many strikes or fails their membership challenge, //! they will become suspended. While a member is suspended, they are unable to //! claim matured payouts. It is up to the Suspension Judgement origin to determine //! if the member should re-enter society or be removed from society with all their //! future payouts slashed. -//! +//! //! ## Interface -//! +//! //! ### Dispatchable Functions -//! +//! //! #### For General Users -//! +//! //! * `bid` - A user can make a bid to join the membership society by reserving a deposit. //! * `unbid` - A user can withdraw their bid for entry, the deposit is returned. -//! +//! //! #### For Members //! //! * `vouch` - A member can place a bid on behalf of a user to join the membership society. @@ -228,9 +228,9 @@ //! * `defender_vote` - A member can vote to approve or reject a defender's continued membership //! to the society. //! * `payout` - A member can claim their first matured payment. -//! +//! //! #### For Super Users -//! +//! //! * `found` - The founder origin can initiate this society. Useful for bootstrapping the Society //! pallet on an already running chain. //! * `judge_suspended_member` - The suspension judgement origin is able to make @@ -305,7 +305,7 @@ pub trait Trait: system::Trait { type MaxLockDuration: Get; /// The origin that is allowed to call `found`. - type FounderOrigin: EnsureOrigin; + type FounderSetOrigin: EnsureOrigin; /// The origin that is allowed to make suspension judgements. type SuspensionJudgementOrigin: EnsureOrigin; @@ -400,6 +400,10 @@ impl BidKind { // This module's storage items. decl_storage! { trait Store for Module, I: Instance=DefaultInstance> as Society { + /// The first member. + pub Founder get(founder) build(|config: &GenesisConfig| config.members.first().cloned()): + Option; + /// The current set of candidates; bidders that are attempting to become members. pub Candidates get(candidates): Vec>>; @@ -444,7 +448,7 @@ decl_storage! { /// The defending member currently being challenged. Defender get(fn defender): Option; - + /// Votes for the defender. DefenderVotes: map hasher(twox_64_concat) T::AccountId => Option; @@ -796,26 +800,26 @@ decl_module! { /// This is done as a discrete action in order to allow for the /// module to be included into a running chain and can only be done once. /// - /// The dispatch origin for this call must be from the _FounderOrigin_. + /// The dispatch origin for this call must be from the _FounderSetOrigin_. /// /// Parameters: /// - `founder` - The first member and head of the newly founded society. /// /// # - /// - One storage read to check `Head`. O(1) + /// - Two storage mutates to set `Head` and `Founder`. O(1) /// - One storage write to add the first member to society. O(1) - /// - One storage write to add new Head. O(1) /// - One event. /// /// Total Complexity: O(1) /// # #[weight = SimpleDispatchInfo::FixedNormal(10_000)] fn found(origin, founder: T::AccountId) { - T::FounderOrigin::ensure_origin(origin)?; + T::FounderSetOrigin::ensure_origin(origin)?; ensure!(!>::exists(), Error::::AlreadyFounded); // This should never fail in the context of this function... Self::add_member(&founder)?; >::put(&founder); + >::put(&founder); Self::deposit_event(RawEvent::Founded(founder)); } /// Allow suspension judgement origin to make judgement on a suspended member. @@ -849,7 +853,7 @@ decl_module! { fn judge_suspended_member(origin, who: T::AccountId, forgive: bool) { T::SuspensionJudgementOrigin::ensure_origin(origin)?; ensure!(>::exists(&who), Error::::NotSuspended); - + if forgive { // Try to add member back to society. Can fail with `MaxMembers` limit. Self::add_member(&who)?; @@ -1010,33 +1014,35 @@ decl_error! { pub enum Error for Module, I: Instance> { /// An incorrect position was provided. BadPosition, - /// User is not a member + /// User is not a member. NotMember, - /// User is already a member + /// User is already a member. AlreadyMember, - /// User is suspended + /// User is suspended. Suspended, - /// User is not suspended + /// User is not suspended. NotSuspended, - /// Nothing to payout + /// Nothing to payout. NoPayout, - /// Society already founded + /// Society already founded. AlreadyFounded, - /// Not enough in pot to accept candidate + /// Not enough in pot to accept candidate. InsufficientPot, - /// Member is already vouching or banned from vouching again + /// Member is already vouching or banned from vouching again. AlreadyVouching, - /// Member is not vouching + /// Member is not vouching. NotVouching, - /// Cannot remove head + /// Cannot remove the head of the chain. Head, - /// User has already made a bid + /// Cannot remove the founder. + Founder, + /// User has already made a bid. AlreadyBid, - /// User is already a candidate + /// User is already a candidate. AlreadyCandidate, - /// User is not a candidate + /// User is not a candidate. NotCandidate, - /// Too many members in the society + /// Too many members in the society. MaxMembers, } } @@ -1081,6 +1087,18 @@ decl_event! { } } +/// Simple ensure origin struct to filter for the founder account. +pub struct EnsureFounder(sp_std::marker::PhantomData); +impl EnsureOrigin for EnsureFounder { + type Success = T::AccountId; + fn try_origin(o: T::Origin) -> Result { + o.into().and_then(|o| match (o, Founder::::get()) { + (system::RawOrigin::Signed(ref who), Some(ref f)) if who == f => Ok(who.clone()), + (r, _) => Err(T::Origin::from(r)), + }) + } +} + /// Pick an item at pseudo-random from the slice, given the `rng`. `None` iff the slice is empty. fn pick_item<'a, R: RngCore, T>(rng: &mut R, items: &'a [T]) -> Option<&'a T> { if items.is_empty() { @@ -1201,6 +1219,7 @@ impl, I: Instance> Module { /// removes them from the Members storage item. pub fn remove_member(m: &T::AccountId) -> DispatchResult { ensure!(Self::head() != Some(m.clone()), Error::::Head); + ensure!(Self::founder() != Some(m.clone()), Error::::Founder); >::mutate(|members| match members.binary_search(&m) { @@ -1251,7 +1270,7 @@ impl, I: Instance> Module { .filter_map(|m| >::take(&candidate, m).map(|v| (v, m))) .inspect(|&(v, _)| if v == Vote::Approve { approval_count += 1 }) .collect::>(); - + // Select one of the votes at random. // Note that `Vote::Skeptical` and `Vote::Reject` both reject the candidate. let is_accepted = pick_item(&mut rng, &votes).map(|x| x.0) == Some(Vote::Approve); @@ -1325,7 +1344,7 @@ impl, I: Instance> Module { // if at least one candidate was accepted... if !accepted.is_empty() { - // select one as primary, randomly chosen from the accepted, weighted by approvals. + // select one as primary, randomly chosen from the accepted, weighted by approvals. // Choose a random number between 0 and `total_approvals` let primary_point = pick_usize(&mut rng, total_approvals - 1); // Find the zero bid or the user who falls on that point @@ -1333,7 +1352,7 @@ impl, I: Instance> Module { .expect("e.1 of final item == total_approvals; \ worst case find will always return that item; qed") .0.clone(); - + let accounts = accepted.into_iter().map(|x| x.0).collect::>(); // Then write everything back out, signal the changed membership and leave an event. @@ -1509,8 +1528,10 @@ impl, I: Instance> Module { /// the number of bids would not surpass `MaxMembers` if all were accepted. /// /// May be empty. - pub fn take_selected(members_len: usize, pot: BalanceOf) -> Vec>> - { + pub fn take_selected( + members_len: usize, + pot: BalanceOf + ) -> Vec>> { let max_members = MaxMembers::::get() as usize; // No more than 10 will be returned. let mut max_selections: usize = 10.min(max_members.saturating_sub(members_len)); @@ -1521,7 +1542,7 @@ impl, I: Instance> Module { // The list of selected candidates let mut selected = Vec::new(); - + if bids.len() > 0 { // Can only select at most the length of bids max_selections = max_selections.min(bids.len()); diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index fc46561fd4..3ce8938f95 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -104,7 +104,7 @@ impl Trait for Test { type MembershipChanged = (); type RotationPeriod = RotationPeriod; type MaxLockDuration = MaxLockDuration; - type FounderOrigin = EnsureSignedBy; + type FounderSetOrigin = EnsureSignedBy; type SuspensionJudgementOrigin = EnsureSignedBy; type ChallengePeriod = ChallengePeriod; } @@ -133,6 +133,9 @@ impl EnvBuilder { (40, 50), (50, 50), (60, 50), + (70, 50), + (80, 50), + (90, 50), ], pot: 0, max_members: 100, diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs index 7d3ee06a2a..886363590d 100644 --- a/frame/society/src/tests.rs +++ b/frame/society/src/tests.rs @@ -25,6 +25,8 @@ use sp_runtime::traits::BadOrigin; #[test] fn founding_works() { EnvBuilder::new().with_members(vec![]).execute(|| { + // No founder initially. + assert_eq!(Society::founder(), None); // Account 1 is set as the founder origin // Account 5 cannot start a society assert_noop!(Society::found(Origin::signed(5), 20), BadOrigin); @@ -34,6 +36,8 @@ fn founding_works() { assert_eq!(Society::members(), vec![10]); // 10 is the head of the society assert_eq!(Society::head(), Some(10)); + // ...and also the founder + assert_eq!(Society::founder(), Some(10)); // Cannot start another society assert_noop!(Society::found(Origin::signed(1), 20), Error::::AlreadyFounded); }); @@ -264,7 +268,7 @@ fn suspended_member_lifecycle_works() { // Suspended members cannot get payout Society::bump_payout(&20, 10, 100); assert_noop!(Society::payout(Origin::signed(20)), Error::::NotMember); - + // Normal people cannot make judgement assert_noop!(Society::judge_suspended_member(Origin::signed(20), 20, true), BadOrigin); @@ -460,10 +464,11 @@ fn unbid_vouch_works() { } #[test] -fn head_cannot_be_removed() { +fn founder_and_head_cannot_be_removed() { EnvBuilder::new().execute(|| { - // 10 is the only member and head + // 10 is the only member, founder, and head assert_eq!(Society::members(), vec![10]); + assert_eq!(Society::founder(), Some(10)); assert_eq!(Society::head(), Some(10)); // 10 can still accumulate strikes assert_ok!(Society::bid(Origin::signed(20), 0)); @@ -485,16 +490,37 @@ fn head_cannot_be_removed() { run_to_block(32); assert_eq!(Society::members(), vec![10, 50]); assert_eq!(Society::head(), Some(50)); + // Founder is unchanged + assert_eq!(Society::founder(), Some(10)); - // 10 can now be suspended for strikes + // 50 can still accumulate strikes assert_ok!(Society::bid(Origin::signed(60), 0)); - run_to_block(36); - // The candidate is rejected, so voting approve will give a strike - assert_ok!(Society::vote(Origin::signed(10), 60, true)); run_to_block(40); - assert_eq!(Strikes::::get(10), 0); - assert_eq!(>::get(10), Some(())); - assert_eq!(Society::members(), vec![50]); + assert_eq!(Strikes::::get(50), 1); + assert_ok!(Society::bid(Origin::signed(70), 0)); + run_to_block(48); + assert_eq!(Strikes::::get(50), 2); + + // Replace the head + assert_ok!(Society::bid(Origin::signed(80), 0)); + run_to_block(52); + assert_ok!(Society::vote(Origin::signed(10), 80, true)); + assert_ok!(Society::vote(Origin::signed(50), 80, true)); + assert_ok!(Society::defender_vote(Origin::signed(10), true)); // Keep defender around + run_to_block(56); + assert_eq!(Society::members(), vec![10, 50, 80]); + assert_eq!(Society::head(), Some(80)); + assert_eq!(Society::founder(), Some(10)); + + // 50 can now be suspended for strikes + assert_ok!(Society::bid(Origin::signed(90), 0)); + run_to_block(60); + // The candidate is rejected, so voting approve will give a strike + assert_ok!(Society::vote(Origin::signed(50), 90, true)); + run_to_block(64); + assert_eq!(Strikes::::get(50), 0); + assert_eq!(>::get(50), Some(())); + assert_eq!(Society::members(), vec![10, 80]); }); } -- GitLab From 410ce114e8fb37e5807606ed77fec80393042435 Mon Sep 17 00:00:00 2001 From: Ashley Date: Tue, 14 Jan 2020 15:43:45 +0100 Subject: [PATCH 114/296] Update the service to std futures (#4447) * Switch service to futures03 * Fix tests * Fix service test and cli * Re-add Executor trait to SpawnTaskHandle * Fix node-service * Update babe * Fix browser node * Update aura * Revert back to tokio-executor to fix runtime panic * Add todo item * Fix service tests again * Timeout test futures * Fix tests * nits * Fix service test * Remove zstd patch * Re-add futures01 to aura and babe tests as a dev-dep * Change failing test to tee * Fix node * Upgrade tokio * fix society * Start switching grandpa to stable futures * Revert "Start switching grandpa to stable futures" This reverts commit 9c1976346237637effc07c13f7d0403daf5e71cf. * Fix utils * Revert substrate service test * Revert gitlab Co-authored-by: thiolliere --- Cargo.lock | 11 +- bin/node-template/Cargo.toml | 3 +- bin/node-template/src/cli.rs | 31 ++--- bin/node-template/src/service.rs | 5 +- bin/node/cli/Cargo.toml | 3 +- bin/node/cli/src/cli.rs | 35 ++---- bin/node/cli/src/service.rs | 13 +- client/cli/Cargo.toml | 4 +- client/cli/src/informant.rs | 7 +- client/cli/src/lib.rs | 11 +- client/consensus/aura/Cargo.toml | 4 +- client/consensus/aura/src/lib.rs | 11 +- client/consensus/babe/Cargo.toml | 4 +- client/consensus/babe/src/lib.rs | 8 +- client/consensus/babe/src/tests.rs | 4 +- client/finality-grandpa/src/lib.rs | 8 +- client/service/Cargo.toml | 8 +- client/service/src/builder.rs | 86 ++++++------- client/service/src/chain_ops.rs | 25 ++-- client/service/src/lib.rs | 186 +++++++++++++---------------- client/service/src/status_sinks.rs | 66 +++++----- client/service/test/Cargo.toml | 4 +- client/service/test/src/lib.rs | 9 +- utils/browser/src/lib.rs | 12 +- 24 files changed, 246 insertions(+), 312 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 82f43ac5d5..086df23fd2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3025,7 +3025,6 @@ dependencies = [ "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "frame-support 2.0.0", "frame-system 2.0.0", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3077,7 +3076,7 @@ dependencies = [ "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-build-script-utils 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3217,7 +3216,6 @@ name = "node-template" version = "2.0.0" dependencies = [ "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", @@ -3241,7 +3239,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", "substrate-build-script-utils 2.0.0", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5738,6 +5736,7 @@ dependencies = [ "exit-future 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "grafana-data-source 2.0.0", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5775,9 +5774,8 @@ dependencies = [ "substrate-test-runtime-client 2.0.0", "sysinfo 0.9.6 (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.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", "tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7230,6 +7228,7 @@ dependencies = [ "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/bin/node-template/Cargo.toml b/bin/node-template/Cargo.toml index aaaae647cf..0333e887ec 100644 --- a/bin/node-template/Cargo.toml +++ b/bin/node-template/Cargo.toml @@ -11,10 +11,9 @@ path = "src/main.rs" [dependencies] futures = "0.3.1" -futures01 = { package = "futures", version = "0.1.29" } ctrlc = { version = "3.1.3", features = ["termination"] } log = "0.4.8" -tokio = "0.1.22" +tokio = { version = "0.2", features = ["rt-threaded"] } parking_lot = "0.9.0" codec = { package = "parity-scale-codec", version = "1.0.0" } trie-root = "0.15.2" diff --git a/bin/node-template/src/cli.rs b/bin/node-template/src/cli.rs index 16638c4af9..44764e5c9d 100644 --- a/bin/node-template/src/cli.rs +++ b/bin/node-template/src/cli.rs @@ -1,5 +1,5 @@ use crate::service; -use futures::{future::{select, Map}, FutureExt, TryFutureExt, channel::oneshot, compat::Future01CompatExt}; +use futures::{future::{select, Map, Either}, FutureExt, channel::oneshot}; use std::cell::RefCell; use tokio::runtime::Runtime; pub use sc_cli::{VersionInfo, IntoExit, error}; @@ -75,36 +75,23 @@ where let informant = informant::build(&service); - let future = select(exit, informant) - .map(|_| Ok(())) - .compat(); - - runtime.executor().spawn(future); + let handle = runtime.spawn(select(exit, informant)); // we eagerly drop the service so that the internal exit future is fired, // but we need to keep holding a reference to the global telemetry guard let _telemetry = service.telemetry(); - let service_res = { - let exit = e.into_exit(); - let service = service - .map_err(|err| error::Error::Service(err)) - .compat(); - let select = select(service, exit) - .map(|_| Ok(())) - .compat(); - runtime.block_on(select) - }; + let exit = e.into_exit(); + let service_res = runtime.block_on(select(service, exit)); let _ = exit_send.send(()); - // TODO [andre]: timeout this future #1318 - - use futures01::Future; + runtime.block_on(handle); - let _ = runtime.shutdown_on_idle().wait(); - - service_res + match service_res { + Either::Left((res, _)) => res.map_err(error::Error::Service), + Either::Right((_, _)) => Ok(()) + } } // handles ctrl-c diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index 92db95b5c7..7f6ff67d28 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -12,6 +12,7 @@ pub use sc_executor::NativeExecutor; use sp_consensus_aura::sr25519::{AuthorityPair as AuraPair}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_basic_authority; +use futures::{FutureExt, compat::Future01CompatExt}; // Our native executor instance. native_executor_instance!( @@ -163,7 +164,7 @@ pub fn new_full(config: Configuration { // start the full GRANDPA voter @@ -180,7 +181,7 @@ pub fn new_full(config: Configuration { grandpa::setup_disabled_grandpa( diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 1f7c90bc3a..ec54f5b374 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -25,7 +25,6 @@ crate-type = ["cdylib", "rlib"] # third-party dependencies codec = { package = "parity-scale-codec", version = "1.0.6" } serde = { version = "1.0.102", features = ["derive"] } -futures01 = { package = "futures", version = "0.1.29" } futures = { version = "0.3.1", features = ["compat"] } hex-literal = "0.2.1" jsonrpc-core = "14.0.3" @@ -81,7 +80,7 @@ node-primitives = { version = "2.0.0", path = "../primitives" } node-executor = { version = "2.0.0", path = "../executor" } # CLI-specific dependencies -tokio = { version = "0.1.22", optional = true } +tokio = { version = "0.2", features = ["rt-threaded"], optional = true } sc-cli = { version = "2.0.0", optional = true, path = "../../../client/cli" } ctrlc = { version = "3.1.3", features = ["termination"], optional = true } node-transaction-factory = { version = "2.0.0", optional = true, path = "../transaction-factory" } diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 8fb95bed68..7a4321802c 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -15,7 +15,6 @@ // along with Substrate. If not, see . pub use sc_cli::VersionInfo; -use tokio::prelude::Future; use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; use sc_cli::{IntoExit, NoCustom, SharedParams, ImportParams, error}; use sc_service::{AbstractService, Roles as ServiceRoles, Configuration}; @@ -25,6 +24,7 @@ use sc_cli::{display_role, parse_and_prepare, GetSharedParams, ParseAndPrepare}; use crate::{service, ChainSpec, load_spec}; use crate::factory_impl::FactoryState; use node_transaction_factory::RuntimeAdapter; +use futures::{channel::oneshot, future::{select, Either}}; /// Custom subcommands. #[derive(Clone, Debug, StructOpt)] @@ -105,7 +105,10 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re info!("Chain specification: {}", config.chain_spec.name()); info!("Node name: {}", config.name); info!("Roles: {}", display_role(&config)); - let runtime = RuntimeBuilder::new().name_prefix("main-tokio-").build() + let runtime = RuntimeBuilder::new() + .thread_name("main-tokio-") + .threaded_scheduler() + .build() .map_err(|e| format!("{:?}", e))?; match config.roles { ServiceRoles::LIGHT => run_until_exit( @@ -172,37 +175,25 @@ where T: AbstractService, E: IntoExit, { - use futures::{FutureExt, TryFutureExt, channel::oneshot, future::select, compat::Future01CompatExt}; - let (exit_send, exit) = oneshot::channel(); let informant = sc_cli::informant::build(&service); - let future = select(informant, exit) - .map(|_| Ok(())) - .compat(); - - runtime.executor().spawn(future); + let handle = runtime.spawn(select(exit, informant)); // we eagerly drop the service so that the internal exit future is fired, // but we need to keep holding a reference to the global telemetry guard let _telemetry = service.telemetry(); - let service_res = { - let exit = e.into_exit(); - let service = service - .map_err(|err| error::Error::Service(err)) - .compat(); - let select = select(service, exit) - .map(|_| Ok(())) - .compat(); - runtime.block_on(select) - }; + let exit = e.into_exit(); + let service_res = runtime.block_on(select(service, exit)); let _ = exit_send.send(()); - // TODO [andre]: timeout this future #1318 - let _ = runtime.shutdown_on_idle().wait(); + runtime.block_on(handle); - service_res + match service_res { + Either::Left((res, _)) => res.map_err(error::Error::Service), + Either::Right((_, _)) => Ok(()) + } } diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 97ecb7a38f..2f53fb7637 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -113,8 +113,8 @@ macro_rules! new_full_start { macro_rules! new_full { ($config:expr, $with_startup_data: expr) => {{ use futures::{ - stream::StreamExt, - future::{FutureExt, TryFutureExt}, + prelude::*, + compat::Future01CompatExt }; use sc_network::Event; @@ -191,9 +191,8 @@ macro_rules! new_full { service.keystore(), dht_event_stream, ); - let future01_authority_discovery = authority_discovery.map(|x| Ok(x)).compat(); - service.spawn_task(future01_authority_discovery); + service.spawn_task(authority_discovery); } // if the node isn't actively participating in consensus then it doesn't @@ -223,7 +222,7 @@ macro_rules! new_full { service.network(), service.on_exit(), service.spawn_task_handle(), - )?); + )?.compat().map(drop)); }, (true, false) => { // start the full GRANDPA voter @@ -239,7 +238,9 @@ macro_rules! new_full { }; // the GRANDPA voter task is considered infallible, i.e. // if it fails we take down the service with it. - service.spawn_essential_task(grandpa::run_grandpa_voter(grandpa_config)?); + service.spawn_essential_task( + grandpa::run_grandpa_voter(grandpa_config)?.compat().map(drop) + ); }, (_, true) => { grandpa::setup_disabled_grandpa( diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 460cc2a05a..b653f982e6 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -16,8 +16,8 @@ time = "0.1.42" ansi_term = "0.12.1" lazy_static = "1.4.0" app_dirs = "1.2.1" -tokio = "0.2.1" -futures = { version = "0.3.1", features = ["compat"] } +tokio = "0.2" +futures = "0.3.1" fdlimit = "0.1.1" serde_json = "1.0.41" sp-panic-handler = { version = "2.0.0", path = "../../primitives/panic-handler" } diff --git a/client/cli/src/informant.rs b/client/cli/src/informant.rs index de7c376f09..312e4017d5 100644 --- a/client/cli/src/informant.rs +++ b/client/cli/src/informant.rs @@ -17,7 +17,7 @@ //! Console informant. Prints sync progress and block events. Runs on the calling thread. use sc_client_api::BlockchainEvents; -use futures::{StreamExt, TryStreamExt, FutureExt, future, compat::Stream01CompatExt}; +use futures::prelude::*; use log::{info, warn, trace}; use sp_runtime::traits::Header; use sc_service::AbstractService; @@ -33,8 +33,7 @@ pub fn build(service: &impl AbstractService) -> impl futures::Future impl futures::Future ParseAndPrepareExport<'a> { }); let mut export_fut = builder(config)? - .export_blocks(file, from.into(), to, json) - .compat(); + .export_blocks(file, from.into(), to, json); let fut = futures::future::poll_fn(|cx| { if exit_recv.try_recv().is_ok() { return Poll::Ready(Ok(())); @@ -485,8 +484,7 @@ impl<'a> ParseAndPrepareImport<'a> { }); let mut import_fut = builder(config)? - .import_blocks(file, false) - .compat(); + .import_blocks(file, false); let fut = futures::future::poll_fn(|cx| { if exit_recv.try_recv().is_ok() { return Poll::Ready(Ok(())); @@ -537,8 +535,7 @@ impl<'a> CheckBlock<'a> { let start = std::time::Instant::now(); let check = builder(config)? - .check_block(block_id) - .compat(); + .check_block(block_id); let mut runtime = tokio::runtime::Runtime::new().unwrap(); runtime.block_on(check)?; println!("Completed in {} ms.", start.elapsed().as_millis()); diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index ddae989b41..bcbf622cd3 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -14,8 +14,7 @@ sc-client-api = { version = "2.0.0", path = "../../api" } codec = { package = "parity-scale-codec", version = "1.0.0" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } derive_more = "0.99.2" -futures = { version = "0.3.1", features = ["compat"] } -futures01 = { package = "futures", version = "0.1" } +futures = "0.3.1" futures-timer = "0.4.0" sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } sc-keystore = { version = "2.0.0", path = "../../keystore" } @@ -41,3 +40,4 @@ substrate-test-runtime-client = { version = "2.0.0", path = "../../../test-utils tokio = "0.1.22" env_logger = "0.7.0" tempfile = "3.1.0" +futures01 = { package = "futures", version = "0.1" } diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 13a4c5a777..c498379721 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -153,7 +153,7 @@ pub fn start_aura( force_authoring: bool, keystore: KeyStorePtr, can_author_with: CAW, -) -> Result, sp_consensus::Error> where +) -> Result, sp_consensus::Error> where B: BlockT, C: ProvideRuntimeApi + BlockOf + ProvideCache + AuxStore + Send + Sync, C::Api: AuraApi>, @@ -189,7 +189,7 @@ pub fn start_aura( inherent_data_providers, AuraSlotCompatible, can_author_with, - ).map(|()| Ok::<(), ()>(())).compat()) + )) } struct AuraWorker { @@ -1019,7 +1019,10 @@ mod tests { false, keystore, sp_consensus::AlwaysCanAuthor, - ).expect("Starts aura"); + ) + .expect("Starts aura") + .unit_error() + .compat(); runtime.spawn(aura); } @@ -1030,7 +1033,7 @@ mod tests { })); runtime.block_on(future::join_all(import_notifications) - .map(|_| Ok::<(), ()>(())).compat()).unwrap(); + .unit_error().compat()).unwrap(); } #[test] diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index eb2875b3d3..53f60c76f9 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -29,8 +29,7 @@ sc-consensus-uncles = { version = "0.8", path = "../uncles" } sc-consensus-slots = { version = "0.8", path = "../slots" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } fork-tree = { version = "2.0.0", path = "../../../utils/fork-tree" } -futures = { version = "0.3.1", features = ["compat"] } -futures01 = { package = "futures", version = "0.1" } +futures = "0.3.1" futures-timer = "0.4.0" parking_lot = "0.9.0" log = "0.4.8" @@ -51,6 +50,7 @@ sc-block-builder = { version = "2.0.0", path = "../../block-builder" } tokio = "0.1.22" env_logger = "0.7.0" tempfile = "3.1.0" +futures01 = { package = "futures", version = "0.1" } [features] test-helpers = [] diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index bbf19b7066..4eb1e3915b 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -289,7 +289,7 @@ pub fn start_babe(BabeParams { babe_link, can_author_with, }: BabeParams) -> Result< - impl futures01::Future, + impl futures::Future, sp_consensus::Error, > where B: BlockT, @@ -325,7 +325,7 @@ pub fn start_babe(BabeParams { )?; babe_info!("Starting BABE Authorship worker"); - let slot_worker = sc_consensus_slots::start_slot_worker( + Ok(sc_consensus_slots::start_slot_worker( config.0, select_chain, worker, @@ -333,9 +333,7 @@ pub fn start_babe(BabeParams { inherent_data_providers, babe_link.time_source, can_author_with, - ); - - Ok(slot_worker.map(|_| Ok::<(), ()>(())).compat()) + )) } struct BabeWorker { diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 2ddb67fe47..305c893982 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -419,7 +419,7 @@ fn run_one_test( babe_link: data.link.clone(), keystore, can_author_with: sp_consensus::AlwaysCanAuthor, - }).expect("Starts babe")); + }).expect("Starts babe").unit_error().compat()); } runtime.spawn(futures01::future::poll_fn(move || { @@ -428,7 +428,7 @@ fn run_one_test( })); runtime.block_on(future::join_all(import_notifications) - .map(|_| Ok::<(), ()>(())).compat()).unwrap(); + .unit_error().compat()).unwrap(); } #[test] diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index 809e0ab88a..dbecd9c9a4 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -53,6 +53,7 @@ //! included in the newly-finalized chain. use futures::prelude::*; +use futures03::{StreamExt, future::ready}; use log::{debug, error, info}; use futures::sync::mpsc; use sc_client_api::{BlockchainEvents, CallExecutor, backend::{AuxStore, Backend}, ExecutionStrategy}; @@ -535,7 +536,7 @@ pub struct GrandpaParams { /// Handle to a future that will resolve on exit. pub on_exit: X, /// If supplied, can be used to hook on telemetry connection established events. - pub telemetry_on_connect: Option>, + pub telemetry_on_connect: Option>, /// A voting rule used to potentially restrict target votes. pub voting_rule: VR, /// How to spawn background tasks. @@ -608,9 +609,10 @@ pub fn run_grandpa_voter( .expect("authorities is always at least an empty vector; elements are always of type string") } ); - Ok(()) + ready(()) }) - .then(|_| -> Result<(), ()> { Ok(()) }); + .unit_error() + .compat(); futures::future::Either::A(events) } else { futures::future::Either::B(futures::future::empty()) diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index ce27b0995c..c417479511 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -15,14 +15,14 @@ wasmtime = [ [dependencies] derive_more = "0.99.2" -futures = "0.1.29" -futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } +futures01 = { package = "futures", version = "0.1.29" } +futures = "0.3.1" parking_lot = "0.9.0" lazy_static = "1.4.0" log = "0.4.8" slog = { version = "2.5.2", features = ["nested-values"] } tokio-executor = "0.1.8" -tokio-timer = "0.2.11" +futures-timer = "2" exit-future = "0.2.0" serde = "1.0.101" serde_json = "1.0.41" @@ -60,4 +60,4 @@ substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/ru sp-consensus-babe = { version = "0.8", path = "../../primitives/consensus/babe" } grandpa = { version = "2.0.0", package = "sc-finality-grandpa", path = "../finality-grandpa" } grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } -tokio = "0.1" +tokio = { version = "0.2", features = ["rt-core"] } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 0160da9bbe..85642b3e41 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -27,12 +27,10 @@ use sc_client_api::{ use sc_client::Client; use sc_chain_spec::{RuntimeGenesis, Extension}; use sp_consensus::import_queue::ImportQueue; -use futures::{prelude::*, sync::mpsc}; -use futures03::{ - compat::Compat, - FutureExt as _, TryFutureExt as _, - StreamExt as _, TryStreamExt as _, - future::{select, Either} +use futures::{ + Future, FutureExt, StreamExt, + channel::mpsc, + future::{select, ready} }; use sc_keystore::{Store as Keystore}; use log::{info, warn, error}; @@ -47,7 +45,7 @@ use sp_api::ProvideRuntimeApi; use sc_executor::{NativeExecutor, NativeExecutionDispatch}; use std::{ io::{Read, Write, Seek}, - marker::PhantomData, sync::Arc, time::SystemTime + marker::PhantomData, sync::Arc, time::SystemTime, pin::Pin }; use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use sc_telemetry::{telemetry, SUBSTRATE_INFO}; @@ -682,7 +680,7 @@ pub trait ServiceBuilderCommand { self, input: impl Read + Seek + Send + 'static, force: bool, - ) -> Box + Send>; + ) -> Pin> + Send>>; /// Performs the blocks export. fn export_blocks( @@ -691,7 +689,7 @@ pub trait ServiceBuilderCommand { from: NumberFor, to: Option>, json: bool - ) -> Box>; + ) -> Pin>>>; /// Performs a revert of `blocks` blocks. fn revert_chain( @@ -703,7 +701,7 @@ pub trait ServiceBuilderCommand { fn check_block( self, block: BlockId - ) -> Box + Send>; + ) -> Pin> + Send>>; } impl @@ -795,7 +793,7 @@ ServiceBuilder< // List of asynchronous tasks to spawn. We collect them, then spawn them all at once. let (to_spawn_tx, to_spawn_rx) = - mpsc::unbounded:: + Send>>(); + mpsc::unbounded:: + Send>>>(); // A side-channel for essential tasks to communicate shutdown. let (essential_failed_tx, essential_failed_rx) = mpsc::unbounded(); @@ -879,7 +877,6 @@ ServiceBuilder< let is_validator = config.roles.is_authority(); let events = client.import_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() .for_each(move |notification| { let txpool = txpool.upgrade(); @@ -887,8 +884,8 @@ ServiceBuilder< let future = txpool.maintain( &BlockId::hash(notification.hash), ¬ification.retracted, - ).map(|_| Ok(())).compat(); - let _ = to_spawn_tx_.unbounded_send(Box::new(future)); + ); + let _ = to_spawn_tx_.unbounded_send(Box::pin(future)); } let offchain = offchain.as_ref().and_then(|o| o.upgrade()); @@ -897,15 +894,13 @@ ServiceBuilder< ¬ification.header, network_state_info.clone(), is_validator - ).map(|()| Ok(())); - let _ = to_spawn_tx_.unbounded_send(Box::new(Compat::new(future))); + ); + let _ = to_spawn_tx_.unbounded_send(Box::pin(future)); } - Ok(()) - }) - .select(exit.clone().map(Ok).compat()) - .then(|_| Ok(())); - let _ = to_spawn_tx.unbounded_send(Box::new(events)); + ready(()) + }); + let _ = to_spawn_tx.unbounded_send(Box::pin(select(events, exit.clone()).map(drop))); } { @@ -913,7 +908,6 @@ ServiceBuilder< let network = Arc::downgrade(&network); let transaction_pool_ = transaction_pool.clone(); let events = transaction_pool.import_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() .for_each(move |_| { if let Some(network) = network.upgrade() { network.trigger_repropagate(); @@ -923,12 +917,10 @@ ServiceBuilder< "ready" => status.ready, "future" => status.future ); - Ok(()) - }) - .select(exit.clone().map(Ok).compat()) - .then(|_| Ok(())); + ready(()) + }); - let _ = to_spawn_tx.unbounded_send(Box::new(events)); + let _ = to_spawn_tx.unbounded_send(Box::pin(select(events, exit.clone()).map(drop))); } // Periodically notify the telemetry. @@ -990,9 +982,9 @@ ServiceBuilder< "disk_write_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_written).unwrap_or(0), ); - Ok(()) - }).select(exit.clone().map(Ok).compat()).then(|_| Ok(())); - let _ = to_spawn_tx.unbounded_send(Box::new(tel_task)); + ready(()) + }); + let _ = to_spawn_tx.unbounded_send(Box::pin(select(tel_task, exit.clone()).map(drop))); // Periodically send the network state to the telemetry. let (netstat_tx, netstat_rx) = mpsc::unbounded::<(NetworkStatus<_>, NetworkState)>(); @@ -1003,12 +995,12 @@ ServiceBuilder< "system.network_state"; "state" => network_state, ); - Ok(()) - }).select(exit.clone().map(Ok).compat()).then(|_| Ok(())); - let _ = to_spawn_tx.unbounded_send(Box::new(tel_task_2)); + ready(()) + }); + let _ = to_spawn_tx.unbounded_send(Box::pin(select(tel_task_2, exit.clone()).map(drop))); // RPC - let (system_rpc_tx, system_rpc_rx) = futures03::channel::mpsc::unbounded(); + let (system_rpc_tx, system_rpc_rx) = mpsc::unbounded(); let gen_handler = || { use sc_rpc::{chain, state, author, system}; @@ -1068,17 +1060,14 @@ ServiceBuilder< let rpc = start_rpc_servers(&config, gen_handler)?; - let _ = to_spawn_tx.unbounded_send(Box::new(build_network_future( + let _ = to_spawn_tx.unbounded_send(Box::pin(select(build_network_future( config.roles, network_mut, client.clone(), network_status_sinks.clone(), system_rpc_rx, has_bootnodes, - ) - .map_err(|_| ()) - .select(exit.clone().map(Ok).compat()) - .then(|_| Ok(())))); + ), exit.clone()).map(drop))); let telemetry_connection_sinks: Arc>>> = Default::default(); @@ -1099,8 +1088,6 @@ ServiceBuilder< .map(|dur| dur.as_millis()) .unwrap_or(0); let future = telemetry.clone() - .map(|ev| Ok::<_, ()>(ev)) - .compat() .for_each(move |event| { // Safe-guard in case we add more events in the future. let sc_telemetry::TelemetryEvent::Connected = event; @@ -1119,11 +1106,11 @@ ServiceBuilder< telemetry_connection_sinks_.lock().retain(|sink| { sink.unbounded_send(()).is_ok() }); - Ok(()) + ready(()) }); - let _ = to_spawn_tx.unbounded_send(Box::new(future - .select(exit.clone().map(Ok).compat()) - .then(|_| Ok(())))); + let _ = to_spawn_tx.unbounded_send(Box::pin(select( + future, exit.clone() + ).map(drop))); telemetry }); @@ -1132,13 +1119,10 @@ ServiceBuilder< let future = select( grafana_data_source::run_server(port).boxed(), exit.clone() - ).map(|either| match either { - Either::Left((result, _)) => result.map_err(|_| ()), - Either::Right(_) => Ok(()) - }).compat(); + ).map(drop); - let _ = to_spawn_tx.unbounded_send(Box::new(future)); - } + let _ = to_spawn_tx.unbounded_send(Box::pin(future)); + } // Instrumentation if let Some(tracing_targets) = config.tracing_targets.as_ref() { diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 0b86fb366f..0c2fe79718 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -22,9 +22,6 @@ use crate::error::Error; use sc_chain_spec::{ChainSpec, RuntimeGenesis, Extension}; use log::{warn, info}; use futures::{future, prelude::*}; -use futures03::{ - TryFutureExt as _, -}; use sp_runtime::traits::{ Block as BlockT, NumberFor, One, Zero, Header, SaturatedConversion }; @@ -34,9 +31,7 @@ use sc_client::Client; use sp_consensus::import_queue::{IncomingBlock, Link, BlockImportError, BlockImportResult, ImportQueue}; use sp_consensus::BlockOrigin; -use std::{ - io::{Read, Write, Seek}, -}; +use std::{io::{Read, Write, Seek}, pin::Pin}; use sc_network::message; @@ -68,7 +63,7 @@ impl< self, input: impl Read + Seek + Send + 'static, force: bool, - ) -> Box + Send> { + ) -> Pin> + Send>> { struct WaitLink { imported_blocks: u64, has_error: bool, @@ -117,7 +112,7 @@ impl< // queue, the `Future` re-schedules itself and returns `Poll::Pending`. // This makes it possible either to interleave other operations in-between the block imports, // or to stop the operation completely. - let import = futures03::future::poll_fn(move |cx| { + let import = future::poll_fn(move |cx| { // Start by reading the number of blocks if not done so already. let count = match count { Some(c) => c, @@ -205,7 +200,7 @@ impl< return std::task::Poll::Pending; } }); - Box::new(import.compat()) + Box::pin(import) } fn export_blocks( @@ -214,7 +209,7 @@ impl< from: NumberFor, to: Option>, json: bool - ) -> Box> { + ) -> Pin>>> { let client = self.client; let mut block = from; @@ -233,7 +228,7 @@ impl< // `Poll::Pending`. // This makes it possible either to interleave other operations in-between the block exports, // or to stop the operation completely. - let export = futures03::future::poll_fn(move |cx| { + let export = future::poll_fn(move |cx| { if last < block { return std::task::Poll::Ready(Err("Invalid block range specified".into())); } @@ -274,7 +269,7 @@ impl< std::task::Poll::Pending }); - Box::new(export.compat()) + Box::pin(export) } fn revert_chain( @@ -295,7 +290,7 @@ impl< fn check_block( self, block_id: BlockId - ) -> Box + Send> { + ) -> Pin> + Send>> { match self.client.block(&block_id) { Ok(Some(block)) => { let mut buf = Vec::new(); @@ -304,8 +299,8 @@ impl< let reader = std::io::Cursor::new(buf); self.import_blocks(reader, true) } - Ok(None) => Box::new(future::err("Unknown block".into())), - Err(e) => Box::new(future::err(format!("Error reading block: {:?}", e).into())), + Ok(None) => Box::pin(future::err("Unknown block".into())), + Err(e) => Box::pin(future::err(format!("Error reading block: {:?}", e).into())), } } } diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 7a3c6fc9ea..87327d0967 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -32,15 +32,17 @@ use std::marker::PhantomData; use std::net::SocketAddr; use std::collections::HashMap; use std::time::{Duration, Instant}; -use futures::sync::mpsc; +use std::task::{Poll, Context}; use parking_lot::Mutex; use sc_client::Client; use exit_future::Signal; -use futures::prelude::*; -use futures03::{ - future::{ready, FutureExt as _, TryFutureExt as _}, - stream::{StreamExt as _, TryStreamExt as _}, +use futures::{ + Future, FutureExt, Stream, StreamExt, TryFutureExt, + future::select, channel::mpsc, + compat::*, + sink::SinkExt, + task::{Spawn, SpawnExt, FutureObj, SpawnError}, }; use sc_network::{ NetworkService, NetworkState, specialization::NetworkSpecialization, @@ -67,8 +69,6 @@ pub use sc_rpc::Metadata as RpcMetadata; pub use std::{ops::Deref, result::Result, sync::Arc}; #[doc(hidden)] pub use sc_network::{FinalityProofProvider, OnDemand, config::BoxFinalityProofRequestBuilder}; -#[doc(hidden)] -pub use futures::future::Executor; const DEFAULT_PROTOCOL_ID: &str = "sup"; @@ -92,13 +92,13 @@ pub struct Service { /// A receiver for spawned essential-tasks concluding. essential_failed_rx: mpsc::UnboundedReceiver<()>, /// Sender for futures that must be spawned as background tasks. - to_spawn_tx: mpsc::UnboundedSender + Send>>, + to_spawn_tx: mpsc::UnboundedSender + Send>>>, /// Receiver for futures that must be spawned as background tasks. - to_spawn_rx: mpsc::UnboundedReceiver + Send>>, + to_spawn_rx: mpsc::UnboundedReceiver + Send>>>, /// List of futures to poll from `poll`. /// If spawning a background task is not possible, we instead push the task into this `Vec`. /// The elements must then be polled manually. - to_poll: Vec + Send>>, + to_poll: Vec + Send>>>, rpc_handlers: sc_rpc_server::RpcHandler, _rpc: Box, _telemetry: Option, @@ -109,42 +109,36 @@ pub struct Service { } /// Alias for a an implementation of `futures::future::Executor`. -pub type TaskExecutor = Arc + Send>> + Send + Sync>; +pub type TaskExecutor = Arc; /// An handle for spawning tasks in the service. #[derive(Clone)] pub struct SpawnTaskHandle { - sender: mpsc::UnboundedSender + Send>>, + sender: mpsc::UnboundedSender + Send>>>, on_exit: exit_future::Exit, } -impl Executor + Send>> for SpawnTaskHandle { - fn execute( - &self, - future: Box + Send>, - ) -> Result<(), futures::future::ExecuteError + Send>>> { - let exit = self.on_exit.clone().map(Ok).compat(); - let future = Box::new(future.select(exit).then(|_| Ok(()))); - if let Err(err) = self.sender.unbounded_send(future) { - let kind = futures::future::ExecuteErrorKind::Shutdown; - Err(futures::future::ExecuteError::new(kind, err.into_inner())) - } else { - Ok(()) - } +impl Spawn for SpawnTaskHandle { + fn spawn_obj(&self, future: FutureObj<'static, ()>) + -> Result<(), SpawnError> { + let future = select(self.on_exit.clone(), future).map(drop); + self.sender.unbounded_send(Box::pin(future)) + .map_err(|_| SpawnError::shutdown()) } } -impl futures03::task::Spawn for SpawnTaskHandle { - fn spawn_obj(&self, future: futures03::task::FutureObj<'static, ()>) - -> Result<(), futures03::task::SpawnError> { - self.execute(Box::new(futures03::compat::Compat::new(future.unit_error()))) - .map_err(|_| futures03::task::SpawnError::shutdown()) +type Boxed01Future01 = Box + Send + 'static>; + +impl futures01::future::Executor for SpawnTaskHandle { + fn execute(&self, future: Boxed01Future01) -> Result<(), futures01::future::ExecuteError>{ + self.spawn(future.compat().map(drop)); + Ok(()) } } /// Abstraction over a Substrate service. -pub trait AbstractService: 'static + Future + - Executor + Send>> + Send { +pub trait AbstractService: 'static + Future> + + Spawn + Send + Unpin { /// Type of block of this chain. type Block: BlockT; /// Backend storage for the client. @@ -168,12 +162,12 @@ pub trait AbstractService: 'static + Future + fn telemetry(&self) -> Option; /// Spawns a task in the background that runs the future passed as parameter. - fn spawn_task(&self, task: impl Future + Send + 'static); + fn spawn_task(&self, task: impl Future + Send + Unpin + 'static); /// Spawns a task in the background that runs the future passed as /// parameter. The given task is considered essential, i.e. if it errors we /// trigger a service exit. - fn spawn_essential_task(&self, task: impl Future + Send + 'static); + fn spawn_essential_task(&self, task: impl Future + Send + Unpin + 'static); /// Returns a handle for spawning tasks. fn spawn_task_handle(&self) -> SpawnTaskHandle; @@ -190,7 +184,7 @@ pub trait AbstractService: 'static + Future + /// /// If the request subscribes you to events, the `Sender` in the `RpcSession` object is used to /// send back spontaneous events. - fn rpc_query(&self, mem: &RpcSession, request: &str) -> Box, Error = ()> + Send>; + fn rpc_query(&self, mem: &RpcSession, request: &str) -> Pin> + Send>>; /// Get shared client instance. fn client(&self) -> Arc>; @@ -216,11 +210,11 @@ impl AbstractService Service, TSc, NetworkStatus, NetworkService, TExPool, TOc> where - TBl: BlockT, + TBl: BlockT + Unpin, TBackend: 'static + sc_client_api::backend::Backend, TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, TRtApi: 'static + Send + Sync, - TSc: sp_consensus::SelectChain + 'static + Clone + Send, + TSc: sp_consensus::SelectChain + 'static + Clone + Send + Unpin, TExPool: 'static + TransactionPool + TransactionPoolMaintainer, TOc: 'static + Send + Sync, @@ -248,25 +242,22 @@ where self.keystore.clone() } - fn spawn_task(&self, task: impl Future + Send + 'static) { - let exit = self.on_exit().map(Ok).compat(); - let task = task.select(exit).then(|_| Ok(())); - let _ = self.to_spawn_tx.unbounded_send(Box::new(task)); + fn spawn_task(&self, task: impl Future + Send + Unpin + 'static) { + let task = select(self.on_exit(), task).map(drop); + let _ = self.to_spawn_tx.unbounded_send(Box::pin(task)); } - fn spawn_essential_task(&self, task: impl Future + Send + 'static) { - let essential_failed = self.essential_failed_tx.clone(); + fn spawn_essential_task(&self, task: impl Future + Send + Unpin + 'static) { + let mut essential_failed = self.essential_failed_tx.clone(); let essential_task = std::panic::AssertUnwindSafe(task) .catch_unwind() - .then(move |_| { + .map(move |_| { error!("Essential task failed. Shutting down service."); let _ = essential_failed.send(()); - Ok(()) }); - let exit = self.on_exit().map(Ok::<_, ()>).compat(); - let task = essential_task.select(exit).then(|_| Ok(())); + let task = select(self.on_exit(), essential_task).map(drop); - let _ = self.to_spawn_tx.unbounded_send(Box::new(task)); + let _ = self.to_spawn_tx.unbounded_send(Box::pin(task)); } fn spawn_task_handle(&self) -> SpawnTaskHandle { @@ -276,8 +267,12 @@ where } } - fn rpc_query(&self, mem: &RpcSession, request: &str) -> Box, Error = ()> + Send> { - Box::new(self.rpc_handlers.handle_request(request, mem.metadata.clone())) + fn rpc_query(&self, mem: &RpcSession, request: &str) -> Pin> + Send>> { + Box::pin( + self.rpc_handlers.handle_request(request, mem.metadata.clone()) + .compat() + .map(|res| res.expect("this should never fail")) + ) } fn client(&self) -> Arc> { @@ -309,57 +304,56 @@ where } } -impl Future for +impl Future for Service { - type Item = (); - type Error = Error; + type Output = Result<(), Error>; - fn poll(&mut self) -> Poll { - match self.essential_failed_rx.poll() { - Ok(Async::NotReady) => {}, - Ok(Async::Ready(_)) | Err(_) => { + fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll { + let this = Pin::into_inner(self); + + match Pin::new(&mut this.essential_failed_rx).poll_next(cx) { + Poll::Pending => {}, + Poll::Ready(_) => { // Ready(None) should not be possible since we hold a live // sender. - return Err(Error::Other("Essential task failed.".into())); + return Poll::Ready(Err(Error::Other("Essential task failed.".into()))); } } - while let Ok(Async::Ready(Some(task_to_spawn))) = self.to_spawn_rx.poll() { + while let Poll::Ready(Some(task_to_spawn)) = Pin::new(&mut this.to_spawn_rx).poll_next(cx) { + // TODO: Update to tokio 0.2 when libp2p get switched to std futures (#4383) let executor = tokio_executor::DefaultExecutor::current(); - if let Err(err) = executor.execute(task_to_spawn) { + use futures01::future::Executor; + if let Err(err) = executor.execute(task_to_spawn.unit_error().compat()) { debug!( target: "service", "Failed to spawn background task: {:?}; falling back to manual polling", err ); - self.to_poll.push(err.into_future()); + this.to_poll.push(Box::pin(err.into_future().compat().map(drop))); } } // Polling all the `to_poll` futures. - while let Some(pos) = self.to_poll.iter_mut().position(|t| t.poll().map(|t| t.is_ready()).unwrap_or(true)) { - let _ = self.to_poll.remove(pos); + while let Some(pos) = this.to_poll.iter_mut().position(|t| Pin::new(t).poll(cx).is_ready()) { + let _ = this.to_poll.remove(pos); } // The service future never ends. - Ok(Async::NotReady) + Poll::Pending } } -impl Executor + Send>> for +impl Spawn for Service { - fn execute( + fn spawn_obj( &self, - future: Box + Send> - ) -> Result<(), futures::future::ExecuteError + Send>>> { - if let Err(err) = self.to_spawn_tx.unbounded_send(future) { - let kind = futures::future::ExecuteErrorKind::Shutdown; - Err(futures::future::ExecuteError::new(kind, err.into_inner())) - } else { - Ok(()) - } + future: FutureObj<'static, ()> + ) -> Result<(), SpawnError> { + self.to_spawn_tx.unbounded_send(Box::pin(future)) + .map_err(|_| SpawnError::shutdown()) } } @@ -376,29 +370,23 @@ fn build_network_future< mut network: sc_network::NetworkWorker, client: Arc, status_sinks: Arc, NetworkState)>>>, - rpc_rx: futures03::channel::mpsc::UnboundedReceiver>, + mut rpc_rx: mpsc::UnboundedReceiver>, should_have_peers: bool, -) -> impl Future { - // Compatibility shim while we're transitioning to stable Futures. - // See https://github.com/paritytech/substrate/issues/3099 - let mut rpc_rx = futures03::compat::Compat::new(rpc_rx.map(|v| Ok::<_, ()>(v))); +) -> impl Future { + let mut imported_blocks_stream = client.import_notification_stream().fuse(); + let mut finality_notification_stream = client.finality_notification_stream().fuse(); - let mut imported_blocks_stream = client.import_notification_stream().fuse() - .map(|v| Ok::<_, ()>(v)).compat(); - let mut finality_notification_stream = client.finality_notification_stream().fuse() - .map(|v| Ok::<_, ()>(v)).compat(); - - futures::future::poll_fn(move || { + futures::future::poll_fn(move |cx| { let before_polling = Instant::now(); // We poll `imported_blocks_stream`. - while let Ok(Async::Ready(Some(notification))) = imported_blocks_stream.poll() { + while let Poll::Ready(Some(notification)) = Pin::new(&mut imported_blocks_stream).poll_next(cx) { network.on_block_imported(notification.hash, notification.header, Vec::new(), notification.is_new_best); } // We poll `finality_notification_stream`, but we only take the last event. let mut last = None; - while let Ok(Async::Ready(Some(item))) = finality_notification_stream.poll() { + while let Poll::Ready(Some(item)) = Pin::new(&mut finality_notification_stream).poll_next(cx) { last = Some(item); } if let Some(notification) = last { @@ -406,7 +394,7 @@ fn build_network_future< } // Poll the RPC requests and answer them. - while let Ok(Async::Ready(Some(request))) = rpc_rx.poll() { + while let Poll::Ready(Some(request)) = Pin::new(&mut rpc_rx).poll_next(cx) { match request { sc_rpc::system::Request::Health(sender) => { let _ = sender.send(sc_rpc::system::Health { @@ -466,7 +454,7 @@ fn build_network_future< } // Interval report for the external API. - status_sinks.lock().poll(|| { + status_sinks.lock().poll(cx, || { let status = NetworkStatus { sync_state: network.sync_state(), best_seen_block: network.best_seen_block(), @@ -481,12 +469,10 @@ fn build_network_future< }); // Main network polling. - let mut net_poll = futures03::future::poll_fn(|cx| futures03::future::Future::poll(Pin::new(&mut network), cx)) - .compat(); - if let Ok(Async::Ready(())) = net_poll.poll().map_err(|err| { + if let Poll::Ready(Ok(())) = Pin::new(&mut network).poll(cx).map_err(|err| { warn!(target: "service", "Error in network: {:?}", err); }) { - return Ok(Async::Ready(())); + return Poll::Ready(()); } // Now some diagnostic for performances. @@ -498,7 +484,7 @@ fn build_network_future< polling_dur ); - Ok(Async::NotReady) + Poll::Pending }) } @@ -596,7 +582,7 @@ impl RpcSession { /// messages. /// /// The `RpcSession` must be kept alive in order to receive messages on the sender. - pub fn new(sender: mpsc::Sender) -> RpcSession { + pub fn new(sender: futures01::sync::mpsc::Sender) -> RpcSession { RpcSession { metadata: sender.into(), } @@ -668,7 +654,7 @@ where let best_block_id = BlockId::hash(self.client.info().best_hash); let import_future = self.pool.submit_one(&best_block_id, uxt); let import_future = import_future - .then(move |import_result| { + .map(move |import_result| { match import_result { Ok(_) => report_handle.report_peer(who, reputation_change_good), Err(e) => match e.into_pool_error() { @@ -680,11 +666,9 @@ where Err(e) => debug!("Error converting pool error: {:?}", e), } } - ready(Ok(())) - }) - .compat(); + }); - if let Err(e) = self.executor.execute(Box::new(import_future)) { + if let Err(e) = self.executor.spawn(Box::new(import_future)) { warn!("Error scheduling extrinsic import: {:?}", e); } } @@ -700,7 +684,7 @@ where #[cfg(test)] mod tests { use super::*; - use futures03::executor::block_on; + use futures::executor::block_on; use sp_consensus::SelectChain; use sp_runtime::traits::BlindCheckable; use substrate_test_runtime_client::{prelude::*, runtime::{Extrinsic, Transfer}}; diff --git a/client/service/src/status_sinks.rs b/client/service/src/status_sinks.rs index 205a22d70f..de5fe86573 100644 --- a/client/service/src/status_sinks.rs +++ b/client/service/src/status_sinks.rs @@ -14,11 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use futures::prelude::*; -use futures::sync::mpsc; -use futures::stream::futures_unordered::FuturesUnordered; -use std::time::{Duration, Instant}; -use tokio_timer::Delay; +use futures::{Stream, stream::futures_unordered::FuturesUnordered, channel::mpsc}; +use std::time::Duration; +use std::pin::Pin; +use std::task::{Poll, Context}; +use futures_timer::Delay; /// Holds a list of `UnboundedSender`s, each associated with a certain time period. Every time the /// period elapses, we push an element on the sender. @@ -29,7 +29,7 @@ pub struct StatusSinks { } struct YieldAfter { - delay: tokio_timer::Delay, + delay: Delay, interval: Duration, sender: Option>, } @@ -47,7 +47,7 @@ impl StatusSinks { /// The `interval` is the time period between two pushes on the sender. pub fn push(&mut self, interval: Duration, sender: mpsc::UnboundedSender) { self.entries.push(YieldAfter { - delay: Delay::new(Instant::now() + interval), + delay: Delay::new(interval), interval, sender: Some(sender), }) @@ -57,16 +57,16 @@ impl StatusSinks { /// pushes what it returns to the sender. /// /// This function doesn't return anything, but it should be treated as if it implicitly - /// returns `Ok(Async::NotReady)`. In particular, it should be called again when the task + /// returns `Poll::Pending`. In particular, it should be called again when the task /// is waken up. /// /// # Panic /// /// Panics if not called within the context of a task. - pub fn poll(&mut self, mut status_grab: impl FnMut() -> T) { + pub fn poll(&mut self, cx: &mut Context, mut status_grab: impl FnMut() -> T) { loop { - match self.entries.poll() { - Ok(Async::Ready(Some((sender, interval)))) => { + match Pin::new(&mut self.entries).poll_next(cx) { + Poll::Ready(Some((sender, interval))) => { let status = status_grab(); if sender.unbounded_send(status).is_ok() { self.entries.push(YieldAfter { @@ -74,33 +74,32 @@ impl StatusSinks { // waken up and the moment it is polled, the period is actually not // `interval` but `interval + `. We ignore this problem in // practice. - delay: Delay::new(Instant::now() + interval), + delay: Delay::new(interval), interval, sender: Some(sender), }); } } - Err(()) | - Ok(Async::Ready(None)) | - Ok(Async::NotReady) => break, + Poll::Ready(None) | + Poll::Pending => break, } } } } -impl Future for YieldAfter { - type Item = (mpsc::UnboundedSender, Duration); - type Error = (); +impl futures::Future for YieldAfter { + type Output = (mpsc::UnboundedSender, Duration); - fn poll(&mut self) -> Poll { - match self.delay.poll() { - Ok(Async::NotReady) => Ok(Async::NotReady), - Ok(Async::Ready(())) => { - let sender = self.sender.take() + fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll { + let this = Pin::into_inner(self); + + match Pin::new(&mut this.delay).poll(cx) { + Poll::Pending => Poll::Pending, + Poll::Ready(()) => { + let sender = this.sender.take() .expect("sender is always Some unless the future is finished; qed"); - Ok(Async::Ready((sender, self.interval))) - }, - Err(_) => Err(()), + Poll::Ready((sender, this.interval)) + } } } } @@ -109,8 +108,9 @@ impl Future for YieldAfter { mod tests { use super::StatusSinks; use futures::prelude::*; - use futures::sync::mpsc; + use futures::channel::mpsc; use std::time::Duration; + use std::task::Poll; #[test] fn works() { @@ -125,18 +125,18 @@ mod tests { let mut runtime = tokio::runtime::Runtime::new().unwrap(); let mut val_order = 5; - runtime.spawn(futures::future::poll_fn(move || { - status_sinks.poll(|| { val_order += 1; val_order }); - Ok(Async::NotReady) + runtime.spawn(futures::future::poll_fn(move |cx| { + status_sinks.poll(cx, || { val_order += 1; val_order }); + Poll::<()>::Pending })); let done = rx .into_future() - .and_then(|(item, rest)| { + .then(|(item, rest)| { assert_eq!(item, Some(6)); rest.into_future() }) - .and_then(|(item, rest)| { + .then(|(item, rest)| { assert_eq!(item, Some(7)); rest.into_future() }) @@ -144,6 +144,6 @@ mod tests { assert_eq!(item, Some(8)); }); - runtime.block_on(done).unwrap(); + runtime.block_on(done); } } diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index 2789bfda0f..6fa6e145cf 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -7,11 +7,11 @@ edition = "2018" [dependencies] tempfile = "3.1.0" tokio = "0.1.22" -futures = "0.1.29" +futures01 = { package = "futures", version = "0.1.29" } log = "0.4.8" env_logger = "0.7.0" fdlimit = "0.1.1" -futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } +futures = { version = "0.3.1", features = ["compat"] } sc-service = { version = "2.0.0", default-features = false, path = "../../service" } sc-network = { version = "0.8", path = "../../network" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index 06a1edd189..dd6395e9c6 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -21,7 +21,7 @@ use std::sync::{Arc, Mutex, MutexGuard}; use std::net::Ipv4Addr; use std::time::Duration; use log::info; -use futures::{Future, Stream, Poll}; +use futures01::{Future, Stream, Poll}; use tempfile::TempDir; use tokio::{runtime::Runtime, prelude::FutureExt}; use tokio::timer::Interval; @@ -72,12 +72,13 @@ impl From for SyncService { } } -impl> Future for SyncService { +impl> + Unpin> Future for SyncService { type Item = (); type Error = sc_service::Error; fn poll(&mut self) -> Poll { - self.0.lock().unwrap().poll() + let mut f = self.0.lock().unwrap(); + futures::compat::Compat::new(&mut *f).poll() } } @@ -458,7 +459,7 @@ pub fn sync( let first_user_data = &network.full_nodes[0].2; let best_block = BlockId::number(first_service.get().client().chain_info().best_number); let extrinsic = extrinsic_factory(&first_service.get(), first_user_data); - futures03::executor::block_on(first_service.get().transaction_pool().submit_one(&best_block, extrinsic)).unwrap(); + futures::executor::block_on(first_service.get().transaction_pool().submit_one(&best_block, extrinsic)).unwrap(); network.run_until_all_full( |_index, service| service.get().transaction_pool().ready().count() == 1, |_index, _service| true, diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs index e404c66129..0dbde57182 100644 --- a/utils/browser/src/lib.rs +++ b/utils/browser/src/lib.rs @@ -22,10 +22,7 @@ use service::{ ChainSpec, RuntimeGenesis }; use wasm_bindgen::prelude::*; -use futures::{ - TryFutureExt as _, FutureExt as _, Stream as _, Future as _, TryStreamExt as _, - channel::{oneshot, mpsc}, future::{poll_fn, ok}, compat::*, -}; +use futures::{prelude::*, channel::{oneshot, mpsc}, future::{poll_fn, ok}, compat::*}; use std::task::Poll; use std::pin::Pin; use chain_spec::Extension; @@ -82,8 +79,7 @@ struct RpcMessage { } /// Create a Client object that connects to a service. -pub fn start_client(service: impl AbstractService) -> Client { - let mut service = service.compat(); +pub fn start_client(mut service: impl AbstractService) -> Client { // We dispatch a background task responsible for processing the service. // // The main action performed by the code below consists in polling the service with @@ -94,10 +90,8 @@ pub fn start_client(service: impl AbstractService) -> Client { loop { match Pin::new(&mut rpc_send_rx).poll_next(cx) { Poll::Ready(Some(message)) => { - let fut = service.get_ref() + let fut = service .rpc_query(&message.session, &message.rpc_json) - .compat() - .unwrap_or_else(|_| None) .boxed(); let _ = message.send_back.send(fut); }, -- GitLab From 45995b4b7d0f995e51e6c04dac20f0effba2f65e Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 14 Jan 2020 18:49:46 +0300 Subject: [PATCH 115/296] fixed panic on empty remote read request (#4619) --- client/network/src/protocol.rs | 14 ++++++++++++++ client/rpc/src/state/state_light.rs | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index b712ebe515..2aa29ea279 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -1472,6 +1472,13 @@ impl, H: ExHashT> Protocol { who: PeerId, request: message::RemoteReadRequest, ) { + if request.keys.is_empty() { + debug!(target: "sync", "Invalid remote read request sent by {}", who); + self.behaviour.disconnect_peer(&who); + self.peerset_handle.report_peer(who, rep::BAD_MESSAGE); + return; + } + let keys_str = || match request.keys.len() { 1 => request.keys[0].to_hex::(), _ => format!( @@ -1510,6 +1517,13 @@ impl, H: ExHashT> Protocol { who: PeerId, request: message::RemoteReadChildRequest, ) { + if request.keys.is_empty() { + debug!(target: "sync", "Invalid remote child read request sent by {}", who); + self.behaviour.disconnect_peer(&who); + self.peerset_handle.report_peer(who, rep::BAD_MESSAGE); + return; + } + let keys_str = || match request.keys.len() { 1 => request.keys[0].to_hex::(), _ => format!( diff --git a/client/rpc/src/state/state_light.rs b/client/rpc/src/state/state_light.rs index abf4631bb8..482eb0723f 100644 --- a/client/rpc/src/state/state_light.rs +++ b/client/rpc/src/state/state_light.rs @@ -325,8 +325,8 @@ impl StateBackend for LightState> ) { let keys = match keys { - Some(keys) => keys, - None => { + Some(keys) if !keys.is_empty() => keys, + _ => { warn!("Cannot subscribe to all keys on light client. Subscription rejected."); return; } -- GitLab From 8cb71bd982963407a7014992d4720253a4b31f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 14 Jan 2020 20:11:42 +0100 Subject: [PATCH 116/296] Add `pallet-society` and `pallet-recovery` to substrate node (#4622) * Add `pallet-society` and `pallet-recovery` to substrate node * Add `OnReapAccount` * Fixes and replaces nicks with identity --- Cargo.lock | 4 +- bin/node/runtime/Cargo.toml | 8 +++- bin/node/runtime/src/lib.rs | 73 +++++++++++++++++++++++++++++++------ 3 files changed, 70 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 086df23fd2..e5648c89d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3174,13 +3174,15 @@ dependencies = [ "pallet-elections-phragmen 2.0.0", "pallet-finality-tracker 2.0.0", "pallet-grandpa 2.0.0", + "pallet-identity 2.0.0", "pallet-im-online 2.0.0", "pallet-indices 2.0.0", "pallet-membership 2.0.0", - "pallet-nicks 2.0.0", "pallet-offences 2.0.0", "pallet-randomness-collective-flip 2.0.0", + "pallet-recovery 2.0.0", "pallet-session 2.0.0", + "pallet-society 2.0.0", "pallet-staking 2.0.0", "pallet-staking-reward-curve 2.0.0", "pallet-sudo 2.0.0", diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index a8f26d13cb..c434c72120 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -48,14 +48,16 @@ pallet-finality-tracker = { version = "2.0.0", default-features = false, path = pallet-grandpa = { version = "2.0.0", default-features = false, path = "../../../frame/grandpa" } pallet-im-online = { version = "2.0.0", default-features = false, path = "../../../frame/im-online" } pallet-indices = { version = "2.0.0", default-features = false, path = "../../../frame/indices" } +pallet-identity = { version = "2.0.0", default-features = false, path = "../../../frame/identity" } pallet-membership = { version = "2.0.0", default-features = false, path = "../../../frame/membership" } -pallet-nicks = { version = "2.0.0", default-features = false, path = "../../../frame/nicks" } pallet-offences = { version = "2.0.0", default-features = false, path = "../../../frame/offences" } pallet-randomness-collective-flip = { version = "2.0.0", default-features = false, path = "../../../frame/randomness-collective-flip" } +pallet-recovery = { version = "2.0.0", default-features = false, path = "../../../frame/recovery" } pallet-session = { version = "2.0.0", features = ["historical"], path = "../../../frame/session", default-features = false } pallet-staking = { version = "2.0.0", features = ["migrate"], path = "../../../frame/staking", default-features = false } pallet-staking-reward-curve = { version = "2.0.0", path = "../../../frame/staking/reward-curve" } pallet-sudo = { version = "2.0.0", default-features = false, path = "../../../frame/sudo" } +pallet-society = { version = "2.0.0", default-features = false, path = "../../../frame/society" } pallet-timestamp = { version = "2.0.0", default-features = false, path = "../../../frame/timestamp" } pallet-treasury = { version = "2.0.0", default-features = false, path = "../../../frame/treasury" } pallet-utility = { version = "2.0.0", default-features = false, path = "../../../frame/utility" } @@ -91,7 +93,7 @@ std = [ "pallet-indices/std", "sp-inherents/std", "pallet-membership/std", - "pallet-nicks/std", + "pallet-identity/std", "node-primitives/std", "sp-offchain/std", "pallet-offences/std", @@ -119,4 +121,6 @@ std = [ "sp-transaction-pool/std", "pallet-utility/std", "sp-version/std", + "pallet-society/std", + "pallet-recovery/std", ] diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 4266ad7459..e5e453fcaf 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 203, - impl_version: 203, + spec_version: 204, + impl_version: 204, apis: RUNTIME_API_VERSIONS, }; @@ -174,7 +174,7 @@ parameter_types! { impl pallet_balances::Trait for Runtime { type Balance = Balance; type OnFreeBalanceZero = ((Staking, Contracts), Session); - type OnReapAccount = System; + type OnReapAccount = (System, Recovery); type OnNewAccount = Indices; type Event = Event; type DustRemoval = (); @@ -488,19 +488,22 @@ impl pallet_finality_tracker::Trait for Runtime { } parameter_types! { - pub const ReservationFee: Balance = 1 * DOLLARS; - pub const MinLength: usize = 3; - pub const MaxLength: usize = 16; + pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain + pub const FieldDeposit: Balance = 250 * CENTS; // 66 bytes on-chain + pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain + pub const MaximumSubAccounts: u32 = 100; } -impl pallet_nicks::Trait for Runtime { +impl pallet_identity::Trait for Runtime { type Event = Event; type Currency = Balances; - type ReservationFee = ReservationFee; type Slashed = Treasury; - type ForceOrigin = pallet_collective::EnsureMember; - type MinLength = MinLength; - type MaxLength = MaxLength; + type BasicDeposit = BasicDeposit; + type FieldDeposit = FieldDeposit; + type SubAccountDeposit = SubAccountDeposit; + type MaximumSubAccounts = MaximumSubAccounts; + type RegistrarOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type ForceOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; } impl frame_system::offchain::CreateTransaction for Runtime { @@ -543,6 +546,50 @@ impl frame_system::offchain::CreateTransaction for } } +parameter_types! { + pub const ConfigDepositBase: Balance = 5 * DOLLARS; + pub const FriendDepositFactor: Balance = 50 * CENTS; + pub const MaxFriends: u16 = 9; + pub const RecoveryDeposit: Balance = 5 * DOLLARS; +} + +impl pallet_recovery::Trait for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type ConfigDepositBase = ConfigDepositBase; + type FriendDepositFactor = FriendDepositFactor; + type MaxFriends = MaxFriends; + type RecoveryDeposit = RecoveryDeposit; +} + +parameter_types! { + pub const CandidateDeposit: Balance = 10 * DOLLARS; + pub const WrongSideDeduction: Balance = 2 * DOLLARS; + pub const MaxStrikes: u32 = 10; + pub const RotationPeriod: BlockNumber = 80 * HOURS; + pub const PeriodSpend: Balance = 500 * DOLLARS; + pub const MaxLockDuration: BlockNumber = 36 * 30 * DAYS; + pub const ChallengePeriod: BlockNumber = 7 * DAYS; + pub const MaxMembers: u32 = 999; +} + +impl pallet_society::Trait for Runtime { + type Event = Event; + type Currency = Balances; + type Randomness = RandomnessCollectiveFlip; + type CandidateDeposit = CandidateDeposit; + type WrongSideDeduction = WrongSideDeduction; + type MaxStrikes = MaxStrikes; + type PeriodSpend = PeriodSpend; + type MembershipChanged = (); + type RotationPeriod = RotationPeriod; + type MaxLockDuration = MaxLockDuration; + type FounderSetOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type SuspensionJudgementOrigin = pallet_society::EnsureFounder; + type ChallengePeriod = ChallengePeriod; +} + construct_runtime!( pub enum Runtime where Block = Block, @@ -573,7 +620,9 @@ construct_runtime!( AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, Offences: pallet_offences::{Module, Call, Storage, Event}, RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Call, Storage}, - Nicks: pallet_nicks::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event}, + Society: pallet_society::{Module, Call, Storage, Event}, + Recovery: pallet_recovery::{Module, Call, Storage, Event}, } ); -- GitLab From 37be26343ac2f8ac2b692346246b8c7954d79199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 14 Jan 2020 22:35:35 +0100 Subject: [PATCH 117/296] Make offchain worker calls more future proof. (#4618) * Add warning if offchain workers version is not supported. * Support only v2. * Make it a warning. --- client/offchain/src/lib.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index e25072d42d..78760fb011 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -101,13 +101,14 @@ impl OffchainWorkers< let has_api_v1 = runtime.has_api_with::, _>( &at, |v| v == 1 ); - let has_api_v2 = runtime.has_api::>(&at); + let has_api_v2 = runtime.has_api_with::, _>( + &at, |v| v == 2 + ); let version = match (has_api_v1, has_api_v2) { (_, Ok(true)) => 2, (Ok(true), _) => 1, _ => 0, }; - debug!("Checking offchain workers at {:?}: version:{}", at, version); if version > 0 { let (api, runner) = api::AsyncApi::new( @@ -139,6 +140,8 @@ impl OffchainWorkers< }); futures::future::Either::Left(runner.process()) } else { + let help = "Consider turning off offchain workers if they are not part of your runtime."; + log::error!("Unsupported Offchain Worker API version: {}. {}", version, help); futures::future::Either::Right(futures::future::ready(())) } } -- GitLab From 05ce617712e1b229b5699850f9794e7889583a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Wed, 15 Jan 2020 10:48:33 +0000 Subject: [PATCH 118/296] network: add logging for extra requests (#4625) * network: add logging for extra requests * fixed tests compilation Co-authored-by: Svyatoslav Nikolsky --- client/network/src/protocol/sync.rs | 4 +- .../src/protocol/sync/extra_requests.rs | 43 +++++++++++++++---- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/client/network/src/protocol/sync.rs b/client/network/src/protocol/sync.rs index 8929fc75f8..a513d47ca4 100644 --- a/client/network/src/protocol/sync.rs +++ b/client/network/src/protocol/sync.rs @@ -308,8 +308,8 @@ impl ChainSync { best_queued_hash: info.best_hash, best_queued_number: info.best_number, best_imported_number: info.best_number, - extra_finality_proofs: ExtraRequests::new(), - extra_justifications: ExtraRequests::new(), + extra_finality_proofs: ExtraRequests::new("finality proof"), + extra_justifications: ExtraRequests::new("justification"), role, required_block_attributes, queue_blocks: Default::default(), diff --git a/client/network/src/protocol/sync/extra_requests.rs b/client/network/src/protocol/sync/extra_requests.rs index a0ea68af5f..44b42b154f 100644 --- a/client/network/src/protocol/sync/extra_requests.rs +++ b/client/network/src/protocol/sync/extra_requests.rs @@ -18,7 +18,7 @@ use sp_blockchain::Error as ClientError; use crate::protocol::sync::{PeerSync, PeerSyncState}; use fork_tree::ForkTree; use libp2p::PeerId; -use log::{debug, warn}; +use log::{debug, trace, warn}; use sp_runtime::traits::{Block as BlockT, NumberFor, Zero}; use std::collections::{HashMap, HashSet, VecDeque}; use std::time::{Duration, Instant}; @@ -48,10 +48,12 @@ pub(crate) struct ExtraRequests { failed_requests: HashMap, Vec<(PeerId, Instant)>>, /// successful requests importing_requests: HashSet>, + /// the name of this type of extra request (useful for logging.) + request_type_name: &'static str, } impl ExtraRequests { - pub(crate) fn new() -> Self { + pub(crate) fn new(request_type_name: &'static str) -> Self { ExtraRequests { tree: ForkTree::new(), best_seen_finalized_number: Zero::zero(), @@ -59,6 +61,7 @@ impl ExtraRequests { active_requests: HashMap::new(), failed_requests: HashMap::new(), importing_requests: HashSet::new(), + request_type_name, } } @@ -113,11 +116,28 @@ impl ExtraRequests { // messages to chain sync. if let Some(request) = self.active_requests.remove(&who) { if let Some(r) = resp { + trace!(target: "sync", "Queuing import of {} from {:?} for {:?}", + self.request_type_name, + who, + request, + ); + self.importing_requests.insert(request); return Some((who, request.0, request.1, r)) + } else { + trace!(target: "sync", "Empty {} response from {:?} for {:?}", + self.request_type_name, + who, + request, + ); } self.failed_requests.entry(request).or_insert(Vec::new()).push((who, Instant::now())); self.pending_requests.push_front(request); + } else { + trace!(target: "sync", "No active {} request to {:?}", + self.request_type_name, + who, + ); } None } @@ -265,6 +285,13 @@ impl<'a, B: BlockT> Matcher<'a, B> { continue } self.extras.active_requests.insert(peer.clone(), request); + + trace!(target: "sync", "Sending {} request to {:?} for {:?}", + self.extras.request_type_name, + peer, + request, + ); + return Some((peer.clone(), request)) } @@ -293,7 +320,7 @@ mod tests { #[test] fn requests_are_processed_in_order() { fn property(mut peers: ArbitraryPeers) { - let mut requests = ExtraRequests::::new(); + let mut requests = ExtraRequests::::new("test"); let num_peers_available = peers.0.values() .filter(|s| s.state == PeerSyncState::Available).count(); @@ -319,7 +346,7 @@ mod tests { #[test] fn new_roots_schedule_new_request() { fn property(data: Vec) { - let mut requests = ExtraRequests::::new(); + let mut requests = ExtraRequests::::new("test"); for (i, number) in data.into_iter().enumerate() { let hash = [i as u8; 32].into(); let pending = requests.pending_requests.len(); @@ -336,7 +363,7 @@ mod tests { #[test] fn disconnecting_implies_rescheduling() { fn property(mut peers: ArbitraryPeers) -> bool { - let mut requests = ExtraRequests::::new(); + let mut requests = ExtraRequests::::new("test"); let num_peers_available = peers.0.values() .filter(|s| s.state == PeerSyncState::Available).count(); @@ -371,7 +398,7 @@ mod tests { #[test] fn no_response_reschedules() { fn property(mut peers: ArbitraryPeers) { - let mut requests = ExtraRequests::::new(); + let mut requests = ExtraRequests::::new("test"); let num_peers_available = peers.0.values() .filter(|s| s.state == PeerSyncState::Available).count(); @@ -404,7 +431,7 @@ mod tests { fn request_is_rescheduled_when_earlier_block_is_finalized() { let _ = ::env_logger::try_init(); - let mut finality_proofs = ExtraRequests::::new(); + let mut finality_proofs = ExtraRequests::::new("test"); let hash4 = [4; 32].into(); let hash5 = [5; 32].into(); @@ -442,7 +469,7 @@ mod tests { #[test] fn anecstor_roots_are_finalized_when_finality_notification_is_missed() { - let mut finality_proofs = ExtraRequests::::new(); + let mut finality_proofs = ExtraRequests::::new("test"); let hash4 = [4; 32].into(); let hash5 = [5; 32].into(); -- GitLab From 5649259a6eedb11f31613d35b50fc2ab60a23d57 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 15 Jan 2020 11:48:46 +0100 Subject: [PATCH 119/296] Add more logging to the network (#4621) --- client/network/src/service.rs | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 4e923a51a1..9c9a87bb67 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -33,10 +33,10 @@ use std::task::Poll; use sp_consensus::import_queue::{ImportQueue, Link}; use sp_consensus::import_queue::{BlockImportResult, BlockImportError}; use futures::{prelude::*, channel::mpsc}; -use log::{warn, error, info}; +use log::{warn, error, info, trace}; use libp2p::{PeerId, Multiaddr, kad::record}; use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; -use libp2p::swarm::NetworkBehaviour; +use libp2p::swarm::{NetworkBehaviour, SwarmEvent}; use parking_lot::Mutex; use sc_peerset::PeersetHandle; use sp_runtime::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; @@ -774,23 +774,32 @@ impl, H: ExHashT> Future for Ne loop { // Process the next action coming from the network. - let poll_value = this.network_service.poll_next_unpin(cx); + let next_event = this.network_service.next_event(); + futures::pin_mut!(next_event); + let poll_value = next_event.poll_unpin(cx); match poll_value { Poll::Pending => break, - Poll::Ready(Some(BehaviourOut::BlockImport(origin, blocks))) => + Poll::Ready(SwarmEvent::Behaviour(BehaviourOut::BlockImport(origin, blocks))) => this.import_queue.import_blocks(origin, blocks), - Poll::Ready(Some(BehaviourOut::JustificationImport(origin, hash, nb, justification))) => + Poll::Ready(SwarmEvent::Behaviour(BehaviourOut::JustificationImport(origin, hash, nb, justification))) => this.import_queue.import_justification(origin, hash, nb, justification), - Poll::Ready(Some(BehaviourOut::FinalityProofImport(origin, hash, nb, proof))) => + Poll::Ready(SwarmEvent::Behaviour(BehaviourOut::FinalityProofImport(origin, hash, nb, proof))) => this.import_queue.import_finality_proof(origin, hash, nb, proof), - Poll::Ready(Some(BehaviourOut::Event(ev))) => { - this.event_streams.retain(|sender| sender.unbounded_send(ev.clone()).is_ok()); - }, - Poll::Ready(None) => { - error!(target: "sync", "Network events stream has returned None"); - break; - }, + Poll::Ready(SwarmEvent::Behaviour(BehaviourOut::Event(ev))) => + this.event_streams.retain(|sender| sender.unbounded_send(ev.clone()).is_ok()), + Poll::Ready(SwarmEvent::Connected(peer_id)) => + trace!(target: "sub-libp2p", "Libp2p => Connected({:?})", peer_id), + Poll::Ready(SwarmEvent::Disconnected(peer_id)) => + trace!(target: "sub-libp2p", "Libp2p => Disconnected({:?})", peer_id), + Poll::Ready(SwarmEvent::NewListenAddr(addr)) => + trace!(target: "sub-libp2p", "Libp2p => NewListenAddr({})", addr), + Poll::Ready(SwarmEvent::ExpiredListenAddr(addr)) => + trace!(target: "sub-libp2p", "Libp2p => ExpiredListenAddr({})", addr), + Poll::Ready(SwarmEvent::UnreachableAddr { peer_id, address, error }) => + trace!(target: "sub-libp2p", "Libp2p => Failed to reach {:?} through {:?}: {}", peer_id, address, error), + Poll::Ready(SwarmEvent::StartConnect(peer_id)) => + trace!(target: "sub-libp2p", "Libp2p => StartConnect({:?})", peer_id), }; } -- GitLab From 33b3c2386010a124e90cd3490b6d4a63fd89576e Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Wed, 15 Jan 2020 16:37:07 +0100 Subject: [PATCH 120/296] Return early when fees/balances/values are zero (#4628) * Return early when fees/balances/values are zero * Add docs about no-op --- frame/balances/src/lib.rs | 58 +++++++++++++++++++++++++++- frame/transaction-payment/src/lib.rs | 31 ++++++++------- 2 files changed, 74 insertions(+), 15 deletions(-) diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 1f8e099880..b488b96701 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -885,7 +885,10 @@ where Self::free_balance(who) + Self::reserved_balance(who) } + // Check if `value` amount of free balance can be slashed from `who`. + // Is a no-op if value to be slashed is zero. fn can_slash(who: &T::AccountId, value: Self::Balance) -> bool { + if value.is_zero() { return true } Self::free_balance(who) >= value } @@ -901,7 +904,10 @@ where >::get(who) } + // Burn funds from the total issuance, returning a positive imbalance for the amount burned. + // Is a no-op if amount to be burned is zero. fn burn(mut amount: Self::Balance) -> Self::PositiveImbalance { + if amount.is_zero() { return PositiveImbalance::zero() } >::mutate(|issued| { *issued = issued.checked_sub(&amount).unwrap_or_else(|| { amount = *issued; @@ -911,7 +917,11 @@ where PositiveImbalance::new(amount) } + // Create new funds into the total issuance, returning a negative imbalance + // for the amount issued. + // Is a no-op if amount to be issued it zero. fn issue(mut amount: Self::Balance) -> Self::NegativeImbalance { + if amount.is_zero() { return NegativeImbalance::zero() } >::mutate(|issued| *issued = issued.checked_add(&amount).unwrap_or_else(|| { amount = Self::Balance::max_value() - *issued; @@ -921,16 +931,21 @@ where NegativeImbalance::new(amount) } + // Ensure that an account can withdraw from their free balance given any existing withdrawal + // restrictions like locks and vesting balance. + // Is a no-op if amount to be withdrawn is zero. + // // # // 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, + amount: T::Balance, reasons: WithdrawReasons, new_balance: T::Balance, ) -> DispatchResult { + if amount.is_zero() { return Ok(()) } if reasons.intersects(WithdrawReason::Reserve | WithdrawReason::Transfer) && Self::vesting_balance(who) > new_balance { @@ -955,12 +970,15 @@ where } } + // Transfer some free balance from `transactor` to `dest`, respecting existence requirements. + // Is a no-op if value to be transferred is zero. fn transfer( transactor: &T::AccountId, dest: &T::AccountId, value: Self::Balance, existence_requirement: ExistenceRequirement, ) -> DispatchResult { + if value.is_zero() { return Ok(()) } let from_balance = Self::free_balance(transactor); let to_balance = Self::free_balance(dest); let would_create = to_balance.is_zero(); @@ -1001,12 +1019,16 @@ where Ok(()) } + // Withdraw some free balance from an account, respecting existence requirements. + // Is a no-op if value to be withdrawn is zero. fn withdraw( who: &T::AccountId, value: Self::Balance, reasons: WithdrawReasons, liveness: ExistenceRequirement, ) -> result::Result { + if value.is_zero() { return Ok(NegativeImbalance::zero()); } + let old_balance = Self::free_balance(who); if let Some(new_balance) = old_balance.checked_sub(&value) { // if we need to keep the account alive... @@ -1026,10 +1048,15 @@ where } } + // Slash an account, returning the negative imbalance created and any left over + // amount that could not be slashed. + // Is a no-op if value to be slashed is zero. fn slash( who: &T::AccountId, value: Self::Balance ) -> (Self::NegativeImbalance, Self::Balance) { + if value.is_zero() { return (NegativeImbalance::zero(), Zero::zero()) } + let free_balance = Self::free_balance(who); let free_slash = cmp::min(free_balance, value); @@ -1049,10 +1076,14 @@ where } } + // Deposit some `value` into the free balance of an existing account. + // Is a no-op if the value to be deposited is zero. fn deposit_into_existing( who: &T::AccountId, value: Self::Balance ) -> result::Result { + if value.is_zero() { return Ok(PositiveImbalance::zero()) } + if Self::total_balance(who).is_zero() { Err(Error::::DeadAccount)? } @@ -1060,10 +1091,14 @@ where Ok(PositiveImbalance::new(value)) } + // Deposit some `value` into the free balance of `who`, possibly creating a new account. + // Is a no-op if the value to be deposited is zero. fn deposit_creating( who: &T::AccountId, value: Self::Balance, ) -> Self::PositiveImbalance { + if value.is_zero() { return Self::PositiveImbalance::zero() } + let (imbalance, _) = Self::make_free_balance_be(who, Self::free_balance(who) + value); if let SignedImbalance::Positive(p) = imbalance { p @@ -1122,7 +1157,10 @@ impl, I: Instance> ReservableCurrency for Module where T::Balance: MaybeSerializeDeserialize + Debug { + // Check if `who` can reserve `value` from their free balance. + // Is a no-op if value to be reserved is zero. fn can_reserve(who: &T::AccountId, value: Self::Balance) -> bool { + if value.is_zero() { return true } Self::free_balance(who) .checked_sub(&value) .map_or(false, |new_balance| @@ -1134,7 +1172,10 @@ where >::get(who) } + // Move `value` from the free balance from `who` to their reserved balance. + // Is a no-op if value to be reserved is zero. fn reserve(who: &T::AccountId, value: Self::Balance) -> result::Result<(), DispatchError> { + if value.is_zero() { return Ok(()) } let b = Self::free_balance(who); if b < value { Err(Error::::InsufficientBalance)? @@ -1146,7 +1187,10 @@ where Ok(()) } + // Unreserve some funds, returning any amount that was unable to be unreserved. + // Is a no-op if the value to be unreserved is zero. fn unreserve(who: &T::AccountId, value: Self::Balance) -> Self::Balance { + if value.is_zero() { return Zero::zero() } let b = Self::reserved_balance(who); let actual = cmp::min(b, value); Self::set_free_balance(who, Self::free_balance(who) + actual); @@ -1154,10 +1198,14 @@ where value - actual } + // Slash from reserved balance, returning the negative imbalance created, + // and any amount that was unable to be slashed. + // Is a no-op if the value to be slashed is zero. fn slash_reserved( who: &T::AccountId, value: Self::Balance ) -> (Self::NegativeImbalance, Self::Balance) { + if value.is_zero() { return (NegativeImbalance::zero(), Zero::zero()) } let b = Self::reserved_balance(who); let slash = cmp::min(b, value); // underflow should never happen, but it if does, there's nothing to be done here. @@ -1165,11 +1213,14 @@ where (NegativeImbalance::new(slash), value - slash) } + // Move the reserved balance of one account into the free balance of another. + // Is a no-op if the value to be moved is zero. fn repatriate_reserved( slashed: &T::AccountId, beneficiary: &T::AccountId, value: Self::Balance, ) -> result::Result { + if value.is_zero() { return Ok (Zero::zero()) } if Self::total_balance(beneficiary).is_zero() { Err(Error::::DeadAccount)? } @@ -1187,6 +1238,8 @@ where { type Moment = T::BlockNumber; + // Set a lock on the balance of `who`. + // Is a no-op if lock amount is zero. fn set_lock( id: LockIdentifier, who: &T::AccountId, @@ -1194,6 +1247,7 @@ where until: T::BlockNumber, reasons: WithdrawReasons, ) { + if amount.is_zero() { return } let now = >::block_number(); let mut new_lock = Some(BalanceLock { id, amount, until, reasons }); let mut locks = Self::locks(who).into_iter().filter_map(|l| @@ -1275,12 +1329,14 @@ where /// /// If there already exists a vesting schedule for the given account, an `Err` is returned /// and nothing is updated. + /// Is a no-op if the amount to be vested is zero. fn add_vesting_schedule( who: &T::AccountId, locked: T::Balance, per_block: T::Balance, starting_block: T::BlockNumber ) -> DispatchResult { + if locked.is_zero() { return Ok(()) } if >::exists(who) { Err(Error::::ExistingVestingSchedule)? } diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index bae3096f3c..fa73b0a9fa 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -218,20 +218,23 @@ impl SignedExtension for ChargeTransactionPayment // pay any fees. let tip = self.0; let fee = Self::compute_fee(len as u32, info, tip); - let imbalance = match T::Currency::withdraw( - who, - fee, - if tip.is_zero() { - WithdrawReason::TransactionPayment.into() - } else { - WithdrawReason::TransactionPayment | WithdrawReason::Tip - }, - ExistenceRequirement::KeepAlive, - ) { - Ok(imbalance) => imbalance, - Err(_) => return InvalidTransaction::Payment.into(), - }; - T::OnTransactionPayment::on_unbalanced(imbalance); + // Only mess with balances if fee is not zero. + if !fee.is_zero() { + let imbalance = match T::Currency::withdraw( + who, + fee, + if tip.is_zero() { + WithdrawReason::TransactionPayment.into() + } else { + WithdrawReason::TransactionPayment | WithdrawReason::Tip + }, + ExistenceRequirement::KeepAlive, + ) { + Ok(imbalance) => imbalance, + Err(_) => return InvalidTransaction::Payment.into(), + }; + T::OnTransactionPayment::on_unbalanced(imbalance); + } let mut r = ValidTransaction::default(); // NOTE: we probably want to maximize the _fee (of any type) per weight unit_ here, which -- GitLab From c2b0c0f8395165f4fc5ee6b9ca8755cc9dd0d41f Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 15 Jan 2020 18:35:27 +0100 Subject: [PATCH 121/296] reset a couple of versions down from v2.0 (#4572) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * reset a couple of versions down from v0.2.0 * Unstablise browser-utils (very new) and grafana-data-source (going to be replaced with prometheus sometime) * unmark a bunch more client crates for stabilization * fix versions in Cargo.tomls * Downgrade network-test * Set frame-metadata version to `10.0.0` * Hide and documented storage generator as internal api * Downgrade `sp-externalities` * Downgrade `sc-cli` * Downgrade sc-executor et al to 0.8.0 * Downgrade sp-state-machine to 0.8.0 * Downgrade pallet-contracts et al to 0.8.0 * Downgrade sp-sandbox to 0.8.0 * downgrade pallet-evm to 0.8.0 * Downgrade pallet-staking to 0.8.0 2.0 should be implementation of lazy payout alongside all the fixes of current module * Downgrade node-transaction-factory to 0.8.0 * frame pallets are 2.0.0 Co-authored-by: Ashley Co-authored-by: Pierre Krieger Co-authored-by: Bastian Köcher Co-authored-by: Sergei Pepyakin Co-authored-by: Wei Tang Co-authored-by: thiolliere Co-authored-by: Marcio Diaz --- Cargo.lock | 274 +++++++++---------- bin/node-template/Cargo.toml | 10 +- bin/node/cli/Cargo.toml | 18 +- bin/node/executor/Cargo.toml | 4 +- bin/node/rpc/Cargo.toml | 4 +- bin/node/runtime/Cargo.toml | 2 +- bin/node/testing/Cargo.toml | 4 +- bin/node/transaction-factory/Cargo.toml | 8 +- client/Cargo.toml | 10 +- client/api/Cargo.toml | 6 +- client/authority-discovery/Cargo.toml | 2 +- client/basic-authorship/Cargo.toml | 6 +- client/block-builder/Cargo.toml | 4 +- client/cli/Cargo.toml | 6 +- client/consensus/aura/Cargo.toml | 8 +- client/consensus/babe/Cargo.toml | 10 +- client/consensus/slots/Cargo.toml | 2 +- client/db/Cargo.toml | 10 +- client/executor/Cargo.toml | 12 +- client/executor/common/Cargo.toml | 2 +- client/executor/runtime-test/Cargo.toml | 2 +- client/executor/wasmi/Cargo.toml | 6 +- client/executor/wasmtime/Cargo.toml | 6 +- client/finality-grandpa/Cargo.toml | 10 +- client/network-gossip/Cargo.toml | 2 +- client/network/Cargo.toml | 4 +- client/network/test/Cargo.toml | 6 +- client/offchain/Cargo.toml | 2 +- client/rpc-api/Cargo.toml | 2 +- client/rpc/Cargo.toml | 8 +- client/service/Cargo.toml | 12 +- client/service/test/Cargo.toml | 4 +- client/state-db/Cargo.toml | 2 +- client/tracing/Cargo.toml | 2 +- frame/contracts/Cargo.toml | 2 +- frame/contracts/rpc/Cargo.toml | 4 +- frame/contracts/rpc/runtime-api/Cargo.toml | 2 +- frame/metadata/Cargo.toml | 2 +- frame/support/Cargo.toml | 4 +- frame/support/src/storage/generator/mod.rs | 2 + frame/support/src/storage/mod.rs | 1 + frame/support/test/Cargo.toml | 2 +- primitives/api/Cargo.toml | 2 +- primitives/api/test/Cargo.toml | 2 +- primitives/blockchain/Cargo.toml | 2 +- primitives/consensus/common/Cargo.toml | 2 +- primitives/core/Cargo.toml | 2 +- primitives/externalities/Cargo.toml | 2 +- primitives/io/Cargo.toml | 4 +- primitives/runtime-interface/Cargo.toml | 4 +- primitives/runtime-interface/test/Cargo.toml | 4 +- primitives/sandbox/Cargo.toml | 2 +- primitives/state-machine/Cargo.toml | 4 +- test-utils/client/Cargo.toml | 8 +- test-utils/runtime/Cargo.toml | 6 +- test-utils/runtime/client/Cargo.toml | 4 +- utils/browser/Cargo.toml | 4 +- utils/frame/rpc/support/Cargo.toml | 2 +- utils/frame/rpc/system/Cargo.toml | 2 +- utils/grafana-data-source/Cargo.toml | 2 +- utils/grafana-data-source/test/Cargo.toml | 2 +- 61 files changed, 276 insertions(+), 273 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5648c89d9..ac34452e31 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,7 +371,7 @@ dependencies = [ [[package]] name = "browser-utils" -version = "2.0.0" +version = "0.8.0" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -386,7 +386,7 @@ dependencies = [ "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-chain-spec 2.0.0", "sc-network 0.8.0", - "sc-service 2.0.0", + "sc-service 0.8.0", "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1316,7 +1316,7 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "2.0.0" +version = "10.0.0" dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1329,7 +1329,7 @@ name = "frame-support" version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-metadata 2.0.0", + "frame-metadata 10.0.0", "frame-support-procedural 2.0.0", "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1344,7 +1344,7 @@ dependencies = [ "sp-inherents 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1391,7 +1391,7 @@ dependencies = [ "sp-inherents 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "trybuild 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1713,7 +1713,7 @@ dependencies = [ [[package]] name = "grafana-data-source" -version = "2.0.0" +version = "0.8.0" dependencies = [ "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1735,7 +1735,7 @@ version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "grafana-data-source 2.0.0", + "grafana-data-source 0.8.0", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3021,7 +3021,7 @@ dependencies = [ name = "node-cli" version = "2.0.0" dependencies = [ - "browser-utils 2.0.0", + "browser-utils 0.8.0", "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "frame-support 2.0.0", "frame-system 2.0.0", @@ -3033,7 +3033,7 @@ dependencies = [ "node-primitives 2.0.0", "node-rpc 2.0.0", "node-runtime 2.0.0", - "node-transaction-factory 2.0.0", + "node-transaction-factory 0.8.0", "pallet-authority-discovery 2.0.0", "pallet-balances 2.0.0", "pallet-contracts 2.0.0", @@ -3043,20 +3043,20 @@ dependencies = [ "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-authority-discovery 2.0.0", - "sc-basic-authority 2.0.0", + "sc-authority-discovery 0.8.0", + "sc-basic-authority 0.8.0", "sc-chain-spec 2.0.0", - "sc-cli 2.0.0", - "sc-client 2.0.0", + "sc-cli 0.8.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", - "sc-client-db 2.0.0", + "sc-client-db 0.8.0", "sc-consensus-babe 0.8.0", - "sc-finality-grandpa 2.0.0", + "sc-finality-grandpa 0.8.0", "sc-keystore 2.0.0", "sc-network 0.8.0", "sc-offchain 2.0.0", "sc-rpc 2.0.0", - "sc-service 2.0.0", + "sc-service 0.8.0", "sc-service-test 2.0.0", "sc-telemetry 2.0.0", "sc-transaction-pool 2.0.0", @@ -3102,12 +3102,12 @@ dependencies = [ "pallet-transaction-payment 2.0.0", "pallet-treasury 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor 2.0.0", + "sc-executor 0.8.0", "sp-application-crypto 2.0.0", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-trie 2.0.0", "substrate-test-client 2.0.0", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3131,9 +3131,9 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "node-runtime 2.0.0", - "pallet-contracts-rpc 2.0.0", + "pallet-contracts-rpc 0.8.0", "pallet-transaction-payment-rpc 2.0.0", - "sc-client 2.0.0", + "sc-client 0.8.0", "sp-api 2.0.0", "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", @@ -3169,7 +3169,7 @@ dependencies = [ "pallet-balances 2.0.0", "pallet-collective 2.0.0", "pallet-contracts 2.0.0", - "pallet-contracts-rpc-runtime-api 2.0.0", + "pallet-contracts-rpc-runtime-api 0.8.0", "pallet-democracy 2.0.0", "pallet-elections-phragmen 2.0.0", "pallet-finality-tracker 2.0.0", @@ -3223,14 +3223,14 @@ dependencies = [ "node-template-runtime 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-basic-authority 2.0.0", - "sc-cli 2.0.0", - "sc-client 2.0.0", + "sc-basic-authority 0.8.0", + "sc-cli 0.8.0", + "sc-client 0.8.0", "sc-consensus-aura 0.8.0", - "sc-executor 2.0.0", - "sc-finality-grandpa 2.0.0", + "sc-executor 0.8.0", + "sc-finality-grandpa 0.8.0", "sc-network 0.8.0", - "sc-service 2.0.0", + "sc-service 0.8.0", "sc-transaction-pool 2.0.0", "sp-consensus 0.8.0", "sp-consensus-aura 0.8.0", @@ -3298,8 +3298,8 @@ dependencies = [ "pallet-transaction-payment 2.0.0", "pallet-treasury 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", - "sc-executor 2.0.0", + "sc-client 0.8.0", + "sc-executor 0.8.0", "sp-core 2.0.0", "sp-io 2.0.0", "sp-keyring 2.0.0", @@ -3310,14 +3310,14 @@ dependencies = [ [[package]] name = "node-transaction-factory" -version = "2.0.0" +version = "0.8.0" dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-cli 2.0.0", - "sc-client 2.0.0", + "sc-cli 0.8.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", - "sc-service 2.0.0", + "sc-service 0.8.0", "sp-api 2.0.0", "sp-block-builder 2.0.0", "sp-blockchain 2.0.0", @@ -3616,7 +3616,7 @@ dependencies = [ "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", - "sp-sandbox 2.0.0", + "sp-sandbox 0.8.0", "sp-std 2.0.0", "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi-validation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3624,12 +3624,12 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" -version = "2.0.0" +version = "0.8.0" dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-contracts-rpc-runtime-api 2.0.0", + "pallet-contracts-rpc-runtime-api 0.8.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3642,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" -version = "2.0.0" +version = "0.8.0" dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -5009,7 +5009,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "2.0.0" +version = "0.8.0" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5038,14 +5038,14 @@ dependencies = [ [[package]] name = "sc-basic-authority" -version = "2.0.0" +version = "0.8.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 2.0.0", - "sc-client 2.0.0", + "sc-block-builder 0.8.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-telemetry 2.0.0", "sc-transaction-pool 2.0.0", @@ -5062,7 +5062,7 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "2.0.0" +version = "0.8.0" dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", @@ -5072,7 +5072,7 @@ dependencies = [ "sp-consensus 0.8.0", "sp-core 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", ] [[package]] @@ -5101,7 +5101,7 @@ dependencies = [ [[package]] name = "sc-cli" -version = "2.0.0" +version = "0.8.0" dependencies = [ "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5118,7 +5118,7 @@ dependencies = [ "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-network 0.8.0", - "sc-service 2.0.0", + "sc-service 0.8.0", "sc-telemetry 2.0.0", "sc-tracing 2.0.0", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5127,7 +5127,7 @@ dependencies = [ "sp-keyring 2.0.0", "sp-panic-handler 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "sc-client" -version = "2.0.0" +version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5149,20 +5149,20 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 2.0.0", + "sc-block-builder 0.8.0", "sc-client-api 2.0.0", - "sc-executor 2.0.0", + "sc-executor 0.8.0", "sc-telemetry 2.0.0", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-inherents 2.0.0", "sp-keyring 2.0.0", "sp-panic-handler 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-trie 2.0.0", "sp-version 2.0.0", @@ -5184,17 +5184,17 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor 2.0.0", + "sc-executor 0.8.0", "sc-telemetry 2.0.0", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-inherents 2.0.0", "sp-keyring 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-test-primitives 2.0.0", "sp-transaction-pool 2.0.0", @@ -5204,7 +5204,7 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "2.0.0" +version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5217,16 +5217,16 @@ dependencies = [ "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", - "sc-executor 2.0.0", - "sc-state-db 2.0.0", + "sc-executor 0.8.0", + "sc-state-db 0.8.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-core 2.0.0", "sp-keyring 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-trie 2.0.0", "substrate-test-runtime-client 2.0.0", ] @@ -5243,14 +5243,14 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-consensus-slots 0.8.0", - "sc-executor 2.0.0", + "sc-executor 0.8.0", "sc-keystore 2.0.0", "sc-network 0.8.0", - "sc-network-test 2.0.0", - "sc-service 2.0.0", + "sc-network-test 0.8.0", + "sc-service 0.8.0", "sc-telemetry 2.0.0", "sp-api 2.0.0", "sp-application-crypto 2.0.0", @@ -5289,16 +5289,16 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pdqselect 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 2.0.0", - "sc-client 2.0.0", + "sc-block-builder 0.8.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-consensus-slots 0.8.0", "sc-consensus-uncles 0.8.0", - "sc-executor 2.0.0", + "sc-executor 0.8.0", "sc-keystore 2.0.0", "sc-network 0.8.0", - "sc-network-test 2.0.0", - "sc-service 2.0.0", + "sc-network-test 0.8.0", + "sc-service 0.8.0", "sc-telemetry 2.0.0", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -5356,7 +5356,7 @@ dependencies = [ "sp-core 2.0.0", "sp-inherents 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "substrate-test-runtime-client 2.0.0", ] @@ -5375,7 +5375,7 @@ dependencies = [ [[package]] name = "sc-executor" -version = "2.0.0" +version = "0.8.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5386,17 +5386,17 @@ dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor-common 2.0.0", - "sc-executor-wasmi 2.0.0", - "sc-executor-wasmtime 2.0.0", + "sc-executor-common 0.8.0", + "sc-executor-wasmi 0.8.0", + "sc-executor-wasmtime 0.8.0", "sc-runtime-test 2.0.0", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-io 2.0.0", "sp-panic-handler 2.0.0", "sp-runtime-interface 2.0.0", "sp-serializer 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-trie 2.0.0", "sp-version 2.0.0", "sp-wasm-interface 2.0.0", @@ -5408,7 +5408,7 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "2.0.0" +version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5422,14 +5422,14 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" -version = "2.0.0" +version = "0.8.0" dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor-common 2.0.0", + "sc-executor-common 0.8.0", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", "sp-wasm-interface 2.0.0", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5437,7 +5437,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "2.0.0" +version = "0.8.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5448,9 +5448,9 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor-common 2.0.0", + "sc-executor-common 0.8.0", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", "sp-wasm-interface 2.0.0", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5461,7 +5461,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "2.0.0" +version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "finality-grandpa 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5473,12 +5473,12 @@ dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-keystore 2.0.0", "sc-network 0.8.0", - "sc-network-gossip 2.0.0", - "sc-network-test 2.0.0", + "sc-network-gossip 0.8.0", + "sc-network-test 0.8.0", "sc-telemetry 2.0.0", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -5491,7 +5491,7 @@ dependencies = [ "sp-inherents 2.0.0", "sp-keyring 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "substrate-test-runtime-client 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5537,8 +5537,8 @@ dependencies = [ "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 2.0.0", - "sc-client 2.0.0", + "sc-block-builder 0.8.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-peerset 2.0.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5564,7 +5564,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "2.0.0" +version = "0.8.0" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5579,7 +5579,7 @@ dependencies = [ [[package]] name = "sc-network-test" -version = "2.0.0" +version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5589,8 +5589,8 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 2.0.0", - "sc-client 2.0.0", + "sc-block-builder 0.8.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-network 0.8.0", "sp-blockchain 2.0.0", @@ -5622,7 +5622,7 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", - "sc-client-db 2.0.0", + "sc-client-db 0.8.0", "sc-keystore 2.0.0", "sc-network 0.8.0", "sc-transaction-pool 2.0.0", @@ -5661,12 +5661,12 @@ dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", - "sc-executor 2.0.0", + "sc-executor 0.8.0", "sc-keystore 2.0.0", "sc-network 0.8.0", - "sc-rpc-api 2.0.0", + "sc-rpc-api 0.8.0", "sc-transaction-pool 2.0.0", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -5676,7 +5676,7 @@ dependencies = [ "sp-rpc 2.0.0", "sp-runtime 2.0.0", "sp-session 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-transaction-pool 2.0.0", "sp-version 2.0.0", "substrate-test-runtime-client 2.0.0", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "2.0.0" +version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5725,32 +5725,32 @@ dependencies = [ "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", - "sp-sandbox 2.0.0", + "sp-sandbox 0.8.0", "sp-std 2.0.0", "substrate-wasm-builder-runner 1.0.4", ] [[package]] name = "sc-service" -version = "2.0.0" +version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "grafana-data-source 2.0.0", + "grafana-data-source 0.8.0", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-chain-spec 2.0.0", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", - "sc-client-db 2.0.0", - "sc-executor 2.0.0", - "sc-finality-grandpa 2.0.0", + "sc-client-db 0.8.0", + "sc-executor 0.8.0", + "sc-finality-grandpa 0.8.0", "sc-keystore 2.0.0", "sc-network 0.8.0", "sc-offchain 2.0.0", @@ -5790,9 +5790,9 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-network 0.8.0", - "sc-service 2.0.0", + "sc-service 0.8.0", "sp-consensus 0.8.0", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -5803,7 +5803,7 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "2.0.0" +version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5837,7 +5837,7 @@ name = "sc-tracing" version = "2.0.0" dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "grafana-data-source 2.0.0", + "grafana-data-source 0.8.0", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-telemetry 2.0.0", @@ -6183,7 +6183,7 @@ dependencies = [ "sp-api-proc-macro 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-test-primitives 2.0.0", "sp-version 2.0.0", @@ -6211,7 +6211,7 @@ dependencies = [ "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-version 2.0.0", "substrate-test-runtime-client 2.0.0", "trybuild 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6298,7 +6298,7 @@ dependencies = [ "sp-block-builder 2.0.0", "sp-consensus 0.8.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", ] [[package]] @@ -6315,7 +6315,7 @@ dependencies = [ "sp-core 2.0.0", "sp-inherents 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-test-primitives 2.0.0", "sp-version 2.0.0", @@ -6390,7 +6390,7 @@ dependencies = [ "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", "sp-serializer 2.0.0", "sp-std 2.0.0", @@ -6414,7 +6414,7 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "2.0.0" +version = "0.8.0" dependencies = [ "environmental 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-std 2.0.0", @@ -6462,9 +6462,9 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-trie 2.0.0", ] @@ -6544,11 +6544,11 @@ dependencies = [ "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-io 2.0.0", "sp-runtime-interface-proc-macro 2.0.0", "sp-runtime-interface-test-wasm 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-wasm-interface 2.0.0", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6570,12 +6570,12 @@ dependencies = [ name = "sp-runtime-interface-test" version = "2.0.0" dependencies = [ - "sc-executor 2.0.0", + "sc-executor 0.8.0", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime-interface 2.0.0", "sp-runtime-interface-test-wasm 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", ] [[package]] @@ -6591,7 +6591,7 @@ dependencies = [ [[package]] name = "sp-sandbox" -version = "2.0.0" +version = "0.8.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6630,7 +6630,7 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "2.0.0" +version = "0.8.0" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6640,7 +6640,7 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", - "sp-externalities 2.0.0", + "sp-externalities 0.8.0", "sp-panic-handler 2.0.0", "sp-trie 2.0.0", "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6870,7 +6870,7 @@ dependencies = [ "jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-rpc-api 2.0.0", + "sc-rpc-api 0.8.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-storage 2.0.0", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6888,7 +6888,7 @@ dependencies = [ "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-transaction-pool 2.0.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -6906,16 +6906,16 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", - "sc-client-db 2.0.0", - "sc-executor 2.0.0", + "sc-client-db 0.8.0", + "sc-executor 0.8.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-core 2.0.0", "sp-keyring 2.0.0", "sp-runtime 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", ] [[package]] @@ -6932,8 +6932,8 @@ dependencies = [ "pallet-babe 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 2.0.0", - "sc-executor 2.0.0", + "sc-client 0.8.0", + "sc-executor 0.8.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", @@ -6948,7 +6948,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-runtime-interface 2.0.0", "sp-session 2.0.0", - "sp-state-machine 2.0.0", + "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-transaction-pool 2.0.0", "sp-trie 2.0.0", @@ -6964,8 +6964,8 @@ version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 2.0.0", - "sc-client 2.0.0", + "sc-block-builder 0.8.0", + "sc-client 0.8.0", "sc-client-api 2.0.0", "sp-api 2.0.0", "sp-blockchain 2.0.0", diff --git a/bin/node-template/Cargo.toml b/bin/node-template/Cargo.toml index 0333e887ec..e18bbd3e1d 100644 --- a/bin/node-template/Cargo.toml +++ b/bin/node-template/Cargo.toml @@ -18,10 +18,10 @@ parking_lot = "0.9.0" codec = { package = "parity-scale-codec", version = "1.0.0" } trie-root = "0.15.2" sp-io = { version = "2.0.0", path = "../../primitives/io" } -sc-cli = { version = "2.0.0", path = "../../client/cli" } +sc-cli = { version = "0.8.0", path = "../../client/cli" } sp-core = { version = "2.0.0", path = "../../primitives/core" } -sc-executor = { version = "2.0.0", path = "../../client/executor" } -sc-service = { version = "2.0.0", path = "../../client/service" } +sc-executor = { version = "0.8", path = "../../client/executor" } +sc-service = { version = "0.8", path = "../../client/service" } sp-inherents = { version = "2.0.0", path = "../../primitives/inherents" } sc-transaction-pool = { version = "2.0.0", path = "../../client/transaction-pool" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } @@ -29,9 +29,9 @@ sc-network = { version = "0.8", path = "../../client/network" } sc-consensus-aura = { version = "0.8", path = "../../client/consensus/aura" } sp-consensus-aura = { version = "0.8", path = "../../primitives/consensus/aura" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } -grandpa = { version = "2.0.0", package = "sc-finality-grandpa", path = "../../client/finality-grandpa" } +grandpa = { version = "0.8", package = "sc-finality-grandpa", path = "../../client/finality-grandpa" } grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } -sc-client = { version = "2.0.0", path = "../../client/" } +sc-client = { version = "0.8", path = "../../client/" } node-template-runtime = { version = "2.0.0", path = "runtime" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sc-basic-authority = { path = "../../client/basic-authorship" } diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index ec54f5b374..6c2ccb49b0 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -47,20 +47,20 @@ sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" # client dependencies sc-client-api = { version = "2.0.0", path = "../../../client/api" } -sc-client = { version = "2.0.0", path = "../../../client/" } +sc-client = { version = "0.8", path = "../../../client/" } sc-chain-spec = { version = "2.0.0", path = "../../../client/chain-spec" } sc-transaction-pool = { version = "2.0.0", path = "../../../client/transaction-pool" } sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } sc-network = { version = "0.8", path = "../../../client/network" } sc-consensus-babe = { version = "0.8", path = "../../../client/consensus/babe" } -grandpa = { version = "2.0.0", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } -sc-client-db = { version = "2.0.0", default-features = false, path = "../../../client/db" } +grandpa = { version = "0.8", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } +sc-client-db = { version = "0.8", default-features = false, path = "../../../client/db" } sc-offchain = { version = "2.0.0", path = "../../../client/offchain" } sc-rpc = { version = "2.0.0", path = "../../../client/rpc" } -sc-basic-authority = { version = "2.0.0", path = "../../../client/basic-authorship" } -sc-service = { version = "2.0.0", default-features = false, path = "../../../client/service" } +sc-basic-authority = { version = "0.8", path = "../../../client/basic-authorship" } +sc-service = { version = "0.8", default-features = false, path = "../../../client/service" } sc-telemetry = { version = "2.0.0", path = "../../../client/telemetry" } -sc-authority-discovery = { version = "2.0.0", path = "../../../client/authority-discovery" } +sc-authority-discovery = { version = "0.8", path = "../../../client/authority-discovery" } # frame dependencies pallet-indices = { version = "2.0.0", path = "../../../frame/indices" } @@ -81,9 +81,9 @@ node-executor = { version = "2.0.0", path = "../executor" } # CLI-specific dependencies tokio = { version = "0.2", features = ["rt-threaded"], optional = true } -sc-cli = { version = "2.0.0", optional = true, path = "../../../client/cli" } +sc-cli = { version = "0.8.0", optional = true, path = "../../../client/cli" } ctrlc = { version = "3.1.3", features = ["termination"], optional = true } -node-transaction-factory = { version = "2.0.0", optional = true, path = "../transaction-factory" } +node-transaction-factory = { version = "0.8.0", optional = true, path = "../transaction-factory" } # WASM-specific dependencies wasm-bindgen = { version = "0.2.57", optional = true } @@ -98,7 +98,7 @@ futures = "0.3.1" tempfile = "3.1.0" [build-dependencies] -sc-cli = { version = "2.0.0", package = "sc-cli", path = "../../../client/cli" } +sc-cli = { version = "0.8.0", package = "sc-cli", path = "../../../client/cli" } build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../../utils/build-script-utils" } structopt = "=0.3.7" vergen = "3.0.4" diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 3aa7ad780a..6e624e09d2 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -9,10 +9,10 @@ edition = "2018" codec = { package = "parity-scale-codec", version = "1.0.0" } node-primitives = { version = "2.0.0", path = "../primitives" } node-runtime = { version = "2.0.0", path = "../runtime" } -sc-executor = { version = "2.0.0", path = "../../../client/executor" } +sc-executor = { version = "0.8", path = "../../../client/executor" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-io = { version = "2.0.0", path = "../../../primitives/io" } -sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../../primitives/state-machine" } sp-trie = { version = "2.0.0", path = "../../../primitives/trie" } trie-root = "0.15.2" diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index 8c96542a8e..174b287516 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -5,13 +5,13 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -sc-client = { version = "2.0.0", path = "../../../client/" } +sc-client = { version = "0.8", path = "../../../client/" } jsonrpc-core = "14.0.3" node-primitives = { version = "2.0.0", path = "../primitives" } node-runtime = { version = "2.0.0", path = "../runtime" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-api = { version = "2.0.0", path = "../../../primitives/api" } -pallet-contracts-rpc = { version = "2.0.0", path = "../../../frame/contracts/rpc/" } +pallet-contracts-rpc = { version = "0.8.0", path = "../../../frame/contracts/rpc/" } pallet-transaction-payment-rpc = { version = "2.0.0", path = "../../../frame/transaction-payment/rpc/" } substrate-frame-rpc-system = { version = "2.0.0", path = "../../../utils/frame/rpc/system" } sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index c434c72120..cfa895c976 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -41,7 +41,7 @@ pallet-babe = { version = "2.0.0", default-features = false, path = "../../../fr pallet-balances = { version = "2.0.0", default-features = false, path = "../../../frame/balances" } pallet-collective = { version = "2.0.0", default-features = false, path = "../../../frame/collective" } pallet-contracts = { version = "2.0.0", default-features = false, path = "../../../frame/contracts" } -pallet-contracts-rpc-runtime-api = { version = "2.0.0", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } pallet-democracy = { version = "2.0.0", default-features = false, path = "../../../frame/democracy" } pallet-elections-phragmen = { version = "2.0.0", default-features = false, path = "../../../frame/elections-phragmen" } pallet-finality-tracker = { version = "2.0.0", default-features = false, path = "../../../frame/finality-tracker" } diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index 4449c7bd22..2c868c5906 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] pallet-balances = { version = "2.0.0", path = "../../../frame/balances" } -sc-client = { version = "2.0.0", path = "../../../client/" } +sc-client = { version = "0.8", path = "../../../client/" } codec = { package = "parity-scale-codec", version = "1.0.0" } pallet-contracts = { version = "2.0.0", path = "../../../frame/contracts" } pallet-grandpa = { version = "2.0.0", path = "../../../frame/grandpa" } @@ -22,7 +22,7 @@ frame-support = { version = "2.0.0", path = "../../../frame/support" } pallet-session = { version = "2.0.0", path = "../../../frame/session" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } pallet-staking = { version = "2.0.0", path = "../../../frame/staking" } -sc-executor = { version = "2.0.0", path = "../../../client/executor" } +sc-executor = { version = "0.8", path = "../../../client/executor" } frame-system = { version = "2.0.0", path = "../../../frame/system" } substrate-test-client = { version = "2.0.0", path = "../../../test-utils/client" } pallet-timestamp = { version = "2.0.0", path = "../../../frame/timestamp" } diff --git a/bin/node/transaction-factory/Cargo.toml b/bin/node/transaction-factory/Cargo.toml index 8b10e10f41..f32a3c23e0 100644 --- a/bin/node/transaction-factory/Cargo.toml +++ b/bin/node/transaction-factory/Cargo.toml @@ -1,19 +1,19 @@ [package] name = "node-transaction-factory" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] sp-block-builder = { version = "2.0.0", path = "../../../primitives/block-builder" } -sc-cli = { version = "2.0.0", path = "../../../client/cli" } +sc-cli = { version = "0.8.0", path = "../../../client/cli" } sc-client-api = { version = "2.0.0", path = "../../../client/api" } -sc-client = { version = "2.0.0", path = "../../../client" } +sc-client = { version = "0.8", path = "../../../client" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } log = "0.4.8" sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-api = { version = "2.0.0", path = "../../../primitives/api" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } -sc-service = { version = "2.0.0", path = "../../../client/service" } +sc-service = { version = "0.8", path = "../../../client/service" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } diff --git a/client/Cargo.toml b/client/Cargo.toml index eaddd9f3dc..7413fc23f9 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -1,17 +1,17 @@ [package] name = "sc-client" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -sc-block-builder = { version = "2.0.0", path = "block-builder" } +sc-block-builder = { version = "0.8", path = "block-builder" } sc-client-api = { version = "2.0.0", path = "api" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } sp-consensus = { version = "0.8", path = "../primitives/consensus/common" } derive_more = { version = "0.99.2" } -sc-executor = { version = "2.0.0", path = "executor" } -sp-externalities = { version = "2.0.0", path = "../primitives/externalities" } +sc-executor = { version = "0.8", path = "executor" } +sp-externalities = { version = "0.8.0", path = "../primitives/externalities" } fnv = { version = "1.0.6" } futures = { version = "0.3.1", features = ["compat"] } hash-db = { version = "0.15.2" } @@ -27,7 +27,7 @@ sp-version = { version = "2.0.0", path = "../primitives/version" } sp-api = { version = "2.0.0", path = "../primitives/api" } sp-runtime = { version = "2.0.0", path = "../primitives/runtime" } sp-blockchain = { version = "2.0.0", path = "../primitives/blockchain" } -sp-state-machine = { version = "2.0.0", path = "../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../primitives/state-machine" } sc-telemetry = { version = "2.0.0", path = "telemetry" } sp-trie = { version = "2.0.0", path = "../primitives/trie" } tracing = "0.1.10" diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 36360a6fb8..651ee1434f 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -8,8 +8,8 @@ edition = "2018" codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } derive_more = { version = "0.99.2" } -sc-executor = { version = "2.0.0", path = "../executor" } -sp-externalities = { version = "2.0.0", path = "../../primitives/externalities" } +sc-executor = { version = "0.8", path = "../executor" } +sp-externalities = { version = "0.8.0", path = "../../primitives/externalities" } fnv = { version = "1.0.6" } futures = { version = "0.3.1" } hash-db = { version = "0.15.2", default-features = false } @@ -25,7 +25,7 @@ sp-std = { version = "2.0.0", default-features = false, path = "../../primitives sp-version = { version = "2.0.0", default-features = false, path = "../../primitives/version" } sp-api = { version = "2.0.0", path = "../../primitives/api" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } sc-telemetry = { version = "2.0.0", path = "../telemetry" } sp-trie = { version = "2.0.0", path = "../../primitives/trie" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 767be822d7..7381e5add1 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-authority-discovery" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index 4cdef01afd..eedf6d1261 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-basic-authority" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -12,13 +12,13 @@ sp-api = { version = "2.0.0", path = "../../primitives/api" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } -sc-client = { version = "2.0.0", path = "../" } +sc-client = { version = "0.8", path = "../" } sc-client-api = { version = "2.0.0", path = "../api" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } sp-inherents = { version = "2.0.0", path = "../../primitives/inherents" } sc-telemetry = { version = "2.0.0", path = "../telemetry" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } -sc-block-builder = { version = "2.0.0", path = "../block-builder" } +sc-block-builder = { version = "0.8", path = "../block-builder" } tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } [dev-dependencies] diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index 1dcc9b05f5..29531c4288 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "sc-block-builder" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-api = { version = "2.0.0", path = "../../primitives/api" } sp-consensus = { version = "0.8.0", path = "../../primitives/consensus/common" } diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index b653f982e6..b46e3992b2 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-cli" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" @@ -26,8 +26,8 @@ sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } sc-network = { version = "0.8", path = "../network" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-core = { version = "2.0.0", path = "../../primitives/core" } -sc-service = { version = "2.0.0", default-features = false, path = "../service" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sc-service = { version = "0.8", default-features = false, path = "../service" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } sc-telemetry = { version = "2.0.0", path = "../telemetry" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } names = "0.11.0" diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index bcbf622cd3..3d4c5a9157 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" sp-application-crypto = { version = "2.0.0", path = "../../../primitives/application-crypto" } sp-consensus-aura = { version = "0.8", path = "../../../primitives/consensus/aura" } sp-block-builder = { version = "2.0.0", path = "../../../primitives/block-builder" } -sc-client = { version = "2.0.0", path = "../../" } +sc-client = { version = "0.8", path = "../../" } sc-client-api = { version = "2.0.0", path = "../../api" } codec = { package = "parity-scale-codec", version = "1.0.0" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } @@ -32,10 +32,10 @@ sc-telemetry = { version = "2.0.0", path = "../../telemetry" } [dev-dependencies] sp-keyring = { version = "2.0.0", path = "../../../primitives/keyring" } -sc-executor = { version = "2.0.0", path = "../../executor" } +sc-executor = { version = "0.8", path = "../../executor" } sc-network = { version = "0.8", path = "../../network" } -sc-network-test = { version = "2.0.0", path = "../../network/test" } -sc-service = { version = "2.0.0", path = "../../service" } +sc-network-test = { version = "0.8.0", path = "../../network/test" } +sc-service = { version = "0.8", path = "../../service" } substrate-test-runtime-client = { version = "2.0.0", path = "../../../test-utils/runtime/client" } tokio = "0.1.22" env_logger = "0.7.0" diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 53f60c76f9..55b0e0cf20 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -20,7 +20,7 @@ sp-timestamp = { version = "2.0.0", path = "../../../primitives/timestamp" } sc-telemetry = { version = "2.0.0", path = "../../telemetry" } sc-keystore = { version = "2.0.0", path = "../../keystore" } sc-client-api = { version = "2.0.0", path = "../../api" } -sc-client = { version = "2.0.0", path = "../../" } +sc-client = { version = "0.8", path = "../../" } sp-api = { version = "2.0.0", path = "../../../primitives/api" } sp-block-builder = { version = "2.0.0", path = "../../../primitives/block-builder" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } @@ -41,12 +41,12 @@ derive_more = "0.99.2" [dev-dependencies] sp-keyring = { version = "2.0.0", path = "../../../primitives/keyring" } -sc-executor = { version = "2.0.0", path = "../../executor" } +sc-executor = { version = "0.8", path = "../../executor" } sc-network = { version = "0.8", path = "../../network" } -sc-network-test = { version = "2.0.0", path = "../../network/test" } -sc-service = { version = "2.0.0", path = "../../service" } +sc-network-test = { version = "0.8.0", path = "../../network/test" } +sc-service = { version = "0.8", path = "../../service" } substrate-test-runtime-client = { version = "2.0.0", path = "../../../test-utils/runtime/client" } -sc-block-builder = { version = "2.0.0", path = "../../block-builder" } +sc-block-builder = { version = "0.8", path = "../../block-builder" } tokio = "0.1.22" env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index 3f1a572249..89ee14b8fa 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -12,7 +12,7 @@ sc-client-api = { version = "2.0.0", path = "../../api" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } -sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0", path = "../../../primitives/state-machine" } sp-api = { version = "2.0.0", path = "../../../primitives/api" } sc-telemetry = { version = "2.0.0", path = "../../telemetry" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index d34b04a17e..6b08d92db9 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-db" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -18,10 +18,10 @@ codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive sc-client-api = { version = "2.0.0", path = "../api" } sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } -sc-client = { version = "2.0.0", path = "../" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } -sc-executor = { version = "2.0.0", path = "../executor" } -sc-state-db = { version = "2.0.0", path = "../state-db" } +sc-client = { version = "0.8", path = "../" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } +sc-executor = { version = "0.8", path = "../executor" } +sc-state-db = { version = "0.8", path = "../state-db" } sp-trie = { version = "2.0.0", path = "../../primitives/trie" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index a2f6ebaac0..aa8c46999d 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -18,10 +18,10 @@ parity-wasm = "0.41.0" lazy_static = "1.4.0" sp-wasm-interface = { version = "2.0.0", path = "../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../primitives/runtime-interface" } -sp-externalities = { version = "2.0.0", path = "../../primitives/externalities" } -sc-executor-common = { version = "2.0.0", path = "common" } -sc-executor-wasmi = { version = "2.0.0", path = "wasmi" } -sc-executor-wasmtime = { version = "2.0.0", path = "wasmtime", optional = true } +sp-externalities = { version = "0.8.0", path = "../../primitives/externalities" } +sc-executor-common = { version = "0.8", path = "common" } +sc-executor-wasmi = { version = "0.8", path = "wasmi" } +sc-executor-wasmtime = { version = "0.8", path = "wasmtime", optional = true } parking_lot = "0.9.0" log = "0.4.8" libsecp256k1 = "0.3.4" @@ -32,7 +32,7 @@ wabt = "0.9.2" hex-literal = "0.2.1" sc-runtime-test = { version = "2.0.0", path = "runtime-test" } substrate-test-runtime = { version = "2.0.0", path = "../../test-utils/runtime" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } test-case = "0.3.3" [features] diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index ddd40de62b..cae0876217 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-common" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index ba88550a92..835021fec2 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -8,7 +8,7 @@ build = "build.rs" [dependencies] sp-std = { version = "2.0.0", default-features = false, path = "../../../primitives/std" } sp-io = { version = "2.0.0", default-features = false, path = "../../../primitives/io" } -sp-sandbox = { version = "2.0.0", default-features = false, path = "../../../primitives/sandbox" } +sp-sandbox = { version = "0.8.0", default-features = false, path = "../../../primitives/sandbox" } sp-core = { version = "2.0.0", default-features = false, path = "../../../primitives/core" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../../primitives/runtime" } diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index 7a13d7ea97..799b9f3c54 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmi" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -9,8 +9,8 @@ log = "0.4.8" wasmi = "0.6.2" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.0.0" } -sc-executor-common = { version = "2.0.0", path = "../common" } +sc-executor-common = { version = "0.8", path = "../common" } sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } -sp-externalities = { version = "2.0.0", path = "../../../primitives/externalities" } +sp-externalities = { version = "0.8.0", path = "../../../primitives/externalities" } diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 0d6bede016..64b08222d1 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmtime" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -9,11 +9,11 @@ log = "0.4.8" wasmi = "0.6.2" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.0.0" } -sc-executor-common = { version = "2.0.0", path = "../common" } +sc-executor-common = { version = "0.8", path = "../common" } sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } -sp-externalities = { version = "2.0.0", path = "../../../primitives/externalities" } +sp-externalities = { version = "0.8.0", path = "../../../primitives/externalities" } cranelift-codegen = "0.50" cranelift-entity = "0.50" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 9f90834e0d..ac0501c3c3 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -20,11 +20,11 @@ sc-telemetry = { version = "2.0.0", path = "../telemetry" } sc-keystore = { version = "2.0.0", path = "../keystore" } serde_json = "1.0.41" sc-client-api = { version = "2.0.0", path = "../api" } -sc-client = { version = "2.0.0", path = "../" } +sc-client = { version = "0.8", path = "../" } sp-inherents = { version = "2.0.0", path = "../../primitives/inherents" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } sc-network = { version = "0.8", path = "../network" } -sc-network-gossip = { version = "2.0.0", path = "../network-gossip" } +sc-network-gossip = { version = "0.8", path = "../network-gossip" } sp-finality-tracker = { version = "2.0.0", path = "../../primitives/finality-tracker" } sp-finality-grandpa = { version = "2.0.0", path = "../../primitives/finality-grandpa" } finality-grandpa = { version = "0.10.1", features = ["derive-codec"] } @@ -32,11 +32,11 @@ finality-grandpa = { version = "0.10.1", features = ["derive-codec"] } [dev-dependencies] finality-grandpa = { version = "0.10.1", features = ["derive-codec", "test-helpers"] } sc-network = { version = "0.8", path = "../network" } -sc-network-test = { version = "2.0.0", path = "../network/test" } +sc-network-test = { version = "0.8.0", path = "../network/test" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } sp-consensus-babe = { version = "0.8", path = "../../primitives/consensus/babe" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } env_logger = "0.7.0" tokio = "0.1.22" tempfile = "3.1.0" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index cf8d31c6d3..91c80e2213 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Gossiping for the Substrate network protocol" name = "sc-network-gossip" -version = "2.0.0" +version = "0.8.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index d24f986f4c..f1d89f71b0 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -25,13 +25,13 @@ rand = "0.7.2" libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } -sc-client = { version = "2.0.0", path = "../" } +sc-client = { version = "0.8", path = "../" } sc-client-api = { version = "2.0.0", path = "../api" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-arithmetic = { version = "2.0.0", path = "../../primitives/arithmetic" } sp-core = { version = "2.0.0", path = "../../primitives/core" } -sc-block-builder = { version = "2.0.0", path = "../block-builder" } +sc-block-builder = { version = "0.8", path = "../block-builder" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } sc-peerset = { version = "2.0.0", path = "../peerset" } serde = { version = "1.0.101", features = ["derive"] } diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 381276ecfa..036607df92 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Integration tests for Substrate network protocol" name = "sc-network-test" -version = "2.0.0" +version = "0.8.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" @@ -16,12 +16,12 @@ futures-timer = "0.4.0" rand = "0.7.2" libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } -sc-client = { version = "2.0.0", path = "../../" } +sc-client = { version = "0.8", path = "../../" } sc-client-api = { version = "2.0.0", path = "../../api" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } -sc-block-builder = { version = "2.0.0", path = "../../block-builder" } +sc-block-builder = { version = "0.8", path = "../../block-builder" } sp-consensus-babe = { version = "0.8", path = "../../../primitives/consensus/babe" } env_logger = "0.7.0" substrate-test-runtime-client = { version = "2.0.0", path = "../../../test-utils/runtime/client" } diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index 8048d10dc3..3ef98f1ab9 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -31,7 +31,7 @@ hyper = "0.12.35" hyper-rustls = "0.17.1" [dev-dependencies] -sc-client-db = { version = "2.0.0", default-features = true, path = "../db/" } +sc-client-db = { version = "0.8", default-features = true, path = "../db/" } env_logger = "0.7.0" substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } tokio = "0.1.22" diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index 2c7a2ee071..7f1a12f80e 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-api" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index f4a42d169a..6530bff4ed 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -5,9 +5,9 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -sc-rpc-api = { version = "2.0.0", path = "../rpc-api" } +sc-rpc-api = { version = "0.8", path = "../rpc-api" } sc-client-api = { version = "2.0.0", path = "../api" } -sc-client = { version = "2.0.0", path = "../" } +sc-client = { version = "0.8", path = "../" } sp-api = { version = "2.0.0", path = "../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.0.0" } futures = { version = "0.3.1", features = ["compat"] } @@ -20,8 +20,8 @@ serde_json = "1.0.41" sp-session = { version = "2.0.0", path = "../../primitives/session" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-rpc = { version = "2.0.0", path = "../../primitives/rpc" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } -sc-executor = { version = "2.0.0", path = "../executor" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } +sc-executor = { version = "0.8", path = "../executor" } sc-keystore = { version = "2.0.0", path = "../keystore" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index c417479511..095136a11c 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -39,11 +39,11 @@ sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } sc-network = { version = "0.8", path = "../network" } sc-chain-spec = { version = "2.0.0", path = "../chain-spec" } sc-client-api = { version = "2.0.0", path = "../api" } -sc-client = { version = "2.0.0", path = "../" } +sc-client = { version = "0.8", path = "../" } sp-api = { version = "2.0.0", path = "../../primitives/api" } -sc-client-db = { version = "2.0.0", path = "../db" } +sc-client-db = { version = "0.8", path = "../db" } codec = { package = "parity-scale-codec", version = "1.0.0" } -sc-executor = { version = "2.0.0", path = "../executor" } +sc-executor = { version = "0.8", path = "../executor" } sc-transaction-pool = { version = "2.0.0", path = "../transaction-pool" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } sc-rpc-server = { version = "2.0.0", path = "../rpc-servers" } @@ -51,13 +51,13 @@ sc-rpc = { version = "2.0.0", path = "../rpc" } sc-telemetry = { version = "2.0.0", path = "../telemetry" } sc-offchain = { version = "2.0.0", path = "../offchain" } parity-multiaddr = { package = "parity-multiaddr", version = "0.5.0" } -grafana-data-source = { version = "2.0.0", path = "../../utils/grafana-data-source" } +grafana-data-source = { version = "0.8", path = "../../utils/grafana-data-source" } sc-tracing = { version = "2.0.0", path = "../tracing" } tracing = "0.1.10" [dev-dependencies] substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } sp-consensus-babe = { version = "0.8", path = "../../primitives/consensus/babe" } -grandpa = { version = "2.0.0", package = "sc-finality-grandpa", path = "../finality-grandpa" } +grandpa = { version = "0.8", package = "sc-finality-grandpa", path = "../finality-grandpa" } grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } tokio = { version = "0.2", features = ["rt-core"] } diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index 6fa6e145cf..01ccf71a4b 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -12,10 +12,10 @@ log = "0.4.8" env_logger = "0.7.0" fdlimit = "0.1.1" futures = { version = "0.3.1", features = ["compat"] } -sc-service = { version = "2.0.0", default-features = false, path = "../../service" } +sc-service = { version = "0.8.0", default-features = false, path = "../../service" } sc-network = { version = "0.8", path = "../../network" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } -sc-client = { version = "2.0.0", path = "../../" } +sc-client = { version = "0.8", path = "../../" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index 31335d752e..9e162c5cb9 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-state-db" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/client/tracing/Cargo.toml b/client/tracing/Cargo.toml index 2ceee93f6a..2268c5719f 100644 --- a/client/tracing/Cargo.toml +++ b/client/tracing/Cargo.toml @@ -15,7 +15,7 @@ slog = { version = "2.5.2", features = ["nested-values"] } tracing-core = "0.1.7" sc-telemetry = { version = "2.0.0", path = "../telemetry" } -grafana-data-source = { version = "2.0.0", path = "../../utils/grafana-data-source" } +grafana-data-source = { version = "0.8", path = "../../utils/grafana-data-source" } [dev-dependencies] tracing = "0.1.10" diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index c6102d23ea..d583809f0b 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -14,7 +14,7 @@ sp-core = { version = "2.0.0", default-features = false, path = "../../primitive sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } sp-io = { version = "2.0.0", default-features = false, path = "../../primitives/io" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } -sp-sandbox = { version = "2.0.0", default-features = false, path = "../../primitives/sandbox" } +sp-sandbox = { version = "0.8.0", default-features = false, path = "../../primitives/sandbox" } frame-support = { version = "2.0.0", default-features = false, path = "../support" } frame-system = { version = "2.0.0", default-features = false, path = "../system" } diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index c563d9f727..61eb55368e 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" @@ -15,7 +15,7 @@ sp-rpc = { version = "2.0.0", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-api = { version = "2.0.0", path = "../../../primitives/api" } -pallet-contracts-rpc-runtime-api = { version = "2.0.0", path = "./runtime-api" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0", path = "./runtime-api" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index c8e183237c..e0cbd73f80 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc-runtime-api" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index 64cf326ff6..bcb90d2368 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-metadata" -version = "2.0.0" +version = "10.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 1695375d36..d8460ef7e8 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" log = "0.4" serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false, features = ["derive"] } -frame-metadata = { version = "2.0.0", default-features = false, path = "../metadata" } +frame-metadata = { version = "10.0.0", default-features = false, path = "../metadata" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-io ={ path = "../../primitives/io", default-features = false } sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } @@ -18,7 +18,7 @@ sp-inherents = { version = "2.0.0", default-features = false, path = "../../prim frame-support-procedural = { version = "2.0.0", path = "./procedural" } paste = "0.1.6" once_cell = { version = "0.2.4", default-features = false, optional = true } -sp-state-machine = { version = "2.0.0", optional = true, path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", optional = true, path = "../../primitives/state-machine" } bitmask = { version = "0.5.0", default-features = false } impl-trait-for-tuples = "0.1.3" tracing = { version = "0.1.10", optional = true } diff --git a/frame/support/src/storage/generator/mod.rs b/frame/support/src/storage/generator/mod.rs index 386e3d1cec..476c6d4472 100644 --- a/frame/support/src/storage/generator/mod.rs +++ b/frame/support/src/storage/generator/mod.rs @@ -20,6 +20,8 @@ //! implementation of StorageValue for this type). //! //! They are used by `decl_storage`. +//! +//! This is internal api and is subject to change. mod linked_map; mod map; diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index 0908adae3b..f629ac3eb9 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -23,6 +23,7 @@ use crate::{traits::Len, hash::{Twox128, StorageHasher}}; pub mod unhashed; pub mod hashed; pub mod child; +#[doc(hidden)] pub mod generator; /// A trait for working with macro-generated storage values under the substrate storage API. diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 92dc32e478..0c73dcd65e 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-io ={ path = "../../../primitives/io", default-features = false } -sp-state-machine = { version = "2.0.0", optional = true, path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8", optional = true, path = "../../../primitives/state-machine" } frame-support = { version = "2.0.0", default-features = false, path = "../" } sp-inherents = { version = "2.0.0", default-features = false, path = "../../../primitives/inherents" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../../primitives/runtime" } diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index 1e3e555456..b9f736570a 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -11,7 +11,7 @@ sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-runtime = { version = "2.0.0", default-features = false, path = "../runtime" } sp-version = { version = "2.0.0", default-features = false, path = "../version" } -sp-state-machine = { version = "2.0.0", optional = true, path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", optional = true, path = "../../primitives/state-machine" } hash-db = { version = "0.15.2", optional = true } [dev-dependencies] diff --git a/primitives/api/test/Cargo.toml b/primitives/api/test/Cargo.toml index f1f0dfb50f..5892063bd1 100644 --- a/primitives/api/test/Cargo.toml +++ b/primitives/api/test/Cargo.toml @@ -12,7 +12,7 @@ sp-runtime = { version = "2.0.0", path = "../../runtime" } sp-blockchain = { version = "2.0.0", path = "../../blockchain" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } codec = { package = "parity-scale-codec", version = "1.0.0" } -sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../../primitives/state-machine" } trybuild = "1.0.17" rustversion = "1.0.0" diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index 4f3f0d0b5f..a3c442094d 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -13,4 +13,4 @@ codec = { package = "parity-scale-codec", version = "1.0.0", default-features = sp-consensus = { version = "0.8", path = "../consensus/common" } sp-runtime = { version = "2.0.0", path = "../runtime" } sp-block-builder = { version = "2.0.0", path = "../block-builder" } -sp-state-machine = { version = "2.0.0", path = "../state-machine" } +sp-state-machine = { version = "0.8", path = "../state-machine" } diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 4c38e31914..3ae79caa43 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -11,7 +11,7 @@ libp2p = { version = "0.14.0-alpha.1", default-features = false } log = "0.4.8" sp-core = { path= "../../core" } sp-inherents = { version = "2.0.0", path = "../../inherents" } -sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0", path = "../../../primitives/state-machine" } futures = { version = "0.3.1", features = ["thread-pool"] } futures-timer = "0.4.0" sp-std = { version = "2.0.0", path = "../../std" } diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 8242ff8044..f7eec82e55 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -26,7 +26,7 @@ zeroize = { version = "1.0.0", default-features = false } lazy_static = { version = "1.4.0", default-features = false, optional = true } parking_lot = { version = "0.9.0", optional = true } sp-debug-derive = { version = "2.0.0", path = "../debug-derive" } -sp-externalities = { version = "2.0.0", optional = true, path = "../externalities" } +sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } sp-storage = { version = "2.0.0", default-features = false, path = "../storage" } libsecp256k1 = { version = "0.3.2", default-features = false } diff --git a/primitives/externalities/Cargo.toml b/primitives/externalities/Cargo.toml index 09ce3253f2..361a9ac034 100644 --- a/primitives/externalities/Cargo.toml +++ b/primitives/externalities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-externalities" -version = "2.0.0" +version = "0.8.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 04350c9479..2f03f230ef 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -10,10 +10,10 @@ hash-db = { version = "0.15.2", default-features = false } sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-std = { version = "2.0.0", default-features = false, path = "../std" } libsecp256k1 = { version = "0.3.4", optional = true } -sp-state-machine = { version = "2.0.0", optional = true, path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", optional = true, path = "../../primitives/state-machine" } sp-runtime-interface = { version = "2.0.0", default-features = false, path = "../runtime-interface" } sp-trie = { version = "2.0.0", optional = true, path = "../../primitives/trie" } -sp-externalities = { version = "2.0.0", optional = true, path = "../externalities" } +sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } log = { version = "0.4.8", optional = true } [features] diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index cdc94b6a2f..bac9a893de 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" sp-wasm-interface = { version = "2.0.0", optional = true, path = "../wasm-interface" } sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-runtime-interface-proc-macro = { version = "2.0.0", path = "proc-macro" } -sp-externalities = { version = "2.0.0", optional = true, path = "../externalities" } +sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false } environmental = { version = "1.0.2", optional = true } static_assertions = "1.0.0" @@ -16,7 +16,7 @@ primitive-types = { version = "0.6.1", default-features = false } [dev-dependencies] sp-runtime-interface-test-wasm = { version = "2.0.0", path = "test-wasm" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } sp-core = { version = "2.0.0", path = "../core" } sp-io = { version = "2.0.0", path = "../io" } rustversion = "1.0.0" diff --git a/primitives/runtime-interface/test/Cargo.toml b/primitives/runtime-interface/test/Cargo.toml index 35eb8cb8e1..f0a4c0edd4 100644 --- a/primitives/runtime-interface/test/Cargo.toml +++ b/primitives/runtime-interface/test/Cargo.toml @@ -7,8 +7,8 @@ publish = false [dependencies] sp-runtime-interface = { version = "2.0.0", path = "../" } -sc-executor = { version = "2.0.0", path = "../../../client/executor" } +sc-executor = { version = "0.8", path = "../../../client/executor" } sp-runtime-interface-test-wasm = { version = "2.0.0", path = "../test-wasm" } -sp-state-machine = { version = "2.0.0", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../../primitives/state-machine" } sp-core = { version = "2.0.0", path = "../../core" } sp-io = { version = "2.0.0", path = "../../io" } diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index ff3b7662cd..5d161a6deb 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-sandbox" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index 1424845ea6..11e2aa0cef 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-state-machine" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" @@ -17,7 +17,7 @@ sp-panic-handler = { version = "2.0.0", path = "../panic-handler" } codec = { package = "parity-scale-codec", version = "1.0.0" } num-traits = "0.2.8" rand = "0.7.2" -sp-externalities = { version = "2.0.0", path = "../externalities" } +sp-externalities = { version = "0.8.0", path = "../externalities" } [dev-dependencies] hex-literal = "0.2.1" diff --git a/test-utils/client/Cargo.toml b/test-utils/client/Cargo.toml index 05dc41b223..8b1ebc39f4 100644 --- a/test-utils/client/Cargo.toml +++ b/test-utils/client/Cargo.toml @@ -6,10 +6,10 @@ edition = "2018" [dependencies] sc-client-api = { version = "2.0.0", path = "../../client/api" } -sc-client = { version = "2.0.0", path = "../../client/" } -sc-client-db = { version = "2.0.0", features = ["test-helpers"], path = "../../client/db" } +sc-client = { version = "0.8", path = "../../client/" } +sc-client-db = { version = "0.8", features = ["test-helpers"], path = "../../client/db" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } -sc-executor = { version = "2.0.0", path = "../../client/executor" } +sc-executor = { version = "0.8", path = "../../client/executor" } futures = "0.3.1" hash-db = "0.15.2" sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } @@ -17,4 +17,4 @@ codec = { package = "parity-scale-codec", version = "1.0.0" } sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 6444c7fcf1..35a7bdf1f7 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -32,15 +32,15 @@ pallet-babe = { version = "2.0.0", default-features = false, path = "../../frame frame-system = { version = "2.0.0", default-features = false, path = "../../frame/system" } frame-system-rpc-runtime-api = { version = "2.0.0", default-features = false, path = "../../frame/system/rpc/runtime-api" } pallet-timestamp = { version = "2.0.0", default-features = false, path = "../../frame/timestamp" } -sc-client = { version = "2.0.0", optional = true, path = "../../client" } +sc-client = { version = "0.8", optional = true, path = "../../client" } sp-trie = { version = "2.0.0", default-features = false, path = "../../primitives/trie" } sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../../primitives/transaction-pool" } trie-db = { version = "0.18.1", default-features = false } [dev-dependencies] -sc-executor = { version = "2.0.0", path = "../../client/executor" } +sc-executor = { version = "0.8", path = "../../client/executor" } substrate-test-runtime-client = { version = "2.0.0", path = "./client" } -sp-state-machine = { version = "2.0.0", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } [build-dependencies] wasm-builder-runner = { version = "1.0.4", package = "substrate-wasm-builder-runner", path = "../../utils/wasm-builder-runner" } diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index 8e08f6a1b5..aa33f55012 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -sc-block-builder = { version = "2.0.0", path = "../../../client/block-builder" } +sc-block-builder = { version = "0.8", path = "../../../client/block-builder" } substrate-test-client = { version = "2.0.0", path = "../../client" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } substrate-test-runtime = { version = "2.0.0", path = "../../runtime" } @@ -14,5 +14,5 @@ sp-api = { version = "2.0.0", path = "../../../primitives/api" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } codec = { package = "parity-scale-codec", version = "1.0.0" } sc-client-api = { version = "2.0.0", path = "../../../client/api" } -sc-client = { version = "2.0.0", path = "../../../client/" } +sc-client = { version = "0.8", path = "../../../client/" } futures = "0.3.1" diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index b58774075b..cfceaa143c 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "browser-utils" -version = "2.0.0" +version = "0.8.0" authors = ["Parity Technologies "] description = "Utilities for creating a browser light-client." edition = "2018" @@ -16,7 +16,7 @@ js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" kvdb-web = "0.3" -service = { version = "2.0.0", package = "sc-service", path = "../../client/service", default-features = false } +service = { version = "0.8", package = "sc-service", path = "../../client/service", default-features = false } network = { package = "sc-network", path = "../../client/network" } chain-spec = { package = "sc-chain-spec", path = "../../client/chain-spec" } diff --git a/utils/frame/rpc/support/Cargo.toml b/utils/frame/rpc/support/Cargo.toml index f26a69cc5f..19451743cd 100644 --- a/utils/frame/rpc/support/Cargo.toml +++ b/utils/frame/rpc/support/Cargo.toml @@ -12,7 +12,7 @@ codec = { package = "parity-scale-codec", version = "1" } serde = "1" frame-support = { version = "2.0.0", path = "../../../../frame/support" } sp-storage = { version = "2.0.0", path = "../../../../primitives/storage" } -sc-rpc-api = { version = "2.0.0", path = "../../../../client/rpc-api" } +sc-rpc-api = { version = "0.8", path = "../../../../client/rpc-api" } [dev-dependencies] frame-system = { version = "2.0.0", path = "../../../../frame/system" } diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index 1a479c54e5..39f7735eed 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -sc-client = { version = "2.0.0", path = "../../../../client/" } +sc-client = { version = "0.8", path = "../../../../client/" } codec = { package = "parity-scale-codec", version = "1.0.0" } futures = "0.3.1" jsonrpc-core = "14.0.3" diff --git a/utils/grafana-data-source/Cargo.toml b/utils/grafana-data-source/Cargo.toml index 76bf7d5988..4487b5359f 100644 --- a/utils/grafana-data-source/Cargo.toml +++ b/utils/grafana-data-source/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Grafana data source server" name = "grafana-data-source" -version = "2.0.0" +version = "0.8.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/utils/grafana-data-source/test/Cargo.toml b/utils/grafana-data-source/test/Cargo.toml index 079b49dc86..9575866fa8 100644 --- a/utils/grafana-data-source/test/Cargo.toml +++ b/utils/grafana-data-source/test/Cargo.toml @@ -7,7 +7,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -grafana-data-source = { version = "2.0.0", path = ".." } +grafana-data-source = { version = "0.8", path = ".." } futures = "0.3" futures-timer = "2.0" rand = "0.7" -- GitLab From af1bc8c52a9b661abf7d925393c91713ef22858d Mon Sep 17 00:00:00 2001 From: Weiliang Li Date: Thu, 16 Jan 2020 02:54:34 +0900 Subject: [PATCH 122/296] fix some discrepancies in generic-asset (#4221) * fix generic-asset * Update lib.rs * Update lib.rs * Update lib.rs * Update lib.rs --- frame/generic-asset/src/lib.rs | 132 ++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 60 deletions(-) diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index 0a0209b20f..3b509a683d 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -95,9 +95,10 @@ //! This will emit the `Transferred` event. //! - `reserve`: Moves an amount from free balance to reserved balance. //! - `unreserve`: Move up to an amount from reserved balance to free balance. This function cannot fail. +//! - `mint_free`: Mint to an account's free balance. +//! - `burn_free`: Burn an account's free balance. //! - `slash`: Deduct up to an amount from the combined balance of `who`, preferring to deduct from the //! free balance. This function cannot fail. -//! - `reward`: Add up to an amount to the free balance of an account. //! - `slash_reserved`: Deduct up to an amount from reserved balance of an account. This function cannot fail. //! - `repatriate_reserved`: Move up to an amount from reserved balance of an account to free balance of another //! account. @@ -109,7 +110,7 @@ //! //! The following examples show how to use the Generic Asset module in your custom module. //! -//! ### Examples from the PRML +//! ### Examples from the frame module //! //! The Fees module uses the `Currency` trait to handle fee charge/refund, and its types inherit from `Currency`: //! @@ -162,7 +163,7 @@ use sp_runtime::traits::{ use sp_std::prelude::*; use sp_std::{cmp, result, fmt::Debug}; use frame_support::{ - decl_event, decl_module, decl_storage, ensure, dispatch, decl_error, + decl_event, decl_module, decl_storage, ensure, decl_error, traits::{ Currency, ExistenceRequirement, Imbalance, LockIdentifier, LockableCurrency, ReservableCurrency, SignedImbalance, UpdateBalanceOutcome, WithdrawReason, WithdrawReasons, TryDrop, @@ -359,7 +360,7 @@ decl_module! { fn deposit_event() = default; /// Create a new kind of asset. - fn create(origin, options: AssetOptions) -> dispatch::DispatchResult { + fn create(origin, options: AssetOptions) -> DispatchResult { let origin = ensure_signed(origin)?; let id = Self::next_asset_id(); @@ -392,7 +393,7 @@ decl_module! { origin, #[compact] asset_id: T::AssetId, new_permission: PermissionLatest - ) -> dispatch::DispatchResult { + ) -> DispatchResult { let origin = ensure_signed(origin)?; let permissions: PermissionVersions = new_permission.into(); @@ -410,56 +411,20 @@ decl_module! { /// Mints an asset, increases its total issuance. /// The origin must have `mint` permissions. - fn mint(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::Balance) - -> dispatch::DispatchResult - { - let origin = ensure_signed(origin)?; - if Self::check_permission(&asset_id, &origin, &PermissionType::Mint) { - let original_free_balance = Self::free_balance(&asset_id, &to); - let current_total_issuance = >::get(asset_id); - let new_total_issuance = current_total_issuance.checked_add(&amount) - .ok_or(Error::::TotalMintingOverflow)?; - let value = original_free_balance.checked_add(&amount) - .ok_or(Error::::FreeMintingOverflow)?; - - >::insert(asset_id, new_total_issuance); - Self::set_free_balance(&asset_id, &to, value); - - Self::deposit_event(RawEvent::Minted(asset_id, to, amount)); - - Ok(()) - } else { - Err(Error::::NoMintPermission)? - } + fn mint(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::Balance) -> DispatchResult { + let who = ensure_signed(origin)?; + Self::mint_free(&asset_id, &who, &to, &amount)?; + Self::deposit_event(RawEvent::Minted(asset_id, to, amount)); + Ok(()) } /// Burns an asset, decreases its total issuance. - /// /// The `origin` must have `burn` permissions. - fn burn(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::Balance) - -> dispatch::DispatchResult - { - let origin = ensure_signed(origin)?; - - if Self::check_permission(&asset_id, &origin, &PermissionType::Burn) { - let original_free_balance = Self::free_balance(&asset_id, &to); - - let current_total_issuance = >::get(asset_id); - let new_total_issuance = current_total_issuance.checked_sub(&amount) - .ok_or(Error::::TotalBurningUnderflow)?; - let value = original_free_balance.checked_sub(&amount) - .ok_or(Error::::FreeBurningUnderflow)?; - - >::insert(asset_id, new_total_issuance); - - Self::set_free_balance(&asset_id, &to, value); - - Self::deposit_event(RawEvent::Burned(asset_id, to, amount)); - - Ok(()) - } else { - Err(Error::::NoBurnPermission)? - } + fn burn(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::Balance) -> DispatchResult { + let who = ensure_signed(origin)?; + Self::burn_free(&asset_id, &who, &to, &amount)?; + Self::deposit_event(RawEvent::Burned(asset_id, to, amount)); + Ok(()) } /// Can be used to create reserved tokens. @@ -468,7 +433,7 @@ decl_module! { origin, asset_id: T::AssetId, options: AssetOptions - ) -> dispatch::DispatchResult { + ) -> DispatchResult { ensure_root(origin)?; Self::create_asset(Some(asset_id), None, options) } @@ -565,6 +530,53 @@ impl Module { >::get(asset_id, who) } + /// Mint to an account's free balance, without event + pub fn mint_free( + asset_id: &T::AssetId, + who: &T::AccountId, + to: &T::AccountId, + amount: &T::Balance, + ) -> DispatchResult { + if Self::check_permission(asset_id, who, &PermissionType::Mint) { + let original_free_balance = Self::free_balance(&asset_id, &to); + let current_total_issuance = >::get(asset_id); + let new_total_issuance = current_total_issuance.checked_add(&amount) + .ok_or(Error::::TotalMintingOverflow)?; + let value = original_free_balance.checked_add(&amount) + .ok_or(Error::::FreeMintingOverflow)?; + + >::insert(asset_id, new_total_issuance); + Self::set_free_balance(&asset_id, &to, value); + Ok(()) + } else { + Err(Error::::NoMintPermission)? + } + } + + /// Burn an account's free balance, without event + pub fn burn_free( + asset_id: &T::AssetId, + who: &T::AccountId, + to: &T::AccountId, + amount: &T::Balance, + ) -> DispatchResult { + if Self::check_permission(asset_id, who, &PermissionType::Burn) { + let original_free_balance = Self::free_balance(asset_id, to); + + let current_total_issuance = >::get(asset_id); + let new_total_issuance = current_total_issuance.checked_sub(amount) + .ok_or(Error::::TotalBurningUnderflow)?; + let value = original_free_balance.checked_sub(amount) + .ok_or(Error::::FreeBurningUnderflow)?; + + >::insert(asset_id, new_total_issuance); + Self::set_free_balance(asset_id, to, value); + Ok(()) + } else { + Err(Error::::NoBurnPermission)? + } + } + /// Creates an asset. /// /// # Arguments @@ -577,7 +589,7 @@ impl Module { asset_id: Option, from_account: Option, options: AssetOptions, - ) -> dispatch::DispatchResult { + ) -> DispatchResult { let asset_id = if let Some(asset_id) = asset_id { ensure!(!>::exists(&asset_id), Error::::IdAlreadyTaken); ensure!(asset_id < Self::next_asset_id(), Error::::IdUnavailable); @@ -610,7 +622,7 @@ impl Module { from: &T::AccountId, to: &T::AccountId, amount: T::Balance - ) -> dispatch::DispatchResult { + ) -> DispatchResult { let new_balance = Self::free_balance(asset_id, from) .checked_sub(&amount) .ok_or(Error::::InsufficientBalance)?; @@ -631,7 +643,7 @@ impl Module { from: &T::AccountId, to: &T::AccountId, amount: T::Balance, - ) -> dispatch::DispatchResult { + ) -> DispatchResult { Self::make_transfer(asset_id, from, to, amount)?; if from != to { @@ -646,7 +658,7 @@ impl Module { /// If the free balance is lower than `amount`, then no funds will be moved and an `Err` will /// be returned. This is different behavior than `unreserve`. pub fn reserve(asset_id: &T::AssetId, who: &T::AccountId, amount: T::Balance) - -> dispatch::DispatchResult + -> DispatchResult { // Do we need to consider that this is an atomic transaction? let original_reserve_balance = Self::reserved_balance(asset_id, who); @@ -683,7 +695,7 @@ impl Module { /// then `Some(remaining)` will be returned. Full completion is given by `None`. /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. - fn slash(asset_id: &T::AssetId, who: &T::AccountId, amount: T::Balance) -> Option { + pub fn slash(asset_id: &T::AssetId, who: &T::AccountId, amount: T::Balance) -> Option { let free_balance = Self::free_balance(asset_id, who); let free_slash = sp_std::cmp::min(free_balance, amount); let new_free_balance = free_balance - free_slash; @@ -701,7 +713,7 @@ impl Module { /// is less than `amount`, then a non-zero second item will be returned. /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. - fn slash_reserved(asset_id: &T::AssetId, who: &T::AccountId, amount: T::Balance) -> Option { + pub fn slash_reserved(asset_id: &T::AssetId, who: &T::AccountId, amount: T::Balance) -> Option { let original_reserve_balance = Self::reserved_balance(asset_id, who); let slash = sp_std::cmp::min(original_reserve_balance, amount); let new_reserve_balance = original_reserve_balance - slash; @@ -720,7 +732,7 @@ impl Module { /// the `remaining` would be returned, else `Zero::zero()`. /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. - fn repatriate_reserved( + pub fn repatriate_reserved( asset_id: &T::AssetId, who: &T::AccountId, beneficiary: &T::AccountId, @@ -785,7 +797,7 @@ impl Module { _amount: T::Balance, reasons: WithdrawReasons, new_balance: T::Balance, - ) -> dispatch::DispatchResult { + ) -> DispatchResult { if asset_id != &Self::staking_asset_id() { return Ok(()); } -- GitLab From 1dafa604c66334561d0d612860b824a2cad42896 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 15 Jan 2020 21:09:27 +0100 Subject: [PATCH 123/296] Make Proposer instantiation potentially async. (#4630) * Make Proposer instantiation potentially async. * fix node-service test * fix basic-authority doc-test * only block once on futures in test * use async/await --- bin/node/cli/src/service.rs | 16 ++++++----- .../basic-authorship/src/basic_authorship.rs | 14 ++++++---- client/basic-authorship/src/lib.rs | 7 +++-- client/consensus/aura/src/lib.rs | 14 ++++++---- client/consensus/babe/src/lib.rs | 9 ++++-- client/consensus/babe/src/tests.rs | 9 +++--- client/consensus/pow/src/lib.rs | 2 +- client/consensus/slots/src/lib.rs | 28 ++++++++++--------- primitives/consensus/common/src/lib.rs | 7 +++-- 9 files changed, 63 insertions(+), 43 deletions(-) diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 2f53fb7637..b1c1759ae8 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -535,13 +535,15 @@ mod tests { digest.push(::babe_pre_digest(babe_pre_digest)); - let mut proposer = proposer_factory.init(&parent_header).unwrap(); - let new_block = futures::executor::block_on(proposer.propose( - inherent_data, - digest, - std::time::Duration::from_secs(1), - RecordProof::Yes, - )).expect("Error making test block").block; + let new_block = futures::executor::block_on(async move { + let proposer = proposer_factory.init(&parent_header).await; + proposer.unwrap().propose( + inherent_data, + digest, + std::time::Duration::from_secs(1), + RecordProof::Yes, + ).await + }).expect("Error making test block").block; let (new_header, new_body) = new_block.deconstruct(); let pre_hash = new_header.hash(); diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index 543428b073..576009ef27 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -34,6 +34,7 @@ use sp_transaction_pool::{TransactionPool, InPoolTransaction}; use sc_telemetry::{telemetry, CONSENSUS_INFO}; use sc_block_builder::BlockBuilderApi; use sp_api::{ProvideRuntimeApi, ApiExt}; +use futures::prelude::*; /// Proposer factory. pub struct ProposerFactory where A: TransactionPool { @@ -59,7 +60,7 @@ impl ProposerFactory, A> &mut self, parent_header: &::Header, now: Box time::Instant + Send + Sync>, - ) -> Result, A>, sp_blockchain::Error> { + ) -> Proposer, A> { let parent_hash = parent_header.hash(); let id = BlockId::hash(parent_hash); @@ -77,7 +78,7 @@ impl ProposerFactory, A> }), }; - Ok(proposer) + proposer } } @@ -94,14 +95,15 @@ impl sp_consensus::Environment for BlockBuilderApi + ApiExt>, { + type CreateProposer = future::Ready>; type Proposer = Proposer, A>; type Error = sp_blockchain::Error; fn init( &mut self, parent_header: &::Header, - ) -> Result { - self.init_with_now(parent_header, Box::new(time::Instant::now)) + ) -> Self::CreateProposer { + future::ready(Ok(self.init_with_now(parent_header, Box::new(time::Instant::now)))) } } @@ -324,7 +326,7 @@ mod tests { *value = new; old }) - ).unwrap(); + ); // when let deadline = time::Duration::from_secs(3); @@ -359,7 +361,7 @@ mod tests { let mut proposer = proposer_factory.init_with_now( &client.header(&block_id).unwrap().unwrap(), Box::new(move || time::Instant::now()), - ).unwrap(); + ); let deadline = time::Duration::from_secs(9); let proposal = futures::executor::block_on( diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index cf77c8a3f3..5465768e83 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -34,9 +34,12 @@ //! }; //! //! // From this factory, we create a `Proposer`. -//! let mut proposer = proposer_factory.init( +//! let proposer = proposer_factory.init( //! &client.header(&BlockId::number(0)).unwrap().unwrap(), -//! ).unwrap(); +//! ); +//! +//! // The proposer is created asynchronously. +//! let mut proposer = futures::executor::block_on(proposer).unwrap(); //! //! // This `Proposer` allows us to create a block proposition. //! // The proposer will grab transactions from the transaction pool, and put them into the block. diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index c498379721..61568cea8b 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -217,6 +217,9 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW { type BlockImport = I; type SyncOracle = SO; + type CreateProposer = Pin> + Send + 'static + >>; type Proposer = E::Proposer; type Claim = P; type EpochData = Vec>; @@ -302,10 +305,10 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW &mut self.sync_oracle } - fn proposer(&mut self, block: &B::Header) -> Result { - self.env.init(block).map_err(|e| { + fn proposer(&mut self, block: &B::Header) -> Self::CreateProposer { + Box::pin(self.env.init(block).map_err(|e| { sp_consensus::Error::ClientImport(format!("{:?}", e)).into() - }) + })) } fn proposing_remaining_duration( @@ -874,12 +877,13 @@ mod tests { impl Environment for DummyFactory { type Proposer = DummyProposer; + type CreateProposer = futures::future::Ready>; type Error = Error; fn init(&mut self, parent_header: &::Header) - -> Result + -> Self::CreateProposer { - Ok(DummyProposer(parent_header.number + 1, self.0.clone())) + futures::future::ready(Ok(DummyProposer(parent_header.number + 1, self.0.clone()))) } } diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 4eb1e3915b..770f8a4eec 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -363,6 +363,9 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork type EpochData = Epoch; type Claim = (BabePreDigest, AuthorityPair); type SyncOracle = SO; + type CreateProposer = Pin> + Send + 'static + >>; type Proposer = E::Proposer; type BlockImport = I; @@ -466,10 +469,10 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork &mut self.sync_oracle } - fn proposer(&mut self, block: &B::Header) -> Result { - self.env.init(block).map_err(|e| { + fn proposer(&mut self, block: &B::Header) -> Self::CreateProposer { + Box::pin(self.env.init(block).map_err(|e| { sp_consensus::Error::ClientImport(format!("{:?}", e)) - }) + })) } fn proposing_remaining_duration( diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 305c893982..880e028000 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -72,23 +72,24 @@ struct DummyProposer { } impl Environment for DummyFactory { + type CreateProposer = future::Ready>; type Proposer = DummyProposer; type Error = Error; fn init(&mut self, parent_header: &::Header) - -> Result + -> Self::CreateProposer { let parent_slot = crate::find_pre_digest::(parent_header) .expect("parent header has a pre-digest") .slot_number(); - Ok(DummyProposer { + future::ready(Ok(DummyProposer { factory: self.clone(), parent_hash: parent_header.hash(), parent_number: *parent_header.number(), parent_slot, - }) + })) } } @@ -547,7 +548,7 @@ fn propose_and_import_block( proposer_factory: &mut DummyFactory, block_import: &mut BoxBlockImport, ) -> sp_core::H256 { - let mut proposer = proposer_factory.init(parent).unwrap(); + let mut proposer = futures::executor::block_on(proposer_factory.init(parent)).unwrap(); let slot_number = slot_number.unwrap_or_else(|| { let parent_pre_digest = find_pre_digest::(parent).unwrap(); diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index 5c491057e5..2ea0cbdf0f 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -486,7 +486,7 @@ fn mine_loop( } let mut aux = PowAux::read(client, &best_hash)?; - let mut proposer = env.init(&best_header) + let mut proposer = futures::executor::block_on(env.init(&best_header)) .map_err(|e| Error::Environment(format!("{:?}", e)))?; let inherent_data = inherent_data_providers diff --git a/client/consensus/slots/src/lib.rs b/client/consensus/slots/src/lib.rs index a69c710a7e..3aa243af72 100644 --- a/client/consensus/slots/src/lib.rs +++ b/client/consensus/slots/src/lib.rs @@ -70,6 +70,10 @@ pub trait SimpleSlotWorker { /// A handle to a `SyncOracle`. type SyncOracle: SyncOracle; + /// The type of future resolving to the proposer. + type CreateProposer: Future> + + Send + Unpin + 'static; + /// The type of proposer to use to build blocks. type Proposer: Proposer; @@ -129,7 +133,7 @@ pub trait SimpleSlotWorker { fn sync_oracle(&mut self) -> &mut Self::SyncOracle; /// Returns a `Proposer` to author on top of the given block. - fn proposer(&mut self, block: &B::Header) -> Result; + fn proposer(&mut self, block: &B::Header) -> Self::CreateProposer; /// Remaining duration of the slot. fn slot_remaining_duration(&self, slot_info: &SlotInfo) -> Duration { @@ -216,32 +220,30 @@ pub trait SimpleSlotWorker { "timestamp" => timestamp, ); - let mut proposer = match self.proposer(&chain_head) { - Ok(proposer) => proposer, - Err(err) => { - warn!("Unable to author block in slot {:?}: {:?}", slot_number, err); + let awaiting_proposer = self.proposer(&chain_head).map_err(move |err| { + warn!("Unable to author block in slot {:?}: {:?}", slot_number, err); - telemetry!(CONSENSUS_WARN; "slots.unable_authoring_block"; - "slot" => slot_number, "err" => ?err - ); + telemetry!(CONSENSUS_WARN; "slots.unable_authoring_block"; + "slot" => slot_number, "err" => ?err + ); - return Box::pin(future::ready(Ok(()))); - }, - }; + err + }); let slot_remaining_duration = self.slot_remaining_duration(&slot_info); let proposing_remaining_duration = self.proposing_remaining_duration(&chain_head, &slot_info); let logs = self.pre_digest_data(slot_number, &claim); // deadline our production to approx. the end of the slot - let proposing = proposer.propose( + let proposing = awaiting_proposer.and_then(move |mut proposer| proposer.propose( slot_info.inherent_data, sp_runtime::generic::Digest { logs, }, slot_remaining_duration, RecordProof::No, - ).map_err(|e| sp_consensus::Error::ClientImport(format!("{:?}", e))); + ).map_err(|e| sp_consensus::Error::ClientImport(format!("{:?}", e)))); + let delay: Box + Unpin + Send> = match proposing_remaining_duration { Some(r) => Box::new(Delay::new(r)), None => Box::new(future::pending()), diff --git a/primitives/consensus/common/src/lib.rs b/primitives/consensus/common/src/lib.rs index 1b98ede376..4927faede0 100644 --- a/primitives/consensus/common/src/lib.rs +++ b/primitives/consensus/common/src/lib.rs @@ -74,13 +74,16 @@ pub enum BlockStatus { /// Environment producer for a Consensus instance. Creates proposer instance and communication streams. pub trait Environment { /// The proposer type this creates. - type Proposer: Proposer + 'static; + type Proposer: Proposer + Send + 'static; + /// A future that resolves to the proposer. + type CreateProposer: Future> + + Send + Unpin + 'static; /// Error which can occur upon creation. type Error: From + std::fmt::Debug + 'static; /// Initialize the proposal logic on top of a specific header. Provide /// the authorities at that header. - fn init(&mut self, parent_header: &B::Header) -> Result; + fn init(&mut self, parent_header: &B::Header) -> Self::CreateProposer; } /// A proposal that is created by a [`Proposer`]. -- GitLab From f21eb1aa2a272eafc401d887ea4f933618ac8fea Mon Sep 17 00:00:00 2001 From: thiolliere Date: Thu, 16 Jan 2020 08:00:01 +0100 Subject: [PATCH 124/296] remove old test (#4637) --- frame/staking/src/tests.rs | 237 +++++++++---------------------------- 1 file changed, 59 insertions(+), 178 deletions(-) diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 555edac979..c290c6a858 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -90,29 +90,16 @@ fn basic_setup_works() { ); assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - if cfg!(feature = "equalize") { - assert_eq!( - Staking::stakers(11), - Exposure { total: 1250, own: 1000, others: vec![ IndividualExposure { who: 101, value: 250 }] } - ); - assert_eq!( - Staking::stakers(21), - Exposure { total: 1250, own: 1000, others: vec![ IndividualExposure { who: 101, value: 250 }] } - ); - // initial slot_stake - assert_eq!(Staking::slot_stake(), 1250); - } else { - assert_eq!( - Staking::stakers(11), - Exposure { total: 1125, own: 1000, others: vec![ IndividualExposure { who: 101, value: 125 }] } - ); - assert_eq!( - Staking::stakers(21), - Exposure { total: 1375, own: 1000, others: vec![ IndividualExposure { who: 101, value: 375 }] } - ); - // initial slot_stake - assert_eq!(Staking::slot_stake(), 1125); - } + assert_eq!( + Staking::stakers(11), + Exposure { total: 1125, own: 1000, others: vec![ IndividualExposure { who: 101, value: 125 }] } + ); + assert_eq!( + Staking::stakers(21), + Exposure { total: 1375, own: 1000, others: vec![ IndividualExposure { who: 101, value: 375 }] } + ); + // initial slot_stake + assert_eq!(Staking::slot_stake(), 1125); // The number of validators required. @@ -488,57 +475,30 @@ fn nominating_and_rewards_should_work() { // ------ check the staked value of all parties. - if cfg!(feature = "equalize") { - // total expo of 10, with 1200 coming from nominators (externals), according to phragmen. - assert_eq!(Staking::stakers(11).own, 1000); - assert_eq_error_rate!(Staking::stakers(11).total, 1000 + 1000, 2); - // 2 and 4 supported 10, each with stake 600, according to phragmen. - assert_eq!( - Staking::stakers(11).others.iter().map(|e| e.value).collect::>>(), - vec![600, 400] - ); - assert_eq!( - Staking::stakers(11).others.iter().map(|e| e.who).collect::>(), - vec![3, 1] - ); - // total expo of 20, with 500 coming from nominators (externals), according to phragmen. - assert_eq!(Staking::stakers(21).own, 1000); - assert_eq_error_rate!(Staking::stakers(21).total, 1000 + 1000, 2); - // 2 and 4 supported 20, each with stake 250, according to phragmen. - assert_eq!( - Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), - vec![400, 600] - ); - assert_eq!( - Staking::stakers(21).others.iter().map(|e| e.who).collect::>(), - vec![3, 1] - ); - } else { - // total expo of 10, with 1200 coming from nominators (externals), according to phragmen. - assert_eq!(Staking::stakers(11).own, 1000); - assert_eq!(Staking::stakers(11).total, 1000 + 800); - // 2 and 4 supported 10, each with stake 600, according to phragmen. - assert_eq!( - Staking::stakers(11).others.iter().map(|e| e.value).collect::>>(), - vec![400, 400] - ); - assert_eq!( - Staking::stakers(11).others.iter().map(|e| e.who).collect::>(), - vec![3, 1] - ); - // total expo of 20, with 500 coming from nominators (externals), according to phragmen. - assert_eq!(Staking::stakers(21).own, 1000); - assert_eq_error_rate!(Staking::stakers(21).total, 1000 + 1200, 2); - // 2 and 4 supported 20, each with stake 250, according to phragmen. - assert_eq!( - Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), - vec![600, 600] - ); - assert_eq!( - Staking::stakers(21).others.iter().map(|e| e.who).collect::>(), - vec![3, 1] - ); - } + // total expo of 10, with 1200 coming from nominators (externals), according to phragmen. + assert_eq!(Staking::stakers(11).own, 1000); + assert_eq!(Staking::stakers(11).total, 1000 + 800); + // 2 and 4 supported 10, each with stake 600, according to phragmen. + assert_eq!( + Staking::stakers(11).others.iter().map(|e| e.value).collect::>>(), + vec![400, 400] + ); + assert_eq!( + Staking::stakers(11).others.iter().map(|e| e.who).collect::>(), + vec![3, 1] + ); + // total expo of 20, with 500 coming from nominators (externals), according to phragmen. + assert_eq!(Staking::stakers(21).own, 1000); + assert_eq_error_rate!(Staking::stakers(21).total, 1000 + 1200, 2); + // 2 and 4 supported 20, each with stake 250, according to phragmen. + assert_eq!( + Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), + vec![600, 600] + ); + assert_eq!( + Staking::stakers(21).others.iter().map(|e| e.who).collect::>(), + vec![3, 1] + ); // They are not chosen anymore assert_eq!(Staking::stakers(31).total, 0); @@ -559,59 +519,31 @@ fn nominating_and_rewards_should_work() { let payout_for_10 = total_payout_1 / 3; let payout_for_20 = 2 * total_payout_1 / 3; - if cfg!(feature = "equalize") { - // Nominator 2: has [400 / 2000 ~ 1 / 5 from 10] + [600 / 2000 ~ 3 / 10 from 20]'s reward. - assert_eq_error_rate!( - Balances::total_balance(&2), - initial_balance + payout_for_10 / 5 + payout_for_20 * 3 / 10, - 2, - ); - // Nominator 4: has [400 / 2000 ~ 1 / 5 from 20] + [600 / 2000 ~ 3 / 10 from 10]'s reward. - assert_eq_error_rate!( - Balances::total_balance(&4), - initial_balance + payout_for_20 / 5 + payout_for_10 * 3 / 10, - 2, - ); - - // Validator 10: got 1000 / 2000 external stake. - assert_eq_error_rate!( - Balances::total_balance(&10), - initial_balance + payout_for_10 / 2, - 1, - ); - // Validator 20: got 1000 / 2000 external stake. - assert_eq_error_rate!( - Balances::total_balance(&20), - initial_balance + payout_for_20 / 2, - 1, - ); - } else { - // Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11 - assert_eq_error_rate!( - Balances::total_balance(&2), - initial_balance + (2 * payout_for_10 / 9 + 3 * payout_for_20 / 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_error_rate!( - Balances::total_balance(&4), - initial_balance + (2 * payout_for_10 / 9 + 3 * payout_for_20 / 11), - 1, - ); - - // Validator 10: got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 - assert_eq_error_rate!( - Balances::total_balance(&10), - initial_balance + 5 * payout_for_10 / 9, - 1, - ); - // Validator 20: got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 - assert_eq_error_rate!( - Balances::total_balance(&20), - initial_balance + 5 * payout_for_20 / 11, - 1, - ); - } + // Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11 + assert_eq_error_rate!( + Balances::total_balance(&2), + initial_balance + (2 * payout_for_10 / 9 + 3 * payout_for_20 / 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_error_rate!( + Balances::total_balance(&4), + initial_balance + (2 * payout_for_10 / 9 + 3 * payout_for_20 / 11), + 1, + ); + + // Validator 10: got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 + assert_eq_error_rate!( + Balances::total_balance(&10), + initial_balance + 5 * payout_for_10 / 9, + 1, + ); + // Validator 20: got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 + assert_eq_error_rate!( + Balances::total_balance(&20), + initial_balance + 5 * payout_for_20 / 11, + 1, + ); check_exposure_all(); check_nominator_all(); @@ -1778,51 +1710,6 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { }); } -#[cfg(feature = "equalize")] -#[test] -fn phragmen_linear_worse_case_equalize() { - ExtBuilder::default() - .nominate(false) - .validator_pool(true) - .fair(true) - .build() - .execute_with(|| { - bond_validator(50, 1000); - bond_validator(60, 1000); - bond_validator(70, 1000); - - bond_nominator(2, 2000, vec![11]); - bond_nominator(4, 1000, vec![11, 21]); - bond_nominator(6, 1000, vec![21, 31]); - bond_nominator(8, 1000, vec![31, 41]); - bond_nominator(110, 1000, vec![41, 51]); - bond_nominator(120, 1000, vec![51, 61]); - bond_nominator(130, 1000, vec![61, 71]); - - for i in &[10, 20, 30, 40, 50, 60, 70] { - assert_ok!(Staking::set_payee(Origin::signed(*i), RewardDestination::Controller)); - } - - assert_eq_uvec!(validator_controllers(), vec![40, 30]); - assert_ok!(Staking::set_validator_count(Origin::ROOT, 7)); - - start_era(1); - - assert_eq_uvec!(validator_controllers(), vec![10, 60, 40, 20, 50, 30, 70]); - - assert_eq_error_rate!(Staking::stakers(11).total, 3000, 2); - assert_eq_error_rate!(Staking::stakers(21).total, 2255, 2); - assert_eq_error_rate!(Staking::stakers(31).total, 2255, 2); - assert_eq_error_rate!(Staking::stakers(41).total, 1925, 2); - assert_eq_error_rate!(Staking::stakers(51).total, 1870, 2); - assert_eq_error_rate!(Staking::stakers(61).total, 1890, 2); - assert_eq_error_rate!(Staking::stakers(71).total, 1800, 2); - - check_exposure_all(); - check_nominator_all(); - }) -} - #[test] fn new_era_elects_correct_number_of_validators() { ExtBuilder::default() @@ -2195,9 +2082,6 @@ fn reporters_receive_their_slice() { // amount. ExtBuilder::default().build().execute_with(|| { // The reporters' reward is calculated from the total exposure. - #[cfg(feature = "equalize")] - let initial_balance = 1250; - #[cfg(not(feature = "equalize"))] let initial_balance = 1125; assert_eq!(Staking::stakers(&11).total, initial_balance); @@ -2229,9 +2113,6 @@ fn subsequent_reports_in_same_span_pay_out_less() { // amount. ExtBuilder::default().build().execute_with(|| { // The reporters' reward is calculated from the total exposure. - #[cfg(feature = "equalize")] - let initial_balance = 1250; - #[cfg(not(feature = "equalize"))] let initial_balance = 1125; assert_eq!(Staking::stakers(&11).total, initial_balance); -- GitLab From 4c4ee3d5b91c4c825aef4fde2b096f014a89346a Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 16 Jan 2020 12:08:05 +0300 Subject: [PATCH 125/296] use default in-memory for commands that don't use keystore (#4634) --- bin/node/cli/src/cli.rs | 1 - client/cli/src/lib.rs | 21 ++++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 7a4321802c..4442bb1b03 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -139,7 +139,6 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re &cli_args.shared_params, &version, )?; - sc_cli::fill_import_params(&mut config, &cli_args.import_params, ServiceRoles::FULL)?; match ChainSpec::from(config.chain_spec.id()) { diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index fe47eb8497..1e8d40cb0f 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -401,7 +401,8 @@ impl<'a> ParseAndPrepareExport<'a> { E: ChainSpecExtension, Exit: IntoExit { - let config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + fill_config_keystore_in_memory(&mut config)?; if let DatabaseConfig::Path { ref path, .. } = &config.database { info!("DB path: {}", path.display()); @@ -523,6 +524,7 @@ impl<'a> CheckBlock<'a> { { let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; fill_import_params(&mut config, &self.params.import_params, sc_service::Roles::FULL)?; + fill_config_keystore_in_memory(&mut config)?; let input = if self.params.input.starts_with("0x") { &self.params.input[2..] } else { &self.params.input[..] }; let block_id = match FromStr::from_str(input) { @@ -559,9 +561,10 @@ impl<'a> ParseAndPreparePurge<'a> { G: RuntimeGenesis, E: ChainSpecExtension, { - let config = create_config_with_db_path::<(), _, _, _>( + let mut config = create_config_with_db_path::<(), _, _, _>( spec_factory, &self.params.shared_params, self.version )?; + fill_config_keystore_in_memory(&mut config)?; let db_path = match config.database { DatabaseConfig::Path { path, .. } => path, _ => { @@ -623,9 +626,11 @@ impl<'a> ParseAndPrepareRevert<'a> { G: RuntimeGenesis, E: ChainSpecExtension, { - let config = create_config_with_db_path( + let mut config = create_config_with_db_path( spec_factory, &self.params.shared_params, self.version )?; + fill_config_keystore_in_memory(&mut config)?; + let blocks = self.params.num.parse()?; builder(config)?.revert_chain(blocks)?; Ok(()) @@ -749,6 +754,16 @@ fn input_keystore_password() -> Result { .map_err(|e| format!("{:?}", e)) } +/// Use in memory keystore config when it is not required at all. +fn fill_config_keystore_in_memory(config: &mut sc_service::Configuration) + -> Result<(), String> +{ + match &mut config.keystore { + cfg @ KeystoreConfig::None => { *cfg = KeystoreConfig::InMemory; Ok(()) }, + _ => Err("Keystore config specified when it should not be!".into()), + } +} + /// Fill the password field of the given config instance. fn fill_config_keystore_password_and_path( config: &mut sc_service::Configuration, -- GitLab From 3fa5f09dd1df584c1fa9de9c870e6cd5d44854f4 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 16 Jan 2020 13:57:19 +0100 Subject: [PATCH 126/296] Getting configuration from commands (#4643) * Expose a method that allows converting RunCmd to Configuration * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP --- bin/node/cli/src/cli.rs | 1 + client/cli/src/lib.rs | 209 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 194 insertions(+), 16 deletions(-) diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 4442bb1b03..dcc5d39dbb 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -138,6 +138,7 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re load_spec, &cli_args.shared_params, &version, + None, )?; sc_cli::fill_import_params(&mut config, &cli_args.import_params, ServiceRoles::FULL)?; diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 1e8d40cb0f..52a3fc46ec 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -142,8 +142,13 @@ pub fn load_spec(cli: &SharedParams, factory: F) -> error::Result PathBuf { +fn base_path( + cli: &SharedParams, + version: &VersionInfo, + default_base_path: Option, +) -> PathBuf { cli.base_path.clone() + .or(default_base_path) .unwrap_or_else(|| app_dirs::get_app_root( AppDataType::UserData, @@ -295,6 +300,78 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> where CC: GetSharedParams { } } +impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { + /// Convert ParseAndPrepare to Configuration + pub fn into_configuration( + self, + spec_factory: S, + default_base_path: Option, + ) -> error::Result>> + where + C: Default, + G: RuntimeGenesis, + E: ChainSpecExtension, + S: FnOnce(&str) -> Result>, String>, + { + match self { + ParseAndPrepare::Run(c) => + Some(create_run_node_config( + c.params.left, + spec_factory, + c.impl_name, + c.version, + default_base_path, + )).transpose(), + ParseAndPrepare::BuildSpec(c) => { + let spec = load_spec(&c.params.shared_params, spec_factory)?; + + Some(create_build_spec_config( + &spec, + &c.params.shared_params, + c.version, + default_base_path, + )).transpose() + }, + ParseAndPrepare::ExportBlocks(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + default_base_path, + )).transpose(), + ParseAndPrepare::ImportBlocks(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + default_base_path, + )).transpose(), + ParseAndPrepare::CheckBlock(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + default_base_path, + )).transpose(), + ParseAndPrepare::PurgeChain(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + default_base_path, + )).transpose(), + ParseAndPrepare::RevertChain(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + default_base_path, + )).transpose(), + ParseAndPrepare::CustomCommand(_) => Ok(None), + } + } +} + /// Command ready to run the main client. pub struct ParseAndPrepareRun<'a, RP> { params: MergeParameters, @@ -321,7 +398,11 @@ impl<'a, RP> ParseAndPrepareRun<'a, RP> { RS: FnOnce(Exit, RunCmd, RP, Configuration) -> Result<(), E> { let config = create_run_node_config( - self.params.left.clone(), spec_factory, self.impl_name, self.version, + self.params.left.clone(), + spec_factory, + self.impl_name, + self.version, + None, )?; run_service(exit, self.params.left, self.params.right, config).map_err(Into::into) @@ -350,11 +431,12 @@ impl<'a> ParseAndPrepareBuildSpec<'a> { let mut spec = load_spec(&self.params.shared_params, spec_factory)?; if spec.boot_nodes().is_empty() && !self.params.disable_default_bootnode { - let base_path = base_path(&self.params.shared_params, self.version); - let cfg = sc_service::Configuration::::default_with_spec_and_base_path( - spec.clone(), - Some(base_path), - ); + let cfg = create_build_spec_config::( + &spec, + &self.params.shared_params, + self.version, + None, + )?; let node_key = node_key_config( self.params.node_key_params, &Some(cfg.in_chain_config_dir(DEFAULT_NETWORK_CONFIG_PATH).expect("We provided a base_path")) @@ -401,7 +483,12 @@ impl<'a> ParseAndPrepareExport<'a> { E: ChainSpecExtension, Exit: IntoExit { - let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let mut config = create_config_with_db_path( + spec_factory, + &self.params.shared_params, + self.version, + None, + )?; fill_config_keystore_in_memory(&mut config)?; if let DatabaseConfig::Path { ref path, .. } = &config.database { @@ -463,7 +550,12 @@ impl<'a> ParseAndPrepareImport<'a> { E: ChainSpecExtension, Exit: IntoExit { - let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let mut config = create_config_with_db_path( + spec_factory, + &self.params.shared_params, + self.version, + None, + )?; fill_import_params(&mut config, &self.params.import_params, sc_service::Roles::FULL)?; let file: Box = match self.params.input { @@ -522,7 +614,12 @@ impl<'a> CheckBlock<'a> { E: ChainSpecExtension, Exit: IntoExit { - let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let mut config = create_config_with_db_path( + spec_factory, + &self.params.shared_params, + self.version, + None, + )?; fill_import_params(&mut config, &self.params.import_params, sc_service::Roles::FULL)?; fill_config_keystore_in_memory(&mut config)?; @@ -562,7 +659,10 @@ impl<'a> ParseAndPreparePurge<'a> { E: ChainSpecExtension, { let mut config = create_config_with_db_path::<(), _, _, _>( - spec_factory, &self.params.shared_params, self.version + spec_factory, + &self.params.shared_params, + self.version, + None, )?; fill_config_keystore_in_memory(&mut config)?; let db_path = match config.database { @@ -627,7 +727,10 @@ impl<'a> ParseAndPrepareRevert<'a> { E: ChainSpecExtension, { let mut config = create_config_with_db_path( - spec_factory, &self.params.shared_params, self.version + spec_factory, + &self.params.shared_params, + self.version, + None, )?; fill_config_keystore_in_memory(&mut config)?; @@ -852,7 +955,11 @@ pub fn fill_import_params( } fn create_run_node_config( - cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo, + cli: RunCmd, + spec_factory: S, + impl_name: &'static str, + version: &VersionInfo, + default_base_path: Option, ) -> error::Result> where C: Default, @@ -860,7 +967,12 @@ where E: ChainSpecExtension, S: FnOnce(&str) -> Result>, String>, { - let mut config = create_config_with_db_path(spec_factory, &cli.shared_params, &version)?; + let mut config = create_config_with_db_path( + spec_factory, + &cli.shared_params, + &version, + default_base_path, + )?; fill_config_keystore_password_and_path(&mut config, &cli)?; @@ -994,7 +1106,10 @@ fn interface_str( /// Creates a configuration including the database path. pub fn create_config_with_db_path( - spec_factory: S, cli: &SharedParams, version: &VersionInfo, + spec_factory: S, + cli: &SharedParams, + version: &VersionInfo, + default_base_path: Option, ) -> error::Result> where C: Default, @@ -1003,7 +1118,7 @@ where S: FnOnce(&str) -> Result>, String>, { let spec = load_spec(cli, spec_factory)?; - let base_path = base_path(cli, version); + let base_path = base_path(cli, version, default_base_path); let mut config = sc_service::Configuration::default_with_spec_and_base_path( spec.clone(), @@ -1018,6 +1133,27 @@ where Ok(config) } +/// Creates a configuration including the base path and the shared params +fn create_build_spec_config( + spec: &ChainSpec, + cli: &SharedParams, + version: &VersionInfo, + default_base_path: Option, +) -> error::Result> +where + C: Default, + G: RuntimeGenesis, + E: ChainSpecExtension, +{ + let base_path = base_path(&cli, version, default_base_path); + let cfg = sc_service::Configuration::::default_with_spec_and_base_path( + spec.clone(), + Some(base_path), + ); + + Ok(cfg) +} + /// Internal trait used to cast to a dynamic type that implements Read and Seek. trait ReadPlusSeek: Read + Seek {} @@ -1255,6 +1391,7 @@ mod tests { |_| Ok(Some(chain_spec.clone())), "test", &version_info, + None, ).unwrap(); let expected_path = match keystore_path { @@ -1265,4 +1402,44 @@ mod tests { assert_eq!(expected_path, node_config.keystore.path().unwrap().to_owned()); } } + + #[test] + fn parse_and_prepare_into_configuration() { + let chain_spec = ChainSpec::from_genesis( + "test", + "test-id", + || (), + Vec::new(), + None, + None, + None, + None, + ); + let version = VersionInfo { + name: "test", + version: "42", + commit: "234234", + executable_name: "test", + description: "cool test", + author: "universe", + support_url: "com", + }; + let spec_factory = |_: &str| Ok(Some(chain_spec.clone())); + + let args = vec!["substrate", "--dev", "--state-cache-size=42"]; + let pnp = parse_and_prepare::(&version, "test", args); + let config = pnp.into_configuration::<(), _, _, _>(spec_factory, None).unwrap().unwrap(); + assert_eq!(config.roles, sc_service::Roles::AUTHORITY); + assert_eq!(config.state_cache_size, 42); + + let args = vec!["substrate", "import-blocks", "--dev"]; + let pnp = parse_and_prepare::(&version, "test", args); + let config = pnp.into_configuration::<(), _, _, _>(spec_factory, None).unwrap().unwrap(); + assert_eq!(config.roles, sc_service::Roles::FULL); + + let args = vec!["substrate", "--base-path=/foo"]; + let pnp = parse_and_prepare::(&version, "test", args); + let config = pnp.into_configuration::<(), _, _, _>(spec_factory, Some("/bar".into())).unwrap().unwrap(); + assert_eq!(config.config_dir, Some("/foo".into())); + } } -- GitLab From 47c36e6efe8285c9a6cbbcc0f588e3e7c4009de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 16 Jan 2020 13:57:41 +0100 Subject: [PATCH 127/296] Rename basic-authority to basic-authorship (#4640) * Rename basic-authority to basic-authorship * Revert weird tab. * Fix rename. --- .maintain/rename-crates-for-2.0.sh | 3 ++- Cargo.lock | 6 +++--- bin/node-template/Cargo.toml | 2 +- bin/node-template/src/service.rs | 3 +-- bin/node/cli/Cargo.toml | 2 +- bin/node/cli/src/service.rs | 4 ++-- client/basic-authorship/Cargo.toml | 2 +- client/basic-authorship/src/lib.rs | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.maintain/rename-crates-for-2.0.sh b/.maintain/rename-crates-for-2.0.sh index d2bd871f09..b024cfd441 100644 --- a/.maintain/rename-crates-for-2.0.sh +++ b/.maintain/rename-crates-for-2.0.sh @@ -43,6 +43,7 @@ TO_RENAME=( "sp-finality-granpda sp-finality-grandpa" "sp-sesssion sp-session" "sp-tracing-pool sp-transaction-pool" + "sc-basic-authority sc-basic-authorship" # PRIMITIVES "substrate-application-crypto sp-application-crypto" @@ -88,7 +89,7 @@ TO_RENAME=( "substrate-client sc-client" "substrate-client-api sc-api" "substrate-authority-discovery sc-authority-discovery" - "substrate-basic-authorship sc-basic-authority" + "substrate-basic-authorship sc-basic-authorship" "substrate-block-builder sc-block-builder" "substrate-chain-spec sc-chain-spec" "substrate-chain-spec-derive sc-chain-spec-derive" diff --git a/Cargo.lock b/Cargo.lock index ac34452e31..1588be33b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3044,7 +3044,7 @@ dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-authority-discovery 0.8.0", - "sc-basic-authority 0.8.0", + "sc-basic-authorship 0.8.0", "sc-chain-spec 2.0.0", "sc-cli 0.8.0", "sc-client 0.8.0", @@ -3223,7 +3223,7 @@ dependencies = [ "node-template-runtime 2.0.0", "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-basic-authority 0.8.0", + "sc-basic-authorship 0.8.0", "sc-cli 0.8.0", "sc-client 0.8.0", "sc-consensus-aura 0.8.0", @@ -5037,7 +5037,7 @@ dependencies = [ ] [[package]] -name = "sc-basic-authority" +name = "sc-basic-authorship" version = "0.8.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/node-template/Cargo.toml b/bin/node-template/Cargo.toml index e18bbd3e1d..f956bbb221 100644 --- a/bin/node-template/Cargo.toml +++ b/bin/node-template/Cargo.toml @@ -34,7 +34,7 @@ grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path sc-client = { version = "0.8", path = "../../client/" } node-template-runtime = { version = "2.0.0", path = "runtime" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } -sc-basic-authority = { path = "../../client/basic-authorship" } +sc-basic-authorship = { path = "../../client/basic-authorship" } [build-dependencies] vergen = "3.0.4" diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index 7f6ff67d28..ed2299e30f 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -11,7 +11,6 @@ use sc_executor::native_executor_instance; pub use sc_executor::NativeExecutor; use sp_consensus_aura::sr25519::{AuthorityPair as AuraPair}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; -use sc_basic_authority; use futures::{FutureExt, compat::Future01CompatExt}; // Our native executor instance. @@ -107,7 +106,7 @@ pub fn new_full(config: Configuration"] edition = "2018" diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index 5465768e83..f62134ce42 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -19,7 +19,7 @@ //! # Example //! //! ``` -//! # use sc_basic_authority::ProposerFactory; +//! # use sc_basic_authorship::ProposerFactory; //! # use sp_consensus::{Environment, Proposer, RecordProof}; //! # use sp_runtime::generic::BlockId; //! # use std::{sync::Arc, time::Duration}; -- GitLab From 879e28ae38643c028fa09c157e7b2714bcbf02a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 16 Jan 2020 13:58:37 +0100 Subject: [PATCH 128/296] Implement runtime version checks in `set_code` (#4548) * Implement runtime version checks in `set_code` Check that the new runtime code given to `set_code` fullfills some requirements: - `spec_name` matches - `spec_version` does not decreases - `impl_version` does not decreases - Either `spec_version` and `impl_version` increase * Make tests almost work * Some fixes after master merge * Fix tests * Add missed file * Make depedency check happy? * Remove leftover `sc-executor` * AHHHHH * Reset debug stuff * Remove some 'static * More 'static * Some docs * Update `Cargo.lock` --- Cargo.lock | 235 +++++++++---------- client/executor/common/src/error.rs | 4 + client/executor/common/src/wasm_runtime.rs | 4 +- client/executor/src/integration_tests/mod.rs | 2 +- client/executor/src/lib.rs | 43 +++- client/executor/src/native_executor.rs | 76 ++++-- client/executor/src/wasm_runtime.rs | 5 +- client/executor/wasmi/Cargo.toml | 1 - client/executor/wasmi/src/lib.rs | 16 +- client/executor/wasmtime/Cargo.toml | 1 - client/executor/wasmtime/src/runtime.rs | 13 +- client/finality-grandpa/src/environment.rs | 2 +- client/finality-grandpa/src/lib.rs | 4 +- client/finality-grandpa/src/observer.rs | 2 +- client/rpc/src/state/tests.rs | 2 +- client/service/src/builder.rs | 6 +- client/src/call_executor.rs | 4 +- client/src/client.rs | 12 +- client/src/genesis.rs | 2 +- client/src/light/call_executor.rs | 4 +- client/src/light/fetcher.rs | 2 +- client/src/light/mod.rs | 2 +- frame/system/Cargo.toml | 2 + frame/system/src/lib.rs | 125 +++++++++- primitives/core/src/traits.rs | 29 ++- primitives/externalities/Cargo.toml | 2 +- primitives/io/src/lib.rs | 23 +- primitives/runtime-interface/Cargo.toml | 2 - primitives/runtime-interface/test/src/lib.rs | 1 - primitives/runtime/src/lib.rs | 24 +- primitives/runtime/src/runtime_string.rs | 117 +++++++++ primitives/state-machine/src/lib.rs | 29 ++- primitives/version/Cargo.toml | 2 +- primitives/version/src/lib.rs | 28 +-- test-utils/client/src/client_ext.rs | 2 +- test-utils/client/src/lib.rs | 6 +- test-utils/runtime/client/src/lib.rs | 26 +- test-utils/runtime/src/lib.rs | 3 + 38 files changed, 584 insertions(+), 279 deletions(-) create mode 100644 primitives/runtime/src/runtime_string.rs diff --git a/Cargo.lock b/Cargo.lock index 1588be33b1..2888776ab6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1088,7 +1088,7 @@ dependencies = [ [[package]] name = "environmental" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1238,7 +1238,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1293,7 +1293,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "fork-tree" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1306,7 +1306,7 @@ dependencies = [ "pallet-balances 2.0.0", "pallet-indices 2.0.0", "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -1318,7 +1318,7 @@ dependencies = [ name = "frame-metadata" version = "10.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", @@ -1335,7 +1335,7 @@ dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.6 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1384,7 +1384,7 @@ name = "frame-support-test" version = "2.0.0" dependencies = [ "frame-support 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -1402,21 +1402,23 @@ dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "frame-support 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", + "sp-externalities 0.8.0", "sp-io 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", "sp-version 2.0.0", + "substrate-test-runtime-client 2.0.0", ] [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", ] @@ -2042,7 +2044,7 @@ name = "impl-codec" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3041,7 +3043,7 @@ dependencies = [ "pallet-indices 2.0.0", "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-authority-discovery 0.8.0", "sc-basic-authorship 0.8.0", @@ -3101,7 +3103,7 @@ dependencies = [ "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "pallet-treasury 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor 0.8.0", "sp-application-crypto 2.0.0", "sp-core 2.0.0", @@ -3191,7 +3193,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api 2.0.0", "pallet-treasury 2.0.0", "pallet-utility 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 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)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3221,7 +3223,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-basic-authorship 0.8.0", "sc-cli 0.8.0", @@ -3261,7 +3263,7 @@ dependencies = [ "pallet-sudo 2.0.0", "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -3297,7 +3299,7 @@ dependencies = [ "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "pallet-treasury 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-executor 0.8.0", "sp-core 2.0.0", @@ -3313,7 +3315,7 @@ name = "node-transaction-factory" version = "0.8.0" dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-cli 0.8.0", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -3476,7 +3478,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3493,7 +3495,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-session 2.0.0", "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", @@ -3513,7 +3515,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-session 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-authority-discovery 2.0.0", @@ -3531,7 +3533,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-authorship 2.0.0", "sp-core 2.0.0", "sp-inherents 2.0.0", @@ -3550,7 +3552,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-session 2.0.0", "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-consensus-babe 0.8.0", @@ -3572,7 +3574,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -3589,7 +3591,7 @@ dependencies = [ "frame-system 2.0.0", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -3609,7 +3611,7 @@ dependencies = [ "pallet-balances 2.0.0", "pallet-randomness-collective-flip 2.0.0", "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3630,7 +3632,7 @@ dependencies = [ "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-contracts-rpc-runtime-api 0.8.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -3644,7 +3646,7 @@ dependencies = [ name = "pallet-contracts-rpc-runtime-api" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", @@ -3657,7 +3659,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -3674,7 +3676,7 @@ dependencies = [ "frame-system 2.0.0", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -3691,7 +3693,7 @@ dependencies = [ "frame-system 2.0.0", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3710,7 +3712,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3728,7 +3730,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3743,7 +3745,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-finality-tracker 2.0.0", @@ -3759,7 +3761,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3775,7 +3777,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-finality-tracker 2.0.0", "pallet-session 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-finality-grandpa 2.0.0", @@ -3793,7 +3795,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3809,7 +3811,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-authorship 2.0.0", "pallet-session 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", @@ -3825,7 +3827,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -3841,7 +3843,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3856,7 +3858,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3871,7 +3873,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3886,7 +3888,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3902,7 +3904,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3917,7 +3919,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3934,7 +3936,7 @@ dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", @@ -3953,7 +3955,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -3973,7 +3975,7 @@ dependencies = [ "pallet-session 2.0.0", "pallet-staking-reward-curve 2.0.0", "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -4003,7 +4005,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -4018,7 +4020,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-inherents 2.0.0", @@ -4036,7 +4038,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "pallet-transaction-payment-rpc-runtime-api 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -4051,7 +4053,7 @@ dependencies = [ "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-transaction-payment-rpc-runtime-api 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", @@ -4065,7 +4067,7 @@ name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0" dependencies = [ "frame-support 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -4080,7 +4082,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -4095,7 +4097,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "pallet-balances 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -4172,7 +4174,7 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5018,7 +5020,7 @@ dependencies = [ "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5042,7 +5044,7 @@ version = "0.8.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", "sc-client 0.8.0", @@ -5064,7 +5066,7 @@ dependencies = [ name = "sc-block-builder" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sp-api 2.0.0", "sp-block-builder 2.0.0", @@ -5147,7 +5149,7 @@ dependencies = [ "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", "sc-client-api 2.0.0", @@ -5182,7 +5184,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor 0.8.0", "sc-telemetry 2.0.0", @@ -5213,7 +5215,7 @@ dependencies = [ "kvdb-rocksdb 0.4.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.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5241,7 +5243,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -5285,7 +5287,7 @@ dependencies = [ "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pdqselect 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5326,7 +5328,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sp-api 2.0.0", "sp-block-builder 2.0.0", @@ -5346,7 +5348,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-telemetry 2.0.0", @@ -5383,7 +5385,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", @@ -5412,7 +5414,7 @@ version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-runtime-interface 2.0.0", "sp-serializer 2.0.0", @@ -5425,11 +5427,10 @@ name = "sc-executor-wasmi" version = "0.8.0" dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", "sp-core 2.0.0", - "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", "sp-wasm-interface 2.0.0", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5446,11 +5447,10 @@ dependencies = [ "cranelift-native 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", "sp-core 2.0.0", - "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", "sp-wasm-interface 2.0.0", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5470,7 +5470,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", @@ -5532,7 +5532,7 @@ dependencies = [ "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5618,7 +5618,7 @@ dependencies = [ "hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", @@ -5658,7 +5658,7 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", @@ -5694,7 +5694,7 @@ dependencies = [ "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5743,7 +5743,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-chain-spec 2.0.0", "sc-client 0.8.0", @@ -5807,7 +5807,7 @@ version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", ] @@ -5857,7 +5857,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -5873,7 +5873,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-transaction-graph 2.0.0", @@ -6179,7 +6179,7 @@ name = "sp-api" version = "2.0.0" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api-proc-macro 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -6205,7 +6205,7 @@ name = "sp-api-test" version = "2.0.0" dependencies = [ "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", @@ -6221,7 +6221,7 @@ dependencies = [ name = "sp-application-crypto" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -6246,7 +6246,7 @@ dependencies = [ "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6258,7 +6258,7 @@ dependencies = [ name = "sp-authority-discovery" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", "sp-runtime 2.0.0", @@ -6269,7 +6269,7 @@ dependencies = [ name = "sp-authorship" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-inherents 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", @@ -6279,7 +6279,7 @@ dependencies = [ name = "sp-block-builder" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-inherents 2.0.0", "sp-runtime 2.0.0", @@ -6293,7 +6293,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-block-builder 2.0.0", "sp-consensus 0.8.0", @@ -6310,7 +6310,7 @@ dependencies = [ "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-inherents 2.0.0", @@ -6325,7 +6325,7 @@ dependencies = [ name = "sp-consensus-aura" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", "sp-inherents 2.0.0", @@ -6338,7 +6338,7 @@ dependencies = [ name = "sp-consensus-babe" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", @@ -6353,7 +6353,7 @@ dependencies = [ name = "sp-consensus-pow" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -6378,7 +6378,7 @@ dependencies = [ "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (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.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6416,7 +6416,7 @@ dependencies = [ name = "sp-externalities" version = "0.8.0" dependencies = [ - "environmental 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "environmental 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sp-std 2.0.0", "sp-storage 2.0.0", ] @@ -6425,7 +6425,7 @@ dependencies = [ name = "sp-finality-grandpa" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", @@ -6437,7 +6437,7 @@ dependencies = [ name = "sp-finality-tracker" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-inherents 2.0.0", "sp-std 2.0.0", ] @@ -6447,7 +6447,7 @@ name = "sp-inherents" version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", @@ -6460,7 +6460,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", @@ -6522,7 +6522,7 @@ version = "2.0.0" dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6539,8 +6539,7 @@ dependencies = [ name = "sp-runtime-interface" version = "2.0.0" dependencies = [ - "environmental 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -6594,7 +6593,7 @@ name = "sp-sandbox" version = "0.8.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-std 2.0.0", @@ -6623,7 +6622,7 @@ dependencies = [ name = "sp-staking" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-runtime 2.0.0", "sp-std 2.0.0", ] @@ -6636,7 +6635,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -6665,7 +6664,7 @@ dependencies = [ name = "sp-test-primitives" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", @@ -6677,7 +6676,7 @@ name = "sp-timestamp" version = "2.0.0" dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-inherents 2.0.0", "sp-runtime 2.0.0", @@ -6691,7 +6690,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-runtime 2.0.0", @@ -6705,7 +6704,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", "trie-bench 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6719,7 +6718,7 @@ name = "sp-version" version = "2.0.0" dependencies = [ "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-runtime 2.0.0", "sp-std 2.0.0", @@ -6834,7 +6833,7 @@ dependencies = [ "node-runtime 2.0.0", "pallet-balances 2.0.0", "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6869,7 +6868,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-rpc-api 0.8.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-storage 2.0.0", @@ -6887,7 +6886,7 @@ dependencies = [ "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-transaction-pool 2.0.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6905,7 +6904,7 @@ version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-client-db 0.8.0", @@ -6931,7 +6930,7 @@ dependencies = [ "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-babe 2.0.0", "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-executor 0.8.0", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6963,7 +6962,7 @@ name = "substrate-test-runtime-client" version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -7502,7 +7501,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8355,7 +8354,7 @@ dependencies = [ "checksum enumflags2_derive 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ecf634c5213044b8d54a46dd282cf5dd1f86bb5cb53e92c409cb4680a7fb9894" "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -"checksum environmental 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "34f8467a0284de039e6bd0e25c14519538462ba5beb548bb1f03e645097837a8" +"checksum environmental 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "516aa8d7a71cb00a1c4146f0798549b93d083d4f189b3ced8f3de6b8f11ee6c4" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" "checksum errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e" "checksum errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" @@ -8549,7 +8548,7 @@ dependencies = [ "checksum parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6de20a133b50f5120c6b8284ee88c5017fb167149208b3ee2e95f8719a434dc4" "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" "checksum parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" -"checksum parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f9f9d99dae413590a5f37e43cd99b94d4e62a244160562899126913ea7108673" +"checksum parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" "checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" diff --git a/client/executor/common/src/error.rs b/client/executor/common/src/error.rs index fca17bd88c..f7de0af968 100644 --- a/client/executor/common/src/error.rs +++ b/client/executor/common/src/error.rs @@ -57,6 +57,10 @@ pub enum Error { /// Runtime failed. #[display(fmt="Runtime error")] Runtime, + /// Runtime panicked. + #[display(fmt="Runtime panicked: {}", _0)] + #[from(ignore)] + RuntimePanicked(String), /// Invalid memory reference. #[display(fmt="Invalid memory reference")] InvalidMemoryReference, diff --git a/client/executor/common/src/wasm_runtime.rs b/client/executor/common/src/wasm_runtime.rs index 78c05c4c29..0733350f4c 100644 --- a/client/executor/common/src/wasm_runtime.rs +++ b/client/executor/common/src/wasm_runtime.rs @@ -17,7 +17,6 @@ //! Definitions for a wasm runtime. use crate::error::Error; -use sp_core::traits::Externalities; use sp_wasm_interface::Function; /// A trait that defines an abstract wasm runtime. @@ -34,6 +33,5 @@ pub trait WasmRuntime { fn host_functions(&self) -> &[&'static dyn Function]; /// Call a method in the Substrate runtime by name. Returns the encoded result on success. - fn call(&mut self, ext: &mut dyn Externalities, method: &str, data: &[u8]) - -> Result, Error>; + fn call(&mut self, method: &str, data: &[u8]) -> Result, Error>; } diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 2d39cac414..00f4eb33b0 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -83,7 +83,7 @@ fn call_in_wasm( code: &[u8], heap_pages: u64, ) -> crate::error::Result> { - crate::call_in_wasm::( + crate::call_in_wasm::( function, call_data, execution_method, diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index 1908eb3688..4f97efa9b6 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -39,7 +39,7 @@ mod wasm_runtime; mod integration_tests; pub use wasmi; -pub use native_executor::{with_native_environment, NativeExecutor, NativeExecutionDispatch}; +pub use native_executor::{with_externalities_safe, NativeExecutor, NativeExecutionDispatch}; pub use sp_version::{RuntimeVersion, NativeVersion}; pub use codec::Codec; #[doc(hidden)] @@ -57,26 +57,55 @@ pub use sc_executor_common::{error, allocator, sandbox}; /// - `call_data`: Will be given as input parameters to `function` /// - `execution_method`: The execution method to use. /// - `ext`: The externalities that should be set while executing the wasm function. +/// If `None` is given, no externalities will be set. /// - `heap_pages`: The number of heap pages to allocate. /// /// Returns the `Vec` that contains the return value of the function. -pub fn call_in_wasm( +pub fn call_in_wasm( function: &str, call_data: &[u8], execution_method: WasmExecutionMethod, - ext: &mut E, + ext: &mut dyn Externalities, code: &[u8], heap_pages: u64, allow_missing_imports: bool, ) -> error::Result> { - let mut instance = wasm_runtime::create_wasm_runtime_with_code( + call_in_wasm_with_host_functions( + function, + call_data, execution_method, - heap_pages, + ext, code, + heap_pages, HF::host_functions(), allow_missing_imports, + ) +} + +/// Non-generic version of [`call_in_wasm`] that takes the `host_functions` as parameter. +/// For more information please see [`call_in_wasm`]. +pub fn call_in_wasm_with_host_functions( + function: &str, + call_data: &[u8], + execution_method: WasmExecutionMethod, + ext: &mut dyn Externalities, + code: &[u8], + heap_pages: u64, + host_functions: Vec<&'static dyn sp_wasm_interface::Function>, + allow_missing_imports: bool, +) -> error::Result> { + let instance = wasm_runtime::create_wasm_runtime_with_code( + execution_method, + heap_pages, + code, + host_functions, + allow_missing_imports, )?; - instance.call(ext, function, call_data) + + // It is safe, as we delete the instance afterwards. + let mut instance = std::panic::AssertUnwindSafe(instance); + + with_externalities_safe(ext, move || instance.call(function, call_data)).and_then(|r| r) } /// Provides runtime information. @@ -98,7 +127,7 @@ mod tests { fn call_in_interpreted_wasm_works() { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let res = call_in_wasm::<_, sp_io::SubstrateHostFunctions>( + let res = call_in_wasm::( "test_empty_return", &[], WasmExecutionMethod::Interpreted, diff --git a/client/executor/src/native_executor.rs b/client/executor/src/native_executor.rs index 86b274eea0..4fe7a205f5 100644 --- a/client/executor/src/native_executor.rs +++ b/client/executor/src/native_executor.rs @@ -22,7 +22,7 @@ use sp_version::{NativeVersion, RuntimeVersion}; use codec::{Decode, Encode}; use sp_core::{NativeOrEncoded, traits::{CodeExecutor, Externalities}}; use log::trace; -use std::{result, cell::RefCell, panic::{UnwindSafe, AssertUnwindSafe}}; +use std::{result, cell::RefCell, panic::{UnwindSafe, AssertUnwindSafe}, sync::Arc}; use sp_wasm_interface::{HostFunctions, Function}; use sc_executor_common::wasm_runtime::WasmRuntime; @@ -33,22 +33,29 @@ thread_local! { /// Default num of pages for the heap const DEFAULT_HEAP_PAGES: u64 = 1024; -pub(crate) fn safe_call(f: F) -> Result - where F: UnwindSafe + FnOnce() -> U -{ - // Substrate uses custom panic hook that terminates process on panic. Disable - // termination for the native call. - let _guard = sp_panic_handler::AbortGuard::force_unwind(); - std::panic::catch_unwind(f).map_err(|_| Error::Runtime) -} - -/// Set up the externalities and safe calling environment to execute calls to a native runtime. +/// Set up the externalities and safe calling environment to execute runtime calls. /// /// If the inner closure panics, it will be caught and return an error. -pub fn with_native_environment(ext: &mut dyn Externalities, f: F) -> Result +pub fn with_externalities_safe(ext: &mut dyn Externalities, f: F) -> Result where F: UnwindSafe + FnOnce() -> U { - sp_externalities::set_and_run_with_externalities(ext, move || safe_call(f)) + sp_externalities::set_and_run_with_externalities( + ext, + move || { + // Substrate uses custom panic hook that terminates process on panic. Disable + // termination for the native call. + let _guard = sp_panic_handler::AbortGuard::force_unwind(); + std::panic::catch_unwind(f).map_err(|e| { + if let Some(err) = e.downcast_ref::() { + Error::RuntimePanicked(err.clone()) + } else if let Some(err) = e.downcast_ref::<&'static str>() { + Error::RuntimePanicked(err.to_string()) + } else { + Error::RuntimePanicked("Unknown panic".into()) + } + }) + }, + ) } /// Delegate for dispatching a CodeExecutor call. @@ -80,7 +87,7 @@ pub struct NativeExecutor { /// The number of 64KB pages to allocate for Wasm execution. default_heap_pages: u64, /// The host functions registered with this instance. - host_functions: Vec<&'static dyn Function>, + host_functions: Arc>, } impl NativeExecutor { @@ -107,7 +114,7 @@ impl NativeExecutor { fallback_method, native_version: D::native_version(), default_heap_pages: default_heap_pages.unwrap_or(DEFAULT_HEAP_PAGES), - host_functions, + host_functions: Arc::new(host_functions), } } @@ -139,7 +146,7 @@ impl NativeExecutor { ext, self.fallback_method, self.default_heap_pages, - &self.host_functions, + &*self.host_functions, )?; let runtime = AssertUnwindSafe(runtime); @@ -181,7 +188,7 @@ impl RuntimeInfo for NativeExecutor { } } -impl CodeExecutor for NativeExecutor { +impl CodeExecutor for NativeExecutor { type Error = Error; fn call @@ -212,13 +219,15 @@ impl CodeExecutor for NativeExecutor { onchain_version, ); - safe_call( - move || runtime.call(&mut **ext, method, data).map(NativeOrEncoded::Encoded) + with_externalities_safe( + &mut **ext, + move || runtime.call(method, data).map(NativeOrEncoded::Encoded) ) } (false, _, _) => { - safe_call( - move || runtime.call(&mut **ext, method, data).map(NativeOrEncoded::Encoded) + with_externalities_safe( + &mut **ext, + move || runtime.call(method, data).map(NativeOrEncoded::Encoded) ) }, (true, true, Some(call)) => { @@ -230,7 +239,7 @@ impl CodeExecutor for NativeExecutor { ); used_native = true; - let res = with_native_environment(&mut **ext, move || (call)()) + let res = with_externalities_safe(&mut **ext, move || (call)()) .and_then(|r| r .map(NativeOrEncoded::Native) .map_err(|s| Error::ApiError(s.to_string())) @@ -255,6 +264,27 @@ impl CodeExecutor for NativeExecutor { } } +impl sp_core::traits::CallInWasm for NativeExecutor { + fn call_in_wasm( + &self, + wasm_blob: &[u8], + method: &str, + call_data: &[u8], + ext: &mut dyn Externalities, + ) -> std::result::Result, String> { + crate::call_in_wasm_with_host_functions( + method, + call_data, + self.fallback_method, + ext, + wasm_blob, + self.default_heap_pages, + (*self.host_functions).clone(), + false, + ).map_err(|e| e.to_string()) + } +} + /// Implements a `NativeExecutionDispatch` for provided parameters. /// /// # Example @@ -318,7 +348,7 @@ macro_rules! native_executor_instance { method: &str, data: &[u8] ) -> $crate::error::Result> { - $crate::with_native_environment(ext, move || $dispatcher(method, data))? + $crate::with_externalities_safe(ext, move || $dispatcher(method, data))? .ok_or_else(|| $crate::error::Error::MethodNotFound(method.to_owned())) } diff --git a/client/executor/src/wasm_runtime.rs b/client/executor/src/wasm_runtime.rs index eef73097f6..036b28f764 100644 --- a/client/executor/src/wasm_runtime.rs +++ b/client/executor/src/wasm_runtime.rs @@ -223,8 +223,9 @@ fn create_versioned_wasm_runtime( // The following unwind safety assertion is OK because if the method call panics, the // runtime will be dropped. let mut runtime = AssertUnwindSafe(runtime.as_mut()); - crate::native_executor::safe_call( - move || runtime.call(&mut **ext, "Core_version", &[]) + crate::native_executor::with_externalities_safe( + &mut **ext, + move || runtime.call("Core_version", &[]) ).map_err(|_| WasmError::Instantiation("panic in call to get runtime version".into()))? }; let encoded_version = version_result diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index 799b9f3c54..dbfdc505c6 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -13,4 +13,3 @@ sc-executor-common = { version = "0.8", path = "../common" } sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } -sp-externalities = { version = "0.8.0", path = "../../../primitives/externalities" } diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index 7c6141d6c8..c10698fea4 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -27,7 +27,7 @@ use wasmi::{ memory_units::Pages, RuntimeValue::{I32, I64, self}, }; use codec::{Encode, Decode}; -use sp_core::{sandbox as sandbox_primitives, traits::Externalities}; +use sp_core::sandbox as sandbox_primitives; use log::{error, trace}; use parity_wasm::elements::{deserialize_buffer, DataSegment, Instruction, Module as RawModule}; use sp_wasm_interface::{ @@ -381,7 +381,6 @@ fn get_heap_base(module: &ModuleRef) -> Result { /// Call a given method in the given wasm-module runtime. fn call_in_wasm_module( - ext: &mut dyn Externalities, module_instance: &ModuleRef, method: &str, data: &[u8], @@ -410,13 +409,10 @@ fn call_in_wasm_module( let offset = fec.allocate_memory(data.len() as u32)?; fec.write_memory(offset, data)?; - let result = sp_externalities::set_and_run_with_externalities( - ext, - || module_instance.invoke_export( - method, - &[I32(u32::from(offset) as i32), I32(data.len() as i32)], - &mut fec, - ), + let result = module_instance.invoke_export( + method, + &[I32(u32::from(offset) as i32), I32(data.len() as i32)], + &mut fec, ); match result { @@ -599,7 +595,6 @@ impl WasmRuntime for WasmiRuntime { fn call( &mut self, - ext: &mut dyn Externalities, method: &str, data: &[u8], ) -> Result, Error> { @@ -612,7 +607,6 @@ impl WasmRuntime for WasmiRuntime { e })?; call_in_wasm_module( - ext, &self.instance, method, data, diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 64b08222d1..44912086ea 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -13,7 +13,6 @@ sc-executor-common = { version = "0.8", path = "../common" } sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } -sp-externalities = { version = "0.8.0", path = "../../../primitives/externalities" } cranelift-codegen = "0.50" cranelift-entity = "0.50" diff --git a/client/executor/wasmtime/src/runtime.rs b/client/executor/wasmtime/src/runtime.rs index ae4739d1f1..f9b1b6209c 100644 --- a/client/executor/wasmtime/src/runtime.rs +++ b/client/executor/wasmtime/src/runtime.rs @@ -24,7 +24,6 @@ use sc_executor_common::{ error::{Error, Result, WasmError}, wasm_runtime::WasmRuntime, }; -use sp_core::traits::Externalities; use sp_wasm_interface::{Pointer, WordSize, Function}; use sp_runtime_interface::unpack_ptr_and_len; @@ -70,11 +69,10 @@ impl WasmRuntime for WasmtimeRuntime { &self.host_functions } - fn call(&mut self, ext: &mut dyn Externalities, method: &str, data: &[u8]) -> Result> { + fn call(&mut self, method: &str, data: &[u8]) -> Result> { call_method( &mut self.context, &mut self.module, - ext, method, data, self.heap_pages, @@ -146,7 +144,6 @@ fn create_compiled_unit( fn call_method( context: &mut Context, module: &mut CompiledModule, - ext: &mut dyn Externalities, method: &str, data: &[u8], heap_pages: u32, @@ -176,11 +173,9 @@ fn call_method( let args = [RuntimeValue::I32(u32::from(data_ptr) as i32), RuntimeValue::I32(data_len as i32)]; // Invoke the function in the runtime. - let outcome = sp_externalities::set_and_run_with_externalities(ext, || { - context - .invoke(&mut instance, method, &args[..]) - .map_err(|e| Error::Other(format!("error calling runtime: {}", e))) - })?; + let outcome = context + .invoke(&mut instance, method, &args[..]) + .map_err(|e| Error::Other(format!("error calling runtime: {}", e)))?; let trap_error = reset_env_state_and_take_trap(context, None)?; let (output_ptr, output_len) = match outcome { ActionOutcome::Returned { values } => match values.as_slice() { diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index d708e00bfd..372229001d 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -412,7 +412,7 @@ for Environment where Block: 'static, B: Backend + 'static, - E: CallExecutor + Send + Sync + 'static, + E: CallExecutor + Send + Sync, N: NetworkT + 'static + Send, SC: SelectChain + 'static, VR: VotingRule>, diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index dbecd9c9a4..78e803269d 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -372,7 +372,7 @@ pub trait GenesisAuthoritySetProvider { impl GenesisAuthoritySetProvider for Client where B: Backend + Send + Sync + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + E: CallExecutor + Send + Sync, RA: Send + Sync, { fn get(&self) -> Result { @@ -408,7 +408,7 @@ pub fn block_import( ), ClientError> where B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, + E: CallExecutor + Send + Sync, RA: Send + Sync, SC: SelectChain, Client: AuxStore, diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index 3dbb2aff6a..b97d80a33c 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -67,7 +67,7 @@ fn grandpa_observer( ) -> impl Future>> where NumberFor: BlockNumberOps, B: Backend, - E: CallExecutor + Send + Sync, + E: CallExecutor + Send + Sync + 'static, RA: Send + Sync, S: Stream< Item = CommunicationIn, diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index 5951ee86a9..848e80d4fb 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -399,7 +399,7 @@ fn should_return_runtime_version() { let api = new_full(client.clone(), Subscriptions::new(Arc::new(core.executor()))); let result = "{\"specName\":\"test\",\"implName\":\"parity-test\",\"authoringVersion\":1,\ - \"specVersion\":1,\"implVersion\":1,\"apis\":[[\"0xdf6acb689907609b\",2],\ + \"specVersion\":1,\"implVersion\":2,\"apis\":[[\"0xdf6acb689907609b\",2],\ [\"0x37e397fc7c91f5e4\",1],[\"0xd2bc9897eed08f15\",1],[\"0x40fe3ad401f8959a\",4],\ [\"0xc6e9a76309f39b09\",1],[\"0xdd718d5cc53262d4\",1],[\"0xcbca25e39f142387\",1],\ [\"0xf78b278be53f454c\",2],[\"0xab3c0572291feb8b\",1],[\"0xbc9d89904f5b923f\",1]]}"; diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 85642b3e41..5449b00b06 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -147,7 +147,7 @@ pub fn new_full_client( config: &Configuration, ) -> Result, Error> where TBl: BlockT, - TExecDisp: NativeExecutionDispatch, + TExecDisp: NativeExecutionDispatch + 'static, TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, TCSExt: Extension, { @@ -158,7 +158,7 @@ fn new_full_parts( config: &Configuration, ) -> Result, Error> where TBl: BlockT, - TExecDisp: NativeExecutionDispatch, + TExecDisp: NativeExecutionDispatch + 'static, TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, TCSExt: Extension, { @@ -226,7 +226,7 @@ fn new_full_parts( impl ServiceBuilder<(), (), TCfg, TGen, TCSExt, (), (), (), (), (), (), (), (), (), ()> where TGen: RuntimeGenesis, TCSExt: Extension { /// Start the service builder with a configuration. - pub fn new_full( + pub fn new_full( config: Configuration ) -> Result Clone for LocalCallExecutor where E: Clone { impl CallExecutor for LocalCallExecutor where B: backend::Backend, - E: CodeExecutor + RuntimeInfo, + E: CodeExecutor + RuntimeInfo + Clone + 'static, Block: BlockT, { type Error = E::Error; @@ -225,7 +225,7 @@ where impl sp_version::GetRuntimeVersion for LocalCallExecutor where B: backend::Backend, - E: CodeExecutor + RuntimeInfo, + E: CodeExecutor + RuntimeInfo + Clone + 'static, Block: BlockT, { fn native_version(&self) -> &sp_version::NativeVersion { diff --git a/client/src/client.rs b/client/src/client.rs index aeca433184..efcbadb2b3 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -156,7 +156,7 @@ pub fn new_with_backend( E: CodeExecutor + RuntimeInfo, S: BuildStorage, Block: BlockT, - B: backend::LocalBackend + B: backend::LocalBackend + 'static, { let call_executor = LocalCallExecutor::new(backend.clone(), executor); let extensions = ExecutionExtensions::new(Default::default(), keystore); @@ -750,7 +750,6 @@ impl Client where import_block: BlockImportParams>, new_cache: HashMap>, ) -> sp_blockchain::Result where - E: CallExecutor + Send + Sync + Clone, Self: ProvideRuntimeApi, >::Api: CoreApi + ApiExt, @@ -829,7 +828,6 @@ impl Client where fork_choice: ForkChoiceStrategy, import_existing: bool, ) -> sp_blockchain::Result where - E: CallExecutor + Send + Sync + Clone, Self: ProvideRuntimeApi, >::Api: CoreApi + ApiExt, @@ -1387,7 +1385,7 @@ impl ProvideCache for Client where impl ProvideRuntimeApi for Client where B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, + E: CallExecutor + Send + Sync, Block: BlockT, RA: ConstructRuntimeApi, { @@ -1400,7 +1398,7 @@ impl ProvideRuntimeApi for Client where impl CallApiAt for Client where B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, + E: CallExecutor + Send + Sync, Block: BlockT, { type Error = Error; @@ -1448,7 +1446,7 @@ impl CallApiAt for Client where /// important verification work. impl sp_consensus::BlockImport for &Client where B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, + E: CallExecutor + Send + Sync, Block: BlockT, Client: ProvideRuntimeApi, as ProvideRuntimeApi>::Api: CoreApi + @@ -1552,7 +1550,7 @@ impl sp_consensus::BlockImport for &Client sp_consensus::BlockImport for Client where B: backend::Backend, - E: CallExecutor + Clone + Send + Sync, + E: CallExecutor + Send + Sync, Block: BlockT, Self: ProvideRuntimeApi, >::Api: CoreApi + diff --git a/client/src/genesis.rs b/client/src/genesis.rs index ab89bdd4d5..6dd6e2ec43 100644 --- a/client/src/genesis.rs +++ b/client/src/genesis.rs @@ -59,7 +59,7 @@ mod tests { native_executor_instance!( Executor, substrate_test_runtime_client::runtime::api::dispatch, - substrate_test_runtime_client::runtime::native_version + substrate_test_runtime_client::runtime::native_version, ); fn executor() -> sc_executor::NativeExecutor { diff --git a/client/src/light/call_executor.rs b/client/src/light/call_executor.rs index 45d9bf303c..9ac88103e8 100644 --- a/client/src/light/call_executor.rs +++ b/client/src/light/call_executor.rs @@ -222,7 +222,7 @@ pub fn check_execution_proof( ) -> ClientResult> where Header: HeaderT, - E: CodeExecutor, + E: CodeExecutor + Clone + 'static, H: Hasher, H::Out: Ord + codec::Codec + 'static, { @@ -248,7 +248,7 @@ fn check_execution_proof_with_make_header ClientResult> where Header: HeaderT, - E: CodeExecutor, + E: CodeExecutor + Clone + 'static, H: Hasher, H::Out: Ord + codec::Codec + 'static, { diff --git a/client/src/light/fetcher.rs b/client/src/light/fetcher.rs index d746b3abe5..a35bfdc25c 100644 --- a/client/src/light/fetcher.rs +++ b/client/src/light/fetcher.rs @@ -197,7 +197,7 @@ impl> LightDataChecker { impl FetchChecker for LightDataChecker where Block: BlockT, - E: CodeExecutor, + E: CodeExecutor + Clone + 'static, H: Hasher, H::Out: Ord + codec::Codec + 'static, S: BlockchainStorage, diff --git a/client/src/light/mod.rs b/client/src/light/mod.rs index c067fc9caa..d65fdef711 100644 --- a/client/src/light/mod.rs +++ b/client/src/light/mod.rs @@ -73,7 +73,7 @@ pub fn new_light( B: BlockT, S: BlockchainStorage + 'static, GS: BuildStorage, - E: CodeExecutor + RuntimeInfo, + E: CodeExecutor + RuntimeInfo + Clone + 'static, { let local_executor = LocalCallExecutor::new(backend.clone(), code_executor); let executor = GenesisCallExecutor::new(backend.clone(), local_executor); diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index 227aecee2e..fd9992aebe 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -18,6 +18,8 @@ impl-trait-for-tuples = "0.1.3" [dev-dependencies] criterion = "0.2.11" +sp-externalities = { version = "0.8.0", path = "../../primitives/externalities" } +substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } [features] default = ["std"] diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 9e7678a7ed..174eb733af 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -259,11 +259,38 @@ decl_module! { storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode()); } - /// Set the new code. + /// Set the new runtime code. #[weight = SimpleDispatchInfo::FixedOperational(200_000)] - pub fn set_code(origin, new: Vec) { + pub fn set_code(origin, code: Vec) { ensure_root(origin)?; - storage::unhashed::put_raw(well_known_keys::CODE, &new); + + let current_version = T::Version::get(); + let new_version = sp_io::misc::runtime_version(&code) + .and_then(|v| RuntimeVersion::decode(&mut &v[..]).ok()) + .ok_or_else(|| Error::::FailedToExtractRuntimeVersion)?; + + if new_version.spec_name != current_version.spec_name { + Err(Error::::InvalidSpecName)? + } + + if new_version.spec_version < current_version.spec_version { + Err(Error::::SpecVersionNotAllowedToDecrease)? + } else if new_version.spec_version == current_version.spec_version { + if new_version.impl_version < current_version.impl_version { + Err(Error::::ImplVersionNotAllowedToDecrease)? + } else if new_version.impl_version == current_version.impl_version { + Err(Error::::SpecOrImplVersionNeedToIncrease)? + } + } + + storage::unhashed::put_raw(well_known_keys::CODE, &code); + } + + /// Set the new runtime code without doing any checks of the given `code`. + #[weight = SimpleDispatchInfo::FixedOperational(200_000)] + pub fn set_code_without_checks(origin, code: Vec) { + ensure_root(origin)?; + storage::unhashed::put_raw(well_known_keys::CODE, &code); } /// Set some items of storage. @@ -327,7 +354,24 @@ decl_event!( decl_error! { /// Error for the System module - pub enum Error for Module {} + pub enum Error for Module { + /// The name of specification does not match between the current runtime + /// and the new runtime. + InvalidSpecName, + /// The specification version is not allowed to decrease between the current runtime + /// and the new runtime. + SpecVersionNotAllowedToDecrease, + /// The implementation version is not allowed to decrease between the current runtime + /// and the new runtime. + ImplVersionNotAllowedToDecrease, + /// The specification or the implementation version need to increase between the + /// current runtime and the new runtime. + SpecOrImplVersionNeedToIncrease, + /// Failed to extract the runtime version from the new runtime. + /// + /// Either calling `Core_version` or decoding `RuntimeVersion` failed. + FailedToExtractRuntimeVersion, + } } /// Origin for the System module. @@ -1189,6 +1233,14 @@ mod tests { pub const MaximumBlockWeight: Weight = 1024; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); pub const MaximumBlockLength: u32 = 1024; + pub const Version: RuntimeVersion = RuntimeVersion { + spec_name: sp_version::create_runtime_str!("test"), + impl_name: sp_version::create_runtime_str!("system-test"), + authoring_version: 1, + spec_version: 1, + impl_version: 1, + apis: sp_version::create_apis_vec!([]), + }; } impl Trait for Test { @@ -1206,7 +1258,7 @@ mod tests { type MaximumBlockWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; - type Version = (); + type Version = Version; type ModuleToIndex = (); } @@ -1503,7 +1555,7 @@ mod tests { .validate(&1, CALL, op, len) .unwrap() .priority; - assert_eq!(priority, Bounded::max_value()); + assert_eq!(priority, u64::max_value()); }) } @@ -1562,4 +1614,65 @@ mod tests { assert_eq!(ext.validate(&1, CALL, normal, len).unwrap().longevity, 15); }) } + + + #[test] + fn set_code_checks_works() { + struct CallInWasm(Vec); + + impl sp_core::traits::CallInWasm for CallInWasm { + fn call_in_wasm( + &self, + _: &[u8], + _: &str, + _: &[u8], + _: &mut dyn sp_externalities::Externalities, + ) -> Result, String> { + Ok(self.0.clone()) + } + } + + let test_data = vec![ + ("test", 1, 2, Ok(())), + ("test", 1, 1, Err(Error::::SpecOrImplVersionNeedToIncrease)), + ("test2", 1, 1, Err(Error::::InvalidSpecName)), + ("test", 2, 1, Ok(())), + ("test", 0, 1, Err(Error::::SpecVersionNotAllowedToDecrease)), + ("test", 1, 0, Err(Error::::ImplVersionNotAllowedToDecrease)), + ]; + + for (spec_name, spec_version, impl_version, expected) in test_data.into_iter() { + let version = RuntimeVersion { + spec_name: spec_name.into(), + spec_version, + impl_version, + ..Default::default() + }; + let call_in_wasm = CallInWasm(version.encode()); + + let mut ext = new_test_ext(); + ext.register_extension(sp_core::traits::CallInWasmExt::new(call_in_wasm)); + ext.execute_with(|| { + let res = System::set_code( + RawOrigin::Root.into(), + vec![1, 2, 3, 4], + ); + + assert_eq!(expected.map_err(DispatchError::from), res); + }); + } + } + + #[test] + fn set_code_with_real_wasm_blob() { + let executor = substrate_test_runtime_client::new_native_executor(); + let mut ext = new_test_ext(); + ext.register_extension(sp_core::traits::CallInWasmExt::new(executor)); + ext.execute_with(|| { + System::set_code( + RawOrigin::Root.into(), + substrate_test_runtime_client::runtime::WASM_BINARY.to_vec(), + ).unwrap(); + }); + } } diff --git a/primitives/core/src/traits.rs b/primitives/core/src/traits.rs index cd188e3367..020b5e2dc5 100644 --- a/primitives/core/src/traits.rs +++ b/primitives/core/src/traits.rs @@ -80,7 +80,7 @@ sp_externalities::decl_extension! { } /// Code execution engine. -pub trait CodeExecutor: Sized + Send + Sync { +pub trait CodeExecutor: Sized + Send + Sync + CallInWasm + Clone + 'static { /// Externalities error type. type Error: Display + Debug + Send + 'static; @@ -99,3 +99,30 @@ pub trait CodeExecutor: Sized + Send + Sync { native_call: Option, ) -> (Result, Self::Error>, bool); } + +/// Something that can call a method in a WASM blob. +pub trait CallInWasm: Send + Sync { + /// Call the given `method` in the given `wasm_blob` using `call_data` (SCALE encoded arguments) + /// to decode the arguments for the method. + /// + /// Returns the SCALE encoded return value of the method. + fn call_in_wasm( + &self, + wasm_blob: &[u8], + method: &str, + call_data: &[u8], + ext: &mut dyn Externalities, + ) -> Result, String>; +} + +sp_externalities::decl_extension! { + /// The call-in-wasm extension to register/retrieve from the externalities. + pub struct CallInWasmExt(Box); +} + +impl CallInWasmExt { + /// Creates a new instance of `Self`. + pub fn new(inner: T) -> Self { + Self(Box::new(inner)) + } +} diff --git a/primitives/externalities/Cargo.toml b/primitives/externalities/Cargo.toml index 361a9ac034..23889da4ea 100644 --- a/primitives/externalities/Cargo.toml +++ b/primitives/externalities/Cargo.toml @@ -8,4 +8,4 @@ edition = "2018" [dependencies] sp-storage = { version = "2.0.0", path = "../storage" } sp-std = { version = "2.0.0", path = "../std" } -environmental = { version = "1.0.2" } +environmental = { version = "1.1.1" } diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 7ac2ae1012..704477b1fb 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -35,7 +35,7 @@ use sp_std::ops::Deref; #[cfg(feature = "std")] use sp_core::{ crypto::Pair, - traits::KeystoreExt, + traits::{KeystoreExt, CallInWasmExt}, offchain::{OffchainExt, TransactionPoolExt}, hexdisplay::HexDisplay, storage::{ChildStorageKey, ChildInfo}, @@ -49,7 +49,7 @@ use sp_core::{ }; #[cfg(feature = "std")] -use ::sp_trie::{TrieConfiguration, trie_types::Layout}; +use sp_trie::{TrieConfiguration, trie_types::Layout}; use sp_runtime_interface::{runtime_interface, Pointer}; @@ -351,6 +351,25 @@ pub trait Misc { fn print_hex(data: &[u8]) { log::debug!(target: "runtime", "{}", HexDisplay::from(&data)); } + + /// Extract the runtime version of the given wasm blob by calling `Core_version`. + /// + /// Returns the SCALE encoded runtime version and `None` if the call failed. + /// + /// # Performance + /// + /// Calling this function is very expensive and should only be done very occasionally. + /// For getting the runtime version, it requires instantiating the wasm blob and calling a + /// function in this blob. + fn runtime_version(&mut self, wasm: &[u8]) -> Option> { + // Create some dummy externalities, `Core_version` should not write data anyway. + let mut ext = sp_state_machine::BasicExternalities::default(); + + self.extension::() + .expect("No `CallInWasmExt` associated for the current context!") + .call_in_wasm(wasm, "Core_version", &[], &mut ext) + .ok() + } } /// Interfaces for working with crypto related types from within the runtime. diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index bac9a893de..7ed2257556 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -10,7 +10,6 @@ sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-runtime-interface-proc-macro = { version = "2.0.0", path = "proc-macro" } sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false } -environmental = { version = "1.0.2", optional = true } static_assertions = "1.0.0" primitive-types = { version = "0.6.1", default-features = false } @@ -29,7 +28,6 @@ std = [ "sp-std/std", "codec/std", "sp-externalities", - "environmental", "primitive-types/std", ] diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index 3cfb589b05..b209e1f71c 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -30,7 +30,6 @@ fn call_wasm_method(method: &str) -> TestExternalities { let mut ext_ext = ext.ext(); sc_executor::call_in_wasm::< - _, ( HF, sp_io::SubstrateHostFunctions, diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index c010ea0456..6033f221a1 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -53,6 +53,9 @@ pub mod testing; pub mod traits; pub mod transaction_validity; pub mod random_number_generator; +mod runtime_string; + +pub use crate::runtime_string::*; /// Re-export these since they're only "kind of" generic. pub use generic::{DigestItem, Digest}; @@ -92,27 +95,6 @@ impl TypeId for ModuleId { const TYPE_ID: [u8; 4] = *b"modl"; } -/// A String that is a `&'static str` on `no_std` and a `Cow<'static, str>` on `std`. -#[cfg(feature = "std")] -pub type RuntimeString = std::borrow::Cow<'static, str>; -/// A String that is a `&'static str` on `no_std` and a `Cow<'static, str>` on `std`. -#[cfg(not(feature = "std"))] -pub type RuntimeString = &'static str; - -/// Create a const [`RuntimeString`]. -#[cfg(feature = "std")] -#[macro_export] -macro_rules! create_runtime_str { - ( $y:expr ) => {{ std::borrow::Cow::Borrowed($y) }} -} - -/// Create a const [`RuntimeString`]. -#[cfg(not(feature = "std"))] -#[macro_export] -macro_rules! create_runtime_str { - ( $y:expr ) => {{ $y }} -} - #[cfg(feature = "std")] pub use serde::{Serialize, Deserialize, de::DeserializeOwned}; use crate::traits::IdentifyAccount; diff --git a/primitives/runtime/src/runtime_string.rs b/primitives/runtime/src/runtime_string.rs new file mode 100644 index 0000000000..e7ee927e08 --- /dev/null +++ b/primitives/runtime/src/runtime_string.rs @@ -0,0 +1,117 @@ +// Copyright 2020 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 codec::{Encode, Decode}; +use sp_core::RuntimeDebug; +use sp_std::vec::Vec; + +/// A string that wraps a `&'static str` in the runtime and `String`/`Vec` on decode. +#[derive(Eq, RuntimeDebug, Clone)] +pub enum RuntimeString { + /// The borrowed mode that wraps a `&'static str`. + Borrowed(&'static str), + /// The owned mode that wraps a `String`. + #[cfg(feature = "std")] + Owned(String), + /// The owned mode that wraps a `Vec`. + #[cfg(not(feature = "std"))] + Owned(Vec), +} + +impl From<&'static str> for RuntimeString { + fn from(data: &'static str) -> Self { + Self::Borrowed(data) + } +} + +#[cfg(feature = "std")] +impl From for String { + fn from(string: RuntimeString) -> Self { + match string { + RuntimeString::Borrowed(data) => data.to_owned(), + RuntimeString::Owned(data) => data, + } + } +} + +impl Default for RuntimeString { + fn default() -> Self { + Self::Borrowed(Default::default()) + } +} + +impl PartialEq for RuntimeString { + fn eq(&self, other: &Self) -> bool { + self.as_ref() == other.as_ref() + } +} + +impl AsRef<[u8]> for RuntimeString { + fn as_ref(&self) -> &[u8] { + match self { + Self::Borrowed(val) => val.as_ref(), + Self::Owned(val) => val.as_ref(), + } + } +} + +impl Encode for RuntimeString { + fn encode(&self) -> Vec { + match self { + Self::Borrowed(val) => val.encode(), + Self::Owned(val) => val.encode(), + } + } +} + +impl Decode for RuntimeString { + fn decode(value: &mut I) -> Result { + Decode::decode(value).map(Self::Owned) + } +} + +#[cfg(feature = "std")] +impl std::fmt::Display for RuntimeString { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Self::Borrowed(val) => write!(f, "{}", val), + Self::Owned(val) => write!(f, "{}", val), + } + } +} + +#[cfg(feature = "std")] +impl serde::Serialize for RuntimeString { + fn serialize(&self, serializer: S) -> Result { + match self { + Self::Borrowed(val) => val.serialize(serializer), + Self::Owned(val) => val.serialize(serializer), + } + } +} + +#[cfg(feature = "std")] +impl<'de> serde::Deserialize<'de> for RuntimeString { + fn deserialize>(de: D) -> Result { + String::deserialize(de).map(Self::Owned) + } +} + +/// Create a const [`RuntimeString`]. +#[macro_export] +macro_rules! create_runtime_str { + ( $y:expr ) => {{ $crate::RuntimeString::Borrowed($y) }} +} diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index c8329178c6..55f2eb4941 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -24,7 +24,7 @@ use hash_db::Hasher; use codec::{Decode, Encode, Codec}; use sp_core::{ storage::{well_known_keys, ChildInfo}, NativeOrEncoded, NeverNativeValue, - traits::CodeExecutor, hexdisplay::HexDisplay + traits::{CodeExecutor, CallInWasmExt}, hexdisplay::HexDisplay }; use overlayed_changes::OverlayedChangeSet; use sp_externalities::Extensions; @@ -191,7 +191,7 @@ pub struct StateMachine<'a, B, H, N, T, Exec> impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where H: Hasher, H::Out: Ord + 'static + codec::Codec, - Exec: CodeExecutor, + Exec: CodeExecutor + Clone + 'static, B: Backend, T: ChangesTrieStorage, N: crate::changes_trie::BlockNumber, @@ -204,8 +204,10 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where exec: &'a Exec, method: &'a str, call_data: &'a [u8], - extensions: Extensions, + mut extensions: Extensions, ) -> Self { + extensions.register(CallInWasmExt::new(exec.clone())); + Self { backend, exec, @@ -451,7 +453,7 @@ where B: Backend, H: Hasher, H::Out: Ord + 'static + codec::Codec, - Exec: CodeExecutor, + Exec: CodeExecutor + Clone + 'static, { let trie_backend = backend.as_trie_backend() .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; @@ -478,7 +480,7 @@ where S: trie_backend_essence::TrieBackendStorage, H: Hasher, H::Out: Ord + 'static + codec::Codec, - Exec: CodeExecutor, + Exec: CodeExecutor + 'static + Clone, { let proving_backend = proving_backend::ProvingBackend::new(trie_backend); let mut sm = StateMachine::<_, H, _, InMemoryChangesTrieStorage, Exec>::new( @@ -504,7 +506,7 @@ pub fn execution_proof_check( ) -> Result, Box> where H: Hasher, - Exec: CodeExecutor, + Exec: CodeExecutor + Clone + 'static, H::Out: Ord + 'static + codec::Codec, { let trie_backend = create_proof_check_backend::(root.into(), proof)?; @@ -522,7 +524,7 @@ pub fn execution_proof_check_on_trie_backend( where H: Hasher, H::Out: Ord + 'static + codec::Codec, - Exec: CodeExecutor, + Exec: CodeExecutor + Clone + 'static, { let mut sm = StateMachine::<_, H, _, InMemoryChangesTrieStorage, Exec>::new( trie_backend, None, overlay, exec, method, call_data, Extensions::default(), @@ -741,6 +743,7 @@ mod tests { }; use sp_core::{Blake2Hasher, map, traits::Externalities, storage::ChildStorageKey}; + #[derive(Clone)] struct DummyCodeExecutor { change_changes_trie_config: bool, native_available: bool, @@ -797,6 +800,18 @@ mod tests { } } + impl sp_core::traits::CallInWasm for DummyCodeExecutor { + fn call_in_wasm( + &self, + _: &[u8], + _: &str, + _: &[u8], + _: &mut dyn Externalities, + ) -> std::result::Result, String> { + unimplemented!("Not required in tests.") + } + } + #[test] fn execute_works() { let backend = trie_backend::tests::test_trie(); diff --git a/primitives/version/Cargo.toml b/primitives/version/Cargo.toml index fbbf0cfa94..784051b56e 100644 --- a/primitives/version/Cargo.toml +++ b/primitives/version/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] impl-serde = { version = "0.2.3", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } -codec = { package = "parity-scale-codec", version = "1.0.5", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.1.2", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-runtime = { version = "2.0.0", default-features = false, path = "../runtime" } diff --git a/primitives/version/src/lib.rs b/primitives/version/src/lib.rs index 3211c46253..0534f87490 100644 --- a/primitives/version/src/lib.rs +++ b/primitives/version/src/lib.rs @@ -25,11 +25,11 @@ use std::fmt; #[cfg(feature = "std")] use std::collections::HashSet; -use codec::Encode; -#[cfg(feature = "std")] -use codec::Decode; +use codec::{Encode, Decode}; use sp_runtime::RuntimeString; pub use sp_runtime::create_runtime_str; +#[doc(hidden)] +pub use sp_std; #[cfg(feature = "std")] use sp_runtime::{traits::Block as BlockT, generic::BlockId}; @@ -37,25 +37,13 @@ use sp_runtime::{traits::Block as BlockT, generic::BlockId}; /// The identity of a particular API interface that the runtime might provide. pub type ApiId = [u8; 8]; -/// A vector of pairs of `ApiId` and a `u32` for version. For `"std"` builds, this -/// is a `Cow`. -#[cfg(feature = "std")] -pub type ApisVec = std::borrow::Cow<'static, [(ApiId, u32)]>; -/// A vector of pairs of `ApiId` and a `u32` for version. For `"no-std"` builds, this -/// is just a reference. -#[cfg(not(feature = "std"))] -pub type ApisVec = &'static [(ApiId, u32)]; +/// A vector of pairs of `ApiId` and a `u32` for version. +pub type ApisVec = sp_std::borrow::Cow<'static, [(ApiId, u32)]>; /// Create a vector of Api declarations. #[macro_export] -#[cfg(feature = "std")] -macro_rules! create_apis_vec { - ( $y:expr ) => { std::borrow::Cow::Borrowed(& $y) } -} -#[macro_export] -#[cfg(not(feature = "std"))] macro_rules! create_apis_vec { - ( $y:expr ) => { & $y } + ( $y:expr ) => { $crate::sp_std::borrow::Cow::Borrowed(& $y) } } /// Runtime version. @@ -63,8 +51,8 @@ macro_rules! create_apis_vec { /// This triplet have different semantics and mis-interpretation could cause problems. /// 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, Default, sp_runtime::RuntimeDebug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Decode))] +#[derive(Clone, PartialEq, Eq, Encode, Decode, Default, sp_runtime::RuntimeDebug)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[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/test-utils/client/src/client_ext.rs b/test-utils/client/src/client_ext.rs index 67d08c5fa6..aa7383e3ab 100644 --- a/test-utils/client/src/client_ext.rs +++ b/test-utils/client/src/client_ext.rs @@ -64,7 +64,7 @@ pub trait ClientBlockImportExt: Sized { impl ClientExt for Client where B: sc_client_api::backend::Backend, - E: sc_client::CallExecutor, + E: sc_client::CallExecutor + 'static, Self: BlockImport, Block: BlockT, { diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index c8d3a809a7..8603b26d50 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -165,7 +165,7 @@ impl TestClientBuilder >, sc_client::LongestChain, ) where - Executor: sc_client::CallExecutor, + Executor: sc_client::CallExecutor + 'static, Backend: sc_client_api::backend::Backend, Block: BlockT, { @@ -224,8 +224,8 @@ impl TestClientBuilder< sc_client::LongestChain, ) where I: Into>>, - E: sc_executor::NativeExecutionDispatch, - Backend: sc_client_api::backend::Backend, + E: sc_executor::NativeExecutionDispatch + 'static, + Backend: sc_client_api::backend::Backend + 'static, Block: BlockT, { let executor = executor.into().unwrap_or_else(|| diff --git a/test-utils/runtime/client/src/lib.rs b/test-utils/runtime/client/src/lib.rs index 4faf7f8ab4..0476be2f60 100644 --- a/test-utils/runtime/client/src/lib.rs +++ b/test-utils/runtime/client/src/lib.rs @@ -59,21 +59,12 @@ pub mod prelude { pub use super::{AccountKeyring, Sr25519Keyring}; } -mod local_executor { - #![allow(missing_docs)] - use substrate_test_runtime; - use crate::sc_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, - substrate_test_runtime::api::dispatch, - substrate_test_runtime::native_version - ); +sc_executor::native_executor_instance! { + pub LocalExecutor, + substrate_test_runtime::api::dispatch, + substrate_test_runtime::native_version, } -/// Native executor used for tests. -pub use self::local_executor::LocalExecutor; - /// Test client database backend. pub type Backend = substrate_test_client::Backend; @@ -245,7 +236,7 @@ impl TestClientBuilderExt for TestClientBuilder< sc_client::LocalCallExecutor>, B > where - B: sc_client_api::backend::Backend, + B: sc_client_api::backend::Backend + 'static, // Rust bug: https://github.com/rust-lang/rust/issues/24159 >::State: sp_api::StateBackend>, @@ -353,7 +344,7 @@ pub fn new_light() -> ( let storage = sc_client_db::light::LightStorage::new_test(); let blockchain = Arc::new(sc_client::light::blockchain::Blockchain::new(storage)); let backend = Arc::new(LightBackend::new(blockchain.clone())); - let executor = NativeExecutor::new(WasmExecutionMethod::Interpreted, None); + let executor = new_native_executor(); let local_call_executor = sc_client::LocalCallExecutor::new(backend.clone(), executor); let call_executor = LightExecutor::new( backend.clone(), @@ -372,3 +363,8 @@ pub fn new_light() -> ( pub fn new_light_fetcher() -> LightFetcher { LightFetcher::default() } + +/// Create a new native executor. +pub fn new_native_executor() -> sc_executor::NativeExecutor { + sc_executor::NativeExecutor::new(sc_executor::WasmExecutionMethod::Interpreted, None) +} diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index 4dfddfda21..b4c2e849a6 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -65,7 +65,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("parity-test"), authoring_version: 1, spec_version: 1, + #[cfg(feature = "std")] impl_version: 1, + #[cfg(not(feature = "std"))] + impl_version: 2, apis: RUNTIME_API_VERSIONS, }; -- GitLab From 99430a518e762f0e3f49c55c3fce8afff8537794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 16 Jan 2020 13:53:45 +0000 Subject: [PATCH 129/296] grandpa: generic voting rule for backing off from best block (#4635) * grandpa: generic voting rule for backing off from best block * grandpa: fix tests --- Cargo.lock | 1 + client/finality-grandpa/Cargo.toml | 1 + client/finality-grandpa/src/lib.rs | 2 +- client/finality-grandpa/src/tests.rs | 28 ++++---- client/finality-grandpa/src/voting_rule.rs | 83 ++++++++++++++-------- 5 files changed, 71 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2888776ab6..7a4ae1beea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5482,6 +5482,7 @@ dependencies = [ "sc-telemetry 2.0.0", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", + "sp-arithmetic 2.0.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", "sp-consensus-babe 0.8.0", diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index ac0501c3c3..46268ee44a 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -13,6 +13,7 @@ log = "0.4.8" parking_lot = "0.9.0" rand = "0.7.2" parity-scale-codec = { version = "1.0.0", features = ["derive"] } +sp-arithmetic = { version = "2.0.0", path = "../../primitives/arithmetic" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } sp-core = { version = "2.0.0", path = "../../primitives/core" } diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index 78e803269d..c0d83ba019 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -96,7 +96,7 @@ pub use justification::GrandpaJustification; pub use light_import::light_block_import; pub use observer::run_grandpa_observer; pub use voting_rule::{ - BeforeBestBlock, ThreeQuartersOfTheUnfinalizedChain, VotingRule, VotingRulesBuilder + BeforeBestBlockBy, ThreeQuartersOfTheUnfinalizedChain, VotingRule, VotingRulesBuilder }; use aux_schema::PersistentData; diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 4ad08c8868..05b8f9689b 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -1694,8 +1694,8 @@ fn grandpa_environment_respects_voting_rules() { } }; - // add 20 blocks - peer.push_blocks(20, false); + // add 21 blocks + peer.push_blocks(21, false); // create an environment with no voting rule restrictions let unrestricted_env = environment(Box::new(())); @@ -1716,38 +1716,38 @@ fn grandpa_environment_respects_voting_rules() { unrestricted_env.best_chain_containing( peer.client().info().finalized_hash ).unwrap().1, - 20, + 21, ); - // both the other environments should return block 15, which is 3/4 of the + // both the other environments should return block 16, which is 3/4 of the // way in the unfinalized chain assert_eq!( three_quarters_env.best_chain_containing( peer.client().info().finalized_hash ).unwrap().1, - 15, + 16, ); assert_eq!( default_env.best_chain_containing( peer.client().info().finalized_hash ).unwrap().1, - 15, + 16, ); - // we finalize block 19 with block 20 being the best block + // we finalize block 19 with block 21 being the best block peer.client().finalize_block(BlockId::Number(19), None, false).unwrap(); - // the 3/4 environment should propose block 20 for voting + // the 3/4 environment should propose block 21 for voting assert_eq!( three_quarters_env.best_chain_containing( peer.client().info().finalized_hash ).unwrap().1, - 20, + 21, ); // while the default environment will always still make sure we don't vote - // on the best block + // on the best block (2 behind) assert_eq!( default_env.best_chain_containing( peer.client().info().finalized_hash @@ -1755,17 +1755,17 @@ fn grandpa_environment_respects_voting_rules() { 19, ); - // we finalize block 20 with block 20 being the best block - peer.client().finalize_block(BlockId::Number(20), None, false).unwrap(); + // we finalize block 21 with block 21 being the best block + peer.client().finalize_block(BlockId::Number(21), None, false).unwrap(); // even though the default environment will always try to not vote on the // best block, there's a hard rule that we can't cast any votes lower than - // the given base (#20). + // the given base (#21). assert_eq!( default_env.best_chain_containing( peer.client().info().finalized_hash ).unwrap().1, - 20, + 21, ); } diff --git a/client/finality-grandpa/src/voting_rule.rs b/client/finality-grandpa/src/voting_rule.rs index 8ba52f30f7..523a1b05cd 100644 --- a/client/finality-grandpa/src/voting_rule.rs +++ b/client/finality-grandpa/src/voting_rule.rs @@ -70,30 +70,38 @@ impl VotingRule for () where /// A custom voting rule that guarantees that our vote is always behind the best /// block, in the best case exactly one block behind it. #[derive(Clone)] -pub struct BeforeBestBlock; -impl VotingRule for BeforeBestBlock where +pub struct BeforeBestBlockBy(N); +impl VotingRule for BeforeBestBlockBy> where Block: BlockT, B: HeaderBackend, { fn restrict_vote( &self, - _backend: &B, + backend: &B, _base: &Block::Header, best_target: &Block::Header, current_target: &Block::Header, ) -> Option<(Block::Hash, NumberFor)> { + use sp_arithmetic::traits::Saturating; + if current_target.number().is_zero() { return None; } - if current_target.number() == best_target.number() { - return Some(( - current_target.parent_hash().clone(), - *current_target.number() - One::one(), - )); + // find the target number restricted by this rule + let target_number = best_target.number().saturating_sub(self.0); + + // our current target is already lower than this rule would restrict + if target_number >= *current_target.number() { + return None; } - None + // find the block at the given target height + find_target( + backend, + target_number, + current_target, + ) } } @@ -130,26 +138,43 @@ impl VotingRule for ThreeQuartersOfTheUnfinalizedChain where return None; } - let mut target_header = current_target.clone(); - let mut target_hash = current_target.hash(); - - // walk backwards until we find the target block - loop { - if *target_header.number() < target_number { - unreachable!( - "we are traversing backwards from a known block; \ - blocks are stored contiguously; \ - qed" - ); - } - if *target_header.number() == target_number { - return Some((target_hash, target_number)); - } - - target_hash = *target_header.parent_hash(); - target_header = backend.header(BlockId::Hash(target_hash)).ok()? - .expect("Header known to exist due to the existence of one of its descendents; qed"); + // find the block at the given target height + find_target( + backend, + target_number, + current_target, + ) + } +} + +// walk backwards until we find the target block +fn find_target( + backend: &B, + target_number: NumberFor, + current_header: &Block::Header, +) -> Option<(Block::Hash, NumberFor)> where + Block: BlockT, + B: HeaderBackend, +{ + let mut target_hash = current_header.hash(); + let mut target_header = current_header.clone(); + + loop { + if *target_header.number() < target_number { + unreachable!( + "we are traversing backwards from a known block; \ + blocks are stored contiguously; \ + qed" + ); + } + + if *target_header.number() == target_number { + return Some((target_hash, target_number)); } + + target_hash = *target_header.parent_hash(); + target_header = backend.header(BlockId::Hash(target_hash)).ok()? + .expect("Header known to exist due to the existence of one of its descendents; qed"); } } @@ -213,7 +238,7 @@ impl Default for VotingRulesBuilder where { fn default() -> Self { VotingRulesBuilder::new() - .add(BeforeBestBlock) + .add(BeforeBestBlockBy(2.into())) .add(ThreeQuartersOfTheUnfinalizedChain) } } -- GitLab From 1e0c6794e5f996c78ef1df996d04c3acff5347ae Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 16 Jan 2020 15:41:26 +0100 Subject: [PATCH 130/296] Make the sync_cycle_from_offline_to_syncing_to_offline test non flaky (#4644) --- client/network/test/src/sync.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index d738eb3d6c..2140de0973 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -80,7 +80,7 @@ fn sync_cycle_from_offline_to_syncing_to_offline() { } if peer < 2 { // Major syncing. - if !net.peer(peer).is_major_syncing() { + if net.peer(peer).blocks_count() < 100 && !net.peer(peer).is_major_syncing() { return Ok(Async::NotReady) } } -- GitLab From 8e98643384e28dfa0a88079161330309a6ee408a Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 16 Jan 2020 19:38:24 +0300 Subject: [PATCH 131/296] Allow updating configuration of changes tries (#3201) * DigestItem::ChangesTrieSignal * introduce changes_trie::State * introduce config activation block * ChangesTrieSignal::as_new_configuration * moved well_known_cache_keys to client * extracted DbChangesTrieStorage to separate file * change meaning of none in blockchain cache * changes trie config (FULL) cache draft * eliminating const ChangesTrieConfiguration * delay pruning * continue elimination * do not prune CT config from cache * removed redundant code * fix some TODOs * introduce ConfigurationRange * use Configuration range in build * build skewed digest * remove debug print * extracted surface iterator * key_changes works with skewed digests * fix client build * add test for NeverPrune * fix TODO * fixed some TODOs * more tests * fixing TODOs * fixed compilation * update runtime version * git rid of large tuple * too long lines * config_activation_block -> zero * obsolete TODO * removed unjustified expect * update TODOs with issue number * new CT pruning algorithm fixed cache + multiple blocks finalization track CT configuraiton on light clients support CT configuration change revert revert CT config test new CT pruning algorithm fixed cache + multiple blocks finalization track CT configuraiton on light clients support CT configuration change revert revert CT config test * BlockIdOrHeader isn't really required * removed debug leftovers + some docs * more docs * more post-merge fixes * more post-merge fixes * revertes some unnecessary changes * reverted unnecessary changes * fix compilation + unnecessary changes * (restart CI) * fix cache update when finalizing multiple blocks * fixed tests * collect_extrinsics -> set_collect_extrinsics * restore lost test * do not calculate block number twice * Update primitives/blockchain/src/error.rs Co-Authored-By: cheme * map_err -> unwrap_or * document get_at Result * delete abandoned file * added weight for set_changes_trie_config * prefer_configs -> fail_if_disabled * Update client/api/src/backend.rs Co-Authored-By: cheme * Update client/db/src/changes_tries_storage.rs Co-Authored-By: cheme * CommitOperation+merge -> CommitOperations * fixed test compilation * merged two different CTRange structs * lost file * uggrade db from v0 to v1 (init CT cache + add column) * fix after merge Co-authored-by: cheme Co-authored-by: Gavin Wood --- Cargo.lock | 11 + client/api/src/backend.rs | 41 +- client/api/src/light.rs | 6 +- client/authority-discovery/src/tests.rs | 6 +- .../basic-authorship/src/basic_authorship.rs | 7 +- client/block-builder/src/lib.rs | 7 +- client/consensus/aura/src/lib.rs | 13 +- client/db/Cargo.toml | 2 + client/db/src/cache/list_cache.rs | 549 ++++++--- client/db/src/cache/list_storage.rs | 4 +- client/db/src/cache/mod.rs | 150 ++- client/db/src/changes_tries_storage.rs | 1015 +++++++++++++++++ client/db/src/lib.rs | 653 +++-------- client/db/src/light.rs | 73 +- client/db/src/upgrade.rs | 198 ++++ client/db/src/utils.rs | 88 +- client/finality-grandpa/src/tests.rs | 6 +- client/network/src/protocol/light_dispatch.rs | 8 +- client/rpc/src/state/tests.rs | 6 +- client/src/call_executor.rs | 15 +- client/src/client.rs | 304 +++-- client/src/genesis.rs | 20 +- client/src/in_mem.rs | 96 +- client/src/light/backend.rs | 24 +- client/src/light/call_executor.rs | 4 +- client/src/light/fetcher.rs | 81 +- frame/system/src/lib.rs | 23 +- .../api/proc-macro/src/impl_runtime_apis.rs | 11 +- primitives/api/src/lib.rs | 6 +- primitives/api/test/tests/runtime_calls.rs | 2 +- primitives/blockchain/src/backend.rs | 4 +- primitives/blockchain/src/error.rs | 3 + primitives/core/src/changes_trie.rs | 11 + primitives/core/src/lib.rs | 2 +- primitives/runtime/src/generic/digest.rs | 62 +- primitives/runtime/src/generic/mod.rs | 2 +- .../state-machine/src/changes_trie/build.rs | 10 +- .../state-machine/src/changes_trie/mod.rs | 86 +- .../state-machine/src/changes_trie/prune.rs | 249 +--- primitives/state-machine/src/ext.rs | 56 +- primitives/state-machine/src/lib.rs | 178 +-- .../state-machine/src/overlayed_changes.rs | 95 +- primitives/state-machine/src/testing.rs | 25 +- .../runtime/client/src/block_builder_ext.rs | 13 + test-utils/runtime/client/src/lib.rs | 13 +- test-utils/runtime/src/genesismap.rs | 7 +- test-utils/runtime/src/lib.rs | 13 +- test-utils/runtime/src/system.rs | 25 +- 48 files changed, 2739 insertions(+), 1544 deletions(-) create mode 100644 client/db/src/changes_tries_storage.rs create mode 100644 client/db/src/upgrade.rs diff --git a/Cargo.lock b/Cargo.lock index 7a4ae1beea..dd44111c15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5231,6 +5231,7 @@ dependencies = [ "sp-state-machine 0.8.0", "sp-trie 2.0.0", "substrate-test-runtime-client 2.0.0", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7075,6 +7076,15 @@ name = "target_info" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "tempdir" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tempfile" version = "3.1.0" @@ -8698,6 +8708,7 @@ dependencies = [ "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4" "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.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" "checksum test-case 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a605baa797821796a751f4a959e1206079b24a4b7e1ed302b7d785d81a9276c9" diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index 292031a4cb..a1bed27a27 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -18,11 +18,11 @@ use std::sync::Arc; use std::collections::HashMap; -use sp_core::ChangesTrieConfiguration; +use sp_core::ChangesTrieConfigurationRange; use sp_core::offchain::OffchainStorage; use sp_runtime::{generic::BlockId, Justification, Storage}; use sp_runtime::traits::{Block as BlockT, NumberFor, HasherFor}; -use sp_state_machine::{ChangesTrieStorage as StateChangesTrieStorage, ChangesTrieTransaction}; +use sp_state_machine::{ChangesTrieState, ChangesTrieStorage as StateChangesTrieStorage, ChangesTrieTransaction}; use crate::{ blockchain::{ Backend as BlockchainBackend, well_known_cache_keys @@ -248,8 +248,6 @@ pub trait Backend: AuxStore + Send + Sync { type Blockchain: BlockchainBackend; /// Associated state backend type. type State: StateBackend> + Send; - /// Changes trie storage. - type ChangesTrieStorage: PrunableStateChangesTrieStorage; /// Offchain workers local storage. type OffchainStorage: OffchainStorage; @@ -284,7 +282,7 @@ pub trait Backend: AuxStore + Send + Sync { fn usage_info(&self) -> Option; /// Returns reference to changes trie storage. - fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage>; + fn changes_trie_storage(&self) -> Option<&dyn PrunableStateChangesTrieStorage>; /// Returns a handle to offchain storage. fn offchain_storage(&self) -> Option; @@ -342,12 +340,16 @@ pub trait Backend: AuxStore + Send + Sync { pub trait PrunableStateChangesTrieStorage: StateChangesTrieStorage, NumberFor> { - /// Get number block of oldest, non-pruned changes trie. - fn oldest_changes_trie_block( - &self, - config: &ChangesTrieConfiguration, - best_finalized: NumberFor, - ) -> NumberFor; + /// Get reference to StateChangesTrieStorage. + fn storage(&self) -> &dyn StateChangesTrieStorage, NumberFor>; + /// Get configuration at given block. + fn configuration_at(&self, at: &BlockId) -> sp_blockchain::Result< + ChangesTrieConfigurationRange, Block::Hash> + >; + /// Get end block (inclusive) of oldest pruned max-level (or skewed) digest trie blocks range. + /// It is guaranteed that we have no any changes tries before (and including) this block. + /// It is guaranteed that all existing changes tries after this block are not yet pruned (if created). + fn oldest_pruned_digest_range_end(&self) -> NumberFor; } /// Mark for all Backend implementations, that are making use of state data, stored locally. @@ -364,3 +366,20 @@ pub trait RemoteBackend: Backend { /// locally, or prepares request to fetch that data from remote node. fn remote_blockchain(&self) -> Arc>; } + +/// Return changes tries state at given block. +pub fn changes_tries_state_at_block<'a, Block: BlockT>( + block: &BlockId, + maybe_storage: Option<&'a dyn PrunableStateChangesTrieStorage>, +) -> sp_blockchain::Result, NumberFor>>> { + let storage = match maybe_storage { + Some(storage) => storage, + None => return Ok(None), + }; + + let config_range = storage.configuration_at(block)?; + match config_range.config { + Some(config) => Ok(Some(ChangesTrieState::new(config, config_range.zero.0, storage.storage()))), + None => Ok(None), + } +} diff --git a/client/api/src/light.rs b/client/api/src/light.rs index fb3aeeab7c..fc9b6dc6fd 100644 --- a/client/api/src/light.rs +++ b/client/api/src/light.rs @@ -26,7 +26,7 @@ use sp_runtime::{ }, generic::BlockId }; -use sp_core::ChangesTrieConfiguration; +use sp_core::ChangesTrieConfigurationRange; use sp_state_machine::StorageProof; use sp_blockchain::{ HeaderMetadata, well_known_cache_keys, HeaderBackend, Cache as BlockchainCache, @@ -96,8 +96,8 @@ pub struct RemoteReadChildRequest { /// Remote key changes read request. #[derive(Clone, Debug, PartialEq, Eq)] pub struct RemoteChangesRequest { - /// Changes trie configuration. - pub changes_trie_config: ChangesTrieConfiguration, + /// All changes trie configurations that are valid within [first_block; last_block]. + pub changes_trie_configs: Vec>, /// Query changes from range of blocks, starting (and including) with this hash... pub first_block: (Header::Number, Header::Hash), /// ...ending (and including) with this hash. Should come after first_block and diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs index 07e1c943be..77ed6a1d94 100644 --- a/client/authority-discovery/src/tests.rs +++ b/client/authority-discovery/src/tests.rs @@ -212,12 +212,10 @@ impl ApiExt for RuntimeApi { unimplemented!("Not required for testing!") } - fn into_storage_changes< - T: sp_api::ChangesTrieStorage, sp_api::NumberFor> - >( + fn into_storage_changes( &self, _: &Self::StateBackend, - _: Option<&T>, + _: Option<&sp_api::ChangesTrieState, sp_api::NumberFor>>, _: ::Hash, ) -> std::result::Result, String> where Self: Sized diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index 576009ef27..d13000051a 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -374,9 +374,12 @@ mod tests { api.execute_block(&block_id, proposal.block).unwrap(); let state = backend.state_at(block_id).unwrap(); - let changes_trie_storage = backend.changes_trie_storage(); + let changes_trie_state = backend::changes_tries_state_at_block( + &block_id, + backend.changes_trie_storage(), + ).unwrap(); - let storage_changes = api.into_storage_changes(&state, changes_trie_storage, genesis_hash) + let storage_changes = api.into_storage_changes(&state, changes_trie_state.as_ref(), genesis_hash) .unwrap(); assert_eq!( diff --git a/client/block-builder/src/lib.rs b/client/block-builder/src/lib.rs index f59f88f5ba..9b403dead4 100644 --- a/client/block-builder/src/lib.rs +++ b/client/block-builder/src/lib.rs @@ -191,14 +191,17 @@ where let proof = self.api.extract_proof(); let state = self.backend.state_at(self.block_id)?; - let changes_trie_storage = self.backend.changes_trie_storage(); + let changes_trie_state = backend::changes_tries_state_at_block( + &self.block_id, + self.backend.changes_trie_storage(), + )?; let parent_hash = self.parent_hash; // The unsafe is required because the consume requires that we drop/consume the inner api // (what we do here). let storage_changes = self.api.into_storage_changes( &state, - changes_trie_storage, + changes_trie_state.as_ref(), parent_hash, ); diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 61568cea8b..95dc08afaf 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -675,19 +675,21 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusErro }; // check if we already have initialized the cache + let map_err = |error| sp_consensus::Error::from(sp_consensus::Error::ClientImport( + format!( + "Error initializing authorities cache: {}", + error, + ))); + let genesis_id = BlockId::Number(Zero::zero()); let genesis_authorities: Option> = cache .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) + .unwrap_or(None) .and_then(|(_, _, v)| Decode::decode(&mut &v[..]).ok()); if genesis_authorities.is_some() { return Ok(()); } - let map_err = |error| sp_consensus::Error::from(sp_consensus::Error::ClientImport( - format!( - "Error initializing authorities cache: {}", - error, - ))); let genesis_authorities = authorities(client, &genesis_id)?; cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_authorities.encode()) .map_err(map_err)?; @@ -706,6 +708,7 @@ fn authorities(client: &C, at: &BlockId) -> Result, Consensus .cache() .and_then(|cache| cache .get_at(&well_known_cache_keys::AUTHORITIES, at) + .unwrap_or(None) .and_then(|(_, _, v)| Decode::decode(&mut &v[..]).ok()) ) .or_else(|| AuraApi::authorities(&*client.runtime_api(), at).ok()) diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index 6b08d92db9..dcc7df29ca 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -31,6 +31,8 @@ sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } env_logger = "0.7.0" quickcheck = "0.9" +kvdb-rocksdb = "0.4" +tempdir = "0.3" [features] default = [] diff --git a/client/db/src/cache/list_cache.rs b/client/db/src/cache/list_cache.rs index 6345486f17..72278a1e85 100644 --- a/client/db/src/cache/list_cache.rs +++ b/client/db/src/cache/list_cache.rs @@ -94,6 +94,12 @@ pub enum CommitOperation { BlockReverted(BTreeMap>>), } +/// A set of commit operations. +#[derive(Debug)] +pub struct CommitOperations { + operations: Vec>, +} + /// Single fork of list-based cache. #[derive(Debug)] #[cfg_attr(test, derive(PartialEq))] @@ -123,21 +129,17 @@ impl> ListCache storage: S, pruning_strategy: PruningStrategy>, best_finalized_block: ComplexBlockId, - ) -> Self { + ) -> ClientResult { let (best_finalized_entry, unfinalized) = storage.read_meta() - .and_then(|meta| read_forks(&storage, meta)) - .unwrap_or_else(|error| { - warn!(target: "db", "Unable to initialize list cache: {}. Restarting", error); - (None, Vec::new()) - }); + .and_then(|meta| read_forks(&storage, meta))?; - ListCache { + Ok(ListCache { storage, pruning_strategy, best_finalized_block, best_finalized_entry, unfinalized, - } + }) } /// Get reference to the storage. @@ -145,6 +147,12 @@ impl> ListCache &self.storage } + /// Get unfinalized forks reference. + #[cfg(test)] + pub fn unfinalized(&self) -> &[Fork] { + &self.unfinalized + } + /// Get value valid at block. pub fn value_at_block( &self, @@ -156,8 +164,8 @@ 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, Bounded::max_value())? { - return Ok(None); + if !chain::is_finalized_block(&self.storage, &at, Bounded::max_value())? { + return Err(ClientError::NotInFinalizedChain); } self.best_finalized_entry.as_ref() @@ -171,11 +179,14 @@ impl> ListCache // IF there's no matching fork, ensure that this isn't a block from a fork that has forked // behind the best finalized block and search at finalized fork - match self.find_unfinalized_fork(at)? { + match self.find_unfinalized_fork(&at)? { Some(fork) => Some(&fork.head), None => match self.best_finalized_entry.as_ref() { - Some(best_finalized_entry) if chain::is_connected_to_block(&self.storage, &best_finalized_entry.valid_from, at)? => - Some(best_finalized_entry), + Some(best_finalized_entry) if chain::is_connected_to_block( + &self.storage, + &at, + &best_finalized_entry.valid_from, + )? => Some(best_finalized_entry), _ => None, }, } @@ -198,9 +209,98 @@ impl> ListCache block: ComplexBlockId, value: Option, entry_type: EntryType, + operations: &mut CommitOperations, + ) -> ClientResult<()> { + Ok(operations.append(self.do_on_block_insert(tx, parent, block, value, entry_type, operations)?)) + } + + /// When previously inserted block is finalized. + pub fn on_block_finalize>( + &self, + tx: &mut Tx, + parent: ComplexBlockId, + block: ComplexBlockId, + operations: &mut CommitOperations, + ) -> ClientResult<()> { + Ok(operations.append(self.do_on_block_finalize(tx, parent, block, operations)?)) + } + + /// When block is reverted. + pub fn on_block_revert>( + &self, + tx: &mut Tx, + reverted_block: &ComplexBlockId, + operations: &mut CommitOperations, + ) -> ClientResult<()> { + Ok(operations.append(Some(self.do_on_block_revert(tx, reverted_block)?))) + } + + /// When transaction is committed. + pub fn on_transaction_commit(&mut self, ops: CommitOperations) { + for op in ops.operations { + match op { + CommitOperation::AppendNewBlock(index, best_block) => { + let mut fork = self.unfinalized.get_mut(index) + .expect("ListCache is a crate-private type; + internal clients of ListCache are committing transaction while cache is locked; + CommitOperation holds valid references while cache is locked; qed"); + fork.best_block = Some(best_block); + }, + CommitOperation::AppendNewEntry(index, entry) => { + let mut fork = self.unfinalized.get_mut(index) + .expect("ListCache is a crate-private type; + internal clients of ListCache are committing transaction while cache is locked; + CommitOperation holds valid references while cache is locked; qed"); + fork.best_block = Some(entry.valid_from.clone()); + fork.head = entry; + }, + CommitOperation::AddNewFork(entry) => { + self.unfinalized.push(Fork { + best_block: Some(entry.valid_from.clone()), + head: entry, + }); + }, + CommitOperation::BlockFinalized(block, finalizing_entry, forks) => { + self.best_finalized_block = block; + if let Some(finalizing_entry) = finalizing_entry { + self.best_finalized_entry = Some(finalizing_entry); + } + for fork_index in forks.iter().rev() { + self.unfinalized.remove(*fork_index); + } + }, + CommitOperation::BlockReverted(forks) => { + for (fork_index, updated_fork) in forks.into_iter().rev() { + match updated_fork { + Some(updated_fork) => self.unfinalized[fork_index] = updated_fork, + None => { self.unfinalized.remove(fork_index); }, + } + } + }, + } + } + } + + fn do_on_block_insert>( + &self, + tx: &mut Tx, + parent: ComplexBlockId, + block: ComplexBlockId, + value: Option, + entry_type: EntryType, + operations: &CommitOperations, ) -> ClientResult>> { // this guarantee is currently provided by LightStorage && we're relying on it here - debug_assert!(entry_type != EntryType::Final || self.best_finalized_block.hash == parent.hash); + let prev_operation = operations.operations.last(); + debug_assert!( + entry_type != EntryType::Final || + self.best_finalized_block.hash == parent.hash || + match prev_operation { + Some(&CommitOperation::BlockFinalized(ref best_finalized_block, _, _)) + => best_finalized_block.hash == parent.hash, + _ => false, + } + ); // we do not store any values behind finalized if block.number != Zero::zero() && self.best_finalized_block.number >= block.number { @@ -296,7 +396,7 @@ impl> ListCache } // cleanup database from abandoned unfinalized forks and obsolete finalized entries - let abandoned_forks = self.destroy_abandoned_forks(tx, &block); + let abandoned_forks = self.destroy_abandoned_forks(tx, &block, prev_operation); self.prune_finalized_entries(tx, &block); match new_storage_entry { @@ -310,34 +410,39 @@ impl> ListCache } } - /// When previously inserted block is finalized. - pub fn on_block_finalize>( + fn do_on_block_finalize>( &self, tx: &mut Tx, parent: ComplexBlockId, block: ComplexBlockId, + operations: &CommitOperations, ) -> ClientResult>> { - // this guarantee is currently provided by LightStorage && we're relying on it here - debug_assert_eq!(self.best_finalized_block.hash, parent.hash); + // this guarantee is currently provided by db backend && we're relying on it here + let prev_operation = operations.operations.last(); + debug_assert!( + self.best_finalized_block.hash == parent.hash || + match prev_operation { + Some(&CommitOperation::BlockFinalized(ref best_finalized_block, _, _)) + => best_finalized_block.hash == parent.hash, + _ => false, + } + ); // there could be at most one entry that is finalizing let finalizing_entry = self.storage.read_entry(&block)? .map(|entry| entry.into_entry(block.clone())); // cleanup database from abandoned unfinalized forks and obsolete finalized entries - let abandoned_forks = self.destroy_abandoned_forks(tx, &block); + let abandoned_forks = self.destroy_abandoned_forks(tx, &block, prev_operation); self.prune_finalized_entries(tx, &block); - let update_meta = finalizing_entry.is_some(); let operation = CommitOperation::BlockFinalized(block, finalizing_entry, abandoned_forks); - if update_meta { - tx.update_meta(self.best_finalized_entry.as_ref(), &self.unfinalized, &operation); - } + tx.update_meta(self.best_finalized_entry.as_ref(), &self.unfinalized, &operation); + Ok(Some(operation)) } - /// When block is reverted. - pub fn on_block_revert>( + fn do_on_block_revert>( &self, tx: &mut Tx, reverted_block: &ComplexBlockId, @@ -374,50 +479,6 @@ impl> ListCache Ok(operation) } - /// When transaction is committed. - pub fn on_transaction_commit(&mut self, op: CommitOperation) { - match op { - CommitOperation::AppendNewBlock(index, best_block) => { - let mut fork = self.unfinalized.get_mut(index) - .expect("ListCache is a crate-private type; - internal clients of ListCache are committing transaction while cache is locked; - CommitOperation holds valid references while cache is locked; qed"); - fork.best_block = Some(best_block); - }, - CommitOperation::AppendNewEntry(index, entry) => { - let mut fork = self.unfinalized.get_mut(index) - .expect("ListCache is a crate-private type; - internal clients of ListCache are committing transaction while cache is locked; - CommitOperation holds valid references while cache is locked; qed"); - fork.best_block = Some(entry.valid_from.clone()); - fork.head = entry; - }, - CommitOperation::AddNewFork(entry) => { - self.unfinalized.push(Fork { - best_block: Some(entry.valid_from.clone()), - head: entry, - }); - }, - CommitOperation::BlockFinalized(block, finalizing_entry, forks) => { - self.best_finalized_block = block; - if let Some(finalizing_entry) = finalizing_entry { - self.best_finalized_entry = Some(finalizing_entry); - } - for fork_index in forks.iter().rev() { - self.unfinalized.remove(*fork_index); - } - }, - CommitOperation::BlockReverted(forks) => { - for (fork_index, updated_fork) in forks.into_iter().rev() { - match updated_fork { - Some(updated_fork) => self.unfinalized[fork_index] = updated_fork, - None => { self.unfinalized.remove(fork_index); }, - } - } - }, - } - } - /// Prune old finalized entries. fn prune_finalized_entries>( &self, @@ -475,10 +536,22 @@ impl> ListCache fn destroy_abandoned_forks>( &self, tx: &mut Tx, - block: &ComplexBlockId + block: &ComplexBlockId, + prev_operation: Option<&CommitOperation>, ) -> BTreeSet { - let mut destroyed = BTreeSet::new(); - for (index, fork) in self.unfinalized.iter().enumerate() { + // if some block has been finalized already => take it into account + let prev_abandoned_forks = match prev_operation { + Some(&CommitOperation::BlockFinalized(_, _, ref abandoned_forks)) => Some(abandoned_forks), + _ => None, + }; + + let mut destroyed = prev_abandoned_forks.cloned().unwrap_or_else(|| BTreeSet::new()); + let live_unfinalized = self.unfinalized.iter() + .enumerate() + .filter(|(idx, _)| prev_abandoned_forks + .map(|prev_abandoned_forks| !prev_abandoned_forks.contains(idx)) + .unwrap_or(true)); + for (index, fork) in live_unfinalized { if fork.head.valid_from.number == block.number { destroyed.insert(index); if fork.head.valid_from.hash != block.hash { @@ -493,7 +566,10 @@ impl> ListCache } /// Search unfinalized fork where given block belongs. - fn find_unfinalized_fork(&self, block: &ComplexBlockId) -> ClientResult>> { + fn find_unfinalized_fork( + &self, + block: &ComplexBlockId, + ) -> ClientResult>> { for unfinalized in &self.unfinalized { if unfinalized.matches(&self.storage, block)? { return Ok(Some(&unfinalized)); @@ -549,7 +625,7 @@ impl Fork { }; // check if the parent is connected to the beginning of the range - if !chain::is_connected_to_block(storage, &parent, &begin)? { + if !chain::is_connected_to_block(storage, parent, &begin)? { return Ok(None); } @@ -621,6 +697,65 @@ impl Fork { } } +impl Default for CommitOperations { + fn default() -> Self { + CommitOperations { operations: Vec::new() } + } +} + +// This should never be allowed for non-test code to avoid revealing its internals. +#[cfg(test)] +impl From>> for CommitOperations { + fn from(operations: Vec>) -> Self { + CommitOperations { operations } + } +} + +impl CommitOperations { + /// Append operation to the set. + fn append(&mut self, new_operation: Option>) { + let new_operation = match new_operation { + Some(new_operation) => new_operation, + None => return, + }; + + let last_operation = match self.operations.pop() { + Some(last_operation) => last_operation, + None => { + self.operations.push(new_operation); + return; + }, + }; + + // we are able (and obliged to) to merge two consequent block finalization operations + match last_operation { + CommitOperation::BlockFinalized(old_finalized_block, old_finalized_entry, old_abandoned_forks) => { + match new_operation { + CommitOperation::BlockFinalized(new_finalized_block, new_finalized_entry, new_abandoned_forks) => { + self.operations.push(CommitOperation::BlockFinalized( + new_finalized_block, + new_finalized_entry, + new_abandoned_forks, + )); + }, + _ => { + self.operations.push(CommitOperation::BlockFinalized( + old_finalized_block, + old_finalized_entry, + old_abandoned_forks, + )); + self.operations.push(new_operation); + }, + } + }, + _ => { + self.operations.push(last_operation); + self.operations.push(new_operation); + }, + } + } +} + /// Destroy fork by deleting all unfinalized entries. pub fn destroy_fork, Tx: StorageTransaction>( head_valid_from: ComplexBlockId, @@ -674,7 +809,7 @@ mod chain { block1: &ComplexBlockId, block2: &ComplexBlockId, ) -> ClientResult { - let (begin, end) = if block1 > block2 { (block2, block1) } else { (block1, block2) }; + let (begin, end) = if *block1 > *block2 { (block2, block1) } else { (block1, block2) }; let mut current = storage.read_header(&end.hash)? .ok_or_else(|| ClientError::UnknownBlock(format!("{}", end.hash)))?; while *current.number() > begin.number { @@ -773,8 +908,8 @@ pub mod tests { // when block is earlier than best finalized block AND it is not finalized // --- 50 --- // ----------> [100] - assert_eq!(ListCache::<_, u64, _>::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), test_id(100)) - .value_at_block(&test_id(50)).unwrap(), None); + assert!(ListCache::<_, u64, _>::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), test_id(100)) + .unwrap().value_at_block(&test_id(50)).is_err()); // when block is earlier than best finalized block AND it is finalized AND value is some // [30] ---- 50 ---> [100] assert_eq!(ListCache::new( @@ -784,7 +919,7 @@ pub mod tests { .with_entry(test_id(100), StorageEntry { prev_valid_from: Some(test_id(30)), value: 100 }) .with_entry(test_id(30), StorageEntry { prev_valid_from: None, value: 30 }), PruningStrategy::ByDepth(1024), test_id(100) - ).value_at_block(&test_id(50)).unwrap(), Some((test_id(30), Some(test_id(100)), 30))); + ).unwrap().value_at_block(&test_id(50)).unwrap(), Some((test_id(30), Some(test_id(100)), 30))); // when block is the best finalized block AND value is some // ---> [100] assert_eq!(ListCache::new( @@ -794,18 +929,18 @@ pub mod tests { .with_entry(test_id(100), StorageEntry { prev_valid_from: Some(test_id(30)), value: 100 }) .with_entry(test_id(30), StorageEntry { prev_valid_from: None, value: 30 }), PruningStrategy::ByDepth(1024), test_id(100) - ).value_at_block(&test_id(100)).unwrap(), Some((test_id(100), None, 100))); + ).unwrap().value_at_block(&test_id(100)).unwrap(), Some((test_id(100), None, 100))); // when block is parallel to the best finalized block // ---- 100 // ---> [100] - assert_eq!(ListCache::new( + assert!(ListCache::new( DummyStorage::new() .with_meta(Some(test_id(100)), Vec::new()) .with_id(50, H256::from_low_u64_be(50)) .with_entry(test_id(100), StorageEntry { prev_valid_from: Some(test_id(30)), value: 100 }) .with_entry(test_id(30), StorageEntry { prev_valid_from: None, value: 30 }), PruningStrategy::ByDepth(1024), test_id(100) - ).value_at_block(&ComplexBlockId::new(H256::from_low_u64_be(2), 100)).unwrap(), None); + ).unwrap().value_at_block(&ComplexBlockId::new(H256::from_low_u64_be(2), 100)).is_err()); // when block is later than last finalized block AND there are no forks AND finalized value is Some // ---> [100] --- 200 @@ -815,7 +950,7 @@ pub mod tests { .with_id(50, H256::from_low_u64_be(50)) .with_entry(test_id(100), StorageEntry { prev_valid_from: Some(test_id(30)), value: 100 }), PruningStrategy::ByDepth(1024), test_id(100) - ).value_at_block(&test_id(200)).unwrap(), Some((test_id(100), None, 100))); + ).unwrap().value_at_block(&test_id(200)).unwrap(), Some((test_id(100), None, 100))); // when block is later than last finalized block AND there are no matching forks // AND block is connected to finalized block AND finalized value is Some @@ -831,7 +966,7 @@ pub mod tests { .with_header(test_header(4)) .with_header(fork_header(0, 2, 3)), PruningStrategy::ByDepth(1024), test_id(2) - ).value_at_block(&fork_id(0, 2, 3)).unwrap(), Some((correct_id(2), None, 2))); + ).unwrap().value_at_block(&fork_id(0, 2, 3)).unwrap(), Some((correct_id(2), None, 2))); // when block is later than last finalized block AND there are no matching forks // AND block is not connected to finalized block // --- 2 --- 3 @@ -848,7 +983,7 @@ pub mod tests { .with_header(fork_header(0, 1, 3)) .with_header(fork_header(0, 1, 2)), PruningStrategy::ByDepth(1024), test_id(2) - ).value_at_block(&fork_id(0, 1, 3)).unwrap(), None); + ).unwrap().value_at_block(&fork_id(0, 1, 3)).unwrap(), None); // when block is later than last finalized block AND it appends to unfinalized fork from the end // AND unfinalized value is Some @@ -861,7 +996,7 @@ pub mod tests { .with_header(test_header(4)) .with_header(test_header(5)), PruningStrategy::ByDepth(1024), test_id(2) - ).value_at_block(&correct_id(5)).unwrap(), Some((correct_id(4), None, 4))); + ).unwrap().value_at_block(&correct_id(5)).unwrap(), Some((correct_id(4), None, 4))); // when block is later than last finalized block AND it does not fits unfinalized fork // AND it is connected to the finalized block AND finalized value is Some // ---> [2] ----------> [4] @@ -876,7 +1011,7 @@ pub mod tests { .with_header(test_header(4)) .with_header(fork_header(0, 2, 3)), PruningStrategy::ByDepth(1024), test_id(2) - ).value_at_block(&fork_id(0, 2, 3)).unwrap(), Some((correct_id(2), None, 2))); + ).unwrap().value_at_block(&fork_id(0, 2, 3)).unwrap(), Some((correct_id(2), None, 2))); } #[test] @@ -885,22 +1020,25 @@ pub mod tests { let fin = EntryType::Final; // when trying to insert block < finalized number - assert!(ListCache::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), test_id(100)) - .on_block_insert( + let mut ops = Default::default(); + assert!(ListCache::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), test_id(100)).unwrap() + .do_on_block_insert( &mut DummyTransaction::new(), test_id(49), test_id(50), Some(50), nfin, + &mut ops, ).unwrap().is_none()); // when trying to insert block @ finalized number - assert!(ListCache::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), test_id(100)) - .on_block_insert( + assert!(ListCache::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), test_id(100)).unwrap() + .do_on_block_insert( &mut DummyTransaction::new(), test_id(99), test_id(100), Some(100), nfin, + &Default::default(), ).unwrap().is_none()); // when trying to insert non-final block AND it appends to the best block of unfinalized fork @@ -910,19 +1048,23 @@ pub mod tests { .with_meta(None, vec![test_id(4)]) .with_entry(test_id(4), StorageEntry { prev_valid_from: None, value: 4 }), PruningStrategy::ByDepth(1024), test_id(2) - ); + ).unwrap(); cache.unfinalized[0].best_block = Some(test_id(4)); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), nfin).unwrap(), - Some(CommitOperation::AppendNewBlock(0, test_id(5)))); + assert_eq!( + cache.do_on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), nfin, &Default::default()).unwrap(), + Some(CommitOperation::AppendNewBlock(0, test_id(5))), + ); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); // when trying to insert non-final block AND it appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), nfin).unwrap(), - Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: test_id(5), value: 5 }))); + assert_eq!( + cache.do_on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), nfin, &Default::default()).unwrap(), + Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: test_id(5), value: 5 })), + ); assert_eq!(*tx.inserted_entries(), vec![test_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); assert_eq!(*tx.updated_meta(), Some(Metadata { finalized: None, unfinalized: vec![test_id(5)] })); @@ -935,18 +1077,36 @@ pub mod tests { .with_entry(correct_id(4), StorageEntry { prev_valid_from: None, value: 4 }) .with_header(test_header(4)), PruningStrategy::ByDepth(1024), test_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(4), nfin).unwrap(), - Some(CommitOperation::AppendNewBlock(0, correct_id(5)))); + assert_eq!( + cache.do_on_block_insert( + &mut tx, + correct_id(4), + correct_id(5), + Some(4), + nfin, + &Default::default(), + ).unwrap(), + Some(CommitOperation::AppendNewBlock(0, correct_id(5))), + ); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); // when trying to insert non-final block AND it is the first block that appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(5), nfin).unwrap(), - Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(5), value: 5 }))); + assert_eq!( + cache.do_on_block_insert( + &mut tx, + correct_id(4), + correct_id(5), + Some(5), + nfin, + &Default::default(), + ).unwrap(), + Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(5), value: 5 })), + ); assert_eq!(*tx.inserted_entries(), vec![correct_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); assert_eq!(*tx.updated_meta(), Some(Metadata { finalized: None, unfinalized: vec![correct_id(5)] })); @@ -961,10 +1121,13 @@ pub mod tests { .with_header(test_header(3)) .with_header(test_header(4)), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), nfin).unwrap(), - Some(CommitOperation::AddNewFork(Entry { valid_from: fork_id(0, 3, 4), value: 14 }))); + assert_eq!( + cache.do_on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), nfin, &Default::default()) + .unwrap(), + Some(CommitOperation::AddNewFork(Entry { valid_from: fork_id(0, 3, 4), value: 14 })), + ); assert_eq!(*tx.inserted_entries(), vec![fork_id(0, 3, 4).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); assert_eq!(*tx.updated_meta(), Some(Metadata { finalized: Some(correct_id(2)), unfinalized: vec![correct_id(4), fork_id(0, 3, 4)] })); @@ -976,9 +1139,13 @@ pub mod tests { .with_meta(Some(correct_id(2)), vec![]) .with_entry(correct_id(2), StorageEntry { prev_valid_from: None, value: 2 }), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), nfin).unwrap(), None); + assert_eq!( + cache.do_on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), nfin, &Default::default()) + .unwrap(), + None, + ); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); @@ -989,19 +1156,23 @@ pub mod tests { .with_meta(Some(correct_id(2)), vec![]) .with_entry(correct_id(2), StorageEntry { prev_valid_from: None, value: 2 }), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), nfin).unwrap(), - Some(CommitOperation::AddNewFork(Entry { valid_from: correct_id(3), value: 3 }))); + assert_eq!( + cache.do_on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), nfin, &Default::default()) + .unwrap(), + Some(CommitOperation::AddNewFork(Entry { valid_from: correct_id(3), value: 3 })), + ); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); assert_eq!(*tx.updated_meta(), Some(Metadata { finalized: Some(correct_id(2)), unfinalized: vec![correct_id(3)] })); // when inserting finalized entry AND there are no previous finalized entries - let cache = ListCache::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), correct_id(2)); + let cache = ListCache::new(DummyStorage::new(), PruningStrategy::ByDepth(1024), correct_id(2)).unwrap(); let mut tx = DummyTransaction::new(); assert_eq!( - cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), + cache.do_on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin, &Default::default()) + .unwrap(), Some(CommitOperation::BlockFinalized( correct_id(3), Some(Entry { valid_from: correct_id(3), value: 3 }), @@ -1017,17 +1188,19 @@ pub mod tests { .with_meta(Some(correct_id(2)), vec![]) .with_entry(correct_id(2), StorageEntry { prev_valid_from: None, value: 2 }), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), - Some(CommitOperation::BlockFinalized(correct_id(3), None, Default::default()))); + assert_eq!( + cache.do_on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin, &Default::default()).unwrap(), + Some(CommitOperation::BlockFinalized(correct_id(3), None, Default::default())), + ); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); // when inserting finalized entry AND value differs from previous finalized let mut tx = DummyTransaction::new(); assert_eq!( - cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), + cache.do_on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin, &Default::default()).unwrap(), Some(CommitOperation::BlockFinalized( correct_id(3), Some(Entry { valid_from: correct_id(3), value: 3 }), @@ -1045,10 +1218,12 @@ pub mod tests { .with_entry(correct_id(2), StorageEntry { prev_valid_from: None, value: 2 }) .with_entry(fork_id(0, 1, 3), StorageEntry { prev_valid_from: None, value: 13 }), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), - Some(CommitOperation::BlockFinalized(correct_id(3), None, vec![0].into_iter().collect()))); + assert_eq!( + cache.do_on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin, &Default::default()).unwrap(), + Some(CommitOperation::BlockFinalized(correct_id(3), None, vec![0].into_iter().collect())), + ); } #[test] @@ -1060,13 +1235,18 @@ pub mod tests { .with_entry(correct_id(2), StorageEntry { prev_valid_from: None, value: 2 }) .with_entry(correct_id(5), StorageEntry { prev_valid_from: Some(correct_id(2)), value: 5 }), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_finalize(&mut tx, correct_id(2), correct_id(3)).unwrap(), - Some(CommitOperation::BlockFinalized(correct_id(3), None, Default::default()))); + assert_eq!( + cache.do_on_block_finalize(&mut tx, correct_id(2), correct_id(3), &Default::default()).unwrap(), + Some(CommitOperation::BlockFinalized(correct_id(3), None, Default::default())), + ); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); - assert!(tx.updated_meta().is_none()); + assert_eq!( + *tx.updated_meta(), + Some(Metadata { finalized: Some(correct_id(2)), unfinalized: vec![correct_id(5)] }), + ); // finalization finalizes entry let cache = ListCache::new( DummyStorage::new() @@ -1074,10 +1254,10 @@ pub mod tests { .with_entry(correct_id(2), StorageEntry { prev_valid_from: None, value: 2 }) .with_entry(correct_id(5), StorageEntry { prev_valid_from: Some(correct_id(2)), value: 5 }), PruningStrategy::ByDepth(1024), correct_id(4) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); assert_eq!( - cache.on_block_finalize(&mut tx, correct_id(4), correct_id(5)).unwrap(), + cache.do_on_block_finalize(&mut tx, correct_id(4), correct_id(5), &Default::default()).unwrap(), Some(CommitOperation::BlockFinalized( correct_id(5), Some(Entry { valid_from: correct_id(5), value: 5 }), @@ -1094,10 +1274,12 @@ pub mod tests { .with_entry(correct_id(2), StorageEntry { prev_valid_from: None, value: 2 }) .with_entry(fork_id(0, 1, 3), StorageEntry { prev_valid_from: None, value: 13 }), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_finalize(&mut tx, correct_id(2), correct_id(3)).unwrap(), - Some(CommitOperation::BlockFinalized(correct_id(3), None, vec![0].into_iter().collect()))); + assert_eq!( + cache.do_on_block_finalize(&mut tx, correct_id(2), correct_id(3), &Default::default()).unwrap(), + Some(CommitOperation::BlockFinalized(correct_id(3), None, vec![0].into_iter().collect())), + ); } #[test] @@ -1109,25 +1291,29 @@ pub mod tests { .with_entry(correct_id(5), StorageEntry { prev_valid_from: Some(correct_id(2)), value: 5 }) .with_entry(correct_id(6), StorageEntry { prev_valid_from: Some(correct_id(5)), value: 6 }), PruningStrategy::ByDepth(1024), correct_id(2) - ); + ).unwrap(); // when new block is appended to unfinalized fork - cache.on_transaction_commit(CommitOperation::AppendNewBlock(0, correct_id(6))); + cache.on_transaction_commit(vec![CommitOperation::AppendNewBlock(0, correct_id(6))].into()); assert_eq!(cache.unfinalized[0].best_block, Some(correct_id(6))); // when new entry is appended to unfinalized fork - cache.on_transaction_commit(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(7), value: 7 })); + cache.on_transaction_commit(vec![ + CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(7), value: 7 }), + ].into()); assert_eq!(cache.unfinalized[0].best_block, Some(correct_id(7))); assert_eq!(cache.unfinalized[0].head, Entry { valid_from: correct_id(7), value: 7 }); // when new fork is added - cache.on_transaction_commit(CommitOperation::AddNewFork(Entry { valid_from: correct_id(10), value: 10 })); + cache.on_transaction_commit(vec![ + CommitOperation::AddNewFork(Entry { valid_from: correct_id(10), value: 10 }), + ].into()); assert_eq!(cache.unfinalized[2].best_block, Some(correct_id(10))); assert_eq!(cache.unfinalized[2].head, Entry { valid_from: correct_id(10), value: 10 }); // when block is finalized + entry is finalized + unfinalized forks are deleted - cache.on_transaction_commit(CommitOperation::BlockFinalized( + cache.on_transaction_commit(vec![CommitOperation::BlockFinalized( correct_id(20), Some(Entry { valid_from: correct_id(20), value: 20 }), vec![0, 1, 2].into_iter().collect(), - )); + )].into()); assert_eq!(cache.best_finalized_block, correct_id(20)); assert_eq!(cache.best_finalized_entry, Some(Entry { valid_from: correct_id(20), value: 20 })); assert!(cache.unfinalized.is_empty()); @@ -1148,7 +1334,7 @@ pub mod tests { .with_header(test_header(4)) .with_header(test_header(5)), PruningStrategy::ByDepth(1024), correct_id(0) - ).find_unfinalized_fork(&correct_id(4)).unwrap().unwrap().head.valid_from, correct_id(5)); + ).unwrap().find_unfinalized_fork((&correct_id(4)).into()).unwrap().unwrap().head.valid_from, correct_id(5)); // --- [2] ---------------> [5] // ----------> [3] ---> 4 assert_eq!(ListCache::new( @@ -1165,7 +1351,8 @@ pub mod tests { .with_header(fork_header(0, 1, 3)) .with_header(fork_header(0, 1, 4)), PruningStrategy::ByDepth(1024), correct_id(0) - ).find_unfinalized_fork(&fork_id(0, 1, 4)).unwrap().unwrap().head.valid_from, fork_id(0, 1, 3)); + ).unwrap() + .find_unfinalized_fork((&fork_id(0, 1, 4)).into()).unwrap().unwrap().head.valid_from, fork_id(0, 1, 3)); // --- [2] ---------------> [5] // ----------> [3] // -----------------> 4 @@ -1185,7 +1372,7 @@ pub mod tests { .with_header(fork_header(1, 1, 3)) .with_header(fork_header(1, 1, 4)), PruningStrategy::ByDepth(1024), correct_id(0) - ).find_unfinalized_fork(&fork_id(1, 1, 4)).unwrap().is_none()); + ).unwrap().find_unfinalized_fork((&fork_id(1, 1, 4)).into()).unwrap().is_none()); } #[test] @@ -1195,7 +1382,7 @@ pub mod tests { .with_entry(test_id(100), StorageEntry { prev_valid_from: Some(test_id(50)), value: 100 }) .with_entry(test_id(50), StorageEntry { prev_valid_from: None, value: 50 }); assert_eq!(Fork::<_, u64> { best_block: None, head: Entry { valid_from: test_id(100), value: 0 } } - .matches(&storage, &test_id(20)).unwrap(), false); + .matches(&storage, (&test_id(20)).into()).unwrap(), false); // when block is not connected to the begin block let storage = DummyStorage::new() .with_entry(correct_id(5), StorageEntry { prev_valid_from: Some(correct_id(3)), value: 100 }) @@ -1206,7 +1393,7 @@ pub mod tests { .with_header(fork_header(0, 2, 4)) .with_header(fork_header(0, 2, 3)); assert_eq!(Fork::<_, u64> { best_block: None, head: Entry { valid_from: correct_id(5), value: 100 } } - .matches(&storage, &fork_id(0, 2, 4)).unwrap(), false); + .matches(&storage, (&fork_id(0, 2, 4)).into()).unwrap(), false); // when block is not connected to the end block let storage = DummyStorage::new() .with_entry(correct_id(5), StorageEntry { prev_valid_from: Some(correct_id(3)), value: 100 }) @@ -1216,14 +1403,14 @@ pub mod tests { .with_header(test_header(3)) .with_header(fork_header(0, 3, 4)); assert_eq!(Fork::<_, u64> { best_block: None, head: Entry { valid_from: correct_id(5), value: 100 } } - .matches(&storage, &fork_id(0, 3, 4)).unwrap(), false); + .matches(&storage, (&fork_id(0, 3, 4)).into()).unwrap(), false); // when block is connected to the begin block AND end is open let storage = DummyStorage::new() .with_entry(correct_id(5), StorageEntry { prev_valid_from: None, value: 100 }) .with_header(test_header(5)) .with_header(test_header(6)); assert_eq!(Fork::<_, u64> { best_block: None, head: Entry { valid_from: correct_id(5), value: 100 } } - .matches(&storage, &correct_id(6)).unwrap(), true); + .matches(&storage, (&correct_id(6)).into()).unwrap(), true); // when block is connected to the begin block AND to the end block let storage = DummyStorage::new() .with_entry(correct_id(5), StorageEntry { prev_valid_from: Some(correct_id(3)), value: 100 }) @@ -1232,7 +1419,7 @@ pub mod tests { .with_header(test_header(4)) .with_header(test_header(3)); assert_eq!(Fork::<_, u64> { best_block: None, head: Entry { valid_from: correct_id(5), value: 100 } } - .matches(&storage, &correct_id(4)).unwrap(), true); + .matches(&storage, (&correct_id(4)).into()).unwrap(), true); } #[test] @@ -1338,9 +1525,21 @@ pub mod tests { #[test] fn is_connected_to_block_fails() { // when storage returns error - assert!(chain::is_connected_to_block::<_, u64, _>(&FaultyStorage, &test_id(1), &test_id(100)).is_err()); + assert!( + chain::is_connected_to_block::<_, u64, _>( + &FaultyStorage, + (&test_id(1)).into(), + &test_id(100), + ).is_err(), + ); // when there's no header in the storage - assert!(chain::is_connected_to_block::<_, u64, _>(&DummyStorage::new(), &test_id(1), &test_id(100)).is_err()); + assert!( + chain::is_connected_to_block::<_, u64, _>( + &DummyStorage::new(), + (&test_id(1)).into(), + &test_id(100), + ).is_err(), + ); } #[test] @@ -1348,35 +1547,35 @@ pub mod tests { // when without iterations we end up with different block assert_eq!(chain::is_connected_to_block::<_, u64, _>(&DummyStorage::new() .with_header(test_header(1)), - &test_id(1), &correct_id(1)).unwrap(), false); + (&test_id(1)).into(), &correct_id(1)).unwrap(), false); // when with ASC iterations we end up with different block assert_eq!(chain::is_connected_to_block::<_, u64, _>(&DummyStorage::new() .with_header(test_header(0)) .with_header(test_header(1)) .with_header(test_header(2)), - &test_id(0), &correct_id(2)).unwrap(), false); + (&test_id(0)).into(), &correct_id(2)).unwrap(), false); // when with DESC iterations we end up with different block assert_eq!(chain::is_connected_to_block::<_, u64, _>(&DummyStorage::new() .with_header(test_header(0)) .with_header(test_header(1)) .with_header(test_header(2)), - &correct_id(2), &test_id(0)).unwrap(), false); + (&correct_id(2)).into(), &test_id(0)).unwrap(), false); // when without iterations we end up with the same block assert_eq!(chain::is_connected_to_block::<_, u64, _>(&DummyStorage::new() .with_header(test_header(1)), - &correct_id(1), &correct_id(1)).unwrap(), true); + (&correct_id(1)).into(), &correct_id(1)).unwrap(), true); // when with ASC iterations we end up with the same block assert_eq!(chain::is_connected_to_block::<_, u64, _>(&DummyStorage::new() .with_header(test_header(0)) .with_header(test_header(1)) .with_header(test_header(2)), - &correct_id(0), &correct_id(2)).unwrap(), true); + (&correct_id(0)).into(), &correct_id(2)).unwrap(), true); // when with DESC iterations we end up with the same block assert_eq!(chain::is_connected_to_block::<_, u64, _>(&DummyStorage::new() .with_header(test_header(0)) .with_header(test_header(1)) .with_header(test_header(2)), - &correct_id(2), &correct_id(0)).unwrap(), true); + (&correct_id(2)).into(), &correct_id(0)).unwrap(), true); } #[test] @@ -1454,7 +1653,7 @@ pub mod tests { .with_entry(test_id(10), StorageEntry { prev_valid_from: None, value: 10 }) .with_entry(test_id(20), StorageEntry { prev_valid_from: Some(test_id(10)), value: 20 }) .with_entry(test_id(30), StorageEntry { prev_valid_from: Some(test_id(20)), value: 30 }), - strategy, test_id(9)); + strategy, test_id(9)).unwrap(); let mut tx = DummyTransaction::new(); // when finalizing entry #10: no entries pruned @@ -1515,28 +1714,64 @@ pub mod tests { .with_header(fork_header(1, 2, 5)) .with_header(fork_header(2, 4, 5)), PruningStrategy::ByDepth(1024), correct_id(1) - ); + ).unwrap(); // when 5 is reverted: entry 5 is truncated - let op = cache.on_block_revert(&mut DummyTransaction::new(), &correct_id(5)).unwrap(); + let op = cache.do_on_block_revert(&mut DummyTransaction::new(), &correct_id(5)).unwrap(); assert_eq!(op, CommitOperation::BlockReverted(vec![ (0, Some(Fork { best_block: None, head: Entry { valid_from: correct_id(4), value: 4 } })), ].into_iter().collect())); - cache.on_transaction_commit(op); + cache.on_transaction_commit(vec![op].into()); // when 3 is reverted: entries 4+5' are truncated - let op = cache.on_block_revert(&mut DummyTransaction::new(), &correct_id(3)).unwrap(); + let op = cache.do_on_block_revert(&mut DummyTransaction::new(), &correct_id(3)).unwrap(); assert_eq!(op, CommitOperation::BlockReverted(vec![ (0, None), (2, None), ].into_iter().collect())); - cache.on_transaction_commit(op); + cache.on_transaction_commit(vec![op].into()); // when 2 is reverted: entries 4'+5' are truncated - let op = cache.on_block_revert(&mut DummyTransaction::new(), &correct_id(2)).unwrap(); + let op = cache.do_on_block_revert(&mut DummyTransaction::new(), &correct_id(2)).unwrap(); assert_eq!(op, CommitOperation::BlockReverted(vec![ (0, None), ].into_iter().collect())); - cache.on_transaction_commit(op); + cache.on_transaction_commit(vec![op].into()); + } + + #[test] + fn append_commit_operation_works() { + let mut ops = CommitOperations::default(); + ops.append(None); + assert_eq!(ops.operations, Vec::new()); + + ops.append(Some(CommitOperation::BlockFinalized( + test_id(10), + Some(Entry { valid_from: test_id(10), value: 10 }), + vec![5].into_iter().collect(), + ))); + assert_eq!( + ops.operations, + vec![CommitOperation::BlockFinalized( + test_id(10), + Some(Entry { valid_from: test_id(10), value: 10 }), + vec![5].into_iter().collect(), + )], + ); + + ops.append(Some(CommitOperation::BlockFinalized( + test_id(20), + Some(Entry { valid_from: test_id(20), value: 20 }), + vec![5, 6].into_iter().collect(), + ))); + + assert_eq!( + ops.operations, + vec![CommitOperation::BlockFinalized( + test_id(20), + Some(Entry { valid_from: test_id(20), value: 20 }), + vec![5, 6].into_iter().collect(), + )], + ); } } diff --git a/client/db/src/cache/list_storage.rs b/client/db/src/cache/list_storage.rs index 9cd3b1049a..606090ee14 100644 --- a/client/db/src/cache/list_storage.rs +++ b/client/db/src/cache/list_storage.rs @@ -222,7 +222,9 @@ mod meta { unfinalized.push(&entry.valid_from); }, CommitOperation::BlockFinalized(_, ref finalizing_entry, ref forks) => { - finalized = finalizing_entry.as_ref().map(|entry| &entry.valid_from); + if let Some(finalizing_entry) = finalizing_entry.as_ref() { + finalized = Some(&finalizing_entry.valid_from); + } for fork_index in forks.iter().rev() { unfinalized.remove(*fork_index); } diff --git a/client/db/src/cache/mod.rs b/client/db/src/cache/mod.rs index bef8d9a791..8fd1adc094 100644 --- a/client/db/src/cache/mod.rs +++ b/client/db/src/cache/mod.rs @@ -16,7 +16,7 @@ //! DB-backed cache of blockchain data. -use std::{sync::Arc, collections::HashMap}; +use std::{sync::Arc, collections::{HashMap, hash_map::Entry}}; use parking_lot::RwLock; use kvdb::{KeyValueDB, DBTransaction}; @@ -51,8 +51,10 @@ pub enum EntryType { /// Block identifier that holds both hash and number. #[derive(Clone, Debug, Encode, Decode, PartialEq)] pub struct ComplexBlockId { - hash: Block::Hash, - number: NumberFor, + /// Hash of the block. + pub(crate) hash: Block::Hash, + /// Number of the block. + pub(crate) number: NumberFor, } impl ComplexBlockId { @@ -79,7 +81,7 @@ pub struct DbCache { db: Arc, key_lookup_column: u32, header_column: u32, - authorities_column: u32, + cache_column: u32, genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, } @@ -90,7 +92,7 @@ impl DbCache { db: Arc, key_lookup_column: u32, header_column: u32, - authorities_column: u32, + cache_column: u32, genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, ) -> Self { @@ -99,7 +101,7 @@ impl DbCache { db, key_lookup_column, header_column, - authorities_column, + cache_column, genesis_hash, best_finalized_block, } @@ -115,30 +117,48 @@ impl DbCache { DbCacheTransaction { cache: self, tx, - cache_at_op: HashMap::new(), + cache_at_ops: HashMap::new(), best_finalized_block: None, } } + /// Begin cache transaction with given ops. + pub fn transaction_with_ops<'a>( + &'a mut self, + tx: &'a mut DBTransaction, + ops: DbCacheTransactionOps, + ) -> DbCacheTransaction<'a, Block> { + DbCacheTransaction { + cache: self, + tx, + cache_at_ops: ops.cache_at_ops, + best_finalized_block: ops.best_finalized_block, + } + } + /// Run post-commit cache operations. - pub fn commit(&mut self, ops: DbCacheTransactionOps) { - for (name, op) in ops.cache_at_op.into_iter() { - self.get_cache(name).on_transaction_commit(op); + pub fn commit(&mut self, ops: DbCacheTransactionOps) -> ClientResult<()> { + for (name, ops) in ops.cache_at_ops.into_iter() { + self.get_cache(name)?.on_transaction_commit(ops); } if let Some(best_finalized_block) = ops.best_finalized_block { self.best_finalized_block = best_finalized_block; } + Ok(()) } /// Creates `ListCache` with the given name or returns a reference to the existing. - fn get_cache(&mut self, name: CacheKeyId) -> &mut ListCache, self::list_storage::DbStorage> { + pub(crate) fn get_cache( + &mut self, + name: CacheKeyId, + ) -> ClientResult<&mut ListCache, self::list_storage::DbStorage>> { get_cache_helper( &mut self.cache_at, name, &self.db, self.key_lookup_column, self.header_column, - self.authorities_column, + self.cache_column, &self.best_finalized_block ) } @@ -154,34 +174,49 @@ fn get_cache_helper<'a, Block: BlockT>( header: u32, cache: u32, best_finalized_block: &ComplexBlockId, -) -> &'a mut ListCache, self::list_storage::DbStorage> { - cache_at.entry(name).or_insert_with(|| { - ListCache::new( - self::list_storage::DbStorage::new(name.to_vec(), db.clone(), - self::list_storage::DbColumns { - meta: COLUMN_META, - key_lookup, - header, - cache, - }, - ), - cache_pruning_strategy(name), - best_finalized_block.clone(), - ) - }) +) -> ClientResult<&'a mut ListCache, self::list_storage::DbStorage>> { + match cache_at.entry(name) { + Entry::Occupied(entry) => Ok(entry.into_mut()), + Entry::Vacant(entry) => { + let cache = ListCache::new( + self::list_storage::DbStorage::new(name.to_vec(), db.clone(), + self::list_storage::DbColumns { + meta: COLUMN_META, + key_lookup, + header, + cache, + }, + ), + cache_pruning_strategy(name), + best_finalized_block.clone(), + )?; + Ok(entry.insert(cache)) + } + } } /// Cache operations that are to be committed after database transaction is committed. +#[derive(Default)] pub struct DbCacheTransactionOps { - cache_at_op: HashMap>>, + cache_at_ops: HashMap>>, best_finalized_block: Option>, } +impl DbCacheTransactionOps { + /// Empty transaction ops. + pub fn empty() -> DbCacheTransactionOps { + DbCacheTransactionOps { + cache_at_ops: HashMap::new(), + best_finalized_block: None, + } + } +} + /// Database-backed blockchain data cache transaction valid for single block import. pub struct DbCacheTransaction<'a, Block: BlockT> { cache: &'a mut DbCache, tx: &'a mut DBTransaction, - cache_at_op: HashMap>>, + cache_at_ops: HashMap>>, best_finalized_block: Option>, } @@ -189,7 +224,7 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { /// Convert transaction into post-commit operations set. pub fn into_ops(self) -> DbCacheTransactionOps { DbCacheTransactionOps { - cache_at_op: self.cache_at_op, + cache_at_ops: self.cache_at_ops, best_finalized_block: self.best_finalized_block, } } @@ -202,8 +237,6 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { data_at: HashMap>, entry_type: EntryType, ) -> ClientResult { - assert!(self.cache_at_op.is_empty()); - // prepare list of caches that are not update // (we might still need to do some cache maintenance in this case) let missed_caches = self.cache.cache_at.keys() @@ -212,8 +245,9 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { .collect::>(); let mut insert_op = |name: CacheKeyId, value: Option>| -> Result<(), sp_blockchain::Error> { - let cache = self.cache.get_cache(name); - let op = cache.on_block_insert( + let cache = self.cache.get_cache(name)?; + let cache_ops = self.cache_at_ops.entry(name).or_default(); + cache.on_block_insert( &mut self::list_storage::DbStorageTransaction::new( cache.storage(), &mut self.tx, @@ -222,10 +256,9 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { block.clone(), value, entry_type, + cache_ops, )?; - if let Some(op) = op { - self.cache_at_op.insert(name, op); - } + Ok(()) }; @@ -245,23 +278,19 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { pub fn on_block_finalize( mut self, parent: ComplexBlockId, - block: ComplexBlockId + block: ComplexBlockId, ) -> ClientResult { - assert!(self.cache_at_op.is_empty()); - - for (name, cache_at) in self.cache.cache_at.iter() { - let op = cache_at.on_block_finalize( + for (name, cache) in self.cache.cache_at.iter() { + let cache_ops = self.cache_at_ops.entry(*name).or_default(); + cache.on_block_finalize( &mut self::list_storage::DbStorageTransaction::new( - cache_at.storage(), + cache.storage(), &mut self.tx ), parent.clone(), block.clone(), + cache_ops, )?; - - if let Some(op) = op { - self.cache_at_op.insert(name.to_owned(), op); - } } self.best_finalized_block = Some(block); @@ -275,16 +304,15 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { reverted_block: &ComplexBlockId, ) -> ClientResult { for (name, cache) in self.cache.cache_at.iter() { - let op = cache.on_block_revert( + let cache_ops = self.cache_at_ops.entry(*name).or_default(); + cache.on_block_revert( &mut self::list_storage::DbStorageTransaction::new( cache.storage(), &mut self.tx ), reverted_block, + cache_ops, )?; - - assert!(!self.cache_at_op.contains_key(name)); - self.cache_at_op.insert(name.to_owned(), op); } Ok(self) @@ -310,7 +338,7 @@ impl BlockchainCache for DbCacheSync { )?; let tx_ops = tx.into_ops(); db.write(dbtx).map_err(db_err)?; - cache.commit(tx_ops); + cache.commit(tx_ops)?; Ok(()) } @@ -318,40 +346,38 @@ impl BlockchainCache for DbCacheSync { &self, key: &CacheKeyId, at: &BlockId, - ) -> Option<((NumberFor, Block::Hash), Option<(NumberFor, Block::Hash)>, Vec)> { + ) -> ClientResult, Block::Hash), Option<(NumberFor, Block::Hash)>, Vec)>> { let mut cache = self.0.write(); - let storage = cache.get_cache(*key).storage(); + let cache = cache.get_cache(*key)?; + let storage = cache.storage(); let db = storage.db(); let columns = storage.columns(); let at = match *at { BlockId::Hash(hash) => { - let header = utils::read_header::( + let header = utils::require_header::( &**db, columns.key_lookup, columns.header, - BlockId::Hash(hash.clone())).ok()??; + BlockId::Hash(hash.clone()))?; ComplexBlockId::new(hash, *header.number()) }, BlockId::Number(number) => { - let hash = utils::read_header::( + let hash = utils::require_header::( &**db, columns.key_lookup, columns.header, - BlockId::Number(number.clone())).ok()??.hash(); + BlockId::Number(number.clone()))?.hash(); ComplexBlockId::new(hash, number) }, }; - cache.cache_at - .get(key)? - .value_at_block(&at) + cache.value_at_block(&at) .map(|block_and_value| block_and_value.map(|(begin_block, end_block, value)| ( (begin_block.number, begin_block.hash), end_block.map(|end_block| (end_block.number, end_block.hash)), value, ))) - .ok()? } } diff --git a/client/db/src/changes_tries_storage.rs b/client/db/src/changes_tries_storage.rs new file mode 100644 index 0000000000..72163a5694 --- /dev/null +++ b/client/db/src/changes_tries_storage.rs @@ -0,0 +1,1015 @@ +// 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 . + +//! DB-backed changes tries storage. + +use std::collections::{HashMap, HashSet}; +use std::sync::Arc; +use hash_db::Prefix; +use kvdb::{KeyValueDB, DBTransaction}; +use codec::{Decode, Encode}; +use parking_lot::RwLock; +use sp_blockchain::{Error as ClientError, Result as ClientResult}; +use sp_trie::MemoryDB; +use sc_client_api::backend::PrunableStateChangesTrieStorage; +use sp_blockchain::{well_known_cache_keys, Cache as BlockchainCache}; +use sp_core::{ChangesTrieConfiguration, ChangesTrieConfigurationRange, convert_hash}; +use sp_runtime::traits::{ + Block as BlockT, Header as HeaderT, HasherFor, NumberFor, One, Zero, CheckedSub, +}; +use sp_runtime::generic::{BlockId, DigestItem, ChangesTrieSignal}; +use sp_state_machine::{DBValue, ChangesTrieBuildCache, ChangesTrieCacheAction}; +use crate::utils::{self, Meta, meta_keys, db_err}; +use crate::cache::{ + DbCacheSync, DbCache, DbCacheTransactionOps, + ComplexBlockId, EntryType as CacheEntryType, +}; + +/// Extract new changes trie configuration (if available) from the header. +pub fn extract_new_configuration(header: &Header) -> Option<&Option> { + header.digest() + .log(DigestItem::as_changes_trie_signal) + .and_then(ChangesTrieSignal::as_new_configuration) +} + +/// Opaque configuration cache transaction. During its lifetime, no-one should modify cache. This is currently +/// guaranteed because import lock is held during block import/finalization. +pub struct DbChangesTrieStorageTransaction { + /// Cache operations that must be performed after db transaction is comitted. + cache_ops: DbCacheTransactionOps, + /// New configuration (if changed at current block). + new_config: Option>, +} + +impl DbChangesTrieStorageTransaction { + /// Consume self and return transaction with given new configuration. + pub fn with_new_config(mut self, new_config: Option>) -> Self { + self.new_config = new_config; + self + } +} + +impl From> for DbChangesTrieStorageTransaction { + fn from(cache_ops: DbCacheTransactionOps) -> Self { + DbChangesTrieStorageTransaction { + cache_ops, + new_config: None, + } + } +} + +/// Changes tries storage. +/// +/// Stores all tries in separate DB column. +/// Lock order: meta, tries_meta, cache, build_cache. +pub struct DbChangesTrieStorage { + db: Arc, + meta_column: u32, + changes_tries_column: u32, + key_lookup_column: u32, + header_column: u32, + meta: Arc, Block::Hash>>>, + tries_meta: RwLock>, + min_blocks_to_keep: Option, + /// The cache stores all ever existing changes tries configurations. + cache: DbCacheSync, + /// Build cache is a map of block => set of storage keys changed at this block. + /// They're used to build digest blocks - instead of reading+parsing tries from db + /// we just use keys sets from the cache. + build_cache: RwLock>>, +} + +/// Persistent struct that contains all the changes tries metadata. +#[derive(Decode, Encode, Debug)] +struct ChangesTriesMeta { + /// Oldest unpruned max-level (or skewed) digest trie blocks range. + /// The range is inclusive from both sides. + /// Is None only if: + /// 1) we haven't yet finalized any blocks (except genesis) + /// 2) if best_finalized_block - min_blocks_to_keep points to the range where changes tries are disabled + /// 3) changes tries pruning is disabled + pub oldest_digest_range: Option<(NumberFor, NumberFor)>, + /// End block (inclusive) of oldest pruned max-level (or skewed) digest trie blocks range. + /// It is guaranteed that we have no any changes tries before (and including) this block. + /// It is guaranteed that all existing changes tries after this block are not yet pruned (if created). + pub oldest_pruned_digest_range_end: NumberFor, +} + +impl DbChangesTrieStorage { + /// Create new changes trie storage. + pub fn new( + db: Arc, + meta_column: u32, + changes_tries_column: u32, + key_lookup_column: u32, + header_column: u32, + cache_column: u32, + meta: Arc, Block::Hash>>>, + min_blocks_to_keep: Option, + ) -> ClientResult { + let (finalized_hash, finalized_number, genesis_hash) = { + let meta = meta.read(); + (meta.finalized_hash, meta.finalized_number, meta.genesis_hash) + }; + let tries_meta = read_tries_meta(&*db, meta_column)?; + Ok(Self { + db: db.clone(), + meta_column, + changes_tries_column, + key_lookup_column, + header_column, + meta, + min_blocks_to_keep, + cache: DbCacheSync(RwLock::new(DbCache::new( + db.clone(), + key_lookup_column, + header_column, + cache_column, + genesis_hash, + ComplexBlockId::new(finalized_hash, finalized_number), + ))), + build_cache: RwLock::new(ChangesTrieBuildCache::new()), + tries_meta: RwLock::new(tries_meta), + }) + } + + /// Commit new changes trie. + pub fn commit( + &self, + tx: &mut DBTransaction, + mut changes_trie: MemoryDB>, + parent_block: ComplexBlockId, + block: ComplexBlockId, + new_header: &Block::Header, + finalized: bool, + new_configuration: Option>, + cache_tx: Option>, + ) -> ClientResult> { + // insert changes trie, associated with block, into DB + for (key, (val, _)) in changes_trie.drain() { + tx.put(self.changes_tries_column, key.as_ref(), &val); + } + + // if configuration has not been changed AND block is not finalized => nothing to do here + let new_configuration = match new_configuration { + Some(new_configuration) => new_configuration, + None if !finalized => return Ok(DbCacheTransactionOps::empty().into()), + None => return self.finalize( + tx, + parent_block.hash, + block.hash, + block.number, + Some(new_header), + cache_tx, + ), + }; + + // update configuration cache + let mut cache_at = HashMap::new(); + cache_at.insert(well_known_cache_keys::CHANGES_TRIE_CONFIG, new_configuration.encode()); + Ok(DbChangesTrieStorageTransaction::from(match cache_tx { + Some(cache_tx) => self.cache.0.write() + .transaction_with_ops(tx, cache_tx.cache_ops) + .on_block_insert( + parent_block, + block, + cache_at, + if finalized { CacheEntryType::Final } else { CacheEntryType::NonFinal }, + )? + .into_ops(), + None => self.cache.0.write() + .transaction(tx) + .on_block_insert( + parent_block, + block, + cache_at, + if finalized { CacheEntryType::Final } else { CacheEntryType::NonFinal }, + )? + .into_ops(), + }).with_new_config(Some(new_configuration))) + } + + /// Called when block is finalized. + pub fn finalize( + &self, + tx: &mut DBTransaction, + parent_block_hash: Block::Hash, + block_hash: Block::Hash, + block_num: NumberFor, + new_header: Option<&Block::Header>, + cache_tx: Option>, + ) -> ClientResult> { + // prune obsolete changes tries + self.prune(tx, block_hash, block_num, new_header.clone(), cache_tx.as_ref())?; + + // if we have inserted the block that we're finalizing in the same transaction + // => then we have already finalized it from the commit() call + if cache_tx.is_some() { + if let Some(new_header) = new_header { + if new_header.hash() == block_hash { + return Ok(cache_tx.expect("guarded by cache_tx.is_some(); qed")); + } + } + } + + // and finalize configuration cache entries + let block = ComplexBlockId::new(block_hash, block_num); + let parent_block_num = block_num.checked_sub(&One::one()).unwrap_or_else(|| Zero::zero()); + let parent_block = ComplexBlockId::new(parent_block_hash, parent_block_num); + Ok(match cache_tx { + Some(cache_tx) => DbChangesTrieStorageTransaction::from( + self.cache.0.write() + .transaction_with_ops(tx, cache_tx.cache_ops) + .on_block_finalize( + parent_block, + block, + )? + .into_ops() + ).with_new_config(cache_tx.new_config), + None => DbChangesTrieStorageTransaction::from( + self.cache.0.write() + .transaction(tx) + .on_block_finalize( + parent_block, + block, + )? + .into_ops() + ), + }) + } + + /// When block is reverted. + pub fn revert( + &self, + tx: &mut DBTransaction, + block: &ComplexBlockId, + ) -> ClientResult> { + Ok(self.cache.0.write().transaction(tx) + .on_block_revert(block)? + .into_ops() + .into()) + } + + /// When transaction has been committed. + pub fn post_commit(&self, tx: Option>) { + if let Some(tx) = tx { + self.cache.0.write().commit(tx.cache_ops) + .expect("only fails if cache with given name isn't loaded yet;\ + cache is already loaded because there is tx; qed"); + } + } + + /// Commit changes into changes trie build cache. + pub fn commit_build_cache(&self, cache_update: ChangesTrieCacheAction>) { + self.build_cache.write().perform(cache_update); + } + + /// Prune obsolete changes tries. + fn prune( + &self, + tx: &mut DBTransaction, + block_hash: Block::Hash, + block_num: NumberFor, + new_header: Option<&Block::Header>, + cache_tx: Option<&DbChangesTrieStorageTransaction>, + ) -> ClientResult<()> { + // 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, + None => return Ok(()), + }; + + let mut tries_meta = self.tries_meta.write(); + let mut next_digest_range_start = block_num; + loop { + // prune oldest digest if it is known + // it could be unknown if: + // 1) either we're finalizing block#1 + // 2) or we are (or were) in period where changes tries are disabled + if let Some((begin, end)) = tries_meta.oldest_digest_range { + if block_num <= end || block_num - end <= min_blocks_to_keep.into() { + break; + } + + tries_meta.oldest_pruned_digest_range_end = end; + sp_state_machine::prune_changes_tries( + &*self, + begin, + end, + &sp_state_machine::ChangesTrieAnchorBlockId { + hash: convert_hash(&block_hash), + number: block_num, + }, + |node| tx.delete(self.changes_tries_column, node.as_ref()), + ); + + next_digest_range_start = end + One::one(); + } + + // proceed to the next configuration range + let next_digest_range_start_hash = match block_num == next_digest_range_start { + true => block_hash, + false => utils::require_header::( + &*self.db, + self.key_lookup_column, + self.header_column, + BlockId::Number(next_digest_range_start), + )?.hash(), + }; + + let config_for_new_block = new_header + .map(|header| *header.number() == next_digest_range_start) + .unwrap_or(false); + let next_config = match cache_tx { + Some(cache_tx) if config_for_new_block && cache_tx.new_config.is_some() => { + let config = cache_tx + .new_config + .clone() + .expect("guarded by is_some(); qed"); + ChangesTrieConfigurationRange { + zero: (block_num, block_hash), + end: None, + config, + } + }, + _ if config_for_new_block => { + self.configuration_at(&BlockId::Hash(*new_header.expect( + "config_for_new_block is only true when new_header is passed; qed" + ).parent_hash()))? + }, + _ => self.configuration_at(&BlockId::Hash(next_digest_range_start_hash))?, + }; + if let Some(config) = next_config.config { + let mut oldest_digest_range = config + .next_max_level_digest_range(next_config.zero.0, next_digest_range_start) + .unwrap_or_else(|| (next_digest_range_start, next_digest_range_start)); + + if let Some(end) = next_config.end { + if end.0 < oldest_digest_range.1 { + oldest_digest_range.1 = end.0; + } + } + + tries_meta.oldest_digest_range = Some(oldest_digest_range); + continue; + } + + tries_meta.oldest_digest_range = None; + break; + } + + write_tries_meta(tx, self.meta_column, &*tries_meta); + Ok(()) + } +} + +impl PrunableStateChangesTrieStorage for DbChangesTrieStorage { + fn storage(&self) -> &dyn sp_state_machine::ChangesTrieStorage, NumberFor> { + self + } + + fn configuration_at(&self, at: &BlockId) -> ClientResult< + ChangesTrieConfigurationRange, Block::Hash> + > { + self.cache + .get_at(&well_known_cache_keys::CHANGES_TRIE_CONFIG, at)? + .and_then(|(zero, end, encoded)| Decode::decode(&mut &encoded[..]).ok() + .map(|config| ChangesTrieConfigurationRange { zero, end, config })) + .ok_or_else(|| ClientError::ErrorReadingChangesTriesConfig) + } + + fn oldest_pruned_digest_range_end(&self) -> NumberFor { + self.tries_meta.read().oldest_pruned_digest_range_end + } +} + +impl sp_state_machine::ChangesTrieRootsStorage, NumberFor> + for DbChangesTrieStorage +{ + fn build_anchor( + &self, + hash: Block::Hash, + ) -> Result>, String> { + utils::read_header::(&*self.db, self.key_lookup_column, self.header_column, BlockId::Hash(hash)) + .map_err(|e| e.to_string()) + .and_then(|maybe_header| maybe_header.map(|header| + sp_state_machine::ChangesTrieAnchorBlockId { + hash, + number: *header.number(), + } + ).ok_or_else(|| format!("Unknown header: {}", hash))) + } + + fn root( + &self, + anchor: &sp_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 { + // if block is finalized, we could just read canonical hash + 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, self.key_lookup_column, self.header_column, 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) + } else { + // else (block is not finalized + anchor is not canonicalized): + // => we should find the required block hash by traversing + // back from the anchor to the block with given number + while current_num != block { + let current_header: Block::Header = utils::require_header::( + &*self.db, self.key_lookup_column, self.header_column, BlockId::Hash(current_hash) + ).map_err(|e| e.to_string())?; + + current_hash = *current_header.parent_hash(); + current_num = current_num - One::one(); + } + + BlockId::Hash(current_hash) + } + }; + + Ok( + utils::require_header::( + &*self.db, + self.key_lookup_column, + self.header_column, + block_id, + ) + .map_err(|e| e.to_string())? + .digest() + .log(DigestItem::as_changes_trie_root) + .cloned() + ) + } +} + +impl sp_state_machine::ChangesTrieStorage, NumberFor> + for DbChangesTrieStorage +where + Block: BlockT, +{ + fn as_roots_storage(&self) -> &dyn sp_state_machine::ChangesTrieRootsStorage, NumberFor> { + self + } + + fn with_cached_changed_keys( + &self, + root: &Block::Hash, + functor: &mut dyn FnMut(&HashMap>, HashSet>>), + ) -> bool { + self.build_cache.read().with_changed_keys(root, functor) + } + + fn get(&self, key: &Block::Hash, _prefix: Prefix) -> Result, String> { + self.db.get(self.changes_tries_column, key.as_ref()) + .map_err(|err| format!("{}", err)) + } +} + +/// Read changes tries metadata from database. +fn read_tries_meta( + db: &dyn KeyValueDB, + meta_column: u32, +) -> ClientResult> { + match db.get(meta_column, meta_keys::CHANGES_TRIES_META).map_err(db_err)? { + Some(h) => match Decode::decode(&mut &h[..]) { + Ok(h) => Ok(h), + Err(err) => Err(ClientError::Backend(format!("Error decoding changes tries metadata: {}", err))), + }, + None => Ok(ChangesTriesMeta { + oldest_digest_range: None, + oldest_pruned_digest_range_end: Zero::zero(), + }), + } +} + +/// Write changes tries metadata from database. +fn write_tries_meta( + tx: &mut DBTransaction, + meta_column: u32, + meta: &ChangesTriesMeta, +) { + tx.put(meta_column, meta_keys::CHANGES_TRIES_META, &meta.encode()); +} + +#[cfg(test)] +mod tests { + use hash_db::EMPTY_PREFIX; + use sc_client_api::backend::{ + Backend as ClientBackend, NewBlockState, BlockImportOperation, PrunableStateChangesTrieStorage, + }; + use sp_blockchain::HeaderBackend as BlockchainHeaderBackend; + use sp_core::H256; + use sp_runtime::testing::{Digest, Header}; + use sp_runtime::traits::{Hash, BlakeTwo256}; + use sp_state_machine::{ChangesTrieRootsStorage, ChangesTrieStorage}; + use crate::Backend; + use crate::tests::{Block, insert_header, prepare_changes}; + use super::*; + + fn changes(number: u64) -> Option, Vec)>> { + Some(vec![(number.to_le_bytes().to_vec(), number.to_le_bytes().to_vec())]) + } + + fn insert_header_with_configuration_change( + backend: &Backend, + number: u64, + parent_hash: H256, + changes: Option, Vec)>>, + new_configuration: Option, + ) -> H256 { + let mut digest = Digest::default(); + let mut changes_trie_update = Default::default(); + if let Some(changes) = changes { + let (root, update) = prepare_changes(changes); + digest.push(DigestItem::ChangesTrieRoot(root)); + changes_trie_update = update; + } + digest.push(DigestItem::ChangesTrieSignal(ChangesTrieSignal::NewConfiguration(new_configuration))); + + let header = Header { + number, + parent_hash, + state_root: BlakeTwo256::trie_root(Vec::new()), + digest, + extrinsics_root: Default::default(), + }; + let header_hash = header.hash(); + + let block_id = if number == 0 { + BlockId::Hash(Default::default()) + } else { + BlockId::Number(number - 1) + }; + let mut op = backend.begin_operation().unwrap(); + backend.begin_state_operation(&mut op, block_id).unwrap(); + op.set_block_data(header, None, None, NewBlockState::Best).unwrap(); + op.update_changes_trie((changes_trie_update, ChangesTrieCacheAction::Clear)).unwrap(); + backend.commit_operation(op).unwrap(); + + header_hash + } + + #[test] + fn changes_trie_storage_works() { + let backend = Backend::::new_test(1000, 100); + backend.changes_tries_storage.meta.write().finalized_number = 1000; + + let check_changes = |backend: &Backend, block: u64, changes: Vec<(Vec, Vec)>| { + let (changes_root, mut changes_trie_update) = prepare_changes(changes); + let anchor = sp_state_machine::ChangesTrieAnchorBlockId { + hash: backend.blockchain().header(BlockId::Number(block)).unwrap().unwrap().hash(), + number: block + }; + assert_eq!(backend.changes_tries_storage.root(&anchor, block), Ok(Some(changes_root))); + + let storage = backend.changes_tries_storage.storage(); + for (key, (val, _)) in changes_trie_update.drain() { + assert_eq!(storage.get(&key, EMPTY_PREFIX), Ok(Some(val))); + } + }; + + let changes0 = vec![(b"key_at_0".to_vec(), b"val_at_0".to_vec())]; + let changes1 = vec![ + (b"key_at_1".to_vec(), b"val_at_1".to_vec()), + (b"another_key_at_1".to_vec(), b"another_val_at_1".to_vec()), + ]; + let changes2 = vec![(b"key_at_2".to_vec(), b"val_at_2".to_vec())]; + + let block0 = insert_header(&backend, 0, Default::default(), Some(changes0.clone()), Default::default()); + let block1 = insert_header(&backend, 1, block0, Some(changes1.clone()), Default::default()); + let _ = insert_header(&backend, 2, block1, Some(changes2.clone()), Default::default()); + + // check that the storage contains tries for all blocks + check_changes(&backend, 0, changes0); + check_changes(&backend, 1, changes1); + check_changes(&backend, 2, changes2); + } + + #[test] + fn changes_trie_storage_works_with_forks() { + let backend = Backend::::new_test(1000, 100); + + let changes0 = vec![(b"k0".to_vec(), b"v0".to_vec())]; + let changes1 = vec![(b"k1".to_vec(), b"v1".to_vec())]; + let changes2 = vec![(b"k2".to_vec(), b"v2".to_vec())]; + let block0 = insert_header(&backend, 0, Default::default(), Some(changes0.clone()), Default::default()); + let block1 = insert_header(&backend, 1, block0, Some(changes1.clone()), Default::default()); + let block2 = insert_header(&backend, 2, block1, Some(changes2.clone()), Default::default()); + + let changes2_1_0 = vec![(b"k3".to_vec(), b"v3".to_vec())]; + let changes2_1_1 = vec![(b"k4".to_vec(), b"v4".to_vec())]; + let block2_1_0 = insert_header(&backend, 3, block2, Some(changes2_1_0.clone()), Default::default()); + let block2_1_1 = insert_header(&backend, 4, block2_1_0, Some(changes2_1_1.clone()), Default::default()); + + let changes2_2_0 = vec![(b"k5".to_vec(), b"v5".to_vec())]; + let changes2_2_1 = vec![(b"k6".to_vec(), b"v6".to_vec())]; + let block2_2_0 = insert_header(&backend, 3, block2, Some(changes2_2_0.clone()), Default::default()); + let block2_2_1 = insert_header(&backend, 4, block2_2_0, Some(changes2_2_1.clone()), Default::default()); + + // finalize block1 + backend.changes_tries_storage.meta.write().finalized_number = 1; + + // branch1: when asking for finalized block hash + let (changes1_root, _) = prepare_changes(changes1); + let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); + + // branch2: when asking for finalized block hash + let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); + + // branch1: when asking for non-finalized block hash (search by traversal) + let (changes2_1_0_root, _) = prepare_changes(changes2_1_0); + let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_1_0_root))); + + // branch2: when asking for non-finalized block hash (search using canonicalized hint) + let (changes2_2_0_root, _) = prepare_changes(changes2_2_0); + let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); + + // finalize first block of branch2 (block2_2_0) + backend.changes_tries_storage.meta.write().finalized_number = 3; + + // branch2: when asking for finalized block of this branch + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); + + // branch1: when asking for finalized block of other branch + // => result is incorrect (returned for the block of branch1), but this is expected, + // because the other fork is abandoned (forked before finalized header) + let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); + } + + #[test] + fn changes_tries_are_pruned_on_finalization() { + let mut backend = Backend::::new_test(1000, 100); + backend.changes_tries_storage.min_blocks_to_keep = Some(8); + + let parent_hash = |number| { + if number == 0 { + Default::default() + } else { + backend.blockchain().header(BlockId::Number(number - 1)).unwrap().unwrap().hash() + } + }; + + let insert_regular_header = |with_changes, number| { + insert_header( + &backend, + number, + parent_hash(number), + if with_changes { changes(number) } else { None }, + Default::default(), + ); + }; + + let is_pruned = |number| { + let trie_root = backend + .blockchain() + .header(BlockId::Number(number)) + .unwrap().unwrap() + .digest() + .log(DigestItem::as_changes_trie_root) + .cloned(); + match trie_root { + Some(trie_root) => backend.changes_tries_storage.get(&trie_root, EMPTY_PREFIX).unwrap().is_none(), + None => true, + } + }; + + let finalize_block = |number| { + let header = backend.blockchain().header(BlockId::Number(number)).unwrap().unwrap(); + let mut tx = DBTransaction::new(); + let cache_ops = backend.changes_tries_storage.finalize( + &mut tx, + *header.parent_hash(), + header.hash(), + number, + None, + None, + ).unwrap(); + backend.storage.db.write(tx).unwrap(); + backend.changes_tries_storage.post_commit(Some(cache_ops)); + }; + + // configuration ranges: + // (0; 6] - None + // [7; 17] - Some(2^2): D2 is built at #10, #14; SD is built at #17 + // [18; 21] - None + // [22; 32] - Some(8^1): D1 is built at #29; SD is built at #32 + // [33; ... - Some(1) + let config_at_6 = Some(ChangesTrieConfiguration::new(2, 2)); + let config_at_17 = None; + let config_at_21 = Some(ChangesTrieConfiguration::new(8, 1)); + let config_at_32 = Some(ChangesTrieConfiguration::new(1, 0)); + + (0..6).for_each(|number| insert_regular_header(false, number)); + insert_header_with_configuration_change(&backend, 6, parent_hash(6), None, config_at_6); + (7..17).for_each(|number| insert_regular_header(true, number)); + insert_header_with_configuration_change(&backend, 17, parent_hash(17), changes(17), config_at_17); + (18..21).for_each(|number| insert_regular_header(false, number)); + insert_header_with_configuration_change(&backend, 21, parent_hash(21), None, config_at_21); + (22..32).for_each(|number| insert_regular_header(true, number)); + insert_header_with_configuration_change(&backend, 32, parent_hash(32), changes(32), config_at_32); + (33..50).for_each(|number| insert_regular_header(true, number)); + + // when only genesis is finalized, nothing is pruned + (0..=6).for_each(|number| assert!(is_pruned(number))); + (7..=17).for_each(|number| assert!(!is_pruned(number))); + (18..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when blocks [1; 18] are finalized, nothing is pruned + (1..=18).for_each(|number| finalize_block(number)); + (0..=6).for_each(|number| assert!(is_pruned(number))); + (7..=17).for_each(|number| assert!(!is_pruned(number))); + (18..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when block 19 is finalized, changes tries for blocks [7; 10] are pruned + finalize_block(19); + (0..=10).for_each(|number| assert!(is_pruned(number))); + (11..=17).for_each(|number| assert!(!is_pruned(number))); + (18..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when blocks [20; 22] are finalized, nothing is pruned + (20..=22).for_each(|number| finalize_block(number)); + (0..=10).for_each(|number| assert!(is_pruned(number))); + (11..=17).for_each(|number| assert!(!is_pruned(number))); + (18..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when block 23 is finalized, changes tries for blocks [11; 14] are pruned + finalize_block(23); + (0..=14).for_each(|number| assert!(is_pruned(number))); + (15..=17).for_each(|number| assert!(!is_pruned(number))); + (18..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when blocks [24; 25] are finalized, nothing is pruned + (24..=25).for_each(|number| finalize_block(number)); + (0..=14).for_each(|number| assert!(is_pruned(number))); + (15..=17).for_each(|number| assert!(!is_pruned(number))); + (18..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when block 26 is finalized, changes tries for blocks [15; 17] are pruned + finalize_block(26); + (0..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when blocks [27; 37] are finalized, nothing is pruned + (27..=37).for_each(|number| finalize_block(number)); + (0..=21).for_each(|number| assert!(is_pruned(number))); + (22..50).for_each(|number| assert!(!is_pruned(number))); + + // when block 38 is finalized, changes tries for blocks [22; 29] are pruned + finalize_block(38); + (0..=29).for_each(|number| assert!(is_pruned(number))); + (30..50).for_each(|number| assert!(!is_pruned(number))); + + // when blocks [39; 40] are finalized, nothing is pruned + (39..=40).for_each(|number| finalize_block(number)); + (0..=29).for_each(|number| assert!(is_pruned(number))); + (30..50).for_each(|number| assert!(!is_pruned(number))); + + // when block 41 is finalized, changes tries for blocks [30; 32] are pruned + finalize_block(41); + (0..=32).for_each(|number| assert!(is_pruned(number))); + (33..50).for_each(|number| assert!(!is_pruned(number))); + + // when block 42 is finalized, changes trie for block 33 is pruned + finalize_block(42); + (0..=33).for_each(|number| assert!(is_pruned(number))); + (34..50).for_each(|number| assert!(!is_pruned(number))); + + // when block 43 is finalized, changes trie for block 34 is pruned + finalize_block(43); + (0..=34).for_each(|number| assert!(is_pruned(number))); + (35..50).for_each(|number| assert!(!is_pruned(number))); + } + + #[test] + fn changes_tries_configuration_is_updated_on_block_insert() { + let backend = Backend::::new_test(1000, 100); + + // configurations at blocks + let config_at_1 = Some(ChangesTrieConfiguration { + digest_interval: 4, + digest_levels: 2, + }); + let config_at_3 = Some(ChangesTrieConfiguration { + digest_interval: 8, + digest_levels: 1, + }); + let config_at_5 = None; + let config_at_7 = Some(ChangesTrieConfiguration { + digest_interval: 8, + digest_levels: 1, + }); + + // insert some blocks + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); + let block1 = insert_header_with_configuration_change(&backend, 1, block0, None, config_at_1.clone()); + let block2 = insert_header(&backend, 2, block1, None, Default::default()); + let block3 = insert_header_with_configuration_change(&backend, 3, block2, None, config_at_3.clone()); + let block4 = insert_header(&backend, 4, block3, None, Default::default()); + let block5 = insert_header_with_configuration_change(&backend, 5, block4, None, config_at_5.clone()); + let block6 = insert_header(&backend, 6, block5, None, Default::default()); + let block7 = insert_header_with_configuration_change(&backend, 7, block6, None, config_at_7.clone()); + + // test configuration cache + let storage = &backend.changes_tries_storage; + assert_eq!( + storage.configuration_at(&BlockId::Hash(block1)).unwrap().config, + config_at_1.clone(), + ); + assert_eq!( + storage.configuration_at(&BlockId::Hash(block2)).unwrap().config, + config_at_1.clone(), + ); + assert_eq!( + storage.configuration_at(&BlockId::Hash(block3)).unwrap().config, + config_at_3.clone(), + ); + assert_eq!( + storage.configuration_at(&BlockId::Hash(block4)).unwrap().config, + config_at_3.clone(), + ); + assert_eq!( + storage.configuration_at(&BlockId::Hash(block5)).unwrap().config, + config_at_5.clone(), + ); + assert_eq!( + storage.configuration_at(&BlockId::Hash(block6)).unwrap().config, + config_at_5.clone(), + ); + assert_eq!( + storage.configuration_at(&BlockId::Hash(block7)).unwrap().config, + config_at_7.clone(), + ); + } + + #[test] + fn test_finalize_several_configuration_change_blocks_in_single_operation() { + let mut backend = Backend::::new_test(10, 10); + backend.changes_tries_storage.min_blocks_to_keep = Some(8); + + let configs = (0..=7).map(|i| Some(ChangesTrieConfiguration::new(2, i))).collect::>(); + + // insert unfinalized headers + let block0 = insert_header_with_configuration_change(&backend, 0, Default::default(), None, configs[0].clone()); + let block1 = insert_header_with_configuration_change(&backend, 1, block0, changes(1), configs[1].clone()); + let block2 = insert_header_with_configuration_change(&backend, 2, block1, changes(2), configs[2].clone()); + + let side_config2_1 = Some(ChangesTrieConfiguration::new(3, 2)); + let side_config2_2 = Some(ChangesTrieConfiguration::new(3, 3)); + let block2_1 = insert_header_with_configuration_change(&backend, 2, block1, changes(8), side_config2_1.clone()); + let _ = insert_header_with_configuration_change(&backend, 3, block2_1, changes(9), side_config2_2.clone()); + + // insert finalized header => 4 headers are finalized at once + let header3 = Header { + number: 3, + parent_hash: block2, + state_root: Default::default(), + digest: Digest { + logs: vec![ + DigestItem::ChangesTrieSignal(ChangesTrieSignal::NewConfiguration(configs[3].clone())), + ], + }, + extrinsics_root: Default::default(), + }; + let block3 = header3.hash(); + let mut op = backend.begin_operation().unwrap(); + backend.begin_state_operation(&mut op, BlockId::Hash(block2)).unwrap(); + op.mark_finalized(BlockId::Hash(block1), None).unwrap(); + op.mark_finalized(BlockId::Hash(block2), None).unwrap(); + op.set_block_data(header3, None, None, NewBlockState::Final).unwrap(); + backend.commit_operation(op).unwrap(); + + // insert more unfinalized headers + let block4 = insert_header_with_configuration_change(&backend, 4, block3, changes(4), configs[4].clone()); + let block5 = insert_header_with_configuration_change(&backend, 5, block4, changes(5), configs[5].clone()); + let block6 = insert_header_with_configuration_change(&backend, 6, block5, changes(6), configs[6].clone()); + + // insert finalized header => 4 headers are finalized at once + let header7 = Header { + number: 7, + parent_hash: block6, + state_root: Default::default(), + digest: Digest { + logs: vec![ + DigestItem::ChangesTrieSignal(ChangesTrieSignal::NewConfiguration(configs[7].clone())), + ], + }, + extrinsics_root: Default::default(), + }; + let mut op = backend.begin_operation().unwrap(); + backend.begin_state_operation(&mut op, BlockId::Hash(block6)).unwrap(); + op.mark_finalized(BlockId::Hash(block4), None).unwrap(); + op.mark_finalized(BlockId::Hash(block5), None).unwrap(); + op.mark_finalized(BlockId::Hash(block6), None).unwrap(); + op.set_block_data(header7, None, None, NewBlockState::Final).unwrap(); + backend.commit_operation(op).unwrap(); + } + + #[test] + fn changes_tries_configuration_is_reverted() { + let backend = Backend::::new_test(10, 10); + + let config0 = Some(ChangesTrieConfiguration::new(2, 5)); + let block0 = insert_header_with_configuration_change(&backend, 0, Default::default(), None, config0); + let config1 = Some(ChangesTrieConfiguration::new(2, 6)); + let block1 = insert_header_with_configuration_change(&backend, 1, block0, changes(0), config1); + backend.finalize_block(BlockId::Number(1), Some(vec![42])).unwrap(); + let config2 = Some(ChangesTrieConfiguration::new(2, 7)); + let block2 = insert_header_with_configuration_change(&backend, 2, block1, changes(1), config2); + let config2_1 = Some(ChangesTrieConfiguration::new(2, 8)); + let _ = insert_header_with_configuration_change(&backend, 3, block2, changes(10), config2_1); + let config2_2 = Some(ChangesTrieConfiguration::new(2, 9)); + let block2_2 = insert_header_with_configuration_change(&backend, 3, block2, changes(20), config2_2); + let config2_3 = Some(ChangesTrieConfiguration::new(2, 10)); + let _ = insert_header_with_configuration_change(&backend, 4, block2_2, changes(30), config2_3); + + // before truncate there are 2 unfinalized forks - block2_1+block2_3 + assert_eq!( + backend.changes_tries_storage.cache.0.write() + .get_cache(well_known_cache_keys::CHANGES_TRIE_CONFIG) + .unwrap() + .unfinalized() + .iter() + .map(|fork| fork.head().valid_from.number) + .collect::>(), + vec![3, 4], + ); + + // after truncating block2_3 - there are 2 unfinalized forks - block2_1+block2_2 + backend.revert(1, false).unwrap(); + assert_eq!( + backend.changes_tries_storage.cache.0.write() + .get_cache(well_known_cache_keys::CHANGES_TRIE_CONFIG) + .unwrap() + .unfinalized() + .iter() + .map(|fork| fork.head().valid_from.number) + .collect::>(), + vec![3, 3], + ); + + // after truncating block2_1 && block2_2 - there are still two unfinalized forks (cache impl specifics), + // the 1st one points to the block #3 because it isn't truncated + backend.revert(1, false).unwrap(); + assert_eq!( + backend.changes_tries_storage.cache.0.write() + .get_cache(well_known_cache_keys::CHANGES_TRIE_CONFIG) + .unwrap() + .unfinalized() + .iter() + .map(|fork| fork.head().valid_from.number) + .collect::>(), + vec![3, 2], + ); + + // after truncating block2 - there are no unfinalized forks + backend.revert(1, false).unwrap(); + assert!( + backend.changes_tries_storage.cache.0.write() + .get_cache(well_known_cache_keys::CHANGES_TRIE_CONFIG) + .unwrap() + .unfinalized() + .iter() + .map(|fork| fork.head().valid_from.number) + .collect::>() + .is_empty(), + ); + } +} diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index b4eae2db2b..4038d917a7 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -31,18 +31,21 @@ pub mod offchain; mod children; mod cache; +mod changes_tries_storage; mod storage_cache; +#[cfg(any(feature = "kvdb-rocksdb", test))] +mod upgrade; mod utils; mod stats; use std::sync::Arc; use std::path::PathBuf; use std::io; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use sc_client_api::{execution_extensions::ExecutionExtensions, ForkBlocks, UsageInfo, MemoryInfo, BadBlocks, IoInfo}; use sc_client_api::backend::NewBlockState; -use sc_client_api::backend::{StorageCollection, ChildStorageCollection}; +use sc_client_api::backend::{PrunableStateChangesTrieStorage, StorageCollection, ChildStorageCollection}; use sp_blockchain::{ Result as ClientResult, Error as ClientError, well_known_cache_keys, HeaderBackend, @@ -51,11 +54,11 @@ use codec::{Decode, Encode}; use hash_db::Prefix; use kvdb::{KeyValueDB, DBTransaction}; use sp_trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; -use parking_lot::{Mutex, RwLock}; -use sp_core::{ChangesTrieConfiguration, convert_hash, traits::CodeExecutor}; +use parking_lot::RwLock; +use sp_core::{ChangesTrieConfiguration, traits::CodeExecutor}; use sp_core::storage::{well_known_keys, ChildInfo}; use sp_runtime::{ - generic::{BlockId, DigestItem}, Justification, Storage, + generic::BlockId, Justification, Storage, BuildStorage, }; use sp_runtime::traits::{ @@ -63,10 +66,11 @@ use sp_runtime::traits::{ }; use sc_executor::RuntimeInfo; use sp_state_machine::{ - DBValue, ChangesTrieTransaction, ChangesTrieCacheAction, ChangesTrieBuildCache, + DBValue, ChangesTrieTransaction, ChangesTrieCacheAction, backend::Backend as StateBackend, UsageInfo as StateUsageInfo, }; -use crate::utils::{Meta, db_err, meta_keys, read_db, read_meta}; +use crate::utils::{DatabaseType, Meta, db_err, meta_keys, read_db, read_meta}; +use crate::changes_tries_storage::{DbChangesTrieStorage, DbChangesTrieStorageTransaction}; use sc_client::leaves::{LeafSet, FinalizationDisplaced}; use sc_state_db::StateDb; use sp_blockchain::{CachedHeaderMetadata, HeaderMetadata, HeaderMetadataCache}; @@ -322,6 +326,7 @@ pub(crate) mod columns { pub const AUX: u32 = 8; /// Offchain workers local storage pub const OFFCHAIN: u32 = 9; + pub const CACHE: u32 = 10; } struct PendingBlock { @@ -352,7 +357,7 @@ pub struct BlockchainDb { impl BlockchainDb { fn new(db: Arc) -> ClientResult { - let meta = read_meta::(&*db, columns::META, columns::HEADER)?; + let meta = read_meta::(&*db, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; Ok(BlockchainDb { db, @@ -511,7 +516,8 @@ pub struct BlockImportOperation { storage_updates: StorageCollection, child_storage_updates: ChildStorageCollection, changes_trie_updates: MemoryDB>, - changes_trie_cache_update: Option>>, + changes_trie_build_cache_update: Option>>, + changes_trie_config_update: Option>, pending_block: Option>, aux_ops: Vec<(Vec, Option>)>, finalized_blocks: Vec<(BlockId, Option)>, @@ -545,6 +551,9 @@ impl sc_client_api::backend::BlockImportOperation for Bloc leaf_state: NewBlockState, ) -> ClientResult<()> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); + if let Some(changes_trie_config_update) = changes_tries_storage::extract_new_configuration(&header) { + self.changes_trie_config_update = Some(changes_trie_config_update.clone()); + } self.pending_block = Some(PendingBlock { header, body, @@ -583,12 +592,22 @@ impl sc_client_api::backend::BlockImportOperation for Bloc child_content.data.into_iter().map(|(k, v)| (k, Some(v))), child_content.child_info), ); + let mut changes_trie_config: Option = None; let (root, transaction) = self.old_state.full_storage_root( - storage.top.into_iter().map(|(k, v)| (k, Some(v))), + storage.top.into_iter().map(|(k, v)| { + if k == well_known_keys::CHANGES_TRIE_CONFIG { + changes_trie_config = Some( + Decode::decode(&mut &v[..]) + .expect("changes trie configuration is encoded properly at genesis") + ); + } + (k, Some(v)) + }), child_delta ); self.db_updates = transaction; + self.changes_trie_config_update = Some(changes_trie_config); self.commit_state = true; Ok(root) } @@ -598,7 +617,7 @@ impl sc_client_api::backend::BlockImportOperation for Bloc update: ChangesTrieTransaction, NumberFor>, ) -> ClientResult<()> { self.changes_trie_updates = update.0; - self.changes_trie_cache_update = Some(update.1); + self.changes_trie_build_cache_update = Some(update.1); Ok(()) } @@ -674,174 +693,6 @@ impl sp_state_machine::Storage> for DbGenesisSto } } -/// A database wrapper for changes tries. -pub struct DbChangesTrieStorage { - db: Arc, - meta: Arc, Block::Hash>>>, - min_blocks_to_keep: Option, - cache: RwLock>>, -} - -impl DbChangesTrieStorage { - /// Commit new changes trie. - pub fn commit(&self, tx: &mut DBTransaction, mut changes_trie: MemoryDB>) { - for (key, (val, _)) in changes_trie.drain() { - tx.put(columns::CHANGES_TRIE, key.as_ref(), &val); - } - } - - /// Commit changes into changes trie build cache. - pub fn commit_cache(&self, cache_update: ChangesTrieCacheAction>) { - self.cache.write().perform(cache_update); - } - - /// Prune obsolete changes tries. - 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, - None => return, - }; - - sp_state_machine::prune_changes_tries( - config, - &*self, - min_blocks_to_keep.into(), - &sp_state_machine::ChangesTrieAnchorBlockId { - hash: convert_hash(&block_hash), - number: block_num, - }, - |node| tx.delete(columns::CHANGES_TRIE, node.as_ref())); - } -} - -impl sc_client_api::backend::PrunableStateChangesTrieStorage - for DbChangesTrieStorage -{ - fn oldest_changes_trie_block( - &self, - config: &ChangesTrieConfiguration, - best_finalized_block: NumberFor, - ) -> NumberFor { - match self.min_blocks_to_keep { - Some(min_blocks_to_keep) => sp_state_machine::oldest_non_pruned_changes_trie( - config, - min_blocks_to_keep.into(), - best_finalized_block, - ), - None => One::one(), - } - } -} - -impl sp_state_machine::ChangesTrieRootsStorage, NumberFor> - for DbChangesTrieStorage -{ - fn build_anchor( - &self, - hash: Block::Hash, - ) -> 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| - sp_state_machine::ChangesTrieAnchorBlockId { - hash, - number: *header.number(), - } - ).ok_or_else(|| format!("Unknown header: {}", hash))) - } - - fn root( - &self, - anchor: &sp_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 { - // if block is finalized, we could just read canonical hash - 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) - ).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) - } else { - // else (block is not finalized + anchor is not canonicalized): - // => we should find the required block hash by traversing - // back from the anchor to the block with given number - while current_num != block { - let current_header: Block::Header = utils::require_header::( - &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Hash(current_hash) - ).map_err(|e| e.to_string())?; - - current_hash = *current_header.parent_hash(); - current_num = current_num - One::one(); - } - - BlockId::Hash(current_hash) - } - }; - - Ok( - utils::require_header::( - &*self.db, - columns::KEY_LOOKUP, - columns::HEADER, - block_id, - ) - .map_err(|e| e.to_string())? - .digest() - .log(DigestItem::as_changes_trie_root) - .cloned() - ) - } -} - -impl sp_state_machine::ChangesTrieStorage, NumberFor> - for DbChangesTrieStorage -{ - fn as_roots_storage(&self) - -> &dyn sp_state_machine::ChangesTrieRootsStorage, NumberFor> - { - self - } - - fn with_cached_changed_keys( - &self, - root: &Block::Hash, - functor: &mut dyn FnMut(&HashMap>, HashSet>>), - ) -> bool { - self.cache.read().with_changed_keys(root, functor) - } - - fn get(&self, key: &Block::Hash, _prefix: Prefix) -> Result, String> { - self.db.get(columns::CHANGES_TRIE, key.as_ref()).map_err(|err| format!("{}", err)) - } -} - /// Frozen `value` at time `at`. /// /// Used as inner structure under lock in `FrozenForDuration`. @@ -889,9 +740,6 @@ pub struct Backend { storage: Arc>, offchain_storage: offchain::LocalStorage, changes_tries_storage: DbChangesTrieStorage, - /// None<*> means that the value hasn't been cached yet. Some(*) means that the value (either None or - /// Some(*)) has been cached and is valid. - changes_trie_config: Mutex>>, blockchain: BlockchainDb, canonicalization_delay: u64, shared_cache: SharedCache, @@ -906,7 +754,7 @@ 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) -> ClientResult { - let db = crate::utils::open_database(&config, columns::META, "full")?; + let db = crate::utils::open_database::(&config, DatabaseType::Full)?; Self::from_kvdb(db as Arc<_>, canonicalization_delay, &config) } @@ -942,22 +790,25 @@ impl Backend { state_db, }; let offchain_storage = offchain::LocalStorage::new(db.clone()); - let changes_tries_storage = DbChangesTrieStorage { + let changes_tries_storage = DbChangesTrieStorage::new( db, + columns::META, + columns::CHANGES_TRIE, + columns::KEY_LOOKUP, + columns::HEADER, + columns::CACHE, meta, - min_blocks_to_keep: if is_archive_pruning { + if is_archive_pruning { None } else { Some(MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR) }, - cache: RwLock::new(ChangesTrieBuildCache::new()), - }; + )?; Ok(Backend { storage: Arc::new(storage_db), offchain_storage, changes_tries_storage, - changes_trie_config: Mutex::new(None), blockchain, canonicalization_delay, shared_cache: new_shared_cache( @@ -1026,26 +877,6 @@ impl Backend { self.blockchain.db.iter(columns::HEADER).count() as u64 } - /// Read (from storage or cache) changes trie config. - /// - /// Currently changes tries configuration is set up once (at genesis) and could not - /// be changed. Thus, we'll actually read value once and then just use cached value. - fn changes_trie_config(&self, block: Block::Hash) -> ClientResult> { - let mut cached_changes_trie_config = self.changes_trie_config.lock(); - match cached_changes_trie_config.clone() { - Some(cached_changes_trie_config) => Ok(cached_changes_trie_config), - None => { - use sc_client_api::backend::Backend; - let changes_trie_config = self - .state_at(BlockId::Hash(block))? - .storage(well_known_keys::CHANGES_TRIE_CONFIG)? - .and_then(|v| Decode::decode(&mut &*v).ok()); - *cached_changes_trie_config = Some(changes_trie_config.clone()); - Ok(changes_trie_config) - }, - } - } - /// Handle setting head within a transaction. `route_to` should be the last /// block that existed in the database. `best_to` should be the best block /// to be set. @@ -1137,6 +968,7 @@ impl Backend { header: &Block::Header, last_finalized: Option, justification: Option, + changes_trie_cache_ops: &mut Option>, finalization_displaced: &mut Option>>, ) -> ClientResult<(Block::Hash, ::Number, bool, bool)> { // TODO: ensure best chain contains this block. @@ -1144,8 +976,10 @@ impl Backend { self.ensure_sequential_finalization(header, last_finalized)?; self.note_finalized( transaction, + false, header, *hash, + changes_trie_cache_ops, finalization_displaced, )?; @@ -1204,6 +1038,7 @@ impl Backend { let mut meta_updates = Vec::with_capacity(operation.finalized_blocks.len()); let mut last_finalized_hash = self.blockchain.meta.read().finalized_hash; + let mut changes_trie_cache_ops = None; for (block, justification) in operation.finalized_blocks { let block_hash = self.blockchain.expect_block_hash_from_id(&block)?; let block_header = self.blockchain.expect_header(BlockId::Hash(block_hash))?; @@ -1214,6 +1049,7 @@ impl Backend { &block_header, Some(last_finalized_hash), justification, + &mut changes_trie_cache_ops, &mut finalization_displaced_leaves, )?); last_finalized_hash = block_hash; @@ -1257,6 +1093,11 @@ impl Backend { if number.is_zero() { transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); + + // for tests, because config is set from within the reset_storage + if operation.changes_trie_config_update.is_none() { + operation.changes_trie_config_update = Some(None); + } } let finalized = if operation.commit_state { @@ -1293,8 +1134,20 @@ impl Backend { let header = &pending_block.header; let is_best = pending_block.leaf_state.is_best(); let changes_trie_updates = operation.changes_trie_updates; - - self.changes_tries_storage.commit(&mut transaction, changes_trie_updates); + let changes_trie_config_update = operation.changes_trie_config_update; + changes_trie_cache_ops = Some(self.changes_tries_storage.commit( + &mut transaction, + changes_trie_updates, + cache::ComplexBlockId::new( + *header.parent_hash(), + if number.is_zero() { Zero::zero() } else { number - One::one() }, + ), + cache::ComplexBlockId::new(hash, number), + header, + finalized, + changes_trie_config_update, + changes_trie_cache_ops, + )?); let cache = operation.old_state.release(); // release state reference so that it can be finalized if finalized { @@ -1302,8 +1155,10 @@ impl Backend { self.ensure_sequential_finalization(header, Some(last_finalized_hash))?; self.note_finalized( &mut transaction, + true, header, hash, + &mut changes_trie_cache_ops, &mut finalization_displaced_leaves, )?; } else { @@ -1353,11 +1208,15 @@ impl Backend { let write_result = self.storage.db.write(transaction).map_err(db_err); - if let Some(changes_trie_cache_update) = operation.changes_trie_cache_update { - self.changes_tries_storage.commit_cache(changes_trie_cache_update); - } - - if let Some((number, hash, enacted, retracted, displaced_leaf, is_best, mut cache)) = 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(); @@ -1383,6 +1242,11 @@ impl Backend { ); } + if let Some(changes_trie_build_cache_update) = operation.changes_trie_build_cache_update { + self.changes_tries_storage.commit_build_cache(changes_trie_build_cache_update); + } + self.changes_tries_storage.post_commit(changes_trie_cache_ops); + if let Some((enacted, retracted)) = cache_update { self.shared_cache.lock().sync(&enacted, &retracted); } @@ -1401,15 +1265,15 @@ impl Backend { fn note_finalized( &self, transaction: &mut DBTransaction, + is_inserted: bool, f_header: &Block::Header, f_hash: Block::Hash, + changes_trie_cache_ops: &mut Option>, displaced: &mut Option>> ) -> ClientResult<()> { let f_num = f_header.number().clone(); 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())?; transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); @@ -1417,9 +1281,16 @@ impl Backend { .map_err(|e: sc_state_db::Error| sp_blockchain::Error::from(format!("State database error: {:?}", e)))?; apply_state_commit(transaction, commit); - let changes_trie_config = self.changes_trie_config(parent_hash)?; - if let Some(changes_trie_config) = changes_trie_config { - self.changes_tries_storage.prune(&changes_trie_config, transaction, f_hash, f_num); + if !f_num.is_zero() { + let new_changes_trie_cache_ops = self.changes_tries_storage.finalize( + transaction, + *f_header.parent_hash(), + f_hash, + f_num, + if is_inserted { Some(&f_header) } else { None }, + changes_trie_cache_ops.take(), + )?; + *changes_trie_cache_ops = Some(new_changes_trie_cache_ops); } } @@ -1476,7 +1347,6 @@ impl sc_client_api::backend::Backend for Backend { type BlockImportOperation = BlockImportOperation; type Blockchain = BlockchainDb; type State = CachingState, Block>; - type ChangesTrieStorage = DbChangesTrieStorage; type OffchainStorage = offchain::LocalStorage; fn begin_operation(&self) -> ClientResult { @@ -1487,8 +1357,9 @@ impl sc_client_api::backend::Backend for Backend { db_updates: PrefixedMemoryDB::default(), storage_updates: Default::default(), child_storage_updates: Default::default(), + changes_trie_config_update: None, changes_trie_updates: MemoryDB::default(), - changes_trie_cache_update: None, + changes_trie_build_cache_update: None, aux_ops: Vec::new(), finalized_blocks: Vec::new(), set_head: None, @@ -1532,16 +1403,19 @@ impl sc_client_api::backend::Backend for Backend { let header = self.blockchain.expect_header(block)?; let mut displaced = None; let commit = |displaced| { + let mut changes_trie_cache_ops = None; let (hash, number, is_best, is_finalized) = self.finalize_block_with_transaction( &mut transaction, &hash, &header, None, justification, + &mut changes_trie_cache_ops, displaced, )?; self.storage.db.write(transaction).map_err(db_err)?; self.blockchain.update_meta(hash, number, is_best, is_finalized); + self.changes_tries_storage.post_commit(changes_trie_cache_ops); Ok(()) }; match commit(&mut displaced) { @@ -1557,7 +1431,7 @@ impl sc_client_api::backend::Backend for Backend { Ok(()) } - fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage> { + fn changes_trie_storage(&self) -> Option<&dyn PrunableStateChangesTrieStorage> { Some(&self.changes_tries_storage) } @@ -1616,6 +1490,7 @@ impl sc_client_api::backend::Backend for Backend { match self.storage.state_db.revert_one() { Some(commit) => { apply_state_commit(&mut transaction, commit); + let removed_number = best_number; let removed = self.blockchain.header(BlockId::Number(best_number))?.ok_or_else( || sp_blockchain::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best_number)))?; @@ -1628,6 +1503,13 @@ impl sc_client_api::backend::Backend for Backend { let update_finalized = best_number < finalized; let key = utils::number_and_hash_to_lookup_key(best_number.clone(), &best_hash)?; + let changes_trie_cache_ops = self.changes_tries_storage.revert( + &mut transaction, + &cache::ComplexBlockId::new( + removed.hash(), + removed_number, + ), + )?; transaction.put(columns::META, meta_keys::BEST_BLOCK, &key); if update_finalized { transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &key); @@ -1635,6 +1517,7 @@ impl sc_client_api::backend::Backend for Backend { transaction.delete(columns::KEY_LOOKUP, removed.hash().as_ref()); children::remove_children(&mut transaction, columns::META, meta_keys::CHILDREN_PREFIX, best_hash); self.storage.db.write(transaction).map_err(db_err)?; + self.changes_tries_storage.post_commit(Some(changes_trie_cache_ops)); self.blockchain.update_meta(best_hash, best_number, true, update_finalized); } None => return Ok(c.saturated_into::>()) @@ -1749,14 +1632,8 @@ impl sc_client_api::backend::Backend for Backend { impl sc_client_api::backend::LocalBackend for Backend {} -/// TODO: remove me in #3201 -pub fn unused_sink(cache_tx: crate::cache::DbCacheTransaction) { - cache_tx.on_block_revert(&crate::cache::ComplexBlockId::new(Default::default(), 0.into())).unwrap(); - unimplemented!() -} - #[cfg(test)] -mod tests { +pub(crate) mod tests { use hash_db::{HashDB, EMPTY_PREFIX}; use super::*; use crate::columns; @@ -1765,12 +1642,13 @@ mod tests { use sc_client::blockchain::Backend as BLBTrait; use sp_runtime::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; use sp_runtime::traits::{Hash, BlakeTwo256}; - use sp_state_machine::{TrieMut, TrieDBMut, ChangesTrieRootsStorage, ChangesTrieStorage}; + use sp_runtime::generic::DigestItem; + use sp_state_machine::{TrieMut, TrieDBMut}; use sp_blockchain::{lowest_common_ancestor, tree_route}; - type Block = RawBlock>; + pub(crate) type Block = RawBlock>; - fn prepare_changes(changes: Vec<(Vec, Vec)>) -> (H256, MemoryDB) { + pub fn prepare_changes(changes: Vec<(Vec, Vec)>) -> (H256, MemoryDB) { let mut changes_root = H256::default(); let mut changes_trie_update = MemoryDB::::default(); { @@ -1786,20 +1664,22 @@ mod tests { (changes_root, changes_trie_update) } - fn insert_header( + pub fn insert_header( backend: &Backend, number: u64, parent_hash: H256, - changes: Vec<(Vec, Vec)>, + changes: Option, Vec)>>, extrinsics_root: H256, ) -> H256 { use sp_runtime::testing::Digest; - let (changes_root, changes_trie_update) = prepare_changes(changes); - let digest = Digest { - logs: vec![ - DigestItem::ChangesTrieRoot(changes_root), - ], - }; + + let mut digest = Digest::default(); + let mut changes_trie_update = Default::default(); + if let Some(changes) = changes { + let (root, update) = prepare_changes(changes); + digest.push(DigestItem::ChangesTrieRoot(root)); + changes_trie_update = update; + } let header = Header { number, parent_hash, @@ -2126,238 +2006,20 @@ mod tests { ).unwrap().is_none()); } - #[test] - fn changes_trie_storage_works() { - let backend = Backend::::new_test(1000, 100); - backend.changes_tries_storage.meta.write().finalized_number = 1000; - - - let check_changes = |backend: &Backend, block: u64, changes: Vec<(Vec, Vec)>| { - let (changes_root, mut changes_trie_update) = prepare_changes(changes); - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { - hash: backend.blockchain().header(BlockId::Number(block)).unwrap().unwrap().hash(), - number: block - }; - assert_eq!(backend.changes_tries_storage.root(&anchor, block), Ok(Some(changes_root))); - - for (key, (val, _)) in changes_trie_update.drain() { - assert_eq!(backend.changes_trie_storage().unwrap().get(&key, EMPTY_PREFIX), Ok(Some(val))); - } - }; - - let changes0 = vec![(b"key_at_0".to_vec(), b"val_at_0".to_vec())]; - let changes1 = vec![ - (b"key_at_1".to_vec(), b"val_at_1".to_vec()), - (b"another_key_at_1".to_vec(), b"another_val_at_1".to_vec()), - ]; - let changes2 = vec![(b"key_at_2".to_vec(), b"val_at_2".to_vec())]; - - let block0 = insert_header(&backend, 0, Default::default(), changes0.clone(), Default::default()); - let block1 = insert_header(&backend, 1, block0, changes1.clone(), Default::default()); - let _ = insert_header(&backend, 2, block1, changes2.clone(), Default::default()); - - // check that the storage contains tries for all blocks - check_changes(&backend, 0, changes0); - check_changes(&backend, 1, changes1); - check_changes(&backend, 2, changes2); - } - - #[test] - fn changes_trie_storage_works_with_forks() { - let backend = Backend::::new_test(1000, 100); - - let changes0 = vec![(b"k0".to_vec(), b"v0".to_vec())]; - let changes1 = vec![(b"k1".to_vec(), b"v1".to_vec())]; - let changes2 = vec![(b"k2".to_vec(), b"v2".to_vec())]; - let block0 = insert_header(&backend, 0, Default::default(), changes0.clone(), Default::default()); - let block1 = insert_header(&backend, 1, block0, changes1.clone(), Default::default()); - let block2 = insert_header(&backend, 2, block1, changes2.clone(), Default::default()); - - let changes2_1_0 = vec![(b"k3".to_vec(), b"v3".to_vec())]; - let changes2_1_1 = vec![(b"k4".to_vec(), b"v4".to_vec())]; - let block2_1_0 = insert_header(&backend, 3, block2, changes2_1_0.clone(), Default::default()); - let block2_1_1 = insert_header(&backend, 4, block2_1_0, changes2_1_1.clone(), Default::default()); - - let changes2_2_0 = vec![(b"k5".to_vec(), b"v5".to_vec())]; - let changes2_2_1 = vec![(b"k6".to_vec(), b"v6".to_vec())]; - let block2_2_0 = insert_header(&backend, 3, block2, changes2_2_0.clone(), Default::default()); - let block2_2_1 = insert_header(&backend, 4, block2_2_0, changes2_2_1.clone(), Default::default()); - - // finalize block1 - backend.changes_tries_storage.meta.write().finalized_number = 1; - - // branch1: when asking for finalized block hash - let (changes1_root, _) = prepare_changes(changes1); - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); - - // branch2: when asking for finalized block hash - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); - - // branch1: when asking for non-finalized block hash (search by traversal) - let (changes2_1_0_root, _) = prepare_changes(changes2_1_0); - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_1_0_root))); - - // branch2: when asking for non-finalized block hash (search using canonicalized hint) - let (changes2_2_0_root, _) = prepare_changes(changes2_2_0); - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); - - // finalize first block of branch2 (block2_2_0) - backend.changes_tries_storage.meta.write().finalized_number = 3; - - // branch2: when asking for finalized block of this branch - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); - - // branch1: when asking for finalized block of other branch - // => result is incorrect (returned for the block of branch1), but this is expected, - // because the other fork is abandoned (forked before finalized header) - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); - } - - #[test] - fn changes_tries_with_digest_are_pruned_on_finalization() { - let mut backend = Backend::::new_test(1000, 100); - backend.changes_tries_storage.min_blocks_to_keep = Some(8); - let config = ChangesTrieConfiguration { - digest_interval: 2, - digest_levels: 2, - }; - - // insert some blocks - let block0 = insert_header(&backend, 0, Default::default(), vec![(b"key_at_0".to_vec(), b"val_at_0".to_vec())], Default::default()); - let block1 = insert_header(&backend, 1, block0, vec![(b"key_at_1".to_vec(), b"val_at_1".to_vec())], Default::default()); - let block2 = insert_header(&backend, 2, block1, vec![(b"key_at_2".to_vec(), b"val_at_2".to_vec())], Default::default()); - let block3 = insert_header(&backend, 3, block2, vec![(b"key_at_3".to_vec(), b"val_at_3".to_vec())], Default::default()); - let block4 = insert_header(&backend, 4, block3, vec![(b"key_at_4".to_vec(), b"val_at_4".to_vec())], Default::default()); - let block5 = insert_header(&backend, 5, block4, vec![(b"key_at_5".to_vec(), b"val_at_5".to_vec())], Default::default()); - let block6 = insert_header(&backend, 6, block5, vec![(b"key_at_6".to_vec(), b"val_at_6".to_vec())], Default::default()); - let block7 = insert_header(&backend, 7, block6, vec![(b"key_at_7".to_vec(), b"val_at_7".to_vec())], Default::default()); - let block8 = insert_header(&backend, 8, block7, vec![(b"key_at_8".to_vec(), b"val_at_8".to_vec())], Default::default()); - let block9 = insert_header(&backend, 9, block8, vec![(b"key_at_9".to_vec(), b"val_at_9".to_vec())], Default::default()); - let block10 = insert_header(&backend, 10, block9, vec![(b"key_at_10".to_vec(), b"val_at_10".to_vec())], Default::default()); - let block11 = insert_header(&backend, 11, block10, vec![(b"key_at_11".to_vec(), b"val_at_11".to_vec())], Default::default()); - let block12 = insert_header(&backend, 12, block11, vec![(b"key_at_12".to_vec(), b"val_at_12".to_vec())], Default::default()); - let block13 = insert_header(&backend, 13, block12, vec![(b"key_at_13".to_vec(), b"val_at_13".to_vec())], Default::default()); - backend.changes_tries_storage.meta.write().finalized_number = 13; - - // check that roots of all tries are in the columns::CHANGES_TRIE - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block13, number: 13 }; - fn read_changes_trie_root(backend: &Backend, num: u64) -> H256 { - backend.blockchain().header(BlockId::Number(num)).unwrap().unwrap().digest().logs().iter() - .find(|i| i.as_changes_trie_root().is_some()).unwrap().as_changes_trie_root().unwrap().clone() - } - let root1 = read_changes_trie_root(&backend, 1); assert_eq!(backend.changes_tries_storage.root(&anchor, 1).unwrap(), Some(root1)); - let root2 = read_changes_trie_root(&backend, 2); assert_eq!(backend.changes_tries_storage.root(&anchor, 2).unwrap(), Some(root2)); - let root3 = read_changes_trie_root(&backend, 3); assert_eq!(backend.changes_tries_storage.root(&anchor, 3).unwrap(), Some(root3)); - let root4 = read_changes_trie_root(&backend, 4); assert_eq!(backend.changes_tries_storage.root(&anchor, 4).unwrap(), Some(root4)); - let root5 = read_changes_trie_root(&backend, 5); assert_eq!(backend.changes_tries_storage.root(&anchor, 5).unwrap(), Some(root5)); - let root6 = read_changes_trie_root(&backend, 6); assert_eq!(backend.changes_tries_storage.root(&anchor, 6).unwrap(), Some(root6)); - let root7 = read_changes_trie_root(&backend, 7); assert_eq!(backend.changes_tries_storage.root(&anchor, 7).unwrap(), Some(root7)); - let root8 = read_changes_trie_root(&backend, 8); assert_eq!(backend.changes_tries_storage.root(&anchor, 8).unwrap(), Some(root8)); - let root9 = read_changes_trie_root(&backend, 9); assert_eq!(backend.changes_tries_storage.root(&anchor, 9).unwrap(), Some(root9)); - let root10 = read_changes_trie_root(&backend, 10); assert_eq!(backend.changes_tries_storage.root(&anchor, 10).unwrap(), Some(root10)); - let root11 = read_changes_trie_root(&backend, 11); assert_eq!(backend.changes_tries_storage.root(&anchor, 11).unwrap(), Some(root11)); - let root12 = read_changes_trie_root(&backend, 12); assert_eq!(backend.changes_tries_storage.root(&anchor, 12).unwrap(), Some(root12)); - - // now simulate finalization of block#12, causing prune of tries at #1..#4 - let mut tx = DBTransaction::new(); - backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 12); - backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root4, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root5, EMPTY_PREFIX).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root6, EMPTY_PREFIX).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root7, EMPTY_PREFIX).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root8, EMPTY_PREFIX).unwrap().is_some()); - - // now simulate finalization of block#16, causing prune of tries at #5..#8 - let mut tx = DBTransaction::new(); - backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 16); - backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root5, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root6, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root7, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root8, EMPTY_PREFIX).unwrap().is_none()); - - // now "change" pruning mode to archive && simulate finalization of block#20 - // => no changes tries are pruned, because we never prune in archive mode - backend.changes_tries_storage.min_blocks_to_keep = None; - let mut tx = DBTransaction::new(); - backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 20); - backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root9, EMPTY_PREFIX).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root10, EMPTY_PREFIX).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root11, EMPTY_PREFIX).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root12, EMPTY_PREFIX).unwrap().is_some()); - } - - #[test] - fn changes_tries_without_digest_are_pruned_on_finalization() { - let mut backend = Backend::::new_test(1000, 100); - backend.changes_tries_storage.min_blocks_to_keep = Some(4); - let config = ChangesTrieConfiguration { - digest_interval: 0, - digest_levels: 0, - }; - - // insert some blocks - let block0 = insert_header(&backend, 0, Default::default(), vec![(b"key_at_0".to_vec(), b"val_at_0".to_vec())], Default::default()); - let block1 = insert_header(&backend, 1, block0, vec![(b"key_at_1".to_vec(), b"val_at_1".to_vec())], Default::default()); - let block2 = insert_header(&backend, 2, block1, vec![(b"key_at_2".to_vec(), b"val_at_2".to_vec())], Default::default()); - let block3 = insert_header(&backend, 3, block2, vec![(b"key_at_3".to_vec(), b"val_at_3".to_vec())], Default::default()); - let block4 = insert_header(&backend, 4, block3, vec![(b"key_at_4".to_vec(), b"val_at_4".to_vec())], Default::default()); - let block5 = insert_header(&backend, 5, block4, vec![(b"key_at_5".to_vec(), b"val_at_5".to_vec())], Default::default()); - let block6 = insert_header(&backend, 6, block5, vec![(b"key_at_6".to_vec(), b"val_at_6".to_vec())], Default::default()); - - // check that roots of all tries are in the columns::CHANGES_TRIE - let anchor = sp_state_machine::ChangesTrieAnchorBlockId { hash: block6, number: 6 }; - fn read_changes_trie_root(backend: &Backend, num: u64) -> H256 { - backend.blockchain().header(BlockId::Number(num)).unwrap().unwrap().digest().logs().iter() - .find(|i| i.as_changes_trie_root().is_some()).unwrap().as_changes_trie_root().unwrap().clone() - } - - let root1 = read_changes_trie_root(&backend, 1); assert_eq!(backend.changes_tries_storage.root(&anchor, 1).unwrap(), Some(root1)); - let root2 = read_changes_trie_root(&backend, 2); assert_eq!(backend.changes_tries_storage.root(&anchor, 2).unwrap(), Some(root2)); - let root3 = read_changes_trie_root(&backend, 3); assert_eq!(backend.changes_tries_storage.root(&anchor, 3).unwrap(), Some(root3)); - let root4 = read_changes_trie_root(&backend, 4); assert_eq!(backend.changes_tries_storage.root(&anchor, 4).unwrap(), Some(root4)); - let root5 = read_changes_trie_root(&backend, 5); assert_eq!(backend.changes_tries_storage.root(&anchor, 5).unwrap(), Some(root5)); - let root6 = read_changes_trie_root(&backend, 6); assert_eq!(backend.changes_tries_storage.root(&anchor, 6).unwrap(), Some(root6)); - - // now simulate finalization of block#5, causing prune of trie at #1 - let mut tx = DBTransaction::new(); - backend.changes_tries_storage.prune(&config, &mut tx, block5, 5); - backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_some()); - - // now simulate finalization of block#6, causing prune of tries at #2 - let mut tx = DBTransaction::new(); - backend.changes_tries_storage.prune(&config, &mut tx, block6, 6); - backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3, EMPTY_PREFIX).unwrap().is_some()); - } - #[test] fn tree_route_works() { let backend = Backend::::new_test(1000, 100); let blockchain = backend.blockchain(); - let block0 = insert_header(&backend, 0, Default::default(), Vec::new(), Default::default()); + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); // fork from genesis: 3 prong. - let a1 = insert_header(&backend, 1, block0, Vec::new(), Default::default()); - let a2 = insert_header(&backend, 2, a1, Vec::new(), Default::default()); - let a3 = insert_header(&backend, 3, a2, Vec::new(), Default::default()); + let a1 = insert_header(&backend, 1, block0, None, Default::default()); + let a2 = insert_header(&backend, 2, a1, None, Default::default()); + let a3 = insert_header(&backend, 3, a2, None, Default::default()); // fork from genesis: 2 prong. - let b1 = insert_header(&backend, 1, block0, Vec::new(), H256::from([1; 32])); - let b2 = insert_header(&backend, 2, b1, Vec::new(), Default::default()); + let b1 = insert_header(&backend, 1, block0, None, H256::from([1; 32])); + let b2 = insert_header(&backend, 2, b1, None, Default::default()); { let tree_route = tree_route(blockchain, a3, b2).unwrap(); @@ -2397,8 +2059,8 @@ mod tests { let backend = Backend::::new_test(1000, 100); let blockchain = backend.blockchain(); - let block0 = insert_header(&backend, 0, Default::default(), Vec::new(), Default::default()); - let block1 = insert_header(&backend, 1, block0, Vec::new(), Default::default()); + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); + let block1 = insert_header(&backend, 1, block0, None, Default::default()); { let tree_route = tree_route(blockchain, block0, block1).unwrap(); @@ -2413,16 +2075,16 @@ mod tests { fn lowest_common_ancestor_works() { let backend = Backend::::new_test(1000, 100); let blockchain = backend.blockchain(); - let block0 = insert_header(&backend, 0, Default::default(), Vec::new(), Default::default()); + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); // fork from genesis: 3 prong. - let a1 = insert_header(&backend, 1, block0, Vec::new(), Default::default()); - let a2 = insert_header(&backend, 2, a1, Vec::new(), Default::default()); - let a3 = insert_header(&backend, 3, a2, Vec::new(), Default::default()); + let a1 = insert_header(&backend, 1, block0, None, Default::default()); + let a2 = insert_header(&backend, 2, a1, None, Default::default()); + let a3 = insert_header(&backend, 3, a2, None, Default::default()); // fork from genesis: 2 prong. - let b1 = insert_header(&backend, 1, block0, Vec::new(), H256::from([1; 32])); - let b2 = insert_header(&backend, 2, b1, Vec::new(), Default::default()); + let b1 = insert_header(&backend, 1, block0, None, H256::from([1; 32])); + let b2 = insert_header(&backend, 2, b1, None, Default::default()); { let lca = lowest_common_ancestor(blockchain, a3, b2).unwrap(); @@ -2479,14 +2141,14 @@ mod tests { let backend = Backend::::new_test(10000, 10000); let blockchain = backend.blockchain(); - let genesis = insert_header(&backend, 0, Default::default(), Vec::new(), Default::default()); + let genesis = insert_header(&backend, 0, Default::default(), None, Default::default()); let block100 = (1..=100).fold(genesis, |parent, n| { - insert_header(&backend, n, parent, Vec::new(), Default::default()) + insert_header(&backend, n, parent, None, Default::default()) }); let block7000 = (101..=7000).fold(block100, |parent, n| { - insert_header(&backend, n, parent, Vec::new(), Default::default()) + insert_header(&backend, n, parent, None, Default::default()) }); // This will cause the ancestor of `block100` to be set to `genesis` as a side-effect. @@ -2522,17 +2184,17 @@ mod tests { #[test] fn test_leaves_pruned_on_finality() { let backend: Backend = Backend::new_test(10, 10); - let block0 = insert_header(&backend, 0, Default::default(), Default::default(), Default::default()); + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); - let block1_a = insert_header(&backend, 1, block0, Default::default(), Default::default()); - let block1_b = insert_header(&backend, 1, block0, Default::default(), [1; 32].into()); - let block1_c = insert_header(&backend, 1, block0, Default::default(), [2; 32].into()); + let block1_a = insert_header(&backend, 1, block0, None, Default::default()); + let block1_b = insert_header(&backend, 1, block0, None, [1; 32].into()); + let block1_c = insert_header(&backend, 1, block0, None, [2; 32].into()); assert_eq!(backend.blockchain().leaves().unwrap(), vec![block1_a, block1_b, block1_c]); - let block2_a = insert_header(&backend, 2, block1_a, Default::default(), Default::default()); - let block2_b = insert_header(&backend, 2, block1_b, Default::default(), Default::default()); - let block2_c = insert_header(&backend, 2, block1_b, Default::default(), [1; 32].into()); + let block2_a = insert_header(&backend, 2, block1_a, None, Default::default()); + let block2_b = insert_header(&backend, 2, block1_b, None, Default::default()); + let block2_c = insert_header(&backend, 2, block1_b, None, [1; 32].into()); assert_eq!(backend.blockchain().leaves().unwrap(), vec![block2_a, block2_b, block2_c, block1_c]); @@ -2559,8 +2221,8 @@ mod tests { let backend = Backend::::new_test(10, 10); - let block0 = insert_header(&backend, 0, Default::default(), Default::default(), Default::default()); - let _ = insert_header(&backend, 1, block0, Default::default(), Default::default()); + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); + let _ = insert_header(&backend, 1, block0, None, Default::default()); let justification = Some(vec![1, 2, 3]); backend.finalize_block(BlockId::Number(1), justification.clone()).unwrap(); @@ -2575,9 +2237,11 @@ mod tests { fn test_finalize_multiple_blocks_in_single_op() { let backend = Backend::::new_test(10, 10); - let block0 = insert_header(&backend, 0, Default::default(), Default::default(), Default::default()); - let block1 = insert_header(&backend, 1, block0, Default::default(), Default::default()); - let block2 = insert_header(&backend, 2, block1, Default::default(), Default::default()); + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); + let block1 = insert_header(&backend, 1, block0, None, Default::default()); + let block2 = insert_header(&backend, 2, block1, None, Default::default()); + let block3 = insert_header(&backend, 3, block2, None, Default::default()); + let block4 = insert_header(&backend, 4, block3, None, Default::default()); { let mut op = backend.begin_operation().unwrap(); backend.begin_state_operation(&mut op, BlockId::Hash(block0)).unwrap(); @@ -2585,15 +2249,22 @@ mod tests { op.mark_finalized(BlockId::Hash(block2), None).unwrap(); backend.commit_operation(op).unwrap(); } + { + let mut op = backend.begin_operation().unwrap(); + backend.begin_state_operation(&mut op, BlockId::Hash(block2)).unwrap(); + op.mark_finalized(BlockId::Hash(block3), None).unwrap(); + op.mark_finalized(BlockId::Hash(block4), None).unwrap(); + backend.commit_operation(op).unwrap(); + } } #[test] fn test_finalize_non_sequential() { let backend = Backend::::new_test(10, 10); - let block0 = insert_header(&backend, 0, Default::default(), Default::default(), Default::default()); - let block1 = insert_header(&backend, 1, block0, Default::default(), Default::default()); - let block2 = insert_header(&backend, 2, block1, Default::default(), Default::default()); + let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); + let block1 = insert_header(&backend, 1, block0, None, Default::default()); + let block2 = insert_header(&backend, 2, block1, None, Default::default()); { let mut op = backend.begin_operation().unwrap(); backend.begin_state_operation(&mut op, BlockId::Hash(block0)).unwrap(); diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 8277f20b8d..e663fc5699 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -38,7 +38,7 @@ use codec::{Decode, Encode}; use sp_runtime::generic::{DigestItem, BlockId}; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor, HasherFor}; 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}; +use crate::utils::{self, meta_keys, DatabaseType, Meta, db_err, read_db, block_id_to_lookup_key, read_meta}; use crate::{DatabaseSettings, FrozenForDuration}; use log::{trace, warn, debug}; @@ -68,13 +68,10 @@ pub struct LightStorage { io_stats: FrozenForDuration, } -impl LightStorage - where - Block: BlockT, -{ +impl LightStorage { /// Create new storage with given settings. pub fn new(config: DatabaseSettings) -> ClientResult { - let db = crate::utils::open_database(&config, columns::META, "light")?; + let db = crate::utils::open_database::(&config, DatabaseType::Light)?; Self::from_kvdb(db as Arc<_>) } @@ -89,7 +86,7 @@ impl LightStorage } fn from_kvdb(db: Arc) -> ClientResult { - let meta = read_meta::(&*db, columns::META, columns::HEADER)?; + let meta = read_meta::(&*db, columns::HEADER)?; let cache = DbCache::new( db.clone(), columns::KEY_LOOKUP, @@ -417,7 +414,7 @@ impl LightBlockchainStorage for LightStorage fn import_header( &self, header: Block::Header, - cache_at: HashMap>, + mut cache_at: HashMap>, leaf_state: NewBlockState, aux_ops: Vec<(Vec, Option>)>, ) -> ClientResult<()> { @@ -475,6 +472,13 @@ impl LightBlockchainStorage for LightStorage )?; } + // update changes trie configuration cache + if !cache_at.contains_key(&well_known_cache_keys::CHANGES_TRIE_CONFIG) { + if let Some(new_configuration) = crate::changes_tries_storage::extract_new_configuration(&header) { + cache_at.insert(well_known_cache_keys::CHANGES_TRIE_CONFIG, new_configuration.encode()); + } + } + { let mut cache = self.cache.0.write(); let cache_ops = cache.transaction(&mut transaction) @@ -487,8 +491,11 @@ impl LightBlockchainStorage for LightStorage .into_ops(); debug!("Light DB Commit {:?} ({})", hash, number); + self.db.write(transaction).map_err(db_err)?; - cache.commit(cache_ops); + cache.commit(cache_ops) + .expect("only fails if cache with given name isn't loaded yet;\ + cache is already loaded because there are cache_ops; qed"); } self.update_meta(hash, number, leaf_state.is_best(), finalized); @@ -543,7 +550,9 @@ impl LightBlockchainStorage for LightStorage .into_ops(); self.db.write(transaction).map_err(db_err)?; - cache.commit(cache_ops); + cache.commit(cache_ops) + .expect("only fails if cache with given name isn't loaded yet;\ + cache is already loaded because there are cache_ops; qed"); } self.update_meta(hash, header.number().clone(), false, true); @@ -603,7 +612,8 @@ fn cht_key>(cht_type: u8, block: N) -> ClientResult<[u8; 5]> { #[cfg(test)] pub(crate) mod tests { use sc_client::cht; - use sp_runtime::generic::DigestItem; + use sp_core::ChangesTrieConfiguration; + use sp_runtime::generic::{DigestItem, ChangesTrieSignal}; use sp_runtime::testing::{H256 as Hash, Header, Block as RawBlock, ExtrinsicWrapper}; use sp_blockchain::{lowest_common_ancestor, tree_route}; use super::*; @@ -964,7 +974,7 @@ pub(crate) mod tests { } fn get_authorities(cache: &dyn BlockchainCache, at: BlockId) -> Option> { - cache.get_at(&well_known_cache_keys::AUTHORITIES, &at) + cache.get_at(&well_known_cache_keys::AUTHORITIES, &at).unwrap_or(None) .and_then(|(_, _, val)| Decode::decode(&mut &val[..]).ok()) } @@ -1148,8 +1158,8 @@ pub(crate) mod tests { let (genesis_hash, storage) = { let db = LightStorage::::new_test(); - // before cache is initialized => None - assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + // before cache is initialized => Err + assert!(db.cache().get_at(b"test", &BlockId::Number(0)).is_err()); // insert genesis block (no value for cache is provided) let mut genesis_hash = None; @@ -1160,14 +1170,14 @@ pub(crate) mod tests { }); // after genesis is inserted => None - assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)).unwrap(), None); // initialize cache db.cache().initialize(b"test", vec![42]).unwrap(); // after genesis is inserted + cache is initialized => Some assert_eq!( - db.cache().get_at(b"test", &BlockId::Number(0)), + db.cache().get_at(b"test", &BlockId::Number(0)).unwrap(), Some(((0, genesis_hash.unwrap()), None, vec![42])), ); @@ -1177,8 +1187,37 @@ pub(crate) mod tests { // restart && check that after restart value is read from the cache let db = LightStorage::::from_kvdb(storage as Arc<_>).expect("failed to create test-db"); assert_eq!( - db.cache().get_at(b"test", &BlockId::Number(0)), + db.cache().get_at(b"test", &BlockId::Number(0)).unwrap(), Some(((0, genesis_hash.unwrap()), None, vec![42])), ); } + + #[test] + fn changes_trie_configuration_is_tracked_on_light_client() { + let db = LightStorage::::new_test(); + + let new_config = Some(ChangesTrieConfiguration::new(2, 2)); + + // insert block#0 && block#1 (no value for cache is provided) + let hash0 = insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); + assert_eq!( + db.cache().get_at(&well_known_cache_keys::CHANGES_TRIE_CONFIG, &BlockId::Number(0)).unwrap() + .map(|(_, _, v)| ChangesTrieConfiguration::decode(&mut &v[..]).unwrap()), + None, + ); + + // insert configuration at block#1 (starts from block#2) + insert_block(&db, HashMap::new(), || { + let mut header = default_header(&hash0, 1); + header.digest_mut().push( + DigestItem::ChangesTrieSignal(ChangesTrieSignal::NewConfiguration(new_config.clone())) + ); + header + }); + assert_eq!( + db.cache().get_at(&well_known_cache_keys::CHANGES_TRIE_CONFIG, &BlockId::Number(1)).unwrap() + .map(|(_, _, v)| Option::::decode(&mut &v[..]).unwrap()), + Some(new_config), + ); + } } diff --git a/client/db/src/upgrade.rs b/client/db/src/upgrade.rs new file mode 100644 index 0000000000..ab2d4bbf79 --- /dev/null +++ b/client/db/src/upgrade.rs @@ -0,0 +1,198 @@ +// Copyright 2019-2020 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 . + +//! Database upgrade logic. + +use std::fs; +use std::io::{Read, Write, ErrorKind}; +use std::path::{Path, PathBuf}; +use std::sync::Arc; + +use codec::Encode; +use kvdb_rocksdb::{Database, DatabaseConfig}; +use parking_lot::RwLock; +use sp_blockchain::{well_known_cache_keys, Cache}; +use sp_core::ChangesTrieConfiguration; +use sp_runtime::traits::Block as BlockT; +use crate::{ + cache::{ComplexBlockId, DbCache, DbCacheSync}, + utils::{DatabaseType, check_database_type, db_err, read_genesis_hash}, +}; + +/// Version file name. +const VERSION_FILE_NAME: &'static str = "db_version"; + +/// Current db version. +const CURRENT_VERSION: u32 = 1; + +/// Number of columns in v0. +const V0_NUM_COLUMNS: u32 = 10; + +/// Upgrade database to current version. +pub fn upgrade_db(db_path: &Path, db_type: DatabaseType) -> sp_blockchain::Result<()> { + let db_version = current_version(db_path)?; + match db_version { + 0 => migrate_0_to_1::(db_path, db_type)?, + 1 => (), + _ => Err(sp_blockchain::Error::Backend(format!("Future database version: {}", db_version)))?, + } + + update_version(db_path) +} + +/// Migration from version0 to version1: +/// 1) the number of columns has changed from 10 to 11; +/// 2) changes tries configuration are now cached. +fn migrate_0_to_1(db_path: &Path, db_type: DatabaseType) -> sp_blockchain::Result<()> { + { + let db = open_database(db_path, db_type, V0_NUM_COLUMNS)?; + db.add_column().map_err(db_err)?; + db.flush().map_err(db_err)?; + } + + let db = open_database(db_path, db_type, V0_NUM_COLUMNS + 1)?; + + const V0_FULL_KEY_LOOKUP_COLUMN: u32 = 3; + const V0_FULL_HEADER_COLUMN: u32 = 4; + const V0_FULL_CACHE_COLUMN: u32 = 10; // that's the column we have just added + const V0_LIGHT_KEY_LOOKUP_COLUMN: u32 = 1; + const V0_LIGHT_HEADER_COLUMN: u32 = 2; + const V0_LIGHT_CACHE_COLUMN: u32 = 3; + + let (key_lookup_column, header_column, cache_column) = match db_type { + DatabaseType::Full => ( + V0_FULL_KEY_LOOKUP_COLUMN, + V0_FULL_HEADER_COLUMN, + V0_FULL_CACHE_COLUMN, + ), + DatabaseType::Light => ( + V0_LIGHT_KEY_LOOKUP_COLUMN, + V0_LIGHT_HEADER_COLUMN, + V0_LIGHT_CACHE_COLUMN, + ), + }; + + let genesis_hash: Option = read_genesis_hash(&db)?; + if let Some(genesis_hash) = genesis_hash { + let cache: DbCacheSync = DbCacheSync(RwLock::new(DbCache::new( + Arc::new(db), + key_lookup_column, + header_column, + cache_column, + genesis_hash, + ComplexBlockId::new(genesis_hash, 0.into()), + ))); + let changes_trie_config: Option = None; + cache.initialize(&well_known_cache_keys::CHANGES_TRIE_CONFIG, changes_trie_config.encode())?; + } + + Ok(()) +} + +/// Reads current database version from the file at given path. +/// If the file does not exist returns 0. +fn current_version(path: &Path) -> sp_blockchain::Result { + let unknown_version_err = || sp_blockchain::Error::Backend("Unknown database version".into()); + + match fs::File::open(version_file_path(path)) { + Err(ref err) if err.kind() == ErrorKind::NotFound => Ok(0), + Err(_) => Err(unknown_version_err()), + Ok(mut file) => { + let mut s = String::new(); + file.read_to_string(&mut s).map_err(|_| unknown_version_err())?; + u32::from_str_radix(&s, 10).map_err(|_| unknown_version_err()) + }, + } +} + +/// Opens database of givent type with given number of columns. +fn open_database(db_path: &Path, db_type: DatabaseType, db_columns: u32) -> sp_blockchain::Result { + let db_path = db_path.to_str() + .ok_or_else(|| sp_blockchain::Error::Backend("Invalid database path".into()))?; + let db_cfg = DatabaseConfig::with_columns(db_columns); + let db = Database::open(&db_cfg, db_path).map_err(db_err)?; + check_database_type(&db, db_type)?; + Ok(db) +} + +/// Writes current database version to the file. +/// Creates a new file if the version file does not exist yet. +fn update_version(path: &Path) -> sp_blockchain::Result<()> { + fs::create_dir_all(path).map_err(db_err)?; + let mut file = fs::File::create(version_file_path(path)).map_err(db_err)?; + file.write_all(format!("{}", CURRENT_VERSION).as_bytes()).map_err(db_err)?; + Ok(()) +} + +/// Returns the version file path. +fn version_file_path(path: &Path) -> PathBuf { + let mut file_path = path.to_owned(); + file_path.push(VERSION_FILE_NAME); + file_path +} + +#[cfg(test)] +mod tests { + use sc_state_db::PruningMode; + use crate::{DatabaseSettings, DatabaseSettingsSrc}; + use crate::tests::Block; + use super::*; + + fn create_db(db_path: &Path, version: Option) { + let db_cfg = DatabaseConfig::with_columns(V0_NUM_COLUMNS); + Database::open(&db_cfg, db_path.to_str().unwrap()).unwrap(); + if let Some(version) = version { + fs::create_dir_all(db_path).unwrap(); + let mut file = fs::File::create(version_file_path(db_path)).unwrap(); + file.write_all(format!("{}", version).as_bytes()).unwrap(); + } + } + + fn open_database(db_path: &Path) -> sp_blockchain::Result<()> { + crate::utils::open_database::(&DatabaseSettings { + state_cache_size: 0, + state_cache_child_ratio: None, + pruning: PruningMode::ArchiveAll, + source: DatabaseSettingsSrc::Path { path: db_path.to_owned(), cache_size: None }, + }, DatabaseType::Full).map(|_| ()) + } + + #[test] + fn downgrade_never_happens() { + let db_dir = tempdir::TempDir::new("").unwrap(); + create_db(db_dir.path(), Some(CURRENT_VERSION + 1)); + assert!(open_database(db_dir.path()).is_err()); + } + + #[test] + fn open_empty_database_works() { + let db_dir = tempdir::TempDir::new("").unwrap(); + open_database(db_dir.path()).unwrap(); + open_database(db_dir.path()).unwrap(); + assert_eq!(current_version(db_dir.path()).unwrap(), CURRENT_VERSION); + } + + #[test] + fn upgrade_from_0_to_1_works() { + for version_from_file in &[None, Some(0)] { + let db_dir = tempdir::TempDir::new("").unwrap(); + let db_path = db_dir.path(); + create_db(db_path, *version_from_file); + open_database(db_path).unwrap(); + assert_eq!(current_version(db_path).unwrap(), CURRENT_VERSION); + } + } +} diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index ed7b2220aa..f7f51d7f6d 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -21,7 +21,7 @@ use std::sync::Arc; use std::{io, convert::TryInto}; use kvdb::{KeyValueDB, DBTransaction}; -#[cfg(feature = "kvdb-rocksdb")] +#[cfg(any(feature = "kvdb-rocksdb", test))] use kvdb_rocksdb::{Database, DatabaseConfig}; use log::debug; @@ -36,7 +36,7 @@ use crate::{DatabaseSettings, DatabaseSettingsSrc}; /// Number of columns in the db. Must be the same for both full && light dbs. /// Otherwise RocksDb will fail to open database && check its type. -pub const NUM_COLUMNS: u32 = 10; +pub const NUM_COLUMNS: u32 = 11; /// Meta column. The set of keys in the column is shared by full && light storages. pub const COLUMN_META: u32 = 0; @@ -50,6 +50,8 @@ pub mod meta_keys { pub const FINALIZED_BLOCK: &[u8; 5] = b"final"; /// Meta information prefix for list-based caches. pub const CACHE_META_PREFIX: &[u8; 5] = b"cache"; + /// Meta information for changes tries key. + pub const CHANGES_TRIES_META: &[u8; 5] = b"ctrie"; /// Genesis block hash. pub const GENESIS_HASH: &[u8; 3] = b"gen"; /// Leaves prefix list key. @@ -76,6 +78,15 @@ pub struct Meta { /// A block lookup key: used for canonical lookup from block number to hash pub type NumberIndexKey = [u8; 4]; +/// Database type. +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum DatabaseType { + /// Full node database. + Full, + /// Light node database. + Light, +} + /// Convert block number into short lookup key (LE representation) for /// blocks that are in the canonical chain. /// @@ -203,14 +214,17 @@ pub fn db_err(err: io::Error) -> sp_blockchain::Error { } /// Open RocksDB database. -pub fn open_database( +pub fn open_database( config: &DatabaseSettings, - col_meta: u32, - db_type: &str + db_type: DatabaseType, ) -> sp_blockchain::Result> { let db: Arc = match &config.source { - #[cfg(feature = "kvdb-rocksdb")] + #[cfg(any(feature = "kvdb-rocksdb", test))] DatabaseSettingsSrc::Path { path, cache_size } => { + // first upgrade database to required version + crate::upgrade::upgrade_db::(&path, db_type)?; + + // and now open database assuming that it has the latest version let mut db_config = DatabaseConfig::with_columns(NUM_COLUMNS); if let Some(cache_size) = cache_size { @@ -232,7 +246,7 @@ pub fn open_database( .ok_or_else(|| sp_blockchain::Error::Backend("Invalid database path".into()))?; Arc::new(Database::open(&db_config, &path).map_err(db_err)?) }, - #[cfg(not(feature = "kvdb-rocksdb"))] + #[cfg(not(any(feature = "kvdb-rocksdb", test)))] DatabaseSettingsSrc::Path { .. } => { let msg = "Try to open RocksDB database with RocksDB disabled".into(); return Err(sp_blockchain::Error::Backend(msg)); @@ -240,22 +254,28 @@ pub fn open_database( DatabaseSettingsSrc::Custom(db) => db.clone(), }; - // check database type - match db.get(col_meta, meta_keys::TYPE).map_err(db_err)? { + check_database_type(&*db, db_type)?; + + Ok(db) +} + +/// Check database type. +pub fn check_database_type(db: &dyn KeyValueDB, db_type: DatabaseType) -> sp_blockchain::Result<()> { + match db.get(COLUMN_META, meta_keys::TYPE).map_err(db_err)? { Some(stored_type) => { - if db_type.as_bytes() != &*stored_type { + if db_type.as_str().as_bytes() != &*stored_type { return Err(sp_blockchain::Error::Backend( - format!("Unexpected database type. Expected: {}", db_type)).into()); + format!("Unexpected database type. Expected: {}", db_type.as_str())).into()); } }, None => { let mut transaction = DBTransaction::new(); - transaction.put(col_meta, meta_keys::TYPE, db_type.as_bytes()); + transaction.put(COLUMN_META, meta_keys::TYPE, db_type.as_str().as_bytes()); db.write(transaction).map_err(db_err)?; }, } - Ok(db) + Ok(()) } /// Read database column entry for the given block. @@ -304,20 +324,15 @@ pub fn require_header( } /// Read meta from the database. -pub fn read_meta(db: &dyn KeyValueDB, col_meta: u32, col_header: u32) -> Result< +pub fn read_meta(db: &dyn KeyValueDB, col_header: u32) -> Result< Meta<<::Header as HeaderT>::Number, Block::Hash>, sp_blockchain::Error, > where Block: BlockT, { - let genesis_hash: Block::Hash = match db.get(col_meta, meta_keys::GENESIS_HASH).map_err(db_err)? { - Some(h) => match Decode::decode(&mut &h[..]) { - Ok(h) => h, - Err(err) => return Err(sp_blockchain::Error::Backend( - format!("Error decoding genesis hash: {}", err) - )), - }, + let genesis_hash: Block::Hash = match read_genesis_hash(db)? { + Some(genesis_hash) => genesis_hash, None => return Ok(Meta { best_hash: Default::default(), best_number: Zero::zero(), @@ -328,7 +343,7 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: u32, col_header: u32) -> }; let load_meta_block = |desc, key| -> Result<_, sp_blockchain::Error> { - if let Some(Some(header)) = db.get(col_meta, key).and_then(|id| + if let Some(Some(header)) = db.get(COLUMN_META, key).and_then(|id| match id { Some(id) => db.get(col_header, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]).ok())), None => Ok(None), @@ -354,6 +369,29 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: u32, col_header: u32) -> }) } +/// Read genesis hash from database. +pub fn read_genesis_hash(db: &dyn KeyValueDB) -> sp_blockchain::Result> { + match db.get(COLUMN_META, meta_keys::GENESIS_HASH).map_err(db_err)? { + Some(h) => match Decode::decode(&mut &h[..]) { + Ok(h) => Ok(Some(h)), + Err(err) => Err(sp_blockchain::Error::Backend( + format!("Error decoding genesis hash: {}", err) + )), + }, + None => Ok(None), + } +} + +impl DatabaseType { + /// Returns str representation of the type. + pub fn as_str(&self) -> &'static str { + match *self { + DatabaseType::Full => "full", + DatabaseType::Light => "light", + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -368,4 +406,10 @@ mod tests { _ => unreachable!(), }; } + + #[test] + fn database_type_as_str_works() { + assert_eq!(DatabaseType::Full.as_str(), "full"); + assert_eq!(DatabaseType::Light.as_str(), "light"); + } } diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 05b8f9689b..fc0b6d17ae 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -287,12 +287,10 @@ impl ApiExt for RuntimeApi { unimplemented!("Not required for testing!") } - fn into_storage_changes< - T: sp_api::ChangesTrieStorage, sp_api::NumberFor> - >( + fn into_storage_changes( &self, _: &Self::StateBackend, - _: Option<&T>, + _: Option<&sp_api::ChangesTrieState, sp_api::NumberFor>>, _: ::Hash, ) -> std::result::Result, String> where Self: Sized diff --git a/client/network/src/protocol/light_dispatch.rs b/client/network/src/protocol/light_dispatch.rs index dd94abc2a4..bfa8daa181 100644 --- a/client/network/src/protocol/light_dispatch.rs +++ b/client/network/src/protocol/light_dispatch.rs @@ -691,7 +691,7 @@ pub mod tests { use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; use libp2p::PeerId; use super::{REQUEST_TIMEOUT, LightDispatch, LightDispatchNetwork, RequestData, StorageProof}; - use sp_test_primitives::{changes_trie_config, Block, Extrinsic, Header}; + use sp_test_primitives::{Block, Extrinsic, Header}; struct DummyFetchChecker { ok: bool } @@ -1095,7 +1095,11 @@ pub mod tests { let (tx, response) = oneshot::channel(); light_dispatch.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { - changes_trie_config: changes_trie_config(), + changes_trie_configs: vec![sp_core::ChangesTrieConfigurationRange { + zero: (0, Default::default()), + end: None, + config: Some(sp_core::ChangesTrieConfiguration::new(4, 2)), + }], first_block: (1, Default::default()), last_block: (100, Default::default()), max_block: (100, Default::default()), diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index 848e80d4fb..a0ab11e977 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -21,7 +21,7 @@ use self::error::Error; use std::sync::Arc; use assert_matches::assert_matches; use futures01::stream::Stream; -use sp_core::storage::{well_known_keys, ChildInfo}; +use sp_core::{storage::{well_known_keys, ChildInfo}, ChangesTrieConfiguration}; use sp_core::hash::H256; use sp_io::hashing::blake2_256; use substrate_test_runtime_client::{ @@ -378,7 +378,9 @@ fn should_query_storage() { } run_tests(Arc::new(substrate_test_runtime_client::new())); - run_tests(Arc::new(TestClientBuilder::new().set_support_changes_trie(true).build())); + run_tests(Arc::new(TestClientBuilder::new() + .changes_trie_config(Some(ChangesTrieConfiguration::new(4, 2))) + .build())); } #[test] diff --git a/client/src/call_executor.rs b/client/src/call_executor.rs index f2095c33bb..6c685fc1b8 100644 --- a/client/src/call_executor.rs +++ b/client/src/call_executor.rs @@ -17,7 +17,7 @@ use std::{sync::Arc, panic::UnwindSafe, result, cell::RefCell}; use codec::{Encode, Decode}; use sp_runtime::{ - generic::BlockId, traits::{Block as BlockT, HasherFor}, + generic::BlockId, traits::{Block as BlockT, HasherFor, NumberFor}, }; use sp_state_machine::{ self, OverlayedChanges, Ext, ExecutionManager, StateMachine, ExecutionStrategy, @@ -80,7 +80,7 @@ where let state = self.backend.state_at(*id)?; let return_data = StateMachine::new( &state, - self.backend.changes_trie_storage(), + backend::changes_tries_state_at_block(id, self.backend.changes_trie_storage())?, &mut changes, &self.executor, method, @@ -132,6 +132,7 @@ where } let mut state = self.backend.state_at(*at)?; + let changes_trie_state = backend::changes_tries_state_at_block(at, self.backend.changes_trie_storage())?; let mut storage_transaction_cache = storage_transaction_cache.map(|c| c.borrow_mut()); @@ -150,7 +151,7 @@ where StateMachine::new( &backend, - self.backend.changes_trie_storage(), + changes_trie_state, &mut *changes.borrow_mut(), &self.executor, method, @@ -163,7 +164,7 @@ where } None => StateMachine::new( &state, - self.backend.changes_trie_storage(), + changes_trie_state, &mut *changes.borrow_mut(), &self.executor, method, @@ -183,13 +184,13 @@ where fn runtime_version(&self, id: &BlockId) -> sp_blockchain::Result { let mut overlay = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; + let changes_trie_state = backend::changes_tries_state_at_block(id, self.backend.changes_trie_storage())?; let mut cache = StorageTransactionCache::::default(); - let mut ext = Ext::new( &mut overlay, &mut cache, &state, - self.backend.changes_trie_storage(), + changes_trie_state, None, ); let version = self.executor.runtime_version(&mut ext); @@ -207,7 +208,7 @@ where method: &str, call_data: &[u8] ) -> Result<(Vec, StorageProof), sp_blockchain::Error> { - sp_state_machine::prove_execution_on_trie_backend( + sp_state_machine::prove_execution_on_trie_backend::<_, _, NumberFor, _>( trie_state, overlay, &self.executor, diff --git a/client/src/client.rs b/client/src/client.rs index efcbadb2b3..c74a005c6f 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -66,6 +66,7 @@ pub use sc_client_api::{ backend::{ self, BlockImportOperation, PrunableStateChangesTrieStorage, ClientImportOperation, Finalizer, ImportSummary, NewBlockState, + changes_tries_state_at_block, }, client::{ ImportNotifications, FinalityNotification, FinalityNotifications, BlockImportNotification, @@ -407,18 +408,26 @@ impl Client where first: NumberFor, last: BlockId, ) -> sp_blockchain::Result, BlockId)>> { - let (config, storage) = match self.require_changes_trie().ok() { - Some((config, storage)) => (config, storage), + let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?; + let last_hash = self.backend.blockchain().expect_block_hash_from_id(&last)?; + if first > last_number { + return Err(sp_blockchain::Error::ChangesTrieAccessFailed("Invalid changes trie range".into())); + } + + let (storage, configs) = match self.require_changes_trie(first, last_hash, false).ok() { + Some((storage, configs)) => (storage, configs), None => return Ok(None), }; - let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?; - if first > last_num { - return Err(sp_blockchain::Error::ChangesTrieAccessFailed("Invalid changes trie range".into())); + + let first_available_changes_trie = configs.last().map(|config| config.0); + match first_available_changes_trie { + Some(first_available_changes_trie) => { + let oldest_unpruned = storage.oldest_pruned_digest_range_end(); + let first = std::cmp::max(first_available_changes_trie, oldest_unpruned); + Ok(Some((first, last))) + }, + None => Ok(None) } - 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))) } /// Get pairs of (block, extrinsic) where key has been changed at given blocks range. @@ -432,30 +441,42 @@ impl Client where storage_key: Option<&StorageKey>, key: &StorageKey ) -> sp_blockchain::Result, u32)>> { - let (config, storage) = self.require_changes_trie()?; let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?; let last_hash = self.backend.blockchain().expect_block_hash_from_id(&last)?; + let (storage, configs) = self.require_changes_trie(first, last_hash, true)?; + + let mut result = Vec::new(); + let best_number = self.backend.blockchain().info().best_number; + for (config_zero, config_end, config) in configs { + let range_first = ::std::cmp::max(first, config_zero + One::one()); + let range_anchor = match config_end { + Some((config_end_number, config_end_hash)) => if last_number > config_end_number { + ChangesTrieAnchorBlockId { hash: config_end_hash, number: config_end_number } + } else { + ChangesTrieAnchorBlockId { hash: convert_hash(&last_hash), number: last_number } + }, + None => ChangesTrieAnchorBlockId { hash: convert_hash(&last_hash), number: last_number }, + }; - // FIXME: remove this in https://github.com/paritytech/substrate/pull/3201 - let config_range = ChangesTrieConfigurationRange { - config: &config, - zero: Zero::zero(), - end: None, - }; + let config_range = ChangesTrieConfigurationRange { + config: &config, + zero: config_zero.clone(), + end: config_end.map(|(config_end_number, _)| config_end_number), + }; + let result_range: Vec<(NumberFor, u32)> = key_changes::, _>( + config_range, + storage.storage(), + range_first, + &range_anchor, + best_number, + storage_key.as_ref().map(|x| &x.0[..]), + &key.0) + .and_then(|r| r.map(|r| r.map(|(block, tx)| (block, tx))).collect::>()) + .map_err(|err| sp_blockchain::Error::ChangesTrieAccessFailed(err))?; + result.extend(result_range); + } - key_changes::, _>( - config_range, - &*storage, - first, - &ChangesTrieAnchorBlockId { - hash: convert_hash(&last_hash), - number: last_number, - }, - self.backend.blockchain().info().best_number, - storage_key.as_ref().map(|sk| sk.0.as_slice()), - &key.0) - .and_then(|r| r.map(|r| r.map(|(block, tx)| (block, tx))).collect::>()) - .map_err(|err| sp_blockchain::Error::ChangesTrieAccessFailed(err)) + Ok(result) } /// Get proof for computation of (block, extrinsic) pairs where key has been changed at given blocks range. @@ -550,11 +571,13 @@ impl Client where } } - let (config, storage) = self.require_changes_trie()?; + let first_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(first))?; + let (storage, configs) = self.require_changes_trie(first_number, last, true)?; let min_number = self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(min))?; let recording_storage = AccessedRootsRecorder:: { - storage, + storage: storage.storage(), min: min_number, required_roots_proofs: Mutex::new(BTreeMap::new()), }; @@ -564,31 +587,31 @@ impl Client where self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(max))?, ); - // FIXME: remove this in https://github.com/paritytech/substrate/pull/3201 - let config_range = ChangesTrieConfigurationRange { - config: &config, - zero: Zero::zero(), - end: None, - }; - // fetch key changes proof - let first_number = self.backend.blockchain() - .expect_block_number_from_id(&BlockId::Hash(first))?; - let last_number = self.backend.blockchain() - .expect_block_number_from_id(&BlockId::Hash(last))?; - let key_changes_proof = key_changes_proof::, _>( - config_range, - &recording_storage, - first_number, - &ChangesTrieAnchorBlockId { - hash: convert_hash(&last), - number: last_number, - }, - max_number, - storage_key.as_ref().map(|sk| sk.0.as_slice()), - &key.0, - ) - .map_err(|err| sp_blockchain::Error::from(sp_blockchain::Error::ChangesTrieAccessFailed(err)))?; + let mut proof = Vec::new(); + for (config_zero, config_end, config) in configs { + let last_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(last))?; + let config_range = ChangesTrieConfigurationRange { + config: &config, + zero: config_zero, + end: config_end.map(|(config_end_number, _)| config_end_number), + }; + let proof_range = key_changes_proof::, _>( + config_range, + &recording_storage, + first_number, + &ChangesTrieAnchorBlockId { + hash: convert_hash(&last), + number: last_number, + }, + max_number, + storage_key.as_ref().map(|x| &x.0[..]), + &key.0, + ) + .map_err(|err| sp_blockchain::Error::ChangesTrieAccessFailed(err))?; + proof.extend(proof_range); + } // now gather proofs for all changes tries roots that were touched during key_changes_proof // execution AND are unknown (i.e. replaced with CHT) to the requester @@ -597,7 +620,7 @@ impl Client where Ok(ChangesProof { max_block: max_number, - proof: key_changes_proof, + proof, roots: roots.into_iter().map(|(n, h)| (n, convert_hash(&h))).collect(), roots_proof, }) @@ -650,14 +673,45 @@ impl Client where Ok(proof) } - /// Returns changes trie configuration and storage or an error if it is not supported. - fn require_changes_trie(&self) -> sp_blockchain::Result<(ChangesTrieConfiguration, &B::ChangesTrieStorage)> { - let config = self.changes_trie_config()?; - let storage = self.backend.changes_trie_storage(); - match (config, storage) { - (Some(config), Some(storage)) => Ok((config, storage)), - _ => Err(sp_blockchain::Error::ChangesTriesNotSupported.into()), + /// Returns changes trie storage and all configurations that have been active in the range [first; last]. + /// + /// Configurations are returned in descending order (and obviously never overlap). + /// If fail_if_disabled is false, returns maximal consequent configurations ranges, starting from last and + /// stopping on either first, or when CT have been disabled. + /// If fail_if_disabled is true, fails when there's a subrange where CT have been disabled + /// inside first..last blocks range. + fn require_changes_trie( + &self, + first: NumberFor, + last: Block::Hash, + fail_if_disabled: bool, + ) -> sp_blockchain::Result<( + &dyn PrunableStateChangesTrieStorage, + Vec<(NumberFor, Option<(NumberFor, Block::Hash)>, ChangesTrieConfiguration)>, + )> { + let storage = match self.backend.changes_trie_storage() { + Some(storage) => storage, + None => return Err(sp_blockchain::Error::ChangesTriesNotSupported), + }; + + let mut configs = Vec::with_capacity(1); + let mut current = last; + loop { + let config_range = storage.configuration_at(&BlockId::Hash(current))?; + match config_range.config { + Some(config) => configs.push((config_range.zero.0, config_range.end, config)), + None if !fail_if_disabled => return Ok((storage, configs)), + None => return Err(sp_blockchain::Error::ChangesTriesNotSupported), + } + + if config_range.zero.0 < first { + break; + } + + current = *self.backend.blockchain().expect_header(BlockId::Hash(config_range.zero.1))?.parent_hash(); } + + Ok((storage, configs)) } /// Create a new block, built on the head of the chain. @@ -988,10 +1042,14 @@ impl Client where )?; let state = self.backend.state_at(at)?; + let changes_trie_state = changes_tries_state_at_block( + &at, + self.backend.changes_trie_storage(), + )?; let gen_storage_changes = runtime_api.into_storage_changes( &state, - self.backend.changes_trie_storage(), + changes_trie_state.as_ref(), *parent_hash, ); @@ -1249,13 +1307,6 @@ impl Client where Ok(uncles) } - fn changes_trie_config(&self) -> Result, Error> { - Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info().best_number))? - .storage(well_known_keys::CHANGES_TRIE_CONFIG) - .map_err(|e| sp_blockchain::Error::from_state(Box::new(e)))? - .and_then(|c| Decode::decode(&mut &*c).ok())) - } - /// Prepare in-memory header that is used in execution environment. fn prepare_environment_block(&self, parent: &BlockId) -> sp_blockchain::Result { let parent_header = self.backend.blockchain().expect_header(*parent)?; @@ -1871,7 +1922,8 @@ pub(crate) mod tests { // prepare client ang import blocks let mut local_roots = Vec::new(); - let mut remote_client = TestClientBuilder::new().set_support_changes_trie(true).build(); + let config = Some(ChangesTrieConfiguration::new(4, 2)); + let mut remote_client = TestClientBuilder::new().changes_trie_config(config).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(); @@ -2907,13 +2959,15 @@ pub(crate) mod tests { .unwrap().build().unwrap().block; client.import(BlockOrigin::Own, b2.clone()).unwrap(); + // prepare B3 before we finalize A2, because otherwise we won't be able to + // read changes trie configuration after A2 is finalized + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default(), false) + .unwrap().build().unwrap().block; + // we will finalize A2 which should make it impossible to import a new // B3 at the same height but that doesnt't include it ClientExt::finalize_block(&client, BlockId::Hash(a2.hash()), None).unwrap(); - let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default(), false) - .unwrap().build().unwrap().block; - let import_err = client.import(BlockOrigin::Own, b3).err().unwrap(); let expected_err = ConsensusError::ClientImport( sp_blockchain::Error::NotInFinalizedChain.to_string() @@ -3050,4 +3104,104 @@ pub(crate) mod tests { check_block_b1.parent_hash = H256::random(); assert_eq!(client.check_block(check_block_b1.clone()).unwrap(), ImportResult::UnknownParent); } + + #[test] + fn imports_blocks_with_changes_tries_config_change() { + // create client with initial 4^2 configuration + let mut client = TestClientBuilder::with_default_backend() + .changes_trie_config(Some(ChangesTrieConfiguration { + digest_interval: 4, + digest_levels: 2, + })).build(); + + // =================================================================== + // blocks 1,2,3,4,5,6,7,8,9,10 are empty + // block 11 changes the key + // block 12 is the L1 digest that covers this change + // blocks 13,14,15,16,17,18,19,20,21,22 are empty + // block 23 changes the configuration to 5^1 AND is skewed digest + // =================================================================== + // blocks 24,25 are changing the key + // block 26 is empty + // block 27 changes the key + // block 28 is the L1 digest (NOT SKEWED!!!) that covers changes AND changes configuration to 3^1 + // =================================================================== + // block 29 is empty + // block 30 changes the key + // block 31 is L1 digest that covers this change + // =================================================================== + (1..11).for_each(|number| { + let block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false) + .unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (11..12).for_each(|number| { + let mut block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false).unwrap(); + block.push_storage_change(vec![42], Some(number.to_le_bytes().to_vec())).unwrap(); + let block = block.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (12..23).for_each(|number| { + let block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false) + .unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (23..24).for_each(|number| { + let mut block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false).unwrap(); + block.push_changes_trie_configuration_update(Some(ChangesTrieConfiguration { + digest_interval: 5, + digest_levels: 1, + })).unwrap(); + let block = block.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (24..26).for_each(|number| { + let mut block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false).unwrap(); + block.push_storage_change(vec![42], Some(number.to_le_bytes().to_vec())).unwrap(); + let block = block.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (26..27).for_each(|number| { + let block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false) + .unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (27..28).for_each(|number| { + let mut block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false).unwrap(); + block.push_storage_change(vec![42], Some(number.to_le_bytes().to_vec())).unwrap(); + let block = block.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (28..29).for_each(|number| { + let mut block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false).unwrap(); + block.push_changes_trie_configuration_update(Some(ChangesTrieConfiguration { + digest_interval: 3, + digest_levels: 1, + })).unwrap(); + let block = block.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (29..30).for_each(|number| { + let block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false) + .unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (30..31).for_each(|number| { + let mut block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false).unwrap(); + block.push_storage_change(vec![42], Some(number.to_le_bytes().to_vec())).unwrap(); + let block = block.build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + (31..32).for_each(|number| { + let block = client.new_block_at(&BlockId::Number(number - 1), Default::default(), false) + .unwrap().build().unwrap().block; + client.import(BlockOrigin::Own, block).unwrap(); + }); + + // now check that configuration cache works + assert_eq!( + client.key_changes(1, BlockId::Number(31), None, &StorageKey(vec![42])).unwrap(), + vec![(30, 0), (27, 0), (25, 0), (24, 0), (11, 0)] + ); + } } diff --git a/client/src/genesis.rs b/client/src/genesis.rs index 6dd6e2ec43..fccdd71817 100644 --- a/client/src/genesis.rs +++ b/client/src/genesis.rs @@ -45,7 +45,7 @@ mod tests { use codec::{Encode, Decode, Joiner}; use sc_executor::native_executor_instance; use sp_state_machine::{ - StateMachine, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage, + StateMachine, OverlayedChanges, ExecutionStrategy, InMemoryBackend, }; use substrate_test_runtime_client::{ @@ -92,7 +92,7 @@ mod tests { StateMachine::new( backend, - Some(&InMemoryChangesTrieStorage::<_, u64>::new()), + sp_state_machine::disabled_changes_trie_state::<_, u64>(), &mut overlay, &executor(), "Core_initialize_block", @@ -105,7 +105,7 @@ mod tests { for tx in transactions.iter() { StateMachine::new( backend, - Some(&InMemoryChangesTrieStorage::<_, u64>::new()), + sp_state_machine::disabled_changes_trie_state::<_, u64>(), &mut overlay, &executor(), "BlockBuilder_apply_extrinsic", @@ -118,7 +118,7 @@ mod tests { let ret_data = StateMachine::new( backend, - Some(&InMemoryChangesTrieStorage::<_, u64>::new()), + sp_state_machine::disabled_changes_trie_state::<_, u64>(), &mut overlay, &executor(), "BlockBuilder_finalize_block", @@ -150,7 +150,7 @@ mod tests { #[test] fn construct_genesis_should_work_with_native() { let mut storage = GenesisConfig::new( - false, + None, vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 1000, @@ -165,7 +165,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = StateMachine::new( &backend, - Some(&InMemoryChangesTrieStorage::<_, u64>::new()), + sp_state_machine::disabled_changes_trie_state::<_, u64>(), &mut overlay, &executor(), "Core_execute_block", @@ -178,7 +178,7 @@ mod tests { #[test] fn construct_genesis_should_work_with_wasm() { - let mut storage = GenesisConfig::new(false, + let mut storage = GenesisConfig::new(None, vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 1000, @@ -193,7 +193,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = StateMachine::new( &backend, - Some(&InMemoryChangesTrieStorage::<_, u64>::new()), + sp_state_machine::disabled_changes_trie_state::<_, u64>(), &mut overlay, &executor(), "Core_execute_block", @@ -206,7 +206,7 @@ mod tests { #[test] fn construct_genesis_with_bad_transaction_should_panic() { - let mut storage = GenesisConfig::new(false, + let mut storage = GenesisConfig::new(None, vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], 68, @@ -221,7 +221,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let r = StateMachine::new( &backend, - Some(&InMemoryChangesTrieStorage::<_, u64>::new()), + sp_state_machine::disabled_changes_trie_state::<_, u64>(), &mut overlay, &executor(), "Core_execute_block", diff --git a/client/src/in_mem.rs b/client/src/in_mem.rs index 5d0d14c1cb..42a5e90101 100644 --- a/client/src/in_mem.rs +++ b/client/src/in_mem.rs @@ -16,22 +16,17 @@ //! In memory client backend -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::sync::Arc; use parking_lot::RwLock; -use sp_core::{ChangesTrieConfiguration, storage::well_known_keys}; +use sp_core::storage::well_known_keys; use sp_core::offchain::storage::{ InMemOffchainStorage as OffchainStorage }; -use sp_runtime::generic::{BlockId, DigestItem}; +use sp_runtime::generic::BlockId; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor, HasherFor}; use sp_runtime::{Justification, Storage}; -use sp_state_machine::{ - InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId, ChangesTrieTransaction, - InMemoryBackend, Backend as StateBackend, -}; -use hash_db::Prefix; -use sp_trie::MemoryDB; +use sp_state_machine::{ChangesTrieTransaction, InMemoryBackend, Backend as StateBackend}; use sp_blockchain::{CachedHeaderMetadata, HeaderMetadata}; use sc_client_api::{ @@ -466,7 +461,6 @@ pub struct BlockImportOperation { pending_cache: HashMap>, old_state: InMemoryBackend>, new_state: Option>>, - changes_trie_update: Option>>, aux: Vec<(Vec, Option>)>, finalized_blocks: Vec<(BlockId, Option)>, set_head: Option>, @@ -510,9 +504,8 @@ impl backend::BlockImportOperation for BlockImportOperatio fn update_changes_trie( &mut self, - update: ChangesTrieTransaction, NumberFor>, + _update: ChangesTrieTransaction, NumberFor>, ) -> sp_blockchain::Result<()> { - self.changes_trie_update = Some(update.0); Ok(()) } @@ -569,7 +562,6 @@ impl backend::BlockImportOperation for BlockImportOperatio /// > struct for testing purposes. Do **NOT** use in production. pub struct Backend where Block::Hash: Ord { states: RwLock>>>, - changes_trie_storage: ChangesTrieStorage, blockchain: Blockchain, import_lock: RwLock<()>, } @@ -579,7 +571,6 @@ impl Backend where Block::Hash: Ord { pub fn new() -> Self { Backend { states: RwLock::new(HashMap::new()), - changes_trie_storage: ChangesTrieStorage(InMemoryChangesTrieStorage::new()), blockchain: Blockchain::new(), import_lock: Default::default(), } @@ -606,7 +597,6 @@ impl backend::Backend for Backend where Block::Hash type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; type State = InMemoryBackend>; - type ChangesTrieStorage = ChangesTrieStorage; type OffchainStorage = OffchainStorage; fn begin_operation(&self) -> sp_blockchain::Result { @@ -616,7 +606,6 @@ impl backend::Backend for Backend where Block::Hash pending_cache: Default::default(), old_state, new_state: None, - changes_trie_update: None, aux: Default::default(), finalized_blocks: Default::default(), set_head: None, @@ -647,17 +636,6 @@ impl backend::Backend for Backend where Block::Hash self.states.write().insert(hash, operation.new_state.unwrap_or_else(|| old_state.clone())); - 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 { - self.changes_trie_storage.0.insert( - *header.number(), - changes_trie_root, - changes_trie_update - ); - } - } - self.blockchain.insert(hash, header, justification, body, pending_block.state)?; } @@ -688,8 +666,8 @@ impl backend::Backend for Backend where Block::Hash None } - fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage> { - Some(&self.changes_trie_storage) + fn changes_trie_storage(&self) -> Option<&dyn backend::PrunableStateChangesTrieStorage> { + None } fn offchain_storage(&self) -> Option { @@ -737,66 +715,6 @@ impl backend::RemoteBackend for Backend where Block } } -/// Prunable in-memory changes trie storage. -pub struct ChangesTrieStorage( - InMemoryChangesTrieStorage, NumberFor> -); - -impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { - fn oldest_changes_trie_block( - &self, - _config: &ChangesTrieConfiguration, - _best_finalized: NumberFor, - ) -> NumberFor { - Zero::zero() - } -} - -impl sp_state_machine::ChangesTrieRootsStorage, NumberFor> for - ChangesTrieStorage -{ - fn build_anchor( - &self, - _hash: Block::Hash, - ) -> Result>, String> { - Err("Dummy implementation".into()) - } - - fn root( - &self, - _anchor: &ChangesTrieAnchorBlockId>, - _block: NumberFor, - ) -> Result, String> { - Err("Dummy implementation".into()) - } -} - -impl sp_state_machine::ChangesTrieStorage, NumberFor> for - ChangesTrieStorage -{ - fn as_roots_storage(&self) - -> &dyn sp_state_machine::ChangesTrieRootsStorage, NumberFor> - { - self - } - - fn with_cached_changed_keys( - &self, - _root: &Block::Hash, - _functor: &mut dyn FnMut(&HashMap>, HashSet>>), - ) -> bool { - false - } - - fn get( - &self, - key: &Block::Hash, - prefix: Prefix, - ) -> Result, String> { - self.0.get(key, prefix) - } -} - /// Check that genesis storage is valid. pub fn check_genesis_storage(storage: &Storage) -> sp_blockchain::Result<()> { if storage.top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { diff --git a/client/src/light/backend.rs b/client/src/light/backend.rs index 65fd94e323..2afb269d48 100644 --- a/client/src/light/backend.rs +++ b/client/src/light/backend.rs @@ -21,19 +21,22 @@ use std::collections::HashMap; use std::sync::Arc; use parking_lot::RwLock; -use sp_core::storage::{ChildInfo, OwnedChildInfo}; +use codec::{Decode, Encode}; + +use sp_core::ChangesTrieConfiguration; +use sp_core::storage::{well_known_keys, ChildInfo, OwnedChildInfo}; use sp_core::offchain::storage::InMemOffchainStorage; use sp_state_machine::{ Backend as StateBackend, TrieBackend, InMemoryBackend, ChangesTrieTransaction }; use sp_runtime::{generic::BlockId, Justification, Storage}; use sp_runtime::traits::{Block as BlockT, NumberFor, Zero, Header, HasherFor}; -use crate::in_mem::{self, check_genesis_storage}; +use crate::in_mem::check_genesis_storage; use sp_blockchain::{Error as ClientError, Result as ClientResult}; use sc_client_api::{ backend::{ AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState, - StorageCollection, ChildStorageCollection, + StorageCollection, ChildStorageCollection, PrunableStateChangesTrieStorage, }, blockchain::{ HeaderBackend as BlockchainHeaderBackend, well_known_cache_keys, @@ -62,6 +65,7 @@ pub struct ImportOperation { finalized_blocks: Vec>, set_head: Option>, storage_update: Option>>, + changes_trie_config_update: Option>, _phantom: std::marker::PhantomData, } @@ -115,7 +119,6 @@ impl ClientBackend for Backend> type BlockImportOperation = ImportOperation; type Blockchain = Blockchain; type State = GenesisOrUnavailableState>; - type ChangesTrieStorage = in_mem::ChangesTrieStorage; type OffchainStorage = InMemOffchainStorage; fn begin_operation(&self) -> ClientResult { @@ -127,6 +130,7 @@ impl ClientBackend for Backend> finalized_blocks: Vec::new(), set_head: None, storage_update: None, + changes_trie_config_update: None, _phantom: Default::default(), }) } @@ -148,6 +152,9 @@ impl ClientBackend for Backend> if let Some(header) = operation.header { let is_genesis_import = header.number().is_zero(); + if let Some(new_config) = operation.changes_trie_config_update { + operation.cache.insert(well_known_cache_keys::CHANGES_TRIE_CONFIG, new_config.encode()); + } self.blockchain.storage().import_header( header, operation.cache, @@ -194,7 +201,7 @@ impl ClientBackend for Backend> self.blockchain.storage().usage_info() } - fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage> { + fn changes_trie_storage(&self) -> Option<&dyn PrunableStateChangesTrieStorage> { None } @@ -296,6 +303,13 @@ impl BlockImportOperation for ImportOperation fn reset_storage(&mut self, input: Storage) -> ClientResult { check_genesis_storage(&input)?; + // changes trie configuration + let changes_trie_config = input.top.iter() + .find(|(k, _)| &k[..] == well_known_keys::CHANGES_TRIE_CONFIG) + .map(|(_, v)| Decode::decode(&mut &v[..]) + .expect("changes trie configuration is encoded properly at genesis")); + self.changes_trie_config_update = Some(changes_trie_config); + // this is only called when genesis block is imported => shouldn't be performance bottleneck let mut storage: HashMap, OwnedChildInfo)>, _> = HashMap::new(); storage.insert(None, input.top); diff --git a/client/src/light/call_executor.rs b/client/src/light/call_executor.rs index 9ac88103e8..01a93c7821 100644 --- a/client/src/light/call_executor.rs +++ b/client/src/light/call_executor.rs @@ -259,7 +259,7 @@ fn check_execution_proof_with_make_header( + execution_proof_check_on_trie_backend::( &trie_backend, &mut changes, executor, @@ -268,7 +268,7 @@ fn check_execution_proof_with_make_header( + execution_proof_check_on_trie_backend::( &trie_backend, &mut changes, executor, diff --git a/client/src/light/fetcher.rs b/client/src/light/fetcher.rs index a35bfdc25c..d66108b7f0 100644 --- a/client/src/light/fetcher.rs +++ b/client/src/light/fetcher.rs @@ -25,12 +25,12 @@ use codec::{Decode, Encode}; use sp_core::{convert_hash, traits::CodeExecutor}; use sp_runtime::traits::{ Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, - SimpleArithmetic, CheckedConversion, Zero, + SimpleArithmetic, CheckedConversion, }; use sp_state_machine::{ ChangesTrieRootsStorage, ChangesTrieAnchorBlockId, ChangesTrieConfigurationRange, - TrieBackend, read_proof_check, key_changes_proof_check, create_proof_check_backend_storage, - read_child_proof_check, + InMemoryChangesTrieStorage, TrieBackend, read_proof_check, key_changes_proof_check_with_db, + create_proof_check_backend_storage, read_child_proof_check, }; pub use sp_state_machine::StorageProof; use sp_blockchain::{Error as ClientError, Result as ClientResult}; @@ -113,30 +113,34 @@ impl> LightDataChecker { )?; } - // FIXME: remove this in https://github.com/paritytech/substrate/pull/3201 - let changes_trie_config_range = ChangesTrieConfigurationRange { - config: &request.changes_trie_config, - zero: Zero::zero(), - end: None, - }; - // and now check the key changes proof + get the changes - key_changes_proof_check::( - changes_trie_config_range, - &RootsStorage { - roots: (request.tries_roots.0, &request.tries_roots.2), - prev_roots: remote_roots, - }, - remote_proof, - request.first_block.0, - &ChangesTrieAnchorBlockId { - hash: convert_hash(&request.last_block.1), - number: request.last_block.0, - }, - remote_max_block, - request.storage_key.as_ref().map(Vec::as_slice), - &request.key) - .map_err(|err| ClientError::ChangesTrieAccessFailed(err)) + let mut result = Vec::new(); + let proof_storage = InMemoryChangesTrieStorage::with_proof(remote_proof); + for config_range in &request.changes_trie_configs { + let result_range = key_changes_proof_check_with_db::( + ChangesTrieConfigurationRange { + config: config_range.config.as_ref().ok_or(ClientError::ChangesTriesNotSupported)?, + zero: config_range.zero.0, + end: config_range.end.map(|(n, _)| n), + }, + &RootsStorage { + roots: (request.tries_roots.0, &request.tries_roots.2), + prev_roots: &remote_roots, + }, + &proof_storage, + request.first_block.0, + &ChangesTrieAnchorBlockId { + hash: convert_hash(&request.last_block.1), + number: request.last_block.0, + }, + remote_max_block, + request.storage_key.as_ref().map(Vec::as_slice), + &request.key) + .map_err(|err| ClientError::ChangesTrieAccessFailed(err))?; + result.extend(result_range); + } + + Ok(result) } /// Check CHT-based proof for changes tries roots. @@ -284,7 +288,7 @@ impl FetchChecker for LightDataChecker /// A view of BTreeMap as a changes trie roots storage. struct RootsStorage<'a, Number: SimpleArithmetic, Hash: 'a> { roots: (Number, &'a [Hash]), - prev_roots: BTreeMap, + prev_roots: &'a BTreeMap, } impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> @@ -340,7 +344,7 @@ pub mod tests { use crate::in_mem::{Blockchain as InMemoryBlockchain}; use crate::light::fetcher::{FetchChecker, LightDataChecker, RemoteHeaderRequest}; use crate::light::blockchain::tests::{DummyStorage, DummyBlockchain}; - use sp_core::{blake2_256, Blake2Hasher, H256}; + use sp_core::{blake2_256, Blake2Hasher, ChangesTrieConfiguration, H256}; use sp_core::storage::{well_known_keys, StorageKey, ChildInfo}; use sp_runtime::generic::BlockId; use sp_state_machine::Backend; @@ -569,8 +573,13 @@ pub mod tests { // check proof on local client let local_roots_range = local_roots.clone()[(begin - 1) as usize..].to_vec(); + let config = ChangesTrieConfiguration::new(4, 2); let request = RemoteChangesRequest::
{ - changes_trie_config: runtime::changes_trie_config(), + changes_trie_configs: vec![sp_core::ChangesTrieConfigurationRange { + zero: (0, Default::default()), + end: None, + config: Some(config), + }], first_block: (begin, begin_hash), last_block: (end, end_hash), max_block: (max, max_hash), @@ -624,8 +633,13 @@ pub mod tests { ); // check proof on local client + let config = ChangesTrieConfiguration::new(4, 2); let request = RemoteChangesRequest::
{ - changes_trie_config: runtime::changes_trie_config(), + changes_trie_configs: vec![sp_core::ChangesTrieConfigurationRange { + zero: (0, Default::default()), + end: None, + config: Some(config), + }], first_block: (1, b1), last_block: (4, b4), max_block: (4, b4), @@ -665,8 +679,13 @@ pub mod tests { begin_hash, end_hash, begin_hash, max_hash, None, &key).unwrap(); let local_roots_range = local_roots.clone()[(begin - 1) as usize..].to_vec(); + let config = ChangesTrieConfiguration::new(4, 2); let request = RemoteChangesRequest::
{ - changes_trie_config: runtime::changes_trie_config(), + changes_trie_configs: vec![sp_core::ChangesTrieConfigurationRange { + zero: (0, Default::default()), + end: None, + config: Some(config), + }], first_block: (begin, begin_hash), last_block: (end, end_hash), max_block: (max, max_hash), diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 174eb733af..478fd780b9 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -110,7 +110,7 @@ use sp_runtime::{ }, }; -use sp_core::storage::well_known_keys; +use sp_core::{ChangesTrieConfiguration, storage::well_known_keys}; use frame_support::{ decl_module, decl_event, decl_storage, decl_error, storage, Parameter, traits::{Contains, Get, ModuleToIndex, OnReapAccount}, @@ -121,9 +121,6 @@ use codec::{Encode, Decode}; #[cfg(any(feature = "std", test))] use sp_io::TestExternalities; -#[cfg(any(feature = "std", test))] -use sp_core::ChangesTrieConfiguration; - pub mod offchain; /// Handler for when a new account has been created. @@ -293,6 +290,24 @@ decl_module! { storage::unhashed::put_raw(well_known_keys::CODE, &code); } + /// Set the new changes trie configuration. + #[weight = SimpleDispatchInfo::FixedOperational(20_000)] + pub fn set_changes_trie_config(origin, changes_trie_config: Option) { + ensure_root(origin)?; + match changes_trie_config.clone() { + Some(changes_trie_config) => storage::unhashed::put_raw( + well_known_keys::CHANGES_TRIE_CONFIG, + &changes_trie_config.encode(), + ), + None => storage::unhashed::kill(well_known_keys::CHANGES_TRIE_CONFIG), + } + + let log = generic::DigestItem::ChangesTrieSignal( + generic::ChangesTrieSignal::NewConfiguration(changes_trie_config), + ); + Self::deposit_log(log.into()); + } + /// Set some items of storage. #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_storage(origin, items: Vec) { diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index dc4031fbc4..770a843bfa 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -323,12 +323,13 @@ fn generate_runtime_api_base_structures() -> Result { }) } - fn into_storage_changes< - T: #crate_::ChangesTrieStorage<#crate_::HasherFor, #crate_::NumberFor> - >( + fn into_storage_changes( &self, backend: &Self::StateBackend, - changes_trie_storage: Option<&T>, + changes_trie_state: Option<&#crate_::ChangesTrieState< + #crate_::HasherFor, + #crate_::NumberFor, + >>, parent_hash: Block::Hash, ) -> std::result::Result< #crate_::StorageChanges, @@ -337,7 +338,7 @@ fn generate_runtime_api_base_structures() -> Result { self.initialized_block.borrow_mut().take(); self.changes.replace(Default::default()).into_storage_changes( backend, - changes_trie_storage, + changes_trie_state, parent_hash, self.storage_transaction_cache.replace(Default::default()), ) diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index 122e863228..bde00d4817 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -36,7 +36,7 @@ extern crate self as sp_api; #[doc(hidden)] #[cfg(feature = "std")] pub use sp_state_machine::{ - OverlayedChanges, StorageProof, Backend as StateBackend, ChangesTrieStorage, + OverlayedChanges, StorageProof, Backend as StateBackend, ChangesTrieState, }; #[doc(hidden)] #[cfg(feature = "std")] @@ -325,10 +325,10 @@ pub trait ApiExt: ApiErrorExt { /// api functions. /// /// After executing this function, all collected changes are reset. - fn into_storage_changes, NumberFor>>( + fn into_storage_changes( &self, backend: &Self::StateBackend, - changes_trie_storage: Option<&T>, + changes_trie_state: Option<&ChangesTrieState, NumberFor>>, parent_hash: Block::Hash, ) -> Result, String> where Self: Sized; } diff --git a/primitives/api/test/tests/runtime_calls.rs b/primitives/api/test/tests/runtime_calls.rs index f45df7c517..66412edae0 100644 --- a/primitives/api/test/tests/runtime_calls.rs +++ b/primitives/api/test/tests/runtime_calls.rs @@ -185,7 +185,7 @@ fn record_proof_works() { // Use the proof backend to execute `execute_block`. let mut overlay = Default::default(); let executor = NativeExecutor::::new(WasmExecutionMethod::Interpreted, None); - execution_proof_check_on_trie_backend( + execution_proof_check_on_trie_backend::<_, u64, _>( &backend, &mut overlay, &executor, diff --git a/primitives/blockchain/src/backend.rs b/primitives/blockchain/src/backend.rs index 8571d76801..101dcd1443 100644 --- a/primitives/blockchain/src/backend.rs +++ b/primitives/blockchain/src/backend.rs @@ -228,11 +228,13 @@ pub trait Cache: Send + Sync { /// Returns cached value by the given key. /// /// Returned tuple is the range where value has been active and the value itself. + /// Fails if read from cache storage fails or if the value for block is discarded + /// (i.e. if block is earlier that best finalized, but it is not in canonical chain). fn get_at( &self, key: &well_known_cache_keys::Id, block: &BlockId, - ) -> Option<((NumberFor, Block::Hash), Option<(NumberFor, Block::Hash)>, Vec)>; + ) -> Result, Block::Hash), Option<(NumberFor, Block::Hash)>, Vec)>>; } /// Blockchain info diff --git a/primitives/blockchain/src/error.rs b/primitives/blockchain/src/error.rs index dbab93738e..d51ab787c7 100644 --- a/primitives/blockchain/src/error.rs +++ b/primitives/blockchain/src/error.rs @@ -106,6 +106,9 @@ pub enum Error { /// Changes tries are not supported. #[display(fmt = "Changes tries are not supported by the runtime")] ChangesTriesNotSupported, + /// Error reading changes tries configuration. + #[display(fmt = "Error reading changes tries configuration")] + ErrorReadingChangesTriesConfig, /// Key changes query has failed. #[display(fmt = "Failed to check changes proof: {}", _0)] #[from(ignore)] diff --git a/primitives/core/src/changes_trie.rs b/primitives/core/src/changes_trie.rs index 65619a9d45..d38761ccf0 100644 --- a/primitives/core/src/changes_trie.rs +++ b/primitives/core/src/changes_trie.rs @@ -38,6 +38,17 @@ pub struct ChangesTrieConfiguration { pub digest_levels: u32, } +/// Substrate changes trie configuration range. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ChangesTrieConfigurationRange { + /// Zero block of configuration. + pub zero: (Number, Hash), + /// Last block of configuration (if configuration has been deactivated at some point). + pub end: Option<(Number, Hash)>, + /// The configuration itself. None if changes tries were disabled in this range. + pub config: Option, +} + impl ChangesTrieConfiguration { /// Create new configuration given digest interval and levels. pub fn new(digest_interval: u32, digest_levels: u32) -> Self { diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index 32e65de40d..ee768ee4a6 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -75,7 +75,7 @@ mod tests; pub use self::hash::{H160, H256, H512, convert_hash}; pub use self::uint::U256; -pub use changes_trie::ChangesTrieConfiguration; +pub use changes_trie::{ChangesTrieConfiguration, ChangesTrieConfigurationRange}; #[cfg(feature = "full_crypto")] pub use crypto::{DeriveJunction, Pair, Public}; diff --git a/primitives/runtime/src/generic/digest.rs b/primitives/runtime/src/generic/digest.rs index 6653cfb8a8..fef02d4f00 100644 --- a/primitives/runtime/src/generic/digest.rs +++ b/primitives/runtime/src/generic/digest.rs @@ -23,7 +23,7 @@ use sp_std::prelude::*; use crate::ConsensusEngineId; use crate::codec::{Decode, Encode, Input, Error}; -use sp_core::RuntimeDebug; +use sp_core::{ChangesTrieConfiguration, RuntimeDebug}; /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] @@ -97,10 +97,32 @@ pub enum DigestItem { /// by runtimes. Seal(ConsensusEngineId, Vec), + /// Digest item that contains signal from changes tries manager to the + /// native code. + ChangesTrieSignal(ChangesTrieSignal), + /// Some other thing. Unsupported and experimental. Other(Vec), } +/// Available changes trie signals. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum ChangesTrieSignal { + /// New changes trie configuration is enacted, starting from **next block**. + /// + /// The block that emits this signal will contain changes trie (CT) that covers + /// blocks range [BEGIN; current block], where BEGIN is (order matters): + /// - LAST_TOP_LEVEL_DIGEST_BLOCK+1 if top level digest CT has ever been created + /// using current configuration AND the last top level digest CT has been created + /// at block LAST_TOP_LEVEL_DIGEST_BLOCK; + /// - LAST_CONFIGURATION_CHANGE_BLOCK+1 if there has been CT configuration change + /// before and the last configuration change happened at block + /// LAST_CONFIGURATION_CHANGE_BLOCK; + /// - 1 otherwise. + NewConfiguration(Option), +} + #[cfg(feature = "std")] impl serde::Serialize for DigestItem { fn serialize(&self, seq: S) -> Result where S: serde::Serializer { @@ -141,6 +163,9 @@ pub enum DigestItemRef<'a, Hash: 'a> { /// Put a Seal on it. This is only used by native code, and is never seen /// by runtimes. Seal(&'a ConsensusEngineId, &'a Vec), + /// Digest item that contains signal from changes tries manager to the + /// native code. + ChangesTrieSignal(&'a ChangesTrieSignal), /// Any 'non-system' digest item, opaque to the native code. Other(&'a Vec), } @@ -152,11 +177,12 @@ pub enum DigestItemRef<'a, Hash: 'a> { #[repr(u32)] #[derive(Encode, Decode)] pub enum DigestItemType { + Other = 0, ChangesTrieRoot = 2, - PreRuntime = 6, Consensus = 4, Seal = 5, - Other = 0, + PreRuntime = 6, + ChangesTrieSignal = 7, } /// Type of a digest item that contains raw data; this also names the consensus engine ID where @@ -181,6 +207,7 @@ impl DigestItem { 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::ChangesTrieSignal(ref s) => DigestItemRef::ChangesTrieSignal(s), DigestItem::Other(ref v) => DigestItemRef::Other(v), } } @@ -205,6 +232,11 @@ impl DigestItem { self.dref().as_seal() } + /// Returns `Some` if the entry is the `ChangesTrieSignal` entry. + pub fn as_changes_trie_signal(&self) -> Option<&ChangesTrieSignal> { + self.dref().as_changes_trie_signal() + } + /// Returns Some if `self` is a `DigestItem::Other`. pub fn as_other(&self) -> Option<&[u8]> { match *self { @@ -253,6 +285,9 @@ impl Decode for DigestItem { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; Ok(DigestItem::Seal(vals.0, vals.1)) }, + DigestItemType::ChangesTrieSignal => Ok(DigestItem::ChangesTrieSignal( + Decode::decode(input)?, + )), DigestItemType::Other => Ok(DigestItem::Other( Decode::decode(input)?, )), @@ -293,6 +328,14 @@ impl<'a, Hash> DigestItemRef<'a, Hash> { } } + /// Cast this digest item into `ChangesTrieSignal`. + pub fn as_changes_trie_signal(&self) -> Option<&'a ChangesTrieSignal> { + match *self { + DigestItemRef::ChangesTrieSignal(ref changes_trie_signal) => Some(changes_trie_signal), + _ => None, + } + } + /// Cast this digest item into `PreRuntime` pub fn as_other(&self) -> Option<&'a [u8]> { match *self { @@ -342,6 +385,10 @@ impl<'a, Hash: Encode> Encode for DigestItemRef<'a, Hash> { DigestItemType::PreRuntime.encode_to(&mut v); (val, data).encode_to(&mut v); }, + DigestItemRef::ChangesTrieSignal(changes_trie_signal) => { + DigestItemType::ChangesTrieSignal.encode_to(&mut v); + changes_trie_signal.encode_to(&mut v); + }, DigestItemRef::Other(val) => { DigestItemType::Other.encode_to(&mut v); val.encode_to(&mut v); @@ -352,6 +399,15 @@ impl<'a, Hash: Encode> Encode for DigestItemRef<'a, Hash> { } } +impl ChangesTrieSignal { + /// Try to cast this signal to NewConfiguration. + pub fn as_new_configuration(&self) -> Option<&Option> { + match self { + ChangesTrieSignal::NewConfiguration(config) => Some(config), + } + } +} + impl<'a, Hash: Encode> codec::EncodeLike for DigestItemRef<'a, Hash> {} #[cfg(test)] diff --git a/primitives/runtime/src/generic/mod.rs b/primitives/runtime/src/generic/mod.rs index 2416bb7047..5e9928ba19 100644 --- a/primitives/runtime/src/generic/mod.rs +++ b/primitives/runtime/src/generic/mod.rs @@ -33,7 +33,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, OpaqueDigestItemId + Digest, DigestItem, DigestItemRef, OpaqueDigestItemId, ChangesTrieSignal, }; use crate::codec::Encode; diff --git a/primitives/state-machine/src/changes_trie/build.rs b/primitives/state-machine/src/changes_trie/build.rs index ded8e4f6d1..f717a1e6e3 100644 --- a/primitives/state-machine/src/changes_trie/build.rs +++ b/primitives/state-machine/src/changes_trie/build.rs @@ -356,7 +356,6 @@ mod test { OverlayedChanges, Configuration, ) { - let config = Configuration { digest_interval: 4, digest_levels: 2 }; let backend: InMemoryBackend<_> = vec![ (vec![100], vec![255]), (vec![101], vec![255]), @@ -465,8 +464,9 @@ mod test { ].into_iter().collect(), CHILD_INFO_1.to_owned())), ].into_iter().collect(), }, - changes_trie_config: Some(config.clone()), + collect_extrinsics: true, }; + let config = Configuration { digest_interval: 4, digest_levels: 2 }; (backend, storage, changes, config) } @@ -553,7 +553,6 @@ mod test { InputPair::ExtrinsicIndex(ExtrinsicIndex { block: zero + 4, key: vec![100] }, vec![0, 2]), ]), ]); - } test_with_zero(0); @@ -597,7 +596,6 @@ mod test { InputPair::ExtrinsicIndex(ExtrinsicIndex { block: zero + 16, key: vec![100] }, vec![0, 2]), ]), ]); - } test_with_zero(0); @@ -706,8 +704,7 @@ mod test { #[test] fn cache_is_used_when_changes_trie_is_built() { - let (backend, mut storage, changes, _) = prepare_for_build(0); - let config = changes.changes_trie_config.as_ref().unwrap(); + let (backend, mut storage, changes, config) = prepare_for_build(0); let parent = AnchorBlockId { hash: Default::default(), number: 15 }; // override some actual values from storage with values from the cache @@ -770,6 +767,5 @@ mod test { InputPair::DigestIndex(DigestIndex { block: 16u64, key: vec![106] }, vec![4]), ], ); - } } diff --git a/primitives/state-machine/src/changes_trie/mod.rs b/primitives/state-machine/src/changes_trie/mod.rs index cb19d157dd..3fc98caf79 100644 --- a/primitives/state-machine/src/changes_trie/mod.rs +++ b/primitives/state-machine/src/changes_trie/mod.rs @@ -63,7 +63,7 @@ pub use self::changes_iterator::{ key_changes, key_changes_proof, key_changes_proof_check, key_changes_proof_check_with_db, }; -pub use self::prune::{prune, oldest_non_pruned_trie}; +pub use self::prune::prune; use std::collections::{HashMap, HashSet}; use std::convert::TryInto; @@ -121,6 +121,18 @@ pub struct AnchorBlockId { pub number: Number, } +/// Changes tries state at some block. +pub struct State<'a, H, Number> { + /// Configuration that is active at given block. + pub config: Configuration, + /// Configuration activation block number. Zero if it is the first coonfiguration on the chain, + /// or number of the block that have emit NewConfiguration signal (thus activating configuration + /// starting from the **next** block). + pub zero: Number, + /// Underlying changes tries storage reference. + pub storage: &'a dyn Storage, +} + /// Changes trie storage. Provides access to trie roots and trie nodes. pub trait RootsStorage: Send + Sync { /// Resolve hash of the block into anchor. @@ -170,14 +182,43 @@ pub struct ConfigurationRange<'a, N> { pub end: Option, } +impl<'a, H, Number> State<'a, H, Number> { + /// Create state with given config and storage. + pub fn new( + config: Configuration, + zero: Number, + storage: &'a dyn Storage, + ) -> Self { + Self { + config, + zero, + storage, + } + } +} + +impl<'a, H, Number: Clone> Clone for State<'a, H, Number> { + fn clone(&self) -> Self { + State { + config: self.config.clone(), + zero: self.zero.clone(), + storage: self.storage, + } + } +} + +/// Create state where changes tries are disabled. +pub fn disabled_state<'a, H, Number>() -> Option> { + None +} + /// Compute the changes trie root and transaction for given block. /// 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 (and `panic_on_storage_error` is `true`) OR -/// if insert to MemoryDB fails. -pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, Number: BlockNumber>( +/// Panics if background storage returns an error OR if insert to MemoryDB fails. +pub fn build_changes_trie<'a, B: Backend, H: Hasher, Number: BlockNumber>( backend: &B, - storage: Option<&'a S>, + state: Option<&'a State<'a, H, Number>>, changes: &OverlayedChanges, parent_hash: H::Out, panic_on_storage_error: bool, @@ -185,11 +226,6 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N where H::Out: Ord + 'static + Encode, { - let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { - (Some(storage), Some(config)) => (storage, config), - _ => return Ok(None), - }; - /// Panics when `res.is_err() && panic`, otherwise it returns `Err(())` on an error. fn maybe_panic( res: std::result::Result, @@ -203,23 +239,35 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N }) } - // FIXME: remove this in https://github.com/paritytech/substrate/pull/3201 - let config = ConfigurationRange { - config, - zero: Zero::zero(), - end: None, + // when storage isn't provided, changes tries aren't created + let state = match state { + Some(state) => state, + None => return Ok(None), }; // build_anchor error should not be considered fatal - let parent = storage.build_anchor(parent_hash).map_err(|_| ())?; + let parent = state.storage.build_anchor(parent_hash).map_err(|_| ())?; let block = parent.number.clone() + One::one(); + // prepare configuration range - we already know zero block. Current block may be the end block if configuration + // has been changed in this block + let is_config_changed = match changes.storage(sp_core::storage::well_known_keys::CHANGES_TRIE_CONFIG) { + Some(Some(new_config)) => new_config != &state.config.encode()[..], + Some(None) => true, + None => false, + }; + let config_range = ConfigurationRange { + config: &state.config, + zero: state.zero.clone(), + end: if is_config_changed { Some(block.clone()) } else { None }, + }; + // storage errors are considered fatal (similar to situations when runtime fetches values from storage) let (input_pairs, child_input_pairs, digest_input_blocks) = maybe_panic( prepare_input::( backend, - storage, - config.clone(), + state.storage, + config_range.clone(), changes, &parent, ), @@ -227,7 +275,7 @@ pub fn build_changes_trie<'a, B: Backend, S: Storage, H: Hasher, N )?; // prepare cached data - let mut cache_action = prepare_cached_build_data(config, block.clone()); + let mut cache_action = prepare_cached_build_data(config_range, block.clone()); let needs_changed_keys = cache_action.collects_changed_keys(); cache_action = cache_action.set_digest_input_blocks(digest_input_blocks); diff --git a/primitives/state-machine/src/changes_trie/prune.rs b/primitives/state-machine/src/changes_trie/prune.rs index e16daea158..f6be3223ae 100644 --- a/primitives/state-machine/src/changes_trie/prune.rs +++ b/primitives/state-machine/src/changes_trie/prune.rs @@ -19,52 +19,26 @@ use hash_db::Hasher; use sp_trie::Recorder; use log::warn; -use num_traits::{One, Zero}; +use num_traits::One; use crate::proving_backend::ProvingBackendRecorder; use crate::trie_backend_essence::TrieBackendEssence; -use crate::changes_trie::{AnchorBlockId, Configuration, Storage, BlockNumber}; +use crate::changes_trie::{AnchorBlockId, Storage, BlockNumber}; use crate::changes_trie::storage::TrieBackendAdapter; use crate::changes_trie::input::{ChildIndex, InputKey}; use codec::{Decode, Codec}; -/// 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( - config: &Configuration, - min_blocks_to_keep: Number, - best_finalized_block: Number, -) -> Number { - let max_digest_interval = config.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 + One::one(), - None => One::one(), - } -} - /// Prune obsolete changes tries. Pruning happens at the same block, where highest /// level digest is created. Pruning guarantees to save changes tries for last /// `min_blocks_to_keep` blocks. We only prune changes tries at `max_digest_interval` /// ranges. -/// Returns MemoryDB that contains all deleted changes tries nodes. -pub fn prune, H: Hasher, Number: BlockNumber, F: FnMut(H::Out)>( - config: &Configuration, - storage: &S, - min_blocks_to_keep: Number, +pub fn prune( + storage: &dyn Storage, + first: Number, + last: Number, current_block: &AnchorBlockId, mut remove_trie_node: F, ) where H::Out: Codec { - - // select range for pruning - 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 let mut block = first; loop { if block >= last.clone() + One::one() { @@ -112,8 +86,8 @@ pub fn prune, H: Hasher, Number: BlockNumber, F: FnMut(H:: } // Prune a trie. -fn prune_trie, H: Hasher, Number: BlockNumber, F: FnMut(H::Out)>( - storage: &S, +fn prune_trie( + storage: &dyn Storage, root: H::Out, remove_trie_node: &mut F, ) where H::Out: Codec { @@ -136,100 +110,26 @@ fn prune_trie, H: Hasher, Number: BlockNumber, F: FnMut(H: } } -/// Select blocks range (inclusive from both ends) for pruning changes tries in. -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(Zero::zero(), block.clone()) { - Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels => - digest_interval, - _ => return None, - }; - - // compute maximal number of high-level digests to keep - let max_digest_intervals_to_keep = max_digest_intervals_to_keep(min_blocks_to_keep, max_digest_interval); - - // 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.into()) - ) - } else { - ( - 1, - Some(min_blocks_to_keep) - ) - }; - - // 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.into())); - - last_block_to_prune - .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 -/// trie at block B, we need an access to previous: -/// max_digest_interval = config.digest_interval ^ config.digest_levels -/// blocks. So we can only prune blocks that are earlier than B - max_digest_interval. -/// The pruning_delay stands for number of max_digest_interval-s that we want to keep: -/// 0 or 1: means that only last changes trie is guaranteed to exists; -/// 2: the last changes trie + previous changes trie -/// ... -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.into(); - if max_digest_intervals_to_keep.is_zero() { - One::one() - } else { - max_digest_intervals_to_keep - } -} - #[cfg(test)] mod tests { use std::collections::HashSet; use sp_trie::MemoryDB; - use sp_core::Blake2Hasher; + use sp_core::{H256, Blake2Hasher}; use crate::backend::insert_into_memory_db; use crate::changes_trie::storage::InMemoryStorage; use codec::Encode; use super::*; - fn config(interval: u32, levels: u32) -> Configuration { - Configuration { - digest_interval: interval, - digest_levels: levels, - } - } - - fn prune_by_collect, H: Hasher>( - config: &Configuration, - storage: &S, - min_blocks_to_keep: u64, + fn prune_by_collect( + storage: &dyn Storage, + first: u64, + last: u64, current_block: u64, - ) -> HashSet where H::Out: Codec { + ) -> HashSet { let mut pruned_trie_nodes = HashSet::new(); - prune( - config, - storage, - min_blocks_to_keep, - &AnchorBlockId { hash: Default::default(), number: current_block }, - |node| { pruned_trie_nodes.insert(node); }, - ); + let anchor = AnchorBlockId { hash: Default::default(), number: current_block }; + prune(storage, first, last, &anchor, + |node| { pruned_trie_nodes.insert(node); }); pruned_trie_nodes } @@ -243,7 +143,9 @@ mod tests { &mut mdb1, vec![(vec![10], vec![20])]).unwrap(); let mut mdb2 = MemoryDB::::default(); let root2 = insert_into_memory_db::( - &mut mdb2, vec![(vec![11], vec![21]), (vec![12], vec![22])]).unwrap(); + &mut mdb2, + vec![(vec![11], vec![21]), (vec![12], vec![22])], + ).unwrap(); let mut mdb3 = MemoryDB::::default(); let ch_root3 = insert_into_memory_db::( &mut mdb3, vec![(vec![110], vec![120])]).unwrap(); @@ -254,7 +156,9 @@ mod tests { ]).unwrap(); let mut mdb4 = MemoryDB::::default(); let root4 = insert_into_memory_db::( - &mut mdb4, vec![(vec![15], vec![25])]).unwrap(); + &mut mdb4, + vec![(vec![15], vec![25])], + ).unwrap(); let storage = InMemoryStorage::new(); storage.insert(65, root1, mdb1); storage.insert(66, root2, mdb2); @@ -264,109 +168,20 @@ mod tests { storage } - // l1-digest is created every 2 blocks - // l2-digest is created every 4 blocks - // we do not want to keep any additional changes tries - // => only one l2-digest is saved AND it is pruned once next is created - let config = Configuration { digest_interval: 2, digest_levels: 2 }; let storage = prepare_storage(); - assert!(prune_by_collect(&config, &storage, 0, 69).is_empty()); - assert!(prune_by_collect(&config, &storage, 0, 70).is_empty()); - assert!(prune_by_collect(&config, &storage, 0, 71).is_empty()); - let non_empty = prune_by_collect(&config, &storage, 0, 72); - assert!(!non_empty.is_empty()); - storage.remove_from_storage(&non_empty); - assert!(storage.into_mdb().drain().is_empty()); + assert!(prune_by_collect(&storage, 20, 30, 90).is_empty()); + assert!(!storage.into_mdb().drain().is_empty()); - // l1-digest is created every 2 blocks - // l2-digest is created every 4 blocks - // we want keep 1 additional changes tries - let config = Configuration { digest_interval: 2, digest_levels: 2 }; let storage = prepare_storage(); - assert!(prune_by_collect(&config, &storage, 8, 69).is_empty()); - assert!(prune_by_collect(&config, &storage, 8, 70).is_empty()); - assert!(prune_by_collect(&config, &storage, 8, 71).is_empty()); - assert!(prune_by_collect(&config, &storage, 8, 72).is_empty()); - assert!(prune_by_collect(&config, &storage, 8, 73).is_empty()); - assert!(prune_by_collect(&config, &storage, 8, 74).is_empty()); - assert!(prune_by_collect(&config, &storage, 8, 75).is_empty()); - let non_empty = prune_by_collect(&config, &storage, 8, 76); - assert!(!non_empty.is_empty()); - storage.remove_from_storage(&non_empty); - assert!(storage.into_mdb().drain().is_empty()); + let prune60_65 = prune_by_collect(&storage, 60, 65, 90); + assert!(!prune60_65.is_empty()); + storage.remove_from_storage(&prune60_65); + assert!(!storage.into_mdb().drain().is_empty()); - // l1-digest is created every 2 blocks - // we want keep 2 additional changes tries - let config = Configuration { digest_interval: 2, digest_levels: 1 }; let storage = prepare_storage(); - assert!(prune_by_collect(&config, &storage, 4, 69).is_empty()); - let non_empty = prune_by_collect(&config, &storage, 4, 70); - assert!(!non_empty.is_empty()); - storage.remove_from_storage(&non_empty); - assert!(prune_by_collect(&config, &storage, 4, 71).is_empty()); - let non_empty = prune_by_collect(&config, &storage, 4, 72); - assert!(!non_empty.is_empty()); - storage.remove_from_storage(&non_empty); + let prune60_70 = prune_by_collect(&storage, 60, 70, 90); + assert!(!prune60_70.is_empty()); + storage.remove_from_storage(&prune60_70); assert!(storage.into_mdb().drain().is_empty()); } - - #[test] - fn pruning_range_works() { - // DIGESTS ARE NOT CREATED + NO TRIES ARE PRUNED - 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), 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), 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), 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), 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), 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(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), 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), 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), 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/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index 6fc4312d10..3ee7292102 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -18,7 +18,7 @@ use crate::{ backend::Backend, OverlayedChanges, StorageTransactionCache, - changes_trie::Storage as ChangesTrieStorage, + changes_trie::State as ChangesTrieState, }; use hash_db::Hasher; @@ -65,7 +65,7 @@ impl error::Error for Error { } /// Wraps a read-only backend, call executor, and current overlayed changes. -pub struct Ext<'a, H, N, B, T> +pub struct Ext<'a, H, N, B> where H: Hasher, B: 'a + Backend, @@ -77,8 +77,8 @@ pub struct Ext<'a, H, N, B, T> backend: &'a B, /// The cache for the storage transactions. storage_transaction_cache: &'a mut StorageTransactionCache, - /// Changes trie storage to read from. - changes_trie_storage: Option<&'a T>, + /// Changes trie state to read from. + changes_trie_state: Option>, /// Pseudo-unique id used for tracing. pub id: u16, /// Dummy usage of N arg. @@ -87,12 +87,11 @@ pub struct Ext<'a, H, N, B, T> extensions: Option<&'a mut Extensions>, } -impl<'a, H, N, B, T> Ext<'a, H, N, B, T> +impl<'a, H, N, B> Ext<'a, H, N, B> where H: Hasher, H::Out: Ord + 'static + codec::Codec, B: 'a + Backend, - T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, { @@ -101,13 +100,13 @@ where overlay: &'a mut OverlayedChanges, storage_transaction_cache: &'a mut StorageTransactionCache, backend: &'a B, - changes_trie_storage: Option<&'a T>, + changes_trie_state: Option>, extensions: Option<&'a mut Extensions>, ) -> Self { Ext { overlay, backend, - changes_trie_storage, + changes_trie_state, storage_transaction_cache, id: rand::random(), _phantom: Default::default(), @@ -124,12 +123,11 @@ where } #[cfg(test)] -impl<'a, H, N, B, T> Ext<'a, H, N, B, T> +impl<'a, H, N, B> Ext<'a, H, N, B> where H: Hasher, H::Out: Ord + 'static, B: 'a + Backend, - T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, { pub fn storage_pairs(&self) -> Vec<(Vec, Vec)> { @@ -146,12 +144,11 @@ where } } -impl<'a, H, B, T, N> Externalities for Ext<'a, H, N, B, T> +impl<'a, H, B, N> Externalities for Ext<'a, H, N, B> where H: Hasher, H::Out: Ord + 'static + codec::Codec, B: 'a + Backend, - T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, { fn storage(&self, key: &[u8]) -> Option> { @@ -564,7 +561,7 @@ where let _guard = sp_panic_handler::AbortGuard::force_abort(); let root = self.overlay.changes_trie_root( self.backend, - self.changes_trie_storage.clone(), + self.changes_trie_state.as_ref(), Decode::decode(&mut &parent_hash[..]).map_err(|e| trace!( target: "state-trace", @@ -586,11 +583,10 @@ where } } -impl<'a, H, B, T, N> sp_externalities::ExtensionStore for Ext<'a, H, N, B, T> +impl<'a, H, B, N> sp_externalities::ExtensionStore for Ext<'a, H, N, B> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, N: crate::changes_trie::BlockNumber, { fn extension_by_type_id(&mut self, type_id: TypeId) -> Option<&mut dyn Any> { @@ -602,19 +598,19 @@ where mod tests { use super::*; use hex_literal::hex; + use num_traits::Zero; use codec::Encode; use sp_core::{H256, Blake2Hasher, storage::well_known_keys::EXTRINSIC_INDEX, map}; use crate::{ changes_trie::{ Configuration as ChangesTrieConfiguration, - InMemoryStorage as InMemoryChangesTrieStorage, + InMemoryStorage as TestChangesTrieStorage, }, InMemoryBackend, overlayed_changes::OverlayedValue, }; use sp_core::storage::{Storage, StorageChild}; type TestBackend = InMemoryBackend; - type TestChangesTrieStorage = InMemoryChangesTrieStorage; - type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend, TestChangesTrieStorage>; + type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend>; fn prepare_overlay_with_changes() -> OverlayedChanges { OverlayedChanges { @@ -629,10 +625,14 @@ mod tests { }), ].into_iter().collect(), committed: Default::default(), - changes_trie_config: Some(ChangesTrieConfiguration { - digest_interval: 0, - digest_levels: 0, - }), + collect_extrinsics: true, + } + } + + fn changes_trie_config() -> ChangesTrieConfiguration { + ChangesTrieConfiguration { + digest_interval: 0, + digest_levels: 0, } } @@ -646,13 +646,11 @@ mod tests { } #[test] - fn storage_changes_root_is_none_when_extrinsic_changes_are_none() { + fn storage_changes_root_is_none_when_state_is_not_provided() { let mut overlay = prepare_overlay_with_changes(); let mut cache = StorageTransactionCache::default(); - overlay.changes_trie_config = None; - let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, None, None); assert_eq!(ext.storage_changes_root(&H256::default().encode()).unwrap(), None); } @@ -661,8 +659,9 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let mut cache = StorageTransactionCache::default(); let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); + let state = Some(ChangesTrieState::new(changes_trie_config(), Zero::zero(), &storage)); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, state, None); assert_eq!( ext.storage_changes_root(&H256::default().encode()).unwrap(), Some(hex!("bb0c2ef6e1d36d5490f9766cfcc7dfe2a6ca804504c3bb206053890d6dd02376").to_vec()), @@ -675,8 +674,9 @@ mod tests { let mut cache = StorageTransactionCache::default(); overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); + let state = Some(ChangesTrieState::new(changes_trie_config(), Zero::zero(), &storage)); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &mut cache, &backend, state, None); assert_eq!( ext.storage_changes_root(&H256::default().encode()).unwrap(), Some(hex!("96f5aae4690e7302737b6f9b7f8567d5bbb9eac1c315f80101235a92d9ec27f4").to_vec()), diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index 55f2eb4941..b27bf47050 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -23,8 +23,8 @@ use log::{warn, trace}; use hash_db::Hasher; use codec::{Decode, Encode, Codec}; use sp_core::{ - storage::{well_known_keys, ChildInfo}, NativeOrEncoded, NeverNativeValue, - traits::{CodeExecutor, CallInWasmExt}, hexdisplay::HexDisplay + storage::ChildInfo, NativeOrEncoded, NeverNativeValue, + traits::{CodeExecutor, CallInWasmExt}, hexdisplay::HexDisplay, }; use overlayed_changes::OverlayedChangeSet; use sp_externalities::Extensions; @@ -49,15 +49,17 @@ pub use ext::Ext; pub use backend::Backend; pub use changes_trie::{ AnchorBlockId as ChangesTrieAnchorBlockId, + State as ChangesTrieState, Storage as ChangesTrieStorage, RootsStorage as ChangesTrieRootsStorage, InMemoryStorage as InMemoryChangesTrieStorage, BuildCache as ChangesTrieBuildCache, CacheAction as ChangesTrieCacheAction, ConfigurationRange as ChangesTrieConfigurationRange, - key_changes, key_changes_proof, key_changes_proof_check, + key_changes, key_changes_proof, + key_changes_proof_check, key_changes_proof_check_with_db, prune as prune_changes_tries, - oldest_non_pruned_trie as oldest_non_pruned_changes_trie, + disabled_state as disabled_changes_trie_state, BlockNumber as ChangesTrieBlockNumber, }; pub use overlayed_changes::{OverlayedChanges, StorageChanges, StorageTransactionCache}; @@ -171,7 +173,7 @@ fn always_untrusted_wasm() -> ExecutionManager +pub struct StateMachine<'a, B, H, N, Exec> where H: Hasher, B: Backend, @@ -183,23 +185,22 @@ pub struct StateMachine<'a, B, H, N, T, Exec> call_data: &'a [u8], overlay: &'a mut OverlayedChanges, extensions: Extensions, - changes_trie_storage: Option<&'a T>, + changes_trie_state: Option>, _marker: PhantomData<(H, N)>, storage_transaction_cache: Option<&'a mut StorageTransactionCache>, } -impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where +impl<'a, B, H, N, Exec> StateMachine<'a, B, H, N, Exec> where H: Hasher, H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor + Clone + 'static, B: Backend, - T: ChangesTrieStorage, N: crate::changes_trie::BlockNumber, { /// Creates new substrate state machine. pub fn new( backend: &'a B, - changes_trie_storage: Option<&'a T>, + changes_trie_state: Option>, overlay: &'a mut OverlayedChanges, exec: &'a Exec, method: &'a str, @@ -215,7 +216,7 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where call_data, extensions, overlay, - changes_trie_storage, + changes_trie_state, _marker: PhantomData, storage_transaction_cache: None, } @@ -273,7 +274,7 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where self.overlay, cache, self.backend, - self.changes_trie_storage.clone(), + self.changes_trie_state.clone(), Some(&mut self.extensions), ); @@ -388,20 +389,8 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where CallResult, ) -> CallResult { - // read changes trie configuration. The reason why we're doing it here instead of the - // `OverlayedChanges` constructor is that we need proofs for this read as a part of - // proof-of-execution on light clients. And the proof is recorded by the backend which - // is created after OverlayedChanges - - let init_overlay = |overlay: &mut OverlayedChanges, final_check: bool, backend: &B| { - let changes_trie_config = try_read_overlay_value( - overlay, - backend, - well_known_keys::CHANGES_TRIE_CONFIG - )?; - set_changes_trie_config(overlay, changes_trie_config, final_check) - }; - init_overlay(self.overlay, false, &self.backend)?; + let changes_tries_enabled = self.changes_trie_state.is_some(); + self.overlay.set_collect_extrinsics(changes_tries_enabled); let result = { let orig_prospective = self.overlay.prospective.clone(); @@ -433,16 +422,12 @@ impl<'a, B, H, N, T, Exec> StateMachine<'a, B, H, N, T, Exec> where } }; - if result.is_ok() { - init_overlay(self.overlay, true, self.backend)?; - } - result.map_err(|e| Box::new(e) as _) } } /// Prove execution using the given state backend, overlayed changes, and call executor. -pub fn prove_execution( +pub fn prove_execution( mut backend: B, overlay: &mut OverlayedChanges, exec: &Exec, @@ -454,10 +439,11 @@ where H: Hasher, H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor + Clone + 'static, + N: crate::changes_trie::BlockNumber, { 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::<_, _, N, _>(trie_backend, overlay, exec, method, call_data) } /// Prove execution using the given trie backend, overlayed changes, and call executor. @@ -469,7 +455,7 @@ where /// /// Note: changes to code will be in place if this call is made again. For running partial /// blocks (e.g. a transaction at a time), ensure a different method is used. -pub fn prove_execution_on_trie_backend( +pub fn prove_execution_on_trie_backend( trie_backend: &TrieBackend, overlay: &mut OverlayedChanges, exec: &Exec, @@ -481,9 +467,10 @@ where H: Hasher, H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor + 'static + Clone, + N: crate::changes_trie::BlockNumber, { let proving_backend = proving_backend::ProvingBackend::new(trie_backend); - let mut sm = StateMachine::<_, H, _, InMemoryChangesTrieStorage, Exec>::new( + let mut sm = StateMachine::<_, H, N, Exec>::new( &proving_backend, None, overlay, exec, method, call_data, Extensions::default(), ); @@ -496,7 +483,7 @@ where } /// Check execution proof, generated by `prove_execution` call. -pub fn execution_proof_check( +pub fn execution_proof_check( root: H::Out, proof: StorageProof, overlay: &mut OverlayedChanges, @@ -508,13 +495,14 @@ where H: Hasher, Exec: CodeExecutor + Clone + 'static, H::Out: Ord + 'static + codec::Codec, + N: crate::changes_trie::BlockNumber, { let trie_backend = create_proof_check_backend::(root.into(), proof)?; - execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) + execution_proof_check_on_trie_backend::<_, N, _>(&trie_backend, overlay, exec, method, call_data) } /// Check execution proof on proving backend, generated by `prove_execution` call. -pub fn execution_proof_check_on_trie_backend( +pub fn execution_proof_check_on_trie_backend( trie_backend: &TrieBackend, H>, overlay: &mut OverlayedChanges, exec: &Exec, @@ -525,8 +513,9 @@ where H: Hasher, H::Out: Ord + 'static + codec::Codec, Exec: CodeExecutor + Clone + 'static, + N: crate::changes_trie::BlockNumber, { - let mut sm = StateMachine::<_, H, _, InMemoryChangesTrieStorage, Exec>::new( + let mut sm = StateMachine::<_, H, N, Exec>::new( trie_backend, None, overlay, exec, method, call_data, Extensions::default(), ); @@ -692,44 +681,6 @@ where .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. -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[..]) - .map_err(|_| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), - None => None, - }; - - if final_check && overlay.changes_trie_config.is_some() != config.is_some() { - return Err(Box::new("Changes trie configuration change is not supported".to_owned())); - } - - if let Some(config) = config { - if !overlay.set_changes_trie_config(config) { - return Err(Box::new("Changes trie configuration change is not supported".to_owned())); - } - } - Ok(()) -} - -/// Reads storage value from overlay or from the backend. -fn try_read_overlay_value( - overlay: &OverlayedChanges, - backend: &B, key: &[u8], -) -> 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), - } -} - #[cfg(test)] mod tests { use std::collections::BTreeMap; @@ -737,10 +688,7 @@ mod tests { use overlayed_changes::OverlayedValue; use super::*; use super::ext::Ext; - use super::changes_trie::{ - InMemoryStorage as InMemoryChangesTrieStorage, - Configuration as ChangesTrieConfig, - }; + use super::changes_trie::Configuration as ChangesTrieConfig; use sp_core::{Blake2Hasher, map, traits::Externalities, storage::ChildStorageKey}; #[derive(Clone)] @@ -770,7 +718,7 @@ mod tests { ) -> (CallResult, bool) { if self.change_changes_trie_config { ext.place_storage( - well_known_keys::CHANGES_TRIE_CONFIG.to_vec(), + sp_core::storage::well_known_keys::CHANGES_TRIE_CONFIG.to_vec(), Some( ChangesTrieConfig { digest_interval: 777, @@ -816,11 +764,10 @@ mod tests { fn execute_works() { let backend = trie_backend::tests::test_trie(); let mut overlayed_changes = Default::default(); - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut state_machine = StateMachine::new( &backend, - Some(&changes_trie_storage), + changes_trie::disabled_state::<_, u64>(), &mut overlayed_changes, &DummyCodeExecutor { change_changes_trie_config: false, @@ -844,11 +791,10 @@ mod tests { fn execute_works_with_native_else_wasm() { let backend = trie_backend::tests::test_trie(); let mut overlayed_changes = Default::default(); - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut state_machine = StateMachine::new( &backend, - Some(&changes_trie_storage), + changes_trie::disabled_state::<_, u64>(), &mut overlayed_changes, &DummyCodeExecutor { change_changes_trie_config: false, @@ -869,11 +815,10 @@ mod tests { let mut consensus_failed = false; let backend = trie_backend::tests::test_trie(); let mut overlayed_changes = Default::default(); - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut state_machine = StateMachine::new( &backend, - Some(&changes_trie_storage), + changes_trie::disabled_state::<_, u64>(), &mut overlayed_changes, &DummyCodeExecutor { change_changes_trie_config: false, @@ -910,7 +855,7 @@ mod tests { // fetch execution proof from 'remote' full node let remote_backend = trie_backend::tests::test_trie(); let remote_root = remote_backend.storage_root(std::iter::empty()).0; - let (remote_result, remote_proof) = prove_execution( + let (remote_result, remote_proof) = prove_execution::<_, _, u64, _>( remote_backend, &mut Default::default(), &executor, @@ -919,7 +864,7 @@ mod tests { ).unwrap(); // check proof locally - let local_result = execution_proof_check::( + let local_result = execution_proof_check::( remote_root, remote_proof, &mut Default::default(), @@ -956,13 +901,12 @@ mod tests { }; { - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, &mut cache, backend, - Some(&changes_trie_storage), + changes_trie::disabled_state::<_, u64>(), None, ); ext.clear_prefix(b"ab"); @@ -987,14 +931,13 @@ mod tests { fn set_child_storage_works() { let mut state = InMemoryBackend::::default(); let backend = state.as_trie_backend().unwrap(); - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut overlay = OverlayedChanges::default(); let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, &mut cache, backend, - Some(&changes_trie_storage), + changes_trie::disabled_state::<_, u64>(), None, ); @@ -1080,30 +1023,6 @@ mod tests { ); } - #[test] - fn cannot_change_changes_trie_config() { - let backend = trie_backend::tests::test_trie(); - let mut overlayed_changes = Default::default(); - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); - - let mut state_machine = StateMachine::new( - &backend, - Some(&changes_trie_storage), - &mut overlayed_changes, - &DummyCodeExecutor { - change_changes_trie_config: true, - native_available: false, - native_succeeds: true, - fallback_succeeds: true, - }, - "test", - &[], - Default::default(), - ); - - assert!(state_machine.execute(ExecutionStrategy::NativeWhenPossible).is_err()); - } - #[test] fn child_storage_uuid() { const CHILD_INFO_1: ChildInfo<'static> = ChildInfo::new_default(b"unique_id_1"); @@ -1115,13 +1034,12 @@ mod tests { let subtrie2 = ChildStorageKey::from_slice(b":child_storage:default:sub_test2").unwrap(); let mut transaction = { let backend = test_trie(); - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, &mut cache, &backend, - Some(&changes_trie_storage), + changes_trie::disabled_state::<_, u64>(), None, ); ext.set_child_storage(subtrie1, CHILD_INFO_1, b"abc".to_vec(), b"def".to_vec()); @@ -1139,28 +1057,4 @@ mod tests { } assert!(!duplicate); } - - #[test] - fn cannot_change_changes_trie_config_with_native_else_wasm() { - let backend = trie_backend::tests::test_trie(); - let mut overlayed_changes = Default::default(); - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); - - let mut state_machine = StateMachine::new( - &backend, - Some(&changes_trie_storage), - &mut overlayed_changes, - &DummyCodeExecutor { - change_changes_trie_config: true, - native_available: false, - native_succeeds: true, - fallback_succeeds: true, - }, - "test", - &[], - Default::default(), - ); - - assert!(state_machine.execute(ExecutionStrategy::NativeElseWasm).is_err()); - } } diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index eafd312410..6c41ed06ef 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -19,8 +19,8 @@ use crate::{ backend::Backend, ChangesTrieTransaction, changes_trie::{ - NO_EXTRINSIC_INDEX, Configuration as ChangesTrieConfig, BlockNumber, build_changes_trie, - Storage as ChangesTrieStorage, + NO_EXTRINSIC_INDEX, BlockNumber, build_changes_trie, + State as ChangesTrieState, }, }; @@ -43,9 +43,8 @@ pub struct OverlayedChanges { pub(crate) prospective: OverlayedChangeSet, /// Committed changes. pub(crate) committed: OverlayedChangeSet, - /// Changes trie configuration. None by default, but could be installed by the - /// runtime if it supports change tries. - pub(crate) changes_trie_config: Option, + /// True if extrinsiscs stats must be collected. + pub(crate) collect_extrinsics: bool, } /// The storage value, used inside OverlayedChanges. @@ -184,20 +183,9 @@ impl OverlayedChanges { self.prospective.is_empty() && self.committed.is_empty() } - /// Sets the changes trie configuration. - /// - /// Returns false if configuration has been set already and we now trying - /// to install different configuration. This isn't supported now. - pub(crate) fn set_changes_trie_config(&mut self, config: ChangesTrieConfig) -> bool { - if let Some(ref old_config) = self.changes_trie_config { - // we do not support changes trie configuration' change now - if *old_config != config { - return false; - } - } - - self.changes_trie_config = Some(config); - true + /// Ask to collect/not to collect extrinsics indices where key(s) has been changed. + pub fn set_collect_extrinsics(&mut self, collect_extrinsics: bool) { + self.collect_extrinsics = collect_extrinsics; } /// Returns a double-Option: None if the key is unknown (i.e. and the query should be referred @@ -442,11 +430,11 @@ impl OverlayedChanges { /// Convert this instance with all changes into a [`StorageChanges`] instance. pub fn into_storage_changes< - B: Backend, H: Hasher, N: BlockNumber, T: ChangesTrieStorage + B: Backend, H: Hasher, N: BlockNumber >( self, backend: &B, - changes_trie_storage: Option<&T>, + changes_trie_state: Option<&ChangesTrieState>, parent_hash: H::Out, mut cache: StorageTransactionCache, ) -> Result, String> where H::Out: Ord + Encode + 'static { @@ -463,7 +451,7 @@ impl OverlayedChanges { if cache.changes_trie_transaction.is_none() { self.changes_trie_root( backend, - changes_trie_storage, + changes_trie_state, parent_hash, false, &mut cache, @@ -501,7 +489,7 @@ impl OverlayedChanges { /// Changes that are made outside of extrinsics, are marked with /// `NO_EXTRINSIC_INDEX` index. fn extrinsic_index(&self) -> Option { - match self.changes_trie_config.is_some() { + match self.collect_extrinsics { true => Some( self.storage(EXTRINSIC_INDEX) .and_then(|idx| idx.and_then(|idx| Decode::decode(&mut &*idx).ok())) @@ -557,17 +545,17 @@ impl OverlayedChanges { /// # Panics /// /// Panics on storage error, when `panic_on_storage_error` is set. - pub fn changes_trie_root, T: ChangesTrieStorage>( + pub fn changes_trie_root<'a, H: Hasher, N: BlockNumber, B: Backend>( &self, backend: &B, - changes_trie_storage: Option<&T>, + changes_trie_state: Option<&'a ChangesTrieState<'a, H, N>>, parent_hash: H::Out, panic_on_storage_error: bool, cache: &mut StorageTransactionCache, ) -> Result, ()> where H::Out: Ord + Encode + 'static { - build_changes_trie::<_, T, H, N>( + build_changes_trie::<_, H, N>( backend, - changes_trie_storage, + changes_trie_state, self, parent_hash, panic_on_storage_error, @@ -656,7 +644,6 @@ mod tests { Blake2Hasher, traits::Externalities, storage::well_known_keys::EXTRINSIC_INDEX, }; use crate::InMemoryBackend; - use crate::changes_trie::InMemoryStorage as InMemoryChangesTrieStorage; use crate::ext::Ext; use super::*; @@ -718,13 +705,12 @@ mod tests { ..Default::default() }; - let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, &mut cache, &backend, - Some(&changes_trie_storage), + crate::changes_trie::disabled_state::<_, u64>(), None, ); const ROOT: [u8; 32] = hex!("39245109cef3758c2eed2ccba8d9b370a917850af3824bc8348d505df2c298fa"); @@ -732,57 +718,10 @@ mod tests { assert_eq!(&ext.storage_root()[..], &ROOT); } - #[test] - fn changes_trie_configuration_is_saved() { - let mut overlay = OverlayedChanges::default(); - assert!(overlay.changes_trie_config.is_none()); - assert_eq!( - overlay.set_changes_trie_config( - ChangesTrieConfig { digest_interval: 4, digest_levels: 1, }, - ), - true, - ); - assert!(overlay.changes_trie_config.is_some()); - } - - #[test] - fn changes_trie_configuration_is_saved_twice() { - let mut overlay = OverlayedChanges::default(); - assert!(overlay.changes_trie_config.is_none()); - assert_eq!(overlay.set_changes_trie_config(ChangesTrieConfig { - digest_interval: 4, digest_levels: 1, - }), true); - overlay.set_extrinsic_index(0); - overlay.set_storage(vec![1], Some(vec![2])); - assert_eq!(overlay.set_changes_trie_config(ChangesTrieConfig { - digest_interval: 4, digest_levels: 1, - }), true); - assert_eq!( - strip_extrinsic_index(&overlay.prospective.top), - vec![ - (vec![1], OverlayedValue { value: Some(vec![2]), - extrinsics: Some(vec![0].into_iter().collect()) }), - ].into_iter().collect(), - ); - } - - #[test] - fn panics_when_trying_to_save_different_changes_trie_configuration() { - let mut overlay = OverlayedChanges::default(); - assert_eq!(overlay.set_changes_trie_config(ChangesTrieConfig { - digest_interval: 4, digest_levels: 1, - }), true); - assert_eq!(overlay.set_changes_trie_config(ChangesTrieConfig { - digest_interval: 2, digest_levels: 1, - }), false); - } - #[test] fn extrinsic_changes_are_collected() { let mut overlay = OverlayedChanges::default(); - let _ = overlay.set_changes_trie_config(ChangesTrieConfig { - digest_interval: 4, digest_levels: 1, - }); + overlay.set_collect_extrinsics(true); overlay.set_storage(vec![100], Some(vec![101])); diff --git a/primitives/state-machine/src/testing.rs b/primitives/state-machine/src/testing.rs index 1baf6d6b4d..450919088a 100644 --- a/primitives/state-machine/src/testing.rs +++ b/primitives/state-machine/src/testing.rs @@ -17,12 +17,15 @@ //! Test implementation for Externalities. use std::any::{Any, TypeId}; +use codec::Decode; use hash_db::Hasher; use crate::{ backend::Backend, OverlayedChanges, StorageTransactionCache, ext::Ext, InMemoryBackend, changes_trie::{ + Configuration as ChangesTrieConfiguration, InMemoryStorage as ChangesTrieInMemoryStorage, BlockNumber as ChangesTrieBlockNumber, + State as ChangesTrieState, }, }; use sp_core::{ @@ -45,6 +48,7 @@ where as Backend>::Transaction, H, N >, backend: InMemoryBackend, + changes_trie_config: Option, changes_trie_storage: ChangesTrieInMemoryStorage, extensions: Extensions, } @@ -54,12 +58,19 @@ impl TestExternalities H::Out: Ord + 'static + codec::Codec { /// Get externalities implementation. - pub fn ext(&mut self) -> Ext, ChangesTrieInMemoryStorage> { + pub fn ext(&mut self) -> Ext> { Ext::new( &mut self.overlay, &mut self.storage_transaction_cache, &self.backend, - Some(&self.changes_trie_storage), + match self.changes_trie_config.clone() { + Some(config) => Some(ChangesTrieState { + config, + zero: 0.into(), + storage: &self.changes_trie_storage, + }), + None => None, + }, Some(&mut self.extensions), ) } @@ -72,21 +83,19 @@ impl TestExternalities /// Create a new instance of `TestExternalities` with code and storage. pub fn new_with_code(code: &[u8], mut storage: Storage) -> Self { let mut overlay = OverlayedChanges::default(); + let changes_trie_config = storage.top.get(CHANGES_TRIE_CONFIG) + .and_then(|v| Decode::decode(&mut &v[..]).ok()); + overlay.set_collect_extrinsics(changes_trie_config.is_some()); assert!(storage.top.keys().all(|key| !is_child_storage_key(key))); assert!(storage.children.keys().all(|key| is_child_storage_key(key))); - super::set_changes_trie_config( - &mut overlay, - storage.top.get(&CHANGES_TRIE_CONFIG.to_vec()).cloned(), - false, - ).expect("changes trie configuration is correct in test env; qed"); - storage.top.insert(HEAP_PAGES.to_vec(), 8u64.encode()); storage.top.insert(CODE.to_vec(), code.to_vec()); TestExternalities { overlay, + changes_trie_config, changes_trie_storage: ChangesTrieInMemoryStorage::new(), backend: storage.into(), extensions: Default::default(), diff --git a/test-utils/runtime/client/src/block_builder_ext.rs b/test-utils/runtime/client/src/block_builder_ext.rs index 7626ac2ffa..6b9a6f79ab 100644 --- a/test-utils/runtime/client/src/block_builder_ext.rs +++ b/test-utils/runtime/client/src/block_builder_ext.rs @@ -17,6 +17,7 @@ //! Block Builder extensions for tests. use sp_api::{ApiExt, ProvideRuntimeApi}; +use sp_core::ChangesTrieConfiguration; use sc_client_api::backend; use sp_runtime::traits::HasherFor; @@ -32,6 +33,11 @@ pub trait BlockBuilderExt { key: Vec, value: Option>, ) -> Result<(), sp_blockchain::Error>; + /// Add changes trie configuration update extrinsic to the block. + fn push_changes_trie_configuration_update( + &mut self, + new_config: Option, + ) -> Result<(), sp_blockchain::Error>; } impl<'a, A, B> BlockBuilderExt for sc_block_builder::BlockBuilder<'a, substrate_test_runtime::Block, A, B> where @@ -57,4 +63,11 @@ impl<'a, A, B> BlockBuilderExt for sc_block_builder::BlockBuilder<'a, substrate_ ) -> Result<(), sp_blockchain::Error> { self.push(substrate_test_runtime::Extrinsic::StorageChange(key, value)) } + + fn push_changes_trie_configuration_update( + &mut self, + new_config: Option, + ) -> Result<(), sp_blockchain::Error> { + self.push(substrate_test_runtime::Extrinsic::ChangesTrieConfigUpdate(new_config)) + } } diff --git a/test-utils/runtime/client/src/lib.rs b/test-utils/runtime/client/src/lib.rs index 0476be2f60..7646f4a960 100644 --- a/test-utils/runtime/client/src/lib.rs +++ b/test-utils/runtime/client/src/lib.rs @@ -30,7 +30,7 @@ pub use sc_client::LongestChain; pub use self::block_builder_ext::BlockBuilderExt; -use sp_core::sr25519; +use sp_core::{sr25519, ChangesTrieConfiguration}; use sp_core::storage::{ChildInfo, Storage, StorageChild}; use substrate_test_runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor, HasherFor}; @@ -42,7 +42,6 @@ use sc_client::{ }, }; - /// A prelude to import in tests. pub mod prelude { // Trait extensions @@ -92,7 +91,7 @@ pub type LightExecutor = sc_client::light::call_executor::GenesisCallExecutor< /// Parameters of test-client builder with test-runtime. #[derive(Default)] pub struct GenesisParameters { - support_changes_trie: bool, + changes_trie_config: Option, heap_pages_override: Option, extra_storage: Storage, } @@ -100,7 +99,7 @@ pub struct GenesisParameters { impl GenesisParameters { fn genesis_config(&self) -> GenesisConfig { GenesisConfig::new( - self.support_changes_trie, + self.changes_trie_config.clone(), vec![ sr25519::Public::from(Sr25519Keyring::Alice).into(), sr25519::Public::from(Sr25519Keyring::Bob).into(), @@ -171,9 +170,9 @@ pub trait TestClientBuilderExt: Sized { /// Returns a mutable reference to the genesis parameters. fn genesis_init_mut(&mut self) -> &mut GenesisParameters; - /// Enable or disable support for changes trie in genesis. - fn set_support_changes_trie(mut self, support_changes_trie: bool) -> Self { - self.genesis_init_mut().support_changes_trie = support_changes_trie; + /// Set changes trie configuration for genesis. + fn changes_trie_config(mut self, config: Option) -> Self { + self.genesis_init_mut().changes_trie_config = config; self } diff --git a/test-utils/runtime/src/genesismap.rs b/test-utils/runtime/src/genesismap.rs index f6fbcddf44..25d9a807cc 100644 --- a/test-utils/runtime/src/genesismap.rs +++ b/test-utils/runtime/src/genesismap.rs @@ -36,7 +36,7 @@ pub struct GenesisConfig { impl GenesisConfig { pub fn new( - support_changes_trie: bool, + changes_trie_config: Option, authorities: Vec, endowed_accounts: Vec, balance: u64, @@ -44,10 +44,7 @@ impl GenesisConfig { extra_storage: Storage, ) -> Self { GenesisConfig { - changes_trie_config: match support_changes_trie { - true => Some(super::changes_trie_config()), - false => None, - }, + changes_trie_config, authorities: authorities.clone(), balances: endowed_accounts.into_iter().map(|a| (a, balance)).collect(), heap_pages_override, diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index b4c2e849a6..e68ed5f6fc 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -25,7 +25,7 @@ pub mod system; use sp_std::{prelude::*, marker::PhantomData}; use codec::{Encode, Decode, Input, Error}; -use sp_core::{Blake2Hasher, OpaqueMetadata, RuntimeDebug}; +use sp_core::{Blake2Hasher, OpaqueMetadata, RuntimeDebug, ChangesTrieConfiguration}; use sp_application_crypto::{ed25519, sr25519, RuntimeAppPublic}; use trie_db::{TrieMut, Trie}; use sp_trie::PrefixedMemoryDB; @@ -111,6 +111,7 @@ pub enum Extrinsic { Transfer(Transfer, AccountSignature), IncludeData(Vec), StorageChange(Vec, Option>), + ChangesTrieConfigUpdate(Option), } #[cfg(feature = "std")] @@ -135,6 +136,8 @@ impl BlindCheckable for Extrinsic { }, Extrinsic::IncludeData(_) => Err(InvalidTransaction::BadProof.into()), Extrinsic::StorageChange(key, value) => Ok(Extrinsic::StorageChange(key, value)), + Extrinsic::ChangesTrieConfigUpdate(new_config) => + Ok(Extrinsic::ChangesTrieConfigUpdate(new_config)), } } } @@ -196,14 +199,6 @@ pub fn run_tests(mut input: &[u8]) -> Vec { [stxs.len() as u8].encode() } -/// Changes trie configuration (optionally) used in tests. -pub fn changes_trie_config() -> sp_core::ChangesTrieConfiguration { - sp_core::ChangesTrieConfiguration { - digest_interval: 4, - digest_levels: 2, - } -} - /// A type that can not be decoded. #[derive(PartialEq)] pub struct DecodeFails { diff --git a/test-utils/runtime/src/system.rs b/test-utils/runtime/src/system.rs index b04ebc1cf2..4d12ab8437 100644 --- a/test-utils/runtime/src/system.rs +++ b/test-utils/runtime/src/system.rs @@ -35,7 +35,7 @@ use frame_system::Trait; use crate::{ AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest, AuthorityId }; -use sp_core::storage::well_known_keys; +use sp_core::{storage::well_known_keys, ChangesTrieConfiguration}; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -51,6 +51,7 @@ decl_storage! { Number get(fn number): Option; ParentHash get(fn parent_hash): Hash; NewAuthorities get(fn new_authorities): Option>; + NewChangesTrieConfig get(fn new_changes_trie_config): Option>; StorageDigest get(fn storage_digest): Option; Authorities get(fn authorities) config(): Vec; } @@ -206,6 +207,8 @@ pub fn finalize_block() -> Header { let mut digest = ::take().expect("StorageDigest is set by `initialize_block`"); let o_new_authorities = ::take(); + let new_changes_trie_config = ::take(); + // 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 = Hash::decode(&mut &storage_root()[..]) @@ -222,6 +225,12 @@ pub fn finalize_block() -> Header { digest.push(generic::DigestItem::Consensus(*b"babe", new_authorities.encode())); } + if let Some(new_config) = new_changes_trie_config { + digest.push(generic::DigestItem::ChangesTrieSignal( + generic::ChangesTrieSignal::NewConfiguration(new_config) + )); + } + Header { number, extrinsics_root, @@ -244,6 +253,8 @@ fn execute_transaction_backend(utx: &Extrinsic) -> ApplyExtrinsicResult { Extrinsic::AuthoritiesChange(ref new_auth) => execute_new_authorities_backend(new_auth), Extrinsic::IncludeData(_) => Ok(Ok(())), Extrinsic::StorageChange(key, value) => execute_storage_change(key, value.as_ref().map(|v| &**v)), + Extrinsic::ChangesTrieConfigUpdate(ref new_config) => + execute_changes_trie_config_update(new_config.clone()), } } @@ -286,6 +297,18 @@ fn execute_storage_change(key: &[u8], value: Option<&[u8]>) -> ApplyExtrinsicRes Ok(Ok(())) } +fn execute_changes_trie_config_update(new_config: Option) -> ApplyExtrinsicResult { + match new_config.clone() { + Some(new_config) => storage::unhashed::put_raw( + well_known_keys::CHANGES_TRIE_CONFIG, + &new_config.encode(), + ), + None => storage::unhashed::kill(well_known_keys::CHANGES_TRIE_CONFIG), + } + ::put(new_config); + Ok(Ok(())) +} + #[cfg(feature = "std")] fn info_expect_equal_hash(given: &Hash, expected: &Hash) { use sp_core::hexdisplay::HexDisplay; -- GitLab From 6a7137fedb19f5de2ae79e0b9b9eab0f41f13799 Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Fri, 17 Jan 2020 21:16:20 +1300 Subject: [PATCH 132/296] remove unused safe-mix dependency (#4656) --- Cargo.lock | 10 ---------- bin/node-template/runtime/Cargo.toml | 2 -- bin/node/runtime/Cargo.toml | 2 -- frame/balances/Cargo.toml | 2 -- frame/collective/Cargo.toml | 2 -- frame/democracy/Cargo.toml | 2 -- frame/elections/Cargo.toml | 2 -- frame/indices/Cargo.toml | 2 -- frame/session/Cargo.toml | 2 -- frame/staking/Cargo.toml | 2 -- frame/system/Cargo.toml | 2 -- 11 files changed, 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dd44111c15..88df9f243c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1403,7 +1403,6 @@ dependencies = [ "frame-support 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-externalities 0.8.0", @@ -3195,7 +3194,6 @@ dependencies = [ "pallet-utility 2.0.0", "parity-scale-codec 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)", - "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-authority-discovery 2.0.0", @@ -3264,7 +3262,6 @@ dependencies = [ "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-block-builder 2.0.0", @@ -3575,7 +3572,6 @@ dependencies = [ "frame-system 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3592,7 +3588,6 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3660,7 +3655,6 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3677,7 +3671,6 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3828,7 +3821,6 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3937,7 +3929,6 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", @@ -3976,7 +3967,6 @@ dependencies = [ "pallet-staking-reward-curve 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index b61ad25f46..e048d8baf7 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -18,7 +18,6 @@ transaction-payment = { version = "2.0.0", default-features = false, package = " codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } frame-executive = { version = "2.0.0", default-features = false, path = "../../../frame/executive" } -safe-mix = { version = "1.0.0", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } sp-api = { version = "2.0.0", default-features = false, path = "../../../primitives/api" } sp-block-builder = { path = "../../../primitives/block-builder", default-features = false} @@ -47,7 +46,6 @@ std = [ "grandpa/std", "indices/std", "randomness-collective-flip/std", - "safe-mix/std", "serde", "sp-api/std", "sp-block-builder/std", diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index cfa895c976..27b1e9382f 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -9,7 +9,6 @@ build = "build.rs" # third-party dependencies codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false, features = ["derive"] } integer-sqrt = { version = "0.1.2" } -safe-mix = { version = "1.0", default-features = false } rustc-hex = { version = "2.0", optional = true } serde = { version = "1.0.102", optional = true } @@ -101,7 +100,6 @@ std = [ "pallet-randomness-collective-flip/std", "sp-std/std", "rustc-hex", - "safe-mix/std", "serde", "pallet-session/std", "sp-api/std", diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index e5a3c4f2d7..f9522b5379 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } @@ -22,7 +21,6 @@ pallet-transaction-payment = { version = "2.0.0", path = "../transaction-payment default = ["std"] std = [ "serde", - "safe-mix/std", "codec/std", "sp-std/std", "frame-support/std", diff --git a/frame/collective/Cargo.toml b/frame/collective/Cargo.toml index 6bf3c1b9b5..a2150b82dd 100644 --- a/frame/collective/Cargo.toml +++ b/frame/collective/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } @@ -22,7 +21,6 @@ pallet-balances = { version = "2.0.0", path = "../balances" } [features] default = ["std"] std = [ - "safe-mix/std", "codec/std", "sp-core/std", "sp-std/std", diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 8e1aa13fc6..02145e8589 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "2.0.0", default-features = false, path = "../../primitives/io" } @@ -22,7 +21,6 @@ pallet-balances = { version = "2.0.0", path = "../balances" } default = ["std"] std = [ "serde", - "safe-mix/std", "codec/std", "sp-std/std", "sp-io/std", diff --git a/frame/elections/Cargo.toml b/frame/elections/Cargo.toml index 44d624b986..495151018e 100644 --- a/frame/elections/Cargo.toml +++ b/frame/elections/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } @@ -22,7 +21,6 @@ pallet-balances = { version = "2.0.0", path = "../balances" } [features] default = ["std"] std = [ - "safe-mix/std", "codec/std", "sp-core/std", "sp-std/std", diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index d05a7654d1..bd83761ff1 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-keyring = { version = "2.0.0", optional = true, path = "../../primitives/keyring" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } @@ -20,7 +19,6 @@ frame-system = { version = "2.0.0", default-features = false, path = "../system" default = ["std"] std = [ "serde", - "safe-mix/std", "sp-keyring", "codec/std", "sp-core/std", diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index 82047dbd68..aa9aaa1f44 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } @@ -28,7 +27,6 @@ default = ["std", "historical"] historical = ["sp-trie"] std = [ "serde", - "safe-mix/std", "codec/std", "sp-std/std", "frame-support/std", diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index e3e6fcbe7b..52584cf47f 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-keyring = { version = "2.0.0", optional = true, path = "../../primitives/keyring" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } @@ -31,7 +30,6 @@ migrate = [] default = ["std"] std = [ "serde", - "safe-mix/std", "sp-keyring", "codec/std", "sp-std/std", diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index fd9992aebe..098c320f45 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -safe-mix = { version = "1.0.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } @@ -25,7 +24,6 @@ substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/ru default = ["std"] std = [ "serde", - "safe-mix/std", "codec/std", "sp-core/std", "sp-std/std", -- GitLab From 394bcf4cb6e4a05efae2821fcc3b0b1cf6be8744 Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Fri, 17 Jan 2020 10:20:20 +0200 Subject: [PATCH 133/296] Add typedefs for storage types (#4654) * Add typedefs for storage types * Fix after merge --- client/api/src/backend.rs | 11 ++-- client/db/src/lib.rs | 7 +-- client/db/src/storage_cache.rs | 8 +-- client/src/in_mem.rs | 7 ++- client/src/light/backend.rs | 5 +- primitives/state-machine/src/backend.rs | 46 ++++++++--------- primitives/state-machine/src/basic.rs | 30 +++++------ .../state-machine/src/changes_trie/build.rs | 26 ++++++---- .../src/changes_trie/build_cache.rs | 22 ++++---- .../state-machine/src/changes_trie/input.rs | 15 +++--- .../state-machine/src/changes_trie/mod.rs | 15 ++++-- .../state-machine/src/changes_trie/storage.rs | 11 ++-- primitives/state-machine/src/ext.rs | 23 +++++---- .../state-machine/src/in_memory_backend.rs | 44 ++++++++-------- primitives/state-machine/src/lib.rs | 5 +- .../state-machine/src/overlayed_changes.rs | 50 ++++++++++++------- primitives/state-machine/src/testing.rs | 3 +- primitives/state-machine/src/trie_backend.rs | 22 ++++---- .../state-machine/src/trie_backend_essence.rs | 12 ++--- 19 files changed, 202 insertions(+), 160 deletions(-) diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index a1bed27a27..a389af5671 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -22,7 +22,10 @@ use sp_core::ChangesTrieConfigurationRange; use sp_core::offchain::OffchainStorage; use sp_runtime::{generic::BlockId, Justification, Storage}; use sp_runtime::traits::{Block as BlockT, NumberFor, HasherFor}; -use sp_state_machine::{ChangesTrieState, ChangesTrieStorage as StateChangesTrieStorage, ChangesTrieTransaction}; +use sp_state_machine::{ + ChangesTrieState, ChangesTrieStorage as StateChangesTrieStorage, ChangesTrieTransaction, + StorageCollection, ChildStorageCollection, +}; use crate::{ blockchain::{ Backend as BlockchainBackend, well_known_cache_keys @@ -45,12 +48,6 @@ pub type TransactionForSB = >>::Tra /// Extracts the transaction for the given backend. pub type TransactionFor = TransactionForSB, Block>; -/// 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)>; - /// Import operation summary. /// /// Contains information about the block that just got imported, diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 4038d917a7..29e17a5f0c 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -45,7 +45,7 @@ use std::collections::HashMap; use sc_client_api::{execution_extensions::ExecutionExtensions, ForkBlocks, UsageInfo, MemoryInfo, BadBlocks, IoInfo}; use sc_client_api::backend::NewBlockState; -use sc_client_api::backend::{PrunableStateChangesTrieStorage, StorageCollection, ChildStorageCollection}; +use sc_client_api::backend::PrunableStateChangesTrieStorage; use sp_blockchain::{ Result as ClientResult, Error as ClientError, well_known_cache_keys, HeaderBackend, @@ -66,8 +66,9 @@ use sp_runtime::traits::{ }; use sc_executor::RuntimeInfo; use sp_state_machine::{ - DBValue, ChangesTrieTransaction, ChangesTrieCacheAction, - backend::Backend as StateBackend, UsageInfo as StateUsageInfo, + DBValue, ChangesTrieTransaction, ChangesTrieCacheAction, UsageInfo as StateUsageInfo, + StorageCollection, ChildStorageCollection, + backend::Backend as StateBackend, }; use crate::utils::{DatabaseType, Meta, db_err, meta_keys, read_db, read_meta}; use crate::changes_tries_storage::{DbChangesTrieStorage, DbChangesTrieStorageTransaction}; diff --git a/client/db/src/storage_cache.rs b/client/db/src/storage_cache.rs index 4f7e906a0a..fd85a899b6 100644 --- a/client/db/src/storage_cache.rs +++ b/client/db/src/storage_cache.rs @@ -24,17 +24,17 @@ use hash_db::Hasher; use sp_runtime::traits::{Block as BlockT, Header, HasherFor, NumberFor}; use sp_core::hexdisplay::HexDisplay; use sp_core::storage::ChildInfo; -use sp_state_machine::{backend::Backend as StateBackend, TrieBackend}; +use sp_state_machine::{ + backend::Backend as StateBackend, TrieBackend, StorageKey, StorageValue, + StorageCollection, ChildStorageCollection, +}; use log::trace; -use sc_client_api::backend::{StorageCollection, ChildStorageCollection}; use std::hash::Hash as StdHash; use crate::stats::StateUsageStats; const STATE_CACHE_BLOCKS: usize = 12; -type StorageKey = Vec; type ChildStorageKey = (Vec, Vec); -type StorageValue = Vec; /// Shared canonical state cache. pub struct Cache { diff --git a/client/src/in_mem.rs b/client/src/in_mem.rs index 42a5e90101..dcff8102ae 100644 --- a/client/src/in_mem.rs +++ b/client/src/in_mem.rs @@ -26,11 +26,14 @@ use sp_core::offchain::storage::{ use sp_runtime::generic::BlockId; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor, HasherFor}; use sp_runtime::{Justification, Storage}; -use sp_state_machine::{ChangesTrieTransaction, InMemoryBackend, Backend as StateBackend}; +use sp_state_machine::{ + ChangesTrieTransaction, InMemoryBackend, Backend as StateBackend, StorageCollection, + ChildStorageCollection, +}; use sp_blockchain::{CachedHeaderMetadata, HeaderMetadata}; use sc_client_api::{ - backend::{self, NewBlockState, StorageCollection, ChildStorageCollection}, + backend::{self, NewBlockState}, blockchain::{ self, BlockStatus, HeaderBackend, well_known_cache_keys::Id as CacheKeyId }, diff --git a/client/src/light/backend.rs b/client/src/light/backend.rs index 2afb269d48..ad9f43587e 100644 --- a/client/src/light/backend.rs +++ b/client/src/light/backend.rs @@ -27,7 +27,8 @@ use sp_core::ChangesTrieConfiguration; use sp_core::storage::{well_known_keys, ChildInfo, OwnedChildInfo}; use sp_core::offchain::storage::InMemOffchainStorage; use sp_state_machine::{ - Backend as StateBackend, TrieBackend, InMemoryBackend, ChangesTrieTransaction + Backend as StateBackend, TrieBackend, InMemoryBackend, ChangesTrieTransaction, + StorageCollection, ChildStorageCollection, }; use sp_runtime::{generic::BlockId, Justification, Storage}; use sp_runtime::traits::{Block as BlockT, NumberFor, Zero, Header, HasherFor}; @@ -36,7 +37,7 @@ use sp_blockchain::{Error as ClientError, Result as ClientResult}; use sc_client_api::{ backend::{ AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState, - StorageCollection, ChildStorageCollection, PrunableStateChangesTrieStorage, + PrunableStateChangesTrieStorage, }, blockchain::{ HeaderBackend as BlockchainHeaderBackend, well_known_cache_keys, diff --git a/primitives/state-machine/src/backend.rs b/primitives/state-machine/src/backend.rs index 75733d68b3..4ef9b970ae 100644 --- a/primitives/state-machine/src/backend.rs +++ b/primitives/state-machine/src/backend.rs @@ -26,7 +26,7 @@ use sp_trie::{TrieMut, MemoryDB, trie_types::TrieDBMut}; use crate::{ trie_backend::TrieBackend, trie_backend_essence::TrieBackendStorage, - UsageInfo, + UsageInfo, StorageKey, StorageValue, StorageCollection, }; /// A state backend is used to read state data and can have changes committed @@ -44,7 +44,7 @@ pub trait Backend: std::fmt::Debug { type TrieBackendStorage: TrieBackendStorage; /// Get keyed storage or None if there is nothing associated. - fn storage(&self, key: &[u8]) -> Result>, Self::Error>; + fn storage(&self, key: &[u8]) -> Result, Self::Error>; /// Get keyed storage value hash or None if there is nothing associated. fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { @@ -57,7 +57,7 @@ pub trait Backend: std::fmt::Debug { storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, Self::Error>; + ) -> Result, Self::Error>; /// Get child keyed storage value hash or None if there is nothing associated. fn child_storage_hash( @@ -85,7 +85,7 @@ pub trait Backend: std::fmt::Debug { } /// Return the next key in storage in lexicographic order or `None` if there is no value. - fn next_storage_key(&self, key: &[u8]) -> Result>, Self::Error>; + fn next_storage_key(&self, key: &[u8]) -> Result, Self::Error>; /// Return the next key in child storage in lexicographic order or `None` if there is no value. fn next_child_storage_key( @@ -93,7 +93,7 @@ pub trait Backend: std::fmt::Debug { storage_key: &[u8], child_info: ChildInfo, key: &[u8] - ) -> Result>, Self::Error>; + ) -> Result, Self::Error>; /// Retrieve all entries keys of child storage and call `f` for each of those keys. fn for_keys_in_child_storage( @@ -129,7 +129,7 @@ pub trait Backend: std::fmt::Debug { /// Does not include child storage updates. fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where - I: IntoIterator, Option>)>, + I: IntoIterator)>, H::Out: Ord; /// Calculate the child storage root, with given delta over what is already stored in @@ -142,14 +142,14 @@ pub trait Backend: std::fmt::Debug { delta: I, ) -> (H::Out, bool, Self::Transaction) where - I: IntoIterator, Option>)>, + I: IntoIterator)>, H::Out: Ord; /// Get all key/value pairs into a Vec. - fn pairs(&self) -> Vec<(Vec, Vec)>; + fn pairs(&self) -> Vec<(StorageKey, StorageValue)>; /// Get all keys with given prefix - fn keys(&self, prefix: &[u8]) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec { let mut all = Vec::new(); self.for_keys_with_prefix(prefix, |k| all.push(k.to_vec())); all @@ -161,7 +161,7 @@ pub trait Backend: std::fmt::Debug { storage_key: &[u8], child_info: ChildInfo, prefix: &[u8], - ) -> Vec> { + ) -> Vec { let mut all = Vec::new(); self.for_child_keys_with_prefix(storage_key, child_info, prefix, |k| all.push(k.to_vec())); all @@ -181,9 +181,9 @@ pub trait Backend: std::fmt::Debug { child_deltas: I2) -> (H::Out, Self::Transaction) where - I1: IntoIterator, Option>)>, - I2i: IntoIterator, Option>)>, - I2: IntoIterator, I2i, OwnedChildInfo)>, + I1: IntoIterator)>, + I2i: IntoIterator)>, + I2: IntoIterator, H::Out: Ord + Encode, { let mut txs: Self::Transaction = Default::default(); @@ -220,7 +220,7 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { type Transaction = T::Transaction; type TrieBackendStorage = T::TrieBackendStorage; - fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + fn storage(&self, key: &[u8]) -> Result, Self::Error> { (*self).storage(key) } @@ -229,7 +229,7 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result, Self::Error> { (*self).child_storage(storage_key, child_info, key) } @@ -242,7 +242,7 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { (*self).for_keys_in_child_storage(storage_key, child_info, f) } - fn next_storage_key(&self, key: &[u8]) -> Result>, Self::Error> { + fn next_storage_key(&self, key: &[u8]) -> Result, Self::Error> { (*self).next_storage_key(key) } @@ -251,7 +251,7 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result, Self::Error> { (*self).next_child_storage_key(storage_key, child_info, key) } @@ -271,7 +271,7 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where - I: IntoIterator, Option>)>, + I: IntoIterator)>, H::Out: Ord, { (*self).storage_root(delta) @@ -284,13 +284,13 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { delta: I, ) -> (H::Out, bool, Self::Transaction) where - I: IntoIterator, Option>)>, + I: IntoIterator)>, H::Out: Ord, { (*self).child_storage_root(storage_key, child_info, delta) } - fn pairs(&self) -> Vec<(Vec, Vec)> { + fn pairs(&self) -> Vec<(StorageKey, StorageValue)> { (*self).pairs() } @@ -316,8 +316,8 @@ impl Consolidate for () { } impl Consolidate for Vec<( - Option<(Vec, OwnedChildInfo)>, - Vec<(Vec, Option>)>, + Option<(StorageKey, OwnedChildInfo)>, + StorageCollection, )> { fn consolidate(&mut self, mut other: Self) { self.append(&mut other); @@ -334,7 +334,7 @@ impl> Consolidate for sp_trie::GenericMem pub(crate) fn insert_into_memory_db(mdb: &mut MemoryDB, input: I) -> Option where H: Hasher, - I: IntoIterator, Vec)>, + I: IntoIterator, { let mut root = ::Out::default(); { diff --git a/primitives/state-machine/src/basic.rs b/primitives/state-machine/src/basic.rs index d06aedfc4b..d905657737 100644 --- a/primitives/state-machine/src/basic.rs +++ b/primitives/state-machine/src/basic.rs @@ -19,7 +19,7 @@ use std::{ collections::BTreeMap, any::{TypeId, Any}, iter::FromIterator, ops::Bound }; -use crate::{Backend, InMemoryBackend}; +use crate::{Backend, InMemoryBackend, StorageKey, StorageValue}; use hash_db::Hasher; use sp_trie::{TrieConfiguration, default_child_trie_root}; use sp_trie::trie_types::Layout; @@ -46,7 +46,7 @@ impl BasicExternalities { } /// Insert key/value - pub fn insert(&mut self, k: Vec, v: Vec) -> Option> { + pub fn insert(&mut self, k: StorageKey, v: StorageValue) -> Option { self.inner.top.insert(k, v) } @@ -89,8 +89,8 @@ impl PartialEq for BasicExternalities { } } -impl FromIterator<(Vec, Vec)> for BasicExternalities { - fn from_iter, Vec)>>(iter: I) -> Self { +impl FromIterator<(StorageKey, StorageValue)> for BasicExternalities { + fn from_iter>(iter: I) -> Self { let mut t = Self::default(); t.inner.top.extend(iter); t @@ -101,8 +101,8 @@ impl Default for BasicExternalities { fn default() -> Self { Self::new(Default::default()) } } -impl From, Vec>> for BasicExternalities { - fn from(hashmap: BTreeMap, Vec>) -> Self { +impl From> for BasicExternalities { + fn from(hashmap: BTreeMap) -> Self { BasicExternalities { inner: Storage { top: hashmap, children: Default::default(), @@ -111,7 +111,7 @@ impl From, Vec>> for BasicExternalities { } impl Externalities for BasicExternalities { - fn storage(&self, key: &[u8]) -> Option> { + fn storage(&self, key: &[u8]) -> Option { self.inner.top.get(key).cloned() } @@ -119,7 +119,7 @@ impl Externalities for BasicExternalities { self.storage(key).map(|v| Blake2Hasher::hash(&v).encode()) } - fn original_storage(&self, key: &[u8]) -> Option> { + fn original_storage(&self, key: &[u8]) -> Option { self.storage(key) } @@ -132,7 +132,7 @@ impl Externalities for BasicExternalities { storage_key: ChildStorageKey, _child_info: ChildInfo, key: &[u8], - ) -> Option> { + ) -> Option { self.inner.children.get(storage_key.as_ref()).and_then(|child| child.data.get(key)).cloned() } @@ -159,11 +159,11 @@ impl Externalities for BasicExternalities { storage_key: ChildStorageKey, child_info: ChildInfo, key: &[u8], - ) -> Option> { + ) -> Option { Externalities::child_storage(self, storage_key, child_info, key) } - fn next_storage_key(&self, key: &[u8]) -> Option> { + fn next_storage_key(&self, key: &[u8]) -> Option { let range = (Bound::Excluded(key), Bound::Unbounded); self.inner.top.range::<[u8], _>(range).next().map(|(k, _)| k).cloned() } @@ -173,13 +173,13 @@ impl Externalities for BasicExternalities { storage_key: ChildStorageKey, _child_info: ChildInfo, key: &[u8], - ) -> Option> { + ) -> Option { let range = (Bound::Excluded(key), Bound::Unbounded); self.inner.children.get(storage_key.as_ref()) .and_then(|child| child.data.range::<[u8], _>(range).next().map(|(k, _)| k).cloned()) } - fn place_storage(&mut self, key: Vec, maybe_value: Option>) { + fn place_storage(&mut self, key: StorageKey, maybe_value: Option) { if is_child_storage_key(&key) { warn!(target: "trie", "Refuse to set child storage key via main storage"); return; @@ -195,8 +195,8 @@ impl Externalities for BasicExternalities { &mut self, storage_key: ChildStorageKey, child_info: ChildInfo, - key: Vec, - value: Option>, + key: StorageKey, + value: Option, ) { let child_map = self.inner.children.entry(storage_key.into_owned()) .or_insert_with(|| StorageChild { diff --git a/primitives/state-machine/src/changes_trie/build.rs b/primitives/state-machine/src/changes_trie/build.rs index f717a1e6e3..c731d4104b 100644 --- a/primitives/state-machine/src/changes_trie/build.rs +++ b/primitives/state-machine/src/changes_trie/build.rs @@ -21,13 +21,17 @@ use std::collections::btree_map::Entry; use codec::{Decode, Encode}; use hash_db::Hasher; use num_traits::One; -use crate::backend::Backend; -use crate::overlayed_changes::OverlayedChanges; -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, ConfigurationRange, Storage, BlockNumber}; -use crate::changes_trie::input::ChildIndex; +use crate::{ + StorageKey, + backend::Backend, + overlayed_changes::OverlayedChanges, + trie_backend_essence::TrieBackendEssence, + changes_trie::{ + AnchorBlockId, ConfigurationRange, Storage, BlockNumber, + build_iterator::digest_build_iterator, + input::{InputKey, InputPair, DigestIndex, ExtrinsicIndex, ChildIndex}, + }, +}; /// Prepare input pairs for building a changes trie of given block. /// @@ -101,7 +105,7 @@ fn prepare_extrinsics_input<'a, B, H, Number>( Number: BlockNumber, { - let mut children_keys = BTreeSet::>::new(); + let mut children_keys = BTreeSet::::new(); let mut children_result = BTreeMap::new(); for (storage_key, _) in changes.prospective.children.iter() .chain(changes.committed.children.iter()) { @@ -126,7 +130,7 @@ fn prepare_extrinsics_input_inner<'a, B, H, Number>( backend: &'a B, block: &Number, changes: &'a OverlayedChanges, - storage_key: Option>, + storage_key: Option, ) -> Result> + 'a, String> where B: Backend, @@ -231,7 +235,7 @@ fn prepare_digest_input<'a, H, Number>( 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 insert_to_map = |map: &mut BTreeMap<_,_>, key: Vec| { + let insert_to_map = |map: &mut BTreeMap<_,_>, key: StorageKey| { match map.entry(key.clone()) { Entry::Vacant(entry) => { entry.insert((DigestIndex { @@ -277,7 +281,7 @@ fn prepare_digest_input<'a, H, Number>( return Ok((map, child_map)); } - let mut children_roots = BTreeMap::, _>::new(); + let mut children_roots = BTreeMap::::new(); { let trie_storage = TrieBackendEssence::<_, H>::new( crate::changes_trie::TrieBackendStorageAdapter(storage), diff --git a/primitives/state-machine/src/changes_trie/build_cache.rs b/primitives/state-machine/src/changes_trie/build_cache.rs index 76e3652e16..9d0dbb4c1f 100644 --- a/primitives/state-machine/src/changes_trie/build_cache.rs +++ b/primitives/state-machine/src/changes_trie/build_cache.rs @@ -18,6 +18,8 @@ use std::collections::{HashMap, HashSet}; +use crate::StorageKey; + /// Changes trie build cache. /// /// Helps to avoid read of changes tries from the database when digest trie @@ -36,7 +38,7 @@ pub struct BuildCache { /// The `Option>` in inner `HashMap` stands for the child storage key. /// If it is `None`, then the `HashSet` contains keys changed in top-level storage. /// If it is `Some`, then the `HashSet` contains keys changed in child storage, identified by the key. - changed_keys: HashMap>, HashSet>>>, + changed_keys: HashMap, HashSet>>, } /// The action to perform when block-with-changes-trie is imported. @@ -54,7 +56,7 @@ pub struct CachedBuildData { block: N, trie_root: H, digest_input_blocks: Vec, - changed_keys: HashMap>, HashSet>>, + changed_keys: HashMap, HashSet>, } /// The action to perform when block-with-changes-trie is imported. @@ -70,7 +72,7 @@ pub(crate) enum IncompleteCacheAction { #[derive(Debug, PartialEq)] pub(crate) struct IncompleteCachedBuildData { digest_input_blocks: Vec, - changed_keys: HashMap>, HashSet>>, + changed_keys: HashMap, HashSet>, } impl BuildCache @@ -87,7 +89,7 @@ impl BuildCache } /// Get cached changed keys for changes trie with given root. - pub fn get(&self, root: &H) -> Option<&HashMap>, HashSet>>> { + pub fn get(&self, root: &H) -> Option<&HashMap, HashSet>> { self.changed_keys.get(&root) } @@ -96,7 +98,7 @@ impl BuildCache pub fn with_changed_keys( &self, root: &H, - functor: &mut dyn FnMut(&HashMap>, HashSet>>), + functor: &mut dyn FnMut(&HashMap, HashSet>), ) -> bool { match self.changed_keys.get(&root) { Some(changed_keys) => { @@ -162,8 +164,8 @@ impl IncompleteCacheAction { /// Insert changed keys of given storage into cached data. pub(crate) fn insert( self, - storage_key: Option>, - changed_keys: HashSet>, + storage_key: Option, + changed_keys: HashSet, ) -> Self { match self { IncompleteCacheAction::CacheBuildData(build_data) => @@ -198,8 +200,8 @@ impl IncompleteCachedBuildData { fn insert( mut self, - storage_key: Option>, - changed_keys: HashSet>, + storage_key: Option, + changed_keys: HashSet, ) -> Self { self.changed_keys.insert(storage_key, changed_keys); self @@ -259,4 +261,4 @@ mod tests { assert_eq!(cache.changed_keys.len(), 0); } -} \ No newline at end of file +} diff --git a/primitives/state-machine/src/changes_trie/input.rs b/primitives/state-machine/src/changes_trie/input.rs index 9b3341ca58..4a1420f848 100644 --- a/primitives/state-machine/src/changes_trie/input.rs +++ b/primitives/state-machine/src/changes_trie/input.rs @@ -17,7 +17,10 @@ //! Different types of changes trie input pairs. use codec::{Decode, Encode, Input, Output, Error}; -use crate::changes_trie::BlockNumber; +use crate::{ + StorageKey, StorageValue, + changes_trie::BlockNumber +}; /// Key of { changed key => set of extrinsic indices } mapping. #[derive(Clone, Debug, PartialEq, Eq)] @@ -25,7 +28,7 @@ pub struct ExtrinsicIndex { /// Block at which this key has been inserted in the trie. pub block: Number, /// Storage key this node is responsible for. - pub key: Vec, + pub key: StorageKey, } /// Value of { changed key => set of extrinsic indices } mapping. @@ -37,7 +40,7 @@ pub struct DigestIndex { /// Block at which this key has been inserted in the trie. pub block: Number, /// Storage key this node is responsible for. - pub key: Vec, + pub key: StorageKey, } /// Key of { childtrie key => Childchange trie } mapping. @@ -46,7 +49,7 @@ pub struct ChildIndex { /// Block at which this key has been inserted in the trie. pub block: Number, /// Storage key this node is responsible for. - pub storage_key: Vec, + pub storage_key: StorageKey, } /// Value of { changed key => block/digest block numbers } mapping. @@ -89,8 +92,8 @@ impl InputPair { } } -impl Into<(Vec, Vec)> for InputPair { - fn into(self) -> (Vec, Vec) { +impl Into<(StorageKey, StorageValue)> for InputPair { + fn into(self) -> (StorageKey, StorageValue) { match self { InputPair::ExtrinsicIndex(key, value) => (key.encode(), value.encode()), InputPair::DigestIndex(key, value) => (key.encode(), value.encode()), diff --git a/primitives/state-machine/src/changes_trie/mod.rs b/primitives/state-machine/src/changes_trie/mod.rs index 3fc98caf79..12074b7261 100644 --- a/primitives/state-machine/src/changes_trie/mod.rs +++ b/primitives/state-machine/src/changes_trie/mod.rs @@ -68,15 +68,20 @@ pub use self::prune::prune; use std::collections::{HashMap, HashSet}; use std::convert::TryInto; use hash_db::{Hasher, Prefix}; -use crate::backend::Backend; use num_traits::{One, Zero}; use codec::{Decode, Encode}; use sp_core; -use crate::changes_trie::build::prepare_input; -use crate::changes_trie::build_cache::{IncompleteCachedBuildData, IncompleteCacheAction}; -use crate::overlayed_changes::OverlayedChanges; use sp_trie::{MemoryDB, DBValue, TrieMut}; use sp_trie::trie_types::TrieDBMut; +use crate::{ + StorageKey, + backend::Backend, + overlayed_changes::OverlayedChanges, + changes_trie::{ + build::prepare_input, + build_cache::{IncompleteCachedBuildData, IncompleteCacheAction}, + }, +}; /// Changes that are made outside of extrinsics are marked with this index; pub const NO_EXTRINSIC_INDEX: u32 = 0xffffffff; @@ -151,7 +156,7 @@ pub trait Storage: RootsStorage { fn with_cached_changed_keys( &self, root: &H::Out, - functor: &mut dyn FnMut(&HashMap>, HashSet>>), + functor: &mut dyn FnMut(&HashMap, HashSet>), ) -> bool; /// Get a trie node. fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String>; diff --git a/primitives/state-machine/src/changes_trie/storage.rs b/primitives/state-machine/src/changes_trie/storage.rs index 163ea7f412..7fb4186728 100644 --- a/primitives/state-machine/src/changes_trie/storage.rs +++ b/primitives/state-machine/src/changes_trie/storage.rs @@ -21,8 +21,11 @@ use hash_db::{Hasher, Prefix, EMPTY_PREFIX}; use sp_trie::DBValue; use sp_trie::MemoryDB; use parking_lot::RwLock; -use crate::changes_trie::{BuildCache, RootsStorage, Storage, AnchorBlockId, BlockNumber}; -use crate::trie_backend_essence::TrieBackendStorage; +use crate::{ + StorageKey, + trie_backend_essence::TrieBackendStorage, + changes_trie::{BuildCache, RootsStorage, Storage, AnchorBlockId, BlockNumber}, +}; #[cfg(test)] use crate::backend::insert_into_memory_db; @@ -93,7 +96,7 @@ impl InMemoryStorage { #[cfg(test)] pub fn with_inputs( mut top_inputs: Vec<(Number, Vec>)>, - children_inputs: Vec<(Vec, Vec<(Number, Vec>)>)>, + children_inputs: Vec<(StorageKey, Vec<(Number, Vec>)>)>, ) -> Self { let mut mdb = MemoryDB::default(); let mut roots = BTreeMap::new(); @@ -179,7 +182,7 @@ impl Storage for InMemoryStorage>, HashSet>>), + functor: &mut dyn FnMut(&HashMap, HashSet>), ) -> bool { self.cache.with_changed_keys(root, functor) } diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index 3ee7292102..f293ae9f51 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -17,7 +17,8 @@ //! Concrete externalities implementation. use crate::{ - backend::Backend, OverlayedChanges, StorageTransactionCache, + StorageKey, StorageValue, OverlayedChanges, StorageTransactionCache, + backend::Backend, changes_trie::State as ChangesTrieState, }; @@ -130,7 +131,7 @@ where B: 'a + Backend, N: crate::changes_trie::BlockNumber, { - pub fn storage_pairs(&self) -> Vec<(Vec, Vec)> { + pub fn storage_pairs(&self) -> Vec<(StorageKey, StorageValue)> { use std::collections::HashMap; self.backend.pairs().iter() @@ -151,7 +152,7 @@ where B: 'a + Backend, N: crate::changes_trie::BlockNumber, { - fn storage(&self, key: &[u8]) -> Option> { + fn storage(&self, key: &[u8]) -> Option { let _guard = sp_panic_handler::AbortGuard::force_abort(); let result = 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)); @@ -178,7 +179,7 @@ where result.map(|r| r.encode()) } - fn original_storage(&self, key: &[u8]) -> Option> { + fn original_storage(&self, key: &[u8]) -> Option { let _guard = sp_panic_handler::AbortGuard::force_abort(); let result = self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL); @@ -207,7 +208,7 @@ where storage_key: ChildStorageKey, child_info: ChildInfo, key: &[u8], - ) -> Option> { + ) -> Option { let _guard = sp_panic_handler::AbortGuard::force_abort(); let result = self.overlay .child_storage(storage_key.as_ref(), key) @@ -256,7 +257,7 @@ where storage_key: ChildStorageKey, child_info: ChildInfo, key: &[u8], - ) -> Option> { + ) -> Option { let _guard = sp_panic_handler::AbortGuard::force_abort(); let result = self.backend .child_storage(storage_key.as_ref(), child_info, key) @@ -332,7 +333,7 @@ where result } - fn next_storage_key(&self, key: &[u8]) -> Option> { + fn next_storage_key(&self, key: &[u8]) -> Option { let next_backend_key = self.backend.next_storage_key(key).expect(EXT_NOT_ALLOWED_TO_FAIL); let next_overlay_key_change = self.overlay.next_storage_key_change(key); @@ -352,7 +353,7 @@ where storage_key: ChildStorageKey, child_info: ChildInfo, key: &[u8], - ) -> Option> { + ) -> Option { let next_backend_key = self.backend .next_child_storage_key(storage_key.as_ref(), child_info, key) .expect(EXT_NOT_ALLOWED_TO_FAIL); @@ -376,7 +377,7 @@ where } } - fn place_storage(&mut self, key: Vec, value: Option>) { + fn place_storage(&mut self, key: StorageKey, value: Option) { trace!(target: "state-trace", "{:04x}: Put {}={:?}", self.id, HexDisplay::from(&key), @@ -396,8 +397,8 @@ where &mut self, storage_key: ChildStorageKey, child_info: ChildInfo, - key: Vec, - value: Option>, + key: StorageKey, + value: Option, ) { trace!(target: "state-trace", "{:04x}: PutChild({}) {}={:?}", self.id, diff --git a/primitives/state-machine/src/in_memory_backend.rs b/primitives/state-machine/src/in_memory_backend.rs index ae1a214a72..0a29468bbc 100644 --- a/primitives/state-machine/src/in_memory_backend.rs +++ b/primitives/state-machine/src/in_memory_backend.rs @@ -16,7 +16,11 @@ //! State machine in memory backend. -use crate::{trie_backend::TrieBackend, backend::{Backend, insert_into_memory_db}}; +use crate::{ + StorageKey, StorageValue, StorageCollection, + trie_backend::TrieBackend, + backend::{Backend, insert_into_memory_db}, +}; use std::{error, fmt, collections::{BTreeMap, HashMap}, marker::PhantomData, ops}; use hash_db::Hasher; use sp_trie::{ @@ -43,7 +47,7 @@ impl error::Error for Void { /// In-memory backend. Fully recomputes tries each time `as_trie_backend` is called but useful for /// tests and proof checking. pub struct InMemory { - inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>>, + inner: HashMap, BTreeMap>, // This field is only needed for returning reference in `as_trie_backend`. trie: Option, H>>, _hasher: PhantomData, @@ -84,7 +88,7 @@ impl PartialEq for InMemory { impl InMemory { /// Copy the state, with applied updates pub fn update< - T: IntoIterator, OwnedChildInfo)>, Vec<(Vec, Option>)>)> + T: IntoIterator, StorageCollection)> >( &self, changes: T, @@ -103,10 +107,10 @@ impl InMemory { } } -impl From, OwnedChildInfo)>, BTreeMap, Vec>>> +impl From, BTreeMap>> for InMemory { - fn from(inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>>) -> Self { + fn from(inner: HashMap, BTreeMap>) -> Self { InMemory { inner, trie: None, @@ -117,7 +121,7 @@ impl From, OwnedChildInfo)>, BTreeMap impl From for InMemory { fn from(inners: Storage) -> Self { - let mut inner: HashMap, OwnedChildInfo)>, BTreeMap, Vec>> + let mut inner: HashMap, BTreeMap> = inners.children.into_iter().map(|(k, c)| (Some((k, c.child_info)), c.data)).collect(); inner.insert(None, inners.top); InMemory { @@ -128,8 +132,8 @@ impl From for InMemory { } } -impl From, Vec>> for InMemory { - fn from(inner: BTreeMap, Vec>) -> Self { +impl From> for InMemory { + fn from(inner: BTreeMap) -> Self { let mut expanded = HashMap::new(); expanded.insert(None, inner); InMemory { @@ -140,12 +144,12 @@ impl From, Vec>> for InMemory { } } -impl From, OwnedChildInfo)>, Vec<(Vec, Option>)>)>> +impl From, StorageCollection)>> for InMemory { fn from( - inner: Vec<(Option<(Vec, OwnedChildInfo)>, Vec<(Vec, Option>)>)>, + inner: Vec<(Option<(StorageKey, OwnedChildInfo)>, StorageCollection)>, ) -> Self { - let mut expanded: HashMap, OwnedChildInfo)>, BTreeMap, Vec>> + let mut expanded: HashMap, BTreeMap> = HashMap::new(); for (child_info, key_values) in inner { let entry = expanded.entry(child_info).or_default(); @@ -171,12 +175,12 @@ impl InMemory { impl Backend for InMemory where H::Out: Codec { type Error = Void; type Transaction = Vec<( - Option<(Vec, OwnedChildInfo)>, - Vec<(Vec, Option>)>, + Option<(StorageKey, OwnedChildInfo)>, + StorageCollection, )>; type TrieBackendStorage = MemoryDB; - fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + fn storage(&self, key: &[u8]) -> Result, Self::Error> { Ok(self.inner.get(&None).and_then(|map| map.get(key).map(Clone::clone))) } @@ -185,7 +189,7 @@ impl Backend for InMemory where H::Out: Codec { storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result, Self::Error> { Ok(self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) .and_then(|map| map.get(key).map(Clone::clone))) } @@ -279,7 +283,7 @@ impl Backend for InMemory where H::Out: Codec { (root, is_default, vec![(child_info, full_transaction)]) } - fn next_storage_key(&self, key: &[u8]) -> Result>, Self::Error> { + fn next_storage_key(&self, key: &[u8]) -> Result, Self::Error> { let range = (ops::Bound::Excluded(key), ops::Bound::Unbounded); let next_key = self.inner.get(&None) .and_then(|map| map.range::<[u8], _>(range).next().map(|(k, _)| k).cloned()); @@ -292,7 +296,7 @@ impl Backend for InMemory where H::Out: Codec { storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result, Self::Error> { let range = (ops::Bound::Excluded(key), ops::Bound::Unbounded); let next_key = self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) .and_then(|map| map.range::<[u8], _>(range).next().map(|(k, _)| k).cloned()); @@ -300,14 +304,14 @@ impl Backend for InMemory where H::Out: Codec { Ok(next_key) } - fn pairs(&self) -> Vec<(Vec, Vec)> { + fn pairs(&self) -> Vec<(StorageKey, StorageValue)> { self.inner.get(&None) .into_iter() .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))) .collect() } - fn keys(&self, prefix: &[u8]) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec { self.inner.get(&None) .into_iter() .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) @@ -319,7 +323,7 @@ impl Backend for InMemory where H::Out: Codec { storage_key: &[u8], child_info: ChildInfo, prefix: &[u8], - ) -> Vec> { + ) -> Vec { self.inner.get(&Some((storage_key.to_vec(), child_info.to_owned()))) .into_iter() .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index b27bf47050..bb62df6da4 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -62,7 +62,10 @@ pub use changes_trie::{ disabled_state as disabled_changes_trie_state, BlockNumber as ChangesTrieBlockNumber, }; -pub use overlayed_changes::{OverlayedChanges, StorageChanges, StorageTransactionCache}; +pub use overlayed_changes::{ + OverlayedChanges, StorageChanges, StorageTransactionCache, StorageKey, StorageValue, + StorageCollection, ChildStorageCollection, +}; pub use proving_backend::{ create_proof_check_backend, create_proof_check_backend_storage, merge_storage_proofs, ProofRecorder, ProvingBackend, ProvingBackendRecorder, StorageProof, diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index 6c41ed06ef..ed6f30a4f5 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -33,6 +33,18 @@ use std::{mem, ops}; use hash_db::Hasher; +/// Storage key. +pub type StorageKey = Vec; + +/// Storage value. +pub type StorageValue = Vec; + +/// In memory array of storage values. +pub type StorageCollection = Vec<(StorageKey, Option)>; + +/// In memory arrays of storage values for multiple child tries. +pub type ChildStorageCollection = Vec<(StorageKey, StorageCollection)>; + /// The overlayed changes to state to be queried on top of the backend. /// /// A transaction shares all prospective changes within an inner overlay @@ -52,7 +64,7 @@ pub struct OverlayedChanges { #[cfg_attr(test, derive(PartialEq))] pub struct OverlayedValue { /// Current value. None if value has been deleted. - pub value: Option>, + pub value: Option, /// The set of extinsic indices where the values has been changed. /// Is filled only if runtime has announced changes trie support. pub extrinsics: Option>, @@ -63,9 +75,9 @@ pub struct OverlayedValue { #[cfg_attr(test, derive(PartialEq))] pub struct OverlayedChangeSet { /// Top level storage changes. - pub top: BTreeMap, OverlayedValue>, + pub top: BTreeMap, /// Child storage changes. - pub children: HashMap, (BTreeMap, OverlayedValue>, OwnedChildInfo)>, + pub children: HashMap, OwnedChildInfo)>, } /// A storage changes structure that can be generated by the data collected in [`OverlayedChanges`]. @@ -76,9 +88,9 @@ pub struct StorageChanges { /// All changes to the main storage. /// /// A value of `None` means that it was deleted. - pub main_storage_changes: Vec<(Vec, Option>)>, + pub main_storage_changes: StorageCollection, /// All changes to the child storages. - pub child_storage_changes: Vec<(Vec, Vec<(Vec, Option>)>)>, + pub child_storage_changes: ChildStorageCollection, /// A transaction for the backend that contains all changes from /// [`main_storage_changes`](Self::main_storage_changes) and from /// [`child_storage_changes`](Self::child_storage_changes). @@ -94,8 +106,8 @@ pub struct StorageChanges { impl StorageChanges { /// Deconstruct into the inner values pub fn into_inner(self) -> ( - Vec<(Vec, Option>)>, - Vec<(Vec, Vec<(Vec, Option>)>)>, + StorageCollection, + ChildStorageCollection, Transaction, H::Out, Option>, @@ -155,8 +167,8 @@ impl Default for StorageChanges } #[cfg(test)] -impl FromIterator<(Vec, OverlayedValue)> for OverlayedChangeSet { - fn from_iter, OverlayedValue)>>(iter: T) -> Self { +impl FromIterator<(StorageKey, OverlayedValue)> for OverlayedChangeSet { + fn from_iter>(iter: T) -> Self { Self { top: iter.into_iter().collect(), children: Default::default(), @@ -219,7 +231,7 @@ impl OverlayedChanges { /// Inserts the given key-value pair into the prospective change set. /// /// `None` can be used to delete a value specified by the given key. - pub(crate) fn set_storage(&mut self, key: Vec, val: Option>) { + pub(crate) fn set_storage(&mut self, key: StorageKey, val: Option) { let extrinsic_index = self.extrinsic_index(); let entry = self.prospective.top.entry(key).or_default(); entry.value = val; @@ -235,10 +247,10 @@ impl OverlayedChanges { /// `None` can be used to delete a value specified by the given key. pub(crate) fn set_child_storage( &mut self, - storage_key: Vec, + storage_key: StorageKey, child_info: ChildInfo, - key: Vec, - val: Option>, + key: StorageKey, + val: Option, ) { let extrinsic_index = self.extrinsic_index(); let map_entry = self.prospective.children.entry(storage_key) @@ -417,8 +429,8 @@ impl OverlayedChanges { /// Panics: /// Will panic if there are any uncommitted prospective changes. pub fn into_committed(self) -> ( - impl Iterator, Option>)>, - impl Iterator, (impl Iterator, Option>)>, OwnedChildInfo))>, + impl Iterator)>, + impl Iterator)>, OwnedChildInfo))>, ){ assert!(self.prospective.is_empty()); ( @@ -631,8 +643,8 @@ impl OverlayedChanges { } #[cfg(test)] -impl From>> for OverlayedValue { - fn from(value: Option>) -> OverlayedValue { +impl From> for OverlayedValue { + fn from(value: Option) -> OverlayedValue { OverlayedValue { value, ..Default::default() } } } @@ -647,8 +659,8 @@ mod tests { use crate::ext::Ext; use super::*; - fn strip_extrinsic_index(map: &BTreeMap, OverlayedValue>) - -> BTreeMap, OverlayedValue> + fn strip_extrinsic_index(map: &BTreeMap) + -> BTreeMap { let mut clone = map.clone(); clone.remove(&EXTRINSIC_INDEX.to_vec()); diff --git a/primitives/state-machine/src/testing.rs b/primitives/state-machine/src/testing.rs index 450919088a..39a34509b7 100644 --- a/primitives/state-machine/src/testing.rs +++ b/primitives/state-machine/src/testing.rs @@ -21,6 +21,7 @@ use codec::Decode; use hash_db::Hasher; use crate::{ backend::Backend, OverlayedChanges, StorageTransactionCache, ext::Ext, InMemoryBackend, + StorageKey, StorageValue, changes_trie::{ Configuration as ChangesTrieConfiguration, InMemoryStorage as ChangesTrieInMemoryStorage, @@ -104,7 +105,7 @@ impl TestExternalities } /// Insert key/value into backend - pub fn insert(&mut self, k: Vec, v: Vec) { + pub fn insert(&mut self, k: StorageKey, v: StorageValue) { self.backend = self.backend.update(vec![(None, vec![(k, Some(v))])]); } diff --git a/primitives/state-machine/src/trie_backend.rs b/primitives/state-machine/src/trie_backend.rs index 1920ea40a8..dbaae323c0 100644 --- a/primitives/state-machine/src/trie_backend.rs +++ b/primitives/state-machine/src/trie_backend.rs @@ -20,10 +20,12 @@ use log::{warn, debug}; use hash_db::Hasher; use sp_trie::{Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; use sp_trie::trie_types::{TrieDB, TrieError, Layout}; -use crate::trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}; -use crate::Backend; use sp_core::storage::ChildInfo; use codec::{Codec, Decode}; +use crate::{ + StorageKey, StorageValue, Backend, + trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}, +}; /// Patricia trie-based backend. Transaction type is an overlay of changes to commit. pub struct TrieBackend, H: Hasher> { @@ -72,7 +74,7 @@ impl, H: Hasher> Backend for TrieBackend where type Transaction = S::Overlay; type TrieBackendStorage = S; - fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + fn storage(&self, key: &[u8]) -> Result, Self::Error> { self.essence.storage(key) } @@ -81,11 +83,11 @@ impl, H: Hasher> Backend for TrieBackend where storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result, Self::Error> { self.essence.child_storage(storage_key, child_info, key) } - fn next_storage_key(&self, key: &[u8]) -> Result>, Self::Error> { + fn next_storage_key(&self, key: &[u8]) -> Result, Self::Error> { self.essence.next_storage_key(key) } @@ -94,7 +96,7 @@ impl, H: Hasher> Backend for TrieBackend where storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result, Self::Error> { self.essence.next_child_storage_key(storage_key, child_info, key) } @@ -125,7 +127,7 @@ impl, H: Hasher> Backend for TrieBackend where self.essence.for_child_keys_with_prefix(storage_key, child_info, prefix, f) } - fn pairs(&self) -> Vec<(Vec, Vec)> { + fn pairs(&self) -> Vec<(StorageKey, StorageValue)> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); @@ -149,7 +151,7 @@ impl, H: Hasher> Backend for TrieBackend where } } - fn keys(&self, prefix: &[u8]) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); @@ -170,7 +172,7 @@ impl, H: Hasher> Backend for TrieBackend where } fn storage_root(&self, delta: I) -> (H::Out, S::Overlay) - where I: IntoIterator, Option>)> + where I: IntoIterator)> { let mut write_overlay = S::Overlay::default(); let mut root = *self.essence.root(); @@ -197,7 +199,7 @@ impl, H: Hasher> Backend for TrieBackend where delta: I, ) -> (H::Out, bool, Self::Transaction) where - I: IntoIterator, Option>)>, + I: IntoIterator)>, H::Out: Ord, { let default_root = default_child_trie_root::>(storage_key); diff --git a/primitives/state-machine/src/trie_backend_essence.rs b/primitives/state-machine/src/trie_backend_essence.rs index f7f5006f41..2598682ae0 100644 --- a/primitives/state-machine/src/trie_backend_essence.rs +++ b/primitives/state-machine/src/trie_backend_essence.rs @@ -25,7 +25,7 @@ use sp_trie::{Trie, MemoryDB, PrefixedMemoryDB, DBValue, default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie, KeySpacedDB}; use sp_trie::trie_types::{TrieDB, TrieError, Layout}; -use crate::backend::Consolidate; +use crate::{backend::Consolidate, StorageKey, StorageValue}; use sp_core::storage::ChildInfo; use codec::Encode; @@ -67,7 +67,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: /// Return the next key in the trie i.e. the minimum key that is strictly superior to `key` in /// lexicographic order. - pub fn next_storage_key(&self, key: &[u8]) -> Result>, String> { + pub fn next_storage_key(&self, key: &[u8]) -> Result, String> { self.next_storage_key_from_root(&self.root, None, key) } @@ -78,7 +78,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, String> { + ) -> Result, String> { let child_root = match self.storage(storage_key)? { Some(child_root) => child_root, None => return Ok(None), @@ -101,7 +101,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: root: &H::Out, child_info: Option, key: &[u8], - ) -> Result>, String> { + ) -> Result, String> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, @@ -146,7 +146,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: } /// Get the value of storage at given key. - pub fn storage(&self, key: &[u8]) -> Result>, String> { + pub fn storage(&self, key: &[u8]) -> Result, String> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, @@ -164,7 +164,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: storage_key: &[u8], child_info: ChildInfo, key: &[u8], - ) -> Result>, String> { + ) -> Result, String> { let root = self.storage(storage_key)? .unwrap_or(default_child_trie_root::>(storage_key).encode()); -- GitLab From 7248ac20c4386b30804dcad1bdeeed4c0a71b6ca Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 17 Jan 2020 13:18:38 +0300 Subject: [PATCH 134/296] add debug logs (#4657) --- client/basic-authorship/src/basic_authorship.rs | 1 + client/transaction-pool/graph/src/validated_pool.rs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index d13000051a..6c5b063020 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -205,6 +205,7 @@ impl ProposerInner, let pending_iterator = self.transaction_pool.ready(); debug!("Attempting to push transactions from the pool."); + debug!("Pool status: {:?}", self.transaction_pool.status()); for pending_tx in pending_iterator { if (self.now)() > deadline { debug!( diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 7af32c8818..29f82fb894 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -470,12 +470,15 @@ impl ValidatedPool { return vec![] } + debug!(target: "txpool", "Removing invalid transactions: {:?}", hashes); + // temporarily ban invalid transactions - debug!(target: "txpool", "Banning invalid transactions: {:?}", hashes); self.rotator.ban(&time::Instant::now(), hashes.iter().cloned()); let invalid = self.pool.write().remove_subtree(hashes); + debug!(target: "txpool", "Removed invalid transactions: {:?}", invalid); + let mut listener = self.listener.write(); for tx in &invalid { listener.invalid(&tx.hash, true); -- GitLab From 188d59e603477e6aad42fbb094011c5eda9a6120 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Fri, 17 Jan 2020 12:30:00 +0100 Subject: [PATCH 135/296] CODEOWNERS: Add myself to pow and EVM module (#4653) --- docs/CODEOWNERS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index bc4559805b..9304f27853 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -46,11 +46,16 @@ /client/finality-grandpa/ @andresilva @DemiMarie-parity /client/consensus/babe/ @andresilva @DemiMarie-parity /client/consensus/slots/ @andresilva @DemiMarie-parity +/client/consensus/pow/ @sorpaas +/primitives/consensus/pow/ @sorpaas # Contracts /frame/contracts/ @pepyakin @thiolliere /frame/contracts/src/wasm/runtime.rs @Robbepop +# EVM +/frame/evm/ @sorpaas + # Inflation points /frame/staking/src/inflation.rs @thiolliere -- GitLab From d4fbb897cd8b78a5ba2b182ebc045200942b81d9 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 17 Jan 2020 13:58:25 +0100 Subject: [PATCH 136/296] client/finality-grandpa: Reintegrate periodic neighbor packet worker (#4631) The `NeighborPacketWorker` within `client/finality-grandpa` does two things: 1. It receives neighbor packets from components within `client/finality-grandpa`, sends them down to the `GossipEngine` in order for neighboring nodes to receive. 2. It periodically sends out the most recent neighbor packet to the `GossipEngine`. In order to send out packets it had a clone to a `GossipEgine` within an atomic reference counter and a mutex. The `NeighborPacketWorker` was then spawned onto its own asynchronous task. Instead of running in its own task, this patch reintegrates the `NeighborPacketWorker` into the main `client/finality-grandpa` task not requiring the `NeighborPacketWorker` to own a clone of the `GossipEngine`. The greater picture This is a tiny change within a greater refactoring. The overall goal is to **simplify** how finality-grandpa interacts with the network and to **reduce** the amount of **unbounded channels** within the logic. Why no unbounded channels: Bounding channels is needed for backpressure and proper scheduling. With unbounded channels there is no way of telling the producer side to slow down for the consumer side to catch up. Rephrased, there is no way for the scheduler to know when to favour the consumer task over the producer task on a crowded channel and the other way round for an empty channel. Reducing the amount of shared ownership simplifies the logic and enables one to use async-await syntax-suggar, given that one does not need to hold a lock across poll invocations. Using async-await enables one to use bounded channels without complex logic. --- .../finality-grandpa/src/communication/mod.rs | 54 ++++++-- .../src/communication/periodic.rs | 118 +++++++++--------- client/finality-grandpa/src/lib.rs | 17 ++- 3 files changed, 121 insertions(+), 68 deletions(-) diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index b65f340652..d966091a18 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -27,13 +27,18 @@ //! In the future, there will be a fallback for allowing sending the same message //! under certain conditions that are used to un-stick the protocol. -use std::sync::Arc; - use futures::{prelude::*, future::Executor as _, sync::mpsc}; -use futures03::{compat::Compat, stream::StreamExt, future::FutureExt as _, future::TryFutureExt as _}; +use futures03::{ + compat::Compat, + stream::StreamExt, + future::{Future as Future03, FutureExt as _, TryFutureExt as _}, +}; +use log::{debug, trace}; +use parking_lot::Mutex; +use std::{pin::Pin, sync::Arc, task::{Context, Poll as Poll03}}; + use finality_grandpa::Message::{Prevote, Precommit, PrimaryPropose}; use finality_grandpa::{voter, voter_set::VoterSet}; -use log::{debug, trace}; use sc_network::{NetworkService, ReputationChange}; use sc_network_gossip::{GossipEngine, Network as GossipNetwork}; use parity_scale_codec::{Encode, Decode}; @@ -134,9 +139,22 @@ pub(crate) struct NetworkBridge> { service: N, gossip_engine: GossipEngine, validator: Arc>, + + /// Sender side of the neighbor packet channel. + /// + /// Packets sent into this channel are processed by the `NeighborPacketWorker` and passed on to + /// the underlying `GossipEngine`. neighbor_sender: periodic::NeighborPacketSender, + + /// `NeighborPacketWorker` processing packets sent through the `NeighborPacketSender`. + // + // NetworkBridge is required to be clonable, thus one needs to be able to clone its children, + // thus one has to wrap neighor_packet_worker with an Arc Mutex. + neighbor_packet_worker: Arc>>, } +impl> Unpin for NetworkBridge {} + impl> NetworkBridge { /// Create a new NetworkBridge to the given NetworkService. Returns the service /// handle. @@ -195,14 +213,18 @@ impl> NetworkBridge { } } - let (rebroadcast_job, neighbor_sender) = periodic::neighbor_packet_worker(gossip_engine.clone()); + let (neighbor_packet_worker, neighbor_packet_sender) = periodic::NeighborPacketWorker::new(); let reporting_job = report_stream.consume(gossip_engine.clone()); - let bridge = NetworkBridge { service, gossip_engine, validator, neighbor_sender }; + let bridge = NetworkBridge { + service, + gossip_engine, + validator, + neighbor_sender: neighbor_packet_sender, + neighbor_packet_worker: Arc::new(Mutex::new(neighbor_packet_worker)), + }; let executor = Compat::new(executor); - executor.execute(Box::new(rebroadcast_job.select(on_exit.clone().map(Ok).compat()).then(|_| Ok(())))) - .expect("failed to spawn grandpa rebroadcast job task"); executor.execute(Box::new(reporting_job.select(on_exit.clone().map(Ok).compat()).then(|_| Ok(())))) .expect("failed to spawn grandpa reporting job task"); @@ -391,6 +413,21 @@ impl> NetworkBridge { } } +impl> Future03 for NetworkBridge { + type Output = Result<(), Error>; + + fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll03 { + loop { + match futures03::ready!((self.neighbor_packet_worker.lock()).poll_next_unpin(cx)) { + None => return Poll03::Ready( + Err(Error::Network("NeighborPacketWorker stream closed.".into())) + ), + Some((to, packet)) => self.gossip_engine.send_message(to, packet.encode()), + } + } + } +} + fn incoming_global( mut gossip_engine: GossipEngine, topic: B::Hash, @@ -530,6 +567,7 @@ impl> Clone for NetworkBridge { gossip_engine: self.gossip_engine.clone(), validator: Arc::clone(&self.validator), neighbor_sender: self.neighbor_sender.clone(), + neighbor_packet_worker: self.neighbor_packet_worker.clone(), } } } diff --git a/client/finality-grandpa/src/communication/periodic.rs b/client/finality-grandpa/src/communication/periodic.rs index a31203104b..d5c8c1e0b8 100644 --- a/client/finality-grandpa/src/communication/periodic.rs +++ b/client/finality-grandpa/src/communication/periodic.rs @@ -16,21 +16,16 @@ //! Periodic rebroadcast of neighbor packets. -use std::time::{Instant, Duration}; - -use parity_scale_codec::Encode; -use futures::prelude::*; -use futures::sync::mpsc; use futures_timer::Delay; -use futures03::future::{FutureExt as _, TryFutureExt as _}; -use log::{debug, warn}; +use futures03::{channel::mpsc, future::{FutureExt as _}, prelude::*, ready, stream::Stream}; +use log::debug; +use std::{pin::Pin, task::{Context, Poll}, time::{Instant, Duration}}; use sc_network::PeerId; -use sc_network_gossip::GossipEngine; use sp_runtime::traits::{NumberFor, Block as BlockT}; use super::gossip::{NeighborPacket, GossipMessage}; -// how often to rebroadcast, if no other +// How often to rebroadcast, in cases where no new packets are created. const REBROADCAST_AFTER: Duration = Duration::from_secs(2 * 60); fn rebroadcast_instant() -> Instant { @@ -56,56 +51,65 @@ impl NeighborPacketSender { } } -/// Does the work of sending neighbor packets, asynchronously. -/// -/// It may rebroadcast the last neighbor packet periodically when no -/// progress is made. -pub(super) fn neighbor_packet_worker(net: GossipEngine) -> ( - impl Future + Send + 'static, - NeighborPacketSender, -) where - B: BlockT, -{ - let mut last = None; - let (tx, mut rx) = mpsc::unbounded::<(Vec, NeighborPacket>)>(); - let mut delay = Delay::new(REBROADCAST_AFTER); - - let work = futures::future::poll_fn(move || { - loop { - match rx.poll().expect("unbounded receivers do not error; qed") { - Async::Ready(None) => return Ok(Async::Ready(())), - Async::Ready(Some((to, packet))) => { - // send to peers. - net.send_message(to.clone(), GossipMessage::::from(packet.clone()).encode()); - - // rebroadcasting network. - delay.reset(rebroadcast_instant()); - last = Some((to, packet)); - } - Async::NotReady => break, - } - } +/// NeighborPacketWorker is listening on a channel for new neighbor packets being produced by +/// components within `finality-grandpa` and forwards those packets to the underlying +/// `NetworkEngine` through the `NetworkBridge` that it is being polled by (see `Stream` +/// implementation). Periodically it sends out the last packet in cases where no new ones arrive. +pub(super) struct NeighborPacketWorker { + last: Option<(Vec, NeighborPacket>)>, + delay: Delay, + rx: mpsc::UnboundedReceiver<(Vec, NeighborPacket>)>, +} + +impl Unpin for NeighborPacketWorker {} + +impl NeighborPacketWorker { + pub(super) fn new() -> (Self, NeighborPacketSender){ + let (tx, rx) = mpsc::unbounded::<(Vec, NeighborPacket>)>(); + let delay = Delay::new(REBROADCAST_AFTER); + + (NeighborPacketWorker { + last: None, + delay, + rx, + }, NeighborPacketSender(tx)) + } +} - // has to be done in a loop because it needs to be polled after - // re-scheduling. - loop { - match (&mut delay).unit_error().compat().poll() { - Err(e) => { - warn!(target: "afg", "Could not rebroadcast neighbor packets: {:?}", e); - delay.reset(rebroadcast_instant()); - } - Ok(Async::Ready(())) => { - delay.reset(rebroadcast_instant()); - - if let Some((ref to, ref packet)) = last { - // send to peers. - net.send_message(to.clone(), GossipMessage::::from(packet.clone()).encode()); - } - } - Ok(Async::NotReady) => return Ok(Async::NotReady), +impl Stream for NeighborPacketWorker { + type Item = (Vec, GossipMessage); + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> + { + let this = &mut *self; + match this.rx.poll_next_unpin(cx) { + Poll::Ready(None) => return Poll::Ready(None), + Poll::Ready(Some((to, packet))) => { + this.delay.reset(rebroadcast_instant()); + this.last = Some((to.clone(), packet.clone())); + + return Poll::Ready(Some((to, GossipMessage::::from(packet.clone())))); } + // Don't return yet, maybe the timer fired. + Poll::Pending => {}, + }; + + ready!(this.delay.poll_unpin(cx)); + + // Getting this far here implies that the timer fired. + + this.delay.reset(rebroadcast_instant()); + + // Make sure the underlying task is scheduled for wake-up. + // + // Note: In case poll_unpin is called after the resetted delay fires again, this + // will drop one tick. Deemed as very unlikely and also not critical. + while let Poll::Ready(()) = this.delay.poll_unpin(cx) {}; + + if let Some((ref to, ref packet)) = this.last { + return Poll::Ready(Some((to.clone(), GossipMessage::::from(packet.clone())))); } - }); - (work, NeighborPacketSender(tx)) + return Poll::Pending; + } } diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index c0d83ba019..f0d80c9639 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -650,12 +650,13 @@ struct VoterWork, RA, SC, VR> { voter: Box>> + Send>, env: Arc>, voter_commands_rx: mpsc::UnboundedReceiver>>, + network: futures03::compat::Compat>, } impl VoterWork where Block: BlockT, - N: NetworkT + Sync, + N: NetworkT + Sync, NumberFor: BlockNumberOps, RA: 'static + Send + Sync, E: CallExecutor + Send + Sync + 'static, @@ -681,7 +682,7 @@ where voting_rule, voters: Arc::new(voters), config, - network, + network: network.clone(), set_id: persistent_data.authority_set.set_id(), authority_set: persistent_data.authority_set.clone(), consensus_changes: persistent_data.consensus_changes.clone(), @@ -694,6 +695,7 @@ where voter: Box::new(futures::empty()) as Box<_>, env, voter_commands_rx, + network: futures03::future::TryFutureExt::compat(network), }; work.rebuild_voter(); work @@ -831,7 +833,7 @@ where impl Future for VoterWork where Block: BlockT, - N: NetworkT + Sync, + N: NetworkT + Sync, NumberFor: BlockNumberOps, RA: 'static + Send + Sync, E: CallExecutor + Send + Sync + 'static, @@ -878,6 +880,15 @@ where } } + match self.network.poll() { + Ok(Async::NotReady) => {}, + Ok(Async::Ready(())) => { + // the network bridge future should never conclude. + return Ok(Async::Ready(())) + } + e @ Err(_) => return e, + }; + Ok(Async::NotReady) } } -- GitLab From 2d156167f67b788cdd104add87c20e7974d11fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Fri, 17 Jan 2020 14:06:29 +0000 Subject: [PATCH 137/296] grandpa: bump finality-grandpa crate to v0.10.3 (#4659) --- Cargo.lock | 6 +++--- client/finality-grandpa/Cargo.toml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 88df9f243c..c15c7aad34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1232,7 +1232,7 @@ dependencies = [ [[package]] name = "finality-grandpa" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5455,7 +5455,7 @@ name = "sc-finality-grandpa" version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "finality-grandpa 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "finality-grandpa 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", "fork-tree 2.0.0", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8371,7 +8371,7 @@ dependencies = [ "checksum fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum file-per-thread-logger 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8505b75b31ef7285168dd237c4a7db3c1f3e0927e7d314e670bc98e854272fe9" -"checksum finality-grandpa 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4106eb29c7e092f4a6ce6e7632abbbfdf85d94e63035d3790d2d16eeae83d3f4" +"checksum finality-grandpa 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d9ad6bb0e42865b2d79fc9c8a08f22c39127310ed3334f2a1119ca25ed69dfb" "checksum fixed-hash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72fe7539e2c5692c6989f2f9c0457e42f1e5768f96b85c87d273574670ae459f" "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" "checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 46268ee44a..2c0a10857c 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -28,10 +28,10 @@ sc-network = { version = "0.8", path = "../network" } sc-network-gossip = { version = "0.8", path = "../network-gossip" } sp-finality-tracker = { version = "2.0.0", path = "../../primitives/finality-tracker" } sp-finality-grandpa = { version = "2.0.0", path = "../../primitives/finality-grandpa" } -finality-grandpa = { version = "0.10.1", features = ["derive-codec"] } +finality-grandpa = { version = "0.10.3", features = ["derive-codec"] } [dev-dependencies] -finality-grandpa = { version = "0.10.1", features = ["derive-codec", "test-helpers"] } +finality-grandpa = { version = "0.10.3", features = ["derive-codec", "test-helpers"] } sc-network = { version = "0.8", path = "../network" } sc-network-test = { version = "0.8.0", path = "../network/test" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } -- GitLab From 10bebed2fcdbadac9c8f12f579bace37f60c631b Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 17 Jan 2020 17:22:00 +0300 Subject: [PATCH 138/296] add missing bits (#4660) --- client/db/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 29e17a5f0c..be56919497 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -1149,6 +1149,7 @@ impl Backend { changes_trie_config_update, changes_trie_cache_ops, )?); + self.state_usage.merge_sm(operation.old_state.usage_info()); let cache = operation.old_state.release(); // release state reference so that it can be finalized if finalized { @@ -1619,6 +1620,7 @@ impl sc_client_api::backend::Backend for Backend { } fn destroy_state(&self, state: Self::State) -> ClientResult<()> { + self.state_usage.merge_sm(state.usage_info()); if let Some(hash) = state.cache.parent_hash.clone() { let is_best = self.blockchain.meta.read().best_hash == hash; state.release().sync_cache(&[], &[], vec![], vec![], None, None, is_best); -- GitLab From 083ada5c01ffbce9dbe763d4757ceba3ed1027b4 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 17 Jan 2020 15:43:09 +0100 Subject: [PATCH 139/296] Patch practical usability issues with Society (#4651) * Add `max_members` to `found`, add society genesis for Substrate node * Update test * Use `Option` rather than `Option<()>` * Update from feedback --- Cargo.lock | 2 ++ bin/node/cli/Cargo.toml | 1 + bin/node/cli/src/chain_spec.rs | 9 +++++++-- bin/node/runtime/src/lib.rs | 3 +-- bin/node/testing/Cargo.toml | 1 + bin/node/testing/src/genesis.rs | 7 ++++++- frame/society/src/lib.rs | 9 ++++++--- frame/society/src/mock.rs | 1 - frame/society/src/tests.rs | 35 ++++++++++++++++++++------------- 9 files changed, 45 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c15c7aad34..e5457e3ff7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3040,6 +3040,7 @@ dependencies = [ "pallet-contracts 2.0.0", "pallet-im-online 2.0.0", "pallet-indices 2.0.0", + "pallet-society 2.0.0", "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3292,6 +3293,7 @@ dependencies = [ "pallet-grandpa 2.0.0", "pallet-indices 2.0.0", "pallet-session 2.0.0", + "pallet-society 2.0.0", "pallet-staking 2.0.0", "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index c81cf38a9c..b0a2242f0e 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -72,6 +72,7 @@ pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transac frame-support = { version = "2.0.0", default-features = false, path = "../../../frame/support" } pallet-im-online = { version = "2.0.0", default-features = false, path = "../../../frame/im-online" } pallet-authority-discovery = { version = "2.0.0", path = "../../../frame/authority-discovery" } +pallet-society = { version = "2.0.0", path = "../../../frame/society" } # node-specific dependencies node-runtime = { version = "2.0.0", path = "../runtime" } diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index 26b1f6d294..b8ff948b01 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -21,8 +21,8 @@ use sp_core::{Pair, Public, crypto::UncheckedInto, sr25519}; use serde::{Serialize, Deserialize}; use node_runtime::{ AuthorityDiscoveryConfig, BabeConfig, BalancesConfig, ContractsConfig, CouncilConfig, DemocracyConfig, - GrandpaConfig, ImOnlineConfig, IndicesConfig, SessionConfig, SessionKeys, StakerStatus, StakingConfig, SudoConfig, - SystemConfig, TechnicalCommitteeConfig, WASM_BINARY, + GrandpaConfig, ImOnlineConfig, IndicesConfig, SessionConfig, SessionKeys, StakerStatus, StakingConfig, + SocietyConfig, SudoConfig, SystemConfig, TechnicalCommitteeConfig, WASM_BINARY, }; use node_runtime::Block; use node_runtime::constants::currency::*; @@ -295,6 +295,11 @@ pub fn testnet_genesis( }), pallet_membership_Instance1: Some(Default::default()), pallet_treasury: Some(Default::default()), + pallet_society: Some(SocietyConfig { + members: endowed_accounts[0..3].to_vec(), + pot: 0, + max_members: 999, + }) } } diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index e5e453fcaf..d769be7b50 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -571,7 +571,6 @@ parameter_types! { pub const PeriodSpend: Balance = 500 * DOLLARS; pub const MaxLockDuration: BlockNumber = 36 * 30 * DAYS; pub const ChallengePeriod: BlockNumber = 7 * DAYS; - pub const MaxMembers: u32 = 999; } impl pallet_society::Trait for Runtime { @@ -621,7 +620,7 @@ construct_runtime!( Offences: pallet_offences::{Module, Call, Storage, Event}, RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Call, Storage}, Identity: pallet_identity::{Module, Call, Storage, Event}, - Society: pallet_society::{Module, Call, Storage, Event}, + Society: pallet_society::{Module, Call, Storage, Event, Config}, Recovery: pallet_recovery::{Module, Call, Storage, Event}, } ); diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index 2c868c5906..37e85452d5 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -20,6 +20,7 @@ sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-io = { version = "2.0.0", path = "../../../primitives/io" } frame-support = { version = "2.0.0", path = "../../../frame/support" } pallet-session = { version = "2.0.0", path = "../../../frame/session" } +pallet-society = { version = "2.0.0", path = "../../../frame/society" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } pallet-staking = { version = "2.0.0", path = "../../../frame/staking" } sc-executor = { version = "0.8", path = "../../../client/executor" } diff --git a/bin/node/testing/src/genesis.rs b/bin/node/testing/src/genesis.rs index 44dd79a7f4..183515f272 100644 --- a/bin/node/testing/src/genesis.rs +++ b/bin/node/testing/src/genesis.rs @@ -20,7 +20,7 @@ use crate::keyring::*; use sp_keyring::{Ed25519Keyring, Sr25519Keyring}; use node_runtime::{ GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, SystemConfig, - GrandpaConfig, IndicesConfig, ContractsConfig, WASM_BINARY, + GrandpaConfig, IndicesConfig, ContractsConfig, SocietyConfig, WASM_BINARY, }; use node_runtime::constants::currency::*; use sp_core::ChangesTrieConfiguration; @@ -96,5 +96,10 @@ pub fn config(support_changes_trie: bool, code: Option<&[u8]>) -> GenesisConfig pallet_membership_Instance1: Some(Default::default()), pallet_sudo: Some(Default::default()), pallet_treasury: Some(Default::default()), + pallet_society: Some(SocietyConfig { + members: vec![alice(), bob()], + pot: 0, + max_members: 999, + }), } } diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index 8c99e5b81a..3bbd4705f5 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -426,7 +426,7 @@ decl_storage! { }): Vec; /// The set of suspended members. - pub SuspendedMembers get(fn suspended_member): map T::AccountId => Option<()>; + pub SuspendedMembers get(fn suspended_member): map T::AccountId => bool; /// The current bids, stored ordered by the value of the bid. Bids: Vec>>; @@ -804,6 +804,7 @@ decl_module! { /// /// Parameters: /// - `founder` - The first member and head of the newly founded society. + /// - `max_members` - The initial max number of members for the society. /// /// # /// - Two storage mutates to set `Head` and `Founder`. O(1) @@ -813,10 +814,12 @@ decl_module! { /// Total Complexity: O(1) /// # #[weight = SimpleDispatchInfo::FixedNormal(10_000)] - fn found(origin, founder: T::AccountId) { + fn found(origin, founder: T::AccountId, max_members: u32) { T::FounderSetOrigin::ensure_origin(origin)?; ensure!(!>::exists(), Error::::AlreadyFounded); + ensure!(max_members > 1, Error::::MaxMembers); // This should never fail in the context of this function... + >::put(max_members); Self::add_member(&founder)?; >::put(&founder); >::put(&founder); @@ -1423,7 +1426,7 @@ impl, I: Instance> Module { /// Suspend a user, removing them from the member list. fn suspend_member(who: &T::AccountId) { if Self::remove_member(&who).is_ok() { - >::insert(who, ()); + >::insert(who, true); >::remove(who); Self::deposit_event(RawEvent::MemberSuspended(who.clone())); } diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index 3ce8938f95..b8f249f35c 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -44,7 +44,6 @@ parameter_types! { pub const PeriodSpend: u64 = 1000; pub const MaxLockDuration: u64 = 100; pub const ChallengePeriod: u64 = 8; - pub const MaxMembers: u32 = 100; pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: u32 = 1024; diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs index 886363590d..cf899fb4e2 100644 --- a/frame/society/src/tests.rs +++ b/frame/society/src/tests.rs @@ -24,22 +24,29 @@ use sp_runtime::traits::BadOrigin; #[test] fn founding_works() { - EnvBuilder::new().with_members(vec![]).execute(|| { - // No founder initially. + EnvBuilder::new().with_max_members(0).with_members(vec![]).execute(|| { + // Not set up initially. assert_eq!(Society::founder(), None); + assert_eq!(Society::max_members(), 0); + assert_eq!(Society::pot(), 0); // Account 1 is set as the founder origin // Account 5 cannot start a society - assert_noop!(Society::found(Origin::signed(5), 20), BadOrigin); + assert_noop!(Society::found(Origin::signed(5), 20, 100), BadOrigin); // Account 1 can start a society, where 10 is the founding member - assert_ok!(Society::found(Origin::signed(1), 10)); + assert_ok!(Society::found(Origin::signed(1), 10, 100)); // Society members only include 10 assert_eq!(Society::members(), vec![10]); // 10 is the head of the society assert_eq!(Society::head(), Some(10)); // ...and also the founder assert_eq!(Society::founder(), Some(10)); + // 100 members max + assert_eq!(Society::max_members(), 100); + // Pot grows after first rotation period + run_to_block(4); + assert_eq!(Society::pot(), 1000); // Cannot start another society - assert_noop!(Society::found(Origin::signed(1), 20), Error::::AlreadyFounded); + assert_noop!(Society::found(Origin::signed(1), 20, 100), Error::::AlreadyFounded); }); } @@ -252,7 +259,7 @@ fn suspended_member_lifecycle_works() { assert_ok!(Society::add_member(&20)); assert_eq!(>::get(), vec![10, 20]); assert_eq!(Strikes::::get(20), 0); - assert_eq!(>::get(20), None); + assert_eq!(>::get(20), false); // Let's suspend account 20 by giving them 2 strikes by not voting assert_ok!(Society::bid(Origin::signed(30), 0)); @@ -262,7 +269,7 @@ fn suspended_member_lifecycle_works() { run_to_block(16); // Strike 2 is accumulated, and 20 is suspended :( - assert_eq!(>::get(20), Some(())); + assert_eq!(>::get(20), true); assert_eq!(>::get(), vec![10]); // Suspended members cannot get payout @@ -275,16 +282,16 @@ fn suspended_member_lifecycle_works() { // Suspension judgment origin can judge thee // Suspension judgement origin forgives the suspended member assert_ok!(Society::judge_suspended_member(Origin::signed(2), 20, true)); - assert_eq!(>::get(20), None); + assert_eq!(>::get(20), false); assert_eq!(>::get(), vec![10, 20]); // Let's suspend them again, directly Society::suspend_member(&20); - assert_eq!(>::get(20), Some(())); + assert_eq!(>::get(20), true); // Suspension judgement origin does not forgive the suspended member assert_ok!(Society::judge_suspended_member(Origin::signed(2), 20, false)); // Cleaned up - assert_eq!(>::get(20), None); + assert_eq!(>::get(20), false); assert_eq!(>::get(), vec![10]); assert_eq!(>::get(20), vec![]); }); @@ -519,7 +526,7 @@ fn founder_and_head_cannot_be_removed() { assert_ok!(Society::vote(Origin::signed(50), 90, true)); run_to_block(64); assert_eq!(Strikes::::get(50), 0); - assert_eq!(>::get(50), Some(())); + assert_eq!(>::get(50), true); assert_eq!(Society::members(), vec![10, 80]); }); } @@ -564,7 +571,7 @@ fn challenges_work() { run_to_block(32); // 20 is suspended assert_eq!(Society::members(), vec![10, 30, 40]); - assert_eq!(Society::suspended_member(20), Some(())); + assert_eq!(Society::suspended_member(20), true); // New defender is chosen assert_eq!(Society::defender(), Some(40)); }); @@ -636,7 +643,7 @@ fn vouching_handles_removed_member_with_bid() { assert_eq!(>::get(20), Some(VouchingStatus::Vouching)); // Suspend that member Society::suspend_member(&20); - assert_eq!(>::get(20), Some(())); + assert_eq!(>::get(20), true); // Nothing changes yet assert_eq!(>::get(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); assert_eq!(>::get(20), Some(VouchingStatus::Vouching)); @@ -663,7 +670,7 @@ fn vouching_handles_removed_member_with_candidate() { assert_eq!(Society::candidates(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); // Suspend that member Society::suspend_member(&20); - assert_eq!(>::get(20), Some(())); + assert_eq!(>::get(20), true); // Nothing changes yet assert_eq!(Society::candidates(), vec![create_bid(1000, 30, BidKind::Vouch(20, 100))]); assert_eq!(>::get(20), Some(VouchingStatus::Vouching)); -- GitLab From 36a6de07bf7fb130069fa656b7335f076066cda7 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Fri, 17 Jan 2020 17:47:21 +0300 Subject: [PATCH 140/296] Expose proof generation and verifying api. (#4646) * Expose proof generation and verifying api. * tabs to spaces * bring back license comment * Revert "tabs to spaces" This reverts commit 4c3f72f9ef76b6a9f8988ed15b1bab17a9e51d2f. * Formatting and docs nits * Bump deps versions * Upadte Cargo.lock * into -> in --- Cargo.lock | 49 +++++------ primitives/state-machine/Cargo.toml | 2 +- primitives/trie/Cargo.toml | 6 +- primitives/trie/src/lib.rs | 128 ++++++++++++++++++++++++++++ test-utils/runtime/Cargo.toml | 2 +- 5 files changed, 158 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5457e3ff7..78291bb8a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1250,7 +1250,7 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2857,7 +2857,7 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ahash 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3194,7 +3194,7 @@ dependencies = [ "pallet-treasury 2.0.0", "pallet-utility 2.0.0", "parity-scale-codec 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)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-authority-discovery 2.0.0", @@ -4895,7 +4895,7 @@ name = "rlp" version = "0.4.4" 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)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4933,7 +4933,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rustc-hex" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5530,7 +5530,7 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -5654,7 +5654,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-executor 0.8.0", @@ -6378,7 +6378,7 @@ dependencies = [ "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6636,7 +6636,7 @@ dependencies = [ "sp-externalities 0.8.0", "sp-panic-handler 2.0.0", "sp-trie 2.0.0", - "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6697,12 +6697,12 @@ dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", - "trie-bench 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-bench 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6830,7 +6830,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-rpc 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -6921,7 +6921,7 @@ dependencies = [ "frame-system 2.0.0", "frame-system-rpc-runtime-api 2.0.0", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-babe 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6948,7 +6948,7 @@ dependencies = [ "sp-version 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-wasm-builder-runner 1.0.4", - "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7497,28 +7497,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trie-bench" -version = "0.18.0" +version = "0.19.0" 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.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-db" -version = "0.18.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7592,7 +7593,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8512,7 +8513,7 @@ dependencies = [ "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" -"checksum memory-db 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "828bdf600636e90c56652689f7c3823ae2072104e4b0b5e83ea984f592f12ab9" +"checksum memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "881736a0f68a6fae1b596bb066c5bd16d7b3ed645a4dd8ffaefd02f585abaf71" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2b0942b357c1b4d0dc43ba724674ec89c3218e6ca2b3e8269e7cb53bcecd2f6e" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" @@ -8636,7 +8637,7 @@ dependencies = [ "checksum rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d59f0e97173c514b9036cd450c195a6483ba81055c6fa0f1bff3ab563f47d44a" "checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf" "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -"checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" +"checksum rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" "checksum rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c48f91977f4ef3be5358c15d131d3f663f6b4d7a112555bf3bf52ad23b6659e5" @@ -8740,8 +8741,8 @@ dependencies = [ "checksum tracing-attributes 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a4263b12c3d3c403274493eb805966093b53214124796552d674ca1dd5d27c2b" "checksum tracing-core 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bc913647c520c959b6d21e35ed8fa6984971deca9f0a2fcb8c51207e0c56af1d" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d276e600d06806a4ac61e5d6b145a620001e6147151e60a4f1f46a784ec4baa" -"checksum trie-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "191fda5d0106f3ed35a8c6875428b213e15c516e48129cc263dd7ad16e9a665f" +"checksum trie-bench 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26fd042d57ee9c987c562811162a78db78b5340ab674ac76056c85dca49b26bc" +"checksum trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d747ae5b6f078df7e46477fcc7df66df9eb4f27a031cf4a7c890a8dd03d8e6" "checksum trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b779f7c1c8fe9276365d9d5be5c4b5adeacf545117bb3f64c974305789c5c0b" "checksum trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3161ba520ab28cd8e6b68e1126f1009f6e335339d1a73b978139011703264c8" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index 11e2aa0cef..d390471aca 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" log = "0.4.8" parking_lot = "0.9.0" hash-db = "0.15.2" -trie-db = "0.18.1" +trie-db = "0.19.2" trie-root = "0.15.2" sp-trie = { version = "2.0.0", path = "../trie" } sp-core = { version = "2.0.0", path = "../core" } diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index 78e32e3333..a78a26db73 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -15,13 +15,13 @@ harness = false codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } sp-std = { version = "2.0.0", default-features = false, path = "../std" } hash-db = { version = "0.15.2", default-features = false } -trie-db = { version = "0.18.1", default-features = false } +trie-db = { version = "0.19.2", default-features = false } trie-root = { version = "0.15.2", default-features = false } -memory-db = { version = "0.18.0", default-features = false } +memory-db = { version = "0.18.1", default-features = false } sp-core = { version = "2.0.0", default-features = false, path = "../core" } [dev-dependencies] -trie-bench = "0.18.0" +trie-bench = "0.19.0" trie-standardmap = "0.15.2" criterion = "0.2.11" hex-literal = "0.2.1" diff --git a/primitives/trie/src/lib.rs b/primitives/trie/src/lib.rs index 4ca26542dd..c71d3fb84c 100644 --- a/primitives/trie/src/lib.rs +++ b/primitives/trie/src/lib.rs @@ -27,6 +27,8 @@ use sp_std::boxed::Box; use sp_std::marker::PhantomData; use sp_std::vec::Vec; use hash_db::{Hasher, Prefix}; +use trie_db::proof::{generate_proof, verify_proof}; +pub use trie_db::proof::VerifyError; /// Our `NodeCodec`-specific error. pub use error::Error; /// The Substrate format implementation of `TrieStream`. @@ -119,6 +121,47 @@ pub mod trie_types { pub type TrieError = trie_db::TrieError; } +/// Create a proof for a subset of keys in a trie. +/// +/// The `keys` may contain any set of keys regardless of each one of them is included +/// in the `db`. +/// +/// For a key `K` that is included in the `db` a proof of inclusion is generated. +/// For a key `K` that is not included in the `db` a proof of non-inclusion is generated. +/// These can be later checked in `verify_trie_proof`. +pub fn generate_trie_proof<'a, L: TrieConfiguration, I, K, DB>( + db: &DB, + root: TrieHash, + keys: I, +) -> Result>, Box>> where + I: IntoIterator, + K: 'a + AsRef<[u8]>, + DB: hash_db::HashDBRef, +{ + let trie = TrieDB::::new(db, &root)?; + generate_proof(&trie, keys) +} + +/// Verify a set of key-value pairs against a trie root and a proof. +/// +/// Checks a set of keys with optional values for inclusion in the proof that was generated by +/// `generate_trie_proof`. +/// If the value in the pair is supplied (`(key, Some(value))`), this key-value pair will be +/// checked for inclusion in the proof. +/// If the value is omitted (`(key, None)`), this key will be checked for non-inclusion in the +/// proof. +pub fn verify_trie_proof<'a, L: TrieConfiguration, I, K, V>( + root: &TrieHash, + proof: &[Vec], + items: I, +) -> Result<(), VerifyError, error::Error>> where + I: IntoIterator)>, + K: 'a + AsRef<[u8]>, + V: 'a + AsRef<[u8]>, +{ + verify_proof::, _, _, _>(root, proof, items) +} + /// Determine a trie root given a hash DB and delta values. pub fn delta_trie_root( db: &mut DB, @@ -727,4 +770,89 @@ mod tests { assert_eq!(pairs, iter_pairs); } + + #[test] + fn proof_non_inclusion_works() { + let pairs = vec![ + (hex!("0102").to_vec(), hex!("01").to_vec()), + (hex!("0203").to_vec(), hex!("0405").to_vec()), + ]; + + let mut memdb = MemoryDB::default(); + let mut root = Default::default(); + populate_trie::(&mut memdb, &mut root, &pairs); + + let non_included_key: Vec = hex!("0909").to_vec(); + let proof = generate_trie_proof::( + &memdb, + root, + &[non_included_key.clone()] + ).unwrap(); + + // Verifying that the K was not included into the trie should work. + assert!(verify_trie_proof::>( + &root, + &proof, + &[(non_included_key.clone(), None)], + ).is_ok() + ); + + // Verifying that the K was included into the trie should fail. + assert!(verify_trie_proof::>( + &root, + &proof, + &[(non_included_key, Some(hex!("1010").to_vec()))], + ).is_err() + ); + } + + #[test] + fn proof_inclusion_works() { + let pairs = vec![ + (hex!("0102").to_vec(), hex!("01").to_vec()), + (hex!("0203").to_vec(), hex!("0405").to_vec()), + ]; + + let mut memdb = MemoryDB::default(); + let mut root = Default::default(); + populate_trie::(&mut memdb, &mut root, &pairs); + + let proof = generate_trie_proof::( + &memdb, + root, + &[pairs[0].0.clone()] + ).unwrap(); + + // Check that a K, V included into the proof are verified. + assert!(verify_trie_proof::( + &root, + &proof, + &[(pairs[0].0.clone(), Some(pairs[0].1.clone()))] + ).is_ok() + ); + + // Absence of the V is not verified with the proof that has K, V included. + assert!(verify_trie_proof::>( + &root, + &proof, + &[(pairs[0].0.clone(), None)] + ).is_err() + ); + + // K not included into the trie is not verified. + assert!(verify_trie_proof::( + &root, + &proof, + &[(hex!("4242").to_vec(), Some(pairs[0].1.clone()))] + ).is_err() + ); + + // K included into the trie but not included into the proof is not verified. + assert!(verify_trie_proof::( + &root, + &proof, + &[(pairs[1].0.clone(), Some(pairs[1].1.clone()))] + ).is_err() + ); + } } diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 35a7bdf1f7..b827163a1b 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -35,7 +35,7 @@ pallet-timestamp = { version = "2.0.0", default-features = false, path = "../../ sc-client = { version = "0.8", optional = true, path = "../../client" } sp-trie = { version = "2.0.0", default-features = false, path = "../../primitives/trie" } sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../../primitives/transaction-pool" } -trie-db = { version = "0.18.1", default-features = false } +trie-db = { version = "0.19.2", default-features = false } [dev-dependencies] sc-executor = { version = "0.8", path = "../../client/executor" } -- GitLab From e581e3c9996143e75b992dd328ed410657b0dc72 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Fri, 17 Jan 2020 18:09:39 +0100 Subject: [PATCH 141/296] Drive by fix of doc of `Value`. (#4658) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Drive by fix of doc of `Value`. * Apply suggestions from code review Co-Authored-By: André Silva Co-authored-by: Bastian Köcher Co-authored-by: André Silva --- primitives/wasm-interface/src/lib.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/primitives/wasm-interface/src/lib.rs b/primitives/wasm-interface/src/lib.rs index bc34bfda97..b0bbbf82db 100644 --- a/primitives/wasm-interface/src/lib.rs +++ b/primitives/wasm-interface/src/lib.rs @@ -39,13 +39,17 @@ pub enum ValueType { /// Values supported by Substrate on the boundary between host/Wasm. #[derive(PartialEq, Debug, Clone, Copy)] pub enum Value { - /// An `i32` value. + /// A 32-bit integer. I32(i32), - /// An `i64` value. + /// A 64-bit integer. I64(i64), - /// An nan-preserving `f32` value. + /// A 32-bit floating-point number stored as raw bit pattern. + /// + /// You can materialize this value using `f32::from_bits`. F32(u32), - /// An nan-preserving `f64` value. + /// A 64-bit floating-point number stored as raw bit pattern. + /// + /// You can materialize this value using `f64::from_bits`. F64(u64), } -- GitLab From f0c18520a0cc19374d109b200749f3ac0fc4f728 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 17 Jan 2020 18:28:32 +0100 Subject: [PATCH 142/296] client/finality-grandpa: Reintegrate gossip validator report stream (#4661) * client/finality-grandpa: Reintegrate gossip validator report stream The `finality-grandpa` `GossipValidator` is called by the `GossipEngine` in a synchronous fashion on each gossip message. Its main task is to decide whether to gossip the given message on, or whether to drop it. In addition it also updates the reputation of a node's peers based on the incoming gossip messages. To do so it needs to be able to report the reputation change which it does through an unbounded channel (in order to stay synchronous). Previously the receiving side of this channel would be handled by a new task, polling the channel and forwarding the changes to a clone of the `GossipEngine` that it would own. Instead the receiver of the above mentioned channel is now being polled by the `NetworkBridge` within its `Future::poll` implementation. Reputation changes are reported through the already existing `GossipEngine` instance within `NetworkBridge`. For details on the overall goal, see d4fbb897c. * client/finality-grandpa: Remove exit future from test NetworkBridges --- .../src/communication/gossip.rs | 64 +++---------------- .../finality-grandpa/src/communication/mod.rs | 58 ++++++++++++----- .../src/communication/tests.rs | 1 - client/finality-grandpa/src/lib.rs | 1 - client/finality-grandpa/src/observer.rs | 1 - client/finality-grandpa/src/tests.rs | 4 +- 6 files changed, 52 insertions(+), 77 deletions(-) diff --git a/client/finality-grandpa/src/communication/gossip.rs b/client/finality-grandpa/src/communication/gossip.rs index 1135cc4f86..ec74393d80 100644 --- a/client/finality-grandpa/src/communication/gossip.rs +++ b/client/finality-grandpa/src/communication/gossip.rs @@ -83,15 +83,15 @@ //! We only send polite messages to peers, use sp_runtime::traits::{NumberFor, Block as BlockT, Zero}; -use sc_network_gossip::{GossipEngine, MessageIntent, ValidatorContext}; +use sc_network_gossip::{MessageIntent, ValidatorContext}; use sc_network::{config::Roles, PeerId, ReputationChange}; use parity_scale_codec::{Encode, Decode}; use sp_finality_grandpa::AuthorityId; use sc_telemetry::{telemetry, CONSENSUS_DEBUG}; -use log::{trace, debug, warn}; +use log::{trace, debug}; use futures::prelude::*; -use futures::sync::mpsc; +use futures03::channel::mpsc; use rand::seq::SliceRandom; use crate::{environment, CatchUp, CompactCommit, SignedMessage}; @@ -1178,7 +1178,7 @@ impl GossipValidator { pub(super) fn new( config: crate::Config, set_state: environment::SharedVoterSetState, - ) -> (GossipValidator, ReportStream) { + ) -> (GossipValidator, mpsc::UnboundedReceiver) { let (tx, rx) = mpsc::unbounded(); let val = GossipValidator { inner: parking_lot::RwLock::new(Inner::new(config)), @@ -1186,7 +1186,7 @@ impl GossipValidator { report_sender: tx, }; - (val, ReportStream { reports: rx }) + (val, rx) } /// Note a round in the current set has started. @@ -1445,57 +1445,9 @@ impl sc_network_gossip::Validator for GossipValidator, -} - -impl ReportStream { - /// Consume the report stream, converting it into a future that - /// handles all reports. - pub(super) fn consume(self, net: GossipEngine) - -> impl Future + Send + 'static - where - B: BlockT, - { - ReportingTask { - reports: self.reports, - net, - } - } -} - -/// A future for reporting peers. -#[must_use = "Futures do nothing unless polled"] -struct ReportingTask { - reports: mpsc::UnboundedReceiver, - net: GossipEngine, -} - -impl Future for ReportingTask { - type Item = (); - type Error = (); - - fn poll(&mut self) -> Poll<(), ()> { - loop { - match self.reports.poll() { - Err(_) => { - warn!(target: "afg", "Report stream terminated unexpectedly"); - return Ok(Async::Ready(())) - } - Ok(Async::Ready(None)) => return Ok(Async::Ready(())), - Ok(Async::Ready(Some(PeerReport { who, cost_benefit }))) => - self.net.report(who, cost_benefit), - Ok(Async::NotReady) => return Ok(Async::NotReady), - } - } - } +pub(super) struct PeerReport { + pub who: PeerId, + pub cost_benefit: ReputationChange, } #[cfg(test)] diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index d966091a18..7723047d1b 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -27,11 +27,12 @@ //! In the future, there will be a fallback for allowing sending the same message //! under certain conditions that are used to un-stick the protocol. -use futures::{prelude::*, future::Executor as _, sync::mpsc}; +use futures::{prelude::*, sync::mpsc}; use futures03::{ + channel::mpsc as mpsc03, compat::Compat, + future::{Future as Future03}, stream::StreamExt, - future::{Future as Future03, FutureExt as _, TryFutureExt as _}, }; use log::{debug, trace}; use parking_lot::Mutex; @@ -52,7 +53,12 @@ use crate::{ }; use crate::environment::HasVoted; use gossip::{ - GossipMessage, FullCatchUpMessage, FullCommitMessage, VoteMessage, GossipValidator + FullCatchUpMessage, + FullCommitMessage, + GossipMessage, + GossipValidator, + PeerReport, + VoteMessage, }; use sp_finality_grandpa::{ AuthorityPair, AuthorityId, AuthoritySignature, SetId as SetIdNumber, RoundNumber, @@ -148,9 +154,18 @@ pub(crate) struct NetworkBridge> { /// `NeighborPacketWorker` processing packets sent through the `NeighborPacketSender`. // - // NetworkBridge is required to be clonable, thus one needs to be able to clone its children, - // thus one has to wrap neighor_packet_worker with an Arc Mutex. + // `NetworkBridge` is required to be clonable, thus one needs to be able to clone its children, + // thus one has to wrap neighor_packet_worker with an `Arc` `Mutex`. neighbor_packet_worker: Arc>>, + + /// Receiver side of the peer report stream populated by the gossip validator, forwarded to the + /// gossip engine. + // + // `NetworkBridge` is required to be clonable, thus one needs to be able to clone its children, + // thus one has to wrap gossip_validator_report_stream with an `Arc` `Mutex`. Given that it is + // just an `UnboundedReceiver`, one could also switch to a multi-producer-*multi*-consumer + // channel implementation. + gossip_validator_report_stream: Arc>>, } impl> Unpin for NetworkBridge {} @@ -165,7 +180,6 @@ impl> NetworkBridge { config: crate::Config, set_state: crate::environment::SharedVoterSetState, executor: &impl futures03::task::Spawn, - on_exit: impl futures03::Future + Clone + Send + Unpin + 'static, ) -> Self { let (validator, report_stream) = GossipValidator::new( config, @@ -214,7 +228,6 @@ impl> NetworkBridge { } let (neighbor_packet_worker, neighbor_packet_sender) = periodic::NeighborPacketWorker::new(); - let reporting_job = report_stream.consume(gossip_engine.clone()); let bridge = NetworkBridge { service, @@ -222,12 +235,9 @@ impl> NetworkBridge { validator, neighbor_sender: neighbor_packet_sender, neighbor_packet_worker: Arc::new(Mutex::new(neighbor_packet_worker)), + gossip_validator_report_stream: Arc::new(Mutex::new(report_stream)), }; - let executor = Compat::new(executor); - executor.execute(Box::new(reporting_job.select(on_exit.clone().map(Ok).compat()).then(|_| Ok(())))) - .expect("failed to spawn grandpa reporting job task"); - bridge } @@ -418,13 +428,30 @@ impl> Future03 for NetworkBridge { fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll03 { loop { - match futures03::ready!((self.neighbor_packet_worker.lock()).poll_next_unpin(cx)) { - None => return Poll03::Ready( - Err(Error::Network("NeighborPacketWorker stream closed.".into())) + match self.neighbor_packet_worker.lock().poll_next_unpin(cx) { + Poll03::Ready(Some((to, packet))) => { + self.gossip_engine.send_message(to, packet.encode()); + }, + Poll03::Ready(None) => return Poll03::Ready( + Err(Error::Network("Neighbor packet worker stream closed.".into())) ), - Some((to, packet)) => self.gossip_engine.send_message(to, packet.encode()), + Poll03::Pending => break, } } + + loop { + match self.gossip_validator_report_stream.lock().poll_next_unpin(cx) { + Poll03::Ready(Some(PeerReport { who, cost_benefit })) => { + self.gossip_engine.report(who, cost_benefit); + }, + Poll03::Ready(None) => return Poll03::Ready( + Err(Error::Network("Gossip validator report stream closed.".into())) + ), + Poll03::Pending => break, + } + } + + Poll03::Pending } } @@ -568,6 +595,7 @@ impl> Clone for NetworkBridge { validator: Arc::clone(&self.validator), neighbor_sender: self.neighbor_sender.clone(), neighbor_packet_worker: self.neighbor_packet_worker.clone(), + gossip_validator_report_stream: self.gossip_validator_report_stream.clone(), } } } diff --git a/client/finality-grandpa/src/communication/tests.rs b/client/finality-grandpa/src/communication/tests.rs index a016940a05..c104af0339 100644 --- a/client/finality-grandpa/src/communication/tests.rs +++ b/client/finality-grandpa/src/communication/tests.rs @@ -172,7 +172,6 @@ fn make_test_network(executor: &impl futures03::task::Spawn) -> ( config(), voter_set_state(), executor, - Exit, ); ( diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index f0d80c9639..071214961f 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -584,7 +584,6 @@ pub fn run_grandpa_voter( config.clone(), persistent_data.set_state.clone(), &executor, - on_exit.clone(), ); register_finality_tracker_inherent_data_provider(client.clone(), &inherent_data_providers)?; diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index b97d80a33c..989a1e1655 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -178,7 +178,6 @@ pub fn run_grandpa_observer( config.clone(), persistent_data.set_state.clone(), &executor, - on_exit.clone(), ); let observer_work = ObserverWork::new( diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index fc0b6d17ae..9ad12c6c31 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -25,7 +25,7 @@ use sc_network_test::{ use sc_network::config::{ProtocolConfig, Roles, BoxFinalityProofRequestBuilder}; use parking_lot::Mutex; use futures_timer::Delay; -use futures03::{StreamExt as _, TryStreamExt as _}; +use futures03::TryStreamExt as _; use tokio::runtime::current_thread; use sp_keyring::Ed25519Keyring; use sc_client::LongestChain; @@ -1270,7 +1270,6 @@ fn voter_persists_its_votes() { config.clone(), set_state, &threads_pool, - Exit, ); let (round_rx, round_tx) = network.round_communication( @@ -1675,7 +1674,6 @@ fn grandpa_environment_respects_voting_rules() { config.clone(), set_state.clone(), &threads_pool, - Exit, ); Environment { -- GitLab From 8de5340c42e5e4638e63285f93cebaa1cca5ea46 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 17 Jan 2020 19:09:36 +0100 Subject: [PATCH 143/296] Society: Ensure all votes are removed after tally (#4666) * Ensure all votes are removed after tally * Fix comment --- Cargo.lock | 1 - bin/node/cli/Cargo.toml | 1 - frame/society/src/lib.rs | 8 +++++++- frame/society/src/tests.rs | 15 +++++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 78291bb8a4..630e372dff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3040,7 +3040,6 @@ dependencies = [ "pallet-contracts 2.0.0", "pallet-im-online 2.0.0", "pallet-indices 2.0.0", - "pallet-society 2.0.0", "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index b0a2242f0e..c81cf38a9c 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -72,7 +72,6 @@ pallet-transaction-payment = { version = "2.0.0", path = "../../../frame/transac frame-support = { version = "2.0.0", default-features = false, path = "../../../frame/support" } pallet-im-online = { version = "2.0.0", default-features = false, path = "../../../frame/im-online" } pallet-authority-discovery = { version = "2.0.0", path = "../../../frame/authority-discovery" } -pallet-society = { version = "2.0.0", path = "../../../frame/society" } # node-specific dependencies node-runtime = { version = "2.0.0", path = "../runtime" } diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index 3bbd4705f5..348607d196 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -1324,6 +1324,9 @@ impl, I: Instance> Module { } }).collect::>(); + // Clean up all votes. + >::remove_all(); + // Reward one of the voters who voted the right way. if !total_slash.is_zero() { if let Some(winner) = pick_item(&mut rng, &rewardees) { @@ -1472,7 +1475,7 @@ impl, I: Instance> Module { let mut rejection_count = 0; // Tallies total number of approve and reject votes for the defender. members.iter() - .filter_map(|m| >::get(m)) + .filter_map(|m| >::take(m)) .for_each(|v| { match v { Vote::Approve => approval_count += 1, @@ -1485,6 +1488,9 @@ impl, I: Instance> Module { Self::suspend_member(&defender); *members = Self::members(); } + + // Clean up all votes. + >::remove_all(); } // Start a new defender rotation diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs index cf899fb4e2..580edc3643 100644 --- a/frame/society/src/tests.rs +++ b/frame/society/src/tests.rs @@ -538,6 +538,11 @@ fn challenges_work() { assert_ok!(Society::add_member(&20)); assert_ok!(Society::add_member(&30)); assert_ok!(Society::add_member(&40)); + // Votes are empty + assert_eq!(>::get(10), None); + assert_eq!(>::get(20), None); + assert_eq!(>::get(30), None); + assert_eq!(>::get(40), None); // Check starting point assert_eq!(Society::members(), vec![10, 20, 30, 40]); assert_eq!(Society::defender(), None); @@ -561,6 +566,11 @@ fn challenges_work() { run_to_block(24); // 20 survives assert_eq!(Society::members(), vec![10, 20, 30, 40]); + // Votes are reset + assert_eq!(>::get(10), None); + assert_eq!(>::get(20), None); + assert_eq!(>::get(30), None); + assert_eq!(>::get(40), None); // One more time assert_eq!(Society::defender(), Some(20)); // 2 people say accept, 2 reject @@ -574,6 +584,11 @@ fn challenges_work() { assert_eq!(Society::suspended_member(20), true); // New defender is chosen assert_eq!(Society::defender(), Some(40)); + // Votes are reset + assert_eq!(>::get(10), None); + assert_eq!(>::get(20), None); + assert_eq!(>::get(30), None); + assert_eq!(>::get(40), None); }); } -- GitLab From 0097939797370dd721b39253f4c8c368b72a6926 Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Sat, 18 Jan 2020 21:22:43 +1300 Subject: [PATCH 144/296] make compute_fee public (#4669) --- frame/transaction-payment/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index fa73b0a9fa..00dbf6bc66 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -151,7 +151,7 @@ impl ChargeTransactionPayment { /// transactions can have a tip. /// /// final_fee = base_fee + targeted_fee_adjustment(len_fee + weight_fee) + tip; - fn compute_fee( + pub fn compute_fee( len: u32, info: ::DispatchInfo, tip: BalanceOf, -- GitLab From a31ad6ea37c5c121985e7e14a3779559a2d59528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 18 Jan 2020 13:51:12 +0100 Subject: [PATCH 145/296] `sp-runtime-interface` add table about FFI types (#4668) Adds a table to the rustdoc that shows how each individual type is passed between the wasm and the host side. --- primitives/runtime-interface/src/impls.rs | 6 ++--- primitives/runtime-interface/src/lib.rs | 30 ++++++++++++++++++++- primitives/runtime-interface/src/pass_by.rs | 5 ++-- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index 23be7fd35a..3cd114268b 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -150,7 +150,7 @@ impl IntoFFIValue for bool { /// /// The `u64` value is build by `length 32bit << 32 | pointer 32bit` /// -/// If `T == u8` the length and the pointer are taken directly from the `Self`. +/// If `T == u8` the length and the pointer are taken directly from `Self`. /// Otherwise `Self` is encoded and the length and the pointer are taken from the encoded vector. impl RIType for Vec { type FFIType = u64; @@ -209,7 +209,7 @@ impl FromFFIValue for Vec { /// /// The `u64` value is build by `length 32bit << 32 | pointer 32bit` /// -/// If `T == u8` the length and the pointer are taken directly from the `Self`. +/// If `T == u8` the length and the pointer are taken directly from `Self`. /// Otherwise `Self` is encoded and the length and the pointer are taken from the encoded vector. impl RIType for [T] { type FFIType = u64; @@ -400,7 +400,7 @@ for_primitive_types! { /// /// The `u64` value is build by `length 32bit << 32 | pointer 32bit` /// -/// The length and the pointer are taken directly from the `Self`. +/// The length and the pointer are taken directly from `Self`. impl RIType for str { type FFIType = u64; } diff --git a/primitives/runtime-interface/src/lib.rs b/primitives/runtime-interface/src/lib.rs index 330b1699a6..189126440b 100644 --- a/primitives/runtime-interface/src/lib.rs +++ b/primitives/runtime-interface/src/lib.rs @@ -28,7 +28,7 @@ //! implement [`RIType`]. The associated type `FFIType` is the type that is used in the FFI //! function to represent the actual type. For example `[T]` is represented by an `u64`. The slice //! pointer and the length will be mapped to an `u64` value. For more information, see the -//! implementation of [`RIType`] for [`T`]. The FFI function definition is used when calling from +//! implementation of [`RIType`] for `T`. The FFI function definition is used when calling from //! the wasm runtime into the node. //! //! Traits are used to convert from a type to the corresponding [`RIType::FFIType`]. @@ -69,6 +69,34 @@ //! //! For more information on declaring a runtime interface, see //! [`#[runtime_interface]`](attr.runtime_interface.html). +//! +//! # FFI type and conversion +//! +//! The following table documents how values of types are passed between the wasm and +//! the host side and how they are converted into the corresponding type. +//! +//! | Type | FFI type | Conversion | +//! |----|----|----| +//! | `u8` | `u8` | `Identity` | +//! | `u16` | `u16` | `Identity` | +//! | `u32` | `u32` | `Identity` | +//! | `u64` | `u64` | `Identity` | +//! | `i8` | `i8` | `Identity` | +//! | `i16` | `i16` | `Identity` | +//! | `i32` | `i32` | `Identity` | +//! | `i64` | `i64` | `Identity` | +//! | `bool` | `u8` | `if v { 1 } else { 0 }` | +//! | `&str` | `u64` | v.len() 32bit << 32 | v.as_ptr() 32bit | +//! | `&[u8]` | `u64` | v.len() 32bit << 32 | v.as_ptr() 32bit | +//! | `Vec` | `u64` | v.len() 32bit << 32 | v.as_ptr() 32bit | +//! | `Vec where T: Encode` | `u64` | `let e = v.encode();`

e.len() 32bit << 32 | e.as_ptr() 32bit | +//! | `&[T] where T: Encode` | `u64` | `let e = v.encode();`

e.len() 32bit << 32 | e.as_ptr() 32bit | +//! | `[u8; N]` | `u32` | `v.as_ptr()` | +//! | `*const T` | `u32` | `Identity` | +//! | [`T where T: PassBy`](pass_by::Inner) | Depends on inner | Depends on inner | +//! | [`T where T: PassBy`](pass_by::Codec) | `u64`| v.len() 32bit << 32 | v.as_ptr() 32bit | +//! +//! `Identity` means that the value is converted directly into the corresponding FFI type. #![cfg_attr(not(feature = "std"), no_std)] diff --git a/primitives/runtime-interface/src/pass_by.rs b/primitives/runtime-interface/src/pass_by.rs index 81da2fe7e6..597a0284ee 100644 --- a/primitives/runtime-interface/src/pass_by.rs +++ b/primitives/runtime-interface/src/pass_by.rs @@ -14,11 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Provides the [`PassBy`](pass_by::PassBy) trait to simplify the implementation of the +//! Provides the [`PassBy`](PassBy) trait to simplify the implementation of the //! runtime interface traits for custom types. //! -//! [`Codec`](pass_by::Codec), [`Inner`](pass_by::Inner) and [`Enum`](pass_by::Enum) are the -//! provided strategy implementations. +//! [`Codec`], [`Inner`] and [`Enum`] are the provided strategy implementations. use crate::{RIType, util::{unpack_ptr_and_len, pack_ptr_and_len}}; -- GitLab From 813128887be6a56b49a416b6d6b342e87fa78cd2 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sat, 18 Jan 2020 18:35:25 +0100 Subject: [PATCH 146/296] Add rules and unfounding to society. (#4671) * Add rules and unfounding to society. * Docs and event * Extra bit of docs. * Cunningly reduce complexity * Remove candidates when unfounding. * Remove suspended candidates when unfounding, too. --- frame/democracy/src/lib.rs | 2 +- frame/society/src/lib.rs | 64 +++++++++++++++++++++++++++++++------- frame/society/src/tests.rs | 35 +++++++++++++++++++-- 3 files changed, 86 insertions(+), 15 deletions(-) diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 354e93cc29..d7790be8f7 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -497,7 +497,7 @@ 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. + /// the proposal; otherwise it is a vote to keep the status quo. /// /// # /// - O(1). diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index 348607d196..f4e5904ea4 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -228,6 +228,7 @@ //! * `defender_vote` - A member can vote to approve or reject a defender's continued membership //! to the society. //! * `payout` - A member can claim their first matured payment. +//! * `unfound` - Allow the founder to unfound the society when they are the only member. //! //! #### For Super Users //! @@ -254,7 +255,7 @@ use sp_std::prelude::*; use codec::{Encode, Decode}; use sp_runtime::{Percent, ModuleId, RuntimeDebug, traits::{ - StaticLookup, AccountIdConversion, Saturating, Zero, IntegerSquareRoot, + StaticLookup, AccountIdConversion, Saturating, Zero, IntegerSquareRoot, Hash, TrailingZeroInput, CheckedSub, EnsureOrigin } }; @@ -404,6 +405,10 @@ decl_storage! { pub Founder get(founder) build(|config: &GenesisConfig| config.members.first().cloned()): Option; + /// A hash of the rules of this society concerning membership. Can only be set once and + /// only by the founder. + pub Rules get(rules): Option; + /// The current set of candidates; bidders that are attempting to become members. pub Candidates get(candidates): Vec>>; @@ -805,6 +810,7 @@ decl_module! { /// Parameters: /// - `founder` - The first member and head of the newly founded society. /// - `max_members` - The initial max number of members for the society. + /// - `rules` - The rules of this society concerning membership. /// /// # /// - Two storage mutates to set `Head` and `Founder`. O(1) @@ -814,7 +820,7 @@ decl_module! { /// Total Complexity: O(1) /// # #[weight = SimpleDispatchInfo::FixedNormal(10_000)] - fn found(origin, founder: T::AccountId, max_members: u32) { + fn found(origin, founder: T::AccountId, max_members: u32, rules: Vec) { T::FounderSetOrigin::ensure_origin(origin)?; ensure!(!>::exists(), Error::::AlreadyFounded); ensure!(max_members > 1, Error::::MaxMembers); @@ -823,8 +829,38 @@ decl_module! { Self::add_member(&founder)?; >::put(&founder); >::put(&founder); + Rules::::put(T::Hashing::hash(&rules)); Self::deposit_event(RawEvent::Founded(founder)); } + + /// Anull the founding of the society. + /// + /// The dispatch origin for this call must be Signed, and the signing account must be both + /// the `Founder` and the `Head`. This implies that it may only be done when there is one + /// member. + /// + /// # + /// - Two storage reads O(1). + /// - Four storage removals O(1). + /// - One event. + /// + /// Total Complexity: O(1) + /// # + #[weight = SimpleDispatchInfo::FixedNormal(20_000)] + fn unfound(origin) { + let founder = ensure_signed(origin)?; + ensure!(Founder::::get() == Some(founder.clone()), Error::::NotFounder); + ensure!(Head::::get() == Some(founder.clone()), Error::::NotHead); + + Members::::kill(); + Head::::kill(); + Founder::::kill(); + Rules::::kill(); + Candidates::::kill(); + SuspendedCandidates::::remove_all(); + Self::deposit_event(RawEvent::Unfounded(founder)); + } + /// Allow suspension judgement origin to make judgement on a suspended member. /// /// If a suspended member is forgiven, we simply add them back as a member, not affecting @@ -1047,6 +1083,10 @@ decl_error! { NotCandidate, /// Too many members in the society. MaxMembers, + /// The caller is not the founder. + NotFounder, + /// The caller is not the head. + NotHead, } } @@ -1087,6 +1127,8 @@ decl_event! { DefenderVote(AccountId, bool), /// A new max member count has been set NewMaxMembers(u32), + /// Society is unfounded. + Unfounded(AccountId), } } @@ -1224,16 +1266,16 @@ impl, I: Instance> Module { ensure!(Self::head() != Some(m.clone()), Error::::Head); ensure!(Self::founder() != Some(m.clone()), Error::::Founder); - >::mutate(|members| - match members.binary_search(&m) { - Err(_) => Err(Error::::NotMember)?, - Ok(i) => { - members.remove(i); - T::MembershipChanged::change_members_sorted(&[], &[m.clone()], members); - Ok(()) - } + let mut members = >::get(); + match members.binary_search(&m) { + Err(_) => Err(Error::::NotMember)?, + Ok(i) => { + members.remove(i); + T::MembershipChanged::change_members_sorted(&[], &[m.clone()], &members[..]); + >::put(members); + Ok(()) } - ) + } } /// End the current period and begin a new one. diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs index 580edc3643..3e5afc47f5 100644 --- a/frame/society/src/tests.rs +++ b/frame/society/src/tests.rs @@ -21,6 +21,7 @@ use mock::*; use frame_support::{assert_ok, assert_noop}; use sp_runtime::traits::BadOrigin; +use sp_core::blake2_256; #[test] fn founding_works() { @@ -31,9 +32,9 @@ fn founding_works() { assert_eq!(Society::pot(), 0); // Account 1 is set as the founder origin // Account 5 cannot start a society - assert_noop!(Society::found(Origin::signed(5), 20, 100), BadOrigin); + assert_noop!(Society::found(Origin::signed(5), 20, 100, vec![]), BadOrigin); // Account 1 can start a society, where 10 is the founding member - assert_ok!(Society::found(Origin::signed(1), 10, 100)); + assert_ok!(Society::found(Origin::signed(1), 10, 100, b"be cool".to_vec())); // Society members only include 10 assert_eq!(Society::members(), vec![10]); // 10 is the head of the society @@ -42,11 +43,39 @@ fn founding_works() { assert_eq!(Society::founder(), Some(10)); // 100 members max assert_eq!(Society::max_members(), 100); + // rules are correct + assert_eq!(Society::rules(), Some(blake2_256(b"be cool").into())); // Pot grows after first rotation period run_to_block(4); assert_eq!(Society::pot(), 1000); // Cannot start another society - assert_noop!(Society::found(Origin::signed(1), 20, 100), Error::::AlreadyFounded); + assert_noop!( + Society::found(Origin::signed(1), 20, 100, vec![]), + Error::::AlreadyFounded + ); + }); +} + +#[test] +fn unfounding_works() { + EnvBuilder::new().with_max_members(0).with_members(vec![]).execute(|| { + // Account 1 sets the founder... + assert_ok!(Society::found(Origin::signed(1), 10, 100, vec![])); + // Account 2 cannot unfound it as it's not the founder. + assert_noop!(Society::unfound(Origin::signed(2)), Error::::NotFounder); + // Account 10 can, though. + assert_ok!(Society::unfound(Origin::signed(10))); + + // 1 sets the founder to 20 this time + assert_ok!(Society::found(Origin::signed(1), 20, 100, vec![])); + // Bring in a new member... + assert_ok!(Society::bid(Origin::signed(10), 0)); + run_to_block(4); + assert_ok!(Society::vote(Origin::signed(20), 10, true)); + run_to_block(8); + + // Unfounding won't work now, even though it's from 20. + assert_noop!(Society::unfound(Origin::signed(20)), Error::::NotHead); }); } -- GitLab From 6cf45f26e4b3fdcf04eca2c6736cf194fff85dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sun, 19 Jan 2020 01:51:03 +0100 Subject: [PATCH 147/296] Make use of `cfg(doc)` in `sp-runtime-interface` (#4673) By using `cfg(doc)`, we can generate docs for modules which are only available from `no_std`. This drastically improves the documentation for the developers. --- .../src/runtime_interface/bare_function_interface.rs | 4 ++-- primitives/runtime-interface/src/host.rs | 3 +++ primitives/runtime-interface/src/lib.rs | 10 +++++----- primitives/runtime-interface/src/wasm.rs | 3 ++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs index 55b5eb3a4d..bdddc5eba7 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs @@ -21,10 +21,10 @@ //! functions will prepare the parameters for the FFI boundary, call the external host function //! exported into wasm and convert back the result. //! -//! [`generate`](bare_function_interface::generate) is the entry point for generating for each +//! [`generate`] is the entry point for generating for each //! trait method one bare function. //! -//! [`function_for_method`](bare_function_interface::function_for_method) generates the bare +//! [`function_for_method`] generates the bare //! function per trait method. Each bare function contains both implementations. The implementations //! are feature-gated, so that one is compiled for the native and the other for the wasm side. diff --git a/primitives/runtime-interface/src/host.rs b/primitives/runtime-interface/src/host.rs index 2fc272165f..cf03e6623a 100644 --- a/primitives/runtime-interface/src/host.rs +++ b/primitives/runtime-interface/src/host.rs @@ -49,6 +49,9 @@ pub trait IntoPreallocatedFFIValue: RIType { } /// Something that can be created from a ffi value. +/// Implementations are safe to assume that the `arg` given to `from_ffi_value` +/// is only generated by the corresponding [`wasm::IntoFFIValue`](crate::wasm::IntoFFIValue) +/// implementation. pub trait FromFFIValue: RIType { /// As `Self` can be an unsized type, it needs to be represented by a sized type at the host. /// This `SelfInstance` is the sized type. diff --git a/primitives/runtime-interface/src/lib.rs b/primitives/runtime-interface/src/lib.rs index 189126440b..30d74ad2db 100644 --- a/primitives/runtime-interface/src/lib.rs +++ b/primitives/runtime-interface/src/lib.rs @@ -25,10 +25,10 @@ //! # Using a type in a runtime interface //! //! Any type that should be used in a runtime interface as argument or return value needs to -//! implement [`RIType`]. The associated type `FFIType` is the type that is used in the FFI -//! function to represent the actual type. For example `[T]` is represented by an `u64`. The slice -//! pointer and the length will be mapped to an `u64` value. For more information, see the -//! implementation of [`RIType`] for `T`. The FFI function definition is used when calling from +//! implement [`RIType`]. The associated type [`FFIType`](RIType::FFIType) is the type that is used +//! in the FFI function to represent the actual type. For example `[T]` is represented by an `u64`. +//! The slice pointer and the length will be mapped to an `u64` value. For more information see +//! this [table](#ffi-type-and-conversion). The FFI function definition is used when calling from //! the wasm runtime into the node. //! //! Traits are used to convert from a type to the corresponding [`RIType::FFIType`]. @@ -265,7 +265,7 @@ pub use codec; pub(crate) mod impls; #[cfg(feature = "std")] pub mod host; -#[cfg(not(feature = "std"))] +#[cfg(any(not(feature = "std"), doc))] pub mod wasm; pub mod pass_by; diff --git a/primitives/runtime-interface/src/wasm.rs b/primitives/runtime-interface/src/wasm.rs index 476dfb8a4c..a0801c2bfb 100644 --- a/primitives/runtime-interface/src/wasm.rs +++ b/primitives/runtime-interface/src/wasm.rs @@ -26,7 +26,8 @@ use sp_std::cell::Cell; /// /// It is unsafe behavior to call `Something::into_ffi_value().get()` and take this as input for /// `from_ffi_value`. Implementations are safe to assume that the `arg` given to `from_ffi_value` -/// is only generated by the corresponding `host::IntoFFIValue` implementation. +/// is only generated by the corresponding [`host::IntoFFIValue`](crate::host::IntoFFIValue) +/// implementation. pub trait FromFFIValue: Sized + RIType { /// Create `Self` from the given ffi value. fn from_ffi_value(arg: Self::FFIType) -> Self; -- GitLab From c3af86cee45d98dd5f97fb2de419ba4e25ac14b7 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 20 Jan 2020 12:57:49 +0100 Subject: [PATCH 148/296] Move DummySpecialization to sc-network (#4680) --- client/network/src/protocol/specialization.rs | 26 ++++++++++++++++++ client/network/test/src/lib.rs | 27 +------------------ 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/client/network/src/protocol/specialization.rs b/client/network/src/protocol/specialization.rs index 9b1452160e..af6d5f7a23 100644 --- a/client/network/src/protocol/specialization.rs +++ b/client/network/src/protocol/specialization.rs @@ -57,6 +57,32 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_block_imported(&mut self, _ctx: &mut dyn Context, _hash: B::Hash, _header: &B::Header) { } } +/// A specialization that does nothing. +#[derive(Clone)] +pub struct DummySpecialization; + +impl NetworkSpecialization for DummySpecialization { + fn status(&self) -> Vec { + vec![] + } + + fn on_connect( + &mut self, + _ctx: &mut dyn Context, + _peer_id: PeerId, + _status: crate::message::Status + ) {} + + fn on_disconnect(&mut self, _ctx: &mut dyn Context, _peer_id: PeerId) {} + + fn on_message( + &mut self, + _ctx: &mut dyn Context, + _peer_id: 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/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index f1b7fa478c..1b13e83343 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -62,6 +62,7 @@ use substrate_test_runtime_client::{self, AccountKeyring}; pub use substrate_test_runtime_client::runtime::{Block, Extrinsic, Hash, Transfer}; pub use substrate_test_runtime_client::{TestClient, TestClientBuilder, TestClientBuilderExt}; +pub use sc_network::specialization::DummySpecialization; type AuthorityId = sp_consensus_babe::AuthorityId; @@ -101,32 +102,6 @@ impl Verifier for PassThroughVerifier { } } -/// The test specialization. -#[derive(Clone)] -pub struct DummySpecialization; - -impl NetworkSpecialization for DummySpecialization { - fn status(&self) -> Vec { - vec![] - } - - fn on_connect( - &mut self, - _ctx: &mut dyn Context, - _peer_id: PeerId, - _status: sc_network::message::Status - ) {} - - fn on_disconnect(&mut self, _ctx: &mut dyn Context, _peer_id: PeerId) {} - - fn on_message( - &mut self, - _ctx: &mut dyn Context, - _peer_id: PeerId, - _message: Vec, - ) {} -} - pub type PeersFullClient = sc_client::Client; pub type PeersLightClient = -- GitLab From 561bd727489501cfb24d29020062b3a5d4fdcca9 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 20 Jan 2020 15:58:39 +0100 Subject: [PATCH 149/296] keep nominations after getting kicked with zero slash (#4681) * keep nominations after getting kicked with zero slash * rename next_key to maybe_next_key Co-Authored-By: Gavin Wood Co-authored-by: Gavin Wood --- frame/staking/src/lib.rs | 4 +- frame/staking/src/migration.rs | 58 +++++++++++++++++++-- frame/staking/src/slashing.rs | 27 +++++++--- frame/staking/src/tests.rs | 93 +++++++++++++++++++++++++++++++++- 4 files changed, 169 insertions(+), 13 deletions(-) diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 326a015990..c547545c38 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1482,11 +1482,11 @@ impl Module { let Nominations { submitted_in, mut targets, suppressed: _ } = nominations; // Filter out nomination targets which were nominated before the most recent - // slashing span. + // non-zero slash. targets.retain(|stash| { ::SlashingSpans::get(&stash).map_or( true, - |spans| submitted_in >= spans.last_start(), + |spans| submitted_in >= spans.last_nonzero_slash(), ) }); diff --git a/frame/staking/src/migration.rs b/frame/staking/src/migration.rs index bb020b0fc0..6cb472375a 100644 --- a/frame/staking/src/migration.rs +++ b/frame/staking/src/migration.rs @@ -20,12 +20,14 @@ pub type VersionNumber = u32; // the current expected version of the storage -pub const CURRENT_VERSION: VersionNumber = 1; +pub const CURRENT_VERSION: VersionNumber = 2; +/// The inner logic of migrations. #[cfg(any(test, feature = "migrate"))] -mod inner { +pub mod inner { use crate::{Store, Module, Trait}; - use frame_support::{StorageLinkedMap, StorageValue}; + use frame_support::{StorageLinkedMap, StoragePrefixedMap, StorageValue}; + use codec::{Encode, Decode}; use sp_std::vec::Vec; use super::{CURRENT_VERSION, VersionNumber}; @@ -60,6 +62,55 @@ mod inner { frame_support::print("Finished migrating Staking storage to v1."); } + // migrate storage from v1 to v2: adds another field to the `SlashingSpans` + // struct. + pub fn to_v2(version: &mut VersionNumber) { + use crate::{EraIndex, slashing::SpanIndex}; + #[derive(Decode)] + struct V1SlashingSpans { + span_index: SpanIndex, + last_start: EraIndex, + prior: Vec, + } + + #[derive(Encode)] + struct V2SlashingSpans { + span_index: SpanIndex, + last_start: EraIndex, + last_nonzero_slash: EraIndex, + prior: Vec, + } + + if *version != 1 { return } + *version += 1; + + let prefix = as Store>::SlashingSpans::final_prefix(); + let mut current_key = prefix.to_vec(); + loop { + let maybe_next_key = sp_io::storage::next_key(¤t_key[..]) + .filter(|v| v.starts_with(&prefix[..])); + + match maybe_next_key { + Some(next_key) => { + let maybe_spans = sp_io::storage::get(&next_key[..]) + .and_then(|v| V1SlashingSpans::decode(&mut &v[..]).ok()); + if let Some(spans) = maybe_spans { + let new_val = V2SlashingSpans { + span_index: spans.span_index, + last_start: spans.last_start, + last_nonzero_slash: spans.last_start, + prior: spans.prior, + }.encode(); + + sp_io::storage::set(&next_key[..], &new_val[..]); + } + current_key = next_key; + } + None => break, + } + } + } + pub(super) fn perform_migrations() { as Store>::StorageVersion::mutate(|version| { if *version < MIN_SUPPORTED_VERSION { @@ -72,6 +123,7 @@ mod inner { if *version == CURRENT_VERSION { return } to_v1::(version); + to_v2::(version); }); } } diff --git a/frame/staking/src/slashing.rs b/frame/staking/src/slashing.rs index 7322b9a1d3..df36b1c763 100644 --- a/frame/staking/src/slashing.rs +++ b/frame/staking/src/slashing.rs @@ -90,7 +90,9 @@ pub struct SlashingSpans { span_index: SpanIndex, // the start era of the most recent (ongoing) slashing span. last_start: EraIndex, - // all prior slashing spans start indices, in reverse order (most recent first) + // the last era at which a non-zero slash occurred. + last_nonzero_slash: EraIndex, + // all prior slashing spans' start indices, in reverse order (most recent first) // encoded as offsets relative to the slashing span after it. prior: Vec, } @@ -102,6 +104,10 @@ impl SlashingSpans { SlashingSpans { span_index: 0, last_start: window_start, + // initialize to zero, as this structure is lazily created until + // the first slash is applied. setting equal to `window_start` would + // put a time limit on nominations. + last_nonzero_slash: 0, prior: Vec::new(), } } @@ -136,9 +142,9 @@ impl SlashingSpans { sp_std::iter::once(last).chain(prior) } - /// Yields the era index where the last (current) slashing span started. - pub(crate) fn last_start(&self) -> EraIndex { - self.last_start + /// Yields the era index where the most recent non-zero slash occurred. + pub(crate) fn last_nonzero_slash(&self) -> EraIndex { + self.last_nonzero_slash } // prune the slashing spans against a window, whose start era index is given. @@ -457,8 +463,12 @@ impl<'a, T: 'a + Trait> InspectingSpans<'a, T> { self.dirty = self.spans.end_span(now) || self.dirty; } - fn add_slash(&mut self, amount: BalanceOf) { + // add some value to the slash of the staker. + // invariant: the staker is being slashed for non-zero value here + // although `amount` may be zero, as it is only a difference. + fn add_slash(&mut self, amount: BalanceOf, slash_era: EraIndex) { *self.slash_of += amount; + self.spans.last_nonzero_slash = sp_std::cmp::max(self.spans.last_nonzero_slash, slash_era); } // find the span index of the given era, if covered. @@ -489,7 +499,7 @@ impl<'a, T: 'a + Trait> InspectingSpans<'a, T> { let reward = REWARD_F1 * (self.reward_proportion * slash).saturating_sub(span_record.paid_out); - self.add_slash(difference); + self.add_slash(difference, slash_era); changed = true; reward @@ -681,6 +691,7 @@ mod tests { let spans = SlashingSpans { span_index: 0, last_start: 1000, + last_nonzero_slash: 0, prior: Vec::new(), }; @@ -695,6 +706,7 @@ mod tests { let spans = SlashingSpans { span_index: 10, last_start: 1000, + last_nonzero_slash: 0, prior: vec![10, 9, 8, 10], }; @@ -715,6 +727,7 @@ mod tests { let mut spans = SlashingSpans { span_index: 10, last_start: 1000, + last_nonzero_slash: 0, prior: vec![10, 9, 8, 10], }; @@ -768,6 +781,7 @@ mod tests { let mut spans = SlashingSpans { span_index: 10, last_start: 1000, + last_nonzero_slash: 0, prior: vec![10, 9, 8, 10], }; assert_eq!(spans.prune(2000), Some((6, 10))); @@ -784,6 +798,7 @@ mod tests { let mut spans = SlashingSpans { span_index: 1, last_start: 10, + last_nonzero_slash: 0, prior: Vec::new(), }; diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index c290c6a858..bb1fe32025 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -18,12 +18,13 @@ use super::*; use mock::*; +use codec::Encode; use sp_runtime::{assert_eq_error_rate, traits::{OnInitialize, BadOrigin}}; use sp_staking::offence::OffenceDetails; use frame_support::{ assert_ok, assert_noop, traits::{Currency, ReservableCurrency}, - dispatch::DispatchError, + dispatch::DispatchError, StorageMap, }; use substrate_test_utils::assert_eq_uvec; @@ -2710,7 +2711,95 @@ fn slash_kicks_validators_not_nominators() { // and make sure that the vote will be ignored even if the validator // re-registers. - let last_slash = ::SlashingSpans::get(&11).unwrap().last_start(); + let last_slash = ::SlashingSpans::get(&11).unwrap().last_nonzero_slash(); assert!(nominations.submitted_in < last_slash); }); } + +#[test] +fn migration_v2() { + ExtBuilder::default().build().execute_with(|| { + use crate::{EraIndex, slashing::SpanIndex}; + + #[derive(Encode)] + struct V1SlashingSpans { + span_index: SpanIndex, + last_start: EraIndex, + prior: Vec, + } + + // inject old-style values directly into storage. + let set = |stash, spans: V1SlashingSpans| { + let key = ::SlashingSpans::hashed_key_for(stash); + sp_io::storage::set(&key, &spans.encode()); + }; + + let spans_11 = V1SlashingSpans { + span_index: 10, + last_start: 1, + prior: vec![0], + }; + + let spans_21 = V1SlashingSpans { + span_index: 1, + last_start: 5, + prior: vec![], + }; + + set(11, spans_11); + set(21, spans_21); + + ::StorageVersion::put(1); + + // perform migration. + crate::migration::inner::to_v2::(&mut 1); + + assert_eq!( + ::SlashingSpans::get(&11).unwrap().last_nonzero_slash(), + 1, + ); + + assert_eq!( + ::SlashingSpans::get(&21).unwrap().last_nonzero_slash(), + 5, + ); + }); +} + +#[test] +fn zero_slash_keeps_nominators() { + ExtBuilder::default().build().execute_with(|| { + start_era(1); + + assert_eq!(Balances::free_balance(&11), 1000); + + let exposure = Staking::stakers(&11); + assert_eq!(Balances::free_balance(&101), 2000); + + on_offence_now( + &[ + OffenceDetails { + offender: (11, exposure.clone()), + reporters: vec![], + }, + ], + &[Perbill::from_percent(0)], + ); + + assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(&101), 2000); + + // This is the best way to check that the validator was chilled; `get` will + // return default value. + for (stash, _) in ::Validators::enumerate() { + assert!(stash != 11); + } + + let nominations = ::Nominators::get(&101).unwrap(); + + // and make sure that the vote will not be ignored, because the slash was + // zero. + let last_slash = ::SlashingSpans::get(&11).unwrap().last_nonzero_slash(); + assert!(nominations.submitted_in >= last_slash); + }); +} -- GitLab From a90c72e6d7088d0473670bf74253c65791411589 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 20 Jan 2020 16:00:43 +0100 Subject: [PATCH 150/296] deprecate chain_status field of network handshake (#4675) * deprecate chain_status field of network handshake * Update client/network/src/protocol/message.rs remove unneeded whitespace. Co-Authored-By: Pierre Krieger Co-authored-by: Pierre Krieger --- client/network/src/protocol.rs | 2 +- client/network/src/protocol/message.rs | 58 +++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 2aa29ea279..6914ea9efe 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -74,7 +74,7 @@ const MAX_KNOWN_BLOCKS: usize = 1024; // ~32kb per peer + LruHashSet overhead const MAX_KNOWN_EXTRINSICS: usize = 4096; // ~128kb per peer + overhead /// Current protocol version. -pub(crate) const CURRENT_VERSION: u32 = 5; +pub(crate) const CURRENT_VERSION: u32 = 6; /// Lowest version we support pub(crate) const MIN_VERSION: u32 = 3; diff --git a/client/network/src/protocol/message.rs b/client/network/src/protocol/message.rs index 30f0c34175..ef7d550de6 100644 --- a/client/network/src/protocol/message.rs +++ b/client/network/src/protocol/message.rs @@ -252,7 +252,29 @@ pub mod generic { } /// Status sent on connection. + // TODO https://github.com/paritytech/substrate/issues/4674: replace the `Status` + // struct with this one, after waiting a few releases beyond `NetworkSpecialization`'s + // removal (https://github.com/paritytech/substrate/pull/4665) + // + // and set MIN_VERSION to 6. #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + pub struct CompactStatus { + /// Protocol version. + pub version: u32, + /// Minimum supported version. + pub min_supported_version: u32, + /// Supported roles. + pub roles: Roles, + /// Best block number. + pub best_number: Number, + /// Best block hash. + pub best_hash: Hash, + /// Genesis block hash. + pub genesis_hash: Hash, + } + + /// Status sent on connection. + #[derive(Debug, PartialEq, Eq, Clone, Encode)] pub struct Status { /// Protocol version. pub version: u32, @@ -266,10 +288,44 @@ pub mod generic { pub best_hash: Hash, /// Genesis block hash. pub genesis_hash: Hash, - /// Chain-specific status. + /// DEPRECATED. Chain-specific status. pub chain_status: Vec, } + impl Decode for Status { + fn decode(value: &mut I) -> Result { + const LAST_CHAIN_STATUS_VERSION: u32 = 5; + let compact = CompactStatus::decode(value)?; + let chain_status = match >::decode(value) { + Ok(v) => v, + Err(e) => if compact.version <= LAST_CHAIN_STATUS_VERSION { + return Err(e) + } else { + Vec::new() + } + }; + + let CompactStatus { + version, + min_supported_version, + roles, + best_number, + best_hash, + genesis_hash, + } = compact; + + Ok(Status { + version, + min_supported_version, + roles, + best_number, + best_hash, + genesis_hash, + chain_status, + }) + } + } + /// Request block data from a peer. #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] pub struct BlockRequest { -- GitLab From a083572ebfb4b85864c6016447b1481cc701b96b Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 20 Jan 2020 17:25:56 +0100 Subject: [PATCH 151/296] client/finality-grandpa/communication: Add doc comment for PeerReport (#4684) --- client/finality-grandpa/src/communication/gossip.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/client/finality-grandpa/src/communication/gossip.rs b/client/finality-grandpa/src/communication/gossip.rs index ec74393d80..7b21c1d079 100644 --- a/client/finality-grandpa/src/communication/gossip.rs +++ b/client/finality-grandpa/src/communication/gossip.rs @@ -1445,6 +1445,7 @@ impl sc_network_gossip::Validator for GossipValidator Date: Tue, 21 Jan 2020 00:26:19 +0800 Subject: [PATCH 152/296] ci: increase retention for logs of tests to 144 hours (#4677) * ci: increase retention for logs of tests to 144 hours * change to days --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05834f11d1..b98e859182 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -146,7 +146,7 @@ test-linux-stable: &test-linux - awk '/^warning:/,/^$/ { print }' output.log > ${CI_COMMIT_SHORT_SHA}_warnings.log artifacts: name: $CI_COMMIT_SHORT_SHA - expire_in: 24 hrs + expire_in: 3 days paths: - ${CI_COMMIT_SHORT_SHA}_warnings.log @@ -210,7 +210,7 @@ test-linux-stable-int: artifacts: name: $CI_COMMIT_SHORT_SHA when: on_failure - expire_in: 24 hrs + expire_in: 3 days paths: - ${CI_COMMIT_SHORT_SHA}_int_failure.log -- GitLab From 1f9d09d597a250e11f8f742b2d6d2cc9ae911c6c Mon Sep 17 00:00:00 2001 From: thiolliere Date: Mon, 20 Jan 2020 17:26:53 +0100 Subject: [PATCH 153/296] Pallet session new API (#4609) * Initial work * Fix most things * fix test * fix old comment * migration * fix * remove useless stuff * fix * less spaghetti implementation * fix initial session * fix --- bin/node/runtime/src/lib.rs | 3 +- frame/authority-discovery/src/lib.rs | 10 +-- frame/babe/src/mock.rs | 3 +- frame/im-online/src/mock.rs | 22 ++--- frame/session/src/historical.rs | 129 ++++++++++++--------------- frame/session/src/lib.rs | 84 ++++++++--------- frame/session/src/mock.rs | 25 +++--- frame/staking/src/lib.rs | 63 +++++++------ frame/staking/src/mock.rs | 3 +- frame/staking/src/tests.rs | 12 +-- 10 files changed, 159 insertions(+), 195 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index d769be7b50..e158cbe2cb 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -236,14 +236,13 @@ parameter_types! { } impl pallet_session::Trait for Runtime { - type OnSessionEnding = Staking; + type SessionManager = Staking; type SessionHandler = ::KeyTypeIdProviders; type ShouldEndSession = Babe; type Event = Event; type Keys = SessionKeys; type ValidatorId = ::AccountId; type ValidatorIdOf = pallet_staking::StashOf; - type SelectInitialValidators = Staking; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; } diff --git a/frame/authority-discovery/src/lib.rs b/frame/authority-discovery/src/lib.rs index b3911859f4..c427043397 100644 --- a/frame/authority-discovery/src/lib.rs +++ b/frame/authority-discovery/src/lib.rs @@ -109,26 +109,18 @@ mod tests { pub struct Test; impl Trait for Test {} - pub struct TestOnSessionEnding; - impl pallet_session::OnSessionEnding for TestOnSessionEnding { - fn on_session_ending(_: SessionIndex, _: SessionIndex) -> Option> { - None - } - } - parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(33); } impl pallet_session::Trait for Test { - type OnSessionEnding = TestOnSessionEnding; + type SessionManager = (); type Keys = UintAuthorityId; type ShouldEndSession = pallet_session::PeriodicSessions; type SessionHandler = TestSessionHandler; type Event = (); type ValidatorId = AuthorityId; type ValidatorIdOf = ConvertInto; - type SelectInitialValidators = (); type DisabledValidatorsThreshold = DisabledValidatorsThreshold; } diff --git a/frame/babe/src/mock.rs b/frame/babe/src/mock.rs index 3f0c42a6cb..e65f305dc4 100644 --- a/frame/babe/src/mock.rs +++ b/frame/babe/src/mock.rs @@ -79,9 +79,8 @@ impl pallet_session::Trait for Test { type ValidatorId = ::AccountId; type ShouldEndSession = Babe; type SessionHandler = (Babe,Babe,); - type OnSessionEnding = (); + type SessionManager = (); type ValidatorIdOf = (); - type SelectInitialValidators = (); type Keys = MockSessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; } diff --git a/frame/im-online/src/mock.rs b/frame/im-online/src/mock.rs index 387ff47c09..5c428c3858 100644 --- a/frame/im-online/src/mock.rs +++ b/frame/im-online/src/mock.rs @@ -43,28 +43,25 @@ thread_local! { pub static VALIDATORS: RefCell>> = RefCell::new(Some(vec![1, 2, 3])); } -pub struct TestOnSessionEnding; -impl pallet_session::OnSessionEnding for TestOnSessionEnding { - fn on_session_ending(_ending_index: SessionIndex, _will_apply_at: SessionIndex) - -> Option> - { +pub struct TestSessionManager; +impl pallet_session::SessionManager for TestSessionManager { + fn new_session(_new_index: SessionIndex) -> Option> { VALIDATORS.with(|l| l.borrow_mut().take()) } + fn end_session(_: SessionIndex) {} } -impl pallet_session::historical::OnSessionEnding for TestOnSessionEnding { - fn on_session_ending(_ending_index: SessionIndex, _will_apply_at: SessionIndex) - -> Option<(Vec, Vec<(u64, u64)>)> - { +impl pallet_session::historical::SessionManager for TestSessionManager { + fn new_session(_new_index: SessionIndex) -> Option> { VALIDATORS.with(|l| l .borrow_mut() .take() .map(|validators| { - let full_identification = validators.iter().map(|v| (*v, *v)).collect(); - (validators, full_identification) + validators.iter().map(|v| (*v, *v)).collect() }) ) } + fn end_session(_: SessionIndex) {} } /// An extrinsic type used for tests. @@ -131,13 +128,12 @@ parameter_types! { impl pallet_session::Trait for Runtime { type ShouldEndSession = pallet_session::PeriodicSessions; - type OnSessionEnding = pallet_session::historical::NoteHistoricalRoot; + type SessionManager = pallet_session::historical::NoteHistoricalRoot; type SessionHandler = (ImOnline, ); type ValidatorId = u64; type ValidatorIdOf = ConvertInto; type Keys = UintAuthorityId; type Event = (); - type SelectInitialValidators = (); type DisabledValidatorsThreshold = DisabledValidatorsThreshold; } diff --git a/frame/session/src/historical.rs b/frame/session/src/historical.rs index 939e6133e8..e67a2ae1b0 100644 --- a/frame/session/src/historical.rs +++ b/frame/session/src/historical.rs @@ -48,8 +48,7 @@ pub trait Trait: super::Trait { /// validator, since they may be outdated by the time this is queried from a /// historical trie. /// - /// This mapping is expected to remain stable in between calls to - /// `Self::OnSessionEnding::on_session_ending` which return new validators. + /// It must return the identification for the current session index. type FullIdentificationOf: Convert>; } @@ -57,16 +56,19 @@ decl_storage! { trait Store for Module as Session { /// Mapping from historical session indices to session-data root hash and validator count. HistoricalSessions get(fn historical_root): map SessionIndex => Option<(T::Hash, ValidatorCount)>; - /// Queued full identifications for queued sessions whose validators have become obsolete. - CachedObsolete get(fn cached_obsolete): map SessionIndex - => Option>; /// The range of historical sessions we store. [first, last) StoredRange: Option<(SessionIndex, SessionIndex)>; + /// Deprecated. + CachedObsolete: map SessionIndex => Option>; } } decl_module! { - pub struct Module for enum Call where origin: T::Origin { } + pub struct Module for enum Call where origin: T::Origin { + fn on_initialize(_n: T::BlockNumber) { + CachedObsolete::::remove_all(); + } + } } impl Module { @@ -97,52 +99,52 @@ impl Module { } } -/// Specialization of the crate-level `OnSessionEnding` which returns the old -/// set of full identification when changing the validator set. -pub trait OnSessionEnding: crate::OnSessionEnding { - /// If there was a validator set change, its returns the set of new validators along with the - /// old validators and their full identifications. - fn on_session_ending(ending: SessionIndex, will_apply_at: SessionIndex) - -> Option<(Vec, Vec<(ValidatorId, FullIdentification)>)>; +/// Specialization of the crate-level `SessionManager` which returns the set of full identification +/// when creating a new session. +pub trait SessionManager: crate::SessionManager { + /// If there was a validator set change, its returns the set of new validators along with their + /// full identifications. + fn new_session(new_index: SessionIndex) -> Option>; + fn end_session(end_index: SessionIndex); } -/// An `OnSessionEnding` implementation that wraps an inner `I` and also +/// An `SessionManager` implementation that wraps an inner `I` and also /// sets the historical trie root of the ending session. pub struct NoteHistoricalRoot(sp_std::marker::PhantomData<(T, I)>); -impl crate::OnSessionEnding for NoteHistoricalRoot - where I: OnSessionEnding +impl crate::SessionManager for NoteHistoricalRoot + where I: SessionManager { - fn on_session_ending(ending: SessionIndex, applied_at: SessionIndex) -> Option> { + fn new_session(new_index: SessionIndex) -> Option> { StoredRange::mutate(|range| { - range.get_or_insert_with(|| (ending, ending)).1 = ending + 1; + range.get_or_insert_with(|| (new_index, new_index)).1 = new_index + 1; }); - // do all of this _before_ calling the other `on_session_ending` impl - // so that we have e.g. correct exposures from the _current_. + let new_validators_and_id = >::new_session(new_index); + let new_validators = new_validators_and_id.as_ref().map(|new_validators| { + new_validators.iter().map(|(v, _id)| v.clone()).collect() + }); - let count = >::validators().len() as u32; - match ProvingTrie::::generate_for(ending) { - Ok(trie) => >::insert(ending, &(trie.root, count)), - Err(reason) => { - print("Failed to generate historical ancestry-inclusion proof."); - print(reason); + if let Some(new_validators) = new_validators_and_id { + let count = new_validators.len() as u32; + match ProvingTrie::::generate_for(new_validators) { + Ok(trie) => >::insert(new_index, &(trie.root, count)), + Err(reason) => { + print("Failed to generate historical ancestry-inclusion proof."); + print(reason); + } + }; + } else { + let previous_index = new_index.saturating_sub(1); + if let Some(previous_session) = >::get(previous_index) { + >::insert(new_index, previous_session); } - }; - - // trie has been generated for this session, so it's no longer queued. - >::remove(&ending); - - let (new_validators, old_exposures) = >::on_session_ending(ending, applied_at)?; - - // every session from `ending+1 .. applied_at` now has obsolete `FullIdentification` - // now that a new validator election has occurred. - // we cache these in the trie until those sessions themselves end. - for obsolete in (ending + 1) .. applied_at { - >::insert(obsolete, &old_exposures); } - Some(new_validators) + new_validators + } + fn end_session(end_index: SessionIndex) { + >::end_session(end_index) } } @@ -158,15 +160,14 @@ pub struct ProvingTrie { } impl ProvingTrie { - fn generate_for(now: SessionIndex) -> Result { + fn generate_for(validators: I) -> Result + where I: IntoIterator + { let mut db = MemoryDB::default(); let mut root = Default::default(); - fn build(root: &mut T::Hash, db: &mut MemoryDB>, validators: I) - -> Result<(), &'static str> - where I: IntoIterator)> { - let mut trie = TrieDBMut::new(db, root); + let mut trie = TrieDBMut::new(&mut db, &mut root); for (i, (validator, full_id)) in validators.into_iter().enumerate() { let i = i as u32; let keys = match >::load_keys(&validator) { @@ -174,11 +175,7 @@ impl ProvingTrie { Some(k) => k, }; - let full_id = full_id.or_else(|| T::FullIdentificationOf::convert(validator.clone())); - let full_id = match full_id { - None => return Err("no full identification for a current validator"), - Some(full) => (validator, full), - }; + let full_id = (validator, full_id); // map each key to the owner index. for key_id in T::Keys::key_ids() { @@ -194,17 +191,6 @@ impl ProvingTrie { let _ = i.using_encoded(|k| full_id.using_encoded(|v| trie.insert(k, v))) .map_err(|_| "failed to insert into trie")?; } - - Ok(()) - } - - // if the current session's full identifications are obsolete but cached, - // use those. - if let Some(obsolete) = >::get(&now) { - build::(&mut root, &mut db, obsolete.into_iter().map(|(v, f)| (v, Some(f))))? - } else { - let validators = >::validators(); - build::(&mut root, &mut db, validators.into_iter().map(|v| (v, None)))? } Ok(ProvingTrie { @@ -281,7 +267,12 @@ impl> frame_support::traits::KeyOwnerProofSystem<(KeyTy fn prove(key: (KeyTypeId, D)) -> Option { let session = >::current_index(); - let trie = ProvingTrie::::generate_for(session).ok()?; + let validators = >::validators().into_iter() + .filter_map(|validator| { + T::FullIdentificationOf::convert(validator.clone()) + .map(|full_id| (validator, full_id)) + }); + let trie = ProvingTrie::::generate_for(validators).ok()?; let (id, data) = key; @@ -348,13 +339,9 @@ mod tests { set_next_validators(vec![1, 2, 4]); force_new_session(); - assert!(Historical::cached_obsolete(&(proof.session + 1)).is_none()); - System::set_block_number(2); Session::on_initialize(2); - assert!(Historical::cached_obsolete(&(proof.session + 1)).is_some()); - assert!(Historical::historical_root(proof.session).is_some()); assert!(Session::current_index() > proof.session); @@ -366,15 +353,13 @@ mod tests { force_new_session(); System::set_block_number(3); Session::on_initialize(3); - - assert!(Historical::cached_obsolete(&(proof.session + 1)).is_none()); }); } #[test] fn prune_up_to_works() { new_test_ext().execute_with(|| { - for i in 1..101u64 { + for i in 1..99u64 { set_next_validators(vec![i]); force_new_session(); @@ -385,7 +370,7 @@ mod tests { assert_eq!(StoredRange::get(), Some((0, 100))); - for i in 1..100 { + for i in 0..100 { assert!(Historical::historical_root(i).is_some()) } @@ -405,7 +390,7 @@ mod tests { Historical::prune_up_to(100); assert_eq!(StoredRange::get(), None); - for i in 101..201u64 { + for i in 99..199u64 { set_next_validators(vec![i]); force_new_session(); @@ -416,14 +401,14 @@ mod tests { assert_eq!(StoredRange::get(), Some((100, 200))); - for i in 101..200 { + for i in 100..200 { assert!(Historical::historical_root(i).is_some()) } Historical::prune_up_to(9999); assert_eq!(StoredRange::get(), None); - for i in 101..200 { + for i in 100..200 { assert!(Historical::historical_root(i).is_none()) } }); diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index 2200221af4..098b533077 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -162,29 +162,30 @@ impl< } } -/// An event handler for when the session is ending. -/// TODO [slashing] consider renaming to OnSessionStarting -pub trait OnSessionEnding { - /// Handle the fact that the session is ending, and optionally provide the new validator set. +/// A trait for managing creation of new validator set. +pub trait SessionManager { + /// Plan a new session, and optionally provide the new validator set. /// /// Even if the validator-set is the same as before, if any underlying economic /// conditions have changed (i.e. stake-weights), the new validator set must be returned. /// This is necessary for consensus engines making use of the session module to /// issue a validator-set change so misbehavior can be provably associated with the new /// economic conditions as opposed to the old. + /// The returned validator set, if any, will not be applied until `new_index`. + /// `new_index` is strictly greater than from previous call. /// - /// `ending_index` is the index of the currently ending session. - /// The returned validator set, if any, will not be applied until `will_apply_at`. - /// `will_apply_at` is guaranteed to be at least `ending_index + 1`, since session indices don't - /// repeat, but it could be some time after in case we are staging authority set changes. - fn on_session_ending( - ending_index: SessionIndex, - will_apply_at: SessionIndex - ) -> Option>; + /// The first session start at index 0. + fn new_session(new_index: SessionIndex) -> Option>; + /// End the session. + /// + /// Because the session pallet can queue validator set the ending session can be lower than the + /// last new session index. + fn end_session(end_index: SessionIndex); } -impl
OnSessionEnding for () { - fn on_session_ending(_: SessionIndex, _: SessionIndex) -> Option> { None } +impl SessionManager for () { + fn new_session(_: SessionIndex) -> Option> { None } + fn end_session(_: SessionIndex) {} } /// Handler for session lifecycle events. @@ -214,7 +215,7 @@ pub trait SessionHandler { /// A notification for end of the session. /// - /// Note it is triggered before any `OnSessionEnding` handlers, + /// Note it is triggered before any `SessionManager::end_session` handlers, /// so we can still affect the validator set. fn on_before_session_ending() {} @@ -248,7 +249,7 @@ pub trait OneSessionHandler: BoundToRuntimeAppPublic { /// A notification for end of the session. /// - /// Note it is triggered before any `OnSessionEnding` handlers, + /// Note it is triggered before any `SessionManager::end_session` handlers, /// so we can still affect the validator set. fn on_before_session_ending() {} @@ -318,21 +319,6 @@ impl SessionHandler for TestSessionHandler { fn on_disabled(_: usize) {} } -/// Handler for selecting the genesis validator set. -pub trait SelectInitialValidators { - /// Returns the initial validator set. If `None` is returned - /// all accounts that have session keys set in the genesis block - /// will be validators. - fn select_initial_validators() -> Option>; -} - -/// Implementation of `SelectInitialValidators` that does nothing. -impl SelectInitialValidators for () { - fn select_initial_validators() -> Option> { - None - } -} - impl ValidatorRegistration for Module { fn is_registered(id: &T::ValidatorId) -> bool { Self::load_keys(id).is_some() @@ -352,8 +338,8 @@ pub trait Trait: frame_system::Trait { /// Indicator for when to end the session. type ShouldEndSession: ShouldEndSession; - /// Handler for when a session is about to end. - type OnSessionEnding: OnSessionEnding; + /// Handler for managing new session. + type SessionManager: SessionManager; /// Handler when a session has changed. type SessionHandler: SessionHandler; @@ -366,9 +352,6 @@ pub trait Trait: frame_system::Trait { /// After the threshold is reached `disabled` method starts to return true, /// which in combination with `pallet_staking` forces a new era. type DisabledValidatorsThreshold: Get; - - /// Select initial validators. - type SelectInitialValidators: SelectInitialValidators; } const DEDUP_KEY_PREFIX: &[u8] = b":session:keys"; @@ -435,12 +418,19 @@ decl_storage! { .expect("genesis config must not contain duplicates; qed"); } - let initial_validators = T::SelectInitialValidators::select_initial_validators() - .unwrap_or_else(|| config.keys.iter().map(|(ref v, _)| v.clone()).collect()); + let initial_validators_0 = T::SessionManager::new_session(0) + .unwrap_or_else(|| { + frame_support::print("No initial validator provided by `SessionManager`, use \ + session config keys to generate initial validator set."); + config.keys.iter().map(|(ref v, _)| v.clone()).collect() + }); + assert!(!initial_validators_0.is_empty(), "Empty validator set for session 0 in genesis block!"); - assert!(!initial_validators.is_empty(), "Empty validator set in genesis block!"); + let initial_validators_1 = T::SessionManager::new_session(1) + .unwrap_or_else(|| initial_validators_0.clone()); + assert!(!initial_validators_1.is_empty(), "Empty validator set for session 1 in genesis block!"); - let queued_keys: Vec<_> = initial_validators + let queued_keys: Vec<_> = initial_validators_1 .iter() .cloned() .map(|v| ( @@ -452,7 +442,7 @@ decl_storage! { // Tell everyone about the genesis session keys T::SessionHandler::on_genesis_session::(&queued_keys); - >::put(initial_validators); + >::put(initial_validators_0); >::put(queued_keys); }); } @@ -545,10 +535,14 @@ impl Module { DisabledValidators::take(); } - let applied_at = session_index + 2; + T::SessionManager::end_session(session_index); + + // Increment session index. + let session_index = session_index + 1; + CurrentIndex::put(session_index); // Get next validator set. - let maybe_next_validators = T::OnSessionEnding::on_session_ending(session_index, applied_at); + let maybe_next_validators = T::SessionManager::new_session(session_index + 1); let (next_validators, next_identities_changed) = if let Some(validators) = maybe_next_validators { @@ -560,10 +554,6 @@ impl Module { (>::get(), false) }; - // Increment session index. - let session_index = session_index + 1; - CurrentIndex::put(session_index); - // Queue next session keys. let (queued_amalgamated, next_changed) = { // until we are certain there has been a change, iterate the prior diff --git a/frame/session/src/mock.rs b/frame/session/src/mock.rs index 7fe9cd01f4..ff84743a61 100644 --- a/frame/session/src/mock.rs +++ b/frame/session/src/mock.rs @@ -88,9 +88,10 @@ impl SessionHandler for TestSessionHandler { } } -pub struct TestOnSessionEnding; -impl OnSessionEnding for TestOnSessionEnding { - fn on_session_ending(_: SessionIndex, _: SessionIndex) -> Option> { +pub struct TestSessionManager; +impl SessionManager for TestSessionManager { + fn end_session(_: SessionIndex) {} + fn new_session(_: SessionIndex) -> Option> { if !TEST_SESSION_CHANGED.with(|l| *l.borrow()) { VALIDATORS.with(|v| { let mut v = v.borrow_mut(); @@ -108,14 +109,13 @@ impl OnSessionEnding for TestOnSessionEnding { } #[cfg(feature = "historical")] -impl crate::historical::OnSessionEnding for TestOnSessionEnding { - fn on_session_ending(ending_index: SessionIndex, will_apply_at: SessionIndex) - -> Option<(Vec, Vec<(u64, u64)>)> +impl crate::historical::SessionManager for TestSessionManager { + fn end_session(_: SessionIndex) {} + fn new_session(new_index: SessionIndex) + -> Option> { - let pair_with_ids = |vals: &[u64]| vals.iter().map(|&v| (v, v)).collect::>(); - >::on_session_ending(ending_index, will_apply_at) - .map(|vals| (pair_with_ids(&vals), vals)) - .map(|(ids, vals)| (vals, ids)) + >::new_session(new_index) + .map(|vals| vals.into_iter().map(|val| (val, val)).collect()) } } @@ -190,15 +190,14 @@ parameter_types! { impl Trait for Test { type ShouldEndSession = TestShouldEndSession; #[cfg(feature = "historical")] - type OnSessionEnding = crate::historical::NoteHistoricalRoot; + type SessionManager = crate::historical::NoteHistoricalRoot; #[cfg(not(feature = "historical"))] - type OnSessionEnding = TestOnSessionEnding; + type SessionManager = TestSessionManager; type SessionHandler = TestSessionHandler; type ValidatorId = u64; type ValidatorIdOf = ConvertInto; type Keys = MockSessionKeys; type Event = (); - type SelectInitialValidators = (); type DisabledValidatorsThreshold = DisabledValidatorsThreshold; } diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index c547545c38..7f1ad37b32 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -265,7 +265,7 @@ use frame_support::{ WithdrawReasons, OnUnbalanced, Imbalance, Get, Time } }; -use pallet_session::{historical::OnSessionEnding, SelectInitialValidators}; +use pallet_session::historical::SessionManager; use sp_runtime::{ Perbill, RuntimeDebug, @@ -575,8 +575,7 @@ impl SessionInterface<::AccountId> for T whe FullIdentificationOf = ExposureOf, >, T::SessionHandler: pallet_session::SessionHandler<::AccountId>, - T::OnSessionEnding: pallet_session::OnSessionEnding<::AccountId>, - T::SelectInitialValidators: pallet_session::SelectInitialValidators<::AccountId>, + T::SessionManager: pallet_session::SessionManager<::AccountId>, T::ValidatorIdOf: Convert<::AccountId, Option<::AccountId>> { fn disable_validator(validator: &::AccountId) -> Result { @@ -1346,11 +1345,8 @@ impl Module { imbalance } - /// Session has just ended. Provide the validator set for the next session if it's an era-end, along - /// with the exposure of the prior validator set. - fn new_session(session_index: SessionIndex) - -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> - { + /// 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> { let era_length = session_index.checked_sub(Self::current_era_start_session_index()).unwrap_or(0); match ForceEra::get() { Forcing::ForceNew => ForceEra::kill(), @@ -1358,12 +1354,17 @@ impl Module { Forcing::NotForcing if era_length >= T::SessionsPerEra::get() => (), _ => return None, } - let validators = T::SessionInterface::validators(); - let prior = validators.into_iter() - .map(|v| { let e = Self::stakers(&v); (v, e) }) - .collect(); - Self::new_era(session_index).map(move |new| (new, prior)) + Self::new_era(session_index) + } + + /// Initialise the first session (and consequently the first era) + fn initial_session() -> Option> { + // note: `CurrentEraStart` is set in `on_finalize` of the first block because now is not + // available yet. + CurrentEraStartSessionIndex::put(0); + BondedEras::mutate(|bonded| bonded.push((0, 0))); + Self::select_validators().1 } /// The era has changed - enact new staking set. @@ -1646,19 +1647,30 @@ impl Module { } } -impl pallet_session::OnSessionEnding for Module { - fn on_session_ending(_ending: SessionIndex, start_session: SessionIndex) -> Option> { +impl pallet_session::SessionManager for Module { + fn new_session(new_index: SessionIndex) -> Option> { Self::ensure_storage_upgraded(); - Self::new_session(start_session - 1).map(|(new, _old)| new) + if new_index == 0 { + return Self::initial_session(); + } + Self::new_session(new_index - 1) } + fn end_session(_end_index: SessionIndex) {} } -impl OnSessionEnding>> for Module { - fn on_session_ending(_ending: SessionIndex, start_session: SessionIndex) - -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> +impl SessionManager>> for Module { + fn new_session(new_index: SessionIndex) + -> Option>)>> { - Self::ensure_storage_upgraded(); - Self::new_session(start_session - 1) + >::new_session(new_index).map(|validators| { + validators.into_iter().map(|v| { + let exposure = >::get(&v); + (v, exposure) + }).collect() + }) + } + fn end_session(end_index: SessionIndex) { + >::end_session(end_index) } } @@ -1707,12 +1719,6 @@ impl Convert> } } -impl SelectInitialValidators for Module { - fn select_initial_validators() -> Option> { - >::select_validators().1 - } -} - /// This is intended to be used with `FilterHistoricalOffences`. impl OnOffenceHandler> for Module where T: pallet_session::Trait::AccountId>, @@ -1721,8 +1727,7 @@ impl OnOffenceHandler, >, T::SessionHandler: pallet_session::SessionHandler<::AccountId>, - T::OnSessionEnding: pallet_session::OnSessionEnding<::AccountId>, - T::SelectInitialValidators: pallet_session::SelectInitialValidators<::AccountId>, + T::SessionManager: pallet_session::SessionManager<::AccountId>, T::ValidatorIdOf: Convert<::AccountId, Option<::AccountId>> { fn on_offence( diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 3c238b56ed..8aa20c19c6 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -162,14 +162,13 @@ parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(25); } impl pallet_session::Trait for Test { - type OnSessionEnding = pallet_session::historical::NoteHistoricalRoot; + type SessionManager = pallet_session::historical::NoteHistoricalRoot; type Keys = UintAuthorityId; type ShouldEndSession = pallet_session::PeriodicSessions; type SessionHandler = TestSessionHandler; type Event = (); type ValidatorId = AccountId; type ValidatorIdOf = crate::StashOf; - type SelectInitialValidators = Staking; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; } diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index bb1fe32025..43a2d00791 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -365,7 +365,7 @@ fn less_than_needed_candidates_works() { #[test] fn no_candidate_emergency_condition() { ExtBuilder::default() - .minimum_validator_count(10) + .minimum_validator_count(1) .validator_count(15) .num_validators(4) .validator_pool(true) @@ -374,21 +374,21 @@ fn no_candidate_emergency_condition() { .execute_with(|| { // initial validators assert_eq_uvec!(validator_controllers(), vec![10, 20, 30, 40]); + let prefs = ValidatorPrefs { commission: Perbill::one() }; + ::Validators::insert(11, prefs.clone()); // set the minimum validator count. ::MinimumValidatorCount::put(10); - ::ValidatorCount::put(15); - assert_eq!(Staking::validator_count(), 15); let _ = Staking::chill(Origin::signed(10)); // trigger era - System::set_block_number(1); - Session::on_initialize(System::block_number()); + start_era(1); // Previous ones are elected. chill is invalidates. TODO: #2494 assert_eq_uvec!(validator_controllers(), vec![10, 20, 30, 40]); - assert_eq!(Staking::current_elected().len(), 0); + // Though the validator preferences has been removed. + assert!(Staking::validators(11) != prefs); }); } -- GitLab From 5cd952bbf6405a165d0399fd3e5004961ace6819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 20 Jan 2020 17:28:27 +0100 Subject: [PATCH 154/296] Only support ECDSA compressed public keys (#4667) Some fixes after: https://github.com/paritytech/substrate/pull/4502 This removes the unwanted `expect`s from `MultiSigner`. Instead we convert from full to compressed in `TryFrom` and can return an error on invalid input. --- primitives/core/src/ecdsa.rs | 120 +++++++++++-------------------- primitives/runtime/src/lib.rs | 6 +- primitives/runtime/src/traits.rs | 4 +- 3 files changed, 46 insertions(+), 84 deletions(-) diff --git a/primitives/core/src/ecdsa.rs b/primitives/core/src/ecdsa.rs index afd75dae99..99db0e6b2d 100644 --- a/primitives/core/src/ecdsa.rs +++ b/primitives/core/src/ecdsa.rs @@ -46,14 +46,9 @@ use secp256k1::{PublicKey, SecretKey}; #[cfg(feature = "full_crypto")] type Seed = [u8; 32]; -/// The ECDSA public key. +/// The ECDSA compressed public key. #[derive(Clone, Encode, Decode)] -pub enum Public { - /// A full raw ECDSA public key. - Full([u8; 64]), - /// A compressed ECDSA public key. - Compressed([u8; 33]), -} +pub struct Public([u8; 33]); impl PartialOrd for Public { fn partial_cmp(&self, other: &Self) -> Option { @@ -90,42 +85,12 @@ pub enum PublicError { } impl Public { - /// A new instance from the given 64-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_raw(data: [u8; 64]) -> Self { - Self::Full(data) - } - - /// A new instance from the given 65-byte `data`. + /// A new instance from the given 33-byte `data`. /// /// NOTE: No checking goes on to ensure this is a real public key. Only use it if /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_full(data: [u8; 65]) -> Self { - let raw_key = &data[1..]; - let mut key = [0u8; 64]; - key.copy_from_slice(raw_key); - Self::Full(key) - } - - /// Return in compressed format. - /// - /// Returns an error if `self` is an invalid full public key. - pub fn as_compressed(&self) -> Result<[u8; 33], ()> { - match self { - Self::Full(d) => secp256k1::PublicKey::parse_slice(d, None) - .map(|k| k.serialize_compressed()) - .map_err(|_| ()), - Self::Compressed(d) => Ok(*d), - } - } - - /// Convert `Self` into a compressed public key. - /// - /// Returns an error if `self` is an invalid full public key. - pub fn into_compressed(self) -> Result { - self.as_compressed().map(Self::Compressed) + pub fn from_raw(data: [u8; 33]) -> Self { + Self(data) } } @@ -135,15 +100,9 @@ impl TraitPublic for Public { /// NOTE: No checking goes on to ensure this is a real public key. Only use it if /// you are certain that the array actually is a pubkey. GIGO! fn from_slice(data: &[u8]) -> Self { - if data.len() == 33 { - let mut r = [0u8; 33]; - r.copy_from_slice(data); - Self::Compressed(r) - } else { - let mut r = [0u8; 64]; - r.copy_from_slice(data); - Self::Full(r) - } + let mut r = [0u8; 33]; + r.copy_from_slice(data); + Self(r) } } @@ -151,25 +110,19 @@ impl Derive for Public {} impl Default for Public { fn default() -> Self { - Public::Full([0u8; 64]) + Public([0u8; 33]) } } impl AsRef<[u8]> for Public { fn as_ref(&self) -> &[u8] { - match self { - Self::Full(d) => &d[..], - Self::Compressed(d) => &d[..], - } + &self.0[..] } } impl AsMut<[u8]> for Public { fn as_mut(&mut self) -> &mut [u8] { - match self { - Self::Full(d) => &mut d[..], - Self::Compressed(d) => &mut d[..], - } + &mut self.0[..] } } @@ -177,10 +130,13 @@ impl sp_std::convert::TryFrom<&[u8]> for Public { type Error = (); fn try_from(data: &[u8]) -> Result { - if data.len() == 33 || data.len() == 64 { + if data.len() == 33 { Ok(Self::from_slice(data)) } else { - Err(()) + secp256k1::PublicKey::parse_slice(data, None) + .map(|k| k.serialize_compressed()) + .map(Self) + .map_err(|_| ()) } } } @@ -192,9 +148,9 @@ impl From for Public { } } -impl UncheckedFrom<[u8; 64]> for Public { - fn unchecked_from(x: [u8; 64]) -> Self { - Public::Full(x) +impl UncheckedFrom<[u8; 33]> for Public { + fn unchecked_from(x: [u8; 33]) -> Self { + Public(x) } } @@ -354,8 +310,9 @@ impl Signature { pub fn recover>(&self, message: M) -> Option { let message = secp256k1::Message::parse(&blake2_256(message.as_ref())); let sig: (_, _) = self.try_into().ok()?; - secp256k1::recover(&message, &sig.0, &sig.1).ok() - .map(|recovered| Public::from_full(recovered.serialize())) + secp256k1::recover(&message, &sig.0, &sig.1) + .ok() + .map(|recovered| Public(recovered.serialize_compressed())) } } @@ -476,7 +433,7 @@ impl TraitPair for Pair { /// Get the public key. fn public(&self) -> Public { - Public::from_full(self.public.serialize()) + Public(self.public.serialize_compressed()) } /// Sign a message. @@ -490,9 +447,7 @@ impl TraitPair for Pair { let message = secp256k1::Message::parse(&blake2_256(message.as_ref())); let sig: (_, _) = match sig.try_into() { Ok(x) => x, _ => return false }; match secp256k1::recover(&message, &sig.0, &sig.1) { - Ok(actual) => pubkey.as_compressed() - .map(|p| &p[..] == &actual.serialize_compressed()[..]) - .unwrap_or(false), + Ok(actual) => &pubkey.0[..] == &actual.serialize_compressed()[..], _ => false, } } @@ -587,9 +542,12 @@ mod test { &hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") ); let public = pair.public(); - assert_eq!(public, Public::from_raw( - hex!("8db55b05db86c0b1786ca49f095d76344c9e6056b2f02701a7e7f3c20aabfd913ebbe148dd17c56551a52952371071a6c604b3f3abe8f2c8fa742158ea6dd7d4") - )); + assert_eq!( + public, + Public::try_from( + &hex!("8db55b05db86c0b1786ca49f095d76344c9e6056b2f02701a7e7f3c20aabfd913ebbe148dd17c56551a52952371071a6c604b3f3abe8f2c8fa742158ea6dd7d4")[..], + ).unwrap(), + ); let message = b""; let signature = hex!("3dde91174bd9359027be59a428b8146513df80a2a3c7eda2194f64de04a69ab97b753169e94db6ffd50921a2668a48b94ca11e3d32c1ff19cfe88890aa7e8f3c00"); let signature = Signature::from_raw(signature); @@ -604,9 +562,12 @@ mod test { None ).unwrap(); let public = pair.public(); - assert_eq!(public, Public::from_raw( - hex!("8db55b05db86c0b1786ca49f095d76344c9e6056b2f02701a7e7f3c20aabfd913ebbe148dd17c56551a52952371071a6c604b3f3abe8f2c8fa742158ea6dd7d4") - )); + assert_eq!( + public, + Public::try_from( + &hex!("8db55b05db86c0b1786ca49f095d76344c9e6056b2f02701a7e7f3c20aabfd913ebbe148dd17c56551a52952371071a6c604b3f3abe8f2c8fa742158ea6dd7d4")[..], + ).unwrap(), + ); let message = b""; let signature = hex!("3dde91174bd9359027be59a428b8146513df80a2a3c7eda2194f64de04a69ab97b753169e94db6ffd50921a2668a48b94ca11e3d32c1ff19cfe88890aa7e8f3c00"); let signature = Signature::from_raw(signature); @@ -628,9 +589,12 @@ mod test { fn seeded_pair_should_work() { let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); - assert_eq!(public, Public::from_raw( - hex!("5676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba995840f3de562156558efbfdac3f16af0065e5f66795f4dd8262a228ef8c6d813") - )); + assert_eq!( + public, + Public::try_from( + &hex!("5676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba995840f3de562156558efbfdac3f16af0065e5f66795f4dd8262a228ef8c6d813")[..], + ).unwrap(), + ); let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); let signature = pair.sign(&message[..]); println!("Correct signature: {:?}", signature); diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 6033f221a1..46930c35e8 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -238,9 +238,7 @@ impl traits::IdentifyAccount for MultiSigner { match self { MultiSigner::Ed25519(who) => <[u8; 32]>::from(who).into(), MultiSigner::Sr25519(who) => <[u8; 32]>::from(who).into(), - MultiSigner::Ecdsa(who) => sp_io::hashing::blake2_256( - &who.as_compressed().expect("`who` is a valid `ECDSA` public key; qed")[..], - ).into(), + MultiSigner::Ecdsa(who) => sp_io::hashing::blake2_256(&who.as_ref()[..]).into(), } } } @@ -724,7 +722,7 @@ mod tests { let multi_signer = MultiSigner::from(pair.public()); assert!(multi_sig.verify(msg, &multi_signer.into_account())); - let multi_signer = MultiSigner::from(pair.public().into_compressed().unwrap()); + let multi_signer = MultiSigner::from(pair.public()); assert!(multi_sig.verify(msg, &multi_signer.into_account())); } } diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index c02856d20d..2547ce1072 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -102,7 +102,7 @@ impl Verify for sp_core::ecdsa::Signature { self.as_ref(), &sp_io::hashing::blake2_256(msg.get()), ) { - Ok(pubkey) => signer.as_compressed().map(|s| &s[..] == &pubkey[..]).unwrap_or(false), + Ok(pubkey) => &signer.as_ref()[..] == &pubkey[..], _ => false, } } @@ -1357,6 +1357,6 @@ mod tests { assert!(ecdsa::Pair::verify(&signature, msg, &pair.public())); assert!(signature.verify(msg, &pair.public())); - assert!(signature.verify(msg, &pair.public().into_compressed().unwrap())); + assert!(signature.verify(msg, &pair.public())); } } -- GitLab From cfbb24cbdbc84410624a84daec55bfe178c7549f Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 20 Jan 2020 19:52:02 +0100 Subject: [PATCH 155/296] Call enable_all() when building tokio runtime (#4690) --- bin/node/cli/src/cli.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index dcc5d39dbb..8156cd766c 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -108,6 +108,7 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re let runtime = RuntimeBuilder::new() .thread_name("main-tokio-") .threaded_scheduler() + .enable_all() .build() .map_err(|e| format!("{:?}", e))?; match config.roles { -- GitLab From cb9c1818f198b946b402652d173bbd76e8fbe7d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 21 Jan 2020 12:33:28 +0100 Subject: [PATCH 156/296] Make debug builds more usable (#4683) * Make debug builds more usable This pr makes debug builds more usable in terms of `cargo run -- --dev`. 1. `--dev` activates `--execution native`, iff `--execution` is not given or no sub `--execution-*` is given. 2. It was probably a mistake to compile WASM in debug for a debug build. So, we now build the WASM binary always as `release` (if not requested differently by the user). So, we trade compilation time for a better debug experience. * Make sure we only overwrite default values * Make it work * Apply suggestion --- Cargo.lock | 2 +- bin/node-template/runtime/build.rs | 2 +- bin/node/cli/src/cli.rs | 7 +++- bin/node/runtime/build.rs | 2 +- client/cli/src/execution_strategy.rs | 24 +++++++++++- client/cli/src/lib.rs | 39 ++++++++++++++----- client/cli/src/params.rs | 11 +++--- client/executor/runtime-test/build.rs | 2 +- .../runtime-interface/test-wasm/build.rs | 2 +- test-utils/runtime/build.rs | 2 +- utils/wasm-builder/Cargo.toml | 2 +- utils/wasm-builder/src/wasm_project.rs | 2 +- 12 files changed, 73 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 630e372dff..8030a4cd13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6973,7 +6973,7 @@ version = "2.0.0" [[package]] name = "substrate-wasm-builder" -version = "1.0.8" +version = "1.0.9" dependencies = [ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/node-template/runtime/build.rs b/bin/node-template/runtime/build.rs index ed0e28ec0d..dc7e949d80 100644 --- a/bin/node-template/runtime/build.rs +++ b/bin/node-template/runtime/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSourc fn main() { build_current_project_with_rustflags( "wasm_binary.rs", - WasmBuilderSource::Crates("1.0.8"), + WasmBuilderSource::Crates("1.0.9"), // This instructs LLD to export __heap_base as a global variable, which is used by the // external memory allocator. "-Clink-arg=--export=__heap_base", diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 8156cd766c..6a2e02efb6 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -141,7 +141,12 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re &version, None, )?; - sc_cli::fill_import_params(&mut config, &cli_args.import_params, ServiceRoles::FULL)?; + sc_cli::fill_import_params( + &mut config, + &cli_args.import_params, + ServiceRoles::FULL, + cli_args.shared_params.dev, + )?; match ChainSpec::from(config.chain_spec.id()) { Some(ref c) if c == &ChainSpec::Development || c == &ChainSpec::LocalTestnet => {}, diff --git a/bin/node/runtime/build.rs b/bin/node/runtime/build.rs index 1ed2fa43e6..9c81ea6f38 100644 --- a/bin/node/runtime/build.rs +++ b/bin/node/runtime/build.rs @@ -21,7 +21,7 @@ fn main() { "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../../utils/wasm-builder", - version: "1.0.8", + version: "1.0.9", }, // This instructs LLD to export __heap_base as a global variable, which is used by the // external memory allocator. diff --git a/client/cli/src/execution_strategy.rs b/client/cli/src/execution_strategy.rs index fe353da80d..888d7b6c4a 100644 --- a/client/cli/src/execution_strategy.rs +++ b/client/cli/src/execution_strategy.rs @@ -20,7 +20,7 @@ use structopt::clap::arg_enum; arg_enum! { /// How to execute blocks - #[derive(Debug, Clone, Copy)] + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ExecutionStrategy { // Execute with native build (if available, WebAssembly otherwise). Native, @@ -33,3 +33,25 @@ arg_enum! { } } +impl ExecutionStrategy { + /// Returns the variant as `'&static str`. + pub fn as_str(&self) -> &'static str { + match self { + Self::Native => "Native", + Self::Wasm => "Wasm", + Self::Both => "Both", + Self::NativeElseWasm => "NativeElseWasm", + } + } +} + +/// Default value for the `--execution-syncing` parameter. +pub const DEFAULT_EXECUTION_SYNCING: ExecutionStrategy = ExecutionStrategy::NativeElseWasm; +/// Default value for the `--execution-import-block` parameter. +pub const DEFAULT_EXECUTION_IMPORT_BLOCK: ExecutionStrategy = ExecutionStrategy::NativeElseWasm; +/// Default value for the `--execution-block-construction` parameter. +pub const DEFAULT_EXECUTION_BLOCK_CONSTRUCTION: ExecutionStrategy = ExecutionStrategy::Wasm; +/// Default value for the `--execution-offchain-worker` parameter. +pub const DEFAULT_EXECUTION_OFFCHAIN_WORKER: ExecutionStrategy = ExecutionStrategy::Native; +/// Default value for the `--execution-other` parameter. +pub const DEFAULT_EXECUTION_OTHER: ExecutionStrategy = ExecutionStrategy::Native; diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 52a3fc46ec..fc50259528 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -40,6 +40,7 @@ use sc_network::{ }, }; use sp_core::H256; +use execution_strategy::*; use std::{ io::{Write, Read, Seek, Cursor, stdin, stdout, ErrorKind}, iter, fmt::Debug, fs::{self, File}, @@ -556,7 +557,12 @@ impl<'a> ParseAndPrepareImport<'a> { self.version, None, )?; - fill_import_params(&mut config, &self.params.import_params, sc_service::Roles::FULL)?; + fill_import_params( + &mut config, + &self.params.import_params, + sc_service::Roles::FULL, + self.params.shared_params.dev, + )?; let file: Box = match self.params.input { Some(filename) => Box::new(File::open(filename)?), @@ -620,7 +626,12 @@ impl<'a> CheckBlock<'a> { self.version, None, )?; - fill_import_params(&mut config, &self.params.import_params, sc_service::Roles::FULL)?; + fill_import_params( + &mut config, + &self.params.import_params, + sc_service::Roles::FULL, + self.params.shared_params.dev, + )?; fill_config_keystore_in_memory(&mut config)?; let input = if self.params.input.starts_with("0x") { &self.params.input[2..] } else { &self.params.input[..] }; @@ -904,6 +915,7 @@ pub fn fill_import_params( config: &mut Configuration, cli: &ImportParams, role: sc_service::Roles, + is_dev: bool, ) -> error::Result<()> where C: Default, @@ -943,13 +955,22 @@ pub fn fill_import_params( config.wasm_method = cli.wasm_method.into(); let exec = &cli.execution_strategies; - let exec_all_or = |strat: ExecutionStrategy| exec.execution.unwrap_or(strat).into(); + let exec_all_or = |strat: ExecutionStrategy, default: ExecutionStrategy| { + exec.execution.unwrap_or(if strat == default && is_dev { + ExecutionStrategy::Native + } else { + strat + }).into() + }; + config.execution_strategies = ExecutionStrategies { - syncing: exec_all_or(exec.execution_syncing), - importing: exec_all_or(exec.execution_import_block), - block_construction: exec_all_or(exec.execution_block_construction), - offchain_worker: exec_all_or(exec.execution_offchain_worker), - other: exec_all_or(exec.execution_other), + syncing: exec_all_or(exec.execution_syncing, DEFAULT_EXECUTION_SYNCING), + importing: exec_all_or(exec.execution_import_block, DEFAULT_EXECUTION_IMPORT_BLOCK), + block_construction: + exec_all_or(exec.execution_block_construction, DEFAULT_EXECUTION_BLOCK_CONSTRUCTION), + offchain_worker: + exec_all_or(exec.execution_offchain_worker, DEFAULT_EXECUTION_OFFCHAIN_WORKER), + other: exec_all_or(exec.execution_other, DEFAULT_EXECUTION_OTHER), }; Ok(()) } @@ -987,7 +1008,7 @@ where sc_service::Roles::FULL }; - fill_import_params(&mut config, &cli.import_params, role)?; + fill_import_params(&mut config, &cli.import_params, role, is_dev)?; config.impl_name = impl_name; config.impl_commit = version.commit; diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 07fbe9b738..57b90c2e73 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -18,6 +18,7 @@ use crate::traits::GetSharedParams; use std::{str::FromStr, path::PathBuf}; use structopt::{StructOpt, StructOptInternal, clap::{arg_enum, App, AppSettings, SubCommand, Arg}}; +use crate::execution_strategy::*; pub use crate::execution_strategy::ExecutionStrategy; @@ -321,7 +322,7 @@ pub struct ExecutionStrategies { value_name = "STRATEGY", possible_values = &ExecutionStrategy::variants(), case_insensitive = true, - default_value = "NativeElseWasm" + default_value = DEFAULT_EXECUTION_SYNCING.as_str(), )] pub execution_syncing: ExecutionStrategy, @@ -331,7 +332,7 @@ pub struct ExecutionStrategies { value_name = "STRATEGY", possible_values = &ExecutionStrategy::variants(), case_insensitive = true, - default_value = "NativeElseWasm" + default_value = DEFAULT_EXECUTION_IMPORT_BLOCK.as_str(), )] pub execution_import_block: ExecutionStrategy, @@ -341,7 +342,7 @@ pub struct ExecutionStrategies { value_name = "STRATEGY", possible_values = &ExecutionStrategy::variants(), case_insensitive = true, - default_value = "Wasm" + default_value = DEFAULT_EXECUTION_BLOCK_CONSTRUCTION.as_str(), )] pub execution_block_construction: ExecutionStrategy, @@ -351,7 +352,7 @@ pub struct ExecutionStrategies { value_name = "STRATEGY", possible_values = &ExecutionStrategy::variants(), case_insensitive = true, - default_value = "Native" + default_value = DEFAULT_EXECUTION_OFFCHAIN_WORKER.as_str(), )] pub execution_offchain_worker: ExecutionStrategy, @@ -361,7 +362,7 @@ pub struct ExecutionStrategies { value_name = "STRATEGY", possible_values = &ExecutionStrategy::variants(), case_insensitive = true, - default_value = "Native" + default_value = DEFAULT_EXECUTION_OTHER.as_str(), )] pub execution_other: ExecutionStrategy, diff --git a/client/executor/runtime-test/build.rs b/client/executor/runtime-test/build.rs index 1ed2fa43e6..9c81ea6f38 100644 --- a/client/executor/runtime-test/build.rs +++ b/client/executor/runtime-test/build.rs @@ -21,7 +21,7 @@ fn main() { "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../../utils/wasm-builder", - version: "1.0.8", + version: "1.0.9", }, // This instructs LLD to export __heap_base as a global variable, which is used by the // external memory allocator. diff --git a/primitives/runtime-interface/test-wasm/build.rs b/primitives/runtime-interface/test-wasm/build.rs index 8e1d17e821..9c81ea6f38 100644 --- a/primitives/runtime-interface/test-wasm/build.rs +++ b/primitives/runtime-interface/test-wasm/build.rs @@ -21,7 +21,7 @@ fn main() { "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../../utils/wasm-builder", - version: "1.0.6", + version: "1.0.9", }, // This instructs LLD to export __heap_base as a global variable, which is used by the // external memory allocator. diff --git a/test-utils/runtime/build.rs b/test-utils/runtime/build.rs index a90270d85d..8a9ee642c4 100644 --- a/test-utils/runtime/build.rs +++ b/test-utils/runtime/build.rs @@ -21,7 +21,7 @@ fn main() { "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../utils/wasm-builder", - version: "1.0.8", + version: "1.0.9", }, // Note that we set the stack-size to 1MB explicitly even though it is set // to this value by default. This is because some of our tests (`restoration_of_globals`) diff --git a/utils/wasm-builder/Cargo.toml b/utils/wasm-builder/Cargo.toml index 66d94c32ab..5941a39ffb 100644 --- a/utils/wasm-builder/Cargo.toml +++ b/utils/wasm-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-wasm-builder" -version = "1.0.8" +version = "1.0.9" authors = ["Parity Technologies "] description = "Utility for building WASM binaries" edition = "2018" diff --git a/utils/wasm-builder/src/wasm_project.rs b/utils/wasm-builder/src/wasm_project.rs index a028d00930..c9b573ff19 100644 --- a/utils/wasm-builder/src/wasm_project.rs +++ b/utils/wasm-builder/src/wasm_project.rs @@ -357,7 +357,7 @@ fn is_release_build() -> bool { ), } } else { - !build_helper::debug() + true } } -- GitLab From f52ea97fb6074598e64989711f9b882418d087c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Tue, 21 Jan 2020 11:45:36 +0000 Subject: [PATCH 157/296] grandpa: reduce allocations when verifying multiple messages (#4693) --- .../finality-grandpa/src/communication/mod.rs | 66 +++++++++++++++++-- client/finality-grandpa/src/justification.rs | 4 +- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 7723047d1b..5077d435e8 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -600,8 +600,28 @@ impl> Clone for NetworkBridge { } } -pub(crate) fn localized_payload(round: RoundNumber, set_id: SetIdNumber, message: &E) -> Vec { - (message, round, set_id).encode() +/// Encode round message localized to a given round and set id. +pub(crate) fn localized_payload( + round: RoundNumber, + set_id: SetIdNumber, + message: &E, +) -> Vec { + let mut buf = Vec::new(); + localized_payload_with_buffer(round, set_id, message, &mut buf); + buf +} + +/// Encode round message localized to a given round and set id using the given +/// buffer. The given buffer will be cleared and the resulting encoded payload +/// will always be written to the start of the buffer. +pub(crate) fn localized_payload_with_buffer( + round: RoundNumber, + set_id: SetIdNumber, + message: &E, + buf: &mut Vec, +) { + buf.clear(); + (message, round, set_id).encode_to(buf) } /// Type-safe wrapper around a round number. @@ -612,17 +632,41 @@ pub struct Round(pub RoundNumber); #[derive(Debug, Clone, Copy, Eq, PartialEq, PartialOrd, Ord, Encode, Decode)] pub struct SetId(pub SetIdNumber); -// check a message. +/// Check a message signature by encoding the message as a localized payload and +/// verifying the provided signature using the expected authority id. pub(crate) fn check_message_sig( message: &Message, id: &AuthorityId, signature: &AuthoritySignature, round: RoundNumber, set_id: SetIdNumber, +) -> Result<(), ()> { + check_message_sig_with_buffer::( + message, + id, + signature, + round, + set_id, + &mut Vec::new(), + ) +} + +/// Check a message signature by encoding the message as a localized payload and +/// verifying the provided signature using the expected authority id. +/// The encoding necessary to verify the signature will be done using the given +/// buffer, the original content of the buffer will be cleared. +pub(crate) fn check_message_sig_with_buffer( + message: &Message, + id: &AuthorityId, + signature: &AuthoritySignature, + round: RoundNumber, + set_id: SetIdNumber, + buf: &mut Vec, ) -> Result<(), ()> { let as_public = id.clone(); - let encoded_raw = localized_payload(round, set_id, message); - if AuthorityPair::verify(signature, &encoded_raw, &as_public) { + localized_payload_with_buffer(round, set_id, message, buf); + + if AuthorityPair::verify(signature, buf, &as_public) { Ok(()) } else { debug!(target: "afg", "Bad signature on message from {:?}", id); @@ -752,6 +796,7 @@ fn check_compact_commit( } // check signatures on all contained precommits. + let mut buf = Vec::new(); for (i, (precommit, &(ref sig, ref id))) in msg.precommits.iter() .zip(&msg.auth_data) .enumerate() @@ -759,12 +804,13 @@ fn check_compact_commit( use crate::communication::gossip::Misbehavior; use finality_grandpa::Message as GrandpaMessage; - if let Err(()) = check_message_sig::( + if let Err(()) = check_message_sig_with_buffer::( &GrandpaMessage::Precommit(precommit.clone()), id, sig, round.0, set_id.0, + &mut buf, ) { debug!(target: "afg", "Bad commit message signature {}", id); telemetry!(CONSENSUS_DEBUG; "afg.bad_commit_msg_signature"; "id" => ?id); @@ -836,6 +882,7 @@ fn check_catch_up( round: RoundNumber, set_id: SetIdNumber, mut signatures_checked: usize, + buf: &mut Vec, ) -> Result where B: BlockT, I: Iterator, &'a AuthorityId, &'a AuthoritySignature)>, @@ -845,12 +892,13 @@ fn check_catch_up( for (msg, id, sig) in messages { signatures_checked += 1; - if let Err(()) = check_message_sig::( + if let Err(()) = check_message_sig_with_buffer::( &msg, id, sig, round, set_id, + buf, ) { debug!(target: "afg", "Bad catch up message signature {}", id); telemetry!(CONSENSUS_DEBUG; "afg.bad_catch_up_msg_signature"; "id" => ?id); @@ -866,6 +914,8 @@ fn check_catch_up( Ok(signatures_checked) } + let mut buf = Vec::new(); + // check signatures on all contained prevotes. let signatures_checked = check_signatures::( msg.prevotes.iter().map(|vote| { @@ -874,6 +924,7 @@ fn check_catch_up( msg.round_number, set_id.0, 0, + &mut buf, )?; // check signatures on all contained precommits. @@ -884,6 +935,7 @@ fn check_catch_up( msg.round_number, set_id.0, signatures_checked, + &mut buf, )?; Ok(()) diff --git a/client/finality-grandpa/src/justification.rs b/client/finality-grandpa/src/justification.rs index 308056725f..ad96956454 100644 --- a/client/finality-grandpa/src/justification.rs +++ b/client/finality-grandpa/src/justification.rs @@ -132,14 +132,16 @@ impl GrandpaJustification { } } + let mut buf = Vec::new(); let mut visited_hashes = HashSet::new(); for signed in self.commit.precommits.iter() { - if let Err(_) = communication::check_message_sig::( + if let Err(_) = communication::check_message_sig_with_buffer::( &finality_grandpa::Message::Precommit(signed.precommit.clone()), &signed.id, &signed.signature, self.round, set_id, + &mut buf, ) { return Err(ClientError::BadJustification( "invalid signature for precommit in grandpa justification".to_string()).into()); -- GitLab From 6ee1244e2d018333746d82131222308e0d802e6a Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 21 Jan 2020 13:06:15 +0100 Subject: [PATCH 158/296] Pass an executor through the Configuration (#4688) * Pass an executor through the Configuration * Make tasks_executor mandatory * Fix tests --- bin/node-template/src/cli.rs | 6 +++++- bin/node/cli/src/cli.rs | 6 +++++- client/service/src/builder.rs | 6 +++++- client/service/src/config.rs | 6 ++++-- client/service/src/error.rs | 3 +++ client/service/src/lib.rs | 25 ++++--------------------- client/service/test/src/lib.rs | 21 +++++++++++++++++++-- utils/browser/src/lib.rs | 3 +++ 8 files changed, 48 insertions(+), 28 deletions(-) diff --git a/bin/node-template/src/cli.rs b/bin/node-template/src/cli.rs index 44764e5c9d..fcfd330816 100644 --- a/bin/node-template/src/cli.rs +++ b/bin/node-template/src/cli.rs @@ -18,7 +18,7 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> type Config = Configuration<(), T>; match parse_and_prepare::(&version, "substrate-node", args) { ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, - |exit, _cli_args, _custom_args, config: Config<_>| { + |exit, _cli_args, _custom_args, mut config: Config<_>| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by {}, 2017, 2018", version.author); @@ -26,6 +26,10 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> info!("Node name: {}", config.name); info!("Roles: {}", display_role(&config)); let runtime = Runtime::new().map_err(|e| format!("{:?}", e))?; + config.tasks_executor = { + let runtime_handle = runtime.handle().clone(); + Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) + }; match config.roles { ServiceRoles::LIGHT => run_until_exit( runtime, diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 6a2e02efb6..5ade700513 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -98,7 +98,7 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re match parse_and_prepare::(&version, "substrate-node", args) { ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, - |exit, _cli_args, _custom_args, config: Config<_, _>| { + |exit, _cli_args, _custom_args, mut config: Config<_, _>| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017-2019"); @@ -111,6 +111,10 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re .enable_all() .build() .map_err(|e| format!("{:?}", e))?; + config.tasks_executor = { + let runtime_handle = runtime.handle().clone(); + Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) + }; match config.roles { ServiceRoles::LIGHT => run_until_exit( runtime, diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 5449b00b06..044798701c 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -1147,7 +1147,11 @@ ServiceBuilder< essential_failed_rx, to_spawn_tx, to_spawn_rx, - to_poll: Vec::new(), + tasks_executor: if let Some(exec) = config.tasks_executor { + exec + } else { + return Err(Error::TasksExecutorRequired); + }, rpc_handlers, _rpc: rpc, _telemetry: telemetry, diff --git a/client/service/src/config.rs b/client/service/src/config.rs index 75c6268214..8a145dec16 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -21,7 +21,7 @@ pub use sc_client_db::{kvdb::KeyValueDB, PruningMode}; pub use sc_network::config::{ExtTransport, NetworkConfiguration, Roles}; pub use sc_executor::WasmExecutionMethod; -use std::{path::{PathBuf, Path}, net::SocketAddr, sync::Arc}; +use std::{future::Future, path::{PathBuf, Path}, pin::Pin, net::SocketAddr, sync::Arc}; pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; use sc_chain_spec::{ChainSpec, RuntimeGenesis, Extension, NoExtension}; use sp_core::crypto::Protected; @@ -29,7 +29,6 @@ use target_info::Target; use sc_telemetry::TelemetryEndpoints; /// Service configuration. -#[derive(Clone)] pub struct Configuration { /// Implementation name pub impl_name: &'static str, @@ -39,6 +38,8 @@ pub struct Configuration { pub impl_commit: &'static str, /// Node roles. pub roles: Roles, + /// How to spawn background tasks. Mandatory, otherwise creating a `Service` will error. + pub tasks_executor: Option + Send>>) + Send>>, /// Extrinsic pool configuration. pub transaction_pool: TransactionPoolOptions, /// Network configuration. @@ -160,6 +161,7 @@ impl Configuration where config_dir: config_dir.clone(), name: Default::default(), roles: Roles::FULL, + tasks_executor: None, transaction_pool: Default::default(), network: Default::default(), keystore: KeystoreConfig::None, diff --git a/client/service/src/error.rs b/client/service/src/error.rs index 6516b1c62c..14b03d7e95 100644 --- a/client/service/src/error.rs +++ b/client/service/src/error.rs @@ -40,6 +40,9 @@ pub enum Error { /// Best chain selection strategy is missing. #[display(fmt="Best chain selection strategy (SelectChain) is not provided.")] SelectChainRequired, + /// Tasks executor is missing. + #[display(fmt="Tasks executor hasn't been provided.")] + TasksExecutorRequired, /// Other error. Other(String), } diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 87327d0967..c1b87e4491 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -38,7 +38,7 @@ use parking_lot::Mutex; use sc_client::Client; use exit_future::Signal; use futures::{ - Future, FutureExt, Stream, StreamExt, TryFutureExt, + Future, FutureExt, Stream, StreamExt, future::select, channel::mpsc, compat::*, sink::SinkExt, @@ -95,10 +95,8 @@ pub struct Service { to_spawn_tx: mpsc::UnboundedSender + Send>>>, /// Receiver for futures that must be spawned as background tasks. to_spawn_rx: mpsc::UnboundedReceiver + Send>>>, - /// List of futures to poll from `poll`. - /// If spawning a background task is not possible, we instead push the task into this `Vec`. - /// The elements must then be polled manually. - to_poll: Vec + Send>>>, + /// How to spawn background tasks. + tasks_executor: Box + Send>>) + Send>, rpc_handlers: sc_rpc_server::RpcHandler, _rpc: Box, _telemetry: Option, @@ -322,22 +320,7 @@ impl Future for } while let Poll::Ready(Some(task_to_spawn)) = Pin::new(&mut this.to_spawn_rx).poll_next(cx) { - // TODO: Update to tokio 0.2 when libp2p get switched to std futures (#4383) - let executor = tokio_executor::DefaultExecutor::current(); - use futures01::future::Executor; - if let Err(err) = executor.execute(task_to_spawn.unit_error().compat()) { - debug!( - target: "service", - "Failed to spawn background task: {:?}; falling back to manual polling", - err - ); - this.to_poll.push(Box::pin(err.into_future().compat().map(drop))); - } - } - - // Polling all the `to_poll` futures. - while let Some(pos) = this.to_poll.iter_mut().position(|t| Pin::new(t).poll(cx).is_ready()) { - let _ = this.to_poll.remove(pos); + (this.tasks_executor)(task_to_spawn); } // The service future never ends. diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index dd6395e9c6..961c8d98ff 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -19,9 +19,11 @@ use std::iter; use std::sync::{Arc, Mutex, MutexGuard}; use std::net::Ipv4Addr; +use std::pin::Pin; use std::time::Duration; use log::info; use futures01::{Future, Stream, Poll}; +use futures::{FutureExt as _, TryFutureExt as _}; use tempfile::TempDir; use tokio::{runtime::Runtime, prelude::FutureExt}; use tokio::timer::Interval; @@ -131,6 +133,7 @@ fn node_config ( index: usize, spec: &ChainSpec, role: Roles, + tasks_executor: Box + Send>>) + Send>, key_seed: Option, base_port: u16, root: &TempDir, @@ -172,6 +175,7 @@ fn node_config ( impl_version: "0.1", impl_commit: "", roles: role, + tasks_executor: Some(tasks_executor), transaction_pool: Default::default(), network: network_config, keystore: KeystoreConfig::Path { @@ -251,10 +255,15 @@ impl TestNet where let executor = self.runtime.executor(); for (key, authority) in authorities { + let tasks_executor = { + let executor = executor.clone(); + Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) + }; let node_config = node_config( self.nodes, &self.chain_spec, Roles::AUTHORITY, + tasks_executor, Some(key), self.base_port, &temp, @@ -270,7 +279,11 @@ impl TestNet where } for full in full { - let node_config = node_config(self.nodes, &self.chain_spec, Roles::FULL, None, self.base_port, &temp); + let tasks_executor = { + let executor = executor.clone(); + Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) + }; + let node_config = node_config(self.nodes, &self.chain_spec, Roles::FULL, tasks_executor, None, self.base_port, &temp); let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let (service, user_data) = full(node_config).expect("Error creating test node service"); let service = SyncService::from(service); @@ -282,7 +295,11 @@ impl TestNet where } for light in light { - let node_config = node_config(self.nodes, &self.chain_spec, Roles::LIGHT, None, self.base_port, &temp); + let tasks_executor = { + let executor = executor.clone(); + Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) + }; + let node_config = node_config(self.nodes, &self.chain_spec, Roles::LIGHT, tasks_executor, None, self.base_port, &temp); let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(light(node_config).expect("Error creating test node service")); diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs index 0dbde57182..7b7fda4583 100644 --- a/utils/browser/src/lib.rs +++ b/utils/browser/src/lib.rs @@ -52,6 +52,9 @@ where allow_private_ipv4: true, enable_mdns: false, }; + config.tasks_executor = Some(Box::new(move |fut| { + wasm_bindgen_futures::spawn_local(fut) + })); config.telemetry_external_transport = Some(transport); config.roles = Roles::LIGHT; config.name = format!("{} (Browser)", name); -- GitLab From 14720148ee5a07911fbba8c91ffd9f4490bded68 Mon Sep 17 00:00:00 2001 From: Hero Bird Date: Tue, 21 Jan 2020 13:06:54 +0100 Subject: [PATCH 159/296] contracts: New contract events + unconfusions (#4685) * contracts: during execution -> contract trapped during execution This message confused many people so we are improving it to make clear what happened. * contracts: rename Event::Contract -> Event::ContractExecution * contracts: fix tests after ContractExecution renaming * contracts: Add Evicted and Restored events * fix doc comment * wrap to not go over (soft) 100 column line limit * add event deposit for eventual eviction upon pay_rent * contracts: adjust tests for the new events * emit Evicted event immediately and add tombstone flag bool --- frame/contracts/src/exec.rs | 2 +- frame/contracts/src/lib.rs | 30 ++++++++- frame/contracts/src/rent.rs | 6 +- frame/contracts/src/tests.rs | 98 +++++++++++++++++++++++++++-- frame/contracts/src/wasm/mod.rs | 6 +- frame/contracts/src/wasm/runtime.rs | 2 +- 6 files changed, 131 insertions(+), 13 deletions(-) diff --git a/frame/contracts/src/exec.rs b/frame/contracts/src/exec.rs index 2c77173135..9d786c320b 100644 --- a/frame/contracts/src/exec.rs +++ b/frame/contracts/src/exec.rs @@ -782,7 +782,7 @@ where fn deposit_event(&mut self, topics: Vec, data: Vec) { self.ctx.deferred.push(DeferredAction::DepositEvent { topics, - event: RawEvent::Contract(self.ctx.self_account.clone(), data), + event: RawEvent::ContractExecution(self.ctx.self_account.clone(), data), }); } diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index df8da88660..40ce86518a 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -786,7 +786,12 @@ impl Module { rent_allowance, delta, } => { - let _result = Self::restore_to(donor, dest, code_hash, rent_allowance, delta); + let result = Self::restore_to( + donor.clone(), dest.clone(), code_hash.clone(), rent_allowance.clone(), delta + ); + Self::deposit_event( + RawEvent::Restored(donor, dest, code_hash, rent_allowance, result.is_ok()) + ); } } }); @@ -896,6 +901,25 @@ decl_event! { /// Contract deployed by address at the specified address. Instantiated(AccountId, AccountId), + /// Contract has been evicted and is now in tombstone state. + /// + /// # Params + /// + /// - `contract`: `AccountId`: The account ID of the evicted contract. + /// - `tombstone`: `bool`: True if the evicted contract left behind a tombstone. + Evicted(AccountId, bool), + + /// Restoration for a contract has been initiated. + /// + /// # Params + /// + /// - `donor`: `AccountId`: Account ID of the restoring contract + /// - `dest`: `AccountId`: Account ID of the restored contract + /// - `code_hash`: `Hash`: Code hash of the restored contract + /// - `rent_allowance: `Balance`: Rent allowance of the restored contract + /// - `success`: `bool`: True if the restoration was successful + Restored(AccountId, AccountId, Hash, Balance, bool), + /// Code with the specified hash has been stored. CodeStored(Hash), @@ -906,8 +930,8 @@ decl_event! { /// successful execution or not. Dispatched(AccountId, bool), - /// An event from contract of account. - Contract(AccountId, Vec), + /// An event deposited upon execution of a contract from the account. + ContractExecution(AccountId, Vec), } } diff --git a/frame/contracts/src/rent.rs b/frame/contracts/src/rent.rs index 59c8b02d19..508511da4c 100644 --- a/frame/contracts/src/rent.rs +++ b/frame/contracts/src/rent.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::{BalanceOf, ContractInfo, ContractInfoOf, TombstoneContractInfo, Trait, AliveContractInfo}; +use crate::{Module, RawEvent, BalanceOf, ContractInfo, ContractInfoOf, TombstoneContractInfo, + Trait, AliveContractInfo}; use sp_runtime::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, SaturatedConversion}; use frame_support::traits::{Currency, ExistenceRequirement, Get, WithdrawReason, OnUnbalanced}; @@ -101,6 +102,7 @@ fn try_evict_or_and_pay_rent( // The contract cannot afford to leave a tombstone, so remove the contract info altogether. >::remove(account); child::kill_storage(&contract.trie_id, contract.child_trie_unique_id()); + >::deposit_event(RawEvent::Evicted(account.clone(), false)); return (RentOutcome::Evicted, None); } @@ -160,6 +162,8 @@ fn try_evict_or_and_pay_rent( child::kill_storage(&contract.trie_id, contract.child_trie_unique_id()); + >::deposit_event(RawEvent::Evicted(account.clone(), true)); + return (RentOutcome::Evicted, Some(tombstone_info)); } diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 91679a9216..9a2ef36bb8 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -453,7 +453,7 @@ fn instantiate_and_call_and_deposit_event() { }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Contract(BOB, vec![1, 2, 3, 4])), + event: MetaEvent::contract(RawEvent::ContractExecution(BOB, vec![1, 2, 3, 4])), topics: vec![], }, EventRecord { @@ -650,7 +650,7 @@ fn dispatch_call_not_dispatched_after_top_level_transaction_failure() { 100_000, vec![], ), - "during execution" + "contract trapped during execution" ); assert_eq!(System::events(), vec![ EventRecord { @@ -1139,8 +1139,16 @@ fn call_removed_contract() { Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null()), "contract has been evicted" ); + // Calling a contract that is about to evict shall emit an event. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::Evicted(BOB, true)), + topics: vec![], + }, + ]); - // Subsequent contract calls should also fail. + // Subsequent contract calls should also fail. assert_err!( Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null()), "contract has been evicted" @@ -1367,6 +1375,9 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: // Advance 4 blocks, to the 5th. initialize_block(5); + /// Preserve `BOB`'s code hash for later introspection. + let bob_code_hash = ContractInfoOf::::get(BOB).unwrap() + .get_alive().unwrap().code_hash; // Call `BOB`, which makes it pay rent. Since the rent allowance is set to 0 // we expect that it will get removed leaving tombstone. assert_err!( @@ -1374,6 +1385,15 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: "contract has been evicted" ); assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract( + RawEvent::Evicted(BOB.clone(), true) + ), + topics: vec![], + }, + ]); /// Create another account with the address `DJANGO` with `CODE_RESTORATION`. /// @@ -1416,6 +1436,60 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: 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()); + match (test_different_storage, test_restore_to_with_dirty_storage) { + (true, false) => { + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract( + RawEvent::Restored(DJANGO, BOB, bob_code_hash, 50, false) + ), + topics: vec![], + }, + ]); + } + (_, true) => { + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::Evicted(BOB, true)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(pallet_balances::RawEvent::NewAccount(CHARLIE, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(pallet_balances::RawEvent::NewAccount(DJANGO, 30_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::Transfer(CHARLIE, DJANGO, 30_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::Instantiated(CHARLIE, DJANGO)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::Restored( + DJANGO, + BOB, + bob_code_hash, + 50, + false, + )), + topics: vec![], + }, + ]); + } + _ => unreachable!(), + } } else { // Here we expect that the restoration is succeeded. Check that the restoration // contract `DJANGO` ceased to exist and that `BOB` returned back. @@ -1427,6 +1501,20 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: assert_eq!(bob_contract.trie_id, django_trie_id); assert_eq!(bob_contract.deduct_block, System::block_number()); assert!(ContractInfoOf::::get(DJANGO).is_none()); + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(balances::RawEvent::ReapedAccount(DJANGO, 0)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract( + RawEvent::Restored(DJANGO, BOB, bob_contract.code_hash, 50, true) + ), + topics: vec![], + }, + ]); } }); } @@ -1533,7 +1621,7 @@ fn storage_max_value_limit() { 100_000, Encode::encode(&(self::MaxValueSize::get() + 1)), ), - "during execution" + "contract trapped during execution" ); }); } @@ -2056,7 +2144,7 @@ fn cannot_self_destruct_while_live() { 100_000, vec![0], ), - "during execution" + "contract trapped during execution" ); // Check that BOB is still alive. diff --git a/frame/contracts/src/wasm/mod.rs b/frame/contracts/src/wasm/mod.rs index 8e02eb482b..60402cf3a0 100644 --- a/frame/contracts/src/wasm/mod.rs +++ b/frame/contracts/src/wasm/mod.rs @@ -1430,7 +1430,9 @@ mod tests { MockExt::default(), &mut gas_meter ), - Err(ExecError { reason: DispatchError::Other("during execution"), buffer: _ }) + Err(ExecError { + reason: DispatchError::Other("contract trapped during execution"), buffer: _ + }) ); } @@ -1472,7 +1474,7 @@ mod tests { MockExt::default(), &mut gas_meter ), - Err(ExecError { reason: DispatchError::Other("during execution"), buffer: _ }) + Err(ExecError { reason: DispatchError::Other("contract trapped during execution"), buffer: _ }) ); } diff --git a/frame/contracts/src/wasm/runtime.rs b/frame/contracts/src/wasm/runtime.rs index 81b0809f82..75751b6d35 100644 --- a/frame/contracts/src/wasm/runtime.rs +++ b/frame/contracts/src/wasm/runtime.rs @@ -109,7 +109,7 @@ pub(crate) fn to_execution_result( Err(ExecError { reason: "validation error".into(), buffer: runtime.scratch_buf }), // Any other kind of a trap should result in a failure. Err(sp_sandbox::Error::Execution) | Err(sp_sandbox::Error::OutOfBounds) => - Err(ExecError { reason: "during execution".into(), buffer: runtime.scratch_buf }), + Err(ExecError { reason: "contract trapped during execution".into(), buffer: runtime.scratch_buf }), } } -- GitLab From ef970571ccd87d973a6a359bf709a357303161dc Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Tue, 21 Jan 2020 08:01:55 -0800 Subject: [PATCH 160/296] fix docs deadlinks (#4698) --- client/consensus/slots/src/lib.rs | 2 +- client/src/lib.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/consensus/slots/src/lib.rs b/client/consensus/slots/src/lib.rs index 3aa243af72..c6185d5d30 100644 --- a/client/consensus/slots/src/lib.rs +++ b/client/consensus/slots/src/lib.rs @@ -45,7 +45,7 @@ use parking_lot::Mutex; /// The changes that need to applied to the storage to create the state for a block. /// -/// See [`state_machine::StorageChanges`] for more information. +/// See [`sp_state_machine::StorageChanges`] for more information. pub type StorageChanges = sp_state_machine::StorageChanges, NumberFor>; diff --git a/client/src/lib.rs b/client/src/lib.rs index db2d4785a2..8aa71c5ec5 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -20,20 +20,20 @@ //! parts: //! //! - A database containing the blocks and chain state, generally referred to as -//! the [`Backend`](backend::Backend). +//! the [`Backend`](sc_client_api::backend::Backend). //! - A runtime environment, generally referred to as the [`Executor`](CallExecutor). //! //! # Initialization //! //! Creating a [`Client`] is done by calling the `new` method and passing to it a -//! [`Backend`](backend::Backend) and an [`Executor`](CallExecutor). +//! [`Backend`](sc_client_api::backend::Backend) and an [`Executor`](CallExecutor). //! //! The former is typically provided by the `sc-client-db` crate. //! //! The latter typically requires passing one of: //! //! - A [`LocalCallExecutor`] running the runtime locally. -//! - A [`RemoteCallExecutor`](light::call_executor::RemoteCallExecutor) that will ask a +//! - A [`RemoteCallExecutor`](light::call_executor::RemoteCallRequest) that will ask a //! third-party to perform the executions. //! - A [`RemoteOrLocalCallExecutor`](light::call_executor::RemoteOrLocalCallExecutor), combination //! of the two. -- GitLab From 4b2f70f8476a8c4092df952e549090268f936d1d Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Tue, 21 Jan 2020 13:10:26 -0800 Subject: [PATCH 161/296] remove license preamble from node-template (#4699) --- bin/node-template/runtime/build.rs | 16 ---------------- bin/node-template/src/main.rs | 2 -- 2 files changed, 18 deletions(-) diff --git a/bin/node-template/runtime/build.rs b/bin/node-template/runtime/build.rs index dc7e949d80..8bdf7584bb 100644 --- a/bin/node-template/runtime/build.rs +++ b/bin/node-template/runtime/build.rs @@ -1,19 +1,3 @@ -// Copyright 2019-2020 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 wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { diff --git a/bin/node-template/src/main.rs b/bin/node-template/src/main.rs index 2942bb68a3..ea64bc1413 100644 --- a/bin/node-template/src/main.rs +++ b/bin/node-template/src/main.rs @@ -1,7 +1,5 @@ //! Substrate Node Template CLI library. - #![warn(missing_docs)] -#![warn(unused_extern_crates)] mod chain_spec; #[macro_use] -- GitLab From cf020addf0e2d9d5fdaa7a34aa83b380f49471bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Tue, 21 Jan 2020 21:14:44 +0000 Subject: [PATCH 162/296] grandpa: filter some telemetry events on larger voter sets (#4700) --- .../finality-grandpa/src/communication/mod.rs | 65 +++++++++++-------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 5077d435e8..18cb14c739 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -106,6 +106,11 @@ mod benefit { pub(super) const PER_EQUIVOCATION: i32 = 10; } +/// If the voter set is larger than this value some telemetry events are not +/// sent to avoid increasing usage resource on the node and flooding the +/// telemetry server (e.g. received votes, received commits.) +const TELEMETRY_VOTERS_LIMIT: usize = 10; + /// A handle to the network. /// /// Something that provides both the capabilities needed for the `gossip_network::Network` trait as @@ -308,29 +313,31 @@ impl> NetworkBridge { return Ok(None); } - match &msg.message.message { - PrimaryPropose(propose) => { - telemetry!(CONSENSUS_INFO; "afg.received_propose"; - "voter" => ?format!("{}", msg.message.id), - "target_number" => ?propose.target_number, - "target_hash" => ?propose.target_hash, - ); - }, - Prevote(prevote) => { - telemetry!(CONSENSUS_INFO; "afg.received_prevote"; - "voter" => ?format!("{}", msg.message.id), - "target_number" => ?prevote.target_number, - "target_hash" => ?prevote.target_hash, - ); - }, - Precommit(precommit) => { - telemetry!(CONSENSUS_INFO; "afg.received_precommit"; - "voter" => ?format!("{}", msg.message.id), - "target_number" => ?precommit.target_number, - "target_hash" => ?precommit.target_hash, - ); - }, - }; + if voters.len() <= TELEMETRY_VOTERS_LIMIT { + match &msg.message.message { + PrimaryPropose(propose) => { + telemetry!(CONSENSUS_INFO; "afg.received_propose"; + "voter" => ?format!("{}", msg.message.id), + "target_number" => ?propose.target_number, + "target_hash" => ?propose.target_hash, + ); + }, + Prevote(prevote) => { + telemetry!(CONSENSUS_INFO; "afg.received_prevote"; + "voter" => ?format!("{}", msg.message.id), + "target_number" => ?prevote.target_number, + "target_hash" => ?prevote.target_hash, + ); + }, + Precommit(precommit) => { + telemetry!(CONSENSUS_INFO; "afg.received_precommit"; + "voter" => ?format!("{}", msg.message.id), + "target_number" => ?precommit.target_number, + "target_hash" => ?precommit.target_hash, + ); + }, + }; + } Ok(Some(msg.message)) } @@ -474,11 +481,13 @@ fn incoming_global( format!("{}", a) }).collect(); - telemetry!(CONSENSUS_INFO; "afg.received_commit"; - "contains_precommits_signed_by" => ?precommits_signed_by, - "target_number" => ?msg.message.target_number.clone(), - "target_hash" => ?msg.message.target_hash.clone(), - ); + if voters.len() <= TELEMETRY_VOTERS_LIMIT { + telemetry!(CONSENSUS_INFO; "afg.received_commit"; + "contains_precommits_signed_by" => ?precommits_signed_by, + "target_number" => ?msg.message.target_number.clone(), + "target_hash" => ?msg.message.target_hash.clone(), + ); + } if let Err(cost) = check_compact_commit::( &msg.message, -- GitLab From ef578cd5102e73dcca8ee902555467fed1031792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 22 Jan 2020 12:17:52 +0100 Subject: [PATCH 163/296] Support `u128`/`i128` in runtime interface (#4703) * Support `u128`/`i128` in runtime interface This implements support for `u128`/`i128` as parameters/return value in runtime interfaces. As we can not pass them as identity, as for the other primitives types, we pass them as an pointer to an `[u8; 16]` array. * Remove some unsafe code usage --- primitives/runtime-interface/src/impls.rs | 52 +++++++++++++++++++ primitives/runtime-interface/src/lib.rs | 3 ++ .../runtime-interface/test-wasm/src/lib.rs | 20 +++++++ primitives/runtime-interface/test/src/lib.rs | 5 ++ 4 files changed, 80 insertions(+) diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index 3cd114268b..cde8e60eea 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -471,3 +471,55 @@ impl IntoFFIValue for Pointer { Ok(self.into()) } } + +/// Implement the traits for `u128`/`i128` +macro_rules! for_u128_i128 { + ($type:ty) => { + /// `u128`/`i128` is passed as `u32`. + /// + /// The `u32` is a pointer to an `[u8; 16]` array. + impl RIType for $type { + type FFIType = u32; + } + + #[cfg(not(feature = "std"))] + impl IntoFFIValue for $type { + type Owned = (); + + fn into_ffi_value(&self) -> WrappedFFIValue { + unsafe { (mem::transmute::<&Self, *const u8>(self) as u32).into() } + } + } + + #[cfg(not(feature = "std"))] + impl FromFFIValue for $type { + fn from_ffi_value(arg: u32) -> $type { + <$type>::from_le_bytes(<[u8; mem::size_of::<$type>()]>::from_ffi_value(arg)) + } + } + + #[cfg(feature = "std")] + impl FromFFIValue for $type { + type SelfInstance = $type; + + fn from_ffi_value(context: &mut dyn FunctionContext, arg: u32) -> Result<$type> { + let data = context.read_memory(Pointer::new(arg), mem::size_of::<$type>() as u32)?; + let mut res = [0u8; mem::size_of::<$type>()]; + res.copy_from_slice(&data); + Ok(<$type>::from_le_bytes(res)) + } + } + + #[cfg(feature = "std")] + impl IntoFFIValue for $type { + fn into_ffi_value(self, context: &mut dyn FunctionContext) -> Result { + let addr = context.allocate_memory(mem::size_of::<$type>() as u32)?; + context.write_memory(addr, &self.to_le_bytes())?; + Ok(addr.into()) + } + } + } +} + +for_u128_i128!(u128); +for_u128_i128!(i128); diff --git a/primitives/runtime-interface/src/lib.rs b/primitives/runtime-interface/src/lib.rs index 30d74ad2db..609f4f600b 100644 --- a/primitives/runtime-interface/src/lib.rs +++ b/primitives/runtime-interface/src/lib.rs @@ -81,10 +81,12 @@ //! | `u16` | `u16` | `Identity` | //! | `u32` | `u32` | `Identity` | //! | `u64` | `u64` | `Identity` | +//! | `i128` | `u32` | `v.as_ptr()` (pointer to a 16 byte array) | //! | `i8` | `i8` | `Identity` | //! | `i16` | `i16` | `Identity` | //! | `i32` | `i32` | `Identity` | //! | `i64` | `i64` | `Identity` | +//! | `u128` | `u32` | `v.as_ptr()` (pointer to a 16 byte array) | //! | `bool` | `u8` | `if v { 1 } else { 0 }` | //! | `&str` | `u64` | v.len() 32bit << 32 | v.as_ptr() 32bit | //! | `&[u8]` | `u64` | v.len() 32bit << 32 | v.as_ptr() 32bit | @@ -93,6 +95,7 @@ //! | `&[T] where T: Encode` | `u64` | `let e = v.encode();`

e.len() 32bit << 32 | e.as_ptr() 32bit | //! | `[u8; N]` | `u32` | `v.as_ptr()` | //! | `*const T` | `u32` | `Identity` | +//! | `Option` | `u64` | `let e = v.encode();`

e.len() 32bit << 32 | e.as_ptr() 32bit | //! | [`T where T: PassBy`](pass_by::Inner) | Depends on inner | Depends on inner | //! | [`T where T: PassBy`](pass_by::Codec) | `u64`| v.len() 32bit << 32 | v.as_ptr() 32bit | //! diff --git a/primitives/runtime-interface/test-wasm/src/lib.rs b/primitives/runtime-interface/test-wasm/src/lib.rs index a7e7e3e983..67fbfdcfec 100644 --- a/primitives/runtime-interface/test-wasm/src/lib.rs +++ b/primitives/runtime-interface/test-wasm/src/lib.rs @@ -82,6 +82,16 @@ pub trait TestApi { fn overwrite_native_function_implementation() -> bool { false } + + /// Gets an `u128` and returns this value + fn get_and_return_u128(val: u128) -> u128 { + val + } + + /// Gets an `i128` and returns this value + fn get_and_return_i128(val: i128) -> i128 { + val + } } /// Two random external functions from the old runtime interface. @@ -191,4 +201,14 @@ wasm_export_functions! { assert!(test_api::overwrite_native_function_implementation()); } + + fn test_u128_i128_as_parameter_and_return_value() { + for val in &[u128::max_value(), 1u128, 5000u128, u64::max_value() as u128] { + assert_eq!(*val, test_api::get_and_return_u128(*val)); + } + + for val in &[i128::max_value(), i128::min_value(), 1i128, 5000i128, u64::max_value() as i128] { + assert_eq!(*val, test_api::get_and_return_i128(*val)); + } + } } diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index b209e1f71c..48c120b2c9 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -108,3 +108,8 @@ fn test_invalid_utf8_data_should_return_an_error() { fn test_overwrite_native_function_implementation() { call_wasm_method::("test_overwrite_native_function_implementation"); } + +#[test] +fn test_u128_i128_as_parameter_and_return_value() { + call_wasm_method::("test_u128_i128_as_parameter_and_return_value"); +} -- GitLab From 2cc177251d600482953a91d92d0f66c55a0385d9 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Wed, 22 Jan 2020 14:49:28 +0100 Subject: [PATCH 164/296] client/authority-discovery/Cargo.toml: Update dependency (#4706) * client/authority-discovery/Cargo.toml: Update dependency * client/authority-discovery: Pass packet payload and addresses as slice Starting with Bytes 0.5 `Vec` does not implement `Buf`, but `&[T]` does. --- Cargo.lock | 25 ++++++++++++++++++++++++- client/authority-discovery/Cargo.toml | 2 +- client/authority-discovery/src/lib.rs | 10 +++++----- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8030a4cd13..04a7a33595 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4500,6 +4500,15 @@ dependencies = [ "prost-derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "prost" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "prost-build" version = "0.5.0" @@ -4529,6 +4538,18 @@ dependencies = [ "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "prost-derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "prost-types" version = "0.5.0" @@ -5012,7 +5033,7 @@ dependencies = [ "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8590,8 +8611,10 @@ dependencies = [ "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" "checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" "checksum prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96d14b1c185652833d24aaad41c5832b0be5616a590227c1fbff57c616754b23" +"checksum prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" "checksum prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb788126ea840817128183f8f603dce02cb7aea25c2a0b764359d8e20010702e" "checksum prost-derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e7dc378b94ac374644181a2247cebf59a6ec1c88b49ac77f3a94b86b79d0e11" +"checksum prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" "checksum prost-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1de482a366941c8d56d19b650fac09ca08508f2a696119ee7513ad590c8bac6f" "checksum protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40361836defdd5871ff7e84096c6f6444af7fc157f8ef1789f54f147687caa20" "checksum pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 7381e5add1..25c3f161d4 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -16,7 +16,7 @@ futures = "0.3.1" futures-timer = "2.0" libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" -prost = "0.5.0" +prost = "0.6.1" rand = "0.7.2" sc-client-api = { version = "2.0.0", path = "../api" } sc-keystore = { version = "2.0.0", path = "../keystore" } diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index ee2b655b92..6260ac9a85 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -315,10 +315,10 @@ where let remote_addresses: Vec = values.into_iter() .map(|(_k, v)| { - let schema::SignedAuthorityAddresses { - signature, - addresses, - } = schema::SignedAuthorityAddresses::decode(v).map_err(Error::DecodingProto)?; + let schema::SignedAuthorityAddresses { signature, addresses } = + schema::SignedAuthorityAddresses::decode(v.as_slice()) + .map_err(Error::DecodingProto)?; + let signature = AuthoritySignature::decode(&mut &signature[..]) .map_err(Error::EncodingDecodingScale)?; @@ -326,7 +326,7 @@ where return Err(Error::VerifyingDhtPayload); } - let addresses: Vec = schema::AuthorityAddresses::decode(addresses) + let addresses = schema::AuthorityAddresses::decode(addresses.as_slice()) .map(|a| a.addresses) .map_err(Error::DecodingProto)? .into_iter() -- GitLab From 6c3b86d16ad19751fbbab86e369883b5425c72df Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Wed, 22 Jan 2020 05:53:40 -0800 Subject: [PATCH 165/296] More cleanups in node-template (#4705) * remove and reformat * remove some more * commit Cargo.lock --- Cargo.lock | 4 -- bin/node-template/Cargo.toml | 4 -- bin/node-template/src/chain_spec.rs | 62 +++++++++++++++-------------- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04a7a33595..eadf251f75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3221,8 +3221,6 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-basic-authorship 0.8.0", "sc-cli 0.8.0", "sc-client 0.8.0", @@ -3237,12 +3235,10 @@ dependencies = [ "sp-core 2.0.0", "sp-finality-grandpa 2.0.0", "sp-inherents 2.0.0", - "sp-io 2.0.0", "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", "substrate-build-script-utils 2.0.0", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/bin/node-template/Cargo.toml b/bin/node-template/Cargo.toml index f956bbb221..cf3d7509f4 100644 --- a/bin/node-template/Cargo.toml +++ b/bin/node-template/Cargo.toml @@ -14,10 +14,6 @@ futures = "0.3.1" ctrlc = { version = "3.1.3", features = ["termination"] } log = "0.4.8" tokio = { version = "0.2", features = ["rt-threaded"] } -parking_lot = "0.9.0" -codec = { package = "parity-scale-codec", version = "1.0.0" } -trie-root = "0.15.2" -sp-io = { version = "2.0.0", path = "../../primitives/io" } sc-cli = { version = "0.8.0", path = "../../client/cli" } sp-core = { version = "2.0.0", path = "../../primitives/core" } sc-executor = { version = "0.8", path = "../../client/executor" } diff --git a/bin/node-template/src/chain_spec.rs b/bin/node-template/src/chain_spec.rs index fae9feaf51..6afb67547b 100644 --- a/bin/node-template/src/chain_spec.rs +++ b/bin/node-template/src/chain_spec.rs @@ -56,17 +56,19 @@ impl Alternative { Alternative::Development => ChainSpec::from_genesis( "Development", "dev", - || testnet_genesis(vec![ - get_authority_keys_from_seed("Alice"), - ], - get_account_id_from_seed::("Alice"), - vec![ + || testnet_genesis( + vec![ + get_authority_keys_from_seed("Alice"), + ], get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - ], - true), + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + ], + true, + ), vec![], None, None, @@ -76,26 +78,28 @@ impl Alternative { Alternative::LocalTestnet => ChainSpec::from_genesis( "Local Testnet", "local_testnet", - || testnet_genesis(vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - ], - get_account_id_from_seed::("Alice"), - vec![ + || testnet_genesis( + vec![ + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), + ], get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - true), + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ], + true, + ), vec![], None, None, -- GitLab From fee0801683bc412a0b6f90704bb396d9a621e24a Mon Sep 17 00:00:00 2001 From: Denis Pisarev Date: Wed, 22 Jan 2020 15:24:34 +0100 Subject: [PATCH 166/296] =?UTF-8?q?fixes=20trigger-contracts-ci=20job=20to?= =?UTF-8?q?=20actually=20depend=20on=20build-linux-subs=E2=80=A6=20(#4701)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fixes trigger-contracts-ci job to actually depend on build-linux-substrate --- .gitlab-ci.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b98e859182..828c830948 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -374,10 +374,14 @@ check_polkadot: trigger-contracts-ci: stage: publish needs: - - build-linux-substrate + - job: build-linux-substrate + artifacts: false + - job: test-linux-stable + artifacts: false trigger: project: parity/srml-contracts-waterfall - branch: "master" + branch: master + strategy: depend only: - master - schedules -- GitLab From 09ac2d3c4b41f981a969251cc23195b89491b5c0 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 22 Jan 2020 16:33:42 +0100 Subject: [PATCH 167/296] make NotificationStream event naming consistent (#4712) --- client/network-gossip/src/bridge.rs | 2 +- client/network/src/behaviour.rs | 4 ++-- client/network/src/protocol.rs | 4 ++-- client/network/src/protocol/event.rs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/network-gossip/src/bridge.rs b/client/network-gossip/src/bridge.rs index 2b0b19b876..d6d6805b3e 100644 --- a/client/network-gossip/src/bridge.rs +++ b/client/network-gossip/src/bridge.rs @@ -100,7 +100,7 @@ impl GossipEngine { let inner = &mut *inner; inner.state_machine.new_peer(&mut *inner.network, remote, roles); } - Event::NotificationsStreamClosed { remote, engine_id: msg_engine_id } => { + Event::NotificationStreamClosed { remote, engine_id: msg_engine_id } => { if msg_engine_id != engine_id { continue; } diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 7cc9eee74d..faaa25c660 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -144,9 +144,9 @@ Behaviour { roles, })); }, - CustomMessageOutcome::NotificationsStreamClosed { remote, protocols } => + CustomMessageOutcome::NotificationStreamClosed { remote, protocols } => for engine_id in protocols { - self.events.push(BehaviourOut::Event(Event::NotificationsStreamClosed { + self.events.push(BehaviourOut::Event(Event::NotificationStreamClosed { remote: remote.clone(), engine_id, })); diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 6914ea9efe..7a9fc7ecfb 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -1792,7 +1792,7 @@ pub enum CustomMessageOutcome { /// Notification protocols have been opened with a remote. NotificationStreamOpened { remote: PeerId, protocols: Vec, roles: Roles }, /// Notification protocols have been closed with a remote. - NotificationsStreamClosed { remote: PeerId, protocols: Vec }, + NotificationStreamClosed { remote: PeerId, protocols: Vec }, /// Messages have been received on one or more notifications protocols. NotificationsReceived { remote: PeerId, messages: Vec<(ConsensusEngineId, Bytes)> }, None, @@ -1931,7 +1931,7 @@ Protocol { LegacyProtoOut::CustomProtocolClosed { peer_id, .. } => { self.on_peer_disconnected(peer_id.clone()); // Notify all the notification protocols as closed. - CustomMessageOutcome::NotificationsStreamClosed { + CustomMessageOutcome::NotificationStreamClosed { remote: peer_id, protocols: self.registered_notif_protocols.iter().cloned().collect(), } diff --git a/client/network/src/protocol/event.rs b/client/network/src/protocol/event.rs index 47bf057505..e239e9d983 100644 --- a/client/network/src/protocol/event.rs +++ b/client/network/src/protocol/event.rs @@ -61,7 +61,7 @@ pub enum Event { /// Closed a substream with the given node. Always matches a corresponding previous /// `NotificationStreamOpened` message. - NotificationsStreamClosed { + NotificationStreamClosed { /// Node we closed the substream with. remote: PeerId, /// The concerned protocol. Each protocol uses a different substream. -- GitLab From 041f6f0ce3fffa7b755630940447e74f3d344a2c Mon Sep 17 00:00:00 2001 From: Toralf Wittner Date: Wed, 22 Jan 2020 17:34:42 +0100 Subject: [PATCH 168/296] Update soketto to v0.3.2 (#4714) See #4702 for details. --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eadf251f75..79a2721edf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2694,7 +2694,7 @@ dependencies = [ "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6162,7 +6162,7 @@ dependencies = [ [[package]] name = "soketto" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8695,7 +8695,7 @@ dependencies = [ "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" "checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86" "checksum snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" -"checksum soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3caa0ad6b765419f21e4cfa490ec7514a9fae4af986adef168a69477ba528671" +"checksum soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -- GitLab From 22887d5e9f0b66a0341d071c300e8359c80c8b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 22 Jan 2020 18:13:17 +0100 Subject: [PATCH 169/296] Move "wasm" allocator into its own crate (#4716) This moves the wasm-allocator (`FreeingBumpHeapAllocator`) into its own crate `sp-allocator`. This new crate can theoretically provide multiple different allocators. Besides moving the allocator, this pr also makes `FreeingBumpHeapAllocator` compile on `no_std`. --- Cargo.lock | 16 ++++++++ Cargo.toml | 1 + client/executor/common/Cargo.toml | 1 + client/executor/common/src/error.rs | 15 ++----- client/executor/common/src/lib.rs | 1 - client/executor/runtime-test/Cargo.toml | 8 +++- client/executor/runtime-test/src/lib.rs | 5 +++ client/executor/src/lib.rs | 2 +- client/executor/wasmi/Cargo.toml | 1 + client/executor/wasmi/src/lib.rs | 14 +++---- client/executor/wasmtime/Cargo.toml | 1 + .../wasmtime/src/function_executor.rs | 6 +-- primitives/allocator/Cargo.toml | 22 ++++++++++ primitives/allocator/src/error.rs | 38 ++++++++++++++++++ .../allocator/src/freeing_bump.rs | 35 ++++++++++------ primitives/allocator/src/lib.rs | 29 ++++++++++++++ primitives/core/src/lib.rs | 40 +++++++++++++++++++ primitives/runtime/src/traits.rs | 28 +++---------- primitives/sandbox/src/lib.rs | 5 +-- primitives/wasm-interface/Cargo.toml | 7 +++- primitives/wasm-interface/src/lib.rs | 25 ++++++++++-- 21 files changed, 230 insertions(+), 70 deletions(-) create mode 100644 primitives/allocator/Cargo.toml create mode 100644 primitives/allocator/src/error.rs rename client/executor/common/src/allocator.rs => primitives/allocator/src/freeing_bump.rs (95%) create mode 100644 primitives/allocator/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 79a2721edf..2e0be7daf9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5424,6 +5424,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-allocator 2.0.0", "sp-core 2.0.0", "sp-runtime-interface 2.0.0", "sp-serializer 2.0.0", @@ -5439,6 +5440,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", + "sp-allocator 2.0.0", "sp-core 2.0.0", "sp-runtime-interface 2.0.0", "sp-wasm-interface 2.0.0", @@ -5459,6 +5461,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", + "sp-allocator 2.0.0", "sp-core 2.0.0", "sp-runtime-interface 2.0.0", "sp-wasm-interface 2.0.0", @@ -5732,6 +5735,7 @@ dependencies = [ name = "sc-runtime-test" version = "2.0.0" dependencies = [ + "sp-allocator 2.0.0", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -6184,6 +6188,17 @@ name = "sourcefile" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "sp-allocator" +version = "2.0.0" +dependencies = [ + "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-core 2.0.0", + "sp-std 2.0.0", + "sp-wasm-interface 2.0.0", +] + [[package]] name = "sp-api" version = "2.0.0" @@ -6739,6 +6754,7 @@ name = "sp-wasm-interface" version = "2.0.0" dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-std 2.0.0", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/Cargo.toml b/Cargo.toml index f6e521b9c5..fb15de2ebe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -98,6 +98,7 @@ members = [ "frame/transaction-payment/rpc/runtime-api", "frame/treasury", "frame/utility", + "primitives/allocator", "primitives/application-crypto", "primitives/application-crypto/test", "primitives/authority-discovery", diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index cae0876217..d3282e4dff 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -10,6 +10,7 @@ derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.0.0" } wasmi = "0.6.2" sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0", path = "../../../primitives/allocator" } sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } sp-serializer = { version = "2.0.0", path = "../../../primitives/serializer" } diff --git a/client/executor/common/src/error.rs b/client/executor/common/src/error.rs index f7de0af968..b8d40d4d91 100644 --- a/client/executor/common/src/error.rs +++ b/client/executor/common/src/error.rs @@ -72,17 +72,10 @@ pub enum Error { #[display(fmt="The runtime has the `start` function")] RuntimeHasStartFn, /// Some other error occurred - #[from(ignore)] Other(String), /// Some error occurred in the allocator #[display(fmt="Error in allocator: {}", _0)] - Allocator(&'static str), - /// The allocator ran out of space. - #[display(fmt="Allocator ran 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, + Allocator(sp_allocator::Error), /// Execution of a host function failed. #[display(fmt="Host function {} execution failed with: {}", _0, _1)] FunctionExecution(String, String), @@ -101,9 +94,9 @@ impl std::error::Error for Error { impl wasmi::HostError for Error {} -impl From for Error { - fn from(err: String) -> Error { - Error::Other(err) +impl From<&'static str> for Error { + fn from(err: &'static str) -> Error { + Error::Other(err.into()) } } diff --git a/client/executor/common/src/lib.rs b/client/executor/common/src/lib.rs index 69f6a710b3..cc515dcf9d 100644 --- a/client/executor/common/src/lib.rs +++ b/client/executor/common/src/lib.rs @@ -19,6 +19,5 @@ #![warn(missing_docs)] pub mod sandbox; -pub mod allocator; pub mod error; pub mod wasm_runtime; diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index 835021fec2..80dda384a0 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -11,10 +11,16 @@ sp-io = { version = "2.0.0", default-features = false, path = "../../../primitiv sp-sandbox = { version = "0.8.0", default-features = false, path = "../../../primitives/sandbox" } sp-core = { version = "2.0.0", default-features = false, path = "../../../primitives/core" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../../primitives/runtime" } +sp-allocator = { version = "2.0.0", default-features = false, path = "../../../primitives/allocator" } [build-dependencies] wasm-builder-runner = { version = "1.0.4", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } [features] default = [ "std" ] -std = ["sp-io/std", "sp-sandbox/std", "sp-std/std"] +std = [ + "sp-io/std", + "sp-sandbox/std", + "sp-std/std", + "sp-allocator/std", +] diff --git a/client/executor/runtime-test/src/lib.rs b/client/executor/runtime-test/src/lib.rs index a8d329cdd9..c0807197b4 100644 --- a/client/executor/runtime-test/src/lib.rs +++ b/client/executor/runtime-test/src/lib.rs @@ -212,6 +212,11 @@ sp_core::wasm_export_functions! { run().is_some() } + + // Just some test to make sure that `sp-allocator` compiles on `no_std`. + fn test_sp_allocator_compiles() { + sp_allocator::FreeingBumpHeapAllocator::new(0); + } } #[cfg(not(feature = "std"))] diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index 4f97efa9b6..a054f4dc76 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -48,7 +48,7 @@ pub use sp_core::traits::Externalities; pub use sp_wasm_interface; pub use wasm_runtime::WasmExecutionMethod; -pub use sc_executor_common::{error, allocator, sandbox}; +pub use sc_executor_common::{error, sandbox}; /// Call the given `function` in the given wasm `code`. /// diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index dbfdc505c6..6e67c73e56 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -13,3 +13,4 @@ sc-executor-common = { version = "0.8", path = "../common" } sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0", path = "../../../primitives/allocator" } diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index c10698fea4..d3d0ee6e1e 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -16,11 +16,7 @@ //! This crate provides an implementation of `WasmRuntime` that is baked by wasmi. -use sc_executor_common::{ - error::{Error, WasmError}, - sandbox, - allocator, -}; +use sc_executor_common::{error::{Error, WasmError}, sandbox}; use std::{str, mem, cell::RefCell}; use wasmi::{ Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, ModuleRef, @@ -38,7 +34,7 @@ use sc_executor_common::wasm_runtime::WasmRuntime; struct FunctionExecutor<'a> { sandbox_store: sandbox::Store, - heap: allocator::FreeingBumpHeapAllocator, + heap: sp_allocator::FreeingBumpHeapAllocator, memory: MemoryRef, table: Option, host_functions: &'a [&'static dyn Function], @@ -57,7 +53,7 @@ impl<'a> FunctionExecutor<'a> { ) -> Result { Ok(FunctionExecutor { sandbox_store: sandbox::Store::new(), - heap: allocator::FreeingBumpHeapAllocator::new(heap_base), + heap: sp_allocator::FreeingBumpHeapAllocator::new(heap_base), memory: m, table: t, host_functions, @@ -79,13 +75,13 @@ impl<'a> sandbox::SandboxCapabilities for FunctionExecutor<'a> { fn allocate(&mut self, len: WordSize) -> Result, Error> { let heap = &mut self.heap; self.memory.with_direct_access_mut(|mem| { - heap.allocate(mem, len) + heap.allocate(mem, len).map_err(Into::into) }) } fn deallocate(&mut self, ptr: Pointer) -> Result<(), Error> { let heap = &mut self.heap; self.memory.with_direct_access_mut(|mem| { - heap.deallocate(mem, ptr) + heap.deallocate(mem, ptr).map_err(Into::into) }) } fn write_memory(&mut self, ptr: Pointer, data: &[u8]) -> Result<(), Error> { diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 44912086ea..a8f30a54b3 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -13,6 +13,7 @@ sc-executor-common = { version = "0.8", path = "../common" } sp-wasm-interface = { version = "2.0.0", path = "../../../primitives/wasm-interface" } sp-runtime-interface = { version = "2.0.0", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0", path = "../../../primitives/allocator" } cranelift-codegen = "0.50" cranelift-entity = "0.50" diff --git a/client/executor/wasmtime/src/function_executor.rs b/client/executor/wasmtime/src/function_executor.rs index b398ea8476..bc665f18e4 100644 --- a/client/executor/wasmtime/src/function_executor.rs +++ b/client/executor/wasmtime/src/function_executor.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use sc_executor_common::allocator::FreeingBumpHeapAllocator; +use sp_allocator::FreeingBumpHeapAllocator; use sc_executor_common::error::{Error, Result}; use sc_executor_common::sandbox::{self, SandboxCapabilities, SupervisorFuncIndex}; use crate::util::{ @@ -127,11 +127,11 @@ impl<'a> SandboxCapabilities for FunctionExecutor<'a> { } fn allocate(&mut self, len: WordSize) -> Result> { - self.heap.allocate(self.memory, len) + self.heap.allocate(self.memory, len).map_err(Into::into) } fn deallocate(&mut self, ptr: Pointer) -> Result<()> { - self.heap.deallocate(self.memory, ptr) + self.heap.deallocate(self.memory, ptr).map_err(Into::into) } fn write_memory(&mut self, ptr: Pointer, data: &[u8]) -> Result<()> { diff --git a/primitives/allocator/Cargo.toml b/primitives/allocator/Cargo.toml new file mode 100644 index 0000000000..737fa91273 --- /dev/null +++ b/primitives/allocator/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "sp-allocator" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +sp-std = { version = "2.0.0", path = "../std", default-features = false } +sp-core = { version = "2.0.0", path = "../core", default-features = false } +sp-wasm-interface = { version = "2.0.0", path = "../wasm-interface", default-features = false } +log = { version = "0.4.8", optional = true } +derive_more = { version = "0.99.2", optional = true } + +[features] +default = [ "std" ] +std = [ + "sp-std/std", + "sp-core/std", + "sp-wasm-interface/std", + "log", + "derive_more", +] diff --git a/primitives/allocator/src/error.rs b/primitives/allocator/src/error.rs new file mode 100644 index 0000000000..9357bc4560 --- /dev/null +++ b/primitives/allocator/src/error.rs @@ -0,0 +1,38 @@ +// Copyright 2020 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 error type used by the allocators. +#[derive(sp_core::RuntimeDebug)] +#[cfg_attr(feature = "std", derive(derive_more::Display))] +pub enum Error { + /// Someone tried to allocate more memory than the allowed maximum per allocation. + #[cfg_attr(feature = "std", display(fmt="Requested allocation size is too large"))] + RequestedAllocationTooLarge, + /// Allocator run out of space. + #[cfg_attr(feature = "std", display(fmt="Allocator ran out of space"))] + AllocatorOutOfSpace, + /// Some other error occurred. + Other(&'static str) +} + +#[cfg(feature = "std")] +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + _ => None, + } + } +} diff --git a/client/executor/common/src/allocator.rs b/primitives/allocator/src/freeing_bump.rs similarity index 95% rename from client/executor/common/src/allocator.rs rename to primitives/allocator/src/freeing_bump.rs index feab044f69..46c314c2c2 100644 --- a/client/executor/common/src/allocator.rs +++ b/primitives/allocator/src/freeing_bump.rs @@ -46,10 +46,8 @@ //! To deallocate we use the preceding 8 bytes of the allocation to knit //! back the allocation into the linked list from the head. -use crate::error::{Error, Result}; -use log::trace; -use std::convert::{TryFrom, TryInto}; -use std::ops::Range; +use crate::Error; +use sp_std::{convert::{TryFrom, TryInto}, ops::Range}; use sp_wasm_interface::{Pointer, WordSize}; // The pointers need to be aligned to 8 bytes. This is because the @@ -81,7 +79,18 @@ pub struct FreeingBumpHeapAllocator { /// Create an allocator error. fn error(msg: &'static str) -> Error { - Error::Allocator(msg) + Error::Other(msg) +} + +/// A custom "trace" implementation that is only activated when `feature = std`. +/// +/// Uses `wasm-heap` as default target. +macro_rules! trace { + ( $( $args:expr ),+ ) => { + sp_std::if_std! { + log::trace!(target: "wasm-heap", $( $args ),+); + } + } } impl FreeingBumpHeapAllocator { @@ -113,9 +122,9 @@ impl FreeingBumpHeapAllocator { /// /// - `mem` - a slice representing the linear memory on which this allocator operates. /// - `size` - size in bytes of the allocation request - pub fn allocate(&mut self, mem: &mut [u8], size: WordSize) -> Result> { + pub fn allocate(&mut self, mem: &mut [u8], size: WordSize) -> Result, Error> { let mem_size = u32::try_from(mem.len()) - .expect("size of Wasm linear memory is <2^32"); + .expect("size of Wasm linear memory is <2^32; qed"); let max_heap_size = mem_size - self.ptr_offset; if size > MAX_POSSIBLE_ALLOCATION { @@ -151,7 +160,7 @@ impl FreeingBumpHeapAllocator { self.set_heap_u64(mem, ptr - PREFIX_SIZE, list_index as u64)?; self.total_size = self.total_size + item_size + PREFIX_SIZE; - trace!(target: "wasm-heap", "Heap size is {} bytes after allocation", self.total_size); + trace!("Heap size is {} bytes after allocation", self.total_size); Ok(Pointer::new(self.ptr_offset + ptr)) } @@ -162,7 +171,7 @@ impl FreeingBumpHeapAllocator { /// /// - `mem` - a slice representing the linear memory on which this allocator operates. /// - `ptr` - pointer to the allocated chunk - pub fn deallocate(&mut self, mem: &mut [u8], ptr: Pointer) -> Result<()> { + pub fn deallocate(&mut self, mem: &mut [u8], ptr: Pointer) -> Result<(), Error> { let ptr = u32::from(ptr) - self.ptr_offset; if ptr < PREFIX_SIZE { return Err(error("Invalid pointer for deallocation")); @@ -180,7 +189,7 @@ impl FreeingBumpHeapAllocator { let item_size = Self::get_item_size_from_index(list_index); self.total_size = self.total_size.checked_sub(item_size as u32 + PREFIX_SIZE) .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); + trace!("Heap size is {} bytes after deallocation", self.total_size); Ok(()) } @@ -190,7 +199,7 @@ impl FreeingBumpHeapAllocator { /// Returns the `bumper` from before the increase. /// Returns an `Error::AllocatorOutOfSpace` if the operation /// would exhaust the heap. - fn bump(&mut self, item_size: u32, max_heap_size: u32) -> Result { + fn bump(&mut self, item_size: u32, max_heap_size: u32) -> Result { if self.bumper + PREFIX_SIZE + item_size > max_heap_size { return Err(Error::AllocatorOutOfSpace); } @@ -206,7 +215,7 @@ impl FreeingBumpHeapAllocator { } // Read a u64 from the heap in LE form. Used to read heap allocation prefixes. - fn get_heap_u64(&self, heap: &[u8], offset: u32) -> Result { + fn get_heap_u64(&self, heap: &[u8], offset: u32) -> Result { let range = self.heap_range(offset, 8, heap.len()) .ok_or_else(|| error("read out of heap bounds"))?; let bytes = heap[range].try_into() @@ -215,7 +224,7 @@ impl FreeingBumpHeapAllocator { } // Write a u64 to the heap in LE form. Used to write heap allocation prefixes. - fn set_heap_u64(&self, heap: &mut [u8], offset: u32, val: u64) -> Result<()> { + fn set_heap_u64(&self, heap: &mut [u8], offset: u32, val: u64) -> Result<(), Error> { let range = self.heap_range(offset, 8, heap.len()) .ok_or_else(|| error("write out of heap bounds"))?; let bytes = val.to_le_bytes(); diff --git a/primitives/allocator/src/lib.rs b/primitives/allocator/src/lib.rs new file mode 100644 index 0000000000..0efadbc7f6 --- /dev/null +++ b/primitives/allocator/src/lib.rs @@ -0,0 +1,29 @@ +// Copyright 2020 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 . + +//! Collection of allocator implementations. +//! +//! This crate provides the following allocator implementations: +//! - A freeing-bump allocator: [`FreeingBumpHeapAllocator`](freeing_bump::FreeingBumpHeapAllocator) + +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + +mod error; +mod freeing_bump; + +pub use freeing_bump::FreeingBumpHeapAllocator; +pub use error::Error; diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index ee768ee4a6..5bb9a3927f 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -309,3 +309,43 @@ pub fn to_substrate_wasm_fn_return_value(value: &impl Encode) -> u64 { res } + +/// Macro for creating `Maybe*` marker traits. +/// +/// Such a maybe-marker trait requires the given bound when `feature = std` and doesn't require +/// the bound on `no_std`. This is useful for situations where you require that a type implements +/// a certain trait with `feature = std`, but not on `no_std`. +/// +/// # Example +/// +/// ``` +/// sp_core::impl_maybe_marker! { +/// /// A marker for a type that implements `Debug` when `feature = std`. +/// trait MaybeDebug: std::fmt::Debug; +/// /// A marker for a type that implements `Debug + Display` when `feature = std`. +/// trait MaybeDebugDisplay: std::fmt::Debug, std::fmt::Display; +/// } +/// ``` +#[macro_export] +macro_rules! impl_maybe_marker { + ( + $( + $(#[$doc:meta] )+ + trait $trait_name:ident: $( $trait_bound:path ),+; + )+ + ) => { + $( + $(#[$doc])+ + #[cfg(feature = "std")] + pub trait $trait_name: $( $trait_bound + )+ {} + #[cfg(feature = "std")] + impl $trait_name for T {} + + $(#[$doc])+ + #[cfg(not(feature = "std"))] + pub trait $trait_name {} + #[cfg(not(feature = "std"))] + impl $trait_name for T {} + )+ + } +} diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 2547ce1072..08bbd83ca5 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -458,36 +458,18 @@ impl CheckEqual for super::generic::DigestItem whe } } -macro_rules! impl_maybe_marker { - ( $( $(#[$doc:meta])+ $trait_name:ident: $($trait_bound:path),+ );+ ) => { - $( - $(#[$doc])+ - #[cfg(feature = "std")] - pub trait $trait_name: $($trait_bound +)+ {} - #[cfg(feature = "std")] - impl $trait_name for T {} - - $(#[$doc])+ - #[cfg(not(feature = "std"))] - pub trait $trait_name {} - #[cfg(not(feature = "std"))] - impl $trait_name for T {} - )+ - } -} - -impl_maybe_marker!( +sp_core::impl_maybe_marker!( /// A type that implements Display when in std environment. - MaybeDisplay: Display; + trait MaybeDisplay: Display; /// A type that implements Hash when in std environment. - MaybeHash: sp_std::hash::Hash; + trait MaybeHash: sp_std::hash::Hash; /// A type that implements Serialize when in std environment. - MaybeSerialize: Serialize; + trait MaybeSerialize: Serialize; /// A type that implements Serialize, DeserializeOwned and Debug when in std environment. - MaybeSerializeDeserialize: DeserializeOwned, Serialize + trait MaybeSerializeDeserialize: DeserializeOwned, Serialize; ); /// A type that provides a randomness beacon. diff --git a/primitives/sandbox/src/lib.rs b/primitives/sandbox/src/lib.rs index 86098e73af..2760a46b48 100755 --- a/primitives/sandbox/src/lib.rs +++ b/primitives/sandbox/src/lib.rs @@ -81,10 +81,7 @@ pub type HostFuncType = fn(&mut T, &[TypedValue]) -> Result"] edition = "2018" [dependencies] -wasmi = "0.6.2" +wasmi = { version = "0.6.2", optional = true } impl-trait-for-tuples = "0.1.2" +sp-std = { version = "2.0.0", path = "../std", default-features = false } + +[features] +default = [ "std" ] +std = [ "wasmi", "sp-std/std" ] diff --git a/primitives/wasm-interface/src/lib.rs b/primitives/wasm-interface/src/lib.rs index b0bbbf82db..d6f9bbfbf0 100644 --- a/primitives/wasm-interface/src/lib.rs +++ b/primitives/wasm-interface/src/lib.rs @@ -16,12 +16,20 @@ //! Types and traits for interfacing between the host and the wasm runtime. -use std::{borrow::Cow, marker::PhantomData, mem, iter::Iterator, result}; +#![cfg_attr(not(feature = "std"), no_std)] +use sp_std::{ + borrow::Cow, marker::PhantomData, mem, iter::Iterator, result, vec::Vec, +}; + +#[cfg(feature = "std")] mod wasmi_impl; /// Result type used by traits in this crate. +#[cfg(feature = "std")] pub type Result = result::Result; +#[cfg(not(feature = "std"))] +pub type Result = result::Result; /// Value types supported by Substrate on the boundary between host/Wasm. #[derive(Copy, Clone, PartialEq, Debug, Eq)] @@ -189,11 +197,22 @@ impl Signature { return_value: None, } } - } +/// A trait that requires `RefUnwindSafe` when `feature = std`. +#[cfg(feature = "std")] +pub trait MaybeRefUnwindSafe: std::panic::RefUnwindSafe {} +#[cfg(feature = "std")] +impl MaybeRefUnwindSafe for T {} + +/// A trait that requires `RefUnwindSafe` when `feature = std`. +#[cfg(not(feature = "std"))] +pub trait MaybeRefUnwindSafe {} +#[cfg(not(feature = "std"))] +impl MaybeRefUnwindSafe for T {} + /// Something that provides a function implementation on the host for a wasm function. -pub trait Function: std::panic::RefUnwindSafe + Send + Sync { +pub trait Function: MaybeRefUnwindSafe + Send + Sync { /// Returns the name of this function. fn name(&self) -> &str; /// Returns the signature of this function. -- GitLab From 3a4dce9778d1b0ec3146532dcc4c5f194a7877d8 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Wed, 22 Jan 2020 18:34:41 +0100 Subject: [PATCH 170/296] Add fool protection and comment construct_block (#4715) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add fool protection and comment construct_block * Update bin/node/executor/tests/common.rs Co-Authored-By: Bastian Köcher Co-authored-by: Bastian Köcher --- bin/node/executor/tests/common.rs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/bin/node/executor/tests/common.rs b/bin/node/executor/tests/common.rs index 52f8b65654..090d2ee5d4 100644 --- a/bin/node/executor/tests/common.rs +++ b/bin/node/executor/tests/common.rs @@ -21,7 +21,7 @@ use sp_core::{ Blake2Hasher, NeverNativeValue, NativeOrEncoded, traits::CodeExecutor, }; -use sp_runtime::traits::Header as HeaderT; +use sp_runtime::{ApplyExtrinsicResult, traits::Header as HeaderT}; use sc_executor::{NativeExecutor, WasmExecutionMethod}; use sc_executor::error::Result; @@ -92,6 +92,10 @@ pub fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalitie ext } +/// Construct a fake block. +/// +/// `extrinsics` must be a list of valid extrinsics, i.e. none of the extrinsics for example +/// can report `ExhaustResources`. Otherwise, this function panics. pub fn construct_block( env: &mut TestExternalities, number: BlockNumber, @@ -104,10 +108,10 @@ pub fn construct_block( let extrinsics = extrinsics.into_iter().map(sign).collect::>(); // calculate the header fields that we can. - let extrinsics_root = Layout::::ordered_trie_root( - extrinsics.iter().map(Encode::encode) - ).to_fixed_bytes() - .into(); + let extrinsics_root = + Layout::::ordered_trie_root(extrinsics.iter().map(Encode::encode)) + .to_fixed_bytes() + .into(); let header = Header { parent_hash, @@ -126,14 +130,20 @@ pub fn construct_block( None, ).0.unwrap(); - for i in extrinsics.iter() { - executor_call:: _>( + for extrinsic in extrinsics.iter() { + // Try to apply the `extrinsic`. It should be valid, in the sense that it passes + // all pre-inclusion checks. + let r = executor_call:: _>( env, "BlockBuilder_apply_extrinsic", - &i.encode(), + &extrinsic.encode(), true, None, - ).0.unwrap(); + ).0.expect("application of an extrinsic failed").into_encoded(); + match ApplyExtrinsicResult::decode(&mut &r[..]).expect("apply result deserialization failed") { + Ok(_) => {}, + Err(e) => panic!("Applying extrinsic failed: {:?}", e), + } } let header = match executor_call:: _>( -- GitLab From 7bd0dbf39e4605da1d24b0f1a4ec77c843cd49d8 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 23 Jan 2020 00:03:38 -0800 Subject: [PATCH 171/296] Default fork choice value and intermediates for block import parameters (#4652) * consensus, pow: intermediate separation and fail * Fix compiles * Update primitives/consensus/common/src/block_import.rs Co-Authored-By: Robert Habermeier * Update primitives/consensus/common/src/block_import.rs Co-Authored-By: Robert Habermeier * Document what None means for `fork_choice` in block import params Co-authored-by: Robert Habermeier --- bin/node/cli/src/service.rs | 3 +- bin/node/transaction-factory/src/lib.rs | 3 +- client/consensus/aura/src/lib.rs | 6 +- client/consensus/babe/src/lib.rs | 16 +- client/consensus/babe/src/tests.rs | 3 +- client/consensus/pow/src/lib.rs | 325 ++++++++++++------ client/finality-grandpa/src/light_import.rs | 3 +- client/finality-grandpa/src/tests.rs | 9 +- client/network/test/src/lib.rs | 3 +- client/src/client.rs | 7 + primitives/blockchain/src/error.rs | 3 + .../consensus/common/src/block_import.rs | 11 +- test-utils/client/src/client_ext.rs | 24 +- 13 files changed, 278 insertions(+), 138 deletions(-) diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index b12dfcdc51..603df5b7d9 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -565,7 +565,8 @@ mod tests { storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }; diff --git a/bin/node/transaction-factory/src/lib.rs b/bin/node/transaction-factory/src/lib.rs index f3dcdb0875..a0c6a4f663 100644 --- a/bin/node/transaction-factory/src/lib.rs +++ b/bin/node/transaction-factory/src/lib.rs @@ -202,7 +202,8 @@ fn import_block( finalized: false, justification: None, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }; diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 95dc08afaf..270bd19422 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -290,7 +290,8 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW storage_changes: Some(storage_changes), finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, } @@ -644,7 +645,8 @@ impl Verifier for AuraVerifier where finalized: false, justification, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }; diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 770f8a4eec..8480972311 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -451,10 +451,8 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork storage_changes: Some(storage_changes), finalized: false, auxiliary: Vec::new(), // block-weight is written in block import. - // TODO: block-import handles fork choice and this shouldn't even have the - // option to specify one. - // https://github.com/paritytech/substrate/issues/3623 - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: None, allow_missing_state: false, import_existing: false, } @@ -807,10 +805,8 @@ impl Verifier for BabeVerifier BlockImport for BabeBlockImport last_best_weight { + Some(ForkChoiceStrategy::Custom(if total_weight > last_best_weight { true } else if total_weight == last_best_weight { number > last_best_number } else { false - }) + })) }; let import_result = self.inner.import_block(block, new_cache); diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 880e028000..3339c06d65 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -594,7 +594,8 @@ fn propose_and_import_block( storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }, diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index 2ea0cbdf0f..ca7285b7fe 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -32,6 +32,7 @@ use std::sync::Arc; use std::thread; use std::collections::HashMap; +use std::marker::PhantomData; use sc_client_api::{BlockOf, backend::AuxStore}; use sp_blockchain::{HeaderBackend, ProvideCache, well_known_cache_keys::Id as CacheKeyId}; use sp_block_builder::BlockBuilder as BlockBuilderApi; @@ -43,7 +44,8 @@ use sp_consensus_pow::{Seal, TotalDifficulty, POW_ENGINE_ID}; use sp_inherents::{InherentDataProviders, InherentData}; use sp_consensus::{ BlockImportParams, BlockOrigin, ForkChoiceStrategy, SyncOracle, Environment, Proposer, - SelectChain, Error as ConsensusError, CanAuthorWith, RecordProof, + SelectChain, Error as ConsensusError, CanAuthorWith, RecordProof, BlockImport, + BlockCheckParams, ImportResult, }; use sp_consensus::import_queue::{BoxBlockImport, BasicQueue, Verifier}; use codec::{Encode, Decode}; @@ -59,6 +61,10 @@ pub enum Error { HeaderUnsealed(B::Hash), #[display(fmt = "PoW validation error: invalid seal")] InvalidSeal, + #[display(fmt = "PoW validation error: invalid difficulty")] + InvalidDifficulty, + #[display(fmt = "PoW block import expects an intermediate, but not found one")] + NoIntermediate, #[display(fmt = "Rejecting block too far in future")] TooFarInFuture, #[display(fmt = "Fetching best header failed using select chain: {:?}", _0)] @@ -89,6 +95,12 @@ impl std::convert::From> for String { } } +impl std::convert::From> for ConsensusError { + fn from(error: Error) -> ConsensusError { + ConsensusError::ClientImport(error.to_string()) + } +} + /// Auxiliary storage prefix for PoW engine. pub const POW_AUX_PREFIX: [u8; 4] = *b"PoW:"; @@ -97,6 +109,18 @@ fn aux_key>(hash: &T) -> Vec { POW_AUX_PREFIX.iter().chain(hash.as_ref()).copied().collect() } +/// Intermediate value passed to block importer. +#[derive(Encode, Decode, Clone, Debug, Default)] +pub struct PowIntermediate { + /// The header hash with seal, used for auxiliary key. + pub hash: B::Hash, + /// Difficulty of the block, if known. + pub difficulty: Option, +} + +/// Intermediate key for PoW engine. +pub static INTERMEDIATE_KEY: &[u8] = b"pow1"; + /// Auxiliary storage data for PoW. #[derive(Encode, Decode, Clone, Debug, Default)] pub struct PowAux { @@ -126,14 +150,22 @@ pub trait PowAlgorithm { type Difficulty: TotalDifficulty + Default + Encode + Decode + Ord + Clone + Copy; /// Get the next block's difficulty. + /// + /// This function will be called twice during the import process, so the implementation + /// should be properly cached. fn difficulty(&self, parent: &BlockId) -> Result>; - /// Verify proof of work against the given difficulty. - fn verify( + /// Verify that the seal is valid against given pre hash. + fn verify_seal( &self, - parent: &BlockId, pre_hash: &B::Hash, seal: &Seal, + ) -> Result>; + /// Verify that the difficulty is valid against given seal. + fn verify_difficulty( + &self, difficulty: Self::Difficulty, + parent: &BlockId, + seal: &Seal, ) -> Result>; /// Mine a seal that satisfies the given difficulty. fn mine( @@ -145,59 +177,35 @@ pub trait PowAlgorithm { ) -> Result, Error>; } -/// A verifier for PoW blocks. -pub struct PowVerifier { - client: Arc, +/// A block importer for PoW. +pub struct PowBlockImport { algorithm: Algorithm, - inherent_data_providers: sp_inherents::InherentDataProviders, + inner: I, select_chain: Option, + client: Arc, + inherent_data_providers: sp_inherents::InherentDataProviders, check_inherents_after: <::Header as HeaderT>::Number, } -impl PowVerifier { +impl PowBlockImport where + B: BlockT, + I: BlockImport> + Send + Sync, + I::Error: Into, + C: ProvideRuntimeApi + Send + Sync + HeaderBackend + AuxStore + ProvideCache + BlockOf, + C::Api: BlockBuilderApi, + Algorithm: PowAlgorithm, +{ + /// Create a new block import suitable to be used in PoW pub fn new( + inner: I, client: Arc, algorithm: Algorithm, check_inherents_after: <::Header as HeaderT>::Number, select_chain: Option, inherent_data_providers: sp_inherents::InherentDataProviders, ) -> Self { - Self { client, algorithm, inherent_data_providers, select_chain, check_inherents_after } - } - - fn check_header( - &self, - mut header: B::Header, - parent_block_id: BlockId, - ) -> Result<(B::Header, Algorithm::Difficulty, DigestItem), Error> where - Algorithm: PowAlgorithm, - { - let hash = header.hash(); - - let (seal, inner_seal) = match header.digest_mut().pop() { - Some(DigestItem::Seal(id, seal)) => { - if id == POW_ENGINE_ID { - (DigestItem::Seal(id, seal.clone()), seal) - } else { - return Err(Error::WrongEngine(id)) - } - }, - _ => return Err(Error::HeaderUnsealed(hash)), - }; - - let pre_hash = header.hash(); - let difficulty = self.algorithm.difficulty(&parent_block_id)?; - - if !self.algorithm.verify( - &parent_block_id, - &pre_hash, - &inner_seal, - difficulty, - )? { - return Err(Error::InvalidSeal); - } - - Ok((header, difficulty, seal)) + Self { inner, client, algorithm, check_inherents_after, + select_chain, inherent_data_providers } } fn check_inherents( @@ -206,9 +214,7 @@ impl PowVerifier { block_id: BlockId, inherent_data: InherentData, timestamp_now: u64, - ) -> Result<(), Error> where - C: ProvideRuntimeApi, C::Api: BlockBuilderApi - { + ) -> Result<(), Error> { const MAX_TIMESTAMP_DRIFT_SECS: u64 = 60; if *block.header().number() < self.check_inherents_after { @@ -243,55 +249,165 @@ impl PowVerifier { } } -impl Verifier for PowVerifier where +impl BlockImport for PowBlockImport where + B: BlockT, + I: BlockImport> + Send + Sync, + I::Error: Into, + S: SelectChain, C: ProvideRuntimeApi + Send + Sync + HeaderBackend + AuxStore + ProvideCache + BlockOf, C::Api: BlockBuilderApi, - S: SelectChain, - Algorithm: PowAlgorithm + Send + Sync, + Algorithm: PowAlgorithm, { - fn verify( + type Error = ConsensusError; + type Transaction = sp_api::TransactionFor; + + fn check_block( &mut self, - origin: BlockOrigin, - header: B::Header, - justification: Option, - mut body: Option>, - ) -> Result<(BlockImportParams, Option)>>), String> { - let inherent_data = self.inherent_data_providers - .create_inherent_data().map_err(|e| e.into_string())?; - let timestamp_now = inherent_data.timestamp_inherent_data().map_err(|e| e.into_string())?; + block: BlockCheckParams, + ) -> Result { + self.inner.check_block(block).map_err(Into::into) + } + fn import_block( + &mut self, + mut block: BlockImportParams, + new_cache: HashMap>, + ) -> Result { let best_hash = match self.select_chain.as_ref() { Some(select_chain) => select_chain.best_chain() .map_err(|e| format!("Fetch best chain failed via select chain: {:?}", e))? .hash(), None => self.client.info().best_hash, }; - let hash = header.hash(); - let parent_hash = *header.parent_hash(); + + let parent_hash = *block.header.parent_hash(); let best_aux = PowAux::read::<_, B>(self.client.as_ref(), &best_hash)?; let mut aux = PowAux::read::<_, B>(self.client.as_ref(), &parent_hash)?; - let (checked_header, difficulty, seal) = self.check_header( - header, - BlockId::Hash(parent_hash), - )?; - aux.difficulty = difficulty; - aux.total_difficulty.increment(difficulty); + if let Some(inner_body) = block.body.take() { + let inherent_data = self.inherent_data_providers + .create_inherent_data().map_err(|e| e.into_string())?; + let timestamp_now = inherent_data.timestamp_inherent_data().map_err(|e| e.into_string())?; - if let Some(inner_body) = body.take() { - let block = B::new(checked_header.clone(), inner_body); + let check_block = B::new(block.header.clone(), inner_body); self.check_inherents( - block.clone(), + check_block.clone(), BlockId::Hash(parent_hash), inherent_data, timestamp_now )?; - body = Some(block.deconstruct().1); + block.body = Some(check_block.deconstruct().1); } - let key = aux_key(&hash); + let inner_seal = match block.post_digests.last() { + Some(DigestItem::Seal(id, seal)) => { + if id == &POW_ENGINE_ID { + seal.clone() + } else { + return Err(Error::::WrongEngine(*id).into()) + } + }, + _ => return Err(Error::::HeaderUnsealed(block.header.hash()).into()), + }; + + let intermediate = PowIntermediate::::decode( + &mut &block.intermediates.remove(INTERMEDIATE_KEY) + .ok_or(Error::::NoIntermediate)?[..] + ).map_err(|_| Error::::NoIntermediate)?; + + let difficulty = match intermediate.difficulty { + Some(difficulty) => difficulty, + None => self.algorithm.difficulty(&BlockId::hash(parent_hash))?, + }; + + if !self.algorithm.verify_difficulty( + difficulty, + &BlockId::hash(parent_hash), + &inner_seal, + )? { + return Err(Error::::InvalidDifficulty.into()) + } + + aux.difficulty = difficulty; + aux.total_difficulty.increment(difficulty); + + let key = aux_key(&intermediate.hash); + block.auxiliary.push((key, Some(aux.encode()))); + if block.fork_choice.is_none() { + block.fork_choice = Some(ForkChoiceStrategy::Custom( + aux.total_difficulty > best_aux.total_difficulty + )); + } + + self.inner.import_block(block, new_cache).map_err(Into::into) + } +} + +/// A verifier for PoW blocks. +pub struct PowVerifier { + algorithm: Algorithm, + _marker: PhantomData, +} + +impl PowVerifier { + pub fn new( + algorithm: Algorithm, + ) -> Self { + Self { algorithm, _marker: PhantomData } + } + + fn check_header( + &self, + mut header: B::Header, + ) -> Result<(B::Header, DigestItem), Error> where + Algorithm: PowAlgorithm, + { + let hash = header.hash(); + + let (seal, inner_seal) = match header.digest_mut().pop() { + Some(DigestItem::Seal(id, seal)) => { + if id == POW_ENGINE_ID { + (DigestItem::Seal(id, seal.clone()), seal) + } else { + return Err(Error::WrongEngine(id)) + } + }, + _ => return Err(Error::HeaderUnsealed(hash)), + }; + + let pre_hash = header.hash(); + + if !self.algorithm.verify_seal( + &pre_hash, + &inner_seal, + )? { + return Err(Error::InvalidSeal); + } + + Ok((header, seal)) + } +} + +impl Verifier for PowVerifier where + Algorithm: PowAlgorithm + Send + Sync, +{ + fn verify( + &mut self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + body: Option>, + ) -> Result<(BlockImportParams, Option)>>), String> { + let hash = header.hash(); + let (checked_header, seal) = self.check_header(header)?; + + let intermediate = PowIntermediate:: { + hash: hash, + difficulty: None, + }; + let import_block = BlockImportParams { origin, header: checked_header, @@ -300,10 +416,13 @@ impl Verifier for PowVerifier storage_changes: None, finalized: false, justification, - auxiliary: vec![(key, Some(aux.encode()))], - fork_choice: ForkChoiceStrategy::Custom( - aux.total_difficulty > best_aux.total_difficulty - ), + intermediates: { + let mut ret = HashMap::new(); + ret.insert(INTERMEDIATE_KEY.to_vec(), intermediate.encode()); + ret + }, + auxiliary: vec![], + fork_choice: None, allow_missing_state: false, import_existing: false, }; @@ -332,10 +451,7 @@ pub type PowImportQueue = BasicQueue; /// Import queue for PoW engine. pub fn import_queue( block_import: BoxBlockImport>, - client: Arc, algorithm: Algorithm, - check_inherents_after: <::Header as HeaderT>::Number, - select_chain: Option, inherent_data_providers: InherentDataProviders, ) -> Result< PowImportQueue>, @@ -345,18 +461,12 @@ pub fn import_queue( C: ProvideRuntimeApi + HeaderBackend + BlockOf + ProvideCache + AuxStore, C: Send + Sync + AuxStore + 'static, C::Api: BlockBuilderApi, - Algorithm: PowAlgorithm + Send + Sync + 'static, + Algorithm: PowAlgorithm + Clone + Send + Sync + 'static, S: SelectChain + 'static, { register_pow_inherent_data_provider(&inherent_data_providers)?; - let verifier = PowVerifier::new( - client.clone(), - algorithm, - check_inherents_after, - select_chain, - inherent_data_providers, - ); + let verifier = PowVerifier::new(algorithm); Ok(BasicQueue::new( verifier, @@ -485,7 +595,6 @@ fn mine_loop( continue 'outer } - let mut aux = PowAux::read(client, &best_hash)?; let mut proposer = futures::executor::block_on(env.init(&best_header)) .map_err(|e| Error::Environment(format!("{:?}", e)))?; @@ -526,38 +635,36 @@ fn mine_loop( } }; - aux.difficulty = difficulty; - aux.total_difficulty.increment(difficulty); - let hash = { + let (hash, seal) = { + let seal = DigestItem::Seal(POW_ENGINE_ID, seal); let mut header = header.clone(); - header.digest_mut().push(DigestItem::Seal(POW_ENGINE_ID, seal.clone())); - header.hash() + header.digest_mut().push(seal); + let hash = header.hash(); + let seal = header.digest_mut().pop() + .expect("Pushed one seal above; length greater than zero; qed"); + (hash, seal) }; - let key = aux_key(&hash); - let best_hash = match select_chain { - Some(select_chain) => select_chain.best_chain() - .map_err(Error::BestHashSelectChain)? - .hash(), - None => client.info().best_hash, + let intermediate = PowIntermediate:: { + hash, + difficulty: Some(difficulty), }; - let best_aux = PowAux::::read(client, &best_hash)?; - - // if the best block has changed in the meantime drop our proposal - if best_aux.total_difficulty > aux.total_difficulty { - continue 'outer - } let import_block = BlockImportParams { origin: BlockOrigin::Own, header, justification: None, - post_digests: vec![DigestItem::Seal(POW_ENGINE_ID, seal)], + post_digests: vec![seal], body: Some(body), storage_changes: Some(proposal.storage_changes), + intermediates: { + let mut ret = HashMap::new(); + ret.insert(INTERMEDIATE_KEY.to_vec(), intermediate.encode()); + ret + }, finalized: false, - auxiliary: vec![(key, Some(aux.encode()))], - fork_choice: ForkChoiceStrategy::Custom(true), + auxiliary: vec![], + fork_choice: None, allow_missing_state: false, import_existing: false, }; diff --git a/client/finality-grandpa/src/light_import.rs b/client/finality-grandpa/src/light_import.rs index 0da2248778..4ae35167be 100644 --- a/client/finality-grandpa/src/light_import.rs +++ b/client/finality-grandpa/src/light_import.rs @@ -697,7 +697,8 @@ pub mod tests { storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: true, import_existing: false, }; diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 9ad12c6c31..889250c54d 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -1032,7 +1032,8 @@ fn allows_reimporting_change_blocks() { storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, } @@ -1091,7 +1092,8 @@ fn test_bad_justification() { storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, } @@ -1829,7 +1831,8 @@ fn imports_justification_for_regular_blocks_on_import() { storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }; diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 1b13e83343..2369ba4f22 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -95,7 +95,8 @@ impl Verifier for PassThroughVerifier { justification, post_digests: vec![], auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }, maybe_keys)) diff --git a/client/src/client.rs b/client/src/client.rs index c74a005c6f..26b077277f 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -818,12 +818,19 @@ impl Client where finalized, auxiliary, fork_choice, + intermediates, import_existing, .. } = import_block; assert!(justification.is_some() && finalized || justification.is_none()); + if !intermediates.is_empty() { + return Err(Error::IncompletePipeline) + } + + let fork_choice = fork_choice.ok_or(Error::IncompletePipeline)?; + let import_headers = if post_digests.is_empty() { PrePostHeader::Same(header) } else { diff --git a/primitives/blockchain/src/error.rs b/primitives/blockchain/src/error.rs index d51ab787c7..24872448ab 100644 --- a/primitives/blockchain/src/error.rs +++ b/primitives/blockchain/src/error.rs @@ -126,6 +126,9 @@ pub enum Error { /// Invalid calculated state root on block import. #[display(fmt = "Calculated state root does not match.")] InvalidStateRoot, + /// Incomplete block import pipeline. + #[display(fmt = "Incomplete block import pipeline.")] + IncompletePipeline, /// A convenience variant for String #[display(fmt = "{}", _0)] Msg(String), diff --git a/primitives/consensus/common/src/block_import.rs b/primitives/consensus/common/src/block_import.rs index f8d05e1054..71315b63ef 100644 --- a/primitives/consensus/common/src/block_import.rs +++ b/primitives/consensus/common/src/block_import.rs @@ -142,13 +142,21 @@ pub struct BlockImportParams { /// Is this block finalized already? /// `true` implies instant finality. pub finalized: bool, + /// Intermediate values that are interpreted by block importers. Each block importer, + /// upon handling a value, removes it from the intermediate list. The final block importer + /// rejects block import if there are still intermediate values that remain unhandled. + pub intermediates: HashMap, Vec>, /// Auxiliary consensus data produced by the block. /// Contains a list of key-value pairs. If values are `None`, the keys /// will be deleted. pub auxiliary: Vec<(Vec, Option>)>, /// Fork choice strategy of this import. This should only be set by a /// synchronous import, otherwise it may race against other imports. - pub fork_choice: ForkChoiceStrategy, + /// `None` indicates that the current verifier or importer cannot yet + /// determine the fork choice value, and it expects subsequent importer + /// to modify it. If `None` is passed all the way down to bottom block + /// importer, the import fails with an `IncompletePipeline` error. + pub fork_choice: Option, /// Allow importing the block skipping state verification if parent state is missing. pub allow_missing_state: bool, /// Re-validate existing block. @@ -210,6 +218,7 @@ impl BlockImportParams { storage_changes: None, finalized: self.finalized, auxiliary: self.auxiliary, + intermediates: self.intermediates, allow_missing_state: self.allow_missing_state, fork_choice: self.fork_choice, import_existing: self.import_existing, diff --git a/test-utils/client/src/client_ext.rs b/test-utils/client/src/client_ext.rs index aa7383e3ab..e29ee787d0 100644 --- a/test-utils/client/src/client_ext.rs +++ b/test-utils/client/src/client_ext.rs @@ -96,7 +96,8 @@ impl ClientBlockImportExt for std::sync::A storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }; @@ -115,7 +116,8 @@ impl ClientBlockImportExt for std::sync::A storage_changes: None, finalized: false, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::Custom(true), + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::Custom(true)), allow_missing_state: false, import_existing: false, }; @@ -134,7 +136,8 @@ impl ClientBlockImportExt for std::sync::A storage_changes: None, finalized: true, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::Custom(true), + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::Custom(true)), allow_missing_state: false, import_existing: false, }; @@ -158,7 +161,8 @@ impl ClientBlockImportExt for std::sync::A storage_changes: None, finalized: true, auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, }; @@ -182,7 +186,8 @@ impl ClientBlockImportExt for Client ClientBlockImportExt for Client ClientBlockImportExt for Client ClientBlockImportExt for Client Date: Thu, 23 Jan 2020 12:58:36 +0100 Subject: [PATCH 172/296] client/finality-grandpa: Make round_communication use bounded channel (#4691) * clinet/finality-grandpa: Make round_communication use bounded channel `round_communication` returns a `Sink` and a `Stream` for outgoing and incoming messages. The messages send into the `Sink` are forwarded down to the network as well as send back into the `Stream` to ensure the node processes its own messages. So far, to send messages into the `Sink` back into the `Stream`, an unbounded channel was used. This patch updates `round_communication` and `OutgoingMessages` to use a bounded channel. This is part of a greater effort to reduce the number of owners of components within `finality-grandpa` and `network` as well as to reduce the amount of unbounded channels. For details see d4fbb897c and f0c18520a. * client/finality-grandpa: Import futures03::future::ready at the top * client/finality-grandpa: Make tests use compat of future 03 * client/finality-grandpa: Do not import ready into scope Instead of importing futures03::future::ready into the scope, only import futures::future03 into scope and call ready as furure03::ready. --- .../finality-grandpa/src/communication/mod.rs | 89 ++++++++++--------- client/finality-grandpa/src/environment.rs | 9 +- client/finality-grandpa/src/tests.rs | 25 ++++-- 3 files changed, 76 insertions(+), 47 deletions(-) diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 18cb14c739..64637c0ed8 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -27,12 +27,13 @@ //! In the future, there will be a fallback for allowing sending the same message //! under certain conditions that are used to un-stick the protocol. -use futures::{prelude::*, sync::mpsc}; +use futures::prelude::*; use futures03::{ channel::mpsc as mpsc03, compat::Compat, - future::{Future as Future03}, - stream::StreamExt, + future::{self as future03, Future as Future03}, + sink::Sink as Sink03, + stream::{Stream as Stream03, StreamExt}, }; use log::{debug, trace}; use parking_lot::Mutex; @@ -276,8 +277,8 @@ impl> NetworkBridge { local_key: Option, has_voted: HasVoted, ) -> ( - impl Stream,Error=Error>, - impl Sink,SinkError=Error>, + impl Stream03> + Unpin, + OutgoingMessages, ) { self.note_round( round, @@ -295,22 +296,20 @@ impl> NetworkBridge { }); let topic = round_topic::(round.0, set_id.0); - let incoming = Compat::new(self.gossip_engine.messages_for(topic) - .map(|item| Ok::<_, ()>(item))) - .filter_map(|notification| { + let incoming = self.gossip_engine.messages_for(topic) + .filter_map(move |notification| { let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); - if let Err(ref e) = decoded { - debug!(target: "afg", "Skipping malformed message {:?}: {}", notification, e); - } - decoded.ok() - }) - .and_then(move |msg| { - match msg { - GossipMessage::Vote(msg) => { + + match decoded { + Err(ref e) => { + debug!(target: "afg", "Skipping malformed message {:?}: {}", notification, e); + return future03::ready(None); + } + Ok(GossipMessage::Vote(msg)) => { // check signature. if !voters.contains_key(&msg.message.id) { debug!(target: "afg", "Skipping message from unknown voter {}", msg.message.id); - return Ok(None); + return future03::ready(None); } if voters.len() <= TELEMETRY_VOTERS_LIMIT { @@ -339,18 +338,16 @@ impl> NetworkBridge { }; } - Ok(Some(msg.message)) + future03::ready(Some(msg.message)) } _ => { debug!(target: "afg", "Skipping unknown message type"); - return Ok(None); + return future03::ready(None); } } - }) - .filter_map(|x| x) - .map_err(|()| Error::Network(format!("Failed to receive message on unbounded stream"))); + }); - let (tx, out_rx) = mpsc::unbounded(); + let (tx, out_rx) = mpsc03::channel(0); let outgoing = OutgoingMessages:: { round: round.0, set_id: set_id.0, @@ -360,14 +357,10 @@ impl> NetworkBridge { has_voted, }; - let out_rx = out_rx.map_err(move |()| Error::Network( - format!("Failed to receive on unbounded receiver for round {}", round.0) - )); - // Combine incoming votes from external GRANDPA nodes with outgoing // votes from our own GRANDPA voter to have a single // vote-import-pipeline. - let incoming = incoming.select(out_rx); + let incoming = futures03::stream::select(incoming, out_rx); (incoming, outgoing) } @@ -690,21 +683,29 @@ pub(crate) fn check_message_sig_with_buffer( /// use the same raw message and key to sign. This is currently true for /// `ed25519` and `BLS` signatures (which we might use in the future), care must /// be taken when switching to different key types. -struct OutgoingMessages { +pub(crate) struct OutgoingMessages { round: RoundNumber, set_id: SetIdNumber, locals: Option<(AuthorityPair, AuthorityId)>, - sender: mpsc::UnboundedSender>, + sender: mpsc03::Sender>, network: GossipEngine, has_voted: HasVoted, } -impl Sink for OutgoingMessages +impl Unpin for OutgoingMessages {} + +impl Sink03> for OutgoingMessages { - type SinkItem = Message; - type SinkError = Error; + type Error = Error; + + fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll03> { + Sink03::poll_ready(Pin::new(&mut self.sender), cx) + .map(|elem| { elem.map_err(|e| { + Error::Network(format!("Failed to poll_ready channel sender: {:?}", e)) + })}) + } - fn start_send(&mut self, mut msg: Message) -> StartSend, Error> { + fn start_send(mut self: Pin<&mut Self>, mut msg: Message) -> Result<(), Self::Error> { // if we've voted on this round previously under the same key, send that vote instead match &mut msg { finality_grandpa::Message::PrimaryPropose(ref mut vote) => @@ -760,17 +761,23 @@ impl Sink for OutgoingMessages self.network.gossip_message(topic, message.encode(), false); // forward the message to the inner sender. - let _ = self.sender.unbounded_send(signed); - } + return self.sender.start_send(signed).map_err(|e| { + Error::Network(format!("Failed to start_send on channel sender: {:?}", e)) + }); + }; - Ok(AsyncSink::Ready) + Ok(()) } - fn poll_complete(&mut self) -> Poll<(), Error> { Ok(Async::Ready(())) } + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context) -> Poll03> { + Poll03::Ready(Ok(())) + } - fn close(&mut self) -> Poll<(), Error> { - // ignore errors since we allow this inner sender to be closed already. - self.sender.close().or_else(|_| Ok(Async::Ready(()))) + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll03> { + Sink03::poll_close(Pin::new(&mut self.sender), cx) + .map(|elem| { elem.map_err(|e| { + Error::Network(format!("Failed to poll_close channel sender: {:?}", e)) + })}) } } diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index 372229001d..c5c6291dc0 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -22,7 +22,11 @@ use std::time::Duration; use log::{debug, warn, info}; use parity_scale_codec::{Decode, Encode}; use futures::prelude::*; -use futures03::future::{FutureExt as _, TryFutureExt as _}; +use futures03::{ + compat::{Compat, CompatSink}, + future::{FutureExt as _, TryFutureExt as _}, + stream::StreamExt as _, +}; use futures_timer::Delay; use parking_lot::RwLock; use sp_blockchain::{HeaderBackend, Error as ClientError}; @@ -608,6 +612,9 @@ where has_voted, ); + let incoming = Compat::new(incoming.map(|item| Ok::<_, Error>(item))); + let outgoing = CompatSink::new(outgoing); + // schedule incoming messages from the network to be held until // corresponding blocks are imported. let incoming = Box::new(UntilVoteTargetImported::new( diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 889250c54d..fdfb2fd808 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -37,15 +37,17 @@ use sp_consensus::{ BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, ImportResult, BlockImport, import_queue::{BoxJustificationImport, BoxFinalityProofImport}, }; -use std::collections::{HashMap, HashSet}; -use std::result; +use std::{ + collections::{HashMap, HashSet}, + result, + pin::Pin, task, +}; use parity_scale_codec::Decode; -use sp_runtime::traits::{Header as HeaderT, HasherFor}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, HasherFor}; use sp_runtime::generic::{BlockId, DigestItem}; use sp_core::{H256, NativeOrEncoded, ExecutionContext, crypto::Public}; use sp_finality_grandpa::{GRANDPA_ENGINE_ID, AuthorityList, GrandpaApi}; use sp_state_machine::{InMemoryBackend, prove_read, read_proof_check}; -use std::{pin::Pin, task}; use authorities::AuthoritySet; use finality_proof::{ @@ -1282,6 +1284,9 @@ fn voter_persists_its_votes() { HasVoted::No, ); + let round_rx = futures03::compat::Compat::new(round_rx.map(|item| Ok::<_, Error>(item))); + let round_tx = futures03::compat::CompatSink::new(round_tx); + let round_tx = Arc::new(Mutex::new(round_tx)); let exit_tx = Arc::new(Mutex::new(Some(exit_tx))); @@ -1332,7 +1337,17 @@ fn voter_persists_its_votes() { target_hash: block_30_hash, }; - round_tx.lock().start_send(finality_grandpa::Message::Prevote(prevote)).unwrap(); + // One should either be calling `Sink::send` or `Sink::start_send` followed + // by `Sink::poll_complete` to make sure items are being flushed. Given that + // we send in a loop including a delay until items are received, this can be + // ignored for the sake of reduced complexity. + if !round_tx.lock() + .start_send(finality_grandpa::Message::Prevote(prevote)) + .unwrap() + .is_ready() { + panic!("expected sink to be ready to write to."); + } + Ok(()) }).map_err(|_| panic!())) -- GitLab From fcd4391b9a86a289aa46893afcc582e498ec5218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 23 Jan 2020 14:35:04 +0100 Subject: [PATCH 173/296] Expose `Error` in metadata for `pallet-utility` (#4721) --- frame/utility/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index 9ab2975e29..7344294684 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -318,6 +318,8 @@ impl TypeId for IndexedUtilityModuleId { decl_module! { pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + /// Deposit one of this module's events by using the default implementation. fn deposit_event() = default; -- GitLab From 3fab0c77f935873121b6a0c6f442ddaa197353e4 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 23 Jan 2020 05:41:22 -0800 Subject: [PATCH 174/296] Refactor and test spec block rules (#4670) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor and test spec block rules * address review * Update client/src/block_rules.rs Co-Authored-By: André Silva Co-authored-by: André Silva --- bin/node/testing/src/client.rs | 1 + client/block-builder/src/lib.rs | 2 - client/src/block_rules.rs | 72 ++++++++++++++ client/src/client.rs | 142 ++++++++++++++++++++++----- client/src/lib.rs | 1 + test-utils/client/src/lib.rs | 41 +++++--- test-utils/runtime/client/src/lib.rs | 7 +- 7 files changed, 225 insertions(+), 41 deletions(-) create mode 100644 client/src/block_rules.rs diff --git a/bin/node/testing/src/client.rs b/bin/node/testing/src/client.rs index 140d1cbfc3..1dddd8ba5a 100644 --- a/bin/node/testing/src/client.rs +++ b/bin/node/testing/src/client.rs @@ -57,6 +57,7 @@ pub trait TestClientBuilderExt: Sized { } impl TestClientBuilderExt for substrate_test_client::TestClientBuilder< + node_primitives::Block, sc_client::LocalCallExecutor, Backend, GenesisParameters, diff --git a/client/block-builder/src/lib.rs b/client/block-builder/src/lib.rs index 9b403dead4..d0eb8b2892 100644 --- a/client/block-builder/src/lib.rs +++ b/client/block-builder/src/lib.rs @@ -197,8 +197,6 @@ where )?; let parent_hash = self.parent_hash; - // The unsafe is required because the consume requires that we drop/consume the inner api - // (what we do here). let storage_changes = self.api.into_storage_changes( &state, changes_trie_state.as_ref(), diff --git a/client/src/block_rules.rs b/client/src/block_rules.rs new file mode 100644 index 0000000000..e561451181 --- /dev/null +++ b/client/src/block_rules.rs @@ -0,0 +1,72 @@ +// Copyright 2020 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 fixed chain specification rules + +use std::collections::{HashMap, HashSet}; + +use sp_runtime::{ + traits::{Block as BlockT, NumberFor}, +}; + +use sc_client_api::{ForkBlocks, BadBlocks}; + +/// Chain specification rules lookup result. +pub enum LookupResult { + /// Specification rules do not contain any special rules about this block + NotSpecial, + /// The bock is known to be bad and should not be imported + KnownBad, + /// There is a specified canonical block hash for the given height + Expected(B::Hash) +} + +/// Chain-specific block filtering rules. +/// +/// This holds known bad blocks and known good forks, and +/// is usually part of the chain spec. +pub struct BlockRules { + bad: HashSet, + forks: HashMap, B::Hash>, +} + +impl BlockRules { + /// New block rules with provided black and white lists. + pub fn new( + fork_blocks: ForkBlocks, + bad_blocks: BadBlocks, + ) -> Self { + Self { + bad: bad_blocks.unwrap_or(HashSet::new()), + forks: fork_blocks.unwrap_or(vec![]).into_iter().collect(), + } + } + + /// Check if there's any rule affecting the given block. + pub fn lookup(&self, number: NumberFor, hash: &B::Hash) -> LookupResult { + if let Some(hash_for_height) = self.forks.get(&number) { + if hash_for_height != hash { + return LookupResult::Expected(hash_for_height.clone()); + } + } + + if self.bad.contains(hash) { + return LookupResult::KnownBad; + } + + LookupResult::NotSpecial + } +} diff --git a/client/src/client.rs b/client/src/client.rs index 26b077277f..a3bbf84f7d 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -82,7 +82,7 @@ use sp_blockchain::Error; use crate::{ call_executor::LocalCallExecutor, light::{call_executor::prove_execution, fetcher::ChangesProof}, - in_mem, genesis, cht, + in_mem, genesis, cht, block_rules::{BlockRules, LookupResult as BlockLookupResult}, }; /// Substrate Client @@ -94,8 +94,7 @@ pub struct Client where Block: BlockT { finality_notification_sinks: Mutex>>>, // holds the block hash currently being imported. TODO: replace this with block queue importing_block: RwLock>, - fork_blocks: ForkBlocks, - bad_blocks: BadBlocks, + block_rules: BlockRules, execution_extensions: ExecutionExtensions, _phantom: PhantomData, } @@ -219,8 +218,7 @@ impl Client where import_notification_sinks: Default::default(), finality_notification_sinks: Default::default(), importing_block: Default::default(), - fork_blocks, - bad_blocks, + block_rules: BlockRules::new(fork_blocks, bad_blocks), execution_extensions, _phantom: Default::default(), }) @@ -1551,32 +1549,25 @@ impl sp_consensus::BlockImport for &Client { + trace!( + "Rejecting known bad block: #{} {:?}", + number, + hash, + ); + return Ok(ImportResult::KnownBad); + }, + BlockLookupResult::Expected(expected_hash) => { trace!( "Rejecting block from known invalid fork. Got {:?}, expected: {:?} at height {}", hash, - h, + expected_hash, number ); return Ok(ImportResult::KnownBad); - } - } - - let bad_block = self.bad_blocks.as_ref() - .filter(|bs| bs.contains(&hash)) - .is_some(); - - if bad_block { - trace!( - "Rejecting known bad block: #{} {:?}", - number, - hash, - ); - return Ok(ImportResult::KnownBad); + }, + BlockLookupResult::NotSpecial => {} } // Own status must be checked first. If the block and ancestry is pruned @@ -3009,6 +3000,107 @@ pub(crate) mod tests { ); } + + #[test] + fn respects_block_rules() { + + fn run_test( + record_only: bool, + known_bad: &mut HashSet, + fork_rules: &mut Vec<(u64, H256)>, + ) { + let mut client = if record_only { + TestClientBuilder::new().build() + } else { + TestClientBuilder::new() + .set_block_rules( + Some(fork_rules.clone()), + Some(known_bad.clone()), + ) + .build() + }; + + let block_ok = client.new_block_at(&BlockId::Number(0), Default::default(), false) + .unwrap().build().unwrap().block; + + let params = BlockCheckParams { + hash: block_ok.hash().clone(), + number: 0, + parent_hash: block_ok.header().parent_hash().clone(), + allow_missing_state: false, + import_existing: false, + }; + assert_eq!(client.check_block(params).unwrap(), ImportResult::imported(false)); + + // this is 0x0d6d6612a10485370d9e085aeea7ec427fb3f34d961c6a816cdbe5cde2278864 + let mut block_not_ok = client.new_block_at(&BlockId::Number(0), Default::default(), false) + .unwrap(); + block_not_ok.push_storage_change(vec![0], Some(vec![1])).unwrap(); + let block_not_ok = block_not_ok.build().unwrap().block; + + let params = BlockCheckParams { + hash: block_not_ok.hash().clone(), + number: 0, + parent_hash: block_not_ok.header().parent_hash().clone(), + allow_missing_state: false, + import_existing: false, + }; + if record_only { + known_bad.insert(block_not_ok.hash()); + } else { + assert_eq!(client.check_block(params).unwrap(), ImportResult::KnownBad); + } + + // Now going to the fork + client.import_as_final(BlockOrigin::Own, block_ok).unwrap(); + + // And check good fork + let mut block_ok = client.new_block_at(&BlockId::Number(1), Default::default(), false) + .unwrap(); + block_ok.push_storage_change(vec![0], Some(vec![2])).unwrap(); + let block_ok = block_ok.build().unwrap().block; + + let params = BlockCheckParams { + hash: block_ok.hash().clone(), + number: 1, + parent_hash: block_ok.header().parent_hash().clone(), + allow_missing_state: false, + import_existing: false, + }; + if record_only { + fork_rules.push((1, block_ok.hash().clone())); + } + assert_eq!(client.check_block(params).unwrap(), ImportResult::imported(false)); + + // And now try bad fork + let mut block_not_ok = client.new_block_at(&BlockId::Number(1), Default::default(), false) + .unwrap(); + block_not_ok.push_storage_change(vec![0], Some(vec![3])).unwrap(); + let block_not_ok = block_not_ok.build().unwrap().block; + + let params = BlockCheckParams { + hash: block_not_ok.hash().clone(), + number: 1, + parent_hash: block_not_ok.header().parent_hash().clone(), + allow_missing_state: false, + import_existing: false, + }; + + if !record_only { + assert_eq!(client.check_block(params).unwrap(), ImportResult::KnownBad); + } + } + + let mut known_bad = HashSet::new(); + let mut fork_rules = Vec::new(); + + // records what bad_blocks and fork_blocks hashes should be + run_test(true, &mut known_bad, &mut fork_rules); + + // enforces rules and actually makes assertions + run_test(false, &mut known_bad, &mut fork_rules); + } + #[test] fn returns_status_for_pruned_blocks() { let _ = env_logger::try_init(); diff --git a/client/src/lib.rs b/client/src/lib.rs index 8aa71c5ec5..4caabfa201 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -83,6 +83,7 @@ pub mod light; pub mod leaves; mod call_executor; mod client; +mod block_rules; pub use sc_client_api::{ blockchain, diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index 8603b26d50..76aa1acd8a 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -21,7 +21,10 @@ pub mod client_ext; pub use sc_client::{blockchain, self}; -pub use sc_client_api::execution_extensions::{ExecutionStrategies, ExecutionExtensions}; +pub use sc_client_api::{ + execution_extensions::{ExecutionStrategies, ExecutionExtensions}, + ForkBlocks, BadBlocks, +}; pub use sc_client_db::{Backend, self}; pub use sp_consensus; pub use sc_executor::{NativeExecutor, WasmExecutionMethod, self}; @@ -33,7 +36,6 @@ pub use sp_keyring::{ pub use sp_core::{Blake2Hasher, traits::BareCryptoStorePtr}; pub use sp_runtime::{Storage, StorageChild}; pub use sp_state_machine::ExecutionStrategy; - pub use self::client_ext::{ClientExt, ClientBlockImportExt}; use std::sync::Arc; @@ -61,23 +63,25 @@ impl GenesisInit for () { } /// A builder for creating a test client instance. -pub struct TestClientBuilder { +pub struct TestClientBuilder { execution_strategies: ExecutionStrategies, genesis_init: G, child_storage_extension: HashMap, StorageChild>, backend: Arc, _executor: std::marker::PhantomData, keystore: Option, + fork_blocks: ForkBlocks, + bad_blocks: BadBlocks, } impl Default - for TestClientBuilder, G> { + for TestClientBuilder, G> { fn default() -> Self { Self::with_default_backend() } } -impl TestClientBuilder, G> { +impl TestClientBuilder, G> { /// 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)); @@ -91,7 +95,7 @@ impl TestClientBuilder TestClientBuilder { +impl TestClientBuilder { /// Create a new instance of the test client builder. pub fn with_backend(backend: Arc) -> Self { TestClientBuilder { @@ -101,6 +105,8 @@ impl TestClientBuilder genesis_init: Default::default(), _executor: Default::default(), keystore: None, + fork_blocks: None, + bad_blocks: None, } } @@ -152,8 +158,18 @@ impl TestClientBuilder self } + /// Sets custom block rules. + pub fn set_block_rules(mut self, + fork_blocks: ForkBlocks, + bad_blocks: BadBlocks, + ) -> Self { + self.fork_blocks = fork_blocks; + self.bad_blocks = bad_blocks; + self + } + /// Build the test client with the given native executor. - pub fn build_with_executor( + pub fn build_with_executor( self, executor: Executor, ) -> ( @@ -167,7 +183,6 @@ impl TestClientBuilder ) where Executor: sc_client::CallExecutor + 'static, Backend: sc_client_api::backend::Backend, - Block: BlockT, { let storage = { @@ -191,8 +206,8 @@ impl TestClientBuilder self.backend.clone(), executor, &storage, - Default::default(), - Default::default(), + self.fork_blocks, + self.bad_blocks, ExecutionExtensions::new( self.execution_strategies, self.keystore.clone(), @@ -205,13 +220,14 @@ impl TestClientBuilder } } -impl TestClientBuilder< +impl TestClientBuilder< + Block, sc_client::LocalCallExecutor>, Backend, G, > { /// Build the test client with the given native executor. - pub fn build_with_native_executor( + pub fn build_with_native_executor( self, executor: I, ) -> ( @@ -226,7 +242,6 @@ impl TestClientBuilder< I: Into>>, E: sc_executor::NativeExecutionDispatch + 'static, Backend: sc_client_api::backend::Backend + 'static, - Block: BlockT, { let executor = executor.into().unwrap_or_else(|| NativeExecutor::new(WasmExecutionMethod::Interpreted, None) diff --git a/test-utils/runtime/client/src/lib.rs b/test-utils/runtime/client/src/lib.rs index 7646f4a960..21cf94dfa6 100644 --- a/test-utils/runtime/client/src/lib.rs +++ b/test-utils/runtime/client/src/lib.rs @@ -140,7 +140,12 @@ impl substrate_test_client::GenesisInit for GenesisParameters { } /// A `TestClient` with `test-runtime` builder. -pub type TestClientBuilder = substrate_test_client::TestClientBuilder; +pub type TestClientBuilder = substrate_test_client::TestClientBuilder< + substrate_test_runtime::Block, + E, + B, + GenesisParameters, +>; /// Test client type with `LocalExecutor` and generic Backend. pub type Client = sc_client::Client< -- GitLab From 96027d1f6d0bb8a408966eaeb5c60d0ce43acdb5 Mon Sep 17 00:00:00 2001 From: Hero Bird Date: Thu, 23 Jan 2020 15:13:49 +0100 Subject: [PATCH 175/296] [contracts] Add ext_tombstone_deposit (#4722) * [contracts] add ext_tombstone_deposit * [contracts] update tombstone_deposit docs --- frame/contracts/src/exec.rs | 7 +++ frame/contracts/src/lib.rs | 2 + frame/contracts/src/wasm/mod.rs | 66 +++++++++++++++++++++++++++++ frame/contracts/src/wasm/runtime.rs | 17 ++++++++ 4 files changed, 92 insertions(+) diff --git a/frame/contracts/src/exec.rs b/frame/contracts/src/exec.rs index 9d786c320b..ceaccd35cb 100644 --- a/frame/contracts/src/exec.rs +++ b/frame/contracts/src/exec.rs @@ -161,6 +161,9 @@ pub trait Ext { /// Returns the minimum balance that is required for creating an account. fn minimum_balance(&self) -> BalanceOf; + /// Returns the deposit required to create a tombstone upon contract eviction. + fn tombstone_deposit(&self) -> BalanceOf; + /// Returns a random number for the current block with the given subject. fn random(&self, subject: &[u8]) -> SeedOf; @@ -779,6 +782,10 @@ where self.ctx.config.existential_deposit } + fn tombstone_deposit(&self) -> BalanceOf { + self.ctx.config.tombstone_deposit + } + fn deposit_event(&mut self, topics: Vec, data: Vec) { self.ctx.deferred.push(DeferredAction::DepositEvent { topics, diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index 40ce86518a..d16462d8bf 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -969,6 +969,7 @@ impl OnFreeBalanceZero for Module { pub struct Config { pub schedule: Schedule, pub existential_deposit: BalanceOf, + pub tombstone_deposit: BalanceOf, pub max_depth: u32, pub max_value_size: u32, pub contract_account_instantiate_fee: BalanceOf, @@ -981,6 +982,7 @@ impl Config { Config { schedule: >::current_schedule(), existential_deposit: T::Currency::minimum_balance(), + tombstone_deposit: T::TombstoneDeposit::get(), max_depth: T::MaxDepth::get(), max_value_size: T::MaxValueSize::get(), contract_account_instantiate_fee: T::ContractFee::get(), diff --git a/frame/contracts/src/wasm/mod.rs b/frame/contracts/src/wasm/mod.rs index 60402cf3a0..1ea2067a8d 100644 --- a/frame/contracts/src/wasm/mod.rs +++ b/frame/contracts/src/wasm/mod.rs @@ -299,6 +299,10 @@ mod tests { 666 } + fn tombstone_deposit(&self) -> u64 { + 16 + } + fn random(&self, subject: &[u8]) -> H256 { H256::from_slice(subject) } @@ -397,6 +401,9 @@ mod tests { fn minimum_balance(&self) -> u64 { (**self).minimum_balance() } + fn tombstone_deposit(&self) -> u64 { + (**self).tombstone_deposit() + } fn random(&self, subject: &[u8]) -> H256 { (**self).random(subject) } @@ -1271,6 +1278,65 @@ mod tests { ).unwrap(); } + const CODE_TOMBSTONE_DEPOSIT: &str = r#" +(module + (import "env" "ext_tombstone_deposit" (func $ext_tombstone_deposit)) + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + (func (export "call") + (call $ext_tombstone_deposit) + + ;; assert $ext_scratch_size == 8 + (call $assert + (i32.eq + (call $ext_scratch_size) + (i32.const 8) + ) + ) + + ;; copy contents of the scratch buffer into the contract's memory. + (call $ext_scratch_read + (i32.const 8) ;; Pointer in memory to the place where to copy. + (i32.const 0) ;; Offset from the start of the scratch buffer. + (i32.const 8) ;; Count of bytes to copy. + ) + + ;; assert that contents of the buffer is equal to the i64 value of 16. + (call $assert + (i64.eq + (i64.load + (i32.const 8) + ) + (i64.const 16) + ) + ) + ) + (func (export "deploy")) +) +"#; + + #[test] + fn tombstone_deposit() { + let mut gas_meter = GasMeter::with_limit(50_000, 1); + let _ = execute( + CODE_TOMBSTONE_DEPOSIT, + vec![], + MockExt::default(), + &mut gas_meter, + ).unwrap(); + } + const CODE_RANDOM: &str = r#" (module (import "env" "ext_random" (func $ext_random (param i32 i32))) diff --git a/frame/contracts/src/wasm/runtime.rs b/frame/contracts/src/wasm/runtime.rs index 75751b6d35..07cb8cb524 100644 --- a/frame/contracts/src/wasm/runtime.rs +++ b/frame/contracts/src/wasm/runtime.rs @@ -623,6 +623,23 @@ define_env!(Env, , Ok(()) }, + // Stores the tombstone deposit into the scratch buffer. + // + // The data is encoded as T::Balance. The current contents of the scratch + // buffer are overwritten. + // + // # Note + // + // The tombstone deposit is on top of the existential deposit. So in order for + // a contract to leave a tombstone the balance of the contract must not go + // below the sum of existential deposit and the tombstone deposit. The sum + // is commonly referred as subsistence threshold in code. + ext_tombstone_deposit(ctx) => { + ctx.scratch_buf.clear(); + ctx.ext.tombstone_deposit().encode_to(&mut ctx.scratch_buf); + Ok(()) + }, + // Decodes the given buffer as a `T::Call` and adds it to the list // of to-be-dispatched calls. // -- GitLab From bc85d352681018e5b19369b758c013a52c5c3032 Mon Sep 17 00:00:00 2001 From: Hero Bird Date: Thu, 23 Jan 2020 16:59:00 +0100 Subject: [PATCH 176/296] [contracts] minor follow-up on PR #4722 (#4723) --- bin/node/runtime/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index e158cbe2cb..ecc16ee143 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 204, - impl_version: 204, + spec_version: 205, + impl_version: 205, apis: RUNTIME_API_VERSIONS, }; -- GitLab From 219fad62273d5221d53a048f7bcd6c981d85a45d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 24 Jan 2020 10:02:55 +0100 Subject: [PATCH 177/296] Expose recovery module errors in metadata (#4727) --- frame/recovery/src/lib.rs | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/frame/recovery/src/lib.rs b/frame/recovery/src/lib.rs index d0b5783587..f63f216fc7 100644 --- a/frame/recovery/src/lib.rs +++ b/frame/recovery/src/lib.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . //! # Recovery Pallet -//! +//! //! - [`recovery::Trait`](./trait.Trait.html) //! - [`Call`](./enum.Call.html) //! @@ -82,7 +82,7 @@ //! permissionless. However, the recovery deposit is an economic deterrent that //! should disincentivize would-be attackers from trying to maliciously recover //! accounts. -//! +//! //! The recovery deposit can always be claimed by the account which is trying to //! to be recovered. In the case of a malicious recovery attempt, the account //! owner who still has access to their account can claim the deposit and @@ -121,14 +121,14 @@ //! change as well. //! //! ## Interface -//! +//! //! ### Dispatchable Functions -//! +//! //! #### For General Users -//! +//! //! * `create_recovery` - Create a recovery configuration for your account and make it recoverable. //! * `initiate_recovery` - Start the recovery process for a recoverable account. -//! +//! //! #### For Friends of a Recoverable Account //! * `vouch_recovery` - As a `friend` of a recoverable account, vouch for a recovery attempt on the account. //! @@ -141,7 +141,7 @@ //! //! * `close_recovery` - Close an active recovery process for your account and reclaim the recovery deposit. //! * `remove_recovery` - Remove the recovery configuration from the account, making it un-recoverable. -//! +//! //! #### For Super Users //! //! * `set_recovered` - The ROOT origin is able to skip the recovery process and directly allow @@ -314,9 +314,11 @@ decl_error! { decl_module! { pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + /// Deposit one of this module's events by using the default implementation. fn deposit_event() = default; - + /// Send a call through a recovered account. /// /// The dispatch origin for this call must be _Signed_ and registered to @@ -340,7 +342,7 @@ decl_module! { ensure!(Self::recovered_account(&account) == Some(who), Error::::NotAllowed); call.dispatch(frame_system::RawOrigin::Signed(account).into()) } - + /// Allow ROOT to bypass the recovery process and set an a rescuer account /// for a lost account directly. /// @@ -361,7 +363,7 @@ decl_module! { >::insert(&lost, &rescuer); Self::deposit_event(RawEvent::AccountRecovered(lost, rescuer)); } - + /// Create a recovery configuration for your account. This makes your account recoverable. /// /// Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance @@ -425,7 +427,7 @@ decl_module! { >::insert(&who, recovery_config); Self::deposit_event(RawEvent::RecoveryCreated(who)); } - + /// Initiate the process for recovering a recoverable account. /// /// Payment: `RecoveryDeposit` balance will be reserved for initiating the @@ -468,7 +470,7 @@ decl_module! { >::insert(&account, &who, recovery_status); Self::deposit_event(RawEvent::RecoveryInitiated(account, who)); } - + /// Allow a "friend" of a recoverable account to vouch for an active recovery /// process for that account. /// @@ -512,7 +514,7 @@ decl_module! { >::insert(&lost, &rescuer, active_recovery); Self::deposit_event(RawEvent::RecoveryVouched(lost, rescuer, who)); } - + /// Allow a successful rescuer to claim their recovered account. /// /// The dispatch origin for this call must be _Signed_ and must be a "rescuer" @@ -555,7 +557,7 @@ decl_module! { >::insert(&account, &who); Self::deposit_event(RawEvent::AccountRecovered(account, who)); } - + /// As the controller of a recoverable account, close an active recovery /// process for your account. /// @@ -586,7 +588,7 @@ decl_module! { let _ = T::Currency::repatriate_reserved(&rescuer, &who, active_recovery.deposit); Self::deposit_event(RawEvent::RecoveryClosed(who, rescuer)); } - + /// Remove the recovery process for your account. /// /// NOTE: The user must make sure to call `close_recovery` on all active -- GitLab From e5fed334b070e75ad47053e7f65e046a3c2b4dce Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 24 Jan 2020 04:21:24 -0800 Subject: [PATCH 178/296] Refactor tx-pool maintenance and other high-level api (#4629) * Reduction. * Reformation. * add locked timer stuff * fix issues and introduce full pool * arrange together * fix benches * fix new_light * Add revalidation test case * review fixes * review fixes * use just ready future * address review --- bin/node-template/src/service.rs | 13 +- bin/node/cli/src/service.rs | 24 +- client/service/src/builder.rs | 6 +- client/service/src/lib.rs | 8 +- .../transaction-pool/graph/benches/basics.rs | 17 +- client/transaction-pool/graph/src/pool.rs | 22 +- .../graph/src/validated_pool.rs | 4 +- client/transaction-pool/src/api.rs | 42 +- client/transaction-pool/src/lib.rs | 231 ++++++- client/transaction-pool/src/maintainer.rs | 645 ------------------ client/transaction-pool/src/tests.rs | 123 +++- primitives/transaction-pool/src/pool.rs | 115 +--- 12 files changed, 423 insertions(+), 827 deletions(-) delete mode 100644 client/transaction-pool/src/maintainer.rs diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index ed2299e30f..458656d836 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -43,9 +43,7 @@ macro_rules! new_full_start { .with_transaction_pool(|config, client, _fetcher| { let pool_api = sc_transaction_pool::FullChainApi::new(client.clone()); let pool = sc_transaction_pool::BasicPool::new(config, pool_api); - let maintainer = sc_transaction_pool::FullBasicPoolMaintainer::new(pool.pool().clone(), client); - let maintainable_pool = sp_transaction_pool::MaintainableTransactionPool::new(pool, maintainer); - Ok(maintainable_pool) + Ok(pool) })? .with_import_queue(|_config, client, mut select_chain, transaction_pool| { let select_chain = select_chain.take() @@ -207,11 +205,12 @@ pub fn new_light(config: Configuration; #[allow(dead_code)] -type ConcreteTransactionPool = sp_transaction_pool::MaintainableTransactionPool< - sc_transaction_pool::BasicPool< - sc_transaction_pool::FullChainApi, - ConcreteBlock - >, - sc_transaction_pool::FullBasicPoolMaintainer< - ConcreteClient, - sc_transaction_pool::FullChainApi - > +type ConcreteTransactionPool = sc_transaction_pool::BasicPool< + sc_transaction_pool::FullChainApi, + ConcreteBlock >; /// A specialized configuration object for setting up the node.. @@ -322,10 +314,10 @@ pub fn new_light(config: NodeConfiguration) let fetcher = fetcher .ok_or_else(|| "Trying to start light transaction pool without active fetcher")?; let pool_api = sc_transaction_pool::LightChainApi::new(client.clone(), fetcher.clone()); - let pool = sc_transaction_pool::BasicPool::new(config, pool_api); - let maintainer = sc_transaction_pool::LightBasicPoolMaintainer::with_defaults(pool.pool().clone(), client, fetcher); - let maintainable_pool = sp_transaction_pool::MaintainableTransactionPool::new(pool, maintainer); - Ok(maintainable_pool) + let pool = sc_transaction_pool::BasicPool::with_revalidation_type( + config, pool_api, sc_transaction_pool::RevalidationType::Light, + ); + Ok(pool) })? .with_import_queue_and_fprb(|_config, client, backend, fetcher, _select_chain, _tx_pool| { let fetch_checker = fetcher diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 044798701c..194bd09e24 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -49,7 +49,7 @@ use std::{ }; use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use sc_telemetry::{telemetry, SUBSTRATE_INFO}; -use sp_transaction_pool::{TransactionPool, TransactionPoolMaintainer}; +use sp_transaction_pool::MaintainedTransactionPool; use sp_blockchain; use grafana_data_source::{self, record_metrics}; @@ -740,9 +740,7 @@ ServiceBuilder< TSc: Clone, TImpQu: 'static + ImportQueue, TNetP: NetworkSpecialization, - TExPool: 'static - + TransactionPool::Hash> - + TransactionPoolMaintainer::Hash>, + TExPool: MaintainedTransactionPool::Hash> + 'static, TRpc: sc_rpc::RpcExtension + Clone, { diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index c1b87e4491..1b2e7bcd3c 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -61,7 +61,7 @@ pub use self::builder::{ }; pub use config::{Configuration, Roles, PruningMode}; pub use sc_chain_spec::{ChainSpec, Properties, RuntimeGenesis, Extension as ChainSpecExtension}; -pub use sp_transaction_pool::{TransactionPool, TransactionPoolMaintainer, InPoolTransaction, error::IntoPoolError}; +pub use sp_transaction_pool::{TransactionPool, InPoolTransaction, error::IntoPoolError}; pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; pub use sc_client::FinalityNotifications; pub use sc_rpc::Metadata as RpcMetadata; @@ -148,8 +148,7 @@ pub trait AbstractService: 'static + Future> + /// Chain selection algorithm. type SelectChain: sp_consensus::SelectChain; /// Transaction pool. - type TransactionPool: TransactionPool - + TransactionPoolMaintainer; + type TransactionPool: TransactionPool; /// Network specialization. type NetworkSpecialization: NetworkSpecialization; @@ -213,8 +212,7 @@ where TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, TRtApi: 'static + Send + Sync, TSc: sp_consensus::SelectChain + 'static + Clone + Send + Unpin, - TExPool: 'static + TransactionPool - + TransactionPoolMaintainer, + TExPool: 'static + TransactionPool, TOc: 'static + Send + Sync, TNetSpec: NetworkSpecialization, { diff --git a/client/transaction-pool/graph/benches/basics.rs b/client/transaction-pool/graph/benches/basics.rs index 557a2ca3d1..75d15cc1f1 100644 --- a/client/transaction-pool/graph/benches/basics.rs +++ b/client/transaction-pool/graph/benches/basics.rs @@ -16,7 +16,7 @@ use criterion::{criterion_group, criterion_main, Criterion}; -use futures::executor::block_on; +use futures::{future::{ready, Ready}, executor::block_on}; use sc_transaction_graph::*; use sp_runtime::transaction_validity::{ValidTransaction, InvalidTransaction}; use codec::Encode; @@ -49,7 +49,8 @@ impl ChainApi for TestApi { type Block = Block; type Hash = H256; type Error = sp_transaction_pool::error::Error; - type ValidationFuture = futures::future::Ready>; + type ValidationFuture = Ready>; + type BodyFuture = Ready>>>; fn validate_transaction( &self, @@ -61,14 +62,14 @@ impl ChainApi for TestApi { match self.block_id_to_number(at) { Ok(Some(num)) if num > 5 => { - return futures::future::ready( + return ready( Ok(Err(InvalidTransaction::Stale.into())) ) }, _ => {}, } - futures::future::ready( + ready( Ok(Ok(ValidTransaction { priority: 4, requires: if nonce > 1 && self.nonce_dependant { @@ -105,6 +106,10 @@ impl ChainApi for TestApi { let encoded = uxt.encode(); (blake2_256(&encoded).into(), encoded.len()) } + + fn block_body(&self, _id: &BlockId) -> Self::BodyFuture { + ready(Ok(None)) + } } fn uxt(transfer: Transfer) -> Extrinsic { @@ -150,13 +155,13 @@ fn benchmark_main(c: &mut Criterion) { c.bench_function("sequential 50 tx", |b| { b.iter(|| { - bench_configured(Pool::new(Default::default(), TestApi::new_dependant()), 50); + bench_configured(Pool::new(Default::default(), TestApi::new_dependant().into()), 50); }); }); c.bench_function("random 100 tx", |b| { b.iter(|| { - bench_configured(Pool::new(Default::default(), TestApi::default()), 100); + bench_configured(Pool::new(Default::default(), TestApi::default().into()), 100); }); }); } diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index 629bd0a9a9..5be879f079 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -68,6 +68,8 @@ pub trait ChainApi: Send + Sync { type Error: From + error::IntoPoolError; /// Validate transaction future. type ValidationFuture: Future> + Send + Unpin; + /// Body future (since block body might be remote) + type BodyFuture: Future::Extrinsic>>, Self::Error>> + Unpin + Send + 'static; /// Verify extrinsic at given block. fn validate_transaction( @@ -84,6 +86,9 @@ pub trait ChainApi: Send + Sync { /// Returns hash and encoding length of the extrinsic. fn hash_and_length(&self, uxt: &ExtrinsicFor) -> (Self::Hash, usize); + + /// Returns a block body given the block id. + fn block_body(&self, at: &BlockId) -> Self::BodyFuture; } /// Pool configuration options. @@ -120,7 +125,7 @@ pub struct Pool { impl Pool { /// Create a new transaction pool. - pub fn new(options: Options, api: B) -> Self { + pub fn new(options: Options, api: Arc) -> Self { Pool { validated_pool: Arc::new(ValidatedPool::new(options, api)), } @@ -488,6 +493,7 @@ mod tests { type Hash = u64; type Error = error::Error; type ValidationFuture = futures::future::Ready>; + type BodyFuture = futures::future::Ready>>>; /// Verify extrinsic at given block. fn validate_transaction( @@ -560,6 +566,10 @@ mod tests { len ) } + + fn block_body(&self, _id: &BlockId) -> Self::BodyFuture { + futures::future::ready(Ok(None)) + } } fn uxt(transfer: Transfer) -> Extrinsic { @@ -567,7 +577,7 @@ mod tests { } fn pool() -> Pool { - Pool::new(Default::default(), TestApi::default()) + Pool::new(Default::default(), TestApi::default().into()) } #[test] @@ -713,7 +723,7 @@ mod tests { ready: limit.clone(), future: limit.clone(), ..Default::default() - }, TestApi::default()); + }, TestApi::default().into()); let hash1 = block_on(pool.submit_one(&BlockId::Number(0), uxt(Transfer { from: AccountId::from_h256(H256::from_low_u64_be(1)), @@ -748,7 +758,7 @@ mod tests { ready: limit.clone(), future: limit.clone(), ..Default::default() - }, TestApi::default()); + }, TestApi::default().into()); // when block_on(pool.submit_one(&BlockId::Number(0), uxt(Transfer { @@ -924,7 +934,7 @@ mod tests { ready: limit.clone(), future: limit.clone(), ..Default::default() - }, TestApi::default()); + }, TestApi::default().into()); let xt = uxt(Transfer { from: AccountId::from_h256(H256::from_low_u64_be(1)), @@ -958,7 +968,7 @@ mod tests { let (tx, rx) = std::sync::mpsc::sync_channel(1); let mut api = TestApi::default(); api.delay = Arc::new(Mutex::new(rx.into())); - let pool = Arc::new(Pool::new(Default::default(), api)); + let pool = Arc::new(Pool::new(Default::default(), api.into())); // when let xt = uxt(Transfer { diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 29f82fb894..34f34d5806 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -63,7 +63,7 @@ pub type ValidatedTransactionFor = ValidatedTransaction< /// Pool that deals with validated transactions. pub(crate) struct ValidatedPool { - api: B, + api: Arc, options: Options, listener: RwLock, BlockHash>>, pool: RwLock { impl ValidatedPool { /// Create a new transaction pool. - pub fn new(options: Options, api: B) -> Self { + pub fn new(options: Options, api: Arc) -> Self { let base_pool = base::BasePool::new(options.reject_future_transactions); ValidatedPool { api, diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index 8495b8b65f..1bf6348214 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -19,12 +19,13 @@ use std::{marker::PhantomData, pin::Pin, sync::Arc}; use codec::{Decode, Encode}; use futures::{ - channel::oneshot, executor::{ThreadPool, ThreadPoolBuilder}, future::{Future, FutureExt, ready}, + channel::oneshot, executor::{ThreadPool, ThreadPoolBuilder}, future::{Future, FutureExt, ready, Ready}, }; use sc_client_api::{ blockchain::HeaderBackend, - light::{Fetcher, RemoteCallRequest} + light::{Fetcher, RemoteCallRequest, RemoteBodyRequest}, + BlockBody, }; use sp_core::Hasher; use sp_runtime::{ @@ -63,7 +64,7 @@ impl FullChainApi where impl sc_transaction_graph::ChainApi for FullChainApi where Block: BlockT, - Client: ProvideRuntimeApi + BlockIdTo + 'static + Send + Sync, + Client: ProvideRuntimeApi + BlockBody + BlockIdTo + 'static + Send + Sync, Client::Api: TaggedTransactionQueue, sp_api::ApiErrorFor: Send, { @@ -71,6 +72,11 @@ impl sc_transaction_graph::ChainApi for FullChainApi> + Send>>; + type BodyFuture = Ready::Extrinsic>>>>; + + fn block_body(&self, id: &BlockId) -> Self::BodyFuture { + ready(self.client.block_body(&id).map_err(|e| error::Error::from(e))) + } fn validate_transaction( &self, @@ -149,6 +155,7 @@ impl sc_transaction_graph::ChainApi for LightChainApi> + Send + Unpin>; + type BodyFuture = Pin::Extrinsic>>>> + Send>>; fn validate_transaction( &self, @@ -197,4 +204,33 @@ impl sc_transaction_graph::ChainApi for LightChainApi::Hashing as HashT>::hash(x), x.len()) }) } + + fn block_body(&self, id: &BlockId) -> Self::BodyFuture { + let header = self.client.header(*id) + .and_then(|h| h.ok_or(sp_blockchain::Error::UnknownBlock(format!("{}", id)))); + let header = match header { + Ok(header) => header, + Err(err) => { + log::warn!(target: "txpool", "Failed to query header: {:?}", err); + return Box::pin(ready(Ok(None))); + } + }; + + let fetcher = self.fetcher.clone(); + async move { + let transactions = fetcher.remote_body({ + RemoteBodyRequest { + header, + retry_count: None, + } + }) + .await + .unwrap_or_else(|e| { + log::warn!(target: "txpool", "Failed to fetch block body: {:?}", e); + Vec::new() + }); + + Ok(Some(transactions)) + }.boxed() + } } diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 4d71307c0a..f6f7774935 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -20,26 +20,26 @@ #![warn(unused_extern_crates)] mod api; -mod maintainer; - pub mod error; + #[cfg(test)] mod tests; pub use sc_transaction_graph as txpool; pub use crate::api::{FullChainApi, LightChainApi}; -pub use crate::maintainer::{FullBasicPoolMaintainer, LightBasicPoolMaintainer}; -use std::{collections::HashMap, sync::Arc}; -use futures::{Future, FutureExt}; +use std::{collections::HashMap, sync::Arc, pin::Pin, time::Instant}; +use futures::{Future, FutureExt, future::ready}; +use parking_lot::Mutex; use sp_runtime::{ generic::BlockId, - traits::Block as BlockT, + traits::{Block as BlockT, NumberFor, SimpleArithmetic, Extrinsic}, }; use sp_transaction_pool::{ TransactionPool, PoolStatus, ImportNotificationStream, - TxHash, TransactionFor, TransactionStatusStreamFor, + TxHash, TransactionFor, TransactionStatusStreamFor, BlockHash, + MaintainedTransactionPool, }; /// Basic implementation of transaction pool that can be customized by providing PoolApi. @@ -49,6 +49,25 @@ pub struct BasicPool PoolApi: sc_transaction_graph::ChainApi, { pool: Arc>, + api: Arc, + revalidation_strategy: Arc>>>, +} + +/// Type of revalidation. +pub enum RevalidationType { + /// Light revalidation type. + /// + /// During maintenance, transaction pool makes periodic revalidation + /// of all transactions depending on number of blocks or time passed. + /// Also this kind of revalidation does not resubmit transactions from + /// retracted blocks, since it is too expensive. + Light, + + /// Full revalidation type. + /// + /// During maintenance, transaction pool revalidates some fixed amount of + /// transactions from the pool of valid transactions. + Full, } impl BasicPool @@ -57,16 +76,44 @@ impl BasicPool PoolApi: sc_transaction_graph::ChainApi, { /// Create new basic transaction pool with provided api. - pub fn new(options: sc_transaction_graph::Options, pool_api: PoolApi) -> Self { + pub fn new( + options: sc_transaction_graph::Options, + pool_api: PoolApi, + ) -> Self { + Self::with_revalidation_type(options, pool_api, RevalidationType::Full) + } + + /// Create new basic transaction pool with provided api and custom + /// revalidation type. + pub fn with_revalidation_type( + options: sc_transaction_graph::Options, + pool_api: PoolApi, + revalidation_type: RevalidationType, + ) -> Self { + let api = Arc::new(pool_api); + let cloned_api = api.clone(); BasicPool { - pool: Arc::new(sc_transaction_graph::Pool::new(options, pool_api)), + api: cloned_api, + pool: Arc::new(sc_transaction_graph::Pool::new(options, api)), + revalidation_strategy: Arc::new(Mutex::new( + match revalidation_type { + RevalidationType::Light => RevalidationStrategy::Light(RevalidationStatus::NotScheduled), + RevalidationType::Full => RevalidationStrategy::Always, + } + )), } + } /// Gets shared reference to the underlying pool. pub fn pool(&self) -> &Arc> { &self.pool } + + #[cfg(test)] + pub fn api(&self) -> &Arc { + &self.api + } } impl TransactionPool for BasicPool @@ -130,3 +177,169 @@ impl TransactionPool for BasicPool self.pool.on_broadcasted(propagations) } } + +#[cfg_attr(test, derive(Debug))] +enum RevalidationStatus { + /// The revalidation has never been completed. + NotScheduled, + /// The revalidation is scheduled. + Scheduled(Option, Option), + /// The revalidation is in progress. + InProgress, +} + +enum RevalidationStrategy { + Always, + Light(RevalidationStatus) +} + +struct RevalidationAction { + revalidate: bool, + resubmit: bool, + revalidate_amount: Option, +} + +impl RevalidationStrategy { + pub fn clear(&mut self) { + if let Self::Light(status) = self { + status.clear() + } + } + + pub fn next( + &mut self, + block: N, + revalidate_time_period: Option, + revalidate_block_period: Option, + ) -> RevalidationAction { + match self { + Self::Light(status) => RevalidationAction { + revalidate: status.next_required( + block, + revalidate_time_period, + revalidate_block_period + ), + resubmit: false, + revalidate_amount: None, + }, + Self::Always => RevalidationAction { + revalidate: true, + resubmit: true, + revalidate_amount: Some(16), + } + } + } +} + +impl RevalidationStatus { + /// Called when revalidation is completed. + pub fn clear(&mut self) { + *self = Self::NotScheduled; + } + + /// Returns true if revalidation is required. + pub fn next_required( + &mut self, + block: N, + revalidate_time_period: Option, + revalidate_block_period: Option, + ) -> bool { + match *self { + Self::NotScheduled => { + *self = Self::Scheduled( + revalidate_time_period.map(|period| Instant::now() + period), + revalidate_block_period.map(|period| block + period), + ); + false + }, + Self::Scheduled(revalidate_at_time, revalidate_at_block) => { + let is_required = revalidate_at_time.map(|at| Instant::now() >= at).unwrap_or(false) + || revalidate_at_block.map(|at| block >= at).unwrap_or(false); + if is_required { + *self = Self::InProgress; + } + is_required + }, + Self::InProgress => false, + } + } +} + +impl MaintainedTransactionPool for BasicPool +where + Block: BlockT, + PoolApi: 'static + sc_transaction_graph::ChainApi, +{ + fn maintain(&self, id: &BlockId, retracted: &[BlockHash]) + -> Pin + Send>> + { + let id = id.clone(); + let pool = self.pool.clone(); + let api = self.api.clone(); + + let block_number = match api.block_id_to_number(&id) { + Ok(Some(number)) => number, + _ => { + log::trace!(target: "txqueue", "Skipping chain event - no number for that block {:?}", id); + return Box::pin(ready(())); + } + }; + + let next_action = self.revalidation_strategy.lock().next( + block_number, + Some(std::time::Duration::from_secs(60)), + Some(20.into()), + ); + let revalidation_strategy = self.revalidation_strategy.clone(); + let retracted = retracted.to_vec(); + + async move { + // We don't query block if we won't prune anything + if !pool.status().is_empty() { + let hashes = api.block_body(&id).await + .unwrap_or_else(|e| { + log::warn!("Prune known transactions: error request {:?}!", e); + None + }) + .unwrap_or_default() + .into_iter() + .map(|tx| pool.hash_of(&tx)) + .collect::>(); + + if let Err(e) = pool.prune_known(&id, &hashes) { + log::error!("Cannot prune known in the pool {:?}!", e); + } + } + + if next_action.resubmit { + let mut resubmit_transactions = Vec::new(); + + for retracted_hash in retracted { + let block_transactions = api.block_body(&BlockId::hash(retracted_hash.clone())).await + .unwrap_or_else(|e| { + log::warn!("Failed to fetch block body {:?}!", e); + None + }) + .unwrap_or_default() + .into_iter() + .filter(|tx| tx.is_signed().unwrap_or(true)); + + resubmit_transactions.extend(block_transactions); + } + if let Err(e) = pool.submit_at(&id, resubmit_transactions, true).await { + log::debug!(target: "txpool", + "[{:?}] Error re-submitting transactions: {:?}", id, e + ) + } + } + + if next_action.revalidate { + if let Err(e) = pool.revalidate_ready(&id, next_action.revalidate_amount).await { + log::warn!("Revalidate ready failed {:?}", e); + } + } + + revalidation_strategy.lock().clear(); + }.boxed() + } +} diff --git a/client/transaction-pool/src/maintainer.rs b/client/transaction-pool/src/maintainer.rs deleted file mode 100644 index 97dc7e10a6..0000000000 --- a/client/transaction-pool/src/maintainer.rs +++ /dev/null @@ -1,645 +0,0 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use std::{ - marker::{PhantomData, Unpin}, - sync::Arc, - time::Instant, -}; -use futures::{ - Future, FutureExt, - future::{Either, join, ready}, -}; -use log::{warn, debug, trace}; -use parking_lot::Mutex; - -use sc_client_api::{ - client::BlockBody, - light::{Fetcher, RemoteBodyRequest}, -}; -use sp_runtime::{ - generic::BlockId, - traits::{Block as BlockT, Extrinsic, Header, NumberFor, SimpleArithmetic}, -}; -use sp_blockchain::HeaderBackend; -use sp_transaction_pool::{TransactionPoolMaintainer, runtime_api::TaggedTransactionQueue}; -use sp_api::ProvideRuntimeApi; - -use sc_transaction_graph::{self, ChainApi}; - -/// Basic transaction pool maintainer for full clients. -pub struct FullBasicPoolMaintainer { - pool: Arc>, - client: Arc, -} - -impl FullBasicPoolMaintainer { - /// Create new basic full pool maintainer. - pub fn new( - pool: Arc>, - client: Arc, - ) -> Self { - FullBasicPoolMaintainer { pool, client } - } -} - -impl TransactionPoolMaintainer -for - FullBasicPoolMaintainer -where - Block: BlockT, - Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, - Client::Api: TaggedTransactionQueue, - PoolApi: ChainApi + 'static, -{ - type Block = Block; - type Hash = Block::Hash; - - fn maintain( - &self, - id: &BlockId, - retracted: &[Block::Hash], - ) -> Box + Send + Unpin> { - let now = std::time::Instant::now(); - let took = move || format!("Took {} ms", now.elapsed().as_millis()); - - let id = *id; - trace!(target: "txpool", "[{:?}] Starting pool maintainance", id); - // Put transactions from retracted blocks back into the pool. - let client_copy = self.client.clone(); - let retracted_transactions = retracted.to_vec().into_iter() - .filter_map(move |hash| client_copy.block_body(&BlockId::hash(hash)).ok().unwrap_or(None)) - .flat_map(|block| block.into_iter()) - // if signed information is not present, attempt to resubmit anyway. - .filter(|tx| tx.is_signed().unwrap_or(true)); - let resubmit_future = self.pool - .submit_at(&id, retracted_transactions, true) - .then(move |resubmit_result| ready(match resubmit_result { - Ok(_) => trace!(target: "txpool", - "[{:?}] Re-submitting retracted done. {}", id, took() - ), - Err(e) => debug!(target: "txpool", - "[{:?}] Error re-submitting transactions: {:?}", id, e - ), - })); - - // Avoid calling into runtime if there is nothing to prune from the pool anyway. - if self.pool.status().is_empty() { - return Box::new(resubmit_future) - } - - let block = (self.client.header(id), self.client.block_body(&id)); - let prune_future = match block { - (Ok(Some(header)), Ok(Some(extrinsics))) => { - let parent_id = BlockId::hash(*header.parent_hash()); - let prune_future = self.pool - .prune(&id, &parent_id, &extrinsics) - .then(move |prune_result| ready(match prune_result { - Ok(_) => trace!(target: "txpool", - "[{:?}] Pruning done. {}", id, took() - ), - Err(e) => warn!(target: "txpool", - "[{:?}] Error pruning transactions: {:?}", id, e - ), - })); - - Either::Left(resubmit_future.then(|_| prune_future)) - }, - (Ok(_), Ok(_)) => Either::Right(resubmit_future), - err => { - warn!(target: "txpool", "[{:?}] Error reading block: {:?}", id, err); - Either::Right(resubmit_future) - }, - }; - - let revalidate_future = self.pool - .revalidate_ready(&id, Some(16)) - .then(move |result| ready(match result { - Ok(_) => debug!(target: "txpool", - "[{:?}] Revalidation done: {}", id, took() - ), - Err(e) => warn!(target: "txpool", - "[{:?}] Encountered errors while revalidating transactions: {:?}", id, e - ), - })); - - Box::new(prune_future.then(|_| revalidate_future)) - } -} - -/// Basic transaction pool maintainer for light clients. -pub struct LightBasicPoolMaintainer { - pool: Arc>, - client: Arc, - fetcher: Arc, - revalidate_time_period: Option, - revalidate_block_period: Option>, - revalidation_status: Arc>>>, - _phantom: PhantomData, -} - -impl LightBasicPoolMaintainer - where - Block: BlockT, - Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, - Client::Api: TaggedTransactionQueue, - PoolApi: ChainApi + 'static, - F: Fetcher + 'static, -{ - /// Create light pool maintainer with default constants. - /// - /// Default constants are: revalidate every 60 seconds or every 20 blocks - /// (whatever happens first). - pub fn with_defaults( - pool: Arc>, - client: Arc, - fetcher: Arc, - ) -> Self { - Self::new( - pool, - client, - fetcher, - Some(std::time::Duration::from_secs(60)), - Some(20.into()), - ) - } - - /// Create light pool maintainer with passed constants. - pub fn new( - pool: Arc>, - client: Arc, - fetcher: Arc, - revalidate_time_period: Option, - revalidate_block_period: Option>, - ) -> Self { - Self { - pool, - client, - fetcher, - revalidate_time_period, - revalidate_block_period, - revalidation_status: Arc::new(Mutex::new(TxPoolRevalidationStatus::NotScheduled)), - _phantom: Default::default(), - } - } - - /// Returns future that prunes block transactions from the pool. - fn prune( - &self, - id: &BlockId, - header: &Block::Header, - ) -> impl std::future::Future { - // fetch transactions (possible future optimization: proofs of inclusion) that - // have been included into new block and prune these from the pool - let id = id.clone(); - let pool = self.pool.clone(); - self.fetcher.remote_body(RemoteBodyRequest { - header: header.clone(), - retry_count: None, - }) - .then(move |transactions| ready( - transactions - .map_err(|e| format!("{}", e)) - .and_then(|transactions| { - let hashes = transactions - .into_iter() - .map(|tx| pool.hash_of(&tx)) - .collect::>(); - pool.prune_known(&id, &hashes) - .map_err(|e| format!("{}", e)) - }) - )) - .then(|r| { - if let Err(e) = r { - warn!("Error pruning known transactions: {}", e) - } - ready(()) - }) - } - - /// Returns future that performs in-pool transations revalidation, if required. - fn revalidate( - &self, - id: &BlockId, - header: &Block::Header, - ) -> impl std::future::Future { - // to determine whether ready transaction is still valid, we perform periodic revalidaton - // of ready transactions - let is_revalidation_required = self.revalidation_status.lock().is_required( - *header.number(), - self.revalidate_time_period, - self.revalidate_block_period, - ); - match is_revalidation_required { - true => { - let revalidation_status = self.revalidation_status.clone(); - Either::Left(self.pool - .revalidate_ready(id, None) - .map(|r| r.map_err(|e| warn!("Error revalidating known transactions: {}", e))) - .map(move |_| revalidation_status.lock().clear())) - }, - false => Either::Right(ready(())), - } - } -} - -impl TransactionPoolMaintainer -for - LightBasicPoolMaintainer -where - Block: BlockT, - Client: ProvideRuntimeApi + HeaderBackend + BlockBody + 'static, - Client::Api: TaggedTransactionQueue, - PoolApi: ChainApi + 'static, - F: Fetcher + 'static, -{ - type Block = Block; - type Hash = Block::Hash; - - fn maintain( - &self, - id: &BlockId, - _retracted: &[Block::Hash], - ) -> Box + Send + Unpin> { - // Do nothing if transaction pool is empty. - if self.pool.status().is_empty() { - self.revalidation_status.lock().clear(); - return Box::new(ready(())); - } - let header = self.client.header(*id) - .and_then(|h| h.ok_or(sp_blockchain::Error::UnknownBlock(format!("{}", id)))); - let header = match header { - Ok(header) => header, - Err(err) => { - println!("Failed to maintain light tx pool: {:?}", err); - return Box::new(ready(())); - } - }; - - // else prune block transactions from the pool - let prune_future = self.prune(id, &header); - - // and then (optionally) revalidate in-pool transactions - let revalidate_future = self.revalidate(id, &header); - - let maintain_future = join( - prune_future, - revalidate_future, - ).map(|_| ()); - - Box::new(maintain_future) - } -} - -/// The status of transactions revalidation at light tx pool. -#[cfg_attr(test, derive(Debug))] -enum TxPoolRevalidationStatus { - /// The revalidation has never been completed. - NotScheduled, - /// The revalidation is scheduled. - Scheduled(Option, Option), - /// The revalidation is in progress. - InProgress, -} - -impl TxPoolRevalidationStatus { - /// Called when revalidation is completed. - pub fn clear(&mut self) { - *self = TxPoolRevalidationStatus::NotScheduled; - } - - /// Returns true if revalidation is required. - pub fn is_required( - &mut self, - block: N, - revalidate_time_period: Option, - revalidate_block_period: Option, - ) -> bool { - match *self { - TxPoolRevalidationStatus::NotScheduled => { - *self = TxPoolRevalidationStatus::Scheduled( - revalidate_time_period.map(|period| Instant::now() + period), - revalidate_block_period.map(|period| block + period), - ); - false - }, - TxPoolRevalidationStatus::Scheduled(revalidate_at_time, revalidate_at_block) => { - let is_required = revalidate_at_time.map(|at| Instant::now() >= at).unwrap_or(false) - || revalidate_at_block.map(|at| block >= at).unwrap_or(false); - if is_required { - *self = TxPoolRevalidationStatus::InProgress; - } - is_required - }, - TxPoolRevalidationStatus::InProgress => false, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use futures::executor::block_on; - use codec::Encode; - use substrate_test_runtime_client::{ - prelude::*, Client, runtime::{Block, Transfer}, sp_consensus::{BlockOrigin, SelectChain}, - LongestChain, - }; - use sp_transaction_pool::PoolStatus; - use crate::api::{FullChainApi, LightChainApi}; - - struct TestSetup { - client: Arc>, - longest_chain: LongestChain, - pool: Arc>, - } - - impl TestSetup { - fn new() -> TestSetup, Block>> { - let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let client = Arc::new(client); - let pool = Arc::new( - sc_transaction_graph::Pool::new(Default::default(), FullChainApi::new(client.clone())), - ); - TestSetup { - client, - longest_chain, - pool, - } - } - - fn new_light(fetcher: Arc) -> TestSetup, F, Block>> - where F: Fetcher + 'static, - { - let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); - let client = Arc::new(client); - let pool = Arc::new( - sc_transaction_graph::Pool::new( - Default::default(), - LightChainApi::new(client.clone(), fetcher) - ), - ); - TestSetup { - client, - longest_chain, - pool, - } - } - } - - fn setup() -> TestSetup, Block>> { - TestSetup::, Block>>::new() - } - - fn setup_light(fetcher: Arc) -> TestSetup, F, Block>> - where F: Fetcher + 'static, - { - TestSetup::, F, Block>>::new_light(fetcher) - } - - #[test] - fn should_remove_transactions_from_the_full_pool() { - let mut setup = setup(); - - let transaction = Transfer { - amount: 5, - nonce: 0, - from: AccountKeyring::Alice.into(), - to: Default::default(), - }.into_signed_tx(); - let best = setup.longest_chain.best_chain().unwrap(); - - // store the transaction in the pool - block_on(setup.pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); - - // import the block - let mut builder = setup.client.new_block(Default::default()).unwrap(); - builder.push(transaction.clone()).unwrap(); - let block = builder.build().unwrap().block; - let id = BlockId::hash(block.header().hash()); - setup.client.import(BlockOrigin::Own, block).unwrap(); - - // fire notification - this should clean up the queue - assert_eq!(setup.pool.status().ready, 1); - block_on(FullBasicPoolMaintainer::new(setup.pool.clone(), setup.client.clone()).maintain(&id, &[])); - - // then - assert_eq!(setup.pool.status().ready, 0); - assert_eq!(setup.pool.status().future, 0); - } - - #[test] - fn should_remove_transactions_from_the_light_pool() { - let transaction = Transfer { - amount: 5, - nonce: 0, - from: AccountKeyring::Alice.into(), - to: Default::default(), - }.into_signed_tx(); - let fetcher_transaction = transaction.clone(); - let fetcher = Arc::new(substrate_test_runtime_client::new_light_fetcher() - .with_remote_body(Some(Box::new(move |_| Ok(vec![fetcher_transaction.clone()])))) - .with_remote_call(Some(Box::new(move |_| { - let validity: sp_runtime::transaction_validity::TransactionValidity = - Ok(sp_runtime::transaction_validity::ValidTransaction { - priority: 0, - requires: Vec::new(), - provides: vec![vec![42]], - longevity: 0, - propagate: true, - }); - Ok(validity.encode()) - })))); - - let setup = setup_light(fetcher.clone()); - let best = setup.longest_chain.best_chain().unwrap(); - - // store the transaction in the pool - block_on(setup.pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); - - // fire notification - this should clean up the queue - assert_eq!(setup.pool.status().ready, 1); - block_on(LightBasicPoolMaintainer::with_defaults(setup.pool.clone(), setup.client.clone(), fetcher).maintain( - &BlockId::Number(0), - &[], - )); - - // then - assert_eq!(setup.pool.status().ready, 0); - assert_eq!(setup.pool.status().future, 0); - } - - #[test] - fn should_schedule_transactions_revalidation_at_light_pool() { - // when revalidation is not scheduled, it became scheduled - let mut status = TxPoolRevalidationStatus::NotScheduled; - assert!(!status.is_required(10u32, None, None)); - match status { - TxPoolRevalidationStatus::Scheduled(_, _) => (), - _ => panic!("Unexpected status: {:?}", status), - } - - // revalidation required at time - let mut status = TxPoolRevalidationStatus::Scheduled(Some(Instant::now()), None); - assert!(status.is_required(10u32, None, None)); - match status { - TxPoolRevalidationStatus::InProgress => (), - _ => panic!("Unexpected status: {:?}", status), - } - - // revalidation required at block - let mut status = TxPoolRevalidationStatus::Scheduled(None, Some(10)); - assert!(status.is_required(10u32, None, None)); - match status { - TxPoolRevalidationStatus::InProgress => (), - _ => panic!("Unexpected status: {:?}", status), - } - } - - #[test] - fn should_revalidate_transactions_at_light_pool() { - use std::sync::atomic; - use sp_runtime::transaction_validity::*; - - let build_fetcher = || { - let validated = Arc::new(atomic::AtomicBool::new(false)); - Arc::new(substrate_test_runtime_client::new_light_fetcher() - .with_remote_body(Some(Box::new(move |_| Ok(vec![])))) - .with_remote_call(Some(Box::new(move |_| { - let is_inserted = validated.swap(true, atomic::Ordering::SeqCst); - let validity: TransactionValidity = if is_inserted { - Err(TransactionValidityError::Invalid( - InvalidTransaction::Custom(0) - )) - } else { - Ok(ValidTransaction { - priority: 0, - requires: Vec::new(), - provides: vec![vec![42]], - longevity: 0, - propagate: true, - }) - }; - Ok(validity.encode()) - })))) - }; - - fn with_fetcher_maintain + 'static>( - fetcher: Arc, - revalidate_time_period: Option, - revalidate_block_period: Option, - prepare_maintainer: impl Fn(&Mutex>), - ) -> PoolStatus { - let setup = setup_light(fetcher.clone()); - let best = setup.longest_chain.best_chain().unwrap(); - - // let's prepare maintainer - let maintainer = LightBasicPoolMaintainer::new( - setup.pool.clone(), - setup.client.clone(), - fetcher, - revalidate_time_period, - revalidate_block_period, - ); - prepare_maintainer(&*maintainer.revalidation_status); - - // store the transaction in the pool - block_on(setup.pool.submit_one( - &BlockId::hash(best.hash()), - Transfer { - amount: 5, - nonce: 0, - from: AccountKeyring::Alice.into(), - to: Default::default(), - }.into_signed_tx(), - )).unwrap(); - - // and run maintain procedures - block_on(maintainer.maintain(&BlockId::Number(0), &[])); - - setup.pool.status() - } - - // when revalidation is never required - nothing happens - let fetcher = build_fetcher(); - //let maintainer = DefaultLightTransactionPoolMaintainer::new(client.clone(), fetcher.clone(), None, None); - let status = with_fetcher_maintain(fetcher, None, None, |_revalidation_status| {}); - assert_eq!(status.ready, 1); - - // when revalidation is scheduled by time - it is performed - let fetcher = build_fetcher(); - let status = with_fetcher_maintain(fetcher, None, None, |revalidation_status| - *revalidation_status.lock() = TxPoolRevalidationStatus::Scheduled(Some(Instant::now()), None) - ); - assert_eq!(status.ready, 0); - - // when revalidation is scheduled by block number - it is performed - let fetcher = build_fetcher(); - let status = with_fetcher_maintain(fetcher, None, None, |revalidation_status| - *revalidation_status.lock() = TxPoolRevalidationStatus::Scheduled(None, Some(0)) - ); - assert_eq!(status.ready, 0); - } - - #[test] - fn should_add_reverted_transactions_to_the_pool() { - let mut setup = setup(); - - let transaction = Transfer { - amount: 5, - nonce: 0, - from: AccountKeyring::Alice.into(), - to: Default::default(), - }.into_signed_tx(); - let best = setup.longest_chain.best_chain().unwrap(); - - // store the transaction in the pool - block_on(setup.pool.submit_one(&BlockId::hash(best.hash()), transaction.clone())).unwrap(); - - // import the block - let mut builder = setup.client.new_block(Default::default()).unwrap(); - builder.push(transaction.clone()).unwrap(); - let block = builder.build().unwrap().block; - let block1_hash = block.header().hash(); - let id = BlockId::hash(block1_hash.clone()); - setup.client.import(BlockOrigin::Own, block).unwrap(); - - // fire notification - this should clean up the queue - assert_eq!(setup.pool.status().ready, 1); - block_on(FullBasicPoolMaintainer::new(setup.pool.clone(), setup.client.clone()).maintain(&id, &[])); - - // then - assert_eq!(setup.pool.status().ready, 0); - assert_eq!(setup.pool.status().future, 0); - - // import second block - let builder = setup.client.new_block_at( - &BlockId::hash(best.hash()), - Default::default(), - false, - ).unwrap(); - let block = builder.build().unwrap().block; - let id = BlockId::hash(block.header().hash()); - setup.client.import(BlockOrigin::Own, block).unwrap(); - - // fire notification - this should add the transaction back to the pool. - block_on(FullBasicPoolMaintainer::new(setup.pool.clone(), setup.client.clone()).maintain(&id, &[block1_hash])); - - // then - assert_eq!(setup.pool.status().ready, 1); - assert_eq!(setup.pool.status().future, 0); - } -} diff --git a/client/transaction-pool/src/tests.rs b/client/transaction-pool/src/tests.rs index 1199e41cf8..778536b7b9 100644 --- a/client/transaction-pool/src/tests.rs +++ b/client/transaction-pool/src/tests.rs @@ -14,29 +14,53 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . - use super::*; +use crate::{BasicPool, MaintainedTransactionPool}; use codec::Encode; use futures::executor::block_on; -use sc_transaction_graph::{self, Pool}; -use substrate_test_runtime_client::{runtime::{AccountId, Block, Hash, Index, Extrinsic, Transfer}, AccountKeyring::{self, *}}; +use parking_lot::RwLock; +use sc_transaction_graph::{self, ExHash, Pool}; use sp_runtime::{ generic::{self, BlockId}, - traits::{Hash as HashT, BlakeTwo256}, - transaction_validity::{TransactionValidity, ValidTransaction}, + traits::{BlakeTwo256, Hash as HashT}, + transaction_validity::{TransactionValidity, ValidTransaction, TransactionValidityError, InvalidTransaction}, +}; +use std::collections::HashSet; +use substrate_test_runtime_client::{ + runtime::{AccountId, Block, BlockNumber, Extrinsic, Hash, Header, Index, Transfer}, + AccountKeyring::{self, *}, }; struct TestApi { - pub modifier: Box, + pub modifier: RwLock>, + pub chain_block_by_number: RwLock>>, + pub chain_headers_by_number: RwLock>, + pub invalid_hashes: RwLock>>, + pub validation_requests: RwLock>, } impl TestApi { fn default() -> Self { TestApi { - modifier: Box::new(|_| {}), + modifier: RwLock::new(Box::new(|_| {})), + chain_block_by_number: RwLock::new(HashMap::new()), + invalid_hashes: RwLock::new(HashSet::new()), + chain_headers_by_number: RwLock::new(HashMap::new()), + validation_requests: RwLock::new(Default::default()), } } + + fn push_block(&self, block_number: BlockNumber, xts: Vec) { + self.chain_block_by_number.write().insert(block_number, xts); + self.chain_headers_by_number.write().insert(block_number, Header { + number: block_number, + digest: Default::default(), + extrinsics_root: Default::default(), + parent_hash: Default::default(), + state_root: Default::default(), + }); + } } impl sc_transaction_graph::ChainApi for TestApi { @@ -44,12 +68,16 @@ impl sc_transaction_graph::ChainApi for TestApi { type Hash = Hash; type Error = error::Error; type ValidationFuture = futures::future::Ready>; + type BodyFuture = futures::future::Ready>>>; fn validate_transaction( &self, at: &BlockId, uxt: sc_transaction_graph::ExtrinsicFor, ) -> Self::ValidationFuture { + + self.validation_requests.write().push(uxt.clone()); + let expected = index(at); let requires = if expected == uxt.transfer().nonce { vec![] @@ -58,6 +86,12 @@ impl sc_transaction_graph::ChainApi for TestApi { }; let provides = vec![vec![uxt.transfer().nonce as u8]]; + if self.invalid_hashes.read().contains(&self.hash_and_length(&uxt).0) { + return futures::future::ready(Ok( + Err(TransactionValidityError::Invalid(InvalidTransaction::Custom(0))) + )) + } + let mut validity = ValidTransaction { priority: 1, requires, @@ -66,29 +100,43 @@ impl sc_transaction_graph::ChainApi for TestApi { propagate: true, }; - (self.modifier)(&mut validity); + (self.modifier.read())(&mut validity); - futures::future::ready(Ok( - Ok(validity) - )) + futures::future::ready(Ok(Ok(validity))) } - fn block_id_to_number(&self, at: &BlockId) -> error::Result>> { + fn block_id_to_number( + &self, + at: &BlockId, + ) -> error::Result>> { Ok(Some(number_of(at))) } - fn block_id_to_hash(&self, at: &BlockId) -> error::Result>> { + fn block_id_to_hash( + &self, + at: &BlockId, + ) -> error::Result>> { Ok(match at { generic::BlockId::Hash(x) => Some(x.clone()), _ => Some(Default::default()), }) } - fn hash_and_length(&self, ex: &sc_transaction_graph::ExtrinsicFor) -> (Self::Hash, usize) { + fn hash_and_length( + &self, + ex: &sc_transaction_graph::ExtrinsicFor, + ) -> (Self::Hash, usize) { let encoded = ex.encode(); (BlakeTwo256::hash(&encoded), encoded.len()) } + fn block_body(&self, id: &BlockId) -> Self::BodyFuture { + futures::future::ready(Ok(if let BlockId::Number(num) = id { + self.chain_block_by_number.read().get(num).cloned() + } else { + None + })) + } } fn index(at: &BlockId) -> u64 { @@ -114,7 +162,11 @@ fn uxt(who: AccountKeyring, nonce: Index) -> Extrinsic { } fn pool() -> Pool { - Pool::new(Default::default(), TestApi::default()) + Pool::new(Default::default(), TestApi::default().into()) +} + +fn maintained_pool() -> BasicPool { + BasicPool::new(Default::default(), TestApi::default()) } #[test] @@ -192,11 +244,11 @@ fn should_ban_invalid_transactions() { #[test] fn should_correctly_prune_transactions_providing_more_than_one_tag() { - let mut api = TestApi::default(); - api.modifier = Box::new(|v: &mut ValidTransaction| { + let api = TestApi::default(); + *api.modifier.write() = Box::new(|v: &mut ValidTransaction| { v.provides.push(vec![155]); }); - let pool = Pool::new(Default::default(), api); + let pool = Pool::new(Default::default(), Arc::new(api)); let xt = uxt(Alice, 209); block_on(pool.submit_one(&BlockId::number(0), xt.clone())).expect("1. Imported"); assert_eq!(pool.status().ready, 1); @@ -220,3 +272,38 @@ fn should_correctly_prune_transactions_providing_more_than_one_tag() { assert_eq!(pool.status().ready, 0); assert_eq!(pool.status().future, 2); } + +#[test] +fn should_prune_old_during_maintenance() { + let xt = uxt(Alice, 209); + + let pool = maintained_pool(); + + block_on(pool.submit_one(&BlockId::number(0), xt.clone())).expect("1. Imported"); + assert_eq!(pool.status().ready, 1); + + pool.api.push_block(1, vec![xt.clone()]); + + block_on(pool.maintain(&BlockId::number(1), &[])); + assert_eq!(pool.status().ready, 0); +} + + +#[test] +fn should_revalidate_during_maintenance() { + let xt1 = uxt(Alice, 209); + let xt2 = uxt(Alice, 210); + + let pool = maintained_pool(); + block_on(pool.submit_one(&BlockId::number(0), xt1.clone())).expect("1. Imported"); + block_on(pool.submit_one(&BlockId::number(0), xt2.clone())).expect("2. Imported"); + assert_eq!(pool.status().ready, 2); + assert_eq!(pool.api.validation_requests.read().len(), 2); + + pool.api.push_block(1, vec![xt1.clone()]); + + block_on(pool.maintain(&BlockId::number(1), &[])); + assert_eq!(pool.status().ready, 1); + // test that pool revalidated transaction that left ready and not included in the block + assert_eq!(pool.api.validation_requests.read().len(), 3); +} diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index e67a989075..ed24ad0619 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -20,6 +20,7 @@ use std::{ collections::HashMap, hash::Hash, sync::Arc, + pin::Pin, }; use futures::{ Future, Stream, @@ -225,6 +226,13 @@ pub trait TransactionPool: Send + Sync { fn hash_of(&self, xt: &TransactionFor) -> TxHash; } +/// Trait for transaction pool maintenance. +pub trait MaintainedTransactionPool : TransactionPool { + /// Perform maintenance + fn maintain(&self, block: &BlockId, retracted: &[BlockHash]) + -> Pin + Send>>; +} + /// An abstraction for transaction pool. /// /// This trait is used by offchain calls to be able to submit transactions. @@ -264,109 +272,4 @@ impl OffchainSubmitTransaction for TPool { e )) } -} - -/// Transaction pool maintainer interface. -pub trait TransactionPoolMaintainer: Send + Sync { - /// Block type. - type Block: BlockT; - /// Transaction Hash type. - type Hash: Hash + Eq + Member + Serialize; - - /// Returns a future that performs maintenance procedures on the pool when - /// with given hash is imported. - fn maintain( - &self, - id: &BlockId, - retracted: &[Self::Hash], - ) -> Box + Send + Unpin>; -} - -/// Maintainable pool implementation. -pub struct MaintainableTransactionPool { - pool: Pool, - maintainer: Maintainer, -} - -impl MaintainableTransactionPool { - /// Create new maintainable pool using underlying pool and maintainer. - pub fn new(pool: Pool, maintainer: Maintainer) -> Self { - MaintainableTransactionPool { pool, maintainer } - } -} - -impl TransactionPool for MaintainableTransactionPool - where - Pool: TransactionPool, - Maintainer: Send + Sync, -{ - type Block = Pool::Block; - type Hash = Pool::Hash; - type InPoolTransaction = Pool::InPoolTransaction; - type Error = Pool::Error; - - fn submit_at( - &self, - at: &BlockId, - xts: impl IntoIterator> + 'static, - ) -> Box, Self::Error>>, Self::Error>> + Send + Unpin> { - self.pool.submit_at(at, xts) - } - - fn submit_one( - &self, - at: &BlockId, - xt: TransactionFor, - ) -> Box, Self::Error>> + Send + Unpin> { - self.pool.submit_one(at, xt) - } - - fn submit_and_watch( - &self, - at: &BlockId, - xt: TransactionFor, - ) -> Box>, Self::Error>> + Send + Unpin> { - self.pool.submit_and_watch(at, xt) - } - - fn remove_invalid(&self, hashes: &[TxHash]) -> Vec> { - self.pool.remove_invalid(hashes) - } - - fn status(&self) -> PoolStatus { - self.pool.status() - } - - fn ready(&self) -> Box>> { - self.pool.ready() - } - - fn import_notification_stream(&self) -> ImportNotificationStream { - self.pool.import_notification_stream() - } - - fn hash_of(&self, xt: &TransactionFor) -> TxHash { - self.pool.hash_of(xt) - } - - fn on_broadcasted(&self, propagations: HashMap, Vec>) { - self.pool.on_broadcasted(propagations) - } -} - -impl TransactionPoolMaintainer for MaintainableTransactionPool - where - Pool: Send + Sync, - Maintainer: TransactionPoolMaintainer -{ - type Block = Maintainer::Block; - type Hash = Maintainer::Hash; - - fn maintain( - &self, - id: &BlockId, - retracted: &[Self::Hash], - ) -> Box + Send + Unpin> { - self.maintainer.maintain(id, retracted) - } -} +} \ No newline at end of file -- GitLab From fca8058f0f8ba88c0d057befd70ea63f571011aa Mon Sep 17 00:00:00 2001 From: Ashley Date: Fri, 24 Jan 2020 13:34:42 +0100 Subject: [PATCH 179/296] Switch GrandPa to std futures (replaces #3909) (#4612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Switch GrandPa to new futures * Work on making tests work * until_imported tests working again * Work on switching tests to stable futures * Modifications * Re-add test as #[ignore] * Don't ignore * Add manual unpins * Remove Header import * Return concrete Sink type * Switch to crates.io finality-grandpa version * Remove use statement that slipped in * Fix some nitpicks * Remove unpin from i * Fixed typo * Move futures01 to dev-deps * Fix nitpicks * Update client/finality-grandpa/src/communication/mod.rs Co-Authored-By: André Silva * nitpicking Co-authored-by: Pierre Krieger Co-authored-by: André Silva --- Cargo.lock | 11 +- bin/node-template/src/service.rs | 4 +- bin/node/cli/src/service.rs | 9 +- client/finality-grandpa/Cargo.toml | 9 +- .../src/communication/gossip.rs | 3 +- .../finality-grandpa/src/communication/mod.rs | 111 +++-- .../src/communication/periodic.rs | 2 +- .../src/communication/tests.rs | 82 ++-- client/finality-grandpa/src/environment.rs | 34 +- client/finality-grandpa/src/import.rs | 2 +- client/finality-grandpa/src/lib.rs | 115 +++-- client/finality-grandpa/src/observer.rs | 77 ++-- client/finality-grandpa/src/tests.rs | 398 +++++++++--------- client/finality-grandpa/src/until_imported.rs | 142 +++---- client/service/src/builder.rs | 2 +- client/service/src/lib.rs | 8 +- 16 files changed, 482 insertions(+), 527 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e0be7daf9..e69ee8e6e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1232,14 +1232,16 @@ dependencies = [ [[package]] name = "finality-grandpa" -version = "0.10.3" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5476,7 +5478,7 @@ name = "sc-finality-grandpa" version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "finality-grandpa 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", + "finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "fork-tree 2.0.0", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5484,6 +5486,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -8406,7 +8409,7 @@ dependencies = [ "checksum fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum file-per-thread-logger 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8505b75b31ef7285168dd237c4a7db3c1f3e0927e7d314e670bc98e854272fe9" -"checksum finality-grandpa 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d9ad6bb0e42865b2d79fc9c8a08f22c39127310ed3334f2a1119ca25ed69dfb" +"checksum finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "52c48f8a628193ba18639b2f727c32132d75f167a4b32f44b252ea8b937f154c" "checksum fixed-hash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72fe7539e2c5692c6989f2f9c0457e42f1e5768f96b85c87d273574670ae459f" "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" "checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index 458656d836..8a5c660b23 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -161,7 +161,7 @@ pub fn new_full(config: Configuration { // start the full GRANDPA voter @@ -178,7 +178,7 @@ pub fn new_full(config: Configuration { grandpa::setup_disabled_grandpa( diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 75cb6ac4c4..2aaca315b9 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -110,10 +110,7 @@ macro_rules! new_full_start { /// concrete types instead. macro_rules! new_full { ($config:expr, $with_startup_data: expr) => {{ - use futures::{ - prelude::*, - compat::Future01CompatExt - }; + use futures::prelude::*; use sc_network::Event; let ( @@ -220,7 +217,7 @@ macro_rules! new_full { service.network(), service.on_exit(), service.spawn_task_handle(), - )?.compat().map(drop)); + )?); }, (true, false) => { // start the full GRANDPA voter @@ -237,7 +234,7 @@ macro_rules! new_full { // the GRANDPA voter task is considered infallible, i.e. // if it fails we take down the service with it. service.spawn_essential_task( - grandpa::run_grandpa_voter(grandpa_config)?.compat().map(drop) + grandpa::run_grandpa_voter(grandpa_config)? ); }, (_, true) => { diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 2c0a10857c..a26b2e7a41 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -6,8 +6,7 @@ edition = "2018" [dependencies] fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } -futures = "0.1.29" -futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } +futures = "0.3.1" futures-timer = "2.0.2" log = "0.4.8" parking_lot = "0.9.0" @@ -28,10 +27,11 @@ sc-network = { version = "0.8", path = "../network" } sc-network-gossip = { version = "0.8", path = "../network-gossip" } sp-finality-tracker = { version = "2.0.0", path = "../../primitives/finality-tracker" } sp-finality-grandpa = { version = "2.0.0", path = "../../primitives/finality-grandpa" } -finality-grandpa = { version = "0.10.3", features = ["derive-codec"] } +finality-grandpa = { version = "0.11.0", features = ["derive-codec"] } +pin-project = "0.4.6" [dev-dependencies] -finality-grandpa = { version = "0.10.3", features = ["derive-codec", "test-helpers"] } +finality-grandpa = { version = "0.11.0", features = ["derive-codec", "test-helpers"] } sc-network = { version = "0.8", path = "../network" } sc-network-test = { version = "0.8.0", path = "../network/test" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } @@ -42,3 +42,4 @@ env_logger = "0.7.0" tokio = "0.1.22" tempfile = "3.1.0" sp-api = { version = "2.0.0", path = "../../primitives/api" } +futures01 = { package = "futures", version = "0.1.29" } diff --git a/client/finality-grandpa/src/communication/gossip.rs b/client/finality-grandpa/src/communication/gossip.rs index 7b21c1d079..7fef47867f 100644 --- a/client/finality-grandpa/src/communication/gossip.rs +++ b/client/finality-grandpa/src/communication/gossip.rs @@ -90,8 +90,7 @@ use sp_finality_grandpa::AuthorityId; use sc_telemetry::{telemetry, CONSENSUS_DEBUG}; use log::{trace, debug}; -use futures::prelude::*; -use futures03::channel::mpsc; +use futures::channel::mpsc; use rand::seq::SliceRandom; use crate::{environment, CatchUp, CompactCommit, SignedMessage}; diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 64637c0ed8..42f26aa77e 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -27,17 +27,10 @@ //! In the future, there will be a fallback for allowing sending the same message //! under certain conditions that are used to un-stick the protocol. -use futures::prelude::*; -use futures03::{ - channel::mpsc as mpsc03, - compat::Compat, - future::{self as future03, Future as Future03}, - sink::Sink as Sink03, - stream::{Stream as Stream03, StreamExt}, -}; +use futures::{prelude::*, channel::mpsc}; use log::{debug, trace}; use parking_lot::Mutex; -use std::{pin::Pin, sync::Arc, task::{Context, Poll as Poll03}}; +use std::{pin::Pin, sync::Arc, task::{Context, Poll}}; use finality_grandpa::Message::{Prevote, Precommit, PrimaryPropose}; use finality_grandpa::{voter, voter_set::VoterSet}; @@ -49,8 +42,8 @@ use sp_runtime::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, Numb use sc_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; use crate::{ - CatchUp, Commit, CommunicationIn, CommunicationOut, CompactCommit, Error, - Message, SignedMessage, + CatchUp, Commit, CommunicationIn, CommunicationOutH, + CompactCommit, Error, Message, SignedMessage, }; use crate::environment::HasVoted; use gossip::{ @@ -171,7 +164,7 @@ pub(crate) struct NetworkBridge> { // thus one has to wrap gossip_validator_report_stream with an `Arc` `Mutex`. Given that it is // just an `UnboundedReceiver`, one could also switch to a multi-producer-*multi*-consumer // channel implementation. - gossip_validator_report_stream: Arc>>, + gossip_validator_report_stream: Arc>>, } impl> Unpin for NetworkBridge {} @@ -185,7 +178,7 @@ impl> NetworkBridge { service: N, config: crate::Config, set_state: crate::environment::SharedVoterSetState, - executor: &impl futures03::task::Spawn, + executor: &impl futures::task::Spawn, ) -> Self { let (validator, report_stream) = GossipValidator::new( config, @@ -277,7 +270,7 @@ impl> NetworkBridge { local_key: Option, has_voted: HasVoted, ) -> ( - impl Stream03> + Unpin, + impl Stream> + Unpin, OutgoingMessages, ) { self.note_round( @@ -303,13 +296,13 @@ impl> NetworkBridge { match decoded { Err(ref e) => { debug!(target: "afg", "Skipping malformed message {:?}: {}", notification, e); - return future03::ready(None); + return future::ready(None); } Ok(GossipMessage::Vote(msg)) => { // check signature. if !voters.contains_key(&msg.message.id) { debug!(target: "afg", "Skipping message from unknown voter {}", msg.message.id); - return future03::ready(None); + return future::ready(None); } if voters.len() <= TELEMETRY_VOTERS_LIMIT { @@ -338,16 +331,16 @@ impl> NetworkBridge { }; } - future03::ready(Some(msg.message)) + future::ready(Some(msg.message)) } _ => { debug!(target: "afg", "Skipping unknown message type"); - return future03::ready(None); + return future::ready(None); } } }); - let (tx, out_rx) = mpsc03::channel(0); + let (tx, out_rx) = mpsc::channel(0); let outgoing = OutgoingMessages:: { round: round.0, set_id: set_id.0, @@ -360,7 +353,7 @@ impl> NetworkBridge { // Combine incoming votes from external GRANDPA nodes with outgoing // votes from our own GRANDPA voter to have a single // vote-import-pipeline. - let incoming = futures03::stream::select(incoming, out_rx); + let incoming = stream::select(incoming, out_rx); (incoming, outgoing) } @@ -372,8 +365,8 @@ impl> NetworkBridge { voters: Arc>, is_voter: bool, ) -> ( - impl Stream, Error = Error>, - impl Sink, SinkError = Error>, + impl Stream>, + impl Sink, Error = Error> + Unpin, ) { self.validator.note_set( set_id, @@ -401,7 +394,7 @@ impl> NetworkBridge { let outgoing = outgoing.with(|out| { let voter::CommunicationOut::Commit(round, commit) = out; - Ok((round, commit)) + future::ok((round, commit)) }); (incoming, outgoing) @@ -423,35 +416,35 @@ impl> NetworkBridge { } } -impl> Future03 for NetworkBridge { +impl> Future for NetworkBridge { type Output = Result<(), Error>; - fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll03 { + fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll { loop { match self.neighbor_packet_worker.lock().poll_next_unpin(cx) { - Poll03::Ready(Some((to, packet))) => { + Poll::Ready(Some((to, packet))) => { self.gossip_engine.send_message(to, packet.encode()); }, - Poll03::Ready(None) => return Poll03::Ready( + Poll::Ready(None) => return Poll::Ready( Err(Error::Network("Neighbor packet worker stream closed.".into())) ), - Poll03::Pending => break, + Poll::Pending => break, } } loop { match self.gossip_validator_report_stream.lock().poll_next_unpin(cx) { - Poll03::Ready(Some(PeerReport { who, cost_benefit })) => { + Poll::Ready(Some(PeerReport { who, cost_benefit })) => { self.gossip_engine.report(who, cost_benefit); }, - Poll03::Ready(None) => return Poll03::Ready( + Poll::Ready(None) => return Poll::Ready( Err(Error::Network("Gossip validator report stream closed.".into())) ), - Poll03::Pending => break, + Poll::Pending => break, } } - Poll03::Pending + Poll::Pending } } @@ -461,7 +454,7 @@ fn incoming_global( voters: Arc>, gossip_validator: Arc>, neighbor_sender: periodic::NeighborPacketSender, -) -> impl Stream, Error = Error> { +) -> impl Stream> { let process_commit = move | msg: FullCommitMessage, mut notification: sc_network_gossip::TopicNotification, @@ -564,29 +557,27 @@ fn incoming_global( Some(voter::CommunicationIn::CatchUp(msg.message, cb)) }; - Compat::new(gossip_engine.messages_for(topic) - .map(|m| Ok::<_, ()>(m))) + gossip_engine.messages_for(topic) .filter_map(|notification| { // this could be optimized by decoding piecewise. let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); if let Err(ref e) = decoded { trace!(target: "afg", "Skipping malformed commit message {:?}: {}", notification, e); } - decoded.map(move |d| (notification, d)).ok() + future::ready(decoded.map(move |d| (notification, d)).ok()) }) .filter_map(move |(notification, msg)| { - match msg { + future::ready(match msg { GossipMessage::Commit(msg) => process_commit(msg, notification, &mut gossip_engine, &gossip_validator, &*voters), GossipMessage::CatchUp(msg) => process_catch_up(msg, notification, &mut gossip_engine, &gossip_validator, &*voters), _ => { debug!(target: "afg", "Skipping unknown message type"); - return None; + None } - } + }) }) - .map_err(|()| Error::Network(format!("Failed to receive message on unbounded stream"))) } impl> Clone for NetworkBridge { @@ -687,19 +678,19 @@ pub(crate) struct OutgoingMessages { round: RoundNumber, set_id: SetIdNumber, locals: Option<(AuthorityPair, AuthorityId)>, - sender: mpsc03::Sender>, + sender: mpsc::Sender>, network: GossipEngine, has_voted: HasVoted, } impl Unpin for OutgoingMessages {} -impl Sink03> for OutgoingMessages +impl Sink> for OutgoingMessages { type Error = Error; - fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll03> { - Sink03::poll_ready(Pin::new(&mut self.sender), cx) + fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + Sink::poll_ready(Pin::new(&mut self.sender), cx) .map(|elem| { elem.map_err(|e| { Error::Network(format!("Failed to poll_ready channel sender: {:?}", e)) })}) @@ -769,12 +760,12 @@ impl Sink03> for OutgoingMessages Ok(()) } - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context) -> Poll03> { - Poll03::Ready(Ok(())) + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context) -> Poll> { + Poll::Ready(Ok(())) } - fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll03> { - Sink03::poll_close(Pin::new(&mut self.sender), cx) + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + Sink::poll_close(Pin::new(&mut self.sender), cx) .map(|elem| { elem.map_err(|e| { Error::Network(format!("Failed to poll_close channel sender: {:?}", e)) })}) @@ -985,13 +976,16 @@ impl CommitsOut { } } -impl Sink for CommitsOut { - type SinkItem = (RoundNumber, Commit); - type SinkError = Error; +impl Sink<(RoundNumber, Commit)> for CommitsOut { + type Error = Error; + + fn poll_ready(self: Pin<&mut Self>, _: &mut Context) -> Poll> { + Poll::Ready(Ok(())) + } - fn start_send(&mut self, input: (RoundNumber, Commit)) -> StartSend { + fn start_send(self: Pin<&mut Self>, input: (RoundNumber, Commit)) -> Result<(), Self::Error> { if !self.is_voter { - return Ok(AsyncSink::Ready); + return Ok(()); } let (round, commit) = input; @@ -1027,9 +1021,14 @@ impl Sink for CommitsOut { ); self.network.gossip_message(topic, message.encode(), false); - Ok(AsyncSink::Ready) + Ok(()) + } + + fn poll_close(self: Pin<&mut Self>, _: &mut Context) -> Poll> { + Poll::Ready(Ok(())) } - fn close(&mut self) -> Poll<(), Error> { Ok(Async::Ready(())) } - fn poll_complete(&mut self) -> Poll<(), Error> { Ok(Async::Ready(())) } + fn poll_flush(self: Pin<&mut Self>, _: &mut Context) -> Poll> { + Poll::Ready(Ok(())) + } } diff --git a/client/finality-grandpa/src/communication/periodic.rs b/client/finality-grandpa/src/communication/periodic.rs index d5c8c1e0b8..4635899690 100644 --- a/client/finality-grandpa/src/communication/periodic.rs +++ b/client/finality-grandpa/src/communication/periodic.rs @@ -17,7 +17,7 @@ //! Periodic rebroadcast of neighbor packets. use futures_timer::Delay; -use futures03::{channel::mpsc, future::{FutureExt as _}, prelude::*, ready, stream::Stream}; +use futures::{channel::mpsc, future::{FutureExt as _}, prelude::*, ready, stream::Stream}; use log::debug; use std::{pin::Pin, task::{Context, Poll}, time::{Instant, Duration}}; diff --git a/client/finality-grandpa/src/communication/tests.rs b/client/finality-grandpa/src/communication/tests.rs index c104af0339..a5435bdfdc 100644 --- a/client/finality-grandpa/src/communication/tests.rs +++ b/client/finality-grandpa/src/communication/tests.rs @@ -16,12 +16,11 @@ //! Tests for the communication portion of the GRANDPA crate. -use futures::sync::mpsc; +use futures::channel::mpsc; use futures::prelude::*; use sc_network::{Event as NetworkEvent, PeerId, config::Roles}; use sc_network_test::{Block, Hash}; use sc_network_gossip::Validator; -use tokio::runtime::current_thread; use std::sync::Arc; use sp_keyring::Ed25519Keyring; use parity_scale_codec::Encode; @@ -44,11 +43,19 @@ struct TestNetwork { sender: mpsc::UnboundedSender, } -impl sc_network_gossip::Network for TestNetwork { - fn event_stream(&self) -> Box + Send> { +impl TestNetwork { + fn event_stream_03(&self) -> Pin + Send>> { let (tx, rx) = mpsc::unbounded(); let _ = self.sender.unbounded_send(Event::EventStream(tx)); - Box::new(rx) + Box::pin(rx) + } +} + +impl sc_network_gossip::Network for TestNetwork { + fn event_stream(&self) -> Box + Send> { + Box::new( + self.event_stream_03().map(Ok::<_, ()>).compat() + ) } fn report_peer(&self, who: sc_network::PeerId, cost_benefit: sc_network::ReputationChange) { @@ -101,17 +108,17 @@ struct Tester { } impl Tester { - fn filter_network_events(self, mut pred: F) -> impl Future + fn filter_network_events(self, mut pred: F) -> impl Future where F: FnMut(Event) -> bool { let mut s = Some(self); - futures::future::poll_fn(move || loop { - match s.as_mut().unwrap().events.poll().expect("concluded early") { - Async::Ready(None) => panic!("concluded early"), - Async::Ready(Some(item)) => if pred(item) { - return Ok(Async::Ready(s.take().unwrap())) + futures::future::poll_fn(move |cx| loop { + match Stream::poll_next(Pin::new(&mut s.as_mut().unwrap().events), cx) { + Poll::Ready(None) => panic!("concluded early"), + Poll::Ready(Some(item)) => if pred(item) { + return Poll::Ready(s.take().unwrap()) }, - Async::NotReady => return Ok(Async::NotReady), + Poll::Pending => return Poll::Pending, } }) } @@ -149,8 +156,8 @@ fn voter_set_state() -> SharedVoterSetState { } // needs to run in a tokio runtime. -fn make_test_network(executor: &impl futures03::task::Spawn) -> ( - impl Future, +fn make_test_network(executor: &impl futures::task::Spawn) -> ( + impl Future, TestNetwork, ) { let (tx, rx) = mpsc::unbounded(); @@ -159,7 +166,7 @@ fn make_test_network(executor: &impl futures03::task::Spawn) -> ( #[derive(Clone)] struct Exit; - impl futures03::Future for Exit { + impl futures::Future for Exit { type Output = (); fn poll(self: Pin<&mut Self>, _: &mut Context) -> Poll<()> { @@ -175,7 +182,7 @@ fn make_test_network(executor: &impl futures03::task::Spawn) -> ( ); ( - futures::future::ok(Tester { + futures::future::ready(Tester { gossip_validator: bridge.validator.clone(), net_handle: bridge, events: rx, @@ -245,14 +252,14 @@ fn good_commit_leads_to_relay() { let id = sc_network::PeerId::random(); let global_topic = super::global_topic::(set_id); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let test = make_test_network(&threads_pool).0 - .and_then(move |tester| { + .then(move |tester| { // register a peer. tester.gossip_validator.new_peer(&mut NoopContext, &id, sc_network::config::Roles::FULL); - Ok((tester, id)) + future::ready((tester, id)) }) - .and_then(move |(tester, id)| { + .then(move |(tester, id)| { // start round, dispatch commit, and wait for broadcast. let (commits_in, _) = tester.net_handle.global_communication(SetId(1), voter_set, false); @@ -305,12 +312,11 @@ fn good_commit_leads_to_relay() { }, _ => panic!("commit expected"), } - }) - .map_err(|_| panic!("could not process commit")); + }); // once the message is sent and commit is "handled" we should have // a repropagation event coming from the network. - send_message.join(handle_commit).and_then(move |(tester, ())| { + future::join(send_message, handle_commit).then(move |(tester, ())| { tester.filter_network_events(move |event| match event { Event::WriteNotification(_, data) => { data == encoded_commit @@ -318,11 +324,10 @@ fn good_commit_leads_to_relay() { _ => false, }) }) - .map_err(|_| panic!("could not watch for gossip message")) .map(|_| ()) }); - current_thread::Runtime::new().unwrap().block_on(test).unwrap(); + futures::executor::block_on(test); } #[test] @@ -371,14 +376,14 @@ fn bad_commit_leads_to_report() { let id = sc_network::PeerId::random(); let global_topic = super::global_topic::(set_id); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let test = make_test_network(&threads_pool).0 - .and_then(move |tester| { + .map(move |tester| { // register a peer. tester.gossip_validator.new_peer(&mut NoopContext, &id, sc_network::config::Roles::FULL); - Ok((tester, id)) + (tester, id) }) - .and_then(move |(tester, id)| { + .then(move |(tester, id)| { // start round, dispatch commit, and wait for broadcast. let (commits_in, _) = tester.net_handle.global_communication(SetId(1), voter_set, false); @@ -422,12 +427,11 @@ fn bad_commit_leads_to_report() { }, _ => panic!("commit expected"), } - }) - .map_err(|_| panic!("could not process commit")); + }); // once the message is sent and commit is "handled" we should have // a report event coming from the network. - send_message.join(handle_commit).and_then(move |(tester, ())| { + future::join(send_message, handle_commit).then(move |(tester, ())| { tester.filter_network_events(move |event| match event { Event::Report(who, cost_benefit) => { who == id && cost_benefit == super::cost::INVALID_COMMIT @@ -435,26 +439,25 @@ fn bad_commit_leads_to_report() { _ => false, }) }) - .map_err(|_| panic!("could not watch for peer report")) .map(|_| ()) }); - current_thread::Runtime::new().unwrap().block_on(test).unwrap(); + futures::executor::block_on(test); } #[test] fn peer_with_higher_view_leads_to_catch_up_request() { let id = sc_network::PeerId::random(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let (tester, mut net) = make_test_network(&threads_pool); let test = tester - .and_then(move |tester| { + .map(move |tester| { // register a peer with authority role. tester.gossip_validator.new_peer(&mut NoopContext, &id, sc_network::config::Roles::AUTHORITY); - Ok((tester, id)) + ((tester, id)) }) - .and_then(move |(tester, id)| { + .then(move |(tester, id)| { // send neighbor message at round 10 and height 50 let result = tester.gossip_validator.validate( &mut net, @@ -494,9 +497,8 @@ fn peer_with_higher_view_leads_to_catch_up_request() { }, _ => false, }) - .map_err(|_| panic!("could not watch for peer send message")) .map(|_| ()) }); - current_thread::Runtime::new().unwrap().block_on(test).unwrap(); + futures::executor::block_on(test); } diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index c5c6291dc0..fd88113776 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -16,17 +16,13 @@ use std::collections::BTreeMap; use std::iter::FromIterator; +use std::pin::Pin; use std::sync::Arc; use std::time::Duration; use log::{debug, warn, info}; use parity_scale_codec::{Decode, Encode}; use futures::prelude::*; -use futures03::{ - compat::{Compat, CompatSink}, - future::{FutureExt as _, TryFutureExt as _}, - stream::StreamExt as _, -}; use futures_timer::Delay; use parking_lot::RwLock; use sp_blockchain::{HeaderBackend, Error as ClientError}; @@ -568,19 +564,18 @@ where NumberFor: BlockNumberOps, Client: AuxStore, { - type Timer = Box + Send>; + type Timer = Pin> + Send>>; type Id = AuthorityId; type Signature = AuthoritySignature; // regular round message streams - type In = Box, Self::Signature, Self::Id>, + type In = Pin, Self::Signature, Self::Id>, Self::Error> + > + Send>>; + type Out = Pin>, Error = Self::Error, - > + Send>; - type Out = Box>, - SinkError = Self::Error, - > + Send>; + > + Send>>; type Error = CommandOrError>; @@ -612,12 +607,9 @@ where has_voted, ); - let incoming = Compat::new(incoming.map(|item| Ok::<_, Error>(item))); - let outgoing = CompatSink::new(outgoing); - // schedule incoming messages from the network to be held until // corresponding blocks are imported. - let incoming = Box::new(UntilVoteTargetImported::new( + let incoming = Box::pin(UntilVoteTargetImported::new( self.client.import_notification_stream(), self.network.clone(), self.client.clone(), @@ -626,12 +618,12 @@ where ).map_err(Into::into)); // schedule network message cleanup when sink drops. - let outgoing = Box::new(outgoing.sink_map_err(Into::into)); + let outgoing = Box::pin(outgoing.sink_err_into()); voter::RoundData { voter_id: local_key.map(|pair| pair.public()), - prevote_timer: Box::new(prevote_timer.map(Ok).compat()), - precommit_timer: Box::new(precommit_timer.map(Ok).compat()), + prevote_timer: Box::pin(prevote_timer.map(Ok)), + precommit_timer: Box::pin(precommit_timer.map(Ok)), incoming, outgoing, } @@ -905,7 +897,7 @@ where //random between 0-1 seconds. let delay: u64 = thread_rng().gen_range(0, 1000); - Box::new(Delay::new(Duration::from_millis(delay)).map(Ok).compat()) + Box::pin(Delay::new(Duration::from_millis(delay)).map(Ok)) } fn prevote_equivocation( diff --git a/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index ad1b2b1a87..64fc62bfe7 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -18,7 +18,7 @@ use std::{sync::Arc, collections::HashMap}; use log::{debug, trace, info}; use parity_scale_codec::Encode; -use futures::sync::mpsc; +use futures::channel::mpsc; use parking_lot::RwLockWriteGuard; use sp_blockchain::{HeaderBackend, BlockStatus, well_known_cache_keys}; diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index 071214961f..a86a97c0da 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -53,9 +53,9 @@ //! included in the newly-finalized chain. use futures::prelude::*; -use futures03::{StreamExt, future::ready}; -use log::{debug, error, info}; -use futures::sync::mpsc; +use futures::StreamExt; +use log::{debug, info}; +use futures::channel::mpsc; use sc_client_api::{BlockchainEvents, CallExecutor, backend::{AuxStore, Backend}, ExecutionStrategy}; use sp_blockchain::{HeaderBackend, Error as ClientError}; use sc_client::Client; @@ -66,7 +66,7 @@ use sc_keystore::KeyStorePtr; use sp_inherents::InherentDataProviders; use sp_consensus::SelectChain; use sp_core::Pair; -use sc_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG, CONSENSUS_WARN}; +use sc_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG}; use serde_json; use sp_finality_tracker; @@ -77,6 +77,8 @@ use finality_grandpa::{voter, BlockNumberOps, voter_set::VoterSet}; use std::{fmt, io}; use std::sync::Arc; use std::time::Duration; +use std::pin::Pin; +use std::task::{Poll, Context}; mod authorities; mod aux_schema; @@ -456,13 +458,12 @@ fn global_communication( keystore: &Option, ) -> ( impl Stream< - Item = CommunicationInH, - Error = CommandOrError>, + Item = Result, CommandOrError>>, >, impl Sink< - SinkItem = CommunicationOutH, - SinkError = CommandOrError>, - >, + CommunicationOutH, + Error = CommandOrError>, + > + Unpin, ) where B: Backend, E: CallExecutor + Send + Sync, @@ -536,7 +537,7 @@ pub struct GrandpaParams { /// Handle to a future that will resolve on exit. pub on_exit: X, /// If supplied, can be used to hook on telemetry connection established events. - pub telemetry_on_connect: Option>, + pub telemetry_on_connect: Option>, /// A voting rule used to potentially restrict target votes. pub voting_rule: VR, /// How to spawn background tasks. @@ -547,7 +548,7 @@ pub struct GrandpaParams { /// block import worker that has already been instantiated with `block_import`. pub fn run_grandpa_voter( grandpa_params: GrandpaParams, -) -> sp_blockchain::Result + Send + 'static> where +) -> sp_blockchain::Result + Unpin + Send + 'static> where Block::Hash: Ord, B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, @@ -557,9 +558,9 @@ pub fn run_grandpa_voter( NumberFor: BlockNumberOps, DigestFor: Encode, RA: Send + Sync + 'static, - X: futures03::Future + Clone + Send + Unpin + 'static, + X: futures::Future + Clone + Send + Unpin + 'static, Client: AuxStore, - Sp: futures03::task::Spawn + 'static, + Sp: futures::task::Spawn + 'static, { let GrandpaParams { config, @@ -608,13 +609,11 @@ pub fn run_grandpa_voter( .expect("authorities is always at least an empty vector; elements are always of type string") } ); - ready(()) - }) - .unit_error() - .compat(); - futures::future::Either::A(events) + future::ready(()) + }); + future::Either::Left(events) } else { - futures::future::Either::B(futures::future::empty()) + future::Either::Right(future::pending()) }; let voter_work = VoterWork::new( @@ -628,28 +627,22 @@ pub fn run_grandpa_voter( ); let voter_work = voter_work - .map(|_| ()) - .map_err(|e| { - error!("GRANDPA Voter failed: {:?}", e); - telemetry!(CONSENSUS_WARN; "afg.voter_failed"; "e" => ?e); - }); + .map(|_| ()); // Make sure that `telemetry_task` doesn't accidentally finish and kill grandpa. let telemetry_task = telemetry_task - .then(|_| futures::future::empty::<(), ()>()); + .then(|_| future::pending::<()>()); - use futures03::{FutureExt, TryFutureExt}; - - Ok(voter_work.select(on_exit.map(Ok).compat()).select2(telemetry_task).then(|_| Ok(()))) + Ok(future::select(future::select(voter_work, on_exit), telemetry_task).map(drop)) } /// Future that powers the voter. #[must_use] struct VoterWork, RA, SC, VR> { - voter: Box>> + Send>, + voter: Pin>>> + Send>>, env: Arc>, voter_commands_rx: mpsc::UnboundedReceiver>>, - network: futures03::compat::Compat>, + network: NetworkBridge, } impl VoterWork @@ -691,10 +684,10 @@ where let mut work = VoterWork { // `voter` is set to a temporary value and replaced below when // calling `rebuild_voter`. - voter: Box::new(futures::empty()) as Box<_>, + voter: Box::pin(future::pending()), env, voter_commands_rx, - network: futures03::future::TryFutureExt::compat(network), + network, }; work.rebuild_voter(); work @@ -757,10 +750,10 @@ where last_finalized, ); - self.voter = Box::new(voter); + self.voter = Box::pin(voter); }, VoterSetState::Paused { .. } => - self.voter = Box::new(futures::empty()), + self.voter = Box::pin(future::pending()), }; } @@ -841,61 +834,47 @@ where VR: VotingRule> + Clone + 'static, Client: AuxStore, { - type Item = (); - type Error = Error; + type Output = Result<(), Error>; - fn poll(&mut self) -> Poll { - match self.voter.poll() { - Ok(Async::NotReady) => {} - Ok(Async::Ready(())) => { + fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll { + match Future::poll(Pin::new(&mut self.voter), cx) { + Poll::Pending => {} + Poll::Ready(Ok(())) => { // voters don't conclude naturally - return Err(Error::Safety("GRANDPA voter has concluded.".into())) + return Poll::Ready(Err(Error::Safety("GRANDPA voter has concluded.".into()))) } - Err(CommandOrError::Error(e)) => { + Poll::Ready(Err(CommandOrError::Error(e))) => { // return inner observer error - return Err(e) + return Poll::Ready(Err(e)) } - Err(CommandOrError::VoterCommand(command)) => { + Poll::Ready(Err(CommandOrError::VoterCommand(command))) => { // some command issued internally self.handle_voter_command(command)?; - futures::task::current().notify(); + cx.waker().wake_by_ref(); } } - match self.voter_commands_rx.poll() { - Ok(Async::NotReady) => {} - Err(_) => { - // the `voter_commands_rx` stream should not fail. - return Ok(Async::Ready(())) - } - Ok(Async::Ready(None)) => { + match Stream::poll_next(Pin::new(&mut self.voter_commands_rx), cx) { + Poll::Pending => {} + Poll::Ready(None) => { // the `voter_commands_rx` stream should never conclude since it's never closed. - return Ok(Async::Ready(())) + return Poll::Ready(Ok(())) } - Ok(Async::Ready(Some(command))) => { + Poll::Ready(Some(command)) => { // some command issued externally self.handle_voter_command(command)?; - futures::task::current().notify(); + cx.waker().wake_by_ref(); } } - match self.network.poll() { - Ok(Async::NotReady) => {}, - Ok(Async::Ready(())) => { - // the network bridge future should never conclude. - return Ok(Async::Ready(())) - } - e @ Err(_) => return e, - }; - - Ok(Async::NotReady) + Future::poll(Pin::new(&mut self.network), cx) } } #[deprecated(since = "1.1.0", note = "Please switch to run_grandpa_voter.")] pub fn run_grandpa( grandpa_params: GrandpaParams, -) -> sp_blockchain::Result + Send + 'static> where +) -> sp_blockchain::Result + Send + 'static> where Block::Hash: Ord, B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, @@ -905,9 +884,9 @@ pub fn run_grandpa( DigestFor: Encode, RA: Send + Sync + 'static, VR: VotingRule> + Clone + 'static, - X: futures03::Future + Clone + Send + Unpin + 'static, + X: futures::Future + Clone + Send + Unpin + 'static, Client: AuxStore, - Sp: futures03::task::Spawn + 'static, + Sp: futures::task::Spawn + 'static, { run_grandpa_voter(grandpa_params) } diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index 989a1e1655..418bd570c0 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -14,10 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use std::pin::Pin; use std::sync::Arc; +use std::task::{Context, Poll}; -use futures::prelude::*; -use futures::{future, sync::mpsc}; +use futures::{prelude::*, channel::mpsc}; use finality_grandpa::{ BlockNumberOps, Error as GrandpaError, voter, voter_set::VoterSet @@ -64,14 +65,13 @@ fn grandpa_observer( last_finalized_number: NumberFor, commits: S, note_round: F, -) -> impl Future>> where +) -> impl Future>>> where NumberFor: BlockNumberOps, B: Backend, E: CallExecutor + Send + Sync + 'static, RA: Send + Sync, S: Stream< - Item = CommunicationIn, - Error = CommandOrError>, + Item = Result, CommandOrError>>, >, F: Fn(u64), { @@ -80,7 +80,7 @@ fn grandpa_observer( let client = client.clone(); let voters = voters.clone(); - let observer = commits.fold(last_finalized_number, move |last_finalized_number, global| { + let observer = commits.try_fold(last_finalized_number, move |last_finalized_number, global| { let (round, commit, callback) = match global { voter::CommunicationIn::Commit(round, commit, callback) => { let commit = finality_grandpa::Commit::from(commit); @@ -143,7 +143,7 @@ fn grandpa_observer( } }); - observer.map(|_| ()) + observer.map_ok(|_| ()) } /// Run a GRANDPA observer as a task, the observer will finalize blocks only by @@ -154,16 +154,16 @@ pub fn run_grandpa_observer( config: Config, link: LinkHalf, network: N, - on_exit: impl futures03::Future + Clone + Send + Unpin + 'static, + on_exit: impl futures::Future + Clone + Send + Unpin + 'static, executor: Sp, -) -> sp_blockchain::Result + Send + 'static> where +) -> sp_blockchain::Result + Unpin + Send + 'static> where B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, N: NetworkT + Send + Clone + 'static, SC: SelectChain + 'static, NumberFor: BlockNumberOps, RA: Send + Sync + 'static, - Sp: futures03::task::Spawn + 'static, + Sp: futures::task::Spawn + 'static, Client: AuxStore, { let LinkHalf { @@ -189,20 +189,18 @@ pub fn run_grandpa_observer( ); let observer_work = observer_work - .map(|_| ()) + .map_ok(|_| ()) .map_err(|e| { warn!("GRANDPA Observer failed: {:?}", e); }); - use futures03::{FutureExt, TryFutureExt}; - - Ok(observer_work.select(on_exit.map(Ok).compat()).map(|_| ()).map_err(|_| ())) + Ok(future::select(observer_work, on_exit).map(drop)) } /// Future that powers the observer. #[must_use] struct ObserverWork, E, Backend, RA> { - observer: Box>> + Send>, + observer: Pin>>> + Send>>, client: Arc>, network: NetworkBridge, persistent_data: PersistentData, @@ -231,7 +229,7 @@ where let mut work = ObserverWork { // `observer` is set to a temporary value and replaced below when // calling `rebuild_observer`. - observer: Box::new(futures::empty()) as Box<_>, + observer: Box::pin(future::pending()) as Pin>, client, network, persistent_data, @@ -286,7 +284,7 @@ where note_round, ); - self.observer = Box::new(observer); + self.observer = Box::pin(observer); } fn handle_voter_command( @@ -336,44 +334,41 @@ where Bk: Backend + 'static, Client: AuxStore, { - type Item = (); - type Error = Error; + type Output = Result<(), Error>; + + fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll { + let this = Pin::into_inner(self); - fn poll(&mut self) -> Poll { - match self.observer.poll() { - Ok(Async::NotReady) => {} - Ok(Async::Ready(())) => { + match Future::poll(Pin::new(&mut this.observer), cx) { + Poll::Pending => {} + Poll::Ready(Ok(())) => { // observer commit stream doesn't conclude naturally; this could reasonably be an error. - return Ok(Async::Ready(())) + return Poll::Ready(Ok(())) } - Err(CommandOrError::Error(e)) => { + Poll::Ready(Err(CommandOrError::Error(e))) => { // return inner observer error - return Err(e) + return Poll::Ready(Err(e)) } - Err(CommandOrError::VoterCommand(command)) => { + Poll::Ready(Err(CommandOrError::VoterCommand(command))) => { // some command issued internally - self.handle_voter_command(command)?; - futures::task::current().notify(); + this.handle_voter_command(command)?; + cx.waker().wake_by_ref(); } } - match self.voter_commands_rx.poll() { - Ok(Async::NotReady) => {} - Err(_) => { - // the `voter_commands_rx` stream should not fail. - return Ok(Async::Ready(())) - } - Ok(Async::Ready(None)) => { + match Stream::poll_next(Pin::new(&mut this.voter_commands_rx), cx) { + Poll::Pending => {} + Poll::Ready(None) => { // the `voter_commands_rx` stream should never conclude since it's never closed. - return Ok(Async::Ready(())) + return Poll::Ready(Ok(())) } - Ok(Async::Ready(Some(command))) => { + Poll::Ready(Some(command)) => { // some command issued externally - self.handle_voter_command(command)?; - futures::task::current().notify(); + this.handle_voter_command(command)?; + cx.waker().wake_by_ref(); } } - Ok(Async::NotReady) + Poll::Pending } } diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index fdfb2fd808..0d7cf0541f 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -25,7 +25,6 @@ use sc_network_test::{ use sc_network::config::{ProtocolConfig, Roles, BoxFinalityProofRequestBuilder}; use parking_lot::Mutex; use futures_timer::Delay; -use futures03::TryStreamExt as _; use tokio::runtime::current_thread; use sp_keyring::Ed25519Keyring; use sc_client::LongestChain; @@ -48,6 +47,8 @@ use sp_runtime::generic::{BlockId, DigestItem}; use sp_core::{H256, NativeOrEncoded, ExecutionContext, crypto::Public}; use sp_finality_grandpa::{GRANDPA_ENGINE_ID, AuthorityList, GrandpaApi}; use sp_state_machine::{InMemoryBackend, prove_read, read_proof_check}; +use futures01::Async; +use futures::compat::Future01CompatExt; use authorities::AuthoritySet; use finality_proof::{ @@ -196,7 +197,7 @@ impl TestNetFactory for GrandpaTestNet { #[derive(Clone)] struct Exit; -impl futures03::Future for Exit { +impl futures::Future for Exit { type Output = (); fn poll(self: Pin<&mut Self>, _: &mut task::Context) -> task::Poll<()> { @@ -371,17 +372,28 @@ fn create_keystore(authority: Ed25519Keyring) -> (KeyStorePtr, tempfile::TempDir (keystore, keystore_path) } +fn block_until_complete(future: impl Future + Unpin, net: &Arc>, runtime: &mut current_thread::Runtime) { + let drive_to_completion = futures01::future::poll_fn(|| { + net.lock().poll(); Ok::, ()>(Async::NotReady) + }); + runtime.block_on( + future::select(future, drive_to_completion.compat()) + .map(|_| Ok::<(), ()>(())) + .compat() + ).unwrap(); +} + // run the voters to completion. provide a closure to be invoked after // the voters are spawned but before blocking on them. fn run_to_completion_with( runtime: &mut current_thread::Runtime, - threads_pool: &futures03::executor::ThreadPool, + threads_pool: &futures::executor::ThreadPool, blocks: u64, net: Arc>, peers: &[Ed25519Keyring], with: F, ) -> u64 where - F: FnOnce(current_thread::Handle) -> Option>> + F: FnOnce(current_thread::Handle) -> Option>>> { use parking_lot::RwLock; @@ -411,17 +423,16 @@ fn run_to_completion_with( }; wait_for.push( - Box::new( + Box::pin( client.finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() .take_while(move |n| { let mut highest_finalized = highest_finalized.write(); if *n.header.number() > *highest_finalized { *highest_finalized = *n.header.number(); } - Ok(n.header.number() < &blocks) + future::ready(n.header.number() < &blocks) }) - .collect() + .collect::>() .map(|_| ()) ) ); @@ -449,24 +460,20 @@ fn run_to_completion_with( assert_send(&voter); - runtime.spawn(voter); + runtime.spawn(voter.unit_error().compat()); } // wait for all finalized on each. - let wait_for = ::futures::future::join_all(wait_for) - .map(|_| ()) - .map_err(|_| ()); - - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + let wait_for = ::futures::future::join_all(wait_for); + block_until_complete(wait_for, &net, runtime); let highest_finalized = *highest_finalized.read(); highest_finalized } fn run_to_completion( runtime: &mut current_thread::Runtime, - threads_pool: &futures03::executor::ThreadPool, + threads_pool: &futures::executor::ThreadPool, blocks: u64, net: Arc>, peers: &[Ed25519Keyring] @@ -496,7 +503,7 @@ fn add_forced_change( fn finalize_3_voters_no_observers() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); @@ -522,7 +529,7 @@ fn finalize_3_voters_no_observers() { #[test] fn finalize_3_voters_1_full_observer() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); @@ -555,9 +562,8 @@ fn finalize_3_voters_1_full_observer() { }; finality_notifications.push( client.finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &20)) - .for_each(move |_| Ok(())) + .take_while(|n| future::ready(n.header.number() < &20)) + .for_each(move |_| future::ready(())) ); let keystore = if let Some(local_key) = local_key { @@ -590,16 +596,14 @@ fn finalize_3_voters_1_full_observer() { } for voter in voters { - runtime.spawn(voter); + runtime.spawn(voter.unit_error().compat()); } // wait for all finalized on each. let wait_for = futures::future::join_all(finality_notifications) - .map(|_| ()) - .map_err(|_| ()); + .map(|_| ()); - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + block_until_complete(wait_for, &net, &mut runtime); } #[test] @@ -631,7 +635,7 @@ fn transition_3_voters_twice_1_full_observer() { let net = Arc::new(Mutex::new(GrandpaTestNet::new(api, 8))); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); net.lock().peer(0).push_blocks(1, false); net.lock().block_until_sync(&mut runtime); @@ -654,8 +658,7 @@ fn transition_3_voters_twice_1_full_observer() { // wait for blocks to be finalized before generating new ones let block_production = client.finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &30)) + .take_while(|n| future::ready(n.header.number() < &30)) .for_each(move |n| { match n.header.number() { 1 => { @@ -692,10 +695,10 @@ fn transition_3_voters_twice_1_full_observer() { _ => {}, } - Ok(()) + future::ready(()) }); - runtime.spawn(block_production); + runtime.spawn(block_production.unit_error().compat()); } let mut finality_notifications = Vec::new(); @@ -725,9 +728,8 @@ fn transition_3_voters_twice_1_full_observer() { finality_notifications.push( client.finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &30)) - .for_each(move |_| Ok(())) + .take_while(|n| future::ready(n.header.number() < &30)) + .for_each(move |_| future::ready(())) .map(move |()| { let full_client = client.as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities(&*full_client).unwrap(); @@ -756,22 +758,19 @@ fn transition_3_voters_twice_1_full_observer() { }; let voter = run_grandpa_voter(grandpa_params).expect("all in order with client and network"); - runtime.spawn(voter); + runtime.spawn(voter.unit_error().compat()); } // wait for all finalized on each. - let wait_for = ::futures::future::join_all(finality_notifications) - .map(|_| ()) - .map_err(|_| ()); + let wait_for = ::futures::future::join_all(finality_notifications); - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + block_until_complete(wait_for, &net, &mut runtime); } #[test] fn justification_is_emitted_when_consensus_data_changes() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); @@ -790,7 +789,7 @@ fn justification_is_emitted_when_consensus_data_changes() { #[test] fn justification_is_generated_periodically() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); @@ -830,7 +829,7 @@ fn consensus_changes_works() { #[test] fn sync_justifications_on_change_blocks() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_b); @@ -871,21 +870,21 @@ fn sync_justifications_on_change_blocks() { } // the last peer should get the justification by syncing from other peers - runtime.block_on(futures::future::poll_fn(move || -> std::result::Result<_, ()> { + futures::executor::block_on(futures::future::poll_fn(move |_| { if net.lock().peer(3).client().justification(&BlockId::Number(21)).unwrap().is_none() { net.lock().poll(); - Ok(Async::NotReady) + Poll::Pending } else { - Ok(Async::Ready(())) + Poll::Ready(()) } - })).unwrap() + })) } #[test] fn finalizes_multiple_pending_changes_in_order() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let peers_b = &[Ed25519Keyring::Dave, Ed25519Keyring::Eve, Ed25519Keyring::Ferdie]; @@ -946,7 +945,7 @@ fn finalizes_multiple_pending_changes_in_order() { fn force_change_to_new_set() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); // two of these guys are offline. let genesis_authorities = &[ Ed25519Keyring::Alice, @@ -1123,11 +1122,11 @@ fn voter_persists_its_votes() { use std::iter::FromIterator; use std::sync::atomic::{AtomicUsize, Ordering}; use futures::future; - use futures::sync::mpsc; + use futures::channel::mpsc; let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); // we have two authorities but we'll only be running the voter for alice // we are going to be listening for the prevotes it casts @@ -1161,56 +1160,56 @@ fn voter_persists_its_votes() { keystore_paths.push(keystore_path); struct ResettableVoter { - voter: Box + Send>, + voter: Pin + Send + Unpin>>, voter_rx: mpsc::UnboundedReceiver<()>, net: Arc>, client: PeersClient, keystore: KeyStorePtr, - threads_pool: futures03::executor::ThreadPool, + threads_pool: futures::executor::ThreadPool, } impl Future for ResettableVoter { - type Item = (); - type Error = (); + type Output = (); - fn poll(&mut self) -> Poll { - match self.voter.poll() { - Ok(Async::Ready(())) | Err(_) => panic!("error in the voter"), - Ok(Async::NotReady) => {}, + fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll { + let this = Pin::into_inner(self); + + if let Poll::Ready(()) = Pin::new(&mut this.voter).poll(cx) { + panic!("error in the voter"); } - match self.voter_rx.poll() { - Err(_) | Ok(Async::Ready(None)) => return Ok(Async::Ready(())), - Ok(Async::NotReady) => {} - Ok(Async::Ready(Some(()))) => { + match Pin::new(&mut this.voter_rx).poll_next(cx) { + Poll::Pending => return Poll::Pending, + Poll::Ready(None) => return Poll::Ready(()), + Poll::Ready(Some(())) => { let (_block_import, _, _, _, link) = - self.net.lock() + this.net.lock() .make_block_import::< TransactionFor - >(self.client.clone()); + >(this.client.clone()); let link = link.lock().take().unwrap(); let grandpa_params = GrandpaParams { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - keystore: Some(self.keystore.clone()), + keystore: Some(this.keystore.clone()), name: Some(format!("peer#{}", 0)), is_authority: true, observer_enabled: true, }, link, - network: self.net.lock().peers[0].network_service().clone(), + network: this.net.lock().peers[0].network_service().clone(), inherent_data_providers: InherentDataProviders::new(), on_exit: Exit, telemetry_on_connect: None, voting_rule: VotingRulesBuilder::default().build(), - executor: self.threads_pool.clone(), + executor: this.threads_pool.clone(), }; let voter = run_grandpa_voter(grandpa_params) .expect("all in order with client and network") - .then(move |r| { + .map(move |r| { // we need to keep the block_import alive since it owns the // sender for the voter commands channel, if that gets dropped // then the voter will stop @@ -1218,30 +1217,30 @@ fn voter_persists_its_votes() { r }); - self.voter = Box::new(voter); + this.voter = Box::pin(voter); // notify current task in order to poll the voter - futures::task::current().notify(); + cx.waker().wake_by_ref(); } }; - Ok(Async::NotReady) + Poll::Pending } } - // we create a "dummy" voter by setting it to `empty` and triggering the `tx`. + // we create a "dummy" voter by setting it to `pending` and triggering the `tx`. // this way, the `ResettableVoter` will reset its `voter` field to a value ASAP. voter_tx.unbounded_send(()).unwrap(); runtime.spawn(ResettableVoter { - voter: Box::new(futures::future::empty()), + voter: Box::pin(futures::future::pending()), voter_rx, net: net.clone(), client: client.clone(), keystore, threads_pool: threads_pool.clone(), - }); + }.unit_error().compat()); } - let (exit_tx, exit_rx) = futures::sync::oneshot::channel::<()>(); + let (exit_tx, exit_rx) = futures::channel::oneshot::channel::<()>(); // create the communication layer for bob, but don't start any // voter. instead we'll listen for the prevote that alice casts @@ -1284,122 +1283,107 @@ fn voter_persists_its_votes() { HasVoted::No, ); - let round_rx = futures03::compat::Compat::new(round_rx.map(|item| Ok::<_, Error>(item))); - let round_tx = futures03::compat::CompatSink::new(round_tx); - let round_tx = Arc::new(Mutex::new(round_tx)); let exit_tx = Arc::new(Mutex::new(Some(exit_tx))); let net = net.clone(); - let state = AtomicUsize::new(0); + let state = Arc::new(AtomicUsize::new(0)); runtime.spawn(round_rx.for_each(move |signed| { - if state.compare_and_swap(0, 1, Ordering::SeqCst) == 0 { - // the first message we receive should be a prevote from alice. - let prevote = match signed.message { - finality_grandpa::Message::Prevote(prevote) => prevote, - _ => panic!("voter should prevote."), - }; - - // its chain has 20 blocks and the voter targets 3/4 of the - // unfinalized chain, so the vote should be for block 15 - assert!(prevote.target_number == 15); - - // we push 20 more blocks to alice's chain - net.lock().peer(0).push_blocks(20, false); - - let net2 = net.clone(); - let net = net.clone(); - let voter_tx = voter_tx.clone(); - let round_tx = round_tx.clone(); - - let interval = futures03::stream::unfold(Delay::new(Duration::from_millis(200)), |delay| - Box::pin(async move { - delay.await; - Some(((), Delay::new(Duration::from_millis(200)))) - })).map(Ok::<_, ()>).compat(); - - future::Either::A(interval - .take_while(move |_| { - Ok(net2.lock().peer(1).client().info().best_number != 40) - }) - .for_each(|_| Ok(())) - .and_then(move |_| { - let block_30_hash = - net.lock().peer(0).client().as_full().unwrap().hash(30).unwrap().unwrap(); - - // we restart alice's voter - voter_tx.unbounded_send(()).unwrap(); - - // and we push our own prevote for block 30 - let prevote = finality_grandpa::Prevote { - target_number: 30, - target_hash: block_30_hash, - }; - - // One should either be calling `Sink::send` or `Sink::start_send` followed - // by `Sink::poll_complete` to make sure items are being flushed. Given that - // we send in a loop including a delay until items are received, this can be - // ignored for the sake of reduced complexity. - if !round_tx.lock() - .start_send(finality_grandpa::Message::Prevote(prevote)) - .unwrap() - .is_ready() { - panic!("expected sink to be ready to write to."); - } - - Ok(()) - }).map_err(|_| panic!())) - - } else if state.compare_and_swap(1, 2, Ordering::SeqCst) == 1 { - // the next message we receive should be our own prevote - let prevote = match signed.message { - finality_grandpa::Message::Prevote(prevote) => prevote, - _ => panic!("We should receive our own prevote."), - }; - - // targeting block 30 - assert!(prevote.target_number == 30); - - // after alice restarts it should send its previous prevote - // therefore we won't ever receive it again since it will be a - // known message on the gossip layer - - future::Either::B(future::ok(())) - - } else if state.compare_and_swap(2, 3, Ordering::SeqCst) == 2 { - // we then receive a precommit from alice for block 15 - // even though we casted a prevote for block 30 - let precommit = match signed.message { - finality_grandpa::Message::Precommit(precommit) => precommit, - _ => panic!("voter should precommit."), - }; - - assert!(precommit.target_number == 15); - - // signal exit - exit_tx.clone().lock().take().unwrap().send(()).unwrap(); - - future::Either::B(future::ok(())) - - } else { - panic!() + let net2 = net.clone(); + let net = net.clone(); + let voter_tx = voter_tx.clone(); + let round_tx = round_tx.clone(); + let state = state.clone(); + let exit_tx = exit_tx.clone(); + + async move { + if state.compare_and_swap(0, 1, Ordering::SeqCst) == 0 { + // the first message we receive should be a prevote from alice. + let prevote = match signed.message { + finality_grandpa::Message::Prevote(prevote) => prevote, + _ => panic!("voter should prevote."), + }; + + // its chain has 20 blocks and the voter targets 3/4 of the + // unfinalized chain, so the vote should be for block 15 + assert!(prevote.target_number == 15); + + // we push 20 more blocks to alice's chain + net.lock().peer(0).push_blocks(20, false); + + let interval = futures::stream::unfold(Delay::new(Duration::from_millis(200)), |delay| + Box::pin(async move { + delay.await; + Some(((), Delay::new(Duration::from_millis(200)))) + }) + ); + + interval + .take_while(move |_| { + future::ready(net2.lock().peer(1).client().info().best_number != 40) + }) + .for_each(|_| future::ready(())) + .await; + + let block_30_hash = + net.lock().peer(0).client().as_full().unwrap().hash(30).unwrap().unwrap(); + + // we restart alice's voter + voter_tx.unbounded_send(()).unwrap(); + + // and we push our own prevote for block 30 + let prevote = finality_grandpa::Prevote { + target_number: 30, + target_hash: block_30_hash, + }; + + // One should either be calling `Sink::send` or `Sink::start_send` followed + // by `Sink::poll_complete` to make sure items are being flushed. Given that + // we send in a loop including a delay until items are received, this can be + // ignored for the sake of reduced complexity. + Pin::new(&mut *round_tx.lock()).start_send(finality_grandpa::Message::Prevote(prevote)).unwrap(); + } else if state.compare_and_swap(1, 2, Ordering::SeqCst) == 1 { + // the next message we receive should be our own prevote + let prevote = match signed.message { + finality_grandpa::Message::Prevote(prevote) => prevote, + _ => panic!("We should receive our own prevote."), + }; + + // targeting block 30 + assert!(prevote.target_number == 30); + + // after alice restarts it should send its previous prevote + // therefore we won't ever receive it again since it will be a + // known message on the gossip layer + + } else if state.compare_and_swap(2, 3, Ordering::SeqCst) == 2 { + // we then receive a precommit from alice for block 15 + // even though we casted a prevote for block 30 + let precommit = match signed.message { + finality_grandpa::Message::Precommit(precommit) => precommit, + _ => panic!("voter should precommit."), + }; + + assert!(precommit.target_number == 15); + + // signal exit + exit_tx.clone().lock().take().unwrap().send(()).unwrap(); + } else { + panic!() + } } - - }).map_err(|_| ())); + }).map(Ok).boxed().compat()); } - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let exit = exit_rx.into_future().map(|_| ()).map_err(|_| ()); - - runtime.block_on(drive_to_completion.select(exit).map(|_| ()).map_err(|_| ())).unwrap(); + block_until_complete(exit_rx.into_future(), &net, &mut runtime); } #[test] fn finalize_3_voters_1_light_observer() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let authorities = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(authorities); @@ -1416,9 +1400,8 @@ fn finalize_3_voters_1_light_observer() { let link = net.lock().peer(3).data.lock().take().expect("link initialized on startup; qed"); let finality_notifications = net.lock().peer(3).client().finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &20)) - .collect(); + .take_while(|n| future::ready(n.header.number() < &20)) + .collect::>(); run_to_completion_with(&mut runtime, &threads_pool, 20, net.clone(), authorities, |executor| { executor.spawn( @@ -1435,10 +1418,10 @@ fn finalize_3_voters_1_light_observer() { net.lock().peers[3].network_service().clone(), Exit, threads_pool.clone(), - ).unwrap() + ).unwrap().unit_error().compat() ).unwrap(); - Some(Box::new(finality_notifications.map(|_| ()))) + Some(Box::pin(finality_notifications.map(|_| ()))) }); } @@ -1446,7 +1429,7 @@ fn finalize_3_voters_1_light_observer() { fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { let _ = ::env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers = &[Ed25519Keyring::Alice]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 1); @@ -1460,14 +1443,15 @@ fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { net.lock().block_until_sync(&mut runtime); // check that the block#1 is finalized on light client - runtime.block_on(futures::future::poll_fn(move || -> std::result::Result<_, ()> { + let mut runtime = current_thread::Runtime::new().unwrap(); + let _ = runtime.block_on(futures::future::poll_fn(move |_| { if net.lock().peer(1).client().info().finalized_number == 1 { - Ok(Async::Ready(())) + Poll::Ready(()) } else { net.lock().poll(); - Ok(Async::NotReady) + Poll::Pending } - })).unwrap() + }).unit_error().compat()); } #[test] @@ -1477,7 +1461,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ let _ = ::env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); // two of these guys are offline. let genesis_authorities = if FORCE_CHANGE { @@ -1542,7 +1526,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ fn voter_catches_up_to_latest_round_when_behind() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers); @@ -1554,7 +1538,7 @@ fn voter_catches_up_to_latest_round_when_behind() { let net = Arc::new(Mutex::new(net)); let mut finality_notifications = Vec::new(); - let voter = |keystore, peer_id, link, net: Arc>| -> Box + Send> { + let voter = |keystore, peer_id, link, net: Arc>| -> Pin + Send>> { let grandpa_params = GrandpaParams { config: Config { gossip_duration: TEST_GOSSIP_DURATION, @@ -1573,7 +1557,7 @@ fn voter_catches_up_to_latest_round_when_behind() { executor: threads_pool.clone(), }; - Box::new(run_grandpa_voter(grandpa_params).expect("all in order with client and network")) + Box::pin(run_grandpa_voter(grandpa_params).expect("all in order with client and network")) }; let mut keystore_paths = Vec::new(); @@ -1591,9 +1575,8 @@ fn voter_catches_up_to_latest_round_when_behind() { finality_notifications.push( client.finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &50)) - .for_each(move |_| Ok(())) + .take_while(|n| future::ready(n.header.number() < &50)) + .for_each(move |_| future::ready(())) ); let (keystore, keystore_path) = create_keystore(*key); @@ -1601,14 +1584,13 @@ fn voter_catches_up_to_latest_round_when_behind() { let voter = voter(Some(keystore), peer_id, link, net.clone()); - runtime.spawn(voter); + runtime.spawn(voter.unit_error().compat()); } // wait for them to finalize block 50. since they'll vote on 3/4 of the // unfinalized chain it will take at least 4 rounds to do it. let wait_for_finality = ::futures::future::join_all(finality_notifications) - .map(|_| ()) - .map_err(|_| ()); + .map(|_| ()); // spawn a new voter, it should be behind by at least 4 rounds and should be // able to catch up to the latest round @@ -1616,7 +1598,7 @@ fn voter_catches_up_to_latest_round_when_behind() { let net = net.clone(); let runtime = runtime.handle(); - wait_for_finality.and_then(move |_| { + wait_for_finality.then(move |_| { let peer_id = 2; let link = { let net = net.lock(); @@ -1628,20 +1610,20 @@ fn voter_catches_up_to_latest_round_when_behind() { let voter = voter(None, peer_id, link, net); - runtime.spawn(voter).unwrap(); + runtime.spawn(voter.unit_error().compat()).unwrap(); let start_time = std::time::Instant::now(); let timeout = Duration::from_secs(5 * 60); - let wait_for_catch_up = futures::future::poll_fn(move || { + let wait_for_catch_up = futures::future::poll_fn(move |_| { // The voter will start at round 1 and since everyone else is // already at a later round the only way to get to round 4 (or // later) is by issuing a catch up request. if set_state.read().last_completed_round().number >= 4 { - Ok(Async::Ready(())) + Poll::Ready(()) } else if start_time.elapsed() > timeout { panic!("Timed out while waiting for catch up to happen") } else { - Ok(Async::NotReady) + Poll::Pending } }); @@ -1649,8 +1631,14 @@ fn voter_catches_up_to_latest_round_when_behind() { }) }; - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(test.select(drive_to_completion).map_err(|_| ())).unwrap(); + let drive_to_completion = futures01::future::poll_fn(|| { + net.lock().poll(); Ok::, ()>(Async::NotReady) + }); + runtime.block_on( + future::select(test, drive_to_completion.compat()) + .map(|_| Ok::<(), ()>(())) + .compat() + ).unwrap(); } #[test] @@ -1658,7 +1646,7 @@ fn grandpa_environment_respects_voting_rules() { use finality_grandpa::Chain; use sc_network_test::TestClient; - let threads_pool = futures03::executor::ThreadPool::new().unwrap(); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); let peers = &[Ed25519Keyring::Alice]; let voters = make_ids(peers); diff --git a/client/finality-grandpa/src/until_imported.rs b/client/finality-grandpa/src/until_imported.rs index f53b651bcf..c3a52fcf56 100644 --- a/client/finality-grandpa/src/until_imported.rs +++ b/client/finality-grandpa/src/until_imported.rs @@ -33,13 +33,15 @@ use sc_client_api::{BlockImportNotification, ImportNotifications}; use futures::prelude::*; use futures::stream::Fuse; use futures_timer::Delay; -use futures03::{StreamExt as _, TryStreamExt as _}; +use futures::channel::mpsc::UnboundedReceiver; use finality_grandpa::voter; use parking_lot::Mutex; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use std::collections::{HashMap, VecDeque}; +use std::pin::Pin; use std::sync::{atomic::{AtomicUsize, Ordering}, Arc}; +use std::task::{Context, Poll}; use std::time::{Duration, Instant}; use sp_finality_grandpa::AuthorityId; @@ -70,13 +72,15 @@ pub(crate) trait BlockUntilImported: Sized { } /// Buffering imported messages until blocks with given hashes are imported. +#[pin_project::pin_project] pub(crate) struct UntilImported> { - import_notifications: Fuse, Error = ()> + Send>>, + import_notifications: Fuse>>, block_sync_requester: BlockSyncRequester, status_check: BlockStatus, + #[pin] inner: Fuse, ready: VecDeque, - check_pending: Box + Send>, + check_pending: Pin> + Send>>, /// Mapping block hashes to their block number, the point in time it was /// first encountered (Instant) and a list of GRANDPA messages referencing /// the block hash. @@ -87,8 +91,9 @@ pub(crate) struct UntilImported UntilImported where Block: BlockT, BlockStatus: BlockStatusT, + BlockSyncRequester: BlockSyncRequesterT, + I: Stream, M: BlockUntilImported, - I: Stream, { /// Create a new `UntilImported` wrapper. pub(crate) fn new( @@ -105,22 +110,19 @@ impl UntilImported _>(|v| Ok::<_, ()>(v)).compat(); - Box::new(stream) as Box + Send> - }.fuse(), + import_notifications: import_notifications.fuse(), block_sync_requester, status_check, inner: stream.fuse(), ready: VecDeque::new(), - check_pending: Box::new(check_pending), + check_pending: Box::pin(check_pending), pending: HashMap::new(), identifier, } @@ -131,24 +133,27 @@ impl Stream for UntilImported, BSyncRequester: BlockSyncRequesterT, - I: Stream, + I: Stream, M: BlockUntilImported, { - type Item = M::Blocked; - type Error = Error; + type Item = Result; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + // We are using a `this` variable in order to allow multiple simultaneous mutable borrow + // to `self`. + let mut this = self.project(); - fn poll(&mut self) -> Poll, Error> { loop { - match self.inner.poll()? { - Async::Ready(None) => return Ok(Async::Ready(None)), - Async::Ready(Some(input)) => { + match Stream::poll_next(Pin::new(&mut this.inner), cx) { + Poll::Ready(None) => return Poll::Ready(None), + Poll::Ready(Some(input)) => { // new input: schedule wait of any parts which require // blocks to be known. - let ready = &mut self.ready; - let pending = &mut self.pending; + let ready = &mut this.ready; + let pending = &mut this.pending; M::schedule_wait( input, - &self.status_check, + this.status_check, |target_hash, target_number, wait| pending .entry(target_hash) .or_insert_with(|| (target_number, Instant::now(), Vec::new())) @@ -157,37 +162,36 @@ impl Stream for UntilImported break, + Poll::Pending => break, } } loop { - match self.import_notifications.poll() { - Err(_) => return Err(Error::Network(format!("Failed to get new message"))), - Ok(Async::Ready(None)) => return Ok(Async::Ready(None)), - Ok(Async::Ready(Some(notification))) => { + match Stream::poll_next(Pin::new(&mut this.import_notifications), cx) { + Poll::Ready(None) => return Poll::Ready(None), + Poll::Ready(Some(notification)) => { // new block imported. queue up all messages tied to that hash. - if let Some((_, _, messages)) = self.pending.remove(¬ification.hash) { + if let Some((_, _, messages)) = this.pending.remove(¬ification.hash) { let canon_number = notification.header.number().clone(); let ready_messages = messages.into_iter() .filter_map(|m| m.wait_completed(canon_number)); - self.ready.extend(ready_messages); + this.ready.extend(ready_messages); } } - Ok(Async::NotReady) => break, + Poll::Pending => break, } } let mut update_interval = false; - while let Async::Ready(Some(_)) = self.check_pending.poll().map_err(Error::Timer)? { + while let Poll::Ready(Some(Ok(()))) = this.check_pending.poll_next_unpin(cx) { update_interval = true; } if update_interval { let mut known_keys = Vec::new(); - for (&block_hash, &mut (block_number, ref mut last_log, ref v)) in &mut self.pending { - if let Some(number) = self.status_check.block_number(block_hash)? { + for (&block_hash, &mut (block_number, ref mut last_log, ref v)) in this.pending.iter_mut() { + if let Some(number) = this.status_check.block_number(block_hash)? { known_keys.push((block_hash, number)); } else { let next_log = *last_log + LOG_PENDING_INTERVAL; @@ -199,13 +203,13 @@ impl Stream for UntilImported Stream for UntilImported { target_number: NumberFor, } +impl Unpin for BlockGlobalMessage {} + impl BlockUntilImported for BlockGlobalMessage { type Blocked = CommunicationIn; @@ -474,13 +480,12 @@ pub(crate) type UntilGlobalMessageBlocksImported( @@ -615,13 +619,13 @@ mod tests { let (chain_state, import_notifications) = TestChainState::new(); let block_status = chain_state.block_status(); - let (global_tx, global_rx) = futures::sync::mpsc::unbounded(); + let (global_tx, global_rx) = futures::channel::mpsc::unbounded(); let until_imported = UntilGlobalMessageBlocksImported::new( import_notifications, TestBlockSyncRequester::default(), block_status, - global_rx.map_err(|_| panic!("should never error")), + global_rx, "global", ); @@ -630,13 +634,10 @@ mod tests { // NOTE: needs to be cloned otherwise it is moved to the stream and // dropped too early. let inner_chain_state = chain_state.clone(); - let work = until_imported - .into_future() - .select2(Delay::new(Duration::from_millis(100)).unit_error().compat()) + let work = future::select(until_imported.into_future(), Delay::new(Duration::from_millis(100))) .then(move |res| match res { - Err(_) => panic!("neither should have had error"), - Ok(Either::A(_)) => panic!("timeout should have fired first"), - Ok(Either::B((_, until_imported))) => { + Either::Left(_) => panic!("timeout should have fired first"), + Either::Right((_, until_imported)) => { // timeout fired. push in the headers. enact_dependencies(&inner_chain_state); @@ -644,8 +645,7 @@ mod tests { } }); - let mut runtime = Runtime::new().unwrap(); - runtime.block_on(work).map_err(|(e, _)| e).unwrap().0.unwrap() + futures::executor::block_on(work).0.unwrap().unwrap() } #[test] @@ -871,7 +871,7 @@ mod tests { let (chain_state, import_notifications) = TestChainState::new(); let block_status = chain_state.block_status(); - let (global_tx, global_rx) = futures::sync::mpsc::unbounded(); + let (global_tx, global_rx) = futures::channel::mpsc::unbounded(); let block_sync_requester = TestBlockSyncRequester::default(); @@ -879,7 +879,7 @@ mod tests { import_notifications, block_sync_requester.clone(), block_status, - global_rx.map_err(|_| panic!("should never error")), + global_rx, "global", ); @@ -914,31 +914,31 @@ mod tests { // we send the commit message and spawn the until_imported stream global_tx.unbounded_send(unknown_commit()).unwrap(); - let mut runtime = Runtime::new().unwrap(); - runtime.spawn(until_imported.into_future().map(|_| ()).map_err(|_| ())); + let threads_pool = futures::executor::ThreadPool::new().unwrap(); + threads_pool.spawn_ok(until_imported.into_future().map(|_| ())); // assert that we will make sync requests - let assert = futures::future::poll_fn::<(), (), _>(|| { + let assert = futures::future::poll_fn(|_| { let block_sync_requests = block_sync_requester.requests.lock(); // we request blocks targeted by the precommits that aren't imported if block_sync_requests.contains(&(h2.hash(), *h2.number())) && block_sync_requests.contains(&(h3.hash(), *h3.number())) { - return Ok(Async::Ready(())); + return Poll::Ready(()); } - Ok(Async::NotReady) + Poll::Pending }); // the `until_imported` stream doesn't request the blocks immediately, // but it should request them after a small timeout - let timeout = Delay::new(Duration::from_secs(60)).unit_error().compat(); - let test = assert.select2(timeout).map(|res| match res { - Either::A(_) => {}, - Either::B(_) => panic!("timed out waiting for block sync request"), - }).map_err(|_| ()); + let timeout = Delay::new(Duration::from_secs(60)); + let test = future::select(assert, timeout).map(|res| match res { + Either::Left(_) => {}, + Either::Right(_) => panic!("timed out waiting for block sync request"), + }).map(drop); - runtime.block_on(test).unwrap(); + futures::executor::block_on(test); } } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 194bd09e24..caf97438ad 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -1067,7 +1067,7 @@ ServiceBuilder< has_bootnodes, ), exit.clone()).map(drop))); - let telemetry_connection_sinks: Arc>>> = Default::default(); + let telemetry_connection_sinks: Arc>>> = Default::default(); // Telemetry let telemetry = config.telemetry_endpoints.clone().map(|endpoints| { diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 1b2e7bcd3c..57e1462f64 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -100,7 +100,7 @@ pub struct Service { rpc_handlers: sc_rpc_server::RpcHandler, _rpc: Box, _telemetry: Option, - _telemetry_on_connect_sinks: Arc>>>, + _telemetry_on_connect_sinks: Arc>>>, _offchain_workers: Option>, keystore: sc_keystore::KeyStorePtr, marker: PhantomData, @@ -153,7 +153,7 @@ pub trait AbstractService: 'static + Future> + type NetworkSpecialization: NetworkSpecialization; /// Get event stream for telemetry connection established events. - fn telemetry_on_connect_stream(&self) -> mpsc::UnboundedReceiver<()>; + fn telemetry_on_connect_stream(&self) -> futures::channel::mpsc::UnboundedReceiver<()>; /// return a shared instance of Telemetry (if enabled) fn telemetry(&self) -> Option; @@ -224,8 +224,8 @@ where type TransactionPool = TExPool; type NetworkSpecialization = TNetSpec; - fn telemetry_on_connect_stream(&self) -> mpsc::UnboundedReceiver<()> { - let (sink, stream) = mpsc::unbounded(); + fn telemetry_on_connect_stream(&self) -> futures::channel::mpsc::UnboundedReceiver<()> { + let (sink, stream) = futures::channel::mpsc::unbounded(); self._telemetry_on_connect_sinks.lock().push(sink); stream } -- GitLab From 6ae4f5956b871fb8c6fbf3261e12c9c8ccb80e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 24 Jan 2020 13:38:45 +0100 Subject: [PATCH 180/296] Deposit event on `frame-system::set_code` (#4726) * Deposit event on `frame-system::set_code` * Update frame/system/src/lib.rs Co-authored-by: thiolliere --- frame/system/src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 478fd780b9..ac51ef70e3 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -281,6 +281,7 @@ decl_module! { } storage::unhashed::put_raw(well_known_keys::CODE, &code); + Self::deposit_event(Event::CodeUpdated); } /// Set the new runtime code without doing any checks of the given `code`. @@ -288,6 +289,7 @@ decl_module! { pub fn set_code_without_checks(origin, code: Vec) { ensure_root(origin)?; storage::unhashed::put_raw(well_known_keys::CODE, &code); + Self::deposit_event(Event::CodeUpdated); } /// Set the new changes trie configuration. @@ -364,6 +366,8 @@ decl_event!( ExtrinsicSuccess(DispatchInfo), /// An extrinsic failed. ExtrinsicFailed(DispatchError, DispatchInfo), + /// `:code` was updated. + CodeUpdated, } ); @@ -1282,6 +1286,7 @@ mod tests { match e { Event::ExtrinsicSuccess(..) => 100, Event::ExtrinsicFailed(..) => 101, + Event::CodeUpdated => 102, } } } @@ -1688,6 +1693,11 @@ mod tests { RawOrigin::Root.into(), substrate_test_runtime_client::runtime::WASM_BINARY.to_vec(), ).unwrap(); + + assert_eq!( + System::events(), + vec![EventRecord { phase: Phase::ApplyExtrinsic(0), event: 102u16, topics: vec![] }], + ); }); } } -- GitLab From e2eda0e5634a1d2b9fc0133398758426e9a82a9d Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 24 Jan 2020 05:22:39 -0800 Subject: [PATCH 181/296] Async/await in transaction-graph (#4645) * async/await in tx graph * review notes * remove unused typedef --- client/transaction-pool/graph/src/pool.rs | 229 ++++++++++------------ client/transaction-pool/src/lib.rs | 34 +++- primitives/transaction-pool/src/pool.rs | 37 ++-- 3 files changed, 144 insertions(+), 156 deletions(-) diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index 5be879f079..d0f14ad40a 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -27,7 +27,6 @@ use serde::Serialize; use futures::{ Future, FutureExt, channel::mpsc, - future::{Either, ready, join_all}, }; use sp_runtime::{ generic::BlockId, @@ -132,8 +131,8 @@ impl Pool { } /// Imports a bunch of unverified extrinsics to the pool - pub fn submit_at(&self, at: &BlockId, xts: T, force: bool) - -> impl Future, B::Error>>, B::Error>> + pub async fn submit_at(&self, at: &BlockId, xts: T, force: bool) + -> Result, B::Error>>, B::Error> where T: IntoIterator> { @@ -143,48 +142,43 @@ impl Pool { .map(|validated_transactions| validated_pool.submit(validated_transactions .into_iter() .map(|(_, tx)| tx)))) + .await } /// Imports one unverified extrinsic to the pool - pub fn submit_one( + pub async fn submit_one( &self, at: &BlockId, xt: ExtrinsicFor, - ) -> impl Future, B::Error>> { + ) -> Result, B::Error> { self.submit_at(at, std::iter::once(xt), false) .map(|import_result| import_result.and_then(|mut import_result| import_result .pop() .expect("One extrinsic passed; one result returned; qed") )) + .await } /// Import a single extrinsic and starts to watch their progress in the pool. - pub fn submit_and_watch( + pub async fn submit_and_watch( &self, at: &BlockId, xt: ExtrinsicFor, - ) -> impl Future, BlockHash>, B::Error>> { - let block_number = match self.resolve_block_number(at) { - Ok(block_number) => block_number, - Err(err) => return Either::Left(ready(Err(err))) - }; - - let validated_pool = self.validated_pool.clone(); - Either::Right( - self.verify_one(at, block_number, xt, false) - .map(move |validated_transactions| validated_pool.submit_and_watch(validated_transactions.1)) - ) + ) -> Result, BlockHash>, B::Error> { + let block_number = self.resolve_block_number(at)?; + let (_, tx) = self.verify_one(at, block_number, xt, false).await; + self.validated_pool.submit_and_watch(tx) } /// Revalidate all ready transactions. /// /// Returns future that performs validation of all ready transactions and /// then resubmits all transactions back to the pool. - pub fn revalidate_ready( + pub async fn revalidate_ready( &self, at: &BlockId, max: Option, - ) -> impl Future> { + ) -> Result<(), B::Error> { use std::time::Instant; log::debug!(target: "txpool", "Fetching ready transactions (up to: {})", @@ -196,23 +190,20 @@ impl Pool { .take(max.unwrap_or_else(usize::max_value)); let now = Instant::now(); - self.verify(at, ready, false) - .map(move |revalidated_transactions| { - log::debug!(target: "txpool", - "Re-verified transactions, took {} ms. Resubmitting.", - now.elapsed().as_millis() - ); - let now = Instant::now(); - let res = revalidated_transactions.map( - |revalidated_transactions| validated_pool.resubmit(revalidated_transactions) - ); - log::debug!(target: "txpool", - "Resubmitted. Took {} ms. Status: {:?}", - now.elapsed().as_millis(), - validated_pool.status() - ); - res - }) + let revalidated_transactions = self.verify(at, ready, false).await?; + log::debug!(target: "txpool", + "Re-verified transactions, took {} ms. Resubmitting.", + now.elapsed().as_millis() + ); + + let now = Instant::now(); + self.validated_pool.resubmit(revalidated_transactions); + log::debug!(target: "txpool", + "Resubmitted. Took {} ms. Status: {:?}", + now.elapsed().as_millis(), + validated_pool.status() + ); + Ok(()) } /// Prunes known ready transactions. @@ -238,12 +229,12 @@ impl Pool { /// To perform pruning we need the tags that each extrinsic provides and to avoid calling /// into runtime too often we first lookup all extrinsics that are in the pool and get /// their provided tags from there. Otherwise we query the runtime at the `parent` block. - pub fn prune( + pub async fn prune( &self, at: &BlockId, parent: &BlockId, extrinsics: &[ExtrinsicFor], - ) -> impl Future> { + ) -> Result<(), B::Error> { log::debug!( target: "txpool", "Starting pruning of block {:?} (extrinsics: {})", @@ -257,34 +248,26 @@ impl Pool { // Zip the ones from the pool with the full list (we get pairs `(Extrinsic, Option>)`) let all = extrinsics.iter().zip(in_pool_tags.into_iter()); - // Prepare future that collect tags for all extrinsics - let future_tags = join_all(all - .map(|(extrinsic, in_pool_tags)| - match in_pool_tags { - // reuse the tags for extrinsics that were found in the pool - Some(tags) => Either::Left( - ready(tags) - ), - // if it's not found in the pool query the runtime at parent block - // to get validity info and tags that the extrinsic provides. - None => Either::Right(self.validated_pool.api().validate_transaction(parent, extrinsic.clone()) - .then(|validity| ready(match validity { - Ok(Ok(validity)) => validity.provides, - // silently ignore invalid extrinsics, - // cause they might just be inherent - _ => Vec::new(), - }))), - } - )); + let mut future_tags = Vec::new(); + for (extrinsic, in_pool_tags) in all { + match in_pool_tags { + // reuse the tags for extrinsics that were found in the pool + Some(tags) => future_tags.extend(tags), + // if it's not found in the pool query the runtime at parent block + // to get validity info and tags that the extrinsic provides. + None => { + let validity = self.validated_pool.api() + .validate_transaction(parent, extrinsic.clone()) + .await; + + if let Ok(Ok(validity)) = validity { + future_tags.extend(validity.provides); + } + }, + } + } - // Prune transactions by tags - let at = at.clone(); - let self_clone = self.clone(); - future_tags.then(move |tags| self_clone.prune_tags( - &at, - tags.into_iter().flat_map(|tags| tags), - in_pool_hashes, - )) + self.prune_tags(at, future_tags, in_pool_hashes).await } /// Prunes ready transactions that provide given list of tags. @@ -308,17 +291,17 @@ impl Pool { /// the second parameter of `known_imported_hashes`. These transactions /// (if pruned) are not revalidated and become temporarily banned to /// prevent importing them in the (near) future. - pub fn prune_tags( + pub async fn prune_tags( &self, at: &BlockId, tags: impl IntoIterator, known_imported_hashes: impl IntoIterator> + Clone, - ) -> impl Future> { + ) -> Result<(), B::Error> { log::debug!(target: "txpool", "Pruning at {:?}", at); // Prune all transactions that provide given tags let prune_status = match self.validated_pool.prune_tags(tags) { Ok(prune_status) => prune_status, - Err(e) => return Either::Left(ready(Err(e))), + Err(e) => return Err(e), }; // Make sure that we don't revalidate extrinsics that were part of the recently @@ -330,21 +313,18 @@ impl Pool { // note that `known_imported_hashes` will be rejected here due to temporary ban. let pruned_hashes = prune_status.pruned.iter().map(|tx| tx.hash.clone()).collect::>(); let pruned_transactions = prune_status.pruned.into_iter().map(|tx| tx.data.clone()); - let reverify_future = self.verify(at, pruned_transactions, false); + + let reverified_transactions = self.verify(at, pruned_transactions, false).await?; log::trace!(target: "txpool", "Prunning at {:?}. Resubmitting transactions.", at); // And finally - submit reverified transactions back to the pool - let at = at.clone(); - let validated_pool = self.validated_pool.clone(); - Either::Right(reverify_future.then(move |reverified_transactions| - ready(reverified_transactions.and_then(|reverified_transactions| - validated_pool.resubmit_pruned( - &at, - known_imported_hashes, - pruned_hashes, - reverified_transactions.into_iter().map(|(_, xt)| xt).collect(), - )) - ))) + + self.validated_pool.resubmit_pruned( + &at, + known_imported_hashes, + pruned_hashes, + reverified_transactions.into_iter().map(|(_, xt)| xt).collect(), + ) } /// Return an event stream of notifications for when transactions are imported to the pool. @@ -388,69 +368,74 @@ impl Pool { } /// Returns future that validates a bunch of transactions at given block. - fn verify( + async fn verify( &self, at: &BlockId, xts: impl IntoIterator>, force: bool, - ) -> impl Future, ValidatedTransactionFor>, B::Error>> { + ) -> Result, ValidatedTransactionFor>, B::Error> { // we need a block number to compute tx validity - let block_number = match self.resolve_block_number(at) { - Ok(block_number) => block_number, - Err(err) => return Either::Left(ready(Err(err))), - }; + let block_number = self.resolve_block_number(at)?; + let mut result = HashMap::new(); - // for each xt, prepare a validation future - let validation_futures = xts.into_iter().map(move |xt| - self.verify_one(at, block_number, xt, force) - ); + for xt in xts { + let (hash, validated_tx) = self.verify_one(at, block_number, xt, force).await; + result.insert(hash, validated_tx); + } - // make single validation future that waits all until all extrinsics are validated - Either::Right(join_all(validation_futures).then(|x| ready(Ok(x.into_iter().collect())))) + Ok(result) } /// Returns future that validates single transaction at given block. - fn verify_one( + async fn verify_one( &self, block_id: &BlockId, block_number: NumberFor, xt: ExtrinsicFor, force: bool, - ) -> impl Future, ValidatedTransactionFor)> { + ) -> (ExHash, ValidatedTransactionFor) { let (hash, bytes) = self.validated_pool.api().hash_and_length(&xt); if !force && self.validated_pool.is_banned(&hash) { - return Either::Left(ready(( + return ( hash.clone(), ValidatedTransaction::Invalid(hash, error::Error::TemporarilyBanned.into()), - ))) + ) } - Either::Right(self.validated_pool.api().validate_transaction(block_id, xt.clone()) - .then(move |validation_result| ready((hash.clone(), match validation_result { - Ok(validity) => match validity { - Ok(validity) => if validity.provides.is_empty() { - ValidatedTransaction::Invalid(hash, error::Error::NoTagsProvided.into()) - } else { - ValidatedTransaction::Valid(base::Transaction { - data: xt, - bytes, - hash, - priority: validity.priority, - requires: validity.requires, - provides: validity.provides, - propagate: validity.propagate, - valid_till: block_number - .saturated_into::() - .saturating_add(validity.longevity), - }) - }, - Err(TransactionValidityError::Invalid(e)) => - ValidatedTransaction::Invalid(hash, error::Error::InvalidTransaction(e).into()), - Err(TransactionValidityError::Unknown(e)) => - ValidatedTransaction::Unknown(hash, error::Error::UnknownTransaction(e).into()), - }, - Err(e) => ValidatedTransaction::Invalid(hash, e), - })))) + let validation_result = self.validated_pool.api().validate_transaction(block_id, xt.clone()).await; + + let status = match validation_result { + Ok(status) => status, + Err(e) => return (hash.clone(), ValidatedTransaction::Invalid(hash, e)), + }; + + let validity = match status { + Ok(validity) => { + if validity.provides.is_empty() { + ValidatedTransaction::Invalid(hash.clone(), error::Error::NoTagsProvided.into()) + } else { + ValidatedTransaction::Valid(base::Transaction { + data: xt, + bytes, + hash: hash.clone(), + priority: validity.priority, + requires: validity.requires, + provides: validity.provides, + propagate: validity.propagate, + valid_till: block_number + .saturated_into::() + .saturating_add(validity.longevity), + }) + } + }, + + Err(TransactionValidityError::Invalid(e)) => + ValidatedTransaction::Invalid(hash.clone(), error::Error::InvalidTransaction(e).into()), + Err(TransactionValidityError::Unknown(e)) => + ValidatedTransaction::Unknown(hash.clone(), error::Error::UnknownTransaction(e).into()), + }; + + (hash, validity) } } diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index f6f7774935..b085dba279 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -39,9 +39,11 @@ use sp_runtime::{ use sp_transaction_pool::{ TransactionPool, PoolStatus, ImportNotificationStream, TxHash, TransactionFor, TransactionStatusStreamFor, BlockHash, - MaintainedTransactionPool, + MaintainedTransactionPool, PoolFuture, }; +type PoolResult = PoolFuture; + /// Basic implementation of transaction pool that can be customized by providing PoolApi. pub struct BasicPool where @@ -129,28 +131,40 @@ impl TransactionPool for BasicPool fn submit_at( &self, at: &BlockId, - xts: impl IntoIterator> + 'static, - ) -> Box, Self::Error>>, Self::Error>> + Send + Unpin> { - Box::new(self.pool.submit_at(at, xts, false)) + xts: Vec>, + ) -> PoolResult, Self::Error>>> { + let pool = self.pool.clone(); + let at = *at; + async move { + pool.submit_at(&at, xts, false).await + }.boxed() } fn submit_one( &self, at: &BlockId, xt: TransactionFor, - ) -> Box, Self::Error>> + Send + Unpin> { - Box::new(self.pool.submit_one(at, xt)) + ) -> PoolResult> { + let pool = self.pool.clone(); + let at = *at; + async move { + pool.submit_one(&at, xt).await + }.boxed() } fn submit_and_watch( &self, at: &BlockId, xt: TransactionFor, - ) -> Box>, Self::Error>> + Send + Unpin> { - Box::new( - self.pool.submit_and_watch(at, xt) + ) -> PoolResult>> { + let at = *at; + let pool = self.pool.clone(); + + async move { + pool.submit_and_watch(&at, xt) .map(|result| result.map(|watcher| Box::new(watcher.into_stream()) as _)) - ) + .await + }.boxed() } fn remove_invalid(&self, hashes: &[TxHash]) -> Vec> { diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index ed24ad0619..92a0c4b5c3 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -124,6 +124,9 @@ pub type TransactionFor

= <

::Block as BlockT>::Extrinsi /// Type of transactions event stream for a pool. pub type TransactionStatusStreamFor

= TransactionStatusStream, BlockHash

>; +/// Typical future type used in transaction pool api. +pub type PoolFuture = std::pin::Pin> + Send>>; + /// In-pool transaction interface. /// /// The pool is container of transactions that are implementing this trait. @@ -170,55 +173,41 @@ pub trait TransactionPool: Send + Sync { fn submit_at( &self, at: &BlockId, - xts: impl IntoIterator> + 'static, - ) -> Box, Self::Error>>, - Self::Error - >> + Send + Unpin>; + xts: Vec>, + ) -> PoolFuture, Self::Error>>, Self::Error>; /// Returns a future that imports one unverified transaction to the pool. fn submit_one( &self, at: &BlockId, xt: TransactionFor, - ) -> Box, - Self::Error - >> + Send + Unpin>; - - // RPC + ) -> PoolFuture, Self::Error>; + // *** RPC /// Returns a future that import a single transaction and starts to watch their progress in the pool. fn submit_and_watch( &self, at: &BlockId, xt: TransactionFor, - ) -> Box>, Self::Error>> + Send + Unpin>; - - - // Block production / Networking + ) -> PoolFuture>, Self::Error>; + // *** Block production / Networking /// Get an iterator for ready transactions ordered by priority fn ready(&self) -> Box>>; - - // Block production - + // *** Block production /// Remove transactions identified by given hashes (and dependent transactions) from the pool. fn remove_invalid(&self, hashes: &[TxHash]) -> Vec>; - // logging - + // *** logging /// Returns pool status. fn status(&self) -> PoolStatus; - // logging / RPC / networking - + // *** logging / RPC / networking /// Return an event stream of transactions imported to the pool. fn import_notification_stream(&self) -> ImportNotificationStream; - // networking - + // *** networking /// Notify the pool about transactions broadcast. fn on_broadcasted(&self, propagations: HashMap, Vec>); -- GitLab From 82428e085759e6727d965492d30e91785d861f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 24 Jan 2020 15:20:45 +0100 Subject: [PATCH 182/296] Introduces `author_hasKey` and `author_hasSessionKeys` rpc endpoints (#4720) * Introduces `author_hasKey` and `author_hasSessionKeys` rpc endpoints Both endpoints can be used to check if a key is present in the keystore. - `hasKey` works on with an individual public key and key type. It checks if a private key for the given combination exists in the keystore. - `hasSessionKeys` works with the full encoded session key blob stored on-chain in `nextKeys`. This requires that the given blob can be decoded by the runtime. It will return `true`, iff all public keys of the session key exist in the storage. Fixes: https://github.com/paritytech/substrate/issues/4696 * Update client/rpc-api/src/author/error.rs Co-Authored-By: Nikolay Volf * Indentation Co-authored-by: Nikolay Volf --- Cargo.lock | 1 + bin/node-template/runtime/src/lib.rs | 6 ++ bin/node/runtime/src/lib.rs | 6 ++ client/keystore/src/lib.rs | 50 +++++++++------- client/rpc-api/src/author/error.rs | 3 + client/rpc-api/src/author/mod.rs | 17 +++++- client/rpc/src/author/mod.rs | 16 +++++ client/rpc/src/author/tests.rs | 62 +++++++++++++++++++- primitives/application-crypto/src/ed25519.rs | 4 ++ primitives/application-crypto/src/lib.rs | 4 ++ primitives/application-crypto/src/sr25519.rs | 4 ++ primitives/application-crypto/src/traits.rs | 8 ++- primitives/core/src/crypto.rs | 4 +- primitives/core/src/testing.rs | 4 ++ primitives/core/src/traits.rs | 5 ++ primitives/offchain/src/lib.rs | 4 +- primitives/runtime/src/testing.rs | 4 ++ primitives/runtime/src/traits.rs | 33 +++++++++++ primitives/session/Cargo.toml | 3 +- primitives/session/src/lib.rs | 7 +++ test-utils/runtime/src/lib.rs | 12 ++++ 21 files changed, 223 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e69ee8e6e7..6ec2225830 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6642,6 +6642,7 @@ name = "sp-session" version = "2.0.0" dependencies = [ "sp-api 2.0.0", + "sp-core 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", ] diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 4416cbf13e..1276f20d17 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -360,6 +360,12 @@ impl_runtime_apis! { fn generate_session_keys(seed: Option>) -> Vec { opaque::SessionKeys::generate(seed) } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::KeyTypeId)>> { + opaque::SessionKeys::decode_into_raw_public_keys(&encoded) + } } impl fg_primitives::GrandpaApi for Runtime { diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index ecc16ee143..23cd7405dd 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -798,6 +798,12 @@ impl_runtime_apis! { fn generate_session_keys(seed: Option>) -> Vec { SessionKeys::generate(seed) } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } } } diff --git a/client/keystore/src/lib.rs b/client/keystore/src/lib.rs index f8794aa05e..ef81c40c10 100644 --- a/client/keystore/src/lib.rs +++ b/client/keystore/src/lib.rs @@ -72,7 +72,8 @@ impl std::error::Error for Error { /// Every pair that is being generated by a `seed`, will be placed in memory. pub struct Store { path: Option, - additional: HashMap<(KeyTypeId, Vec), Vec>, + /// Map over `(KeyTypeId, Raw public key)` -> `Key phrase/seed` + additional: HashMap<(KeyTypeId, Vec), String>, password: Option>, } @@ -97,25 +98,22 @@ impl Store { })) } - /// Get the public/private key pair for the given public key and key type. - fn get_additional_pair( + /// Get the key phrase for the given public key and key type from the in-memory store. + fn get_additional_pair( &self, - public: &Pair::Public, + public: &[u8], key_type: KeyTypeId, - ) -> Result> { - let key = (key_type, public.to_raw_vec()); - self.additional - .get(&key) - .map(|bytes| Pair::from_seed_slice(bytes).map_err(|_| Error::InvalidSeed)) - .transpose() + ) -> Option<&String> { + let key = (key_type, public.to_vec()); + self.additional.get(&key) } /// Insert the given public/private key pair with the given key type. /// /// Does not place it into the file system store. - fn insert_ephemeral_pair(&mut self, pair: &Pair, key_type: KeyTypeId) { + fn insert_ephemeral_pair(&mut self, pair: &Pair, seed: &str, key_type: KeyTypeId) { let key = (key_type, pair.public().to_raw_vec()); - self.additional.insert(key, pair.to_raw_vec()); + self.additional.insert(key, seed.into()); } /// Insert a new key with anonymous crypto. @@ -179,7 +177,7 @@ impl Store { key_type: KeyTypeId, ) -> Result { let pair = Pair::from_string(seed, None).map_err(|_| Error::InvalidSeed)?; - self.insert_ephemeral_pair(&pair, key_type); + self.insert_ephemeral_pair(&pair, seed, key_type); Ok(pair) } @@ -190,20 +188,24 @@ impl Store { self.insert_ephemeral_from_seed_by_type::(seed, Pair::ID).map(Into::into) } + /// Get the key phrase for a given public key and key type. + fn key_phrase_by_type(&self, public: &[u8], key_type: KeyTypeId) -> Result { + if let Some(phrase) = self.get_additional_pair(public, key_type) { + return Ok(phrase.clone()) + } + + let path = self.key_file_path(public, key_type).ok_or_else(|| Error::Unavailable)?; + let file = File::open(path)?; + + serde_json::from_reader(&file).map_err(Into::into) + } + /// Get a key pair for the given public key and key type. pub fn key_pair_by_type(&self, public: &Pair::Public, key_type: KeyTypeId, ) -> Result { - if let Some(pair) = self.get_additional_pair(public, key_type)? { - return Ok(pair) - } - - let path = self.key_file_path(public.as_slice(), key_type) - .ok_or_else(|| Error::Unavailable)?; - let file = File::open(path)?; - - let phrase: String = serde_json::from_reader(&file)?; + let phrase = self.key_phrase_by_type(public.as_slice(), key_type)?; let pair = Pair::from_string( &phrase, self.password.as_ref().map(|p| &***p), @@ -328,6 +330,10 @@ impl BareCryptoStore for Store { fn password(&self) -> Option<&str> { self.password.as_ref().map(|x| x.as_str()) } + + fn has_keys(&self, public_keys: &[(Vec, KeyTypeId)]) -> bool { + public_keys.iter().all(|(p, t)| self.key_phrase_by_type(&p, *t).is_ok()) + } } #[cfg(test)] diff --git a/client/rpc-api/src/author/error.rs b/client/rpc-api/src/author/error.rs index 8ebd06f8de..f1b5691008 100644 --- a/client/rpc-api/src/author/error.rs +++ b/client/rpc-api/src/author/error.rs @@ -54,6 +54,9 @@ pub enum Error { /// Some random issue with the key store. Shouldn't happen. #[display(fmt="The key store is unavailable")] KeyStoreUnavailable, + /// Invalid session keys encoding. + #[display(fmt="Session keys are not encoded correctly")] + InvalidSessionKeys, } impl std::error::Error for Error { diff --git a/client/rpc-api/src/author/mod.rs b/client/rpc-api/src/author/mod.rs index cbdbd38154..4fbf0c73a3 100644 --- a/client/rpc-api/src/author/mod.rs +++ b/client/rpc-api/src/author/mod.rs @@ -39,7 +39,8 @@ pub trait AuthorApi { /// Insert a key into the keystore. #[rpc(name = "author_insertKey")] - fn insert_key(&self, + fn insert_key( + &self, key_type: String, suri: String, public: Bytes, @@ -49,6 +50,20 @@ pub trait AuthorApi { #[rpc(name = "author_rotateKeys")] fn rotate_keys(&self) -> Result; + /// Checks if the keystore has private keys for the given session public keys. + /// + /// `session_keys` is the SCALE encoded session keys object from the runtime. + /// + /// Returns `true` iff all private keys could be found. + #[rpc(name = "author_hasSessionKeys")] + fn has_session_keys(&self, session_keys: Bytes) -> Result; + + /// Checks if the keystore has private keys for the given public key and key type. + /// + /// Returns `true` if a private key could be found. + #[rpc(name = "author_hasKey")] + fn has_key(&self, public_key: Bytes, key_type: String) -> Result; + /// Returns all pending extrinsics, potentially grouped by sender. #[rpc(name = "author_pendingExtrinsics")] fn pending_extrinsics(&self) -> Result>; diff --git a/client/rpc/src/author/mod.rs b/client/rpc/src/author/mod.rs index 9891abc47d..06bdcf883c 100644 --- a/client/rpc/src/author/mod.rs +++ b/client/rpc/src/author/mod.rs @@ -112,6 +112,22 @@ where ).map(Into::into).map_err(|e| Error::Client(Box::new(e))) } + fn has_session_keys(&self, session_keys: Bytes) -> Result { + let best_block_hash = self.client.chain_info().best_hash; + let keys = self.client.runtime_api().decode_session_keys( + &generic::BlockId::Hash(best_block_hash), + session_keys.to_vec(), + ).map_err(|e| Error::Client(Box::new(e)))? + .ok_or_else(|| Error::InvalidSessionKeys)?; + + Ok(self.keystore.read().has_keys(&keys)) + } + + fn has_key(&self, public_key: Bytes, key_type: String) -> Result { + let key_type = key_type.as_str().try_into().map_err(|_| Error::BadKeyType)?; + Ok(self.keystore.read().has_keys(&[(public_key.to_vec(), key_type)])) + } + fn submit_extrinsic(&self, ext: Bytes) -> FutureResult> { let xt = match Decode::decode(&mut &ext[..]) { Ok(xt) => xt, diff --git a/client/rpc/src/author/tests.rs b/client/rpc/src/author/tests.rs index 9fe51d62f5..7de109bc5d 100644 --- a/client/rpc/src/author/tests.rs +++ b/client/rpc/src/author/tests.rs @@ -16,12 +16,12 @@ use super::*; -use std::sync::Arc; +use std::{mem, sync::Arc}; use assert_matches::assert_matches; use codec::Encode; use sp_core::{ - H256, blake2_256, hexdisplay::HexDisplay, testing::{ED25519, SR25519, KeyStore}, traits::BareCryptoStorePtr, ed25519, - crypto::Pair, + H256, blake2_256, hexdisplay::HexDisplay, testing::{ED25519, SR25519, KeyStore}, + traits::BareCryptoStorePtr, ed25519, crypto::{Pair, Public}, }; use rpc::futures::Stream as _; use substrate_test_runtime_client::{ @@ -237,3 +237,59 @@ fn should_rotate_keys() { assert_eq!(session_keys.ed25519, ed25519_key_pair.public().into()); assert_eq!(session_keys.sr25519, sr25519_key_pair.public().into()); } + +#[test] +fn test_has_session_keys() { + let setup = TestSetup::default(); + let p = setup.author(); + + let non_existent_public_keys = TestSetup::default() + .author() + .rotate_keys() + .expect("Rotates the keys"); + + let public_keys = p.rotate_keys().expect("Rotates the keys"); + let test_vectors = vec![ + (public_keys, Ok(true)), + (vec![1, 2, 3].into(), Err(Error::InvalidSessionKeys)), + (non_existent_public_keys, Ok(false)), + ]; + + for (keys, result) in test_vectors { + assert_eq!( + result.map_err(|e| mem::discriminant(&e)), + p.has_session_keys(keys).map_err(|e| mem::discriminant(&e)), + ); + } +} + +#[test] +fn test_has_key() { + let setup = TestSetup::default(); + let p = setup.author(); + + let suri = "//Alice"; + let alice_key_pair = ed25519::Pair::from_string(suri, None).expect("Generates keypair"); + p.insert_key( + String::from_utf8(ED25519.0.to_vec()).expect("Keytype is a valid string"), + suri.to_string(), + alice_key_pair.public().0.to_vec().into(), + ).expect("Insert key"); + let bob_key_pair = ed25519::Pair::from_string("//Bob", None).expect("Generates keypair"); + + let test_vectors = vec![ + (alice_key_pair.public().to_raw_vec().into(), ED25519, Ok(true)), + (alice_key_pair.public().to_raw_vec().into(), SR25519, Ok(false)), + (bob_key_pair.public().to_raw_vec().into(), ED25519, Ok(false)), + ]; + + for (key, key_type, result) in test_vectors { + assert_eq!( + result.map_err(|e| mem::discriminant(&e)), + p.has_key( + key, + String::from_utf8(key_type.0.to_vec()).expect("Keytype is a valid string"), + ).map_err(|e| mem::discriminant(&e)), + ); + } +} diff --git a/primitives/application-crypto/src/ed25519.rs b/primitives/application-crypto/src/ed25519.rs index c92c70495e..414715a106 100644 --- a/primitives/application-crypto/src/ed25519.rs +++ b/primitives/application-crypto/src/ed25519.rs @@ -53,4 +53,8 @@ impl RuntimePublic for Public { fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { sp_io::crypto::ed25519_verify(&signature, msg.as_ref(), self) } + + fn to_raw_vec(&self) -> Vec { + sp_core::crypto::Public::to_raw_vec(self) + } } diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index db1bdf0c7a..fed4a6bf8e 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -301,6 +301,10 @@ macro_rules! app_crypto_public_common { fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { <$public as $crate::RuntimePublic>::verify(self.as_ref(), msg, &signature.as_ref()) } + + fn to_raw_vec(&self) -> $crate::Vec { + <$public as $crate::RuntimePublic>::to_raw_vec(&self.0) + } } } } diff --git a/primitives/application-crypto/src/sr25519.rs b/primitives/application-crypto/src/sr25519.rs index 34d9797bd4..59c6f19b6f 100644 --- a/primitives/application-crypto/src/sr25519.rs +++ b/primitives/application-crypto/src/sr25519.rs @@ -53,4 +53,8 @@ impl RuntimePublic for Public { fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { sp_io::crypto::sr25519_verify(&signature, msg.as_ref(), self) } + + fn to_raw_vec(&self) -> Vec { + sp_core::crypto::Public::to_raw_vec(self) + } } diff --git a/primitives/application-crypto/src/traits.rs b/primitives/application-crypto/src/traits.rs index 4b500bb2a6..2af039a88d 100644 --- a/primitives/application-crypto/src/traits.rs +++ b/primitives/application-crypto/src/traits.rs @@ -106,10 +106,13 @@ pub trait RuntimePublic: Sized { /// Verify that the given signature matches the given message using this public key. fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool; + + /// Returns `Self` as raw vec. + fn to_raw_vec(&self) -> Vec; } /// A runtime interface for an application's public key. -pub trait RuntimeAppPublic: Sized { +pub trait RuntimeAppPublic: Sized { /// An identifier for this application-specific key type. const ID: KeyTypeId; @@ -136,6 +139,9 @@ pub trait RuntimeAppPublic: Sized { /// Verify that the given signature matches the given message using this public key. fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool; + + /// Returns `Self` as raw vec. + fn to_raw_vec(&self) -> Vec; } /// Something that bound to a fixed `RuntimeAppPublic`. diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index ce2b75c375..3cc6c50f76 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -19,7 +19,6 @@ // end::description[] use sp_std::hash::Hash; -#[cfg(feature = "full_crypto")] use sp_std::vec::Vec; #[cfg(feature = "std")] use sp_std::convert::TryInto; @@ -520,8 +519,7 @@ pub trait Public: AsRef<[u8]> + AsMut<[u8]> + Default + Derive + CryptoType + Pa fn from_slice(data: &[u8]) -> Self; /// Return a `Vec` filled with raw data. - #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec { self.as_slice().to_owned() } + fn to_raw_vec(&self) -> Vec { self.as_slice().to_vec() } /// Return a slice filled with raw data. fn as_slice(&self) -> &[u8] { self.as_ref() } diff --git a/primitives/core/src/testing.rs b/primitives/core/src/testing.rs index 35286acb63..0def3454bc 100644 --- a/primitives/core/src/testing.rs +++ b/primitives/core/src/testing.rs @@ -127,6 +127,10 @@ impl crate::traits::BareCryptoStore for KeyStore { fn password(&self) -> Option<&str> { None } + + fn has_keys(&self, public_keys: &[(Vec, KeyTypeId)]) -> bool { + public_keys.iter().all(|(k, t)| self.keys.get(&t).and_then(|s| s.get(k)).is_some()) + } } /// Macro for exporting functions from wasm in with the expected signature for using it with the diff --git a/primitives/core/src/traits.rs b/primitives/core/src/traits.rs index 020b5e2dc5..bd02d39fb5 100644 --- a/primitives/core/src/traits.rs +++ b/primitives/core/src/traits.rs @@ -69,6 +69,11 @@ pub trait BareCryptoStore: Send + Sync { /// Get the password for this store. fn password(&self) -> Option<&str>; + + /// Checks if the private keys for the given public key and key type combinations exist. + /// + /// Returns `true` iff all private keys could be found. + fn has_keys(&self, public_keys: &[(Vec, KeyTypeId)]) -> bool; } /// A pointer to the key store. diff --git a/primitives/offchain/src/lib.rs b/primitives/offchain/src/lib.rs index 1dd20db0dd..ae02fed496 100644 --- a/primitives/offchain/src/lib.rs +++ b/primitives/offchain/src/lib.rs @@ -19,8 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] -use sp_runtime::traits::NumberFor; - /// Local Storage Prefix used by the Offchain Worker API to pub const STORAGE_PREFIX: &[u8] = b"storage"; @@ -31,7 +29,7 @@ sp_api::decl_runtime_apis! { /// Starts the off-chain task for given block number. #[skip_initialize_block] #[changed_in(2)] - fn offchain_worker(number: NumberFor); + fn offchain_worker(number: sp_runtime::traits::NumberFor); /// Starts the off-chain task for given block header. #[skip_initialize_block] diff --git a/primitives/runtime/src/testing.rs b/primitives/runtime/src/testing.rs index 516d581126..c86638b57b 100644 --- a/primitives/runtime/src/testing.rs +++ b/primitives/runtime/src/testing.rs @@ -115,6 +115,10 @@ impl sp_application_crypto::RuntimeAppPublic for UintAuthorityId { u64::from_le_bytes(msg_signature) == *signature } + + fn to_raw_vec(&self) -> Vec { + AsRef::<[u8]>::as_ref(self).to_vec() + } } impl OpaqueKeys for UintAuthorityId { diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 08bbd83ca5..7d889cae9b 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -1106,12 +1106,14 @@ macro_rules! count { #[macro_export] macro_rules! impl_opaque_keys { ( + $( #[ $attr:meta ] )* pub struct $name:ident { $( pub $field:ident: $type:ty, )* } ) => { + $( #[ $attr ] )* #[derive( Default, Clone, PartialEq, Eq, $crate::codec::Encode, @@ -1143,6 +1145,37 @@ macro_rules! impl_opaque_keys { }; $crate::codec::Encode::encode(&keys) } + + /// Converts `Self` into a `Vec` of `(raw public key, KeyTypeId)`. + pub fn into_raw_public_keys( + self, + ) -> $crate::sp_std::vec::Vec<($crate::sp_std::vec::Vec, $crate::KeyTypeId)> { + let mut keys = Vec::new(); + $( + keys.push(( + $crate::RuntimeAppPublic::to_raw_vec(&self.$field), + < + < + $type as $crate::BoundToRuntimeAppPublic + >::Public as $crate::RuntimeAppPublic + >::ID, + )); + )* + + keys + } + + /// Decode `Self` from the given `encoded` slice and convert `Self` into the raw public + /// keys (see [`Self::into_raw_public_keys`]). + /// + /// Returns `None` when the decoding failed, otherwise `Some(_)`. + pub fn decode_into_raw_public_keys( + encoded: &[u8], + ) -> Option<$crate::sp_std::vec::Vec<($crate::sp_std::vec::Vec, $crate::KeyTypeId)>> { + ::decode(&mut &encoded[..]) + .ok() + .map(|s| s.into_raw_public_keys()) + } } impl $crate::traits::OpaqueKeys for $name { diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index b7c72e0c68..24475e9414 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -7,8 +7,9 @@ edition = "2018" [dependencies] sp-api = { version = "2.0.0", default-features = false, path = "../api" } sp-std = { version = "2.0.0", default-features = false, path = "../std" } +sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-runtime = { version = "2.0.0", optional = true, path = "../runtime" } [features] default = [ "std" ] -std = [ "sp-api/std", "sp-std/std", "sp-runtime" ] +std = [ "sp-api/std", "sp-std/std", "sp-runtime", "sp-core/std" ] diff --git a/primitives/session/src/lib.rs b/primitives/session/src/lib.rs index c61218ca6b..8e2a68d050 100644 --- a/primitives/session/src/lib.rs +++ b/primitives/session/src/lib.rs @@ -25,6 +25,8 @@ use sp_runtime::{generic::BlockId, traits::Block as BlockT}; #[cfg(feature = "std")] use sp_api::ProvideRuntimeApi; +use sp_core::crypto::KeyTypeId; + sp_api::decl_runtime_apis! { /// Session keys runtime api. pub trait SessionKeys { @@ -36,6 +38,11 @@ sp_api::decl_runtime_apis! { /// /// Returns the concatenated SCALE encoded public keys. fn generate_session_keys(seed: Option>) -> Vec; + + /// Decode the given public session keys. + /// + /// Returns the list of public raw public keys + key type. + fn decode_session_keys(encoded: Vec) -> Option, KeyTypeId)>>; } } diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index e68ed5f6fc..b8e858c3a4 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -631,6 +631,12 @@ cfg_if! { fn generate_session_keys(_: Option>) -> Vec { SessionKeys::generate(None) } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } } impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { @@ -847,6 +853,12 @@ cfg_if! { fn generate_session_keys(_: Option>) -> Vec { SessionKeys::generate(None) } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } } impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { -- GitLab From 6cd538f8f77862c5c5379a1808871e0a28347baf Mon Sep 17 00:00:00 2001 From: thiolliere Date: Fri, 24 Jan 2020 20:04:11 +0100 Subject: [PATCH 183/296] Improve decl storage parsing (#4731) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * improve decl storage parsing * remove hidding detail macro * Apply suggestions from code review Co-authored-by: Bastian Köcher --- frame/support/procedural/src/storage/parse.rs | 128 ++++++++++++++++-- .../procedural/tools/derive/src/lib.rs | 74 +--------- frame/support/procedural/tools/src/syn_ext.rs | 33 ----- 3 files changed, 116 insertions(+), 119 deletions(-) diff --git a/frame/support/procedural/src/storage/parse.rs b/frame/support/procedural/src/storage/parse.rs index 5d91fbcc0e..04af85a312 100644 --- a/frame/support/procedural/src/storage/parse.rs +++ b/frame/support/procedural/src/storage/parse.rs @@ -38,10 +38,37 @@ mod keyword { syn::custom_keyword!(hasher); } +/// Specific `Opt` to implement structure with optional parsing +#[derive(Debug, Clone)] +pub struct Opt

{ + pub inner: Option

, +} +impl syn::export::ToTokens for Opt

{ + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + if let Some(ref p) = self.inner { + p.to_tokens(tokens); + } + } +} + +macro_rules! impl_parse_for_opt { + ($struct:ident => $token:path) => { + impl syn::parse::Parse for Opt<$struct> { + fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { + if input.peek($token) { + input.parse().map(|p| Opt { inner: Some(p) }) + } else { + Ok(Opt { inner: None }) + } + } + } + }; +} + /// Parsing usage only #[derive(Parse, ToTokens, Debug)] struct StorageDefinition { - pub hidden_crate: ext::Opt, + pub hidden_crate: Opt, pub visibility: syn::Visibility, pub trait_token: Token![trait], pub ident: Ident, @@ -62,7 +89,7 @@ struct StorageDefinition { pub crate_ident: Ident, pub where_clause: Option, pub content: ext::Braces>, - pub extra_genesis: ext::Opt, + pub extra_genesis: Opt, } #[derive(Parse, ToTokens, Debug)] @@ -70,6 +97,7 @@ struct SpecificHiddenCrate { pub keyword: keyword::hiddencrate, pub ident: ext::Parens, } +impl_parse_for_opt!(SpecificHiddenCrate => keyword::hiddencrate); #[derive(Parse, ToTokens, Debug)] struct AddExtraGenesis { @@ -77,17 +105,36 @@ struct AddExtraGenesis { pub content: ext::Braces, } +impl_parse_for_opt!(AddExtraGenesis => keyword::add_extra_genesis); + #[derive(Parse, ToTokens, Debug)] struct AddExtraGenesisContent { pub lines: ext::Punctuated, } -#[derive(Parse, ToTokens, Debug)] +#[derive(ToTokens, Debug)] enum AddExtraGenesisLineEnum { AddExtraGenesisLine(AddExtraGenesisLine), AddExtraGenesisBuild(DeclStorageBuild), } +impl syn::parse::Parse for AddExtraGenesisLineEnum { + fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { + let input_fork = input.fork(); + // OuterAttributes are forbidden for build variant, + // However to have better documentation we match against the keyword after those attributes. + let _: ext::OuterAttributes = input_fork.parse()?; + let lookahead = input_fork.lookahead1(); + if lookahead.peek(keyword::build) { + Ok(Self::AddExtraGenesisBuild(input.parse()?)) + } else if lookahead.peek(keyword::config) { + Ok(Self::AddExtraGenesisLine(input.parse()?)) + } else { + Err(lookahead.error()) + } + } +} + #[derive(Parse, ToTokens, Debug)] struct AddExtraGenesisLine { pub attrs: ext::OuterAttributes, @@ -95,7 +142,7 @@ struct AddExtraGenesisLine { pub extra_field: ext::Parens, pub coldot_token: Token![:], pub extra_type: syn::Type, - pub default_value: ext::Opt, + pub default_value: Opt, } #[derive(Parse, ToTokens, Debug)] @@ -106,12 +153,12 @@ struct DeclStorageLine { pub visibility: syn::Visibility, // name pub name: Ident, - pub getter: ext::Opt, - pub config: ext::Opt, - pub build: ext::Opt, + pub getter: Opt, + pub config: Opt, + pub build: Opt, pub coldot_token: Token![:], pub storage_type: DeclStorageType, - pub default_value: ext::Opt, + pub default_value: Opt, } #[derive(Parse, ToTokens, Debug)] @@ -126,19 +173,25 @@ struct DeclStorageGetter { pub getfn: ext::Parens, } +impl_parse_for_opt!(DeclStorageGetter => keyword::get); + #[derive(Parse, ToTokens, Debug)] struct DeclStorageConfig { pub config_keyword: keyword::config, pub expr: ext::Parens>, } +impl_parse_for_opt!(DeclStorageConfig => keyword::config); + #[derive(Parse, ToTokens, Debug)] struct DeclStorageBuild { pub build_keyword: keyword::build, pub expr: ext::Parens, } -#[derive(Parse, ToTokens, Debug)] +impl_parse_for_opt!(DeclStorageBuild => keyword::build); + +#[derive(ToTokens, Debug)] enum DeclStorageType { Map(DeclStorageMap), LinkedMap(DeclStorageLinkedMap), @@ -146,10 +199,24 @@ enum DeclStorageType { Simple(syn::Type), } +impl syn::parse::Parse for DeclStorageType { + fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { + if input.peek(keyword::map) { + Ok(Self::Map(input.parse()?)) + } else if input.peek(keyword::linked_map) { + Ok(Self::LinkedMap(input.parse()?)) + } else if input.peek(keyword::double_map) { + Ok(Self::DoubleMap(input.parse()?)) + } else { + Ok(Self::Simple(input.parse()?)) + } + } +} + #[derive(Parse, ToTokens, Debug)] struct DeclStorageMap { pub map_keyword: keyword::map, - pub hasher: ext::Opt, + pub hasher: Opt, pub key: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, @@ -158,7 +225,7 @@ struct DeclStorageMap { #[derive(Parse, ToTokens, Debug)] struct DeclStorageLinkedMap { pub map_keyword: keyword::linked_map, - pub hasher: ext::Opt, + pub hasher: Opt, pub key: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, @@ -167,16 +234,16 @@ struct DeclStorageLinkedMap { #[derive(Parse, ToTokens, Debug)] struct DeclStorageDoubleMap { pub map_keyword: keyword::double_map, - pub hasher1: ext::Opt, + pub hasher1: Opt, pub key1: syn::Type, pub comma_keyword: Token![,], - pub hasher2: ext::Opt, + pub hasher2: Opt, pub key2: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, } -#[derive(Parse, ToTokens, Debug)] +#[derive(ToTokens, Debug)] enum Hasher { Blake2_256(keyword::blake2_256), Blake2_128(keyword::blake2_128), @@ -186,18 +253,51 @@ enum Hasher { Twox64Concat(keyword::twox_64_concat), } +impl syn::parse::Parse for Hasher { + fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { + let lookahead = input.lookahead1(); + if lookahead.peek(keyword::blake2_256) { + Ok(Self::Blake2_256(input.parse()?)) + } else if lookahead.peek(keyword::blake2_128) { + Ok(Self::Blake2_128(input.parse()?)) + } else if lookahead.peek(keyword::blake2_128_concat) { + Ok(Self::Blake2_128Concat(input.parse()?)) + } else if lookahead.peek(keyword::twox_256) { + Ok(Self::Twox256(input.parse()?)) + } else if lookahead.peek(keyword::twox_128) { + Ok(Self::Twox128(input.parse()?)) + } else if lookahead.peek(keyword::twox_64_concat) { + Ok(Self::Twox64Concat(input.parse()?)) + } else { + Err(lookahead.error()) + } + } +} + #[derive(Parse, ToTokens, Debug)] struct DeclStorageDefault { pub equal_token: Token![=], pub expr: syn::Expr, } +impl syn::parse::Parse for Opt { + fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { + if input.peek(Token![=]) { + input.parse().map(|p| Opt { inner: Some(p) }) + } else { + Ok(Opt { inner: None }) + } + } +} + #[derive(Parse, ToTokens, Debug)] struct SetHasher { pub hasher_keyword: keyword::hasher, pub inner: ext::Parens, } +impl_parse_for_opt!(SetHasher => keyword::hasher); + impl From for super::HasherKind { fn from(set_hasher: SetHasher) -> Self { set_hasher.inner.content.into() diff --git a/frame/support/procedural/tools/derive/src/lib.rs b/frame/support/procedural/tools/derive/src/lib.rs index e130ffbfa0..f020c2a2fa 100644 --- a/frame/support/procedural/tools/derive/src/lib.rs +++ b/frame/support/procedural/tools/derive/src/lib.rs @@ -52,18 +52,13 @@ pub(crate) fn fields_access( }) } -/// self defined parsing struct or enum. -/// not meant for any struct/enum, just for fast +/// self defined parsing struct. +/// not meant for any struct, just for fast /// parse implementation. -/// For enums: -/// variant are tested in order of definition. -/// Empty variant is always true. -/// Please use carefully, this will fully parse successful variant twice. #[proc_macro_derive(Parse)] pub fn derive_parse(input: TokenStream) -> TokenStream { let item = parse_macro_input!(input as syn::Item); match item { - syn::Item::Enum(input) => derive_parse_enum(input), syn::Item::Struct(input) => derive_parse_struct(input), _ => TokenStream::new(), // ignore } @@ -100,71 +95,6 @@ fn derive_parse_struct(input: syn::ItemStruct) -> TokenStream { tokens.into() } -fn derive_parse_enum(input: syn::ItemEnum) -> TokenStream { - let syn::ItemEnum { - ident, - generics, - variants, - .. - } = input; - let variants = variants.iter().map(|v| { - let variant_ident = v.ident.clone(); - let fields_build = if v.fields.iter().count() > 0 { - let fields_id = fields_idents(v.fields.iter().map(Clone::clone)); - quote!( (#(#fields_id), *) ) - } else { - quote!() - }; - - let fields_procs = fields_idents(v.fields.iter().map(Clone::clone)) - .map(|fident| { - quote!{ - let mut #fident = match fork.parse() { - Ok(r) => r, - Err(_e) => break, - }; - } - }); - let fields_procs_again = fields_idents(v.fields.iter().map(Clone::clone)) - .map(|fident| { - quote!{ - #fident = input.parse().expect("was parsed just before"); - } - }); - - // double parse to update input cursor position - // next syn crate version should be checked for a way - // to copy position/state from a fork - quote!{ - let mut fork = input.fork(); - loop { - #(#fields_procs)* - #(#fields_procs_again)* - return Ok(#ident::#variant_ident#fields_build); - } - } - }); - - let tokens = quote! { - impl #generics syn::parse::Parse for #ident #generics { - fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { - #( - #variants - )* - // no early return from any variants - Err( - syn::parse::Error::new( - proc_macro2::Span::call_site(), - "derived enum no matching variants" - ) - ) - } - } - - }; - tokens.into() -} - /// self defined parsing struct or enum. /// not meant for any struct/enum, just for fast /// parse implementation. diff --git a/frame/support/procedural/tools/src/syn_ext.rs b/frame/support/procedural/tools/src/syn_ext.rs index d0a5066b80..7b0a2cb93f 100644 --- a/frame/support/procedural/tools/src/syn_ext.rs +++ b/frame/support/procedural/tools/src/syn_ext.rs @@ -164,39 +164,6 @@ impl ToTokens for OuterAttributes { } } -#[derive(Debug)] -pub struct Opt

{ - pub inner: Option

, -} - -impl Parse for Opt

{ - // Note that it cost a double parsing (same as enum derive) - fn parse(input: ParseStream) -> Result { - let inner = match input.fork().parse::

() { - Ok(_item) => Some(input.parse().expect("Same parsing ran before")), - Err(_e) => None, - }; - - Ok(Opt { inner }) - } -} - -impl ToTokens for Opt

{ - fn to_tokens(&self, tokens: &mut TokenStream) { - if let Some(ref p) = self.inner { - p.to_tokens(tokens); - } - } -} - -impl Clone for Opt

=

::Hash; @@ -167,7 +167,7 @@ pub trait TransactionPool: Send + Sync { /// Error type. type Error: From + crate::error::IntoPoolError; - // Networking + // *** RPC /// Returns a future that imports a bunch of unverified transactions to the pool. fn submit_at( @@ -183,7 +183,6 @@ pub trait TransactionPool: Send + Sync { xt: TransactionFor, ) -> PoolFuture, Self::Error>; - // *** RPC /// Returns a future that import a single transaction and starts to watch their progress in the pool. fn submit_and_watch( &self, @@ -205,7 +204,7 @@ pub trait TransactionPool: Send + Sync { // *** logging / RPC / networking /// Return an event stream of transactions imported to the pool. - fn import_notification_stream(&self) -> ImportNotificationStream; + fn import_notification_stream(&self) -> ImportNotificationStream>; // *** networking /// Notify the pool about transactions broadcast. @@ -213,6 +212,9 @@ pub trait TransactionPool: Send + Sync { /// Returns transaction hash fn hash_of(&self, xt: &TransactionFor) -> TxHash; + + /// Return specific ready transaction by hash, if there is one. + fn ready_transaction(&self, hash: &TxHash) -> Option>; } /// Trait for transaction pool maintenance. -- GitLab From 6408967f70ff10b06b0e54017859052bd71d4258 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 27 Jan 2020 18:27:36 +0100 Subject: [PATCH 192/296] Upgrade to libp2p 0.15 (#4732) * Fixes for libp2p 0.15 * More work * Update libp2p * Update to libp2p 0.15 --- Cargo.lock | 498 ++++++++++-------- client/authority-discovery/Cargo.toml | 2 +- client/network-gossip/Cargo.toml | 2 +- client/network/Cargo.toml | 2 +- client/network/src/config.rs | 5 + client/network/src/discovery.rs | 2 +- .../src/protocol/legacy_proto/handler.rs | 18 +- .../src/protocol/legacy_proto/upgrade.rs | 8 +- client/network/src/service.rs | 10 +- client/network/test/Cargo.toml | 2 +- client/network/test/src/lib.rs | 4 +- client/peerset/Cargo.toml | 2 +- client/service/src/builder.rs | 8 + client/telemetry/Cargo.toml | 2 +- primitives/consensus/common/Cargo.toml | 2 +- utils/browser/Cargo.toml | 2 +- 16 files changed, 332 insertions(+), 237 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b2bf3f6265..4124e32263 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -370,10 +370,10 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-chain-spec 2.0.0", "sc-network 0.8.0", "sc-service 0.8.0", @@ -447,7 +447,7 @@ dependencies = [ [[package]] name = "bytes" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -510,7 +510,7 @@ version = "2.0.0" dependencies = [ "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "node-cli 2.0.0", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-keystore 2.0.0", "sp-core 2.0.0", "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -608,7 +608,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -650,7 +650,7 @@ dependencies = [ "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -684,7 +684,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1025,8 +1025,8 @@ 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 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1241,7 +1241,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1251,6 +1251,11 @@ name = "fixedbitset" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "fixedbitset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "flate2" version = "1.0.13" @@ -1602,7 +1607,7 @@ name = "futures_codec" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1729,7 +1734,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "grafana-data-source 0.8.0", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1754,7 +1759,7 @@ name = "h2" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1875,7 +1880,7 @@ name = "http" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (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)", ] @@ -1896,7 +1901,7 @@ name = "http-body" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1965,7 +1970,7 @@ name = "hyper" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2268,7 +2273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2296,7 +2301,7 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2349,48 +2354,48 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-deflate 0.6.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.12.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-wasm-ext 0.7.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-gossipsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2400,15 +2405,16 @@ dependencies = [ "multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.8.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.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 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)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2417,7 +2423,7 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2426,79 +2432,101 @@ dependencies = [ [[package]] name = "libp2p-deflate" -version = "0.6.0-alpha.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (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.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "libp2p-identify" -version = "0.14.0-alpha.1" +name = "libp2p-gossipsub" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bs58 0.3.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.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-identify" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-kad" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2507,7 +2535,7 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2516,45 +2544,44 @@ dependencies = [ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-noise" -version = "0.12.0-alpha.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2563,31 +2590,30 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2595,7 +2621,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.14.0-alpha.1" +version = "0.15.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)", @@ -2604,18 +2630,19 @@ dependencies = [ "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 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)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2623,50 +2650,50 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.4.0-alpha.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-uds" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-wasm-ext" -version = "0.7.0-alpha.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.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)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2674,14 +2701,14 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "async-tls 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2694,13 +2721,13 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.14.0-alpha.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2725,8 +2752,8 @@ dependencies = [ "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "hmac-drbg 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2950,15 +2977,20 @@ name = "multimap" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "multimap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "multistream-select" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.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)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3035,7 +3067,7 @@ dependencies = [ "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-authority-discovery 0.8.0", "sc-basic-authorship 0.8.0", "sc-chain-spec 2.0.0", @@ -4132,7 +4164,7 @@ dependencies = [ "bytes 0.4.12 (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)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 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.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4143,10 +4175,10 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (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)", + "sha2 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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4198,7 +4230,7 @@ dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4288,7 +4320,7 @@ dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4349,6 +4381,15 @@ dependencies = [ "fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "petgraph" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pin-project" version = "0.4.6" @@ -4493,7 +4534,7 @@ name = "prost" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4514,6 +4555,23 @@ dependencies = [ "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "prost-build" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "multimap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "which 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "prost-derive" version = "0.5.0" @@ -4548,9 +4606,13 @@ dependencies = [ ] [[package]] -name = "protobuf" -version = "2.8.1" +name = "prost-types" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "pwasm-utils" @@ -4574,7 +4636,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4645,7 +4707,7 @@ dependencies = [ [[package]] name = "rand" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5018,13 +5080,13 @@ dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-keystore 2.0.0", "sc-network 0.8.0", @@ -5291,7 +5353,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pdqselect 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -5504,7 +5566,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-keystore 2.0.0", @@ -5537,7 +5599,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", @@ -5550,7 +5612,7 @@ name = "sc-network" version = "0.8.0" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5560,7 +5622,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.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)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5568,7 +5630,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", "sc-client 0.8.0", @@ -5602,7 +5664,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5618,10 +5680,10 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -5653,7 +5715,7 @@ dependencies = [ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-client-db 0.8.0", "sc-keystore 2.0.0", @@ -5674,9 +5736,9 @@ name = "sc-peerset" version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5850,14 +5912,14 @@ dependencies = [ name = "sc-telemetry" version = "2.0.0" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5940,7 +6002,7 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6079,7 +6141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sha2" -version = "0.8.0" +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)", @@ -6169,7 +6231,7 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -6190,15 +6252,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6293,7 +6355,7 @@ dependencies = [ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", "sp-std 2.0.0", @@ -6353,7 +6415,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6428,13 +6490,13 @@ dependencies = [ "parking_lot 0.9.0 (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.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", "sp-externalities 0.8.0", "sp-runtime-interface 2.0.0", @@ -6545,7 +6607,7 @@ dependencies = [ name = "sp-phragmen" version = "2.0.0" dependencies = [ - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -6570,7 +6632,7 @@ dependencies = [ "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", @@ -6684,7 +6746,7 @@ dependencies = [ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-externalities 0.8.0", "sp-panic-handler 2.0.0", @@ -6882,7 +6944,7 @@ dependencies = [ "pallet-balances 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-rpc 2.0.0", @@ -6900,7 +6962,7 @@ dependencies = [ "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7138,7 +7200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7227,7 +7289,7 @@ dependencies = [ "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7283,7 +7345,7 @@ name = "tokio" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7504,7 +7566,7 @@ name = "tokio-util" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7584,7 +7646,7 @@ dependencies = [ "log 0.4.10 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7637,7 +7699,7 @@ name = "twox-hash" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7690,7 +7752,7 @@ name = "unicode-normalization" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7723,7 +7785,7 @@ name = "unsigned-varint" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8008,7 +8070,7 @@ dependencies = [ "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8151,6 +8213,14 @@ dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "which" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi" version = "0.2.8" @@ -8208,7 +8278,7 @@ dependencies = [ "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (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 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8243,12 +8313,12 @@ name = "yamux" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8355,7 +8425,7 @@ dependencies = [ "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "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 bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10004c15deb332055f7a4a208190aed362cf9a7c2f6ab70a305fba50e1105f38" +"checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cargo_metadata 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "46e3374c604fb39d1a2f35ed5e4a4e30e60d01fab49446e08f1b3e9a90aef202" @@ -8440,6 +8510,7 @@ dependencies = [ "checksum finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "52c48f8a628193ba18639b2f727c32132d75f167a4b32f44b252ea8b937f154c" "checksum fixed-hash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72fe7539e2c5692c6989f2f9c0457e42f1e5768f96b85c87d273574670ae459f" "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" +"checksum fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" "checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" "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" @@ -8539,26 +8610,27 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" "checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -"checksum libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c85f850649e7533db125207d86bc2180faf7a962ea07686011031b71cbb3540" -"checksum libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "187ac3f588a74d48f163a8899fddafef4dc9796cad7b73ae754d9e928cebbbe7" -"checksum libp2p-core-derive 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b674da01855701636371b3d5f0e6b38bf5a74d283de705c1f66fab9980da8943" -"checksum libp2p-deflate 0.6.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f83cefe9f01a4a7012c1285e20fca4f193c46526a350679465150035afc5a97" -"checksum libp2p-dns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67d5a6d0905479ee4c6bcfaeab597d506f3447e5eb09b84aff1ed5e6d834b221" -"checksum libp2p-floodsub 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "462f310a152433a94d4e9766aa8366e4770084f67b9a17289a9667a7b0780714" -"checksum libp2p-identify 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8269e7b673cf0fbce1cbfedf61708e860aeb4b2ad3ca2df54586f1e810b9fbc9" -"checksum libp2p-kad 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90fdc0027f76b50b0822f489f5b8a83664b71c6087e67e8e9e53e6c255b069b3" -"checksum libp2p-mdns 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be0b7cdeb0ad2c009099eaed258ef18b308c1e3f56d8f57668a868305f1c4caa" -"checksum libp2p-mplex 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "54c2ca42c7511fddc566af2259b81749d36011fefab1e99d9bf77bdc6210a5bd" -"checksum libp2p-noise 0.12.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8ff485bebd3181fc7f0c8ca7d11dde6231c132bbfb5d26c0e3a568e1a58b450" -"checksum libp2p-ping 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9061919a24a74760610c860e67cdb44ae4fd3cffe34c3b3a916f21ec68d9d50a" -"checksum libp2p-plaintext 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e9bf4b832590e0bf7efc09ff91c2d4cda0737f29b44356ef0cc3aecc08ed54a" -"checksum libp2p-secio 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2aa7599c5413cbc3de7138d64b932a26e86f8897ef3722f18840ed12ad54ea43" -"checksum libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea29f98b08c7a5113a787bce1a44d33fca6cf9f680f99812b50555e50baf408" -"checksum libp2p-tcp 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a4e0d1f322101d81c26782e76c523043f96fe53fa41962fd2c2193a709985186" -"checksum libp2p-uds 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d5620aca9d9f85158b934be33a25a6310f1ca6a038392498eb7f35d35063aee9" -"checksum libp2p-wasm-ext 0.7.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2dfe80dd0d2cb6412b57fffeb3db2dc36f7ea23566ed94011e0e07ff948f9624" -"checksum libp2p-websocket 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ac2a4974254a91f5291ef8493e6377380473334ba166ea0487e898364931dd61" -"checksum libp2p-yamux 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ef3277eaffc7c3a0ad0c115dcbe3cbeb0e3a953a18b959d05081835fc2cf2ff9" +"checksum libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f84847789ab24b3fc5971a68656ac85886df640986d9ce3264c0327694eae471" +"checksum libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dbafb2706b8082233f66dc13e196f9cf9b4c229f2cd7c96b2b16617ad6ee330b" +"checksum libp2p-core-derive 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c320266be0a7760e23484d635acdb83844b2d74d3612d93b41c393c9bcf004e" +"checksum libp2p-deflate 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be32697b42d040b325c3737f827ea04ede569ec956b7807700dd8d89d8210f9" +"checksum libp2p-dns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f11c979b882f25d85726b15637d5bbc722dfa1be576605c54e99b8cf56906be3" +"checksum libp2p-floodsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4bdf6fba9272ad47dde94bade89540fdb16e24ae9ff7fb714c1c80a035165f28" +"checksum libp2p-gossipsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e6ecd058bf769d27ebec530544b081e08b0a1088e3186da8cc58d59915784d0" +"checksum libp2p-identify 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d1a6261b804111c2dbf53f8ca03f66edc5ad1c29b78a61cf0cc5354052e28e9" +"checksum libp2p-kad 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c6ea6fece0d99599afb1b2082ca8937944cdd6b0946a88d54cb3ae7a38d1253" +"checksum libp2p-mdns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "074312353355df310affa105ec71b16fd7e52f5c6ae61d3dcbb3e79e8fdc9e5f" +"checksum libp2p-mplex 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "89d0b44dfdef80cc2be4b42d127de1c793905eca2459415a5c57d6b4fbd8ec30" +"checksum libp2p-noise 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0845e8208d814cd41c26c90a6a2f2b720c31b588209cecc49a44c881a09f417f" +"checksum libp2p-ping 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ecced2949ae93b6ff29565303ecd1bef15c4e4efb689033ee744922561a36b" +"checksum libp2p-plaintext 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "195fda6b6a948a242fd30570e0e3418ae8e0a20055ea75d45458e1079a8efb05" +"checksum libp2p-secio 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ceef68ca377b264f84d64c88739a8fa118b5db1e8f18297351dff75314504a5f" +"checksum libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "14ea00be81bc3985e36abad263ce2ad1b6aeb862aa743563eb70ad42880c05ae" +"checksum libp2p-tcp 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e65ef381570df31cb047dfbc11483ab0fe7e6abbdcf2bdc2c60b5d11133d241" +"checksum libp2p-uds 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e4f4f7989b35f33d4b9738aab2f031310eb20fec513cab44d12b1bc985a8074" +"checksum libp2p-wasm-ext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b4d457adb91a5e2212343218a554394cd8ced64a79fb8e36e7aed2a16d49495" +"checksum libp2p-websocket 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bba425f2af1fdb7dece88b9ae05ca9430dfb0b72b2c078e73ded6f1556084509" +"checksum libp2p-yamux 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ca25b3aac78a3c93c2a567622abd3cfc16f96f26ae1bf6134f0056203d62d86" "checksum librocksdb-sys 6.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0785e816e1e11e7599388a492c61ef80ddc2afc91e313e61662cce537809be" "checksum libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "df6edf84fd62aad1c93932b39324eaeda3912c1d26bc18dfaee6293848e49a50" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" @@ -8587,6 +8659,7 @@ dependencies = [ "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" "checksum multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb04b9f127583ed176e163fb9ec6f3e793b87e21deedd5734a69386a18a0151" +"checksum multimap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a97fbd5d00e0e37bfb10f433af8f5aaf631e739368dc9fc28286ca81ca4948dc" "checksum multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f938ffe420493e77c8b6cbcc3f282283f68fc889c5dcbc8e51668d5f3a01ad94" "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" @@ -8637,6 +8710,7 @@ dependencies = [ "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" "checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" +"checksum petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29c127eea4a29ec6c85d153c59dc1213f33ec74cead30fe4730aecc88cc1fd92" "checksum pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "94b90146c7216e4cb534069fb91366de4ea0ea353105ee45ed297e2d1619e469" "checksum pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "44ca92f893f0656d3cba8158dd0f2b99b94de256a4a54e870bd6922fcc6c8355" "checksum pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f0af6cbca0e6e3ce8692ee19fb8d734b641899e07b68eb73e9bbbd32f1703991" @@ -8656,10 +8730,11 @@ dependencies = [ "checksum prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96d14b1c185652833d24aaad41c5832b0be5616a590227c1fbff57c616754b23" "checksum prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" "checksum prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb788126ea840817128183f8f603dce02cb7aea25c2a0b764359d8e20010702e" +"checksum prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" "checksum prost-derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e7dc378b94ac374644181a2247cebf59a6ec1c88b49ac77f3a94b86b79d0e11" "checksum prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" "checksum prost-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1de482a366941c8d56d19b650fac09ca08508f2a696119ee7513ad590c8bac6f" -"checksum protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40361836defdd5871ff7e84096c6f6444af7fc157f8ef1789f54f147687caa20" +"checksum prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" "checksum pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5ca504a2fdaa08d3517f442fbbba91ac24d1ec4c51ea68688a038765e3b2662" @@ -8669,7 +8744,7 @@ dependencies = [ "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" +"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" @@ -8730,7 +8805,7 @@ dependencies = [ "checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" "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.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" +"checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" "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 shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" @@ -8740,7 +8815,7 @@ dependencies = [ "checksum slog-scope 4.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c44c89dd8b0ae4537d1ae318353eaf7840b4869c536e31c41e963d1ea523ee6" "checksum slog_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -"checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86" +"checksum smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44e59e0c9fa00817912ae6e4e6e3c4fe04455e75699d06eedc7d85917ed8e8f4" "checksum snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" "checksum soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3caa0ad6b765419f21e4cfa490ec7514a9fae4af986adef168a69477ba528671" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" @@ -8867,6 +8942,7 @@ dependencies = [ "checksum websocket-base 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e3810f0d00c4dccb54c30a4eee815e703232819dec7b007db115791c42aa374" "checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" +"checksum which 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5475d47078209a02e60614f7ba5e645ef3ed60f771920ac1906d7c1cc65024c8" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 25c3f161d4..6e4570a540 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -14,7 +14,7 @@ codec = { package = "parity-scale-codec", default-features = false, version = "1 derive_more = "0.99.2" futures = "0.3.1" futures-timer = "2.0" -libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.15.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" prost = "0.6.1" rand = "0.7.2" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 91c80e2213..82611bffc8 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -12,7 +12,7 @@ futures01 = { package = "futures", version = "0.1.29" } futures = { version = "0.3.1", features = ["compat"] } futures-timer = "0.4.0" lru = "0.1.2" -libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } sc-network = { version = "0.8", path = "../network" } parking_lot = "0.9.0" sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index f1d89f71b0..7930087595 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -22,7 +22,7 @@ linked_hash_set = "0.1.3" lru = "0.4.0" rustc-hex = "2.0.1" rand = "0.7.2" -libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } sc-client = { version = "0.8", path = "../" } diff --git a/client/network/src/config.rs b/client/network/src/config.rs index 6a2062ddbf..6cf2587fe4 100644 --- a/client/network/src/config.rs +++ b/client/network/src/config.rs @@ -32,6 +32,7 @@ use libp2p::identity::{Keypair, ed25519}; use libp2p::wasm_ext; use libp2p::{PeerId, Multiaddr, multiaddr}; use core::{fmt, iter}; +use std::{future::Future, pin::Pin}; use std::{error::Error, fs, io::{self, Write}, net::Ipv4Addr, path::{Path, PathBuf}, sync::Arc}; use zeroize::Zeroize; @@ -40,6 +41,10 @@ pub struct Params { /// Assigned roles for our node (full, light, ...). pub roles: Roles, + /// How to spawn background tasks. If you pass `None`, then a threads pool will be used by + /// default. + pub executor: Option + Send>>) + Send>>, + /// Network layer configuration. pub network_config: NetworkConfiguration, diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 11f687616e..531e769cce 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -122,7 +122,7 @@ impl DiscoveryBehaviour { allow_private_ipv4, #[cfg(not(target_os = "unknown"))] mdns: if enable_mdns { - match Mdns::new().await { + match Mdns::new() { Ok(mdns) => Some(mdns).into(), Err(err) => { warn!(target: "sub-libp2p", "Failed to initialize mDNS: {:?}", err); diff --git a/client/network/src/protocol/legacy_proto/handler.rs b/client/network/src/protocol/legacy_proto/handler.rs index f042d1b889..fc3b64b968 100644 --- a/client/network/src/protocol/legacy_proto/handler.rs +++ b/client/network/src/protocol/legacy_proto/handler.rs @@ -18,7 +18,7 @@ use super::upgrade::{RegisteredProtocol, RegisteredProtocolEvent, RegisteredProt use bytes::BytesMut; use futures::prelude::*; use futures_timer::Delay; -use libp2p::core::{ConnectedPoint, PeerId, Endpoint}; +use libp2p::core::{ConnectedPoint, Negotiated, PeerId, Endpoint}; use libp2p::core::upgrade::{InboundUpgrade, OutboundUpgrade}; use libp2p::swarm::{ ProtocolsHandler, ProtocolsHandlerEvent, @@ -159,7 +159,7 @@ enum ProtocolState { /// Waiting for the behaviour to tell the handler whether it is enabled or disabled. Init { /// List of substreams opened by the remote but that haven't been processed yet. - substreams: SmallVec<[RegisteredProtocolSubstream; 6]>, + substreams: SmallVec<[RegisteredProtocolSubstream>; 6]>, /// Deadline after which the initialization is abnormally long. init_deadline: Delay, }, @@ -175,9 +175,9 @@ enum ProtocolState { /// If we are in this state, we have sent a `CustomProtocolOpen` message to the outside. Normal { /// The substreams where bidirectional communications happen. - substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, + substreams: SmallVec<[RegisteredProtocolSubstream>; 4]>, /// Contains substreams which are being shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, + shutdown: SmallVec<[RegisteredProtocolSubstream>; 4]>, }, /// We are disabled. Contains substreams that are being closed. @@ -185,7 +185,7 @@ enum ProtocolState { /// outside or we have never sent any `CustomProtocolOpen` in the first place. Disabled { /// List of substreams to shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 6]>, + shutdown: SmallVec<[RegisteredProtocolSubstream>; 6]>, /// If true, we should reactivate the handler after all the substreams in `shutdown` have /// been closed. @@ -466,7 +466,7 @@ where /// Called by `inject_fully_negotiated_inbound` and `inject_fully_negotiated_outbound`. fn inject_fully_negotiated( &mut self, - mut substream: RegisteredProtocolSubstream + mut substream: RegisteredProtocolSubstream> ) { self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { @@ -538,14 +538,14 @@ where TSubstream: AsyncRead + AsyncWrite + Unpin { fn inject_fully_negotiated_inbound( &mut self, - proto: >::Output + proto: >>::Output ) { self.inject_fully_negotiated(proto); } fn inject_fully_negotiated_outbound( &mut self, - proto: >::Output, + proto: >>::Output, _: Self::OutboundOpenInfo ) { self.inject_fully_negotiated(proto); @@ -621,7 +621,7 @@ where /// Given a list of substreams, tries to shut them down. The substreams that have been successfully /// shut down are removed from the list. fn shutdown_list - (list: &mut SmallVec>>, + (list: &mut SmallVec>>>, cx: &mut Context) where TSubstream: AsyncRead + AsyncWrite + Unpin { 'outer: for n in (0..list.len()).rev() { diff --git a/client/network/src/protocol/legacy_proto/upgrade.rs b/client/network/src/protocol/legacy_proto/upgrade.rs index c021d5917f..311e0b04f9 100644 --- a/client/network/src/protocol/legacy_proto/upgrade.rs +++ b/client/network/src/protocol/legacy_proto/upgrade.rs @@ -18,7 +18,7 @@ use crate::config::ProtocolId; use bytes::BytesMut; use futures::prelude::*; use futures_codec::Framed; -use libp2p::core::{Negotiated, Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; +use libp2p::core::{Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; use std::{collections::VecDeque, io, pin::Pin, vec::IntoIter as VecIntoIter}; use std::task::{Context, Poll}; use unsigned_varint::codec::UviBytes; @@ -82,7 +82,7 @@ pub struct RegisteredProtocolSubstream { /// If true, we should call `poll_complete` on the inner sink. requires_poll_flush: bool, /// The underlying substream. - inner: stream::Fuse, UviBytes>>, + inner: stream::Fuse>>, /// 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 @@ -250,7 +250,7 @@ where TSubstream: AsyncRead + AsyncWrite + Unpin, fn upgrade_inbound( self, - socket: Negotiated, + socket: TSubstream, info: Self::Info, ) -> Self::Future { let framed = { @@ -280,7 +280,7 @@ where TSubstream: AsyncRead + AsyncWrite + Unpin, fn upgrade_outbound( self, - socket: Negotiated, + socket: TSubstream, info: Self::Info, ) -> Self::Future { let framed = Framed::new(socket, UviBytes::default()); diff --git a/client/network/src/service.rs b/client/network/src/service.rs index c6b6168126..e3eaf6c31d 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -36,7 +36,7 @@ use futures::{prelude::*, channel::mpsc}; use log::{warn, error, info, trace}; use libp2p::{PeerId, Multiaddr, kad::record}; use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; -use libp2p::swarm::{NetworkBehaviour, SwarmEvent}; +use libp2p::swarm::{NetworkBehaviour, SwarmBuilder, SwarmEvent}; use parking_lot::Mutex; use sc_peerset::PeersetHandle; use sp_runtime::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; @@ -213,7 +213,7 @@ impl, H: ExHashT> NetworkWorker )?; // Build the swarm. - let (mut swarm, bandwidth) = { + let (mut swarm, bandwidth): (Swarm::, _) = { let user_agent = format!( "{} ({})", params.network_config.client_version, @@ -241,7 +241,11 @@ impl, H: ExHashT> NetworkWorker }; transport::build_transport(local_identity, config_mem, config_wasm) }; - (Swarm::::new(transport, behaviour, local_peer_id.clone()), bandwidth) + let mut builder = SwarmBuilder::new(transport, behaviour, local_peer_id.clone()); + if let Some(spawner) = params.executor { + builder = builder.executor_fn(spawner); + } + (builder.build(), bandwidth) }; // Listen on multiaddresses. diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 036607df92..19590c2651 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -14,7 +14,7 @@ futures = "0.1.29" futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } futures-timer = "0.4.0" rand = "0.7.2" -libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } sc-client = { version = "0.8", path = "../../" } sc-client-api = { version = "2.0.0", path = "../../api" } diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 874c4d19f9..1e14ec7bb0 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -52,7 +52,7 @@ use sc_network::config::{NetworkConfiguration, TransportConfig, BoxFinalityProof use libp2p::PeerId; use parking_lot::Mutex; use sp_core::H256; -use sc_network::{Context, ProtocolConfig}; +use sc_network::ProtocolConfig; use sp_runtime::generic::{BlockId, OpaqueDigestItemId}; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use sp_runtime::Justification; @@ -613,6 +613,7 @@ pub trait TestNetFactory: Sized { let network = NetworkWorker::new(sc_network::config::Params { roles: config.roles, + executor: None, network_config: NetworkConfiguration { listen_addresses: vec![listen_addr.clone()], transport: TransportConfig::MemoryOnly, @@ -688,6 +689,7 @@ pub trait TestNetFactory: Sized { let network = NetworkWorker::new(sc_network::config::Params { roles: config.roles, + executor: None, network_config: NetworkConfiguration { listen_addresses: vec![listen_addr.clone()], transport: TransportConfig::MemoryOnly, diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index 90f44418c7..85c988d048 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" [dependencies] futures = "0.3.1" -libp2p = { version = "0.14.0-alpha.1", default-features = false } +libp2p = { version = "0.15.0", default-features = false } log = "0.4.8" serde_json = "1.0.41" diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 202597e787..9b27a5b270 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -837,6 +837,14 @@ ServiceBuilder< let network_params = sc_network::config::Params { roles: config.roles, + executor: { + let to_spawn_tx = to_spawn_tx.clone(); + Some(Box::new(move |fut| { + if let Err(e) = to_spawn_tx.unbounded_send(fut) { + error!("Failed to spawn libp2p background task: {:?}", e); + } + })) + }, network_config: config.network.clone(), chain: client.clone(), finality_proof_provider, diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index c536b7599b..dbcc486d17 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -10,7 +10,7 @@ bytes = "0.5" parking_lot = "0.9.0" futures = "0.3.1" futures-timer = "2.0.0" -libp2p = { version = "0.14.0-alpha.1", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } log = "0.4.8" pin-project = "0.4.6" rand = "0.7.2" diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 8735416028..9321660871 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] derive_more = "0.99.2" -libp2p = { version = "0.14.0-alpha.1", default-features = false } +libp2p = { version = "0.15.0", default-features = false } log = "0.4.8" sp-core = { path= "../../core" } sp-inherents = { version = "2.0.0", path = "../../inherents" } diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index cfceaa143c..15ad771b45 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" futures = "0.3" futures01 = { package = "futures", version = "0.1.29" } log = "0.4.8" -libp2p = { version = "0.14.0-alpha.1", default-features = false } +libp2p = { version = "0.15.0", default-features = false } console_error_panic_hook = "0.1.6" console_log = "0.1.2" js-sys = "0.3.34" -- GitLab From 17aae385e16ae4ac9591db910d7b3258e44ec592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 28 Jan 2020 09:36:57 +0100 Subject: [PATCH 193/296] WASM runtime switch to import memory (#4737) * WASM runtime switch to import memory Up to now runtimes have exported their memory. To unify it with sandboxing, this pr switches runtimes to import memory as well. From a functional perspective, exporting/importing memory makes no difference to the runtime. To provide backwards compatibility, WASM exported memory is still supported. * Revert debug stuff * Revert some stuff --- Cargo.lock | 12 +- bin/node-template/runtime/build.rs | 15 +- bin/node/runtime/build.rs | 18 +- client/executor/runtime-test/build.rs | 18 +- client/executor/runtime-test/src/lib.rs | 40 +++ client/executor/src/integration_tests/mod.rs | 157 +++++----- .../executor/src/integration_tests/sandbox.rs | 56 ---- client/executor/wasmi/src/lib.rs | 118 ++++++-- client/executor/wasmtime/src/runtime.rs | 178 ++++++----- .../runtime-interface/test-wasm/build.rs | 18 +- test-utils/client/src/lib.rs | 1 - test-utils/runtime/build.rs | 21 +- test-utils/runtime/src/lib.rs | 100 ------- utils/wasm-builder-runner/Cargo.toml | 2 +- utils/wasm-builder-runner/src/lib.rs | 279 +++++++++++++++--- 15 files changed, 604 insertions(+), 429 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4124e32263..ecf929384a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3234,7 +3234,7 @@ dependencies = [ "sp-std 2.0.0", "sp-transaction-pool 2.0.0", "sp-version 2.0.0", - "substrate-wasm-builder-runner 1.0.4", + "substrate-wasm-builder-runner 1.0.5", ] [[package]] @@ -3295,7 +3295,7 @@ dependencies = [ "sp-std 2.0.0", "sp-transaction-pool 2.0.0", "sp-version 2.0.0", - "substrate-wasm-builder-runner 1.0.4", + "substrate-wasm-builder-runner 1.0.5", ] [[package]] @@ -5823,7 +5823,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-sandbox 0.8.0", "sp-std 2.0.0", - "substrate-wasm-builder-runner 1.0.4", + "substrate-wasm-builder-runner 1.0.5", ] [[package]] @@ -6693,7 +6693,7 @@ dependencies = [ "sp-io 2.0.0", "sp-runtime-interface 2.0.0", "sp-std 2.0.0", - "substrate-wasm-builder-runner 1.0.4", + "substrate-wasm-builder-runner 1.0.5", ] [[package]] @@ -7063,7 +7063,7 @@ dependencies = [ "sp-trie 2.0.0", "sp-version 2.0.0", "substrate-test-runtime-client 2.0.0", - "substrate-wasm-builder-runner 1.0.4", + "substrate-wasm-builder-runner 1.0.5", "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7104,7 +7104,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" -version = "1.0.4" +version = "1.0.5" [[package]] name = "subtle" diff --git a/bin/node-template/runtime/build.rs b/bin/node-template/runtime/build.rs index 8bdf7584bb..39f7f56feb 100644 --- a/bin/node-template/runtime/build.rs +++ b/bin/node-template/runtime/build.rs @@ -1,11 +1,10 @@ -use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; +use wasm_builder_runner::WasmBuilder; fn main() { - build_current_project_with_rustflags( - "wasm_binary.rs", - WasmBuilderSource::Crates("1.0.9"), - // This instructs LLD to export __heap_base as a global variable, which is used by the - // external memory allocator. - "-Clink-arg=--export=__heap_base", - ); + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_from_crates("1.0.9") + .export_heap_base() + .import_memory() + .build() } diff --git a/bin/node/runtime/build.rs b/bin/node/runtime/build.rs index 9c81ea6f38..647b476814 100644 --- a/bin/node/runtime/build.rs +++ b/bin/node/runtime/build.rs @@ -14,17 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; +use wasm_builder_runner::WasmBuilder; fn main() { - build_current_project_with_rustflags( - "wasm_binary.rs", - WasmBuilderSource::CratesOrPath { - path: "../../../utils/wasm-builder", - version: "1.0.9", - }, - // This instructs LLD to export __heap_base as a global variable, which is used by the - // external memory allocator. - "-Clink-arg=--export=__heap_base", - ); + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_from_crates_or_path("1.0.9", "../../../utils/wasm-builder") + .export_heap_base() + .import_memory() + .build() } diff --git a/client/executor/runtime-test/build.rs b/client/executor/runtime-test/build.rs index 9c81ea6f38..647b476814 100644 --- a/client/executor/runtime-test/build.rs +++ b/client/executor/runtime-test/build.rs @@ -14,17 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; +use wasm_builder_runner::WasmBuilder; fn main() { - build_current_project_with_rustflags( - "wasm_binary.rs", - WasmBuilderSource::CratesOrPath { - path: "../../../utils/wasm-builder", - version: "1.0.9", - }, - // This instructs LLD to export __heap_base as a global variable, which is used by the - // external memory allocator. - "-Clink-arg=--export=__heap_base", - ); + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_from_crates_or_path("1.0.9", "../../../utils/wasm-builder") + .export_heap_base() + .import_memory() + .build() } diff --git a/client/executor/runtime-test/src/lib.rs b/client/executor/runtime-test/src/lib.rs index c0807197b4..f6d37abf94 100644 --- a/client/executor/runtime-test/src/lib.rs +++ b/client/executor/runtime-test/src/lib.rs @@ -26,6 +26,11 @@ extern "C" { fn yet_another_missing_external(); } +#[cfg(not(feature = "std"))] +/// Mutable static variables should be always observed to have +/// the initialized value at the start of a runtime call. +static mut MUTABLE_STATIC: u64 = 32; + sp_core::wasm_export_functions! { fn test_calling_missing_external() { unsafe { missing_external() } @@ -217,6 +222,41 @@ sp_core::wasm_export_functions! { fn test_sp_allocator_compiles() { sp_allocator::FreeingBumpHeapAllocator::new(0); } + + fn returns_mutable_static() -> u64 { + unsafe { + MUTABLE_STATIC += 1; + MUTABLE_STATIC + } + } + + fn allocates_huge_stack_array(trap: bool) -> Vec { + // Allocate a stack frame that is approx. 75% of the stack (assuming it is 1MB). + // This will just decrease (stacks in wasm32-u-u grow downwards) the stack + // pointer. This won't trap on the current compilers. + let mut data = [0u8; 1024 * 768]; + + // Then make sure we actually write something to it. + // + // If: + // 1. the stack area is placed at the beginning of the linear memory space, and + // 2. the stack pointer points to out-of-bounds area, and + // 3. a write is performed around the current stack pointer. + // + // then a trap should happen. + // + for (i, v) in data.iter_mut().enumerate() { + *v = i as u8; // deliberate truncation + } + + if trap { + // There is a small chance of this to be pulled up in theory. In practice + // the probability of that is rather low. + panic!() + } + + data.to_vec() + } } #[cfg(not(feature = "std"))] diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 5b2fc5ca0c..ef8171e5ad 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -27,6 +27,7 @@ use sc_runtime_test::WASM_BINARY; use sp_state_machine::TestExternalities as CoreTestExternalities; use test_case::test_case; use sp_trie::{TrieConfiguration, trie_types::Layout}; +use sp_wasm_interface::HostFunctions as _; use crate::WasmExecutionMethod; @@ -38,16 +39,14 @@ fn call_in_wasm( call_data: &[u8], execution_method: WasmExecutionMethod, ext: &mut E, - code: &[u8], - heap_pages: u64, ) -> crate::error::Result> { crate::call_in_wasm::( function, call_data, execution_method, ext, - code, - heap_pages, + &WASM_BINARY[..], + 1024, true, ) } @@ -57,15 +56,12 @@ fn call_in_wasm( fn returning_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let output = call_in_wasm( "test_empty_return", &[], wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(); assert_eq!(output, vec![0u8; 0]); } @@ -73,17 +69,14 @@ fn returning_should_work(wasm_method: WasmExecutionMethod) { #[test_case(WasmExecutionMethod::Interpreted)] #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] fn call_not_existing_function(wasm_method: WasmExecutionMethod) { - let mut ext = TestExternalities::default(); - let mut ext = ext.ext(); - let test_code = WASM_BINARY; + let mut ext = TestExternalities::default(); + let mut ext = ext.ext(); match call_in_wasm( "test_calling_missing_external", &[], wasm_method, &mut ext, - &test_code[..], - 8, ) { Ok(_) => panic!("was expected an `Err`"), Err(e) => { @@ -107,15 +100,12 @@ fn call_not_existing_function(wasm_method: WasmExecutionMethod) { fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; match call_in_wasm( "test_calling_yet_another_missing_external", &[], wasm_method, &mut ext, - &test_code[..], - 8, ) { Ok(_) => panic!("was expected an `Err`"), Err(e) => { @@ -139,15 +129,12 @@ fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { fn panicking_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let output = call_in_wasm( "test_panic", &[], wasm_method, &mut ext, - &test_code[..], - 8, ); assert!(output.is_err()); @@ -156,8 +143,6 @@ fn panicking_should_work(wasm_method: WasmExecutionMethod) { &[0], wasm_method, &mut ext, - &test_code[..], - 8, ); assert_eq!(Decode::decode(&mut &output.unwrap()[..]), Ok(Vec::::new())); @@ -166,8 +151,6 @@ fn panicking_should_work(wasm_method: WasmExecutionMethod) { &vec![2].encode(), wasm_method, &mut ext, - &test_code[..], - 8, ); assert!(output.is_err()); } @@ -180,15 +163,12 @@ fn storage_should_work(wasm_method: WasmExecutionMethod) { { let mut ext = ext.ext(); ext.set_storage(b"foo".to_vec(), b"bar".to_vec()); - let test_code = WASM_BINARY; let output = call_in_wasm( "test_data_in", &b"Hello world".to_vec().encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(); assert_eq!(output, b"all ok!".to_vec().encode()); @@ -216,7 +196,6 @@ fn clear_prefix_should_work(wasm_method: WasmExecutionMethod) { ext.set_storage(b"aba".to_vec(), b"3".to_vec()); ext.set_storage(b"abb".to_vec(), b"4".to_vec()); ext.set_storage(b"bbb".to_vec(), b"5".to_vec()); - let test_code = WASM_BINARY; // This will clear all entries which prefix is "ab". let output = call_in_wasm( @@ -224,8 +203,6 @@ fn clear_prefix_should_work(wasm_method: WasmExecutionMethod) { &b"ab".to_vec().encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(); assert_eq!(output, b"all ok!".to_vec().encode()); @@ -247,15 +224,12 @@ fn clear_prefix_should_work(wasm_method: WasmExecutionMethod) { fn blake2_256_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; assert_eq!( call_in_wasm( "test_blake2_256", &[0], wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), blake2_256(&b""[..]).to_vec().encode(), ); @@ -265,8 +239,6 @@ fn blake2_256_should_work(wasm_method: WasmExecutionMethod) { &b"Hello world!".to_vec().encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), blake2_256(&b"Hello world!"[..]).to_vec().encode(), ); @@ -277,15 +249,12 @@ fn blake2_256_should_work(wasm_method: WasmExecutionMethod) { fn blake2_128_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; assert_eq!( call_in_wasm( "test_blake2_128", &[0], wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), blake2_128(&b""[..]).to_vec().encode(), ); @@ -295,8 +264,6 @@ fn blake2_128_should_work(wasm_method: WasmExecutionMethod) { &b"Hello world!".to_vec().encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), blake2_128(&b"Hello world!"[..]).to_vec().encode(), ); @@ -307,15 +274,12 @@ fn blake2_128_should_work(wasm_method: WasmExecutionMethod) { fn sha2_256_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; assert_eq!( call_in_wasm( "test_sha2_256", &[0], wasm_method, &mut ext, - &test_code[..], - 8, ) .unwrap(), hex!("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") @@ -328,8 +292,6 @@ fn sha2_256_should_work(wasm_method: WasmExecutionMethod) { &b"Hello world!".to_vec().encode(), wasm_method, &mut ext, - &test_code[..], - 8, ) .unwrap(), hex!("c0535e4be2b79ffd93291305436bf889314e4a3faec05ecffcbb7df31ad9e51a") @@ -343,15 +305,12 @@ fn sha2_256_should_work(wasm_method: WasmExecutionMethod) { fn twox_256_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; assert_eq!( call_in_wasm( "test_twox_256", &[0], wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), hex!( "99e9d85137db46ef4bbea33613baafd56f963c64b1f3685a4eb4abd67ff6203a" @@ -363,8 +322,6 @@ fn twox_256_should_work(wasm_method: WasmExecutionMethod) { &b"Hello world!".to_vec().encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), hex!( "b27dfd7f223f177f2a13647b533599af0c07f68bda23d96d059da2b451a35a74" @@ -377,15 +334,12 @@ fn twox_256_should_work(wasm_method: WasmExecutionMethod) { fn twox_128_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; assert_eq!( call_in_wasm( "test_twox_128", &[0], wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), hex!("99e9d85137db46ef4bbea33613baafd5").to_vec().encode(), ); @@ -395,8 +349,6 @@ fn twox_128_should_work(wasm_method: WasmExecutionMethod) { &b"Hello world!".to_vec().encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), hex!("b27dfd7f223f177f2a13647b533599af").to_vec().encode(), ); @@ -407,7 +359,6 @@ fn twox_128_should_work(wasm_method: WasmExecutionMethod) { fn ed25519_verify_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let key = ed25519::Pair::from_seed(&blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; @@ -420,8 +371,6 @@ fn ed25519_verify_should_work(wasm_method: WasmExecutionMethod) { &calldata.encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), true.encode(), ); @@ -437,8 +386,6 @@ fn ed25519_verify_should_work(wasm_method: WasmExecutionMethod) { &calldata.encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), false.encode(), ); @@ -449,7 +396,6 @@ fn ed25519_verify_should_work(wasm_method: WasmExecutionMethod) { fn sr25519_verify_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let key = sr25519::Pair::from_seed(&blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; @@ -462,8 +408,6 @@ fn sr25519_verify_should_work(wasm_method: WasmExecutionMethod) { &calldata.encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), true.encode(), ); @@ -479,8 +423,6 @@ fn sr25519_verify_should_work(wasm_method: WasmExecutionMethod) { &calldata.encode(), wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), false.encode(), ); @@ -490,17 +432,13 @@ fn sr25519_verify_should_work(wasm_method: WasmExecutionMethod) { #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] fn ordered_trie_root_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); - let mut ext = ext.ext(); let trie_input = vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()]; - let test_code = WASM_BINARY; assert_eq!( call_in_wasm( "test_ordered_trie_root", &[0], wasm_method, - &mut ext, - &test_code[..], - 8, + &mut ext.ext(), ).unwrap(), Layout::::ordered_trie_root(trie_input.iter()).as_bytes().encode(), ); @@ -514,16 +452,12 @@ fn offchain_local_storage_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let (offchain, state) = testing::TestOffchainExt::new(); ext.register_extension(OffchainExt::new(offchain)); - let test_code = WASM_BINARY; - let mut ext = ext.ext(); assert_eq!( call_in_wasm( "test_offchain_local_storage", &[0], wasm_method, - &mut ext, - &test_code[..], - 8, + &mut ext.ext(), ).unwrap(), true.encode(), ); @@ -550,17 +484,84 @@ fn offchain_http_should_work(wasm_method: WasmExecutionMethod) { }, ); - let test_code = WASM_BINARY; - let mut ext = ext.ext(); assert_eq!( call_in_wasm( "test_offchain_http", &[0], wasm_method, - &mut ext, - &test_code[..], - 8, + &mut ext.ext(), ).unwrap(), true.encode(), ); } + +#[test_case(WasmExecutionMethod::Interpreted)] +#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] +#[should_panic(expected = "Allocator ran out of space")] +fn should_trap_when_heap_exhausted(wasm_method: WasmExecutionMethod) { + let mut ext = TestExternalities::default(); + + crate::call_in_wasm::( + "test_exhaust_heap", + &[0], + wasm_method, + &mut ext.ext(), + &WASM_BINARY[..], + // `17` is the initial number of pages compiled into the binary. + 17, + true, + ).unwrap(); +} + +#[test_case(WasmExecutionMethod::Interpreted)] +#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] +fn returns_mutable_static(wasm_method: WasmExecutionMethod) { + let mut instance = crate::wasm_runtime::create_wasm_runtime_with_code( + wasm_method, + 1024, + &WASM_BINARY[..], + HostFunctions::host_functions(), + true, + ).expect("Creates instance"); + + let res = instance.call("returns_mutable_static", &[0]).unwrap(); + assert_eq!(33, u64::decode(&mut &res[..]).unwrap()); + + // We expect that every invocation will need to return the initial + // value plus one. If the value increases more than that then it is + // a sign that the wasm runtime preserves the memory content. + let res = instance.call("returns_mutable_static", &[0]).unwrap(); + assert_eq!(33, u64::decode(&mut &res[..]).unwrap()); +} + +// If we didn't restore the wasm instance properly, on a trap the stack pointer would not be +// returned to its initial value and thus the stack space is going to be leaked. +// +// See https://github.com/paritytech/substrate/issues/2967 for details +#[test_case(WasmExecutionMethod::Interpreted)] +#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] +fn restoration_of_globals(wasm_method: WasmExecutionMethod) { + // Allocate 32 pages (of 65536 bytes) which gives the runtime 2048KB of heap to operate on + // (plus some additional space unused from the initial pages requested by the wasm runtime + // module). + // + // The fixture performs 2 allocations of 768KB and this theoretically gives 1536KB, however, due + // to our allocator algorithm there are inefficiencies. + const REQUIRED_MEMORY_PAGES: u64 = 32; + + let mut instance = crate::wasm_runtime::create_wasm_runtime_with_code( + wasm_method, + REQUIRED_MEMORY_PAGES, + &WASM_BINARY[..], + HostFunctions::host_functions(), + true, + ).expect("Creates instance"); + + // On the first invocation we allocate approx. 768KB (75%) of stack and then trap. + let res = instance.call("allocates_huge_stack_array", &true.encode()); + assert!(res.is_err()); + + // On the second invocation we allocate yet another 768KB (75%) of stack + let res = instance.call("allocates_huge_stack_array", &false.encode()); + assert!(res.is_ok()); +} diff --git a/client/executor/src/integration_tests/sandbox.rs b/client/executor/src/integration_tests/sandbox.rs index 9a9b33608d..9458542e3a 100644 --- a/client/executor/src/integration_tests/sandbox.rs +++ b/client/executor/src/integration_tests/sandbox.rs @@ -18,7 +18,6 @@ use super::{TestExternalities, call_in_wasm}; use crate::WasmExecutionMethod; use codec::Encode; -use sc_runtime_test::WASM_BINARY; use test_case::test_case; use wabt; @@ -27,7 +26,6 @@ use wabt; fn sandbox_should_work(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -56,8 +54,6 @@ fn sandbox_should_work(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), true.encode(), ); @@ -68,7 +64,6 @@ fn sandbox_should_work(wasm_method: WasmExecutionMethod) { fn sandbox_trap(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -86,47 +81,16 @@ fn sandbox_trap(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), vec![0], ); } -#[test_case(WasmExecutionMethod::Interpreted)] -#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] -#[should_panic(expected = "Allocator ran out of space")] -fn sandbox_should_trap_when_heap_exhausted(wasm_method: WasmExecutionMethod) { - let mut ext = TestExternalities::default(); - let mut ext = ext.ext(); - let test_code = WASM_BINARY; - - let code = wabt::wat2wasm(r#" - (module - (import "env" "assert" (func $assert (param i32))) - (func (export "call") - i32.const 0 - call $assert - ) - ) - "#).unwrap().encode(); - - call_in_wasm( - "test_exhaust_heap", - &code, - wasm_method, - &mut ext, - &test_code[..], - 8, - ).unwrap(); -} - #[test_case(WasmExecutionMethod::Interpreted)] #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] fn start_called(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -161,8 +125,6 @@ fn start_called(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), true.encode(), ); @@ -173,7 +135,6 @@ fn start_called(wasm_method: WasmExecutionMethod) { fn invoke_args(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -204,8 +165,6 @@ fn invoke_args(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), true.encode(), ); @@ -216,7 +175,6 @@ fn invoke_args(wasm_method: WasmExecutionMethod) { fn return_val(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -235,8 +193,6 @@ fn return_val(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), true.encode(), ); @@ -247,7 +203,6 @@ fn return_val(wasm_method: WasmExecutionMethod) { fn unlinkable_module(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -264,8 +219,6 @@ fn unlinkable_module(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), 1u8.encode(), ); @@ -276,7 +229,6 @@ fn unlinkable_module(wasm_method: WasmExecutionMethod) { fn corrupted_module(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; // Corrupted wasm file let code = vec![0u8, 0, 0, 0, 1, 0, 0, 0].encode(); @@ -287,8 +239,6 @@ fn corrupted_module(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), 1u8.encode(), ); @@ -299,7 +249,6 @@ fn corrupted_module(wasm_method: WasmExecutionMethod) { fn start_fn_ok(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -319,8 +268,6 @@ fn start_fn_ok(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), 0u8.encode(), ); @@ -331,7 +278,6 @@ fn start_fn_ok(wasm_method: WasmExecutionMethod) { fn start_fn_traps(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - let test_code = WASM_BINARY; let code = wabt::wat2wasm(r#" (module @@ -352,8 +298,6 @@ fn start_fn_traps(wasm_method: WasmExecutionMethod) { &code, wasm_method, &mut ext, - &test_code[..], - 8, ).unwrap(), 2u8.encode(), ); diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index cf8125e774..c4701fd827 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -24,7 +24,7 @@ use wasmi::{ }; use codec::{Encode, Decode}; use sp_core::sandbox as sandbox_primitives; -use log::{error, trace}; +use log::{error, trace, debug}; use parity_wasm::elements::{deserialize_buffer, DataSegment, Instruction, Module as RawModule}; use sp_wasm_interface::{ FunctionContext, Pointer, WordSize, Sandbox, MemoryId, Result as WResult, Function, @@ -271,18 +271,36 @@ impl<'a> Sandbox for FunctionExecutor<'a> { } } +/// Will be used on initialization of a module to resolve function and memory imports. struct Resolver<'a> { - host_functions: &'a[&'static dyn Function], + /// All the hot functions that we export for the WASM blob. + host_functions: &'a [&'static dyn Function], + /// Should we allow missing function imports? + /// + /// If `true`, we return a stub that will return an error when being called. allow_missing_func_imports: bool, + /// All the names of functions for that we did not provide a host function. missing_functions: RefCell>, + /// Will be used as initial and maximum size of the imported memory. + heap_pages: usize, + /// By default, runtimes should import memory and this is `Some(_)` after + /// reolving. However, to be backwards compatible, we also support memory + /// exported by the WASM blob (this will be `None` after resolving). + import_memory: RefCell>, } impl<'a> Resolver<'a> { - fn new(host_functions: &'a[&'static dyn Function], allow_missing_func_imports: bool) -> Resolver<'a> { + fn new( + host_functions: &'a[&'static dyn Function], + allow_missing_func_imports: bool, + heap_pages: usize, + ) -> Resolver<'a> { Resolver { host_functions, allow_missing_func_imports, missing_functions: RefCell::new(Vec::new()), + heap_pages, + import_memory: Default::default(), } } } @@ -323,6 +341,48 @@ impl<'a> wasmi::ModuleImportResolver for Resolver<'a> { )) } } + + fn resolve_memory( + &self, + field_name: &str, + memory_type: &wasmi::MemoryDescriptor, + ) -> Result { + if field_name == "memory" { + match &mut *self.import_memory.borrow_mut() { + Some(_) => Err(wasmi::Error::Instantiation( + "Memory can not be imported twice!".into(), + )), + memory_ref @ None => { + if memory_type + .maximum() + .map(|m| m.saturating_sub(memory_type.initial())) + .map(|m| self.heap_pages > m as usize) + .unwrap_or(false) + { + Err(wasmi::Error::Instantiation(format!( + "Heap pages ({}) is greater than imported memory maximum ({}).", + self.heap_pages, + memory_type + .maximum() + .map(|m| m.saturating_sub(memory_type.initial())) + .expect("Maximum is set, checked above; qed"), + ))) + } else { + let memory = MemoryInstance::alloc( + Pages(memory_type.initial() as usize + self.heap_pages), + Some(Pages(memory_type.initial() as usize + self.heap_pages)), + )?; + *memory_ref = Some(memory.clone()); + Ok(memory) + } + } + } + } else { + Err(wasmi::Error::Instantiation( + format!("Unknown memory reference with name: {}", field_name), + )) + } + } } impl<'a> wasmi::Externals for FunctionExecutor<'a> { @@ -378,15 +438,14 @@ fn get_heap_base(module: &ModuleRef) -> Result { /// Call a given method in the given wasm-module runtime. fn call_in_wasm_module( module_instance: &ModuleRef, + memory: &MemoryRef, method: &str, data: &[u8], host_functions: &[&'static dyn Function], allow_missing_func_imports: bool, missing_functions: &Vec, ) -> Result, Error> { - // extract a reference to a linear memory, optional reference to a table - // and then initialize FunctionExecutor. - let memory = get_mem_instance(module_instance)?; + // Initialize FunctionExecutor. let table: Option = module_instance .export_by_name("__indirect_function_table") .and_then(|e| e.as_table().cloned()); @@ -434,8 +493,8 @@ fn instantiate_module( module: &Module, host_functions: &[&'static dyn Function], allow_missing_func_imports: bool, -) -> Result<(ModuleRef, Vec), Error> { - let resolver = Resolver::new(host_functions, allow_missing_func_imports); +) -> Result<(ModuleRef, Vec, MemoryRef), Error> { + let resolver = Resolver::new(host_functions, allow_missing_func_imports, heap_pages); // start module instantiation. Don't run 'start' function yet. let intermediate_instance = ModuleInstance::new( module, @@ -445,15 +504,33 @@ fn instantiate_module( // Verify that the module has the heap base global variable. let _ = get_heap_base(intermediate_instance.not_started_instance())?; - // Extract a reference to a linear memory. - let memory = get_mem_instance(intermediate_instance.not_started_instance())?; - memory.grow(Pages(heap_pages)).map_err(|_| Error::Runtime)?; + + // Get the memory reference. Runtimes should import memory, but to be backwards + // compatible we also support exported memory. + let memory = match resolver.import_memory.into_inner() { + Some(memory) => memory, + None => { + debug!( + target: "wasm-executor", + "WASM blob does not imports memory, falling back to exported memory", + ); + + let memory = get_mem_instance(intermediate_instance.not_started_instance())?; + memory.grow(Pages(heap_pages)).map_err(|_| Error::Runtime)?; + + memory + } + }; if intermediate_instance.has_start() { // Runtime is not allowed to have the `start` function. Err(Error::RuntimeHasStartFn) } else { - Ok((intermediate_instance.assert_no_start(), resolver.missing_functions.into_inner())) + Ok(( + intermediate_instance.assert_no_start(), + resolver.missing_functions.into_inner(), + memory, + )) } } @@ -528,14 +605,7 @@ impl StateSnapshot { /// the preserved memory and globals. /// /// Returns `Err` if applying the snapshot is failed. - fn apply(&self, instance: &ModuleRef) -> Result<(), WasmError> { - let memory = instance - .export_by_name("memory") - .ok_or(WasmError::ApplySnapshotFailed)? - .as_memory() - .cloned() - .ok_or(WasmError::ApplySnapshotFailed)?; - + fn apply(&self, instance: &ModuleRef, memory: &MemoryRef) -> Result<(), WasmError> { // First, erase the memory and copy the data segments into it. memory .erase() @@ -569,6 +639,8 @@ impl StateSnapshot { pub struct WasmiRuntime { /// A wasm module instance. instance: ModuleRef, + /// The memory instance of used by the wasm module. + memory: MemoryRef, /// The snapshot of the instance's state taken just after the instantiation. state_snapshot: StateSnapshot, /// The host functions registered for this instance. @@ -594,7 +666,7 @@ impl WasmRuntime for WasmiRuntime { method: &str, data: &[u8], ) -> Result, Error> { - self.state_snapshot.apply(&self.instance) + self.state_snapshot.apply(&self.instance, &self.memory) .map_err(|e| { // Snapshot restoration failed. This is pretty unexpected since this can happen // if some invariant is broken or if the system is under extreme memory pressure @@ -604,6 +676,7 @@ impl WasmRuntime for WasmiRuntime { })?; call_in_wasm_module( &self.instance, + &self.memory, method, data, &self.host_functions, @@ -628,7 +701,7 @@ pub fn create_instance( let data_segments = extract_data_segments(&code)?; // Instantiate this module. - let (instance, missing_functions) = instantiate_module( + let (instance, missing_functions, memory) = instantiate_module( heap_pages as usize, &module, &host_functions, @@ -646,6 +719,7 @@ pub fn create_instance( Ok(WasmiRuntime { instance, + memory, state_snapshot, host_functions, allow_missing_func_imports, diff --git a/client/executor/wasmtime/src/runtime.rs b/client/executor/wasmtime/src/runtime.rs index 77a11ddc7d..abf860667f 100644 --- a/client/executor/wasmtime/src/runtime.rs +++ b/client/executor/wasmtime/src/runtime.rs @@ -32,42 +32,38 @@ use sc_executor_common::{ use sp_wasm_interface::{Pointer, WordSize, Function}; use sp_runtime_interface::unpack_ptr_and_len; -use std::cell::RefCell; -use std::collections::HashMap; -use std::convert::TryFrom; -use std::rc::Rc; +use std::{cell::RefCell, collections::HashMap, convert::TryFrom, rc::Rc}; use cranelift_codegen::ir; use cranelift_codegen::isa::TargetIsa; use cranelift_entity::{EntityRef, PrimaryMap}; use cranelift_frontend::FunctionBuilderContext; -use cranelift_wasm::DefinedFuncIndex; +use cranelift_wasm::{DefinedFuncIndex, MemoryIndex}; use wasmtime_environ::{Module, translate_signature}; use wasmtime_jit::{ ActionOutcome, CodeMemory, CompilationStrategy, CompiledModule, Compiler, Context, RuntimeValue, }; use wasmtime_runtime::{Export, Imports, InstanceHandle, VMFunctionBody}; +/// TODO: We should remove this in https://github.com/paritytech/substrate/pull/4686 +/// Currently there is no way to extract this with wasmtime. +const INITIAL_HEAP_PAGES: u32 = 17; + /// A `WasmRuntime` implementation using the Wasmtime JIT to compile the runtime module to native /// and execute the compiled code. pub struct WasmtimeRuntime { module: CompiledModule, context: Context, - max_heap_pages: Option, heap_pages: u32, /// The host functions registered for this instance. host_functions: Vec<&'static dyn Function>, + /// The index of the memory in the module. + memory_index: MemoryIndex, } impl WasmRuntime for WasmtimeRuntime { fn update_heap_pages(&mut self, heap_pages: u64) -> bool { - match heap_pages_valid(heap_pages, self.max_heap_pages) { - Some(heap_pages) => { - self.heap_pages = heap_pages; - true - } - None => false, - } + self.heap_pages as u64 == heap_pages } fn host_functions(&self) -> &[&'static dyn Function] { @@ -80,6 +76,7 @@ impl WasmRuntime for WasmtimeRuntime { &mut self.module, method, data, + self.memory_index, self.heap_pages, ) } @@ -93,31 +90,42 @@ pub fn create_instance( host_functions: Vec<&'static dyn Function>, allow_missing_func_imports: bool, ) -> std::result::Result { - let (compiled_module, context) = create_compiled_unit(code, &host_functions, allow_missing_func_imports)?; - - // Inspect the module for the min and max memory sizes. - let (min_memory_size, max_memory_size) = { - let module = compiled_module.module_ref(); - let memory_index = match module.exports.get("memory") { - Some(wasmtime_environ::Export::Memory(memory_index)) => *memory_index, - _ => return Err(WasmError::InvalidMemory), + let heap_pages = u32::try_from(heap_pages) + .map_err(|e| + WasmError::Other(format!("Heap pages can not be converted into `u32`: {:?}", e)) + )?; + + let (compiled_module, context, memory_index) = create_compiled_unit( + code, + &host_functions, + heap_pages, + allow_missing_func_imports, + )?; + + let module = compiled_module.module_ref(); + if !module.is_imported_memory(memory_index) { + // Inspect the module for the min and max memory sizes. + let (min_memory_size, max_memory_size) = { + let memory_plan = module.memory_plans + .get(memory_index) + .ok_or_else(|| WasmError::InvalidMemory)?; + (memory_plan.memory.minimum, memory_plan.memory.maximum) }; - let memory_plan = module.memory_plans.get(memory_index) - .expect("memory_index is retrieved from the module's exports map; qed"); - (memory_plan.memory.minimum, memory_plan.memory.maximum) - }; - // Check that heap_pages is within the allowed range. - let max_heap_pages = max_memory_size.map(|max| max.saturating_sub(min_memory_size)); - let heap_pages = heap_pages_valid(heap_pages, max_heap_pages) - .ok_or_else(|| WasmError::InvalidHeapPages)?; + // Check that heap_pages is within the allowed range. + let max_heap_pages = max_memory_size.map(|max| max.saturating_sub(min_memory_size)); + + if max_heap_pages.map(|m| heap_pages > m).unwrap_or(false) { + return Err(WasmError::InvalidHeapPages) + } + } Ok(WasmtimeRuntime { module: compiled_module, context, - max_heap_pages, heap_pages, host_functions, + memory_index, }) } @@ -209,8 +217,9 @@ fn scan_missing_functions( fn create_compiled_unit( code: &[u8], host_functions: &[&'static dyn Function], + heap_pages: u32, allow_missing_func_imports: bool, -) -> std::result::Result<(CompiledModule, Context), WasmError> { +) -> std::result::Result<(CompiledModule, Context, MemoryIndex), WasmError> { let compilation_strategy = CompilationStrategy::Cranelift; let compiler = new_compiler(compilation_strategy)?; @@ -231,16 +240,32 @@ fn create_compiled_unit( MissingFunctionStubs::new() }; - let env_missing_functions = missing_functions_stubs.stubs.remove("env").unwrap_or_else(|| Vec::new()); - context.name_instance( - "env".to_owned(), - instantiate_env_module(global_exports, compiler, host_functions, env_missing_functions)?, - ); + let env_missing_functions = missing_functions_stubs.stubs + .remove("env") + .unwrap_or_else(|| Vec::new()); + + let (module, memory_index) = instantiate_env_module( + global_exports, + compiler, + host_functions, + heap_pages, + env_missing_functions, + true, + )?; + + context.name_instance("env".to_owned(), module); for (module, missing_functions_stubs) in missing_functions_stubs.stubs { let compiler = new_compiler(compilation_strategy)?; let global_exports = context.get_global_exports(); - let instance = instantiate_env_module(global_exports, compiler, &[], missing_functions_stubs)?; + let instance = instantiate_env_module( + global_exports, + compiler, + &[], + heap_pages, + missing_functions_stubs, + false, + )?.0; context.name_instance(module, instance); } @@ -248,7 +273,7 @@ fn create_compiled_unit( let module = context.compile_module(&code) .map_err(|e| WasmError::Other(format!("module compile error: {}", e)))?; - Ok((module, context)) + Ok((module, context, memory_index.expect("Memory is added on request; qed"))) } /// Call a function inside a precompiled Wasm module. @@ -257,22 +282,21 @@ fn call_method( module: &mut CompiledModule, method: &str, data: &[u8], + memory_index: MemoryIndex, heap_pages: u32, ) -> Result> { + let is_imported_memory = module.module().is_imported_memory(memory_index); // Old exports get clobbered in `InstanceHandle::new` if we don't explicitly remove them first. // // The global exports mechanism is temporary in Wasmtime and expected to be removed. // https://github.com/CraneStation/wasmtime/issues/332 - clear_globals(&mut *context.get_global_exports().borrow_mut()); + clear_globals(&mut *context.get_global_exports().borrow_mut(), is_imported_memory); - let mut instance = module.instantiate() - .map_err(|e| Error::Other(e.to_string()))?; + let mut instance = module.instantiate().map_err(|e| Error::Other(e.to_string()))?; - // Ideally there would be a way to set the heap pages during instantiation rather than - // growing the memory after the fact. Currently this may require an additional mmap and copy. - // However, the wasmtime API doesn't support modifying the size of memory on instantiation - // at this time. - grow_memory(&mut instance, heap_pages)?; + if !is_imported_memory { + grow_memory(&mut instance, heap_pages)?; + } // Initialize the function executor state. let heap_base = get_heap_base(&instance)?; @@ -280,7 +304,7 @@ fn call_method( reset_env_state_and_take_trap(context, Some(executor_state))?; // Write the input data into guest memory. - let (data_ptr, data_len) = inject_input_data(context, &mut instance, data)?; + let (data_ptr, data_len) = inject_input_data(context, &mut instance, data, memory_index)?; let args = [RuntimeValue::I32(u32::from(data_ptr) as i32), RuntimeValue::I32(data_len as i32)]; // Invoke the function in the runtime. @@ -300,7 +324,7 @@ fn call_method( // Read the output data from guest memory. let mut output = vec![0; output_len as usize]; - let memory = get_memory_mut(&mut instance)?; + let memory = get_memory_mut(&mut instance, memory_index)?; read_memory_into(memory, Pointer::new(output_ptr), &mut output)?; Ok(output) } @@ -310,9 +334,10 @@ fn instantiate_env_module( global_exports: Rc>>>, compiler: Compiler, host_functions: &[&'static dyn Function], + heap_pages: u32, missing_functions_stubs: Vec, -) -> std::result::Result -{ + add_memory: bool, +) -> std::result::Result<(InstanceHandle, Option), WasmError> { let isa = target_isa()?; let pointer_type = isa.pointer_type(); let call_conv = isa.default_call_conv(); @@ -325,7 +350,7 @@ fn instantiate_env_module( for function in host_functions { let sig = translate_signature( cranelift_ir_signature(function.signature(), &call_conv), - pointer_type + pointer_type, ); let sig_id = module.signatures.push(sig.clone()); let func_id = module.functions.push(sig_id); @@ -365,6 +390,22 @@ fn instantiate_env_module( code_memory.publish(); + let memory_id = if add_memory { + let memory = cranelift_wasm::Memory { + minimum: heap_pages + INITIAL_HEAP_PAGES, + maximum: Some(heap_pages + INITIAL_HEAP_PAGES), + shared: false, + }; + let memory_plan = wasmtime_environ::MemoryPlan::for_memory(memory, &Default::default()); + + let memory_id = module.memory_plans.push(memory_plan); + module.exports.insert("memory".into(), wasmtime_environ::Export::Memory(memory_id)); + + Some(memory_id) + } else { + None + }; + let imports = Imports::none(); let data_initializers = Vec::new(); let signatures = PrimaryMap::new(); @@ -380,7 +421,10 @@ fn instantiate_env_module( None, Box::new(env_state), ); - result.map_err(|e| WasmError::Other(format!("cannot instantiate env: {}", e))) + + result + .map_err(|e| WasmError::Other(format!("cannot instantiate env: {}", e))) + .map(|r| (r, memory_id)) } /// Build a new TargetIsa for the host machine. @@ -396,8 +440,11 @@ fn new_compiler(strategy: CompilationStrategy) -> std::result::Result>) { - global_exports.remove("memory"); +fn clear_globals(global_exports: &mut HashMap>, is_imported_memory: bool) { + // When memory is imported, we can not delete the global export. + if !is_imported_memory { + global_exports.remove("memory"); + } global_exports.remove("__heap_base"); global_exports.remove("__indirect_function_table"); } @@ -441,13 +488,14 @@ fn inject_input_data( context: &mut Context, instance: &mut InstanceHandle, data: &[u8], + memory_index: MemoryIndex, ) -> Result<(Pointer, WordSize)> { let env_state = get_env_state(context)?; let executor_state = env_state.executor_state .as_mut() .ok_or_else(|| "cannot get \"env\" module executor state")?; - let memory = get_memory_mut(instance)?; + let memory = get_memory_mut(instance, memory_index)?; let data_len = data.len() as WordSize; let data_ptr = executor_state.heap().allocate(memory, data_len)?; @@ -455,12 +503,12 @@ fn inject_input_data( Ok((data_ptr, data_len)) } -fn get_memory_mut(instance: &mut InstanceHandle) -> Result<&mut [u8]> { - match instance.lookup("memory") { +fn get_memory_mut(instance: &mut InstanceHandle, memory_index: MemoryIndex) -> Result<&mut [u8]> { + match instance.lookup_by_declaration(&wasmtime_environ::Export::Memory(memory_index)) { // This is safe to wrap in an unsafe block as: // - The definition pointer is returned by a lookup on a valid instance and thus points to // a valid memory definition - Some(Export::Memory { definition, vmctx: _, memory: _ }) => unsafe { + Export::Memory { definition, vmctx: _, memory: _ } => unsafe { Ok(std::slice::from_raw_parts_mut( (*definition).base, (*definition).current_length, @@ -484,17 +532,3 @@ fn get_heap_base(instance: &InstanceHandle) -> Result { } } } - -/// Checks whether the heap_pages parameter is within the valid range and converts it to a u32. -/// Returns None if heaps_pages in not in range. -fn heap_pages_valid(heap_pages: u64, max_heap_pages: Option) - -> Option -{ - let heap_pages = u32::try_from(heap_pages).ok()?; - if let Some(max_heap_pages) = max_heap_pages { - if heap_pages > max_heap_pages { - return None; - } - } - Some(heap_pages) -} diff --git a/primitives/runtime-interface/test-wasm/build.rs b/primitives/runtime-interface/test-wasm/build.rs index 9c81ea6f38..647b476814 100644 --- a/primitives/runtime-interface/test-wasm/build.rs +++ b/primitives/runtime-interface/test-wasm/build.rs @@ -14,17 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; +use wasm_builder_runner::WasmBuilder; fn main() { - build_current_project_with_rustflags( - "wasm_binary.rs", - WasmBuilderSource::CratesOrPath { - path: "../../../utils/wasm-builder", - version: "1.0.9", - }, - // This instructs LLD to export __heap_base as a global variable, which is used by the - // external memory allocator. - "-Clink-arg=--export=__heap_base", - ); + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_from_crates_or_path("1.0.9", "../../../utils/wasm-builder") + .export_heap_base() + .import_memory() + .build() } diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index 76aa1acd8a..e95c5ad162 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -184,7 +184,6 @@ impl TestClientBuilder + 'static, Backend: sc_client_api::backend::Backend, { - let storage = { let mut storage = self.genesis_init.genesis_storage(); diff --git a/test-utils/runtime/build.rs b/test-utils/runtime/build.rs index 8a9ee642c4..1fd3d52b2f 100644 --- a/test-utils/runtime/build.rs +++ b/test-utils/runtime/build.rs @@ -14,22 +14,17 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; +use wasm_builder_runner::WasmBuilder; fn main() { - build_current_project_with_rustflags( - "wasm_binary.rs", - WasmBuilderSource::CratesOrPath { - path: "../../utils/wasm-builder", - version: "1.0.9", - }, + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_from_crates_or_path("1.0.9", "../../utils/wasm-builder") + .export_heap_base() // Note that we set the stack-size to 1MB explicitly even though it is set // to this value by default. This is because some of our tests (`restoration_of_globals`) // depend on the stack-size. - // - // The --export=__heap_base instructs LLD to export __heap_base as a global variable, which - // is used by the external memory allocator. - "-Clink-arg=-zstack-size=1048576 \ - -Clink-arg=--export=__heap_base", - ); + .append_to_rust_flags("-Clink-arg=-zstack-size=1048576") + .import_memory() + .build() } diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index b8e858c3a4..96387b1efc 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -255,8 +255,6 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; - fn returns_mutable_static() -> u64; - fn allocates_huge_stack_array(trap: bool) -> Vec; fn vec_with_capacity(size: u32) -> Vec; /// Returns the initialized block number. fn get_block_number() -> u64; @@ -299,8 +297,6 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; - fn returns_mutable_static() -> u64; - fn allocates_huge_stack_array(trap: bool) -> Vec; fn vec_with_capacity(size: u32) -> Vec; /// Returns the initialized block number. fn get_block_number() -> u64; @@ -448,11 +444,6 @@ impl_opaque_keys! { } } -#[cfg(not(feature = "std"))] -/// Mutable static variables should be always observed to have -/// the initialized value at the start of a runtime call. -static mut MUTABLE_STATIC: u64 = 32; - cfg_if! { if #[cfg(feature = "std")] { impl_runtime_apis! { @@ -558,14 +549,6 @@ cfg_if! { (0..1000).fold(0, |p, i| p + benchmark_add_one(i)) } - fn returns_mutable_static() -> u64 { - unimplemented!("is not expected to be invoked from non-wasm builds"); - } - - fn allocates_huge_stack_array(_trap: bool) -> Vec { - unimplemented!("is not expected to be invoked from non-wasm builds"); - } - fn vec_with_capacity(_size: u32) -> Vec { unimplemented!("is not expected to be invoked from non-wasm builds"); } @@ -753,41 +736,6 @@ cfg_if! { (0..10000).fold(0, |p, i| p + benchmark_add_one(i)) } - fn returns_mutable_static() -> u64 { - unsafe { - MUTABLE_STATIC += 1; - MUTABLE_STATIC - } - } - - fn allocates_huge_stack_array(trap: bool) -> Vec { - // Allocate a stack frame that is approx. 75% of the stack (assuming it is 1MB). - // This will just decrease (stacks in wasm32-u-u grow downwards) the stack - // pointer. This won't trap on the current compilers. - let mut data = [0u8; 1024 * 768]; - - // Then make sure we actually write something to it. - // - // If: - // 1. the stack area is placed at the beginning of the linear memory space, and - // 2. the stack pointer points to out-of-bounds area, and - // 3. a write is performed around the current stack pointer. - // - // then a trap should happen. - // - for (i, v) in data.iter_mut().enumerate() { - *v = i as u8; // deliberate truncation - } - - if trap { - // There is a small chance of this to be pulled up in theory. In practice - // the probability of that is rather low. - panic!() - } - - data.to_vec() - } - fn vec_with_capacity(size: u32) -> Vec { Vec::with_capacity(size as usize) } @@ -970,54 +918,6 @@ mod tests { use sp_state_machine::ExecutionStrategy; use codec::Encode; - #[test] - fn returns_mutable_static() { - let client = TestClientBuilder::new() - .set_execution_strategy(ExecutionStrategy::AlwaysWasm) - .build(); - let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.chain_info().best_number); - - let ret = runtime_api.returns_mutable_static(&block_id).unwrap(); - assert_eq!(ret, 33); - - // We expect that every invocation will need to return the initial - // value plus one. If the value increases more than that then it is - // a sign that the wasm runtime preserves the memory content. - let ret = runtime_api.returns_mutable_static(&block_id).unwrap(); - assert_eq!(ret, 33); - } - - // If we didn't restore the wasm instance properly, on a trap the stack pointer would not be - // returned to its initial value and thus the stack space is going to be leaked. - // - // See https://github.com/paritytech/substrate/issues/2967 for details - #[test] - fn restoration_of_globals() { - // Allocate 32 pages (of 65536 bytes) which gives the runtime 2048KB of heap to operate on - // (plus some additional space unused from the initial pages requested by the wasm runtime - // module). - // - // The fixture performs 2 allocations of 768KB and this theoretically gives 1536KB, however, due - // to our allocator algorithm there are inefficiencies. - const REQUIRED_MEMORY_PAGES: u64 = 32; - - let client = TestClientBuilder::new() - .set_execution_strategy(ExecutionStrategy::AlwaysWasm) - .set_heap_pages(REQUIRED_MEMORY_PAGES) - .build(); - let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.chain_info().best_number); - - // On the first invocation we allocate approx. 768KB (75%) of stack and then trap. - let ret = runtime_api.allocates_huge_stack_array(&block_id, true); - assert!(ret.is_err()); - - // On the second invocation we allocate yet another 768KB (75%) of stack - let ret = runtime_api.allocates_huge_stack_array(&block_id, false); - assert!(ret.is_ok()); - } - #[test] fn heap_pages_is_respected() { // This tests that the on-chain HEAP_PAGES parameter is respected. diff --git a/utils/wasm-builder-runner/Cargo.toml b/utils/wasm-builder-runner/Cargo.toml index ab8a539054..1380d64fb3 100644 --- a/utils/wasm-builder-runner/Cargo.toml +++ b/utils/wasm-builder-runner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-wasm-builder-runner" -version = "1.0.4" +version = "1.0.5" authors = ["Parity Technologies "] description = "Runner for substrate-wasm-builder" edition = "2018" diff --git a/utils/wasm-builder-runner/src/lib.rs b/utils/wasm-builder-runner/src/lib.rs index 40016a0159..6366c1ce37 100644 --- a/utils/wasm-builder-runner/src/lib.rs +++ b/utils/wasm-builder-runner/src/lib.rs @@ -25,7 +25,10 @@ //! //! For more information see -use std::{env, process::{Command, self}, fs, path::{PathBuf, Path}}; +use std::{ + env, process::{Command, self}, fs, path::{PathBuf, Path}, hash::{Hash, Hasher}, + collections::hash_map::DefaultHasher, +}; /// Environment variable that tells us to skip building the WASM binary. const SKIP_BUILD_ENV: &str = "SKIP_WASM_BUILD"; @@ -47,6 +50,225 @@ fn replace_back_slashes(path: T) -> String { path.to_string().replace("\\", "/") } +/// Returns the manifest dir from the `CARGO_MANIFEST_DIR` env. +fn get_manifest_dir() -> PathBuf { + env::var("CARGO_MANIFEST_DIR") + .expect("`CARGO_MANIFEST_DIR` is always set for `build.rs` files; qed") + .into() +} + +/// First step of the [`WasmBuilder`] to select the project to build. +pub struct WasmBuilderSelectProject { + /// This parameter just exists to make it impossible to construct + /// this type outside of this crate. + _ignore: (), +} + +impl WasmBuilderSelectProject { + /// Use the current project as project for building the WASM binary. + /// + /// # Panics + /// + /// Panics if the `CARGO_MANIFEST_DIR` variable is not set. This variable + /// is always set by `Cargo` in `build.rs` files. + pub fn with_current_project(self) -> WasmBuilderSelectSource { + WasmBuilderSelectSource(get_manifest_dir().join("Cargo.toml")) + } + + /// Use the given `path` as project for building the WASM binary. + /// + /// Returns an error if the given `path` does not points to a `Cargo.toml`. + pub fn with_project( + self, + path: impl Into, + ) -> Result { + let path = path.into(); + + if path.ends_with("Cargo.toml") { + Ok(WasmBuilderSelectSource(path)) + } else { + Err("Project path must point to the `Cargo.toml` of the project") + } + } +} + +/// Second step of the [`WasmBuilder`] to set the source of the `wasm-builder`. +pub struct WasmBuilderSelectSource(PathBuf); + +impl WasmBuilderSelectSource { + /// Use the given `path` as source for `wasm-builder`. + /// + /// The `path` must be relative and point to the directory that contains the `Cargo.toml` for + /// `wasm-builder`. + pub fn with_wasm_builder_from_path(self, path: &'static str) -> WasmBuilder { + WasmBuilder { + source: WasmBuilderSource::Path(path), + rust_flags: Vec::new(), + file_name: None, + project_cargo_toml: self.0, + } + } + + /// Use the given `repo` and `rev` as source for `wasm-builder`. + pub fn with_wasm_builder_from_git(self, repo: &'static str, rev: &'static str) -> WasmBuilder { + WasmBuilder { + source: WasmBuilderSource::Git { repo, rev }, + rust_flags: Vec::new(), + file_name: None, + project_cargo_toml: self.0, + } + } + + /// Use the given `version` to fetch `wasm-builder` source from crates.io. + pub fn with_wasm_builder_from_crates(self, version: &'static str) -> WasmBuilder { + WasmBuilder { + source: WasmBuilderSource::Crates(version), + rust_flags: Vec::new(), + file_name: None, + project_cargo_toml: self.0, + } + } + + /// Use the given `version` to fetch `wasm-builder` source from crates.io or use + /// the given `path` as source. + /// + /// The `path` must be relative and point to the directory that contains the `Cargo.toml` for + /// `wasm-builder`. + pub fn with_wasm_builder_from_crates_or_path( + self, + version: &'static str, + path: &'static str, + ) -> WasmBuilder { + WasmBuilder { + source: WasmBuilderSource::CratesOrPath { version, path }, + rust_flags: Vec::new(), + file_name: None, + project_cargo_toml: self.0, + } + } + + /// Use the given `source` as source for `wasm-builder`. + pub fn with_wasm_builder_source(self, source: WasmBuilderSource) -> WasmBuilder { + WasmBuilder { + source, + rust_flags: Vec::new(), + file_name: None, + project_cargo_toml: self.0, + } + } +} + +/// The builder for building a wasm binary. +/// +/// The builder itself is seperated into multiple structs to make the setup type safe. +/// +/// Building a wasm binary: +/// +/// 1. Call [`WasmBuilder::new`] to create a new builder. +/// 2. Select the project to build using the methods of [`WasmBuilderSelectProject`]. +/// 3. Select the source of the `wasm-builder` crate using the methods of +/// [`WasmBuilderSelectSource`]. +/// 4. Set additional `RUST_FLAGS` or a different name for the file containing the WASM code +/// using methods of [`Self`]. +/// 5. Build the WASM binary using [`Self::build`]. +pub struct WasmBuilder { + /// Where should we pull the `wasm-builder` crate from. + source: WasmBuilderSource, + /// Flags that should be appended to `RUST_FLAGS` env variable. + rust_flags: Vec, + /// The name of the file that is being generated in `OUT_DIR`. + /// + /// Defaults to `wasm_binary.rs`. + file_name: Option, + /// The path to the `Cargo.toml` of the project that should be build + /// for wasm. + project_cargo_toml: PathBuf, +} + +impl WasmBuilder { + /// Create a new instance of the builder. + pub fn new() -> WasmBuilderSelectProject { + WasmBuilderSelectProject { + _ignore: (), + } + } + + /// Enable exporting `__heap_base` as global variable in the WASM binary. + /// + /// This adds `-Clink-arg=--export=__heap_base` to `RUST_FLAGS`. + pub fn export_heap_base(mut self) -> Self { + self.rust_flags.push("-Clink-arg=--export=__heap_base".into()); + self + } + + /// Set the name of the file that will be generated in `OUT_DIR`. + /// + /// This file needs to be included to get access to the build WASM binary. + /// + /// If this function is not called, `file_name` defaults to `wasm_binary.rs` + pub fn set_file_name(mut self, file_name: impl Into) -> Self { + self.file_name = Some(file_name.into()); + self + } + + /// Instruct the linker to import the memory into the WASM binary. + /// + /// This adds `-C link-arg=--import-memory` to `RUST_FLAGS`. + pub fn import_memory(mut self) -> Self { + self.rust_flags.push("-C link-arg=--import-memory".into()); + self + } + + /// Append the given `flag` to `RUST_FLAGS`. + /// + /// `flag` is appended as is, so it needs to be a valid flag. + pub fn append_to_rust_flags(mut self, flag: impl Into) -> Self { + self.rust_flags.push(flag.into()); + self + } + + /// Build the WASM binary. + pub fn build(self) { + if check_skip_build() { + // If we skip the build, we still want to make sure to be called when an env variable + // changes + generate_rerun_if_changed_instructions(); + return; + } + + let out_dir = PathBuf::from(env::var("OUT_DIR").expect("`OUT_DIR` is set by cargo!")); + let file_path = out_dir.join(self.file_name.unwrap_or_else(|| "wasm_binary.rs".into())); + + // Hash the path to the project cargo toml. + let mut hasher = DefaultHasher::new(); + self.project_cargo_toml.hash(&mut hasher); + + let project_name = env::var("CARGO_PKG_NAME").expect("`CARGO_PKG_NAME` is set by cargo!"); + // Make sure the `wasm-builder-runner` path is unique by concatenating the name of the + // project that is compiling the WASM binary with the hash of the path to the project that + // should be compiled as WASM binary. + let project_folder = get_workspace_root() + .join(format!("{}{}", project_name, hasher.finish())); + + if check_provide_dummy_wasm_binary() { + provide_dummy_wasm_binary(&file_path); + } else { + create_project( + &project_folder, + &file_path, + self.source, + &self.project_cargo_toml, + &self.rust_flags.into_iter().map(|f| format!("{} ", f)).collect::(), + ); + run_project(&project_folder); + } + + // As last step we need to generate our `rerun-if-changed` stuff. If a build fails, we don't + // want to spam the output! + generate_rerun_if_changed_instructions(); + } +} + /// The `wasm-builder` dependency source. pub enum WasmBuilderSource { /// The relative path to the source code from the current manifest dir. @@ -96,46 +318,21 @@ impl WasmBuilderSource { /// Build the currently built project as WASM binary and extend `RUSTFLAGS` with the given rustflags. /// /// For more information, see [`build_current_project`]. +#[deprecated( + since = "1.0.5", + note = "Please switch to [`WasmBuilder`]", +)] pub fn build_current_project_with_rustflags( file_name: &str, wasm_builder_source: WasmBuilderSource, - default_rustflags: &str, + default_rust_flags: &str, ) { - if check_skip_build() { - // If we skip the build, we still want to make sure to be called when an env variable changes - generate_rerun_if_changed_instructions(); - return; - } - - let manifest_dir = PathBuf::from( - env::var("CARGO_MANIFEST_DIR").expect( - "`CARGO_MANIFEST_DIR` is always set for `build.rs` files; qed" - ) - ); - - let cargo_toml_path = manifest_dir.join("Cargo.toml"); - let out_dir = PathBuf::from(env::var("OUT_DIR").expect("`OUT_DIR` is set by cargo!")); - let file_path = out_dir.join(file_name); - let project_name = env::var("CARGO_PKG_NAME").expect("`CARGO_PKG_NAME` is set by cargo!"); - let project_folder = get_workspace_root().join(project_name); - - if check_provide_dummy_wasm_binary() { - provide_dummy_wasm_binary(&file_path); - } else { - create_project( - &project_folder, - &file_path, - &manifest_dir, - wasm_builder_source, - &cargo_toml_path, - default_rustflags, - ); - run_project(&project_folder); - } - - // As last step we need to generate our `rerun-if-changed` stuff. If a build fails, we don't - // want to spam the output! - generate_rerun_if_changed_instructions(); + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_source(wasm_builder_source) + .append_to_rust_flags(default_rust_flags) + .set_file_name(file_name) + .build() } /// Build the currently built project as WASM binary. @@ -145,7 +342,12 @@ pub fn build_current_project_with_rustflags( /// `file_name` - The name of the file being generated in the `OUT_DIR`. The file contains the /// constant `WASM_BINARY` which contains the build wasm binary. /// `wasm_builder_path` - Path to the wasm-builder project, relative to `CARGO_MANIFEST_DIR`. +#[deprecated( + since = "1.0.5", + note = "Please switch to [`WasmBuilder`]", +)] pub fn build_current_project(file_name: &str, wasm_builder_source: WasmBuilderSource) { + #[allow(deprecated)] build_current_project_with_rustflags(file_name, wasm_builder_source, ""); } @@ -171,7 +373,6 @@ fn get_workspace_root() -> PathBuf { fn create_project( project_folder: &Path, file_path: &Path, - manifest_dir: &Path, wasm_builder_source: WasmBuilderSource, cargo_toml_path: &Path, default_rustflags: &str, @@ -193,7 +394,7 @@ fn create_project( [workspace] "#, - wasm_builder_source = wasm_builder_source.to_cargo_source(manifest_dir), + wasm_builder_source = wasm_builder_source.to_cargo_source(&get_manifest_dir()), ) ).expect("WASM build runner `Cargo.toml` writing can not fail; qed"); -- GitLab From 8bb1811e31e000ec442a8f6ddc1d51ca51fa4e2f Mon Sep 17 00:00:00 2001 From: Toralf Wittner Date: Tue, 28 Jan 2020 13:00:37 +0100 Subject: [PATCH 194/296] Update yamux to version 0.4.1 (#4746) --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ecf929384a..6720e9c658 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2729,7 +2729,7 @@ dependencies = [ "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8310,7 +8310,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8954,7 +8954,7 @@ dependencies = [ "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" -"checksum yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "809f4388471d280173404e3d4f889e2d36004960a37d822ce5637fbef33a0ce4" +"checksum yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f937668802a2e862a4fed05267e10b20c310bf771adc89687710706d55a9a65" "checksum zeroize 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "45af6a010d13e4cf5b54c94ba5a2b2eba5596b9e46bf5875612d332a1f2b3f86" "checksum zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" "checksum zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" -- GitLab From 680c355c659c938a4346a79cc81039aae68d2d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 28 Jan 2020 16:18:09 +0100 Subject: [PATCH 195/296] Make sure destroy_state is called in case of errors. (#4745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make sure to destroy state in case of error. * Update client/src/call_executor.rs * Update client/src/call_executor.rs Co-authored-by: Bastian Köcher --- client/src/call_executor.rs | 68 ++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/client/src/call_executor.rs b/client/src/call_executor.rs index 6c685fc1b8..18ad5b113e 100644 --- a/client/src/call_executor.rs +++ b/client/src/call_executor.rs @@ -77,10 +77,14 @@ where extensions: Option, ) -> sp_blockchain::Result> { let mut changes = OverlayedChanges::default(); + let changes_trie = backend::changes_tries_state_at_block( + id, self.backend.changes_trie_storage() + )?; + // make sure to destroy state before exiting this function let state = self.backend.state_at(*id)?; let return_data = StateMachine::new( &state, - backend::changes_tries_state_at_block(id, self.backend.changes_trie_storage())?, + changes_trie, &mut changes, &self.executor, method, @@ -89,12 +93,12 @@ where ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( strategy.get_manager(), None, - )?; + ); { let _lock = self.backend.get_import_lock().read(); self.backend.destroy_state(state)?; } - Ok(return_data.into_encoded()) + Ok(return_data?.into_encoded()) } fn contextual_call< @@ -131,37 +135,36 @@ where _ => {}, } - let mut state = self.backend.state_at(*at)?; let changes_trie_state = backend::changes_tries_state_at_block(at, self.backend.changes_trie_storage())?; - let mut storage_transaction_cache = storage_transaction_cache.map(|c| c.borrow_mut()); + // make sure to destroy state before exiting this function + let mut state = self.backend.state_at(*at)?; let result = match recorder { - Some(recorder) => { - let trie_state = state.as_trie_backend() - .ok_or_else(|| - Box::new(sp_state_machine::ExecutionError::UnableToGenerateProof) - as Box - )?; - - let backend = sp_state_machine::ProvingBackend::new_with_recorder( - trie_state, - recorder.clone(), - ); - - StateMachine::new( - &backend, - changes_trie_state, - &mut *changes.borrow_mut(), - &self.executor, - method, - call_data, - extensions.unwrap_or_default(), + Some(recorder) => state.as_trie_backend() + .ok_or_else(|| + Box::new(sp_state_machine::ExecutionError::UnableToGenerateProof) + as Box ) - // TODO: https://github.com/paritytech/substrate/issues/4455 - // .with_storage_transaction_cache(storage_transaction_cache.as_mut().map(|c| &mut **c)) - .execute_using_consensus_failure_handler(execution_manager, native_call) - } + .and_then(|trie_state| { + let backend = sp_state_machine::ProvingBackend::new_with_recorder( + trie_state, + recorder.clone(), + ); + + StateMachine::new( + &backend, + changes_trie_state, + &mut *changes.borrow_mut(), + &self.executor, + method, + call_data, + extensions.unwrap_or_default(), + ) + // TODO: https://github.com/paritytech/substrate/issues/4455 + // .with_storage_transaction_cache(storage_transaction_cache.as_mut().map(|c| &mut **c)) + .execute_using_consensus_failure_handler(execution_manager, native_call) + }), None => StateMachine::new( &state, changes_trie_state, @@ -173,18 +176,19 @@ where ) .with_storage_transaction_cache(storage_transaction_cache.as_mut().map(|c| &mut **c)) .execute_using_consensus_failure_handler(execution_manager, native_call) - }?; + }; { let _lock = self.backend.get_import_lock().read(); self.backend.destroy_state(state)?; } - Ok(result) + result.map_err(Into::into) } fn runtime_version(&self, id: &BlockId) -> sp_blockchain::Result { let mut overlay = OverlayedChanges::default(); - let state = self.backend.state_at(*id)?; let changes_trie_state = backend::changes_tries_state_at_block(id, self.backend.changes_trie_storage())?; + // make sure to destroy state before exiting this function + let state = self.backend.state_at(*id)?; let mut cache = StorageTransactionCache::::default(); let mut ext = Ext::new( &mut overlay, -- GitLab From dda91c28044b175b999c59e5b01725a9763b6942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 28 Jan 2020 19:33:23 +0100 Subject: [PATCH 196/296] Print extrinsic failed error always, not just on import (#4747) * Print extrinsic failed error always, not just on import Before we printed the error of a transaction only when importing a block, this pr changes it to print the error also at building the block. * Increment `impl_version` --- bin/node/runtime/src/lib.rs | 2 +- frame/executive/src/lib.rs | 3 +-- frame/system/src/lib.rs | 5 ++++- primitives/runtime/src/traits.rs | 6 ++++++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 7e1082ef54..57856dd2f1 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 205, - impl_version: 206, + impl_version: 207, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 0507946ef5..96c79c1073 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -262,8 +262,7 @@ where fn apply_extrinsic_no_note(uxt: Block::Extrinsic) { let l = uxt.encode().len(); match Self::apply_extrinsic_with_len(uxt, l, None) { - Ok(Ok(())) => (), - Ok(Err(e)) => sp_runtime::print(e), + Ok(_) => (), Err(e) => { let err: &'static str = e.into(); panic!(err) }, } } diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 752ab9cc91..4e665fd385 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -852,7 +852,10 @@ impl Module { Self::deposit_event( match r { Ok(()) => Event::ExtrinsicSuccess(info), - Err(err) => Event::ExtrinsicFailed(err.clone(), info), + Err(err) => { + sp_runtime::print(err); + Event::ExtrinsicFailed(err.clone(), info) + }, } ); diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 7d889cae9b..3210b00c6b 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -1216,6 +1216,12 @@ pub trait Printable { fn print(&self); } +impl Printable for &T { + fn print(&self) { + (*self).print() + } +} + impl Printable for u8 { fn print(&self) { (*self as u64).print() -- GitLab From bd8eacc5b38349f52f5129736db060bc09c11f84 Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Tue, 28 Jan 2020 13:33:50 -0500 Subject: [PATCH 197/296] Add decl_error to template module (#4743) * Update template to use decl_error * Test for error on template * Comments * Reorder decl_* blocks: storage, event, error, module * Remove TODOs * Clarify comment on type Error = Error --- bin/node-template/runtime/src/template.rs | 88 +++++++++++++++++------ 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/bin/node-template/runtime/src/template.rs b/bin/node-template/runtime/src/template.rs index a64a4c3216..4ed8066578 100644 --- a/bin/node-template/runtime/src/template.rs +++ b/bin/node-template/runtime/src/template.rs @@ -8,18 +8,18 @@ /// For more guidance on Substrate modules, see the example module /// https://github.com/paritytech/substrate/blob/master/frame/example/src/lib.rs -use frame_support::{decl_module, decl_storage, decl_event, dispatch}; +use frame_support::{decl_module, decl_storage, decl_event, decl_error, dispatch}; use system::ensure_signed; -/// The module's configuration trait. +/// The pallet's configuration trait. pub trait Trait: system::Trait { - // TODO: Add other types and constants required configure this module. + // Add other types and constants required to configure this pallet. /// The overarching event type. type Event: From> + Into<::Event>; } -// This module's storage items. +// This pallet's storage items. decl_storage! { trait Store for Module as TemplateModule { // Just a dummy storage item. @@ -29,48 +29,81 @@ decl_storage! { } } -// The module's dispatchable functions. +// The pallet's events +decl_event!( + pub enum Event where AccountId = ::AccountId { + /// Just a dummy event. + /// Event `Something` is declared with a parameter of the type `u32` and `AccountId` + /// To emit this event, we call the deposit funtion, from our runtime funtions + SomethingStored(u32, AccountId), + } +); + +// The pallet's errors +decl_error! { + pub enum Error for Module { + /// Value was None + NoneValue, + /// Value reached maximum and cannot be incremented further + StorageOverflow, + } +} + +// The pallet's dispatchable functions. decl_module! { /// The module declaration. pub struct Module for enum Call where origin: T::Origin { + // Initializing errors + // this includes information about your errors in the node's metadata. + // it is needed only if you are using errors in your pallet + type Error = Error; + // Initializing events - // this is needed only if you are using events in your module + // this is needed only if you are using events in your pallet fn deposit_event() = default; - // Just a dummy entry point. - // function that can be called by the external world as an extrinsics call - // takes a parameter of the type `AccountId`, stores it and emits an event + /// Just a dummy entry point. + /// function that can be called by the external world as an extrinsics call + /// takes a parameter of the type `AccountId`, stores it, and emits an event pub fn do_something(origin, something: u32) -> dispatch::DispatchResult { - // TODO: You only need this if you want to check it was signed. + // Check it was signed and get the signer. See also: ensure_root and ensure_none let who = ensure_signed(origin)?; - // TODO: Code to execute when something calls this. + // Code to execute when something calls this. // For example: the following line stores the passed in u32 in the storage Something::put(something); - // here we are raising the Something event + // Here we are raising the Something event Self::deposit_event(RawEvent::SomethingStored(something, who)); Ok(()) } + + /// Another dummy entry point. + /// takes no parameters, attempts to increment storage value, and possibly throws an error + pub fn cause_error(origin) -> dispatch::DispatchResult { + // Check it was signed and get the signer. See also: ensure_root and ensure_none + let _who = ensure_signed(origin)?; + + match Something::get() { + None => Err(Error::::NoneValue)?, + Some(old) => { + let new = old.checked_add(1).ok_or(Error::::StorageOverflow)?; + Something::put(new); + Ok(()) + }, + } + } } } -decl_event!( - pub enum Event where AccountId = ::AccountId { - // Just a dummy event. - // Event `Something` is declared with a parameter of the type `u32` and `AccountId` - // To emit this event, we call the deposit funtion, from our runtime funtions - SomethingStored(u32, AccountId), - } -); -/// tests for this module +/// Tests for this pallet #[cfg(test)] mod tests { use super::*; use sp_core::H256; - use frame_support::{impl_outer_origin, assert_ok, parameter_types, weights::Weight}; + use frame_support::{impl_outer_origin, assert_ok, assert_noop, parameter_types, weights::Weight}; use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, testing::Header, Perbill, }; @@ -129,4 +162,15 @@ mod tests { assert_eq!(TemplateModule::something(), Some(42)); }); } + + #[test] + fn correct_error_for_none_value() { + new_test_ext().execute_with(|| { + // Ensure the correct error is thrown on None value + assert_noop!( + TemplateModule::cause_error(Origin::signed(1)), + Error::::NoneValue + ); + }); + } } -- GitLab From 97eab5239239c9d631c2db0fc05fde5df99f988d Mon Sep 17 00:00:00 2001 From: philipstanislaus <6912756+philipstanislaus@users.noreply.github.com> Date: Tue, 28 Jan 2020 20:30:39 +0100 Subject: [PATCH 198/296] Add SS58 network identifier for Centrifuge (#4748) * Add SS58 network identifier for Centrifuge * Bump version --- bin/node/runtime/src/lib.rs | 2 +- primitives/core/src/crypto.rs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 57856dd2f1..24cdbcfbb6 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 205, + spec_version: 207, impl_version: 207, apis: RUNTIME_API_VERSIONS, }; diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index 3cc6c50f76..86a579e499 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -442,6 +442,8 @@ ss58_address_format!( (16, "kulupu", "Kulupu mainnet, direct checksum, standard account (*25519).") EdgewareAccountDirect => (7, "edgeware", "Edgeware mainnet, direct checksum, standard account (*25519).") + CentrifugeAccountDirect => + (36, "centrifuge", "Centrifuge Chain mainnet, direct checksum, standard account (*25519).") ); /// Set the default "version" (actually, this is a bit of a misnomer and the version byte is -- GitLab From e29336bff9400f3522caf042b76bfdc64782f419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 28 Jan 2020 22:34:41 +0100 Subject: [PATCH 199/296] Display `has_api_with` results if invalid version of Offchain Workers is detected. (#4749) * Display error message when checking has_api. * Cargo.lock. --- Cargo.lock | 6 +++--- client/offchain/src/lib.rs | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6720e9c658..ecf929384a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2729,7 +2729,7 @@ dependencies = [ "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8310,7 +8310,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8954,7 +8954,7 @@ dependencies = [ "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" -"checksum yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f937668802a2e862a4fed05267e10b20c310bf771adc89687710706d55a9a65" +"checksum yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "809f4388471d280173404e3d4f889e2d36004960a37d822ce5637fbef33a0ce4" "checksum zeroize 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "45af6a010d13e4cf5b54c94ba5a2b2eba5596b9e46bf5875612d332a1f2b3f86" "checksum zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" "checksum zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index 78760fb011..3cd3b2cba5 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -107,7 +107,11 @@ impl OffchainWorkers< let version = match (has_api_v1, has_api_v2) { (_, Ok(true)) => 2, (Ok(true), _) => 1, - _ => 0, + err => { + let help = "Consider turning off offchain workers if they are not part of your runtime."; + log::error!("Unsupported Offchain Worker API version: {:?}. {}.", err, help); + 0 + } }; debug!("Checking offchain workers at {:?}: version:{}", at, version); if version > 0 { @@ -140,8 +144,6 @@ impl OffchainWorkers< }); futures::future::Either::Left(runner.process()) } else { - let help = "Consider turning off offchain workers if they are not part of your runtime."; - log::error!("Unsupported Offchain Worker API version: {}. {}", version, help); futures::future::Either::Right(futures::future::ready(())) } } -- GitLab From 2241c6b03b567fdd77aea4aa47dac9fad4b5e66b Mon Sep 17 00:00:00 2001 From: Hoani Bryson Date: Wed, 29 Jan 2020 11:30:25 +1300 Subject: [PATCH 200/296] Remove unnecessary duplication in generic asset create (#4744) * Remove unneccessary duplication in generic asset create * Increment impl_version due to refactoring generic_asset --- bin/node/runtime/src/lib.rs | 2 +- frame/generic-asset/src/lib.rs | 16 +--------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 24cdbcfbb6..afd2631373 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 207, - impl_version: 207, + impl_version: 208, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index ca6812da8e..8b7668dc12 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -362,21 +362,7 @@ decl_module! { /// Create a new kind of asset. fn create(origin, options: AssetOptions) -> DispatchResult { let origin = ensure_signed(origin)?; - let id = Self::next_asset_id(); - - let permissions: PermissionVersions = options.permissions.clone().into(); - - // The last available id serves as the overflow mark and won't be used. - let next_id = id.checked_add(&One::one()).ok_or_else(|| Error::::NoIdAvailable)?; - - >::put(next_id); - >::insert(id, &options.initial_issuance); - >::insert(&id, &origin, &options.initial_issuance); - >::insert(&id, permissions); - - Self::deposit_event(RawEvent::Created(id, origin, options)); - - Ok(()) + Self::create_asset(None, Some(origin), options) } /// Transfer some liquid free balance to another account. -- GitLab From acb1b9b3da10c73297b139fcb26cae4928b42879 Mon Sep 17 00:00:00 2001 From: Edwin Date: Wed, 29 Jan 2020 06:31:28 +0800 Subject: [PATCH 201/296] RPC api for offchain storage (#4694) * Rpc api for offchain storage * Replace Vec to Bytes, replace Mutex to RwLock * Remove pub * Modify copyright year --- Cargo.lock | 1 + client/rpc-api/src/lib.rs | 1 + client/rpc-api/src/offchain/error.rs | 51 +++++++++++++++++++++ client/rpc-api/src/offchain/mod.rs | 37 +++++++++++++++ client/rpc/Cargo.toml | 1 + client/rpc/src/lib.rs | 1 + client/rpc/src/offchain/mod.rs | 67 ++++++++++++++++++++++++++++ client/rpc/src/offchain/tests.rs | 36 +++++++++++++++ client/service/src/builder.rs | 31 +++++++++---- primitives/core/src/offchain/mod.rs | 1 + 10 files changed, 218 insertions(+), 9 deletions(-) create mode 100644 client/rpc-api/src/offchain/error.rs create mode 100644 client/rpc-api/src/offchain/mod.rs create mode 100644 client/rpc/src/offchain/mod.rs create mode 100644 client/rpc/src/offchain/tests.rs diff --git a/Cargo.lock b/Cargo.lock index ecf929384a..5d4b97a3c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5768,6 +5768,7 @@ dependencies = [ "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-io 2.0.0", + "sp-offchain 2.0.0", "sp-rpc 2.0.0", "sp-runtime 2.0.0", "sp-session 2.0.0", diff --git a/client/rpc-api/src/lib.rs b/client/rpc-api/src/lib.rs index c9306f2cdd..8ad2d94bfd 100644 --- a/client/rpc-api/src/lib.rs +++ b/client/rpc-api/src/lib.rs @@ -30,5 +30,6 @@ pub use helpers::Receiver; pub mod author; pub mod chain; +pub mod offchain; pub mod state; pub mod system; diff --git a/client/rpc-api/src/offchain/error.rs b/client/rpc-api/src/offchain/error.rs new file mode 100644 index 0000000000..c28a2a2f39 --- /dev/null +++ b/client/rpc-api/src/offchain/error.rs @@ -0,0 +1,51 @@ +// Copyright 2020 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 RPC errors. + +use jsonrpc_core as rpc; + +/// Offchain RPC Result type. +pub type Result = std::result::Result; + +/// Offchain RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Unavailable storage kind error. + #[display(fmt="This storage kind is not available yet.")] + UnavailableStorageKind, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + None + } +} + +/// Base error code for all offchain errors. +const BASE_ERROR: i64 = 5000; + +impl From for rpc::Error { + fn from(e: Error) -> Self { + match e { + Error::UnavailableStorageKind => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message: "This storage kind is not available yet" .into(), + data: None, + }, + } + } +} diff --git a/client/rpc-api/src/offchain/mod.rs b/client/rpc-api/src/offchain/mod.rs new file mode 100644 index 0000000000..bbe466ff59 --- /dev/null +++ b/client/rpc-api/src/offchain/mod.rs @@ -0,0 +1,37 @@ +// Copyright 2020 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 . + +//! Substrate offchain API. + +pub mod error; + +use jsonrpc_derive::rpc; +use self::error::Result; +use sp_core::{Bytes, offchain::StorageKind}; + +pub use self::gen_client::Client as OffchainClient; + +/// Substrate offchain RPC API +#[rpc] +pub trait OffchainApi { + /// Set offchain local storage under given key and prefix. + #[rpc(name = "offchain_localStorageSet")] + fn set_local_storage(&self, kind: StorageKind, key: Bytes, value: Bytes) -> Result<()>; + + /// Get offchain local storage under given key and prefix. + #[rpc(name = "offchain_localStorageGet")] + fn get_local_storage(&self, kind: StorageKind, key: Bytes) -> Result>; +} diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index 6530bff4ed..789ebf565c 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -18,6 +18,7 @@ rpc = { package = "jsonrpc-core", version = "14.0.3" } sp-version = { version = "2.0.0", path = "../../primitives/version" } serde_json = "1.0.41" sp-session = { version = "2.0.0", path = "../../primitives/session" } +sp-offchain = { version = "2.0.0", path = "../../primitives/offchain" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } sp-rpc = { version = "2.0.0", path = "../../primitives/rpc" } sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } diff --git a/client/rpc/src/lib.rs b/client/rpc/src/lib.rs index 3a226a6fb3..ea65785c20 100644 --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -28,5 +28,6 @@ pub use rpc::IoHandlerExtension as RpcExtension; pub mod author; pub mod chain; +pub mod offchain; pub mod state; pub mod system; diff --git a/client/rpc/src/offchain/mod.rs b/client/rpc/src/offchain/mod.rs new file mode 100644 index 0000000000..61984d4845 --- /dev/null +++ b/client/rpc/src/offchain/mod.rs @@ -0,0 +1,67 @@ +// Copyright 2020 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 . + +//! Substrate offchain API. + +#[cfg(test)] +mod tests; + +/// Re-export the API for backward compatibility. +pub use sc_rpc_api::offchain::*; +use self::error::{Error, Result}; +use sp_core::{ + Bytes, + offchain::{OffchainStorage, StorageKind}, +}; +use parking_lot::RwLock; +use std::sync::Arc; + +/// Offchain API +#[derive(Debug)] +pub struct Offchain { + /// Offchain storage + storage: Arc>, +} + +impl Offchain { + /// Create new instance of Offchain API. + pub fn new(storage: T) -> Self { + Offchain { + storage: Arc::new(RwLock::new(storage)), + } + } +} + +impl OffchainApi for Offchain { + /// Set offchain local storage under given key and prefix. + fn set_local_storage(&self, kind: StorageKind, key: Bytes, value: Bytes) -> Result<()> { + let prefix = match kind { + StorageKind::PERSISTENT => sp_offchain::STORAGE_PREFIX, + StorageKind::LOCAL => return Err(Error::UnavailableStorageKind), + }; + self.storage.write().set(prefix, &*key, &*value); + Ok(()) + } + + /// Get offchain local storage under given key and prefix. + fn get_local_storage(&self, kind: StorageKind, key: Bytes) -> Result> { + let prefix = match kind { + StorageKind::PERSISTENT => sp_offchain::STORAGE_PREFIX, + StorageKind::LOCAL => return Err(Error::UnavailableStorageKind), + }; + Ok(self.storage.read().get(prefix, &*key).map(Into::into)) + } +} diff --git a/client/rpc/src/offchain/tests.rs b/client/rpc/src/offchain/tests.rs new file mode 100644 index 0000000000..ac1a6a4de3 --- /dev/null +++ b/client/rpc/src/offchain/tests.rs @@ -0,0 +1,36 @@ +// Copyright 2020 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 super::*; +use assert_matches::assert_matches; +use sp_core::{Bytes, offchain::storage::InMemOffchainStorage}; + +#[test] +fn local_storage_should_work() { + let storage = InMemOffchainStorage::default(); + let offchain = Offchain::new(storage); + let key = Bytes(b"offchain_storage".to_vec()); + let value = Bytes(b"offchain_value".to_vec()); + + assert_matches!( + offchain.set_local_storage(StorageKind::PERSISTENT, key.clone(), value.clone()), + Ok(()) + ); + assert_matches!( + offchain.get_local_storage(StorageKind::PERSISTENT, key), + Ok(Some(ref v)) if *v == value + ); +} diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 9b27a5b270..d3f1362bfc 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -863,7 +863,7 @@ ServiceBuilder< let network_status_sinks = Arc::new(Mutex::new(status_sinks::StatusSinks::new())); let offchain_storage = backend.offchain_storage(); - let offchain_workers = match (config.offchain_worker, offchain_storage) { + let offchain_workers = match (config.offchain_worker, offchain_storage.clone()) { (true, Some(db)) => { Some(Arc::new(sc_offchain::OffchainWorkers::new(client.clone(), db))) }, @@ -1008,7 +1008,7 @@ ServiceBuilder< // RPC let (system_rpc_tx, system_rpc_rx) = mpsc::unbounded(); let gen_handler = || { - use sc_rpc::{chain, state, author, system}; + use sc_rpc::{chain, state, author, system, offchain}; let system_info = sc_rpc::system::SystemInfo { chain_name: config.chain_spec.name().into(), @@ -1054,13 +1054,26 @@ ServiceBuilder< ); let system = system::System::new(system_info, system_rpc_tx.clone()); - sc_rpc_server::rpc_handler(( - state::StateApi::to_delegate(state), - chain::ChainApi::to_delegate(chain), - author::AuthorApi::to_delegate(author), - system::SystemApi::to_delegate(system), - rpc_extensions.clone(), - )) + match offchain_storage.clone() { + Some(storage) => { + let offchain = sc_rpc::offchain::Offchain::new(storage); + sc_rpc_server::rpc_handler(( + state::StateApi::to_delegate(state), + chain::ChainApi::to_delegate(chain), + offchain::OffchainApi::to_delegate(offchain), + author::AuthorApi::to_delegate(author), + system::SystemApi::to_delegate(system), + rpc_extensions.clone(), + )) + }, + None => sc_rpc_server::rpc_handler(( + state::StateApi::to_delegate(state), + chain::ChainApi::to_delegate(chain), + author::AuthorApi::to_delegate(author), + system::SystemApi::to_delegate(system), + rpc_extensions.clone(), + )) + } }; let rpc_handlers = gen_handler(); let rpc = start_rpc_servers(&config, gen_handler)?; diff --git a/primitives/core/src/offchain/mod.rs b/primitives/core/src/offchain/mod.rs index e2e00c36e0..425957a21f 100644 --- a/primitives/core/src/offchain/mod.rs +++ b/primitives/core/src/offchain/mod.rs @@ -50,6 +50,7 @@ pub trait OffchainStorage: Clone + Send + Sync { /// A type of supported crypto. #[derive(Clone, Copy, PartialEq, Eq, Encode, Decode, RuntimeDebug, PassByEnum)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] #[repr(C)] pub enum StorageKind { /// Persistent storage is non-revertible and not fork-aware. It means that any value -- GitLab From 8f4495886a98d4a867d3f3813a8bf4dc6bca3a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 29 Jan 2020 09:52:54 +0100 Subject: [PATCH 202/296] Don't run dev light client as validator (#4757) A light client can not be a validator, so we should not set `authority == true` in dev mode. --- client/cli/src/lib.rs | 8 +++++--- client/cli/src/params.rs | 5 ++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index fc50259528..d9ea238ba0 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -998,9 +998,11 @@ where fill_config_keystore_password_and_path(&mut config, &cli)?; let is_dev = cli.shared_params.dev; - let is_authority = cli.validator || cli.sentry || is_dev || cli.keyring.account.is_some(); + let is_light = cli.light; + let is_authority = (cli.validator || cli.sentry || is_dev || cli.keyring.account.is_some()) + && !is_light; let role = - if cli.light { + if is_light { sc_service::Roles::LIGHT } else if is_authority { sc_service::Roles::AUTHORITY @@ -1056,7 +1058,7 @@ where config.dev_key_seed = cli.keyring.account .map(|a| format!("//{}", a)).or_else(|| { - if is_dev { + if is_dev && !is_light { Some("//Alice".into()) } else { None diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 57b90c2e73..ccaf24454d 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -417,7 +417,10 @@ pub struct RunCmd { pub no_grandpa: bool, /// Experimental: Run in light client mode. - #[structopt(long = "light")] + #[structopt( + long = "light", + conflicts_with_all = &[ "validator" ] + )] pub light: bool, /// Listen to all RPC interfaces. -- GitLab From 38c5ed0af7740d55993e91bdc9001cc17446180f Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 29 Jan 2020 11:46:39 +0100 Subject: [PATCH 203/296] Add diagnostics to tasks (#4752) --- Cargo.lock | 21 +++++- bin/node-template/src/service.rs | 6 +- bin/node/cli/src/service.rs | 7 +- client/service/Cargo.toml | 1 + client/service/src/builder.rs | 62 ++++++++++++------ client/service/src/lib.rs | 64 ++++++++++++------- client/transaction-pool/Cargo.toml | 1 + client/transaction-pool/src/api.rs | 4 +- primitives/consensus/common/Cargo.toml | 1 + .../common/src/import_queue/basic_queue.rs | 2 +- 10 files changed, 117 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d4b97a3c6..16100cee87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1513,6 +1513,21 @@ dependencies = [ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "futures-diagnose" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "futures-executor" version = "0.3.1" @@ -5835,6 +5850,7 @@ dependencies = [ "exit-future 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "grafana-data-source 0.8.0", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5969,6 +5985,7 @@ version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6415,6 +6432,7 @@ version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7700,7 +7718,7 @@ name = "twox-hash" version = "1.5.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.7.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8528,6 +8546,7 @@ dependencies = [ "checksum futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866" "checksum futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "b35b6263fb1ef523c3056565fa67b1d16f0a8604ff12b11b08c25f28a734c60a" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +"checksum futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbb8371dd6ee87aa2aeaa8458a372fd82fe216032387b766255754c92dd7271" "checksum futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231" "checksum futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff" "checksum futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764" diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index 8a5c660b23..a396a5301c 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -131,7 +131,7 @@ pub fn new_full(config: Configuration(config: Configuration { // start the lightweight GRANDPA observer - service.spawn_task(grandpa::run_grandpa_observer( + service.spawn_task("grandpa-observer", grandpa::run_grandpa_observer( grandpa_config, grandpa_link, service.network(), @@ -178,7 +178,7 @@ pub fn new_full(config: Configuration { grandpa::setup_disabled_grandpa( diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 2aaca315b9..32f2d0001c 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -172,7 +172,7 @@ macro_rules! new_full { }; let babe = sc_consensus_babe::start_babe(babe_config)?; - service.spawn_essential_task(babe); + service.spawn_essential_task("babe-proposer", babe); let network = service.network(); let dht_event_stream = network.event_stream().filter_map(|e| async move { match e { @@ -187,7 +187,7 @@ macro_rules! new_full { dht_event_stream, ); - service.spawn_task(authority_discovery); + service.spawn_task("authority-discovery", authority_discovery); } // if the node isn't actively participating in consensus then it doesn't @@ -211,7 +211,7 @@ macro_rules! new_full { match (is_authority, disable_grandpa) { (false, false) => { // start the lightweight GRANDPA observer - service.spawn_task(grandpa::run_grandpa_observer( + service.spawn_task("grandpa-observer", grandpa::run_grandpa_observer( config, grandpa_link, service.network(), @@ -234,6 +234,7 @@ macro_rules! new_full { // the GRANDPA voter task is considered infallible, i.e. // if it fails we take down the service with it. service.spawn_essential_task( + "grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)? ); }, diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 095136a11c..f5b3b71914 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -17,6 +17,7 @@ wasmtime = [ derive_more = "0.99.2" futures01 = { package = "futures", version = "0.1.29" } futures = "0.3.1" +futures-diagnose = "1.0" parking_lot = "0.9.0" lazy_static = "1.4.0" log = "0.4.8" diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index d3f1362bfc..548a0c6170 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -44,6 +44,7 @@ use sp_runtime::traits::{ use sp_api::ProvideRuntimeApi; use sc_executor::{NativeExecutor, NativeExecutionDispatch}; use std::{ + borrow::Cow, io::{Read, Write, Seek}, marker::PhantomData, sync::Arc, time::SystemTime, pin::Pin }; @@ -791,7 +792,7 @@ ServiceBuilder< // List of asynchronous tasks to spawn. We collect them, then spawn them all at once. let (to_spawn_tx, to_spawn_rx) = - mpsc::unbounded:: + Send>>>(); + mpsc::unbounded::<(Pin + Send>>, Cow<'static, str>)>(); // A side-channel for essential tasks to communicate shutdown. let (essential_failed_tx, essential_failed_rx) = mpsc::unbounded(); @@ -816,7 +817,7 @@ ServiceBuilder< imports_external_transactions: !config.roles.is_light(), pool: transaction_pool.clone(), client: client.clone(), - executor: Arc::new(SpawnTaskHandle { sender: to_spawn_tx.clone(), on_exit: exit.clone() }), + executor: SpawnTaskHandle { sender: to_spawn_tx.clone(), on_exit: exit.clone() }, }); let protocol_id = { @@ -840,7 +841,7 @@ ServiceBuilder< executor: { let to_spawn_tx = to_spawn_tx.clone(); Some(Box::new(move |fut| { - if let Err(e) = to_spawn_tx.unbounded_send(fut) { + if let Err(e) = to_spawn_tx.unbounded_send((fut, From::from("libp2p-node"))) { error!("Failed to spawn libp2p background task: {:?}", e); } })) @@ -891,7 +892,10 @@ ServiceBuilder< &BlockId::hash(notification.hash), ¬ification.retracted, ); - let _ = to_spawn_tx_.unbounded_send(Box::pin(future)); + let _ = to_spawn_tx_.unbounded_send(( + Box::pin(future), + From::from("txpool-maintain") + )); } let offchain = offchain.as_ref().and_then(|o| o.upgrade()); @@ -901,12 +905,18 @@ ServiceBuilder< network_state_info.clone(), is_validator ); - let _ = to_spawn_tx_.unbounded_send(Box::pin(future)); + let _ = to_spawn_tx_.unbounded_send(( + Box::pin(future), + From::from("offchain-on-block") + )); } ready(()) }); - let _ = to_spawn_tx.unbounded_send(Box::pin(select(events, exit.clone()).map(drop))); + let _ = to_spawn_tx.unbounded_send(( + Box::pin(select(events, exit.clone()).map(drop)), + From::from("txpool-and-offchain-notif") + )); } { @@ -926,7 +936,10 @@ ServiceBuilder< ready(()) }); - let _ = to_spawn_tx.unbounded_send(Box::pin(select(events, exit.clone()).map(drop))); + let _ = to_spawn_tx.unbounded_send(( + Box::pin(select(events, exit.clone()).map(drop)), + From::from("telemetry-on-block") + )); } // Periodically notify the telemetry. @@ -990,7 +1003,10 @@ ServiceBuilder< ready(()) }); - let _ = to_spawn_tx.unbounded_send(Box::pin(select(tel_task, exit.clone()).map(drop))); + let _ = to_spawn_tx.unbounded_send(( + Box::pin(select(tel_task, exit.clone()).map(drop)), + From::from("telemetry-periodic-send") + )); // Periodically send the network state to the telemetry. let (netstat_tx, netstat_rx) = mpsc::unbounded::<(NetworkStatus<_>, NetworkState)>(); @@ -1003,7 +1019,10 @@ ServiceBuilder< ); ready(()) }); - let _ = to_spawn_tx.unbounded_send(Box::pin(select(tel_task_2, exit.clone()).map(drop))); + let _ = to_spawn_tx.unbounded_send(( + Box::pin(select(tel_task_2, exit.clone()).map(drop)), + From::from("telemetry-periodic-network-state") + )); // RPC let (system_rpc_tx, system_rpc_rx) = mpsc::unbounded(); @@ -1079,14 +1098,17 @@ ServiceBuilder< let rpc = start_rpc_servers(&config, gen_handler)?; - let _ = to_spawn_tx.unbounded_send(Box::pin(select(build_network_future( - config.roles, - network_mut, - client.clone(), - network_status_sinks.clone(), - system_rpc_rx, - has_bootnodes, - ), exit.clone()).map(drop))); + let _ = to_spawn_tx.unbounded_send(( + Box::pin(select(build_network_future( + config.roles, + network_mut, + client.clone(), + network_status_sinks.clone(), + system_rpc_rx, + has_bootnodes, + ), exit.clone()).map(drop)), + From::from("network-worker") + )); let telemetry_connection_sinks: Arc>>> = Default::default(); @@ -1127,9 +1149,9 @@ ServiceBuilder< }); ready(()) }); - let _ = to_spawn_tx.unbounded_send(Box::pin(select( + let _ = to_spawn_tx.unbounded_send((Box::pin(select( future, exit.clone() - ).map(drop))); + ).map(drop)), From::from("telemetry-worker"))); telemetry }); @@ -1140,7 +1162,7 @@ ServiceBuilder< exit.clone() ).map(drop); - let _ = to_spawn_tx.unbounded_send(Box::pin(future)); + let _ = to_spawn_tx.unbounded_send((Box::pin(future), From::from("grafana-server"))); } // Instrumentation diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index c7069ac6e5..3bd8f6d290 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -27,7 +27,7 @@ pub mod error; mod builder; mod status_sinks; -use std::{io, pin::Pin}; +use std::{borrow::Cow, io, pin::Pin}; use std::marker::PhantomData; use std::net::SocketAddr; use std::collections::HashMap; @@ -42,7 +42,7 @@ use futures::{ future::select, channel::mpsc, compat::*, sink::SinkExt, - task::{Spawn, SpawnExt, FutureObj, SpawnError}, + task::{Spawn, FutureObj, SpawnError}, }; use sc_network::{ NetworkService, NetworkState, specialization::NetworkSpecialization, @@ -92,9 +92,9 @@ pub struct Service { /// A receiver for spawned essential-tasks concluding. essential_failed_rx: mpsc::UnboundedReceiver<()>, /// Sender for futures that must be spawned as background tasks. - to_spawn_tx: mpsc::UnboundedSender + Send>>>, + to_spawn_tx: mpsc::UnboundedSender<(Pin + Send>>, Cow<'static, str>)>, /// Receiver for futures that must be spawned as background tasks. - to_spawn_rx: mpsc::UnboundedReceiver + Send>>>, + to_spawn_rx: mpsc::UnboundedReceiver<(Pin + Send>>, Cow<'static, str>)>, /// How to spawn background tasks. tasks_executor: Box + Send>>) + Send>, rpc_handlers: sc_rpc_server::RpcHandler, @@ -112,15 +112,29 @@ pub type TaskExecutor = Arc; /// An handle for spawning tasks in the service. #[derive(Clone)] pub struct SpawnTaskHandle { - sender: mpsc::UnboundedSender + Send>>>, + sender: mpsc::UnboundedSender<(Pin + Send>>, Cow<'static, str>)>, on_exit: exit_future::Exit, } +impl SpawnTaskHandle { + /// Spawns the given task with the given name. + pub fn spawn(&self, name: impl Into>, task: impl Future + Send + 'static) { + let on_exit = self.on_exit.clone(); + let future = async move { + futures::pin_mut!(task); + let _ = select(on_exit, task).await; + }; + if self.sender.unbounded_send((Box::pin(future), name.into())).is_err() { + error!("Failed to send task to spawn over channel"); + } + } +} + impl Spawn for SpawnTaskHandle { fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> { let future = select(self.on_exit.clone(), future).map(drop); - self.sender.unbounded_send(Box::pin(future)) + self.sender.unbounded_send((Box::pin(future), From::from("unnamed"))) .map_err(|_| SpawnError::shutdown()) } } @@ -129,7 +143,7 @@ type Boxed01Future01 = Box + Send + impl futures01::future::Executor for SpawnTaskHandle { fn execute(&self, future: Boxed01Future01) -> Result<(), futures01::future::ExecuteError>{ - self.spawn(future.compat().map(drop)); + self.spawn("unnamed", future.compat().map(drop)); Ok(()) } } @@ -159,12 +173,12 @@ pub trait AbstractService: 'static + Future> + fn telemetry(&self) -> Option; /// Spawns a task in the background that runs the future passed as parameter. - fn spawn_task(&self, task: impl Future + Send + Unpin + 'static); + fn spawn_task(&self, name: impl Into>, task: impl Future + Send + 'static); /// Spawns a task in the background that runs the future passed as /// parameter. The given task is considered essential, i.e. if it errors we /// trigger a service exit. - fn spawn_essential_task(&self, task: impl Future + Send + Unpin + 'static); + fn spawn_essential_task(&self, name: impl Into>, task: impl Future + Send + 'static); /// Returns a handle for spawning tasks. fn spawn_task_handle(&self) -> SpawnTaskHandle; @@ -238,12 +252,16 @@ where self.keystore.clone() } - fn spawn_task(&self, task: impl Future + Send + Unpin + 'static) { - let task = select(self.on_exit(), task).map(drop); - let _ = self.to_spawn_tx.unbounded_send(Box::pin(task)); + fn spawn_task(&self, name: impl Into>, task: impl Future + Send + 'static) { + let on_exit = self.on_exit(); + let task = async move { + futures::pin_mut!(task); + let _ = select(on_exit, task).await; + }; + let _ = self.to_spawn_tx.unbounded_send((Box::pin(task), name.into())); } - fn spawn_essential_task(&self, task: impl Future + Send + Unpin + 'static) { + fn spawn_essential_task(&self, name: impl Into>, task: impl Future + Send + 'static) { let mut essential_failed = self.essential_failed_tx.clone(); let essential_task = std::panic::AssertUnwindSafe(task) .catch_unwind() @@ -251,9 +269,13 @@ where error!("Essential task failed. Shutting down service."); let _ = essential_failed.send(()); }); - let task = select(self.on_exit(), essential_task).map(drop); + let on_exit = self.on_exit(); + let task = async move { + futures::pin_mut!(essential_task); + let _ = select(on_exit, essential_task).await; + }; - let _ = self.to_spawn_tx.unbounded_send(Box::pin(task)); + let _ = self.to_spawn_tx.unbounded_send((Box::pin(task), name.into())); } fn spawn_task_handle(&self) -> SpawnTaskHandle { @@ -317,8 +339,8 @@ impl Future for } } - while let Poll::Ready(Some(task_to_spawn)) = Pin::new(&mut this.to_spawn_rx).poll_next(cx) { - (this.tasks_executor)(task_to_spawn); + while let Poll::Ready(Some((task_to_spawn, name))) = Pin::new(&mut this.to_spawn_rx).poll_next(cx) { + (this.tasks_executor)(Box::pin(futures_diagnose::diagnose(name, task_to_spawn))); } // The service future never ends. @@ -333,7 +355,7 @@ impl Spawn for &self, future: FutureObj<'static, ()> ) -> Result<(), SpawnError> { - self.to_spawn_tx.unbounded_send(Box::pin(future)) + self.to_spawn_tx.unbounded_send((Box::pin(future), From::from("unnamed"))) .map_err(|_| SpawnError::shutdown()) } } @@ -575,7 +597,7 @@ pub struct TransactionPoolAdapter { imports_external_transactions: bool, pool: Arc

, client: Arc, - executor: TaskExecutor, + executor: SpawnTaskHandle, } /// Get transactions for propagation. @@ -649,9 +671,7 @@ where } }); - if let Err(e) = self.executor.spawn(Box::new(import_future)) { - warn!("Error scheduling extrinsic import: {:?}", e); - } + self.executor.spawn("extrinsic-import", import_future); } Err(e) => debug!("Error decoding transaction {}", e), } diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index c3cd8c9838..855c7bd40d 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" codec = { package = "parity-scale-codec", version = "1.0.0" } derive_more = "0.99.2" futures = { version = "0.3.1", features = ["compat"] } +futures-diagnose = "1.0" log = "0.4.8" parking_lot = "0.9.0" sp-core = { path = "../../primitives/core" } diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index 1bf6348214..bfc13c01fd 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -87,13 +87,13 @@ impl sc_transaction_graph::ChainApi for FullChainApi BasicQueue { let manual_poll; if let Some(pool) = &mut pool { - pool.spawn_ok(future); + pool.spawn_ok(futures_diagnose::diagnose("import-queue", future)); manual_poll = None; } else { manual_poll = Some(Box::pin(future) as Pin>); -- GitLab From 0f0cc75608e7302670fb560da4612c50179ef069 Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Wed, 29 Jan 2020 11:57:13 +0100 Subject: [PATCH 204/296] clarify licensing (#4755) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * adding license fields to all crates * Apply suggestions from code review Co-Authored-By: Bastian Köcher Co-authored-by: Bastian Köcher --- .maintain/node-template-release/Cargo.toml | 1 + Cargo.lock | 12 +----------- bin/node-template/Cargo.toml | 1 + bin/node-template/runtime/Cargo.toml | 1 + bin/node/cli/Cargo.toml | 1 + bin/node/executor/Cargo.toml | 1 + bin/node/primitives/Cargo.toml | 1 + bin/node/rpc-client/Cargo.toml | 1 + bin/node/rpc/Cargo.toml | 1 + bin/node/runtime/Cargo.toml | 2 ++ bin/node/testing/Cargo.toml | 1 + bin/node/transaction-factory/Cargo.toml | 1 + bin/utils/chain-spec-builder/Cargo.toml | 1 + bin/utils/subkey/Cargo.toml | 1 + client/Cargo.toml | 1 + client/api/Cargo.toml | 1 + client/authority-discovery/Cargo.toml | 1 + client/basic-authorship/Cargo.toml | 1 + client/block-builder/Cargo.toml | 1 + client/chain-spec/Cargo.toml | 1 + client/chain-spec/derive/Cargo.toml | 1 + client/cli/Cargo.toml | 1 + client/consensus/aura/Cargo.toml | 1 + client/consensus/babe/Cargo.toml | 1 + client/consensus/manual-seal/Cargo.toml | 1 + client/consensus/pow/Cargo.toml | 1 + client/consensus/slots/Cargo.toml | 1 + client/consensus/uncles/Cargo.toml | 1 + client/db/Cargo.toml | 3 ++- client/db/src/upgrade.rs | 6 +++--- client/executor/Cargo.toml | 1 + client/executor/common/Cargo.toml | 1 + client/executor/runtime-test/Cargo.toml | 1 + client/executor/wasmi/Cargo.toml | 1 + client/executor/wasmtime/Cargo.toml | 1 + client/finality-grandpa/Cargo.toml | 1 + client/keystore/Cargo.toml | 1 + client/rpc-api/Cargo.toml | 1 + client/rpc-servers/Cargo.toml | 1 + client/rpc/Cargo.toml | 1 + client/service/Cargo.toml | 1 + client/service/test/Cargo.toml | 1 + client/state-db/Cargo.toml | 1 + client/telemetry/Cargo.toml | 1 + client/transaction-pool/Cargo.toml | 1 + client/transaction-pool/graph/Cargo.toml | 1 + frame/assets/Cargo.toml | 1 + frame/aura/Cargo.toml | 1 + frame/authority-discovery/Cargo.toml | 1 + frame/authorship/Cargo.toml | 1 + frame/babe/Cargo.toml | 1 + frame/balances/Cargo.toml | 1 + frame/collective/Cargo.toml | 1 + frame/contracts/Cargo.toml | 1 + frame/contracts/rpc/Cargo.toml | 1 + frame/contracts/rpc/runtime-api/Cargo.toml | 1 + frame/democracy/Cargo.toml | 1 + frame/elections-phragmen/Cargo.toml | 1 + frame/elections/Cargo.toml | 1 + frame/evm/Cargo.toml | 1 + frame/example/Cargo.toml | 1 + frame/executive/Cargo.toml | 1 + frame/finality-tracker/Cargo.toml | 1 + frame/generic-asset/Cargo.toml | 1 + frame/grandpa/Cargo.toml | 1 + frame/identity/Cargo.toml | 1 + frame/im-online/Cargo.toml | 1 + frame/indices/Cargo.toml | 1 + frame/membership/Cargo.toml | 1 + frame/metadata/Cargo.toml | 1 + frame/nicks/Cargo.toml | 1 + frame/offences/Cargo.toml | 1 + frame/randomness-collective-flip/Cargo.toml | 1 + frame/recovery/Cargo.toml | 1 + frame/scored-pool/Cargo.toml | 1 + frame/session/Cargo.toml | 3 ++- frame/society/Cargo.toml | 1 + frame/staking/Cargo.toml | 1 + frame/staking/reward-curve/Cargo.toml | 1 + frame/sudo/Cargo.toml | 1 + frame/support/Cargo.toml | 1 + frame/support/procedural/Cargo.toml | 1 + frame/support/procedural/tools/Cargo.toml | 1 + frame/support/procedural/tools/derive/Cargo.toml | 1 + frame/support/test/Cargo.toml | 1 + frame/system/Cargo.toml | 1 + frame/system/rpc/runtime-api/Cargo.toml | 1 + frame/timestamp/Cargo.toml | 1 + frame/transaction-payment/Cargo.toml | 1 + frame/transaction-payment/rpc/Cargo.toml | 1 + frame/transaction-payment/rpc/runtime-api/Cargo.toml | 1 + frame/treasury/Cargo.toml | 1 + frame/utility/Cargo.toml | 1 + primitives/allocator/Cargo.toml | 1 + primitives/api/Cargo.toml | 1 + primitives/api/proc-macro/Cargo.toml | 1 + primitives/api/test/Cargo.toml | 1 + primitives/application-crypto/Cargo.toml | 1 + primitives/application-crypto/test/Cargo.toml | 1 + primitives/arithmetic/Cargo.toml | 1 + primitives/arithmetic/fuzzer/Cargo.toml | 1 + primitives/authority-discovery/Cargo.toml | 1 + primitives/authorship/Cargo.toml | 1 + primitives/block-builder/Cargo.toml | 1 + primitives/blockchain/Cargo.toml | 1 + primitives/consensus/aura/Cargo.toml | 1 + primitives/consensus/babe/Cargo.toml | 1 + primitives/consensus/common/Cargo.toml | 1 + primitives/consensus/pow/Cargo.toml | 1 + primitives/core/Cargo.toml | 1 + primitives/debug-derive/Cargo.toml | 1 + primitives/finality-grandpa/Cargo.toml | 1 + primitives/finality-tracker/Cargo.toml | 1 + primitives/inherents/Cargo.toml | 1 + primitives/io/Cargo.toml | 1 + primitives/keyring/Cargo.toml | 1 + primitives/panic-handler/Cargo.toml | 1 + primitives/phragmen/Cargo.toml | 1 + primitives/rpc/Cargo.toml | 1 + primitives/runtime-interface/Cargo.toml | 1 + primitives/runtime-interface/proc-macro/Cargo.toml | 1 + primitives/runtime-interface/test-wasm/Cargo.toml | 1 + primitives/runtime-interface/test/Cargo.toml | 1 + primitives/runtime/Cargo.toml | 1 + primitives/sandbox/Cargo.toml | 1 + primitives/serializer/Cargo.toml | 1 + primitives/session/Cargo.toml | 1 + primitives/staking/Cargo.toml | 1 + primitives/state-machine/Cargo.toml | 1 + primitives/std/Cargo.toml | 1 + primitives/storage/Cargo.toml | 1 + primitives/test-primitives/Cargo.toml | 1 + primitives/timestamp/Cargo.toml | 1 + primitives/transaction-pool/Cargo.toml | 1 + primitives/version/Cargo.toml | 1 + primitives/wasm-interface/Cargo.toml | 1 + test-utils/Cargo.toml | 1 + test-utils/client/Cargo.toml | 1 + test-utils/runtime/Cargo.toml | 1 + test-utils/runtime/client/Cargo.toml | 1 + utils/browser/Cargo.toml | 1 + utils/build-script-utils/Cargo.toml | 1 + utils/fork-tree/Cargo.toml | 1 + utils/frame/rpc/support/Cargo.toml | 1 + utils/frame/rpc/system/Cargo.toml | 1 + 145 files changed, 150 insertions(+), 16 deletions(-) diff --git a/.maintain/node-template-release/Cargo.toml b/.maintain/node-template-release/Cargo.toml index 8a43435b20..606def19bb 100644 --- a/.maintain/node-template-release/Cargo.toml +++ b/.maintain/node-template-release/Cargo.toml @@ -3,6 +3,7 @@ name = "node-template-release" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] toml = "0.4" diff --git a/Cargo.lock b/Cargo.lock index 16100cee87..88b73133f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5308,7 +5308,7 @@ dependencies = [ "sp-state-machine 0.8.0", "sp-trie 2.0.0", "substrate-test-runtime-client 2.0.0", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7203,15 +7203,6 @@ name = "target_info" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "tempdir" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tempfile" version = "3.1.0" @@ -8861,7 +8852,6 @@ dependencies = [ "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4" "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.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" "checksum test-case 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a605baa797821796a751f4a959e1206079b24a4b7e1ed302b7d785d81a9276c9" diff --git a/bin/node-template/Cargo.toml b/bin/node-template/Cargo.toml index cf3d7509f4..9ad91a973c 100644 --- a/bin/node-template/Cargo.toml +++ b/bin/node-template/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Anonymous"] build = "build.rs" edition = "2018" +license = "Unlicense" [[bin]] name = "node-template" diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index e048d8baf7..299e78996a 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -3,6 +3,7 @@ name = "node-template-runtime" version = "2.0.0" authors = ["Anonymous"] edition = "2018" +license = "Unlicense" [dependencies] aura = { version = "2.0.0", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index c81cf38a9c..585c3f57d6 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." build = "build.rs" edition = "2018" +license = "GPL-3.0" default-run = "substrate" [badges] diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 6e624e09d2..0d68b70522 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0" } diff --git a/bin/node/primitives/Cargo.toml b/bin/node/primitives/Cargo.toml index 1ecfd76792..5fc6ce8f10 100644 --- a/bin/node/primitives/Cargo.toml +++ b/bin/node/primitives/Cargo.toml @@ -3,6 +3,7 @@ name = "node-primitives" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-core = { version = "2.0.0", default-features = false, path = "../../../primitives/core" } diff --git a/bin/node/rpc-client/Cargo.toml b/bin/node/rpc-client/Cargo.toml index 5ef9d1e99d..0d8106dcee 100644 --- a/bin/node/rpc-client/Cargo.toml +++ b/bin/node/rpc-client/Cargo.toml @@ -3,6 +3,7 @@ name = "node-rpc-client" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] env_logger = "0.7.0" diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index 174b287516..289d20ea01 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -3,6 +3,7 @@ name = "node-rpc" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sc-client = { version = "0.8", path = "../../../client/" } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 27b1e9382f..35f01e32cb 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -4,8 +4,10 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" +license = "GPL-3.0" [dependencies] + # third-party dependencies codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false, features = ["derive"] } integer-sqrt = { version = "0.1.2" } diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index 37e85452d5..051460e839 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] description = "Test utilities for Substrate node." edition = "2018" +license = "GPL-3.0" [dependencies] pallet-balances = { version = "2.0.0", path = "../../../frame/balances" } diff --git a/bin/node/transaction-factory/Cargo.toml b/bin/node/transaction-factory/Cargo.toml index f32a3c23e0..cd40e2f0d9 100644 --- a/bin/node/transaction-factory/Cargo.toml +++ b/bin/node/transaction-factory/Cargo.toml @@ -3,6 +3,7 @@ name = "node-transaction-factory" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-block-builder = { version = "2.0.0", path = "../../../primitives/block-builder" } diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index c8d79afbce..b4707a5eb4 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" +license = "GPL-3.0" [dependencies] ansi_term = "0.12.1" diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index b4398d9f8b..9b7db6699f 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -3,6 +3,7 @@ name = "subkey" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] futures = "0.1.29" diff --git a/client/Cargo.toml b/client/Cargo.toml index 7413fc23f9..6437d699d1 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-client" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sc-block-builder = { version = "0.8", path = "block-builder" } diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 651ee1434f..ac47537e79 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-client-api" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 6e4570a540..0c267cbcc6 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" +license = "GPL-3.0" [build-dependencies] prost-build = "0.5.0" diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index 8fa0b9f5cc..68bd4d87f2 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-basic-authorship" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] log = "0.4.8" diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index 29531c4288..383a931b2f 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-block-builder" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } diff --git a/client/chain-spec/Cargo.toml b/client/chain-spec/Cargo.toml index fee166df32..222914145e 100644 --- a/client/chain-spec/Cargo.toml +++ b/client/chain-spec/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-chain-spec" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sc-chain-spec-derive = { version = "2.0.0", path = "./derive" } diff --git a/client/chain-spec/derive/Cargo.toml b/client/chain-spec/derive/Cargo.toml index 1086440664..566948883b 100644 --- a/client/chain-spec/derive/Cargo.toml +++ b/client/chain-spec/derive/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-chain-spec-derive" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [lib] proc-macro = true diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index b46e3992b2..020ae164ef 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" +license = "GPL-3.0" [dependencies] clap = "2.33.0" diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index 3d4c5a9157..4f15a11302 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", path = "../../../primitives/application-crypto" } diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 55b0e0cf20..124304093f 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "BABE consensus algorithm for substrate" edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index 83d7535dae..821b314501 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Manual sealing engine for Substrate" edition = "2018" +license = "GPL-3.0" [dependencies] derive_more = "0.99.2" diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index bf0efa6c08..b31d9406e1 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "PoW consensus algorithm for substrate" edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index 89ee14b8fa..d9b55bb07d 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Parity Technologies "] description = "Generic slots-based utilities for consensus" edition = "2018" build = "build.rs" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0" } diff --git a/client/consensus/uncles/Cargo.toml b/client/consensus/uncles/Cargo.toml index 54789c5794..f336564c4e 100644 --- a/client/consensus/uncles/Cargo.toml +++ b/client/consensus/uncles/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Generic uncle inclusion utilities for consensus" edition = "2018" +license = "GPL-3.0" [dependencies] sc-client-api = { version = "2.0.0", path = "../../api" } diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index dcc7df29ca..ae6445c8d3 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-client-db" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] parking_lot = "0.9.0" @@ -32,7 +33,7 @@ substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/ru env_logger = "0.7.0" quickcheck = "0.9" kvdb-rocksdb = "0.4" -tempdir = "0.3" +tempfile = "3" [features] default = [] diff --git a/client/db/src/upgrade.rs b/client/db/src/upgrade.rs index ab2d4bbf79..69230e7851 100644 --- a/client/db/src/upgrade.rs +++ b/client/db/src/upgrade.rs @@ -172,14 +172,14 @@ mod tests { #[test] fn downgrade_never_happens() { - let db_dir = tempdir::TempDir::new("").unwrap(); + let db_dir = tempfile::TempDir::new().unwrap(); create_db(db_dir.path(), Some(CURRENT_VERSION + 1)); assert!(open_database(db_dir.path()).is_err()); } #[test] fn open_empty_database_works() { - let db_dir = tempdir::TempDir::new("").unwrap(); + let db_dir = tempfile::TempDir::new().unwrap(); open_database(db_dir.path()).unwrap(); open_database(db_dir.path()).unwrap(); assert_eq!(current_version(db_dir.path()).unwrap(), CURRENT_VERSION); @@ -188,7 +188,7 @@ mod tests { #[test] fn upgrade_from_0_to_1_works() { for version_from_file in &[None, Some(0)] { - let db_dir = tempdir::TempDir::new("").unwrap(); + let db_dir = tempfile::TempDir::new().unwrap(); let db_path = db_dir.path(); create_db(db_path, *version_from_file); open_database(db_path).unwrap(); diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index aa8c46999d..21fd00ba90 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-executor" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] derive_more = "0.99.2" diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index d3282e4dff..e10afe3448 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-executor-common" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] log = "0.4.8" diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index 80dda384a0..3cb0c03a87 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" +license = "GPL-3.0" [dependencies] sp-std = { version = "2.0.0", default-features = false, path = "../../../primitives/std" } diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index 6e67c73e56..9e968fdc68 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-executor-wasmi" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] log = "0.4.8" diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index a8f30a54b3..30d3a5dc87 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-executor-wasmtime" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] log = "0.4.8" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index a26b2e7a41..e1fe3f0361 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-finality-grandpa" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } diff --git a/client/keystore/Cargo.toml b/client/keystore/Cargo.toml index cdc69349fb..b4dde77e7d 100644 --- a/client/keystore/Cargo.toml +++ b/client/keystore/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-keystore" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] derive_more = "0.99.2" diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index 7f1a12f80e..1f52f41508 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-rpc-api" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0" } diff --git a/client/rpc-servers/Cargo.toml b/client/rpc-servers/Cargo.toml index e540274e25..6b0d3f4ada 100644 --- a/client/rpc-servers/Cargo.toml +++ b/client/rpc-servers/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-rpc-server" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] jsonrpc-core = "14.0.3" diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index 789ebf565c..a8cbc5c536 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-rpc" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sc-rpc-api = { version = "0.8", path = "../rpc-api" } diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index f5b3b71914..36213993e3 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-service" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [features] default = ["rocksdb"] diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index 01ccf71a4b..c9dbe97464 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-service-test" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] tempfile = "3.1.0" diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index 9e162c5cb9..3d3eca9d5e 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-state-db" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] parking_lot = "0.9.0" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index dbcc486d17..5127712e12 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" +license = "GPL-3.0" [dependencies] bytes = "0.5" diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 855c7bd40d..0bdf5efaa6 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-transaction-pool" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index c5897e84fe..3b0adf5cb1 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -3,6 +3,7 @@ name = "sc-transaction-graph" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] derive_more = "0.99.2" diff --git a/frame/assets/Cargo.toml b/frame/assets/Cargo.toml index f371f21e1a..cd6b41c4c7 100644 --- a/frame/assets/Cargo.toml +++ b/frame/assets/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-assets" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index 2675445832..8eb91016ff 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-aura" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", default-features = false, path = "../../primitives/application-crypto" } diff --git a/frame/authority-discovery/Cargo.toml b/frame/authority-discovery/Cargo.toml index 3760d863d7..d8c72683ca 100644 --- a/frame/authority-discovery/Cargo.toml +++ b/frame/authority-discovery/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-authority-discovery" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-authority-discovery = { version = "2.0.0", default-features = false, path = "../../primitives/authority-discovery" } diff --git a/frame/authorship/Cargo.toml b/frame/authorship/Cargo.toml index 298da65a2b..124d66c1bc 100644 --- a/frame/authorship/Cargo.toml +++ b/frame/authorship/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" description = "Block and Uncle Author tracking for the SRML" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 30dbda4e53..590c1fe5bd 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-babe" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] hex-literal = "0.2.1" diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index f9522b5379..f2e24dbae4 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-balances" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/collective/Cargo.toml b/frame/collective/Cargo.toml index a2150b82dd..8f7ffa7653 100644 --- a/frame/collective/Cargo.toml +++ b/frame/collective/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-collective" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index d583809f0b..fa4c915cc8 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-contracts" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index 61eb55368e..7767a762f4 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-contracts-rpc" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0" } diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index e0cbd73f80..0f228bc99d 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-contracts-rpc-runtime-api" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-api = { version = "2.0.0", default-features = false, path = "../../../../primitives/api" } diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 02145e8589..12d5dfc158 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-democracy" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/frame/elections-phragmen/Cargo.toml b/frame/elections-phragmen/Cargo.toml index 9d0c3ed61c..f3cfc800f0 100644 --- a/frame/elections-phragmen/Cargo.toml +++ b/frame/elections-phragmen/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-elections-phragmen" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/frame/elections/Cargo.toml b/frame/elections/Cargo.toml index 495151018e..b7c98a65e1 100644 --- a/frame/elections/Cargo.toml +++ b/frame/elections/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-elections" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/evm/Cargo.toml b/frame/evm/Cargo.toml index 933b450ee4..b45bf6e31e 100644 --- a/frame/evm/Cargo.toml +++ b/frame/evm/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-evm" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/frame/example/Cargo.toml b/frame/example/Cargo.toml index fd80d8b8df..0d37940fc7 100644 --- a/frame/example/Cargo.toml +++ b/frame/example/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-example" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index b2b30edd1c..514fb68d6d 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-executive" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/frame/finality-tracker/Cargo.toml b/frame/finality-tracker/Cargo.toml index 22e1380e65..7c87df4e54 100644 --- a/frame/finality-tracker/Cargo.toml +++ b/frame/finality-tracker/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-finality-tracker" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } diff --git a/frame/generic-asset/Cargo.toml b/frame/generic-asset/Cargo.toml index 87f4c9d1cf..cd236d7b7d 100644 --- a/frame/generic-asset/Cargo.toml +++ b/frame/generic-asset/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-generic-asset" version = "2.0.0" authors = ["Centrality Developers "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/grandpa/Cargo.toml b/frame/grandpa/Cargo.toml index ab5b34c91f..e67e64dd5f 100644 --- a/frame/grandpa/Cargo.toml +++ b/frame/grandpa/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-grandpa" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/frame/identity/Cargo.toml b/frame/identity/Cargo.toml index 7962c2a1c6..59e8f721c8 100644 --- a/frame/identity/Cargo.toml +++ b/frame/identity/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-identity" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/im-online/Cargo.toml b/frame/im-online/Cargo.toml index 5045509c77..46bff2dc35 100644 --- a/frame/im-online/Cargo.toml +++ b/frame/im-online/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-im-online" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", default-features = false, path = "../../primitives/application-crypto" } diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index bd83761ff1..839f668819 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-indices" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/membership/Cargo.toml b/frame/membership/Cargo.toml index cc45cfb94c..719718505e 100644 --- a/frame/membership/Cargo.toml +++ b/frame/membership/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-membership" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index bcb90d2368..9cb6752926 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-metadata" version = "10.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/frame/nicks/Cargo.toml b/frame/nicks/Cargo.toml index 0dce684f0d..7c05080d49 100644 --- a/frame/nicks/Cargo.toml +++ b/frame/nicks/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-nicks" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/offences/Cargo.toml b/frame/offences/Cargo.toml index 36d057f4e9..f5486f35ff 100644 --- a/frame/offences/Cargo.toml +++ b/frame/offences/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-offences" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] pallet-balances = { version = "2.0.0", default-features = false, path = "../balances" } diff --git a/frame/randomness-collective-flip/Cargo.toml b/frame/randomness-collective-flip/Cargo.toml index 9e25ba4c57..56ff12d2df 100644 --- a/frame/randomness-collective-flip/Cargo.toml +++ b/frame/randomness-collective-flip/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-randomness-collective-flip" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] safe-mix = { version = "1.0", default-features = false } diff --git a/frame/recovery/Cargo.toml b/frame/recovery/Cargo.toml index 9f2f50ab06..645b1f2e98 100644 --- a/frame/recovery/Cargo.toml +++ b/frame/recovery/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-recovery" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/scored-pool/Cargo.toml b/frame/scored-pool/Cargo.toml index 0b4c2768df..c0935cd88b 100644 --- a/frame/scored-pool/Cargo.toml +++ b/frame/scored-pool/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-scored-pool" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index aa9aaa1f44..06981240b1 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -2,7 +2,8 @@ name = "pallet-session" version = "2.0.0" authors = ["Parity Technologies "] -edition = "2018" +edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml index 94000e898d..ac140c9714 100644 --- a/frame/society/Cargo.toml +++ b/frame/society/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-society" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index 52584cf47f..a38cc0416b 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-staking" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/staking/reward-curve/Cargo.toml b/frame/staking/reward-curve/Cargo.toml index 0353476a95..0753400596 100644 --- a/frame/staking/reward-curve/Cargo.toml +++ b/frame/staking/reward-curve/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-staking-reward-curve" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [lib] proc-macro = true diff --git a/frame/sudo/Cargo.toml b/frame/sudo/Cargo.toml index c97d04f9c7..ac91129c57 100644 --- a/frame/sudo/Cargo.toml +++ b/frame/sudo/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-sudo" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index d8460ef7e8..77aa3aa168 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-support" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] log = "0.4" diff --git a/frame/support/procedural/Cargo.toml b/frame/support/procedural/Cargo.toml index 321002e08b..06a84750b5 100644 --- a/frame/support/procedural/Cargo.toml +++ b/frame/support/procedural/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-support-procedural" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [lib] proc-macro = true diff --git a/frame/support/procedural/tools/Cargo.toml b/frame/support/procedural/tools/Cargo.toml index a9b8f6d4bf..4a1301e712 100644 --- a/frame/support/procedural/tools/Cargo.toml +++ b/frame/support/procedural/tools/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-support-procedural-tools" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] frame-support-procedural-tools-derive = { version = "2.0.0", path = "./derive" } diff --git a/frame/support/procedural/tools/derive/Cargo.toml b/frame/support/procedural/tools/derive/Cargo.toml index 49aea10807..e65a7e0e5f 100644 --- a/frame/support/procedural/tools/derive/Cargo.toml +++ b/frame/support/procedural/tools/derive/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-support-procedural-tools-derive" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [lib] proc-macro = true diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 0c73dcd65e..71d3893426 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-support-test" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index 098c320f45..631d8eecb4 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-system" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/frame/system/rpc/runtime-api/Cargo.toml b/frame/system/rpc/runtime-api/Cargo.toml index f9beb848aa..6244032376 100644 --- a/frame/system/rpc/runtime-api/Cargo.toml +++ b/frame/system/rpc/runtime-api/Cargo.toml @@ -3,6 +3,7 @@ name = "frame-system-rpc-runtime-api" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-api = { version = "2.0.0", default-features = false, path = "../../../../primitives/api" } diff --git a/frame/timestamp/Cargo.toml b/frame/timestamp/Cargo.toml index 354a4740b7..f2d6f40582 100644 --- a/frame/timestamp/Cargo.toml +++ b/frame/timestamp/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-timestamp" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/frame/transaction-payment/Cargo.toml b/frame/transaction-payment/Cargo.toml index ceb1ba9ebb..ac3dbb2c2b 100644 --- a/frame/transaction-payment/Cargo.toml +++ b/frame/transaction-payment/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-transaction-payment" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/frame/transaction-payment/rpc/Cargo.toml b/frame/transaction-payment/rpc/Cargo.toml index b8d1c35492..5fb5f5e274 100644 --- a/frame/transaction-payment/rpc/Cargo.toml +++ b/frame/transaction-payment/rpc/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-transaction-payment-rpc" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0" } diff --git a/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/frame/transaction-payment/rpc/runtime-api/Cargo.toml index 3cf28bf662..8ee16a90dc 100644 --- a/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/frame/treasury/Cargo.toml b/frame/treasury/Cargo.toml index 9fd76ddd9c..10226f3572 100644 --- a/frame/treasury/Cargo.toml +++ b/frame/treasury/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-treasury" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/frame/utility/Cargo.toml b/frame/utility/Cargo.toml index afd7ae3d37..6d1187b0ee 100644 --- a/frame/utility/Cargo.toml +++ b/frame/utility/Cargo.toml @@ -3,6 +3,7 @@ name = "pallet-utility" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true } diff --git a/primitives/allocator/Cargo.toml b/primitives/allocator/Cargo.toml index 737fa91273..3cfc9a4de6 100644 --- a/primitives/allocator/Cargo.toml +++ b/primitives/allocator/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-allocator" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-std = { version = "2.0.0", path = "../std", default-features = false } diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index b9f736570a..f6966f9462 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-api" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index 122c889add..cb9f2e4599 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-api-proc-macro" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [lib] proc-macro = true diff --git a/primitives/api/test/Cargo.toml b/primitives/api/test/Cargo.toml index 5892063bd1..c193c9dc5e 100644 --- a/primitives/api/test/Cargo.toml +++ b/primitives/api/test/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-api-test" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-api = { version = "2.0.0", path = "../" } diff --git a/primitives/application-crypto/Cargo.toml b/primitives/application-crypto/Cargo.toml index f6487ebc29..9377bcff8a 100644 --- a/primitives/application-crypto/Cargo.toml +++ b/primitives/application-crypto/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" description = "Provides facilities for generating application specific crypto wrapper types." +license = "GPL-3.0" [dependencies] sp-core = { version = "2.0.0", default-features = false, path = "../core" } diff --git a/primitives/application-crypto/test/Cargo.toml b/primitives/application-crypto/test/Cargo.toml index 1931e6f84b..de4412db2d 100644 --- a/primitives/application-crypto/test/Cargo.toml +++ b/primitives/application-crypto/test/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" description = "Integration tests for application-crypto" +license = "GPL-3.0" publish = false [dependencies] diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index 71be14862a..1b6d36ca37 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-arithmetic" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index e8568db370..56e789f3e4 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-arithmetic-fuzzer" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-arithmetic = { version = "2.0.0", path = ".." } diff --git a/primitives/authority-discovery/Cargo.toml b/primitives/authority-discovery/Cargo.toml index 516ea413ac..44a7cad155 100644 --- a/primitives/authority-discovery/Cargo.toml +++ b/primitives/authority-discovery/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] description = "Authority discovery primitives" edition = "2018" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", default-features = false, path = "../application-crypto" } diff --git a/primitives/authorship/Cargo.toml b/primitives/authorship/Cargo.toml index d8ddbb7a92..7dc5fcfc95 100644 --- a/primitives/authorship/Cargo.toml +++ b/primitives/authorship/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] description = "Authorship primitives" edition = "2018" +license = "GPL-3.0" [dependencies] sp-inherents = { version = "2.0.0", default-features = false, path = "../inherents" } diff --git a/primitives/block-builder/Cargo.toml b/primitives/block-builder/Cargo.toml index 5bbe9ea123..1700209ec4 100644 --- a/primitives/block-builder/Cargo.toml +++ b/primitives/block-builder/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-block-builder" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-runtime = { version = "2.0.0", default-features = false, path = "../runtime" } diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index a3c442094d..cd8ee78394 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-blockchain" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] log = "0.4.8" diff --git a/primitives/consensus/aura/Cargo.toml b/primitives/consensus/aura/Cargo.toml index 57958ed851..6e05bf4aac 100644 --- a/primitives/consensus/aura/Cargo.toml +++ b/primitives/consensus/aura/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", default-features = false, path = "../../application-crypto" } diff --git a/primitives/consensus/babe/Cargo.toml b/primitives/consensus/babe/Cargo.toml index 11c186faa9..7f0277a720 100644 --- a/primitives/consensus/babe/Cargo.toml +++ b/primitives/consensus/babe/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Primitives for BABE consensus" edition = "2018" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", default-features = false, path = "../../application-crypto" } diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index d60f170b83..3ac89ec70c 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Common utilities for substrate consensus" edition = "2018" +license = "GPL-3.0" [dependencies] derive_more = "0.99.2" diff --git a/primitives/consensus/pow/Cargo.toml b/primitives/consensus/pow/Cargo.toml index 12e97890d7..8e964e0c18 100644 --- a/primitives/consensus/pow/Cargo.toml +++ b/primitives/consensus/pow/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" +license = "GPL-3.0" [dependencies] sp-api = { version = "2.0.0", default-features = false, path = "../../api" } diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index f7eec82e55..0cc7498184 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-core" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-std = { version = "2.0.0", default-features = false, path = "../std" } diff --git a/primitives/debug-derive/Cargo.toml b/primitives/debug-derive/Cargo.toml index 9c65cb34f5..9b12bfb205 100644 --- a/primitives/debug-derive/Cargo.toml +++ b/primitives/debug-derive/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-debug-derive" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [lib] proc-macro = true diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index c2856e524f..dfa6b572d8 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-finality-grandpa" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] app-crypto = { version = "2.0.0", default-features = false, package = "sp-application-crypto", path = "../application-crypto" } diff --git a/primitives/finality-tracker/Cargo.toml b/primitives/finality-tracker/Cargo.toml index 3245803945..1b0e81da91 100644 --- a/primitives/finality-tracker/Cargo.toml +++ b/primitives/finality-tracker/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-finality-tracker" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } diff --git a/primitives/inherents/Cargo.toml b/primitives/inherents/Cargo.toml index 0dc465e288..18fa8412f3 100644 --- a/primitives/inherents/Cargo.toml +++ b/primitives/inherents/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-inherents" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] parking_lot = { version = "0.9.0", optional = true } diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 2f03f230ef..7d831cdfeb 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-io" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false } diff --git a/primitives/keyring/Cargo.toml b/primitives/keyring/Cargo.toml index 61ebf89ad2..e2603a0262 100644 --- a/primitives/keyring/Cargo.toml +++ b/primitives/keyring/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-keyring" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-core = { version = "2.0.0", path = "../core" } diff --git a/primitives/panic-handler/Cargo.toml b/primitives/panic-handler/Cargo.toml index 19e34352cf..0fb6e3b173 100644 --- a/primitives/panic-handler/Cargo.toml +++ b/primitives/panic-handler/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate panic handler." edition = "2018" +license = "GPL-3.0" [dependencies] backtrace = "0.3.38" diff --git a/primitives/phragmen/Cargo.toml b/primitives/phragmen/Cargo.toml index 92807376de..3bfff32d2a 100644 --- a/primitives/phragmen/Cargo.toml +++ b/primitives/phragmen/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-phragmen" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/primitives/rpc/Cargo.toml b/primitives/rpc/Cargo.toml index 33a854e6b7..448f8b8c9c 100644 --- a/primitives/rpc/Cargo.toml +++ b/primitives/rpc/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-rpc" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", features = ["derive"] } diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index 7ed2257556..30e9ae6bd6 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-runtime-interface" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-wasm-interface = { version = "2.0.0", optional = true, path = "../wasm-interface" } diff --git a/primitives/runtime-interface/proc-macro/Cargo.toml b/primitives/runtime-interface/proc-macro/Cargo.toml index a5d12de0a6..b239fbcce3 100644 --- a/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/primitives/runtime-interface/proc-macro/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-runtime-interface-proc-macro" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [lib] proc-macro = true diff --git a/primitives/runtime-interface/test-wasm/Cargo.toml b/primitives/runtime-interface/test-wasm/Cargo.toml index b3a400a12d..c38413aee7 100644 --- a/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/primitives/runtime-interface/test-wasm/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" +license = "GPL-3.0" [dependencies] sp-runtime-interface = { version = "2.0.0", default-features = false, path = "../" } diff --git a/primitives/runtime-interface/test/Cargo.toml b/primitives/runtime-interface/test/Cargo.toml index f0a4c0edd4..d6d724da9d 100644 --- a/primitives/runtime-interface/test/Cargo.toml +++ b/primitives/runtime-interface/test/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-runtime-interface-test" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" publish = false [dependencies] diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index 2574fef4b9..7046975416 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-runtime" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index 5d161a6deb..071ac2ba7b 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-sandbox" version = "0.8.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] wasmi = { version = "0.6.2", optional = true } diff --git a/primitives/serializer/Cargo.toml b/primitives/serializer/Cargo.toml index 39fdeb0e7e..b9e78d968c 100644 --- a/primitives/serializer/Cargo.toml +++ b/primitives/serializer/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-serializer" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] serde = "1.0.101" diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index 24475e9414..143ff87942 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-session" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-api = { version = "2.0.0", default-features = false, path = "../api" } diff --git a/primitives/staking/Cargo.toml b/primitives/staking/Cargo.toml index 35725c72e3..97afa0d0a7 100644 --- a/primitives/staking/Cargo.toml +++ b/primitives/staking/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-staking" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index d390471aca..a856146667 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" +license = "GPL-3.0" [dependencies] log = "0.4.8" diff --git a/primitives/std/Cargo.toml b/primitives/std/Cargo.toml index 7fdf7d1144..dd4b7e4511 100644 --- a/primitives/std/Cargo.toml +++ b/primitives/std/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-std" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [features] default = ["std"] diff --git a/primitives/storage/Cargo.toml b/primitives/storage/Cargo.toml index 384519cc1d..c9fda1816b 100644 --- a/primitives/storage/Cargo.toml +++ b/primitives/storage/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" description = "Storage related primitives" +license = "GPL-3.0" [dependencies] sp-std = { version = "2.0.0", default-features = false, path = "../std" } diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index 5c2f2dcc0a..ba19eb00f3 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-test-primitives" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", default-features = false, path = "../application-crypto" } diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index ee86d6e3bc..fa146ebd6f 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-timestamp" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sp-api = { version = "2.0.0", default-features = false, path = "../api" } diff --git a/primitives/transaction-pool/Cargo.toml b/primitives/transaction-pool/Cargo.toml index 3a3e15e611..18b254f2c0 100644 --- a/primitives/transaction-pool/Cargo.toml +++ b/primitives/transaction-pool/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-transaction-pool" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", optional = true } diff --git a/primitives/version/Cargo.toml b/primitives/version/Cargo.toml index 784051b56e..1219d9840c 100644 --- a/primitives/version/Cargo.toml +++ b/primitives/version/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-version" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] impl-serde = { version = "0.2.3", optional = true } diff --git a/primitives/wasm-interface/Cargo.toml b/primitives/wasm-interface/Cargo.toml index dc17a8afbe..b97e3040aa 100644 --- a/primitives/wasm-interface/Cargo.toml +++ b/primitives/wasm-interface/Cargo.toml @@ -3,6 +3,7 @@ name = "sp-wasm-interface" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] wasmi = { version = "0.6.2", optional = true } diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index ac4c995419..0a552973c9 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -3,3 +3,4 @@ name = "substrate-test-utils" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" diff --git a/test-utils/client/Cargo.toml b/test-utils/client/Cargo.toml index 8b1ebc39f4..2107f3bdd8 100644 --- a/test-utils/client/Cargo.toml +++ b/test-utils/client/Cargo.toml @@ -3,6 +3,7 @@ name = "substrate-test-client" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sc-client-api = { version = "2.0.0", path = "../../client/api" } diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index b827163a1b..e0d8aa77b7 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -4,6 +4,7 @@ version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" +license = "GPL-3.0" [dependencies] sp-application-crypto = { version = "2.0.0", default-features = false, path = "../../primitives/application-crypto" } diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index aa33f55012..643cde16b3 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -3,6 +3,7 @@ name = "substrate-test-runtime-client" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sc-block-builder = { version = "0.8", path = "../../../client/block-builder" } diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index 15ad771b45..36f21f192b 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -4,6 +4,7 @@ version = "0.8.0" authors = ["Parity Technologies "] description = "Utilities for creating a browser light-client." edition = "2018" +license = "GPL-3.0" [dependencies] futures = "0.3" diff --git a/utils/build-script-utils/Cargo.toml b/utils/build-script-utils/Cargo.toml index 36703ab838..8c94edd527 100644 --- a/utils/build-script-utils/Cargo.toml +++ b/utils/build-script-utils/Cargo.toml @@ -3,5 +3,6 @@ name = "substrate-build-script-utils" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] diff --git a/utils/fork-tree/Cargo.toml b/utils/fork-tree/Cargo.toml index fa37161dc2..0ac0fb6522 100644 --- a/utils/fork-tree/Cargo.toml +++ b/utils/fork-tree/Cargo.toml @@ -3,6 +3,7 @@ name = "fork-tree" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/utils/frame/rpc/support/Cargo.toml b/utils/frame/rpc/support/Cargo.toml index 19451743cd..3b4339496a 100644 --- a/utils/frame/rpc/support/Cargo.toml +++ b/utils/frame/rpc/support/Cargo.toml @@ -3,6 +3,7 @@ name = "substrate-frame-rpc-support" version = "2.0.0" authors = ["Parity Technologies ", "Andrew Dirksen "] edition = "2018" +license = "GPL-3.0" [dependencies] futures = { version = "0.3.0", features = ["compat"] } diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index 39f7735eed..818794f846 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -3,6 +3,7 @@ name = "substrate-frame-rpc-system" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" +license = "GPL-3.0" [dependencies] sc-client = { version = "0.8", path = "../../../../client/" } -- GitLab From aa2cf01249c356c664c27c175db5d1eb2f84fe70 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Wed, 29 Jan 2020 13:26:09 +0100 Subject: [PATCH 205/296] doc (#4761) --- frame/support/src/storage/generator/linked_map.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frame/support/src/storage/generator/linked_map.rs b/frame/support/src/storage/generator/linked_map.rs index 14bef77c9e..face87edf9 100644 --- a/frame/support/src/storage/generator/linked_map.rs +++ b/frame/support/src/storage/generator/linked_map.rs @@ -433,6 +433,8 @@ where } } + /// The translation happens in-place, new keys are inserted at the same time as old keys are + /// removed, thus new keys must not collide with still remaining old keys. fn translate(translate_key: TK, translate_val: TV) -> Result<(), Option> where K2: FullCodec + Clone, V2: Decode, TK: Fn(K2) -> K, TV: Fn(V2) -> V { -- GitLab From 5dfd4f24fee5e1117dc74f6b971a0d0a510844de Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Wed, 29 Jan 2020 13:27:23 +0100 Subject: [PATCH 206/296] Clean up indentation problems (#4762) --- client/api/src/light.rs | 12 ++-- client/consensus/aura/src/lib.rs | 2 +- client/executor/src/integration_tests/mod.rs | 2 +- client/rpc/src/state/state_light.rs | 2 +- client/service/src/builder.rs | 2 +- .../transaction-pool/graph/benches/basics.rs | 2 +- frame/contracts/src/wasm/prepare.rs | 2 +- primitives/arithmetic/benches/bench.rs | 6 +- primitives/core/benches/bench.rs | 6 +- primitives/phragmen/benches/phragmen.rs | 8 +-- primitives/runtime/src/generic/era.rs | 16 ++--- primitives/state-machine/src/stats.rs | 62 +++++++++---------- 12 files changed, 61 insertions(+), 61 deletions(-) diff --git a/client/api/src/light.rs b/client/api/src/light.rs index fc9b6dc6fd..c0bebc1740 100644 --- a/client/api/src/light.rs +++ b/client/api/src/light.rs @@ -21,10 +21,10 @@ use std::collections::{BTreeMap, HashMap}; use std::future::Future; use sp_runtime::{ - traits::{ - Block as BlockT, Header as HeaderT, NumberFor, - }, - generic::BlockId + traits::{ + Block as BlockT, Header as HeaderT, NumberFor, + }, + generic::BlockId }; use sp_core::ChangesTrieConfigurationRange; use sp_state_machine::StorageProof; @@ -307,8 +307,8 @@ pub trait RemoteBlockchain: Send + Sync { pub mod tests { use futures::future::Ready; use parking_lot::Mutex; - use sp_blockchain::Error as ClientError; - use sp_test_primitives::{Block, Header, Extrinsic}; + use sp_blockchain::Error as ClientError; + use sp_test_primitives::{Block, Header, Extrinsic}; use super::*; pub type OkCallFetcher = Mutex>; diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 270bd19422..4b107d87d5 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -65,7 +65,7 @@ use sp_timestamp::{ use sc_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_INFO}; use sc_consensus_slots::{ - CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, StorageChanges, check_equivocation, + CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, StorageChanges, check_equivocation, }; use sc_keystore::KeyStorePtr; diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index ef8171e5ad..02a5897ea4 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -72,7 +72,7 @@ fn call_not_existing_function(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); - match call_in_wasm( + match call_in_wasm( "test_calling_missing_external", &[], wasm_method, diff --git a/client/rpc/src/state/state_light.rs b/client/rpc/src/state/state_light.rs index 482eb0723f..cc3d1a4951 100644 --- a/client/rpc/src/state/state_light.rs +++ b/client/rpc/src/state/state_light.rs @@ -708,7 +708,7 @@ fn ignore_error(future: F) -> impl std::future::Future, number: u64) { fn benchmark_main(c: &mut Criterion) { - c.bench_function("sequential 50 tx", |b| { + c.bench_function("sequential 50 tx", |b| { b.iter(|| { bench_configured(Pool::new(Default::default(), TestApi::new_dependant().into()), 50); }); diff --git a/frame/contracts/src/wasm/prepare.rs b/frame/contracts/src/wasm/prepare.rs index 39e1fca79d..ba934f353e 100644 --- a/frame/contracts/src/wasm/prepare.rs +++ b/frame/contracts/src/wasm/prepare.rs @@ -76,7 +76,7 @@ impl<'a> ContractModule<'a> { /// Ensures that tables declared in the module are not too big. fn ensure_table_size_limit(&self, limit: u32) -> Result<(), &'static str> { - if let Some(table_section) = self.module.table_section() { + if let Some(table_section) = self.module.table_section() { // In Wasm MVP spec, there may be at most one table declared. Double check this // explicitly just in case the Wasm version changes. if table_section.entries().len() > 1 { diff --git a/primitives/arithmetic/benches/bench.rs b/primitives/arithmetic/benches/bench.rs index 1025e883ef..1dbcf260af 100644 --- a/primitives/arithmetic/benches/bench.rs +++ b/primitives/arithmetic/benches/bench.rs @@ -73,8 +73,8 @@ fn bench_division(c: &mut Criterion) { } criterion_group!{ - name = benches; - config = Criterion::default(); - targets = bench_addition, bench_subtraction, bench_multiplication, bench_division + name = benches; + config = Criterion::default(); + targets = bench_addition, bench_subtraction, bench_multiplication, bench_division } criterion_main!(benches); diff --git a/primitives/core/benches/bench.rs b/primitives/core/benches/bench.rs index 36728742d8..7096cd6c19 100644 --- a/primitives/core/benches/bench.rs +++ b/primitives/core/benches/bench.rs @@ -87,8 +87,8 @@ fn bench_ed25519(c: &mut Criterion) { } criterion_group!{ - name = benches; - config = Criterion::default().warm_up_time(Duration::from_millis(500)).without_plots(); - targets = bench_hash_128_fix_size, bench_hash_128_dyn_size, bench_ed25519 + name = benches; + config = Criterion::default().warm_up_time(Duration::from_millis(500)).without_plots(); + targets = bench_hash_128_fix_size, bench_hash_128_dyn_size, bench_ed25519 } criterion_main!(benches); diff --git a/primitives/phragmen/benches/phragmen.rs b/primitives/phragmen/benches/phragmen.rs index 7bebda564e..aa99e6f384 100644 --- a/primitives/phragmen/benches/phragmen.rs +++ b/primitives/phragmen/benches/phragmen.rs @@ -158,8 +158,8 @@ fn do_phragmen( macro_rules! phragmen_benches { ($($name:ident: $tup:expr,)*) => { $( - #[bench] - fn $name(b: &mut Bencher) { + #[bench] + fn $name(b: &mut Bencher) { let (v, n, t, e, eq_iter, eq_tol) = $tup; println!("----------------------"); println!( @@ -168,8 +168,8 @@ macro_rules! phragmen_benches { v, n, e, e * n, t, eq_iter, eq_tol, ); do_phragmen(b, v, n, t, e, eq_iter, eq_tol); - } - )* + } + )* } } diff --git a/primitives/runtime/src/generic/era.rs b/primitives/runtime/src/generic/era.rs index 238130db00..37b4b495fe 100644 --- a/primitives/runtime/src/generic/era.rs +++ b/primitives/runtime/src/generic/era.rs @@ -47,14 +47,14 @@ pub enum Era { } /* -E.g. with period == 4: -0 10 20 30 40 -0123456789012345678901234567890123456789012 - |...| - authored -/ \- expiry -phase = 1 -n = Q(current - phase, period) + phase -*/ + * E.g. with period == 4: + * 0 10 20 30 40 + * 0123456789012345678901234567890123456789012 + * |...| + * authored -/ \- expiry + * phase = 1 + * n = Q(current - phase, period) + phase + */ impl Era { /// Create a new era based on a period (which should be a power of two between 4 and 65536 inclusive) /// and a block number on which it should start (or, for long periods, be shortly after the start). diff --git a/primitives/state-machine/src/stats.rs b/primitives/state-machine/src/stats.rs index 38286be545..aa69b5be9d 100644 --- a/primitives/state-machine/src/stats.rs +++ b/primitives/state-machine/src/stats.rs @@ -21,42 +21,42 @@ use std::time::{Instant, Duration}; /// Measured count of operations and total bytes. #[derive(Clone, Debug, Default)] pub struct UsageUnit { - /// Number of operations. - pub ops: u64, - /// Number of bytes. - pub bytes: u64, + /// Number of operations. + pub ops: u64, + /// Number of bytes. + pub bytes: u64, } /// Usage statistics for state backend. #[derive(Clone, Debug)] pub struct UsageInfo { - /// Read statistics (total). - pub reads: UsageUnit, - /// Write statistics. - pub writes: UsageUnit, - /// Cache read statistics. - pub cache_reads: UsageUnit, - /// Memory used. - pub memory: usize, - - /// Moment at which current statistics has been started being collected. - pub started: Instant, - /// Timespan of the statistics. - pub span: Duration, + /// Read statistics (total). + pub reads: UsageUnit, + /// Write statistics. + pub writes: UsageUnit, + /// Cache read statistics. + pub cache_reads: UsageUnit, + /// Memory used. + pub memory: usize, + + /// Moment at which current statistics has been started being collected. + pub started: Instant, + /// Timespan of the statistics. + pub span: Duration, } impl UsageInfo { - /// Empty statistics. - /// - /// Means no data was collected. - pub fn empty() -> Self { - Self { - reads: UsageUnit::default(), - writes: UsageUnit::default(), - cache_reads: UsageUnit::default(), - memory: 0, - started: Instant::now(), - span: Default::default(), - } - } -} \ No newline at end of file + /// Empty statistics. + /// + /// Means no data was collected. + pub fn empty() -> Self { + Self { + reads: UsageUnit::default(), + writes: UsageUnit::default(), + cache_reads: UsageUnit::default(), + memory: 0, + started: Instant::now(), + span: Default::default(), + } + } +} -- GitLab From 89e079f48c32d05dde59509f058d0670613f37b5 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Wed, 29 Jan 2020 13:36:52 +0100 Subject: [PATCH 207/296] LinkedMap doesn't implement StoragePrefixedMap (#4760) * LinkedMap doesn't implement StoragePrefixedMap * fix test --- .../support/procedural/src/storage/storage_struct.rs | 12 ------------ frame/support/test/tests/final_keys.rs | 6 ------ 2 files changed, 18 deletions(-) diff --git a/frame/support/procedural/src/storage/storage_struct.rs b/frame/support/procedural/src/storage/storage_struct.rs index e44863b157..91bdf7bf87 100644 --- a/frame/support/procedural/src/storage/storage_struct.rs +++ b/frame/support/procedural/src/storage/storage_struct.rs @@ -167,18 +167,6 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre ); quote!( - impl<#impl_trait> #scrate::storage::StoragePrefixedMap<#value_type> - for #storage_struct #optional_storage_where_clause - { - fn module_prefix() -> &'static [u8] { - #instance_or_inherent::PREFIX.as_bytes() - } - - fn storage_prefix() -> &'static [u8] { - #storage_name_str.as_bytes() - } - } - impl<#impl_trait> #scrate::#storage_generator_trait for #storage_struct #optional_storage_where_clause { diff --git a/frame/support/test/tests/final_keys.rs b/frame/support/test/tests/final_keys.rs index 15ee65b627..e604038f4e 100644 --- a/frame/support/test/tests/final_keys.rs +++ b/frame/support/test/tests/final_keys.rs @@ -112,13 +112,11 @@ fn final_keys_no_instance() { k.extend(1u32.using_encoded(blake2_256).to_vec()); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(unhashed::get::(&head), Some(1u32)); - assert_eq!(&k[..32], &::final_prefix()); no_instance::LinkedMap2::insert(1, 2); let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"LinkedMap2")].concat(); k.extend(1u32.using_encoded(twox_128).to_vec()); assert_eq!(unhashed::get::(&k), Some(2u32)); - assert_eq!(&k[..32], &::final_prefix()); no_instance::DoubleMap::insert(&1, &2, &3); let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"DoubleMap")].concat(); @@ -163,13 +161,11 @@ fn final_keys_default_instance() { k.extend(1u32.using_encoded(blake2_256).to_vec()); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(unhashed::get::(&head), Some(1u32)); - assert_eq!(&k[..32], &>::final_prefix()); >::insert(1, 2); let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"LinkedMap2")].concat(); k.extend(1u32.using_encoded(twox_128).to_vec()); assert_eq!(unhashed::get::(&k), Some(2u32)); - assert_eq!(&k[..32], &>::final_prefix()); >::insert(&1, &2, &3); let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"DoubleMap")].concat(); @@ -214,13 +210,11 @@ fn final_keys_instance_2() { k.extend(1u32.using_encoded(blake2_256).to_vec()); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(unhashed::get::(&head), Some(1u32)); - assert_eq!(&k[..32], &>::final_prefix()); >::insert(1, 2); let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"LinkedMap2")].concat(); k.extend(1u32.using_encoded(twox_128).to_vec()); assert_eq!(unhashed::get::(&k), Some(2u32)); - assert_eq!(&k[..32], &>::final_prefix()); >::insert(&1, &2, &3); let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"DoubleMap")].concat(); -- GitLab From 922b36c8eb6d971fbe2b72d69099a291a368ea25 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 29 Jan 2020 13:38:46 +0100 Subject: [PATCH 208/296] Revamp some of the weights (#4759) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove free transaction dos vectors. * Bump spec version * Indentation. * Update frame/support/src/weights.rs Co-authored-by: Bastian Köcher --- bin/node/runtime/src/lib.rs | 6 +++--- frame/executive/src/lib.rs | 2 +- frame/identity/src/lib.rs | 2 +- frame/nicks/src/lib.rs | 4 ++-- frame/staking/src/lib.rs | 14 +++++++------- frame/sudo/src/lib.rs | 2 +- frame/support/src/weights.rs | 15 +++++---------- frame/transaction-payment/src/lib.rs | 4 ++-- 8 files changed, 22 insertions(+), 27 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index afd2631373..bad1ea4174 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -77,11 +77,11 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, // Per convention: if the runtime behavior changes, increment spec_version - // and set impl_version to equal spec_version. If only runtime + // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 207, - impl_version: 208, + spec_version: 208, + impl_version: 0, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 96c79c1073..cafb9fad27 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -385,7 +385,7 @@ mod tests { fn some_root_operation(origin) { let _ = frame_system::ensure_root(origin); } - #[weight = SimpleDispatchInfo::FreeNormal] + #[weight = SimpleDispatchInfo::InsecureFreeNormal] fn some_unsigned_message(origin) { let _ = frame_system::ensure_none(origin); } diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 0bcc33b217..631d77d0bf 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -842,7 +842,7 @@ decl_module! { /// - `S + 2` storage mutations. /// - One event. /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn kill_identity(origin, target: ::Source) { T::ForceOrigin::try_origin(origin) .map(|_| ()) diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index 79365ff713..1067e9a5de 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -194,7 +194,7 @@ decl_module! { /// - One storage read/write. /// - One event. /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(70_000)] fn kill_name(origin, target: ::Source) { T::ForceOrigin::try_origin(origin) .map(|_| ()) @@ -222,7 +222,7 @@ decl_module! { /// - One storage read/write. /// - One event. /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(70_000)] fn force_name(origin, target: ::Source, name: Vec) { T::ForceOrigin::try_origin(origin) .map(|_| ()) diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 21ac24bc68..757f75bf0a 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1150,7 +1150,7 @@ decl_module! { } /// The ideal number of validators. - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(5_000)] fn set_validator_count(origin, #[compact] new: u32) { ensure_root(origin)?; ValidatorCount::put(new); @@ -1163,7 +1163,7 @@ decl_module! { /// # /// - No arguments. /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(5_000)] fn force_no_eras(origin) { ensure_root(origin)?; ForceEra::put(Forcing::ForceNone); @@ -1175,21 +1175,21 @@ decl_module! { /// # /// - No arguments. /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(5_000)] fn force_new_era(origin) { ensure_root(origin)?; ForceEra::put(Forcing::ForceNew); } /// Set the validators who cannot be slashed (if any). - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(5_000)] fn set_invulnerables(origin, validators: Vec) { ensure_root(origin)?; >::put(validators); } /// Force a current staker to become completely unstaked, immediately. - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] fn force_unstake(origin, stash: T::AccountId) { ensure_root(origin)?; @@ -1204,7 +1204,7 @@ decl_module! { /// # /// - One storage write /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(5_000)] fn force_new_era_always(origin) { ensure_root(origin)?; ForceEra::put(Forcing::ForceAlways); @@ -1217,7 +1217,7 @@ decl_module! { /// # /// - One storage write. /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(1_000_000)] fn cancel_deferred_slash(origin, era: EraIndex, slash_indices: Vec) { T::SlashCancelOrigin::try_origin(origin) .map(|_| ()) diff --git a/frame/sudo/src/lib.rs b/frame/sudo/src/lib.rs index ea436e2629..e69840e158 100644 --- a/frame/sudo/src/lib.rs +++ b/frame/sudo/src/lib.rs @@ -119,7 +119,7 @@ decl_module! { /// - One DB write (event). /// - Unknown weight of derivative `proposal` execution. /// # - #[weight = SimpleDispatchInfo::FreeOperational] + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] 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)?; diff --git a/frame/support/src/weights.rs b/frame/support/src/weights.rs index e44ab16458..34166c368c 100644 --- a/frame/support/src/weights.rs +++ b/frame/support/src/weights.rs @@ -127,11 +127,10 @@ impl From for DispatchClass { match tx { SimpleDispatchInfo::FixedOperational(_) => DispatchClass::Operational, SimpleDispatchInfo::MaxOperational => DispatchClass::Operational, - SimpleDispatchInfo::FreeOperational => DispatchClass::Operational, SimpleDispatchInfo::FixedNormal(_) => DispatchClass::Normal, SimpleDispatchInfo::MaxNormal => DispatchClass::Normal, - SimpleDispatchInfo::FreeNormal => DispatchClass::Normal, + SimpleDispatchInfo::InsecureFreeNormal => DispatchClass::Normal, } } } @@ -178,14 +177,12 @@ pub enum SimpleDispatchInfo { FixedNormal(Weight), /// A normal dispatch with the maximum weight. MaxNormal, - /// A normal dispatch with no weight. - FreeNormal, + /// A normal dispatch with no weight. Base and bytes fees still need to be paid. + InsecureFreeNormal, /// An operational dispatch with fixed weight. FixedOperational(Weight), /// An operational dispatch with the maximum weight. MaxOperational, - /// An operational dispatch with no weight. - FreeOperational, } impl WeighData for SimpleDispatchInfo { @@ -193,11 +190,10 @@ impl WeighData for SimpleDispatchInfo { match self { SimpleDispatchInfo::FixedNormal(w) => *w, SimpleDispatchInfo::MaxNormal => Bounded::max_value(), - SimpleDispatchInfo::FreeNormal => Bounded::min_value(), + SimpleDispatchInfo::InsecureFreeNormal => Bounded::min_value(), SimpleDispatchInfo::FixedOperational(w) => *w, SimpleDispatchInfo::MaxOperational => Bounded::max_value(), - SimpleDispatchInfo::FreeOperational => Bounded::min_value(), } } } @@ -213,11 +209,10 @@ impl PaysFee for SimpleDispatchInfo { match self { SimpleDispatchInfo::FixedNormal(_) => true, SimpleDispatchInfo::MaxNormal => true, - SimpleDispatchInfo::FreeNormal => true, + SimpleDispatchInfo::InsecureFreeNormal => true, SimpleDispatchInfo::FixedOperational(_) => true, SimpleDispatchInfo::MaxOperational => true, - SimpleDispatchInfo::FreeOperational => false, } } } diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 00dbf6bc66..370bd87b4c 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -477,7 +477,7 @@ mod tests { let len = 100; - // like a FreeOperational + // This is a completely free (and thus wholly insecure/DoS-ridden) transaction. let operational_transaction = DispatchInfo { weight: 0, class: DispatchClass::Operational, @@ -489,7 +489,7 @@ mod tests { .is_ok() ); - // like a FreeNormal + // like a InsecureFreeNormal let free_transaction = DispatchInfo { weight: 0, class: DispatchClass::Normal, -- GitLab From 4e8ced458ed91ab341c3c1efa0d3cf7ab85ec75b Mon Sep 17 00:00:00 2001 From: brenzi Date: Wed, 29 Jan 2020 15:30:25 +0100 Subject: [PATCH 209/296] adding a ss58 format for SubstraTEE (#4764) --- primitives/core/src/crypto.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index 86a579e499..5ad5e19813 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -444,6 +444,8 @@ ss58_address_format!( (7, "edgeware", "Edgeware mainnet, direct checksum, standard account (*25519).") CentrifugeAccountDirect => (36, "centrifuge", "Centrifuge Chain mainnet, direct checksum, standard account (*25519).") + SubstraTeeAccountDirect => + (44, "substratee", "Any SubstraTEE off-chain network private account, direct checksum, standard account (*25519).") ); /// Set the default "version" (actually, this is a bit of a misnomer and the version byte is -- GitLab From 49d47266216d6e22d134b7047e6e4e81a78f6d81 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 29 Jan 2020 15:32:45 +0100 Subject: [PATCH 210/296] Order network dependencies alphabetically (#4763) --- client/network-gossip/Cargo.toml | 6 +++--- client/network/Cargo.toml | 36 ++++++++++++++++---------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 82611bffc8..ca86af7df4 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -8,11 +8,11 @@ edition = "2018" [dependencies] log = "0.4.8" -futures01 = { package = "futures", version = "0.1.29" } futures = { version = "0.3.1", features = ["compat"] } +futures01 = { package = "futures", version = "0.1.29" } futures-timer = "0.4.0" -lru = "0.1.2" libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } -sc-network = { version = "0.8", path = "../network" } +lru = "0.1.2" parking_lot = "0.9.0" +sc-network = { version = "0.8", path = "../network" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 7930087595..f20ce36a27 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -7,53 +7,53 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] +bitflags = "1.2.0" bytes = "0.5.0" +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } derive_more = "0.99.2" either = "1.5.3" -log = "0.4.8" -parking_lot = "0.9.0" -bitflags = "1.2.0" +erased-serde = "0.3.9" fnv = "1.0.6" +fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } futures = "0.3.1" futures_codec = "0.3.3" futures-timer = "0.4.0" +libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } linked-hash-map = "0.5.2" linked_hash_set = "0.1.3" +log = "0.4.8" lru = "0.4.0" -rustc-hex = "2.0.1" +parking_lot = "0.9.0" rand = "0.7.2" -libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } -fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } -sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } +rustc-hex = "2.0.1" +sc-block-builder = { version = "0.8", path = "../block-builder" } sc-client = { version = "0.8", path = "../" } sc-client-api = { version = "2.0.0", path = "../api" } -sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } -sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } -sp-arithmetic = { version = "2.0.0", path = "../../primitives/arithmetic" } -sp-core = { version = "2.0.0", path = "../../primitives/core" } -sc-block-builder = { version = "0.8", path = "../block-builder" } -codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } sc-peerset = { version = "2.0.0", path = "../peerset" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } slog_derive = "0.2.0" smallvec = "0.6.10" -unsigned-varint = { version = "0.3.0", features = ["codec"] } +sp-arithmetic = { version = "2.0.0", path = "../../primitives/arithmetic" } +sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } +sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } +sp-consensus-babe = { version = "0.8", path = "../../primitives/consensus/babe" } +sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-keyring = { version = "2.0.0", optional = true, path = "../../primitives/keyring" } +sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } substrate-test-client = { version = "2.0.0", optional = true, path = "../../test-utils/client" } substrate-test-runtime-client = { version = "2.0.0", optional = true, path = "../../test-utils/runtime/client" } -erased-serde = "0.3.9" +unsigned-varint = { version = "0.3.0", features = ["codec"] } void = "1.0.2" zeroize = "1.0.0" -sp-consensus-babe = { version = "0.8", path = "../../primitives/consensus/babe" } [dev-dependencies] -sp-test-primitives = { version = "2.0.0", path = "../../primitives/test-primitives" } env_logger = "0.7.0" -sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } quickcheck = "0.9.0" rand = "0.7.2" +sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } +sp-test-primitives = { version = "2.0.0", path = "../../primitives/test-primitives" } tempfile = "3.1.0" [features] -- GitLab From b02a97129286a8453ef78f58963b72c7ae47aef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 29 Jan 2020 16:24:40 +0100 Subject: [PATCH 211/296] Add `get_global` for `Sandbox` (#4756) * Add `get_global` for `Sandbox` This pr adds `get_global` to retrieve a `global` variable from an instantiated sandbox wasm blob. * Bump `spec_version` * Update primitives/wasm-interface/src/lib.rs Co-Authored-By: Sergei Pepyakin * `get_global` -> `get_global_val` Co-authored-by: Sergei Pepyakin Co-authored-by: Gavin Wood --- Cargo.lock | 9 +- bin/node/runtime/src/lib.rs | 2 +- client/executor/common/src/sandbox.rs | 17 +++- client/executor/runtime-test/src/lib.rs | 34 +++++-- client/executor/src/integration_tests/mod.rs | 4 +- .../executor/src/integration_tests/sandbox.rs | 23 +++++ client/executor/wasmi/src/lib.rs | 15 ++- .../wasmtime/src/function_executor.rs | 15 ++- frame/contracts/src/wasm/env_def/macros.rs | 20 ++-- frame/contracts/src/wasm/env_def/mod.rs | 30 +++--- frame/contracts/src/wasm/runtime.rs | 6 +- primitives/core/src/sandbox.rs | 93 ------------------- primitives/io/Cargo.toml | 2 + primitives/io/src/lib.rs | 8 ++ primitives/runtime-interface/Cargo.toml | 4 +- primitives/runtime-interface/src/impls.rs | 10 +- primitives/runtime/Cargo.toml | 2 +- primitives/sandbox/Cargo.toml | 2 + primitives/sandbox/src/lib.rs | 14 ++- primitives/sandbox/with_std.rs | 67 ++++++------- primitives/sandbox/without_std.rs | 14 ++- primitives/wasm-interface/Cargo.toml | 3 +- primitives/wasm-interface/src/lib.rs | 76 ++++++++++++++- 23 files changed, 275 insertions(+), 195 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 88b73133f9..0ad431f9d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4206,13 +4206,13 @@ dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec-derive 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-scale-codec-derive" -version = "1.1.0" +version = "1.1.1" 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)", @@ -6594,6 +6594,7 @@ dependencies = [ "sp-state-machine 0.8.0", "sp-std 2.0.0", "sp-trie 2.0.0", + "sp-wasm-interface 2.0.0", ] [[package]] @@ -6724,6 +6725,7 @@ dependencies = [ "sp-core 2.0.0", "sp-io 2.0.0", "sp-std 2.0.0", + "sp-wasm-interface 2.0.0", "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6857,6 +6859,7 @@ name = "sp-wasm-interface" version = "2.0.0" dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-std 2.0.0", "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8700,7 +8703,7 @@ dependencies = [ "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" "checksum parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" "checksum parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" -"checksum parity-scale-codec-derive 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "492ac3aa93d6caa5d20e4e3e0b75d08e2dcd9dd8a50d19529548b6fe11b3f295" +"checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" "checksum parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "900dd84654b048e5bad420bb341658fc2c4d7fea628c22bcf4621733e54859b4" diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index bad1ea4174..0d4b094c79 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 208, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, }; diff --git a/client/executor/common/src/sandbox.rs b/client/executor/common/src/sandbox.rs index e48afd4891..89285a75fc 100644 --- a/client/executor/common/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -224,7 +224,8 @@ fn trap(msg: &'static str) -> Trap { } fn deserialize_result(serialized_result: &[u8]) -> std::result::Result, Trap> { - use self::sandbox_primitives::{HostError, ReturnValue}; + use self::sandbox_primitives::HostError; + use sp_wasm_interface::ReturnValue; let result_val = std::result::Result::::decode(&mut &serialized_result[..]) .map_err(|_| trap("Decoding Result failed!"))?; @@ -260,7 +261,7 @@ impl<'a, FE: SandboxCapabilities + 'a> Externals for GuestExternals<'a, FE> { let invoke_args_data: Vec = args.as_ref() .iter() .cloned() - .map(sandbox_primitives::TypedValue::from) + .map(sp_wasm_interface::Value::from) .collect::>() .encode(); @@ -362,6 +363,18 @@ impl SandboxInstance { }, ) } + + /// Get the value from a global with the given `name`. + /// + /// Returns `Some(_)` if the global could be found. + pub fn get_global_val(&self, name: &str) -> Option { + let global = self.instance + .export_by_name(name)? + .as_global()? + .get(); + + Some(global.into()) + } } /// Error occurred during instantiation of a sandboxed module. diff --git a/client/executor/runtime-test/src/lib.rs b/client/executor/runtime-test/src/lib.rs index f6d37abf94..b183398c02 100644 --- a/client/executor/runtime-test/src/lib.rs +++ b/client/executor/runtime-test/src/lib.rs @@ -17,6 +17,8 @@ use sp_io::{ use sp_runtime::{print, traits::{BlakeTwo256, Hash}}; #[cfg(not(feature = "std"))] use sp_core::{ed25519, sr25519}; +#[cfg(not(feature = "std"))] +use sp_sandbox::Value; extern "C" { #[allow(dead_code)] @@ -133,8 +135,8 @@ sp_core::wasm_export_functions! { execute_sandboxed( &code, &[ - sp_sandbox::TypedValue::I32(0x12345678), - sp_sandbox::TypedValue::I64(0x1234567887654321), + Value::I32(0x12345678), + Value::I64(0x1234567887654321), ], ).is_ok() } @@ -143,10 +145,10 @@ sp_core::wasm_export_functions! { let ok = match execute_sandboxed( &code, &[ - sp_sandbox::TypedValue::I32(0x1336), + Value::I32(0x1336), ] ) { - Ok(sp_sandbox::ReturnValue::Value(sp_sandbox::TypedValue::I32(0x1337))) => true, + Ok(sp_sandbox::ReturnValue::Value(Value::I32(0x1337))) => true, _ => false, }; @@ -165,6 +167,22 @@ sp_core::wasm_export_functions! { code } + + fn test_sandbox_get_global_val(code: Vec) -> i64 { + let env_builder = sp_sandbox::EnvironmentDefinitionBuilder::new(); + let instance = if let Ok(i) = sp_sandbox::Instance::new(&code, &env_builder, &mut ()) { + i + } else { + return 20; + }; + + match instance.get_global_val("test_global") { + Some(sp_sandbox::Value::I64(val)) => val, + None => 30, + val => 40, + } + } + fn test_offchain_local_storage() -> bool { let kind = sp_core::offchain::StorageKind::PERSISTENT; assert_eq!(sp_io::offchain::local_storage_get(kind, b"test"), None); @@ -262,7 +280,7 @@ sp_core::wasm_export_functions! { #[cfg(not(feature = "std"))] fn execute_sandboxed( code: &[u8], - args: &[sp_sandbox::TypedValue], + args: &[Value], ) -> Result { struct State { counter: u32, @@ -270,7 +288,7 @@ fn execute_sandboxed( fn env_assert( _e: &mut State, - args: &[sp_sandbox::TypedValue], + args: &[Value], ) -> Result { if args.len() != 1 { return Err(sp_sandbox::HostError); @@ -284,14 +302,14 @@ fn execute_sandboxed( } fn env_inc_counter( e: &mut State, - args: &[sp_sandbox::TypedValue], + args: &[Value], ) -> Result { if args.len() != 1 { return Err(sp_sandbox::HostError); } let inc_by = args[0].as_i32().ok_or_else(|| sp_sandbox::HostError)?; e.counter += inc_by as u32; - Ok(sp_sandbox::ReturnValue::Value(sp_sandbox::TypedValue::I32(e.counter as i32))) + Ok(sp_sandbox::ReturnValue::Value(Value::I32(e.counter as i32))) } let mut state = State { counter: 0 }; diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 02a5897ea4..3f3d9f69e1 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -88,7 +88,7 @@ fn call_not_existing_function(wasm_method: WasmExecutionMethod) { #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => assert_eq!( &format!("{:?}", e), - "Other(\"call to undefined external function with index 67\")" + "Other(\"call to undefined external function with index 68\")" ), } } @@ -117,7 +117,7 @@ fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => assert_eq!( &format!("{:?}", e), - "Other(\"call to undefined external function with index 68\")" + "Other(\"call to undefined external function with index 69\")" ), } } diff --git a/client/executor/src/integration_tests/sandbox.rs b/client/executor/src/integration_tests/sandbox.rs index 9458542e3a..8e8b7896cf 100644 --- a/client/executor/src/integration_tests/sandbox.rs +++ b/client/executor/src/integration_tests/sandbox.rs @@ -302,3 +302,26 @@ fn start_fn_traps(wasm_method: WasmExecutionMethod) { 2u8.encode(), ); } + +#[test_case(WasmExecutionMethod::Interpreted)] +#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] +fn get_global_val_works(wasm_method: WasmExecutionMethod) { + let mut ext = TestExternalities::default(); + let mut ext = ext.ext(); + + let code = wabt::wat2wasm(r#" + (module + (global (export "test_global") i64 (i64.const 500)) + ) + "#).unwrap().encode(); + + assert_eq!( + call_in_wasm( + "test_sandbox_get_global_val", + &code, + wasm_method, + &mut ext, + ).unwrap(), + 500i64.encode(), + ); +} diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index c4701fd827..1bcb1aab8a 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -213,7 +213,7 @@ impl<'a> Sandbox for FunctionExecutor<'a> { trace!(target: "sp-sandbox", "invoke, instance_idx={}", instance_id); // Deserialize arguments and convert them into wasmi types. - let args = Vec::::decode(&mut &args[..]) + let args = Vec::::decode(&mut &args[..]) .map_err(|_| "Can't decode serialized arguments for the invocation")? .into_iter() .map(Into::into) @@ -226,7 +226,7 @@ impl<'a> Sandbox for FunctionExecutor<'a> { Ok(None) => Ok(sandbox_primitives::ERR_OK), Ok(Some(val)) => { // Serialize return value and write it back into the memory. - sandbox_primitives::ReturnValue::Value(val.into()).using_encoded(|val| { + sp_wasm_interface::ReturnValue::Value(val.into()).using_encoded(|val| { if val.len() > return_val_len as usize { Err("Return value buffer is too small")?; } @@ -269,6 +269,17 @@ impl<'a> Sandbox for FunctionExecutor<'a> { Ok(instance_idx_or_err_code as u32) } + + fn get_global_val( + &self, + instance_idx: u32, + name: &str, + ) -> WResult> { + self.sandbox_store + .instance(instance_idx) + .map(|i| i.get_global_val(name)) + .map_err(|e| e.to_string()) + } } /// Will be used on initialization of a module to resolve function and memory imports. diff --git a/client/executor/wasmtime/src/function_executor.rs b/client/executor/wasmtime/src/function_executor.rs index bc665f18e4..7bbf5a456b 100644 --- a/client/executor/wasmtime/src/function_executor.rs +++ b/client/executor/wasmtime/src/function_executor.rs @@ -286,7 +286,7 @@ impl<'a> Sandbox for FunctionExecutor<'a> { trace!(target: "sp-sandbox", "invoke, instance_idx={}", instance_id); // Deserialize arguments and convert them into wasmi types. - let args = Vec::::decode(&mut &args[..]) + let args = Vec::::decode(&mut &args[..]) .map_err(|_| "Can't decode serialized arguments for the invocation")? .into_iter() .map(Into::into) @@ -299,7 +299,7 @@ impl<'a> Sandbox for FunctionExecutor<'a> { Ok(None) => Ok(sandbox_primitives::ERR_OK), Ok(Some(val)) => { // Serialize return value and write it back into the memory. - sandbox_primitives::ReturnValue::Value(val.into()).using_encoded(|val| { + sp_wasm_interface::ReturnValue::Value(val.into()).using_encoded(|val| { if val.len() > return_val_len as usize { Err("Return value buffer is too small")?; } @@ -337,6 +337,17 @@ impl<'a> Sandbox for FunctionExecutor<'a> { Ok(instance_idx_or_err_code as u32) } + + fn get_global_val( + &self, + instance_idx: u32, + name: &str, + ) -> WResult> { + self.sandbox_store + .instance(instance_idx) + .map(|i| i.get_global_val(name)) + .map_err(|e| e.to_string()) + } } // The storage for a Wasmtime invocation argument. diff --git a/frame/contracts/src/wasm/env_def/macros.rs b/frame/contracts/src/wasm/env_def/macros.rs index 89a147b2c6..335d35f1e7 100644 --- a/frame/contracts/src/wasm/env_def/macros.rs +++ b/frame/contracts/src/wasm/env_def/macros.rs @@ -126,7 +126,7 @@ macro_rules! define_func { ( < E: $ext_ty:tt > $name:ident ( $ctx: ident $(, $names:ident : $params:ty)*) $(-> $returns:ty)* => $body:tt ) => { fn $name< E: $ext_ty >( $ctx: &mut $crate::wasm::Runtime, - args: &[sp_sandbox::TypedValue], + args: &[sp_sandbox::Value], ) -> Result { #[allow(unused)] let mut args = args.iter(); @@ -196,7 +196,7 @@ mod tests { use parity_wasm::elements::FunctionType; use parity_wasm::elements::ValueType; use sp_runtime::traits::Zero; - use sp_sandbox::{self, ReturnValue, TypedValue}; + use sp_sandbox::{ReturnValue, Value}; use crate::wasm::tests::MockExt; use crate::wasm::Runtime; use crate::exec::Ext; @@ -206,7 +206,7 @@ mod tests { fn macro_unmarshall_then_body_then_marshall_value_or_trap() { fn test_value( _ctx: &mut u32, - args: &[sp_sandbox::TypedValue], + args: &[sp_sandbox::Value], ) -> Result { let mut args = args.iter(); unmarshall_then_body_then_marshall!( @@ -224,17 +224,17 @@ mod tests { let ctx = &mut 0; assert_eq!( - test_value(ctx, &[TypedValue::I32(15), TypedValue::I32(3)]).unwrap(), - ReturnValue::Value(TypedValue::I32(5)), + test_value(ctx, &[Value::I32(15), Value::I32(3)]).unwrap(), + ReturnValue::Value(Value::I32(5)), ); - assert!(test_value(ctx, &[TypedValue::I32(15), TypedValue::I32(0)]).is_err()); + assert!(test_value(ctx, &[Value::I32(15), Value::I32(0)]).is_err()); } #[test] fn macro_unmarshall_then_body_then_marshall_unit() { fn test_unit( ctx: &mut u32, - args: &[sp_sandbox::TypedValue], + args: &[sp_sandbox::Value], ) -> Result { let mut args = args.iter(); unmarshall_then_body_then_marshall!( @@ -248,7 +248,7 @@ mod tests { } let ctx = &mut 0; - let result = test_unit(ctx, &[TypedValue::I32(2), TypedValue::I32(3)]).unwrap(); + let result = test_unit(ctx, &[Value::I32(2), Value::I32(3)]).unwrap(); assert_eq!(result, ReturnValue::Unit); assert_eq!(*ctx, 5); } @@ -263,7 +263,7 @@ mod tests { Err(sp_sandbox::HostError) } }); - let _f: fn(&mut Runtime, &[sp_sandbox::TypedValue]) + let _f: fn(&mut Runtime, &[sp_sandbox::Value]) -> Result = ext_gas::; } @@ -282,7 +282,7 @@ mod tests { #[test] fn macro_unmarshall_then_body() { - let args = vec![TypedValue::I32(5), TypedValue::I32(3)]; + let args = vec![Value::I32(5), Value::I32(3)]; let mut args = args.iter(); let ctx: &mut u32 = &mut 0; diff --git a/frame/contracts/src/wasm/env_def/mod.rs b/frame/contracts/src/wasm/env_def/mod.rs index 004308da42..7b67f74ec9 100644 --- a/frame/contracts/src/wasm/env_def/mod.rs +++ b/frame/contracts/src/wasm/env_def/mod.rs @@ -17,7 +17,7 @@ use super::Runtime; use crate::exec::Ext; -use sp_sandbox::{self, TypedValue}; +use sp_sandbox::Value; use parity_wasm::elements::{FunctionType, ValueType}; #[macro_use] @@ -26,28 +26,28 @@ pub(crate) mod macros; pub trait ConvertibleToWasm: Sized { const VALUE_TYPE: ValueType; type NativeType; - fn to_typed_value(self) -> TypedValue; - fn from_typed_value(_: TypedValue) -> Option; + fn to_typed_value(self) -> Value; + fn from_typed_value(_: Value) -> Option; } impl ConvertibleToWasm for i32 { type NativeType = i32; const VALUE_TYPE: ValueType = ValueType::I32; - fn to_typed_value(self) -> TypedValue { - TypedValue::I32(self) + fn to_typed_value(self) -> Value { + Value::I32(self) } - fn from_typed_value(v: TypedValue) -> Option { + fn from_typed_value(v: Value) -> Option { v.as_i32() } } impl ConvertibleToWasm for u32 { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; - fn to_typed_value(self) -> TypedValue { - TypedValue::I32(self as i32) + fn to_typed_value(self) -> Value { + Value::I32(self as i32) } - fn from_typed_value(v: TypedValue) -> Option { + fn from_typed_value(v: Value) -> Option { match v { - TypedValue::I32(v) => Some(v as u32), + Value::I32(v) => Some(v as u32), _ => None, } } @@ -55,12 +55,12 @@ impl ConvertibleToWasm for u32 { impl ConvertibleToWasm for u64 { type NativeType = u64; const VALUE_TYPE: ValueType = ValueType::I64; - fn to_typed_value(self) -> TypedValue { - TypedValue::I64(self as i64) + fn to_typed_value(self) -> Value { + Value::I64(self as i64) } - fn from_typed_value(v: TypedValue) -> Option { + fn from_typed_value(v: Value) -> Option { match v { - TypedValue::I64(v) => Some(v as u64), + Value::I64(v) => Some(v as u64), _ => None, } } @@ -69,7 +69,7 @@ impl ConvertibleToWasm for u64 { pub(crate) type HostFunc = fn( &mut Runtime, - &[sp_sandbox::TypedValue] + &[sp_sandbox::Value] ) -> Result; pub(crate) trait FunctionImplProvider { diff --git a/frame/contracts/src/wasm/runtime.rs b/frame/contracts/src/wasm/runtime.rs index 07cb8cb524..66ae8a4996 100644 --- a/frame/contracts/src/wasm/runtime.rs +++ b/frame/contracts/src/wasm/runtime.rs @@ -23,9 +23,7 @@ use crate::exec::{ use crate::gas::{Gas, GasMeter, Token, GasMeterResult, approx_gas_for_balance}; use sp_sandbox; use frame_system; -use sp_std::prelude::*; -use sp_std::convert::TryInto; -use sp_std::mem; +use sp_std::{prelude::*, mem, convert::TryInto}; use codec::{Decode, Encode}; use sp_runtime::traits::{Bounded, SaturatedConversion}; @@ -89,7 +87,7 @@ pub(crate) fn to_execution_result( buffer.clear(); Ok(ExecReturnValue { status: STATUS_SUCCESS, data: buffer }) } - Ok(sp_sandbox::ReturnValue::Value(sp_sandbox::TypedValue::I32(exit_code))) => { + Ok(sp_sandbox::ReturnValue::Value(sp_sandbox::Value::I32(exit_code))) => { let status = (exit_code & 0xFF).try_into() .expect("exit_code is masked into the range of a u8; qed"); Ok(ExecReturnValue { status, data: runtime.scratch_buf }) diff --git a/primitives/core/src/sandbox.rs b/primitives/core/src/sandbox.rs index a0673c49db..73fbcfb572 100644 --- a/primitives/core/src/sandbox.rs +++ b/primitives/core/src/sandbox.rs @@ -24,99 +24,6 @@ use sp_std::vec::Vec; #[derive(crate::RuntimeDebug)] pub struct HostError; -/// Representation of a typed wasm value. -#[derive(Clone, Copy, PartialEq, Encode, Decode)] -#[derive(crate::RuntimeDebug)] -pub enum TypedValue { - /// Value of 32-bit signed or unsigned integer. - #[codec(index = "1")] - I32(i32), - - /// Value of 64-bit signed or unsigned integer. - #[codec(index = "2")] - I64(i64), - - /// Value of 32-bit IEEE 754-2008 floating point number represented as a bit pattern. - #[codec(index = "3")] - F32(i32), - - /// Value of 64-bit IEEE 754-2008 floating point number represented as a bit pattern. - #[codec(index = "4")] - F64(i64), -} - -impl TypedValue { - /// Returns `Some` if this value of type `I32`. - pub fn as_i32(&self) -> Option { - match *self { - TypedValue::I32(v) => Some(v), - _ => None, - } - } -} - -#[cfg(feature = "std")] -impl From<::wasmi::RuntimeValue> for TypedValue { - fn from(val: ::wasmi::RuntimeValue) -> TypedValue { - use ::wasmi::RuntimeValue; - match val { - RuntimeValue::I32(v) => TypedValue::I32(v), - RuntimeValue::I64(v) => TypedValue::I64(v), - RuntimeValue::F32(v) => TypedValue::F32(v.to_bits() as i32), - RuntimeValue::F64(v) => TypedValue::F64(v.to_bits() as i64), - } - } -} - -#[cfg(feature = "std")] -impl From for ::wasmi::RuntimeValue { - fn from(val: TypedValue) -> ::wasmi::RuntimeValue { - use ::wasmi::RuntimeValue; - use ::wasmi::nan_preserving_float::{F32, F64}; - match val { - TypedValue::I32(v) => RuntimeValue::I32(v), - TypedValue::I64(v) => RuntimeValue::I64(v), - TypedValue::F32(v_bits) => RuntimeValue::F32(F32::from_bits(v_bits as u32)), - TypedValue::F64(v_bits) => RuntimeValue::F64(F64::from_bits(v_bits as u64)), - } - } -} - -/// Typed value that can be returned from a function. -/// -/// Basically a `TypedValue` plus `Unit`, for functions which return nothing. -#[derive(Clone, Copy, PartialEq, Encode, Decode)] -#[derive(crate::RuntimeDebug)] -pub enum ReturnValue { - /// For returning nothing. - Unit, - /// For returning some concrete value. - Value(TypedValue), -} - -impl From for ReturnValue { - fn from(v: TypedValue) -> ReturnValue { - ReturnValue::Value(v) - } -} - -impl ReturnValue { - /// Maximum number of bytes `ReturnValue` might occupy when serialized with - /// `Codec`. - /// - /// Breakdown: - /// 1 byte for encoding unit/value variant - /// 1 byte for encoding value type - /// 8 bytes for encoding the biggest value types available in wasm: f64, i64. - pub const ENCODED_MAX_SIZE: usize = 10; -} - -#[test] -fn return_value_encoded_max_size() { - let encoded = ReturnValue::Value(TypedValue::I64(-1)).encode(); - assert_eq!(encoded.len(), ReturnValue::ENCODED_MAX_SIZE); -} - /// Describes an entity to define or import into the environment. #[derive(Clone, PartialEq, Eq, Encode, Decode)] #[derive(crate::RuntimeDebug)] diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 7d831cdfeb..f494697b4b 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -12,6 +12,7 @@ sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-std = { version = "2.0.0", default-features = false, path = "../std" } libsecp256k1 = { version = "0.3.4", optional = true } sp-state-machine = { version = "0.8", optional = true, path = "../../primitives/state-machine" } +sp-wasm-interface = { version = "2.0.0", path = "../../primitives/wasm-interface", default-features = false } sp-runtime-interface = { version = "2.0.0", default-features = false, path = "../runtime-interface" } sp-trie = { version = "2.0.0", optional = true, path = "../../primitives/trie" } sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } @@ -29,6 +30,7 @@ std = [ "libsecp256k1", "sp-runtime-interface/std", "sp-externalities", + "sp-wasm-interface/std", "log", ] diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 704477b1fb..dce67133d3 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -850,6 +850,14 @@ pub trait Sandbox { fn instance_teardown(&mut self, instance_idx: u32) { self.sandbox().instance_teardown(instance_idx).expect("Failed to teardown sandbox instance") } + + /// Get the value from a global with the given `name`. The sandbox is determined by the given + /// `instance_idx`. + /// + /// Returns `Some(_)` when the requested global variable could be found. + fn get_global_val(&mut self, instance_idx: u32, name: &str) -> Option { + self.sandbox().get_global_val(instance_idx, name).expect("Failed to get global from sandbox") + } } /// Allocator used by Substrate when executing the Wasm runtime. diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index 30e9ae6bd6..3f20de1288 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "GPL-3.0" [dependencies] -sp-wasm-interface = { version = "2.0.0", optional = true, path = "../wasm-interface" } +sp-wasm-interface = { version = "2.0.0", path = "../wasm-interface", default-features = false } sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-runtime-interface-proc-macro = { version = "2.0.0", path = "proc-macro" } sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } @@ -25,7 +25,7 @@ trybuild = "1.0.17" [features] default = [ "std" ] std = [ - "sp-wasm-interface", + "sp-wasm-interface/std", "sp-std/std", "codec/std", "sp-externalities", diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index cde8e60eea..35bd96bd05 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -17,7 +17,7 @@ //! Provides implementations for the runtime interface traits. use crate::{ - RIType, Pointer, pass_by::{PassBy, Codec, Inner, PassByInner}, + RIType, Pointer, pass_by::{PassBy, Codec, Inner, PassByInner, Enum}, util::{unpack_ptr_and_len, pack_ptr_and_len}, }; #[cfg(feature = "std")] @@ -523,3 +523,11 @@ macro_rules! for_u128_i128 { for_u128_i128!(u128); for_u128_i128!(i128); + +impl PassBy for sp_wasm_interface::ValueType { + type PassBy = Enum; +} + +impl PassBy for sp_wasm_interface::Value { + type PassBy = Codec; +} diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index 7046975416..6f50a1a4d9 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -7,7 +7,7 @@ license = "GPL-3.0" [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -codec = { package = "parity-scale-codec", version = "1.1.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.1.2", default-features = false, features = ["derive"] } sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-application-crypto = { version = "2.0.0", default-features = false, path = "../application-crypto" } sp-arithmetic = { version = "2.0.0", default-features = false, path = "../arithmetic" } diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index 071ac2ba7b..c942e019fe 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -10,6 +10,7 @@ wasmi = { version = "0.6.2", optional = true } sp-core = { version = "2.0.0", default-features = false, path = "../core" } sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-io = { version = "2.0.0", default-features = false, path = "../io" } +sp-wasm-interface = { version = "2.0.0", default-features = false, path = "../wasm-interface" } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } [dev-dependencies] @@ -24,5 +25,6 @@ std = [ "sp-std/std", "codec/std", "sp-io/std", + "sp-wasm-interface/std", ] strict = [] diff --git a/primitives/sandbox/src/lib.rs b/primitives/sandbox/src/lib.rs index 2760a46b48..17712ad365 100755 --- a/primitives/sandbox/src/lib.rs +++ b/primitives/sandbox/src/lib.rs @@ -40,7 +40,8 @@ use sp_std::prelude::*; -pub use sp_core::sandbox::{TypedValue, ReturnValue, HostError}; +pub use sp_core::sandbox::HostError; +pub use sp_wasm_interface::{Value, ReturnValue}; mod imp { #[cfg(feature = "std")] @@ -75,7 +76,7 @@ impl From for HostError { /// supervisor in [`EnvironmentDefinitionBuilder`]. /// /// [`EnvironmentDefinitionBuilder`]: struct.EnvironmentDefinitionBuilder.html -pub type HostFuncType = fn(&mut T, &[TypedValue]) -> Result; +pub type HostFuncType = fn(&mut T, &[Value]) -> Result; /// Reference to a sandboxed linear memory, that /// will be used by the guest module. @@ -197,9 +198,16 @@ impl Instance { pub fn invoke( &mut self, name: &str, - args: &[TypedValue], + args: &[Value], state: &mut T, ) -> Result { self.inner.invoke(name, args, state) } + + /// Get the value from a global with the given `name`. + /// + /// Returns `Some(_)` if the global could be found. + pub fn get_global_val(&self, name: &str) -> Option { + self.inner.get_global_val(name) + } } diff --git a/primitives/sandbox/with_std.rs b/primitives/sandbox/with_std.rs index 5f20342a5a..cc3119003d 100755 --- a/primitives/sandbox/with_std.rs +++ b/primitives/sandbox/with_std.rs @@ -23,7 +23,7 @@ use wasmi::{ RuntimeArgs, RuntimeValue, Signature, TableDescriptor, TableRef, Trap, TrapKind }; use wasmi::memory_units::Pages; -use super::{Error, TypedValue, ReturnValue, HostFuncType, HostError}; +use super::{Error, Value, ReturnValue, HostFuncType, HostError}; #[derive(Clone)] pub struct Memory { @@ -88,27 +88,7 @@ impl fmt::Display for DummyHostError { } } -impl wasmi::HostError for DummyHostError { -} - -fn from_runtime_value(v: RuntimeValue) -> TypedValue { - match v { - RuntimeValue::I32(v) => TypedValue::I32(v), - RuntimeValue::I64(v) => TypedValue::I64(v), - RuntimeValue::F32(v) => TypedValue::F32(v.to_bits() as i32), - RuntimeValue::F64(v) => TypedValue::F64(v.to_bits() as i64), - } -} - -fn to_runtime_value(v: TypedValue) -> RuntimeValue { - use wasmi::nan_preserving_float::{F32, F64}; - match v { - TypedValue::I32(v) => RuntimeValue::I32(v as i32), - TypedValue::I64(v) => RuntimeValue::I64(v as i64), - TypedValue::F32(v_bits) => RuntimeValue::F32(F32::from_bits(v_bits as u32)), - TypedValue::F64(v_bits) => RuntimeValue::F64(F64::from_bits(v_bits as u64)), - } -} +impl wasmi::HostError for DummyHostError {} struct GuestExternals<'a, T: 'a> { state: &'a mut T, @@ -124,13 +104,13 @@ impl<'a, T> Externals for GuestExternals<'a, T> { let args = args.as_ref() .iter() .cloned() - .map(from_runtime_value) + .map(Into::into) .collect::>(); let result = (self.defined_host_functions.funcs[index])(self.state, &args); match result { Ok(value) => Ok(match value { - ReturnValue::Value(v) => Some(to_runtime_value(v)), + ReturnValue::Value(v) => Some(v.into()), ReturnValue::Unit => None, }), Err(HostError) => Err(TrapKind::Host(Box::new(DummyHostError)).into()), @@ -253,7 +233,7 @@ impl ImportResolver for EnvironmentDefinitionBuilder { pub struct Instance { instance: ModuleRef, defined_host_functions: DefinedHostFunctions, - _marker: ::std::marker::PhantomData, + _marker: std::marker::PhantomData, } impl Instance { @@ -281,14 +261,14 @@ impl Instance { Ok(Instance { instance, defined_host_functions, - _marker: ::std::marker::PhantomData::, + _marker: std::marker::PhantomData::, }) } pub fn invoke( &mut self, name: &str, - args: &[TypedValue], + args: &[Value], state: &mut T, ) -> Result { let args = args.iter().cloned().map(Into::into).collect::>(); @@ -306,20 +286,29 @@ impl Instance { Err(_err) => Err(Error::Execution), } } + + pub fn get_global_val(&self, name: &str) -> Option { + let global = self.instance + .export_by_name(name)? + .as_global()? + .get(); + + Some(global.into()) + } } #[cfg(test)] mod tests { use wabt; - use crate::{Error, TypedValue, ReturnValue, HostError, EnvironmentDefinitionBuilder, Instance}; + use crate::{Error, Value, ReturnValue, HostError, EnvironmentDefinitionBuilder, Instance}; use assert_matches::assert_matches; - fn execute_sandboxed(code: &[u8], args: &[TypedValue]) -> Result { + fn execute_sandboxed(code: &[u8], args: &[Value]) -> Result { struct State { counter: u32, } - fn env_assert(_e: &mut State, args: &[TypedValue]) -> Result { + fn env_assert(_e: &mut State, args: &[Value]) -> Result { if args.len() != 1 { return Err(HostError); } @@ -330,16 +319,16 @@ mod tests { Err(HostError) } } - fn env_inc_counter(e: &mut State, args: &[TypedValue]) -> Result { + fn env_inc_counter(e: &mut State, args: &[Value]) -> Result { if args.len() != 1 { return Err(HostError); } let inc_by = args[0].as_i32().ok_or_else(|| HostError)?; e.counter += inc_by as u32; - Ok(ReturnValue::Value(TypedValue::I32(e.counter as i32))) + Ok(ReturnValue::Value(Value::I32(e.counter as i32))) } /// Function that takes one argument of any type and returns that value. - fn env_polymorphic_id(_e: &mut State, args: &[TypedValue]) -> Result { + fn env_polymorphic_id(_e: &mut State, args: &[Value]) -> Result { if args.len() != 1 { return Err(HostError); } @@ -387,8 +376,8 @@ mod tests { let result = execute_sandboxed( &code, &[ - TypedValue::I32(0x12345678), - TypedValue::I64(0x1234567887654321), + Value::I32(0x12345678), + Value::I64(0x1234567887654321), ] ); assert!(result.is_ok()); @@ -410,10 +399,10 @@ mod tests { let return_val = execute_sandboxed( &code, &[ - TypedValue::I32(0x1336), + Value::I32(0x1336), ] ).unwrap(); - assert_eq!(return_val, ReturnValue::Value(TypedValue::I32(0x1337))); + assert_eq!(return_val, ReturnValue::Value(Value::I32(0x1337))); } #[test] @@ -453,8 +442,8 @@ mod tests { #[test] fn cant_return_unmatching_type() { - fn env_returns_i32(_e: &mut (), _args: &[TypedValue]) -> Result { - Ok(ReturnValue::Value(TypedValue::I32(42))) + fn env_returns_i32(_e: &mut (), _args: &[Value]) -> Result { + Ok(ReturnValue::Value(Value::I32(42))) } let mut env_builder = EnvironmentDefinitionBuilder::new(); diff --git a/primitives/sandbox/without_std.rs b/primitives/sandbox/without_std.rs index 901354aee3..c31c6fe349 100755 --- a/primitives/sandbox/without_std.rs +++ b/primitives/sandbox/without_std.rs @@ -18,7 +18,7 @@ use codec::{Decode, Encode}; use sp_core::sandbox as sandbox_primitives; use sp_io::sandbox; use sp_std::{prelude::*, slice, marker, mem, vec, rc::Rc}; -use super::{Error, TypedValue, ReturnValue, HostFuncType}; +use super::{Error, Value, ReturnValue, HostFuncType}; mod ffi { use sp_std::mem; @@ -183,7 +183,7 @@ extern "C" fn dispatch_thunk( slice::from_raw_parts(serialized_args_ptr, serialized_args_len) } }; - let args = Vec::::decode(&mut &serialized_args[..]).expect( + let args = Vec::::decode(&mut &serialized_args[..]).expect( "serialized args should be provided by the runtime; correctly serialized data should be deserializable; qed", @@ -244,11 +244,11 @@ impl Instance { pub fn invoke( &mut self, name: &str, - args: &[TypedValue], + args: &[Value], state: &mut T, ) -> Result { let serialized_args = args.to_vec().encode(); - let mut return_val = vec![0u8; sandbox_primitives::ReturnValue::ENCODED_MAX_SIZE]; + let mut return_val = vec![0u8; ReturnValue::ENCODED_MAX_SIZE]; let result = sandbox::invoke( self.instance_idx, @@ -261,7 +261,7 @@ impl Instance { match result { sandbox_primitives::ERR_OK => { - let return_val = sandbox_primitives::ReturnValue::decode(&mut &return_val[..]) + let return_val = ReturnValue::decode(&mut &return_val[..]) .map_err(|_| Error::Execution)?; Ok(return_val) } @@ -269,6 +269,10 @@ impl Instance { _ => unreachable!(), } } + + pub fn get_global_val(&self, name: &str) -> Option { + sandbox::get_global_val(self.instance_idx, name) + } } impl Drop for Instance { diff --git a/primitives/wasm-interface/Cargo.toml b/primitives/wasm-interface/Cargo.toml index b97e3040aa..bb9ea85872 100644 --- a/primitives/wasm-interface/Cargo.toml +++ b/primitives/wasm-interface/Cargo.toml @@ -9,7 +9,8 @@ license = "GPL-3.0" wasmi = { version = "0.6.2", optional = true } impl-trait-for-tuples = "0.1.2" sp-std = { version = "2.0.0", path = "../std", default-features = false } +codec = { package = "parity-scale-codec", version = "1.1.2", default-features = false, features = ["derive"] } [features] default = [ "std" ] -std = [ "wasmi", "sp-std/std" ] +std = [ "wasmi", "sp-std/std", "codec/std" ] diff --git a/primitives/wasm-interface/src/lib.rs b/primitives/wasm-interface/src/lib.rs index d6f9bbfbf0..7bb4469c77 100644 --- a/primitives/wasm-interface/src/lib.rs +++ b/primitives/wasm-interface/src/lib.rs @@ -44,8 +44,33 @@ pub enum ValueType { F64, } +impl From for u8 { + fn from(val: ValueType) -> u8 { + match val { + ValueType::I32 => 0, + ValueType::I64 => 1, + ValueType::F32 => 2, + ValueType::F64 => 3, + } + } +} + +impl sp_std::convert::TryFrom for ValueType { + type Error = (); + + fn try_from(val: u8) -> sp_std::result::Result { + match val { + 0 => Ok(Self::I32), + 1 => Ok(Self::I64), + 2 => Ok(Self::F32), + 3 => Ok(Self::F64), + _ => Err(()), + } + } +} + /// Values supported by Substrate on the boundary between host/Wasm. -#[derive(PartialEq, Debug, Clone, Copy)] +#[derive(PartialEq, Debug, Clone, Copy, codec::Encode, codec::Decode)] pub enum Value { /// A 32-bit integer. I32(i32), @@ -71,6 +96,14 @@ impl Value { Value::F64(_) => ValueType::F64, } } + + /// Return `Self` as `i32`. + pub fn as_i32(&self) -> Option { + match self { + Self::I32(val) => Some(*val), + _ => None, + } + } } /// Provides `Sealed` trait to prevent implementing trait `PointerType` outside of this crate. @@ -298,6 +331,12 @@ pub trait Sandbox { raw_env_def: &[u8], state: u32, ) -> Result; + + /// Get the value from a global with the given `name`. The sandbox is determined by the + /// given `instance_idx` instance. + /// + /// Returns `Some(_)` when the requested global variable could be found. + fn get_global_val(&self, instance_idx: u32, name: &str) -> Result>; } /// Something that provides implementations for host functions. @@ -409,9 +448,37 @@ impl ReadPrimitive for &mut dyn FunctionContext { } } +/// Typed value that can be returned from a function. +/// +/// Basically a `TypedValue` plus `Unit`, for functions which return nothing. +#[derive(Clone, Copy, PartialEq, codec::Encode, codec::Decode, Debug)] +pub enum ReturnValue { + /// For returning nothing. + Unit, + /// For returning some concrete value. + Value(Value), +} + +impl From for ReturnValue { + fn from(v: Value) -> ReturnValue { + ReturnValue::Value(v) + } +} + +impl ReturnValue { + /// Maximum number of bytes `ReturnValue` might occupy when serialized with `SCALE`. + /// + /// Breakdown: + /// 1 byte for encoding unit/value variant + /// 1 byte for encoding value type + /// 8 bytes for encoding the biggest value types available in wasm: f64, i64. + pub const ENCODED_MAX_SIZE: usize = 10; +} + #[cfg(test)] mod tests { use super::*; + use codec::Encode; #[test] fn pointer_offset_works() { @@ -425,4 +492,11 @@ mod tests { assert_eq!(ptr.offset(10).unwrap(), Pointer::new(80)); assert_eq!(ptr.offset(32).unwrap(), Pointer::new(256)); } + + + #[test] + fn return_value_encoded_max_size() { + let encoded = ReturnValue::Value(Value::I64(-1)).encode(); + assert_eq!(encoded.len(), ReturnValue::ENCODED_MAX_SIZE); + } } -- GitLab From 8e074bb17cb68a3df6093e0513e728519f1676d0 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 29 Jan 2020 17:57:51 +0100 Subject: [PATCH 212/296] RPC calls should execute with configured strategy (#4772) --- client/rpc/src/state/state_full.rs | 48 ++++++++++++++---------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/client/rpc/src/state/state_full.rs b/client/rpc/src/state/state_full.rs index e42e6b722e..cd77e8b080 100644 --- a/client/rpc/src/state/state_full.rs +++ b/client/rpc/src/state/state_full.rs @@ -30,7 +30,7 @@ use sp_blockchain::{ Result as ClientResult, Error as ClientError, HeaderMetadata, CachedHeaderMetadata }; use sc_client::{ - Client, CallExecutor, BlockchainEvents, + Client, CallExecutor, BlockchainEvents }; use sp_core::{ Bytes, storage::{well_known_keys, StorageKey, StorageData, StorageChangeSet, ChildInfo}, @@ -213,15 +213,14 @@ impl FullState } } -impl StateBackend for FullState - where - Block: BlockT + 'static, - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static + Clone, - RA: Send + Sync + 'static, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - Metadata, +impl StateBackend for FullState where + Block: BlockT + 'static, + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, + RA: Send + Sync + 'static, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: + Metadata, { fn call( &self, @@ -229,21 +228,20 @@ impl StateBackend for FullState FutureResult { - Box::new(result( - self.block_or_best(block) - .and_then(|block| - self - .client - .executor() - .call( - &BlockId::Hash(block), - &method, - &*call_data, - ExecutionStrategy::NativeElseWasm, - None, - ) - .map(Into::into)) - .map_err(client_err))) + let r = self.block_or_best(block) + .and_then(|block| self + .client + .executor() + .call( + &BlockId::Hash(block), + &method, + &*call_data, + self.client.execution_extensions().strategies().other, + None, + ) + .map(Into::into) + ).map_err(client_err); + Box::new(result(r)) } fn storage_keys( -- GitLab From 2c9ce7296b19934b1ffd50150be2fdb2ddf81a4e Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 29 Jan 2020 18:41:51 +0100 Subject: [PATCH 213/296] Identity should bound additional fields (#4770) * Identity should bound additional fields * ump rutnime --- bin/node/runtime/src/lib.rs | 10 ++++++---- frame/identity/src/lib.rs | 34 ++++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 0d4b094c79..3f12957a05 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 208, - impl_version: 1, + spec_version: 209, + impl_version: 0, apis: RUNTIME_API_VERSIONS, }; @@ -490,7 +490,8 @@ parameter_types! { pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain pub const FieldDeposit: Balance = 250 * CENTS; // 66 bytes on-chain pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain - pub const MaximumSubAccounts: u32 = 100; + pub const MaxSubAccounts: u32 = 100; + pub const MaxAdditionalFields: u32 = 100; } impl pallet_identity::Trait for Runtime { @@ -500,7 +501,8 @@ impl pallet_identity::Trait for Runtime { type BasicDeposit = BasicDeposit; type FieldDeposit = FieldDeposit; type SubAccountDeposit = SubAccountDeposit; - type MaximumSubAccounts = MaximumSubAccounts; + type MaxSubAccounts = MaxSubAccounts; + type MaxAdditionalFields = MaxAdditionalFields; type RegistrarOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; type ForceOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; } diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 631d77d0bf..b16e87ff81 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -100,7 +100,11 @@ pub trait Trait: frame_system::Trait { type SubAccountDeposit: Get>; /// The maximum number of sub-accounts allowed per identified account. - type MaximumSubAccounts: Get; + type MaxSubAccounts: Get; + + /// Maximum number of additional fields that may be stored in an ID. Needed to bound the I/O + /// required to access an identity, but can be pretty high. + type MaxAdditionalFields: Get; /// What to do with slashed funds. type Slashed: OnUnbalanced>; @@ -443,7 +447,9 @@ decl_error! { InvalidIndex, /// The target is invalid. InvalidTarget, - } + /// Too many additional fields. + TooManyFields, +} } decl_module! { @@ -493,15 +499,17 @@ decl_module! { /// Emits `IdentitySet` if successful. /// /// # - /// - `O(X + R)` where `X` additional-field-count (deposit-bounded). + /// - `O(X + X' + R)` where `X` additional-field-count (deposit-bounded and code-bounded). /// - At most two balance operations. - /// - One storage mutation (codec `O(X + R)`). + /// - One storage mutation (codec-read `O(X' + R)`, codec-write `O(X + R)`). /// - One event. /// # #[weight = SimpleDispatchInfo::FixedNormal(50_000)] fn set_identity(origin, info: IdentityInfo) { let sender = ensure_signed(origin)?; - let fd = >::from(info.additional.len() as u32) * T::FieldDeposit::get(); + let extra_fields = info.additional.len() as u32; + ensure!(extra_fields <= T::MaxAdditionalFields::get(), Error::::TooManyFields); + let fd = >::from(extra_fields) * T::FieldDeposit::get(); let mut id = match >::get(&sender) { Some(mut id) => { @@ -546,7 +554,7 @@ decl_module! { fn set_subs(origin, subs: Vec<(T::AccountId, Data)>) { let sender = ensure_signed(origin)?; ensure!(>::exists(&sender), Error::::NotFound); - ensure!(subs.len() <= T::MaximumSubAccounts::get() as usize, Error::::TooManySubAccounts); + ensure!(subs.len() <= T::MaxSubAccounts::get() as usize, Error::::TooManySubAccounts); let (old_deposit, old_ids) = >::get(&sender); let new_deposit = T::SubAccountDeposit::get() * >::from(subs.len() as u32); @@ -936,7 +944,8 @@ mod tests { pub const BasicDeposit: u64 = 10; pub const FieldDeposit: u64 = 10; pub const SubAccountDeposit: u64 = 10; - pub const MaximumSubAccounts: u32 = 2; + pub const MaxSubAccounts: u32 = 2; + pub const MaxAdditionalFields: u32 = 2; } ord_parameter_types! { pub const One: u64 = 1; @@ -949,7 +958,8 @@ mod tests { type BasicDeposit = BasicDeposit; type FieldDeposit = FieldDeposit; type SubAccountDeposit = SubAccountDeposit; - type MaximumSubAccounts = MaximumSubAccounts; + type MaxSubAccounts = MaxSubAccounts; + type MaxAdditionalFields = MaxAdditionalFields; type RegistrarOrigin = EnsureSignedBy; type ForceOrigin = EnsureSignedBy; } @@ -1012,6 +1022,14 @@ mod tests { new_test_ext().execute_with(|| { assert_ok!(Identity::add_registrar(Origin::signed(1), 3)); assert_ok!(Identity::set_fee(Origin::signed(3), 0, 10)); + let mut three_fields = ten(); + three_fields.additional.push(Default::default()); + three_fields.additional.push(Default::default()); + three_fields.additional.push(Default::default()); + assert_noop!( + Identity::set_identity(Origin::signed(10), three_fields), + Error::::TooManyFields + ); assert_ok!(Identity::set_identity(Origin::signed(10), ten())); assert_eq!(Identity::identity(10).unwrap().info, ten()); assert_eq!(Balances::free_balance(10), 90); -- GitLab From 7d58ceeb46aa13899da5a9d94eeee52555a948c9 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Wed, 29 Jan 2020 18:42:21 +0100 Subject: [PATCH 214/296] client/finality-grandpa/src/observer: Poll NetworkBridge (#4766) Patch d4fbb897c reintegrated the periodic neighbor packet worker, by moving its logic into a `Future` implementation on `NetworkBridge` which needs to be polled by its upper layer. Polling by the upper layer was implemented within the `Future` implementation of the `VoterWork` struct but not within the `Future` implementation of the `ObserverWork` struct. This patch adds polling of the `NetworkBridge` to the latter. --- client/finality-grandpa/src/observer.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index 418bd570c0..ef85bede1c 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -336,10 +336,8 @@ where { type Output = Result<(), Error>; - fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll { - let this = Pin::into_inner(self); - - match Future::poll(Pin::new(&mut this.observer), cx) { + fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll { + match Future::poll(Pin::new(&mut self.observer), cx) { Poll::Pending => {} Poll::Ready(Ok(())) => { // observer commit stream doesn't conclude naturally; this could reasonably be an error. @@ -351,12 +349,12 @@ where } Poll::Ready(Err(CommandOrError::VoterCommand(command))) => { // some command issued internally - this.handle_voter_command(command)?; + self.handle_voter_command(command)?; cx.waker().wake_by_ref(); } } - match Stream::poll_next(Pin::new(&mut this.voter_commands_rx), cx) { + match Stream::poll_next(Pin::new(&mut self.voter_commands_rx), cx) { Poll::Pending => {} Poll::Ready(None) => { // the `voter_commands_rx` stream should never conclude since it's never closed. @@ -364,11 +362,11 @@ where } Poll::Ready(Some(command)) => { // some command issued externally - this.handle_voter_command(command)?; + self.handle_voter_command(command)?; cx.waker().wake_by_ref(); } } - Poll::Pending + Future::poll(Pin::new(&mut self.network), cx) } } -- GitLab From 2e1717225a5971f1f9e89f443657ee1c8d2e3d48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 29 Jan 2020 21:37:26 +0100 Subject: [PATCH 215/296] Fix warnings. (#4768) --- bin/node-template/src/cli.rs | 4 +++- bin/node-template/src/service.rs | 1 - bin/node/cli/src/cli.rs | 4 +++- client/finality-grandpa/src/lib.rs | 9 --------- client/network/test/src/lib.rs | 2 +- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/bin/node-template/src/cli.rs b/bin/node-template/src/cli.rs index fcfd330816..8408f17379 100644 --- a/bin/node-template/src/cli.rs +++ b/bin/node-template/src/cli.rs @@ -90,7 +90,9 @@ where let _ = exit_send.send(()); - runtime.block_on(handle); + if let Err(e) = runtime.block_on(handle) { + log::error!("Error running node: {:?}", e); + } match service_res { Either::Left((res, _)) => res.map_err(error::Error::Service), diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index a396a5301c..bdaff5ad09 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -11,7 +11,6 @@ use sc_executor::native_executor_instance; pub use sc_executor::NativeExecutor; use sp_consensus_aura::sr25519::{AuthorityPair as AuraPair}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; -use futures::{FutureExt, compat::Future01CompatExt}; // Our native executor instance. native_executor_instance!( diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 2c68789e38..2a3d60a794 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -200,7 +200,9 @@ where let _ = exit_send.send(()); - runtime.block_on(handle); + if let Err(e) = runtime.block_on(handle) { + log::error!("Error running node: {:?}", e); + } match service_res { Either::Left((res, _)) => res.map_err(error::Error::Service), diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index a86a97c0da..afca0ed48b 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -171,15 +171,6 @@ type CommunicationInH = finality_grandpa::voter::CommunicationIn< AuthorityId, >; -/// A global communication sink for commits. Not exposed publicly, used -/// internally to simplify types in the communication layer. -type CommunicationOut = finality_grandpa::voter::CommunicationOut< - ::Hash, - NumberFor, - AuthoritySignature, - AuthorityId, ->; - /// Global communication sink for commits with the hash type not being derived /// from the block, useful for forcing the hash to some type (e.g. `H256`) when /// the compiler can't do the inference. diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 1e14ec7bb0..22e340a2a8 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -392,7 +392,7 @@ impl TransactionPool for EmptyTransactionPool { fn on_broadcasted(&self, _: HashMap>) {} - fn transaction(&self, h: &Hash) -> Option { None } + fn transaction(&self, _h: &Hash) -> Option { None } } pub trait SpecializationFactory { -- GitLab From 1ed1cc542110aaaee9cf0de87a7c256a1de407c6 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 30 Jan 2020 09:54:10 +0100 Subject: [PATCH 216/296] Remove --release from check_for_exit.sh (#4775) I don't see any good reason to build with --release to test this but this step takes 8-8:30 min on the CI and I suspect we would save some time by using the debug build instead. --- .maintain/check_for_exit.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.maintain/check_for_exit.sh b/.maintain/check_for_exit.sh index c5a54eb83b..edc2130e57 100755 --- a/.maintain/check_for_exit.sh +++ b/.maintain/check_for_exit.sh @@ -4,8 +4,8 @@ set -e -cargo build --release -./target/release/substrate --dev & +cargo build +./target/debug/substrate --dev & PID=$! # Let the chain running for 60 seconds -- GitLab From 26e37ff685819646633f5246419c03c02df81dff Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 30 Jan 2020 11:40:08 +0100 Subject: [PATCH 217/296] CLI API refactoring and improvement (#4692) It changes the way we extended the CLI functionalities of substrate to allow more flexibility. (If this was not clear, here is another version: it changes the `sc_cli` API to allow more flexibility). This touches a few important things: - the startup of the async task with tokei: This was in node and node-template and I moved it to substrate. The idea is to have 1 time the code that handles unix signals (SIGTERM and SIGINT) properly. It is however possible to make this more generic to wait for a future instead and provide only a helper for the basic handling of SIGTERM and SIGINT. - increased the version of structopt and tokei - no more use of structopt internal's API - less use of generics Related to #4643 and https://github.com/paritytech/cumulus/pull/42: the implementation of "into_configuration" and "get_config" are similar but with better flexibility so it is now possible in cumulus to have the command-line arguments only of the run command for polkadot if we want Related to https://github.com/paritytech/cumulus/issues/24 and https://github.com/paritytech/cumulus/issues/34 : it will now be possible to make a configuration struct for polkadot with some overrides of the default parameters much more easily. --- Cargo.lock | 1435 +++++++++++------------ bin/node-template/Cargo.toml | 5 +- bin/node-template/src/chain_spec.rs | 7 + bin/node-template/src/cli.rs | 126 +- bin/node-template/src/command.rs | 48 + bin/node-template/src/main.rs | 8 +- bin/node-template/src/service.rs | 4 +- bin/node/cli/Cargo.toml | 23 +- bin/node/cli/bin/main.rs | 26 +- bin/node/cli/build.rs | 69 +- bin/node/cli/src/browser.rs | 4 +- bin/node/cli/src/cli.rs | 159 +-- bin/node/cli/src/command.rs | 82 ++ bin/node/cli/src/lib.rs | 4 + bin/node/cli/src/service.rs | 6 +- bin/utils/chain-spec-builder/Cargo.toml | 2 +- client/cli/Cargo.toml | 5 +- client/cli/src/lib.rs | 1136 ++++-------------- client/cli/src/node_key.rs | 208 ++++ client/cli/src/params.rs | 526 ++++++--- client/cli/src/runtime.rs | 138 +++ client/service/src/builder.rs | 78 +- client/service/src/chain_ops.rs | 4 +- client/service/src/config.rs | 45 +- client/service/src/lib.rs | 12 +- client/service/test/src/lib.rs | 45 +- primitives/keyring/src/sr25519.rs | 27 + utils/browser/src/lib.rs | 9 +- 28 files changed, 2024 insertions(+), 2217 deletions(-) create mode 100644 bin/node-template/src/command.rs create mode 100644 bin/node/cli/src/command.rs create mode 100644 client/cli/src/node_key.rs create mode 100644 client/cli/src/runtime.rs diff --git a/Cargo.lock b/Cargo.lock index 0ad431f9d3..f28d341847 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,7 +6,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -50,15 +50,15 @@ name = "ahash" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "const-random 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "const-random 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "aho-corasick" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +79,7 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -100,7 +100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "arrayref" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -130,7 +130,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -140,10 +140,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "async-std" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-task 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-task 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "broadcaster 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -152,23 +152,24 @@ dependencies = [ "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "async-task" -version = "1.0.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -184,9 +185,10 @@ dependencies = [ [[package]] name = "atty" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -196,9 +198,14 @@ name = "autocfg" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "backtrace" -version = "0.3.40" +version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", @@ -212,7 +219,7 @@ name = "backtrace-sys" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -265,11 +272,11 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (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.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -306,17 +313,17 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "blake2b_simd" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -371,7 +378,7 @@ dependencies = [ "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-chain-spec 2.0.0", @@ -393,11 +400,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bstr" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -417,7 +424,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byte-slice-cast" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -471,7 +478,7 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -484,11 +491,10 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.48" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jobserver 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -513,7 +519,7 @@ dependencies = [ "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-keystore 2.0.0", "sp-core 2.0.0", - "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -521,8 +527,8 @@ name = "chrono" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -543,7 +549,7 @@ version = "2.33.0" 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.13 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -556,7 +562,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -572,7 +578,7 @@ name = "cmake" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -589,31 +595,31 @@ name = "console_log" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "const-random" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "const-random-macro 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "const-random-macro 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "const-random-macro" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "constant_time_eq" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -648,11 +654,11 @@ dependencies = [ "cranelift-codegen-meta 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-codegen-shared 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -683,7 +689,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -706,9 +712,9 @@ dependencies = [ "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -725,49 +731,49 @@ name = "criterion" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion-plot 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xoshiro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -782,7 +788,7 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -829,9 +835,10 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -870,12 +877,12 @@ dependencies = [ [[package]] name = "csv" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -885,7 +892,7 @@ name = "csv-core" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -902,7 +909,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -914,15 +921,6 @@ dependencies = [ "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ctrlc" -version = "3.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "cuckoofilter" version = "0.3.2" @@ -966,9 +964,9 @@ name = "derive_more" version = "0.99.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1000,7 +998,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1010,7 +1008,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1047,9 +1045,9 @@ name = "enumflags2_derive" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1057,11 +1055,11 @@ name = "env_logger" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1069,11 +1067,11 @@ name = "env_logger" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1083,7 +1081,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "erased-serde" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1116,7 +1114,7 @@ dependencies = [ "evm-core 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "evm-gasometer 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "evm-runtime 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1127,7 +1125,7 @@ name = "evm-core" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1137,7 +1135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "evm-core 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "evm-runtime 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1146,7 +1144,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "evm-core 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1163,14 +1161,14 @@ name = "faerie" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "goblin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "goblin 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "string-interner 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1178,7 +1176,7 @@ name = "failure" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1187,9 +1185,9 @@ name = "failure_derive" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1205,7 +1203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fdlimit" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1217,7 +1215,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1227,8 +1225,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1236,7 +1234,7 @@ dependencies = [ [[package]] name = "fixed-hash" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1330,7 +1328,7 @@ dependencies = [ "frame-support-procedural 2.0.0", "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1343,7 +1341,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-state-machine 0.8.0", "sp-std 2.0.0", - "tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1351,9 +1349,9 @@ name = "frame-support-procedural" version = "2.0.0" dependencies = [ "frame-support-procedural-tools 2.0.0", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1362,18 +1360,18 @@ version = "2.0.0" dependencies = [ "frame-support-procedural-tools-derive 2.0.0", "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1389,7 +1387,7 @@ dependencies = [ "sp-io 2.0.0", "sp-runtime 2.0.0", "sp-state-machine 0.8.0", - "trybuild 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1510,7 +1508,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1521,11 +1519,11 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1536,7 +1534,7 @@ dependencies = [ "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1550,9 +1548,9 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1597,7 +1595,7 @@ dependencies = [ "futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1624,8 +1622,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1671,12 +1669,12 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1688,7 +1686,7 @@ dependencies = [ "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1707,19 +1705,19 @@ name = "globset" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.10 (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.10 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "goblin" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1728,18 +1726,18 @@ dependencies = [ name = "grafana-data-source" version = "0.8.0" dependencies = [ - "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1762,8 +1760,8 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "string 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)", @@ -1780,10 +1778,10 @@ dependencies = [ "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1833,7 +1831,7 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1887,7 +1885,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)", - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1897,7 +1895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (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)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1930,7 +1928,7 @@ name = "humantime" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1943,7 +1941,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.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1964,8 +1962,8 @@ dependencies = [ "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (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.10 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (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)", @@ -1993,11 +1991,11 @@ dependencies = [ "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (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.10 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2013,7 +2011,7 @@ dependencies = [ "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2037,7 +2035,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2047,7 +2045,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2074,27 +2072,35 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "impl-serde" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "impl-trait-for-tuples" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "indexmap" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "integer-sqrt" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2125,17 +2131,15 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jobserver" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2157,9 +2161,9 @@ dependencies = [ "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2171,10 +2175,10 @@ version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2191,9 +2195,9 @@ version = "14.0.5" 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 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2204,7 +2208,7 @@ dependencies = [ "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2216,7 +2220,7 @@ version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2230,7 +2234,7 @@ dependencies = [ "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (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.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2243,7 +2247,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.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.9.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2278,7 +2282,7 @@ name = "kv-log-macro" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2309,12 +2313,12 @@ dependencies = [ "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2328,7 +2332,7 @@ dependencies = [ "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2344,9 +2348,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "lazycell" @@ -2363,7 +2364,7 @@ name = "libloading" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2395,10 +2396,10 @@ dependencies = [ "libp2p-wasm-ext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-websocket 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-yamux 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2416,20 +2417,20 @@ dependencies = [ "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2442,7 +2443,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2462,7 +2463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2496,7 +2497,7 @@ dependencies = [ "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2515,7 +2516,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2535,7 +2536,7 @@ dependencies = [ "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2553,7 +2554,7 @@ name = "libp2p-mdns" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2561,7 +2562,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2579,7 +2580,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2593,7 +2594,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2611,7 +2612,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2626,10 +2627,10 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2646,15 +2647,15 @@ dependencies = [ "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2670,7 +2671,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2681,13 +2682,13 @@ name = "libp2p-tcp" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2695,10 +2696,10 @@ name = "libp2p-uds" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2724,12 +2725,12 @@ dependencies = [ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2741,10 +2742,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2753,7 +2754,7 @@ version = "6.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bindgen 0.49.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2763,7 +2764,7 @@ name = "libsecp256k1" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "hmac-drbg 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2778,7 +2779,7 @@ name = "libz-sys" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2807,7 +2808,7 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2818,12 +2819,12 @@ name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.10" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2858,8 +2859,8 @@ name = "malloc_size_of_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2875,7 +2876,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2943,7 +2944,7 @@ dependencies = [ "iovec 0.1.4 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (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)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2956,7 +2957,7 @@ version = "2.0.6" 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.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3004,7 +3005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.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)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3025,7 +3026,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "openssl 0.10.26 (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.53 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3045,30 +3046,17 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "nix" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "node-cli" version = "2.0.0" dependencies = [ "browser-utils 0.8.0", - "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "frame-support 2.0.0", "frame-system 2.0.0", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", "node-rpc 2.0.0", @@ -3113,10 +3101,9 @@ dependencies = [ "sp-runtime 2.0.0", "sp-timestamp 2.0.0", "sp-transaction-pool 2.0.0", - "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-build-script-utils 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3126,7 +3113,7 @@ dependencies = [ name = "node-executor" version = "2.0.0" dependencies = [ - "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "frame-support 2.0.0", "frame-system 2.0.0", "node-primitives 2.0.0", @@ -3188,7 +3175,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "sc-rpc 2.0.0", ] @@ -3201,7 +3188,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "frame-system-rpc-runtime-api 2.0.0", - "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "pallet-authority-discovery 2.0.0", "pallet-authorship 2.0.0", @@ -3256,9 +3243,8 @@ dependencies = [ name = "node-template" version = "2.0.0" dependencies = [ - "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", "sc-basic-authorship 0.8.0", "sc-cli 0.8.0", @@ -3276,8 +3262,8 @@ dependencies = [ "sp-inherents 2.0.0", "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", + "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-build-script-utils 2.0.0", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3347,7 +3333,7 @@ dependencies = [ name = "node-transaction-factory" version = "0.8.0" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-cli 0.8.0", "sc-client 0.8.0", @@ -3368,7 +3354,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "nohash-hasher" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3376,54 +3362,54 @@ name = "nom" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-bigint" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (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.10 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-integer" -version = "0.1.41" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-rational" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.3 (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.10 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num_cpus" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3451,7 +3437,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "once_cell" -version = "1.2.0" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "oorandom" +version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3483,7 +3474,7 @@ version = "0.9.53" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3665,7 +3656,7 @@ dependencies = [ "pallet-contracts-rpc-runtime-api 0.8.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", @@ -3742,7 +3733,7 @@ dependencies = [ "pallet-balances 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4019,10 +4010,10 @@ name = "pallet-staking-reward-curve" version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-runtime 2.0.0", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4095,7 +4086,7 @@ dependencies = [ "frame-support 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", @@ -4141,7 +4132,7 @@ name = "parity-multiaddr" 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)", + "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.5 (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)", @@ -4155,10 +4146,10 @@ dependencies = [ [[package]] name = "parity-multiaddr" -version = "0.7.0" +version = "0.7.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)", + "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4167,7 +4158,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4178,7 +4169,7 @@ dependencies = [ "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (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)", + "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 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.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4192,7 +4183,7 @@ dependencies = [ "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4205,7 +4196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4216,9 +4207,9 @@ version = "1.1.1" 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 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4254,8 +4245,8 @@ name = "parity-util-mem-derive" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4286,7 +4277,7 @@ name = "parking_lot" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4296,7 +4287,7 @@ name = "parking_lot" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4354,9 +4345,9 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4402,30 +4393,30 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pin-project" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pin-project-internal" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pin-project-lite" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -4443,6 +4434,17 @@ name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "plotters" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ppv-lite86" version = "0.2.6" @@ -4461,13 +4463,13 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4476,30 +4478,30 @@ name = "proc-macro-crate" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-error" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-error-attr 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error-attr 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-error-attr" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "syn-mid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4508,9 +4510,9 @@ name = "proc-macro-hack" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4528,7 +4530,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4561,7 +4563,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4578,7 +4580,7 @@ dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "multimap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4604,11 +4606,11 @@ name = "prost-derive" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4635,22 +4637,22 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quick-error" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quickcheck" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4662,7 +4664,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4678,7 +4680,7 @@ name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4725,7 +4727,7 @@ name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4768,7 +4770,7 @@ name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4819,15 +4821,6 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand_os" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rand_pcg" version = "0.1.2" @@ -4854,44 +4847,36 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand_xoshiro" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "raw-cpuid" version = "7.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (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 = "rayon" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4909,24 +4894,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "redox_users" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.3.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4939,7 +4923,7 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -4966,7 +4950,7 @@ name = "ring" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4994,7 +4978,7 @@ dependencies = [ [[package]] name = "rpassword" -version = "4.0.3" +version = "4.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5003,12 +4987,13 @@ dependencies = [ [[package]] name = "rust-argon2" -version = "0.5.1" +version = "0.7.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)", - "blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", + "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5035,7 +5020,7 @@ version = "0.16.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)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5043,20 +5028,21 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rw-stream-sink" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5080,10 +5066,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "same-file" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5096,17 +5082,17 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-keystore 2.0.0", "sc-network 0.8.0", "sc-peerset 2.0.0", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-authority-discovery 2.0.0", "sp-blockchain 2.0.0", @@ -5120,7 +5106,7 @@ name = "sc-basic-authorship" version = "0.8.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", @@ -5163,7 +5149,7 @@ dependencies = [ "sc-network 0.8.0", "sc-telemetry 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-runtime 2.0.0", ] @@ -5173,9 +5159,9 @@ name = "sc-chain-spec-derive" version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5184,33 +5170,34 @@ version = "0.8.0" dependencies = [ "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fdlimit 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-network 0.8.0", "sc-service 0.8.0", "sc-telemetry 2.0.0", "sc-tracing 2.0.0", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-keyring 2.0.0", "sp-panic-handler 2.0.0", "sp-runtime 2.0.0", "sp-state-machine 0.8.0", - "structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5225,7 +5212,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", @@ -5247,7 +5234,7 @@ dependencies = [ "sp-version 2.0.0", "substrate-test-runtime-client 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5260,7 +5247,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor 0.8.0", @@ -5291,11 +5278,11 @@ dependencies = [ "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-rocksdb 0.4.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.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-executor 0.8.0", @@ -5320,7 +5307,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", @@ -5360,11 +5347,11 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pdqselect 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5409,7 +5396,7 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-basic-authorship 0.8.0", "sc-client 0.8.0", @@ -5423,7 +5410,7 @@ dependencies = [ "sp-transaction-pool 2.0.0", "substrate-test-runtime-client 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5432,7 +5419,7 @@ version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sp-api 2.0.0", @@ -5452,7 +5439,7 @@ version = "0.8.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", @@ -5471,7 +5458,7 @@ dependencies = [ name = "sc-consensus-uncles" version = "0.8.0" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sp-authorship 2.0.0", "sp-consensus 0.8.0", @@ -5489,7 +5476,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5518,7 +5505,7 @@ name = "sc-executor-common" version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-allocator 2.0.0", "sp-core 2.0.0", @@ -5532,7 +5519,7 @@ dependencies = [ name = "sc-executor-wasmi" version = "0.8.0" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", @@ -5553,7 +5540,7 @@ dependencies = [ "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-native 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", @@ -5577,10 +5564,10 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-client-api 2.0.0", @@ -5589,7 +5576,7 @@ dependencies = [ "sc-network-gossip 0.8.0", "sc-network-test 0.8.0", "sc-telemetry 2.0.0", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-arithmetic 2.0.0", "sp-blockchain 2.0.0", @@ -5615,7 +5602,7 @@ dependencies = [ "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5631,7 +5618,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.10 (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.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5640,11 +5627,11 @@ dependencies = [ "libp2p 0.15.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)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", @@ -5652,7 +5639,7 @@ dependencies = [ "sc-client-api 2.0.0", "sc-peerset 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5680,7 +5667,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-network 0.8.0", @@ -5696,7 +5683,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", @@ -5726,8 +5713,8 @@ dependencies = [ "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5752,9 +5739,9 @@ version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5767,7 +5754,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5778,7 +5765,7 @@ dependencies = [ "sc-network 0.8.0", "sc-rpc-api 0.8.0", "sc-transaction-pool 2.0.0", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", @@ -5804,11 +5791,11 @@ dependencies = [ "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-rpc 2.0.0", "sp-transaction-pool 2.0.0", @@ -5823,9 +5810,9 @@ dependencies = [ "jsonrpc-http-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-ws-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-runtime 2.0.0", ] @@ -5854,7 +5841,7 @@ dependencies = [ "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "grafana-data-source 0.8.0", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5873,7 +5860,7 @@ dependencies = [ "sc-tracing 2.0.0", "sc-transaction-pool 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", @@ -5889,9 +5876,9 @@ dependencies = [ "substrate-test-runtime-client 2.0.0", "sysinfo 0.9.6 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5899,10 +5886,10 @@ name = "sc-service-test" version = "2.0.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fdlimit 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-network 0.8.0", "sc-service 0.8.0", @@ -5919,7 +5906,7 @@ name = "sc-state-db" version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -5933,9 +5920,9 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5949,16 +5936,16 @@ dependencies = [ name = "sc-tracing" version = "2.0.0" dependencies = [ - "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", "grafana-data-source 0.8.0", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-telemetry 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5966,10 +5953,10 @@ name = "sc-transaction-graph" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5986,7 +5973,7 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", @@ -6048,9 +6035,9 @@ name = "scroll_derive" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6126,24 +6113,24 @@ name = "serde_derive" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sha-1" -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)", @@ -6194,6 +6181,15 @@ name = "shlex" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "signal-hook-registry" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "slab" version = "0.4.2" @@ -6204,7 +6200,7 @@ name = "slog" version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6213,9 +6209,9 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6234,9 +6230,9 @@ name = "slog_derive" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6257,7 +6253,7 @@ name = "snow" version = "0.6.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)", + "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6266,7 +6262,7 @@ dependencies = [ [[package]] name = "soketto" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6275,12 +6271,12 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6293,7 +6289,7 @@ name = "sp-allocator" version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", "sp-wasm-interface 2.0.0", @@ -6320,18 +6316,18 @@ version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (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 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sp-api-test" version = "2.0.0" dependencies = [ - "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-consensus 0.8.0", @@ -6339,7 +6335,7 @@ dependencies = [ "sp-state-machine 0.8.0", "sp-version 2.0.0", "substrate-test-runtime-client 2.0.0", - "trybuild 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6368,11 +6364,11 @@ dependencies = [ name = "sp-arithmetic" version = "2.0.0" dependencies = [ - "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", @@ -6416,7 +6412,7 @@ name = "sp-blockchain" version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6435,7 +6431,7 @@ dependencies = [ "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6503,18 +6499,18 @@ dependencies = [ "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (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.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", "sp-externalities 0.8.0", @@ -6534,9 +6530,9 @@ dependencies = [ name = "sp-debug-derive" version = "2.0.0" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6586,7 +6582,7 @@ version = "2.0.0" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-externalities 0.8.0", @@ -6619,8 +6615,8 @@ dependencies = [ name = "sp-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6640,7 +6636,7 @@ name = "sp-rpc" version = "2.0.0" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", ] @@ -6649,12 +6645,12 @@ name = "sp-runtime" version = "2.0.0" dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-arithmetic 2.0.0", "sp-core 2.0.0", @@ -6668,8 +6664,8 @@ name = "sp-runtime-interface" version = "2.0.0" dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-externalities 0.8.0", "sp-io 2.0.0", @@ -6679,7 +6675,7 @@ dependencies = [ "sp-std 2.0.0", "sp-wasm-interface 2.0.0", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trybuild 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6688,9 +6684,9 @@ version = "2.0.0" dependencies = [ "Inflector 0.11.4 (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 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6735,7 +6731,7 @@ name = "sp-serializer" version = "2.0.0" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6763,8 +6759,8 @@ version = "0.8.0" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6819,7 +6815,7 @@ version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -6910,23 +6906,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.4.0" +version = "0.4.1" 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-macro-error 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6943,9 +6940,9 @@ version = "0.16.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 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6967,7 +6964,7 @@ dependencies = [ "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-rpc 2.0.0", "sp-core 2.0.0", @@ -7017,7 +7014,7 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-transaction-pool 2.0.0", @@ -7058,7 +7055,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "frame-system-rpc-runtime-api 2.0.0", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-babe 2.0.0", "pallet-timestamp 2.0.0", @@ -7114,13 +7111,13 @@ version = "2.0.0" name = "substrate-wasm-builder" version = "1.0.9" dependencies = [ - "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "cargo_metadata 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-gc-api 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7150,10 +7147,10 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7163,9 +7160,9 @@ name = "syn-mid" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7173,9 +7170,9 @@ name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7187,7 +7184,7 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7221,10 +7218,10 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.0.5" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7233,9 +7230,9 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7249,25 +7246,25 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror-impl 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thiserror-impl" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread_local" -version = "0.3.6" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7278,7 +7275,7 @@ name = "threadpool" version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7323,11 +7320,11 @@ dependencies = [ [[package]] name = "tinytemplate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7338,7 +7335,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.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)", "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7355,15 +7352,21 @@ dependencies = [ [[package]] name = "tokio" -version = "0.2.4" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-macros 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7431,16 +7434,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)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-macros" -version = "0.2.0" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7451,9 +7455,9 @@ dependencies = [ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7463,7 +7467,7 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.10.2" +version = "0.10.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)", @@ -7516,8 +7520,8 @@ dependencies = [ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7550,7 +7554,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)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (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)", @@ -7566,7 +7570,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (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)", @@ -7582,14 +7586,14 @@ dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7602,31 +7606,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "tracing" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-attributes 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-attributes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tracing-attributes" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tracing-core" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7656,7 +7658,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7686,15 +7688,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trybuild" -version = "1.0.18" +version = "1.0.21" 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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7762,7 +7764,7 @@ dependencies = [ [[package]] name = "unicode-normalization" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7820,7 +7822,7 @@ dependencies = [ [[package]] name = "url" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7870,7 +7872,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7879,19 +7881,19 @@ name = "wabt-sys" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "walkdir" -version = "2.2.9" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7900,7 +7902,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7909,13 +7911,13 @@ name = "want" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (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 = "wasi" -version = "0.7.0" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -7934,10 +7936,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7966,9 +7968,9 @@ name = "wasm-bindgen-macro-support" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7983,12 +7985,12 @@ name = "wasm-bindgen-webidl" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.26 (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.10 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7998,7 +8000,7 @@ name = "wasm-gc-api" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8026,8 +8028,8 @@ dependencies = [ "errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi-validation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8050,7 +8052,7 @@ name = "wasmtime-debug" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8058,7 +8060,7 @@ dependencies = [ "gimli 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8076,17 +8078,17 @@ dependencies = [ "directories 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "file-per-thread-logger 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "zstd 0.5.1+zstd.1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8097,7 +8099,7 @@ name = "wasmtime-jit" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8105,7 +8107,7 @@ dependencies = [ "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "region 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-debug 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8118,17 +8120,17 @@ name = "wasmtime-runtime" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "region 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8138,7 +8140,7 @@ name = "web-sys" version = "0.3.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (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.58 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8260,7 +8262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8271,15 +8273,6 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "wincolor" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws" version = "0.9.1" @@ -8288,13 +8281,13 @@ 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)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8323,16 +8316,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "nohash-hasher 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "nohash-hasher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8353,9 +8346,9 @@ name = "zeroize_derive" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8381,7 +8374,7 @@ name = "zstd-sys" version = "1.4.15+zstd.1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8393,24 +8386,25 @@ dependencies = [ "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 ahash 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6f33b5018f120946c1dcf279194f238a9f146725593ead1c08fa47ff22b0b5d3" -"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" +"checksum aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5f56c476256dc249def911d6f7580b5fc7e875895b5d7ee88f5d602208035744" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -"checksum anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "9267dff192e68f3399525901e709a48c1d3982c9c072fa32f2127a0cb0babf14" +"checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" "checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" "checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" -"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" +"checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" "checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" "checksum asn1_der 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6fce6b6a0ffdafebd82c87e79e3f40e8d2c523e5fea5566ff6b90509bf98d638" "checksum asn1_der_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" -"checksum async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94ef4b71b2f56d7f8793c2a353fa0aa254833c55ab611dc6f3e0bd63db487e2d" -"checksum async-task 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de6bd58f7b9cc49032559422595c81cbfcf04db2f2133592f70af19e258a1ced" +"checksum async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0bf6039b315300e057d198b9d3ab92ee029e31c759b7f1afae538145e6f18a3e" +"checksum async-task 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f20c6fda19d0fc02406779587ca4f9a4171cd32e4a5bda0bd016f0a1334c8d4a" "checksum async-tls 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce6977f57fa68da77ffe5542950d47e9c23d65f5bc7cb0a9f8700996913eec7" -"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" +"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" -"checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" +"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +"checksum backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b4b1549d804b6c73f4817df2ba073709e96e426f12987127c48e6745568c350b" "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" "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" @@ -8423,17 +8417,17 @@ dependencies = [ "checksum bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a993f74b4c99c1908d156b8d2e0fb6277736b0ecbd833982fd1241d39b2766a6" "checksum blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -"checksum blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b83b7baab1e671718d78204225800d6b170e648188ac7dc992e9d6bddf87d0c0" +"checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" "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.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" "checksum broadcaster 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "07a1446420a56f1030271649ba0da46d23239b3a68c73591cea5247f15a788a0" "checksum bs58 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c95ee6bba9d950218b6cc910cf62bc9e0a171d0f4537e3627b0f54d08549b188" "checksum bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" -"checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245" +"checksum bstr 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8a65814ca90dfc9705af76bb6ba3c6e2534489a72270e797e603783bb4990b" "checksum build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" "checksum bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb8038c1ddc0a5f73787b130f4cc75151e96ed33e417fde765eb5a81e3532f4" -"checksum byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f6209f3b2c1edea170002e016d5ead6903d3bb0a846477f53bbeb614967a52a9" +"checksum byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" @@ -8443,7 +8437,7 @@ dependencies = [ "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cargo_metadata 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "46e3374c604fb39d1a2f35ed5e4a4e30e60d01fab49446e08f1b3e9a90aef202" "checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" -"checksum cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "f52a465a666ca3d838ebbf08b241383421412fe7ebb463527bba275526d89f76" +"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" "checksum cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fce5b5fb86b0c57c20c834c1b412fd09c77c8a59b9473f86272709e78874cd1d" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" "checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" @@ -8454,9 +8448,9 @@ dependencies = [ "checksum cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62" "checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" "checksum console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48" -"checksum const-random 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7b641a8c9867e341f3295564203b1c250eb8ce6cb6126e007941f78c4d2ed7fe" -"checksum const-random-macro 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c750ec12b83377637110d5a57f5ae08e895b06c4b16e2bdbf1a94ef717428c59" -"checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120" +"checksum const-random 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "2f1af9ac737b2dd2d577701e59fd09ba34822f6f2ebdb30a7647405d9e55e16a" +"checksum const-random-macro 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "25e4c606eb459dd29f7c57b2e0879f2b6f14ee130918c2b78ccb58a9624e6c7a" +"checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" "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 cranelift-bforest 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd05aac8cefcde54ce26178df8f36cb1f518ac691db650e7d2440c2b6b41c4dc" @@ -8469,24 +8463,23 @@ dependencies = [ "checksum cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "54cb82a1071f88822763a583ec1a8688ffe5e2cda02c111d4483dd4376ed14d8" "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 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "938703e165481c8d612ea3479ac8342e5615185db37765162e762ec3523e2fc6" +"checksum criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1fc755679c12bda8e5523a71e4d654b6bf2e14bd838dfc48cde6559a05caf7d1" "checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" -"checksum criterion-plot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eccdc6ce8bbe352ca89025bee672aa6d24f4eb8c53e3a8b5d1bc58011da072a2" +"checksum criterion-plot 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a01e15e0ea58e8234f96146b1f91fa9d0e4dd7a38da93ff7a75d42c0b9d3a545" "checksum crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c" "checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" "checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfd6515864a82d2f877b42813d4553292c6659498c9a2aa31bab5a15243c2700" +"checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" "checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" "checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -"checksum csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37519ccdfd73a75821cac9319d4fce15a81b9fcf75f951df5b9988aa3a0af87d" +"checksum csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" "checksum csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c" "checksum ct-logs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113" "checksum ctor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8ce37ad4184ab2ce004c33bf6379185d3b1c95801cab51026bd271bf68eedc" "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8b7dcd30ba50cdf88b55b033456138b7c0ac4afdc436d82e1b79f370f24cc66d" "checksum curve25519-dalek 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26778518a7f6cffa1d25a44b602b62b979bd88adb9e99ffec546998cf3404839" @@ -8505,7 +8498,7 @@ dependencies = [ "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" "checksum environmental 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "516aa8d7a71cb00a1c4146f0798549b93d083d4f189b3ced8f3de6b8f11ee6c4" -"checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" +"checksum erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "cd7d80305c9bd8cd78e3c753eb9fb110f83621e5211f1a3afffcc812b104daf9" "checksum errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e" "checksum errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" "checksum evm 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "32a2c6961fdc9952371fc5f0416f03a9d90378a9dfb6862f6a7a9a3b8986b8dd" @@ -8518,10 +8511,10 @@ dependencies = [ "checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" -"checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" +"checksum fdlimit 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9084c55bb76efb1496328976db88320fe7d9ee86e649e83c4ecce3ba7a9a35d1" "checksum file-per-thread-logger 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8505b75b31ef7285168dd237c4a7db3c1f3e0927e7d314e670bc98e854272fe9" "checksum finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "52c48f8a628193ba18639b2f727c32132d75f167a4b32f44b252ea8b937f154c" -"checksum fixed-hash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72fe7539e2c5692c6989f2f9c0457e42f1e5768f96b85c87d273574670ae459f" +"checksum fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" "checksum fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" "checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" @@ -8557,12 +8550,12 @@ dependencies = [ "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" "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 getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407" +"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" "checksum gimli 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "162d18ae5f2e3b90a993d202f1ba17a5633c2484426f8bcae201f86194bacd00" "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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" -"checksum goblin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88a79ef1f0dad46fd78075b6f80f92d97710eddf87b3e18a15a66761e8942672" +"checksum goblin 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3081214398d39e4bd7f2c1975f0488ed04614ffdd976c6fc7a0708278552c0da" "checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" "checksum h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1" "checksum hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" @@ -8571,7 +8564,7 @@ dependencies = [ "checksum hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" "checksum hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f629dc602392d3ec14bfc8a09b5e644d7ffd725102b48b81e59f90f2633621d7" +"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" "checksum hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" "checksum hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "961de220ec9a91af2e1e5bd80d02109155695e516771762381ef8581317066e0" "checksum hex-literal-impl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9d4c5c844e2fee0bf673d54c2c177f1713b3d2af2ff6e666b49cb7572e6cf42d" @@ -8593,15 +8586,16 @@ dependencies = [ "checksum impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" "checksum impl-rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8f7a72f11830b52333f36e3b09a288333888bf54380fd0ac0790a3c31ab0f3c5" "checksum impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "58e3cae7e99c7ff5a995da2cf78dd0a5383740eda71d98cf7b1910c301ac69b8" +"checksum impl-serde 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5bbe9ea9b182f0fb1cabbd61f4ff9b7b7b9197955e95a7e4c27de5055eb29ff8" "checksum impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" -"checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2" -"checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" +"checksum indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" +"checksum integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" "checksum ipnet 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f4b06b21db0228860c8dfd17d2106c49c7c6bd07477a4036985347d84def04" "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" -"checksum jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b1d42ef453b30b7387e113da1c83ab1605d90c5b4e0eb8e96d016ed3b8c160" +"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" +"checksum jobserver 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "67b06c1b455f1cf4269a8cfc320ab930a810e2375a42af5075eb8a8b36405ce0" "checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" "checksum jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0a9ae166c4d1f702d297cd76d4b55758ace80272ffc6dbb139fdc1bf810de40b" "checksum jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970" @@ -8651,16 +8645,16 @@ 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.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e57b3997725d2b60dbec1297f6c2e2957cc383db1cebd6be812163f969c7d586" +"checksum lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "1b9ad466a945c9c40f6f9a449c55675547e59bc75a2722d4689042ab3ae80c9c" +"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" "checksum lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "5d8f669d42c72d18514dfca8115689c5f6370a17d980cb5bd777a67f404594c8" "checksum lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" "checksum mach 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1" "checksum malloc_size_of_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e37c5d4cd9473c5f4c9c111f033f15d4df9bd378fdf615944e360a4f55a05f0b" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" +"checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" "checksum memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "881736a0f68a6fae1b596bb066c5bd16d7b3ed645a4dd8ffaefd02f585abaf71" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" @@ -8678,19 +8672,19 @@ 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.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce" "checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -"checksum nohash-hasher 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4e657a6ec97f9a3ba46f6f7034ea6db9fcd5b71d25ef1074b7bc03da49be0e8e" +"checksum nohash-hasher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "721a2bf1c26159ebf17e0a980bc4ce61f4b2fec5ec3b42d42fddd7a84a9e538f" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f9c3f34cdd24f334cb265d9bf8bfa8a241920d026916785747a92f0e55541a1a" -"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" -"checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454" -"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4" -"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72" +"checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +"checksum num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "da4dc79f9e6c81bef96148c8f6b8e72ad4541caa4a24373e900a36da07de03a3" +"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" "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 once_cell 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d584f08c2d717d5c23a6414fc2822b71c651560713e54fa7eace675f758a355e" -"checksum once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "891f486f630e5c5a4916c7e16c4b24a53e78c860b646e9f8e005e4f16847bfed" +"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" +"checksum oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405" "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" "checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" @@ -8699,7 +8693,7 @@ dependencies = [ "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c276d76c5333b8c2579e02d49a06733a55b8282d2d9b13e8d53b6406bd7e30a" "checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" -"checksum parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6de20a133b50f5120c6b8284ee88c5017fb167149208b3ee2e95f8719a434dc4" +"checksum parity-multiaddr 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80878c27f90dd162d3143333d672e80b194d6b080f05c83440e3dfda42e409f2" "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" "checksum parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" "checksum parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" @@ -8725,22 +8719,23 @@ dependencies = [ "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" "checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" "checksum petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29c127eea4a29ec6c85d153c59dc1213f33ec74cead30fe4730aecc88cc1fd92" -"checksum pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "94b90146c7216e4cb534069fb91366de4ea0ea353105ee45ed297e2d1619e469" -"checksum pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "44ca92f893f0656d3cba8158dd0f2b99b94de256a4a54e870bd6922fcc6c8355" -"checksum pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f0af6cbca0e6e3ce8692ee19fb8d734b641899e07b68eb73e9bbbd32f1703991" +"checksum pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c" +"checksum pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f" +"checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" "checksum plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +"checksum plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb" "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" -"checksum primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0253db64c26d8b4e7896dd2063b516d2a1b9e0a5da26b5b78335f236d1e9522" +"checksum primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro-error 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "53c98547ceaea14eeb26fcadf51dc70d01a2479a7839170eae133721105e4428" -"checksum proc-macro-error-attr 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c2bf5d493cf5d3e296beccfd61794e445e830dfc8070a9c248ad3ee071392c6c" +"checksum proc-macro-error 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1b79a464461615532fcc8a6ed8296fa66cc12350c18460ab3f4594a6cee0fcb6" +"checksum proc-macro-error-attr 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "23832e5eae6bac56bbac190500eef1aaede63776b5cd131eaa4ee7fe120cd892" "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" "checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" +"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" "checksum prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96d14b1c185652833d24aaad41c5832b0be5616a590227c1fbff57c616754b23" "checksum prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" "checksum prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb788126ea840817128183f8f603dce02cb7aea25c2a0b764359d8e20010702e" @@ -8750,8 +8745,8 @@ dependencies = [ "checksum prost-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1de482a366941c8d56d19b650fac09ca08508f2a696119ee7513ad590c8bac6f" "checksum prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" "checksum pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" -"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5ca504a2fdaa08d3517f442fbbba91ac24d1ec4c51ea68688a038765e3b2662" +"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +"checksum quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" "checksum quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8461ef7445f61fd72d8dcd0629ce724b9131b3c2eb36e83a5d3d4161c127530" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" @@ -8769,37 +8764,35 @@ dependencies = [ "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" "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_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a788ae3edb696cfcba1c19bfd388cc4b8c21f8a408432b199c072825084da58a" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929" -"checksum rand_xoshiro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e18c91676f670f6f0312764c759405f13afb98d5d73819840cf72a518487bff" "checksum raw-cpuid 7.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4a349ca83373cfa5d6dbb66fd76e58b2cca08da71a5f6400de0a0a6a9bceeaf" -"checksum rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43739f8831493b276363637423d3622d4bd6394ab6f0a9c4a552e208aeb7fddd" -"checksum rayon-core 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8bf17de6f23b05473c437eb958b9c850bfc8af0961fe17b4cc92d5a627b4791" +"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" +"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d" -"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" +"checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" +"checksum regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87" "checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" -"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" +"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90" "checksum region 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "448e868c6e4cfddfa49b6a72c95906c04e8547465e9536575b95c70a4044f856" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" "checksum ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6747f8da1f2b1fabbee1aaa4eb8a11abf9adef0bf58a41cee45db5d59cecdfac" "checksum rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3a44d5ae8afcb238af8b75640907edc6c931efcfab2c854e81ed35fa080f84cd" "checksum rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12069b106981c6103d3eab7dd1c86751482d0779a520b7c14954c8b586c1e643" -"checksum rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d59f0e97173c514b9036cd450c195a6483ba81055c6fa0f1bff3ab563f47d44a" -"checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf" +"checksum rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" +"checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" "checksum rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" -"checksum rustversion 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c48f91977f4ef3be5358c15d131d3f663f6b4d7a112555bf3bf52ad23b6659e5" -"checksum rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "761d4727649dc004ee5555a0779afd53963efafd2218c969a2c5e323cdf73a09" +"checksum rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" +"checksum rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" -"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" +"checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" "checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" "checksum schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "eacd8381b3c37840c9c9f40472af529e49975bdcbc24f83c31059fd6539023d3" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" @@ -8816,13 +8809,14 @@ dependencies = [ "checksum send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" -"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" +"checksum serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "eab8f15f15d6c41a154c1b128a22f2dfabe350ef53c40953d84e36155c91192b" +"checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" "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 shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +"checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cc9c640a4adbfbcc11ffb95efe5aa7af7309e002adab54b185507dbf2377b99" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" @@ -8831,7 +8825,7 @@ dependencies = [ "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" "checksum smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44e59e0c9fa00817912ae6e4e6e3c4fe04455e75699d06eedc7d85917ed8e8f4" "checksum snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" -"checksum soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3caa0ad6b765419f21e4cfa490ec7514a9fae4af986adef168a69477ba528671" +"checksum soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" @@ -8840,15 +8834,15 @@ dependencies = [ "checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" "checksum string-interner 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd710eadff449a1531351b0e43eb81ea404336fa2f56c777427ab0e32a4cf183" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum structopt 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "884ae79d6aad1e738f4a70dff314203fd498490a63ebc4d03ea83323c40b7b72" -"checksum structopt-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a97f829a34a0a9d5b353a881025a23b8c9fd09d46be6045df6b22920dbd7a93" +"checksum structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "df136b42d76b1fbea72e2ab3057343977b04b4a2e00836c3c7c0673829572713" +"checksum structopt-derive 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd50a87d2f7b8958055f3e73a963d78feaccca3836767a9069844e34b5b03c0a" "checksum strum 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" "checksum strum_macros 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" "checksum substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -"checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" +"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" "checksum syn-mid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd3937748a7eccff61ba5b90af1a20dbf610858923a9192ea0ecb0cb77db1d0" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" "checksum sysinfo 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4b2468c629cffba39c0a4425849ab3cdb03d9dfacba69684609aea04d08ff9" @@ -8856,20 +8850,20 @@ dependencies = [ "checksum target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" +"checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" "checksum test-case 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a605baa797821796a751f4a959e1206079b24a4b7e1ed302b7d785d81a9276c9" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -"checksum thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6f357d1814b33bc2dc221243f8424104bfe72dbe911d5b71b3816a2dff1c977e" -"checksum thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2e25d25307eb8436894f727aba8f65d07adf02e5b35a13cebed48bd282bfef" -"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +"checksum thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "205684fd018ca14432b12cce6ea3d46763311a571c3d294e71ba3f01adcf1aad" +"checksum thiserror-impl 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "57e4d2e50ca050ed44fb58309bdce3efa79948f84f9993ad1978de5eebdce5a7" +"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" "checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" "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.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" "checksum tiny-keccak 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2953ca5148619bc99695c1274cb54c5275bbb913c6adad87e72eaf8db9787f69" -"checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20" +"checksum tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "57a3c6667d3e65eb1bc3aed6fd14011c6cbc3a0665218ab7f5daf040b9ec371a" "checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -"checksum tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bcced6bb623d4bff3739c176c415f13c418f426395c169c9c3cd9a492c715b16" +"checksum tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" "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" @@ -8877,9 +8871,9 @@ dependencies = [ "checksum tokio-executor 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" "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-macros 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5795a71419535c6dcecc9b6ca95bdd3c2d6142f7e8343d7beb9923f129aa87e" +"checksum tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" "checksum tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" -"checksum tokio-rustls 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1df2fa53ac211c136832f530ccb081af9af891af22d685a9493e232c7a359bc2" +"checksum tokio-rustls 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d7cf08f990090abd6c6a73cab46fed62f85e8aef8b99e4b918a9f4a637f0676" "checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" "checksum tokio-sync 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4f1aaeb685540f7407ea0e27f1c9757d258c7c6bf4e3eb19da6fc59b747239d2" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" @@ -8889,18 +8883,18 @@ dependencies = [ "checksum tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" -"checksum toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "01d1404644c8b12b16bfcffa4322403a91a451584daaaa7c28d3152e6cbc98cf" +"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" "checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" -"checksum tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ff4e4f59e752cb3beb5b61c6d5e11191c7946231ba84faec2902c9efdd8691c5" -"checksum tracing-attributes 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a4263b12c3d3c403274493eb805966093b53214124796552d674ca1dd5d27c2b" -"checksum tracing-core 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bc913647c520c959b6d21e35ed8fa6984971deca9f0a2fcb8c51207e0c56af1d" +"checksum tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e213bd24252abeb86a0b7060e02df677d367ce6cb772cef17e9214b8390a8d3" +"checksum tracing-attributes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04cfd395def5a60236e187e1ff905cb55668a59f29928dec05e6e1b1fd2ac1f3" +"checksum tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "13a46f11e372b8bd4b4398ea54353412fdd7fd42a8370c7e543e218cf7661978" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum trie-bench 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26fd042d57ee9c987c562811162a78db78b5340ab674ac76056c85dca49b26bc" "checksum trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d747ae5b6f078df7e46477fcc7df66df9eb4f27a031cf4a7c890a8dd03d8e6" "checksum trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b779f7c1c8fe9276365d9d5be5c4b5adeacf545117bb3f64c974305789c5c0b" "checksum trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3161ba520ab28cd8e6b68e1126f1009f6e335339d1a73b978139011703264c8" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum trybuild 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "b75e31d624df08744532e935f1d4bfedd319a277d5a162c5b15f6ced59307575" +"checksum trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)" = "3f5b3f750c701725331ac78e389b5d143b7d25f6b6ffffd0d419759a9063ac5f" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bfd5b7557925ce778ff9b9ef90e3ade34c524b5ff10e239c69a42d546d2af56" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" @@ -8909,7 +8903,7 @@ dependencies = [ "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf" +"checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" @@ -8918,7 +8912,7 @@ dependencies = [ "checksum unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c689459fbaeb50e56c6749275f084decfd02194ac5852e6617d95d0d3cf02eaf" "checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -"checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61" +"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" "checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" "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" @@ -8927,10 +8921,10 @@ dependencies = [ "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3c5c5c1286c6e578416982609f47594265f9d489f9b836157d403ad605a46693" "checksum wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af5d153dc96aad7dc13ab90835b892c69867948112d95299e522d370c4e13a08" -"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" +"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" "checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" +"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" "checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" "checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" "checksum wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8bbdd49e3e28b40dec6a9ba8d17798245ce32b019513a845369c641b275135d9" @@ -8960,14 +8954,13 @@ dependencies = [ "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" +"checksum winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9" "checksum ws 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a2c47b5798ccc774ffb93ff536aec7c4275d722fd9c740c83cdd1af1f2d94" "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" -"checksum yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "809f4388471d280173404e3d4f889e2d36004960a37d822ce5637fbef33a0ce4" +"checksum yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f937668802a2e862a4fed05267e10b20c310bf771adc89687710706d55a9a65" "checksum zeroize 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "45af6a010d13e4cf5b54c94ba5a2b2eba5596b9e46bf5875612d332a1f2b3f86" "checksum zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" "checksum zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" diff --git a/bin/node-template/Cargo.toml b/bin/node-template/Cargo.toml index 9ad91a973c..7001099b0b 100644 --- a/bin/node-template/Cargo.toml +++ b/bin/node-template/Cargo.toml @@ -12,9 +12,7 @@ path = "src/main.rs" [dependencies] futures = "0.3.1" -ctrlc = { version = "3.1.3", features = ["termination"] } log = "0.4.8" -tokio = { version = "0.2", features = ["rt-threaded"] } sc-cli = { version = "0.8.0", path = "../../client/cli" } sp-core = { version = "2.0.0", path = "../../primitives/core" } sc-executor = { version = "0.8", path = "../../client/executor" } @@ -31,7 +29,8 @@ grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path sc-client = { version = "0.8", path = "../../client/" } node-template-runtime = { version = "2.0.0", path = "runtime" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } -sc-basic-authorship = { path = "../../client/basic-authorship" } +sc-basic-authorship = { path = "../../client/basic-authorship" } +structopt = "0.3.8" [build-dependencies] vergen = "3.0.4" diff --git a/bin/node-template/src/chain_spec.rs b/bin/node-template/src/chain_spec.rs index 6afb67547b..6c6ab492a3 100644 --- a/bin/node-template/src/chain_spec.rs +++ b/bin/node-template/src/chain_spec.rs @@ -145,3 +145,10 @@ fn testnet_genesis(initial_authorities: Vec<(AuraId, GrandpaId)>, }), } } + +pub fn load_spec(id: &str) -> Result, String> { + Ok(match Alternative::from(id) { + Some(spec) => Some(spec.load()?), + None => None, + }) +} diff --git a/bin/node-template/src/cli.rs b/bin/node-template/src/cli.rs index 8408f17379..0091ef7d75 100644 --- a/bin/node-template/src/cli.rs +++ b/bin/node-template/src/cli.rs @@ -1,121 +1,11 @@ -use crate::service; -use futures::{future::{select, Map, Either}, FutureExt, channel::oneshot}; -use std::cell::RefCell; -use tokio::runtime::Runtime; -pub use sc_cli::{VersionInfo, IntoExit, error}; -use sc_cli::{display_role, informant, parse_and_prepare, ParseAndPrepare, NoCustom}; -use sc_service::{AbstractService, Roles as ServiceRoles, Configuration}; -use sp_consensus_aura::sr25519::{AuthorityPair as AuraPair}; -use crate::chain_spec; -use log::info; +use sc_cli::{RunCmd, Subcommand}; +use structopt::StructOpt; -/// Parse command line arguments into service configuration. -pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> where - I: IntoIterator, - T: Into + Clone, - E: IntoExit, -{ - type Config = Configuration<(), T>; - match parse_and_prepare::(&version, "substrate-node", args) { - ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, - |exit, _cli_args, _custom_args, mut config: Config<_>| { - info!("{}", version.name); - info!(" version {}", config.full_version()); - info!(" by {}, 2017, 2018", version.author); - info!("Chain specification: {}", config.chain_spec.name()); - info!("Node name: {}", config.name); - info!("Roles: {}", display_role(&config)); - let runtime = Runtime::new().map_err(|e| format!("{:?}", e))?; - config.tasks_executor = { - let runtime_handle = runtime.handle().clone(); - Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) - }; - match config.roles { - ServiceRoles::LIGHT => run_until_exit( - runtime, - service::new_light(config)?, - exit - ), - _ => run_until_exit( - runtime, - service::new_full(config)?, - exit - ), - } - }), - ParseAndPrepare::BuildSpec(cmd) => cmd.run::(load_spec), - ParseAndPrepare::ExportBlocks(cmd) => cmd.run_with_builder(|config: Config<_>| - Ok(new_full_start!(config).0), load_spec, exit), - ParseAndPrepare::ImportBlocks(cmd) => cmd.run_with_builder(|config: Config<_>| - Ok(new_full_start!(config).0), load_spec, exit), - ParseAndPrepare::CheckBlock(cmd) => cmd.run_with_builder(|config: Config<_>| - Ok(new_full_start!(config).0), load_spec, exit), - ParseAndPrepare::PurgeChain(cmd) => cmd.run(load_spec), - ParseAndPrepare::RevertChain(cmd) => cmd.run_with_builder(|config: Config<_>| - Ok(new_full_start!(config).0), load_spec), - ParseAndPrepare::CustomCommand(_) => Ok(()) - }?; +#[derive(Debug, StructOpt)] +pub struct Cli { + #[structopt(subcommand)] + pub subcommand: Option, - Ok(()) -} - -fn load_spec(id: &str) -> Result, String> { - Ok(match chain_spec::Alternative::from(id) { - Some(spec) => Some(spec.load()?), - None => None, - }) -} - -fn run_until_exit( - mut runtime: Runtime, - service: T, - e: E, -) -> error::Result<()> -where - T: AbstractService, - E: IntoExit, -{ - let (exit_send, exit) = oneshot::channel(); - - let informant = informant::build(&service); - - let handle = runtime.spawn(select(exit, informant)); - - // we eagerly drop the service so that the internal exit future is fired, - // but we need to keep holding a reference to the global telemetry guard - let _telemetry = service.telemetry(); - - let exit = e.into_exit(); - let service_res = runtime.block_on(select(service, exit)); - - let _ = exit_send.send(()); - - if let Err(e) = runtime.block_on(handle) { - log::error!("Error running node: {:?}", e); - } - - match service_res { - Either::Left((res, _)) => res.map_err(error::Error::Service), - Either::Right((_, _)) => Ok(()) - } -} - -// handles ctrl-c -pub struct Exit; -impl IntoExit for Exit { - type Exit = Map, fn(Result<(), oneshot::Canceled>) -> ()>; - fn into_exit(self) -> Self::Exit { - // can't use signal directly here because CtrlC takes only `Fn`. - let (exit_send, exit) = oneshot::channel(); - - let exit_send_cell = RefCell::new(Some(exit_send)); - ctrlc::set_handler(move || { - let exit_send = exit_send_cell.try_borrow_mut().expect("signal handler not reentrant; qed").take(); - if let Some(exit_send) = exit_send { - exit_send.send(()).expect("Error sending exit notification"); - } - }).expect("Error setting Ctrl-C handler"); - - exit.map(drop) - } + #[structopt(flatten)] + pub run: RunCmd, } diff --git a/bin/node-template/src/command.rs b/bin/node-template/src/command.rs new file mode 100644 index 0000000000..86058929b0 --- /dev/null +++ b/bin/node-template/src/command.rs @@ -0,0 +1,48 @@ +// Copyright 2017-2020 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 sp_consensus_aura::sr25519::{AuthorityPair as AuraPair}; +use sc_cli::{VersionInfo, error}; +use crate::service; +use crate::chain_spec; +use crate::cli::Cli; + +/// Parse and run command line arguments +pub fn run(version: VersionInfo) -> error::Result<()> +{ + let opt = sc_cli::from_args::(&version); + + let mut config = sc_service::Configuration::default(); + config.impl_name = "node-template"; + + match opt.subcommand { + Some(subcommand) => sc_cli::run_subcommand( + config, + subcommand, + chain_spec::load_spec, + |config: _| Ok(new_full_start!(config).0), + &version, + ), + None => sc_cli::run( + config, + opt.run, + service::new_light, + service::new_full, + chain_spec::load_spec, + &version, + ) + } +} diff --git a/bin/node-template/src/main.rs b/bin/node-template/src/main.rs index ea64bc1413..9d0a57d77a 100644 --- a/bin/node-template/src/main.rs +++ b/bin/node-template/src/main.rs @@ -5,10 +5,11 @@ mod chain_spec; #[macro_use] mod service; mod cli; +mod command; -pub use sc_cli::{VersionInfo, IntoExit, error}; +pub use sc_cli::{VersionInfo, error}; -fn main() -> Result<(), cli::error::Error> { +fn main() -> Result<(), error::Error> { let version = VersionInfo { name: "Substrate Node", commit: env!("VERGEN_SHA_SHORT"), @@ -17,7 +18,8 @@ fn main() -> Result<(), cli::error::Error> { author: "Anonymous", description: "Template Node", support_url: "support.anonymous.an", + copyright_start_year: 2017, }; - cli::run(std::env::args(), cli::Exit, version) + command::run(version) } diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index bdaff5ad09..b23ada78f1 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -77,7 +77,7 @@ macro_rules! new_full_start { } /// Builds a new service for a full client. -pub fn new_full(config: Configuration) +pub fn new_full(config: Configuration) -> Result { let is_authority = config.roles.is_authority(); @@ -192,7 +192,7 @@ pub fn new_full(config: Configuration(config: Configuration) +pub fn new_light(config: Configuration) -> Result { let inherent_data_providers = InherentDataProviders::new(); diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 585c3f57d6..ef6e90f91a 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -31,7 +31,7 @@ hex-literal = "0.2.1" jsonrpc-core = "14.0.3" log = "0.4.8" rand = "0.7.2" -structopt = "=0.3.7" +structopt = { version = "0.3.8", optional = true } # primitives sp-authority-discovery = { version = "2.0.0", path = "../../../primitives/authority-discovery" } @@ -81,9 +81,7 @@ node-primitives = { version = "2.0.0", path = "../primitives" } node-executor = { version = "2.0.0", path = "../executor" } # CLI-specific dependencies -tokio = { version = "0.2", features = ["rt-threaded"], optional = true } sc-cli = { version = "0.8.0", optional = true, path = "../../../client/cli" } -ctrlc = { version = "3.1.3", features = ["termination"], optional = true } node-transaction-factory = { version = "0.8.0", optional = true, path = "../transaction-factory" } # WASM-specific dependencies @@ -99,10 +97,19 @@ futures = "0.3.1" tempfile = "3.1.0" [build-dependencies] -sc-cli = { version = "0.8.0", package = "sc-cli", path = "../../../client/cli" } build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../../utils/build-script-utils" } -structopt = "=0.3.7" -vergen = "3.0.4" +structopt = { version = "0.3.8", optional = true } +node-transaction-factory = { version = "0.8.0", optional = true, path = "../transaction-factory" } + +[build-dependencies.sc-cli] +version = "0.8.0" +package = "sc-cli" +path = "../../../client/cli" +optional = true + +[build-dependencies.vergen] +version = "3.0.4" +optional = true [features] default = ["cli", "wasmtime"] @@ -114,10 +121,10 @@ browser = [ cli = [ "sc-cli", "node-transaction-factory", - "tokio", - "ctrlc", "sc-service/rocksdb", "node-executor/wasmi-errno", + "vergen", + "structopt", ] wasmtime = [ "cli", diff --git a/bin/node/cli/bin/main.rs b/bin/node/cli/bin/main.rs index c766f3945c..e951c04710 100644 --- a/bin/node/cli/bin/main.rs +++ b/bin/node/cli/bin/main.rs @@ -18,31 +18,8 @@ #![warn(missing_docs)] -use futures::channel::oneshot; -use futures::{future, FutureExt}; use sc_cli::VersionInfo; -use std::cell::RefCell; - -// handles ctrl-c -struct Exit; -impl sc_cli::IntoExit for Exit { - type Exit = future::Map, fn(Result<(), oneshot::Canceled>) -> ()>; - fn into_exit(self) -> Self::Exit { - // can't use signal directly here because CtrlC takes only `Fn`. - let (exit_send, exit) = oneshot::channel(); - - let exit_send_cell = RefCell::new(Some(exit_send)); - ctrlc::set_handler(move || { - if let Some(exit_send) = exit_send_cell.try_borrow_mut().expect("signal handler not reentrant; qed").take() { - exit_send.send(()).expect("Error sending exit notification"); - } - }).expect("Error setting Ctrl-C handler"); - - exit.map(|_| ()) - } -} - fn main() -> Result<(), sc_cli::error::Error> { let version = VersionInfo { name: "Substrate Node", @@ -52,7 +29,8 @@ fn main() -> Result<(), sc_cli::error::Error> { author: "Parity Technologies ", description: "Generic substrate node", support_url: "https://github.com/paritytech/substrate/issues/new", + copyright_start_year: 2017, }; - node_cli::run(std::env::args(), Exit, version) + node_cli::run(std::env::args(), version) } diff --git a/bin/node/cli/build.rs b/bin/node/cli/build.rs index 9e18fc6699..e824b59be6 100644 --- a/bin/node/cli/build.rs +++ b/bin/node/cli/build.rs @@ -14,39 +14,48 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{fs, env, path::Path}; -use structopt::{StructOpt, clap::Shell}; -use sc_cli::{NoCustom, CoreParams}; -use vergen::{ConstantsFlags, generate_cargo_keys}; - fn main() { - build_shell_completion(); - generate_cargo_keys(ConstantsFlags::all()).expect("Failed to generate metadata files"); - - build_script_utils::rerun_if_git_head_changed(); + #[cfg(feature = "cli")] + cli::main(); } -/// Build shell completion scripts for all known shells -/// Full list in https://github.com/kbknapp/clap-rs/blob/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9/src/app/parser.rs#L123 -fn build_shell_completion() { - for shell in &[Shell::Bash, Shell::Fish, Shell::Zsh, Shell::Elvish, Shell::PowerShell] { - build_completion(shell); +#[cfg(feature = "cli")] +mod cli { + include!("src/cli.rs"); + + use std::{fs, env, path::Path}; + use sc_cli::{structopt::clap::Shell}; + use vergen::{ConstantsFlags, generate_cargo_keys}; + + pub fn main() { + build_shell_completion(); + generate_cargo_keys(ConstantsFlags::all()).expect("Failed to generate metadata files"); + + build_script_utils::rerun_if_git_head_changed(); + } + + /// Build shell completion scripts for all known shells + /// Full list in https://github.com/kbknapp/clap-rs/blob/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9/src/app/parser.rs#L123 + fn build_shell_completion() { + for shell in &[Shell::Bash, Shell::Fish, Shell::Zsh, Shell::Elvish, Shell::PowerShell] { + build_completion(shell); + } } -} -/// Build the shell auto-completion for a given Shell -fn build_completion(shell: &Shell) { - let outdir = match env::var_os("OUT_DIR") { - None => return, - Some(dir) => dir, - }; - let path = Path::new(&outdir) - .parent().unwrap() - .parent().unwrap() - .parent().unwrap() - .join("completion-scripts"); - - fs::create_dir(&path).ok(); - - CoreParams::::clap().gen_completions("substrate-node", *shell, &path); + /// Build the shell auto-completion for a given Shell + fn build_completion(shell: &Shell) { + let outdir = match env::var_os("OUT_DIR") { + None => return, + Some(dir) => dir, + }; + let path = Path::new(&outdir) + .parent().unwrap() + .parent().unwrap() + .parent().unwrap() + .join("completion-scripts"); + + fs::create_dir(&path).ok(); + + Cli::clap().gen_completions("substrate-node", *shell, &path); + } } diff --git a/bin/node/cli/src/browser.rs b/bin/node/cli/src/browser.rs index b41bbe6281..e05238b82d 100644 --- a/bin/node/cli/src/browser.rs +++ b/bin/node/cli/src/browser.rs @@ -38,13 +38,13 @@ async fn start_inner(wasm_ext: Transport) -> Result = browser_configuration(wasm_ext, chain_spec) + let config: Configuration<_, _> = browser_configuration(wasm_ext, chain_spec) .await?; info!("Substrate browser node"); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017-2020"); - info!("Chain specification: {}", config.chain_spec.name()); + info!("Chain specification: {}", config.expect_chain_spec().name()); info!("Node name: {}", config.name); info!("Roles: {:?}", config.roles); diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 2a3d60a794..201e39eabd 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -14,21 +14,26 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -pub use sc_cli::VersionInfo; -use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; -use sc_cli::{IntoExit, NoCustom, SharedParams, ImportParams, error}; -use sc_service::{AbstractService, Roles as ServiceRoles, Configuration}; -use log::info; +use sc_cli::{SharedParams, ImportParams, RunCmd}; use structopt::StructOpt; -use sc_cli::{display_role, parse_and_prepare, GetSharedParams, ParseAndPrepare}; -use crate::{service, ChainSpec, load_spec}; -use crate::factory_impl::FactoryState; -use node_transaction_factory::RuntimeAdapter; -use futures::{channel::oneshot, future::{select, Either}}; -/// Custom subcommands. #[derive(Clone, Debug, StructOpt)] -pub enum CustomSubcommands { +#[structopt(settings = &[ + structopt::clap::AppSettings::GlobalVersion, + structopt::clap::AppSettings::ArgsNegateSubcommands, + structopt::clap::AppSettings::SubcommandsNegateReqs, +])] +pub struct Cli { + #[structopt(subcommand)] + pub subcommand: Option, + #[structopt(flatten)] + pub run: RunCmd, +} + +#[derive(Clone, Debug, StructOpt)] +pub enum Subcommand { + #[structopt(flatten)] + Base(sc_cli::Subcommand), /// The custom factory subcommmand for manufacturing transactions. #[structopt( name = "factory", @@ -38,14 +43,6 @@ pub enum CustomSubcommands { Factory(FactoryCmd), } -impl GetSharedParams for CustomSubcommands { - fn shared_params(&self) -> Option<&SharedParams> { - match self { - CustomSubcommands::Factory(cmd) => Some(&cmd.shared_params), - } - } -} - /// The `factory` command used to generate transactions. /// Please note: this command currently only works on an empty database! #[derive(Debug, StructOpt, Clone)] @@ -87,125 +84,3 @@ pub struct FactoryCmd { #[structopt(flatten)] pub import_params: ImportParams, } - -/// Parse command line arguments into service configuration. -pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Result<()> where - I: IntoIterator, - T: Into + Clone, - E: IntoExit, -{ - type Config = Configuration<(), A, B>; - - match parse_and_prepare::(&version, "substrate-node", args) { - ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, - |exit, _cli_args, _custom_args, mut config: Config<_, _>| { - info!("{}", version.name); - info!(" version {}", config.full_version()); - info!(" by Parity Technologies, 2017-2020"); - info!("Chain specification: {}", config.chain_spec.name()); - info!("Node name: {}", config.name); - info!("Roles: {}", display_role(&config)); - let runtime = RuntimeBuilder::new() - .thread_name("main-tokio-") - .threaded_scheduler() - .enable_all() - .build() - .map_err(|e| format!("{:?}", e))?; - config.tasks_executor = { - let runtime_handle = runtime.handle().clone(); - Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) - }; - match config.roles { - ServiceRoles::LIGHT => run_until_exit( - runtime, - service::new_light(config)?, - exit - ), - _ => run_until_exit( - runtime, - service::new_full(config)?, - exit - ), - } - }), - ParseAndPrepare::BuildSpec(cmd) => cmd.run::(load_spec), - ParseAndPrepare::ExportBlocks(cmd) => cmd.run_with_builder(|config: Config<_, _>| - Ok(new_full_start!(config).0), load_spec, exit), - ParseAndPrepare::ImportBlocks(cmd) => cmd.run_with_builder(|config: Config<_, _>| - Ok(new_full_start!(config).0), load_spec, exit), - ParseAndPrepare::CheckBlock(cmd) => cmd.run_with_builder(|config: Config<_, _>| - Ok(new_full_start!(config).0), load_spec, exit), - ParseAndPrepare::PurgeChain(cmd) => cmd.run(load_spec), - ParseAndPrepare::RevertChain(cmd) => cmd.run_with_builder(|config: Config<_, _>| - Ok(new_full_start!(config).0), load_spec), - ParseAndPrepare::CustomCommand(CustomSubcommands::Factory(cli_args)) => { - let mut config: Config<_, _> = sc_cli::create_config_with_db_path( - load_spec, - &cli_args.shared_params, - &version, - None, - )?; - sc_cli::fill_import_params( - &mut config, - &cli_args.import_params, - ServiceRoles::FULL, - cli_args.shared_params.dev, - )?; - - 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, - ); - - let service_builder = new_full_start!(config).0; - node_transaction_factory::factory::, _, _, _, _, _>( - factory_state, - service_builder.client(), - service_builder.select_chain() - .expect("The select_chain is always initialized by new_full_start!; QED") - ).map_err(|e| format!("Error in transaction factory: {}", e))?; - - Ok(()) - } - } -} - -fn run_until_exit( - mut runtime: Runtime, - service: T, - e: E, -) -> error::Result<()> -where - T: AbstractService, - E: IntoExit, -{ - let (exit_send, exit) = oneshot::channel(); - - let informant = sc_cli::informant::build(&service); - - let handle = runtime.spawn(select(exit, informant)); - - // we eagerly drop the service so that the internal exit future is fired, - // but we need to keep holding a reference to the global telemetry guard - let _telemetry = service.telemetry(); - - let exit = e.into_exit(); - let service_res = runtime.block_on(select(service, exit)); - - let _ = exit_send.send(()); - - if let Err(e) = runtime.block_on(handle) { - log::error!("Error running node: {:?}", e); - } - - match service_res { - Either::Left((res, _)) => res.map_err(error::Error::Service), - Either::Right((_, _)) => Ok(()) - } -} diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs new file mode 100644 index 0000000000..65015efcb2 --- /dev/null +++ b/bin/node/cli/src/command.rs @@ -0,0 +1,82 @@ +// Copyright 2017-2020 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 sc_cli::{VersionInfo, error}; +use sc_service::{Roles as ServiceRoles}; +use node_transaction_factory::RuntimeAdapter; +use crate::{Cli, service, ChainSpec, load_spec, Subcommand, factory_impl::FactoryState}; + +/// Parse command line arguments into service configuration. +pub fn run(args: I, version: sc_cli::VersionInfo) -> error::Result<()> +where + I: Iterator, + T: Into + Clone, +{ + let args: Vec<_> = args.collect(); + let opt = sc_cli::from_iter::(args.clone(), &version); + + let mut config = sc_service::Configuration::default(); + config.impl_name = "substrate-node"; + + match opt.subcommand { + None => sc_cli::run( + config, + opt.run, + service::new_light, + service::new_full, + load_spec, + &version, + ), + Some(Subcommand::Factory(cli_args)) => { + sc_cli::init(&mut config, load_spec, &cli_args.shared_params, &version)?; + + sc_cli::fill_import_params( + &mut config, + &cli_args.import_params, + ServiceRoles::FULL, + cli_args.shared_params.dev, + )?; + + match ChainSpec::from(config.expect_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, + ); + + let service_builder = new_full_start!(config).0; + node_transaction_factory::factory::, _, _, _, _, _>( + factory_state, + service_builder.client(), + service_builder.select_chain() + .expect("The select_chain is always initialized by new_full_start!; QED") + ).map_err(|e| format!("Error in transaction factory: {}", e))?; + + Ok(()) + }, + Some(Subcommand::Base(subcommand)) => sc_cli::run_subcommand( + config, + subcommand, + load_spec, + |config: service::NodeConfiguration| Ok(new_full_start!(config).0), + &version, + ), + } +} diff --git a/bin/node/cli/src/lib.rs b/bin/node/cli/src/lib.rs index d3fbf9c1ea..f5b915a2be 100644 --- a/bin/node/cli/src/lib.rs +++ b/bin/node/cli/src/lib.rs @@ -39,11 +39,15 @@ mod browser; mod cli; #[cfg(feature = "cli")] mod factory_impl; +#[cfg(feature = "cli")] +mod command; #[cfg(feature = "browser")] pub use browser::*; #[cfg(feature = "cli")] pub use cli::*; +#[cfg(feature = "cli")] +pub use command::*; /// The chain specification option. #[derive(Clone, Debug, PartialEq)] diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 32f2d0001c..e72430e93d 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -274,10 +274,10 @@ type ConcreteTransactionPool = sc_transaction_pool::BasicPool< >; /// A specialized configuration object for setting up the node.. -pub type NodeConfiguration = Configuration; +pub type NodeConfiguration = Configuration; /// Builds a new service for a full client. -pub fn new_full(config: NodeConfiguration) +pub fn new_full(config: NodeConfiguration) -> Result< Service< ConcreteBlock, @@ -299,7 +299,7 @@ pub fn new_full(config: NodeConfiguration) } /// Builds a new service for a light client. -pub fn new_light(config: NodeConfiguration) +pub fn new_light(config: NodeConfiguration) -> Result { type RpcExtension = jsonrpc_core::IoHandler; let inherent_data_providers = InherentDataProviders::new(); diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index b4707a5eb4..8f122a35a0 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -12,4 +12,4 @@ sc-keystore = { version = "2.0.0", path = "../../../client/keystore" } node-cli = { version = "2.0.0", path = "../../node/cli" } sp-core = { version = "2.0.0", path = "../../../primitives/core" } rand = "0.7.2" -structopt = "=0.3.7" +structopt = "0.3.8" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 020ae164ef..abfb53ccb1 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -17,7 +17,7 @@ time = "0.1.42" ansi_term = "0.12.1" lazy_static = "1.4.0" app_dirs = "1.2.1" -tokio = "0.2" +tokio = { version = "0.2.9", features = [ "signal", "rt-core", "rt-threaded" ] } futures = "0.3.1" fdlimit = "0.1.1" serde_json = "1.0.41" @@ -32,8 +32,9 @@ sp-state-machine = { version = "0.8", path = "../../primitives/state-machine" } sc-telemetry = { version = "2.0.0", path = "../telemetry" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } names = "0.11.0" -structopt = "=0.3.7" +structopt = "0.3.8" sc-tracing = { version = "2.0.0", path = "../tracing" } +chrono = "0.4.10" [target.'cfg(not(target_os = "unknown"))'.dependencies] rpassword = "4.0.1" diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index d9ea238ba0..c602d52ed9 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -25,47 +25,49 @@ mod params; mod execution_strategy; pub mod error; pub mod informant; +mod runtime; +mod node_key; use sc_client_api::execution_extensions::ExecutionStrategies; use sc_service::{ config::{Configuration, DatabaseConfig, KeystoreConfig}, ServiceBuilderCommand, RuntimeGenesis, ChainSpecExtension, PruningMode, ChainSpec, + AbstractService, Roles as ServiceRoles, }; use sc_network::{ self, multiaddr::Protocol, config::{ - NetworkConfiguration, TransportConfig, NonReservedPeerMode, NodeKeyConfig, build_multiaddr + NetworkConfiguration, TransportConfig, NonReservedPeerMode, }, }; -use sp_core::H256; -use execution_strategy::*; use std::{ - io::{Write, Read, Seek, Cursor, stdin, stdout, ErrorKind}, iter, fmt::Debug, fs::{self, File}, - net::{Ipv4Addr, SocketAddr}, path::{Path, PathBuf}, str::FromStr, pin::Pin, task::Poll + io::Write, iter, fmt::Debug, fs, + net::{Ipv4Addr, SocketAddr}, path::PathBuf, }; -use names::{Generator, Name}; use regex::Regex; -use structopt::{StructOpt, StructOptInternal, clap::AppSettings}; -#[doc(hidden)] -pub use structopt::clap::App; +use structopt::{StructOpt, clap}; +pub use structopt; use params::{ - RunCmd, PurgeChainCmd, RevertCmd, ImportBlocksCmd, ExportBlocksCmd, BuildSpecCmd, - NetworkConfigurationParams, MergeParameters, TransactionPoolParams, - NodeKeyParams, NodeKeyType, Cors, CheckBlockCmd, + NetworkConfigurationParams, TransactionPoolParams, Cors, +}; +pub use params::{ + SharedParams, ImportParams, ExecutionStrategy, Subcommand, RunCmd, BuildSpecCmd, + ExportBlocksCmd, ImportBlocksCmd, CheckBlockCmd, PurgeChainCmd, RevertCmd, }; -pub use params::{NoCustom, CoreParams, SharedParams, ImportParams, ExecutionStrategy}; pub use traits::GetSharedParams; use app_dirs::{AppInfo, AppDataType}; use log::info; use lazy_static::lazy_static; -use futures::{Future, executor::block_on}; use sc_telemetry::TelemetryEndpoints; -use sp_runtime::generic::BlockId; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; +pub use crate::runtime::{run_until_exit, run_service_until_exit}; +use execution_strategy::*; +use names::{Generator, Name}; +use chrono::prelude::*; /// default sub directory to store network config const DEFAULT_NETWORK_CONFIG_PATH : &'static str = "network"; @@ -77,11 +79,6 @@ const DEFAULT_KEYSTORE_CONFIG_PATH : &'static str = "keystore"; /// The maximum number of characters for a node name. const NODE_NAME_MAX_LENGTH: usize = 32; -/// The file name of the node's Ed25519 secret key inside the chain-specific -/// network config directory, if neither `--node-key` nor `--node-key-file` -/// is specified in combination with `--node-key-type=ed25519`. -const NODE_KEY_ED25519_FILE: &str = "secret_ed25519"; - /// Executable version. Used to pass version information from the root crate. #[derive(Clone)] pub struct VersionInfo { @@ -99,14 +96,8 @@ pub struct VersionInfo { pub author: &'static str, /// Support URL. pub support_url: &'static str, -} - -/// Something that can be converted into an exit signal. -pub trait IntoExit { - /// Exit signal type. - type Exit: Future + Unpin + Send + 'static; - /// Convert into exit signal. - fn into_exit(self) -> Self::Exit; + /// Copyright starting year (x-current year) + pub copyright_start_year: i32, } fn get_chain_key(cli: &SharedParams) -> String { @@ -143,13 +134,8 @@ pub fn load_spec(cli: &SharedParams, factory: F) -> error::Result, -) -> PathBuf { +fn base_path(cli: &SharedParams, version: &VersionInfo) -> PathBuf { cli.base_path.clone() - .or(default_base_path) .unwrap_or_else(|| app_dirs::get_app_root( AppDataType::UserData, @@ -161,637 +147,227 @@ fn base_path( ) } -/// Check whether a node name is considered as valid -fn is_node_name_valid(_name: &str) -> Result<(), &str> { - let name = _name.to_string(); - if name.chars().count() >= NODE_NAME_MAX_LENGTH { - return Err("Node name too long"); - } - - let invalid_chars = r"[\\.@]"; - let re = Regex::new(invalid_chars).unwrap(); - if re.is_match(&name) { - return Err("Node name should not contain invalid chars such as '.' and '@'"); - } - - let invalid_patterns = r"(https?:\\/+)?(www)+"; - let re = Regex::new(invalid_patterns).unwrap(); - if re.is_match(&name) { - return Err("Node name should not contain urls"); - } - - Ok(()) +/// Helper function used to parse the command line arguments. This is the equivalent of +/// `structopt`'s `from_args()` except that it takes a `VersionInfo` argument to provide the name of +/// the application, author, "about" and version. +/// +/// Gets the struct from the command line arguments. Print the +/// error message and quit the program in case of failure. +pub fn from_args(version: &VersionInfo) -> T +where + T: StructOpt + Sized, +{ + from_iter::(&mut std::env::args_os(), version) } -/// Parse command line interface arguments and prepares the command for execution. -/// -/// Before returning, this function performs various initializations, such as initializing the -/// panic handler and the logger, or increasing the limit for file descriptors. -/// -/// # Remarks +/// Helper function used to parse the command line arguments. This is the equivalent of +/// `structopt`'s `from_iter()` except that it takes a `VersionInfo` argument to provide the name of +/// the application, author, "about" and version. /// -/// `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` 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_prepare<'a, CC, RP, I>( - version: &'a VersionInfo, - impl_name: &'static str, - args: I, -) -> ParseAndPrepare<'a, CC, RP> +/// Gets the struct from any iterator such as a `Vec` of your making. +/// Print the error message and quit the program in case of failure. +pub fn from_iter(iter: I, version: &VersionInfo) -> T where - CC: StructOpt + Clone + GetSharedParams, - RP: StructOpt + Clone + StructOptInternal, + T: StructOpt + Sized, I: IntoIterator, - ::Item: Into + Clone, + I::Item: Into + Clone, { - let full_version = sc_service::config::full_version_from_strs( + let app = T::clap(); + + let mut full_version = sc_service::config::full_version_from_strs( version.version, version.commit ); + full_version.push_str("\n"); - sp_panic_handler::set(version.support_url, &full_version); - let matches = CoreParams::::clap() + let app = app .name(version.executable_name) .author(version.author) .about(version.description) - .version(&(full_version + "\n")[..]) - .setting(AppSettings::GlobalVersion) - .setting(AppSettings::ArgsNegateSubcommands) - .setting(AppSettings::SubcommandsNegateReqs) - .get_matches_from(args); - let cli_args = CoreParams::::from_clap(&matches); - fdlimit::raise_fd_limit(); - - let args = match cli_args { - params::CoreParams::Run(params) => ParseAndPrepare::Run( - ParseAndPrepareRun { params, impl_name, version } - ), - params::CoreParams::BuildSpec(params) => ParseAndPrepare::BuildSpec( - ParseAndPrepareBuildSpec { params, version } - ), - params::CoreParams::ExportBlocks(params) => ParseAndPrepare::ExportBlocks( - ParseAndPrepareExport { params, version } - ), - params::CoreParams::ImportBlocks(params) => ParseAndPrepare::ImportBlocks( - ParseAndPrepareImport { params, version } - ), - params::CoreParams::CheckBlock(params) => ParseAndPrepare::CheckBlock( - CheckBlock { params, version } - ), - params::CoreParams::PurgeChain(params) => ParseAndPrepare::PurgeChain( - ParseAndPreparePurge { params, version } - ), - params::CoreParams::Revert(params) => ParseAndPrepare::RevertChain( - ParseAndPrepareRevert { params, version } - ), - params::CoreParams::Custom(params) => ParseAndPrepare::CustomCommand(params), - }; - init_logger(args.shared_params().and_then(|p| p.log.as_ref()).map(|v| v.as_ref()).unwrap_or("")); - args -} + .version(full_version.as_str()); -/// Returns a string displaying the node role, special casing the sentry mode -/// (returning `SENTRY`), since the node technically has an `AUTHORITY` role but -/// doesn't participate. -pub fn display_role(config: &Configuration) -> String { - if config.sentry_mode { - "SENTRY".to_string() - } else { - format!("{:?}", config.roles) - } -} - -/// Output of calling `parse_and_prepare`. -#[must_use] -pub enum ParseAndPrepare<'a, CC, RP> { - /// Command ready to run the main client. - Run(ParseAndPrepareRun<'a, RP>), - /// Command ready to build chain specs. - BuildSpec(ParseAndPrepareBuildSpec<'a>), - /// Command ready to export the chain. - ExportBlocks(ParseAndPrepareExport<'a>), - /// Command ready to import the chain. - ImportBlocks(ParseAndPrepareImport<'a>), - /// Command to check a block. - CheckBlock(CheckBlock<'a>), - /// Command ready to purge the chain. - PurgeChain(ParseAndPreparePurge<'a>), - /// Command ready to revert the chain. - RevertChain(ParseAndPrepareRevert<'a>), - /// An additional custom command passed to `parse_and_prepare`. - CustomCommand(CC), -} - -impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> where CC: GetSharedParams { - /// Return common set of parameters shared by all commands. - pub fn shared_params(&self) -> Option<&SharedParams> { - match self { - ParseAndPrepare::Run(c) => Some(&c.params.left.shared_params), - ParseAndPrepare::BuildSpec(c) => Some(&c.params.shared_params), - ParseAndPrepare::ExportBlocks(c) => Some(&c.params.shared_params), - ParseAndPrepare::ImportBlocks(c) => Some(&c.params.shared_params), - ParseAndPrepare::CheckBlock(c) => Some(&c.params.shared_params), - ParseAndPrepare::PurgeChain(c) => Some(&c.params.shared_params), - ParseAndPrepare::RevertChain(c) => Some(&c.params.shared_params), - ParseAndPrepare::CustomCommand(c) => c.shared_params(), - } - } + T::from_clap(&app.get_matches_from(iter)) } -impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { - /// Convert ParseAndPrepare to Configuration - pub fn into_configuration( - self, - spec_factory: S, - default_base_path: Option, - ) -> error::Result>> - where - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, - S: FnOnce(&str) -> Result>, String>, - { - match self { - ParseAndPrepare::Run(c) => - Some(create_run_node_config( - c.params.left, - spec_factory, - c.impl_name, - c.version, - default_base_path, - )).transpose(), - ParseAndPrepare::BuildSpec(c) => { - let spec = load_spec(&c.params.shared_params, spec_factory)?; - - Some(create_build_spec_config( - &spec, - &c.params.shared_params, - c.version, - default_base_path, - )).transpose() - }, - ParseAndPrepare::ExportBlocks(c) => - Some(create_config_with_db_path( - spec_factory, - &c.params.shared_params, - c.version, - default_base_path, - )).transpose(), - ParseAndPrepare::ImportBlocks(c) => - Some(create_config_with_db_path( - spec_factory, - &c.params.shared_params, - c.version, - default_base_path, - )).transpose(), - ParseAndPrepare::CheckBlock(c) => - Some(create_config_with_db_path( - spec_factory, - &c.params.shared_params, - c.version, - default_base_path, - )).transpose(), - ParseAndPrepare::PurgeChain(c) => - Some(create_config_with_db_path( - spec_factory, - &c.params.shared_params, - c.version, - default_base_path, - )).transpose(), - ParseAndPrepare::RevertChain(c) => - Some(create_config_with_db_path( - spec_factory, - &c.params.shared_params, - c.version, - default_base_path, - )).transpose(), - ParseAndPrepare::CustomCommand(_) => Ok(None), - } - } -} - -/// Command ready to run the main client. -pub struct ParseAndPrepareRun<'a, RP> { - params: MergeParameters, - impl_name: &'static str, - version: &'a VersionInfo, -} - -impl<'a, RP> ParseAndPrepareRun<'a, RP> { - /// Runs the command and runs the main client. - pub fn run( - self, - spec_factory: S, - exit: Exit, - run_service: RS, - ) -> error::Result<()> - where - S: FnOnce(&str) -> Result>, String>, - E: Into, - RP: StructOpt + Clone, - C: Default, - G: RuntimeGenesis, - CE: ChainSpecExtension, - Exit: IntoExit, - RS: FnOnce(Exit, RunCmd, RP, Configuration) -> Result<(), E> - { - let config = create_run_node_config( - self.params.left.clone(), - spec_factory, - self.impl_name, - self.version, - None, - )?; - - run_service(exit, self.params.left, self.params.right, config).map_err(Into::into) - } -} - -/// Command ready to build chain specs. -pub struct ParseAndPrepareBuildSpec<'a> { - params: BuildSpecCmd, - version: &'a VersionInfo, -} - -impl<'a> ParseAndPrepareBuildSpec<'a> { - /// Runs the command and build the chain specs. - pub fn run( - self, - spec_factory: S - ) -> error::Result<()> where - S: FnOnce(&str) -> Result>, String>, - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, - { - info!("Building chain spec"); - let raw_output = self.params.raw; - let mut spec = load_spec(&self.params.shared_params, spec_factory)?; - - if spec.boot_nodes().is_empty() && !self.params.disable_default_bootnode { - let cfg = create_build_spec_config::( - &spec, - &self.params.shared_params, - self.version, - None, - )?; - let node_key = node_key_config( - self.params.node_key_params, - &Some(cfg.in_chain_config_dir(DEFAULT_NETWORK_CONFIG_PATH).expect("We provided a base_path")) - )?; - let keys = node_key.into_keypair()?; - let peer_id = keys.public().into_peer_id(); - let addr = build_multiaddr![ - Ip4([127, 0, 0, 1]), - Tcp(30333u16), - P2p(peer_id) - ]; - spec.add_boot_node(addr) - } - - let json = sc_service::chain_ops::build_spec(spec, raw_output)?; - - print!("{}", json); - - Ok(()) - } -} - -/// Command ready to export the chain. -pub struct ParseAndPrepareExport<'a> { - params: ExportBlocksCmd, - version: &'a VersionInfo, -} - -impl<'a> ParseAndPrepareExport<'a> { - /// Runs the command and exports from the chain. - pub fn run_with_builder( - self, - builder: F, - spec_factory: S, - exit: Exit, - ) -> error::Result<()> - where S: FnOnce(&str) -> Result>, String>, - F: FnOnce(Configuration) -> Result, - B: ServiceBuilderCommand, - <<<::Block as BlockT>::Header as HeaderT> - ::Number as FromStr>::Err: Debug, - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, - Exit: IntoExit - { - let mut config = create_config_with_db_path( - spec_factory, - &self.params.shared_params, - self.version, - None, - )?; - fill_config_keystore_in_memory(&mut config)?; - - if let DatabaseConfig::Path { ref path, .. } = &config.database { - info!("DB path: {}", path.display()); - } - let from = self.params.from.and_then(|f| f.parse().ok()).unwrap_or(1); - let to = self.params.to.and_then(|t| t.parse().ok()); - - let json = self.params.json; - - let file: Box = match self.params.output { - Some(filename) => Box::new(File::create(filename)?), - None => Box::new(stdout()), - }; +/// Helper function used to parse the command line arguments. This is the equivalent of +/// `structopt`'s `try_from_iter()` except that it takes a `VersionInfo` argument to provide the +/// name of the application, author, "about" and version. +/// +/// Gets the struct from any iterator such as a `Vec` of your making. +/// Print the error message and quit the program in case of failure. +/// +/// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are +/// used. It will return a [`clap::Error`], where the [`kind`] is a +/// [`ErrorKind::HelpDisplayed`] or [`ErrorKind::VersionDisplayed`] respectively. You must call +/// [`Error::exit`] or perform a [`std::process::exit`]. +pub fn try_from_iter(iter: I, version: &VersionInfo) -> clap::Result +where + T: StructOpt + Sized, + I: IntoIterator, + I::Item: Into + Clone, +{ + let app = T::clap(); - // Note: while we would like the user to handle the exit themselves, we handle it here - // for backwards compatibility reasons. - let (exit_send, exit_recv) = std::sync::mpsc::channel(); - let exit = exit.into_exit(); - std::thread::spawn(move || { - block_on(exit); - let _ = exit_send.send(()); - }); + let mut full_version = sc_service::config::full_version_from_strs( + version.version, + version.commit, + ); + full_version.push_str("\n"); - let mut export_fut = builder(config)? - .export_blocks(file, from.into(), to, json); - let fut = futures::future::poll_fn(|cx| { - if exit_recv.try_recv().is_ok() { - return Poll::Ready(Ok(())); - } - Pin::new(&mut export_fut).poll(cx) - }); + let app = app + .name(version.executable_name) + .author(version.author) + .about(version.description) + .version(full_version.as_str()); - let mut runtime = tokio::runtime::Runtime::new().unwrap(); - runtime.block_on(fut)?; - Ok(()) - } -} + let matches = app.get_matches_from_safe(iter)?; -/// Command ready to import the chain. -pub struct ParseAndPrepareImport<'a> { - params: ImportBlocksCmd, - version: &'a VersionInfo, + Ok(T::from_clap(&matches)) } -impl<'a> ParseAndPrepareImport<'a> { - /// Runs the command and imports to the chain. - pub fn run_with_builder( - self, - builder: F, - spec_factory: S, - exit: Exit, - ) -> error::Result<()> - where S: FnOnce(&str) -> Result>, String>, - F: FnOnce(Configuration) -> Result, - B: ServiceBuilderCommand, - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, - Exit: IntoExit - { - let mut config = create_config_with_db_path( - spec_factory, - &self.params.shared_params, - self.version, - None, - )?; - fill_import_params( - &mut config, - &self.params.import_params, - sc_service::Roles::FULL, - self.params.shared_params.dev, - )?; - - let file: Box = match self.params.input { - Some(filename) => Box::new(File::open(filename)?), - None => { - let mut buffer = Vec::new(); - stdin().read_to_end(&mut buffer)?; - Box::new(Cursor::new(buffer)) - }, - }; - - // Note: while we would like the user to handle the exit themselves, we handle it here - // for backwards compatibility reasons. - let (exit_send, exit_recv) = std::sync::mpsc::channel(); - let exit = exit.into_exit(); - std::thread::spawn(move || { - block_on(exit); - let _ = exit_send.send(()); - }); - - let mut import_fut = builder(config)? - .import_blocks(file, false); - let fut = futures::future::poll_fn(|cx| { - if exit_recv.try_recv().is_ok() { - return Poll::Ready(Ok(())); - } - Pin::new(&mut import_fut).poll(cx) - }); - - let mut runtime = tokio::runtime::Runtime::new().unwrap(); - runtime.block_on(fut)?; - Ok(()) - } -} +/// A helper function that initializes and runs the node +pub fn run( + mut config: Configuration, + run_cmd: RunCmd, + new_light: FNL, + new_full: FNF, + spec_factory: F, + version: &VersionInfo, +) -> error::Result<()> +where + F: FnOnce(&str) -> Result>, String>, + FNL: FnOnce(Configuration) -> Result, + FNF: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + SL: AbstractService + Unpin, + SF: AbstractService + Unpin, +{ + init(&mut config, spec_factory, &run_cmd.shared_params, version)?; -/// Command to check a block. -pub struct CheckBlock<'a> { - params: CheckBlockCmd, - version: &'a VersionInfo, + run_cmd.run(config, new_light, new_full, version) } -impl<'a> CheckBlock<'a> { - /// Runs the command and imports to the chain. - pub fn run_with_builder( - self, - builder: F, - spec_factory: S, - _exit: Exit, - ) -> error::Result<()> - where S: FnOnce(&str) -> Result>, String>, - F: FnOnce(Configuration) -> Result, - B: ServiceBuilderCommand, - <::Block as BlockT>::Hash: FromStr, - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, - Exit: IntoExit - { - let mut config = create_config_with_db_path( - spec_factory, - &self.params.shared_params, - self.version, - None, - )?; - fill_import_params( - &mut config, - &self.params.import_params, - sc_service::Roles::FULL, - self.params.shared_params.dev, - )?; - fill_config_keystore_in_memory(&mut config)?; - - let input = if self.params.input.starts_with("0x") { &self.params.input[2..] } else { &self.params.input[..] }; - let block_id = match FromStr::from_str(input) { - Ok(hash) => BlockId::hash(hash), - Err(_) => match self.params.input.parse::() { - Ok(n) => BlockId::number((n as u32).into()), - Err(_) => return Err(error::Error::Input("Invalid hash or number specified".into())), - } - }; - - let start = std::time::Instant::now(); - let check = builder(config)? - .check_block(block_id); - let mut runtime = tokio::runtime::Runtime::new().unwrap(); - runtime.block_on(check)?; - println!("Completed in {} ms.", start.elapsed().as_millis()); - Ok(()) - } -} +/// A helper function that initializes and runs any of the subcommand variants of `CoreParams`. +pub fn run_subcommand( + mut config: Configuration, + subcommand: Subcommand, + spec_factory: F, + builder: B, + version: &VersionInfo, +) -> error::Result<()> +where + F: FnOnce(&str) -> Result>, String>, + B: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + BC: ServiceBuilderCommand + Unpin, + BB: sp_runtime::traits::Block + Debug, + <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, + ::Hash: std::str::FromStr, +{ + init(&mut config, spec_factory, &subcommand.get_shared_params(), version)?; -/// Command ready to purge the chain. -pub struct ParseAndPreparePurge<'a> { - params: PurgeChainCmd, - version: &'a VersionInfo, + subcommand.run(config, builder) } -impl<'a> ParseAndPreparePurge<'a> { - /// Runs the command and purges the chain. - pub fn run( - self, - spec_factory: S - ) -> error::Result<()> where - S: FnOnce(&str) -> Result>, String>, - G: RuntimeGenesis, - E: ChainSpecExtension, - { - let mut config = create_config_with_db_path::<(), _, _, _>( - spec_factory, - &self.params.shared_params, - self.version, - None, - )?; - fill_config_keystore_in_memory(&mut config)?; - let db_path = match config.database { - DatabaseConfig::Path { path, .. } => path, - _ => { - eprintln!("Cannot purge custom database implementation"); - return Ok(()); - } - }; - - if !self.params.yes { - print!("Are you sure to remove {:?}? [y/N]: ", &db_path); - stdout().flush().expect("failed to flush stdout"); - - let mut input = String::new(); - stdin().read_line(&mut input)?; - let input = input.trim(); +/// Initialize substrate and its configuration +/// +/// This method: +/// +/// 1. set the panic handler +/// 2. raise the FD limit +/// 3. initialize the logger +/// 4. update the configuration provided with the chain specification, config directory, +/// information (version, commit), database's path, boot nodes and telemetry endpoints +pub fn init( + mut config: &mut Configuration, + spec_factory: F, + shared_params: &SharedParams, + version: &VersionInfo, +) -> error::Result<()> +where + G: RuntimeGenesis, + E: ChainSpecExtension, + F: FnOnce(&str) -> Result>, String>, +{ + let full_version = sc_service::config::full_version_from_strs( + version.version, + version.commit + ); + sp_panic_handler::set(version.support_url, &full_version); - match input.chars().nth(0) { - Some('y') | Some('Y') => {}, - _ => { - println!("Aborted"); - return Ok(()); - }, - } - } + fdlimit::raise_fd_limit(); + init_logger(shared_params.log.as_ref().map(|v| v.as_ref()).unwrap_or("")); - match fs::remove_dir_all(&db_path) { - Result::Ok(_) => { - println!("{:?} removed.", &db_path); - Ok(()) - }, - Result::Err(ref err) if err.kind() == ErrorKind::NotFound => { - eprintln!("{:?} did not exist.", &db_path); - Ok(()) - }, - Result::Err(err) => Result::Err(err.into()) - } - } -} + config.chain_spec = Some(load_spec(shared_params, spec_factory)?); + config.config_dir = Some(base_path(shared_params, version)); + config.impl_commit = version.commit; + config.impl_version = version.version; -/// Command ready to revert the chain. -pub struct ParseAndPrepareRevert<'a> { - params: RevertCmd, - version: &'a VersionInfo, -} + config.database = DatabaseConfig::Path { + path: config + .in_chain_config_dir(DEFAULT_DB_CONFIG_PATH) + .expect("We provided a base_path/config_dir."), + cache_size: None, + }; -impl<'a> ParseAndPrepareRevert<'a> { - /// Runs the command and reverts the chain. - pub fn run_with_builder( - self, - builder: F, - spec_factory: S - ) -> error::Result<()> where - S: FnOnce(&str) -> Result>, String>, - F: FnOnce(Configuration) -> Result, - B: ServiceBuilderCommand, - <<<::Block as BlockT>::Header as HeaderT> - ::Number as FromStr>::Err: Debug, - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, - { - let mut config = create_config_with_db_path( - spec_factory, - &self.params.shared_params, - self.version, - None, - )?; - fill_config_keystore_in_memory(&mut config)?; + config.network.boot_nodes = config.expect_chain_spec().boot_nodes().to_vec(); + config.telemetry_endpoints = config.expect_chain_spec().telemetry_endpoints().clone(); - let blocks = self.params.num.parse()?; - builder(config)?.revert_chain(blocks)?; - Ok(()) - } + Ok(()) } -/// Create a `NodeKeyConfig` from the given `NodeKeyParams` in the context -/// of an optional network config storage directory. -fn node_key_config

(params: NodeKeyParams, net_config_dir: &Option

) - -> error::Result +/// Run the node +/// +/// Builds and runs either a full or a light node, depending on the `role` within the `Configuration`. +pub fn run_node( + config: Configuration, + new_light: FNL, + new_full: FNF, + version: &VersionInfo, +) -> error::Result<()> where - P: AsRef + FNL: FnOnce(Configuration) -> Result, + FNF: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + SL: AbstractService + Unpin, + SF: AbstractService + Unpin, { - match params.node_key_type { - NodeKeyType::Ed25519 => - params.node_key.as_ref().map(parse_ed25519_secret).unwrap_or_else(|| - Ok(params.node_key_file - .or_else(|| net_config_file(net_config_dir, NODE_KEY_ED25519_FILE)) - .map(sc_network::config::Secret::File) - .unwrap_or(sc_network::config::Secret::New))) - .map(NodeKeyConfig::Ed25519) + info!("{}", version.name); + info!(" version {}", config.full_version()); + info!(" by {}, {}-{}", version.author, version.copyright_start_year, Local::today().year()); + info!("Chain specification: {}", config.expect_chain_spec().name()); + info!("Node name: {}", config.name); + info!("Roles: {}", display_role(&config)); + + match config.roles { + ServiceRoles::LIGHT => run_service_until_exit( + config, + new_light, + ), + _ => run_service_until_exit( + config, + new_full, + ), } } -fn net_config_file

(net_config_dir: &Option

, name: &str) -> Option -where - P: AsRef -{ - net_config_dir.as_ref().map(|d| d.as_ref().join(name)) -} - -/// Create an error caused by an invalid node key argument. -fn invalid_node_key(e: impl std::fmt::Display) -> error::Error { - error::Error::Input(format!("Invalid node key: {}", e)) -} - -/// Parse a Ed25519 secret key from a hex string into a `sc_network::Secret`. -fn parse_ed25519_secret(hex: &String) -> error::Result { - H256::from_str(&hex).map_err(invalid_node_key).and_then(|bytes| - sc_network::config::identity::ed25519::SecretKey::from_bytes(bytes) - .map(sc_network::config::Secret::Input) - .map_err(invalid_node_key)) +/// Returns a string displaying the node role, special casing the sentry mode +/// (returning `SENTRY`), since the node technically has an `AUTHORITY` role but +/// doesn't participate. +pub fn display_role(config: &Configuration) -> String { + if config.sentry_mode { + "SENTRY".to_string() + } else { + format!("{:?}", config.roles) + } } /// Fill the given `PoolConfiguration` by looking at the cli parameters. -fn fill_transaction_pool_configuration( - options: &mut Configuration, +fn fill_transaction_pool_configuration( + options: &mut Configuration, params: TransactionPoolParams, ) -> error::Result<()> { // ready queue @@ -846,7 +422,7 @@ fn fill_network_configuration( config.public_addresses = Vec::new(); config.client_version = client_id; - config.node_key = node_key_config(cli.node_key_params, &config.net_config_path)?; + config.node_key = node_key::node_key_config(cli.node_key_params, &config.net_config_path)?; config.in_peers = cli.in_peers; config.out_peers = cli.out_peers; @@ -869,7 +445,7 @@ fn input_keystore_password() -> Result { } /// Use in memory keystore config when it is not required at all. -fn fill_config_keystore_in_memory(config: &mut sc_service::Configuration) +fn fill_config_keystore_in_memory(config: &mut sc_service::Configuration) -> Result<(), String> { match &mut config.keystore { @@ -879,8 +455,8 @@ fn fill_config_keystore_in_memory(config: &mut sc_service::Configuratio } /// Fill the password field of the given config instance. -fn fill_config_keystore_password_and_path( - config: &mut sc_service::Configuration, +fn fill_config_keystore_password_and_path( + config: &mut sc_service::Configuration, cli: &RunCmd, ) -> Result<(), String> { let password = if cli.password_interactive { @@ -911,16 +487,14 @@ fn fill_config_keystore_password_and_path( } /// Put block import CLI params into `config` object. -pub fn fill_import_params( - config: &mut Configuration, +pub fn fill_import_params( + config: &mut Configuration, cli: &ImportParams, role: sc_service::Roles, is_dev: bool, ) -> error::Result<()> - where - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, +where + G: RuntimeGenesis, { match config.database { DatabaseConfig::Path { ref mut cache_size, .. } => @@ -975,31 +549,20 @@ pub fn fill_import_params( Ok(()) } -fn create_run_node_config( +/// Update and prepare a `Configuration` with command line parameters of `RunCmd` +pub fn update_config_for_running_node( + mut config: &mut Configuration, cli: RunCmd, - spec_factory: S, - impl_name: &'static str, - version: &VersionInfo, - default_base_path: Option, -) -> error::Result> +) -> error::Result<()> where - C: Default, G: RuntimeGenesis, - E: ChainSpecExtension, - S: FnOnce(&str) -> Result>, String>, { - let mut config = create_config_with_db_path( - spec_factory, - &cli.shared_params, - &version, - default_base_path, - )?; - fill_config_keystore_password_and_path(&mut config, &cli)?; + let keyring = cli.get_keyring(); let is_dev = cli.shared_params.dev; let is_light = cli.light; - let is_authority = (cli.validator || cli.sentry || is_dev || cli.keyring.account.is_some()) + let is_authority = (cli.validator || cli.sentry || is_dev || keyring.is_some()) && !is_light; let role = if is_light { @@ -1012,15 +575,12 @@ where fill_import_params(&mut config, &cli.import_params, role, is_dev)?; - config.impl_name = impl_name; - config.impl_commit = version.commit; - config.impl_version = version.version; - - config.name = match cli.name.or(cli.keyring.account.map(|a| a.to_string())) { - None => generate_node_name(), - Some(name) => name, + config.name = match (cli.name.as_ref(), keyring) { + (Some(name), _) => name.to_string(), + (_, Some(keyring)) => keyring.to_string(), + (None, None) => generate_node_name(), }; - match is_node_name_valid(&config.name) { + match node_key::is_node_name_valid(&config.name) { Ok(_) => (), Err(msg) => Err( error::Error::Input( @@ -1056,7 +616,7 @@ where fill_transaction_pool_configuration(&mut config, cli.pool_config)?; - config.dev_key_seed = cli.keyring.account + config.dev_key_seed = keyring .map(|a| format!("//{}", a)).or_else(|| { if is_dev && !is_light { Some("//Alice".into()) @@ -1065,15 +625,21 @@ where } }); - let rpc_interface: &str = interface_str(cli.rpc_external, cli.unsafe_rpc_external, cli.validator)?; - let ws_interface: &str = interface_str(cli.ws_external, cli.unsafe_ws_external, cli.validator)?; - let grafana_interface: &str = if cli.grafana_external { "0.0.0.0" } else { "127.0.0.1" }; + if config.rpc_http.is_none() { + let rpc_interface: &str = interface_str(cli.rpc_external, cli.unsafe_rpc_external, cli.validator)?; + config.rpc_http = Some(parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)?); + } + if config.rpc_ws.is_none() { + let ws_interface: &str = interface_str(cli.ws_external, cli.unsafe_ws_external, cli.validator)?; + config.rpc_ws = Some(parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)?); + } - config.rpc_http = Some(parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)?); - config.rpc_ws = Some(parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)?); - config.grafana_port = Some( - parse_address(&format!("{}:{}", grafana_interface, 9955), cli.grafana_port)? - ); + if config.grafana_port.is_none() { + let grafana_interface: &str = if cli.grafana_external { "0.0.0.0" } else { "127.0.0.1" }; + config.grafana_port = Some( + parse_address(&format!("{}:{}", grafana_interface, 9955), cli.grafana_port)? + ); + } config.rpc_ws_max_connections = cli.ws_max_connections; config.rpc_cors = cli.rpc_cors.unwrap_or_else(|| if is_dev { @@ -1103,7 +669,7 @@ where // Imply forced authoring on --dev config.force_authoring = cli.shared_params.dev || cli.force_authoring; - Ok(config) + Ok(()) } fn interface_str( @@ -1127,61 +693,6 @@ fn interface_str( } } -/// Creates a configuration including the database path. -pub fn create_config_with_db_path( - spec_factory: S, - cli: &SharedParams, - version: &VersionInfo, - default_base_path: Option, -) -> error::Result> -where - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, - S: FnOnce(&str) -> Result>, String>, -{ - let spec = load_spec(cli, spec_factory)?; - let base_path = base_path(cli, version, default_base_path); - - let mut config = sc_service::Configuration::default_with_spec_and_base_path( - spec.clone(), - Some(base_path), - ); - - config.database = DatabaseConfig::Path { - path: config.in_chain_config_dir(DEFAULT_DB_CONFIG_PATH).expect("We provided a base_path."), - cache_size: None, - }; - - Ok(config) -} - -/// Creates a configuration including the base path and the shared params -fn create_build_spec_config( - spec: &ChainSpec, - cli: &SharedParams, - version: &VersionInfo, - default_base_path: Option, -) -> error::Result> -where - C: Default, - G: RuntimeGenesis, - E: ChainSpecExtension, -{ - let base_path = base_path(&cli, version, default_base_path); - let cfg = sc_service::Configuration::::default_with_spec_and_base_path( - spec.clone(), - Some(base_path), - ); - - Ok(cfg) -} - -/// Internal trait used to cast to a dynamic type that implements Read and Seek. -trait ReadPlusSeek: Read + Seek {} - -impl ReadPlusSeek for T {} - fn parse_address( address: &str, port: Option, @@ -1196,7 +707,8 @@ fn parse_address( Ok(address) } -fn init_logger(pattern: &str) { +/// Initialize the logger +pub fn init_logger(pattern: &str) { use ansi_term::Colour; let mut builder = env_logger::Builder::new(); @@ -1268,118 +780,6 @@ fn kill_color(s: &str) -> String { #[cfg(test)] mod tests { use super::*; - use sc_network::config::identity::ed25519; - - #[test] - fn tests_node_name_good() { - assert!(is_node_name_valid("short name").is_ok()); - } - - #[test] - fn tests_node_name_bad() { - assert!(is_node_name_valid("long names are not very cool for the ui").is_err()); - assert!(is_node_name_valid("Dots.not.Ok").is_err()); - assert!(is_node_name_valid("http://visit.me").is_err()); - assert!(is_node_name_valid("https://visit.me").is_err()); - assert!(is_node_name_valid("www.visit.me").is_err()); - assert!(is_node_name_valid("email@domain").is_err()); - } - - #[test] - fn test_node_key_config_input() { - fn secret_input(net_config_dir: Option) -> error::Result<()> { - NodeKeyType::variants().into_iter().try_for_each(|t| { - let node_key_type = NodeKeyType::from_str(t).unwrap(); - let sk = match node_key_type { - NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec() - }; - let params = NodeKeyParams { - node_key_type, - node_key: Some(format!("{:x}", H256::from_slice(sk.as_ref()))), - node_key_file: None - }; - node_key_config(params, &net_config_dir).and_then(|c| match c { - NodeKeyConfig::Ed25519(sc_network::config::Secret::Input(ref ski)) - if node_key_type == NodeKeyType::Ed25519 && - &sk[..] == ski.as_ref() => Ok(()), - _ => Err(error::Error::Input("Unexpected node key config".into())) - }) - }) - } - - assert!(secret_input(None).is_ok()); - assert!(secret_input(Some("x".to_string())).is_ok()); - } - - #[test] - fn test_node_key_config_file() { - fn secret_file(net_config_dir: Option) -> error::Result<()> { - NodeKeyType::variants().into_iter().try_for_each(|t| { - let node_key_type = NodeKeyType::from_str(t).unwrap(); - let tmp = tempfile::Builder::new().prefix("alice").tempdir()?; - let file = tmp.path().join(format!("{}_mysecret", t)).to_path_buf(); - let params = NodeKeyParams { - node_key_type, - node_key: None, - node_key_file: Some(file.clone()) - }; - node_key_config(params, &net_config_dir).and_then(|c| match c { - NodeKeyConfig::Ed25519(sc_network::config::Secret::File(ref f)) - if node_key_type == NodeKeyType::Ed25519 && f == &file => Ok(()), - _ => Err(error::Error::Input("Unexpected node key config".into())) - }) - }) - } - - assert!(secret_file(None).is_ok()); - assert!(secret_file(Some("x".to_string())).is_ok()); - } - - #[test] - fn test_node_key_config_default() { - fn with_def_params(f: F) -> error::Result<()> - where - F: Fn(NodeKeyParams) -> error::Result<()> - { - NodeKeyType::variants().into_iter().try_for_each(|t| { - let node_key_type = NodeKeyType::from_str(t).unwrap(); - f(NodeKeyParams { - node_key_type, - node_key: None, - node_key_file: None - }) - }) - } - - fn no_config_dir() -> error::Result<()> { - with_def_params(|params| { - let typ = params.node_key_type; - node_key_config::(params, &None) - .and_then(|c| match c { - NodeKeyConfig::Ed25519(sc_network::config::Secret::New) - if typ == NodeKeyType::Ed25519 => Ok(()), - _ => Err(error::Error::Input("Unexpected node key config".into())) - }) - }) - } - - fn some_config_dir(net_config_dir: String) -> error::Result<()> { - with_def_params(|params| { - let dir = PathBuf::from(net_config_dir.clone()); - let typ = params.node_key_type; - node_key_config(params, &Some(net_config_dir.clone())) - .and_then(move |c| match c { - NodeKeyConfig::Ed25519(sc_network::config::Secret::File(ref f)) - if typ == NodeKeyType::Ed25519 && - f == &dir.join(NODE_KEY_ED25519_FILE) => Ok(()), - _ => Err(error::Error::Input("Unexpected node key config".into())) - }) - }) - } - - assert!(no_config_dir().is_ok()); - assert!(some_config_dir("x".to_string()).is_ok()); - } #[test] fn keystore_path_is_generated_correctly() { @@ -1391,30 +791,20 @@ mod tests { None, None, None, - None, + None::<()>, ); - let version_info = VersionInfo { - name: "test", - version: "42", - commit: "234234", - executable_name: "test", - description: "cool test", - author: "universe", - support_url: "com", - }; - for keystore_path in vec![None, Some("/keystore/path")] { - let mut run_cmds = RunCmd::from_args(); - run_cmds.shared_params.base_path = Some(PathBuf::from("/test/path")); + let args: Vec<&str> = vec![]; + let mut run_cmds = RunCmd::from_iter(args); run_cmds.keystore_path = keystore_path.clone().map(PathBuf::from); - let node_config = create_run_node_config::<(), _, _, _>( + let mut node_config = Configuration::default(); + node_config.config_dir = Some(PathBuf::from("/test/path")); + node_config.chain_spec = Some(chain_spec.clone()); + update_config_for_running_node( + &mut node_config, run_cmds.clone(), - |_| Ok(Some(chain_spec.clone())), - "test", - &version_info, - None, ).unwrap(); let expected_path = match keystore_path { @@ -1425,44 +815,4 @@ mod tests { assert_eq!(expected_path, node_config.keystore.path().unwrap().to_owned()); } } - - #[test] - fn parse_and_prepare_into_configuration() { - let chain_spec = ChainSpec::from_genesis( - "test", - "test-id", - || (), - Vec::new(), - None, - None, - None, - None, - ); - let version = VersionInfo { - name: "test", - version: "42", - commit: "234234", - executable_name: "test", - description: "cool test", - author: "universe", - support_url: "com", - }; - let spec_factory = |_: &str| Ok(Some(chain_spec.clone())); - - let args = vec!["substrate", "--dev", "--state-cache-size=42"]; - let pnp = parse_and_prepare::(&version, "test", args); - let config = pnp.into_configuration::<(), _, _, _>(spec_factory, None).unwrap().unwrap(); - assert_eq!(config.roles, sc_service::Roles::AUTHORITY); - assert_eq!(config.state_cache_size, 42); - - let args = vec!["substrate", "import-blocks", "--dev"]; - let pnp = parse_and_prepare::(&version, "test", args); - let config = pnp.into_configuration::<(), _, _, _>(spec_factory, None).unwrap().unwrap(); - assert_eq!(config.roles, sc_service::Roles::FULL); - - let args = vec!["substrate", "--base-path=/foo"]; - let pnp = parse_and_prepare::(&version, "test", args); - let config = pnp.into_configuration::<(), _, _, _>(spec_factory, Some("/bar".into())).unwrap().unwrap(); - assert_eq!(config.config_dir, Some("/foo".into())); - } } diff --git a/client/cli/src/node_key.rs b/client/cli/src/node_key.rs new file mode 100644 index 0000000000..4df3b8e9d5 --- /dev/null +++ b/client/cli/src/node_key.rs @@ -0,0 +1,208 @@ +// Copyright 2017-2020 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 sc_network::{ + self, + config::{ + NodeKeyConfig, + }, +}; +use sp_core::H256; +use regex::Regex; +use std::{path::{Path, PathBuf}, str::FromStr}; +use crate::error; +use crate::params::{NodeKeyParams, NodeKeyType}; + +/// The file name of the node's Ed25519 secret key inside the chain-specific +/// network config directory, if neither `--node-key` nor `--node-key-file` +/// is specified in combination with `--node-key-type=ed25519`. +const NODE_KEY_ED25519_FILE: &str = "secret_ed25519"; + +/// Check whether a node name is considered as valid +pub fn is_node_name_valid(_name: &str) -> Result<(), &str> { + let name = _name.to_string(); + if name.chars().count() >= crate::NODE_NAME_MAX_LENGTH { + return Err("Node name too long"); + } + + let invalid_chars = r"[\\.@]"; + let re = Regex::new(invalid_chars).unwrap(); + if re.is_match(&name) { + return Err("Node name should not contain invalid chars such as '.' and '@'"); + } + + let invalid_patterns = r"(https?:\\/+)?(www)+"; + let re = Regex::new(invalid_patterns).unwrap(); + if re.is_match(&name) { + return Err("Node name should not contain urls"); + } + + Ok(()) +} + +/// Create a `NodeKeyConfig` from the given `NodeKeyParams` in the context +/// of an optional network config storage directory. +pub fn node_key_config

(params: NodeKeyParams, net_config_dir: &Option

) + -> error::Result +where + P: AsRef +{ + match params.node_key_type { + NodeKeyType::Ed25519 => + params.node_key.as_ref().map(parse_ed25519_secret).unwrap_or_else(|| + Ok(params.node_key_file + .or_else(|| net_config_file(net_config_dir, NODE_KEY_ED25519_FILE)) + .map(sc_network::config::Secret::File) + .unwrap_or(sc_network::config::Secret::New))) + .map(NodeKeyConfig::Ed25519) + } +} + +/// Create an error caused by an invalid node key argument. +fn invalid_node_key(e: impl std::fmt::Display) -> error::Error { + error::Error::Input(format!("Invalid node key: {}", e)) +} + +/// Parse a Ed25519 secret key from a hex string into a `sc_network::Secret`. +fn parse_ed25519_secret(hex: &String) -> error::Result { + H256::from_str(&hex).map_err(invalid_node_key).and_then(|bytes| + sc_network::config::identity::ed25519::SecretKey::from_bytes(bytes) + .map(sc_network::config::Secret::Input) + .map_err(invalid_node_key)) +} + +fn net_config_file

(net_config_dir: &Option

, name: &str) -> Option +where + P: AsRef +{ + net_config_dir.as_ref().map(|d| d.as_ref().join(name)) +} + +mod tests { + use super::*; + use sc_network::config::identity::ed25519; + + #[test] + fn tests_node_name_good() { + assert!(is_node_name_valid("short name").is_ok()); + } + + #[test] + fn tests_node_name_bad() { + assert!(is_node_name_valid("long names are not very cool for the ui").is_err()); + assert!(is_node_name_valid("Dots.not.Ok").is_err()); + assert!(is_node_name_valid("http://visit.me").is_err()); + assert!(is_node_name_valid("https://visit.me").is_err()); + assert!(is_node_name_valid("www.visit.me").is_err()); + assert!(is_node_name_valid("email@domain").is_err()); + } + + #[test] + fn test_node_key_config_input() { + fn secret_input(net_config_dir: Option) -> error::Result<()> { + NodeKeyType::variants().into_iter().try_for_each(|t| { + let node_key_type = NodeKeyType::from_str(t).unwrap(); + let sk = match node_key_type { + NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec() + }; + let params = NodeKeyParams { + node_key_type, + node_key: Some(format!("{:x}", H256::from_slice(sk.as_ref()))), + node_key_file: None + }; + node_key_config(params, &net_config_dir).and_then(|c| match c { + NodeKeyConfig::Ed25519(sc_network::config::Secret::Input(ref ski)) + if node_key_type == NodeKeyType::Ed25519 && + &sk[..] == ski.as_ref() => Ok(()), + _ => Err(error::Error::Input("Unexpected node key config".into())) + }) + }) + } + + assert!(secret_input(None).is_ok()); + assert!(secret_input(Some("x".to_string())).is_ok()); + } + + #[test] + fn test_node_key_config_file() { + fn secret_file(net_config_dir: Option) -> error::Result<()> { + NodeKeyType::variants().into_iter().try_for_each(|t| { + let node_key_type = NodeKeyType::from_str(t).unwrap(); + let tmp = tempfile::Builder::new().prefix("alice").tempdir()?; + let file = tmp.path().join(format!("{}_mysecret", t)).to_path_buf(); + let params = NodeKeyParams { + node_key_type, + node_key: None, + node_key_file: Some(file.clone()) + }; + node_key_config(params, &net_config_dir).and_then(|c| match c { + NodeKeyConfig::Ed25519(sc_network::config::Secret::File(ref f)) + if node_key_type == NodeKeyType::Ed25519 && f == &file => Ok(()), + _ => Err(error::Error::Input("Unexpected node key config".into())) + }) + }) + } + + assert!(secret_file(None).is_ok()); + assert!(secret_file(Some("x".to_string())).is_ok()); + } + + #[test] + fn test_node_key_config_default() { + fn with_def_params(f: F) -> error::Result<()> + where + F: Fn(NodeKeyParams) -> error::Result<()> + { + NodeKeyType::variants().into_iter().try_for_each(|t| { + let node_key_type = NodeKeyType::from_str(t).unwrap(); + f(NodeKeyParams { + node_key_type, + node_key: None, + node_key_file: None + }) + }) + } + + fn no_config_dir() -> error::Result<()> { + with_def_params(|params| { + let typ = params.node_key_type; + node_key_config::(params, &None) + .and_then(|c| match c { + NodeKeyConfig::Ed25519(sc_network::config::Secret::New) + if typ == NodeKeyType::Ed25519 => Ok(()), + _ => Err(error::Error::Input("Unexpected node key config".into())) + }) + }) + } + + fn some_config_dir(net_config_dir: String) -> error::Result<()> { + with_def_params(|params| { + let dir = PathBuf::from(net_config_dir.clone()); + let typ = params.node_key_type; + node_key_config(params, &Some(net_config_dir.clone())) + .and_then(move |c| match c { + NodeKeyConfig::Ed25519(sc_network::config::Secret::File(ref f)) + if typ == NodeKeyType::Ed25519 && + f == &dir.join(NODE_KEY_ED25519_FILE) => Ok(()), + _ => Err(error::Error::Input("Unexpected node key config".into())) + }) + }) + } + + assert!(no_config_dir().is_ok()); + assert!(some_config_dir("x".to_string()).is_ok()); + } +} diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index ccaf24454d..73d9fa59ba 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -14,10 +14,24 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::traits::GetSharedParams; - use std::{str::FromStr, path::PathBuf}; -use structopt::{StructOpt, StructOptInternal, clap::{arg_enum, App, AppSettings, SubCommand, Arg}}; +use structopt::{StructOpt, clap::arg_enum}; +use sc_service::{ + AbstractService, Configuration, ChainSpecExtension, RuntimeGenesis, ServiceBuilderCommand, + config::DatabaseConfig, +}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; +use crate::VersionInfo; +use crate::error; +use std::fmt::Debug; +use log::info; +use sc_network::config::build_multiaddr; +use std::io; +use std::fs; +use std::io::{Read, Write, Seek}; +use sp_runtime::generic::BlockId; +use crate::runtime::run_until_exit; +use crate::node_key::node_key_config; use crate::execution_strategy::*; pub use crate::execution_strategy::ExecutionStrategy; @@ -408,7 +422,7 @@ pub struct RunCmd { /// available to relay to private nodes. #[structopt( long = "sentry", - conflicts_with_all = &[ "validator" ] + conflicts_with_all = &[ "validator", "light" ] )] pub sentry: bool, @@ -417,10 +431,7 @@ pub struct RunCmd { pub no_grandpa: bool, /// Experimental: Run in light client mode. - #[structopt( - long = "light", - conflicts_with_all = &[ "validator" ] - )] + #[structopt(long = "light", conflicts_with = "sentry")] pub light: bool, /// Listen to all RPC interfaces. @@ -532,9 +543,37 @@ pub struct RunCmd { #[structopt(flatten)] pub pool_config: TransactionPoolParams, - #[allow(missing_docs)] - #[structopt(flatten)] - pub keyring: Keyring, + /// Shortcut for `--name Alice --validator` with session keys for `Alice` added to keystore. + #[structopt(long, conflicts_with_all = &["bob", "charlie", "dave", "eve", "ferdie", "one", "two"])] + pub alice: bool, + + /// Shortcut for `--name Bob --validator` with session keys for `Bob` added to keystore. + #[structopt(long, conflicts_with_all = &["alice", "charlie", "dave", "eve", "ferdie", "one", "two"])] + pub bob: bool, + + /// Shortcut for `--name Charlie --validator` with session keys for `Charlie` added to keystore. + #[structopt(long, conflicts_with_all = &["alice", "bob", "dave", "eve", "ferdie", "one", "two"])] + pub charlie: bool, + + /// Shortcut for `--name Dave --validator` with session keys for `Dave` added to keystore. + #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "eve", "ferdie", "one", "two"])] + pub dave: bool, + + /// Shortcut for `--name Eve --validator` with session keys for `Eve` added to keystore. + #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "ferdie", "one", "two"])] + pub eve: bool, + + /// Shortcut for `--name Ferdie --validator` with session keys for `Ferdie` added to keystore. + #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "eve", "one", "two"])] + pub ferdie: bool, + + /// Shortcut for `--name One --validator` with session keys for `One` added to keystore. + #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "eve", "ferdie", "two"])] + pub one: bool, + + /// Shortcut for `--name Two --validator` with session keys for `Two` added to keystore. + #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "eve", "ferdie", "one"])] + pub two: bool, /// Enable authoring even when offline. #[structopt(long = "force-authoring")] @@ -582,71 +621,20 @@ pub struct RunCmd { pub password_filename: Option } -/// Stores all required Cli values for a keyring test account. -struct KeyringTestAccountCliValues { - help: String, - conflicts_with: Vec, - name: String, - variant: sp_keyring::Sr25519Keyring, -} - -lazy_static::lazy_static! { - /// The Cli values for all test accounts. - static ref TEST_ACCOUNTS_CLI_VALUES: Vec = { - sp_keyring::Sr25519Keyring::iter().map(|a| { - let help = format!( - "Shortcut for `--name {} --validator` with session keys for `{}` added to keystore.", - a, - a, - ); - let conflicts_with = sp_keyring::Sr25519Keyring::iter() - .filter(|b| a != *b) - .map(|b| b.to_string().to_lowercase()) - .chain(std::iter::once("name".to_string())) - .collect::>(); - let name = a.to_string().to_lowercase(); - - KeyringTestAccountCliValues { - help, - conflicts_with, - name, - variant: a, - } - }).collect() - }; -} - -/// Wrapper for exposing the keyring test accounts into the Cli. -#[derive(Debug, Clone)] -pub struct Keyring { - pub account: Option, -} - -impl StructOpt for Keyring { - fn clap<'a, 'b>() -> App<'a, 'b> { - unimplemented!("Should not be called for `TestAccounts`.") - } - - fn from_clap(m: &structopt::clap::ArgMatches) -> Self { - Keyring { - account: TEST_ACCOUNTS_CLI_VALUES.iter().find(|a| m.is_present(&a.name)).map(|a| a.variant), - } - } -} - -impl StructOptInternal for Keyring { - fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { - TEST_ACCOUNTS_CLI_VALUES.iter().fold(app, |app, a| { - let conflicts_with_strs = a.conflicts_with.iter().map(|s| s.as_str()).collect::>(); - - app.arg( - Arg::with_name(&a.name) - .long(&a.name) - .help(&a.help) - .conflicts_with_all(&conflicts_with_strs) - .takes_value(false) - ) - }) +impl RunCmd { + /// Get the `Sr25519Keyring` matching one of the flag + pub fn get_keyring(&self) -> Option { + use sp_keyring::Sr25519Keyring::*; + + if self.alice { Some(Alice) } + else if self.bob { Some(Bob) } + else if self.charlie { Some(Charlie) } + else if self.dave { Some(Dave) } + else if self.eve { Some(Eve) } + else if self.ferdie { Some(Ferdie) } + else if self.one { Some(One) } + else if self.two { Some(Two) } + else { None } } } @@ -862,11 +850,8 @@ pub struct PurgeChainCmd { /// The core commands are split into multiple subcommands and `Run` is the default subcommand. From /// the CLI user perspective, it is not visible that `Run` is a subcommand. So, all parameters of /// `Run` are exported as main executable parameters. -#[derive(Debug, Clone)] -pub enum CoreParams { - /// Run a node. - Run(MergeParameters), - +#[derive(Debug, Clone, StructOpt)] +pub enum Subcommand { /// Build a spec.json file, outputing to stdout. BuildSpec(BuildSpecCmd), @@ -884,112 +869,323 @@ pub enum CoreParams { /// Remove the whole chain data. PurgeChain(PurgeChainCmd), +} + +impl Subcommand { + /// Get the shared parameters of a `CoreParams` command + pub fn get_shared_params(&self) -> &SharedParams { + use Subcommand::*; - /// Further custom subcommands. - Custom(CC), -} - -impl StructOpt for CoreParams where - CC: StructOpt + GetSharedParams, - RP: StructOpt + StructOptInternal, -{ - fn clap<'a, 'b>() -> App<'a, 'b> { - RP::augment_clap( - RunCmd::augment_clap( - CC::clap().unset_setting(AppSettings::SubcommandRequiredElseHelp) - ) - ).subcommand( - BuildSpecCmd::augment_clap(SubCommand::with_name("build-spec")) - .about("Build a spec.json file, outputting to stdout.") - ) - .subcommand( - ExportBlocksCmd::augment_clap(SubCommand::with_name("export-blocks")) - .about("Export blocks to a file. This file can only be re-imported \ - if it is in binary format (not JSON!)." - ) - ) - .subcommand( - ImportBlocksCmd::augment_clap(SubCommand::with_name("import-blocks")) - .about("Import blocks from file.") - ) - .subcommand( - CheckBlockCmd::augment_clap(SubCommand::with_name("check-block")) - .about("Re-validate a known block.") - ) - .subcommand( - RevertCmd::augment_clap(SubCommand::with_name("revert")) - .about("Revert chain to the previous state.") - ) - .subcommand( - PurgeChainCmd::augment_clap(SubCommand::with_name("purge-chain")) - .about("Remove the whole chain data.") - ) + match self { + BuildSpec(params) => ¶ms.shared_params, + ExportBlocks(params) => ¶ms.shared_params, + ImportBlocks(params) => ¶ms.shared_params, + CheckBlock(params) => ¶ms.shared_params, + Revert(params) => ¶ms.shared_params, + PurgeChain(params) => ¶ms.shared_params, + } } - fn from_clap(matches: &::structopt::clap::ArgMatches) -> Self { - match matches.subcommand() { - ("build-spec", Some(matches)) => - CoreParams::BuildSpec(BuildSpecCmd::from_clap(matches)), - ("export-blocks", Some(matches)) => - CoreParams::ExportBlocks(ExportBlocksCmd::from_clap(matches)), - ("import-blocks", Some(matches)) => - CoreParams::ImportBlocks(ImportBlocksCmd::from_clap(matches)), - ("check-block", Some(matches)) => - CoreParams::CheckBlock(CheckBlockCmd::from_clap(matches)), - ("revert", Some(matches)) => CoreParams::Revert(RevertCmd::from_clap(matches)), - ("purge-chain", Some(matches)) => - CoreParams::PurgeChain(PurgeChainCmd::from_clap(matches)), - (_, None) => CoreParams::Run(MergeParameters::from_clap(matches)), - _ => CoreParams::Custom(CC::from_clap(matches)), + /// Run any `CoreParams` command + pub fn run( + self, + config: Configuration, + builder: B, + ) -> error::Result<()> + where + B: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + BC: ServiceBuilderCommand + Unpin, + BB: sp_runtime::traits::Block + Debug, + <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, + ::Hash: std::str::FromStr, + { + assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); + + match self { + Subcommand::BuildSpec(cmd) => cmd.run(config), + Subcommand::ExportBlocks(cmd) => cmd.run(config, builder), + Subcommand::ImportBlocks(cmd) => cmd.run(config, builder), + Subcommand::CheckBlock(cmd) => cmd.run(config, builder), + Subcommand::PurgeChain(cmd) => cmd.run(config), + Subcommand::Revert(cmd) => cmd.run(config, builder), } } } -/// A special commandline parameter that expands to nothing. -/// Should be used as custom subcommand/run arguments if no custom values are required. -#[derive(Clone, Debug, Default)] -pub struct NoCustom {} +impl RunCmd { + /// Run the command that runs the node + pub fn run( + self, + mut config: Configuration, + new_light: FNL, + new_full: FNF, + version: &VersionInfo, + ) -> error::Result<()> + where + G: RuntimeGenesis, + E: ChainSpecExtension, + FNL: FnOnce(Configuration) -> Result, + FNF: FnOnce(Configuration) -> Result, + SL: AbstractService + Unpin, + SF: AbstractService + Unpin, + { + assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); -impl StructOpt for NoCustom { - fn clap<'a, 'b>() -> App<'a, 'b> { - App::new("NoCustom") - } + crate::update_config_for_running_node( + &mut config, + self, + )?; - fn from_clap(_: &::structopt::clap::ArgMatches) -> Self { - NoCustom {} + crate::run_node(config, new_light, new_full, &version) } } -impl StructOptInternal for NoCustom { - fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { - app +impl BuildSpecCmd { + /// Run the build-spec command + pub fn run( + self, + config: Configuration, + ) -> error::Result<()> + where + G: RuntimeGenesis, + E: ChainSpecExtension, + { + assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); + + info!("Building chain spec"); + let mut spec = config.expect_chain_spec().clone(); + let raw_output = self.raw; + + if spec.boot_nodes().is_empty() && !self.disable_default_bootnode { + let node_key = node_key_config( + self.node_key_params.clone(), + &Some(config + .in_chain_config_dir(crate::DEFAULT_NETWORK_CONFIG_PATH) + .expect("We provided a base_path")), + )?; + let keys = node_key.into_keypair()?; + let peer_id = keys.public().into_peer_id(); + let addr = build_multiaddr![ + Ip4([127, 0, 0, 1]), + Tcp(30333u16), + P2p(peer_id) + ]; + spec.add_boot_node(addr) + } + + let json = sc_service::chain_ops::build_spec(spec, raw_output)?; + + print!("{}", json); + + Ok(()) } } -impl GetSharedParams for NoCustom { - fn shared_params(&self) -> Option<&SharedParams> { - None +impl ExportBlocksCmd { + /// Run the export-blocks command + pub fn run( + self, + mut config: Configuration, + builder: B, + ) -> error::Result<()> + where + B: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + BC: ServiceBuilderCommand + Unpin, + BB: sp_runtime::traits::Block + Debug, + <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, + ::Hash: std::str::FromStr, + { + assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); + + crate::fill_config_keystore_in_memory(&mut config)?; + + if let DatabaseConfig::Path { ref path, .. } = &config.database { + info!("DB path: {}", path.display()); + } + let from = self.from.as_ref().and_then(|f| f.parse().ok()).unwrap_or(1); + let to = self.to.as_ref().and_then(|t| t.parse().ok()); + + let json = self.json; + + let file: Box = match &self.output { + Some(filename) => Box::new(fs::File::create(filename)?), + None => Box::new(io::stdout()), + }; + + run_until_exit(config, |config| { + Ok(builder(config)?.export_blocks(file, from.into(), to, json)) + }) } } -/// Merge all CLI parameters of `L` and `R` into the same level. -#[derive(Clone, Debug)] -pub struct MergeParameters { - /// The left side parameters. - pub left: L, - /// The right side parameters. - pub right: R, +/// Internal trait used to cast to a dynamic type that implements Read and Seek. +trait ReadPlusSeek: Read + Seek {} + +impl ReadPlusSeek for T {} + +impl ImportBlocksCmd { + /// Run the import-blocks command + pub fn run( + self, + mut config: Configuration, + builder: B, + ) -> error::Result<()> + where + B: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + BC: ServiceBuilderCommand + Unpin, + BB: sp_runtime::traits::Block + Debug, + <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, + ::Hash: std::str::FromStr, + { + crate::fill_import_params( + &mut config, + &self.import_params, + sc_service::Roles::FULL, + self.shared_params.dev, + )?; + + let file: Box = match &self.input { + Some(filename) => Box::new(fs::File::open(filename)?), + None => { + let mut buffer = Vec::new(); + io::stdin().read_to_end(&mut buffer)?; + Box::new(io::Cursor::new(buffer)) + }, + }; + + run_until_exit(config, |config| { + Ok(builder(config)?.import_blocks(file, false)) + }) + } } -impl StructOpt for MergeParameters where L: StructOpt + StructOptInternal, R: StructOpt { - fn clap<'a, 'b>() -> App<'a, 'b> { - L::augment_clap(R::clap()) +impl CheckBlockCmd { + /// Run the check-block command + pub fn run( + self, + mut config: Configuration, + builder: B, + ) -> error::Result<()> + where + B: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + BC: ServiceBuilderCommand + Unpin, + BB: sp_runtime::traits::Block + Debug, + <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, + ::Hash: std::str::FromStr, + { + assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); + + crate::fill_import_params( + &mut config, + &self.import_params, + sc_service::Roles::FULL, + self.shared_params.dev, + )?; + crate::fill_config_keystore_in_memory(&mut config)?; + + let input = if self.input.starts_with("0x") { &self.input[2..] } else { &self.input[..] }; + let block_id = match FromStr::from_str(input) { + Ok(hash) => BlockId::hash(hash), + Err(_) => match self.input.parse::() { + Ok(n) => BlockId::number((n as u32).into()), + Err(_) => return Err(error::Error::Input("Invalid hash or number specified".into())), + } + }; + + let start = std::time::Instant::now(); + run_until_exit(config, |config| { + Ok(builder(config)?.check_block(block_id)) + })?; + println!("Completed in {} ms.", start.elapsed().as_millis()); + + Ok(()) } +} + +impl PurgeChainCmd { + /// Run the purge command + pub fn run( + self, + mut config: Configuration, + ) -> error::Result<()> + where + G: RuntimeGenesis, + E: ChainSpecExtension, + { + assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); - fn from_clap(matches: &::structopt::clap::ArgMatches) -> Self { - MergeParameters { - left: L::from_clap(matches), - right: R::from_clap(matches), + crate::fill_config_keystore_in_memory(&mut config)?; + + let db_path = match config.database { + DatabaseConfig::Path { path, .. } => path, + _ => { + eprintln!("Cannot purge custom database implementation"); + return Ok(()); + } + }; + + if !self.yes { + print!("Are you sure to remove {:?}? [y/N]: ", &db_path); + io::stdout().flush().expect("failed to flush stdout"); + + let mut input = String::new(); + io::stdin().read_line(&mut input)?; + let input = input.trim(); + + match input.chars().nth(0) { + Some('y') | Some('Y') => {}, + _ => { + println!("Aborted"); + return Ok(()); + }, + } } + + match fs::remove_dir_all(&db_path) { + Ok(_) => { + println!("{:?} removed.", &db_path); + Ok(()) + }, + Err(ref err) if err.kind() == io::ErrorKind::NotFound => { + eprintln!("{:?} did not exist.", &db_path); + Ok(()) + }, + Err(err) => Result::Err(err.into()) + } + } +} + +impl RevertCmd { + /// Run the revert command + pub fn run( + self, + mut config: Configuration, + builder: B, + ) -> error::Result<()> + where + B: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + BC: ServiceBuilderCommand + Unpin, + BB: sp_runtime::traits::Block + Debug, + <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, + ::Hash: std::str::FromStr, + { + assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); + + crate::fill_config_keystore_in_memory(&mut config)?; + + let blocks = self.num.parse()?; + builder(config)?.revert_chain(blocks)?; + + Ok(()) } } diff --git a/client/cli/src/runtime.rs b/client/cli/src/runtime.rs new file mode 100644 index 0000000000..3eee94c049 --- /dev/null +++ b/client/cli/src/runtime.rs @@ -0,0 +1,138 @@ +// Copyright 2017-2020 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::{Future, future, future::FutureExt}; +use futures::select; +use futures::pin_mut; +use sc_service::{AbstractService, Configuration}; +use crate::error; +use crate::informant; + +#[cfg(target_family = "unix")] +async fn main(func: F) -> Result<(), Box> +where + F: Future> + future::FusedFuture, + E: 'static + std::error::Error, +{ + use tokio::signal::unix::{signal, SignalKind}; + + let mut stream_int = signal(SignalKind::interrupt())?; + let mut stream_term = signal(SignalKind::terminate())?; + + let t1 = stream_int.recv().fuse(); + let t2 = stream_term.recv().fuse(); + let t3 = func; + + pin_mut!(t1, t2, t3); + + select! { + _ = t1 => {}, + _ = t2 => {}, + res = t3 => res?, + } + + Ok(()) +} + +#[cfg(not(unix))] +async fn main(func: F) -> Result<(), Box> +where + F: Future> + future::FusedFuture, + E: 'static + std::error::Error, +{ + use tokio::signal::ctrl_c; + + let t1 = ctrl_c().fuse(); + let t2 = func; + + pin_mut!(t1, t2); + + select! { + _ = t1 => {}, + res = t2 => res?, + } + + Ok(()) +} + +fn build_runtime() -> Result { + tokio::runtime::Builder::new() + .thread_name("main-tokio-") + .threaded_scheduler() + .enable_all() + .build() +} + +/// A helper function that runs a future with tokio and stops if the process receives the signal +/// SIGTERM or SIGINT +pub fn run_until_exit( + mut config: Configuration, + future_builder: F, +) -> error::Result<()> +where + F: FnOnce(Configuration) -> error::Result, + FUT: Future> + future::Future, + ERR: 'static + std::error::Error, +{ + let mut runtime = build_runtime()?; + + config.task_executor = { + let runtime_handle = runtime.handle().clone(); + Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) + }; + + let f = future_builder(config)?; + let f = f.fuse(); + pin_mut!(f); + + runtime.block_on(main(f)).map_err(|e| e.to_string())?; + + Ok(()) +} + +/// A helper function that runs an `AbstractService` with tokio and stops if the process receives +/// the signal SIGTERM or SIGINT +pub fn run_service_until_exit( + mut config: Configuration, + service_builder: F, +) -> error::Result<()> +where + F: FnOnce(Configuration) -> Result, + T: AbstractService + Unpin, +{ + let mut runtime = build_runtime()?; + + config.task_executor = { + let runtime_handle = runtime.handle().clone(); + Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) + }; + + let service = service_builder(config)?; + + let informant_future = informant::build(&service); + let _informant_handle = runtime.spawn(informant_future); + + // we eagerly drop the service so that the internal exit future is fired, + // but we need to keep holding a reference to the global telemetry guard + let _telemetry = service.telemetry(); + + let f = service.fuse(); + pin_mut!(f); + + runtime.block_on(main(f)).map_err(|e| e.to_string())?; + + Ok(()) +} diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index c5df969779..7a6ca8dc79 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -72,10 +72,10 @@ use grafana_data_source::{self, record_metrics}; /// The order in which the `with_*` methods are called doesn't matter, as the correct binding of /// generics is done when you call `build`. /// -pub struct ServiceBuilder { - config: Configuration, + config: Configuration, pub (crate) client: Arc, backend: Arc, keystore: Arc>, @@ -144,8 +144,8 @@ type TFullParts = ( ); /// Creates a new full client for the given config. -pub fn new_full_client( - config: &Configuration, +pub fn new_full_client( + config: &Configuration, ) -> Result, Error> where TBl: BlockT, TExecDisp: NativeExecutionDispatch + 'static, @@ -155,8 +155,8 @@ pub fn new_full_client( new_full_parts(config).map(|parts| parts.0) } -fn new_full_parts( - config: &Configuration, +fn new_full_parts( + config: &Configuration, ) -> Result, Error> where TBl: BlockT, TExecDisp: NativeExecutionDispatch + 'static, @@ -177,13 +177,14 @@ fn new_full_parts( config.default_heap_pages, ); - let fork_blocks = config.chain_spec + let chain_spec = config.expect_chain_spec(); + let fork_blocks = chain_spec .extensions() .get::>() .cloned() .unwrap_or_default(); - let bad_blocks = config.chain_spec + let bad_blocks = chain_spec .extensions() .get::>() .cloned() @@ -214,7 +215,7 @@ fn new_full_parts( sc_client_db::new_client( db_config, executor, - &config.chain_spec, + config.expect_chain_spec(), fork_blocks, bad_blocks, extensions, @@ -224,15 +225,14 @@ fn new_full_parts( Ok((client, backend, keystore)) } -impl ServiceBuilder<(), (), TCfg, TGen, TCSExt, (), (), (), (), (), (), (), (), (), ()> +impl ServiceBuilder<(), (), TGen, TCSExt, (), (), (), (), (), (), (), (), (), ()> where TGen: RuntimeGenesis, TCSExt: Extension { /// Start the service builder with a configuration. pub fn new_full( - config: Configuration + config: Configuration ) -> Result, @@ -270,11 +270,10 @@ where TGen: RuntimeGenesis, TCSExt: Extension { /// Start the service builder with a configuration. pub fn new_light( - config: Configuration + config: Configuration ) -> Result, @@ -332,7 +331,7 @@ where TGen: RuntimeGenesis, TCSExt: Extension { let remote_blockchain = backend.remote_blockchain(); let client = Arc::new(sc_client::light::new_light( backend.clone(), - &config.chain_spec, + config.expect_chain_spec(), executor, )?); @@ -355,8 +354,8 @@ where TGen: RuntimeGenesis, TCSExt: Extension { } } -impl - ServiceBuilder + ServiceBuilder { /// Returns a reference to the client that was stored in this builder. @@ -378,9 +377,9 @@ impl( self, select_chain_builder: impl FnOnce( - &Configuration, &Arc + &Configuration, &Arc ) -> Result, Error> - ) -> Result Result, Error> { let select_chain = select_chain_builder(&self.config, &self.backend)?; @@ -405,8 +404,8 @@ impl( self, - builder: impl FnOnce(&Configuration, &Arc) -> Result - ) -> Result, &Arc) -> Result + ) -> Result, Error> { self.with_opt_select_chain(|cfg, b| builder(cfg, b).map(Option::Some)) } @@ -414,9 +413,9 @@ impl( self, - builder: impl FnOnce(&Configuration, Arc, Option, Arc) + builder: impl FnOnce(&Configuration, Arc, Option, Arc) -> Result - ) -> Result Result, Error> where TSc: Clone { let import_queue = builder( @@ -447,8 +446,8 @@ impl( self, - network_protocol_builder: impl FnOnce(&Configuration) -> Result - ) -> Result) -> Result + ) -> Result, Error> { let network_protocol = network_protocol_builder(&self.config)?; @@ -477,7 +476,6 @@ impl Result Result( self, builder: impl FnOnce( - &Configuration, + &Configuration, Arc, Arc, Option, Option, Arc, ) -> Result<(UImpQu, Option), Error> - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { let (import_queue, fprb) = builder( @@ -580,14 +577,14 @@ impl( self, builder: impl FnOnce( - &Configuration, + &Configuration, Arc, Arc, Option, Option, Arc, ) -> Result<(UImpQu, UFprb), Error> - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { self.with_import_queue_and_opt_fprb(|cfg, cl, b, f, sc, tx| @@ -604,7 +601,7 @@ impl, Option, ) -> Result - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { let transaction_pool = transaction_pool_builder( @@ -641,7 +638,7 @@ impl, Option>>, ) -> Result, - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { let rpc_extensions = rpc_ext_builder( @@ -705,11 +702,10 @@ pub trait ServiceBuilderCommand { ) -> Pin> + Send>>; } -impl +impl ServiceBuilder< TBl, TRtApi, - TCfg, TGen, TCSExt, Client, @@ -733,7 +729,6 @@ ServiceBuilder< sp_api::ApiExt, TBl: BlockT, TRtApi: 'static + Send + Sync, - TCfg: Default, TGen: RuntimeGenesis, TCSExt: Extension, TBackend: 'static + sc_client_api::backend::Backend + Send, @@ -799,6 +794,7 @@ ServiceBuilder< let import_queue = Box::new(import_queue); let chain_info = client.chain_info(); + let chain_spec = config.expect_chain_spec(); let version = config.full_version(); info!("Highest known block at #{}", chain_info.best_number); @@ -821,7 +817,7 @@ ServiceBuilder< }); let protocol_id = { - let protocol_id_full = match config.chain_spec.protocol_id() { + let protocol_id_full = match chain_spec.protocol_id() { Some(pid) => pid, None => { warn!("Using default protocol ID {:?} because none is configured in the \ @@ -1030,10 +1026,10 @@ ServiceBuilder< use sc_rpc::{chain, state, author, system, offchain}; let system_info = sc_rpc::system::SystemInfo { - chain_name: config.chain_spec.name().into(), + chain_name: chain_spec.name().into(), impl_name: config.impl_name.into(), impl_version: config.impl_version.into(), - properties: config.chain_spec.properties().clone(), + properties: chain_spec.properties().clone(), }; let subscriptions = sc_rpc::Subscriptions::new(Arc::new(SpawnTaskHandle { @@ -1119,7 +1115,7 @@ ServiceBuilder< let name = config.name.clone(); let impl_name = config.impl_name.to_owned(); let version = version.clone(); - let chain_name = config.chain_spec.name().to_owned(); + let chain_name = config.expect_chain_spec().name().to_owned(); let telemetry_connection_sinks_ = telemetry_connection_sinks.clone(); let telemetry = sc_telemetry::init_telemetry(sc_telemetry::TelemetryConfig { endpoints, @@ -1188,7 +1184,7 @@ ServiceBuilder< essential_failed_rx, to_spawn_tx, to_spawn_rx, - tasks_executor: if let Some(exec) = config.tasks_executor { + task_executor: if let Some(exec) = config.task_executor { exec } else { return Err(Error::TasksExecutorRequired); diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 0c2fe79718..cac1c14d0b 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -44,11 +44,11 @@ pub fn build_spec(spec: ChainSpec, raw: bool) -> error::Result ServiceBuilderCommand for ServiceBuilder< - TBl, TRtApi, TCfg, TGen, TCSExt, Client, + TBl, TRtApi, TGen, TCSExt, Client, TFchr, TSc, TImpQu, TFprb, TFpp, TNetP, TExPool, TRpc, Backend > where TBl: BlockT, diff --git a/client/service/src/config.rs b/client/service/src/config.rs index 8a145dec16..cb8170f7f4 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -23,13 +23,13 @@ pub use sc_executor::WasmExecutionMethod; use std::{future::Future, path::{PathBuf, Path}, pin::Pin, net::SocketAddr, sync::Arc}; pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; -use sc_chain_spec::{ChainSpec, RuntimeGenesis, Extension, NoExtension}; +use sc_chain_spec::{ChainSpec, NoExtension}; use sp_core::crypto::Protected; use target_info::Target; use sc_telemetry::TelemetryEndpoints; /// Service configuration. -pub struct Configuration { +pub struct Configuration { /// Implementation name pub impl_name: &'static str, /// Implementation version @@ -39,7 +39,7 @@ pub struct Configuration { /// Node roles. pub roles: Roles, /// How to spawn background tasks. Mandatory, otherwise creating a `Service` will error. - pub tasks_executor: Option + Send>>) + Send>>, + pub task_executor: Option + Send>>) + Send>>, /// Extrinsic pool configuration. pub transaction_pool: TransactionPoolOptions, /// Network configuration. @@ -57,9 +57,7 @@ pub struct Configuration { /// Pruning settings. pub pruning: PruningMode, /// Chain configuration. - pub chain_spec: ChainSpec, - /// Custom configuration. - pub custom: C, + pub chain_spec: Option>, /// Node name. pub name: String, /// Wasm execution method. @@ -146,22 +144,18 @@ pub enum DatabaseConfig { Custom(Arc), } -impl Configuration where - C: Default, - G: RuntimeGenesis, - E: Extension, -{ - /// Create a default config for given chain spec and path to configuration dir - pub fn default_with_spec_and_base_path(chain_spec: ChainSpec, config_dir: Option) -> Self { - let mut configuration = Configuration { +impl Default for Configuration { + /// Create a default config + fn default() -> Self { + let configuration = Configuration { impl_name: "parity-substrate", impl_version: "0.0.0", impl_commit: "", - chain_spec, - config_dir: config_dir.clone(), + chain_spec: None, + config_dir: None, name: Default::default(), roles: Roles::FULL, - tasks_executor: None, + task_executor: None, transaction_pool: Default::default(), network: Default::default(), keystore: KeystoreConfig::None, @@ -171,7 +165,6 @@ impl Configuration where }, state_cache_size: Default::default(), state_cache_child_ratio: Default::default(), - custom: Default::default(), pruning: PruningMode::default(), wasm_method: WasmExecutionMethod::Interpreted, execution_strategies: Default::default(), @@ -191,16 +184,13 @@ impl Configuration where tracing_targets: Default::default(), tracing_receiver: Default::default(), }; - configuration.network.boot_nodes = configuration.chain_spec.boot_nodes().to_vec(); - - configuration.telemetry_endpoints = configuration.chain_spec.telemetry_endpoints().clone(); configuration } } -impl Configuration { +impl Configuration { /// Returns full version string of this configuration. pub fn full_version(&self) -> String { full_version_from_strs(self.impl_version, self.impl_commit) @@ -216,11 +206,20 @@ impl Configuration { pub fn in_chain_config_dir(&self, sub: &str) -> Option { self.config_dir.clone().map(|mut path| { path.push("chains"); - path.push(self.chain_spec.id()); + path.push(self.expect_chain_spec().id()); path.push(sub); path }) } + + /// Return a reference to the `ChainSpec` of this `Configuration`. + /// + /// ### Panics + /// + /// This method panic if the `chain_spec` is `None` + pub fn expect_chain_spec(&self) -> &ChainSpec { + self.chain_spec.as_ref().expect("chain_spec must be specified") + } } /// Returns platform info diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 3bd8f6d290..5ba6474da6 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -96,7 +96,7 @@ pub struct Service { /// Receiver for futures that must be spawned as background tasks. to_spawn_rx: mpsc::UnboundedReceiver<(Pin + Send>>, Cow<'static, str>)>, /// How to spawn background tasks. - tasks_executor: Box + Send>>) + Send>, + task_executor: Box + Send>>) + Send>, rpc_handlers: sc_rpc_server::RpcHandler, _rpc: Box, _telemetry: Option, @@ -340,7 +340,7 @@ impl Future for } while let Poll::Ready(Some((task_to_spawn, name))) = Pin::new(&mut this.to_spawn_rx).poll_next(cx) { - (this.tasks_executor)(Box::pin(futures_diagnose::diagnose(name, task_to_spawn))); + (this.task_executor)(Box::pin(futures_diagnose::diagnose(name, task_to_spawn))); } // The service future never ends. @@ -523,8 +523,8 @@ impl Drop for /// Starts RPC servers that run in their own thread, and returns an opaque object that keeps them alive. #[cfg(not(target_os = "unknown"))] -fn start_rpc_servers sc_rpc_server::RpcHandler>( - config: &Configuration, +fn start_rpc_servers sc_rpc_server::RpcHandler>( + config: &Configuration, mut gen_handler: H ) -> Result, error::Error> { fn maybe_start_server(address: Option, mut start: F) -> Result, io::Error> @@ -564,8 +564,8 @@ fn start_rpc_servers sc_rpc_server::RpcHandler sc_rpc_server::RpcHandler>( - _: &Configuration, +fn start_rpc_servers sc_rpc_server::RpcHandler>( + _: &Configuration, _: H ) -> Result, error::Error> { Ok(Box::new(())) diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index 961c8d98ff..cb458d533f 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -133,11 +133,11 @@ fn node_config ( index: usize, spec: &ChainSpec, role: Roles, - tasks_executor: Box + Send>>) + Send>, + task_executor: Box + Send>>) + Send>, key_seed: Option, base_port: u16, root: &TempDir, -) -> Configuration<(), G, E> +) -> Configuration { let root = root.path().join(format!("node-{}", index)); @@ -175,7 +175,7 @@ fn node_config ( impl_version: "0.1", impl_commit: "", roles: role, - tasks_executor: Some(tasks_executor), + task_executor: Some(task_executor), transaction_pool: Default::default(), network: network_config, keystore: KeystoreConfig::Path { @@ -190,8 +190,7 @@ fn node_config ( state_cache_size: 16777216, state_cache_child_ratio: None, pruning: Default::default(), - chain_spec: (*spec).clone(), - custom: Default::default(), + chain_spec: Some((*spec).clone()), name: format!("Node {}", index), wasm_method: sc_service::config::WasmExecutionMethod::Interpreted, execution_strategies: Default::default(), @@ -221,11 +220,11 @@ impl TestNet where fn new( temp: &TempDir, spec: ChainSpec, - full: impl Iterator) -> Result<(F, U), Error>>, - light: impl Iterator) -> Result>, + full: impl Iterator) -> Result<(F, U), Error>>, + light: impl Iterator) -> Result>, authorities: impl Iterator) -> Result<(F, U), Error> + impl FnOnce(Configuration) -> Result<(F, U), Error> )>, base_port: u16 ) -> TestNet { @@ -248,14 +247,14 @@ impl TestNet where fn insert_nodes( &mut self, temp: &TempDir, - full: impl Iterator) -> Result<(F, U), Error>>, - light: impl Iterator) -> Result>, - authorities: impl Iterator) -> Result<(F, U), Error>)> + full: impl Iterator) -> Result<(F, U), Error>>, + light: impl Iterator) -> Result>, + authorities: impl Iterator) -> Result<(F, U), Error>)> ) { let executor = self.runtime.executor(); for (key, authority) in authorities { - let tasks_executor = { + let task_executor = { let executor = executor.clone(); Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) }; @@ -263,7 +262,7 @@ impl TestNet where self.nodes, &self.chain_spec, Roles::AUTHORITY, - tasks_executor, + task_executor, Some(key), self.base_port, &temp, @@ -279,11 +278,11 @@ impl TestNet where } for full in full { - let tasks_executor = { + let task_executor = { let executor = executor.clone(); Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) }; - let node_config = node_config(self.nodes, &self.chain_spec, Roles::FULL, tasks_executor, None, self.base_port, &temp); + let node_config = node_config(self.nodes, &self.chain_spec, Roles::FULL, task_executor, None, self.base_port, &temp); let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let (service, user_data) = full(node_config).expect("Error creating test node service"); let service = SyncService::from(service); @@ -295,11 +294,11 @@ impl TestNet where } for light in light { - let tasks_executor = { + let task_executor = { let executor = executor.clone(); Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) }; - let node_config = node_config(self.nodes, &self.chain_spec, Roles::LIGHT, tasks_executor, None, self.base_port, &temp); + let node_config = node_config(self.nodes, &self.chain_spec, Roles::LIGHT, task_executor, None, self.base_port, &temp); let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(light(node_config).expect("Error creating test node service")); @@ -321,9 +320,9 @@ pub fn connectivity( light_builder: Lb, ) where E: Clone, - Fb: Fn(Configuration<(), G, E>) -> Result, + Fb: Fn(Configuration) -> Result, F: AbstractService, - Lb: Fn(Configuration<(), G, E>) -> Result, + Lb: Fn(Configuration) -> Result, L: AbstractService, { const NUM_FULL_NODES: usize = 5; @@ -420,9 +419,9 @@ pub fn sync( mut make_block_and_import: B, mut extrinsic_factory: ExF ) where - Fb: Fn(Configuration<(), G, E>) -> Result<(F, U), Error>, + Fb: Fn(Configuration) -> Result<(F, U), Error>, F: AbstractService, - Lb: Fn(Configuration<(), G, E>) -> Result, + Lb: Fn(Configuration) -> Result, L: AbstractService, B: FnMut(&F, &mut U), ExF: FnMut(&F, &U) -> ::Extrinsic, @@ -489,9 +488,9 @@ pub fn consensus( light_builder: Lb, authorities: impl IntoIterator ) where - Fb: Fn(Configuration<(), G, E>) -> Result, + Fb: Fn(Configuration) -> Result, F: AbstractService, - Lb: Fn(Configuration<(), G, E>) -> Result, + Lb: Fn(Configuration) -> Result, L: AbstractService, E: Clone, { diff --git a/primitives/keyring/src/sr25519.rs b/primitives/keyring/src/sr25519.rs index 27627a0c50..d3776f4073 100644 --- a/primitives/keyring/src/sr25519.rs +++ b/primitives/keyring/src/sr25519.rs @@ -113,6 +113,33 @@ impl From for sp_runtime::MultiSigner { } } +#[derive(Debug)] +pub struct ParseKeyringError; + +impl std::fmt::Display for ParseKeyringError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "ParseKeyringError") + } +} + +impl std::str::FromStr for Keyring { + type Err = ParseKeyringError; + + fn from_str(s: &str) -> Result::Err> { + match s { + "alice" => Ok(Keyring::Alice), + "bob" => Ok(Keyring::Bob), + "charlie" => Ok(Keyring::Charlie), + "dave" => Ok(Keyring::Dave), + "eve" => Ok(Keyring::Eve), + "ferdie" => Ok(Keyring::Ferdie), + "one" => Ok(Keyring::One), + "two" => Ok(Keyring::Two), + _ => Err(ParseKeyringError) + } + } +} + lazy_static! { static ref PRIVATE_KEYS: HashMap = { Keyring::iter().map(|i| (i, i.pair())).collect() diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs index 7b7fda4583..4f985871f5 100644 --- a/utils/browser/src/lib.rs +++ b/utils/browser/src/lib.rs @@ -34,25 +34,24 @@ pub use console_log::init_with_level as init_console_log; /// Create a service configuration from a chain spec and the websocket transport. /// /// This configuration contains good defaults for a browser light client. -pub async fn browser_configuration( +pub async fn browser_configuration( transport: Transport, chain_spec: ChainSpec, -) -> Result, Box> +) -> Result, Box> where - C: Default, G: RuntimeGenesis, E: Extension, { let name = chain_spec.name().to_string(); let transport = ExtTransport::new(transport); - let mut config = Configuration::default_with_spec_and_base_path(chain_spec, None); + let mut config = Configuration::default(); config.network.transport = network::config::TransportConfig::Normal { wasm_external_transport: Some(transport.clone()), allow_private_ipv4: true, enable_mdns: false, }; - config.tasks_executor = Some(Box::new(move |fut| { + config.task_executor = Some(Box::new(move |fut| { wasm_bindgen_futures::spawn_local(fut) })); config.telemetry_external_transport = Some(transport); -- GitLab From e931f9e5c2ae165658587f04d075c59a338061fb Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Thu, 30 Jan 2020 15:26:05 +0100 Subject: [PATCH 218/296] Remove notices regarding wasm file in check_runtime.sh (#4779) To my knowledge, we don't keep wasm blobs checked in anymore. --- .maintain/gitlab/check_runtime.sh | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.maintain/gitlab/check_runtime.sh b/.maintain/gitlab/check_runtime.sh index 102c634dd9..8c07208438 100755 --- a/.maintain/gitlab/check_runtime.sh +++ b/.maintain/gitlab/check_runtime.sh @@ -3,7 +3,7 @@ # # check for any changes in the node/src/runtime, frame/ and primitives/sr_* trees. if # there are any changes found, it should mark the PR breaksconsensus and -# "auto-fail" the PR if there isn't a change in the runtime/src/lib.rs file +# "auto-fail" the PR if there isn't a change in the runtime/src/lib.rs file # that alters the version. set -e # fail on any error @@ -40,7 +40,7 @@ if ! git diff --name-only origin/master...${CI_COMMIT_SHA} \ | grep -q -e '^bin/node/src/runtime' -e '^frame/' -e '^primitives/sr-' then boldcat <<-EOT - + no changes to the runtime source code detected EOT @@ -67,9 +67,9 @@ then github_label "B2-breaksapi" boldcat <<-EOT - + changes to the runtime sources and changes in the spec version. - + spec_version: ${sub_spec_version} -> ${add_spec_version} EOT @@ -89,7 +89,7 @@ else if [ "${add_impl_version}" != "${sub_impl_version}" ] then boldcat <<-EOT - + changes to the runtime sources and changes in the impl version. impl_version: ${sub_impl_version} -> ${add_impl_version} @@ -101,9 +101,8 @@ else boldcat <<-EOT - wasm source files changed but not the spec/impl version and the runtime - binary blob. If changes made do not alter logic, just bump 'impl_version'. - If they do change logic, bump 'spec_version' and rebuild wasm. + wasm source files changed but not the spec/impl version. If changes made do not alter logic, + just bump 'impl_version'. If they do change logic, bump 'spec_version'. source file directories: - bin/node/src/runtime -- GitLab From 8d11d1d2a1b6efe3f672e4b452c6f0370830b95b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 30 Jan 2020 16:41:03 +0100 Subject: [PATCH 219/296] Expose information about the extrinsic in the metadata (#4774) * Expose information about the extrinsic in the metadata This pr exposes some information about the extrinsic used in the runtime via metadata. The following information are exposed: - Version of the extrinsic - List of all signed extensions used by the extrinsic. * Increment `spec_version` --- Cargo.lock | 4 +- bin/node/runtime/src/lib.rs | 2 +- frame/contracts/src/lib.rs | 1 + frame/example/src/lib.rs | 1 + frame/metadata/Cargo.toml | 2 +- frame/metadata/src/lib.rs | 27 +- frame/support/Cargo.toml | 2 +- .../procedural/src/construct_runtime/mod.rs | 7 +- frame/support/src/metadata.rs | 305 +++++++++++------- frame/system/src/lib.rs | 5 + frame/transaction-payment/src/lib.rs | 1 + .../src/generic/unchecked_extrinsic.rs | 15 +- primitives/runtime/src/traits.rs | 34 ++ 13 files changed, 267 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f28d341847..7371d9ebfd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1311,7 +1311,7 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "10.0.0" +version = "11.0.0" dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1324,7 +1324,7 @@ name = "frame-support" version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-metadata 10.0.0", + "frame-metadata 11.0.0", "frame-support-procedural 2.0.0", "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 3f12957a05..aa550893f9 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 209, + spec_version: 210, impl_version: 0, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index 6324b3fabc..9ac43cbb50 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -1103,6 +1103,7 @@ impl sp_std::fmt::Debug for CheckBlockGasLimit { } impl SignedExtension for CheckBlockGasLimit { + const IDENTIFIER: &'static str = "CheckBlockGasLimit"; type AccountId = T::AccountId; type Call = ::Call; type AdditionalSigned = (); diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index ab85de8ea9..56d3de14dc 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -603,6 +603,7 @@ impl sp_std::fmt::Debug for WatchDummy { } impl SignedExtension for WatchDummy { + const IDENTIFIER: &'static str = "WatchDummy"; type AccountId = T::AccountId; // Note that this could also be assigned to the top-level call enum. It is passed into the // balances module directly and since `Trait: pallet_balances::Trait`, you could also use `T::Call`. diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index 9cb6752926..e245f04849 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-metadata" -version = "10.0.0" +version = "11.0.0" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0" diff --git a/frame/metadata/src/lib.rs b/frame/metadata/src/lib.rs index f6e280bed1..a7410bbfbc 100644 --- a/frame/metadata/src/lib.rs +++ b/frame/metadata/src/lib.rs @@ -316,11 +316,21 @@ pub struct StorageMetadata { pub entries: DecodeDifferent<&'static [StorageEntryMetadata], Vec>, } +/// Metadata prefixed by a u32 for reserved usage #[derive(Eq, Encode, PartialEq, RuntimeDebug)] #[cfg_attr(feature = "std", derive(Decode, Serialize))] -/// Metadata prefixed by a u32 for reserved usage pub struct RuntimeMetadataPrefixed(pub u32, pub RuntimeMetadata); +/// Metadata of the extrinsic used by the runtime. +#[derive(Eq, Encode, PartialEq, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(Decode, Serialize))] +pub struct ExtrinsicMetadata { + /// Extrinsic version. + pub version: u8, + /// The signed extensions in the order they appear in the extrinsic. + pub signed_extensions: Vec, +} + /// The metadata of a runtime. /// The version ID encoded/decoded through /// the enum nature of `RuntimeMetadata`. @@ -347,8 +357,10 @@ pub enum RuntimeMetadata { V8(RuntimeMetadataDeprecated), /// Version 9 for runtime metadata. No longer used. V9(RuntimeMetadataDeprecated), - /// Version 10 for runtime metadata. - V10(RuntimeMetadataV10), + /// Version 10 for runtime metadata. No longer used. + V10(RuntimeMetadataDeprecated), + /// Version 11 for runtime metadata. + V11(RuntimeMetadataV11), } /// Enum that should fail. @@ -372,12 +384,15 @@ impl Decode for RuntimeMetadataDeprecated { /// The metadata of a runtime. #[derive(Eq, Encode, PartialEq, RuntimeDebug)] #[cfg_attr(feature = "std", derive(Decode, Serialize))] -pub struct RuntimeMetadataV10 { +pub struct RuntimeMetadataV11 { + /// Metadata of all the modules. pub modules: DecodeDifferentArray, + /// Metadata of the extrinsic. + pub extrinsic: ExtrinsicMetadata, } /// The latest version of the metadata. -pub type RuntimeMetadataLastVersion = RuntimeMetadataV10; +pub type RuntimeMetadataLastVersion = RuntimeMetadataV11; /// All metadata about an runtime module. #[derive(Clone, PartialEq, Eq, Encode, RuntimeDebug)] @@ -402,6 +417,6 @@ impl Into for RuntimeMetadataPrefixed { impl Into for RuntimeMetadataLastVersion { fn into(self) -> RuntimeMetadataPrefixed { - RuntimeMetadataPrefixed(META_RESERVED, RuntimeMetadata::V10(self)) + RuntimeMetadataPrefixed(META_RESERVED, RuntimeMetadata::V11(self)) } } diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 77aa3aa168..f0e9b53bf2 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0" log = "0.4" serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false, features = ["derive"] } -frame-metadata = { version = "10.0.0", default-features = false, path = "../metadata" } +frame-metadata = { version = "11.0.0", default-features = false, path = "../metadata" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-io ={ path = "../../primitives/io", default-features = false } sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } diff --git a/frame/support/procedural/src/construct_runtime/mod.rs b/frame/support/procedural/src/construct_runtime/mod.rs index 7e66610641..b4eaf09f6a 100644 --- a/frame/support/procedural/src/construct_runtime/mod.rs +++ b/frame/support/procedural/src/construct_runtime/mod.rs @@ -22,7 +22,7 @@ use parse::{ModuleDeclaration, RuntimeDefinition, WhereSection}; use proc_macro::TokenStream; use proc_macro2::{Span, TokenStream as TokenStream2}; use quote::quote; -use syn::{Ident, Result}; +use syn::{Ident, Result, TypePath}; /// The fixed name of the system module. const SYSTEM_MODULE_NAME: &str = "System"; @@ -86,7 +86,7 @@ fn construct_runtime_parsed(definition: RuntimeDefinition) -> Result( runtime: &'a Ident, module_declarations: impl Iterator, scrate: &'a TokenStream2, + extrinsic: &TypePath, ) -> TokenStream2 { let modules_tokens = module_declarations .filter_map(|module_declaration| { @@ -236,7 +237,7 @@ fn decl_runtime_metadata<'a>( }); quote!( #scrate::impl_runtime_metadata!{ - for #runtime with modules + for #runtime with modules where Extrinsic = #extrinsic #(#modules_tokens)* } ) diff --git a/frame/support/src/metadata.rs b/frame/support/src/metadata.rs index 110df87c64..f3c9945f88 100644 --- a/frame/support/src/metadata.rs +++ b/frame/support/src/metadata.rs @@ -17,7 +17,8 @@ pub use frame_metadata::{ DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataLastVersion, DefaultByteGetter, RuntimeMetadataPrefixed, StorageEntryMetadata, StorageMetadata, - StorageEntryType, StorageEntryModifier, DefaultByte, StorageHasher, ModuleErrorMetadata + StorageEntryType, StorageEntryModifier, DefaultByte, StorageHasher, ModuleErrorMetadata, + ExtrinsicMetadata, }; /// Implements the metadata support for the given runtime and all its modules. @@ -43,10 +44,12 @@ pub use frame_metadata::{ ///# type Origin = u32; ///# type BlockNumber = u32; ///# } +///# +///# type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic<(), (), (), ()>; /// /// struct Runtime; /// frame_support::impl_runtime_metadata! { -/// for Runtime with modules +/// for Runtime with modules where Extrinsic = UncheckedExtrinsic /// module0::Module as Module0 with, /// module1::Module as Module1 with, /// module2::Module as Module2 with Storage, @@ -57,13 +60,24 @@ pub use frame_metadata::{ #[macro_export] macro_rules! impl_runtime_metadata { ( - for $runtime:ident with modules + for $runtime:ident with modules where Extrinsic = $ext:ident $( $rest:tt )* ) => { impl $runtime { pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed { $crate::metadata::RuntimeMetadataLastVersion { modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*), + extrinsic: $crate::metadata::ExtrinsicMetadata { + version: <$ext as $crate::sp_runtime::traits::ExtrinsicMetadata>::VERSION, + signed_extensions: < + < + $ext as $crate::sp_runtime::traits::ExtrinsicMetadata + >::SignedExtensions as $crate::sp_runtime::traits::SignedExtension + >::identifier() + .into_iter() + .map($crate::metadata::DecodeDifferent::Encode) + .collect(), + }, }.into() } } @@ -232,10 +246,46 @@ mod tests { use frame_metadata::{ EventMetadata, StorageEntryModifier, StorageEntryType, FunctionMetadata, StorageEntryMetadata, ModuleMetadata, RuntimeMetadataPrefixed, DefaultByte, ModuleConstantMetadata, DefaultByteGetter, - ErrorMetadata, + ErrorMetadata, ExtrinsicMetadata, }; use codec::{Encode, Decode}; use crate::traits::Get; + use sp_runtime::transaction_validity::TransactionValidityError; + + #[derive(Clone, Eq, Debug, PartialEq, Encode, Decode)] + struct TestExtension; + impl sp_runtime::traits::SignedExtension for TestExtension { + type AccountId = u32; + type Call = u32; + type AdditionalSigned = u32; + type DispatchInfo = (); + type Pre = (); + const IDENTIFIER: &'static str = "testextension"; + fn additional_signed(&self) -> Result { + Ok(1) + } + } + + #[derive(Clone, Eq, Debug, PartialEq, Encode, Decode)] + struct TestExtension2; + impl sp_runtime::traits::SignedExtension for TestExtension2 { + type AccountId = u32; + type Call = u32; + type AdditionalSigned = u32; + type DispatchInfo = (); + type Pre = (); + const IDENTIFIER: &'static str = "testextension2"; + fn additional_signed(&self) -> Result { + Ok(1) + } + } + + struct TestExtrinsic; + + impl sp_runtime::traits::ExtrinsicMetadata for TestExtrinsic { + const VERSION: u8 = 1; + type SignedExtensions = (TestExtension, TestExtension2); + } mod system { use super::*; @@ -393,7 +443,7 @@ mod tests { } impl_runtime_metadata!( - for TestRuntime with modules + for TestRuntime with modules where Extrinsic = TestExtrinsic system::Module as System with Event, event_module::Module as Module with Event Call, event_module2::Module as Module2 with Event Storage Call, @@ -420,131 +470,138 @@ mod tests { } } - const EXPECTED_METADATA: RuntimeMetadataLastVersion = RuntimeMetadataLastVersion { - modules: DecodeDifferent::Encode(&[ - ModuleMetadata { - name: DecodeDifferent::Encode("System"), - storage: None, - calls: None, - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("SystemEvent"), - arguments: DecodeDifferent::Encode(&[]), - documentation: DecodeDifferent::Encode(&[]) - } - ]) - )), - constants: DecodeDifferent::Encode( - FnEncode(|| &[ - ModuleConstantMetadata { - name: DecodeDifferent::Encode("BlockNumber"), - ty: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantBlockNumberByteGetter) - ), - documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]), + #[test] + fn runtime_metadata() { + let expected_metadata: RuntimeMetadataLastVersion = RuntimeMetadataLastVersion { + modules: DecodeDifferent::Encode(&[ + ModuleMetadata { + name: DecodeDifferent::Encode("System"), + storage: None, + calls: None, + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("SystemEvent"), + arguments: DecodeDifferent::Encode(&[]), + documentation: DecodeDifferent::Encode(&[]) + } + ]) + )), + constants: DecodeDifferent::Encode( + FnEncode(|| &[ + ModuleConstantMetadata { + name: DecodeDifferent::Encode("BlockNumber"), + ty: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantBlockNumberByteGetter) + ), + documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]), + }, + ModuleConstantMetadata { + name: DecodeDifferent::Encode("GetType"), + ty: DecodeDifferent::Encode("T::AccountId"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantGetTypeByteGetter) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + ModuleConstantMetadata { + name: DecodeDifferent::Encode("ASSOCIATED_CONST"), + ty: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantAssociatedConstByteGetter) + ), + documentation: DecodeDifferent::Encode(&[]), + } + ]) + ), + errors: DecodeDifferent::Encode(FnEncode(|| &[])), + }, + ModuleMetadata { + name: DecodeDifferent::Encode("Module"), + storage: None, + calls: Some( + DecodeDifferent::Encode(FnEncode(|| &[ + FunctionMetadata { + name: DecodeDifferent::Encode("aux_0"), + arguments: DecodeDifferent::Encode(&[]), + documentation: DecodeDifferent::Encode(&[]), + } + ]))), + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("TestEvent"), + arguments: DecodeDifferent::Encode(&["Balance"]), + documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]) + } + ]) + )), + constants: DecodeDifferent::Encode(FnEncode(|| &[])), + errors: DecodeDifferent::Encode(FnEncode(|| &[ + ErrorMetadata { + name: DecodeDifferent::Encode("UserInputError"), + documentation: DecodeDifferent::Encode(&[" Some user input error"]), }, - ModuleConstantMetadata { - name: DecodeDifferent::Encode("GetType"), - ty: DecodeDifferent::Encode("T::AccountId"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantGetTypeByteGetter) - ), - documentation: DecodeDifferent::Encode(&[]), + ErrorMetadata { + name: DecodeDifferent::Encode("BadThingHappened"), + documentation: DecodeDifferent::Encode(&[ + " Something bad happened", + " this could be due to many reasons", + ]), }, - ModuleConstantMetadata { - name: DecodeDifferent::Encode("ASSOCIATED_CONST"), - ty: DecodeDifferent::Encode("u64"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantAssociatedConstByteGetter) - ), - documentation: DecodeDifferent::Encode(&[]), - } - ]) - ), - errors: DecodeDifferent::Encode(FnEncode(|| &[])), - }, - ModuleMetadata { - name: DecodeDifferent::Encode("Module"), - storage: None, - calls: Some( - DecodeDifferent::Encode(FnEncode(|| &[ - FunctionMetadata { - name: DecodeDifferent::Encode("aux_0"), - arguments: DecodeDifferent::Encode(&[]), - documentation: DecodeDifferent::Encode(&[]), - } - ]))), - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("TestEvent"), - arguments: DecodeDifferent::Encode(&["Balance"]), - documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]) - } - ]) - )), - constants: DecodeDifferent::Encode(FnEncode(|| &[])), - errors: DecodeDifferent::Encode(FnEncode(|| &[ - ErrorMetadata { - name: DecodeDifferent::Encode("UserInputError"), - documentation: DecodeDifferent::Encode(&[" Some user input error"]), - }, - ErrorMetadata { - name: DecodeDifferent::Encode("BadThingHappened"), - documentation: DecodeDifferent::Encode(&[ - " Something bad happened", - " this could be due to many reasons", - ]), - }, - ])), - }, - ModuleMetadata { - name: DecodeDifferent::Encode("Module2"), - storage: Some(DecodeDifferent::Encode( - FnEncode(|| StorageMetadata { - prefix: DecodeDifferent::Encode("TestStorage"), - entries: DecodeDifferent::Encode( - &[ - StorageEntryMetadata { - name: DecodeDifferent::Encode("StorageMethod"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter( - &event_module2::__GetByteStructStorageMethod( - std::marker::PhantomData:: + ])), + }, + ModuleMetadata { + name: DecodeDifferent::Encode("Module2"), + storage: Some(DecodeDifferent::Encode( + FnEncode(|| StorageMetadata { + prefix: DecodeDifferent::Encode("TestStorage"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("StorageMethod"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter( + &event_module2::__GetByteStructStorageMethod( + std::marker::PhantomData:: + ) ) - ) - ), - documentation: DecodeDifferent::Encode(&[]), - } - ] - ) - }), - )), - calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))), - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("TestEvent"), - arguments: DecodeDifferent::Encode(&["Balance"]), - documentation: DecodeDifferent::Encode(&[]) - } - ]) - )), - constants: DecodeDifferent::Encode(FnEncode(|| &[])), - errors: DecodeDifferent::Encode(FnEncode(|| &[])), - }, - ]) - }; + ), + documentation: DecodeDifferent::Encode(&[]), + } + ] + ) + }), + )), + calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))), + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("TestEvent"), + arguments: DecodeDifferent::Encode(&["Balance"]), + documentation: DecodeDifferent::Encode(&[]) + } + ]) + )), + constants: DecodeDifferent::Encode(FnEncode(|| &[])), + errors: DecodeDifferent::Encode(FnEncode(|| &[])), + }, + ]), + extrinsic: ExtrinsicMetadata { + version: 1, + signed_extensions: vec![ + DecodeDifferent::Encode("testextension"), + DecodeDifferent::Encode("testextension2"), + ], + } + }; - #[test] - fn runtime_metadata() { let metadata_encoded = TestRuntime::metadata().encode(); let metadata_decoded = RuntimeMetadataPrefixed::decode(&mut &metadata_encoded[..]); - let expected_metadata: RuntimeMetadataPrefixed = EXPECTED_METADATA.into(); + let expected_metadata: RuntimeMetadataPrefixed = expected_metadata.into(); pretty_assertions::assert_eq!(expected_metadata, metadata_decoded.unwrap()); } diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 4e665fd385..4a06dec6ee 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -960,6 +960,7 @@ impl SignedExtension for CheckWeight { type AdditionalSigned = (); type DispatchInfo = DispatchInfo; type Pre = (); + const IDENTIFIER: &'static str = "CheckWeight"; fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { Ok(()) } @@ -1040,6 +1041,7 @@ impl SignedExtension for CheckNonce { type AdditionalSigned = (); type DispatchInfo = DispatchInfo; type Pre = (); + const IDENTIFIER: &'static str = "CheckNonce"; fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { Ok(()) } @@ -1124,6 +1126,7 @@ impl SignedExtension for CheckEra { type AdditionalSigned = T::Hash; type DispatchInfo = DispatchInfo; type Pre = (); + const IDENTIFIER: &'static str = "CheckEra"; fn validate( &self, @@ -1180,6 +1183,7 @@ impl SignedExtension for CheckGenesis { type AdditionalSigned = T::Hash; type DispatchInfo = DispatchInfo; type Pre = (); + const IDENTIFIER: &'static str = "CheckGenesis"; fn additional_signed(&self) -> Result { Ok(>::block_hash(T::BlockNumber::zero())) @@ -1215,6 +1219,7 @@ impl SignedExtension for CheckVersion { type AdditionalSigned = u32; type DispatchInfo = DispatchInfo; type Pre = (); + const IDENTIFIER: &'static str = "CheckVersion"; fn additional_signed(&self) -> Result { Ok(>::runtime_version().spec_version) diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 370bd87b4c..34768d808e 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -201,6 +201,7 @@ impl sp_std::fmt::Debug for ChargeTransactionPayment impl SignedExtension for ChargeTransactionPayment where BalanceOf: Send + Sync { + const IDENTIFIER: &'static str = "ChargeTransactionPayment"; type AccountId = T::AccountId; type Call = T::Call; type AdditionalSigned = (); diff --git a/primitives/runtime/src/generic/unchecked_extrinsic.rs b/primitives/runtime/src/generic/unchecked_extrinsic.rs index 0a43524248..96e7988103 100644 --- a/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -20,7 +20,10 @@ use sp_std::{fmt, prelude::*}; use sp_io::hashing::blake2_256; use codec::{Decode, Encode, EncodeLike, Input, Error}; use crate::{ - traits::{self, Member, MaybeDisplay, SignedExtension, Checkable, Extrinsic, IdentifyAccount}, + traits::{ + self, Member, MaybeDisplay, SignedExtension, Checkable, Extrinsic, ExtrinsicMetadata, + IdentifyAccount, + }, generic::CheckedExtrinsic, transaction_validity::{TransactionValidityError, InvalidTransaction}, }; @@ -130,6 +133,15 @@ where } } +impl ExtrinsicMetadata + for UncheckedExtrinsic + where + Extra: SignedExtension, +{ + const VERSION: u8 = TRANSACTION_VERSION; + type SignedExtensions = Extra; +} + /// A payload that has been signed for an unchecked extrinsics. /// /// Note that the payload that we sign to produce unchecked extrinsic signature @@ -316,6 +328,7 @@ mod tests { #[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, Ord, PartialOrd)] struct TestExtra; impl SignedExtension for TestExtra { + const IDENTIFIER: &'static str = "TestExtra"; type AccountId = u64; type Call = (); type AdditionalSigned = (); diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 3210b00c6b..f8c2ed11a4 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -608,6 +608,15 @@ pub trait Extrinsic: Sized { fn new(_call: Self::Call, _signed_data: Option) -> Option { None } } +/// Implementor is an [`Extrinsic`] and provides metadata about this extrinsic. +pub trait ExtrinsicMetadata { + /// The version of the `Extrinsic`. + const VERSION: u8; + + /// Signed extensions attached to this `Extrinsic`. + type SignedExtensions: SignedExtension; +} + /// Extract the hasher type for a block. pub type HasherFor = as Hash>::Hasher; /// Extract the hashing type for a block. @@ -668,6 +677,12 @@ pub trait Dispatchable { /// Means by which a transaction may be extended. This type embodies both the data and the logic /// that should be additionally associated with the transaction. It should be plain old data. pub trait SignedExtension: Codec + Debug + Sync + Send + Clone + Eq + PartialEq { + /// Unique identifier of this signed extension. + /// + /// This will be exposed in the metadata to identify the signed extension used + /// in an extrinsic. + const IDENTIFIER: &'static str; + /// The type which encodes the sender identity. type AccountId; @@ -765,6 +780,17 @@ pub trait SignedExtension: Codec + Debug + Sync + Send + Clone + Eq + PartialEq /// Do any post-flight stuff for a transaction. fn post_dispatch(_pre: Self::Pre, _info: Self::DispatchInfo, _len: usize) { } + + /// Returns the list of unique identifier for this signed extension. + /// + /// As a [`SignedExtension`] can be a tuple of [`SignedExtension`]`s we need to return a `Vec` + /// that holds all the unique identifiers. Each individual `SignedExtension` must return + /// *exactly* one identifier. + /// + /// This method provides a default implementation that returns `vec![SELF::IDENTIFIER]`. + fn identifier() -> Vec<&'static str> { + sp_std::vec![Self::IDENTIFIER] + } } #[impl_for_tuples(1, 12)] @@ -773,6 +799,7 @@ impl SignedExtension for Tuple { type AccountId = AccountId; type Call = Call; type DispatchInfo = Info; + const IDENTIFIER: &'static str = "You should call `identifier()`!"; for_tuples!( type AdditionalSigned = ( #( Tuple::AdditionalSigned ),* ); ); for_tuples!( type Pre = ( #( Tuple::Pre ),* ); ); @@ -823,6 +850,12 @@ impl SignedExtension for Tuple { ) { for_tuples!( #( Tuple::post_dispatch(pre.Tuple, info.clone(), len); )* ) } + + fn identifier() -> Vec<&'static str> { + let mut ids = Vec::new(); + for_tuples!( #( ids.extend(Tuple::identifier()); )* ); + ids + } } /// Only for bare bone testing when you don't care about signed extensions at all. @@ -833,6 +866,7 @@ impl SignedExtension for () { type Call = (); type Pre = (); type DispatchInfo = (); + const IDENTIFIER: &'static str = "UnitSignedExtension"; fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { Ok(()) } } -- GitLab From f38c233c3d4de1458247f5961348c6132b0d9980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 31 Jan 2020 11:46:05 +0100 Subject: [PATCH 220/296] Fix ui tests with rust `1.41.0` (#4787) --- .../ui/impl_incorrect_method_signature.stderr | 22 +++++++------------ ...reference_in_impl_runtime_apis_call.stderr | 22 +++++++------------ 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr b/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr index ca7e519344..4f112e91bb 100644 --- a/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr +++ b/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr @@ -5,10 +5,10 @@ error[E0053]: method `test` has an incompatible type for trait | --- type in trait ... 19 | fn test(data: String) {} - | ^^^^^^ expected u64, found struct `std::string::String` + | ^^^^^^ expected `u64`, found struct `std::string::String` | - = note: expected type `fn(u64)` - found type `fn(std::string::String)` + = note: expected fn pointer `fn(u64)` + found fn pointer `fn(std::string::String)` error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for trait --> $DIR/impl_incorrect_method_signature.rs:17:1 @@ -23,7 +23,7 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr 17 | sp_api::impl_runtime_apis! { | -^^^^^^^^^^^^^^^^^^^^^^^^^ | | - | _expected u64, found struct `std::string::String` + | _expected `u64`, found struct `std::string::String` | | 18 | | impl self::Api for Runtime { 19 | | fn test(data: String) {} @@ -33,8 +33,8 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr 33 | | } | |_- in this macro invocation | - = note: expected type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, >::Error>` - found type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, >::Error>` + = note: expected fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` + found fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` error[E0308]: mismatched types --> $DIR/impl_incorrect_method_signature.rs:17:1 @@ -48,17 +48,11 @@ error[E0308]: mismatched types 33 | | } | | ^ | | | - | |_expected u64, found struct `std::string::String` + | |_expected `u64`, found struct `std::string::String` | in this macro invocation - | - = note: expected type `u64` - found type `std::string::String` error[E0308]: mismatched types --> $DIR/impl_incorrect_method_signature.rs:19:11 | 19 | fn test(data: String) {} - | ^^^^ expected u64, found struct `std::string::String` - | - = note: expected type `u64` - found type `std::string::String` + | ^^^^ expected `u64`, found struct `std::string::String` diff --git a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr index b793d832ff..1d7d0a78a8 100644 --- a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr +++ b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr @@ -5,10 +5,10 @@ error[E0053]: method `test` has an incompatible type for trait | --- type in trait ... 19 | fn test(data: &u64) { - | ^^^^ expected u64, found &u64 + | ^^^^ expected `u64`, found `&u64` | - = note: expected type `fn(u64)` - found type `fn(&u64)` + = note: expected fn pointer `fn(u64)` + found fn pointer `fn(&u64)` error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for trait --> $DIR/type_reference_in_impl_runtime_apis_call.rs:17:1 @@ -23,7 +23,7 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr 17 | sp_api::impl_runtime_apis! { | -^^^^^^^^^^^^^^^^^^^^^^^^^ | | - | _expected u64, found &u64 + | _expected `u64`, found `&u64` | | 18 | | impl self::Api for Runtime { 19 | | fn test(data: &u64) { @@ -33,8 +33,8 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr 35 | | } | |_- in this macro invocation | - = note: expected type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec) -> std::result::Result, >::Error>` - found type `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option<&u64>, std::vec::Vec) -> std::result::Result, >::Error>` + = note: expected fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` + found fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option<&u64>, std::vec::Vec<_>) -> std::result::Result<_, _>` error[E0308]: mismatched types --> $DIR/type_reference_in_impl_runtime_apis_call.rs:17:1 @@ -48,11 +48,8 @@ error[E0308]: mismatched types 35 | | } | | ^ | | | - | |_expected u64, found &u64 + | |_expected `u64`, found `&u64` | in this macro invocation - | - = note: expected type `u64` - found type `&u64` error[E0308]: mismatched types --> $DIR/type_reference_in_impl_runtime_apis_call.rs:19:11 @@ -60,8 +57,5 @@ error[E0308]: mismatched types 19 | fn test(data: &u64) { | ^^^^^^^ | | - | expected u64, found &u64 + | expected `u64`, found `&u64` | help: consider removing the borrow: `data` - | - = note: expected type `u64` - found type `&u64` -- GitLab From 0f7f267a57f0f2dbf604865eadb3ae1f0b60bb2e Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Fri, 31 Jan 2020 12:32:12 +0100 Subject: [PATCH 221/296] Removed a few warnings (#4786) --- bin/node/cli/src/cli.rs | 5 +++++ bin/node/cli/src/command.rs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 201e39eabd..dd3ee4a596 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -17,6 +17,7 @@ use sc_cli::{SharedParams, ImportParams, RunCmd}; use structopt::StructOpt; +#[allow(missing_docs)] #[derive(Clone, Debug, StructOpt)] #[structopt(settings = &[ structopt::clap::AppSettings::GlobalVersion, @@ -24,14 +25,18 @@ use structopt::StructOpt; structopt::clap::AppSettings::SubcommandsNegateReqs, ])] pub struct Cli { + #[allow(missing_docs)] #[structopt(subcommand)] pub subcommand: Option, + #[allow(missing_docs)] #[structopt(flatten)] pub run: RunCmd, } +#[allow(missing_docs)] #[derive(Clone, Debug, StructOpt)] pub enum Subcommand { + #[allow(missing_docs)] #[structopt(flatten)] Base(sc_cli::Subcommand), /// The custom factory subcommmand for manufacturing transactions. diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 65015efcb2..3395717f2f 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -20,7 +20,7 @@ use node_transaction_factory::RuntimeAdapter; use crate::{Cli, service, ChainSpec, load_spec, Subcommand, factory_impl::FactoryState}; /// Parse command line arguments into service configuration. -pub fn run(args: I, version: sc_cli::VersionInfo) -> error::Result<()> +pub fn run(args: I, version: VersionInfo) -> error::Result<()> where I: Iterator, T: Into + Clone, -- GitLab From 4fdffbbc94fa406664c57856f8a42aade337a0be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 31 Jan 2020 12:40:32 +0100 Subject: [PATCH 222/296] Cleanup transaction pool deps (#4782) * Cleanup transaction pool deps * Fix it properly * Fix doc test --- Cargo.lock | 16 ++++++++ Cargo.toml | 1 + bin/node-template/src/service.rs | 4 +- bin/node/cli/src/service.rs | 4 +- .../basic-authorship/src/basic_authorship.rs | 8 +++- client/basic-authorship/src/lib.rs | 2 +- client/consensus/manual-seal/Cargo.toml | 3 +- client/consensus/manual-seal/src/lib.rs | 13 +++--- client/offchain/src/lib.rs | 5 ++- client/rpc/src/author/tests.rs | 11 ++++- client/rpc/src/state/state_full.rs | 1 - client/service/src/lib.rs | 5 ++- client/transaction-pool/Cargo.toml | 20 +++++----- client/transaction-pool/src/lib.rs | 29 +++++--------- client/transaction-pool/src/testing/mod.rs | 6 +-- client/transaction-pool/src/testing/pool.rs | 21 ++++++++-- .../runtime/transaction-pool/Cargo.toml | 16 ++++++++ .../runtime/transaction-pool/src/lib.rs | 40 ++++++++++++++----- utils/frame/rpc/system/src/lib.rs | 4 +- 19 files changed, 140 insertions(+), 69 deletions(-) create mode 100644 test-utils/runtime/transaction-pool/Cargo.toml rename client/transaction-pool/src/testing/api.rs => test-utils/runtime/transaction-pool/src/lib.rs (84%) diff --git a/Cargo.lock b/Cargo.lock index 7371d9ebfd..7c8a4d25f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5409,6 +5409,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", "substrate-test-runtime-client 2.0.0", + "substrate-test-runtime-transaction-pool 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5985,6 +5986,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", "substrate-test-runtime-client 2.0.0", + "substrate-test-runtime-transaction-pool 2.0.0", ] [[package]] @@ -7103,6 +7105,20 @@ dependencies = [ "substrate-test-runtime 2.0.0", ] +[[package]] +name = "substrate-test-runtime-transaction-pool" +version = "2.0.0" +dependencies = [ + "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-transaction-graph 2.0.0", + "sp-runtime 2.0.0", + "sp-transaction-pool 2.0.0", + "substrate-test-runtime-client 2.0.0", +] + [[package]] name = "substrate-test-utils" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index 5dd85091cb..10465042de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -147,6 +147,7 @@ members = [ "test-utils/client", "test-utils/runtime", "test-utils/runtime/client", + "test-utils/runtime/transaction-pool", "utils/browser", "utils/build-script-utils", "utils/fork-tree", diff --git a/bin/node-template/src/service.rs b/bin/node-template/src/service.rs index b23ada78f1..d113f90866 100644 --- a/bin/node-template/src/service.rs +++ b/bin/node-template/src/service.rs @@ -41,7 +41,7 @@ macro_rules! new_full_start { })? .with_transaction_pool(|config, client, _fetcher| { let pool_api = sc_transaction_pool::FullChainApi::new(client.clone()); - let pool = sc_transaction_pool::BasicPool::new(config, pool_api); + let pool = sc_transaction_pool::BasicPool::new(config, std::sync::Arc::new(pool_api)); Ok(pool) })? .with_import_queue(|_config, client, mut select_chain, transaction_pool| { @@ -207,7 +207,7 @@ pub fn new_light(config: Configuration) let pool_api = sc_transaction_pool::LightChainApi::new(client.clone(), fetcher.clone()); let pool = sc_transaction_pool::BasicPool::with_revalidation_type( - config, pool_api, sc_transaction_pool::RevalidationType::Light, + config, Arc::new(pool_api), sc_transaction_pool::RevalidationType::Light, ); Ok(pool) })? diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index e72430e93d..c462a60836 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -63,7 +63,7 @@ macro_rules! new_full_start { })? .with_transaction_pool(|config, client, _fetcher| { let pool_api = sc_transaction_pool::FullChainApi::new(client.clone()); - let pool = sc_transaction_pool::BasicPool::new(config, pool_api); + let pool = sc_transaction_pool::BasicPool::new(config, std::sync::Arc::new(pool_api)); Ok(pool) })? .with_import_queue(|_config, client, mut select_chain, _transaction_pool| { @@ -313,7 +313,7 @@ pub fn new_light(config: NodeConfiguration) .ok_or_else(|| "Trying to start light transaction pool without active fetcher")?; let pool_api = sc_transaction_pool::LightChainApi::new(client.clone(), fetcher.clone()); let pool = sc_transaction_pool::BasicPool::with_revalidation_type( - config, pool_api, sc_transaction_pool::RevalidationType::Light, + config, Arc::new(pool_api), sc_transaction_pool::RevalidationType::Light, ); Ok(pool) })? diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index 6c5b063020..fafc63a114 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -306,7 +306,9 @@ mod tests { fn should_cease_building_block_when_deadline_is_reached() { // given let client = Arc::new(substrate_test_runtime_client::new()); - let txpool = Arc::new(BasicPool::new(Default::default(), FullChainApi::new(client.clone()))); + let txpool = Arc::new( + BasicPool::new(Default::default(), Arc::new(FullChainApi::new(client.clone()))) + ); futures::executor::block_on( txpool.submit_at(&BlockId::number(0), vec![extrinsic(0), extrinsic(1)]) @@ -346,7 +348,9 @@ mod tests { let (client, backend) = substrate_test_runtime_client::TestClientBuilder::new() .build_with_backend(); let client = Arc::new(client); - let txpool = Arc::new(BasicPool::new(Default::default(), FullChainApi::new(client.clone()))); + let txpool = Arc::new( + BasicPool::new(Default::default(), Arc::new(FullChainApi::new(client.clone()))) + ); let genesis_hash = client.info().best_hash; let block_id = BlockId::Hash(genesis_hash); diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index f62134ce42..9f2bc6a761 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -26,7 +26,7 @@ //! # use substrate_test_runtime_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; //! # use sc_transaction_pool::{BasicPool, FullChainApi}; //! # let client = Arc::new(substrate_test_runtime_client::new()); -//! # let txpool = Arc::new(BasicPool::new(Default::default(), FullChainApi::new(client.clone()))); +//! # let txpool = Arc::new(BasicPool::new(Default::default(), Arc::new(FullChainApi::new(client.clone())))); //! // The first step is to create a `ProposerFactory`. //! let mut proposer_factory = ProposerFactory { //! client: client.clone(), diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index 821b314501..de601b4ab3 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -18,7 +18,7 @@ serde = { version = "1.0", features=["derive"] } sc-client = { path = "../../../client" } sc-client-api = { path = "../../../client/api" } -sc-transaction-pool = { path = "../../transaction-pool", features = ["test-helpers"] } +sc-transaction-pool = { path = "../../transaction-pool" } sp-blockchain = { path = "../../../primitives/blockchain" } sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common" } sp-inherents = { path = "../../../primitives/inherents" } @@ -28,6 +28,7 @@ sp-transaction-pool = { path = "../../../primitives/transaction-pool" } [dev-dependencies] sc-basic-authorship = { path = "../../basic-authorship" } substrate-test-runtime-client = { path = "../../../test-utils/runtime/client" } +substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool" } tokio = { version = "0.2", features = ["rt-core", "macros"] } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs index 7262a62d12..029f746e62 100644 --- a/client/consensus/manual-seal/src/lib.rs +++ b/client/consensus/manual-seal/src/lib.rs @@ -231,8 +231,8 @@ mod tests { use sc_transaction_pool::{ BasicPool, txpool::Options, - testing::api::*, }; + use substrate_test_runtime_transaction_pool::{TestApi, uxt}; use sp_transaction_pool::TransactionPool; use sp_runtime::generic::BlockId; use sp_blockchain::HeaderBackend; @@ -241,8 +241,8 @@ mod tests { use sp_inherents::InherentDataProviders; use sc_basic_authorship::ProposerFactory; - fn api() -> TestApi { - TestApi::empty() + fn api() -> Arc { + Arc::new(TestApi::empty()) } #[tokio::test] @@ -385,7 +385,8 @@ mod tests { let client = Arc::new(builder.build()); let select_chain = LongestChain::new(backend.clone()); let inherent_data_providers = InherentDataProviders::new(); - let pool = Arc::new(BasicPool::new(Options::default(), api())); + let pool_api = api(); + let pool = Arc::new(BasicPool::new(Options::default(), pool_api.clone())); let env = ProposerFactory { transaction_pool: pool.clone(), client: client.clone(), @@ -419,7 +420,7 @@ mod tests { finalize: false, }).await.unwrap(); let created_block = rx.await.unwrap().unwrap(); - pool.api().increment_nonce(Alice.into()); + pool_api.increment_nonce(Alice.into()); // assert that the background task returns ok assert_eq!( @@ -449,7 +450,7 @@ mod tests { }).await.is_ok()); assert!(rx1.await.unwrap().is_ok()); assert!(backend.blockchain().header(BlockId::Number(1)).unwrap().is_some()); - pool.api().increment_nonce(Alice.into()); + pool_api.increment_nonce(Alice.into()); assert!(pool.submit_one(&BlockId::Number(2), uxt(Alice, 2)).await.is_ok()); let (tx2, rx2) = futures::channel::oneshot::channel(); diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index 3cd3b2cba5..f0a10a5409 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -202,7 +202,10 @@ mod tests { // given let _ = env_logger::try_init(); let client = Arc::new(substrate_test_runtime_client::new()); - let pool = Arc::new(TestPool(BasicPool::new(Default::default(), FullChainApi::new(client.clone())))); + let pool = Arc::new(TestPool(BasicPool::new( + Default::default(), + Arc::new(FullChainApi::new(client.clone())), + ))); client.execution_extensions() .register_transaction_pool(Arc::downgrade(&pool.clone()) as _); let db = sc_client_db::offchain::LocalStorage::new_test(); diff --git a/client/rpc/src/author/tests.rs b/client/rpc/src/author/tests.rs index 7de109bc5d..ba9b9d344c 100644 --- a/client/rpc/src/author/tests.rs +++ b/client/rpc/src/author/tests.rs @@ -56,8 +56,15 @@ struct TestSetup { impl Default for TestSetup { fn default() -> Self { let keystore = KeyStore::new(); - let client = Arc::new(substrate_test_runtime_client::TestClientBuilder::new().set_keystore(keystore.clone()).build()); - let pool = Arc::new(BasicPool::new(Default::default(), FullChainApi::new(client.clone()))); + let client = Arc::new( + substrate_test_runtime_client::TestClientBuilder::new() + .set_keystore(keystore.clone()) + .build() + ); + let pool = Arc::new(BasicPool::new( + Default::default(), + Arc::new(FullChainApi::new(client.clone())), + )); TestSetup { runtime: runtime::Runtime::new().expect("Failed to create runtime in test setup"), client, diff --git a/client/rpc/src/state/state_full.rs b/client/rpc/src/state/state_full.rs index cd77e8b080..3f7470ae4e 100644 --- a/client/rpc/src/state/state_full.rs +++ b/client/rpc/src/state/state_full.rs @@ -36,7 +36,6 @@ use sp_core::{ Bytes, storage::{well_known_keys, StorageKey, StorageData, StorageChangeSet, ChildInfo}, }; use sp_version::RuntimeVersion; -use sp_state_machine::ExecutionStrategy; use sp_runtime::{ generic::BlockId, traits::{Block as BlockT, NumberFor, SaturatedConversion}, }; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 5ba6474da6..dc158f1300 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -700,7 +700,10 @@ mod tests { // given let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); let client = Arc::new(client); - let pool = Arc::new(BasicPool::new(Default::default(), FullChainApi::new(client.clone()))); + let pool = Arc::new(BasicPool::new( + Default::default(), + Arc::new(FullChainApi::new(client.clone())), + )); let best = longest_chain.best_chain().unwrap(); let transaction = Transfer { amount: 5, diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 0bdf5efaa6..e151e9adbe 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -12,17 +12,15 @@ futures = { version = "0.3.1", features = ["compat"] } futures-diagnose = "1.0" log = "0.4.8" parking_lot = "0.9.0" -sp-core = { path = "../../primitives/core" } -sp-api = { path = "../../primitives/api" } -sp-runtime = { path = "../../primitives/runtime" } -sc-transaction-graph = { path = "./graph" } -sp-transaction-pool = { path = "../../primitives/transaction-pool" } -sc-client-api = { path = "../api" } -sp-blockchain = { path = "../../primitives/blockchain" } -substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } +sp-core = { version = "2.0.0", path = "../../primitives/core" } +sp-api = { version = "2.0.0", path = "../../primitives/api" } +sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } +sc-transaction-graph = { version = "2.0.0", path = "./graph" } +sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } +sc-client-api = { version = "2.0.0", path = "../api" } +sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } [dev-dependencies] sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } - -[features] -test-helpers = [] +substrate-test-runtime-transaction-pool = { version = "2.0.0", path = "../../test-utils/runtime/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 5f116dfd02..85bf2fd327 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -42,8 +42,6 @@ use sp_transaction_pool::{ MaintainedTransactionPool, PoolFuture, }; -type PoolResult = PoolFuture; - /// Basic implementation of transaction pool that can be customized by providing PoolApi. pub struct BasicPool where @@ -80,7 +78,7 @@ impl BasicPool /// Create new basic transaction pool with provided api. pub fn new( options: sc_transaction_graph::Options, - pool_api: PoolApi, + pool_api: Arc, ) -> Self { Self::with_revalidation_type(options, pool_api, RevalidationType::Full) } @@ -89,14 +87,13 @@ impl BasicPool /// revalidation type. pub fn with_revalidation_type( options: sc_transaction_graph::Options, - pool_api: PoolApi, + pool_api: Arc, revalidation_type: RevalidationType, ) -> Self { - let api = Arc::new(pool_api); - let cloned_api = api.clone(); + let cloned_api = pool_api.clone(); BasicPool { api: cloned_api, - pool: Arc::new(sc_transaction_graph::Pool::new(options, api)), + pool: Arc::new(sc_transaction_graph::Pool::new(options, pool_api)), revalidation_strategy: Arc::new(Mutex::new( match revalidation_type { RevalidationType::Light => RevalidationStrategy::Light(RevalidationStatus::NotScheduled), @@ -111,29 +108,23 @@ impl BasicPool pub fn pool(&self) -> &Arc> { &self.pool } - - /// Get reference to the inner chain api, for tests only. - #[cfg(any(feature = "test-helpers", test))] - pub fn api(&self) -> &Arc { - &self.api - } } impl TransactionPool for BasicPool where Block: BlockT, - PoolApi: 'static + sc_transaction_graph::ChainApi, + PoolApi: 'static + sc_transaction_graph::ChainApi, { type Block = PoolApi::Block; type Hash = sc_transaction_graph::ExHash; type InPoolTransaction = sc_transaction_graph::base_pool::Transaction, TransactionFor>; - type Error = error::Error; + type Error = PoolApi::Error; fn submit_at( &self, at: &BlockId, xts: Vec>, - ) -> PoolResult, Self::Error>>> { + ) -> PoolFuture, Self::Error>>, Self::Error> { let pool = self.pool.clone(); let at = *at; async move { @@ -145,7 +136,7 @@ impl TransactionPool for BasicPool &self, at: &BlockId, xt: TransactionFor, - ) -> PoolResult> { + ) -> PoolFuture, Self::Error> { let pool = self.pool.clone(); let at = *at; async move { @@ -157,7 +148,7 @@ impl TransactionPool for BasicPool &self, at: &BlockId, xt: TransactionFor, - ) -> PoolResult>> { + ) -> PoolFuture>, Self::Error> { let at = *at; let pool = self.pool.clone(); @@ -287,7 +278,7 @@ impl RevalidationStatus { impl MaintainedTransactionPool for BasicPool where Block: BlockT, - PoolApi: 'static + sc_transaction_graph::ChainApi, + PoolApi: 'static + sc_transaction_graph::ChainApi, { fn maintain(&self, id: &BlockId, retracted: &[BlockHash]) -> Pin + Send>> diff --git a/client/transaction-pool/src/testing/mod.rs b/client/transaction-pool/src/testing/mod.rs index c216a17ee6..a8f40c6b64 100644 --- a/client/transaction-pool/src/testing/mod.rs +++ b/client/transaction-pool/src/testing/mod.rs @@ -16,8 +16,4 @@ //! Tests for top-level transaction pool api -#[cfg(any(feature = "test-helpers", test))] -pub mod api; - -#[cfg(test)] -mod pool; \ No newline at end of file +mod pool; diff --git a/client/transaction-pool/src/testing/pool.rs b/client/transaction-pool/src/testing/pool.rs index 30a48fbec6..d4f3d0ccb4 100644 --- a/client/transaction-pool/src/testing/pool.rs +++ b/client/transaction-pool/src/testing/pool.rs @@ -1,6 +1,21 @@ +// Copyright 2020 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::*; -use sc_transaction_graph::{self, Pool}; +use sc_transaction_graph::Pool; use futures::executor::block_on; use sp_runtime::{ generic::BlockId, @@ -10,14 +25,14 @@ use substrate_test_runtime_client::{ runtime::{Block, Hash, Index}, AccountKeyring::*, }; -use crate::testing::api::{TestApi, uxt}; +use substrate_test_runtime_transaction_pool::{TestApi, uxt}; fn pool() -> Pool { Pool::new(Default::default(), TestApi::with_alice_nonce(209).into()) } fn maintained_pool() -> BasicPool { - BasicPool::new(Default::default(), TestApi::with_alice_nonce(209)) + BasicPool::new(Default::default(), std::sync::Arc::new(TestApi::with_alice_nonce(209))) } #[test] diff --git a/test-utils/runtime/transaction-pool/Cargo.toml b/test-utils/runtime/transaction-pool/Cargo.toml new file mode 100644 index 0000000000..c10a34f938 --- /dev/null +++ b/test-utils/runtime/transaction-pool/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "substrate-test-runtime-transaction-pool" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" +license = "GPL-3.0" + +[dependencies] +substrate-test-runtime-client = { version = "2.0.0", path = "../client" } +parking_lot = "0.9.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } +sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } +sc-transaction-graph = { version = "2.0.0", path = "../../../client/transaction-pool/graph" } +futures = { version = "0.3.1", features = ["compat"] } +derive_more = "0.99.2" diff --git a/client/transaction-pool/src/testing/api.rs b/test-utils/runtime/transaction-pool/src/lib.rs similarity index 84% rename from client/transaction-pool/src/testing/api.rs rename to test-utils/runtime/transaction-pool/src/lib.rs index c8e4b62883..58c801d8d6 100644 --- a/client/transaction-pool/src/testing/api.rs +++ b/test-utils/runtime/transaction-pool/src/lib.rs @@ -14,22 +14,41 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Test ChainApi +//! Test utils for the transaction pool together with the test runtime. +//! +//! See [`TestApi`] for more information. -use crate::*; use codec::Encode; use parking_lot::RwLock; use sp_runtime::{ generic::{self, BlockId}, traits::{BlakeTwo256, Hash as HashT}, - transaction_validity::{TransactionValidity, ValidTransaction, TransactionValidityError, InvalidTransaction}, + transaction_validity::{ + TransactionValidity, ValidTransaction, TransactionValidityError, InvalidTransaction, + }, }; -use std::collections::HashSet; +use std::collections::{HashSet, HashMap}; use substrate_test_runtime_client::{ runtime::{Index, AccountId, Block, BlockNumber, Extrinsic, Hash, Header, Transfer}, AccountKeyring::{self, *}, }; +/// Error type used by [`TestApi`]. +#[derive(Debug, derive_more::From, derive_more::Display)] +pub struct Error(sp_transaction_pool::error::Error); + +impl sp_transaction_pool::error::IntoPoolError for Error { + fn into_pool_error(self) -> Result { + Ok(self.0) + } +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + Some(&self.0) + } +} + #[derive(Default)] struct ChainState { pub block_by_number: HashMap>, @@ -47,7 +66,6 @@ pub struct TestApi { } impl TestApi { - /// Test Api with Alice nonce set initially. pub fn with_alice_nonce(nonce: u64) -> Self { let api = TestApi { @@ -128,9 +146,9 @@ impl TestApi { impl sc_transaction_graph::ChainApi for TestApi { type Block = Block; type Hash = Hash; - type Error = error::Error; - type ValidationFuture = futures::future::Ready>; - type BodyFuture = futures::future::Ready>>>; + type Error = Error; + type ValidationFuture = futures::future::Ready>; + type BodyFuture = futures::future::Ready>, Error>>; fn validate_transaction( &self, @@ -149,7 +167,7 @@ impl sc_transaction_graph::ChainApi for TestApi { if self.chain.read().invalid_hashes.contains(&self.hash_and_length(&uxt).0) { return futures::future::ready(Ok( - Err(TransactionValidityError::Invalid(InvalidTransaction::Custom(0))) + Err(TransactionValidityError::Invalid(InvalidTransaction::Custom(0)).into()) )) } @@ -169,14 +187,14 @@ impl sc_transaction_graph::ChainApi for TestApi { fn block_id_to_number( &self, at: &BlockId, - ) -> error::Result>> { + ) -> Result>, Error> { Ok(Some(number_of(at))) } fn block_id_to_hash( &self, at: &BlockId, - ) -> error::Result>> { + ) -> Result>, Error> { Ok(match at { generic::BlockId::Hash(x) => Some(x.clone()), _ => Some(Default::default()), diff --git a/utils/frame/rpc/system/src/lib.rs b/utils/frame/rpc/system/src/lib.rs index f909e66fd6..d26821caf2 100644 --- a/utils/frame/rpc/system/src/lib.rs +++ b/utils/frame/rpc/system/src/lib.rs @@ -235,7 +235,9 @@ mod tests { // given let _ = env_logger::try_init(); let client = Arc::new(substrate_test_runtime_client::new()); - let pool = Arc::new(BasicPool::new(Default::default(), FullChainApi::new(client.clone()))); + let pool = Arc::new( + BasicPool::new(Default::default(), Arc::new(FullChainApi::new(client.clone()))) + ); let new_transaction = |nonce: u64| { let t = Transfer { -- GitLab From 24a003d9f3b51f7fb457275bb6d1ce3775adc851 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 31 Jan 2020 04:26:36 -0800 Subject: [PATCH 223/296] add negative tests for signatures (#4788) --- primitives/core/src/sr25519.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/primitives/core/src/sr25519.rs b/primitives/core/src/sr25519.rs index 6e542f230f..d98aa19e1d 100644 --- a/primitives/core/src/sr25519.rs +++ b/primitives/core/src/sr25519.rs @@ -729,6 +729,26 @@ mod test { assert!(Pair::verify(&signature, &message[..], &public)); } + #[test] + fn messed_signature_should_not_work() { + let (pair, _) = Pair::generate(); + let public = pair.public(); + let message = b"Signed payload"; + let Signature(mut bytes) = pair.sign(&message[..]); + bytes[0] = bytes[2]; + let signature = Signature(bytes); + assert!(!Pair::verify(&signature, &message[..], &public)); + } + + #[test] + fn messed_message_should_not_work() { + let (pair, _) = Pair::generate(); + let public = pair.public(); + let message = b"Something important"; + let signature = pair.sign(&message[..]); + assert!(!Pair::verify(&signature, &b"Something unimportant", &public)); + } + #[test] fn seeded_pair_should_work() { let pair = Pair::from_seed(b"12345678901234567890123456789012"); -- GitLab From 95089bbb079c4533cca607464df0b5883713861c Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 1 Feb 2020 01:59:11 +1300 Subject: [PATCH 224/296] Update to the latest crate names (#4783) * Update to the latest crate names * Add to post initial rename fixes --- .maintain/rename-crates-for-2.0.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.maintain/rename-crates-for-2.0.sh b/.maintain/rename-crates-for-2.0.sh index b024cfd441..5d873d26cd 100755 --- a/.maintain/rename-crates-for-2.0.sh +++ b/.maintain/rename-crates-for-2.0.sh @@ -44,6 +44,8 @@ TO_RENAME=( "sp-sesssion sp-session" "sp-tracing-pool sp-transaction-pool" "sc-basic-authority sc-basic-authorship" + "sc-api sc-client-api" + "sc-database sc-client-db" # PRIMITIVES "substrate-application-crypto sp-application-crypto" @@ -87,7 +89,7 @@ TO_RENAME=( # # CLIENT "substrate-client sc-client" - "substrate-client-api sc-api" + "substrate-client-api sc-client-api" "substrate-authority-discovery sc-authority-discovery" "substrate-basic-authorship sc-basic-authorship" "substrate-block-builder sc-block-builder" @@ -99,7 +101,7 @@ TO_RENAME=( "substrate-consensus-pow sc-consensus-pow" "substrate-consensus-slots sc-consensus-slots" "substrate-consensus-uncles sc-consensus-uncles" - "substrate-client-db sc-database" + "substrate-client-db sc-client-db" "substrate-executor sc-executor" "substrate-runtime-test sc-runtime-test" "substrate-finality-grandpa sc-finality-grandpa" -- GitLab From 3d076d8efcfb83919d0cb8695ddce98d59facbf4 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Fri, 31 Jan 2020 15:22:25 +0100 Subject: [PATCH 225/296] pallet-contracts: Rent projection RPC (#4754) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial approach * Introduce the pallet-contracts-common crate * Add rent::compute_rent_projection * Wire everything together * Fix build error. * Rename EvictionDate → EvictionAt. * Clean. * Renaming and cleaning. * Add documentation for rent_projection RPC. * Add documentation for rent_projection runtime API. * Refactor rent_budget. Merge it with subsistence_treshold. * Bump impl_version * Constrain RPC impl with Block::Header::Number. * Rename pallet-contracts-common into -primitives * Add a comment for `compute_rent_projection` on the usage * Small tidying --- Cargo.lock | 13 ++ bin/node/rpc/src/lib.rs | 4 +- bin/node/runtime/Cargo.toml | 4 +- bin/node/runtime/src/lib.rs | 33 ++--- frame/contracts/Cargo.toml | 2 + frame/contracts/common/Cargo.toml | 19 +++ frame/contracts/common/src/lib.rs | 47 +++++++ frame/contracts/rpc/Cargo.toml | 1 + frame/contracts/rpc/runtime-api/Cargo.toml | 2 + frame/contracts/rpc/runtime-api/src/lib.rs | 30 ++-- frame/contracts/rpc/src/lib.rs | 124 +++++++++++------ frame/contracts/src/lib.rs | 21 ++- frame/contracts/src/rent.rs | 153 +++++++++++++++++---- 13 files changed, 339 insertions(+), 114 deletions(-) create mode 100644 frame/contracts/common/Cargo.toml create mode 100644 frame/contracts/common/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 7c8a4d25f4..d5f71b9b30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3196,6 +3196,7 @@ dependencies = [ "pallet-balances 2.0.0", "pallet-collective 2.0.0", "pallet-contracts 2.0.0", + "pallet-contracts-primitives 2.0.0", "pallet-contracts-rpc-runtime-api 0.8.0", "pallet-democracy 2.0.0", "pallet-elections-phragmen 2.0.0", @@ -3631,6 +3632,7 @@ dependencies = [ "frame-system 2.0.0", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", + "pallet-contracts-primitives 2.0.0", "pallet-randomness-collective-flip 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3646,6 +3648,15 @@ dependencies = [ "wasmi-validation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "pallet-contracts-primitives" +version = "2.0.0" +dependencies = [ + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-runtime 2.0.0", + "sp-std 2.0.0", +] + [[package]] name = "pallet-contracts-rpc" version = "0.8.0" @@ -3653,6 +3664,7 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "pallet-contracts-primitives 2.0.0", "pallet-contracts-rpc-runtime-api 0.8.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3668,6 +3680,7 @@ dependencies = [ name = "pallet-contracts-rpc-runtime-api" version = "0.8.0" dependencies = [ + "pallet-contracts-primitives 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-runtime 2.0.0", diff --git a/bin/node/rpc/src/lib.rs b/bin/node/rpc/src/lib.rs index a473b43a7f..4bf0338088 100644 --- a/bin/node/rpc/src/lib.rs +++ b/bin/node/rpc/src/lib.rs @@ -31,7 +31,7 @@ use std::sync::Arc; -use node_primitives::{Block, AccountId, Index, Balance}; +use node_primitives::{Block, BlockNumber, AccountId, Index, Balance}; use node_runtime::UncheckedExtrinsic; use sp_api::ProvideRuntimeApi; use sp_transaction_pool::TransactionPool; @@ -66,7 +66,7 @@ pub fn create( C: sc_client::blockchain::HeaderBackend, C: Send + Sync + 'static, C::Api: substrate_frame_rpc_system::AccountNonceApi, - C::Api: pallet_contracts_rpc::ContractsRuntimeApi, + C::Api: pallet_contracts_rpc::ContractsRuntimeApi, C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, F: sc_client::light::fetcher::Fetcher + 'static, P: TransactionPool + 'static, diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 35f01e32cb..7bc105b55e 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -42,6 +42,7 @@ pallet-babe = { version = "2.0.0", default-features = false, path = "../../../fr pallet-balances = { version = "2.0.0", default-features = false, path = "../../../frame/balances" } pallet-collective = { version = "2.0.0", default-features = false, path = "../../../frame/collective" } pallet-contracts = { version = "2.0.0", default-features = false, path = "../../../frame/contracts" } +pallet-contracts-primitives = { version = "2.0.0", default-features = false, path = "../../../frame/contracts/common/" } pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } pallet-democracy = { version = "2.0.0", default-features = false, path = "../../../frame/democracy" } pallet-elections-phragmen = { version = "2.0.0", default-features = false, path = "../../../frame/elections-phragmen" } @@ -83,8 +84,9 @@ std = [ "sp-block-builder/std", "codec/std", "pallet-collective/std", - "pallet-contracts-rpc-runtime-api/std", "pallet-contracts/std", + "pallet-contracts-primitives/std", + "pallet-contracts-rpc-runtime-api/std", "pallet-democracy/std", "pallet-elections-phragmen/std", "frame-executive/std", diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index aa550893f9..df4423f850 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 210, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, }; @@ -746,7 +746,9 @@ impl_runtime_apis! { } } - impl pallet_contracts_rpc_runtime_api::ContractsApi for Runtime { + impl pallet_contracts_rpc_runtime_api::ContractsApi + for Runtime + { fn call( origin: AccountId, dest: AccountId, @@ -754,13 +756,8 @@ impl_runtime_apis! { gas_limit: u64, input_data: Vec, ) -> ContractExecResult { - let exec_result = Contracts::bare_call( - origin, - dest.into(), - value, - gas_limit, - input_data, - ); + let exec_result = + Contracts::bare_call(origin, dest.into(), value, gas_limit, input_data); match exec_result { Ok(v) => ContractExecResult::Success { status: v.status, @@ -773,16 +770,14 @@ impl_runtime_apis! { fn get_storage( address: AccountId, key: [u8; 32], - ) -> pallet_contracts_rpc_runtime_api::GetStorageResult { - Contracts::get_storage(address, key).map_err(|rpc_err| { - use pallet_contracts::GetStorageError; - use pallet_contracts_rpc_runtime_api::{GetStorageError as RpcGetStorageError}; - /// Map the contract error into the RPC layer error. - match rpc_err { - GetStorageError::ContractDoesntExist => RpcGetStorageError::ContractDoesntExist, - GetStorageError::IsTombstone => RpcGetStorageError::IsTombstone, - } - }) + ) -> pallet_contracts_primitives::GetStorageResult { + Contracts::get_storage(address, key) + } + + fn rent_projection( + address: AccountId, + ) -> pallet_contracts_primitives::RentProjectionResult { + Contracts::rent_projection(address) } } diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index fa4c915cc8..159e9f9d0c 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -18,6 +18,7 @@ sp-std = { version = "2.0.0", default-features = false, path = "../../primitives sp-sandbox = { version = "0.8.0", default-features = false, path = "../../primitives/sandbox" } frame-support = { version = "2.0.0", default-features = false, path = "../support" } frame-system = { version = "2.0.0", default-features = false, path = "../system" } +pallet-contracts-primitives = { version = "2.0.0", default-features = false, path = "common" } [dev-dependencies] wabt = "0.9.2" @@ -42,4 +43,5 @@ std = [ "parity-wasm/std", "pwasm-utils/std", "wasmi-validation/std", + "pallet-contracts-primitives/std", ] diff --git a/frame/contracts/common/Cargo.toml b/frame/contracts/common/Cargo.toml new file mode 100644 index 0000000000..6e4ee050bd --- /dev/null +++ b/frame/contracts/common/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "pallet-contracts-primitives" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +# This crate should not rely on any of the frame primitives. +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +sp-std = { version = "2.0.0", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0", default-features = false, path = "../../../primitives/runtime" } + +[features] +default = ["std"] +std = [ + "codec/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/frame/contracts/common/src/lib.rs b/frame/contracts/common/src/lib.rs new file mode 100644 index 0000000000..e54b4c8d55 --- /dev/null +++ b/frame/contracts/common/src/lib.rs @@ -0,0 +1,47 @@ +// Copyright 2020 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 crate that hosts a common definitions that are relevent for the pallet-contracts. + +#![cfg_attr(not(feature = "std"), no_std)] + +use sp_std::prelude::*; + +/// A result type of a get storage call. +pub type GetStorageResult = Result>, ContractAccessError>; + +/// The possible errors that can happen querying the storage of a contract. +#[derive(Eq, PartialEq, codec::Encode, codec::Decode, sp_runtime::RuntimeDebug)] +pub enum ContractAccessError { + /// The given address doesn't point to a contract. + DoesntExist, + /// The specified contract is a tombstone and thus cannot have any storage. + IsTombstone, +} + +/// A result type of a `rent_projection` call. +pub type RentProjectionResult = + Result, ContractAccessError>; + +#[derive(Eq, PartialEq, codec::Encode, codec::Decode, sp_runtime::RuntimeDebug)] +pub enum RentProjection { + /// Eviction is projected to happen at the specified block number. + EvictionAt(BlockNumber), + /// No eviction is scheduled. + /// + /// E.g. because the contract accumulated enough funds to offset the rent storage costs. + NoEviction, +} diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index 7767a762f4..d59260d11f 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -16,6 +16,7 @@ sp-rpc = { version = "2.0.0", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-api = { version = "2.0.0", path = "../../../primitives/api" } +pallet-contracts-primitives = { version = "2.0.0", path = "../common" } pallet-contracts-rpc-runtime-api = { version = "0.8.0", path = "./runtime-api" } [dev-dependencies] diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index 0f228bc99d..dad9b92f6a 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -10,6 +10,7 @@ sp-api = { version = "2.0.0", default-features = false, path = "../../../../prim codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0", default-features = false, path = "../../../../primitives/std" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../../../primitives/runtime" } +pallet-contracts-primitives = { version = "2.0.0", default-features = false, path = "../../common" } [features] default = ["std"] @@ -18,4 +19,5 @@ std = [ "codec/std", "sp-std/std", "sp-runtime/std", + "pallet-contracts-primitives/std", ] diff --git a/frame/contracts/rpc/runtime-api/src/lib.rs b/frame/contracts/rpc/runtime-api/src/lib.rs index 622cac8572..fd83ba6534 100644 --- a/frame/contracts/rpc/runtime-api/src/lib.rs +++ b/frame/contracts/rpc/runtime-api/src/lib.rs @@ -22,9 +22,10 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::vec::Vec; -use codec::{Encode, Decode, Codec}; +use codec::{Codec, Decode, Encode}; +use pallet_contracts_primitives::{GetStorageResult, RentProjectionResult}; use sp_runtime::RuntimeDebug; +use sp_std::vec::Vec; /// A result of execution of a contract. #[derive(Eq, PartialEq, Encode, Decode, RuntimeDebug)] @@ -44,25 +45,12 @@ pub enum ContractExecResult { Error, } -/// A result type of the get storage call. -/// -/// See [`ContractsApi::get_storage`] for more info. -pub type GetStorageResult = Result>, GetStorageError>; - -/// The possible errors that can happen querying the storage of a contract. -#[derive(Eq, PartialEq, Encode, Decode, RuntimeDebug)] -pub enum GetStorageError { - /// The given address doesn't point on a contract. - ContractDoesntExist, - /// The specified contract is a tombstone and thus cannot have any storage. - IsTombstone, -} - sp_api::decl_runtime_apis! { /// The API to interact with contracts without using executive. - pub trait ContractsApi where + pub trait ContractsApi where AccountId: Codec, Balance: Codec, + BlockNumber: Codec, { /// Perform a call from a specified account to a given contract. /// @@ -85,5 +73,13 @@ sp_api::decl_runtime_apis! { address: AccountId, key: [u8; 32], ) -> GetStorageResult; + + /// Returns the projected time a given contract will be able to sustain paying its rent. + /// + /// The returned projection is relevent for the current block, i.e. it is as if the contract + /// was accessed at the current block. + /// + /// Returns `Err` if the contract is in a tombstone state or doesn't exist. + fn rent_projection(address: AccountId) -> RentProjectionResult; } } diff --git a/frame/contracts/rpc/src/lib.rs b/frame/contracts/rpc/src/lib.rs index 4c39bc9516..b0d6037416 100644 --- a/frame/contracts/rpc/src/lib.rs +++ b/frame/contracts/rpc/src/lib.rs @@ -18,19 +18,23 @@ use std::sync::Arc; -use sp_blockchain::HeaderBackend; use codec::Codec; use jsonrpc_core::{Error, ErrorCode, Result}; use jsonrpc_derive::rpc; -use sp_core::{H256, Bytes}; -use sp_rpc::number; +use pallet_contracts_primitives::RentProjection; use serde::{Deserialize, Serialize}; -use sp_runtime::{generic::BlockId, traits::Block as BlockT}; use sp_api::ProvideRuntimeApi; +use sp_blockchain::HeaderBackend; +use sp_core::{Bytes, H256}; +use sp_rpc::number; +use sp_runtime::{ + generic::BlockId, + traits::{Block as BlockT, Header as HeaderT}, +}; pub use self::gen_client::Client as ContractsClient; pub use pallet_contracts_rpc_runtime_api::{ - self as runtime_api, ContractExecResult, ContractsApi as ContractsRuntimeApi, GetStorageResult, + self as runtime_api, ContractExecResult, ContractsApi as ContractsRuntimeApi, }; const RUNTIME_ERROR: i64 = 1; @@ -46,13 +50,13 @@ const CONTRACT_IS_A_TOMBSTONE: i64 = 3; /// https://docs.google.com/spreadsheets/d/1h0RqncdqiWI4KgxO0z9JIpZEJESXjX_ZCK6LFX6veDo/view const GAS_PER_SECOND: u64 = 1_000_000_000; -/// A private newtype for converting `GetStorageError` into an RPC error. -struct GetStorageError(runtime_api::GetStorageError); -impl From for Error { - fn from(e: GetStorageError) -> Error { - use runtime_api::GetStorageError::*; +/// A private newtype for converting `ContractAccessError` into an RPC error. +struct ContractAccessError(pallet_contracts_primitives::ContractAccessError); +impl From for Error { + fn from(e: ContractAccessError) -> Error { + use pallet_contracts_primitives::ContractAccessError::*; match e.0 { - ContractDoesntExist => Error { + DoesntExist => Error { code: ErrorCode::ServerError(CONTRACT_DOESNT_EXIST), message: "The specified contract doesn't exist.".into(), data: None, @@ -61,7 +65,7 @@ impl From for Error { code: ErrorCode::ServerError(CONTRACT_IS_A_TOMBSTONE), message: "The contract is a tombstone and doesn't have any storage.".into(), data: None, - } + }, } } } @@ -97,19 +101,18 @@ pub enum RpcContractExecResult { impl From for RpcContractExecResult { fn from(r: ContractExecResult) -> Self { match r { - ContractExecResult::Success { status, data } => { - RpcContractExecResult::Success { status, data: data.into() } - }, - ContractExecResult::Error => { - RpcContractExecResult::Error(()) + ContractExecResult::Success { status, data } => RpcContractExecResult::Success { + status, + data: data.into(), }, + ContractExecResult::Error => RpcContractExecResult::Error(()), } } } /// Contracts RPC methods. #[rpc] -pub trait ContractsApi { +pub trait ContractsApi { /// Executes a call to a contract. /// /// This call is performed locally without submitting any transactions. Thus executing this @@ -132,6 +135,19 @@ pub trait ContractsApi { key: H256, at: Option, ) -> Result>; + + /// Returns the projected time a given contract will be able to sustain paying its rent. + /// + /// The returned projection is relevent for the given block, i.e. it is as if the contract was + /// accessed at the beginning of that block. + /// + /// Returns `None` if the contract is exempted from rent. + #[rpc(name = "contracts_rentProjection")] + fn rent_projection( + &self, + address: AccountId, + at: Option, + ) -> Result>; } /// An implementation of contract specific RPC methods. @@ -149,13 +165,22 @@ impl Contracts { } } } - -impl ContractsApi<::Hash, AccountId, Balance> - for Contracts +impl + ContractsApi< + ::Hash, + <::Header as HeaderT>::Number, + AccountId, + Balance, + > for Contracts where Block: BlockT, C: Send + Sync + 'static + ProvideRuntimeApi + HeaderBackend, - C::Api: ContractsRuntimeApi, + C::Api: ContractsRuntimeApi< + Block, + AccountId, + Balance, + <::Header as HeaderT>::Number, + >, AccountId: Codec, Balance: Codec, { @@ -188,8 +213,7 @@ where code: ErrorCode::InvalidParams, message: format!( "Requested gas limit is greater than maximum allowed: {} > {}", - gas_limit, - max_gas_limit + gas_limit, max_gas_limit ), data: None, }); @@ -197,11 +221,7 @@ where let exec_result = api .call(&at, origin, dest, value, gas_limit, input_data.to_vec()) - .map_err(|e| Error { - code: ErrorCode::ServerError(RUNTIME_ERROR), - message: "Runtime trapped while executing a contract.".into(), - data: Some(format!("{:?}", e).into()), - })?; + .map_err(|e| runtime_error_into_rpc_err(e))?; Ok(exec_result.into()) } @@ -217,19 +237,43 @@ where // If the block hash is not supplied assume the best block. self.client.info().best_hash)); - let get_storage_result = api + let result = api .get_storage(&at, address, key.into()) - .map_err(|e| - // Handle general API calling errors. - Error { - code: ErrorCode::ServerError(RUNTIME_ERROR), - message: "Runtime trapped while querying storage.".into(), - data: Some(format!("{:?}", e).into()), - })? - .map_err(GetStorageError)? + .map_err(|e| runtime_error_into_rpc_err(e))? + .map_err(ContractAccessError)? .map(Bytes); - Ok(get_storage_result) + Ok(result) + } + + fn rent_projection( + &self, + address: AccountId, + at: Option<::Hash>, + ) -> Result::Header as HeaderT>::Number>> { + let api = self.client.runtime_api(); + let at = BlockId::hash(at.unwrap_or_else(|| + // If the block hash is not supplied assume the best block. + self.client.info().best_hash)); + + let result = api + .rent_projection(&at, address) + .map_err(|e| runtime_error_into_rpc_err(e))? + .map_err(ContractAccessError)?; + + Ok(match result { + RentProjection::NoEviction => None, + RentProjection::EvictionAt(block_num) => Some(block_num), + }) + } +} + +/// Converts a runtime trap into an RPC error. +fn runtime_error_into_rpc_err(err: impl std::fmt::Debug) -> Error { + Error { + code: ErrorCode::ServerError(RUNTIME_ERROR), + message: "Runtime trapped".into(), + data: Some(format!("{:?}", err).into()), } } @@ -240,7 +284,7 @@ mod tests { #[test] fn should_serialize_deserialize_properly() { fn test(expected: &str) { - let res: RpcContractExecResult = serde_json::from_str(expected).unwrap(); + let res: RpcContractExecResult = serde_json::from_str(expected).unwrap(); let actual = serde_json::to_string(&res).unwrap(); assert_eq!(actual, expected); } diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index 9ac43cbb50..ff4a729b2c 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -128,6 +128,7 @@ use frame_support::{ use frame_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency, Get, Time, Randomness}; use frame_system::{self as system, ensure_signed, RawOrigin, ensure_root}; use sp_core::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; +use pallet_contracts_primitives::{RentProjection, ContractAccessError}; pub type CodeHash = ::Hash; pub type TrieId = Vec; @@ -680,14 +681,6 @@ decl_module! { } } -/// The possible errors that can happen querying the storage of a contract. -pub enum GetStorageError { - /// The given address doesn't point on a contract. - ContractDoesntExist, - /// The specified contract is a tombstone and thus cannot have any storage. - IsTombstone, -} - /// Public APIs provided by the contracts module. impl Module { /// Perform a call to a specified contract. @@ -710,11 +703,11 @@ impl Module { pub fn get_storage( address: T::AccountId, key: [u8; 32], - ) -> sp_std::result::Result>, GetStorageError> { + ) -> sp_std::result::Result>, ContractAccessError> { let contract_info = >::get(&address) - .ok_or(GetStorageError::ContractDoesntExist)? + .ok_or(ContractAccessError::DoesntExist)? .get_alive() - .ok_or(GetStorageError::IsTombstone)?; + .ok_or(ContractAccessError::IsTombstone)?; let maybe_value = AccountDb::::get_storage( &DirectAccountDb, @@ -724,6 +717,12 @@ impl Module { ); Ok(maybe_value) } + + pub fn rent_projection( + address: T::AccountId, + ) -> sp_std::result::Result, ContractAccessError> { + rent::compute_rent_projection::(&address) + } } impl Module { diff --git a/frame/contracts/src/rent.rs b/frame/contracts/src/rent.rs index 46f915e642..bbcc07c714 100644 --- a/frame/contracts/src/rent.rs +++ b/frame/contracts/src/rent.rs @@ -21,6 +21,7 @@ use crate::{ use frame_support::storage::child; use frame_support::traits::{Currency, ExistenceRequirement, Get, OnUnbalanced, WithdrawReason}; use frame_support::StorageMap; +use pallet_contracts_primitives::{ContractAccessError, RentProjection, RentProjectionResult}; use sp_runtime::traits::{Bounded, CheckedDiv, CheckedMul, SaturatedConversion, Saturating, Zero}; /// The amount to charge. @@ -74,9 +75,57 @@ enum Verdict { amount: Option>, }, /// Everything is OK, we just only take some charge. - Charge { - amount: OutstandingAmount, - }, + Charge { amount: OutstandingAmount }, +} + +/// Returns a fee charged per block from the contract. +/// +/// This function accounts for the storage rent deposit. I.e. if the contract possesses enough funds +/// then the fee can drop to zero. +fn compute_fee_per_block( + balance: &BalanceOf, + contract: &AliveContractInfo, +) -> BalanceOf { + let free_storage = balance + .checked_div(&T::RentDepositOffset::get()) + .unwrap_or_else(Zero::zero); + + let effective_storage_size = + >::from(contract.storage_size).saturating_sub(free_storage); + + effective_storage_size + .checked_mul(&T::RentByteFee::get()) + .unwrap_or(>::max_value()) +} + +/// Subsistence threshold is the extension of the minimum balance (aka existential deposit) by the +/// tombstone deposit, required for leaving a tombstone. +/// +/// Rent mechanism cannot make the balance lower than subsistence threshold. +fn subsistence_threshold() -> BalanceOf { + T::Currency::minimum_balance() + T::TombstoneDeposit::get() +} + +/// Returns amount of funds available to consume by rent mechanism. +/// +/// Rent mechanism cannot consume more than `rent_allowance` set by the contract and it cannot make +/// the balance lower than [`subsistence_threshold`]. +/// +/// In case the balance is below the subsistence threshold, this function returns `None`. +fn rent_budget( + balance: &BalanceOf, + contract: &AliveContractInfo, +) -> Option> { + let subsistence_threshold = subsistence_threshold::(); + if *balance < subsistence_threshold { + return None; + } + + let rent_allowed_to_charge = *balance - subsistence_threshold; + Some(>::min( + contract.rent_allowance, + rent_allowed_to_charge, + )) } /// Consider the case for rent payment of the given account and returns a `Verdict`. @@ -103,37 +152,27 @@ fn consider_case( let balance = T::Currency::free_balance(account); // An amount of funds to charge per block for storage taken up by the contract. - let fee_per_block = { - let free_storage = balance - .checked_div(&T::RentDepositOffset::get()) - .unwrap_or_else(Zero::zero); - - let effective_storage_size = - >::from(contract.storage_size).saturating_sub(free_storage); - - effective_storage_size - .checked_mul(&T::RentByteFee::get()) - .unwrap_or(>::max_value()) - }; - + let fee_per_block = compute_fee_per_block::(&balance, contract); if fee_per_block.is_zero() { // The rent deposit offset reduced the fee to 0. This means that the contract // gets the rent for free. return Verdict::Exempt; } - // The minimal amount of funds required for a contract not to be evicted. - let subsistence_threshold = T::Currency::minimum_balance() + T::TombstoneDeposit::get(); - - if balance < subsistence_threshold { - // The contract cannot afford to leave a tombstone, so remove the contract info altogether. - return Verdict::Kill; - } + let rent_budget = match rent_budget::(&balance, contract) { + Some(rent_budget) => rent_budget, + None => { + // The contract's balance is already below subsistence threshold. That indicates that + // the contract cannot afford to leave a tombstone. + // + // So cleanly wipe the contract. + return Verdict::Kill; + } + }; let dues = fee_per_block .checked_mul(&blocks_passed.saturated_into::().into()) .unwrap_or(>::max_value()); - let rent_budget = contract.rent_allowance.min(balance - subsistence_threshold); let insufficient_rent = rent_budget < dues; // If the rent payment cannot be withdrawn due to locks on the account balance, then evict the @@ -284,3 +323,69 @@ pub fn snitch_contract_should_be_evicted( _ => false, } } + +/// Returns the projected time a given contract will be able to sustain paying its rent. The +/// returned projection is relevent for the current block, i.e. it is as if the contract was +/// accessed at the beginning of the current block. Returns `None` in case if the contract was +/// evicted before or as a result of the rent collection. +/// +/// The returned value is only an estimation. It doesn't take into account any top ups, changing the +/// rent allowance, or any problems coming from withdrawing the dues. +/// +/// NOTE that this is not a side-effect free function! It will actually collect rent and then +/// compute the projection. This function is only used for implementation of an RPC method through +/// `RuntimeApi` meaning that the changes will be discarded anyway. +pub fn compute_rent_projection( + account: &T::AccountId, +) -> RentProjectionResult { + let contract_info = >::get(account); + let alive_contract_info = match contract_info { + None | Some(ContractInfo::Tombstone(_)) => return Err(ContractAccessError::IsTombstone), + Some(ContractInfo::Alive(contract)) => contract, + }; + let current_block_number = >::block_number(); + let verdict = consider_case::( + account, + current_block_number, + Zero::zero(), + &alive_contract_info, + ); + let new_contract_info = + enact_verdict(account, alive_contract_info, current_block_number, verdict); + + // Check what happened after enaction of the verdict. + let alive_contract_info = match new_contract_info { + None | Some(ContractInfo::Tombstone(_)) => return Err(ContractAccessError::IsTombstone), + Some(ContractInfo::Alive(contract)) => contract, + }; + + // Compute how much would the fee per block be with the *updated* balance. + let balance = T::Currency::free_balance(account); + let fee_per_block = compute_fee_per_block::(&balance, &alive_contract_info); + if fee_per_block.is_zero() { + return Ok(RentProjection::NoEviction); + } + + // Then compute how much the contract will sustain under these circumstances. + let rent_budget = rent_budget::(&balance, &alive_contract_info).expect( + "the contract exists and in the alive state; + the updated balance must be greater than subsistence deposit; + this function doesn't return `None`; + qed + ", + ); + let blocks_left = match rent_budget.checked_div(&fee_per_block) { + Some(blocks_left) => blocks_left, + None => { + // `fee_per_block` is not zero here, so `checked_div` can return `None` if + // there is an overflow. This cannot happen with integers though. Return + // `NoEviction` here just in case. + return Ok(RentProjection::NoEviction); + } + }; + + let blocks_left = blocks_left.saturated_into::().into(); + Ok(RentProjection::EvictionAt( + current_block_number + blocks_left, + )) +} -- GitLab From 59792959dc504cfba8dddc1158b3ee4d39e0dde1 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Fri, 31 Jan 2020 17:27:10 +0100 Subject: [PATCH 226/296] Small follow-up docs improvements in rent module (#4790) * Small follow-up docs improvements in rent module * Update frame/contracts/src/rent.rs Co-Authored-By: thiolliere * Use a shorter version of the sentence Co-authored-by: thiolliere --- frame/contracts/src/rent.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frame/contracts/src/rent.rs b/frame/contracts/src/rent.rs index bbcc07c714..49beebbf0c 100644 --- a/frame/contracts/src/rent.rs +++ b/frame/contracts/src/rent.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +//! A module responsible for computing the right amount of weight and charging it. + use crate::{ AliveContractInfo, BalanceOf, ContractInfo, ContractInfoOf, Module, RawEvent, TombstoneContractInfo, Trait, @@ -130,8 +132,8 @@ fn rent_budget( /// Consider the case for rent payment of the given account and returns a `Verdict`. /// -/// The `current_block_number` must be equal to the current block number. Use `handicap` do -/// change the reference block number. (See `snitch_contract_should_be_evicted` for more details). +/// Use `handicap` in case you want to change the reference block number. (To get more details see +/// `snitch_contract_should_be_evicted` ). fn consider_case( account: &T::AccountId, current_block_number: T::BlockNumber, @@ -285,7 +287,7 @@ pub fn collect_rent(account: &T::AccountId) -> Option> enact_verdict(account, alive_contract_info, current_block_number, verdict) } -/// Process a snitch that a contract under the given address should be evicted. +/// Process a report that a contract under the given address should be evicted. /// /// Enact the eviction right away if the contract should be evicted and return true. /// Otherwise, **do nothing** and return false. -- GitLab From 2547be441e66db8214fb0baf40e287cfe2ca98f1 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Fri, 31 Jan 2020 18:49:02 +0100 Subject: [PATCH 227/296] remove ambiguous into_iter (#4794) --- client/api/src/notifications.rs | 2 +- client/cli/src/node_key.rs | 6 +++--- frame/staking/reward-curve/src/lib.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/api/src/notifications.rs b/client/api/src/notifications.rs index 13bf06396d..72a9f357fc 100644 --- a/client/api/src/notifications.rs +++ b/client/api/src/notifications.rs @@ -323,7 +323,7 @@ mod tests { let child_filters = Some([ (StorageKey(vec![4]), None), (StorageKey(vec![5]), None), - ].into_iter().cloned().collect()); + ].iter().cloned().collect()); StorageChangeSet { changes: Arc::new(changes.0), child_changes: Arc::new(changes.1), diff --git a/client/cli/src/node_key.rs b/client/cli/src/node_key.rs index 4df3b8e9d5..88102acc63 100644 --- a/client/cli/src/node_key.rs +++ b/client/cli/src/node_key.rs @@ -113,7 +113,7 @@ mod tests { #[test] fn test_node_key_config_input() { fn secret_input(net_config_dir: Option) -> error::Result<()> { - NodeKeyType::variants().into_iter().try_for_each(|t| { + NodeKeyType::variants().iter().try_for_each(|t| { let node_key_type = NodeKeyType::from_str(t).unwrap(); let sk = match node_key_type { NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec() @@ -139,7 +139,7 @@ mod tests { #[test] fn test_node_key_config_file() { fn secret_file(net_config_dir: Option) -> error::Result<()> { - NodeKeyType::variants().into_iter().try_for_each(|t| { + NodeKeyType::variants().iter().try_for_each(|t| { let node_key_type = NodeKeyType::from_str(t).unwrap(); let tmp = tempfile::Builder::new().prefix("alice").tempdir()?; let file = tmp.path().join(format!("{}_mysecret", t)).to_path_buf(); @@ -166,7 +166,7 @@ mod tests { where F: Fn(NodeKeyParams) -> error::Result<()> { - NodeKeyType::variants().into_iter().try_for_each(|t| { + NodeKeyType::variants().iter().try_for_each(|t| { let node_key_type = NodeKeyType::from_str(t).unwrap(); f(NodeKeyParams { node_key_type, diff --git a/frame/staking/reward-curve/src/lib.rs b/frame/staking/reward-curve/src/lib.rs index 89a1980d19..3c31cecc21 100644 --- a/frame/staking/reward-curve/src/lib.rs +++ b/frame/staking/reward-curve/src/lib.rs @@ -386,7 +386,7 @@ fn generate_test_module(input: &INposInput) -> TokenStream2 { #[test] fn reward_curve_precision() { - for &base in [MILLION, u32::max_value()].into_iter() { + for &base in [MILLION, u32::max_value()].iter() { let number_of_check = 100_000.min(base); for check_index in 0..=number_of_check { let i = (check_index as u64 * base as u64 / number_of_check as u64) as u32; -- GitLab From 0cd747cc8398275f3218ce5fcf6f7bc10bdb9a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 31 Jan 2020 19:59:49 +0100 Subject: [PATCH 228/296] Refactor im-online and print more debug info. (#4771) * Initial version. * Fix tests. * Refactor using StorageValueRef. * Add tests and apply review suggestions. * Bump runtime. Co-authored-by: Gavin Wood --- bin/node/runtime/src/lib.rs | 4 +- frame/im-online/src/lib.rs | 336 +++++++++++---------- frame/im-online/src/tests.rs | 13 +- primitives/runtime/src/offchain/mod.rs | 1 + primitives/runtime/src/offchain/storage.rs | 156 ++++++++++ 5 files changed, 353 insertions(+), 157 deletions(-) create mode 100644 primitives/runtime/src/offchain/storage.rs diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index df4423f850..a4a1c90665 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 210, - impl_version: 1, + spec_version: 211, + impl_version: 0, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index ab1c6d7fd3..ff06cb37d4 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -72,13 +72,14 @@ mod tests; use sp_application_crypto::RuntimeAppPublic; use codec::{Encode, Decode}; -use sp_core::offchain::{OpaqueNetworkState, StorageKind}; +use sp_core::offchain::OpaqueNetworkState; use sp_std::prelude::*; use sp_std::convert::TryInto; use pallet_session::historical::IdentificationTuple; use sp_runtime::{ + offchain::storage::StorageValueRef, RuntimeDebug, - traits::{Convert, Member, Printable, Saturating}, Perbill, + traits::{Convert, Member, Saturating, SimpleArithmetic}, Perbill, transaction_validity::{ TransactionValidity, ValidTransaction, InvalidTransaction, TransactionPriority, @@ -89,7 +90,7 @@ use sp_staking::{ offence::{ReportOffence, Offence, Kind}, }; use frame_support::{ - decl_module, decl_event, decl_storage, print, Parameter, debug, decl_error, + decl_module, decl_event, decl_storage, Parameter, debug, decl_error, traits::Get, }; use frame_system::{self as system, ensure_none}; @@ -129,37 +130,70 @@ pub mod ed25519 { pub type AuthorityId = app_ed25519::Public; } -/// The local storage database key under which the worker progress status -/// is tracked. -const DB_KEY: &[u8] = b"parity/im-online-worker-status"; +const DB_PREFIX: &[u8] = b"parity/im-online-heartbeat/"; +/// How many blocks do we wait for heartbeat transaction to be included +/// before sending another one. +const INCLUDE_THRESHOLD: u32 = 3; -/// It's important to persist the worker state, since e.g. the -/// server could be restarted while starting the gossip process, but before -/// finishing it. With every execution of the off-chain worker we check -/// if we need to recover and resume gossipping or if there is already -/// another off-chain worker in the process of gossipping. +/// Status of the offchain worker code. +/// +/// This stores the block number at which heartbeat was requested and when the worker +/// has actually managed to produce it. +/// Note we store such status for every `authority_index` separately. #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] -struct WorkerStatus { - done: bool, - gossipping_at: BlockNumber, +struct HeartbeatStatus { + /// An index of the session that we are supposed to send heartbeat for. + pub session_index: SessionIndex, + /// A block number at which the heartbeat for that session has been actually sent. + /// + /// It may be 0 in case the sending failed. In such case we should just retry + /// as soon as possible (i.e. in a worker running for the next block). + pub sent_at: BlockNumber, +} + +impl HeartbeatStatus { + /// Returns true if heartbeat has been recently sent. + /// + /// Parameters: + /// `session_index` - index of current session. + /// `now` - block at which the offchain worker is running. + /// + /// This function will return `true` iff: + /// 1. the session index is the same (we don't care if it went up or down) + /// 2. the heartbeat has been sent recently (within the threshold) + /// + /// The reasoning for 1. is that it's better to send an extra heartbeat than + /// to stall or not send one in case of a bug. + fn is_recent(&self, session_index: SessionIndex, now: BlockNumber) -> bool { + self.session_index == session_index && self.sent_at + INCLUDE_THRESHOLD.into() > now + } } /// Error which may occur while executing the off-chain code. -#[derive(RuntimeDebug)] -enum OffchainErr { - DecodeWorkerStatus, +#[cfg_attr(test, derive(PartialEq))] +enum OffchainErr { + TooEarly(BlockNumber), + WaitingForInclusion(BlockNumber), + AlreadyOnline(u32), FailedSigning, + FailedToAcquireLock, NetworkState, SubmitTransaction, } -impl Printable for OffchainErr { - fn print(&self) { - match self { - OffchainErr::DecodeWorkerStatus => print("Offchain error: decoding WorkerStatus failed!"), - OffchainErr::FailedSigning => print("Offchain error: signing failed!"), - OffchainErr::NetworkState => print("Offchain error: fetching network state failed!"), - OffchainErr::SubmitTransaction => print("Offchain error: submitting transaction failed!"), +impl sp_std::fmt::Debug for OffchainErr { + fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + match *self { + OffchainErr::TooEarly(ref block) => + write!(fmt, "Too early to send heartbeat, next expected at {:?}", block), + OffchainErr::WaitingForInclusion(ref block) => + write!(fmt, "Heartbeat already sent at {:?}. Waiting for inclusion.", block), + OffchainErr::AlreadyOnline(auth_idx) => + write!(fmt, "Authority {} is already online", auth_idx), + OffchainErr::FailedSigning => write!(fmt, "Failed to sign heartbeat"), + OffchainErr::FailedToAcquireLock => write!(fmt, "Failed to acquire lock"), + OffchainErr::NetworkState => write!(fmt, "Failed to fetch network state"), + OffchainErr::SubmitTransaction => write!(fmt, "Failed to submit transaction"), } } } @@ -197,7 +231,9 @@ pub trait Trait: frame_system::Trait + pallet_session::historical::Trait { /// An expected duration of the session. /// /// This parameter is used to determine the longevity of `heartbeat` transaction - /// and a rough time when the heartbeat should be sent. + /// and a rough time when we should start considering sending hearbeats, + /// since the workers avoids sending them at the very beginning of the session, assuming + /// there is a chance the authority will produce a block and they won't be necessary. type SessionDuration: Get; /// A type that gives us the ability to submit unresponsiveness offence reports. @@ -225,8 +261,13 @@ decl_event!( decl_storage! { trait Store for Module as ImOnline { - /// The block number when we should gossip. - GossipAt get(fn gossip_at): T::BlockNumber; + /// The block number after which it's ok to send heartbeats in current session. + /// + /// At the beginning of each session we set this to a value that should + /// fall roughly in the middle of the session duration. + /// The idea is to first wait for the validators to produce a block + /// in the current session, so that the heartbeat later on will not be necessary. + HeartbeatAfter get(fn heartbeat_after): T::BlockNumber; /// The current set of keys that may issue a heartbeat. Keys get(fn keys): Vec; @@ -302,12 +343,29 @@ decl_module! { // Only send messages if we are a potential validator. if sp_io::offchain::is_validator() { - Self::offchain(now); + for res in Self::send_heartbeats(now).into_iter().flatten() { + if let Err(e) = res { + debug::debug!( + target: "imonline", + "Skipping heartbeat at {:?}: {:?}", + now, + e, + ) + } + } + } else { + debug::trace!( + target: "imonline", + "Skipping heartbeat at {:?}. Not a validator.", + now, + ) } } } } +type OffchainResult = Result::BlockNumber>>; + /// Keep track of number of authored blocks per authority, uncles are counted as /// well since they're a valid proof of onlineness. impl pallet_authorship::EventHandler for Module { @@ -365,156 +423,128 @@ impl Module { ); } - pub(crate) fn offchain(now: T::BlockNumber) { - let next_gossip = >::get(); - let check = Self::check_not_yet_gossipped(now, next_gossip); - let (curr_worker_status, not_yet_gossipped) = match check { - Ok((s, v)) => (s, v), - Err(err) => { - print(err); - return; - }, - }; - if next_gossip < now && not_yet_gossipped { - let value_set = Self::compare_and_set_worker_status(now, false, curr_worker_status); - if !value_set { - // value could not be set in local storage, since the value was - // different from `curr_worker_status`. this indicates that - // another worker was running in parallel. - return; - } - - match Self::do_gossip_at(now) { - Ok(_) => {}, - Err(err) => print(err), - } - } else { - debug::native::debug!( - target: "imonline", - "Skipping gossip at: {:?} >= {:?} || {:?}", - next_gossip, - now, - if not_yet_gossipped { "not gossipped" } else { "gossipped" } - ); + pub(crate) fn send_heartbeats(block_number: T::BlockNumber) + -> OffchainResult>> + { + let heartbeat_after = >::get(); + if block_number < heartbeat_after { + return Err(OffchainErr::TooEarly(heartbeat_after)) } + + let session_index = >::current_index(); + Ok(Self::local_authority_keys() + .map(move |(authority_index, key)| + Self::send_single_heartbeat(authority_index, key, session_index, block_number) + )) } - fn do_gossip_at(block_number: T::BlockNumber) -> Result<(), OffchainErr> { - // we run only when a local authority key is configured - let authorities = Keys::::get(); - let mut results = Vec::new(); - let mut local_keys = T::AuthorityId::all(); - local_keys.sort(); - - for (authority_index, key) in authorities.into_iter() - .enumerate() - .filter_map(|(index, authority)| { - local_keys.binary_search(&authority) - .ok() - .map(|location| (index as u32, &local_keys[location])) - }) - { - if Self::is_online(authority_index) { - debug::native::info!( - target: "imonline", - "[index: {:?}] Skipping sending heartbeat at block: {:?}. Already online.", - authority_index, - block_number - ); - continue; - } + fn send_single_heartbeat( + authority_index: u32, + key: T::AuthorityId, + session_index: SessionIndex, + block_number: T::BlockNumber + ) -> OffchainResult { + // A helper function to prepare heartbeat call. + let prepare_heartbeat = || -> OffchainResult> { let network_state = sp_io::offchain::network_state() .map_err(|_| OffchainErr::NetworkState)?; let heartbeat_data = Heartbeat { block_number, network_state, - session_index: >::current_index(), + session_index, authority_index, }; - let signature = key.sign(&heartbeat_data.encode()).ok_or(OffchainErr::FailedSigning)?; - let call = Call::heartbeat(heartbeat_data, signature); - - debug::info!( - target: "imonline", - "[index: {:?}] Reporting im-online at block: {:?}", - authority_index, - block_number - ); + Ok(Call::heartbeat(heartbeat_data, signature)) + }; - results.push( - T::SubmitTransaction::submit_unsigned(call) - .map_err(|_| OffchainErr::SubmitTransaction) - ); + if Self::is_online(authority_index) { + return Err(OffchainErr::AlreadyOnline(authority_index)); } - // fail only after trying all keys. - results.into_iter().collect::, OffchainErr>>()?; - - // once finished we set the worker status without comparing - // if the existing value changed in the meantime. this is - // because at this point the heartbeat was definitely submitted. - Self::set_worker_status(block_number, true); + // acquire lock for that authority at current heartbeat to make sure we don't + // send concurrent heartbeats. + Self::with_heartbeat_lock( + authority_index, + session_index, + block_number, + || { + let call = prepare_heartbeat()?; + debug::info!( + target: "imonline", + "[index: {:?}] Reporting im-online at block: {:?} (session: {:?}): {:?}", + authority_index, + block_number, + session_index, + call, + ); - Ok(()) - } + T::SubmitTransaction::submit_unsigned(call) + .map_err(|_| OffchainErr::SubmitTransaction)?; - fn compare_and_set_worker_status( - gossipping_at: T::BlockNumber, - done: bool, - curr_worker_status: Option>, - ) -> bool { - let enc = WorkerStatus { - done, - gossipping_at, - }; - sp_io::offchain::local_storage_compare_and_set( - StorageKind::PERSISTENT, - DB_KEY, - curr_worker_status, - &enc.encode() + Ok(()) + }, ) } - fn set_worker_status( - gossipping_at: T::BlockNumber, - done: bool, - ) { - let enc = WorkerStatus { - done, - gossipping_at, - }; - sp_io::offchain::local_storage_set(StorageKind::PERSISTENT, DB_KEY, &enc.encode()); + fn local_authority_keys() -> impl Iterator { + // we run only when a local authority key is configured + let authorities = Keys::::get(); + let mut local_keys = T::AuthorityId::all(); + local_keys.sort(); + + authorities.into_iter() + .enumerate() + .filter_map(move |(index, authority)| { + local_keys.binary_search(&authority) + .ok() + .map(|location| (index as u32, local_keys[location].clone())) + }) } - // Checks if a heartbeat gossip already occurred at this block number. - // Returns a tuple of `(current worker status, bool)`, whereby the bool - // is true if not yet gossipped. - fn check_not_yet_gossipped( + fn with_heartbeat_lock( + authority_index: u32, + session_index: SessionIndex, now: T::BlockNumber, - next_gossip: T::BlockNumber, - ) -> Result<(Option>, bool), OffchainErr> { - let last_gossip = sp_io::offchain::local_storage_get(StorageKind::PERSISTENT, DB_KEY); - match last_gossip { - Some(last) => { - let worker_status: WorkerStatus = Decode::decode(&mut &last[..]) - .map_err(|_| OffchainErr::DecodeWorkerStatus)?; - - let was_aborted = !worker_status.done && worker_status.gossipping_at < now; + f: impl FnOnce() -> OffchainResult, + ) -> OffchainResult { + let key = { + let mut key = DB_PREFIX.to_vec(); + key.extend(authority_index.encode()); + key + }; + let storage = StorageValueRef::persistent(&key); + let res = storage.mutate(|status: Option>>| { + // Check if there is already a lock for that particular block. + // This means that the heartbeat has already been sent, and we are just waiting + // for it to be included. However if it doesn't get included for INCLUDE_THRESHOLD + // we will re-send it. + match status { + // we are still waiting for inclusion. + Some(Some(status)) if status.is_recent(session_index, now) => { + Err(OffchainErr::WaitingForInclusion(status.sent_at)) + }, + // attempt to set new status + _ => Ok(HeartbeatStatus { + session_index, + sent_at: now, + }), + } + })?; - // another off-chain worker is currently in the process of submitting - let already_submitting = - !worker_status.done && worker_status.gossipping_at == now; + let mut new_status = res.map_err(|_| OffchainErr::FailedToAcquireLock)?; - let not_yet_gossipped = - worker_status.done && worker_status.gossipping_at < next_gossip; + // we got the lock, let's try to send the heartbeat. + let res = f(); - let ret = (was_aborted && !already_submitting) || not_yet_gossipped; - Ok((Some(last), ret)) - }, - None => Ok((None, true)), + // clear the lock in case we have failed to send transaction. + if res.is_err() { + new_status.sent_at = 0.into(); + storage.set(&new_status); } + + res } fn initialize_keys(keys: &[T::AuthorityId]) { @@ -544,10 +574,10 @@ impl pallet_session::OneSessionHandler for Module { { // Tell the offchain worker to start making the next session's heartbeats. // Since we consider producing blocks as being online, - // the hearbeat is defered a bit to prevent spaming. + // the heartbeat is defered a bit to prevent spaming. let block_number = >::block_number(); let half_session = T::SessionDuration::get() / 2.into(); - >::put(block_number + half_session); + >::put(block_number + half_session); // Remember who the authorities are for the new session. Keys::::put(validators.map(|x| x.1).collect::>()); diff --git a/frame/im-online/src/tests.rs b/frame/im-online/src/tests.rs index 34eac233ae..adc126094b 100644 --- a/frame/im-online/src/tests.rs +++ b/frame/im-online/src/tests.rs @@ -210,7 +210,11 @@ fn should_generate_heartbeats() { // when UintAuthorityId::set_all_keys(vec![0, 1, 2]); - ImOnline::offchain(2); + ImOnline::send_heartbeats(2) + .unwrap() + // make sure to consume the iterator and check there are no errors. + .collect::, _>>().unwrap(); + // then let transaction = state.write().transactions.pop().unwrap(); @@ -315,7 +319,12 @@ fn should_not_send_a_report_if_already_online() { // when UintAuthorityId::set_all_keys(vec![0]); // all authorities use pallet_session key 0 - ImOnline::offchain(4); + // we expect error, since the authority is already online. + let mut res = ImOnline::send_heartbeats(4).unwrap(); + assert_eq!(res.next().unwrap().unwrap(), ()); + assert_eq!(res.next().unwrap().unwrap_err(), OffchainErr::AlreadyOnline(1)); + assert_eq!(res.next().unwrap().unwrap_err(), OffchainErr::AlreadyOnline(2)); + assert_eq!(res.next(), None); // then let transaction = pool_state.write().transactions.pop().unwrap(); diff --git a/primitives/runtime/src/offchain/mod.rs b/primitives/runtime/src/offchain/mod.rs index 742388f9ec..dfc15360c6 100644 --- a/primitives/runtime/src/offchain/mod.rs +++ b/primitives/runtime/src/offchain/mod.rs @@ -17,3 +17,4 @@ //! A collection of higher lever helpers for offchain calls. pub mod http; +pub mod storage; diff --git a/primitives/runtime/src/offchain/storage.rs b/primitives/runtime/src/offchain/storage.rs new file mode 100644 index 0000000000..d5c2b47298 --- /dev/null +++ b/primitives/runtime/src/offchain/storage.rs @@ -0,0 +1,156 @@ +// Copyright 2020 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 set of storage helpers for offchain workers. + +use sp_core::offchain::StorageKind; + +/// A storage value with a static key. +pub type StorageValue = StorageValueRef<'static>; + +/// An abstraction over local storage value. +pub struct StorageValueRef<'a> { + key: &'a [u8], + kind: StorageKind, +} + +impl<'a> StorageValueRef<'a> { + /// Create a new reference to a value in the persistent local storage. + pub fn persistent(key: &'a [u8]) -> Self { + Self { key, kind: StorageKind::PERSISTENT } + } + + /// Create a new reference to a value in the fork-aware local storage. + pub fn local(key: &'a [u8]) -> Self { + Self { key, kind: StorageKind::LOCAL } + } + + /// Set the value of the storage to encoding of given parameter. + /// + /// Note that the storage may be accessed by workers running concurrently, + /// if you happen to write a `get-check-set` pattern you should most likely + /// be using `mutate` instead. + pub fn set(&self, value: &impl codec::Encode) { + value.using_encoded(|val| { + sp_io::offchain::local_storage_set(self.kind, self.key, val) + }) + } + + /// Retrieve & decode the value from storage. + /// + /// Note that if you want to do some checks based on the value + /// and write changes after that you should rather be using `mutate`. + /// + /// The function returns `None` if the value was not found in storage, + /// otherwise a decoding of the value to requested type. + pub fn get(&self) -> Option> { + sp_io::offchain::local_storage_get(self.kind, self.key) + .map(|val| T::decode(&mut &*val).ok()) + } + + /// Retrieve & decode the value and set it to a new one atomicaly. + /// + /// Function `f` should return a new value that we should attempt to write to storage. + /// This function returns: + /// 1. `Ok(Ok(T))` in case the value has been succesfuly set. + /// 2. `Ok(Err(T))` in case the value was returned, but it couldn't have been set. + /// 3. `Err(_)` in case `f` returns an error. + pub fn mutate(&self, f: F) -> Result, E> where + T: codec::Codec, + F: FnOnce(Option>) -> Result + { + let value = sp_io::offchain::local_storage_get(self.kind, self.key); + let decoded = value.as_deref().map(|mut v| T::decode(&mut v).ok()); + let val = f(decoded)?; + let set = val.using_encoded(|new_val| { + sp_io::offchain::local_storage_compare_and_set( + self.kind, + self.key, + value, + new_val, + ) + }); + + if set { + Ok(Ok(val)) + } else { + Ok(Err(val)) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use sp_io::TestExternalities; + use sp_core::offchain::{ + OffchainExt, + OffchainStorage, + testing, + }; + + #[test] + fn should_set_and_get() { + let (offchain, state) = testing::TestOffchainExt::new(); + let mut t = TestExternalities::default(); + t.register_extension(OffchainExt::new(offchain)); + + t.execute_with(|| { + let val = StorageValue::persistent(b"testval"); + + assert_eq!(val.get::(), None); + + val.set(&15_u32); + + assert_eq!(val.get::(), Some(Some(15_u32))); + assert_eq!(val.get::>(), Some(None)); + assert_eq!( + state.read().persistent_storage.get(b"", b"testval"), + Some(vec![15_u8, 0, 0, 0]) + ); + }) + } + + #[test] + fn should_mutate() { + let (offchain, state) = testing::TestOffchainExt::new(); + let mut t = TestExternalities::default(); + t.register_extension(OffchainExt::new(offchain)); + + t.execute_with(|| { + let val = StorageValue::persistent(b"testval"); + + let result = val.mutate::(|val| { + assert_eq!(val, None); + + Ok(16_u32) + }); + assert_eq!(result, Ok(Ok(16_u32))); + assert_eq!(val.get::(), Some(Some(16_u32))); + assert_eq!( + state.read().persistent_storage.get(b"", b"testval"), + Some(vec![16_u8, 0, 0, 0]) + ); + + // mutate again, but this time early-exit. + let res = val.mutate::(|val| { + assert_eq!(val, Some(Some(16_u32))); + Err(()) + }); + assert_eq!(res, Err(())); + }) + } +} -- GitLab From e65957e5efceea82d88f8b4e1248171eb3c2167e Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Fri, 31 Jan 2020 20:01:32 +0100 Subject: [PATCH 229/296] Adding Serde Deserialisation to UncheckExtrinsics (#4793) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding Serde:Deserialise to UncheckExtrinsics to be able to use the ChainApi RPC from the client side * Update primitives/runtime/src/generic/unchecked_extrinsic.rs Co-authored-by: Bastian Köcher --- .../runtime/src/generic/unchecked_extrinsic.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/primitives/runtime/src/generic/unchecked_extrinsic.rs b/primitives/runtime/src/generic/unchecked_extrinsic.rs index 96e7988103..1625d42e93 100644 --- a/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -274,6 +274,19 @@ impl s } } +#[cfg(feature = "std")] +impl<'a, Address: Decode, Signature: Decode, Call: Decode, Extra: SignedExtension> serde::Deserialize<'a> + for UncheckedExtrinsic +{ + fn deserialize(de: D) -> Result where + D: serde::Deserializer<'a>, + { + let r = sp_core::bytes::deserialize(de)?; + Decode::decode(&mut &r[..]) + .map_err(|e| serde::de::Error::custom(format!("Decode error: {}", e))) + } +} + impl fmt::Debug for UncheckedExtrinsic where -- GitLab From 85b65a38330e732689c5d8d5cfe75ba53b9dc873 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 31 Jan 2020 19:12:03 +0000 Subject: [PATCH 230/296] client/finality-grandpa: Add regression test for observer polling network (was #4778) (#4795) * client/finality-grandpa: Add regression test observer polling network Ensure `Future` implementation of `ObserverWork` is polling its `NetworkBridge`. Regression test for bug introduced in d4fbb897c and fixed in 7d58ceeb4. When polled, `NetworkBridge` forwards reputation change requests from the `GossipValidator` to the underlying `dyn Network`. This test triggers a reputation change by calling `GossipValidator::validate` with an invalid gossip message. After polling the `ObserverWork` which should poll the `NetworkBridge`, the reputation change should be forwarded to the test network. * Nits Co-authored-by: Max Inden --- Cargo.lock | 1 + client/finality-grandpa/Cargo.toml | 1 + .../finality-grandpa/src/communication/mod.rs | 2 +- .../src/communication/tests.rs | 21 +++-- client/finality-grandpa/src/observer.rs | 76 +++++++++++++++++++ 5 files changed, 94 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d5f71b9b30..df45454de0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5572,6 +5572,7 @@ dependencies = [ name = "sc-finality-grandpa" version = "0.8.0" dependencies = [ + "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "fork-tree 2.0.0", diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index e1fe3f0361..68efa2e644 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -12,6 +12,7 @@ futures-timer = "2.0.2" log = "0.4.8" parking_lot = "0.9.0" rand = "0.7.2" +assert_matches = "1.3.0" parity-scale-codec = { version = "1.0.0", features = ["derive"] } sp-arithmetic = { version = "2.0.0", path = "../../primitives/arithmetic" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 42f26aa77e..227ecaa370 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -62,7 +62,7 @@ pub mod gossip; mod periodic; #[cfg(test)] -mod tests; +pub(crate) mod tests; pub use sp_finality_grandpa::GRANDPA_ENGINE_ID; diff --git a/client/finality-grandpa/src/communication/tests.rs b/client/finality-grandpa/src/communication/tests.rs index a5435bdfdc..e10d24a16a 100644 --- a/client/finality-grandpa/src/communication/tests.rs +++ b/client/finality-grandpa/src/communication/tests.rs @@ -31,7 +31,8 @@ use sp_finality_grandpa::{AuthorityList, GRANDPA_ENGINE_ID}; use super::gossip::{self, GossipValidator}; use super::{AuthorityId, VoterSet, Round, SetId}; -enum Event { +#[derive(Debug)] +pub(crate) enum Event { EventStream(mpsc::UnboundedSender), WriteNotification(sc_network::PeerId, Vec), Report(sc_network::PeerId, sc_network::ReputationChange), @@ -39,7 +40,7 @@ enum Event { } #[derive(Clone)] -struct TestNetwork { +pub(crate) struct TestNetwork { sender: mpsc::UnboundedSender, } @@ -101,10 +102,10 @@ impl sc_network_gossip::ValidatorContext for TestNetwork { fn send_topic(&mut self, _: &sc_network::PeerId, _: Hash, _: bool) { } } -struct Tester { - net_handle: super::NetworkBridge, +pub(crate) struct Tester { + pub(crate) net_handle: super::NetworkBridge, gossip_validator: Arc>, - events: mpsc::UnboundedReceiver, + pub(crate) events: mpsc::UnboundedReceiver, } impl Tester { @@ -122,6 +123,14 @@ impl Tester { } }) } + + pub(crate) fn trigger_gossip_validator_reputation_change(&self, p: &PeerId) { + self.gossip_validator.validate( + &mut crate::communication::tests::NoopContext, + p, + &vec![1, 2, 3], + ); + } } // some random config (not really needed) @@ -156,7 +165,7 @@ fn voter_set_state() -> SharedVoterSetState { } // needs to run in a tokio runtime. -fn make_test_network(executor: &impl futures::task::Spawn) -> ( +pub(crate) fn make_test_network(executor: &impl futures::task::Spawn) -> ( impl Future, TestNetwork, ) { diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index ef85bede1c..7e6d1e7793 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -370,3 +370,79 @@ where Future::poll(Pin::new(&mut self.network), cx) } } + +#[cfg(test)] +mod tests { + use super::*; + + use assert_matches::assert_matches; + use crate::{aux_schema, communication::tests::{Event, make_test_network}}; + use substrate_test_runtime_client::{TestClientBuilder, TestClientBuilderExt}; + use sc_network::PeerId; + + use futures::executor::{self, ThreadPool}; + + /// Ensure `Future` implementation of `ObserverWork` is polling its `NetworkBridge`. Regression + /// test for bug introduced in d4fbb897c and fixed in b7af8b339. + /// + /// When polled, `NetworkBridge` forwards reputation change requests from the `GossipValidator` + /// to the underlying `dyn Network`. This test triggers a reputation change by calling + /// `GossipValidator::validate` with an invalid gossip message. After polling the `ObserverWork` + /// which should poll the `NetworkBridge`, the reputation change should be forwarded to the test + /// network. + #[test] + fn observer_work_polls_underlying_network_bridge() { + let thread_pool = ThreadPool::new().unwrap(); + + // Create a test network. + let (tester_fut, _network) = make_test_network(&thread_pool); + let mut tester = executor::block_on(tester_fut); + + // Create an observer. + let (client, backend) = { + let builder = TestClientBuilder::with_default_backend(); + let backend = builder.backend(); + let (client, _) = builder.build_with_longest_chain(); + (Arc::new(client), backend) + }; + + let persistent_data = aux_schema::load_persistent( + &*backend, + client.chain_info().genesis_hash, + 0, + || Ok(vec![]), + ).unwrap(); + + let (_tx, voter_command_rx) = mpsc::unbounded(); + let observer = ObserverWork::new( + client, + tester.net_handle.clone(), + persistent_data, + None, + voter_command_rx, + ); + + // Trigger a reputation change through the gossip validator. + let peer_id = PeerId::random(); + tester.trigger_gossip_validator_reputation_change(&peer_id); + + executor::block_on(async move { + // Ignore initial event stream request by gossip engine. + match tester.events.next().now_or_never() { + Some(Some(Event::EventStream(_))) => {}, + _ => panic!("expected event stream request"), + }; + + assert!( + tester.events.next().now_or_never().is_none(), + "expect no further network events", + ); + + // Poll the observer once and have it forward the reputation change from the gossip + // validator to the test network. + assert!(observer.now_or_never().is_none()); + + assert_matches!(tester.events.next().now_or_never(), Some(Some(Event::Report(_, _)))); + }); + } +} -- GitLab From 92e76a7fd0ba4842ea56d4420d7d53e616cfb443 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sat, 1 Feb 2020 00:27:53 -0800 Subject: [PATCH 231/296] Increase transaction pool default limits (#4792) * increase limits, improve logging * format in kB --- client/basic-authorship/src/basic_authorship.rs | 3 ++- client/cli/src/params.rs | 4 ++-- client/transaction-pool/graph/src/validated_pool.rs | 12 ++++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index fafc63a114..a9e3d28e21 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -251,10 +251,11 @@ impl ProposerInner, let (block, storage_changes, proof) = block_builder.build()?.into_inner(); - info!("Prepared block for proposing at {} [hash: {:?}; parent_hash: {}; extrinsics: [{}]]", + info!("Prepared block for proposing at {} [hash: {:?}; parent_hash: {}; extrinsics ({}): [{}]]", block.header().number(), ::Hash::from(block.header().hash()), block.header().parent_hash(), + block.extrinsics().len(), block.extrinsics() .iter() .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 73d9fa59ba..eddd8578b3 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -300,10 +300,10 @@ pub struct NodeKeyParams { #[derive(Debug, StructOpt, Clone)] pub struct TransactionPoolParams { /// Maximum number of transactions in the transaction pool. - #[structopt(long = "pool-limit", value_name = "COUNT", default_value = "512")] + #[structopt(long = "pool-limit", value_name = "COUNT", default_value = "8192")] pub pool_limit: usize, /// Maximum number of kilobytes of all transactions stored in the pool. - #[structopt(long = "pool-kbytes", value_name = "COUNT", default_value = "10240")] + #[structopt(long = "pool-kbytes", value_name = "COUNT", default_value = "20480")] pub pool_kbytes: usize, } diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 44e51a7a61..c7e60deb4a 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -150,9 +150,16 @@ impl ValidatedPool { let future_limit = &self.options.future; debug!(target: "txpool", "Pool Status: {:?}", status); - if ready_limit.is_exceeded(status.ready, status.ready_bytes) - || future_limit.is_exceeded(status.future, status.future_bytes) { + || future_limit.is_exceeded(status.future, status.future_bytes) + { + debug!( + target: "txpool", + "Enforcing limits ({}/{}kB ready, {}/{}kB future", + ready_limit.count, ready_limit.total_bytes / 1024, + future_limit.count, future_limit.total_bytes / 1024, + ); + // clean up the pool let removed = { let mut pool = self.pool.write(); @@ -163,6 +170,7 @@ impl ValidatedPool { removed }; // run notifications + debug!(target: "txpool", "Enforcing limits: {} dropped", removed.len()); let mut listener = self.listener.write(); for h in &removed { listener.dropped(h, None); -- GitLab From 1294685848c35114769fb4f766643f1b5bd1b516 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sat, 1 Feb 2020 03:33:14 -0800 Subject: [PATCH 232/296] update prost-build (#4789) --- Cargo.lock | 86 +-------------------------- client/authority-discovery/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 86 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index df45454de0..b3b2c36611 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1244,11 +1244,6 @@ dependencies = [ "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "fixedbitset" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "fixedbitset" version = "0.2.0" @@ -2988,11 +2983,6 @@ name = "more-asserts" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "multimap" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "multimap" version = "0.8.0" @@ -4392,14 +4382,6 @@ name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "petgraph" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "petgraph" version = "0.5.0" @@ -4549,16 +4531,6 @@ dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "prost" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -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)", - "prost-derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "prost" version = "0.6.1" @@ -4568,23 +4540,6 @@ dependencies = [ "prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "prost-build" -version = "0.5.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)", - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "prost-build" version = "0.6.1" @@ -4602,18 +4557,6 @@ dependencies = [ "which 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "prost-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "prost-derive" version = "0.6.1" @@ -4626,15 +4569,6 @@ dependencies = [ "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "prost-types" -version = "0.5.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)", - "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "prost-types" version = "0.6.1" @@ -5098,7 +5032,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", @@ -7165,16 +7099,6 @@ name = "subtle" version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "syn" -version = "0.15.44" -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.13 (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 = "syn" version = "1.0.14" @@ -8545,7 +8469,6 @@ dependencies = [ "checksum file-per-thread-logger 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8505b75b31ef7285168dd237c4a7db3c1f3e0927e7d314e670bc98e854272fe9" "checksum finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "52c48f8a628193ba18639b2f727c32132d75f167a4b32f44b252ea8b937f154c" "checksum fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" -"checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" "checksum fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" "checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" @@ -8696,7 +8619,6 @@ dependencies = [ "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 more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" -"checksum multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb04b9f127583ed176e163fb9ec6f3e793b87e21deedd5734a69386a18a0151" "checksum multimap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a97fbd5d00e0e37bfb10f433af8f5aaf631e739368dc9fc28286ca81ca4948dc" "checksum multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f938ffe420493e77c8b6cbcc3f282283f68fc889c5dcbc8e51668d5f3a01ad94" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" @@ -8747,7 +8669,6 @@ dependencies = [ "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -"checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" "checksum petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29c127eea4a29ec6c85d153c59dc1213f33ec74cead30fe4730aecc88cc1fd92" "checksum pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c" "checksum pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f" @@ -8766,13 +8687,9 @@ dependencies = [ "checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" "checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" -"checksum prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96d14b1c185652833d24aaad41c5832b0be5616a590227c1fbff57c616754b23" "checksum prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" -"checksum prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb788126ea840817128183f8f603dce02cb7aea25c2a0b764359d8e20010702e" "checksum prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" -"checksum prost-derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e7dc378b94ac374644181a2247cebf59a6ec1c88b49ac77f3a94b86b79d0e11" "checksum prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" -"checksum prost-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1de482a366941c8d56d19b650fac09ca08508f2a696119ee7513ad590c8bac6f" "checksum prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" "checksum pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" @@ -8871,7 +8788,6 @@ dependencies = [ "checksum substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" -"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" "checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" "checksum syn-mid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd3937748a7eccff61ba5b90af1a20dbf610858923a9192ea0ecb0cb77db1d0" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 0c267cbcc6..68144625b3 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -7,7 +7,7 @@ build = "build.rs" license = "GPL-3.0" [build-dependencies] -prost-build = "0.5.0" +prost-build = "0.6.1" [dependencies] bytes = "0.4.12" -- GitLab From 298ff5a9d03ebcf8403fe589d3ab5d13f748a373 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sat, 1 Feb 2020 14:02:10 +0100 Subject: [PATCH 233/296] Remove warning about connecting to non-Substrate nodes (#4797) --- client/network/src/behaviour.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index faaa25c660..c31fd84eff 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -164,9 +164,6 @@ impl, H: ExHashT> NetworkBehaviourEventPr for Behaviour { fn inject_event(&mut self, event: debug_info::DebugInfoEvent) { let debug_info::DebugInfoEvent::Identified { peer_id, mut info } = event; - if !info.protocol_version.contains("substrate") { - warn!(target: "sub-libp2p", "Connected to a non-Substrate node: {:?}", info); - } if info.listen_addrs.len() > 30 { debug!(target: "sub-libp2p", "Node {:?} has reported more than 30 addresses; \ it is identified by {:?} and {:?}", peer_id, info.protocol_version, -- GitLab From 3c80891f4120903b75d75a54c6a040ecf6724865 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sat, 1 Feb 2020 13:20:16 +0000 Subject: [PATCH 234/296] Refactor the balances module (#4649) * Initially scoping out of the problem * Remove need for exiry in balance locks. * Remove expiry from locks. * Remove supefluous balance test * Amalgamate pieces of balance module * Split out vesting * Fix tests * Fixes for vesting. * Docs. * Weight docs. * Refactor things in terms of set_balances. * Switch out ED to be free + reserved. * Remove on_free_balance_zero and some docs. * Build fixes * Update frame/vesting/src/lib.rs Co-Authored-By: Xiliang Chen * Update frame/vesting/src/lib.rs Co-Authored-By: Xiliang Chen * Migration * Remove superfluous code. * Test fixes * Fix some tests * Fix repatriate reserve * Fixes * Add test for migration * Final cleanups * Fix * Indentation. * Undo unneeded referencing * Bump runtime version * Fixes Co-authored-by: Xiliang Chen --- Cargo.lock | 20 + Cargo.toml | 1 + bin/node-template/runtime/src/lib.rs | 4 - bin/node-template/src/chain_spec.rs | 1 - bin/node/cli/src/chain_spec.rs | 1 - bin/node/executor/tests/basic.rs | 47 +- bin/node/executor/tests/fees.rs | 14 +- bin/node/executor/tests/submit_transaction.rs | 3 +- bin/node/runtime/src/lib.rs | 6 +- bin/node/testing/src/genesis.rs | 1 - frame/balances/Cargo.toml | 4 +- frame/balances/src/lib.rs | 954 +++++++++--------- frame/balances/src/migration.rs | 84 ++ frame/balances/src/mock.rs | 33 +- frame/balances/src/tests.rs | 411 +++----- frame/contracts/src/account_db.rs | 2 +- frame/contracts/src/exec.rs | 2 +- frame/contracts/src/lib.rs | 18 +- frame/contracts/src/tests.rs | 28 +- frame/democracy/Cargo.toml | 2 + frame/democracy/src/lib.rs | 183 +++- frame/elections-phragmen/src/lib.rs | 7 +- frame/elections/src/lib.rs | 3 +- frame/elections/src/mock.rs | 7 +- frame/elections/src/tests.rs | 6 +- frame/example/src/lib.rs | 3 - frame/executive/src/lib.rs | 8 +- frame/generic-asset/src/lib.rs | 37 +- frame/identity/src/lib.rs | 4 - frame/nicks/src/lib.rs | 20 +- frame/recovery/src/mock.rs | 4 - frame/recovery/src/tests.rs | 6 +- frame/scored-pool/src/mock.rs | 4 - frame/scored-pool/src/tests.rs | 14 +- frame/session/src/lib.rs | 8 +- frame/society/src/mock.rs | 4 - frame/staking/src/lib.rs | 8 +- frame/staking/src/mock.rs | 6 +- frame/staking/src/tests.rs | 180 ++-- frame/support/src/lib.rs | 3 +- frame/support/src/traits.rs | 36 +- frame/transaction-payment/src/lib.rs | 18 +- frame/treasury/src/lib.rs | 55 +- frame/utility/src/lib.rs | 4 - frame/vesting/Cargo.toml | 33 + frame/vesting/src/lib.rs | 610 +++++++++++ 46 files changed, 1742 insertions(+), 1165 deletions(-) create mode 100644 frame/balances/src/migration.rs create mode 100644 frame/vesting/Cargo.toml create mode 100644 frame/vesting/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index b3b2c36611..64652d30ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3683,6 +3683,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", + "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3690,6 +3691,7 @@ dependencies = [ "sp-io 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", + "sp-storage 2.0.0", ] [[package]] @@ -4125,6 +4127,24 @@ dependencies = [ "sp-std 2.0.0", ] +[[package]] +name = "pallet-vesting" +version = "2.0.0" +dependencies = [ + "enumflags2 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "frame-support 2.0.0", + "frame-system 2.0.0", + "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pallet-balances 2.0.0", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-runtime 2.0.0", + "sp-std 2.0.0", + "sp-storage 2.0.0", +] + [[package]] name = "parity-bytes" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index 10465042de..0bd6b4c0b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,6 +99,7 @@ members = [ "frame/transaction-payment/rpc/runtime-api", "frame/treasury", "frame/utility", + "frame/vesting", "primitives/allocator", "primitives/application-crypto", "primitives/application-crypto/test", diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 1276f20d17..ea4535e26d 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -196,15 +196,12 @@ impl timestamp::Trait for Runtime { parameter_types! { pub const ExistentialDeposit: u128 = 500; - pub const TransferFee: u128 = 0; pub const CreationFee: u128 = 0; } impl balances::Trait for Runtime { /// The type for recording an account's balance. type Balance = Balance; - /// What to do if an account's free balance gets zeroed. - type OnFreeBalanceZero = (); /// What to do if an account is fully reaped from the system. type OnReapAccount = System; /// What to do if a new account is created. @@ -214,7 +211,6 @@ impl balances::Trait for Runtime { type DustRemoval = (); type TransferPayment = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } diff --git a/bin/node-template/src/chain_spec.rs b/bin/node-template/src/chain_spec.rs index 6c6ab492a3..aa50d06b23 100644 --- a/bin/node-template/src/chain_spec.rs +++ b/bin/node-template/src/chain_spec.rs @@ -132,7 +132,6 @@ fn testnet_genesis(initial_authorities: Vec<(AuraId, GrandpaId)>, }), balances: Some(BalancesConfig { balances: endowed_accounts.iter().cloned().map(|k|(k, 1 << 60)).collect(), - vesting: vec![], }), sudo: Some(SudoConfig { key: root_key, diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index b8ff948b01..4ce0c8f49b 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -237,7 +237,6 @@ pub fn testnet_genesis( .map(|k| (k, ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), - vesting: vec![], }), pallet_indices: Some(IndicesConfig { ids: endowed_accounts.iter().cloned() diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs index 817ebbb173..b306852f45 100644 --- a/bin/node/executor/tests/basic.rs +++ b/bin/node/executor/tests/basic.rs @@ -35,8 +35,7 @@ use frame_system::{self, EventRecord, Phase}; use node_runtime::{ Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, - System, TransactionPayment, Event, - TransferFee, TransactionBaseFee, TransactionByteFee, + System, TransactionPayment, Event, TransactionBaseFee, TransactionByteFee, CreationFee, constants::currency::*, }; use node_primitives::{Balance, Hash}; @@ -62,7 +61,7 @@ fn transfer_fee(extrinsic: &E, fee_multiplier: Fixed64) -> Balance { ::WeightToFee::convert(weight); let base_fee = TransactionBaseFee::get(); - base_fee + fee_multiplier.saturated_multiply_accumulate(length_fee + weight_fee) + TransferFee::get() + base_fee + fee_multiplier.saturated_multiply_accumulate(length_fee + weight_fee) } fn xt() -> UncheckedExtrinsic { @@ -164,8 +163,8 @@ fn block_with_size(time: u64, nonce: u32, size: usize) -> (Vec, Hash) { fn panic_execution_with_foreign_code_gives_error() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { top: map![ - >::hashed_key_for(alice()) => { - 69_u128.encode() + >::hashed_key_for(alice()) => { + (69u128, 0u128, 0u128, 0u128).encode() }, >::hashed_key().to_vec() => { 69_u128.encode() @@ -203,8 +202,8 @@ fn panic_execution_with_foreign_code_gives_error() { fn bad_extrinsic_with_native_equivalent_code_gives_error() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { top: map![ - >::hashed_key_for(alice()) => { - 69_u128.encode() + >::hashed_key_for(alice()) => { + (69u128, 0u128, 0u128, 0u128).encode() }, >::hashed_key().to_vec() => { 69_u128.encode() @@ -242,8 +241,8 @@ fn bad_extrinsic_with_native_equivalent_code_gives_error() { fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { top: map![ - >::hashed_key_for(alice()) => { - (111 * DOLLARS).encode() + >::hashed_key_for(alice()) => { + (111 * DOLLARS, 0u128, 0u128, 0u128).encode() }, >::hashed_key().to_vec() => { (111 * DOLLARS).encode() @@ -275,7 +274,8 @@ fn successful_execution_with_native_equivalent_code_gives_ok() { assert!(r.is_ok()); t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); + let fees = transfer_fee(&xt(), fm) + CreationFee::get(); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - fees); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -284,8 +284,8 @@ fn successful_execution_with_native_equivalent_code_gives_ok() { fn successful_execution_with_foreign_code_gives_ok() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { top: map![ - >::hashed_key_for(alice()) => { - (111 * DOLLARS).encode() + >::hashed_key_for(alice()) => { + (111 * DOLLARS, 0u128, 0u128, 0u128).encode() }, >::hashed_key().to_vec() => { (111 * DOLLARS).encode() @@ -317,7 +317,8 @@ fn successful_execution_with_foreign_code_gives_ok() { assert!(r.is_ok()); t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); + let fees = transfer_fee(&xt(), fm) + CreationFee::get(); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - fees); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -340,7 +341,8 @@ fn full_native_block_import_works() { ).0.unwrap(); t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt(), fm)); + let fees = transfer_fee(&xt(), fm); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - fees); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); alice_last_known_balance = Balances::total_balance(&alice()); let events = vec![ @@ -362,7 +364,7 @@ fn full_native_block_import_works() { alice().into(), bob().into(), 69 * DOLLARS, - 1 * CENTS, + 0, )), topics: vec![], }, @@ -416,7 +418,7 @@ fn full_native_block_import_works() { bob().into(), alice().into(), 5 * DOLLARS, - 1 * CENTS, + 0, ) ), topics: vec![], @@ -440,7 +442,7 @@ fn full_native_block_import_works() { alice().into(), bob().into(), 15 * DOLLARS, - 1 * CENTS, + 0, ) ), topics: vec![], @@ -710,8 +712,8 @@ fn native_big_block_import_fails_on_fallback() { fn panic_execution_gives_error() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { top: map![ - >::hashed_key_for(alice()) => { - 0_u128.encode() + >::hashed_key_for(alice()) => { + (0_u128, 0_u128, 0_u128, 0_u128).encode() }, >::hashed_key().to_vec() => { 0_u128.encode() @@ -745,8 +747,8 @@ fn panic_execution_gives_error() { fn successful_execution_gives_ok() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { top: map![ - >::hashed_key_for(alice()) => { - (111 * DOLLARS).encode() + >::hashed_key_for(alice()) => { + (111 * DOLLARS, 0u128, 0u128, 0u128).encode() }, >::hashed_key().to_vec() => { (111 * DOLLARS).encode() @@ -779,7 +781,8 @@ fn successful_execution_gives_ok() { .expect("Extrinsic did not fail"); t.execute_with(|| { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * transfer_fee(&xt(), fm)); + let fees = transfer_fee(&xt(), fm) + CreationFee::get(); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - fees); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } diff --git a/bin/node/executor/tests/fees.rs b/bin/node/executor/tests/fees.rs index ca34452031..155cefa4cc 100644 --- a/bin/node/executor/tests/fees.rs +++ b/bin/node/executor/tests/fees.rs @@ -30,7 +30,7 @@ use sp_runtime::{ }; use node_runtime::{ CheckedExtrinsic, Call, Runtime, Balances, - TransactionPayment, TransferFee, TransactionBaseFee, TransactionByteFee, + TransactionPayment, TransactionBaseFee, TransactionByteFee, WeightFeeCoefficient, constants::currency::*, }; use node_runtime::impls::LinearWeightToFee; @@ -134,14 +134,14 @@ fn transaction_fee_is_correct_ultimate() { // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { top: map![ - >::hashed_key_for(alice()) => { - (100 * DOLLARS).encode() + >::hashed_key_for(alice()) => { + (100 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS).encode() }, - >::hashed_key_for(bob()) => { - (10 * DOLLARS).encode() + >::hashed_key_for(bob()) => { + (10 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS).encode() }, >::hashed_key().to_vec() => { - (110 * DOLLARS).encode() + (110 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS).encode() }, >::hashed_key().to_vec() => vec![0u8; 16], >::hashed_key_for(0) => vec![0u8; 32] @@ -193,9 +193,7 @@ fn transaction_fee_is_correct_ultimate() { // we know that weight to fee multiplier is effect-less in block 1. assert_eq!(weight_fee as Balance, MILLICENTS); balance_alice -= weight_fee; - balance_alice -= tip; - balance_alice -= TransferFee::get(); assert_eq!(Balances::total_balance(&alice()), balance_alice); }); diff --git a/bin/node/executor/tests/submit_transaction.rs b/bin/node/executor/tests/submit_transaction.rs index 9e91ffc76b..40c0c6b80f 100644 --- a/bin/node/executor/tests/submit_transaction.rs +++ b/bin/node/executor/tests/submit_transaction.rs @@ -167,7 +167,8 @@ fn submitted_transaction_should_be_valid() { // add balance to the account let author = extrinsic.signature.clone().unwrap().0; let address = Indices::lookup(author).unwrap(); - >::insert(&address, 5_000_000_000_000); + let account = pallet_balances::AccountData { free: 5_000_000_000_000, ..Default::default() }; + >::insert(&address, account); // check validity let res = Executive::validate_transaction(extrinsic); diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index a4a1c90665..0e6a337a8b 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -167,20 +167,17 @@ impl pallet_indices::Trait for Runtime { parameter_types! { pub const ExistentialDeposit: Balance = 1 * DOLLARS; - pub const TransferFee: Balance = 1 * CENTS; pub const CreationFee: Balance = 1 * CENTS; } impl pallet_balances::Trait for Runtime { type Balance = Balance; - type OnFreeBalanceZero = ((Staking, Contracts), Session); - type OnReapAccount = (System, Recovery); + type OnReapAccount = ((((System, Staking), Contracts), Session), Recovery); type OnNewAccount = Indices; type Event = Event; type DustRemoval = (); type TransferPayment = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } @@ -430,7 +427,6 @@ impl pallet_contracts::Trait for Runtime { type RentByteFee = RentByteFee; type RentDepositOffset = RentDepositOffset; type SurchargeReward = SurchargeReward; - type TransferFee = ContractTransferFee; type CreationFee = ContractCreationFee; type TransactionBaseFee = ContractTransactionBaseFee; type TransactionByteFee = ContractTransactionByteFee; diff --git a/bin/node/testing/src/genesis.rs b/bin/node/testing/src/genesis.rs index 183515f272..5949781275 100644 --- a/bin/node/testing/src/genesis.rs +++ b/bin/node/testing/src/genesis.rs @@ -49,7 +49,6 @@ pub fn config(support_changes_trie: bool, code: Option<&[u8]>) -> GenesisConfig (eve(), 101 * DOLLARS), (ferdie(), 100 * DOLLARS), ], - vesting: vec![], }), pallet_session: Some(SessionConfig { keys: vec![ diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index f2e24dbae4..871290b182 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -9,6 +9,7 @@ license = "GPL-3.0" serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0", default-features = false, path = "../../primitives/io" } sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } frame-support = { version = "2.0.0", default-features = false, path = "../support" } frame-system = { version = "2.0.0", default-features = false, path = "../system" } @@ -24,7 +25,8 @@ std = [ "serde", "codec/std", "sp-std/std", - "frame-support/std", + "sp-io/std", "sp-runtime/std", + "frame-support/std", "frame-system/std", ] diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 77d28e89e9..65ad226d53 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -38,37 +38,31 @@ //! ### Terminology //! //! - **Existential Deposit:** The minimum balance required to create or keep an account open. This prevents -//! "dust accounts" from filling storage. -//! - **Total Issuance:** The total number of units in existence in a system. -//! - **Reaping an account:** The act of removing an account by resetting its nonce. Happens after its balance is set -//! to zero. -//! - **Free Balance:** The portion of a balance that is not reserved. The free balance is the only -//! balance that matters for most operations. When this balance falls below the existential -//! deposit, most functionality of the account is removed. When both it and the reserved balance -//! are deleted, then the account is said to be dead. -//! -//! No account should ever have a free balance that is strictly between 0 and the existential +//! "dust accounts" from filling storage. When the free plus the reserved balance (i.e. the total balance) +//! fall below this, then the account is said to be dead; and it loses its functionality as well as any +//! prior history and all information on it is removed from the chain's state. +//! No account should ever have a total balance that is strictly between 0 and the existential //! deposit (exclusive). If this ever happens, it indicates either a bug in this module or an //! erroneous raw mutation of storage. //! +//! - **Total Issuance:** The total number of units in existence in a system. +//! +//! - **Reaping an account:** The act of removing an account by resetting its nonce. Happens after its +//! total balance has become zero (or, strictly speaking, less than the Existential Deposit). +//! +//! - **Free Balance:** The portion of a balance that is not reserved. The free balance is the only +//! balance that matters for most operations. +//! //! - **Reserved Balance:** Reserved balance still belongs to the account holder, but is suspended. //! Reserved balance can still be slashed, but only after all the free balance has been slashed. -//! If the reserved balance falls below the existential deposit, it and any related functionality -//! will be deleted. When both it and the free balance are deleted, then the account is said to -//! be dead. -//! -//! No account should ever have a reserved balance that is strictly between 0 and the existential -//! deposit (exclusive). If this ever happens, it indicates either a bug in this module or an -//! erroneous raw mutation of storage. //! //! - **Imbalance:** A condition when some funds were credited or debited without equal and opposite accounting //! (i.e. a difference between total issuance and account balances). Functions that result in an imbalance will //! return an object of the `Imbalance` trait that can be managed within your runtime logic. (If an imbalance is //! simply dropped, it should automatically maintain any book-keeping such as total issuance.) +//! //! - **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 -//! over time. //! //! ### Implementations //! @@ -94,10 +88,6 @@ //! - `transfer` - Transfer some liquid free balance to another account. //! - `set_balance` - Set the balances of a given account. The origin of this call must be root. //! -//! ### Public Functions -//! -//! - `vesting_balance` - Get the amount that is currently being vested and cannot be transferred out of this account. -//! //! ## Usage //! //! The following examples show how to use the Balances module in your custom module. @@ -141,7 +131,6 @@ //! STAKING_ID, //! &ledger.stash, //! ledger.total, -//! T::BlockNumber::max_value(), //! WithdrawReasons::all() //! ); //! // >::insert(controller, ledger); // Commented out as we don't have access to Staking's storage here. @@ -159,44 +148,39 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(test)] +mod mock; +#[cfg(test)] +mod tests; +mod migration; + use sp_std::prelude::*; -use sp_std::{cmp, result, mem, fmt::Debug}; +use sp_std::{cmp, result, mem, fmt::Debug, ops::BitOr}; use codec::{Codec, Encode, Decode}; use frame_support::{ - StorageValue, Parameter, decl_event, decl_storage, decl_module, decl_error, - traits::{ - UpdateBalanceOutcome, Currency, OnFreeBalanceZero, OnReapAccount, OnUnbalanced, TryDrop, + StorageValue, Parameter, decl_event, decl_storage, decl_module, decl_error, ensure, + weights::SimpleDispatchInfo, traits::{ + UpdateBalanceOutcome, Currency, OnReapAccount, OnUnbalanced, TryDrop, WithdrawReason, WithdrawReasons, LockIdentifier, LockableCurrency, ExistenceRequirement, - Imbalance, SignedImbalance, ReservableCurrency, Get, VestingCurrency, - }, - weights::SimpleDispatchInfo, + Imbalance, SignedImbalance, ReservableCurrency, Get, ExistenceRequirement::KeepAlive + } }; use sp_runtime::{ RuntimeDebug, DispatchResult, DispatchError, traits::{ - Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDeserialize, - Saturating, Bounded, + Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, + MaybeSerializeDeserialize, Saturating, Bounded, }, }; use frame_system::{self as system, IsDeadAccount, OnNewAccount, ensure_signed, ensure_root}; - -#[cfg(test)] -mod mock; -#[cfg(test)] -mod tests; +use migration::{get_storage_value, put_storage_value, StorageIterator}; pub use self::imbalances::{PositiveImbalance, NegativeImbalance}; pub trait Subtrait: frame_system::Trait { /// The balance of an account. type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + - MaybeSerializeDeserialize + Debug + From; - - /// A function that is invoked when the free-balance has fallen below the existential deposit and - /// has been reduced to zero. - /// - /// Gives a chance to clean up resources associated with the given account. - type OnFreeBalanceZero: OnFreeBalanceZero; + MaybeSerializeDeserialize + Debug; /// A function that is invoked when the free-balance and the reserved-balance has fallen below /// the existential deposit and both have been reduced to zero. @@ -210,23 +194,15 @@ pub trait Subtrait: frame_system::Trait { /// The minimum amount required to keep an account open. type ExistentialDeposit: Get; - /// The fee required to make a transfer. - type TransferFee: Get; - - /// The fee required to create an account. + /// The fee required to create an account. If you're doing significant stuff with `OnNewAccount` + /// then you'll probably want to make this non-zero. type CreationFee: Get; } pub trait Trait: frame_system::Trait { /// The balance of an account. type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + - MaybeSerializeDeserialize + Debug + From; - - /// A function that is invoked when the free-balance has fallen below the existential deposit and - /// has been reduced to zero. - /// - /// Gives a chance to clean up resources associated with the given account. - type OnFreeBalanceZero: OnFreeBalanceZero; + MaybeSerializeDeserialize + Debug; /// A function that is invoked when the free-balance and the reserved-balance has fallen below /// the existential deposit and both have been reduced to zero. @@ -250,20 +226,15 @@ pub trait Trait: frame_system::Trait { /// The minimum amount required to keep an account open. type ExistentialDeposit: Get; - /// The fee required to make a transfer. - type TransferFee: Get; - /// The fee required to create an account. type CreationFee: Get; } impl, I: Instance> Subtrait for T { type Balance = T::Balance; - type OnFreeBalanceZero = T::OnFreeBalanceZero; type OnReapAccount = T::OnReapAccount; type OnNewAccount = T::OnNewAccount; type ExistentialDeposit = T::ExistentialDeposit; - type TransferFee = T::TransferFee; type CreationFee = T::CreationFee; } @@ -306,40 +277,91 @@ decl_error! { } } -/// Struct to encode the vesting schedule of an individual account. -#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] -pub struct VestingSchedule { - /// Locked amount at genesis. - pub locked: Balance, - /// Amount that gets unlocked every block after `starting_block`. - pub per_block: Balance, - /// Starting block for unlocking(vesting). - pub starting_block: BlockNumber, +/// Simplified reasons for withdrawing balance. +#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug)] +pub enum Reasons { + /// Paying system transaction fees. + Fee = 0, + /// Any reason other than paying system transaction fees. + Misc = 1, + /// Any reason at all. + All = 2, } -impl VestingSchedule { - /// Amount locked at block `n`. - pub fn locked_at(&self, n: BlockNumber) -> Balance - where Balance: From - { - // Number of blocks that count toward vesting - // Saturating to 0 when n < starting_block - let vested_block_count = n.saturating_sub(self.starting_block); - // Return amount that is still locked in vesting - if let Some(x) = Balance::from(vested_block_count).checked_mul(&self.per_block) { - self.locked.max(x) - x +impl From for Reasons { + fn from(r: WithdrawReasons) -> Reasons { + if r == WithdrawReasons::from(WithdrawReason::TransactionPayment) { + Reasons::Fee + } else if r.contains(WithdrawReason::TransactionPayment) { + Reasons::All } else { - Zero::zero() + Reasons::Misc } } } +impl BitOr for Reasons { + type Output = Reasons; + fn bitor(self, other: Reasons) -> Reasons { + if self == other { return self } + Reasons::All + } +} + +/// A single lock on a balance. There can be many of these on an account and they "overlap", so the +/// same balance is frozen by multiple locks. #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] -pub struct BalanceLock { +pub struct BalanceLock { + /// An identifier for this lock. Only one lock may be in existence for each identifier. pub id: LockIdentifier, + /// The amount which the free balance may not drop below when this lock is in effect. pub amount: Balance, - pub until: BlockNumber, - pub reasons: WithdrawReasons, + /// If true, then the lock remains in effect even for payment of transaction fees. + pub reasons: Reasons, +} + +/// All balance information for an account. +#[derive(Encode, Decode, Clone, PartialEq, Eq, Default, RuntimeDebug)] +pub struct AccountData { + /// Non-reserved part of the balance. There may still be restrictions on this, but it is the + /// total pool what may in principle be transferred, reserved and used for tipping. + /// + /// This is the only balance that matters in terms of most operations on tokens. It + /// alone is used to determine the balance when in the contract execution environment. + pub free: Balance, + /// Balance which is reserved and may not be used at all. + /// + /// This can still get slashed, but gets slashed last of all. + /// + /// This balance is a 'reserve' balance that other subsystems use in order to set aside tokens + /// that are still 'owned' by the account holder, but which are suspendable. + pub reserved: Balance, + /// The amount that `free` may not drop below when withdrawing for *anything except transaction + /// fee payment*. + pub misc_frozen: Balance, + /// The amount that `free` may not drop below when withdrawing specifically for transaction + /// fee payment. + pub fee_frozen: Balance, +} + +impl AccountData { + /// How much this account's balance can be reduced for the given `reasons`. + fn usable(&self, reasons: Reasons) -> Balance { + self.free.saturating_sub(self.frozen(reasons)) + } + /// The amount that this account's free balance may not be reduced beyond for the given + /// `reasons`. + fn frozen(&self, reasons: Reasons) -> Balance { + match reasons { + Reasons::All => self.misc_frozen.max(self.fee_frozen), + Reasons::Misc => self.misc_frozen, + Reasons::Fee => self.fee_frozen, + } + } + /// The total balance in this account including any that is reserved and ignoring any frozen. + fn total(&self) -> Balance { + self.free.saturating_add(self.reserved) + } } decl_storage! { @@ -349,71 +371,25 @@ decl_storage! { config.balances.iter().fold(Zero::zero(), |acc: T::Balance, &(_, n)| acc + n) }): T::Balance; - /// Information regarding the vesting of a given account. - pub Vesting get(fn vesting) build(|config: &GenesisConfig| { - // Generate initial vesting configuration - // * who - Account which we are generating vesting configuration for - // * begin - Block when the account will start to vest - // * length - Number of blocks from `begin` until fully vested - // * liquid - Number of units which can be spent before vesting begins - config.vesting.iter().filter_map(|&(ref who, begin, length, liquid)| { - let length = >::from(length); - - config.balances.iter() - .find(|&&(ref w, _)| w == who) - .map(|&(_, balance)| { - // Total genesis `balance` minus `liquid` equals funds locked for vesting - let locked = balance.saturating_sub(liquid); - // Number of units unlocked per block after `begin` - let per_block = locked / length.max(sp_runtime::traits::One::one()); - - (who.clone(), VestingSchedule { - locked: locked, - per_block: per_block, - starting_block: begin - }) - }) - }).collect::>() - }): - map hasher(blake2_256) T::AccountId - => Option>; - - /// The 'free' balance of a given account. - /// - /// This is the only balance that matters in terms of most operations on tokens. It - /// alone is used to determine the balance when in the contract execution environment. When this - /// balance falls below the value of `ExistentialDeposit`, then the 'current account' is - /// deleted: specifically `FreeBalance`. Further, the `OnFreeBalanceZero` callback - /// is invoked, giving a chance to external modules to clean up data associated with - /// the deleted account. - /// - /// `frame_system::AccountNonce` is also deleted if `ReservedBalance` is also zero (it also gets - /// collapsed to zero if it ever becomes less than `ExistentialDeposit`. - pub FreeBalance get(fn free_balance) - build(|config: &GenesisConfig| config.balances.clone()): - map hasher(blake2_256) T::AccountId => T::Balance; - - /// The amount of the balance of a given account that is externally reserved; this can still get - /// slashed, but gets slashed last of all. + /// The balance of an account. /// - /// This balance is a 'reserve' balance that other subsystems use in order to set aside tokens - /// that are still 'owned' by the account holder, but which are suspendable. - /// - /// When this balance falls below the value of `ExistentialDeposit`, then this 'reserve account' - /// is deleted: specifically, `ReservedBalance`. - /// - /// `frame_system::AccountNonce` is also deleted if `FreeBalance` is also zero (it also gets - /// collapsed to zero if it ever becomes less than `ExistentialDeposit`.) - pub ReservedBalance get(fn reserved_balance): - map hasher(blake2_256) T::AccountId => T::Balance; + /// NOTE: THIS MAY NEVER BE IN EXISTENCE AND YET HAVE A `total().is_zero()`. If the total + /// is ever zero, then the entry *MUST* be removed. + pub Account get(fn account) + build(|config: &GenesisConfig| config.balances.iter() + .map(|&(ref who, free)| (who.clone(), AccountData { free, .. Default::default() })) + .collect::>() + ): map hasher(blake2_256) T::AccountId => AccountData; /// Any liquidity locks on some account balances. - pub Locks get(fn locks): - map hasher(blake2_256) T::AccountId => Vec>; + /// NOTE: Should only be accessed when setting, changing and freeing a lock. + pub Locks get(fn locks): map hasher(blake2_256) T::AccountId => Vec>; + + /// True if network has been upgraded to this version. + IsUpgraded: bool; } add_extra_genesis { config(balances): Vec<(T::AccountId, T::Balance)>; - config(vesting): Vec<(T::AccountId, T::BlockNumber, T::BlockNumber, T::Balance)>; // ^^ begin, length, amount liquid at genesis build(|config: &GenesisConfig| { for (_, balance) in &config.balances { @@ -433,9 +409,6 @@ decl_module! { /// The minimum amount required to keep an account open. const ExistentialDeposit: T::Balance = T::ExistentialDeposit::get(); - /// The fee required to make a transfer. - const TransferFee: T::Balance = T::TransferFee::get(); - /// The fee required to create an account. const CreationFee: T::Balance = T::CreationFee::get(); @@ -460,8 +433,7 @@ decl_module! { /// - `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`. + /// - Removing enough funds from an account will trigger `T::DustRemoval::on_unbalanced`. /// - `transfer_keep_alive` works the same way as `transfer`, but has an additional /// check that the transfer will not kill the origin account. /// @@ -501,26 +473,28 @@ decl_module! { let who = T::Lookup::lookup(who)?; let existential_deposit = T::ExistentialDeposit::get(); - let new_free = if new_free < existential_deposit { Zero::zero() } else { new_free }; - let new_reserved = if new_reserved < existential_deposit { Zero::zero() } else { new_reserved }; + let wipeout = new_free + new_reserved < existential_deposit; + let new_free = if wipeout { Zero::zero() } else { new_free }; + let new_reserved = if wipeout { Zero::zero() } else { new_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)); + let old_account = Account::::get(&who); + + if new_free > old_account.free { + mem::drop(PositiveImbalance::::new(new_free - old_account.free)); + } else if new_free < old_account.free { + mem::drop(NegativeImbalance::::new(old_account.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)); + if new_reserved > old_account.reserved { + mem::drop(PositiveImbalance::::new(new_reserved - old_account.reserved)); + } else if new_reserved < old_account.reserved { + mem::drop(NegativeImbalance::::new(old_account.reserved - new_reserved)); } - Self::set_reserved_balance(&who, new_reserved); - Self::deposit_event(RawEvent::BalanceSet(who, new_free, new_reserved)); + let account = AccountData { free: new_free, reserved: new_reserved, ..old_account }; + Self::set_account(&who, &account, &old_account); + + Self::deposit_event(RawEvent::BalanceSet(who, account.free, account.reserved)); } /// Exactly as `transfer`, except the origin must be root and the source account may be @@ -552,52 +526,154 @@ decl_module! { ) { let transactor = ensure_signed(origin)?; let dest = T::Lookup::lookup(dest)?; - >::transfer(&transactor, &dest, value, ExistenceRequirement::KeepAlive)?; + >::transfer(&transactor, &dest, value, KeepAlive)?; } + fn on_initialize() { + if !IsUpgraded::::get() { + IsUpgraded::::put(true); + Self::do_upgrade(); + } + } + } +} + +#[derive(Decode)] +struct OldBalanceLock { + id: LockIdentifier, + amount: Balance, + until: BlockNumber, + reasons: WithdrawReasons, +} + +impl OldBalanceLock { + fn upgraded(self) -> (BalanceLock, BlockNumber) { + (BalanceLock { + id: self.id, + amount: self.amount, + reasons: self.reasons.into(), + }, self.until) } } impl, I: Instance> Module { // PRIVATE MUTABLES - /// Set the reserved balance of an account to some new value. Will enforce `ExistentialDeposit` - /// law, annulling the account as needed. - /// - /// Doesn't do any preparatory work for creating a new account, so should only be used when it - /// is known that the account already exists. - /// - /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that - /// the caller will do this. - fn set_reserved_balance(who: &T::AccountId, balance: T::Balance) -> UpdateBalanceOutcome { - if balance < T::ExistentialDeposit::get() { - >::insert(who, balance); - Self::on_reserved_too_low(who); - UpdateBalanceOutcome::AccountKilled - } else { - >::insert(who, balance); - UpdateBalanceOutcome::Updated + // Upgrade from the pre-#4649 balances/vesting into the new balances. + pub fn do_upgrade() { + // First, migrate from old FreeBalance to new Account. + // We also move all locks across since only accounts with FreeBalance values have locks. + // FreeBalance: map T::AccountId => T::Balance + for (hash, free) in StorageIterator::::new(b"Balances", b"FreeBalance").drain() { + let mut account = AccountData { free, ..Default::default() }; + // Locks: map T::AccountId => Vec + let old_locks = get_storage_value::>>(b"Balances", b"Locks", &hash); + if let Some(locks) = old_locks { + let locks = locks.into_iter() + .map(|i| { + let (result, expiry) = i.upgraded(); + if expiry != T::BlockNumber::max_value() { + // Any `until`s that are not T::BlockNumber::max_value come from + // democracy and need to be migrated over there. + // Democracy: Locks get(locks): map T::AccountId => Option; + put_storage_value(b"Democracy", b"Locks", &hash, expiry); + } + result + }) + .collect::>(); + for l in locks.iter() { + if l.reasons == Reasons::All || l.reasons == Reasons::Misc { + account.misc_frozen = account.misc_frozen.max(l.amount); + } + if l.reasons == Reasons::All || l.reasons == Reasons::Fee { + account.fee_frozen = account.fee_frozen.max(l.amount); + } + } + put_storage_value(b"Balances", b"Locks", &hash, locks); + } + put_storage_value(b"Balances", b"Account", &hash, account); + } + // Second, migrate old ReservedBalance into new Account. + // ReservedBalance: map T::AccountId => T::Balance + for (hash, reserved) in StorageIterator::::new(b"Balances", b"ReservedBalance").drain() { + let mut account = get_storage_value::>(b"Balances", b"Account", &hash).unwrap_or_default(); + account.reserved = reserved; + put_storage_value(b"Balances", b"Account", &hash, account); + } + + // Finally, migrate vesting and ensure locks are in place. We will be lazy and just lock + // for the maximum amount (i.e. at genesis). Users will need to call "vest" to reduce the + // lock to something sensible. + // pub Vesting: map T::AccountId => Option; + for (hash, vesting) in StorageIterator::<(T::Balance, T::Balance, T::BlockNumber)>::new(b"Balances", b"Vesting").drain() { + let mut account = get_storage_value::>(b"Balances", b"Account", &hash).unwrap_or_default(); + let mut locks = get_storage_value::>>(b"Balances", b"Locks", &hash).unwrap_or_default(); + locks.push(BalanceLock { + id: *b"vesting ", + amount: vesting.0.clone(), + reasons: Reasons::Misc, + }); + account.misc_frozen = account.misc_frozen.max(vesting.0.clone()); + put_storage_value(b"Vesting", b"Vesting", &hash, vesting); + put_storage_value(b"Balances", b"Locks", &hash, locks); + put_storage_value(b"Balances", b"Account", &hash, account); } } - /// Set the free balance of an account to some new value. Will enforce `ExistentialDeposit` - /// law, annulling the account as needed. + /// Get the free balance of an account. + pub fn free_balance(who: impl sp_std::borrow::Borrow) -> T::Balance { + Account::::get(who.borrow()).free + } + + /// Get the balance of an account that can be used for transfers, reservations, or any other + /// non-locking, non-transaction-fee activity. Will be at most `free_balance`. + pub fn usable_balance(who: impl sp_std::borrow::Borrow) -> T::Balance { + Account::::get(who.borrow()).usable(Reasons::Misc) + } + + /// Get the balance of an account that can be used for paying transaction fees (not tipping, + /// or any other kind of fees, though). Will be at most `free_balance`. + pub fn usable_balance_for_fees(who: impl sp_std::borrow::Borrow) -> T::Balance { + Account::::get(who.borrow()).usable(Reasons::Fee) + } + + /// Get the reserved balance of an account. + pub fn reserved_balance(who: impl sp_std::borrow::Borrow) -> T::Balance { + Account::::get(who.borrow()).reserved + } + + /// Set both the free and reserved balance of an account to some new value. Will enforce + /// `ExistentialDeposit` law, annulling the account as needed. /// - /// Doesn't do any preparatory work for creating a new account, so should only be used when it - /// is known that the account already exists. + /// Will return `AccountKilled` if either reserved or free are too low. + /// + /// NOTE: This assumes that `account` is the same as `Self::account(who)` except for altered + /// values of `free` and `balance`. + /// + /// NOTE: Doesn't do any preparatory work for creating a new account, so should only be used + /// when it is known that the account already exists. /// /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. - fn set_free_balance(who: &T::AccountId, balance: T::Balance) -> UpdateBalanceOutcome { - // Commented out for now - but consider it instructive. - // assert!(!Self::total_balance(who).is_zero()); - // assert!(Self::free_balance(who) > T::ExistentialDeposit::get()); - if balance < T::ExistentialDeposit::get() { - >::insert(who, balance); - Self::on_free_too_low(who); - UpdateBalanceOutcome::AccountKilled + fn set_account( + who: &T::AccountId, + account: &AccountData, + old: &AccountData, + ) -> UpdateBalanceOutcome { + let total = account.free + account.reserved; + if total < T::ExistentialDeposit::get() { + T::DustRemoval::on_unbalanced(NegativeImbalance::new(total)); + if !old.total().is_zero() { + Self::reap_account(who, total); + UpdateBalanceOutcome::AccountKilled + } else { + UpdateBalanceOutcome::StillDead + } } else { - >::insert(who, balance); + if old.total().is_zero() { + Self::about_to_create_account(who, account.free); + } + Account::::insert(who, account); UpdateBalanceOutcome::Updated } } @@ -605,7 +681,7 @@ impl, I: Instance> Module { /// Register a new account (with existential balance). /// /// This just calls appropriate hooks. It doesn't (necessarily) make any state changes. - fn new_account(who: &T::AccountId, balance: T::Balance) { + fn about_to_create_account(who: &T::AccountId, balance: T::Balance) { T::OnNewAccount::on_new_account(&who); Self::deposit_event(RawEvent::NewAccount(who.clone(), balance.clone())); } @@ -614,61 +690,27 @@ impl, I: Instance> Module { /// /// This just removes the nonce and leaves an event. fn reap_account(who: &T::AccountId, dust: T::Balance) { + Locks::::remove(who); + Account::::remove(who); T::OnReapAccount::on_reap_account(who); Self::deposit_event(RawEvent::ReapedAccount(who.clone(), dust)); } - /// Account's free balance has dropped below existential deposit. Kill its - /// free side and the account completely if its reserved size is already dead. - /// - /// Will maintain total issuance. - fn on_free_too_low(who: &T::AccountId) { - let dust = >::take(who); - >::remove(who); - - T::OnFreeBalanceZero::on_free_balance_zero(who); - - let mut reserved_balance = Self::reserved_balance(who); - - if !dust.is_zero() { - if reserved_balance >= T::ExistentialDeposit::get() { - // any individual account cannot cause overflow in balance. - reserved_balance += dust; - Self::set_reserved_balance(who, reserved_balance); - } else { - // underflow should never happen, but if it does, there's not much we can do. - T::DustRemoval::on_unbalanced(NegativeImbalance::new(dust)); - } - } - - if reserved_balance.is_zero() { - Self::reap_account(who, dust); - } - } - - /// Account's reserved balance has dropped below existential deposit. Kill its - /// reserved side and the account completely if its free size is already dead. - /// - /// Will maintain total issuance. - fn on_reserved_too_low(who: &T::AccountId) { - let dust = >::take(who); - - let mut free_balance = Self::free_balance(who); - - if !dust.is_zero() { - if free_balance >= T::ExistentialDeposit::get() { - // any individual account cannot cause overflow in balance. - free_balance += dust; - Self::set_free_balance(who, free_balance); - } else { - // underflow should never happen, but it if does, there's nothing to be done here. - T::DustRemoval::on_unbalanced(NegativeImbalance::new(dust)); + /// Update the account entry for `who`, given the locks. + fn update_locks(who: &T::AccountId, locks: &[BalanceLock]) { + Account::::mutate(who, |b| { + b.misc_frozen = Zero::zero(); + b.fee_frozen = Zero::zero(); + for l in locks.iter() { + if l.reasons == Reasons::All || l.reasons == Reasons::Misc { + b.misc_frozen = b.misc_frozen.max(l.amount); + } + if l.reasons == Reasons::All || l.reasons == Reasons::Fee { + b.fee_frozen = b.fee_frozen.max(l.amount); + } } - } - - if free_balance.is_zero() { - Self::reap_account(who, dust); - } + }); + Locks::::insert(who, locks); } } @@ -866,19 +908,16 @@ impl, I: Instance> frame_system::Trait for ElevatedTrait { } impl, I: Instance> Trait for ElevatedTrait { type Balance = T::Balance; - type OnFreeBalanceZero = T::OnFreeBalanceZero; type OnReapAccount = T::OnReapAccount; type OnNewAccount = T::OnNewAccount; type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = T::ExistentialDeposit; - type TransferFee = T::TransferFee; type CreationFee = T::CreationFee; } -impl, I: Instance> Currency for Module -where +impl, I: Instance> Currency for Module where T::Balance: MaybeSerializeDeserialize + Debug { type Balance = T::Balance; @@ -886,11 +925,10 @@ where type NegativeImbalance = NegativeImbalance; fn total_balance(who: &T::AccountId) -> Self::Balance { - Self::free_balance(who) + Self::reserved_balance(who) + Self::account(who).total() } // Check if `value` amount of free balance can be slashed from `who`. - // Is a no-op if value to be slashed is zero. fn can_slash(who: &T::AccountId, value: Self::Balance) -> bool { if value.is_zero() { return true } Self::free_balance(who) >= value @@ -905,7 +943,7 @@ where } fn free_balance(who: &T::AccountId) -> Self::Balance { - >::get(who) + Account::::get(who).free } // Burn funds from the total issuance, returning a positive imbalance for the amount burned. @@ -950,75 +988,60 @@ where new_balance: T::Balance, ) -> DispatchResult { if amount.is_zero() { return Ok(()) } - if reasons.intersects(WithdrawReason::Reserve | WithdrawReason::Transfer) - && Self::vesting_balance(who) > new_balance - { - Err(Error::::VestingBalance)? - } - let locks = Self::locks(who); - if locks.is_empty() { - return Ok(()) - } - - let now = >::block_number(); - if locks.into_iter() - .all(|l| - now >= l.until - || new_balance >= l.amount - || !l.reasons.intersects(reasons) - ) - { - Ok(()) - } else { - Err(Error::::LiquidityRestrictions.into()) - } + let min_balance = Account::::get(who).frozen(reasons.into()); + ensure!(new_balance >= min_balance, Error::::LiquidityRestrictions); + Ok(()) } // Transfer some free balance from `transactor` to `dest`, respecting existence requirements. - // Is a no-op if value to be transferred is zero. + // Is a no-op if value to be transferred is zero or the `transactor` is the same as `dest`. fn transfer( transactor: &T::AccountId, dest: &T::AccountId, value: Self::Balance, existence_requirement: ExistenceRequirement, ) -> DispatchResult { - if value.is_zero() { return Ok(()) } - let from_balance = Self::free_balance(transactor); - let to_balance = Self::free_balance(dest); - let would_create = to_balance.is_zero(); - let fee = if would_create { T::CreationFee::get() } else { T::TransferFee::get() }; + if value.is_zero() || transactor == dest { return Ok(()) } + + let old_from_account = Self::account(transactor); + let mut from_account = old_from_account.clone(); + let old_to_account = Self::account(dest); + let mut to_account = old_to_account.clone(); + + let would_create = to_account.total().is_zero(); + let fee = if would_create { T::CreationFee::get() } else { Zero::zero() }; let liability = value.checked_add(&fee).ok_or(Error::::Overflow)?; - let new_from_balance = from_balance.checked_sub(&liability).ok_or(Error::::InsufficientBalance)?; - if would_create && value < T::ExistentialDeposit::get() { - Err(Error::::ExistentialDeposit)? - } - Self::ensure_can_withdraw(transactor, value, WithdrawReason::Transfer.into(), new_from_balance)?; + from_account.free = from_account.free.checked_sub(&liability) + .ok_or(Error::::InsufficientBalance)?; // NOTE: total stake being stored in the same type means that this could never overflow // but better to be safe than sorry. - let new_to_balance = to_balance.checked_add(&value).ok_or(Error::::Overflow)?; + to_account.free = to_account.free.checked_add(&value).ok_or(Error::::Overflow)?; - if transactor != dest { - if existence_requirement == ExistenceRequirement::KeepAlive { - if new_from_balance < Self::minimum_balance() { - Err(Error::::KeepAlive)? - } - } + let ed = T::ExistentialDeposit::get(); + ensure!(to_account.free >= ed, Error::::ExistentialDeposit); - Self::set_free_balance(transactor, new_from_balance); - if !>::exists(dest) { - Self::new_account(dest, new_to_balance); - } + Self::ensure_can_withdraw( + transactor, + value, + WithdrawReason::Transfer.into(), + from_account.free, + )?; - // Emit transfer event. - Self::deposit_event(RawEvent::Transfer(transactor.clone(), dest.clone(), value, fee)); + let allow_death = existence_requirement == ExistenceRequirement::AllowDeath; + ensure!(allow_death || from_account.free >= ed, Error::::KeepAlive); - // Take action on the set_free_balance call. - // This will emit events that _resulted_ from the transfer. - Self::set_free_balance(dest, new_to_balance); - T::TransferPayment::on_unbalanced(NegativeImbalance::new(fee)); - } + Self::set_account(transactor, &from_account, &old_from_account); + + // Take action on the set_account call. + // This will emit events that _resulted_ from the transfer. + Self::set_account(dest, &to_account, &old_to_account); + + // Emit transfer event. + Self::deposit_event(RawEvent::Transfer(transactor.clone(), dest.clone(), value, fee)); + + T::TransferPayment::on_unbalanced(NegativeImbalance::new(fee)); Ok(()) } @@ -1033,95 +1056,122 @@ where ) -> result::Result { if value.is_zero() { return Ok(NegativeImbalance::zero()); } - let old_balance = Self::free_balance(who); - if let Some(new_balance) = old_balance.checked_sub(&value) { + let old_account = Self::account(who); + let mut account = old_account.clone(); + if let Some(new_free_account) = account.free.checked_sub(&value) { // if we need to keep the account alive... if liveness == ExistenceRequirement::KeepAlive // ...and it would be dead afterwards... - && new_balance < T::ExistentialDeposit::get() + && new_free_account < T::ExistentialDeposit::get() // ...yet is was alive before - && old_balance >= T::ExistentialDeposit::get() + && account.free >= T::ExistentialDeposit::get() { Err(Error::::KeepAlive)? } - Self::ensure_can_withdraw(who, value, reasons, new_balance)?; - Self::set_free_balance(who, new_balance); + Self::ensure_can_withdraw(who, value, reasons, new_free_account)?; + account.free = new_free_account; + Self::set_account(who, &account, &old_account); Ok(NegativeImbalance::new(value)) } else { Err(Error::::InsufficientBalance)? } } - // Slash an account, returning the negative imbalance created and any left over - // amount that could not be slashed. - // Is a no-op if value to be slashed is zero. + /// Slash a target account `who`, returning the negative imbalance created and any left over + /// amount that could not be slashed. + /// + /// Is a no-op if `value` to be slashed is zero. + /// + /// NOTE: `slash()` prefers free balance, but assumes that reserve balance can be drawn + /// from in extreme circumstances. `can_slash()` should be used prior to `slash()` to avoid having + /// to draw from reserved funds, however we err on the side of punishment if things are inconsistent + /// or `can_slash` wasn't used appropriately. fn slash( who: &T::AccountId, value: Self::Balance ) -> (Self::NegativeImbalance, Self::Balance) { if value.is_zero() { return (NegativeImbalance::zero(), Zero::zero()) } - let free_balance = Self::free_balance(who); - let free_slash = cmp::min(free_balance, value); + let old_account = Self::account(who); + let mut account = old_account.clone(); + + let free_slash = cmp::min(account.free, value); + account.free -= free_slash; - Self::set_free_balance(who, free_balance - free_slash); let remaining_slash = value - free_slash; - // NOTE: `slash()` prefers free balance, but assumes that reserve balance can be drawn - // from in extreme circumstances. `can_slash()` should be used prior to `slash()` to avoid having - // to draw from reserved funds, however we err on the side of punishment if things are inconsistent - // or `can_slash` wasn't used appropriately. - if !remaining_slash.is_zero() { - let reserved_balance = Self::reserved_balance(who); - let reserved_slash = cmp::min(reserved_balance, remaining_slash); - Self::set_reserved_balance(who, reserved_balance - reserved_slash); + let result = if !remaining_slash.is_zero() { + let reserved_slash = cmp::min(account.reserved, remaining_slash); + account.reserved -= reserved_slash; (NegativeImbalance::new(free_slash + reserved_slash), remaining_slash - reserved_slash) } else { (NegativeImbalance::new(value), Zero::zero()) - } + }; + Self::set_account(who, &account, &old_account); + result } - // Deposit some `value` into the free balance of an existing account. - // Is a no-op if the value to be deposited is zero. + /// Deposit some `value` into the free balance of an existing target account `who`. + /// + /// Is a no-op if the `value` to be deposited is zero. fn deposit_into_existing( who: &T::AccountId, value: Self::Balance ) -> result::Result { if value.is_zero() { return Ok(PositiveImbalance::zero()) } - if Self::total_balance(who).is_zero() { - Err(Error::::DeadAccount)? - } - Self::set_free_balance(who, Self::free_balance(who) + value); + let old_account = Self::account(who); + let mut account = old_account.clone(); + ensure!(!account.total().is_zero(), Error::::DeadAccount); + account.free = account.free.checked_add(&value).ok_or(Error::::Overflow)?; + + Self::set_account(who, &account, &old_account); Ok(PositiveImbalance::new(value)) } - // Deposit some `value` into the free balance of `who`, possibly creating a new account. - // Is a no-op if the value to be deposited is zero. + /// Deposit some `value` into the free balance of `who`, possibly creating a new account. + /// + /// This function is a no-op if: + /// - the `value` to be deposited is zero; or + /// - if the `value` to be deposited is less than the ED and the account does not yet exist; or + /// - `value` is so large it would cause the balance of `who` to overflow. fn deposit_creating( who: &T::AccountId, value: Self::Balance, ) -> Self::PositiveImbalance { if value.is_zero() { return Self::PositiveImbalance::zero() } - let (imbalance, _) = Self::make_free_balance_be(who, Self::free_balance(who) + value); - if let SignedImbalance::Positive(p) = imbalance { - p - } else { - // Impossible, but be defensive. - Self::PositiveImbalance::zero() - } + let old_account = Self::account(who); + let mut account = old_account.clone(); + let ed = T::ExistentialDeposit::get(); + + // bail if not yet created and this operation wouldn't be enough to create it. + if value < ed && account.total().is_zero() { return Self::PositiveImbalance::zero() } + + // defensive only: overflow should never happen, however in case it does, then this + // operation is a no-op. + account.free = match account.free.checked_add(&value) { + Some(f) => f, + None => return Self::PositiveImbalance::zero(), + }; + + Self::set_account(who, &account, &old_account); + + PositiveImbalance::new(value) } - fn make_free_balance_be(who: &T::AccountId, balance: Self::Balance) -> ( + /// Force the new free balance of a target account `who` to some new value `balance`. + fn make_free_balance_be(who: &T::AccountId, value: Self::Balance) -> ( SignedImbalance, UpdateBalanceOutcome ) { - let original = Self::free_balance(who); - if balance < T::ExistentialDeposit::get() && original.is_zero() { + let old_account = Self::account(who); + let mut account = old_account.clone(); + + if value < T::ExistentialDeposit::get() && account.free.is_zero() { // If we're attempting to set an existing account to less than ED, then // bypass the entire operation. It's a no-op if you follow it through, but // since this is an instance where we might account for a negative imbalance - // (in the dust cleaner of set_free_balance) before we account for its actual + // (in the dust cleaner of set_account) before we account for its actual // equal and opposite cause (returned as an Imbalance), then in the // instance that there's no other accounts on the system at all, we might // underflow the issuance and our arithmetic will be off. @@ -1130,42 +1180,31 @@ where UpdateBalanceOutcome::AccountKilled, ) } - let imbalance = if original <= balance { - SignedImbalance::Positive(PositiveImbalance::new(balance - original)) + let imbalance = if account.free <= value { + SignedImbalance::Positive(PositiveImbalance::new(value - account.free)) } else { - SignedImbalance::Negative(NegativeImbalance::new(original - balance)) + SignedImbalance::Negative(NegativeImbalance::new(account.free - value)) }; + account.free = value; + // If the balance is too low, then the account is reaped. - // NOTE: There are two balances for every account: `reserved_balance` and - // `free_balance`. This contract subsystem only cares about the latter: whenever - // the term "balance" is used *here* it should be assumed to mean "free balance" - // in the rest of the module. // Free balance can never be less than ED. If that happens, it gets reduced to zero // and the account information relevant to this subsystem is deleted (i.e. the // account is reaped). - let outcome = if balance < T::ExistentialDeposit::get() { - Self::set_free_balance(who, balance); - UpdateBalanceOutcome::AccountKilled - } else { - if !>::exists(who) { - Self::new_account(&who, balance); - } - Self::set_free_balance(who, balance); - UpdateBalanceOutcome::Updated - }; + let outcome = Self::set_account(who, &account, &old_account); (imbalance, outcome) } } -impl, I: Instance> ReservableCurrency for Module -where +impl, I: Instance> ReservableCurrency for Module where T::Balance: MaybeSerializeDeserialize + Debug { - // Check if `who` can reserve `value` from their free balance. - // Is a no-op if value to be reserved is zero. + /// Check if `who` can reserve `value` from their free balance. + /// + /// Always `true` if value to be reserved is zero. fn can_reserve(who: &T::AccountId, value: Self::Balance) -> bool { if value.is_zero() { return true } - Self::free_balance(who) + Self::account(who).free .checked_sub(&value) .map_or(false, |new_balance| Self::ensure_can_withdraw(who, value, WithdrawReason::Reserve.into(), new_balance).is_ok() @@ -1173,66 +1212,97 @@ where } fn reserved_balance(who: &T::AccountId) -> Self::Balance { - >::get(who) + Self::account(who).reserved } - // Move `value` from the free balance from `who` to their reserved balance. - // Is a no-op if value to be reserved is zero. + /// Move `value` from the free balance from `who` to their reserved balance. + /// + /// Is a no-op if value to be reserved is zero. fn reserve(who: &T::AccountId, value: Self::Balance) -> result::Result<(), DispatchError> { if value.is_zero() { return Ok(()) } - let b = Self::free_balance(who); - if b < value { - Err(Error::::InsufficientBalance)? - } - let new_balance = b - value; - Self::ensure_can_withdraw(who, value, WithdrawReason::Reserve.into(), new_balance)?; - Self::set_reserved_balance(who, Self::reserved_balance(who) + value); - Self::set_free_balance(who, new_balance); + + let old_account = Self::account(who); + let mut account = old_account.clone(); + + account.free = account.free.checked_sub(&value).ok_or(Error::::InsufficientBalance)?; + account.reserved = account.reserved.checked_add(&value).ok_or(Error::::Overflow)?; + Self::ensure_can_withdraw(who, value, WithdrawReason::Reserve.into(), account.free)?; + + Self::set_account(who, &account, &old_account); Ok(()) } - // Unreserve some funds, returning any amount that was unable to be unreserved. - // Is a no-op if the value to be unreserved is zero. + /// Unreserve some funds, returning any amount that was unable to be unreserved. + /// + /// Is a no-op if the value to be unreserved is zero. fn unreserve(who: &T::AccountId, value: Self::Balance) -> Self::Balance { if value.is_zero() { return Zero::zero() } - let b = Self::reserved_balance(who); - let actual = cmp::min(b, value); - Self::set_free_balance(who, Self::free_balance(who) + actual); - Self::set_reserved_balance(who, b - actual); + + let old_account = Self::account(who); + let mut account = old_account.clone(); + + let actual = cmp::min(account.reserved, value); + account.reserved -= actual; + // defensive only: this can never fail since total issuance which is at least free+reserved + // fits into the same datatype. + account.free = account.free.saturating_add(actual); + + Self::set_account(who, &account, &old_account); + value - actual } - // Slash from reserved balance, returning the negative imbalance created, - // and any amount that was unable to be slashed. - // Is a no-op if the value to be slashed is zero. + /// Slash from reserved balance, returning the negative imbalance created, + /// and any amount that was unable to be slashed. + /// + /// Is a no-op if the value to be slashed is zero. fn slash_reserved( who: &T::AccountId, value: Self::Balance ) -> (Self::NegativeImbalance, Self::Balance) { if value.is_zero() { return (NegativeImbalance::zero(), Zero::zero()) } - let b = Self::reserved_balance(who); - let slash = cmp::min(b, value); + + let old_account = Self::account(who); + let mut account = old_account.clone(); + // underflow should never happen, but it if does, there's nothing to be done here. - Self::set_reserved_balance(who, b - slash); - (NegativeImbalance::new(slash), value - slash) + let actual = cmp::min(account.reserved, value); + account.reserved -= actual; + + Self::set_account(who, &account, &old_account); + + (NegativeImbalance::new(actual), value - actual) } - // Move the reserved balance of one account into the free balance of another. - // Is a no-op if the value to be moved is zero. + /// Move the reserved balance of one account into the free balance of another. + /// + /// Is a no-op if the value to be moved is zero. fn repatriate_reserved( slashed: &T::AccountId, beneficiary: &T::AccountId, value: Self::Balance, ) -> result::Result { if value.is_zero() { return Ok (Zero::zero()) } - if Self::total_balance(beneficiary).is_zero() { - Err(Error::::DeadAccount)? + + if slashed == beneficiary { + return Ok(Self::unreserve(slashed, value)); } - let b = Self::reserved_balance(slashed); - let slash = cmp::min(b, value); - Self::set_free_balance(beneficiary, Self::free_balance(beneficiary) + slash); - Self::set_reserved_balance(slashed, b - slash); - Ok(value - slash) + + let old_to_account = Self::account(beneficiary); + let mut to_account = old_to_account.clone(); + ensure!(!to_account.total().is_zero(), Error::::DeadAccount); + + let old_from_account = Self::account(slashed); + let mut from_account = old_from_account.clone(); + let actual = cmp::min(from_account.reserved, value); + + to_account.free = to_account.free.checked_add(&actual).ok_or(Error::::Overflow)?; + from_account.reserved -= actual; + + Self::set_account(slashed, &from_account, &old_from_account); + Self::set_account(beneficiary, &to_account, &old_to_account); + + Ok(value - actual) } } @@ -1243,119 +1313,62 @@ where type Moment = T::BlockNumber; // Set a lock on the balance of `who`. - // Is a no-op if lock amount is zero. + // Is a no-op if lock amount is zero or `reasons` `is_none()`. fn set_lock( id: LockIdentifier, who: &T::AccountId, amount: T::Balance, - until: T::BlockNumber, reasons: WithdrawReasons, ) { - if amount.is_zero() { return } - let now = >::block_number(); - let mut new_lock = Some(BalanceLock { id, amount, until, reasons }); + if amount.is_zero() || reasons.is_none() { return } + let mut new_lock = Some(BalanceLock { id, amount, reasons: reasons.into() }); let mut locks = Self::locks(who).into_iter().filter_map(|l| if l.id == id { new_lock.take() - } else if l.until > now { - Some(l) } else { - None + Some(l) }).collect::>(); if let Some(lock) = new_lock { locks.push(lock) } - >::insert(who, locks); + Self::update_locks(who, &locks[..]); } + // Extend a lock on the balance of `who`. + // Is a no-op if lock amount is zero or `reasons` `is_none()`. fn extend_lock( id: LockIdentifier, who: &T::AccountId, amount: T::Balance, - until: T::BlockNumber, reasons: WithdrawReasons, ) { - let now = >::block_number(); - let mut new_lock = Some(BalanceLock { id, amount, until, reasons }); + if amount.is_zero() || reasons.is_none() { return } + let mut new_lock = Some(BalanceLock { id, amount, reasons: reasons.into() }); let mut locks = Self::locks(who).into_iter().filter_map(|l| if l.id == id { new_lock.take().map(|nl| { BalanceLock { id: l.id, amount: l.amount.max(nl.amount), - until: l.until.max(nl.until), reasons: l.reasons | nl.reasons, } }) - } else if l.until > now { - Some(l) } else { - None + Some(l) }).collect::>(); if let Some(lock) = new_lock { locks.push(lock) } - >::insert(who, locks); + Self::update_locks(who, &locks[..]); } fn remove_lock( id: LockIdentifier, who: &T::AccountId, ) { - let now = >::block_number(); - let locks = Self::locks(who).into_iter().filter_map(|l| - if l.until > now && l.id != id { - Some(l) - } else { - None - }).collect::>(); - >::insert(who, locks); - } -} - -impl, I: Instance> VestingCurrency for Module -where - T::Balance: MaybeSerializeDeserialize + Debug -{ - type Moment = T::BlockNumber; - - /// Get the amount that is currently being vested and cannot be transferred out of this account. - 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())) - } else { - Zero::zero() - } - } - - /// Adds a vesting schedule to a given account. - /// - /// If there already exists a vesting schedule for the given account, an `Err` is returned - /// and nothing is updated. - /// Is a no-op if the amount to be vested is zero. - fn add_vesting_schedule( - who: &T::AccountId, - locked: T::Balance, - per_block: T::Balance, - starting_block: T::BlockNumber - ) -> DispatchResult { - if locked.is_zero() { return Ok(()) } - if >::exists(who) { - Err(Error::::ExistingVestingSchedule)? - } - let vesting_schedule = VestingSchedule { - locked, - per_block, - starting_block - }; - >::insert(who, vesting_schedule); - Ok(()) - } - - /// Remove a vesting schedule for a given account. - fn remove_vesting_schedule(who: &T::AccountId) { - >::remove(who); + let mut locks = Self::locks(who); + locks.retain(|l| l.id != id); + Self::update_locks(who, &locks[..]); } } @@ -1364,6 +1377,7 @@ where T::Balance: MaybeSerializeDeserialize + Debug { fn is_dead_account(who: &T::AccountId) -> bool { - Self::total_balance(who).is_zero() + // this should always be exactly equivalent to `Self::account(who).total().is_zero()` + !Account::::exists(who) } } diff --git a/frame/balances/src/migration.rs b/frame/balances/src/migration.rs new file mode 100644 index 0000000000..4748cf3913 --- /dev/null +++ b/frame/balances/src/migration.rs @@ -0,0 +1,84 @@ +// Copyright 2017-2020 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 . + +//! Some utilities for helping access storage with arbitrary key types. + +use sp_std::prelude::*; +use codec::{Encode, Decode}; +use frame_support::{StorageHasher, Twox128}; + +pub struct StorageIterator { + prefix: [u8; 32], + previous_key: Vec, + drain: bool, + _phantom: ::sp_std::marker::PhantomData, +} + +impl StorageIterator { + pub fn new(module: &[u8], item: &[u8]) -> Self { + let mut prefix = [0u8; 32]; + prefix[0..16].copy_from_slice(&Twox128::hash(module)); + prefix[16..32].copy_from_slice(&Twox128::hash(item)); + Self { prefix, previous_key: prefix[..].to_vec(), drain: false, _phantom: Default::default() } + } + pub fn drain(mut self) -> Self { + self.drain = true; + self + } +} + +impl Iterator for StorageIterator { + type Item = (Vec, T); + + fn next(&mut self) -> Option<(Vec, T)> { + loop { + let maybe_next = sp_io::storage::next_key(&self.previous_key) + .filter(|n| n.starts_with(&self.prefix)); + break match maybe_next { + Some(next) => { + self.previous_key = next.clone(); + let maybe_value = frame_support::storage::unhashed::get::(&next); + match maybe_value { + Some(value) => { + if self.drain { + frame_support::storage::unhashed::kill(&next); + } + Some((self.previous_key[32..].to_vec(), value)) + } + None => continue, + } + } + None => None, + } + } + } +} + +pub fn get_storage_value(module: &[u8], item: &[u8], hash: &[u8]) -> Option { + let mut key = vec![0u8; 32 + hash.len()]; + key[0..16].copy_from_slice(&Twox128::hash(module)); + key[16..32].copy_from_slice(&Twox128::hash(item)); + key[32..].copy_from_slice(hash); + frame_support::storage::unhashed::get::(&key) +} + +pub fn put_storage_value(module: &[u8], item: &[u8], hash: &[u8], value: T) { + let mut key = vec![0u8; 32 + hash.len()]; + key[0..16].copy_from_slice(&Twox128::hash(module)); + key[16..32].copy_from_slice(&Twox128::hash(item)); + key[32..].copy_from_slice(hash); + frame_support::storage::unhashed::put(&key, &value); +} diff --git a/frame/balances/src/mock.rs b/frame/balances/src/mock.rs index 5a3d671e8d..5eb722733f 100644 --- a/frame/balances/src/mock.rs +++ b/frame/balances/src/mock.rs @@ -32,7 +32,6 @@ impl_outer_origin!{ thread_local! { pub(crate) static EXISTENTIAL_DEPOSIT: RefCell = RefCell::new(0); - static TRANSFER_FEE: RefCell = RefCell::new(0); static CREATION_FEE: RefCell = RefCell::new(0); } @@ -41,11 +40,6 @@ impl Get for ExistentialDeposit { fn get() -> u64 { EXISTENTIAL_DEPOSIT.with(|v| *v.borrow()) } } -pub struct TransferFee; -impl Get for TransferFee { - fn get() -> u64 { TRANSFER_FEE.with(|v| *v.borrow()) } -} - pub struct CreationFee; impl Get for CreationFee { fn get() -> u64 { CREATION_FEE.with(|v| *v.borrow()) } @@ -92,32 +86,26 @@ impl pallet_transaction_payment::Trait for Test { } impl Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = (); type DustRemoval = (); type TransferPayment = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } pub struct ExtBuilder { existential_deposit: u64, - transfer_fee: u64, creation_fee: u64, monied: bool, - vesting: bool, } impl Default for ExtBuilder { fn default() -> Self { Self { existential_deposit: 0, - transfer_fee: 0, creation_fee: 0, monied: false, - vesting: false, } } } @@ -126,11 +114,6 @@ impl ExtBuilder { self.existential_deposit = existential_deposit; self } - #[allow(dead_code)] - pub fn transfer_fee(mut self, transfer_fee: u64) -> Self { - self.transfer_fee = transfer_fee; - self - } pub fn creation_fee(mut self, creation_fee: u64) -> Self { self.creation_fee = creation_fee; self @@ -142,13 +125,8 @@ impl ExtBuilder { } self } - pub fn vesting(mut self, vesting: bool) -> Self { - self.vesting = vesting; - self - } pub fn set_associated_consts(&self) { EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); - TRANSFER_FEE.with(|v| *v.borrow_mut() = self.transfer_fee); CREATION_FEE.with(|v| *v.borrow_mut() = self.creation_fee); } pub fn build(self) -> sp_io::TestExternalities { @@ -166,15 +144,6 @@ impl ExtBuilder { } else { vec![] }, - vesting: if self.vesting && self.monied { - vec![ - (1, 0, 10, 5 * self.existential_deposit), - (2, 10, 20, 0), - (12, 10, 20, 5 * self.existential_deposit) - ] - } else { - vec![] - }, }.assimilate_storage(&mut t).unwrap(); t.into() } @@ -187,5 +156,5 @@ pub const CALL: &::Call = &(); /// create a transaction info struct from weight. Handy to avoid building the whole struct. pub fn info_from_weight(w: Weight) -> DispatchInfo { - DispatchInfo { weight: w, ..Default::default() } + DispatchInfo { weight: w, pays_fee: true, ..Default::default() } } diff --git a/frame/balances/src/tests.rs b/frame/balances/src/tests.rs index 175e87aea4..816768901b 100644 --- a/frame/balances/src/tests.rs +++ b/frame/balances/src/tests.rs @@ -18,7 +18,7 @@ use super::*; use mock::{Balances, ExtBuilder, Test, System, info_from_weight, CALL}; -use sp_runtime::traits::{SignedExtension, BadOrigin}; +use sp_runtime::{Fixed64, traits::{SignedExtension, BadOrigin}}; use frame_support::{ assert_noop, assert_ok, assert_err, traits::{LockableCurrency, LockIdentifier, WithdrawReason, WithdrawReasons, @@ -29,13 +29,12 @@ use frame_system::RawOrigin; const ID_1: LockIdentifier = *b"1 "; const ID_2: LockIdentifier = *b"2 "; -const ID_3: LockIdentifier = *b"3 "; #[test] fn basic_locking_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - assert_eq!(Balances::free_balance(&1), 10); - Balances::set_lock(ID_1, &1, 9, u64::max_value(), WithdrawReasons::all()); + assert_eq!(Balances::free_balance(1), 10); + Balances::set_lock(ID_1, &1, 9, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 5, AllowDeath), Error::::LiquidityRestrictions @@ -46,7 +45,7 @@ fn basic_locking_should_work() { #[test] fn partial_locking_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, 5, u64::max_value(), WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, 5, WithdrawReasons::all()); assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); }); } @@ -54,7 +53,7 @@ fn partial_locking_should_work() { #[test] fn lock_removal_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, u64::max_value(), u64::max_value(), WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, u64::max_value(), WithdrawReasons::all()); Balances::remove_lock(ID_1, &1); assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); }); @@ -63,8 +62,8 @@ fn lock_removal_should_work() { #[test] fn lock_replacement_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, u64::max_value(), u64::max_value(), WithdrawReasons::all()); - Balances::set_lock(ID_1, &1, 5, u64::max_value(), WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, u64::max_value(), WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, 5, WithdrawReasons::all()); assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); }); } @@ -72,8 +71,8 @@ fn lock_replacement_should_work() { #[test] fn double_locking_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, 5, u64::max_value(), WithdrawReasons::all()); - Balances::set_lock(ID_2, &1, 5, u64::max_value(), WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, 5, WithdrawReasons::all()); + Balances::set_lock(ID_2, &1, 5, WithdrawReasons::all()); assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); }); } @@ -81,9 +80,8 @@ fn double_locking_should_work() { #[test] fn combination_locking_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, u64::max_value(), 0, WithdrawReasons::none()); - Balances::set_lock(ID_2, &1, 0, u64::max_value(), WithdrawReasons::none()); - Balances::set_lock(ID_3, &1, 0, 0, WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, u64::max_value(), WithdrawReasons::none()); + Balances::set_lock(ID_2, &1, 0, WithdrawReasons::all()); assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); }); } @@ -91,17 +89,17 @@ fn combination_locking_should_work() { #[test] fn lock_value_extension_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, 5, u64::max_value(), WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, 5, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), Error::::LiquidityRestrictions ); - Balances::extend_lock(ID_1, &1, 2, u64::max_value(), WithdrawReasons::all()); + Balances::extend_lock(ID_1, &1, 2, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), Error::::LiquidityRestrictions ); - Balances::extend_lock(ID_1, &1, 8, u64::max_value(), WithdrawReasons::all()); + Balances::extend_lock(ID_1, &1, 8, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 3, AllowDeath), Error::::LiquidityRestrictions @@ -116,23 +114,12 @@ fn lock_reasons_should_work() { .monied(true) .build() .execute_with(|| { - Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Transfer.into()); + pallet_transaction_payment::NextFeeMultiplier::put(Fixed64::from_natural(1)); + Balances::set_lock(ID_1, &1, 10, WithdrawReason::Reserve.into()); assert_noop!( >::transfer(&1, &2, 1, AllowDeath), Error::::LiquidityRestrictions ); - assert_ok!(>::reserve(&1, 1)); - // NOTE: this causes a fee payment. - assert!( as SignedExtension>::pre_dispatch( - ChargeTransactionPayment::from(1), - &1, - CALL, - info_from_weight(1), - 0, - ).is_ok()); - - Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Reserve.into()); - assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); assert_noop!( >::reserve(&1, 1), Error::::LiquidityRestrictions @@ -142,10 +129,17 @@ fn lock_reasons_should_work() { &1, CALL, info_from_weight(1), - 0, + 1, + ).is_err()); + assert!( as SignedExtension>::pre_dispatch( + ChargeTransactionPayment::from(0), + &1, + CALL, + info_from_weight(1), + 1, ).is_ok()); - Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::TransactionPayment.into()); + Balances::set_lock(ID_1, &1, 10, WithdrawReason::TransactionPayment.into()); assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); assert_ok!(>::reserve(&1, 1)); assert!( as SignedExtension>::pre_dispatch( @@ -153,40 +147,33 @@ fn lock_reasons_should_work() { &1, CALL, info_from_weight(1), - 0, + 1, + ).is_err()); + assert!( as SignedExtension>::pre_dispatch( + ChargeTransactionPayment::from(0), + &1, + CALL, + info_from_weight(1), + 1, ).is_err()); }); } -#[test] -fn lock_block_number_should_work() { - ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); - assert_noop!( - >::transfer(&1, &2, 1, AllowDeath), - Error::::LiquidityRestrictions - ); - - System::set_block_number(2); - assert_ok!(>::transfer(&1, &2, 1, AllowDeath)); - }); -} - #[test] fn lock_block_number_extension_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); + Balances::set_lock(ID_1, &1, 10, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), Error::::LiquidityRestrictions ); - Balances::extend_lock(ID_1, &1, 10, 1, WithdrawReasons::all()); + Balances::extend_lock(ID_1, &1, 10, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), Error::::LiquidityRestrictions ); System::set_block_number(2); - Balances::extend_lock(ID_1, &1, 10, 8, WithdrawReasons::all()); + Balances::extend_lock(ID_1, &1, 10, WithdrawReasons::all()); assert_noop!( >::transfer(&1, &2, 3, AllowDeath), Error::::LiquidityRestrictions @@ -197,17 +184,17 @@ fn lock_block_number_extension_should_work() { #[test] fn lock_reasons_extension_should_work() { ExtBuilder::default().existential_deposit(1).monied(true).build().execute_with(|| { - Balances::set_lock(ID_1, &1, 10, 10, WithdrawReason::Transfer.into()); + Balances::set_lock(ID_1, &1, 10, WithdrawReason::Transfer.into()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), Error::::LiquidityRestrictions ); - Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReasons::none()); + Balances::extend_lock(ID_1, &1, 10, WithdrawReasons::none()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), Error::::LiquidityRestrictions ); - Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReason::Reserve.into()); + Balances::extend_lock(ID_1, &1, 10, WithdrawReason::Reserve.into()); assert_noop!( >::transfer(&1, &2, 6, AllowDeath), Error::::LiquidityRestrictions @@ -230,7 +217,7 @@ fn default_indexing_on_new_accounts_should_not_work2() { Error::::ExistentialDeposit, ); assert_eq!(Balances::is_dead_account(&5), true); // account 5 should not exist - assert_eq!(Balances::free_balance(&1), 100); + assert_eq!(Balances::free_balance(1), 100); }); } @@ -247,7 +234,7 @@ fn reserved_balance_should_prevent_reclaim_count() { assert_eq!(Balances::total_balance(&2), 256 * 20); assert_ok!(Balances::reserve(&2, 256 * 19 + 1)); // account 2 becomes mostly reserved - assert_eq!(Balances::free_balance(&2), 0); // "free" account deleted." + assert_eq!(Balances::free_balance(2), 255); // "free" account deleted." assert_eq!(Balances::total_balance(&2), 256 * 20); // reserve still exists. assert_eq!(Balances::is_dead_account(&2), false); assert_eq!(System::account_nonce(&2), 1); @@ -322,11 +309,11 @@ fn dust_account_removal_should_work2() { fn balance_works() { ExtBuilder::default().build().execute_with(|| { let _ = Balances::deposit_creating(&1, 42); - assert_eq!(Balances::free_balance(&1), 42); - assert_eq!(Balances::reserved_balance(&1), 0); + assert_eq!(Balances::free_balance(1), 42); + assert_eq!(Balances::reserved_balance(1), 0); assert_eq!(Balances::total_balance(&1), 42); - assert_eq!(Balances::free_balance(&2), 0); - assert_eq!(Balances::reserved_balance(&2), 0); + assert_eq!(Balances::free_balance(2), 0); + assert_eq!(Balances::reserved_balance(2), 0); assert_eq!(Balances::total_balance(&2), 0); }); } @@ -361,14 +348,14 @@ fn reserving_balance_should_work() { let _ = Balances::deposit_creating(&1, 111); assert_eq!(Balances::total_balance(&1), 111); - assert_eq!(Balances::free_balance(&1), 111); - assert_eq!(Balances::reserved_balance(&1), 0); + assert_eq!(Balances::free_balance(1), 111); + assert_eq!(Balances::reserved_balance(1), 0); assert_ok!(Balances::reserve(&1, 69)); assert_eq!(Balances::total_balance(&1), 111); - assert_eq!(Balances::free_balance(&1), 42); - assert_eq!(Balances::reserved_balance(&1), 69); + assert_eq!(Balances::free_balance(1), 42); + assert_eq!(Balances::reserved_balance(1), 69); }); } @@ -389,7 +376,7 @@ fn deducting_balance_should_work() { ExtBuilder::default().build().execute_with(|| { let _ = Balances::deposit_creating(&1, 111); assert_ok!(Balances::reserve(&1, 69)); - assert_eq!(Balances::free_balance(&1), 42); + assert_eq!(Balances::free_balance(1), 42); }); } @@ -397,10 +384,11 @@ fn deducting_balance_should_work() { fn refunding_balance_should_work() { ExtBuilder::default().build().execute_with(|| { let _ = Balances::deposit_creating(&1, 42); - Balances::set_reserved_balance(&1, 69); + let account = Balances::account(&1); + Balances::set_account(&1, &AccountData { reserved: 69, ..account }, &account); Balances::unreserve(&1, 69); - assert_eq!(Balances::free_balance(&1), 111); - assert_eq!(Balances::reserved_balance(&1), 0); + assert_eq!(Balances::free_balance(1), 111); + assert_eq!(Balances::reserved_balance(1), 0); }); } @@ -410,8 +398,8 @@ fn slashing_balance_should_work() { let _ = Balances::deposit_creating(&1, 111); assert_ok!(Balances::reserve(&1, 69)); assert!(Balances::slash(&1, 69).1.is_zero()); - assert_eq!(Balances::free_balance(&1), 0); - assert_eq!(Balances::reserved_balance(&1), 42); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(1), 42); assert_eq!(>::get(), 42); }); } @@ -422,8 +410,8 @@ fn slashing_incomplete_balance_should_work() { let _ = Balances::deposit_creating(&1, 42); assert_ok!(Balances::reserve(&1, 21)); assert_eq!(Balances::slash(&1, 69).1, 27); - assert_eq!(Balances::free_balance(&1), 0); - assert_eq!(Balances::reserved_balance(&1), 0); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(1), 0); assert_eq!(>::get(), 0); }); } @@ -434,8 +422,8 @@ fn unreserving_balance_should_work() { let _ = Balances::deposit_creating(&1, 111); assert_ok!(Balances::reserve(&1, 111)); Balances::unreserve(&1, 42); - assert_eq!(Balances::reserved_balance(&1), 69); - assert_eq!(Balances::free_balance(&1), 42); + assert_eq!(Balances::reserved_balance(1), 69); + assert_eq!(Balances::free_balance(1), 42); }); } @@ -445,8 +433,8 @@ fn slashing_reserved_balance_should_work() { let _ = Balances::deposit_creating(&1, 111); assert_ok!(Balances::reserve(&1, 111)); assert_eq!(Balances::slash_reserved(&1, 42).1, 0); - assert_eq!(Balances::reserved_balance(&1), 69); - assert_eq!(Balances::free_balance(&1), 0); + assert_eq!(Balances::reserved_balance(1), 69); + assert_eq!(Balances::free_balance(1), 0); assert_eq!(>::get(), 69); }); } @@ -457,8 +445,8 @@ fn slashing_incomplete_reserved_balance_should_work() { let _ = Balances::deposit_creating(&1, 111); assert_ok!(Balances::reserve(&1, 42)); assert_eq!(Balances::slash_reserved(&1, 69).1, 27); - assert_eq!(Balances::free_balance(&1), 69); - assert_eq!(Balances::reserved_balance(&1), 0); + assert_eq!(Balances::free_balance(1), 69); + assert_eq!(Balances::reserved_balance(1), 0); assert_eq!(>::get(), 69); }); } @@ -470,10 +458,10 @@ fn transferring_reserved_balance_should_work() { let _ = Balances::deposit_creating(&2, 1); assert_ok!(Balances::reserve(&1, 110)); assert_ok!(Balances::repatriate_reserved(&1, &2, 41), 0); - assert_eq!(Balances::reserved_balance(&1), 69); - assert_eq!(Balances::free_balance(&1), 0); - assert_eq!(Balances::reserved_balance(&2), 0); - assert_eq!(Balances::free_balance(&2), 42); + assert_eq!(Balances::reserved_balance(1), 69); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(2), 0); + assert_eq!(Balances::free_balance(2), 42); }); } @@ -493,26 +481,26 @@ fn transferring_incomplete_reserved_balance_should_work() { let _ = Balances::deposit_creating(&2, 1); assert_ok!(Balances::reserve(&1, 41)); assert_ok!(Balances::repatriate_reserved(&1, &2, 69), 28); - assert_eq!(Balances::reserved_balance(&1), 0); - assert_eq!(Balances::free_balance(&1), 69); - assert_eq!(Balances::reserved_balance(&2), 0); - assert_eq!(Balances::free_balance(&2), 42); + assert_eq!(Balances::reserved_balance(1), 0); + assert_eq!(Balances::free_balance(1), 69); + assert_eq!(Balances::reserved_balance(2), 0); + assert_eq!(Balances::free_balance(2), 42); }); } #[test] fn transferring_too_high_value_should_not_panic() { ExtBuilder::default().build().execute_with(|| { - >::insert(1, u64::max_value()); - >::insert(2, 1); + Account::::insert(1, AccountData { free: u64::max_value(), .. Default::default() }); + Account::::insert(2, AccountData { free: 1, .. Default::default() }); assert_err!( Balances::transfer(Some(1).into(), 2, u64::max_value()), Error::::Overflow, ); - assert_eq!(Balances::free_balance(&1), u64::max_value()); - assert_eq!(Balances::free_balance(&2), 1); + assert_eq!(Balances::free_balance(1), u64::max_value()); + assert_eq!(Balances::free_balance(2), 1); }); } @@ -524,7 +512,7 @@ fn account_create_on_free_too_low_with_other() { // No-op. let _ = Balances::deposit_creating(&2, 50); - assert_eq!(Balances::free_balance(&2), 0); + assert_eq!(Balances::free_balance(2), 0); assert_eq!(>::get(), 100); }) } @@ -535,7 +523,7 @@ fn account_create_on_free_too_low() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { // No-op. let _ = Balances::deposit_creating(&2, 50); - assert_eq!(Balances::free_balance(&2), 0); + assert_eq!(Balances::free_balance(2), 0); assert_eq!(>::get(), 0); }) } @@ -549,8 +537,8 @@ fn account_removal_on_free_too_low() { let _ = Balances::deposit_creating(&1, 110); let _ = Balances::deposit_creating(&2, 110); - assert_eq!(Balances::free_balance(&1), 110); - assert_eq!(Balances::free_balance(&2), 110); + assert_eq!(Balances::free_balance(1), 110); + assert_eq!(Balances::free_balance(2), 110); assert_eq!(>::get(), 220); // Transfer funds from account 1 of such amount that after this transfer @@ -559,8 +547,8 @@ fn account_removal_on_free_too_low() { assert_ok!(Balances::transfer(Some(1).into(), 2, 20)); // Verify free balance removal of account 1. - assert_eq!(Balances::free_balance(&1), 0); - assert_eq!(Balances::free_balance(&2), 130); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::free_balance(2), 130); // Verify that TotalIssuance tracks balance removal when free balance is too low. assert_eq!(>::get(), 130); @@ -580,160 +568,6 @@ fn transfer_overflow_isnt_exploitable() { }); } -#[test] -fn check_vesting_status() { - ExtBuilder::default() - .existential_deposit(256) - .monied(true) - .vesting(true) - .build() - .execute_with(|| { - assert_eq!(System::block_number(), 1); - let user1_free_balance = Balances::free_balance(&1); - let user2_free_balance = Balances::free_balance(&2); - let user12_free_balance = Balances::free_balance(&12); - assert_eq!(user1_free_balance, 256 * 10); // Account 1 has free balance - assert_eq!(user2_free_balance, 256 * 20); // Account 2 has free balance - assert_eq!(user12_free_balance, 256 * 10); // Account 12 has free balance - let user1_vesting_schedule = VestingSchedule { - locked: 256 * 5, - per_block: 128, // Vesting over 10 blocks - starting_block: 0, - }; - let user2_vesting_schedule = VestingSchedule { - locked: 256 * 20, - per_block: 256, // Vesting over 20 blocks - starting_block: 10, - }; - let user12_vesting_schedule = VestingSchedule { - locked: 256 * 5, - per_block: 64, // Vesting over 20 blocks - starting_block: 10, - }; - assert_eq!(Balances::vesting(&1), Some(user1_vesting_schedule)); // Account 1 has a vesting schedule - assert_eq!(Balances::vesting(&2), Some(user2_vesting_schedule)); // Account 2 has a vesting schedule - assert_eq!(Balances::vesting(&12), Some(user12_vesting_schedule)); // Account 12 has a vesting schedule - - // Account 1 has only 128 units vested from their illiquid 256 * 5 units at block 1 - assert_eq!(Balances::vesting_balance(&1), 128 * 9); - // Account 2 has their full balance locked - assert_eq!(Balances::vesting_balance(&2), user2_free_balance); - // Account 12 has only their illiquid funds locked - assert_eq!(Balances::vesting_balance(&12), user12_free_balance - 256 * 5); - - System::set_block_number(10); - assert_eq!(System::block_number(), 10); - - // Account 1 has fully vested by block 10 - assert_eq!(Balances::vesting_balance(&1), 0); - // Account 2 has started vesting by block 10 - assert_eq!(Balances::vesting_balance(&2), user2_free_balance); - // Account 12 has started vesting by block 10 - assert_eq!(Balances::vesting_balance(&12), user12_free_balance - 256 * 5); - - System::set_block_number(30); - assert_eq!(System::block_number(), 30); - - assert_eq!(Balances::vesting_balance(&1), 0); // Account 1 is still fully vested, and not negative - assert_eq!(Balances::vesting_balance(&2), 0); // Account 2 has fully vested by block 30 - assert_eq!(Balances::vesting_balance(&12), 0); // Account 2 has fully vested by block 30 - - }); -} - -#[test] -fn unvested_balance_should_not_transfer() { - ExtBuilder::default() - .existential_deposit(10) - .monied(true) - .vesting(true) - .build() - .execute_with(|| { - assert_eq!(System::block_number(), 1); - let user1_free_balance = Balances::free_balance(&1); - assert_eq!(user1_free_balance, 100); // Account 1 has free balance - // Account 1 has only 5 units vested at block 1 (plus 50 unvested) - assert_eq!(Balances::vesting_balance(&1), 45); - assert_noop!( - Balances::transfer(Some(1).into(), 2, 56), - Error::::VestingBalance, - ); // Account 1 cannot send more than vested amount - }); -} - -#[test] -fn vested_balance_should_transfer() { - ExtBuilder::default() - .existential_deposit(10) - .monied(true) - .vesting(true) - .build() - .execute_with(|| { - assert_eq!(System::block_number(), 1); - let user1_free_balance = Balances::free_balance(&1); - assert_eq!(user1_free_balance, 100); // Account 1 has free balance - // Account 1 has only 5 units vested at block 1 (plus 50 unvested) - assert_eq!(Balances::vesting_balance(&1), 45); - assert_ok!(Balances::transfer(Some(1).into(), 2, 55)); - }); -} - -#[test] -fn extra_balance_should_transfer() { - ExtBuilder::default() - .existential_deposit(10) - .monied(true) - .vesting(true) - .build() - .execute_with(|| { - assert_eq!(System::block_number(), 1); - assert_ok!(Balances::transfer(Some(3).into(), 1, 100)); - assert_ok!(Balances::transfer(Some(3).into(), 2, 100)); - - let user1_free_balance = Balances::free_balance(&1); - assert_eq!(user1_free_balance, 200); // Account 1 has 100 more free balance than normal - - let user2_free_balance = Balances::free_balance(&2); - assert_eq!(user2_free_balance, 300); // Account 2 has 100 more free balance than normal - - // Account 1 has only 5 units vested at block 1 (plus 150 unvested) - assert_eq!(Balances::vesting_balance(&1), 45); - assert_ok!(Balances::transfer(Some(1).into(), 3, 155)); // Account 1 can send extra units gained - - // Account 2 has no units vested at block 1, but gained 100 - assert_eq!(Balances::vesting_balance(&2), 200); - assert_ok!(Balances::transfer(Some(2).into(), 3, 100)); // Account 2 can send extra units gained - }); -} - -#[test] -fn liquid_funds_should_transfer_with_delayed_vesting() { - ExtBuilder::default() - .existential_deposit(256) - .monied(true) - .vesting(true) - .build() - .execute_with(|| { - assert_eq!(System::block_number(), 1); - let user12_free_balance = Balances::free_balance(&12); - - assert_eq!(user12_free_balance, 2560); // Account 12 has free balance - // Account 12 has liquid funds - assert_eq!(Balances::vesting_balance(&12), user12_free_balance - 256 * 5); - - // Account 12 has delayed vesting - let user12_vesting_schedule = VestingSchedule { - locked: 256 * 5, - per_block: 64, // Vesting over 20 blocks - starting_block: 10, - }; - assert_eq!(Balances::vesting(&12), Some(user12_vesting_schedule)); - - // Account 12 can still send liquid funds - assert_ok!(Balances::transfer(Some(12).into(), 3, 256 * 5)); - }); -} - #[test] fn burn_must_work() { ExtBuilder::default().monied(true).build().execute_with(|| { @@ -766,45 +600,58 @@ fn cannot_set_genesis_value_below_ed() { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); let _ = GenesisConfig:: { balances: vec![(1, 10)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); } #[test] fn dust_moves_between_free_and_reserved() { ExtBuilder::default() - .existential_deposit(100) - .build() - .execute_with(|| { - // Set balance to free and reserved at the existential deposit - assert_ok!(Balances::set_balance(RawOrigin::Root.into(), 1, 100, 100)); - assert_ok!(Balances::set_balance(RawOrigin::Root.into(), 2, 100, 100)); - // Check balance - assert_eq!(Balances::free_balance(1), 100); - assert_eq!(Balances::reserved_balance(1), 100); - assert_eq!(Balances::free_balance(2), 100); - assert_eq!(Balances::reserved_balance(2), 100); - - // Drop 1 free_balance below ED - assert_ok!(Balances::transfer(Some(1).into(), 2, 1)); - // Check balance, the other 99 should move to reserved_balance - assert_eq!(Balances::free_balance(1), 0); - assert_eq!(Balances::reserved_balance(1), 199); - - // Reset accounts - assert_ok!(Balances::set_balance(RawOrigin::Root.into(), 1, 100, 100)); - assert_ok!(Balances::set_balance(RawOrigin::Root.into(), 2, 100, 100)); - - // Drop 2 reserved_balance below ED - Balances::unreserve(&2, 1); - // Check balance, all 100 should move to free_balance - assert_eq!(Balances::free_balance(2), 200); - assert_eq!(Balances::reserved_balance(2), 0); + .existential_deposit(100) + .build() + .execute_with(|| { + // Set balance to free and reserved at the existential deposit + assert_ok!(Balances::set_balance(RawOrigin::Root.into(), 1, 100, 0)); + // Check balance + assert_eq!(Balances::free_balance(1), 100); + assert_eq!(Balances::reserved_balance(1), 0); + + // Reserve some free balance + assert_ok!(Balances::reserve(&1, 50)); + // Check balance, the account should be ok. + assert_eq!(Balances::free_balance(1), 50); + assert_eq!(Balances::reserved_balance(1), 50); + + // Reserve the rest of the free balance + assert_ok!(Balances::reserve(&1, 50)); + // Check balance, the account should be ok. + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(1), 100); + + // Unreserve everything + Balances::unreserve(&1, 100); + // Check balance, all 100 should move to free_balance + assert_eq!(Balances::free_balance(1), 100); + assert_eq!(Balances::reserved_balance(1), 0); + }); +} - // An account with both too little free and reserved is completely killed - assert_ok!(Balances::set_balance(RawOrigin::Root.into(), 1, 99, 99)); - // Check balance is 0 for everything - assert_eq!(Balances::free_balance(1), 0); - assert_eq!(Balances::reserved_balance(1), 0); - }); +#[test] +fn account_deleted_when_just_dust() { + ExtBuilder::default() + .existential_deposit(100) + .build() + .execute_with(|| { + // Set balance to free and reserved at the existential deposit + assert_ok!(Balances::set_balance(RawOrigin::Root.into(), 1, 50, 50)); + // Check balance + assert_eq!(Balances::free_balance(1), 50); + assert_eq!(Balances::reserved_balance(1), 50); + + // Reserve some free balance + let _ = Balances::slash(&1, 1); + // The account should be dead. + assert!(Balances::is_dead_account(&1)); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(1), 0); + }); } diff --git a/frame/contracts/src/account_db.rs b/frame/contracts/src/account_db.rs index 3615673f2d..814983c586 100644 --- a/frame/contracts/src/account_db.rs +++ b/frame/contracts/src/account_db.rs @@ -149,7 +149,7 @@ impl AccountDb for DirectAccountDb { let (imbalance, outcome) = T::Currency::make_free_balance_be(&address, balance); total_imbalance = total_imbalance.merge(imbalance); if let UpdateBalanceOutcome::AccountKilled = outcome { - // Account killed. This will ultimately lead to calling `OnFreeBalanceZero` callback + // Account killed. This will ultimately lead to calling `OnReapAccount` callback // which will make removal of CodeHashOf and AccountStorage for this account. // In order to avoid writing over the deleted properties we `continue` here. continue; diff --git a/frame/contracts/src/exec.rs b/frame/contracts/src/exec.rs index cfbefa2a72..d0033e0bd1 100644 --- a/frame/contracts/src/exec.rs +++ b/frame/contracts/src/exec.rs @@ -573,7 +573,7 @@ impl Token for TransferFeeToken> { let balance_fee = match self.kind { TransferFeeKind::ContractInstantiate => metadata.contract_account_instantiate_fee, TransferFeeKind::AccountCreate => metadata.account_create_fee, - TransferFeeKind::Transfer => metadata.transfer_fee, + TransferFeeKind::Transfer => return metadata.schedule.transfer_cost, }; approx_gas_for_balance(self.gas_price, balance_fee) } diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index ff4a729b2c..bd1e91f1a9 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -125,7 +125,7 @@ use frame_support::{ parameter_types, IsSubType, weights::DispatchInfo, }; -use frame_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency, Get, Time, Randomness}; +use frame_support::traits::{OnReapAccount, OnUnbalanced, Currency, Get, Time, Randomness}; use frame_system::{self as system, ensure_signed, RawOrigin, ensure_root}; use sp_core::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; use pallet_contracts_primitives::{RentProjection, ContractAccessError}; @@ -401,9 +401,6 @@ pub trait Trait: frame_system::Trait { /// to removal of a contract. type SurchargeReward: Get>; - /// The fee required to make a transfer. - type TransferFee: Get>; - /// The fee required to create an account. type CreationFee: Get>; @@ -520,9 +517,6 @@ decl_module! { /// to removal of a contract. const SurchargeReward: BalanceOf = T::SurchargeReward::get(); - /// The fee required to make a transfer. - const TransferFee: BalanceOf = T::TransferFee::get(); - /// The fee required to create an account. const CreationFee: BalanceOf = T::CreationFee::get(); @@ -953,8 +947,8 @@ decl_storage! { } } -impl OnFreeBalanceZero for Module { - fn on_free_balance_zero(who: &T::AccountId) { +impl OnReapAccount for Module { + fn on_reap_account(who: &T::AccountId) { if let Some(ContractInfo::Alive(info)) = >::take(who) { child::kill_storage(&info.trie_id, info.child_trie_unique_id()); } @@ -973,7 +967,6 @@ pub struct Config { pub max_value_size: u32, pub contract_account_instantiate_fee: BalanceOf, pub account_create_fee: BalanceOf, - pub transfer_fee: BalanceOf, } impl Config { @@ -986,7 +979,6 @@ impl Config { max_value_size: T::MaxValueSize::get(), contract_account_instantiate_fee: T::ContractFee::get(), account_create_fee: T::CreationFee::get(), - transfer_fee: T::TransferFee::get(), } } } @@ -1031,6 +1023,9 @@ pub struct Schedule { /// Gas cost per one byte written to the sandbox memory. pub sandbox_data_write_cost: Gas, + /// Cost for a simple balance transfer. + pub transfer_cost: Gas, + /// The maximum number of topics supported by an event. pub max_event_topics: u32, @@ -1069,6 +1064,7 @@ impl Default for Schedule { instantiate_base_cost: 175, sandbox_data_read_cost: 1, sandbox_data_write_cost: 1, + transfer_cost: 100, max_event_topics: 4, max_stack_height: 64 * 1024, max_memory_pages: 16, diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 9a2ef36bb8..5eb7bce48a 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -121,14 +121,12 @@ impl frame_system::Trait for Test { } impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = Contract; - type OnReapAccount = System; + type OnReapAccount = (System, Contract); type OnNewAccount = (); type Event = MetaEvent; type DustRemoval = (); type TransferPayment = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } parameter_types! { @@ -171,7 +169,6 @@ impl Trait for Test { type RentByteFee = RentByteFee; type RentDepositOffset = RentDepositOffset; type SurchargeReward = SurchargeReward; - type TransferFee = TransferFee; type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; @@ -278,7 +275,6 @@ impl ExtBuilder { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig:: { balances: vec![], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); GenesisConfig:: { current_schedule: Schedule { @@ -311,7 +307,7 @@ fn refunds_unused_gas() { assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, Vec::new())); // 2 * 135 - gas price multiplied by the call base fee. - assert_eq!(Balances::free_balance(&ALICE), 100_000_000 - (2 * 135)); + assert_eq!(Balances::free_balance(ALICE), 100_000_000 - (2 * 135)); }); } @@ -1018,7 +1014,7 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); - assert_eq!(Balances::free_balance(&BOB), 100); + assert_eq!(Balances::free_balance(BOB), 100); // Advance blocks initialize_block(10); @@ -1026,7 +1022,7 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent through call assert!(trigger_call()); assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - assert_eq!(Balances::free_balance(&BOB), subsistence_threshold); + assert_eq!(Balances::free_balance(BOB), subsistence_threshold); // Advance blocks initialize_block(20); @@ -1034,7 +1030,7 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - assert_eq!(Balances::free_balance(&BOB), subsistence_threshold); + assert_eq!(Balances::free_balance(BOB), subsistence_threshold); }); // Allowance exceeded @@ -1052,7 +1048,7 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); - assert_eq!(Balances::free_balance(&BOB), 1_000); + assert_eq!(Balances::free_balance(BOB), 1_000); // Advance blocks initialize_block(10); @@ -1061,7 +1057,7 @@ fn removals(trigger_call: impl Fn() -> bool) { assert!(trigger_call()); assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); // Balance should be initial balance - initial rent_allowance - assert_eq!(Balances::free_balance(&BOB), 900); + assert_eq!(Balances::free_balance(BOB), 900); // Advance blocks initialize_block(20); @@ -1069,7 +1065,7 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - assert_eq!(Balances::free_balance(&BOB), 900); + assert_eq!(Balances::free_balance(BOB), 900); }); // Balance reached and inferior to subsistence threshold @@ -1087,12 +1083,12 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); - assert_eq!(Balances::free_balance(&BOB), 50 + Balances::minimum_balance()); + assert_eq!(Balances::free_balance(BOB), 50 + Balances::minimum_balance()); // Transfer funds assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::transfer())); assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); - assert_eq!(Balances::free_balance(&BOB), Balances::minimum_balance()); + assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); // Advance blocks initialize_block(10); @@ -1100,7 +1096,7 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent through call assert!(trigger_call()); assert!(ContractInfoOf::::get(BOB).is_none()); - assert_eq!(Balances::free_balance(&BOB), Balances::minimum_balance()); + assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); // Advance blocks initialize_block(20); @@ -1108,7 +1104,7 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); assert!(ContractInfoOf::::get(BOB).is_none()); - assert_eq!(Balances::free_balance(&BOB), Balances::minimum_balance()); + assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); }); } diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 12d5dfc158..2428d2c154 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -17,6 +17,8 @@ frame-system = { version = "2.0.0", default-features = false, path = "../system" [dev-dependencies] sp-core = { version = "2.0.0", path = "../../primitives/core" } pallet-balances = { version = "2.0.0", path = "../balances" } +sp-storage = { version = "2.0.0", path = "../../primitives/storage" } +hex-literal = "0.2.1" [features] default = ["std"] diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 682ce59f25..da0cccb1d0 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -30,7 +30,7 @@ use frame_support::{ weights::SimpleDispatchInfo, traits::{ Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, Get, - OnFreeBalanceZero, OnUnbalanced + OnReapAccount, OnUnbalanced } }; use frame_system::{self as system, ensure_signed, ensure_root}; @@ -305,6 +305,10 @@ decl_storage! { pub Delegations get(fn delegations): linked_map hasher(blake2_256) T::AccountId => (T::AccountId, Conviction); + /// Accounts for which there are locks in action which may be removed at some point in the + /// future. The value is the block number at which the lock expires and may be removed. + pub Locks get(locks): map hasher(blake2_256) T::AccountId => Option; + /// True if the last referendum tabled was submitted externally. False if it was a public /// proposal. pub LastTabledWasExternal: bool; @@ -364,6 +368,8 @@ decl_event! { PreimageMissing(Hash, ReferendumIndex), /// A registered preimage was removed and the deposit collected by the reaper (last item). PreimageReaped(Hash, AccountId, Balance, AccountId), + /// An account has been unlocked successfully. + Unlocked(AccountId), } } @@ -413,6 +419,10 @@ decl_error! { PreimageInvalid, /// No proposals waiting NoneWaiting, + /// The target account does not have a lock. + NotLocked, + /// The lock on the account to be unlocked has not yet expired. + NotExpired, } } @@ -701,9 +711,9 @@ decl_module! { DEMOCRACY_ID, &who, Bounded::max_value(), - T::BlockNumber::max_value(), WithdrawReason::Transfer.into() ); + Locks::::remove(&who); Self::deposit_event(RawEvent::Delegated(who, to)); } @@ -720,12 +730,12 @@ decl_module! { // Indefinite lock is reduced to the maximum voting lock that could be possible. let now = >::block_number(); let locked_until = now + T::EnactmentPeriod::get() * conviction.lock_periods().into(); + Locks::::insert(&who, locked_until); T::Currency::set_lock( DEMOCRACY_ID, &who, Bounded::max_value(), - locked_until, - WithdrawReason::Transfer.into() + WithdrawReason::Transfer.into(), ); Self::deposit_event(RawEvent::Undelegated(who)); } @@ -796,6 +806,18 @@ decl_module! { >::remove(&proposal_hash); Self::deposit_event(RawEvent::PreimageReaped(proposal_hash, old, deposit, who)); } + + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] + fn unlock(origin, target: T::AccountId) { + ensure_signed(origin)?; + + let expiry = Locks::::get(&target).ok_or(Error::::NotLocked)?; + ensure!(expiry <= system::Module::::block_number(), Error::::NotExpired); + + T::Currency::remove_lock(DEMOCRACY_ID, &target); + Locks::::remove(&target); + Self::deposit_event(RawEvent::Unlocked(target)); + } } } @@ -1081,14 +1103,15 @@ 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 + T::EnactmentPeriod::get() * conviction.lock_periods().into(); + Locks::::insert(&a, locked_until); // ...extend their bondage until at least then. T::Currency::extend_lock( DEMOCRACY_ID, &a, Bounded::max_value(), - locked_until, WithdrawReason::Transfer.into() ); + } Self::clear_referendum(index); @@ -1139,8 +1162,8 @@ impl Module { } } -impl OnFreeBalanceZero for Module { - fn on_free_balance_zero(who: &T::AccountId) { +impl OnReapAccount for Module { + fn on_reap_account(who: &T::AccountId) { >::remove(who) } } @@ -1155,11 +1178,12 @@ mod tests { }; use sp_core::H256; use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup, Bounded, BadOrigin}, + traits::{BlakeTwo256, IdentityLookup, Bounded, BadOrigin, OnInitialize}, testing::Header, Perbill, }; use pallet_balances::{BalanceLock, Error as BalancesError}; use frame_system::EnsureSignedBy; + use sp_storage::Storage; const AYE: Vote = Vote{ aye: true, conviction: Conviction::None }; const NAY: Vote = Vote{ aye: false, conviction: Conviction::None }; @@ -1206,19 +1230,16 @@ mod tests { } parameter_types! { pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } parameter_types! { @@ -1273,7 +1294,6 @@ mod tests { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig::{ balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); GenesisConfig::default().assimilate_storage(&mut t).unwrap(); sp_io::TestExternalities::new(t) @@ -1283,11 +1303,60 @@ mod tests { type Balances = pallet_balances::Module; type Democracy = Module; + #[test] + fn lock_info_via_migration_should_work() { + let mut s = Storage::default(); + use hex_literal::hex; + // A dump of data from the previous version for which we know account 1 has 5 of its 10 + // reserved and 3 of the rest is locked for misc. Account 2 has all 20 locked until block 5 + // for everything and additionally 3 locked for just fees. + let data = vec![ + (hex!["26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac"].to_vec(), hex!["0100000000000000"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850"].to_vec(), hex!["02000000"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7"].to_vec(), hex!["08000000000000000000000000"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc"].to_vec(), hex!["4545454545454545454545454545454545454545454545454545454545454545"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c11874681e47a19e6b29b0a65b9591762ce5143ed30d0261e5d24a3201752506b20f15c"].to_vec(), hex!["4545454545454545454545454545454545454545454545454545454545454545"].to_vec()), + (hex!["3a636f6465"].to_vec(), hex![""].to_vec()), + (hex!["3a65787472696e7369635f696e646578"].to_vec(), hex!["00000000"].to_vec()), + (hex!["3a686561707061676573"].to_vec(), hex!["0800000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc61dbd7d0b561a41d23c2a469ad42fbd70d5438bae826f6fd607413190c37c363b"].to_vec(), hex!["046d697363202020200300000000000000ffffffffffffffff04"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc66cddb367afbd583bb48f9bbd7d5ba3b1d0738b4881b1cddd38169526d8158137"].to_vec(), hex!["0474786665657320200300000000000000ffffffffffffffff01"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6e88b43fded6323ef02ffeffbd8c40846ee09bf316271bd22369659c959dd733a"].to_vec(), hex!["08616c6c20202020200300000000000000ffffffffffffffff1f64656d6f63726163ffffffffffffffff030000000000000002"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f3c22813def93ef32c365b55cb92f10f91dbd7d0b561a41d23c2a469ad42fbd70d5438bae826f6fd607413190c37c363b"].to_vec(), hex!["0500000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80"].to_vec(), hex!["d200000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f5f27b51b5ec208ee9cb25b55d8728243b8788bb218b185b63e3e92653953f29b6b143fb8cf5159fc908632e6fe490501"].to_vec(), hex!["1e0000000000000006000000000000000200000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b41dbd7d0b561a41d23c2a469ad42fbd70d5438bae826f6fd607413190c37c363b"].to_vec(), hex!["0500000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b46cddb367afbd583bb48f9bbd7d5ba3b1d0738b4881b1cddd38169526d8158137"].to_vec(), hex!["1e00000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4b8788bb218b185b63e3e92653953f29b6b143fb8cf5159fc908632e6fe490501"].to_vec(), hex!["3c00000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4e88b43fded6323ef02ffeffbd8c40846ee09bf316271bd22369659c959dd733a"].to_vec(), hex!["1400000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4e96760d274653a39b429a87ebaae9d3aa4fdf58b9096cf0bebc7c4e5a4c2ed8d"].to_vec(), hex!["2800000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4effb728943197fd12e694cbf3f3ede28fbf7498b0370c6dfa0013874b417c178"].to_vec(), hex!["3200000000000000"].to_vec()), + (hex!["f2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e"].to_vec(), hex!["00000000"].to_vec()), + (hex!["f2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6"].to_vec(), hex!["00000000"].to_vec()), + (hex!["f2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13"].to_vec(), hex!["00000000"].to_vec()), + ]; + s.top = data.into_iter().collect(); + sp_io::TestExternalities::new(s).execute_with(|| { + Balances::on_initialize(1); + assert_eq!(Balances::free_balance(1), 5); + assert_eq!(Balances::reserved_balance(1), 5); + assert_eq!(Balances::usable_balance(&1), 2); + assert_eq!(Balances::usable_balance_for_fees(&1), 5); + assert_eq!(Balances::free_balance(2), 20); + assert_eq!(Balances::reserved_balance(2), 0); + assert_eq!(Balances::usable_balance(&2), 0); + assert_eq!(Balances::usable_balance_for_fees(&2), 17); + fast_forward_to(5); + assert_ok!(Democracy::unlock(Origin::signed(2), 2)); + assert_eq!(Balances::usable_balance(&2), 17); + }); + } + #[test] fn params_should_work() { new_test_ext().execute_with(|| { assert_eq!(Democracy::referendum_count(), 0); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(42), 0); assert_eq!(Balances::total_issuance(), 210); }); } @@ -1353,7 +1422,7 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(42), 0); }); } @@ -1405,8 +1474,8 @@ mod tests { next_block(); assert_ok!(Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2))); - assert_eq!(Balances::reserved_balance(6), 0); assert_eq!(Balances::free_balance(6), 60); + assert_eq!(Balances::reserved_balance(6), 0); }); } @@ -1869,7 +1938,7 @@ mod tests { // referendum passes and wait another two blocks for enactment. fast_forward_to(6); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -1942,7 +2011,7 @@ mod tests { assert_eq!(Democracy::tally(r), (1, 0, 1)); fast_forward_to(6); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -1967,7 +2036,7 @@ mod tests { fast_forward_to(6); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -1993,7 +2062,7 @@ mod tests { fast_forward_to(6); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2020,7 +2089,7 @@ mod tests { fast_forward_to(6); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2048,7 +2117,7 @@ mod tests { fast_forward_to(6); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2080,7 +2149,7 @@ mod tests { fast_forward_to(6); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2093,9 +2162,9 @@ 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!(Balances::free_balance(&1), 5); - assert_eq!(Balances::free_balance(&2), 15); - assert_eq!(Balances::free_balance(&5), 35); + assert_eq!(Balances::free_balance(1), 5); + assert_eq!(Balances::free_balance(2), 15); + assert_eq!(Balances::free_balance(5), 35); }); } @@ -2109,9 +2178,9 @@ mod tests { assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_ok!(Democracy::second(Origin::signed(5), 0)); 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); + assert_eq!(Balances::free_balance(1), 10); + assert_eq!(Balances::free_balance(2), 20); + assert_eq!(Balances::free_balance(5), 50); }); } @@ -2179,7 +2248,7 @@ mod tests { assert_eq!(Democracy::tally(r2), (1, 0, 1)); next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); assert_ok!(Democracy::vote(Origin::signed(1), r1, AYE)); assert_eq!(Democracy::voters_for(r1), vec![1]); @@ -2187,7 +2256,7 @@ mod tests { assert_eq!(Democracy::tally(r1), (1, 0, 1)); next_block(); - assert_eq!(Balances::free_balance(&42), 3); + assert_eq!(Balances::free_balance(42), 3); }); } @@ -2210,7 +2279,7 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2230,7 +2299,7 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(42), 0); }); } @@ -2253,7 +2322,7 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(42), 0); }); } @@ -2280,7 +2349,7 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2304,11 +2373,11 @@ mod tests { assert_eq!(Democracy::tally(r), (21, 0, 21)); next_block(); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(42), 0); next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2330,14 +2399,14 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(42), 0); }); } #[test] fn passing_low_turnout_voting_should_work() { new_test_ext().execute_with(|| { - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(42), 0); assert_eq!(Balances::total_issuance(), 210); System::set_block_number(1); @@ -2356,7 +2425,7 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } @@ -2399,24 +2468,44 @@ mod tests { assert_eq!(Balances::locks(2), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), - until: 18, - reasons: WithdrawReason::Transfer.into() + reasons: pallet_balances::Reasons::Misc, }]); + assert_eq!(Democracy::locks(2), Some(18)); assert_eq!(Balances::locks(3), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), - until: 10, - reasons: WithdrawReason::Transfer.into() + reasons: pallet_balances::Reasons::Misc, }]); + assert_eq!(Democracy::locks(3), Some(10)); assert_eq!(Balances::locks(4), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), - until: 6, - reasons: WithdrawReason::Transfer.into() + reasons: pallet_balances::Reasons::Misc, }]); + assert_eq!(Democracy::locks(4), Some(6)); assert_eq!(Balances::locks(5), vec![]); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); + + assert_noop!(Democracy::unlock(Origin::signed(1), 1), Error::::NotLocked); + + fast_forward_to(5); + assert_noop!(Democracy::unlock(Origin::signed(1), 4), Error::::NotExpired); + fast_forward_to(6); + assert_ok!(Democracy::unlock(Origin::signed(1), 4)); + assert_noop!(Democracy::unlock(Origin::signed(1), 4), Error::::NotLocked); + + fast_forward_to(9); + assert_noop!(Democracy::unlock(Origin::signed(1), 3), Error::::NotExpired); + fast_forward_to(10); + assert_ok!(Democracy::unlock(Origin::signed(1), 3)); + assert_noop!(Democracy::unlock(Origin::signed(1), 3), Error::::NotLocked); + + fast_forward_to(17); + assert_noop!(Democracy::unlock(Origin::signed(1), 2), Error::::NotExpired); + fast_forward_to(18); + assert_ok!(Democracy::unlock(Origin::signed(1), 2)); + assert_noop!(Democracy::unlock(Origin::signed(1), 2), Error::::NotLocked); }); } @@ -2453,7 +2542,7 @@ mod tests { next_block(); next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(42), 2); }); } } diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index e022b24f01..33d4c46e91 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -83,7 +83,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use sp_std::prelude::*; -use sp_runtime::{print, DispatchResult, DispatchError, traits::{Zero, StaticLookup, Bounded, Convert}}; +use sp_runtime::{print, DispatchResult, DispatchError, traits::{Zero, StaticLookup, Convert}}; use frame_support::{ decl_storage, decl_event, ensure, decl_module, decl_error, weights::SimpleDispatchInfo, traits::{ @@ -260,7 +260,6 @@ decl_module! { MODULE_ID, &who, locked_balance, - T::BlockNumber::max_value(), WithdrawReasons::except(WithdrawReason::TransactionPayment), ); >::insert(&who, locked_balance); @@ -816,20 +815,17 @@ mod tests { parameter_types! { pub const ExistentialDeposit: u64 = 1; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; type OnNewAccount = (); - type OnFreeBalanceZero = (); type OnReapAccount = System; type Event = Event; type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } @@ -989,7 +985,6 @@ mod tests { (5, 50 * self.balance_factor), (6, 60 * self.balance_factor) ], - vesting: vec![], }), }.build_storage().unwrap().into() } diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index 504aa5d8a0..899fcfac8a 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -26,7 +26,7 @@ use sp_std::prelude::*; use sp_runtime::{ RuntimeDebug, DispatchResult, print, - traits::{Zero, One, StaticLookup, Bounded, Saturating}, + traits::{Zero, One, StaticLookup, Saturating}, }; use frame_support::{ decl_storage, decl_event, ensure, decl_module, decl_error, @@ -894,7 +894,6 @@ impl Module { MODULE_ID, &who, locked_balance, - T::BlockNumber::max_value(), WithdrawReasons::all(), ); diff --git a/frame/elections/src/mock.rs b/frame/elections/src/mock.rs index 178637e088..3274dd57b4 100644 --- a/frame/elections/src/mock.rs +++ b/frame/elections/src/mock.rs @@ -58,19 +58,16 @@ impl frame_system::Trait for Test { parameter_types! { pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; type OnNewAccount = (); - type OnFreeBalanceZero = (); type OnReapAccount = System; type Event = Event; type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } @@ -222,7 +219,6 @@ impl ExtBuilder { (5, 50 * self.balance_factor), (6, 60 * self.balance_factor) ], - vesting: vec![], }), elections: Some(elections::GenesisConfig::{ members: vec![], @@ -270,7 +266,8 @@ pub(crate) fn create_candidate(i: u64, index: u32) { } pub(crate) fn balances(who: &u64) -> (u64, u64) { - (Balances::free_balance(who), Balances::reserved_balance(who)) + let a = Balances::account(who); + (a.free, a.reserved) } pub(crate) fn locks(who: &u64) -> Vec { diff --git a/frame/elections/src/tests.rs b/frame/elections/src/tests.rs index 48161bcee4..e26f031290 100644 --- a/frame/elections/src/tests.rs +++ b/frame/elections/src/tests.rs @@ -1179,14 +1179,14 @@ fn election_present_when_presenter_is_poor_should_not_work() { // -3 assert_ok!(Elections::submit_candidacy(Origin::signed(1), 0)); - assert_eq!(Balances::free_balance(&1), 12); + assert_eq!(Balances::free_balance(1), 12); // -2 -5 assert_ok!(Elections::set_approvals(Origin::signed(1), vec![true], 0, 0, 15)); assert_ok!(Elections::end_block(System::block_number())); System::set_block_number(6); - assert_eq!(Balances::free_balance(&1), 5); - assert_eq!(Balances::reserved_balance(&1), 5); + assert_eq!(Balances::free_balance(1), 5); + assert_eq!(Balances::reserved_balance(1), 5); if p > 5 { assert_noop!(Elections::present_winner( Origin::signed(1), 1, 10, 0), diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index 56d3de14dc..b3a86b6acd 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -690,19 +690,16 @@ mod tests { } parameter_types! { pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } impl Trait for Test { diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index cafb9fad27..936da70211 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -454,19 +454,16 @@ mod tests { } parameter_types! { pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Runtime { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = MetaEvent; type DustRemoval = (); type TransferPayment = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } @@ -528,7 +525,6 @@ mod tests { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig:: { balances: vec![(1, 211)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); let xt = sp_runtime::testing::TestXt(sign_extra(1, 0, 0), Call::Balances(BalancesCall::transfer(2, 69))); let weight = xt.get_dispatch_info().weight as u64; @@ -552,7 +548,6 @@ mod tests { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig:: { balances: vec![(1, 111 * balance_factor)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); t.into() } @@ -564,7 +559,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("c6b01b27df520ba23adb96e7fc032acb7c586ba1b477c6282de43184111f2091").into(), + state_root: hex!("a0b84fec49718caf59350dab6ec2993f12db399a7cccdb80f3cf79618ed93bd8").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, @@ -711,7 +706,6 @@ mod tests { id, &1, 110, - Bounded::max_value(), lock, ); let xt = sp_runtime::testing::TestXt( diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index 8b7668dc12..3b8ebe0535 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -427,10 +427,9 @@ decl_module! { } #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] -pub struct BalanceLock { +pub struct BalanceLock { pub id: LockIdentifier, pub amount: Balance, - pub until: BlockNumber, pub reasons: WithdrawReasons, } @@ -459,7 +458,7 @@ decl_storage! { /// Any liquidity locks on some account balances. pub Locks get(fn locks): - map hasher(blake2_256) T::AccountId => Vec>; + map hasher(blake2_256) T::AccountId => Vec>; /// The identity of the asset which is the one that is designated for the chain's staking system. pub StakingAssetId get(fn staking_asset_id) config(): T::AssetId; @@ -796,10 +795,8 @@ impl Module { if locks.is_empty() { return Ok(()); } - let now = >::block_number(); if Self::locks(who) - .into_iter() - .all(|l| now >= l.until || new_balance >= l.amount || !l.reasons.intersects(reasons)) + .into_iter().all(|l| new_balance >= l.amount || !l.reasons.intersects(reasons)) { Ok(()) } else { @@ -825,14 +822,11 @@ impl Module { id: LockIdentifier, who: &T::AccountId, amount: T::Balance, - until: T::BlockNumber, reasons: WithdrawReasons, ) { - let now = >::block_number(); let mut new_lock = Some(BalanceLock { id, amount, - until, reasons, }); let mut locks = >::locks(who) @@ -840,10 +834,8 @@ impl Module { .filter_map(|l| { if l.id == id { new_lock.take() - } else if l.until > now { - Some(l) } else { - None + Some(l) } }) .collect::>(); @@ -857,14 +849,11 @@ impl Module { id: LockIdentifier, who: &T::AccountId, amount: T::Balance, - until: T::BlockNumber, reasons: WithdrawReasons, ) { - let now = >::block_number(); let mut new_lock = Some(BalanceLock { id, amount, - until, reasons, }); let mut locks = >::locks(who) @@ -874,13 +863,10 @@ impl Module { new_lock.take().map(|nl| BalanceLock { id: l.id, amount: l.amount.max(nl.amount), - until: l.until.max(nl.until), reasons: l.reasons | nl.reasons, }) - } else if l.until > now { - Some(l) } else { - None + Some(l) } }) .collect::>(); @@ -891,11 +877,8 @@ impl Module { } fn remove_lock(id: LockIdentifier, who: &T::AccountId) { - let now = >::block_number(); - let locks = >::locks(who) - .into_iter() - .filter_map(|l| if l.until > now && l.id != id { Some(l) } else { None }) - .collect::>(); + let mut locks = >::locks(who); + locks.retain(|l| l.id != id); >::insert(who, locks); } } @@ -1339,20 +1322,18 @@ where id: LockIdentifier, who: &T::AccountId, amount: T::Balance, - until: T::BlockNumber, reasons: WithdrawReasons, ) { - >::set_lock(id, who, amount, until, reasons) + >::set_lock(id, who, amount, reasons) } fn extend_lock( id: LockIdentifier, who: &T::AccountId, amount: T::Balance, - until: T::BlockNumber, reasons: WithdrawReasons, ) { - >::extend_lock(id, who, amount, until, reasons) + >::extend_lock(id, who, amount, reasons) } fn remove_lock(id: LockIdentifier, who: &T::AccountId) { diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index b16e87ff81..56960b2d1d 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -925,19 +925,16 @@ mod tests { } parameter_types! { pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } parameter_types! { @@ -981,7 +978,6 @@ mod tests { (20, 100), (30, 100), ], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index 1067e9a5de..82aea43ad4 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -288,19 +288,16 @@ mod tests { } parameter_types! { pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } parameter_types! { @@ -334,7 +331,6 @@ mod tests { (1, 10), (2, 10), ], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); t.into() } @@ -359,9 +355,9 @@ mod tests { ); assert_ok!(Nicks::set_name(Origin::signed(2), b"Dave".to_vec())); - assert_eq!(Balances::reserved_balance(&2), 2); + assert_eq!(Balances::reserved_balance(2), 2); assert_ok!(Nicks::force_name(Origin::signed(1), 2, b"Dr. David Brubeck, III".to_vec())); - assert_eq!(Balances::reserved_balance(&2), 2); + assert_eq!(Balances::reserved_balance(2), 2); assert_eq!(>::get(2).unwrap(), (b"Dr. David Brubeck, III".to_vec(), 2)); }); } @@ -370,18 +366,18 @@ mod tests { fn normal_operation_should_work() { new_test_ext().execute_with(|| { assert_ok!(Nicks::set_name(Origin::signed(1), b"Gav".to_vec())); - assert_eq!(Balances::reserved_balance(&1), 2); - assert_eq!(Balances::free_balance(&1), 8); + assert_eq!(Balances::reserved_balance(1), 2); + assert_eq!(Balances::free_balance(1), 8); assert_eq!(>::get(1).unwrap().0, b"Gav".to_vec()); assert_ok!(Nicks::set_name(Origin::signed(1), b"Gavin".to_vec())); - assert_eq!(Balances::reserved_balance(&1), 2); - assert_eq!(Balances::free_balance(&1), 8); + assert_eq!(Balances::reserved_balance(1), 2); + assert_eq!(Balances::free_balance(1), 8); assert_eq!(>::get(1).unwrap().0, b"Gavin".to_vec()); assert_ok!(Nicks::clear_name(Origin::signed(1))); - assert_eq!(Balances::reserved_balance(&1), 0); - assert_eq!(Balances::free_balance(&1), 10); + assert_eq!(Balances::reserved_balance(1), 0); + assert_eq!(Balances::free_balance(1), 10); }); } diff --git a/frame/recovery/src/mock.rs b/frame/recovery/src/mock.rs index be9ed5c97e..fa074e1faf 100644 --- a/frame/recovery/src/mock.rs +++ b/frame/recovery/src/mock.rs @@ -81,20 +81,17 @@ impl frame_system::Trait for Test { parameter_types! { pub const ExistentialDeposit: u64 = 1; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u128; - type OnFreeBalanceZero = (); type OnReapAccount = (System, Recovery); type OnNewAccount = (); type Event = TestEvent; type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } @@ -126,7 +123,6 @@ pub fn new_test_ext() -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig:: { balances: vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/frame/recovery/src/tests.rs b/frame/recovery/src/tests.rs index 76f05156ef..cfc8e25b12 100644 --- a/frame/recovery/src/tests.rs +++ b/frame/recovery/src/tests.rs @@ -35,7 +35,7 @@ fn basic_setup_works() { assert_eq!(Recovery::active_recovery(&1, &2), None); assert_eq!(Recovery::recovery_config(&1), None); // Everyone should have starting balance of 100 - assert_eq!(Balances::free_balance(&1), 100); + assert_eq!(Balances::free_balance(1), 100); }); } @@ -219,7 +219,7 @@ fn initiate_recovery_handles_basic_errors() { assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); assert_noop!(Recovery::initiate_recovery(Origin::signed(1), 5), Error::::AlreadyStarted); // No double deposit - assert_eq!(Balances::reserved_balance(&1), 10); + assert_eq!(Balances::reserved_balance(1), 10); }); } @@ -234,7 +234,7 @@ fn initiate_recovery_works() { // Recovery can be initiated assert_ok!(Recovery::initiate_recovery(Origin::signed(1), 5)); // Deposit is reserved - assert_eq!(Balances::reserved_balance(&1), 10); + assert_eq!(Balances::reserved_balance(1), 10); // Recovery status object is created correctly let recovery_status = ActiveRecovery { created: 1, diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index dd59bbc84f..fa8b11e69e 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -47,7 +47,6 @@ parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } ord_parameter_types! { @@ -76,14 +75,12 @@ impl frame_system::Trait for Test { impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } @@ -144,7 +141,6 @@ pub fn new_test_ext() -> sp_io::TestExternalities { (40, 500_000), (99, 1), ], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); GenesisConfig::{ pool: vec![ diff --git a/frame/scored-pool/src/tests.rs b/frame/scored-pool/src/tests.rs index d8c887f4ec..4b21339505 100644 --- a/frame/scored-pool/src/tests.rs +++ b/frame/scored-pool/src/tests.rs @@ -30,8 +30,8 @@ type Balances = pallet_balances::Module; fn query_membership_works() { new_test_ext().execute_with(|| { assert_eq!(ScoredPool::members(), vec![20, 40]); - assert_eq!(Balances::reserved_balance(&31), CandidateDeposit::get()); - assert_eq!(Balances::reserved_balance(&40), CandidateDeposit::get()); + assert_eq!(Balances::reserved_balance(31), CandidateDeposit::get()); + assert_eq!(Balances::reserved_balance(40), CandidateDeposit::get()); assert_eq!(MEMBERS.with(|m| m.borrow().clone()), vec![20, 40]); }); } @@ -61,7 +61,7 @@ fn submit_candidacy_works() { assert_eq!(fetch_from_pool(15), Some((who, None))); // then - assert_eq!(Balances::reserved_balance(&who), CandidateDeposit::get()); + assert_eq!(Balances::reserved_balance(who), CandidateDeposit::get()); }); } @@ -117,7 +117,7 @@ fn kicking_works() { new_test_ext().execute_with(|| { // given let who = 40; - assert_eq!(Balances::reserved_balance(&who), CandidateDeposit::get()); + assert_eq!(Balances::reserved_balance(who), CandidateDeposit::get()); assert_eq!(find_in_pool(who), Some(0)); // when @@ -128,7 +128,7 @@ fn kicking_works() { assert_eq!(find_in_pool(who), None); assert_eq!(ScoredPool::members(), vec![20, 31]); assert_eq!(MEMBERS.with(|m| m.borrow().clone()), ScoredPool::members()); - assert_eq!(Balances::reserved_balance(&who), 0); // deposit must have been returned + assert_eq!(Balances::reserved_balance(who), 0); // deposit must have been returned }); } @@ -246,7 +246,7 @@ fn withdraw_scored_candidacy_must_work() { new_test_ext().execute_with(|| { // given let who = 40; - assert_eq!(Balances::reserved_balance(&who), CandidateDeposit::get()); + assert_eq!(Balances::reserved_balance(who), CandidateDeposit::get()); // when let index = find_in_pool(who).expect("entity must be in pool") as u32; @@ -255,7 +255,7 @@ fn withdraw_scored_candidacy_must_work() { // then assert_eq!(fetch_from_pool(who), None); assert_eq!(ScoredPool::members(), vec![20, 31]); - assert_eq!(Balances::reserved_balance(&who), 0); + assert_eq!(Balances::reserved_balance(who), 0); }); } diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index f98e334cbb..a18d55d26c 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -106,7 +106,7 @@ use frame_support::weights::SimpleDispatchInfo; use sp_runtime::traits::{Convert, Zero, Member, OpaqueKeys}; use sp_staking::SessionIndex; use frame_support::{dispatch, ConsensusEngineId, decl_module, decl_event, decl_storage, decl_error}; -use frame_support::{ensure, traits::{OnFreeBalanceZero, Get, FindAuthor, ValidatorRegistration}, Parameter}; +use frame_support::{ensure, traits::{OnReapAccount, Get, FindAuthor, ValidatorRegistration}, Parameter}; use frame_system::{self as system, ensure_signed}; #[cfg(test)] @@ -676,8 +676,8 @@ impl Module { } } -impl OnFreeBalanceZero for Module { - fn on_free_balance_zero(who: &T::ValidatorId) { +impl OnReapAccount for Module { + fn on_reap_account(who: &T::ValidatorId) { Self::prune_dead_keys(who); } } @@ -754,7 +754,7 @@ mod tests { let id = DUMMY; assert_eq!(Session::key_owner(id, UintAuthorityId(1).get_raw(id)), Some(1)); - Session::on_free_balance_zero(&1); + Session::on_reap_account(&1); assert_eq!(Session::load_keys(&1), None); assert_eq!(Session::key_owner(id, UintAuthorityId(1).get_raw(id)), None); }) diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index b8f249f35c..5c772478c8 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -51,7 +51,6 @@ parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } @@ -81,13 +80,11 @@ impl frame_system::Trait for Test { impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; type OnReapAccount = System; } @@ -146,7 +143,6 @@ impl EnvBuilder { self.balances.push((Society::account_id(), self.balance.max(self.pot))); pallet_balances::GenesisConfig:: { balances: self.balances, - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); GenesisConfig::{ members: self.members, diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 757f75bf0a..ca2a2bf092 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -261,7 +261,7 @@ use frame_support::{ decl_module, decl_event, decl_storage, ensure, decl_error, weights::SimpleDispatchInfo, traits::{ - Currency, OnFreeBalanceZero, LockIdentifier, LockableCurrency, + Currency, LockIdentifier, LockableCurrency, WithdrawReasons, OnUnbalanced, Imbalance, Get, Time } }; @@ -284,6 +284,7 @@ use sp_runtime::{Serialize, Deserialize}; use frame_system::{self as system, ensure_signed, ensure_root}; use sp_phragmen::ExtendedBalance; +use frame_support::traits::OnReapAccount; const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4; const MAX_NOMINATIONS: usize = 16; @@ -1286,7 +1287,6 @@ impl Module { STAKING_ID, &ledger.stash, ledger.total, - T::BlockNumber::max_value(), WithdrawReasons::all(), ); >::insert(controller, ledger); @@ -1682,8 +1682,8 @@ impl SessionManager> } } -impl OnFreeBalanceZero for Module { - fn on_free_balance_zero(stash: &T::AccountId) { +impl OnReapAccount for Module { + fn on_reap_account(stash: &T::AccountId) { Self::ensure_storage_upgraded(); Self::kill_stash(stash); } diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 8aa20c19c6..3b2443c2ce 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -140,19 +140,16 @@ impl frame_system::Trait for Test { type ModuleToIndex = (); } parameter_types! { - pub const TransferFee: Balance = 0; pub const CreationFee: Balance = 0; } impl pallet_balances::Trait for Test { type Balance = Balance; - type OnFreeBalanceZero = Staking; - type OnReapAccount = System; + type OnReapAccount = (System, Staking); type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } parameter_types! { @@ -323,7 +320,6 @@ impl ExtBuilder { // This allow us to have a total_payout different from 0. (999, 1_000_000_000_000), ], - vesting: vec![], }.assimilate_storage(&mut storage); let stake_21 = if self.fair { 1000 } else { 2000 }; diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 43a2d00791..a9b6e16598 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -110,8 +110,8 @@ fn basic_setup_works() { assert_eq!(Staking::current_era(), 0); // Account 10 has `balance_factor` free balance - assert_eq!(Balances::free_balance(&10), 1); - assert_eq!(Balances::free_balance(&10), 1); + assert_eq!(Balances::free_balance(10), 1); + assert_eq!(Balances::free_balance(10), 1); // New era is not being forced assert_eq!(Staking::force_era(), Forcing::NotForcing); @@ -759,7 +759,7 @@ fn cannot_transfer_staked_balance() { // Confirm account 11 is stashed assert_eq!(Staking::bonded(&11), Some(10)); // Confirm account 11 has some free balance - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); // Confirm account 11 (via controller 10) is totally staked assert_eq!(Staking::stakers(&11).total, 1000); // Confirm account 11 cannot transfer as a result @@ -788,7 +788,7 @@ fn cannot_transfer_staked_balance_2() { // Confirm account 21 is stashed assert_eq!(Staking::bonded(&21), Some(20)); // Confirm account 21 has some free balance - assert_eq!(Balances::free_balance(&21), 2000); + assert_eq!(Balances::free_balance(21), 2000); // Confirm account 21 (via controller 20) is totally staked assert_eq!(Staking::stakers(&21).total, 1000); // Confirm account 21 can transfer at most 1000 @@ -811,7 +811,7 @@ fn cannot_reserve_staked_balance() { // Confirm account 11 is stashed assert_eq!(Staking::bonded(&11), Some(10)); // Confirm account 11 has some free balance - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); // Confirm account 11 (via controller 10) is totally staked assert_eq!(Staking::stakers(&11).own, 1000); // Confirm account 11 cannot transfer as a result @@ -838,9 +838,9 @@ fn reward_destination_works() { // Check that account 11 is a validator assert!(Staking::current_elected().contains(&11)); // Check the balance of the validator account - assert_eq!(Balances::free_balance(&10), 1); + assert_eq!(Balances::free_balance(10), 1); // Check the balance of the stash account - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); // Check how much is at stake assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, @@ -859,7 +859,7 @@ fn reward_destination_works() { // 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 + total_payout_0); + assert_eq!(Balances::free_balance(11), 1000 + total_payout_0); // Check that amount at stake increased accordingly assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, @@ -881,7 +881,7 @@ fn reward_destination_works() { // Check that RewardDestination is Stash assert_eq!(Staking::payee(&11), RewardDestination::Stash); // Check that reward went to the stash account - assert_eq!(Balances::free_balance(&11), 1000 + total_payout_0 + total_payout_1); + assert_eq!(Balances::free_balance(11), 1000 + total_payout_0 + total_payout_1); // Record this value let recorded_stash_balance = 1000 + total_payout_0 + total_payout_1; // Check that amount at stake is NOT increased @@ -896,7 +896,7 @@ fn reward_destination_works() { >::insert(&11, RewardDestination::Controller); // Check controller balance - assert_eq!(Balances::free_balance(&10), 1); + assert_eq!(Balances::free_balance(10), 1); // Compute total payout now for whole duration as other parameter won't change let total_payout_2 = current_total_payout_for_duration(3000); @@ -908,7 +908,7 @@ fn reward_destination_works() { // 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 + total_payout_2); + assert_eq!(Balances::free_balance(10), 1 + total_payout_2); // Check that amount at stake is NOT increased assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, @@ -917,7 +917,7 @@ fn reward_destination_works() { unlocking: vec![], })); // Check that amount in staked account is NOT increased. - assert_eq!(Balances::free_balance(&11), recorded_stash_balance); + assert_eq!(Balances::free_balance(11), recorded_stash_balance); }); } @@ -1422,9 +1422,9 @@ fn on_free_balance_zero_stash_removes_validator() { // Tests that storage items are untouched when controller is empty ExtBuilder::default().existential_deposit(10).build().execute_with(|| { // Check the balance of the validator account - assert_eq!(Balances::free_balance(&10), 256); + assert_eq!(Balances::free_balance(10), 256); // Check the balance of the stash account - assert_eq!(Balances::free_balance(&11), 256000); + assert_eq!(Balances::free_balance(11), 256000); // Check these two accounts are bonded assert_eq!(Staking::bonded(&11), Some(10)); @@ -1442,7 +1442,7 @@ fn on_free_balance_zero_stash_removes_validator() { 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); + assert_eq!(Balances::free_balance(11), 256000); // Check these two accounts are still bonded assert_eq!(Staking::bonded(&11), Some(10)); @@ -1476,9 +1476,9 @@ fn on_free_balance_zero_stash_removes_nominator() { // Check that account 10 is a nominator assert!(>::exists(11)); // Check the balance of the nominator account - assert_eq!(Balances::free_balance(&10), 256); + assert_eq!(Balances::free_balance(10), 256); // Check the balance of the stash account - assert_eq!(Balances::free_balance(&11), 256000); + assert_eq!(Balances::free_balance(11), 256000); // Set payee information assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Stash)); @@ -1495,7 +1495,7 @@ fn on_free_balance_zero_stash_removes_nominator() { assert_eq!(Balances::total_balance(&10), 0); // Check the balance of the stash account has not been touched - assert_eq!(Balances::free_balance(&11), 256000); + assert_eq!(Balances::free_balance(11), 256000); // Check these two accounts are still bonded assert_eq!(Staking::bonded(&11), Some(10)); @@ -1689,9 +1689,9 @@ 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), init_balance_10 + total_payout_0 / 3); + assert_eq!(Balances::free_balance(10), init_balance_10 + total_payout_0 / 3); // no rewards paid to 2. This was initial election. - assert_eq!(Balances::free_balance(&2), init_balance_2); + assert_eq!(Balances::free_balance(2), init_balance_2); let total_payout_1 = current_total_payout_for_duration(3000); assert!(total_payout_1 > 100); // Test is meaningfull if reward something @@ -1701,7 +1701,7 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { assert_eq_uvec!(validator_controllers(), vec![20, 10, 2]); assert_eq!(Staking::slot_stake(), 1); - assert_eq!(Balances::free_balance(&2), init_balance_2 + total_payout_1 / 3); + assert_eq!(Balances::free_balance(2), init_balance_2 + total_payout_1 / 3); assert_eq!( Balances::free_balance(&10), init_balance_10 + total_payout_0 / 3 + total_payout_1 / 3, @@ -2008,7 +2008,7 @@ fn slashing_performed_according_exposure() { ); // The stash account should be slashed for 250 (50% of 500). - assert_eq!(Balances::free_balance(&11), 1000 - 250); + assert_eq!(Balances::free_balance(11), 1000 - 250); }); } @@ -2102,8 +2102,8 @@ fn reporters_receive_their_slice() { // 50% * (10% * initial_balance / 2) let reward = (initial_balance / 20) / 2; let reward_each = reward / 2; // split into two pieces. - assert_eq!(Balances::free_balance(&1), 10 + reward_each); - assert_eq!(Balances::free_balance(&2), 20 + reward_each); + assert_eq!(Balances::free_balance(1), 10 + reward_each); + assert_eq!(Balances::free_balance(2), 20 + reward_each); assert_ledger_consistent(11); }); } @@ -2132,7 +2132,7 @@ fn subsequent_reports_in_same_span_pay_out_less() { // F1 * (reward_proportion * slash - 0) // 50% * (10% * initial_balance * 20%) let reward = (initial_balance / 5) / 20; - assert_eq!(Balances::free_balance(&1), 10 + reward); + assert_eq!(Balances::free_balance(1), 10 + reward); on_offence_now( &[OffenceDetails { @@ -2150,7 +2150,7 @@ fn subsequent_reports_in_same_span_pay_out_less() { // F1 * (reward_proportion * slash - prior_payout) // 50% * (10% * (initial_balance / 2) - prior_payout) let reward = ((initial_balance / 20) - prior_payout) / 2; - assert_eq!(Balances::free_balance(&1), 10 + prior_payout + reward); + assert_eq!(Balances::free_balance(1), 10 + prior_payout + reward); assert_ledger_consistent(11); }); } @@ -2159,8 +2159,8 @@ fn subsequent_reports_in_same_span_pay_out_less() { fn invulnerables_are_not_slashed() { // For invulnerable validators no slashing is performed. ExtBuilder::default().invulnerables(vec![11]).build().execute_with(|| { - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&21), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(21), 2000); let exposure = Staking::stakers(&21); let initial_balance = Staking::slashable_balance_of(&21); @@ -2183,9 +2183,9 @@ fn invulnerables_are_not_slashed() { ); // The validator 11 hasn't been slashed, but 21 has been. - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); // 2000 - (0.2 * initial_balance) - assert_eq!(Balances::free_balance(&21), 2000 - (2 * initial_balance / 10)); + assert_eq!(Balances::free_balance(21), 2000 - (2 * initial_balance / 10)); // ensure that nominators were slashed as well. for (initial_balance, other) in nominator_balances.into_iter().zip(exposure.others) { @@ -2203,7 +2203,7 @@ fn invulnerables_are_not_slashed() { fn dont_slash_if_fraction_is_zero() { // Don't slash if the fraction is zero. ExtBuilder::default().build().execute_with(|| { - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); on_offence_now( &[OffenceDetails { @@ -2217,7 +2217,7 @@ fn dont_slash_if_fraction_is_zero() { ); // The validator hasn't been slashed. The new era is not forced. - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); assert_ledger_consistent(11); }); } @@ -2225,7 +2225,7 @@ fn dont_slash_if_fraction_is_zero() { #[test] fn only_slash_for_max_in_era() { ExtBuilder::default().build().execute_with(|| { - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); on_offence_now( &[ @@ -2238,7 +2238,7 @@ fn only_slash_for_max_in_era() { ); // The validator has been slashed and has been force-chilled. - assert_eq!(Balances::free_balance(&11), 500); + assert_eq!(Balances::free_balance(11), 500); assert_eq!(Staking::force_era(), Forcing::ForceNew); on_offence_now( @@ -2252,7 +2252,7 @@ fn only_slash_for_max_in_era() { ); // The validator has not been slashed additionally. - assert_eq!(Balances::free_balance(&11), 500); + assert_eq!(Balances::free_balance(11), 500); on_offence_now( &[ @@ -2265,7 +2265,7 @@ fn only_slash_for_max_in_era() { ); // The validator got slashed 10% more. - assert_eq!(Balances::free_balance(&11), 400); + assert_eq!(Balances::free_balance(11), 400); assert_ledger_consistent(11); }) } @@ -2273,7 +2273,7 @@ fn only_slash_for_max_in_era() { #[test] fn garbage_collection_after_slashing() { ExtBuilder::default().existential_deposit(1).build().execute_with(|| { - assert_eq!(Balances::free_balance(&11), 256_000); + assert_eq!(Balances::free_balance(11), 256_000); on_offence_now( &[ @@ -2285,7 +2285,7 @@ fn garbage_collection_after_slashing() { &[Perbill::from_percent(10)], ); - assert_eq!(Balances::free_balance(&11), 256_000 - 25_600); + assert_eq!(Balances::free_balance(11), 256_000 - 25_600); assert!(::SlashingSpans::get(&11).is_some()); assert_eq!(::SpanSlash::get(&(11, 0)).amount_slashed(), &25_600); @@ -2302,7 +2302,7 @@ fn garbage_collection_after_slashing() { // validator and nominator slash in era are garbage-collected by era change, // so we don't test those here. - assert_eq!(Balances::free_balance(&11), 0); + assert_eq!(Balances::free_balance(11), 0); assert!(::SlashingSpans::get(&11).is_none()); assert_eq!(::SpanSlash::get(&(11, 0)).amount_slashed(), &0); }) @@ -2313,10 +2313,10 @@ fn garbage_collection_on_window_pruning() { ExtBuilder::default().build().execute_with(|| { start_era(1); - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); let exposure = Staking::stakers(&11); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(101), 2000); let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; on_offence_now( @@ -2331,8 +2331,8 @@ fn garbage_collection_on_window_pruning() { let now = Staking::current_era(); - assert_eq!(Balances::free_balance(&11), 900); - assert_eq!(Balances::free_balance(&101), 2000 - (nominated_value / 10)); + assert_eq!(Balances::free_balance(11), 900); + assert_eq!(Balances::free_balance(101), 2000 - (nominated_value / 10)); assert!(::ValidatorSlashInEra::get(&now, &11).is_some()); assert!(::NominatorSlashInEra::get(&now, &101).is_some()); @@ -2357,15 +2357,15 @@ fn slashing_nominators_by_span_max() { start_era(2); start_era(3); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&21), 2000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(21), 2000); + assert_eq!(Balances::free_balance(101), 2000); assert_eq!(Staking::slashable_balance_of(&21), 1000); let exposure_11 = Staking::stakers(&11); let exposure_21 = Staking::stakers(&21); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(101), 2000); let nominated_value_11 = exposure_11.others.iter().find(|o| o.who == 101).unwrap().value; let nominated_value_21 = exposure_21.others.iter().find(|o| o.who == 101).unwrap().value; @@ -2380,10 +2380,10 @@ fn slashing_nominators_by_span_max() { 2, ); - assert_eq!(Balances::free_balance(&11), 900); + assert_eq!(Balances::free_balance(11), 900); let slash_1_amount = Perbill::from_percent(10) * nominated_value_11; - assert_eq!(Balances::free_balance(&101), 2000 - slash_1_amount); + assert_eq!(Balances::free_balance(101), 2000 - slash_1_amount); let expected_spans = vec![ slashing::SlashingSpan { index: 1, start: 4, length: None }, @@ -2415,14 +2415,14 @@ fn slashing_nominators_by_span_max() { ); // 11 was not further slashed, but 21 and 101 were. - assert_eq!(Balances::free_balance(&11), 900); - assert_eq!(Balances::free_balance(&21), 1700); + assert_eq!(Balances::free_balance(11), 900); + assert_eq!(Balances::free_balance(21), 1700); let slash_2_amount = Perbill::from_percent(30) * nominated_value_21; assert!(slash_2_amount > slash_1_amount); // only the maximum slash in a single span is taken. - assert_eq!(Balances::free_balance(&101), 2000 - slash_2_amount); + assert_eq!(Balances::free_balance(101), 2000 - slash_2_amount); // third slash: in same era and on same validator as first, higher // in-era value, but lower slash value than slash 2. @@ -2438,15 +2438,15 @@ fn slashing_nominators_by_span_max() { ); // 11 was further slashed, but 21 and 101 were not. - assert_eq!(Balances::free_balance(&11), 800); - assert_eq!(Balances::free_balance(&21), 1700); + assert_eq!(Balances::free_balance(11), 800); + assert_eq!(Balances::free_balance(21), 1700); let slash_3_amount = Perbill::from_percent(20) * nominated_value_21; assert!(slash_3_amount < slash_2_amount); assert!(slash_3_amount > slash_1_amount); // only the maximum slash in a single span is taken. - assert_eq!(Balances::free_balance(&101), 2000 - slash_2_amount); + assert_eq!(Balances::free_balance(101), 2000 - slash_2_amount); }); } @@ -2457,7 +2457,7 @@ fn slashes_are_summed_across_spans() { start_era(2); start_era(3); - assert_eq!(Balances::free_balance(&21), 2000); + assert_eq!(Balances::free_balance(21), 2000); assert_eq!(Staking::slashable_balance_of(&21), 1000); let get_span = |account| ::SlashingSpans::get(&account).unwrap(); @@ -2478,7 +2478,7 @@ fn slashes_are_summed_across_spans() { ]; assert_eq!(get_span(21).iter().collect::>(), expected_spans); - assert_eq!(Balances::free_balance(&21), 1900); + assert_eq!(Balances::free_balance(21), 1900); // 21 has been force-chilled. re-signal intent to validate. Staking::validate(Origin::signed(20), Default::default()).unwrap(); @@ -2504,7 +2504,7 @@ fn slashes_are_summed_across_spans() { ]; assert_eq!(get_span(21).iter().collect::>(), expected_spans); - assert_eq!(Balances::free_balance(&21), 1810); + assert_eq!(Balances::free_balance(21), 1810); }); } @@ -2513,10 +2513,10 @@ fn deferred_slashes_are_deferred() { ExtBuilder::default().slash_defer_duration(2).build().execute_with(|| { start_era(1); - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); let exposure = Staking::stakers(&11); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(101), 2000); let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; on_offence_now( @@ -2529,25 +2529,25 @@ fn deferred_slashes_are_deferred() { &[Perbill::from_percent(10)], ); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); start_era(2); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); start_era(3); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); // at the start of era 4, slashes from era 1 are processed, // after being deferred for at least 2 full eras. start_era(4); - assert_eq!(Balances::free_balance(&11), 900); - assert_eq!(Balances::free_balance(&101), 2000 - (nominated_value / 10)); + assert_eq!(Balances::free_balance(11), 900); + assert_eq!(Balances::free_balance(101), 2000 - (nominated_value / 10)); }) } @@ -2556,10 +2556,10 @@ fn remove_deferred() { ExtBuilder::default().slash_defer_duration(2).build().execute_with(|| { start_era(1); - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); let exposure = Staking::stakers(&11); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(101), 2000); let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; on_offence_now( @@ -2572,8 +2572,8 @@ fn remove_deferred() { &[Perbill::from_percent(10)], ); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); start_era(2); @@ -2590,21 +2590,21 @@ fn remove_deferred() { Staking::cancel_deferred_slash(Origin::ROOT, 1, vec![0]).unwrap(); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); start_era(3); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); // at the start of era 4, slashes from era 1 are processed, // after being deferred for at least 2 full eras. start_era(4); // the first slash for 10% was cancelled, so no effect. - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); start_era(5); @@ -2616,8 +2616,8 @@ fn remove_deferred() { let actual_slash = total_slash - initial_slash; // 5% slash (15 - 10) processed now. - assert_eq!(Balances::free_balance(&11), 950); - assert_eq!(Balances::free_balance(&101), 2000 - actual_slash); + assert_eq!(Balances::free_balance(11), 950); + assert_eq!(Balances::free_balance(101), 2000 - actual_slash); }) } @@ -2626,10 +2626,10 @@ fn remove_multi_deferred() { ExtBuilder::default().slash_defer_duration(2).build().execute_with(|| { start_era(1); - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); let exposure = Staking::stakers(&11); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(101), 2000); on_offence_now( &[ @@ -2682,10 +2682,10 @@ fn slash_kicks_validators_not_nominators() { ExtBuilder::default().build().execute_with(|| { start_era(1); - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); let exposure = Staking::stakers(&11); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(101), 2000); let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; on_offence_now( @@ -2698,8 +2698,8 @@ fn slash_kicks_validators_not_nominators() { &[Perbill::from_percent(10)], ); - assert_eq!(Balances::free_balance(&11), 900); - assert_eq!(Balances::free_balance(&101), 2000 - (nominated_value / 10)); + assert_eq!(Balances::free_balance(11), 900); + assert_eq!(Balances::free_balance(101), 2000 - (nominated_value / 10)); // This is the best way to check that the validator was chilled; `get` will // return default value. @@ -2771,10 +2771,10 @@ fn zero_slash_keeps_nominators() { ExtBuilder::default().build().execute_with(|| { start_era(1); - assert_eq!(Balances::free_balance(&11), 1000); + assert_eq!(Balances::free_balance(11), 1000); let exposure = Staking::stakers(&11); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(101), 2000); on_offence_now( &[ @@ -2786,8 +2786,8 @@ fn zero_slash_keeps_nominators() { &[Perbill::from_percent(0)], ); - assert_eq!(Balances::free_balance(&11), 1000); - assert_eq!(Balances::free_balance(&101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); // This is the best way to check that the validator was chilled; `get` will // return default value. diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index e601544b01..531f255714 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -67,7 +67,8 @@ pub mod traits; pub mod weights; pub use self::hash::{ - Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat, Blake2_128Concat, Hashable + Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat, Blake2_128Concat, Hashable, + StorageHasher }; pub use self::storage::{ StorageValue, StorageMap, StorageLinkedMap, StorageDoubleMap, StoragePrefixedMap diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index cb22283924..02e6085046 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -64,13 +64,6 @@ pub trait Contains { fn count() -> usize { Self::sorted_members().len() } } -/// The account with the given id was killed. -#[impl_trait_for_tuples::impl_for_tuples(30)] -pub trait OnFreeBalanceZero { - /// The account with the given id was killed. - fn on_free_balance_zero(who: &AccountId); -} - /// The account with the given id was reaped. #[impl_trait_for_tuples::impl_for_tuples(30)] pub trait OnReapAccount { @@ -84,6 +77,12 @@ pub enum UpdateBalanceOutcome { Updated, /// The update led to killing the account. AccountKilled, + /// Free balance became zero as a result of this update. + FreeBalanceZero, + /// Reserved balance became zero as a result of this update. + ReservedBalanceZero, + /// The account started and ended non-existent. + StillDead, } /// A trait for finding the author of a block header based on the `PreRuntime` digests contained @@ -376,9 +375,7 @@ pub trait Currency { /// This is the only balance that matters in terms of most operations on tokens. It alone /// is used to determine the balance when in the contract execution environment. When this /// balance falls below the value of `ExistentialDeposit`, then the 'current account' is - /// deleted: specifically `FreeBalance`. Further, the `OnFreeBalanceZero` callback - /// is invoked, giving a chance to external modules to clean up data associated with - /// the deleted account. + /// deleted: specifically `FreeBalance`. /// /// `system::AccountNonce` is also deleted if `ReservedBalance` is also zero (it also gets /// collapsed to zero if it ever becomes less than `ExistentialDeposit`. @@ -581,7 +578,6 @@ pub trait LockableCurrency: Currency { id: LockIdentifier, who: &AccountId, amount: Self::Balance, - until: Self::Moment, reasons: WithdrawReasons, ); @@ -592,13 +588,11 @@ pub trait LockableCurrency: Currency { /// applies the most severe constraints of the two, while `set_lock` replaces the lock /// with the new parameters. As in, `extend_lock` will set: /// - maximum `amount` - /// - farthest duration (`until`) /// - bitwise mask of all `reasons` fn extend_lock( id: LockIdentifier, who: &AccountId, amount: Self::Balance, - until: Self::Moment, reasons: WithdrawReasons, ); @@ -609,13 +603,17 @@ pub trait LockableCurrency: Currency { ); } -/// A currency whose accounts can have balances which vest over time. -pub trait VestingCurrency: Currency { +/// A vesting schedule over a currency. This allows a particular currency to have vesting limits +/// applied to it. +pub trait VestingSchedule { /// The quantity used to denote time; usually just a `BlockNumber`. type Moment; + /// The currency that this schedule applies to. + type Currency: Currency; + /// Get the amount that is currently being vested and cannot be transferred out of this account. - fn vesting_balance(who: &AccountId) -> Self::Balance; + fn vesting_balance(who: &AccountId) -> >::Balance; /// Adds a vesting schedule to a given account. /// @@ -623,8 +621,8 @@ pub trait VestingCurrency: Currency { /// and nothing is updated. fn add_vesting_schedule( who: &AccountId, - locked: Self::Balance, - per_block: Self::Balance, + locked: >::Balance, + per_block: >::Balance, starting_block: Self::Moment, ) -> DispatchResult; @@ -644,7 +642,7 @@ bitmask! { TransactionPayment = 0b00000001, /// In order to transfer ownership. Transfer = 0b00000010, - /// In order to reserve some funds for a later return or repatriation + /// In order to reserve some funds for a later return or repatriation. Reserve = 0b00000100, /// In order to pay some other (higher-level) fees. Fee = 0b00001000, diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 34768d808e..645c3f8af5 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -76,7 +76,7 @@ pub trait Trait: frame_system::Trait { decl_storage! { trait Store for Module as Balances { - NextFeeMultiplier get(fn next_fee_multiplier): Multiplier = Multiplier::from_parts(0); + pub NextFeeMultiplier get(fn next_fee_multiplier): Multiplier = Multiplier::from_parts(0); } } @@ -178,9 +178,7 @@ impl ChargeTransactionPayment { let adjusted_fee = targeted_fee_adjustment.saturated_multiply_accumulate(adjustable_fee); let base_fee = T::TransactionBaseFee::get(); - let final_fee = base_fee.saturating_add(adjusted_fee).saturating_add(tip); - - final_fee + base_fee.saturating_add(adjusted_fee).saturating_add(tip) } else { tip } @@ -307,21 +305,18 @@ mod tests { } parameter_types! { - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; pub const ExistentialDeposit: u64 = 0; } impl pallet_balances::Trait for Runtime { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } @@ -407,7 +402,6 @@ mod tests { (5, 50 * self.balance_factor), (6, 60 * self.balance_factor) ], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); t.into() } @@ -432,14 +426,14 @@ mod tests { .pre_dispatch(&1, CALL, info_from_weight(5), len) .is_ok() ); - assert_eq!(Balances::free_balance(&1), 100 - 5 - 5 - 10); + assert_eq!(Balances::free_balance(1), 100 - 5 - 5 - 10); assert!( ChargeTransactionPayment::::from(5 /* tipped */) .pre_dispatch(&2, CALL, info_from_weight(3), len) .is_ok() ); - assert_eq!(Balances::free_balance(&2), 200 - 5 - 10 - 3 - 5); + assert_eq!(Balances::free_balance(2), 200 - 5 - 10 - 3 - 5); }); } @@ -474,7 +468,7 @@ mod tests { .execute_with(|| { // 1 ain't have a penny. - assert_eq!(Balances::free_balance(&1), 0); + assert_eq!(Balances::free_balance(1), 0); let len = 100; @@ -521,7 +515,7 @@ mod tests { .pre_dispatch(&1, CALL, info_from_weight(3), len) .is_ok() ); - assert_eq!(Balances::free_balance(&1), 100 - 10 - 5 - (10 + 3) * 3 / 2); + assert_eq!(Balances::free_balance(1), 100 - 10 - 5 - (10 + 3) * 3 / 2); }) } diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 8d1c25ad66..0872bc718c 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -759,19 +759,16 @@ mod tests { } parameter_types! { pub const ExistentialDeposit: u64 = 1; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; type OnNewAccount = (); - type OnFreeBalanceZero = (); type OnReapAccount = System; type Event = (); type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } pub struct TenToFourteen; @@ -818,7 +815,6 @@ mod tests { pallet_balances::GenesisConfig::{ // Total issuance will be 200 with treasury account initialized at ED. balances: vec![(0, 100), (1, 98), (2, 1)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); GenesisConfig::default().assimilate_storage::(&mut t).unwrap(); t.into() @@ -853,8 +849,8 @@ mod tests { new_test_ext().execute_with(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_ok!(Treasury::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3)); - assert_eq!(Balances::reserved_balance(&0), 12); - assert_eq!(Balances::free_balance(&0), 88); + assert_eq!(Balances::reserved_balance(0), 12); + assert_eq!(Balances::free_balance(0), 88); // other reports don't count. assert_noop!( @@ -869,9 +865,9 @@ mod tests { assert_noop!(Treasury::tip(Origin::signed(9), h.clone(), 10), BadOrigin); System::set_block_number(2); assert_ok!(Treasury::close_tip(Origin::signed(100), h.into())); - assert_eq!(Balances::reserved_balance(&0), 0); - assert_eq!(Balances::free_balance(&0), 102); - assert_eq!(Balances::free_balance(&3), 8); + assert_eq!(Balances::reserved_balance(0), 0); + assert_eq!(Balances::free_balance(0), 102); + assert_eq!(Balances::free_balance(3), 8); }); } @@ -880,16 +876,16 @@ mod tests { new_test_ext().execute_with(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_ok!(Treasury::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 0)); - assert_eq!(Balances::reserved_balance(&0), 12); - assert_eq!(Balances::free_balance(&0), 88); + assert_eq!(Balances::reserved_balance(0), 12); + assert_eq!(Balances::free_balance(0), 88); let h = BlakeTwo256::hash_of(&(BlakeTwo256::hash(b"awesome.dot"), 0u64)); assert_ok!(Treasury::tip(Origin::signed(10), h.clone(), 10)); assert_ok!(Treasury::tip(Origin::signed(11), h.clone(), 10)); assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 10)); System::set_block_number(2); assert_ok!(Treasury::close_tip(Origin::signed(100), h.into())); - assert_eq!(Balances::reserved_balance(&0), 0); - assert_eq!(Balances::free_balance(&0), 110); + assert_eq!(Balances::reserved_balance(0), 0); + assert_eq!(Balances::free_balance(0), 110); }); } @@ -910,7 +906,7 @@ mod tests { System::set_block_number(2); assert_noop!(Treasury::close_tip(Origin::NONE, h.into()), BadOrigin); assert_ok!(Treasury::close_tip(Origin::signed(0), h.into())); - assert_eq!(Balances::free_balance(&3), 10); + assert_eq!(Balances::free_balance(3), 10); assert_noop!(Treasury::close_tip(Origin::signed(100), h.into()), Error::::UnknownTip); }); @@ -942,7 +938,7 @@ mod tests { assert_ok!(Treasury::tip(Origin::signed(12), h.clone(), 1000000)); System::set_block_number(2); assert_ok!(Treasury::close_tip(Origin::signed(0), h.into())); - assert_eq!(Balances::free_balance(&3), 10); + assert_eq!(Balances::free_balance(3), 10); }); } @@ -961,7 +957,7 @@ mod tests { assert_ok!(Treasury::tip(Origin::signed(10), h.clone(), 10)); System::set_block_number(2); assert_ok!(Treasury::close_tip(Origin::signed(0), h.into())); - assert_eq!(Balances::free_balance(&3), 10); + assert_eq!(Balances::free_balance(3), 10); }); } @@ -978,8 +974,8 @@ mod tests { fn spend_proposal_takes_min_deposit() { new_test_ext().execute_with(|| { assert_ok!(Treasury::propose_spend(Origin::signed(0), 1, 3)); - assert_eq!(Balances::free_balance(&0), 99); - assert_eq!(Balances::reserved_balance(&0), 1); + assert_eq!(Balances::free_balance(0), 99); + assert_eq!(Balances::reserved_balance(0), 1); }); } @@ -987,8 +983,8 @@ mod tests { fn spend_proposal_takes_proportional_deposit() { new_test_ext().execute_with(|| { assert_ok!(Treasury::propose_spend(Origin::signed(0), 100, 3)); - assert_eq!(Balances::free_balance(&0), 95); - assert_eq!(Balances::reserved_balance(&0), 5); + assert_eq!(Balances::free_balance(0), 95); + assert_eq!(Balances::reserved_balance(0), 5); }); } @@ -1011,7 +1007,7 @@ mod tests { assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0)); >::on_finalize(1); - assert_eq!(Balances::free_balance(&3), 0); + assert_eq!(Balances::free_balance(3), 0); assert_eq!(Treasury::pot(), 100); }); } @@ -1038,7 +1034,7 @@ mod tests { assert_ok!(Treasury::reject_proposal(Origin::ROOT, 0)); >::on_finalize(2); - assert_eq!(Balances::free_balance(&3), 0); + assert_eq!(Balances::free_balance(3), 0); assert_eq!(Treasury::pot(), 50); }); } @@ -1089,7 +1085,7 @@ mod tests { assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0)); >::on_finalize(2); - assert_eq!(Balances::free_balance(&3), 100); + assert_eq!(Balances::free_balance(3), 100); assert_eq!(Treasury::pot(), 0); }); } @@ -1108,7 +1104,7 @@ mod tests { let _ = Balances::deposit_into_existing(&Treasury::account_id(), 100).unwrap(); >::on_finalize(4); - assert_eq!(Balances::free_balance(&3), 150); // Fund has been spent + assert_eq!(Balances::free_balance(3), 150); // Fund has been spent assert_eq!(Treasury::pot(), 25); // Pot has finally changed }); } @@ -1133,7 +1129,7 @@ mod tests { >::on_finalize(4); assert_eq!(Treasury::pot(), 0); // Pot is emptied - assert_eq!(Balances::free_balance(&Treasury::account_id()), 1); // but the account is still there + assert_eq!(Balances::free_balance(Treasury::account_id()), 1); // but the account is still there }); } @@ -1144,13 +1140,12 @@ mod tests { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig::{ balances: vec![(0, 100), (1, 99), (2, 1)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); // Treasury genesis config is not build thus treasury account does not exist let mut t: sp_io::TestExternalities = t.into(); t.execute_with(|| { - assert_eq!(Balances::free_balance(&Treasury::account_id()), 0); // Account does not exist + assert_eq!(Balances::free_balance(Treasury::account_id()), 0); // Account does not exist assert_eq!(Treasury::pot(), 0); // Pot is empty assert_ok!(Treasury::propose_spend(Origin::signed(0), 99, 3)); @@ -1159,16 +1154,16 @@ mod tests { assert_ok!(Treasury::approve_proposal(Origin::ROOT, 1)); >::on_finalize(2); assert_eq!(Treasury::pot(), 0); // Pot hasn't changed - assert_eq!(Balances::free_balance(&3), 0); // Balance of `3` hasn't changed + assert_eq!(Balances::free_balance(3), 0); // Balance of `3` hasn't changed Balances::make_free_balance_be(&Treasury::account_id(), 100); assert_eq!(Treasury::pot(), 99); // Pot now contains funds - assert_eq!(Balances::free_balance(&Treasury::account_id()), 100); // Account does exist + assert_eq!(Balances::free_balance(Treasury::account_id()), 100); // Account does exist >::on_finalize(4); assert_eq!(Treasury::pot(), 0); // Pot has changed - assert_eq!(Balances::free_balance(&3), 99); // Balance of `3` has changed + assert_eq!(Balances::free_balance(3), 99); // Balance of `3` has changed }); } } diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index 7344294684..fcd340eef5 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -703,19 +703,16 @@ mod tests { } parameter_types! { pub const ExistentialDeposit: u64 = 0; - pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; } impl pallet_balances::Trait for Test { type Balance = u64; - type OnFreeBalanceZero = (); type OnReapAccount = System; type OnNewAccount = (); type Event = TestEvent; type TransferPayment = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; - type TransferFee = TransferFee; type CreationFee = CreationFee; } parameter_types! { @@ -742,7 +739,6 @@ mod tests { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); pallet_balances::GenesisConfig:: { balances: vec![(1, 10), (2, 10), (3, 10), (4, 10), (5, 10)], - vesting: vec![], }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/frame/vesting/Cargo.toml b/frame/vesting/Cargo.toml new file mode 100644 index 0000000000..6923297af5 --- /dev/null +++ b/frame/vesting/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "pallet-vesting" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +serde = { version = "1.0.101", optional = true } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +enumflags2 = { version = "0.6.2" } +sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0", default-features = false, path = "../support" } +frame-system = { version = "2.0.0", default-features = false, path = "../system" } + +[dev-dependencies] +sp-core = { version = "2.0.0", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0", path = "../balances" } +sp-storage = { version = "2.0.0", path = "../../primitives/storage" } +hex-literal = "0.2.1" + +[features] +default = ["std"] +std = [ + "serde", + "codec/std", + "sp-std/std", + "sp-io/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", +] diff --git a/frame/vesting/src/lib.rs b/frame/vesting/src/lib.rs new file mode 100644 index 0000000000..4a079e7693 --- /dev/null +++ b/frame/vesting/src/lib.rs @@ -0,0 +1,610 @@ +// Copyright 2019-2020 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 . + +//! # Vesting Module +//! +//! - [`vesting::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! +//! ## Overview +//! +//! A simple module providing a means of placing a linear curve on an account's locked balance. This +//! module ensures that there is a lock in place preventing the balance to drop below the *unvested* +//! amount for any reason other than transaction fee payment. +//! +//! As the amount vested increases over time, the amount unvested reduces. However, locks remain in +//! place and explicit action is needed on behalf of the user to ensure that the amount locked is +//! equivalent to the amount remaining to be vested. This is done through a dispatchable function, +//! either `vest` (in typical case where the sender is calling on their own behalf) or `vest_other` +//! in case the sender is calling on another account's behalf. +//! +//! ## Interface +//! +//! This module implements the `VestingSchedule` trait. +//! +//! ### Dispatchable Functions +//! +//! - `vest` - Update the lock, reducing it in line with the amount "vested" so far. +//! - `vest_other` - Update the lock of another account, reducing it in line with the amount +//! "vested" so far. +//! +//! [`Call`]: ./enum.Call.html +//! [`Trait`]: ./trait.Trait.html + +#![cfg_attr(not(feature = "std"), no_std)] + +use sp_std::prelude::*; +use sp_std::fmt::Debug; +use codec::{Encode, Decode}; +use sp_runtime::{DispatchResult, RuntimeDebug, traits::{ + StaticLookup, Zero, SimpleArithmetic, MaybeSerializeDeserialize, Saturating, Convert +}}; +use frame_support::{decl_module, decl_event, decl_storage, ensure, decl_error}; +use frame_support::traits::{ + Currency, LockableCurrency, VestingSchedule, WithdrawReason, LockIdentifier +}; +use frame_system::{self as system, ensure_signed}; + +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; + +pub trait Trait: frame_system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + + /// The currency trait. + type Currency: LockableCurrency; + + /// Convert the block number into a balance. + type BlockNumberToBalance: Convert>; +} + +const VESTING_ID: LockIdentifier = *b"vesting "; + +/// Struct to encode the vesting schedule of an individual account. +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] +pub struct VestingInfo { + /// Locked amount at genesis. + pub locked: Balance, + /// Amount that gets unlocked every block after `starting_block`. + pub per_block: Balance, + /// Starting block for unlocking(vesting). + pub starting_block: BlockNumber, +} + +impl< + Balance: SimpleArithmetic + Copy, + BlockNumber: SimpleArithmetic + Copy, +> VestingInfo { + /// Amount locked at block `n`. + pub fn locked_at< + BlockNumberToBalance: Convert + >(&self, n: BlockNumber) -> Balance { + // Number of blocks that count toward vesting + // Saturating to 0 when n < starting_block + let vested_block_count = n.saturating_sub(self.starting_block); + let vested_block_count = BlockNumberToBalance::convert(vested_block_count); + // Return amount that is still locked in vesting + let maybe_balance = vested_block_count.checked_mul(&self.per_block); + if let Some(balance) = maybe_balance { + self.locked.saturating_sub(balance) + } else { + Zero::zero() + } + } +} + +decl_storage! { + trait Store for Module as Vesting { + /// Information regarding the vesting of a given account. + pub Vesting get(fn vesting): + map hasher(blake2_256) T::AccountId => Option, T::BlockNumber>>; + } + add_extra_genesis { + config(vesting): Vec<(T::AccountId, T::BlockNumber, T::BlockNumber, BalanceOf)>; + build(|config: &GenesisConfig| { + // Generate initial vesting configuration + // * who - Account which we are generating vesting configuration for + // * begin - Block when the account will start to vest + // * length - Number of blocks from `begin` until fully vested + // * liquid - Number of units which can be spent before vesting begins + for &(ref who, begin, length, liquid) in config.vesting.iter() { + let balance = T::Currency::free_balance(who); + assert!(!balance.is_zero(), "Currencies must be init'd before vesting"); + // Total genesis `balance` minus `liquid` equals funds locked for vesting + let locked = balance.saturating_sub(liquid); + let length_as_balance = T::BlockNumberToBalance::convert(length); + let per_block = locked / length_as_balance.max(sp_runtime::traits::One::one()); + + Vesting::::insert(who, VestingInfo { + locked: locked, + per_block: per_block, + starting_block: begin + }); + let reasons = WithdrawReason::Transfer | WithdrawReason::Reserve; + T::Currency::set_lock(VESTING_ID, who, locked, reasons); + } + }) + } +} + +decl_event!( + pub enum Event where AccountId = ::AccountId, Balance = BalanceOf { + /// The amount vested has been updated. This could indicate more funds are available. The + /// balance given is the amount which is left unvested (and thus locked). + VestingUpdated(AccountId, Balance), + /// An account (given) has become fully vested. No further vesting can happen. + VestingCompleted(AccountId), + } +); + +decl_error! { + /// Error for the vesting module. + pub enum Error for Module { + /// The account given is not vesting. + NotVesting, + /// An existing vesting schedule already exists for this account that cannot be clobbered. + ExistingVestingSchedule, + } +} + +decl_module! { + // Simple declaration of the `Module` type. Lets the macro know what it's working on. + pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + + fn deposit_event() = default; + + /// Unlock any vested funds of the sender account. + /// + /// The dispatch origin for this call must be _Signed_ and the sender must have funds still + /// locked under this module. + /// + /// Emits either `VestingCompleted` or `VestingUpdated`. + /// + /// # + /// - `O(1)`. + /// - One balance-lock operation. + /// - One storage read (codec `O(1)`) and up to one removal. + /// - One event. + /// # + fn vest(origin) -> DispatchResult { + let who = ensure_signed(origin)?; + Self::update_lock(who) + } + + /// Unlock any vested funds of a `target` account. + /// + /// The dispatch origin for this call must be _Signed_. + /// + /// - `target`: The account whose vested funds should be unlocked. Must have funds still + /// locked under this module. + /// + /// Emits either `VestingCompleted` or `VestingUpdated`. + /// + /// # + /// - `O(1)`. + /// - Up to one account lookup. + /// - One balance-lock operation. + /// - One storage read (codec `O(1)`) and up to one removal. + /// - One event. + /// # + fn vest_other(origin, target: ::Source) -> DispatchResult { + ensure_signed(origin)?; + Self::update_lock(T::Lookup::lookup(target)?) + } + } +} + +impl Module { + /// (Re)set or remove the module's currency lock on `who`'s account in accordance with their + /// current unvested amount. + fn update_lock(who: T::AccountId) -> DispatchResult { + ensure!(Vesting::::exists(&who), Error::::NotVesting); + let unvested = Self::vesting_balance(&who); + if unvested.is_zero() { + T::Currency::remove_lock(VESTING_ID, &who); + Vesting::::remove(&who); + Self::deposit_event(RawEvent::VestingCompleted(who)); + } else { + let reasons = WithdrawReason::Transfer | WithdrawReason::Reserve; + T::Currency::set_lock(VESTING_ID, &who, unvested, reasons); + Self::deposit_event(RawEvent::VestingUpdated(who, unvested)); + } + Ok(()) + } +} + +impl VestingSchedule for Module where + BalanceOf: MaybeSerializeDeserialize + Debug +{ + type Moment = T::BlockNumber; + type Currency = T::Currency; + + /// Get the amount that is currently being vested and cannot be transferred out of this account. + fn vesting_balance(who: &T::AccountId) -> BalanceOf { + if let Some(v) = Self::vesting(who) { + let now = >::block_number(); + let locked_now = v.locked_at::(now); + T::Currency::free_balance(who).min(locked_now) + } else { + Zero::zero() + } + } + + /// Adds a vesting schedule to a given account. + /// + /// If there already exists a vesting schedule for the given account, an `Err` is returned + /// and nothing is updated. + /// + /// Is a no-op if the amount to be vested is zero. + fn add_vesting_schedule( + who: &T::AccountId, + locked: BalanceOf, + per_block: BalanceOf, + starting_block: T::BlockNumber + ) -> DispatchResult { + if locked.is_zero() { return Ok(()) } + if Vesting::::exists(who) { + Err(Error::::ExistingVestingSchedule)? + } + let vesting_schedule = VestingInfo { + locked, + per_block, + starting_block + }; + Vesting::::insert(who, vesting_schedule); + // it can't fail, but even if somehow it did, we don't really care. + let _ = Self::update_lock(who.clone()); + Ok(()) + } + + /// Remove a vesting schedule for a given account. + fn remove_vesting_schedule(who: &T::AccountId) { + Vesting::::remove(who); + // it can't fail, but even if somehow it did, we don't really care. + let _ = Self::update_lock(who.clone()); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::cell::RefCell; + use frame_support::{ + assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight, + traits::Get + }; + use sp_core::H256; + // The testing primitives are very useful for avoiding having to work with signatures + // or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. + use sp_runtime::{ + Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup, Identity, OnInitialize}, + }; + use sp_storage::Storage; + + impl_outer_origin! { + pub enum Origin for Test where system = frame_system {} + } + + // For testing the module, we construct most of a mock runtime. This means + // first constructing a configuration type (`Test`) which `impl`s each of the + // configuration traits of modules we want to use. + #[derive(Clone, Eq, PartialEq)] + pub struct Test; + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); + } + impl frame_system::Trait for Test { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Call = (); + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type ModuleToIndex = (); + } + parameter_types! { + pub const CreationFee: u64 = 0; + } + impl pallet_balances::Trait for Test { + type Balance = u64; + type OnReapAccount = System; + type OnNewAccount = (); + type Event = (); + type TransferPayment = (); + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type CreationFee = CreationFee; + } + impl Trait for Test { + type Event = (); + type Currency = Balances; + type BlockNumberToBalance = Identity; + } + type System = frame_system::Module; + type Balances = pallet_balances::Module; + type Vesting = Module; + + thread_local! { + static EXISTENTIAL_DEPOSIT: RefCell = RefCell::new(0); + } + pub struct ExistentialDeposit; + impl Get for ExistentialDeposit { + fn get() -> u64 { EXISTENTIAL_DEPOSIT.with(|v| *v.borrow()) } + } + + pub struct ExtBuilder { + existential_deposit: u64, + } + impl Default for ExtBuilder { + fn default() -> Self { + Self { + existential_deposit: 1, + } + } + } + impl ExtBuilder { + pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { + self.existential_deposit = existential_deposit; + self + } + pub fn build(self) -> sp_io::TestExternalities { + EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + pallet_balances::GenesisConfig:: { + balances: vec![ + (1, 10 * self.existential_deposit), + (2, 20 * self.existential_deposit), + (3, 30 * self.existential_deposit), + (4, 40 * self.existential_deposit), + (12, 10 * self.existential_deposit) + ], + }.assimilate_storage(&mut t).unwrap(); + GenesisConfig:: { + vesting: vec![ + (1, 0, 10, 5 * self.existential_deposit), + (2, 10, 20, 0), + (12, 10, 20, 5 * self.existential_deposit) + ], + }.assimilate_storage(&mut t).unwrap(); + t.into() + } + } + + #[test] + fn vesting_info_via_migration_should_work() { + let mut s = Storage::default(); + use hex_literal::hex; + // A dump of data from the previous version for which we know account 6 vests 30 of its 60 + // over 5 blocks from block 3. + let data = vec![ + (hex!["26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac"].to_vec(), hex!["0100000000000000"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850"].to_vec(), hex!["02000000"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7"].to_vec(), hex!["08000000000000000000000000"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc"].to_vec(), hex!["4545454545454545454545454545454545454545454545454545454545454545"].to_vec()), + (hex!["26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c11874681e47a19e6b29b0a65b9591762ce5143ed30d0261e5d24a3201752506b20f15c"].to_vec(), hex!["4545454545454545454545454545454545454545454545454545454545454545"].to_vec()), + (hex!["3a636f6465"].to_vec(), hex![""].to_vec()), + (hex!["3a65787472696e7369635f696e646578"].to_vec(), hex!["00000000"].to_vec()), + (hex!["3a686561707061676573"].to_vec(), hex!["0800000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc61dbd7d0b561a41d23c2a469ad42fbd70d5438bae826f6fd607413190c37c363b"].to_vec(), hex!["046d697363202020200300000000000000ffffffffffffffff04"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc66cddb367afbd583bb48f9bbd7d5ba3b1d0738b4881b1cddd38169526d8158137"].to_vec(), hex!["0474786665657320200300000000000000ffffffffffffffff01"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6e88b43fded6323ef02ffeffbd8c40846ee09bf316271bd22369659c959dd733a"].to_vec(), hex!["08616c6c20202020200300000000000000ffffffffffffffff1f64656d6f63726163ffffffffffffffff030000000000000002"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f3c22813def93ef32c365b55cb92f10f91dbd7d0b561a41d23c2a469ad42fbd70d5438bae826f6fd607413190c37c363b"].to_vec(), hex!["0500000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80"].to_vec(), hex!["d200000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f5f27b51b5ec208ee9cb25b55d8728243b8788bb218b185b63e3e92653953f29b6b143fb8cf5159fc908632e6fe490501"].to_vec(), hex!["1e0000000000000006000000000000000200000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b41dbd7d0b561a41d23c2a469ad42fbd70d5438bae826f6fd607413190c37c363b"].to_vec(), hex!["0500000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b46cddb367afbd583bb48f9bbd7d5ba3b1d0738b4881b1cddd38169526d8158137"].to_vec(), hex!["1e00000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4b8788bb218b185b63e3e92653953f29b6b143fb8cf5159fc908632e6fe490501"].to_vec(), hex!["3c00000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4e88b43fded6323ef02ffeffbd8c40846ee09bf316271bd22369659c959dd733a"].to_vec(), hex!["1400000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4e96760d274653a39b429a87ebaae9d3aa4fdf58b9096cf0bebc7c4e5a4c2ed8d"].to_vec(), hex!["2800000000000000"].to_vec()), + (hex!["c2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4effb728943197fd12e694cbf3f3ede28fbf7498b0370c6dfa0013874b417c178"].to_vec(), hex!["3200000000000000"].to_vec()), + (hex!["f2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e"].to_vec(), hex!["00000000"].to_vec()), + (hex!["f2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6"].to_vec(), hex!["00000000"].to_vec()), + (hex!["f2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13"].to_vec(), hex!["00000000"].to_vec()), + ]; + s.top = data.into_iter().collect(); + sp_io::TestExternalities::new(s).execute_with(|| { + Balances::on_initialize(1); + assert_eq!(Balances::free_balance(6), 60); + assert_eq!(Balances::usable_balance(&6), 30); + System::set_block_number(2); + assert_ok!(Vesting::vest(Origin::signed(6))); + assert_eq!(Balances::usable_balance(&6), 30); + System::set_block_number(3); + assert_ok!(Vesting::vest(Origin::signed(6))); + assert_eq!(Balances::usable_balance(&6), 36); + System::set_block_number(4); + assert_ok!(Vesting::vest(Origin::signed(6))); + assert_eq!(Balances::usable_balance(&6), 42); + }); + } + + #[test] + fn check_vesting_status() { + ExtBuilder::default() + .existential_deposit(256) + .build() + .execute_with(|| { + assert_eq!(System::block_number(), 1); + let user1_free_balance = Balances::free_balance(&1); + let user2_free_balance = Balances::free_balance(&2); + let user12_free_balance = Balances::free_balance(&12); + assert_eq!(user1_free_balance, 256 * 10); // Account 1 has free balance + assert_eq!(user2_free_balance, 256 * 20); // Account 2 has free balance + assert_eq!(user12_free_balance, 256 * 10); // Account 12 has free balance + let user1_vesting_schedule = VestingInfo { + locked: 256 * 5, + per_block: 128, // Vesting over 10 blocks + starting_block: 0, + }; + let user2_vesting_schedule = VestingInfo { + locked: 256 * 20, + per_block: 256, // Vesting over 20 blocks + starting_block: 10, + }; + let user12_vesting_schedule = VestingInfo { + locked: 256 * 5, + per_block: 64, // Vesting over 20 blocks + starting_block: 10, + }; + assert_eq!(Vesting::vesting(&1), Some(user1_vesting_schedule)); // Account 1 has a vesting schedule + assert_eq!(Vesting::vesting(&2), Some(user2_vesting_schedule)); // Account 2 has a vesting schedule + assert_eq!(Vesting::vesting(&12), Some(user12_vesting_schedule)); // Account 12 has a vesting schedule + + // Account 1 has only 128 units vested from their illiquid 256 * 5 units at block 1 + assert_eq!(Vesting::vesting_balance(&1), 128 * 9); + // Account 2 has their full balance locked + assert_eq!(Vesting::vesting_balance(&2), user2_free_balance); + // Account 12 has only their illiquid funds locked + assert_eq!(Vesting::vesting_balance(&12), user12_free_balance - 256 * 5); + + System::set_block_number(10); + assert_eq!(System::block_number(), 10); + + // Account 1 has fully vested by block 10 + assert_eq!(Vesting::vesting_balance(&1), 0); + // Account 2 has started vesting by block 10 + assert_eq!(Vesting::vesting_balance(&2), user2_free_balance); + // Account 12 has started vesting by block 10 + assert_eq!(Vesting::vesting_balance(&12), user12_free_balance - 256 * 5); + + System::set_block_number(30); + assert_eq!(System::block_number(), 30); + + assert_eq!(Vesting::vesting_balance(&1), 0); // Account 1 is still fully vested, and not negative + assert_eq!(Vesting::vesting_balance(&2), 0); // Account 2 has fully vested by block 30 + assert_eq!(Vesting::vesting_balance(&12), 0); // Account 2 has fully vested by block 30 + + }); + } + + #[test] + fn unvested_balance_should_not_transfer() { + ExtBuilder::default() + .existential_deposit(10) + .build() + .execute_with(|| { + assert_eq!(System::block_number(), 1); + let user1_free_balance = Balances::free_balance(&1); + assert_eq!(user1_free_balance, 100); // Account 1 has free balance + // Account 1 has only 5 units vested at block 1 (plus 50 unvested) + assert_eq!(Vesting::vesting_balance(&1), 45); + assert_noop!( + Balances::transfer(Some(1).into(), 2, 56), + pallet_balances::Error::::LiquidityRestrictions, + ); // Account 1 cannot send more than vested amount + }); + } + + #[test] + fn vested_balance_should_transfer() { + ExtBuilder::default() + .existential_deposit(10) + .build() + .execute_with(|| { + assert_eq!(System::block_number(), 1); + let user1_free_balance = Balances::free_balance(&1); + assert_eq!(user1_free_balance, 100); // Account 1 has free balance + // Account 1 has only 5 units vested at block 1 (plus 50 unvested) + assert_eq!(Vesting::vesting_balance(&1), 45); + assert_ok!(Vesting::vest(Some(1).into())); + assert_ok!(Balances::transfer(Some(1).into(), 2, 55)); + }); + } + + #[test] + fn vested_balance_should_transfer_using_vest_other() { + ExtBuilder::default() + .existential_deposit(10) + .build() + .execute_with(|| { + assert_eq!(System::block_number(), 1); + let user1_free_balance = Balances::free_balance(&1); + assert_eq!(user1_free_balance, 100); // Account 1 has free balance + // Account 1 has only 5 units vested at block 1 (plus 50 unvested) + assert_eq!(Vesting::vesting_balance(&1), 45); + assert_ok!(Vesting::vest_other(Some(2).into(), 1)); + assert_ok!(Balances::transfer(Some(1).into(), 2, 55)); + }); + } + + #[test] + fn extra_balance_should_transfer() { + ExtBuilder::default() + .existential_deposit(10) + .build() + .execute_with(|| { + assert_eq!(System::block_number(), 1); + assert_ok!(Balances::transfer(Some(3).into(), 1, 100)); + assert_ok!(Balances::transfer(Some(3).into(), 2, 100)); + + let user1_free_balance = Balances::free_balance(&1); + assert_eq!(user1_free_balance, 200); // Account 1 has 100 more free balance than normal + + let user2_free_balance = Balances::free_balance(&2); + assert_eq!(user2_free_balance, 300); // Account 2 has 100 more free balance than normal + + // Account 1 has only 5 units vested at block 1 (plus 150 unvested) + assert_eq!(Vesting::vesting_balance(&1), 45); + assert_ok!(Vesting::vest(Some(1).into())); + assert_ok!(Balances::transfer(Some(1).into(), 3, 155)); // Account 1 can send extra units gained + + // Account 2 has no units vested at block 1, but gained 100 + assert_eq!(Vesting::vesting_balance(&2), 200); + assert_ok!(Vesting::vest(Some(2).into())); + assert_ok!(Balances::transfer(Some(2).into(), 3, 100)); // Account 2 can send extra units gained + }); + } + + #[test] + fn liquid_funds_should_transfer_with_delayed_vesting() { + ExtBuilder::default() + .existential_deposit(256) + .build() + .execute_with(|| { + assert_eq!(System::block_number(), 1); + let user12_free_balance = Balances::free_balance(&12); + + assert_eq!(user12_free_balance, 2560); // Account 12 has free balance + // Account 12 has liquid funds + assert_eq!(Vesting::vesting_balance(&12), user12_free_balance - 256 * 5); + + // Account 12 has delayed vesting + let user12_vesting_schedule = VestingInfo { + locked: 256 * 5, + per_block: 64, // Vesting over 20 blocks + starting_block: 10, + }; + assert_eq!(Vesting::vesting(&12), Some(user12_vesting_schedule)); + + // Account 12 can still send liquid funds + assert_ok!(Balances::transfer(Some(12).into(), 3, 256 * 5)); + }); + } +} -- GitLab From 4d9baeb7c72923a3de6d4a31fd0cebe42c97edca Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sat, 1 Feb 2020 13:28:37 +0000 Subject: [PATCH 235/296] Urgent patch --- frame/balances/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 65ad226d53..3395ef0f1a 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -386,7 +386,7 @@ decl_storage! { pub Locks get(fn locks): map hasher(blake2_256) T::AccountId => Vec>; /// True if network has been upgraded to this version. - IsUpgraded: bool; + IsUpgraded: bool = true; } add_extra_genesis { config(balances): Vec<(T::AccountId, T::Balance)>; -- GitLab From a52588de7ef5d261f3616eb501eb7eb29487ba33 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Sat, 1 Feb 2020 16:35:05 +0100 Subject: [PATCH 236/296] fork-tree: add support for find_node_mut_where (#4784) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fork-tree: add support for find_node_mut_where * Update utils/fork-tree/src/lib.rs Co-Authored-By: Bastian Köcher * Update utils/fork-tree/src/lib.rs Co-Authored-By: Bastian Köcher * Update utils/fork-tree/src/lib.rs Co-Authored-By: Bastian Köcher * Fix calling name * Update utils/fork-tree/src/lib.rs Co-Authored-By: Robert Habermeier * doc: be precise what is "least significant" index Co-authored-by: Bastian Köcher Co-authored-by: Robert Habermeier --- utils/fork-tree/src/lib.rs | 121 ++++++++++++++++++++++++++++++++----- 1 file changed, 107 insertions(+), 14 deletions(-) diff --git a/utils/fork-tree/src/lib.rs b/utils/fork-tree/src/lib.rs index 1aa085c3da..8ce0b729c6 100644 --- a/utils/fork-tree/src/lib.rs +++ b/utils/fork-tree/src/lib.rs @@ -200,7 +200,7 @@ impl ForkTree where data, hash: hash, number: number, - children: Vec::new(), + children: Vec::new(), }); self.rebalance(); @@ -232,10 +232,10 @@ impl ForkTree where number: &N, is_descendent_of: &F, predicate: &P, - ) -> Result>, Error> - where E: std::error::Error, - F: Fn(&H, &H) -> Result, - P: Fn(&V) -> bool, + ) -> Result>, Error> where + E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, { // search for node starting from all roots for root in self.roots.iter() { @@ -250,6 +250,31 @@ impl ForkTree where Ok(None) } + /// Same as [`find_node_where`](Self::find_node_where), but returns mutable reference. + pub fn find_node_where_mut( + &mut self, + hash: &H, + number: &N, + is_descendent_of: &F, + predicate: &P, + ) -> Result>, Error> where + E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, + { + // search for node starting from all roots + for root in self.roots.iter_mut() { + let node = root.find_node_where_mut(hash, number, is_descendent_of, predicate)?; + + // found the node, early exit + if let FindOutcome::Found(node) = node { + return Ok(Some(node)); + } + } + + Ok(None) + } + /// Finalize a root in the tree and return it, return `None` in case no root /// with the given hash exists. All other roots are pruned, and the children /// of the finalized node become the new roots. @@ -609,16 +634,17 @@ mod node_implementation { /// when the predicate fails. /// The given function `is_descendent_of` should return `true` if the second hash (target) /// is a descendent of the first hash (base). - // FIXME: it would be useful if this returned a mutable reference but - // rustc can't deal with lifetimes properly. an option would be to try - // an iterative definition instead. - pub fn find_node_where( + /// + /// The returned indices are from last to first. The earliest index in the traverse path + /// goes last, and the final index in the traverse path goes first. An empty list means + /// that the current node is the result. + pub fn find_node_index_where( &self, hash: &H, number: &N, is_descendent_of: &F, predicate: &P, - ) -> Result>, Error> + ) -> Result>, Error> where E: std::error::Error, F: Fn(&H, &H) -> Result, P: Fn(&V) -> bool, @@ -631,11 +657,14 @@ mod node_implementation { let mut known_descendent_of = false; // continue depth-first search through all children - for node in self.children.iter() { + for (i, node) in self.children.iter().enumerate() { // found node, early exit - match node.find_node_where(hash, number, is_descendent_of, predicate)? { + match node.find_node_index_where(hash, number, is_descendent_of, predicate)? { FindOutcome::Abort => return Ok(FindOutcome::Abort), - FindOutcome::Found(x) => return Ok(FindOutcome::Found(x)), + FindOutcome::Found(mut x) => { + x.push(i); + return Ok(FindOutcome::Found(x)) + }, FindOutcome::Failure(true) => { // if the block was a descendent of this child, // then it cannot be a descendent of any others, @@ -655,7 +684,7 @@ mod node_implementation { if is_descendent_of { // if the predicate passes we return the node if predicate(&self.data) { - return Ok(FindOutcome::Found(self)); + return Ok(FindOutcome::Found(Vec::new())); } } @@ -663,6 +692,70 @@ mod node_implementation { // the block was a descendent. Ok(FindOutcome::Failure(is_descendent_of)) } + + /// Find a node in the tree that is the deepest ancestor of the given + /// block hash which also passes the given predicate, backtracking + /// when the predicate fails. + /// The given function `is_descendent_of` should return `true` if the second hash (target) + /// is a descendent of the first hash (base). + pub fn find_node_where( + &self, + hash: &H, + number: &N, + is_descendent_of: &F, + predicate: &P, + ) -> Result>, Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, + { + let outcome = self.find_node_index_where(hash, number, is_descendent_of, predicate)?; + + match outcome { + FindOutcome::Abort => Ok(FindOutcome::Abort), + FindOutcome::Failure(f) => Ok(FindOutcome::Failure(f)), + FindOutcome::Found(mut indexes) => { + let mut cur = self; + + while let Some(i) = indexes.pop() { + cur = &cur.children[i]; + } + Ok(FindOutcome::Found(cur)) + }, + } + } + + /// Find a node in the tree that is the deepest ancestor of the given + /// block hash which also passes the given predicate, backtracking + /// when the predicate fails. + /// The given function `is_descendent_of` should return `true` if the second hash (target) + /// is a descendent of the first hash (base). + pub fn find_node_where_mut( + &mut self, + hash: &H, + number: &N, + is_descendent_of: &F, + predicate: &P, + ) -> Result>, Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, + { + let outcome = self.find_node_index_where(hash, number, is_descendent_of, predicate)?; + + match outcome { + FindOutcome::Abort => Ok(FindOutcome::Abort), + FindOutcome::Failure(f) => Ok(FindOutcome::Failure(f)), + FindOutcome::Found(mut indexes) => { + let mut cur = self; + + while let Some(i) = indexes.pop() { + cur = &mut cur.children[i]; + } + Ok(FindOutcome::Found(cur)) + }, + } + } } } -- GitLab From de2ffd937db78093efaa58d7cc08f5599a8f4728 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sat, 1 Feb 2020 18:08:39 +0000 Subject: [PATCH 237/296] Don't attempt to upgrade balances module on chain start (#4802) * Introduce vesting to node, debug message for upgrades and fix them * Bump spec version --- Cargo.lock | 1 + bin/node/cli/src/chain_spec.rs | 3 ++- bin/node/runtime/Cargo.toml | 2 ++ bin/node/runtime/src/lib.rs | 12 +++++++++--- bin/node/testing/src/genesis.rs | 1 + frame/balances/src/lib.rs | 5 ++++- 6 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 64652d30ed..814cfbbe2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3209,6 +3209,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api 2.0.0", "pallet-treasury 2.0.0", "pallet-utility 2.0.0", + "pallet-vesting 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index 4ce0c8f49b..868b991480 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -298,7 +298,8 @@ pub fn testnet_genesis( members: endowed_accounts[0..3].to_vec(), pot: 0, max_members: 999, - }) + }), + pallet_vesting: Some(Default::default()), } } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 7bc105b55e..3f8e8b6731 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -65,6 +65,7 @@ pallet-treasury = { version = "2.0.0", default-features = false, path = "../../. pallet-utility = { version = "2.0.0", default-features = false, path = "../../../frame/utility" } pallet-transaction-payment = { version = "2.0.0", default-features = false, path = "../../../frame/transaction-payment" } pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } +pallet-vesting = { version = "2.0.0", default-features = false, path = "../../../frame/vesting" } [build-dependencies] wasm-builder-runner = { version = "1.0.4", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } @@ -125,4 +126,5 @@ std = [ "sp-version/std", "pallet-society/std", "pallet-recovery/std", + "pallet-vesting/std", ] diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 0e6a337a8b..f2c374cedd 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -35,8 +35,7 @@ use sp_runtime::{ use sp_runtime::curve::PiecewiseLinear; use sp_runtime::transaction_validity::TransactionValidity; use sp_runtime::traits::{ - self, BlakeTwo256, Block as BlockT, StaticLookup, SaturatedConversion, - OpaqueKeys, + self, BlakeTwo256, Block as BlockT, StaticLookup, SaturatedConversion, ConvertInto, OpaqueKeys, }; use sp_version::RuntimeVersion; #[cfg(any(feature = "std", test))] @@ -80,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 211, + spec_version: 212, impl_version: 0, apis: RUNTIME_API_VERSIONS, }; @@ -586,6 +585,12 @@ impl pallet_society::Trait for Runtime { type ChallengePeriod = ChallengePeriod; } +impl pallet_vesting::Trait for Runtime { + type Event = Event; + type Currency = Balances; + type BlockNumberToBalance = ConvertInto; +} + construct_runtime!( pub enum Runtime where Block = Block, @@ -619,6 +624,7 @@ construct_runtime!( Identity: pallet_identity::{Module, Call, Storage, Event}, Society: pallet_society::{Module, Call, Storage, Event, Config}, Recovery: pallet_recovery::{Module, Call, Storage, Event}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, } ); diff --git a/bin/node/testing/src/genesis.rs b/bin/node/testing/src/genesis.rs index 5949781275..8c5514defa 100644 --- a/bin/node/testing/src/genesis.rs +++ b/bin/node/testing/src/genesis.rs @@ -100,5 +100,6 @@ pub fn config(support_changes_trie: bool, code: Option<&[u8]>) -> GenesisConfig pot: 0, max_members: 999, }), + pallet_vesting: Some(Default::default()), } } diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 3395ef0f1a..4b3e88eb9f 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -386,7 +386,9 @@ decl_storage! { pub Locks get(fn locks): map hasher(blake2_256) T::AccountId => Vec>; /// True if network has been upgraded to this version. - IsUpgraded: bool = true; + /// + /// True for new networks. + IsUpgraded build(|_: &GenesisConfig| true): bool; } add_extra_genesis { config(balances): Vec<(T::AccountId, T::Balance)>; @@ -561,6 +563,7 @@ impl, I: Instance> Module { // Upgrade from the pre-#4649 balances/vesting into the new balances. pub fn do_upgrade() { + sp_runtime::print("Upgrading account balances..."); // First, migrate from old FreeBalance to new Account. // We also move all locks across since only accounts with FreeBalance values have locks. // FreeBalance: map T::AccountId => T::Balance -- GitLab From 2dc9b5504ce67c67317faec9fc4694b7f5651a5c Mon Sep 17 00:00:00 2001 From: Demi Obenour <48690212+DemiMarie-parity@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:13:55 +0000 Subject: [PATCH 238/296] Bump dependencies (#4808) This pulls in the latest release of *ring* and also removes some duplicate dependencies. --- Cargo.lock | 238 ++++++++++++------------ primitives/arithmetic/fuzzer/Cargo.lock | 214 +++++++++------------ 2 files changed, 204 insertions(+), 248 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 814cfbbe2a..c468e3e7c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,7 +6,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -179,7 +179,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -205,7 +205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.42" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", @@ -276,7 +276,7 @@ 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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -478,7 +478,7 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -494,7 +494,7 @@ name = "cc" version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jobserver 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -519,7 +519,7 @@ dependencies = [ "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sc-keystore 2.0.0", "sp-core 2.0.0", - "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -656,7 +656,7 @@ dependencies = [ "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -690,7 +690,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -747,7 +747,7 @@ dependencies = [ "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -768,10 +768,10 @@ dependencies = [ "oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1058,7 +1058,7 @@ dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1070,7 +1070,7 @@ dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1176,7 +1176,7 @@ name = "failure" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1518,7 +1518,7 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1704,7 +1704,7 @@ dependencies = [ "bstr 0.2.10 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1726,12 +1726,12 @@ dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1975,7 +1975,7 @@ dependencies = [ [[package]] name = "hyper" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2007,7 +2007,7 @@ dependencies = [ "rustls 0.16.0 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2131,7 +2131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jobserver" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2158,7 +2158,7 @@ dependencies = [ "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2173,7 +2173,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2287,7 +2287,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2313,9 +2313,9 @@ dependencies = [ "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2395,7 +2395,7 @@ dependencies = [ "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2421,10 +2421,10 @@ dependencies = [ "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2475,7 +2475,7 @@ dependencies = [ "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2498,7 +2498,7 @@ dependencies = [ "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2514,7 +2514,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2537,7 +2537,7 @@ dependencies = [ "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2560,7 +2560,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2593,7 +2593,7 @@ dependencies = [ "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2649,7 +2649,7 @@ dependencies = [ "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2667,7 +2667,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2726,7 +2726,7 @@ dependencies = [ "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2996,7 +2996,7 @@ dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.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)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3017,9 +3017,9 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.27 (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.53 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3091,7 +3091,7 @@ dependencies = [ "sp-runtime 2.0.0", "sp-timestamp 2.0.0", "sp-transaction-pool 2.0.0", - "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-build-script-utils 2.0.0", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3254,7 +3254,7 @@ dependencies = [ "sp-inherents 2.0.0", "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", - "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-build-script-utils 2.0.0", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3444,7 +3444,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.26" +version = "0.10.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3452,7 +3452,7 @@ dependencies = [ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3462,10 +3462,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.53" +version = "0.9.54" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3659,7 +3659,7 @@ dependencies = [ "pallet-contracts-rpc-runtime-api 0.8.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", @@ -4092,7 +4092,7 @@ dependencies = [ "frame-support 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", @@ -4260,7 +4260,7 @@ dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4350,7 +4350,7 @@ dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4499,10 +4499,10 @@ dependencies = [ [[package]] name = "proc-macro-error" -version = "0.4.5" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-error-attr 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4511,14 +4511,14 @@ dependencies = [ [[package]] name = "proc-macro-error-attr" -version = "0.4.5" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "syn-mid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4872,12 +4872,12 @@ dependencies = [ [[package]] name = "regex" -version = "1.3.3" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4891,7 +4891,7 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -4915,7 +4915,7 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.9" +version = "0.16.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4989,9 +4989,9 @@ 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.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5060,7 +5060,7 @@ dependencies = [ "sc-keystore 2.0.0", "sc-network 0.8.0", "sc-peerset 2.0.0", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-authority-discovery 2.0.0", "sp-blockchain 2.0.0", @@ -5117,7 +5117,7 @@ dependencies = [ "sc-network 0.8.0", "sc-telemetry 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-runtime 2.0.0", ] @@ -5148,21 +5148,21 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sc-network 0.8.0", "sc-service 0.8.0", "sc-telemetry 2.0.0", "sc-tracing 2.0.0", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-blockchain 2.0.0", "sp-core 2.0.0", "sp-keyring 2.0.0", "sp-panic-handler 2.0.0", "sp-runtime 2.0.0", "sp-state-machine 0.8.0", - "structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5546,7 +5546,7 @@ dependencies = [ "sc-network-gossip 0.8.0", "sc-network-test 0.8.0", "sc-telemetry 2.0.0", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-arithmetic 2.0.0", "sp-blockchain 2.0.0", @@ -5572,7 +5572,7 @@ dependencies = [ "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5609,7 +5609,7 @@ dependencies = [ "sc-client-api 2.0.0", "sc-peerset 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5711,7 +5711,7 @@ dependencies = [ "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5735,7 +5735,7 @@ dependencies = [ "sc-network 0.8.0", "sc-rpc-api 0.8.0", "sc-transaction-pool 2.0.0", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", @@ -5765,7 +5765,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-rpc 2.0.0", "sp-transaction-pool 2.0.0", @@ -5782,7 +5782,7 @@ dependencies = [ "jsonrpc-ws-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-runtime 2.0.0", ] @@ -5830,7 +5830,7 @@ dependencies = [ "sc-tracing 2.0.0", "sc-transaction-pool 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", @@ -5912,7 +5912,7 @@ dependencies = [ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-telemetry 2.0.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6016,7 +6016,7 @@ name = "sct" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.45" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6182,7 +6182,7 @@ dependencies = [ "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6216,7 +6216,7 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -6226,7 +6226,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6245,7 +6245,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6477,11 +6477,11 @@ dependencies = [ "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", "sp-externalities 0.8.0", @@ -6586,7 +6586,7 @@ dependencies = [ name = "sp-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6607,7 +6607,7 @@ name = "sp-rpc" version = "2.0.0" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", ] @@ -6621,7 +6621,7 @@ dependencies = [ "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-arithmetic 2.0.0", "sp-core 2.0.0", @@ -6702,7 +6702,7 @@ name = "sp-serializer" version = "2.0.0" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6877,21 +6877,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.4.1" +version = "0.4.2" 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-macro-error 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7132,7 +7132,7 @@ dependencies = [ [[package]] name = "syn-mid" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7299,7 +7299,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7450,7 +7450,7 @@ dependencies = [ "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (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.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7636,7 +7636,7 @@ dependencies = [ "log 0.4.8 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7669,7 +7669,7 @@ dependencies = [ "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7742,7 +7742,7 @@ name = "unicode-normalization" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7847,7 +7847,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8124,10 +8124,10 @@ dependencies = [ [[package]] name = "webpki" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8136,7 +8136,7 @@ name = "webpki-roots" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8144,7 +8144,7 @@ name = "webpki-roots" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8379,7 +8379,7 @@ dependencies = [ "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b4b1549d804b6c73f4817df2ba073709e96e426f12987127c48e6745568c350b" +"checksum backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)" = "7f80256bc78f67e7df7e36d77366f636ed976895d91fe2ab9efa3973e8fe8c4f" "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" "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" @@ -8552,7 +8552,7 @@ dependencies = [ "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" "checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" "checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" -"checksum hyper 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8bf49cfb32edee45d890537d9057d1b02ed55f53b7b6a30bae83a38c9231749e" +"checksum hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1c527bbc634be72aa7ba31e4e4def9bbb020f5416916279b7c705cd838893e" "checksum hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "719d85c7df4a7f309a77d145340a063ea929dcb2e025bae46a80345cffec2952" "checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" @@ -8569,7 +8569,7 @@ dependencies = [ "checksum ipnet 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f4b06b21db0228860c8dfd17d2106c49c7c6bd07477a4036985347d84def04" "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" "checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum jobserver 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "67b06c1b455f1cf4269a8cfc320ab930a810e2375a42af5075eb8a8b36405ce0" +"checksum jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" "checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" "checksum jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0a9ae166c4d1f702d297cd76d4b55758ace80272ffc6dbb139fdc1bf810de40b" "checksum jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970" @@ -8659,9 +8659,9 @@ dependencies = [ "checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" "checksum oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405" "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -"checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585" +"checksum openssl 0.10.27 (registry+https://github.com/rust-lang/crates.io-index)" = "e176a45fedd4c990e26580847a525e39e16ec32ac78957dbf62ded31b3abfd6f" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)" = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f" +"checksum openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)" = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" "checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c276d76c5333b8c2579e02d49a06733a55b8282d2d9b13e8d53b6406bd7e30a" @@ -8702,8 +8702,8 @@ dependencies = [ "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" "checksum primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro-error 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1b79a464461615532fcc8a6ed8296fa66cc12350c18460ab3f4594a6cee0fcb6" -"checksum proc-macro-error-attr 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "23832e5eae6bac56bbac190500eef1aaede63776b5cd131eaa4ee7fe120cd892" +"checksum proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "875077759af22fa20b610ad4471d8155b321c89c3f2785526c9839b099be4e0a" +"checksum proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c5717d9fa2664351a01ed73ba5ef6df09c01a521cb42cb65a061432a826f3c7a" "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" "checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" @@ -8741,12 +8741,12 @@ dependencies = [ "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" -"checksum regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87" +"checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" "checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" -"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90" +"checksum regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" "checksum region 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "448e868c6e4cfddfa49b6a72c95906c04e8547465e9536575b95c70a4044f856" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6747f8da1f2b1fabbee1aaa4eb8a11abf9adef0bf58a41cee45db5d59cecdfac" +"checksum ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)" = "113f53b644c5442e20ff3a299be3d6c61ba143737af5bd2ab298e248a7575b2d" "checksum rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3a44d5ae8afcb238af8b75640907edc6c931efcfab2c854e81ed35fa080f84cd" "checksum rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12069b106981c6103d3eab7dd1c86751482d0779a520b7c14954c8b586c1e643" "checksum rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" @@ -8777,7 +8777,7 @@ dependencies = [ "checksum send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "eab8f15f15d6c41a154c1b128a22f2dfabe350ef53c40953d84e36155c91192b" +"checksum serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)" = "21b01d7f0288608a01dca632cf1df859df6fd6ffa885300fc275ce2ba6221953" "checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" @@ -8791,7 +8791,7 @@ dependencies = [ "checksum slog-scope 4.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c44c89dd8b0ae4537d1ae318353eaf7840b4869c536e31c41e963d1ea523ee6" "checksum slog_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -"checksum smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44e59e0c9fa00817912ae6e4e6e3c4fe04455e75699d06eedc7d85917ed8e8f4" +"checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" "checksum snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" "checksum soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" @@ -8802,15 +8802,15 @@ dependencies = [ "checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" "checksum string-interner 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd710eadff449a1531351b0e43eb81ea404336fa2f56c777427ab0e32a4cf183" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum structopt 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "df136b42d76b1fbea72e2ab3057343977b04b4a2e00836c3c7c0673829572713" -"checksum structopt-derive 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd50a87d2f7b8958055f3e73a963d78feaccca3836767a9069844e34b5b03c0a" +"checksum structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "a1bcbed7d48956fcbb5d80c6b95aedb553513de0a1b451ea92679d999c010e98" +"checksum structopt-derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "095064aa1f5b94d14e635d0a5684cf140c43ae40a0fd990708d38f5d669e5f64" "checksum strum 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" "checksum strum_macros 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" "checksum substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" "checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" -"checksum syn-mid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd3937748a7eccff61ba5b90af1a20dbf610858923a9192ea0ecb0cb77db1d0" +"checksum syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" "checksum sysinfo 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4b2468c629cffba39c0a4425849ab3cdb03d9dfacba69684609aea04d08ff9" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" @@ -8909,7 +8909,7 @@ dependencies = [ "checksum wasmtime-jit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ed7922689461a7b5bd0d9c7350cac526c8a520a23b3ffd7f5b446ac51dfc51f" "checksum wasmtime-runtime 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "781d6bb8b346efaa3dc39746386957cd79b8d841e8652ed9b02d77bcf64fb514" "checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" -"checksum webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d7e664e770ac0110e2384769bcc59ed19e329d81f555916a6e072714957b81b4" +"checksum webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1f50e1972865d6b1adb54167d1c8ed48606004c2c9d0ea5f1eeb34d95e863ef" "checksum webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b" "checksum webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" "checksum websocket 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)" = "413b37840b9e27b340ce91b319ede10731de8c72f5bc4cb0206ec1ca4ce581d0" diff --git a/primitives/arithmetic/fuzzer/Cargo.lock b/primitives/arithmetic/fuzzer/Cargo.lock index de8a764f1f..41bd9cc3ba 100644 --- a/primitives/arithmetic/fuzzer/Cargo.lock +++ b/primitives/arithmetic/fuzzer/Cargo.lock @@ -7,25 +7,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "arrayvec" -version = "0.4.12" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "autocfg" -version = "0.1.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bitvec" -version = "0.14.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byte-slice-cast" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -53,23 +50,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "getrandom" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,12 +84,12 @@ name = "impl-codec" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-scale-codec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "integer-sqrt" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -102,7 +99,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.65" +version = "0.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -110,63 +107,58 @@ name = "memmap" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "num-bigint" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (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)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-integer" -version = "0.1.41" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-scale-codec" -version = "1.0.6" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "bitvec 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec-derive 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-scale-codec-derive" -version = "1.0.3" +version = "1.1.1" 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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -176,10 +168,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "primitive-types" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -189,48 +181,32 @@ name = "proc-macro-crate" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro2" -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)", -] - -[[package]] -name = "proc-macro2" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "quote" -version = "0.6.13" -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)", -] - [[package]] name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -250,7 +226,7 @@ name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -263,35 +239,35 @@ dependencies = [ [[package]] name = "rustc-hex" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sp-arithmetic" version = "2.0.0" dependencies = [ - "integer-sqrt 0.1.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-scale-codec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", + "integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", "sp-std 2.0.0", ] @@ -301,9 +277,9 @@ name = "sp-arithmetic-fuzzer" version = "2.0.0" dependencies = [ "honggfuzz 0.5.45 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-arithmetic 2.0.0", ] @@ -311,9 +287,9 @@ dependencies = [ name = "sp-debug-derive" version = "2.0.0" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -327,30 +303,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.44" -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.13 (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 = "syn" -version = "1.0.8" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -360,15 +326,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "unicode-xid" version = "0.2.0" @@ -376,7 +337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasi" -version = "0.7.0" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -400,50 +361,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arbitrary 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "64cf76cb6e2222ed0ea86b2b0ee2f71c96ec6edd5af42e84d59160e91b836ec4" -"checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" -"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" -"checksum bitvec 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9633b74910e1870f50f5af189b08487195cdb83c0e27a71d6f64d5e09dd0538b" -"checksum byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f6209f3b2c1edea170002e016d5ead6903d3bb0a846477f53bbeb614967a52a9" +"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" +"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +"checksum bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a993f74b4c99c1908d156b8d2e0fb6277736b0ecbd833982fd1241d39b2766a6" +"checksum byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" "checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -"checksum fixed-hash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72fe7539e2c5692c6989f2f9c0457e42f1e5768f96b85c87d273574670ae459f" -"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407" +"checksum fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" +"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" "checksum honggfuzz 0.5.45 (registry+https://github.com/rust-lang/crates.io-index)" = "24c27b4aa3049d6d10d8e33d52c9d03ca9aec18f8a449b246f8c4a5b0c10fb34" "checksum impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" -"checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" +"checksum integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" +"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -"checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -"checksum num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f9c3f34cdd24f334cb265d9bf8bfa8a241920d026916785747a92f0e55541a1a" -"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 parity-scale-codec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "001fbbb956d8593f321c7a784f64d16b2c99b2657823976eea729006ad2c3668" -"checksum parity-scale-codec-derive 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42af752f59119656fa3cb31e8852ed24e895b968c0bdb41847da7f0cea6d155f" +"checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +"checksum parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" +"checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" -"checksum primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0253db64c26d8b4e7896dd2063b516d2a1b9e0a5da26b5b78335f236d1e9522" +"checksum primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" "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 proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" -"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" -"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" +"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" -"checksum serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4b39bd9b0b087684013a792c59e3e07a46a01d2322518d8a1104641a0b1be0" -"checksum serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "ca13fc1a832f793322228923fbb3aba9f3f44444898f835d31ad1b74fa0a2bf8" +"checksum rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" "checksum static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -"checksum syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "661641ea2aa15845cddeb97dad000d22070bb5c1fb456b96c1cba883ec691e92" -"checksum toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "01d1404644c8b12b16bfcffa4322403a91a451584daaaa7c28d3152e6cbc98cf" +"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" +"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" "checksum uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" +"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -- GitLab From 9195fac755df57e18ed59fbd358ee528d2a52d0e Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Mon, 3 Feb 2020 09:55:09 +0100 Subject: [PATCH 239/296] block_import: switch to Box for intermediates representation (#4809) * block_import: switch to Box for intermediates representation * Use Cow and return Error instead of Option * Remove unused error * Distinguish NoIntermediate/InvalidIntermediate --- client/consensus/pow/src/lib.rs | 18 +++++----- .../consensus/common/src/block_import.rs | 34 ++++++++++++++++++- primitives/consensus/common/src/error.rs | 6 ++++ 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index ca7285b7fe..87f51be216 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -30,6 +30,8 @@ //! clients. use std::sync::Arc; +use std::any::Any; +use std::borrow::Cow; use std::thread; use std::collections::HashMap; use std::marker::PhantomData; @@ -63,8 +65,6 @@ pub enum Error { InvalidSeal, #[display(fmt = "PoW validation error: invalid difficulty")] InvalidDifficulty, - #[display(fmt = "PoW block import expects an intermediate, but not found one")] - NoIntermediate, #[display(fmt = "Rejecting block too far in future")] TooFarInFuture, #[display(fmt = "Fetching best header failed using select chain: {:?}", _0)] @@ -257,6 +257,7 @@ impl BlockImport for PowBlockImport + Send + Sync + HeaderBackend + AuxStore + ProvideCache + BlockOf, C::Api: BlockBuilderApi, Algorithm: PowAlgorithm, + Algorithm::Difficulty: 'static, { type Error = ConsensusError; type Transaction = sp_api::TransactionFor; @@ -312,10 +313,9 @@ impl BlockImport for PowBlockImport return Err(Error::::HeaderUnsealed(block.header.hash()).into()), }; - let intermediate = PowIntermediate::::decode( - &mut &block.intermediates.remove(INTERMEDIATE_KEY) - .ok_or(Error::::NoIntermediate)?[..] - ).map_err(|_| Error::::NoIntermediate)?; + let intermediate = block.take_intermediate::>( + INTERMEDIATE_KEY + )?; let difficulty = match intermediate.difficulty { Some(difficulty) => difficulty, @@ -392,6 +392,7 @@ impl PowVerifier { impl Verifier for PowVerifier where Algorithm: PowAlgorithm + Send + Sync, + Algorithm::Difficulty: 'static, { fn verify( &mut self, @@ -418,7 +419,7 @@ impl Verifier for PowVerifier where justification, intermediates: { let mut ret = HashMap::new(); - ret.insert(INTERMEDIATE_KEY.to_vec(), intermediate.encode()); + ret.insert(Cow::from(INTERMEDIATE_KEY), Box::new(intermediate) as Box); ret }, auxiliary: vec![], @@ -553,6 +554,7 @@ fn mine_loop( ) -> Result<(), Error> where C: HeaderBackend + AuxStore + ProvideRuntimeApi, Algorithm: PowAlgorithm, + Algorithm::Difficulty: 'static, E: Environment, E::Proposer: Proposer>, E::Error: std::fmt::Debug, @@ -659,7 +661,7 @@ fn mine_loop( storage_changes: Some(proposal.storage_changes), intermediates: { let mut ret = HashMap::new(); - ret.insert(INTERMEDIATE_KEY.to_vec(), intermediate.encode()); + ret.insert(Cow::from(INTERMEDIATE_KEY), Box::new(intermediate) as Box); ret }, finalized: false, diff --git a/primitives/consensus/common/src/block_import.rs b/primitives/consensus/common/src/block_import.rs index af1b61a9fe..952a044e9b 100644 --- a/primitives/consensus/common/src/block_import.rs +++ b/primitives/consensus/common/src/block_import.rs @@ -22,7 +22,9 @@ use serde::{Serialize, Deserialize}; use std::borrow::Cow; use std::collections::HashMap; use std::sync::Arc; +use std::any::Any; +use crate::Error; use crate::import_queue::{Verifier, CacheKeyId}; /// Block import result. @@ -144,7 +146,7 @@ pub struct BlockImportParams { /// Intermediate values that are interpreted by block importers. Each block importer, /// upon handling a value, removes it from the intermediate list. The final block importer /// rejects block import if there are still intermediate values that remain unhandled. - pub intermediates: HashMap, Vec>, + pub intermediates: HashMap, Box>, /// Auxiliary consensus data produced by the block. /// Contains a list of key-value pairs. If values are `None`, the keys /// will be deleted. @@ -223,6 +225,36 @@ impl BlockImportParams { import_existing: self.import_existing, } } + + /// Take interemdiate by given key, and remove it from the processing list. + pub fn take_intermediate(&mut self, key: &[u8]) -> Result, Error> { + if self.intermediates.contains_key(key) { + self.intermediates.remove(key) + .ok_or(Error::NoIntermediate) + .and_then(|value| { + value.downcast::() + .map_err(|_| Error::InvalidIntermediate) + }) + } else { + Err(Error::NoIntermediate) + } + } + + /// Get a reference to a given intermediate. + pub fn intermediate(&self, key: &[u8]) -> Result<&T, Error> { + self.intermediates.get(key) + .ok_or(Error::NoIntermediate)? + .downcast_ref::() + .ok_or(Error::InvalidIntermediate) + } + + /// Get a mutable reference to a given intermediate. + pub fn intermediate_mut(&mut self, key: &[u8]) -> Result<&mut T, Error> { + self.intermediates.get_mut(key) + .ok_or(Error::NoIntermediate)? + .downcast_mut::() + .ok_or(Error::InvalidIntermediate) + } } /// Block import trait. diff --git a/primitives/consensus/common/src/error.rs b/primitives/consensus/common/src/error.rs index 972e4a2d48..c802831d65 100644 --- a/primitives/consensus/common/src/error.rs +++ b/primitives/consensus/common/src/error.rs @@ -31,6 +31,12 @@ pub enum Error { /// I/O terminated unexpectedly #[display(fmt="I/O terminated unexpectedly.")] IoTerminated, + /// Intermediate missing. + #[display(fmt="Missing intermediate.")] + NoIntermediate, + /// Intermediate is of wrong type. + #[display(fmt="Invalid intermediate.")] + InvalidIntermediate, /// Unable to schedule wakeup. #[display(fmt="Timer error: {}", _0)] FaultyTimer(std::io::Error), -- GitLab From 59947b9e55a4569432cc1dbf4660f045869356b9 Mon Sep 17 00:00:00 2001 From: Demi Obenour <48690212+DemiMarie-parity@users.noreply.github.com> Date: Mon, 3 Feb 2020 19:19:33 +0000 Subject: [PATCH 240/296] Switch to the new lockfile format (#4816) This will hopefully reduce merge conflicts in the future --- Cargo.lock | 8492 +++++++++++------------ primitives/arithmetic/fuzzer/Cargo.lock | 232 +- 2 files changed, 4356 insertions(+), 4368 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c468e3e7c8..d9fbff15de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,6743 +4,7175 @@ name = "Inflector" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "regex", ] [[package]] name = "adler32" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" [[package]] name = "aes-ctr" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" dependencies = [ - "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "aes-soft", + "aesni", + "ctr", + "stream-cipher", ] [[package]] name = "aes-soft" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" dependencies = [ - "block-cipher-trait 0.6.2 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-cipher-trait", + "byteorder 1.3.2", + "opaque-debug", ] [[package]] name = "aesni" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "block-cipher-trait", + "opaque-debug", + "stream-cipher", ] [[package]] name = "ahash" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f33b5018f120946c1dcf279194f238a9f146725593ead1c08fa47ff22b0b5d3" dependencies = [ - "const-random 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "const-random", ] [[package]] name = "aho-corasick" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f56c476256dc249def911d6f7580b5fc7e875895b5d7ee88f5d602208035744" dependencies = [ - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "ansi_term" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "anyhow" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" [[package]] name = "app_dirs" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" dependencies = [ - "ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ole32-sys", + "shell32-sys", + "winapi 0.2.8", + "xdg", ] [[package]] name = "arc-swap" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" [[package]] name = "arrayref" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" dependencies = [ - "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop", ] [[package]] name = "arrayvec" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" [[package]] name = "asn1_der" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fce6b6a0ffdafebd82c87e79e3f40e8d2c523e5fea5566ff6b90509bf98d638" dependencies = [ - "asn1_der_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "asn1_der_derive", ] [[package]] name = "asn1_der_derive" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2", + "syn", ] [[package]] name = "assert_matches" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" [[package]] name = "async-std" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "async-task 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "broadcaster 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" +dependencies = [ + "async-task", + "broadcaster", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils 0.7.0", + "futures-core", + "futures-io", + "futures-timer 2.0.2", + "kv-log-macro", + "log 0.4.8", + "memchr", + "mio", + "mio-uds", + "num_cpus", + "once_cell 1.3.1", + "pin-project-lite", + "pin-utils", + "slab", ] [[package]] name = "async-task" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "winapi 0.3.8", ] [[package]] name = "async-tls" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce6977f57fa68da77ffe5542950d47e9c23d65f5bc7cb0a9f8700996913eec7" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "rustls", + "webpki", + "webpki-roots 0.17.0", ] [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", + "winapi 0.3.8", ] [[package]] name = "autocfg" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" [[package]] name = "autocfg" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "backtrace" version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f80256bc78f67e7df7e36d77366f636ed976895d91fe2ab9efa3973e8fe8c4f" dependencies = [ - "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys", + "cfg-if", + "libc", + "rustc-demangle", ] [[package]] name = "backtrace-sys" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "libc", ] [[package]] name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" [[package]] name = "base64" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "safemem", ] [[package]] name = "base64" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", ] [[package]] name = "base64" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "bincode" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "serde", ] [[package]] name = "bindgen" version = "0.49.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c07087f3d5731bf3fb375a81841b99597e25dc11bd3bc72d16d43adf6624a6e" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (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.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cexpr", + "cfg-if", + "clang-sys", + "clap", + "env_logger 0.6.2", + "fxhash", + "lazy_static", + "log 0.4.8", + "peeking_take_while", + "proc-macro2 0.4.30", + "quote 0.6.13", + "regex", + "shlex", + "which 2.0.1", ] [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "bitmask" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" [[package]] name = "bitvec" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993f74b4c99c1908d156b8d2e0fb6277736b0ecbd833982fd1241d39b2766a6" [[package]] name = "blake2" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" dependencies = [ - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools", + "crypto-mac", + "digest", + "opaque-debug", ] [[package]] name = "blake2-rfc" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" dependencies = [ - "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.12", + "constant_time_eq", ] [[package]] name = "blake2b_simd" version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" dependencies = [ - "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref", + "arrayvec 0.5.1", + "constant_time_eq", ] [[package]] name = "block-buffer" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ - "block-padding 0.1.5 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding", + "byte-tools", + "byteorder 1.3.2", + "generic-array", ] [[package]] name = "block-cipher-trait" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array", ] [[package]] name = "block-padding" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" dependencies = [ - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools", ] [[package]] name = "broadcaster" -version = "0.2.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c972e21e0d055a36cf73e4daae870941fe7a8abcd5ac3396aab9e4c126bd87" dependencies = [ - "futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel", + "futures-core", + "futures-sink", + "futures-util", + "parking_lot 0.10.0", + "slab", ] [[package]] name = "browser-utils" version = "0.8.0" dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-chain-spec 2.0.0", - "sc-network 0.8.0", - "sc-service 0.8.0", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "clear_on_drop", + "console_error_panic_hook", + "console_log", + "futures 0.1.29", + "futures 0.3.1", + "js-sys", + "kvdb-web", + "libp2p", + "log 0.4.8", + "rand 0.6.5", + "rand 0.7.3", + "sc-chain-spec", + "sc-network", + "sc-service", + "wasm-bindgen", + "wasm-bindgen-futures", ] [[package]] name = "bs58" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95ee6bba9d950218b6cc910cf62bc9e0a171d0f4537e3627b0f54d08549b188" [[package]] name = "bs58" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" [[package]] name = "bstr" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe8a65814ca90dfc9705af76bb6ba3c6e2534489a72270e797e603783bb4990b" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "memchr", + "regex-automata", + "serde", ] [[package]] name = "build-helper" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.6.0", ] [[package]] name = "bumpalo" version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fb8038c1ddc0a5f73787b130f4cc75151e96ed33e417fde765eb5a81e3532f4" [[package]] name = "byte-slice-cast" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" [[package]] name = "byte-tools" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" [[package]] name = "byteorder" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" [[package]] name = "bytes" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "either", + "iovec", ] [[package]] name = "bytes" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" [[package]] name = "c2-chacha" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", ] [[package]] name = "c_linked_list" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" [[package]] name = "cargo_metadata" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e3374c604fb39d1a2f35ed5e4a4e30e60d01fab49446e08f1b3e9a90aef202" dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", ] [[package]] name = "cast" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version", ] [[package]] name = "cc" version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" dependencies = [ - "jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "jobserver", ] [[package]] name = "cexpr" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce5b5fb86b0c57c20c834c1b412fd09c77c8a59b9473f86272709e78874cd1d" dependencies = [ - "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "nom", ] [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "chain-spec-builder" version = "2.0.0" dependencies = [ - "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "node-cli 2.0.0", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-keystore 2.0.0", - "sp-core 2.0.0", - "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term 0.12.1", + "node-cli", + "rand 0.7.3", + "sc-keystore", + "sp-core", + "structopt", ] [[package]] name = "chrono" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" dependencies = [ - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer", + "num-traits", + "serde", + "time", ] [[package]] name = "clang-sys" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853" dependencies = [ - "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "glob 0.3.0", + "libc", + "libloading", ] [[package]] name = "clap" version = "2.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term 0.11.0", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", ] [[package]] name = "cloudabi" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", ] [[package]] name = "cmake" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", ] [[package]] name = "console_error_panic_hook" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "wasm-bindgen", ] [[package]] name = "console_log" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8", + "web-sys", ] [[package]] name = "const-random" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f1af9ac737b2dd2d577701e59fd09ba34822f6f2ebdb30a7647405d9e55e16a" dependencies = [ - "const-random-macro 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "const-random-macro", + "proc-macro-hack", ] [[package]] name = "const-random-macro" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e4c606eb459dd29f7c57b2e0879f2b6f14ee130918c2b78ccb58a9624e6c7a" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "proc-macro-hack", ] [[package]] name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "core-foundation" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys", + "libc", ] [[package]] name = "core-foundation-sys" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" [[package]] name = "cranelift-bforest" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd05aac8cefcde54ce26178df8f36cb1f518ac691db650e7d2440c2b6b41c4dc" dependencies = [ - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-entity", ] [[package]] name = "cranelift-codegen" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c63d9b6ff8a94f98deabab21880d7fd54996e0e16be687b6f80a3b6bdd9c188d" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-bforest 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen-meta 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen-shared 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "log 0.4.8", + "serde", + "smallvec 1.2.0", + "target-lexicon", + "thiserror", ] [[package]] name = "cranelift-codegen-meta" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cb3df51c2c07d719d02869bfac6cabd8d82ee308d5b29ca62e6528723cc33a4" dependencies = [ - "cranelift-codegen-shared 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-codegen-shared", + "cranelift-entity", ] [[package]] name = "cranelift-codegen-shared" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758f9426b2e22bf83fc1a6b231a9d53cd4830751883c7f0e196ebb3c210467b3" [[package]] name = "cranelift-entity" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff064733df8b98f453060264a8790393d1e807aca6942706b42f79a4f7aae9ed" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "cranelift-frontend" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eaafb5fa623dcbe19a28084a8226d7a1b17184a949c1a1f29a46b479867998d" dependencies = [ - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-codegen", + "log 0.4.8", + "smallvec 1.2.0", + "target-lexicon", ] [[package]] name = "cranelift-native" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90033dbd7293f6fad4cf9dcd769cd621d60df22b1c5a11799e86359b7447a51d" dependencies = [ - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "raw-cpuid 7.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-codegen", + "raw-cpuid", + "target-lexicon", ] [[package]] name = "cranelift-wasm" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cb82a1071f88822763a583ec1a8688ffe5e2cda02c111d4483dd4376ed14d8" dependencies = [ - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "log 0.4.8", + "serde", + "thiserror", + "wasmparser", ] [[package]] name = "crc32fast" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "criterion" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" +dependencies = [ + "atty", + "cast", + "clap", + "criterion-plot 0.3.1", + "csv", + "itertools", + "lazy_static", + "libc", + "num-traits", + "rand_core 0.3.1", + "rand_os", + "rand_xoshiro", + "rayon", + "rayon-core", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", ] [[package]] name = "criterion" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc755679c12bda8e5523a71e4d654b6bf2e14bd838dfc48cde6559a05caf7d1" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "cast", + "clap", + "criterion-plot 0.4.1", + "csv", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", ] [[package]] name = "criterion-plot" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "cast", + "itertools", ] [[package]] name = "criterion-plot" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01e15e0ea58e8234f96146b1f91fa9d0e4dd7a38da93ff7a75d42c0b9d3a545" dependencies = [ - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cast", + "itertools", ] [[package]] name = "crossbeam-channel" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c" dependencies = [ - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.0", ] [[package]] name = "crossbeam-deque" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" dependencies = [ - "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch", + "crossbeam-utils 0.7.0", ] [[package]] name = "crossbeam-epoch" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "cfg-if", + "crossbeam-utils 0.7.0", + "lazy_static", + "memoffset", + "scopeguard 1.0.0", ] [[package]] name = "crossbeam-queue" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", ] [[package]] name = "crossbeam-queue" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "crossbeam-utils 0.7.0", ] [[package]] name = "crossbeam-utils" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "lazy_static", ] [[package]] name = "crossbeam-utils" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "cfg-if", + "lazy_static", ] [[package]] name = "crunchy" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-mac" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array", + "subtle 1.0.0", ] [[package]] name = "csv" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" dependencies = [ - "bstr 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", ] [[package]] name = "csv-core" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c" dependencies = [ - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "ct-logs" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113" dependencies = [ - "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sct", ] [[package]] name = "ctor" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8ce37ad4184ab2ce004c33bf6379185d3b1c95801cab51026bd271bf68eedc" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2", + "syn", ] [[package]] name = "ctr" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "block-cipher-trait", + "stream-cipher", ] [[package]] name = "cuckoofilter" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" dependencies = [ - "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 0.5.3", + "rand 0.3.23", ] [[package]] name = "curve25519-dalek" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7dcd30ba50cdf88b55b033456138b7c0ac4afdc436d82e1b79f370f24cc66d" dependencies = [ - "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.1 (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.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "clear_on_drop", + "digest", + "rand_core 0.3.1", + "subtle 2.2.2", ] [[package]] name = "curve25519-dalek" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26778518a7f6cffa1d25a44b602b62b979bd88adb9e99ffec546998cf3404839" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "digest", + "rand_core 0.5.1", + "subtle 2.2.2", + "zeroize 1.1.0", ] [[package]] name = "data-encoding" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" [[package]] name = "derive_more" version = "0.99.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2159be042979966de68315bce7034bb000c775f22e3e834e1c52ff78f041cae8" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "difference" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" [[package]] name = "digest" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array", ] [[package]] name = "directories" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "dirs-sys", ] [[package]] name = "dirs-sys" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "redox_users", + "winapi 0.3.8", ] [[package]] name = "dns-parser" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "quick-error", ] [[package]] name = "doc-comment" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923dea538cea0aa3025e8685b20d6ee21ef99c4f77e954a30febbaac5ec73a97" [[package]] name = "ed25519-dalek" version = "1.0.0-pre.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978710b352437433c97b2bff193f2fb1dfd58a093f863dd95e225a19baa599a2" dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clear_on_drop", + "curve25519-dalek 2.0.0", + "rand 0.7.3", + "sha2", ] [[package]] name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" [[package]] name = "enumflags2" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33121c8782ba948ba332dab29311b026a8716dc65a1599e5b88f392d38496af8" dependencies = [ - "enumflags2_derive 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "enumflags2_derive", ] [[package]] name = "enumflags2_derive" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecf634c5213044b8d54a46dd282cf5dd1f86bb5cb53e92c409cb4680a7fb9894" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "env_logger" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "humantime", + "log 0.4.8", + "regex", + "termcolor", ] [[package]] name = "env_logger" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "humantime", + "log 0.4.8", + "regex", + "termcolor", ] [[package]] name = "environmental" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516aa8d7a71cb00a1c4146f0798549b93d083d4f189b3ced8f3de6b8f11ee6c4" [[package]] name = "erased-serde" version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7d80305c9bd8cd78e3c753eb9fb110f83621e5211f1a3afffcc812b104daf9" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "errno" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e" dependencies = [ - "errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "errno-dragonfly", + "libc", + "winapi 0.3.8", ] [[package]] name = "errno-dragonfly" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" dependencies = [ - "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc", + "libc", ] [[package]] name = "evm" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2c6961fdc9952371fc5f0416f03a9d90378a9dfb6862f6a7a9a3b8986b8dd" dependencies = [ - "evm-core 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "evm-gasometer 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "evm-runtime 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "evm-core", + "evm-gasometer", + "evm-runtime", + "primitive-types", + "rlp", + "serde", + "sha3", ] [[package]] name = "evm-core" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcde5af3d542874ddeb53de0919302d57586ea04b3f76f54d865f8a6cdc70ae" dependencies = [ - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types", ] [[package]] name = "evm-gasometer" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b82bc9f275cb59d2bcc05d85c98736ddfaba003a7ef7b73893fa7c1c1fab29dc" dependencies = [ - "evm-core 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "evm-runtime 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "evm-core", + "evm-runtime", + "primitive-types", ] [[package]] name = "evm-runtime" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dbbc89d29618c3722c17ba78ddf432d40ace8ee27e3f8b28b52a85921112e4b" dependencies = [ - "evm-core 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "evm-core", + "primitive-types", + "sha3", ] [[package]] name = "exit-future" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", ] [[package]] name = "faerie" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f902f2af041f6c7177a2a04f805687cdc71e69c7cbef059a2755d8923f4cd7a8" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "goblin 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "string-interner 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow", + "goblin", + "indexmap", + "log 0.4.8", + "scroll", + "string-interner", + "target-lexicon", + "thiserror", ] [[package]] name = "failure" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" dependencies = [ - "backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace", + "failure_derive", ] [[package]] name = "failure_derive" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", + "synstructure", ] [[package]] name = "fake-simd" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fallible-iterator" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fdlimit" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9084c55bb76efb1496328976db88320fe7d9ee86e649e83c4ecce3ba7a9a35d1" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "file-per-thread-logger" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505b75b31ef7285168dd237c4a7db3c1f3e0927e7d314e670bc98e854272fe9" dependencies = [ - "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.2", + "log 0.4.8", ] [[package]] name = "finality-grandpa" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbb25bef9fcad97fb31e817da280b1c9174435b8769c770ee190a330dd181ea" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "futures-timer 2.0.2", + "log 0.4.8", + "num-traits", + "parity-scale-codec", + "parking_lot 0.9.0", + "rand 0.6.5", ] [[package]] name = "fixed-hash" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "libc", + "rand 0.7.3", + "rustc-hex", + "static_assertions", ] [[package]] name = "fixedbitset" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" [[package]] name = "flate2" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "crc32fast", + "libc", + "libz-sys", + "miniz_oxide", ] [[package]] name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types-shared", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fork-tree" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec", ] [[package]] name = "frame-executive" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-balances 2.0.0", - "pallet-indices 2.0.0", - "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "hex-literal", + "pallet-balances", + "pallet-indices", + "pallet-transaction-payment", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "frame-metadata" version = "11.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "serde", + "sp-core", + "sp-std", ] [[package]] name = "frame-support" version = "2.0.0" dependencies = [ - "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-metadata 11.0.0", - "frame-support-procedural 2.0.0", - "frame-system 2.0.0", - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "once_cell 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.6 (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.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-arithmetic 2.0.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bitmask", + "frame-metadata", + "frame-support-procedural", + "frame-system", + "impl-trait-for-tuples", + "log 0.4.8", + "once_cell 0.2.4", + "parity-scale-codec", + "paste", + "pretty_assertions", + "serde", + "sp-arithmetic", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "tracing", ] [[package]] name = "frame-support-procedural" version = "2.0.0" dependencies = [ - "frame-support-procedural-tools 2.0.0", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "frame-support-procedural-tools", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "frame-support-procedural-tools" version = "2.0.0" dependencies = [ - "frame-support-procedural-tools-derive 2.0.0", - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "frame-support-procedural-tools-derive", + "proc-macro-crate", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "frame-support-test" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "parity-scale-codec 1.1.2 (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.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", + "frame-support", + "parity-scale-codec", + "pretty_assertions", + "serde", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "trybuild", ] [[package]] name = "frame-system" version = "2.0.0" dependencies = [ - "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-support 2.0.0", - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-version 2.0.0", - "substrate-test-runtime-client 2.0.0", + "criterion 0.2.11", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "serde", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", + "substrate-test-runtime-client", ] [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", + "parity-scale-codec", + "sp-api", ] [[package]] name = "fs-swap" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921d332c89b3b61a826de38c61ee5b6e02c56806cade1b0e5d81bd71f57a71bb" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "libc", + "libloading", + "winapi 0.3.8", ] [[package]] name = "fs2" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "winapi 0.3.8", ] [[package]] name = "fuchsia-cprng" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "fuchsia-zircon-sys", ] [[package]] name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" [[package]] name = "futures" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987" dependencies = [ - "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] name = "futures-channel" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcae98ca17d102fd8a3603727b9259fcf7fa4239b603d2142926189bc8999b86" dependencies = [ - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core", + "futures-sink", ] [[package]] name = "futures-channel-preview" version = "0.3.0-alpha.19" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5e5f4df964fa9c1c2f8bddeb5c3611631cacd93baf810fc8bb2fb4b495c263a" dependencies = [ - "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core-preview", ] [[package]] name = "futures-core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866" [[package]] name = "futures-core-preview" version = "0.3.0-alpha.19" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35b6263fb1ef523c3056565fa67b1d16f0a8604ff12b11b08c25f28a734c60a" [[package]] name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29", + "num_cpus", ] [[package]] name = "futures-diagnose" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebbb8371dd6ee87aa2aeaa8458a372fd82fe216032387b766255754c92dd7271" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29", + "futures 0.3.1", + "lazy_static", + "log 0.4.8", + "parking_lot 0.9.0", + "pin-project", + "serde", + "serde_json", ] [[package]] name = "futures-executor" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231" dependencies = [ - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core", + "futures-task", + "futures-util", + "num_cpus", ] [[package]] name = "futures-io" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff" [[package]] name = "futures-macro" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764" dependencies = [ - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "futures-sink" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-sink-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171be33efae63c2d59e6dbba34186fe0d6394fb378069a76dfd80fdcffd43c16" [[package]] name = "futures-task" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bae52d6b29cf440e298856fec3965ee6fa71b06aa7495178615953fd669e5f9" [[package]] name = "futures-timer" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878f1d2fc31355fa02ed2372e741b0c17e58373341e6a122569b4623a14a7d33" dependencies = [ - "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core-preview", + "futures-util-preview", + "pin-utils", ] [[package]] name = "futures-timer" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" [[package]] name = "futures-util" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", + "tokio-io", ] [[package]] name = "futures-util-preview" version = "0.3.0-alpha.19" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce968633c17e5f97936bd2797b6e38fb56cf16a7422319f7ec2e30d3c470e8d" dependencies = [ - "futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel-preview", + "futures-core-preview", + "pin-utils", + "slab", ] [[package]] name = "futures_codec" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "futures 0.3.1", + "memchr", + "pin-project", ] [[package]] name = "fxhash" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", ] [[package]] name = "gcc" version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" [[package]] name = "generic-array" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" dependencies = [ - "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum", ] [[package]] name = "get_if_addrs" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" 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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "c_linked_list", + "get_if_addrs-sys", + "libc", + "winapi 0.2.8", ] [[package]] name = "get_if_addrs-sys" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" dependencies = [ - "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc", + "libc", ] [[package]] name = "getrandom" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", + "wasm-bindgen", ] [[package]] name = "gimli" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162d18ae5f2e3b90a993d202f1ba17a5633c2484426f8bcae201f86194bacd00" dependencies = [ - "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.12", + "byteorder 1.3.2", + "fallible-iterator", + "indexmap", + "stable_deref_trait", ] [[package]] name = "glob" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" [[package]] name = "glob" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "globset" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" dependencies = [ - "aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bstr 0.2.10 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick", + "bstr", + "fnv", + "log 0.4.8", + "regex", ] [[package]] name = "goblin" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081214398d39e4bd7f2c1975f0488ed04614ffdd976c6fc7a0708278552c0da" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8", + "plain", + "scroll", ] [[package]] name = "grafana-data-source" version = "0.8.0" dependencies = [ - "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std", + "chrono", + "derive_more", + "futures-timer 2.0.2", + "futures-util", + "hyper 0.13.2", + "lazy_static", + "log 0.4.8", + "parking_lot 0.9.0", + "serde", + "serde_json", + "tokio 0.2.11", ] [[package]] name = "grafana-data-source-test" version = "2.0.0" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "grafana-data-source 0.8.0", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "futures-timer 2.0.2", + "grafana-data-source", + "rand 0.7.3", ] [[package]] name = "h2" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" 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)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string 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)", + "byteorder 1.3.2", + "bytes 0.4.12", + "fnv", + "futures 0.1.29", + "http 0.1.21", + "indexmap", + "log 0.4.8", + "slab", + "string", + "tokio-io", ] [[package]] name = "h2" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.0", + "indexmap", + "log 0.4.8", + "slab", + "tokio 0.2.11", + "tokio-util", ] [[package]] name = "hash-db" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" [[package]] name = "hash256-std-hasher" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" dependencies = [ - "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy", ] [[package]] name = "hashbrown" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" dependencies = [ - "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)", + "byteorder 1.3.2", + "scopeguard 0.3.3", ] [[package]] name = "hashbrown" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" [[package]] name = "hashbrown" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" dependencies = [ - "ahash 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "ahash", + "autocfg 0.1.7", ] [[package]] name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" dependencies = [ - "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation", ] [[package]] name = "hermit-abi" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "hex" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" [[package]] name = "hex-literal" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "961de220ec9a91af2e1e5bd80d02109155695e516771762381ef8581317066e0" dependencies = [ - "hex-literal-impl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl", + "proc-macro-hack", ] [[package]] name = "hex-literal-impl" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d4c5c844e2fee0bf673d54c2c177f1713b3d2af2ff6e666b49cb7572e6cf42d" dependencies = [ - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack", ] [[package]] name = "hmac" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" dependencies = [ - "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crypto-mac", + "digest", ] [[package]] name = "hmac-drbg" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" dependencies = [ - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "digest", + "generic-array", + "hmac", ] [[package]] name = "http" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" 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.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "fnv", + "itoa", ] [[package]] name = "http" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b" dependencies = [ - "bytes 0.5.4 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "fnv", + "itoa", ] [[package]] name = "http-body" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 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)", + "bytes 0.4.12", + "futures 0.1.29", + "http 0.1.21", + "tokio-buf", ] [[package]] name = "http-body" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "http 0.2.0", ] [[package]] name = "httparse" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" [[package]] name = "humantime" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" dependencies = [ - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error", ] [[package]] name = "hyper" version = "0.10.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" dependencies = [ - "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "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.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", + "base64 0.9.3", + "httparse", + "language-tags", + "log 0.3.9", + "mime", + "num_cpus", + "time", + "traitobject", + "typeable", + "unicase 1.4.2", + "url 1.7.2", ] [[package]] name = "hyper" version = "0.12.35" 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.29 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (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.4 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (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.22 (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.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.11 (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.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.29", + "futures-cpupool", + "h2 0.1.26", + "http 0.1.21", + "http-body 0.1.0", + "httparse", + "iovec", + "itoa", + "log 0.4.8", + "net2", + "rustc_version", + "time", + "tokio 0.1.22", + "tokio-buf", + "tokio-executor 0.1.9", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "want 0.2.0", ] [[package]] name = "hyper" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa1c527bbc634be72aa7ba31e4e4def9bbb020f5416916279b7c705cd838893e" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.2.1", + "http 0.2.0", + "http-body 0.3.1", + "httparse", + "itoa", + "log 0.4.8", + "pin-project", + "time", + "tokio 0.2.11", + "tower-service", + "want 0.3.0", ] [[package]] name = "hyper-rustls" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719d85c7df4a7f309a77d145340a063ea929dcb2e025bae46a80345cffec2952" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "ct-logs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls 0.16.0 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "ct-logs", + "futures 0.1.29", + "hyper 0.12.35", + "rustls", + "tokio-io", + "tokio-rustls", + "webpki", + "webpki-roots 0.17.0", ] [[package]] name = "hyper-tls" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (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)", + "bytes 0.4.12", + "futures 0.1.29", + "hyper 0.12.35", + "native-tls", + "tokio-io", ] [[package]] name = "idna" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "idna" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "impl-codec" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec", ] [[package]] name = "impl-rlp" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f7a72f11830b52333f36e3b09a288333888bf54380fd0ac0790a3c31ab0f3c5" dependencies = [ - "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp", ] [[package]] name = "impl-serde" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e3cae7e99c7ff5a995da2cf78dd0a5383740eda71d98cf7b1910c301ac69b8" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "impl-serde" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bbe9ea9b182f0fb1cabbd61f4ff9b7b7b9197955e95a7e4c27de5055eb29ff8" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "impl-trait-for-tuples" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "indexmap" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", ] [[package]] name = "integer-sqrt" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" [[package]] name = "interleaved-ordered" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" [[package]] name = "iovec" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "ipnet" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a859057dc563d1388c1e816f98a1892629075fc046ed06e845b883bb8b2916fb" [[package]] name = "itertools" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" dependencies = [ - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either", ] [[package]] name = "itoa" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" [[package]] name = "jobserver" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "js-sys" version = "0.3.35" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" dependencies = [ - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen", ] [[package]] name = "jsonrpc-client-transports" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a9ae166c4d1f702d297cd76d4b55758ace80272ffc6dbb139fdc1bf810de40b" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "websocket 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", + "failure", + "futures 0.1.29", + "hyper 0.12.35", + "hyper-tls", + "jsonrpc-core", + "jsonrpc-pubsub", + "log 0.4.8", + "serde", + "serde_json", + "tokio 0.1.22", + "url 1.7.2", + "websocket", ] [[package]] name = "jsonrpc-core" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29", + "log 0.4.8", + "serde", + "serde_derive", + "serde_json", ] [[package]] name = "jsonrpc-core-client" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080dc110be17701097df238fad3c816d4a478a1899dfbcf8ec8957dd40ec7304" dependencies = [ - "jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-client-transports", ] [[package]] name = "jsonrpc-derive" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8609af8f63b626e8e211f52441fcdb6ec54f1a446606b10d5c89ae9bf8a20058" dependencies = [ - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "jsonrpc-http-server" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d83d348120edee487c560b7cdd2565055d61cda053aa0d0ef0f8b6a18429048" dependencies = [ - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.35", + "jsonrpc-core", + "jsonrpc-server-utils", + "log 0.4.8", + "net2", + "parking_lot 0.9.0", + "unicase 2.6.0", ] [[package]] name = "jsonrpc-pubsub" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3453625f0f0f5cd6d6776d389d73b7d70fcc98620b7cbb1cbbb1f6a36e95f39a" dependencies = [ - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core", + "log 0.4.8", + "parking_lot 0.9.0", + "serde", ] [[package]] name = "jsonrpc-server-utils" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b7635e618a0edbbe0d2a2bbbc69874277c49383fcf6c3c0414491cfb517d22" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (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.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "globset", + "jsonrpc-core", + "lazy_static", + "log 0.4.8", + "tokio 0.1.22", + "tokio-codec", + "unicase 2.6.0", ] [[package]] name = "jsonrpc-ws-server" version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b34faa167c3ac9705aeecb986c0da6056529f348425dbe0441db60a2c4cc41d1" dependencies = [ - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.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.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core", + "jsonrpc-server-utils", + "log 0.4.8", + "parking_lot 0.9.0", + "slab", + "ws", ] [[package]] name = "keccak" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "keccak-hasher" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3468207deea1359a0e921591ae9b4c928733d94eb9d6a2eeda994cfd59f42cf8" dependencies = [ - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db", + "hash256-std-hasher", + "tiny-keccak 1.5.0", ] [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "kv-log-macro" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8", ] [[package]] name = "kvdb" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8396be0e5561ccd1bf7ff0b2007487cdd7a87a056873fe6ea906b35d4dbf7ed8" dependencies = [ - "parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-bytes", + "parity-util-mem 0.4.1", + "smallvec 1.2.0", ] [[package]] name = "kvdb-memorydb" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d25ef14155e418515c4839e9144c839de3506e68946f255a32b7f166095493d" dependencies = [ - "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb", + "parity-util-mem 0.4.1", + "parking_lot 0.9.0", ] [[package]] name = "kvdb-rocksdb" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af488cc16c3801705c8d681c3a32c8faa8fafc7fb5309dee0f573f3c6a19d395" dependencies = [ - "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fs-swap", + "interleaved-ordered", + "kvdb", + "log 0.4.8", + "num_cpus", + "owning_ref", + "parity-util-mem 0.4.1", + "parking_lot 0.9.0", + "regex", + "rocksdb", + "smallvec 1.2.0", ] [[package]] name = "kvdb-web" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a0e36637fb86454de401e7cb88f40eb0ad1b9bcee837d46785e7c451f1ebf4" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "js-sys", + "kvdb", + "kvdb-memorydb", + "log 0.4.8", + "parity-util-mem 0.4.1", + "send_wrapper 0.3.0", + "wasm-bindgen", + "web-sys", ] [[package]] name = "language-tags" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lazycell" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" [[package]] name = "libc" version = "0.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" [[package]] name = "libloading" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "winapi 0.3.8", ] [[package]] name = "libp2p" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-deflate 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-gossipsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-wasm-ext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "f84847789ab24b3fc5971a68656ac85886df640986d9ce3264c0327694eae471" +dependencies = [ + "bytes 0.5.4", + "futures 0.3.1", + "lazy_static", + "libp2p-core", + "libp2p-core-derive", + "libp2p-deflate", + "libp2p-dns", + "libp2p-floodsub", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-kad", + "libp2p-mdns", + "libp2p-mplex", + "libp2p-noise", + "libp2p-ping", + "libp2p-plaintext", + "libp2p-secio", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-uds", + "libp2p-wasm-ext", + "libp2p-websocket", + "libp2p-yamux", + "parity-multiaddr 0.7.1", + "parity-multihash 0.2.1", + "parking_lot 0.10.0", + "pin-project", + "smallvec 1.2.0", + "wasm-timer", ] [[package]] name = "libp2p-core" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "asn1_der 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "dbafb2706b8082233f66dc13e196f9cf9b4c229f2cd7c96b2b16617ad6ee330b" +dependencies = [ + "asn1_der", + "bs58 0.3.0", + "ed25519-dalek", + "fnv", + "futures 0.3.1", + "futures-timer 2.0.2", + "lazy_static", + "libsecp256k1", + "log 0.4.8", + "multistream-select", + "parity-multiaddr 0.7.1", + "parity-multihash 0.2.1", + "parking_lot 0.10.0", + "pin-project", + "prost", + "prost-build", + "rand 0.7.3", + "ring", + "rw-stream-sink", + "sha2", + "smallvec 1.2.0", + "thiserror", + "unsigned-varint 0.3.0", + "untrusted", + "void", + "zeroize 1.1.0", ] [[package]] name = "libp2p-core-derive" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c320266be0a7760e23484d635acdb83844b2d74d3612d93b41c393c9bcf004e" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2", + "syn", ] [[package]] name = "libp2p-deflate" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be32697b42d040b325c3737f827ea04ede569ec956b7807700dd8d89d8210f9" dependencies = [ - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2", + "futures 0.3.1", + "libp2p-core", ] [[package]] name = "libp2p-dns" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f11c979b882f25d85726b15637d5bbc722dfa1be576605c54e99b8cf56906be3" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "libp2p-core", + "log 0.4.8", ] [[package]] name = "libp2p-floodsub" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bdf6fba9272ad47dde94bade89540fdb16e24ae9ff7fb714c1c80a035165f28" dependencies = [ - "bs58 0.3.0 (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.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bs58 0.3.0", + "cuckoofilter", + "fnv", + "futures 0.3.1", + "libp2p-core", + "libp2p-swarm", + "prost", + "prost-build", + "rand 0.7.3", + "smallvec 1.2.0", ] [[package]] name = "libp2p-gossipsub" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bs58 0.3.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.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "6e6ecd058bf769d27ebec530544b081e08b0a1088e3186da8cc58d59915784d0" +dependencies = [ + "base64 0.11.0", + "bs58 0.3.0", + "byteorder 1.3.2", + "bytes 0.5.4", + "fnv", + "futures 0.3.1", + "futures_codec", + "libp2p-core", + "libp2p-swarm", + "log 0.4.8", + "lru 0.4.3", + "prost", + "prost-build", + "rand 0.7.3", + "sha2", + "smallvec 1.2.0", + "unsigned-varint 0.3.0", + "wasm-timer", ] [[package]] name = "libp2p-identify" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1a6261b804111c2dbf53f8ca03f66edc5ad1c29b78a61cf0cc5354052e28e9" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "libp2p-core", + "libp2p-swarm", + "log 0.4.8", + "prost", + "prost-build", + "smallvec 1.2.0", + "wasm-timer", ] [[package]] name = "libp2p-kad" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.3.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "0c6ea6fece0d99599afb1b2082ca8937944cdd6b0946a88d54cb3ae7a38d1253" +dependencies = [ + "arrayvec 0.5.1", + "bytes 0.5.4", + "either", + "fnv", + "futures 0.3.1", + "futures_codec", + "libp2p-core", + "libp2p-swarm", + "log 0.4.8", + "parity-multihash 0.2.1", + "prost", + "prost-build", + "rand 0.7.3", + "sha2", + "smallvec 1.2.0", + "uint", + "unsigned-varint 0.3.0", + "void", + "wasm-timer", ] [[package]] name = "libp2p-mdns" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074312353355df310affa105ec71b16fd7e52f5c6ae61d3dcbb3e79e8fdc9e5f" dependencies = [ - "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std", + "data-encoding", + "dns-parser", + "either", + "futures 0.3.1", + "lazy_static", + "libp2p-core", + "libp2p-swarm", + "log 0.4.8", + "net2", + "rand 0.7.3", + "smallvec 1.2.0", + "void", + "wasm-timer", ] [[package]] name = "libp2p-mplex" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d0b44dfdef80cc2be4b42d127de1c793905eca2459415a5c57d6b4fbd8ec30" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "fnv", + "futures 0.3.1", + "futures_codec", + "libp2p-core", + "log 0.4.8", + "parking_lot 0.10.0", + "unsigned-varint 0.3.0", ] [[package]] name = "libp2p-noise" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0845e8208d814cd41c26c90a6a2f2b720c31b588209cecc49a44c881a09f417f" dependencies = [ - "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", - "snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.3", + "futures 0.3.1", + "lazy_static", + "libp2p-core", + "log 0.4.8", + "prost", + "prost-build", + "rand 0.7.3", + "ring", + "snow", + "x25519-dalek", + "zeroize 1.1.0", ] [[package]] name = "libp2p-ping" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ecced2949ae93b6ff29565303ecd1bef15c4e4efb689033ee744922561a36b" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "libp2p-core", + "libp2p-swarm", + "log 0.4.8", + "rand 0.7.3", + "void", + "wasm-timer", ] [[package]] name = "libp2p-plaintext" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195fda6b6a948a242fd30570e0e3418ae8e0a20055ea75d45458e1079a8efb05" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "futures 0.3.1", + "futures_codec", + "libp2p-core", + "log 0.4.8", + "prost", + "prost-build", + "rw-stream-sink", + "unsigned-varint 0.3.0", + "void", ] [[package]] name = "libp2p-secio" version = "0.15.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)", - "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "ceef68ca377b264f84d64c88739a8fa118b5db1e8f18297351dff75314504a5f" +dependencies = [ + "aes-ctr", + "ctr", + "futures 0.3.1", + "hmac", + "js-sys", + "lazy_static", + "libp2p-core", + "log 0.4.8", + "parity-send-wrapper", + "pin-project", + "prost", + "prost-build", + "quicksink", + "rand 0.7.3", + "ring", + "rw-stream-sink", + "sha2", + "static_assertions", + "twofish", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] name = "libp2p-swarm" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14ea00be81bc3985e36abad263ce2ad1b6aeb862aa743563eb70ad42880c05ae" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (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.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "libp2p-core", + "log 0.4.8", + "smallvec 1.2.0", + "void", + "wasm-timer", ] [[package]] name = "libp2p-tcp" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e65ef381570df31cb047dfbc11483ab0fe7e6abbdcf2bdc2c60b5d11133d241" dependencies = [ - "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std", + "futures 0.3.1", + "futures-timer 2.0.2", + "get_if_addrs", + "ipnet", + "libp2p-core", + "log 0.4.8", ] [[package]] name = "libp2p-uds" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4f4f7989b35f33d4b9738aab2f031310eb20fec513cab44d12b1bc985a8074" dependencies = [ - "async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std", + "futures 0.3.1", + "libp2p-core", + "log 0.4.8", ] [[package]] name = "libp2p-wasm-ext" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b4d457adb91a5e2212343218a554394cd8ced64a79fb8e36e7aed2a16d49495" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.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)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "js-sys", + "libp2p-core", + "parity-send-wrapper", + "wasm-bindgen", + "wasm-bindgen-futures", ] [[package]] name = "libp2p-websocket" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bba425f2af1fdb7dece88b9ae05ca9430dfb0b72b2c078e73ded6f1556084509" dependencies = [ - "async-tls 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-tls", + "bytes 0.5.4", + "either", + "futures 0.3.1", + "libp2p-core", + "log 0.4.8", + "quicksink", + "rustls", + "rw-stream-sink", + "soketto", + "url 2.1.1", + "webpki", + "webpki-roots 0.18.0", ] [[package]] name = "libp2p-yamux" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca25b3aac78a3c93c2a567622abd3cfc16f96f26ae1bf6134f0056203d62d86" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "libp2p-core", + "log 0.4.8", + "parking_lot 0.10.0", + "thiserror", + "yamux", ] [[package]] name = "librocksdb-sys" version = "6.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0785e816e1e11e7599388a492c61ef80ddc2afc91e313e61662cce537809be" dependencies = [ - "bindgen 0.49.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "bindgen", + "cc", + "glob 0.3.0", + "libc", ] [[package]] name = "libsecp256k1" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6edf84fd62aad1c93932b39324eaeda3912c1d26bc18dfaee6293848e49a50" dependencies = [ - "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac-drbg 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref", + "crunchy", + "digest", + "hmac-drbg", + "rand 0.7.3", + "sha2", + "subtle 2.2.2", + "typenum", ] [[package]] name = "libz-sys" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] name = "linked-hash-map" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" [[package]] name = "linked_hash_set" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" dependencies = [ - "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map", ] [[package]] name = "lock_api" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" dependencies = [ - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3", ] [[package]] name = "lock_api" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" dependencies = [ - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 1.0.0", ] [[package]] name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8", ] [[package]] name = "log" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "lru" version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8f669d42c72d18514dfca8115689c5f6370a17d980cb5bd777a67f404594c8" dependencies = [ - "hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hashbrown 0.5.0", ] [[package]] name = "lru" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" dependencies = [ - "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hashbrown 0.6.3", ] [[package]] name = "mach" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "malloc_size_of_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e37c5d4cd9473c5f4c9c111f033f15d4df9bd378fdf615944e360a4f55a05f0b" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "syn", + "synstructure", ] [[package]] name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "maybe-uninit" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "memoffset" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version", ] [[package]] name = "memory-db" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881736a0f68a6fae1b596bb066c5bd16d7b3ed645a4dd8ffaefd02f585abaf71" dependencies = [ - "ahash 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ahash", + "hash-db", + "hashbrown 0.6.3", + "parity-util-mem 0.3.0", ] [[package]] name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" [[package]] name = "merlin" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b0942b357c1b4d0dc43ba724674ec89c3218e6ca2b3e8269e7cb53bcecd2f6e" dependencies = [ - "byteorder 1.3.2 (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.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "keccak", + "rand_core 0.4.2", + "zeroize 1.1.0", ] [[package]] name = "mime" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9", ] [[package]] name = "miniz_oxide" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" dependencies = [ - "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "adler32", ] [[package]] name = "mio" version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "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.4 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (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)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log 0.4.8", + "miow", + "net2", + "slab", + "winapi 0.2.8", ] [[package]] name = "mio-extras" version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell", + "log 0.4.8", + "mio", + "slab", ] [[package]] name = "mio-uds" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" dependencies = [ - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec", + "libc", + "mio", ] [[package]] name = "miow" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", ] [[package]] name = "more-asserts" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" [[package]] name = "multimap" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97fbd5d00e0e37bfb10f433af8f5aaf631e739368dc9fc28286ca81ca4948dc" [[package]] name = "multistream-select" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f938ffe420493e77c8b6cbcc3f282283f68fc889c5dcbc8e51668d5f3a01ad94" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.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)", - "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "futures 0.1.29", + "log 0.4.8", + "smallvec 1.2.0", + "tokio-io", + "unsigned-varint 0.3.0", ] [[package]] name = "names" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" dependencies = [ - "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.23", ] [[package]] name = "native-tls" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.27 (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.54 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "libc", + "log 0.4.8", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "winapi 0.3.8", ] [[package]] name = "node-cli" version = "2.0.0" dependencies = [ - "browser-utils 0.8.0", - "frame-support 2.0.0", - "frame-system 2.0.0", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "node-executor 2.0.0", - "node-primitives 2.0.0", - "node-rpc 2.0.0", - "node-runtime 2.0.0", - "node-transaction-factory 0.8.0", - "pallet-authority-discovery 2.0.0", - "pallet-balances 2.0.0", - "pallet-contracts 2.0.0", - "pallet-im-online 2.0.0", - "pallet-indices 2.0.0", - "pallet-timestamp 2.0.0", - "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-authority-discovery 0.8.0", - "sc-basic-authorship 0.8.0", - "sc-chain-spec 2.0.0", - "sc-cli 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-client-db 0.8.0", - "sc-consensus-babe 0.8.0", - "sc-finality-grandpa 0.8.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-offchain 2.0.0", - "sc-rpc 2.0.0", - "sc-service 0.8.0", - "sc-service-test 2.0.0", - "sc-telemetry 2.0.0", - "sc-transaction-pool 2.0.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-authority-discovery 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-finality-grandpa 2.0.0", - "sp-finality-tracker 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-timestamp 2.0.0", - "sp-transaction-pool 2.0.0", - "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-build-script-utils 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "browser-utils", + "frame-support", + "frame-system", + "futures 0.3.1", + "hex-literal", + "jsonrpc-core", + "log 0.4.8", + "node-executor", + "node-primitives", + "node-rpc", + "node-runtime", + "node-transaction-factory", + "pallet-authority-discovery", + "pallet-balances", + "pallet-contracts", + "pallet-im-online", + "pallet-indices", + "pallet-timestamp", + "pallet-transaction-payment", + "parity-scale-codec", + "rand 0.7.3", + "sc-authority-discovery", + "sc-basic-authorship", + "sc-chain-spec", + "sc-cli", + "sc-client", + "sc-client-api", + "sc-client-db", + "sc-consensus-babe", + "sc-finality-grandpa", + "sc-keystore", + "sc-network", + "sc-offchain", + "sc-rpc", + "sc-service", + "sc-service-test", + "sc-telemetry", + "sc-transaction-pool", + "serde", + "sp-authority-discovery", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-finality-tracker", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-timestamp", + "sp-transaction-pool", + "structopt", + "substrate-build-script-utils", + "tempfile", + "vergen", + "wasm-bindgen", + "wasm-bindgen-futures", ] [[package]] name = "node-executor" version = "2.0.0" dependencies = [ - "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-support 2.0.0", - "frame-system 2.0.0", - "node-primitives 2.0.0", - "node-runtime 2.0.0", - "node-testing 2.0.0", - "pallet-balances 2.0.0", - "pallet-contracts 2.0.0", - "pallet-grandpa 2.0.0", - "pallet-im-online 2.0.0", - "pallet-indices 2.0.0", - "pallet-session 2.0.0", - "pallet-timestamp 2.0.0", - "pallet-transaction-payment 2.0.0", - "pallet-treasury 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor 0.8.0", - "sp-application-crypto 2.0.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-trie 2.0.0", - "substrate-test-client 2.0.0", - "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.1", + "frame-support", + "frame-system", + "node-primitives", + "node-runtime", + "node-testing", + "pallet-balances", + "pallet-contracts", + "pallet-grandpa", + "pallet-im-online", + "pallet-indices", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "parity-scale-codec", + "sc-executor", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-trie", + "substrate-test-client", + "trie-root", + "wabt", ] [[package]] name = "node-primitives" version = "2.0.0" dependencies = [ - "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-serializer 2.0.0", + "pretty_assertions", + "sp-core", + "sp-runtime", + "sp-serializer", ] [[package]] name = "node-rpc" version = "2.0.0" dependencies = [ - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 2.0.0", - "node-runtime 2.0.0", - "pallet-contracts-rpc 0.8.0", - "pallet-transaction-payment-rpc 2.0.0", - "sc-client 0.8.0", - "sp-api 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-frame-rpc-system 2.0.0", + "jsonrpc-core", + "node-primitives", + "node-runtime", + "pallet-contracts-rpc", + "pallet-transaction-payment-rpc", + "sc-client", + "sp-api", + "sp-runtime", + "sp-transaction-pool", + "substrate-frame-rpc-system", ] [[package]] name = "node-rpc-client" version = "2.0.0" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 2.0.0", - "sc-rpc 2.0.0", + "env_logger 0.7.1", + "futures 0.1.29", + "hyper 0.12.35", + "jsonrpc-core-client", + "log 0.4.8", + "node-primitives", + "sc-rpc", ] [[package]] name = "node-runtime" version = "2.0.0" dependencies = [ - "frame-executive 2.0.0", - "frame-support 2.0.0", - "frame-system 2.0.0", - "frame-system-rpc-runtime-api 2.0.0", - "integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 2.0.0", - "pallet-authority-discovery 2.0.0", - "pallet-authorship 2.0.0", - "pallet-babe 2.0.0", - "pallet-balances 2.0.0", - "pallet-collective 2.0.0", - "pallet-contracts 2.0.0", - "pallet-contracts-primitives 2.0.0", - "pallet-contracts-rpc-runtime-api 0.8.0", - "pallet-democracy 2.0.0", - "pallet-elections-phragmen 2.0.0", - "pallet-finality-tracker 2.0.0", - "pallet-grandpa 2.0.0", - "pallet-identity 2.0.0", - "pallet-im-online 2.0.0", - "pallet-indices 2.0.0", - "pallet-membership 2.0.0", - "pallet-offences 2.0.0", - "pallet-randomness-collective-flip 2.0.0", - "pallet-recovery 2.0.0", - "pallet-session 2.0.0", - "pallet-society 2.0.0", - "pallet-staking 2.0.0", - "pallet-staking-reward-curve 2.0.0", - "pallet-sudo 2.0.0", - "pallet-timestamp 2.0.0", - "pallet-transaction-payment 2.0.0", - "pallet-transaction-payment-rpc-runtime-api 2.0.0", - "pallet-treasury 2.0.0", - "pallet-utility 2.0.0", - "pallet-vesting 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-authority-discovery 2.0.0", - "sp-block-builder 2.0.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-offchain 2.0.0", - "sp-runtime 2.0.0", - "sp-session 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", - "sp-transaction-pool 2.0.0", - "sp-version 2.0.0", - "substrate-wasm-builder-runner 1.0.5", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "integer-sqrt", + "node-primitives", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-collective", + "pallet-contracts", + "pallet-contracts-primitives", + "pallet-contracts-rpc-runtime-api", + "pallet-democracy", + "pallet-elections-phragmen", + "pallet-finality-tracker", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-offences", + "pallet-randomness-collective-flip", + "pallet-recovery", + "pallet-session", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "parity-scale-codec", + "rustc-hex", + "serde", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder-runner", ] [[package]] name = "node-template" version = "2.0.0" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "node-template-runtime 2.0.0", - "sc-basic-authorship 0.8.0", - "sc-cli 0.8.0", - "sc-client 0.8.0", - "sc-consensus-aura 0.8.0", - "sc-executor 0.8.0", - "sc-finality-grandpa 0.8.0", - "sc-network 0.8.0", - "sc-service 0.8.0", - "sc-transaction-pool 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-aura 0.8.0", - "sp-core 2.0.0", - "sp-finality-grandpa 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-build-script-utils 2.0.0", - "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "log 0.4.8", + "node-template-runtime", + "sc-basic-authorship", + "sc-cli", + "sc-client", + "sc-consensus-aura", + "sc-executor", + "sc-finality-grandpa", + "sc-network", + "sc-service", + "sc-transaction-pool", + "sp-consensus", + "sp-consensus-aura", + "sp-core", + "sp-finality-grandpa", + "sp-inherents", + "sp-runtime", + "sp-transaction-pool", + "structopt", + "substrate-build-script-utils", + "vergen", ] [[package]] name = "node-template-runtime" version = "2.0.0" dependencies = [ - "frame-executive 2.0.0", - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-aura 2.0.0", - "pallet-balances 2.0.0", - "pallet-grandpa 2.0.0", - "pallet-indices 2.0.0", - "pallet-randomness-collective-flip 2.0.0", - "pallet-sudo 2.0.0", - "pallet-timestamp 2.0.0", - "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-block-builder 2.0.0", - "sp-consensus-aura 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-offchain 2.0.0", - "sp-runtime 2.0.0", - "sp-session 2.0.0", - "sp-std 2.0.0", - "sp-transaction-pool 2.0.0", - "sp-version 2.0.0", - "substrate-wasm-builder-runner 1.0.5", + "frame-executive", + "frame-support", + "frame-system", + "pallet-aura", + "pallet-balances", + "pallet-grandpa", + "pallet-indices", + "pallet-randomness-collective-flip", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "parity-scale-codec", + "serde", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder-runner", ] [[package]] name = "node-testing" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "node-executor 2.0.0", - "node-primitives 2.0.0", - "node-runtime 2.0.0", - "pallet-balances 2.0.0", - "pallet-contracts 2.0.0", - "pallet-grandpa 2.0.0", - "pallet-indices 2.0.0", - "pallet-session 2.0.0", - "pallet-society 2.0.0", - "pallet-staking 2.0.0", - "pallet-timestamp 2.0.0", - "pallet-transaction-payment 2.0.0", - "pallet-treasury 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-executor 0.8.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "substrate-test-client 2.0.0", - "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "frame-support", + "frame-system", + "node-executor", + "node-primitives", + "node-runtime", + "pallet-balances", + "pallet-contracts", + "pallet-grandpa", + "pallet-indices", + "pallet-session", + "pallet-society", + "pallet-staking", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "parity-scale-codec", + "sc-client", + "sc-executor", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "substrate-test-client", + "wabt", ] [[package]] name = "node-transaction-factory" version = "0.8.0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-cli 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-service 0.8.0", - "sp-api 2.0.0", - "sp-block-builder 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", + "log 0.4.8", + "parity-scale-codec", + "sc-cli", + "sc-client", + "sc-client-api", + "sc-service", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", ] [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "nohash-hasher" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "721a2bf1c26159ebf17e0a980bc4ce61f4b2fec5ec3b42d42fddd7a84a9e538f" [[package]] name = "nom" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" dependencies = [ - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", + "version_check 0.1.5", ] [[package]] name = "num-bigint" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", + "num-integer", + "num-traits", ] [[package]] name = "num-integer" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", + "num-traits", ] [[package]] name = "num-rational" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4dc79f9e6c81bef96148c8f6b8e72ad4541caa4a24373e900a36da07de03a3" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", + "num-bigint", + "num-integer", + "num-traits", ] [[package]] name = "num-traits" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", ] [[package]] name = "num_cpus" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", ] [[package]] name = "ole32-sys" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "once_cell" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" dependencies = [ - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1", ] [[package]] name = "once_cell" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d584f08c2d717d5c23a6414fc2822b71c651560713e54fa7eace675f758a355e" [[package]] name = "once_cell" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" [[package]] name = "oorandom" version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405" [[package]] name = "opaque-debug" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "openssl" version = "0.10.27" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e176a45fedd4c990e26580847a525e39e16ec32ac78957dbf62ded31b3abfd6f" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cfg-if", + "foreign-types", + "lazy_static", + "libc", + "openssl-sys", ] [[package]] name = "openssl-probe" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" [[package]] name = "openssl-sys" version = "0.9.54" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] name = "output_vt100" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "owning_ref" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" dependencies = [ - "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "stable_deref_trait", ] [[package]] name = "pallet-assets" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-aura" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-session 2.0.0", - "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-application-crypto 2.0.0", - "sp-consensus-aura 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-timestamp 2.0.0", + "frame-support", + "frame-system", + "lazy_static", + "pallet-session", + "pallet-timestamp", + "parity-scale-codec", + "parking_lot 0.9.0", + "serde", + "sp-application-crypto", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "pallet-authority-discovery" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-session 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-application-crypto 2.0.0", - "sp-authority-discovery 2.0.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "serde", + "sp-application-crypto", + "sp-authority-discovery", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-authorship" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-authorship 2.0.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-authorship", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-babe" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-session 2.0.0", - "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", - "sp-timestamp 2.0.0", - "sp-version 2.0.0", - "substrate-test-runtime 2.0.0", + "frame-support", + "frame-system", + "hex-literal", + "lazy_static", + "pallet-session", + "pallet-timestamp", + "parity-scale-codec", + "parking_lot 0.9.0", + "serde", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-timestamp", + "sp-version", + "substrate-test-runtime", ] [[package]] name = "pallet-balances" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-transaction-payment", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-collective" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "hex-literal", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-contracts" version = "2.0.0" dependencies = [ - "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-balances 2.0.0", - "pallet-contracts-primitives 2.0.0", - "pallet-randomness-collective-flip 2.0.0", - "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-sandbox 0.8.0", - "sp-std 2.0.0", - "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi-validation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches", + "frame-support", + "frame-system", + "hex-literal", + "pallet-balances", + "pallet-contracts-primitives", + "pallet-randomness-collective-flip", + "pallet-timestamp", + "parity-scale-codec", + "parity-wasm 0.41.0", + "pwasm-utils", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-sandbox", + "sp-std", + "wabt", + "wasmi-validation", ] [[package]] name = "pallet-contracts-primitives" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-contracts-rpc" version = "0.8.0" dependencies = [ - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-contracts-primitives 2.0.0", - "pallet-contracts-rpc-runtime-api 0.8.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-rpc 2.0.0", - "sp-runtime 2.0.0", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "pallet-contracts-primitives", + "pallet-contracts-rpc-runtime-api", + "parity-scale-codec", + "serde", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", ] [[package]] name = "pallet-contracts-rpc-runtime-api" version = "0.8.0" dependencies = [ - "pallet-contracts-primitives 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "pallet-contracts-primitives", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-democracy" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-storage 2.0.0", + "frame-support", + "frame-system", + "hex-literal", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-storage", ] [[package]] name = "pallet-elections" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "hex-literal", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-elections-phragmen" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-phragmen 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "substrate-test-utils 2.0.0", + "frame-support", + "frame-system", + "hex-literal", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-phragmen", + "sp-runtime", + "sp-std", + "substrate-test-utils", ] [[package]] name = "pallet-evm" version = "2.0.0" dependencies = [ - "evm 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "evm", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-timestamp", + "parity-scale-codec", + "primitive-types", + "rlp", + "serde", + "sha3", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-example" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-finality-tracker" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-finality-tracker 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "serde", + "sp-core", + "sp-finality-tracker", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-generic-asset" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-grandpa" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-finality-tracker 2.0.0", - "pallet-session 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-finality-grandpa 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-finality-tracker", + "pallet-session", + "parity-scale-codec", + "serde", + "sp-core", + "sp-finality-grandpa", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-identity" version = "2.0.0" dependencies = [ - "enumflags2 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "enumflags2", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-im-online" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-authorship 2.0.0", - "pallet-session 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-application-crypto 2.0.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "serde", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-indices" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-membership" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-nicks" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-offences" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "parity-scale-codec", + "safe-mix", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-recovery" version = "2.0.0" dependencies = [ - "enumflags2 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "enumflags2", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-scored-pool" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-session" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-application-crypto 2.0.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", - "sp-trie 2.0.0", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "lazy_static", + "pallet-timestamp", + "parity-scale-codec", + "serde", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-trie", ] [[package]] name = "pallet-society" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "rand_chacha 0.2.1", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-staking" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-authorship 2.0.0", - "pallet-balances 2.0.0", - "pallet-session 2.0.0", - "pallet-staking-reward-curve 2.0.0", - "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-phragmen 2.0.0", - "sp-runtime 2.0.0", - "sp-staking 2.0.0", - "sp-std 2.0.0", - "substrate-test-utils 2.0.0", + "frame-support", + "frame-system", + "pallet-authorship", + "pallet-balances", + "pallet-session", + "pallet-staking-reward-curve", + "pallet-timestamp", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-keyring", + "sp-phragmen", + "sp-runtime", + "sp-staking", + "sp-std", + "substrate-test-utils", ] [[package]] name = "pallet-staking-reward-curve" version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-runtime 2.0.0", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate", + "proc-macro2 1.0.8", + "quote 1.0.2", + "sp-runtime", + "syn", ] [[package]] name = "pallet-sudo" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-timestamp" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-timestamp 2.0.0", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "serde", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "pallet-transaction-payment" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "pallet-transaction-payment-rpc-runtime-api 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-transaction-payment-rpc-runtime-api", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0" dependencies = [ - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-transaction-payment-rpc-runtime-api 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-rpc 2.0.0", - "sp-runtime 2.0.0", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "pallet-transaction-payment-rpc-runtime-api", + "parity-scale-codec", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", ] [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "parity-scale-codec", + "serde", + "serde_json", + "sp-api", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-treasury" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-utility" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-vesting" version = "2.0.0" dependencies = [ - "enumflags2 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-support 2.0.0", - "frame-system 2.0.0", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-balances 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-storage 2.0.0", + "enumflags2", + "frame-support", + "frame-system", + "hex-literal", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-storage", ] [[package]] name = "parity-bytes" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c276d76c5333b8c2579e02d49a06733a55b8282d2d9b13e8d53b6406bd7e30a" [[package]] name = "parity-multiaddr" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" dependencies = [ - "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bs58 0.2.5 (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.3 (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.104 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref", + "bs58 0.2.5", + "byteorder 1.3.2", + "bytes 0.4.12", + "data-encoding", + "parity-multihash 0.1.3", + "percent-encoding 1.0.1", + "serde", + "unsigned-varint 0.2.3", + "url 1.7.2", ] [[package]] name = "parity-multiaddr" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80878c27f90dd162d3143333d672e80b194d6b080f05c83440e3dfda42e409f2" dependencies = [ - "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref", + "bs58 0.3.0", + "byteorder 1.3.2", + "data-encoding", + "parity-multihash 0.2.1", + "percent-encoding 2.1.0", + "serde", + "static_assertions", + "unsigned-varint 0.3.0", + "url 2.1.1", ] [[package]] name = "parity-multihash" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" dependencies = [ - "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2", + "bytes 0.4.12", + "rand 0.6.5", + "sha-1", + "sha2", + "sha3", + "unsigned-varint 0.2.3", ] [[package]] name = "parity-multihash" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" dependencies = [ - "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2", + "bytes 0.5.4", + "rand 0.7.3", + "sha-1", + "sha2", + "sha3", + "unsigned-varint 0.3.0", ] [[package]] name = "parity-scale-codec" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" dependencies = [ - "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.5.1", + "bitvec", + "byte-slice-cast", + "parity-scale-codec-derive", + "serde", ] [[package]] name = "parity-scale-codec-derive" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" dependencies = [ - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "parity-send-wrapper" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" [[package]] name = "parity-util-mem" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "malloc_size_of_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "malloc_size_of_derive", + "winapi 0.3.8", ] [[package]] name = "parity-util-mem" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900dd84654b048e5bad420bb341658fc2c4d7fea628c22bcf4621733e54859b4" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "impl-trait-for-tuples", + "parity-util-mem-derive", + "parking_lot 0.9.0", + "smallvec 1.2.0", + "winapi 0.3.8", ] [[package]] name = "parity-util-mem-derive" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "syn", + "synstructure", ] [[package]] name = "parity-wasm" version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", ] [[package]] name = "parity-wasm" version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" [[package]] name = "parking_lot" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" dependencies = [ - "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api 0.1.5", + "parking_lot_core 0.4.0", ] [[package]] name = "parking_lot" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" dependencies = [ - "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api 0.3.3", + "parking_lot_core 0.6.2", + "rustc_version", ] [[package]] name = "parking_lot" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" dependencies = [ - "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api 0.3.3", + "parking_lot_core 0.7.0", ] [[package]] name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" dependencies = [ - "libc 0.2.66 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand 0.6.5", + "rustc_version", + "smallvec 0.6.13", + "winapi 0.3.8", ] [[package]] name = "parking_lot_core" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" dependencies = [ - "cfg-if 0.1.10 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "cloudabi", + "libc", + "redox_syscall", + "rustc_version", + "smallvec 0.6.13", + "winapi 0.3.8", ] [[package]] name = "parking_lot_core" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" dependencies = [ - "cfg-if 0.1.10 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "cloudabi", + "libc", + "redox_syscall", + "smallvec 1.2.0", + "winapi 0.3.8", ] [[package]] name = "paste" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "423a519e1c6e828f1e73b720f9d9ed2fa643dce8a7737fb43235ce0b41eeaa49" dependencies = [ - "paste-impl 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl", + "proc-macro-hack", ] [[package]] name = "paste-impl" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4214c9e912ef61bf42b81ba9a47e8aad1b2ffaf739ab162bf96d1e011f54e6c5" dependencies = [ - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "pbkdf2" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" dependencies = [ - "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)", + "byteorder 1.3.2", + "crypto-mac", ] [[package]] name = "pdqselect" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec91767ecc0a0bbe558ce8c9da33c068066c57ecc8bb8477ef8c1ad3ef77c27" [[package]] name = "peeking_take_while" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "petgraph" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c127eea4a29ec6c85d153c59dc1213f33ec74cead30fe4730aecc88cc1fd92" dependencies = [ - "fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixedbitset", + "indexmap", ] [[package]] name = "pin-project" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c" dependencies = [ - "pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-internal", ] [[package]] name = "pin-project-internal" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "pin-project-lite" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" [[package]] name = "pin-utils" version = "0.1.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" [[package]] name = "pkg-config" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plotters" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb" dependencies = [ - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys", + "num-traits", + "wasm-bindgen", + "web-sys", ] [[package]] name = "ppv-lite86" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" [[package]] name = "pretty_assertions" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ctor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term 0.11.0", + "ctor", + "difference", + "output_vt100", ] [[package]] name = "primitive-types" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" dependencies = [ - "fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde 0.3.0", + "uint", ] [[package]] name = "proc-macro-crate" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" dependencies = [ - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "toml", ] [[package]] name = "proc-macro-error" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875077759af22fa20b610ad4471d8155b321c89c3f2785526c9839b099be4e0a" dependencies = [ - "proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error-attr", + "proc-macro2 1.0.8", + "quote 1.0.2", + "rustversion", + "syn", ] [[package]] name = "proc-macro-error-attr" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5717d9fa2664351a01ed73ba5ef6df09c01a521cb42cb65a061432a826f3c7a" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "rustversion", + "syn", + "syn-mid", ] [[package]] name = "proc-macro-hack" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "proc-macro-nested" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" [[package]] name = "proc-macro2" version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0", ] [[package]] name = "proc-macro2" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0", ] [[package]] name = "prost" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "prost-derive", ] [[package]] name = "prost-build" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "multimap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "which 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "heck", + "itertools", + "log 0.4.8", + "multimap", + "petgraph", + "prost", + "prost-types", + "tempfile", + "which 3.1.0", ] [[package]] name = "prost-derive" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow", + "itertools", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "prost-types" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "prost", ] [[package]] name = "pwasm-utils" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "log 0.4.8", + "parity-wasm 0.41.0", ] [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quickcheck" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.7.1", + "log 0.4.8", + "rand 0.7.3", + "rand_core 0.5.1", ] [[package]] name = "quicksink" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8461ef7445f61fd72d8dcd0629ce724b9131b3c2eb36e83a5d3d4161c127530" dependencies = [ - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core", + "futures-sink", + "pin-project-lite", ] [[package]] name = "quote" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30", ] [[package]] name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", ] [[package]] name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand 0.4.6", ] [[package]] name = "rand" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" dependencies = [ - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi 0.3.8", ] [[package]] name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (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.2 (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.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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "libc", + "rand_chacha 0.1.1", + "rand_core 0.4.2", + "rand_hc 0.1.0", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg", + "rand_xorshift", + "winapi 0.3.8", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "libc", + "rand_chacha 0.2.1", + "rand_core 0.5.1", + "rand_hc 0.2.0", ] [[package]] name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "rand_core 0.3.1", ] [[package]] name = "rand_chacha" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" dependencies = [ - "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "c2-chacha", + "rand_core 0.5.1", ] [[package]] name = "rand_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2", ] [[package]] name = "rand_core" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", ] [[package]] name = "rand_hc" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1", ] [[package]] name = "rand_isaac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_core 0.4.2", + "winapi 0.3.8", ] [[package]] name = "rand_os" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "wasm-bindgen", + "winapi 0.3.8", ] [[package]] name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "rand_core 0.4.2", ] [[package]] name = "rand_xorshift" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rand_xoshiro" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929" dependencies = [ - "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)", + "byteorder 1.3.2", + "rand_core 0.3.1", ] [[package]] name = "raw-cpuid" version = "7.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a349ca83373cfa5d6dbb66fd76e58b2cca08da71a5f6400de0a0a6a9bceeaf" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cc", + "rustc_version", ] [[package]] name = "rayon" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" dependencies = [ - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "either", + "rayon-core", ] [[package]] name = "rayon-core" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" dependencies = [ - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "crossbeam-queue 0.2.1", + "crossbeam-utils 0.7.0", + "lazy_static", + "num_cpus", ] [[package]] name = "rdrand" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "redox_syscall" version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" [[package]] name = "redox_users" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "redox_syscall", + "rust-argon2", ] [[package]] name = "regex" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" dependencies = [ - "aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", ] [[package]] name = "regex-automata" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", ] [[package]] name = "regex-syntax" version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" [[package]] name = "region" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "448e868c6e4cfddfa49b6a72c95906c04e8547465e9536575b95c70a4044f856" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "mach 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "libc", + "mach", + "winapi 0.3.8", ] [[package]] name = "remove_dir_all" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "ring" version = "0.16.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "113f53b644c5442e20ff3a299be3d6c61ba143737af5bd2ab298e248a7575b2d" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "lazy_static", + "libc", + "spin", + "untrusted", + "web-sys", + "winapi 0.3.8", ] [[package]] name = "rlp" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a44d5ae8afcb238af8b75640907edc6c931efcfab2c854e81ed35fa080f84cd" dependencies = [ - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex", ] [[package]] name = "rocksdb" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12069b106981c6103d3eab7dd1c86751482d0779a520b7c14954c8b586c1e643" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "librocksdb-sys 6.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "librocksdb-sys", ] [[package]] name = "rpassword" version = "4.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "winapi 0.3.8", ] [[package]] name = "rust-argon2" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils 0.7.0", ] [[package]] name = "rustc-demangle" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" [[package]] name = "rustc-hex" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0", ] [[package]] name = "rustls" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" dependencies = [ - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", - "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.10.1", + "log 0.4.8", + "ring", + "sct", + "webpki", ] [[package]] name = "rustversion" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "rw-stream-sink" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "pin-project", + "static_assertions", ] [[package]] name = "ryu" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" [[package]] name = "safe-mix" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version", ] [[package]] name = "safemem" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util", ] [[package]] name = "sc-authority-discovery" version = "0.8.0" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-peerset 2.0.0", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-authority-discovery 2.0.0", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "substrate-test-runtime-client 2.0.0", + "bytes 0.4.12", + "derive_more", + "env_logger 0.7.1", + "futures 0.3.1", + "futures-timer 2.0.2", + "libp2p", + "log 0.4.8", + "parity-scale-codec", + "prost", + "prost-build", + "quickcheck", + "rand 0.7.3", + "sc-client-api", + "sc-keystore", + "sc-network", + "sc-peerset", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-blockchain", + "sp-core", + "sp-runtime", + "substrate-test-runtime-client", ] [[package]] name = "sc-basic-authorship" version = "0.8.0" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-telemetry 2.0.0", - "sc-transaction-pool 2.0.0", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tokio-executor 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-block-builder", + "sc-client", + "sc-client-api", + "sc-telemetry", + "sc-transaction-pool", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-transaction-pool", + "substrate-test-runtime-client", + "tokio-executor 0.2.0-alpha.6", ] [[package]] name = "sc-block-builder" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sp-api 2.0.0", - "sp-block-builder 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", + "parity-scale-codec", + "sc-client-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", ] [[package]] name = "sc-chain-spec" version = "2.0.0" dependencies = [ - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-chain-spec-derive 2.0.0", - "sc-network 0.8.0", - "sc-telemetry 2.0.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-runtime 2.0.0", + "impl-trait-for-tuples", + "sc-chain-spec-derive", + "sc-network", + "sc-telemetry", + "serde", + "serde_json", + "sp-core", + "sp-runtime", ] [[package]] name = "sc-chain-spec-derive" version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "sc-cli" version = "0.8.0" dependencies = [ - "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fdlimit 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sc-network 0.8.0", - "sc-service 0.8.0", - "sc-telemetry 2.0.0", - "sc-tracing 2.0.0", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-keyring 2.0.0", - "sp-panic-handler 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term 0.12.1", + "app_dirs", + "atty", + "chrono", + "clap", + "derive_more", + "env_logger 0.7.1", + "fdlimit", + "futures 0.3.1", + "lazy_static", + "log 0.4.8", + "names", + "regex", + "rpassword", + "sc-client-api", + "sc-network", + "sc-service", + "sc-telemetry", + "sc-tracing", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-keyring", + "sp-panic-handler", + "sp-runtime", + "sp-state-machine", + "structopt", + "tempfile", + "time", + "tokio 0.2.11", ] [[package]] name = "sc-client" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.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.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 0.8.0", - "sc-client-api 2.0.0", - "sc-executor 0.8.0", - "sc-telemetry 2.0.0", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-inherents 2.0.0", - "sp-keyring 2.0.0", - "sp-panic-handler 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-trie 2.0.0", - "sp-version 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "env_logger 0.7.1", + "fnv", + "futures 0.3.1", + "hash-db", + "hex-literal", + "kvdb", + "kvdb-memorydb", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-block-builder", + "sc-client-api", + "sc-executor", + "sc-telemetry", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-keyring", + "sp-panic-handler", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-version", + "substrate-test-runtime-client", + "tempfile", + "tracing", ] [[package]] name = "sc-client-api" version = "2.0.0" dependencies = [ - "derive_more 0.99.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.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor 0.8.0", - "sc-telemetry 2.0.0", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-inherents 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-test-primitives 2.0.0", - "sp-transaction-pool 2.0.0", - "sp-trie 2.0.0", - "sp-version 2.0.0", + "derive_more", + "fnv", + "futures 0.3.1", + "hash-db", + "hex-literal", + "kvdb", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-executor", + "sc-telemetry", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-keyring", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-test-primitives", + "sp-transaction-pool", + "sp-trie", + "sp-version", ] [[package]] name = "sc-client-db" version = "0.8.0" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kvdb-rocksdb 0.4.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.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-executor 0.8.0", - "sc-state-db 0.8.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-trie 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.7.1", + "hash-db", + "kvdb", + "kvdb-memorydb", + "kvdb-rocksdb", + "linked-hash-map", + "log 0.4.8", + "parity-scale-codec", + "parity-util-mem 0.4.1", + "parking_lot 0.9.0", + "quickcheck", + "sc-client", + "sc-client-api", + "sc-executor", + "sc-state-db", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-keyring", + "sp-runtime", + "sp-state-machine", + "sp-trie", + "substrate-test-runtime-client", + "tempfile", ] [[package]] name = "sc-consensus-aura" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-consensus-slots 0.8.0", - "sc-executor 0.8.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-network-test 0.8.0", - "sc-service 0.8.0", - "sc-telemetry 2.0.0", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-block-builder 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-aura 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-timestamp 2.0.0", - "sp-version 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "env_logger 0.7.1", + "futures 0.1.29", + "futures 0.3.1", + "futures-timer 0.4.0", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-client", + "sc-client-api", + "sc-consensus-slots", + "sc-executor", + "sc-keystore", + "sc-network", + "sc-network-test", + "sc-service", + "sc-telemetry", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-timestamp", + "sp-version", + "substrate-test-runtime-client", + "tempfile", + "tokio 0.1.22", ] [[package]] name = "sc-consensus-babe" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fork-tree 2.0.0", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pdqselect 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-consensus-slots 0.8.0", - "sc-consensus-uncles 0.8.0", - "sc-executor 0.8.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-network-test 0.8.0", - "sc-service 0.8.0", - "sc-telemetry 2.0.0", - "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-block-builder 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-timestamp 2.0.0", - "sp-version 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "env_logger 0.7.1", + "fork-tree", + "futures 0.1.29", + "futures 0.3.1", + "futures-timer 0.4.0", + "log 0.4.8", + "merlin", + "num-bigint", + "num-rational", + "num-traits", + "parity-scale-codec", + "parking_lot 0.9.0", + "pdqselect", + "rand 0.7.3", + "sc-block-builder", + "sc-client", + "sc-client-api", + "sc-consensus-slots", + "sc-consensus-uncles", + "sc-executor", + "sc-keystore", + "sc-network", + "sc-network-test", + "sc-service", + "sc-telemetry", + "schnorrkel", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-timestamp", + "sp-version", + "substrate-test-runtime-client", + "tempfile", + "tokio 0.1.22", ] [[package]] name = "sc-consensus-manual-seal" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-basic-authorship 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-transaction-pool 2.0.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime-client 2.0.0", - "substrate-test-runtime-transaction-pool 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "env_logger 0.7.1", + "futures 0.3.1", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "log 0.4.8", + "parking_lot 0.10.0", + "sc-basic-authorship", + "sc-client", + "sc-client-api", + "sc-transaction-pool", + "serde", + "sp-blockchain", + "sp-consensus", + "sp-inherents", + "sp-runtime", + "sp-transaction-pool", + "substrate-test-runtime-client", + "substrate-test-runtime-transaction-pool", + "tempfile", + "tokio 0.2.11", ] [[package]] name = "sc-consensus-pow" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sp-api 2.0.0", - "sp-block-builder 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-pow 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-timestamp 2.0.0", + "derive_more", + "futures 0.3.1", + "log 0.4.8", + "parity-scale-codec", + "sc-client-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-pow", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-timestamp", ] [[package]] name = "sc-consensus-slots" version = "0.8.0" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sc-telemetry 2.0.0", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "substrate-test-runtime-client 2.0.0", + "futures 0.3.1", + "futures-timer 2.0.2", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-client-api", + "sc-telemetry", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "substrate-test-runtime-client", ] [[package]] name = "sc-consensus-uncles" version = "0.8.0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sp-authorship 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", + "log 0.4.8", + "sc-client-api", + "sp-authorship", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", ] [[package]] name = "sc-executor" version = "0.8.0" dependencies = [ - "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor-common 0.8.0", - "sc-executor-wasmi 0.8.0", - "sc-executor-wasmtime 0.8.0", - "sc-runtime-test 2.0.0", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-io 2.0.0", - "sp-panic-handler 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-serializer 2.0.0", - "sp-state-machine 0.8.0", - "sp-trie 2.0.0", - "sp-version 2.0.0", - "sp-wasm-interface 2.0.0", - "substrate-test-runtime 2.0.0", - "test-case 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches", + "derive_more", + "hex-literal", + "lazy_static", + "libsecp256k1", + "log 0.4.8", + "parity-scale-codec", + "parity-wasm 0.41.0", + "parking_lot 0.9.0", + "sc-executor-common", + "sc-executor-wasmi", + "sc-executor-wasmtime", + "sc-runtime-test", + "sp-core", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", + "sp-serializer", + "sp-state-machine", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "substrate-test-runtime", + "test-case", + "wabt", + "wasmi", ] [[package]] name = "sc-executor-common" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-allocator 2.0.0", - "sp-core 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-serializer 2.0.0", - "sp-wasm-interface 2.0.0", - "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "log 0.4.8", + "parity-scale-codec", + "sp-allocator", + "sp-core", + "sp-runtime-interface", + "sp-serializer", + "sp-wasm-interface", + "wasmi", ] [[package]] name = "sc-executor-wasmi" version = "0.8.0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor-common 0.8.0", - "sp-allocator 2.0.0", - "sp-core 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-wasm-interface 2.0.0", - "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8", + "parity-scale-codec", + "parity-wasm 0.41.0", + "sc-executor-common", + "sp-allocator", + "sp-core", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmi", ] [[package]] name = "sc-executor-wasmtime" version = "0.8.0" dependencies = [ - "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-native 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-executor-common 0.8.0", - "sp-allocator 2.0.0", - "sp-core 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-wasm-interface 2.0.0", - "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-jit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-runtime 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "log 0.4.8", + "parity-scale-codec", + "parity-wasm 0.41.0", + "sc-executor-common", + "sp-allocator", + "sp-core", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmi", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", ] [[package]] name = "sc-finality-grandpa" version = "0.8.0" dependencies = [ - "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "fork-tree 2.0.0", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-network-gossip 0.8.0", - "sc-network-test 0.8.0", - "sc-telemetry 2.0.0", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-arithmetic 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-finality-grandpa 2.0.0", - "sp-finality-tracker 2.0.0", - "sp-inherents 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "substrate-test-runtime-client 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches", + "env_logger 0.7.1", + "finality-grandpa", + "fork-tree", + "futures 0.1.29", + "futures 0.3.1", + "futures-timer 2.0.2", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "pin-project", + "rand 0.7.3", + "sc-client", + "sc-client-api", + "sc-keystore", + "sc-network", + "sc-network-gossip", + "sc-network-test", + "sc-telemetry", + "serde_json", + "sp-api", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-finality-tracker", + "sp-inherents", + "sp-keyring", + "sp-runtime", + "sp-state-machine", + "substrate-test-runtime-client", + "tempfile", + "tokio 0.1.22", ] [[package]] name = "sc-keystore" version = "2.0.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-application-crypto 2.0.0", - "sp-core 2.0.0", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "hex", + "parking_lot 0.9.0", + "rand 0.7.3", + "serde_json", + "sp-application-crypto", + "sp-core", + "subtle 2.2.2", + "tempfile", ] [[package]] name = "sc-network" version = "0.8.0" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "erased-serde 0.3.10 (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.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.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)", - "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-peerset 2.0.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "slog_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-arithmetic 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-test-primitives 2.0.0", - "substrate-test-client 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "bytes 0.5.4", + "derive_more", + "either", + "env_logger 0.7.1", + "erased-serde", + "fnv", + "fork-tree", + "futures 0.3.1", + "futures-timer 0.4.0", + "futures_codec", + "libp2p", + "linked-hash-map", + "linked_hash_set", + "log 0.4.8", + "lru 0.4.3", + "parity-scale-codec", + "parking_lot 0.9.0", + "quickcheck", + "rand 0.7.3", + "rustc-hex", + "sc-block-builder", + "sc-client", + "sc-client-api", + "sc-peerset", + "serde", + "serde_json", + "slog", + "slog_derive", + "smallvec 0.6.13", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-keyring", + "sp-runtime", + "sp-test-primitives", + "substrate-test-client", + "substrate-test-runtime-client", + "tempfile", + "unsigned-varint 0.3.0", + "void", + "zeroize 1.1.0", ] [[package]] name = "sc-network-gossip" version = "0.8.0" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-network 0.8.0", - "sp-runtime 2.0.0", + "futures 0.1.29", + "futures 0.3.1", + "futures-timer 0.4.0", + "libp2p", + "log 0.4.8", + "lru 0.1.17", + "parking_lot 0.9.0", + "sc-network", + "sp-runtime", ] [[package]] name = "sc-network-test" version = "0.8.0" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-network 0.8.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "substrate-test-runtime 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.7.1", + "futures 0.1.29", + "futures 0.3.1", + "futures-timer 0.4.0", + "libp2p", + "log 0.4.8", + "parking_lot 0.9.0", + "rand 0.7.3", + "sc-block-builder", + "sc-client", + "sc-client-api", + "sc-network", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-runtime", + "substrate-test-runtime", + "substrate-test-runtime-client", + "tempfile", + "tokio 0.1.22", ] [[package]] name = "sc-offchain" version = "2.0.0" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sc-client-db 0.8.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-transaction-pool 2.0.0", - "sp-api 2.0.0", - "sp-core 2.0.0", - "sp-offchain 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime-client 2.0.0", - "threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "env_logger 0.7.1", + "fnv", + "futures 0.1.29", + "futures 0.3.1", + "futures-timer 2.0.2", + "hyper 0.12.35", + "hyper-rustls", + "log 0.4.8", + "num_cpus", + "parity-scale-codec", + "parking_lot 0.9.0", + "rand 0.7.3", + "sc-client-api", + "sc-client-db", + "sc-keystore", + "sc-network", + "sc-transaction-pool", + "sp-api", + "sp-core", + "sp-offchain", + "sp-runtime", + "sp-transaction-pool", + "substrate-test-runtime-client", + "threadpool", + "tokio 0.1.22", ] [[package]] name = "sc-peerset" version = "2.0.0" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "libp2p", + "log 0.4.8", + "rand 0.7.3", + "serde_json", ] [[package]] name = "sc-rpc" version = "2.0.0" dependencies = [ - "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-executor 0.8.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-rpc-api 0.8.0", - "sc-transaction-pool 2.0.0", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-offchain 2.0.0", - "sp-rpc 2.0.0", - "sp-runtime 2.0.0", - "sp-session 2.0.0", - "sp-state-machine 0.8.0", - "sp-transaction-pool 2.0.0", - "sp-version 2.0.0", - "substrate-test-runtime-client 2.0.0", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches", + "futures 0.1.29", + "futures 0.3.1", + "hash-db", + "jsonrpc-core", + "jsonrpc-pubsub", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "rustc-hex", + "sc-client", + "sc-client-api", + "sc-executor", + "sc-keystore", + "sc-network", + "sc-rpc-api", + "sc-transaction-pool", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-io", + "sp-offchain", + "sp-rpc", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-transaction-pool", + "sp-version", + "substrate-test-runtime-client", + "tokio 0.1.22", ] [[package]] name = "sc-rpc-api" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-rpc 2.0.0", - "sp-transaction-pool 2.0.0", - "sp-version 2.0.0", + "derive_more", + "futures 0.3.1", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-pubsub", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "serde", + "serde_json", + "sp-core", + "sp-rpc", + "sp-transaction-pool", + "sp-version", ] [[package]] name = "sc-rpc-server" version = "2.0.0" dependencies = [ - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-http-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-ws-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-runtime 2.0.0", + "jsonrpc-core", + "jsonrpc-http-server", + "jsonrpc-pubsub", + "jsonrpc-ws-server", + "log 0.4.8", + "serde", + "serde_json", + "sp-runtime", ] [[package]] name = "sc-runtime-test" version = "2.0.0" dependencies = [ - "sp-allocator 2.0.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-sandbox 0.8.0", - "sp-std 2.0.0", - "substrate-wasm-builder-runner 1.0.5", + "sp-allocator", + "sp-core", + "sp-io", + "sp-runtime", + "sp-sandbox", + "sp-std", + "substrate-wasm-builder-runner", ] [[package]] name = "sc-service" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "grafana-data-source 0.8.0", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-chain-spec 2.0.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-client-db 0.8.0", - "sc-executor 0.8.0", - "sc-finality-grandpa 0.8.0", - "sc-keystore 2.0.0", - "sc-network 0.8.0", - "sc-offchain 2.0.0", - "sc-rpc 2.0.0", - "sc-rpc-server 2.0.0", - "sc-telemetry 2.0.0", - "sc-tracing 2.0.0", - "sc-transaction-pool 2.0.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-finality-grandpa 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-session 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime-client 2.0.0", - "sysinfo 0.9.6 (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.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "exit-future", + "futures 0.1.29", + "futures 0.3.1", + "futures-diagnose", + "futures-timer 2.0.2", + "grafana-data-source", + "lazy_static", + "log 0.4.8", + "parity-multiaddr 0.5.0", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-chain-spec", + "sc-client", + "sc-client-api", + "sc-client-db", + "sc-executor", + "sc-finality-grandpa", + "sc-keystore", + "sc-network", + "sc-offchain", + "sc-rpc", + "sc-rpc-server", + "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", + "serde", + "serde_json", + "slog", + "sp-api", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-io", + "sp-runtime", + "sp-session", + "sp-transaction-pool", + "substrate-test-runtime-client", + "sysinfo", + "target_info", + "tokio 0.2.11", + "tokio-executor 0.1.9", + "tracing", ] [[package]] name = "sc-service-test" version = "2.0.0" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fdlimit 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-network 0.8.0", - "sc-service 0.8.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.7.1", + "fdlimit", + "futures 0.1.29", + "futures 0.3.1", + "log 0.4.8", + "sc-client", + "sc-network", + "sc-service", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-transaction-pool", + "tempfile", + "tokio 0.1.22", ] [[package]] name = "sc-state-db" version = "0.8.0" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", + "env_logger 0.7.1", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "sp-core", ] [[package]] name = "sc-telemetry" version = "2.0.0" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.5.2 (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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 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)", + "bytes 0.5.4", + "futures 0.3.1", + "futures-timer 2.0.2", + "libp2p", + "log 0.4.8", + "parking_lot 0.9.0", + "pin-project", + "rand 0.7.3", + "serde", + "slog", + "slog-json", + "slog-scope", + "take_mut", + "void", ] [[package]] name = "sc-tracing" version = "2.0.0" dependencies = [ - "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", - "grafana-data-source 0.8.0", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-telemetry 2.0.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde", + "grafana-data-source", + "log 0.4.8", + "parking_lot 0.9.0", + "sc-telemetry", + "serde", + "serde_json", + "slog", + "tracing", + "tracing-core", ] [[package]] name = "sc-transaction-graph" version = "2.0.0" dependencies = [ - "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime 2.0.0", + "assert_matches", + "criterion 0.3.1", + "derive_more", + "futures 0.3.1", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "serde", + "sp-core", + "sp-runtime", + "sp-transaction-pool", + "substrate-test-runtime", ] [[package]] name = "sc-transaction-pool" version = "2.0.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client-api 2.0.0", - "sc-transaction-graph 2.0.0", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime-client 2.0.0", - "substrate-test-runtime-transaction-pool 2.0.0", + "derive_more", + "futures 0.3.1", + "futures-diagnose", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-client-api", + "sc-transaction-graph", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-keyring", + "sp-runtime", + "sp-transaction-pool", + "substrate-test-runtime-client", + "substrate-test-runtime-transaction-pool", ] [[package]] name = "schannel" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "winapi 0.3.8", ] [[package]] name = "schnorrkel" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eacd8381b3c37840c9c9f40472af529e49975bdcbc24f83c31059fd6539023d3" dependencies = [ - "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.3", + "failure", + "merlin", + "rand 0.6.5", + "rand_core 0.4.2", + "rand_os", + "sha2", + "subtle 2.2.2", + "zeroize 0.9.3", ] [[package]] name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" [[package]] name = "scopeguard" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" [[package]] name = "scroll" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb2332cb595d33f7edd5700f4cbf94892e680c7f0ae56adab58a35190b66cb1" dependencies = [ - "scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scroll_derive", ] [[package]] name = "scroll_derive" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "sct" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" dependencies = [ - "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ring", + "untrusted", ] [[package]] name = "security-framework" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" 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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] name = "security-framework-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys", ] [[package]] name = "semver" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver-parser", ] [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "semver-parser", + "serde", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "send_wrapper" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" [[package]] name = "send_wrapper" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" [[package]] name = "serde" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" dependencies = [ - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "serde_json" version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b01d7f0288608a01dca632cf1df859df6fd6ffa885300fc275ce2ba6221953" dependencies = [ - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa", + "ryu", + "serde", ] [[package]] name = "sha-1" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer", + "digest", + "fake-simd", + "opaque-debug", ] [[package]] name = "sha1" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" [[package]] name = "sha2" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" dependencies = [ - "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer", + "digest", + "fake-simd", + "opaque-debug", ] [[package]] name = "sha3" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" dependencies = [ - "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.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer", + "byte-tools", + "digest", + "keccak", + "opaque-debug", ] [[package]] name = "shell32-sys" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "shlex" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" [[package]] name = "signal-hook-registry" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" dependencies = [ - "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "arc-swap", + "libc", ] [[package]] name = "slab" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "slog" version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cc9c640a4adbfbcc11ffb95efe5aa7af7309e002adab54b185507dbf2377b99" dependencies = [ - "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde", ] [[package]] name = "slog-json" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono", + "erased-serde", + "serde", + "serde_json", + "slog", ] [[package]] name = "slog-scope" version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c44c89dd8b0ae4537d1ae318353eaf7840b4869c536e31c41e963d1ea523ee6" dependencies = [ - "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "arc-swap", + "lazy_static", + "slog", ] [[package]] name = "slog_derive" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "smallvec" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" dependencies = [ - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit", ] [[package]] name = "smallvec" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" [[package]] name = "snow" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" dependencies = [ - "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref", + "rand_core 0.5.1", + "ring", + "rustc_version", + "subtle 2.2.2", ] [[package]] name = "soketto" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0", + "bytes 0.5.4", + "flate2", + "futures 0.3.1", + "http 0.2.0", + "httparse", + "log 0.4.8", + "rand 0.7.3", + "sha1", + "smallvec 1.2.0", + "static_assertions", + "thiserror", ] [[package]] name = "sourcefile" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" [[package]] name = "sp-allocator" version = "2.0.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-std 2.0.0", - "sp-wasm-interface 2.0.0", + "derive_more", + "log 0.4.8", + "sp-core", + "sp-std", + "sp-wasm-interface", ] [[package]] name = "sp-api" version = "2.0.0" dependencies = [ - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api-proc-macro 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-test-primitives 2.0.0", - "sp-version 2.0.0", + "hash-db", + "parity-scale-codec", + "sp-api-proc-macro", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-test-primitives", + "sp-version", ] [[package]] name = "sp-api-proc-macro" version = "2.0.0" dependencies = [ - "blake2-rfc 0.2.18 (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 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2-rfc", + "proc-macro-crate", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "sp-api-test" version = "2.0.0" dependencies = [ - "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-version 2.0.0", - "substrate-test-runtime-client 2.0.0", - "trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.1", + "parity-scale-codec", + "rustversion", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-runtime", + "sp-state-machine", + "sp-version", + "substrate-test-runtime-client", + "trybuild", ] [[package]] name = "sp-application-crypto" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-std", ] [[package]] name = "sp-application-crypto-test" version = "2.0.0" dependencies = [ - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "substrate-test-runtime-client 2.0.0", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-runtime", + "substrate-test-runtime-client", ] [[package]] name = "sp-arithmetic" version = "2.0.0" dependencies = [ - "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-debug-derive 2.0.0", - "sp-std 2.0.0", + "criterion 0.3.1", + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "primitive-types", + "rand 0.7.3", + "serde", + "sp-debug-derive", + "sp-std", ] [[package]] name = "sp-authority-discovery" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-authorship" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-block-builder" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-blockchain" version = "2.0.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-block-builder 2.0.0", - "sp-consensus 0.8.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", + "derive_more", + "log 0.4.8", + "lru 0.4.3", + "parity-scale-codec", + "parking_lot 0.9.0", + "sp-block-builder", + "sp-consensus", + "sp-runtime", + "sp-state-machine", ] [[package]] name = "sp-consensus" version = "0.8.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-test-primitives 2.0.0", - "sp-version 2.0.0", + "derive_more", + "futures 0.3.1", + "futures-diagnose", + "futures-timer 0.4.0", + "libp2p", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.9.0", + "serde", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-test-primitives", + "sp-version", ] [[package]] name = "sp-consensus-aura" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-timestamp 2.0.0", + "parity-scale-codec", + "sp-api", + "sp-application-crypto", + "sp-inherents", + "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "sp-consensus-babe" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-consensus 0.8.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-timestamp 2.0.0", + "parity-scale-codec", + "schnorrkel", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-inherents", + "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "sp-consensus-pow" version = "0.8.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-core" 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.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.3 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (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.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-debug-derive 2.0.0", - "sp-externalities 0.8.0", - "sp-runtime-interface 2.0.0", - "sp-serializer 2.0.0", - "sp-std 2.0.0", - "sp-storage 2.0.0", - "substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base58", + "blake2-rfc", + "byteorder 1.3.2", + "criterion 0.2.11", + "ed25519-dalek", + "hash-db", + "hash256-std-hasher", + "hex", + "hex-literal", + "impl-serde 0.2.3", + "lazy_static", + "libsecp256k1", + "log 0.4.8", + "num-traits", + "parity-scale-codec", + "parking_lot 0.9.0", + "pretty_assertions", + "primitive-types", + "rand 0.7.3", + "regex", + "rustc-hex", + "schnorrkel", + "serde", + "serde_json", + "sha2", + "sp-debug-derive", + "sp-externalities", + "sp-runtime-interface", + "sp-serializer", + "sp-std", + "sp-storage", + "substrate-bip39", + "tiny-bip39", + "tiny-keccak 2.0.1", + "twox-hash", + "wasmi", + "zeroize 1.1.0", ] [[package]] name = "sp-debug-derive" version = "2.0.0" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "sp-externalities" version = "0.8.0" dependencies = [ - "environmental 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-std 2.0.0", - "sp-storage 2.0.0", + "environmental", + "sp-std", + "sp-storage", ] [[package]] name = "sp-finality-grandpa" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "serde", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-finality-tracker" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-inherents 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "sp-inherents", + "sp-std", ] [[package]] name = "sp-inherents" version = "2.0.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-std 2.0.0", + "derive_more", + "parity-scale-codec", + "parking_lot 0.9.0", + "sp-core", + "sp-std", ] [[package]] name = "sp-io" version = "2.0.0" dependencies = [ - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-runtime-interface 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-trie 2.0.0", - "sp-wasm-interface 2.0.0", + "hash-db", + "libsecp256k1", + "log 0.4.8", + "parity-scale-codec", + "sp-core", + "sp-externalities", + "sp-runtime-interface", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-wasm-interface", ] [[package]] name = "sp-keyring" version = "2.0.0" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "strum 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "sp-core", + "sp-runtime", + "strum", ] [[package]] name = "sp-offchain" version = "2.0.0" dependencies = [ - "sp-api 2.0.0", - "sp-runtime 2.0.0", + "sp-api", + "sp-runtime", ] [[package]] name = "sp-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace", + "log 0.4.8", ] [[package]] name = "sp-phragmen" version = "2.0.0" dependencies = [ - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "substrate-test-utils 2.0.0", + "rand 0.7.3", + "serde", + "sp-io", + "sp-runtime", + "sp-std", + "substrate-test-utils", ] [[package]] name = "sp-rpc" version = "2.0.0" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", + "serde", + "serde_json", + "sp-core", ] [[package]] name = "sp-runtime" version = "2.0.0" dependencies = [ - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-application-crypto 2.0.0", - "sp-arithmetic 2.0.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-std 2.0.0", + "impl-trait-for-tuples", + "log 0.4.8", + "parity-scale-codec", + "paste", + "rand 0.7.3", + "serde", + "serde_json", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-inherents", + "sp-io", + "sp-std", ] [[package]] name = "sp-runtime-interface" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-io 2.0.0", - "sp-runtime-interface-proc-macro 2.0.0", - "sp-runtime-interface-test-wasm 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-wasm-interface 2.0.0", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec", + "primitive-types", + "rustversion", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime-interface-proc-macro", + "sp-runtime-interface-test-wasm", + "sp-state-machine", + "sp-std", + "sp-wasm-interface", + "static_assertions", + "trybuild", ] [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0" dependencies = [ - "Inflector 0.11.4 (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 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "Inflector", + "proc-macro-crate", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "sp-runtime-interface-test" version = "2.0.0" dependencies = [ - "sc-executor 0.8.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-runtime-interface-test-wasm 2.0.0", - "sp-state-machine 0.8.0", + "sc-executor", + "sp-core", + "sp-io", + "sp-runtime-interface", + "sp-runtime-interface-test-wasm", + "sp-state-machine", ] [[package]] name = "sp-runtime-interface-test-wasm" version = "2.0.0" dependencies = [ - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-std 2.0.0", - "substrate-wasm-builder-runner 1.0.5", + "sp-core", + "sp-io", + "sp-runtime-interface", + "sp-std", + "substrate-wasm-builder-runner", ] [[package]] name = "sp-sandbox" version = "0.8.0" dependencies = [ - "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-std 2.0.0", - "sp-wasm-interface 2.0.0", - "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-std", + "sp-wasm-interface", + "wabt", + "wasmi", ] [[package]] name = "sp-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", + "serde_json", ] [[package]] name = "sp-session" version = "2.0.0" dependencies = [ - "sp-api 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-staking" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "parity-scale-codec", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-state-machine" version = "0.8.0" dependencies = [ - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-panic-handler 2.0.0", - "sp-trie 2.0.0", - "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db", + "hex-literal", + "log 0.4.8", + "num-traits", + "parity-scale-codec", + "parking_lot 0.9.0", + "rand 0.7.3", + "sp-core", + "sp-externalities", + "sp-panic-handler", + "sp-trie", + "trie-db", + "trie-root", ] [[package]] @@ -6751,208 +7183,220 @@ version = "2.0.0" name = "sp-storage" version = "2.0.0" dependencies = [ - "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-debug-derive 2.0.0", - "sp-std 2.0.0", + "impl-serde 0.2.3", + "serde", + "sp-debug-derive", + "sp-std", ] [[package]] name = "sp-test-primitives" version = "2.0.0" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-application-crypto 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", + "parity-scale-codec", + "serde", + "sp-application-crypto", + "sp-core", + "sp-runtime", ] [[package]] name = "sp-timestamp" version = "2.0.0" dependencies = [ - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-inherents 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-transaction-pool" version = "2.0.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-runtime 2.0.0", + "derive_more", + "futures 0.3.1", + "log 0.4.8", + "parity-scale-codec", + "serde", + "sp-api", + "sp-runtime", ] [[package]] name = "sp-trie" version = "2.0.0" dependencies = [ - "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-core 2.0.0", - "sp-std 2.0.0", - "trie-bench 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11", + "hash-db", + "hex-literal", + "memory-db", + "parity-scale-codec", + "sp-core", + "sp-std", + "trie-bench", + "trie-db", + "trie-root", + "trie-standardmap", ] [[package]] name = "sp-version" version = "2.0.0" dependencies = [ - "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-runtime 2.0.0", - "sp-std 2.0.0", + "impl-serde 0.2.3", + "parity-scale-codec", + "serde", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-wasm-interface" version = "2.0.0" dependencies = [ - "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-std 2.0.0", - "wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-std", + "wasmi", ] [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "stable_deref_trait" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stream-cipher" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array", ] [[package]] name = "string" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", ] [[package]] name = "string-interner" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd710eadff449a1531351b0e43eb81ea404336fa2f56c777427ab0e32a4cf183" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "strsim" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "structopt" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1bcbed7d48956fcbb5d80c6b95aedb553513de0a1b451ea92679d999c010e98" dependencies = [ - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "clap", + "lazy_static", + "structopt-derive", ] [[package]] name = "structopt-derive" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "095064aa1f5b94d14e635d0a5684cf140c43ae40a0fd990708d38f5d669e5f64" dependencies = [ - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "heck", + "proc-macro-error", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "strum" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" dependencies = [ - "strum_macros 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum_macros", ] [[package]] name = "strum_macros" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" dependencies = [ - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "heck", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "subkey" version = "2.0.0" dependencies = [ - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-system 2.0.0", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 2.0.0", - "node-runtime 2.0.0", - "pallet-balances 2.0.0", - "pallet-transaction-payment 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-rpc 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "clap", + "derive_more", + "frame-system", + "futures 0.1.29", + "hex", + "hex-literal", + "hyper 0.12.35", + "itertools", + "jsonrpc-core-client", + "node-primitives", + "node-runtime", + "pallet-balances", + "pallet-transaction-payment", + "parity-scale-codec", + "rand 0.7.3", + "rpassword", + "rustc-hex", + "sc-rpc", + "sp-core", + "sp-runtime", + "substrate-bip39", + "tiny-bip39", ] [[package]] name = "substrate-bip39" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" dependencies = [ - "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac", + "pbkdf2", + "schnorrkel", + "sha2", ] [[package]] @@ -6963,129 +7407,129 @@ version = "2.0.0" name = "substrate-frame-rpc-support" version = "2.0.0" dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-rpc-api 0.8.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-storage 2.0.0", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "frame-support", + "frame-system", + "futures 0.3.1", + "jsonrpc-client-transports", + "jsonrpc-core", + "parity-scale-codec", + "sc-rpc-api", + "serde", + "sp-storage", + "tokio 0.1.22", ] [[package]] name = "substrate-frame-rpc-system" version = "2.0.0" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-system-rpc-runtime-api 2.0.0", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-transaction-pool 2.0.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime-client 2.0.0", + "env_logger 0.7.1", + "frame-system-rpc-runtime-api", + "futures 0.3.1", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "log 0.4.8", + "parity-scale-codec", + "sc-client", + "sc-transaction-pool", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-transaction-pool", + "substrate-test-runtime-client", ] [[package]] name = "substrate-test-client" version = "2.0.0" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sc-client-db 0.8.0", - "sc-executor 0.8.0", - "sp-blockchain 2.0.0", - "sp-consensus 0.8.0", - "sp-core 2.0.0", - "sp-keyring 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", + "futures 0.3.1", + "hash-db", + "parity-scale-codec", + "sc-client", + "sc-client-api", + "sc-client-db", + "sc-executor", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-keyring", + "sp-runtime", + "sp-state-machine", ] [[package]] name = "substrate-test-runtime" version = "2.0.0" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "frame-executive 2.0.0", - "frame-support 2.0.0", - "frame-system 2.0.0", - "frame-system-rpc-runtime-api 2.0.0", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pallet-babe 2.0.0", - "pallet-timestamp 2.0.0", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-client 0.8.0", - "sc-executor 0.8.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-api 2.0.0", - "sp-application-crypto 2.0.0", - "sp-block-builder 2.0.0", - "sp-consensus-aura 0.8.0", - "sp-consensus-babe 0.8.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-keyring 2.0.0", - "sp-offchain 2.0.0", - "sp-runtime 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-session 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-transaction-pool 2.0.0", - "sp-trie 2.0.0", - "sp-version 2.0.0", - "substrate-test-runtime-client 2.0.0", - "substrate-wasm-builder-runner 1.0.5", - "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "log 0.4.8", + "memory-db", + "pallet-babe", + "pallet-timestamp", + "parity-scale-codec", + "sc-client", + "sc-executor", + "serde", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-consensus-aura", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-offchain", + "sp-runtime", + "sp-runtime-interface", + "sp-session", + "sp-state-machine", + "sp-std", + "sp-transaction-pool", + "sp-trie", + "sp-version", + "substrate-test-runtime-client", + "substrate-wasm-builder-runner", + "trie-db", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-block-builder 0.8.0", - "sc-client 0.8.0", - "sc-client-api 2.0.0", - "sp-api 2.0.0", - "sp-blockchain 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "substrate-test-client 2.0.0", - "substrate-test-runtime 2.0.0", + "futures 0.3.1", + "parity-scale-codec", + "sc-block-builder", + "sc-client", + "sc-client-api", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "substrate-test-client", + "substrate-test-runtime", ] [[package]] name = "substrate-test-runtime-transaction-pool" version = "2.0.0" dependencies = [ - "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sc-transaction-graph 2.0.0", - "sp-runtime 2.0.0", - "sp-transaction-pool 2.0.0", - "substrate-test-runtime-client 2.0.0", + "derive_more", + "futures 0.3.1", + "parity-scale-codec", + "parking_lot 0.9.0", + "sc-transaction-graph", + "sp-runtime", + "sp-transaction-pool", + "substrate-test-runtime-client", ] [[package]] @@ -7096,14 +7540,14 @@ version = "2.0.0" name = "substrate-wasm-builder" version = "1.0.9" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cargo_metadata 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-gc-api 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "build-helper", + "cargo_metadata", + "fs2", + "tempfile", + "toml", + "walkdir", + "wasm-gc-api", ] [[package]] @@ -7114,1823 +7558,1369 @@ version = "1.0.5" name = "subtle" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" [[package]] name = "subtle" version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" [[package]] name = "syn" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "unicode-xid 0.2.0", ] [[package]] name = "syn-mid" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", + "unicode-xid 0.2.0", ] [[package]] name = "sysinfo" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f4b2468c629cffba39c0a4425849ab3cdb03d9dfacba69684609aea04d08ff9" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "doc-comment", + "libc", + "rayon", + "winapi 0.3.8", ] [[package]] name = "take_mut" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" [[package]] name = "target-lexicon" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4" [[package]] name = "target_info" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" [[package]] name = "tempfile" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "rand 0.7.3", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.8", ] [[package]] name = "termcolor" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" dependencies = [ - "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util", ] [[package]] name = "test-case" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a605baa797821796a751f4a959e1206079b24a4b7e1ed302b7d785d81a9276c9" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", + "version_check 0.9.1", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width", ] [[package]] name = "thiserror" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "205684fd018ca14432b12cce6ea3d46763311a571c3d294e71ba3f01adcf1aad" dependencies = [ - "thiserror-impl 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e4d2e50ca050ed44fb58309bdce3efa79948f84f9993ad1978de5eebdce5a7" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "thread_local" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", ] [[package]] name = "threadpool" version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" dependencies = [ - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus", ] [[package]] name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "redox_syscall", + "winapi 0.3.8", ] [[package]] name = "tiny-bip39" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure", + "hashbrown 0.1.8", + "hmac", + "once_cell 0.1.8", + "pbkdf2", + "rand 0.6.5", + "sha2", ] [[package]] name = "tiny-keccak" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" dependencies = [ - "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy", ] [[package]] name = "tiny-keccak" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2953ca5148619bc99695c1274cb54c5275bbb913c6adad87e72eaf8db9787f69" dependencies = [ - "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy", ] [[package]] name = "tinytemplate" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a3c6667d3e65eb1bc3aed6fd14011c6cbc3a0665218ab7f5daf040b9ec371a" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", + "serde_json", ] [[package]] name = "tokio" version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.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)", - "tokio-executor 0.1.9 (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.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.7 (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.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "mio", + "num_cpus", + "tokio-codec", + "tokio-current-thread", + "tokio-executor 0.1.9", + "tokio-fs", + "tokio-io", + "tokio-reactor", + "tokio-sync 0.1.7", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "tokio-udp", + "tokio-uds", ] [[package]] name = "tokio" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "fnv", + "lazy_static", + "libc", + "memchr", + "mio", + "mio-uds", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "winapi 0.3.8", ] [[package]] name = "tokio-buf" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "either", + "futures 0.1.29", ] [[package]] name = "tokio-codec" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "tokio-io", ] [[package]] name = "tokio-current-thread" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29", + "tokio-executor 0.1.9", ] [[package]] name = "tokio-executor" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", + "futures 0.1.29", ] [[package]] name = "tokio-executor" version = "0.2.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" dependencies = [ - "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util-preview", + "lazy_static", + "tokio-sync 0.2.0-alpha.6", ] [[package]] name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" dependencies = [ - "futures 0.1.29 (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.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29", + "tokio-io", + "tokio-threadpool", ] [[package]] name = "tokio-io" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "log 0.4.8", ] [[package]] name = "tokio-macros" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", ] [[package]] name = "tokio-reactor" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (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.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-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", + "futures 0.1.29", + "lazy_static", + "log 0.4.8", + "mio", + "num_cpus", + "parking_lot 0.9.0", + "slab", + "tokio-executor 0.1.9", + "tokio-io", + "tokio-sync 0.1.7", ] [[package]] name = "tokio-rustls" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d7cf08f990090abd6c6a73cab46fed62f85e8aef8b99e4b918a9f4a637f0676" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls 0.16.0 (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.21.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "iovec", + "rustls", + "tokio-io", + "webpki", ] [[package]] name = "tokio-sync" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" dependencies = [ - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv", + "futures 0.1.29", ] [[package]] name = "tokio-sync" version = "0.2.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f1aaeb685540f7407ea0e27f1c9757d258c7c6bf4e3eb19da6fc59b747239d2" dependencies = [ - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv", + "futures-core-preview", + "futures-util-preview", ] [[package]] name = "tokio-tcp" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.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-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "iovec", + "mio", + "tokio-io", + "tokio-reactor", ] [[package]] name = "tokio-threadpool" version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" dependencies = [ - "crossbeam-deque 0.7.2 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "crossbeam-queue 0.1.2", + "crossbeam-utils 0.6.6", + "futures 0.1.29", + "lazy_static", + "log 0.4.8", + "num_cpus", + "slab", + "tokio-executor 0.1.9", ] [[package]] name = "tokio-timer" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", + "futures 0.1.29", + "slab", + "tokio-executor 0.1.9", ] [[package]] name = "tokio-tls" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" dependencies = [ - "futures 0.1.29 (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)", + "futures 0.1.29", + "native-tls", + "tokio-io", ] [[package]] name = "tokio-udp" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (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.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "log 0.4.8", + "mio", + "tokio-codec", + "tokio-io", + "tokio-reactor", ] [[package]] name = "tokio-uds" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (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)", - "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "iovec", + "libc", + "log 0.4.8", + "mio", + "mio-uds", + "tokio-codec", + "tokio-io", + "tokio-reactor", ] [[package]] name = "tokio-util" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "futures-core", + "futures-sink", + "log 0.4.8", + "pin-project-lite", + "tokio 0.2.11", ] [[package]] name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "tower-service" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" [[package]] name = "tracing" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e213bd24252abeb86a0b7060e02df677d367ce6cb772cef17e9214b8390a8d3" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-attributes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "tracing-attributes", + "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cfd395def5a60236e187e1ff905cb55668a59f29928dec05e6e1b1fd2ac1f3" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2", + "syn", ] [[package]] name = "tracing-core" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13a46f11e372b8bd4b4398ea54353412fdd7fd42a8370c7e543e218cf7661978" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", ] [[package]] name = "traitobject" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" [[package]] name = "trie-bench" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fd042d57ee9c987c562811162a78db78b5340ab674ac76056c85dca49b26bc" dependencies = [ - "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11", + "hash-db", + "keccak-hasher", + "memory-db", + "parity-scale-codec", + "trie-db", + "trie-root", + "trie-standardmap", ] [[package]] name = "trie-db" version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d747ae5b6f078df7e46477fcc7df66df9eb4f27a031cf4a7c890a8dd03d8e6" dependencies = [ - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db", + "hashbrown 0.6.3", + "log 0.4.8", + "rand 0.6.5", + "rustc-hex", + "smallvec 1.2.0", ] [[package]] name = "trie-root" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b779f7c1c8fe9276365d9d5be5c4b5adeacf545117bb3f64c974305789c5c0b" dependencies = [ - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db", ] [[package]] name = "trie-standardmap" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3161ba520ab28cd8e6b68e1126f1009f6e335339d1a73b978139011703264c8" dependencies = [ - "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db", + "keccak-hasher", ] [[package]] name = "try-lock" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" [[package]] name = "trybuild" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f5b3f750c701725331ac78e389b5d143b7d25f6b6ffffd0d419759a9063ac5f" dependencies = [ - "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "glob 0.3.0", + "lazy_static", + "serde", + "serde_json", + "termcolor", + "toml", ] [[package]] name = "twofish" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" dependencies = [ - "block-cipher-trait 0.6.2 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-cipher-trait", + "byteorder 1.3.2", + "opaque-debug", ] [[package]] name = "twox-hash" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bfd5b7557925ce778ff9b9ef90e3ade34c524b5ff10e239c69a42d546d2af56" dependencies = [ - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3", ] [[package]] name = "typeable" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" [[package]] name = "typenum" version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" [[package]] name = "uint" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" dependencies = [ - "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)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "crunchy", + "rustc-hex", + "static_assertions", ] [[package]] name = "unicase" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" dependencies = [ - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5", ] [[package]] name = "unicase" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.1", ] [[package]] name = "unicode-bidi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", ] [[package]] name = "unicode-normalization" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" dependencies = [ - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0", ] [[package]] name = "unicode-segmentation" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" [[package]] name = "unicode-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" [[package]] name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" [[package]] name = "unsigned-varint" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f0023a96687fe169081e8adce3f65e3874426b7886e9234d490af2dc077959" [[package]] name = "unsigned-varint" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c689459fbaeb50e56c6749275f084decfd02194ac5852e6617d95d0d3cf02eaf" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "futures_codec", + "tokio-util", ] [[package]] name = "untrusted" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" [[package]] name = "url" version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" dependencies = [ - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", ] [[package]] name = "url" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" dependencies = [ - "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.2.0", + "matches", + "percent-encoding 2.1.0", ] [[package]] name = "vcpkg" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" [[package]] name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" [[package]] name = "vergen" version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aba5e34f93dc7051dfad05b98a18e9156f27e7b431fe1d2398cb6061c0a1dba" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "chrono", + "failure", ] [[package]] name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" [[package]] name = "version_check" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "wabt" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5c5c1286c6e578416982609f47594265f9d489f9b836157d403ad605a46693" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", + "serde_derive", + "serde_json", + "wabt-sys", ] [[package]] name = "wabt-sys" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af5d153dc96aad7dc13ab90835b892c69867948112d95299e522d370c4e13a08" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "cmake", + "glob 0.2.11", ] [[package]] name = "walkdir" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" dependencies = [ - "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file", + "winapi 0.3.8", + "winapi-util", ] [[package]] name = "want" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.29", + "log 0.4.8", + "try-lock", ] [[package]] name = "want" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8", + "try-lock", ] [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" dependencies = [ - "bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo", + "lazy_static", + "log 0.4.8", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bbdd49e3e28b40dec6a9ba8d17798245ce32b019513a845369c641b275135d9" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2", + "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" [[package]] name = "wasm-bindgen-webidl" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" dependencies = [ - "anyhow 1.0.26 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow", + "heck", + "log 0.4.8", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", + "wasm-bindgen-backend", + "weedle", ] [[package]] name = "wasm-gc-api" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8", + "parity-wasm 0.32.0", + "rustc-demangle", ] [[package]] name = "wasm-timer" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1", + "js-sys", + "parking_lot 0.9.0", + "pin-utils", + "send_wrapper 0.2.0", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] name = "wasmi" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" dependencies = [ - "errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi-validation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "errno", + "libc", + "memory_units", + "num-rational", + "num-traits", + "parity-wasm 0.41.0", + "wasmi-validation", ] [[package]] name = "wasmi-validation" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" dependencies = [ - "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.41.0", ] [[package]] name = "wasmparser" version = "0.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c702914acda5feeeffbc29e4d953e5b9ce79d8b98da4dbf18a77086e116c5470" [[package]] name = "wasmtime-debug" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5008729ad53f75020f28fa0d682269335d6f0eac0b3ffafe31f185b2f33aca74" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "faerie 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gimli 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-wasm", + "faerie", + "gimli", + "more-asserts", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-environ", ] [[package]] name = "wasmtime-environ" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "directories 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "file-per-thread-logger 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "zstd 0.5.1+zstd.1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "a3947662a0b8e05b1418465e64f16de9114f9fec18cc3f56e0ed5aa7737b89d0" +dependencies = [ + "base64 0.11.0", + "bincode", + "cranelift-codegen", + "cranelift-entity", + "cranelift-wasm", + "directories", + "errno", + "file-per-thread-logger", + "indexmap", + "lazy_static", + "libc", + "log 0.4.8", + "more-asserts", + "rayon", + "serde", + "sha2", + "spin", + "thiserror", + "toml", + "wasmparser", + "winapi 0.3.8", + "zstd", ] [[package]] name = "wasmtime-jit" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed7922689461a7b5bd0d9c7350cac526c8a520a23b3ffd7f5b446ac51dfc51f" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "region 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-debug 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-runtime 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-wasm", + "more-asserts", + "region", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-debug", + "wasmtime-environ", + "wasmtime-runtime", + "winapi 0.3.8", ] [[package]] name = "wasmtime-runtime" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781d6bb8b346efaa3dc39746386957cd79b8d841e8652ed9b02d77bcf64fb514" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "region 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "cranelift-codegen", + "cranelift-entity", + "cranelift-wasm", + "indexmap", + "lazy_static", + "libc", + "memoffset", + "more-asserts", + "region", + "thiserror", + "wasmtime-environ", + "winapi 0.3.8", ] [[package]] name = "web-sys" version = "0.3.35" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (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.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow", + "js-sys", + "sourcefile", + "wasm-bindgen", + "wasm-bindgen-webidl", ] [[package]] name = "webpki" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f50e1972865d6b1adb54167d1c8ed48606004c2c9d0ea5f1eeb34d95e863ef" dependencies = [ - "ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ring", + "untrusted", ] [[package]] name = "webpki-roots" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b" dependencies = [ - "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki", ] [[package]] name = "webpki-roots" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" dependencies = [ - "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki", ] [[package]] name = "websocket" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413b37840b9e27b340ce91b319ede10731de8c72f5bc4cb0206ec1ca4ce581d0" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (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)", - "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.11 (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)", - "websocket-base 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12", + "futures 0.1.29", + "hyper 0.10.16", + "native-tls", + "rand 0.6.5", + "tokio-codec", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-tls", + "unicase 1.4.2", + "url 1.7.2", + "websocket-base", ] [[package]] name = "websocket-base" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e3810f0d00c4dccb54c30a4eee815e703232819dec7b007db115791c42aa374" dependencies = [ - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.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)", - "futures 0.1.29 (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-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-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)", + "base64 0.10.1", + "bitflags", + "byteorder 1.3.2", + "bytes 0.4.12", + "futures 0.1.29", + "native-tls", + "rand 0.6.5", + "sha1", + "tokio-codec", + "tokio-io", + "tokio-tcp", + "tokio-tls", ] [[package]] name = "weedle" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" dependencies = [ - "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "nom", ] [[package]] name = "which" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "failure", + "libc", ] [[package]] name = "which" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5475d47078209a02e60614f7ba5e645ef3ed60f771920ac1906d7c1cc65024c8" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "ws" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51a2c47b5798ccc774ffb93ff536aec7c4275d722fd9c740c83cdd1af1f2d94" 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)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2", + "bytes 0.4.12", + "httparse", + "log 0.4.8", + "mio", + "mio-extras", + "rand 0.7.3", + "sha-1", + "slab", + "url 2.1.1", ] [[package]] name = "ws2_32-sys" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "x25519-dalek" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clear_on_drop", + "curve25519-dalek 1.2.3", + "rand_core 0.3.1", ] [[package]] name = "xdg" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" [[package]] name = "yamux" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f937668802a2e862a4fed05267e10b20c310bf771adc89687710706d55a9a65" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "nohash-hasher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4", + "futures 0.3.1", + "log 0.4.8", + "nohash-hasher", + "parking_lot 0.10.0", + "rand 0.7.3", + "thiserror", ] [[package]] name = "zeroize" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45af6a010d13e4cf5b54c94ba5a2b2eba5596b9e46bf5875612d332a1f2b3f86" [[package]] name = "zeroize" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" dependencies = [ - "zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize_derive", ] [[package]] name = "zeroize_derive" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn", + "synstructure", ] [[package]] name = "zstd" version = "0.5.1+zstd.1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5d978b793ae64375b80baf652919b148f6a496ac8802922d9999f5a553194f" dependencies = [ - "zstd-safe 2.0.3+zstd.1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "zstd-safe", ] [[package]] name = "zstd-safe" version = "2.0.3+zstd.1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee25eac9753cfedd48133fa1736cbd23b774e253d89badbeac7d12b23848d3f" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "zstd-sys 1.4.15+zstd.1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "zstd-sys", ] [[package]] name = "zstd-sys" version = "1.4.15+zstd.1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89719b034dc22d240d5b407fb0a3fe6d29952c181cff9a9f95c0bd40b4f8f7d8" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[metadata] -"checksum Inflector 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"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 ahash 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6f33b5018f120946c1dcf279194f238a9f146725593ead1c08fa47ff22b0b5d3" -"checksum aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5f56c476256dc249def911d6f7580b5fc7e875895b5d7ee88f5d602208035744" -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -"checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" -"checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" -"checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" -"checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" -"checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" -"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" -"checksum asn1_der 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6fce6b6a0ffdafebd82c87e79e3f40e8d2c523e5fea5566ff6b90509bf98d638" -"checksum asn1_der_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" -"checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" -"checksum async-std 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0bf6039b315300e057d198b9d3ab92ee029e31c759b7f1afae538145e6f18a3e" -"checksum async-task 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f20c6fda19d0fc02406779587ca4f9a4171cd32e4a5bda0bd016f0a1334c8d4a" -"checksum async-tls 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce6977f57fa68da77ffe5542950d47e9c23d65f5bc7cb0a9f8700996913eec7" -"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" -"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)" = "7f80256bc78f67e7df7e36d77366f636ed976895d91fe2ab9efa3973e8fe8c4f" -"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" -"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.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" -"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" -"checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" -"checksum bindgen 0.49.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4c07087f3d5731bf3fb375a81841b99597e25dc11bd3bc72d16d43adf6624a6e" -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" -"checksum bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a993f74b4c99c1908d156b8d2e0fb6277736b0ecbd833982fd1241d39b2766a6" -"checksum blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" -"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -"checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" -"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.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -"checksum broadcaster 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "07a1446420a56f1030271649ba0da46d23239b3a68c73591cea5247f15a788a0" -"checksum bs58 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c95ee6bba9d950218b6cc910cf62bc9e0a171d0f4537e3627b0f54d08549b188" -"checksum bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" -"checksum bstr 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8a65814ca90dfc9705af76bb6ba3c6e2534489a72270e797e603783bb4990b" -"checksum build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" -"checksum bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb8038c1ddc0a5f73787b130f4cc75151e96ed33e417fde765eb5a81e3532f4" -"checksum byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" -"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.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 bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" -"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" -"checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cargo_metadata 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "46e3374c604fb39d1a2f35ed5e4a4e30e60d01fab49446e08f1b3e9a90aef202" -"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" -"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" -"checksum cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fce5b5fb86b0c57c20c834c1b412fd09c77c8a59b9473f86272709e78874cd1d" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" -"checksum clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853" -"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"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.42 (registry+https://github.com/rust-lang/crates.io-index)" = "81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62" -"checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" -"checksum console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48" -"checksum const-random 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "2f1af9ac737b2dd2d577701e59fd09ba34822f6f2ebdb30a7647405d9e55e16a" -"checksum const-random-macro 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "25e4c606eb459dd29f7c57b2e0879f2b6f14ee130918c2b78ccb58a9624e6c7a" -"checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" -"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 cranelift-bforest 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd05aac8cefcde54ce26178df8f36cb1f518ac691db650e7d2440c2b6b41c4dc" -"checksum cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63d9b6ff8a94f98deabab21880d7fd54996e0e16be687b6f80a3b6bdd9c188d" -"checksum cranelift-codegen-meta 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7cb3df51c2c07d719d02869bfac6cabd8d82ee308d5b29ca62e6528723cc33a4" -"checksum cranelift-codegen-shared 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "758f9426b2e22bf83fc1a6b231a9d53cd4830751883c7f0e196ebb3c210467b3" -"checksum cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff064733df8b98f453060264a8790393d1e807aca6942706b42f79a4f7aae9ed" -"checksum cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eaafb5fa623dcbe19a28084a8226d7a1b17184a949c1a1f29a46b479867998d" -"checksum cranelift-native 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "90033dbd7293f6fad4cf9dcd769cd621d60df22b1c5a11799e86359b7447a51d" -"checksum cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "54cb82a1071f88822763a583ec1a8688ffe5e2cda02c111d4483dd4376ed14d8" -"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 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1fc755679c12bda8e5523a71e4d654b6bf2e14bd838dfc48cde6559a05caf7d1" -"checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" -"checksum criterion-plot 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a01e15e0ea58e8234f96146b1f91fa9d0e4dd7a38da93ff7a75d42c0b9d3a545" -"checksum crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c" -"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" -"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" -"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" -"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" -"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -"checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -"checksum csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" -"checksum csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c" -"checksum ct-logs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113" -"checksum ctor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8ce37ad4184ab2ce004c33bf6379185d3b1c95801cab51026bd271bf68eedc" -"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.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8b7dcd30ba50cdf88b55b033456138b7c0ac4afdc436d82e1b79f370f24cc66d" -"checksum curve25519-dalek 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26778518a7f6cffa1d25a44b602b62b979bd88adb9e99ffec546998cf3404839" -"checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2159be042979966de68315bce7034bb000c775f22e3e834e1c52ff78f041cae8" -"checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" -"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -"checksum directories 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" -"checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" -"checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" -"checksum doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "923dea538cea0aa3025e8685b20d6ee21ef99c4f77e954a30febbaac5ec73a97" -"checksum ed25519-dalek 1.0.0-pre.3 (registry+https://github.com/rust-lang/crates.io-index)" = "978710b352437433c97b2bff193f2fb1dfd58a093f863dd95e225a19baa599a2" -"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -"checksum enumflags2 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "33121c8782ba948ba332dab29311b026a8716dc65a1599e5b88f392d38496af8" -"checksum enumflags2_derive 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ecf634c5213044b8d54a46dd282cf5dd1f86bb5cb53e92c409cb4680a7fb9894" -"checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" -"checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -"checksum environmental 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "516aa8d7a71cb00a1c4146f0798549b93d083d4f189b3ced8f3de6b8f11ee6c4" -"checksum erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "cd7d80305c9bd8cd78e3c753eb9fb110f83621e5211f1a3afffcc812b104daf9" -"checksum errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e" -"checksum errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" -"checksum evm 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "32a2c6961fdc9952371fc5f0416f03a9d90378a9dfb6862f6a7a9a3b8986b8dd" -"checksum evm-core 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bcde5af3d542874ddeb53de0919302d57586ea04b3f76f54d865f8a6cdc70ae" -"checksum evm-gasometer 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b82bc9f275cb59d2bcc05d85c98736ddfaba003a7ef7b73893fa7c1c1fab29dc" -"checksum evm-runtime 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbc89d29618c3722c17ba78ddf432d40ace8ee27e3f8b28b52a85921112e4b" -"checksum exit-future 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" -"checksum faerie 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f902f2af041f6c7177a2a04f805687cdc71e69c7cbef059a2755d8923f4cd7a8" -"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" -"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" -"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" -"checksum fdlimit 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9084c55bb76efb1496328976db88320fe7d9ee86e649e83c4ecce3ba7a9a35d1" -"checksum file-per-thread-logger 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8505b75b31ef7285168dd237c4a7db3c1f3e0927e7d314e670bc98e854272fe9" -"checksum finality-grandpa 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "52c48f8a628193ba18639b2f727c32132d75f167a4b32f44b252ea8b937f154c" -"checksum fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" -"checksum fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" -"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" -"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 fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "921d332c89b3b61a826de38c61ee5b6e02c56806cade1b0e5d81bd71f57a71bb" -"checksum fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -"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.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" -"checksum futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987" -"checksum futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fcae98ca17d102fd8a3603727b9259fcf7fa4239b603d2142926189bc8999b86" -"checksum futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "d5e5f4df964fa9c1c2f8bddeb5c3611631cacd93baf810fc8bb2fb4b495c263a" -"checksum futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866" -"checksum futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "b35b6263fb1ef523c3056565fa67b1d16f0a8604ff12b11b08c25f28a734c60a" -"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -"checksum futures-diagnose 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbb8371dd6ee87aa2aeaa8458a372fd82fe216032387b766255754c92dd7271" -"checksum futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231" -"checksum futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff" -"checksum futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764" -"checksum futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "171be33efae63c2d59e6dbba34186fe0d6394fb378069a76dfd80fdcffd43c16" -"checksum futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "86f148ef6b69f75bb610d4f9a2336d4fc88c4b5b67129d1a340dd0fd362efeec" -"checksum futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0bae52d6b29cf440e298856fec3965ee6fa71b06aa7495178615953fd669e5f9" -"checksum futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "878f1d2fc31355fa02ed2372e741b0c17e58373341e6a122569b4623a14a7d33" -"checksum futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" -"checksum futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76" -"checksum futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "5ce968633c17e5f97936bd2797b6e38fb56cf16a7422319f7ec2e30d3c470e8d" -"checksum futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" -"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" -"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -"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 getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -"checksum gimli 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "162d18ae5f2e3b90a993d202f1ba17a5633c2484426f8bcae201f86194bacd00" -"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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" -"checksum goblin 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3081214398d39e4bd7f2c1975f0488ed04614ffdd976c6fc7a0708278552c0da" -"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -"checksum h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1" -"checksum hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" -"checksum hash256-std-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" -"checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" -"checksum hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" -"checksum hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" -"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" -"checksum hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" -"checksum hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "961de220ec9a91af2e1e5bd80d02109155695e516771762381ef8581317066e0" -"checksum hex-literal-impl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9d4c5c844e2fee0bf673d54c2c177f1713b3d2af2ff6e666b49cb7572e6cf42d" -"checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" -"checksum hmac-drbg 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" -"checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -"checksum http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b" -"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" -"checksum http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" -"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" -"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -"checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -"checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" -"checksum hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1c527bbc634be72aa7ba31e4e4def9bbb020f5416916279b7c705cd838893e" -"checksum hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "719d85c7df4a7f309a77d145340a063ea929dcb2e025bae46a80345cffec2952" -"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" -"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" -"checksum impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" -"checksum impl-rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8f7a72f11830b52333f36e3b09a288333888bf54380fd0ac0790a3c31ab0f3c5" -"checksum impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "58e3cae7e99c7ff5a995da2cf78dd0a5383740eda71d98cf7b1910c301ac69b8" -"checksum impl-serde 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5bbe9ea9b182f0fb1cabbd61f4ff9b7b7b9197955e95a7e4c27de5055eb29ff8" -"checksum impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" -"checksum indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" -"checksum integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" -"checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" -"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -"checksum ipnet 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f4b06b21db0228860c8dfd17d2106c49c7c6bd07477a4036985347d84def04" -"checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" -"checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" -"checksum jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0a9ae166c4d1f702d297cd76d4b55758ace80272ffc6dbb139fdc1bf810de40b" -"checksum jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970" -"checksum jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "080dc110be17701097df238fad3c816d4a478a1899dfbcf8ec8957dd40ec7304" -"checksum jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8609af8f63b626e8e211f52441fcdb6ec54f1a446606b10d5c89ae9bf8a20058" -"checksum jsonrpc-http-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2d83d348120edee487c560b7cdd2565055d61cda053aa0d0ef0f8b6a18429048" -"checksum jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3453625f0f0f5cd6d6776d389d73b7d70fcc98620b7cbb1cbbb1f6a36e95f39a" -"checksum jsonrpc-server-utils 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "95b7635e618a0edbbe0d2a2bbbc69874277c49383fcf6c3c0414491cfb517d22" -"checksum jsonrpc-ws-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b34faa167c3ac9705aeecb986c0da6056529f348425dbe0441db60a2c4cc41d1" -"checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -"checksum keccak-hasher 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3468207deea1359a0e921591ae9b4c928733d94eb9d6a2eeda994cfd59f42cf8" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" -"checksum kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8396be0e5561ccd1bf7ff0b2007487cdd7a87a056873fe6ea906b35d4dbf7ed8" -"checksum kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d25ef14155e418515c4839e9144c839de3506e68946f255a32b7f166095493d" -"checksum kvdb-rocksdb 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "af488cc16c3801705c8d681c3a32c8faa8fafc7fb5309dee0f573f3c6a19d395" -"checksum kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37a0e36637fb86454de401e7cb88f40eb0ad1b9bcee837d46785e7c451f1ebf4" -"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" -"checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -"checksum libp2p 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f84847789ab24b3fc5971a68656ac85886df640986d9ce3264c0327694eae471" -"checksum libp2p-core 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dbafb2706b8082233f66dc13e196f9cf9b4c229f2cd7c96b2b16617ad6ee330b" -"checksum libp2p-core-derive 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c320266be0a7760e23484d635acdb83844b2d74d3612d93b41c393c9bcf004e" -"checksum libp2p-deflate 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be32697b42d040b325c3737f827ea04ede569ec956b7807700dd8d89d8210f9" -"checksum libp2p-dns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f11c979b882f25d85726b15637d5bbc722dfa1be576605c54e99b8cf56906be3" -"checksum libp2p-floodsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4bdf6fba9272ad47dde94bade89540fdb16e24ae9ff7fb714c1c80a035165f28" -"checksum libp2p-gossipsub 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e6ecd058bf769d27ebec530544b081e08b0a1088e3186da8cc58d59915784d0" -"checksum libp2p-identify 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d1a6261b804111c2dbf53f8ca03f66edc5ad1c29b78a61cf0cc5354052e28e9" -"checksum libp2p-kad 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c6ea6fece0d99599afb1b2082ca8937944cdd6b0946a88d54cb3ae7a38d1253" -"checksum libp2p-mdns 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "074312353355df310affa105ec71b16fd7e52f5c6ae61d3dcbb3e79e8fdc9e5f" -"checksum libp2p-mplex 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "89d0b44dfdef80cc2be4b42d127de1c793905eca2459415a5c57d6b4fbd8ec30" -"checksum libp2p-noise 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0845e8208d814cd41c26c90a6a2f2b720c31b588209cecc49a44c881a09f417f" -"checksum libp2p-ping 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ecced2949ae93b6ff29565303ecd1bef15c4e4efb689033ee744922561a36b" -"checksum libp2p-plaintext 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "195fda6b6a948a242fd30570e0e3418ae8e0a20055ea75d45458e1079a8efb05" -"checksum libp2p-secio 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ceef68ca377b264f84d64c88739a8fa118b5db1e8f18297351dff75314504a5f" -"checksum libp2p-swarm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "14ea00be81bc3985e36abad263ce2ad1b6aeb862aa743563eb70ad42880c05ae" -"checksum libp2p-tcp 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e65ef381570df31cb047dfbc11483ab0fe7e6abbdcf2bdc2c60b5d11133d241" -"checksum libp2p-uds 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e4f4f7989b35f33d4b9738aab2f031310eb20fec513cab44d12b1bc985a8074" -"checksum libp2p-wasm-ext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b4d457adb91a5e2212343218a554394cd8ced64a79fb8e36e7aed2a16d49495" -"checksum libp2p-websocket 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bba425f2af1fdb7dece88b9ae05ca9430dfb0b72b2c078e73ded6f1556084509" -"checksum libp2p-yamux 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ca25b3aac78a3c93c2a567622abd3cfc16f96f26ae1bf6134f0056203d62d86" -"checksum librocksdb-sys 6.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0785e816e1e11e7599388a492c61ef80ddc2afc91e313e61662cce537809be" -"checksum libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "df6edf84fd62aad1c93932b39324eaeda3912c1d26bc18dfaee6293848e49a50" -"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" -"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.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" -"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -"checksum lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "5d8f669d42c72d18514dfca8115689c5f6370a17d980cb5bd777a67f404594c8" -"checksum lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" -"checksum mach 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1" -"checksum malloc_size_of_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e37c5d4cd9473c5f4c9c111f033f15d4df9bd378fdf615944e360a4f55a05f0b" -"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" -"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" -"checksum memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "881736a0f68a6fae1b596bb066c5bd16d7b3ed645a4dd8ffaefd02f585abaf71" -"checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2b0942b357c1b4d0dc43ba724674ec89c3218e6ca2b3e8269e7cb53bcecd2f6e" -"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -"checksum miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625" -"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" -"checksum mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -"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 more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" -"checksum multimap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a97fbd5d00e0e37bfb10f433af8f5aaf631e739368dc9fc28286ca81ca4948dc" -"checksum multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f938ffe420493e77c8b6cbcc3f282283f68fc889c5dcbc8e51668d5f3a01ad94" -"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 nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -"checksum nohash-hasher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "721a2bf1c26159ebf17e0a980bc4ce61f4b2fec5ec3b42d42fddd7a84a9e538f" -"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -"checksum num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "da4dc79f9e6c81bef96148c8f6b8e72ad4541caa4a24373e900a36da07de03a3" -"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" -"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" -"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 once_cell 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d584f08c2d717d5c23a6414fc2822b71c651560713e54fa7eace675f758a355e" -"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" -"checksum oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405" -"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -"checksum openssl 0.10.27 (registry+https://github.com/rust-lang/crates.io-index)" = "e176a45fedd4c990e26580847a525e39e16ec32ac78957dbf62ded31b3abfd6f" -"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)" = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" -"checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" -"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" -"checksum parity-bytes 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c276d76c5333b8c2579e02d49a06733a55b8282d2d9b13e8d53b6406bd7e30a" -"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" -"checksum parity-multiaddr 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80878c27f90dd162d3143333d672e80b194d6b080f05c83440e3dfda42e409f2" -"checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" -"checksum parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" -"checksum parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" -"checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" -"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" -"checksum parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" -"checksum parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "900dd84654b048e5bad420bb341658fc2c4d7fea628c22bcf4621733e54859b4" -"checksum parity-util-mem-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" -"checksum parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" -"checksum parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" -"checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" -"checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" -"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -"checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -"checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" -"checksum paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "423a519e1c6e828f1e73b720f9d9ed2fa643dce8a7737fb43235ce0b41eeaa49" -"checksum paste-impl 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4214c9e912ef61bf42b81ba9a47e8aad1b2ffaf739ab162bf96d1e011f54e6c5" -"checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" -"checksum pdqselect 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ec91767ecc0a0bbe558ce8c9da33c068066c57ecc8bb8477ef8c1ad3ef77c27" -"checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" -"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -"checksum petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29c127eea4a29ec6c85d153c59dc1213f33ec74cead30fe4730aecc88cc1fd92" -"checksum pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c" -"checksum pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f" -"checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" -"checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" -"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" -"checksum plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" -"checksum plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb" -"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" -"checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" -"checksum primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" -"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "875077759af22fa20b610ad4471d8155b321c89c3f2785526c9839b099be4e0a" -"checksum proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c5717d9fa2664351a01ed73ba5ef6df09c01a521cb42cb65a061432a826f3c7a" -"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" -"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" -"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" -"checksum prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" -"checksum prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" -"checksum prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" -"checksum prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" -"checksum pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" -"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -"checksum quickcheck 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" -"checksum quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8461ef7445f61fd72d8dcd0629ce724b9131b3c2eb36e83a5d3d4161c127530" -"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" -"checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" -"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"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 rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929" -"checksum raw-cpuid 7.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4a349ca83373cfa5d6dbb66fd76e58b2cca08da71a5f6400de0a0a6a9bceeaf" -"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" -"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" -"checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" -"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" -"checksum regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" -"checksum region 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "448e868c6e4cfddfa49b6a72c95906c04e8547465e9536575b95c70a4044f856" -"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum ring 0.16.10 (registry+https://github.com/rust-lang/crates.io-index)" = "113f53b644c5442e20ff3a299be3d6c61ba143737af5bd2ab298e248a7575b2d" -"checksum rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3a44d5ae8afcb238af8b75640907edc6c931efcfab2c854e81ed35fa080f84cd" -"checksum rocksdb 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12069b106981c6103d3eab7dd1c86751482d0779a520b7c14954c8b586c1e643" -"checksum rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" -"checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" -"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -"checksum rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" -"checksum rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" -"checksum rw-stream-sink 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" -"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" -"checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" -"checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" -"checksum schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "eacd8381b3c37840c9c9f40472af529e49975bdcbc24f83c31059fd6539023d3" -"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 scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "abb2332cb595d33f7edd5700f4cbf94892e680c7f0ae56adab58a35190b66cb1" -"checksum scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28" -"checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" -"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" -"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" -"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 send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" -"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)" = "21b01d7f0288608a01dca632cf1df859df6fd6ffa885300fc275ce2ba6221953" -"checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -"checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" -"checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" -"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 shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" -"checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" -"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cc9c640a4adbfbcc11ffb95efe5aa7af7309e002adab54b185507dbf2377b99" -"checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" -"checksum slog-scope 4.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c44c89dd8b0ae4537d1ae318353eaf7840b4869c536e31c41e963d1ea523ee6" -"checksum slog_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" -"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -"checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" -"checksum snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" -"checksum soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" -"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" -"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -"checksum stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" -"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" -"checksum string-interner 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd710eadff449a1531351b0e43eb81ea404336fa2f56c777427ab0e32a4cf183" -"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "a1bcbed7d48956fcbb5d80c6b95aedb553513de0a1b451ea92679d999c010e98" -"checksum structopt-derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "095064aa1f5b94d14e635d0a5684cf140c43ae40a0fd990708d38f5d669e5f64" -"checksum strum 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" -"checksum strum_macros 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" -"checksum substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" -"checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" -"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" -"checksum syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" -"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" -"checksum sysinfo 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4b2468c629cffba39c0a4425849ab3cdb03d9dfacba69684609aea04d08ff9" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" -"checksum target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4" -"checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" -"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -"checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" -"checksum test-case 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a605baa797821796a751f4a959e1206079b24a4b7e1ed302b7d785d81a9276c9" -"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -"checksum thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "205684fd018ca14432b12cce6ea3d46763311a571c3d294e71ba3f01adcf1aad" -"checksum thiserror-impl 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "57e4d2e50ca050ed44fb58309bdce3efa79948f84f9993ad1978de5eebdce5a7" -"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" -"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" -"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.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" -"checksum tiny-keccak 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2953ca5148619bc99695c1274cb54c5275bbb913c6adad87e72eaf8db9787f69" -"checksum tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "57a3c6667d3e65eb1bc3aed6fd14011c6cbc3a0665218ab7f5daf040b9ec371a" -"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -"checksum tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" -"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-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" -"checksum tokio-executor 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" -"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-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" -"checksum tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" -"checksum tokio-rustls 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d7cf08f990090abd6c6a73cab46fed62f85e8aef8b99e4b918a9f4a637f0676" -"checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" -"checksum tokio-sync 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4f1aaeb685540f7407ea0e27f1c9757d258c7c6bf4e3eb19da6fc59b747239d2" -"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" -"checksum tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" -"checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" -"checksum tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b" -"checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" -"checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" -"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -"checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" -"checksum tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e213bd24252abeb86a0b7060e02df677d367ce6cb772cef17e9214b8390a8d3" -"checksum tracing-attributes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04cfd395def5a60236e187e1ff905cb55668a59f29928dec05e6e1b1fd2ac1f3" -"checksum tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "13a46f11e372b8bd4b4398ea54353412fdd7fd42a8370c7e543e218cf7661978" -"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26fd042d57ee9c987c562811162a78db78b5340ab674ac76056c85dca49b26bc" -"checksum trie-db 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d747ae5b6f078df7e46477fcc7df66df9eb4f27a031cf4a7c890a8dd03d8e6" -"checksum trie-root 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b779f7c1c8fe9276365d9d5be5c4b5adeacf545117bb3f64c974305789c5c0b" -"checksum trie-standardmap 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3161ba520ab28cd8e6b68e1126f1009f6e335339d1a73b978139011703264c8" -"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum trybuild 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)" = "3f5b3f750c701725331ac78e389b5d143b7d25f6b6ffffd0d419759a9063ac5f" -"checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bfd5b7557925ce778ff9b9ef90e3ade34c524b5ff10e239c69a42d546d2af56" -"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" -"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" -"checksum uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" -"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" -"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" -"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f0023a96687fe169081e8adce3f65e3874426b7886e9234d490af2dc077959" -"checksum unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c689459fbaeb50e56c6749275f084decfd02194ac5852e6617d95d0d3cf02eaf" -"checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" -"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" -"checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" -"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" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3c5c5c1286c6e578416982609f47594265f9d489f9b836157d403ad605a46693" -"checksum wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af5d153dc96aad7dc13ab90835b892c69867948112d95299e522d370c4e13a08" -"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" -"checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" -"checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" -"checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" -"checksum wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8bbdd49e3e28b40dec6a9ba8d17798245ce32b019513a845369c641b275135d9" -"checksum wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" -"checksum wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" -"checksum wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" -"checksum wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" -"checksum wasm-gc-api 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" -"checksum wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" -"checksum wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" -"checksum wasmi-validation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" -"checksum wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c702914acda5feeeffbc29e4d953e5b9ce79d8b98da4dbf18a77086e116c5470" -"checksum wasmtime-debug 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5008729ad53f75020f28fa0d682269335d6f0eac0b3ffafe31f185b2f33aca74" -"checksum wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a3947662a0b8e05b1418465e64f16de9114f9fec18cc3f56e0ed5aa7737b89d0" -"checksum wasmtime-jit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ed7922689461a7b5bd0d9c7350cac526c8a520a23b3ffd7f5b446ac51dfc51f" -"checksum wasmtime-runtime 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "781d6bb8b346efaa3dc39746386957cd79b8d841e8652ed9b02d77bcf64fb514" -"checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" -"checksum webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1f50e1972865d6b1adb54167d1c8ed48606004c2c9d0ea5f1eeb34d95e863ef" -"checksum webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b" -"checksum webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" -"checksum websocket 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)" = "413b37840b9e27b340ce91b319ede10731de8c72f5bc4cb0206ec1ca4ce581d0" -"checksum websocket-base 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e3810f0d00c4dccb54c30a4eee815e703232819dec7b007db115791c42aa374" -"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" -"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" -"checksum which 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5475d47078209a02e60614f7ba5e645ef3ed60f771920ac1906d7c1cc65024c8" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum ws 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a2c47b5798ccc774ffb93ff536aec7c4275d722fd9c740c83cdd1af1f2d94" -"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" -"checksum yamux 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f937668802a2e862a4fed05267e10b20c310bf771adc89687710706d55a9a65" -"checksum zeroize 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "45af6a010d13e4cf5b54c94ba5a2b2eba5596b9e46bf5875612d332a1f2b3f86" -"checksum zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" -"checksum zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" -"checksum zstd 0.5.1+zstd.1.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c5d978b793ae64375b80baf652919b148f6a496ac8802922d9999f5a553194f" -"checksum zstd-safe 2.0.3+zstd.1.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bee25eac9753cfedd48133fa1736cbd23b774e253d89badbeac7d12b23848d3f" -"checksum zstd-sys 1.4.15+zstd.1.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "89719b034dc22d240d5b407fb0a3fe6d29952c181cff9a9f95c0bd40b4f8f7d8" + "cc", + "glob 0.3.0", + "libc", +] diff --git a/primitives/arithmetic/fuzzer/Cargo.lock b/primitives/arithmetic/fuzzer/Cargo.lock index 41bd9cc3ba..b196418375 100644 --- a/primitives/arithmetic/fuzzer/Cargo.lock +++ b/primitives/arithmetic/fuzzer/Cargo.lock @@ -4,292 +4,326 @@ name = "arbitrary" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cf76cb6e2222ed0ea86b2b0ee2f71c96ec6edd5af42e84d59160e91b836ec4" [[package]] name = "arrayvec" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" [[package]] name = "autocfg" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "bitvec" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993f74b4c99c1908d156b8d2e0fb6277736b0ecbd833982fd1241d39b2766a6" [[package]] name = "byte-slice-cast" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" [[package]] name = "byteorder" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" [[package]] name = "c2-chacha" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", ] [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "crunchy" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "fixed-hash" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", + "rand", + "rustc-hex", + "static_assertions", ] [[package]] name = "getrandom" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] [[package]] name = "honggfuzz" version = "0.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24c27b4aa3049d6d10d8e33d52c9d03ca9aec18f8a449b246f8c4a5b0c10fb34" dependencies = [ - "arbitrary 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arbitrary", + "lazy_static", + "memmap", ] [[package]] name = "impl-codec" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" dependencies = [ - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec", ] [[package]] name = "integer-sqrt" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" version = "0.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" [[package]] name = "memmap" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "winapi", ] [[package]] name = "num-bigint" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "num-integer", + "num-traits", ] [[package]] name = "num-integer" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "num-traits", ] [[package]] name = "num-traits" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] name = "parity-scale-codec" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" dependencies = [ - "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec", + "bitvec", + "byte-slice-cast", + "parity-scale-codec-derive", + "serde", ] [[package]] name = "parity-scale-codec-derive" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" dependencies = [ - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "ppv-lite86" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" [[package]] name = "primitive-types" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" dependencies = [ - "fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash", + "impl-codec", + "uint", ] [[package]] name = "proc-macro-crate" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" dependencies = [ - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "toml", ] [[package]] name = "proc-macro2" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid", ] [[package]] name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] name = "rand_chacha" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" dependencies = [ - "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "c2-chacha", + "rand_core", ] [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core", ] [[package]] name = "rustc-hex" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "serde" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" dependencies = [ - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "sp-arithmetic" version = "2.0.0" dependencies = [ - "integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-debug-derive 2.0.0", - "sp-std 2.0.0", + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "serde", + "sp-debug-derive", + "sp-std", ] [[package]] name = "sp-arithmetic-fuzzer" version = "2.0.0" dependencies = [ - "honggfuzz 0.5.45 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sp-arithmetic 2.0.0", + "honggfuzz", + "num-bigint", + "num-traits", + "primitive-types", + "sp-arithmetic", ] [[package]] name = "sp-debug-derive" version = "2.0.0" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -300,106 +334,70 @@ version = "2.0.0" name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "uint" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" dependencies = [ - "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)", - "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", + "crunchy", + "rustc-hex", + "static_assertions", ] [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "winapi" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum arbitrary 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "64cf76cb6e2222ed0ea86b2b0ee2f71c96ec6edd5af42e84d59160e91b836ec4" -"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" -"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a993f74b4c99c1908d156b8d2e0fb6277736b0ecbd833982fd1241d39b2766a6" -"checksum byte-slice-cast 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" -"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" -"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -"checksum fixed-hash 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" -"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -"checksum honggfuzz 0.5.45 (registry+https://github.com/rust-lang/crates.io-index)" = "24c27b4aa3049d6d10d8e33d52c9d03ca9aec18f8a449b246f8c4a5b0c10fb34" -"checksum impl-codec 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" -"checksum integer-sqrt 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" -"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" -"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -"checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" -"checksum parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" -"checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" -"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" -"checksum primitive-types 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" -"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" -"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" -"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -"checksum uint 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -- GitLab From bf250d1ca3df4d508c83a73b507ad79cf217ad44 Mon Sep 17 00:00:00 2001 From: cheme Date: Mon, 3 Feb 2020 20:28:10 +0100 Subject: [PATCH 241/296] Fix call to backend in child_storage_hash (#4815) * Fix call to backend in child_storage_hash * child storage test. --- primitives/state-machine/src/ext.rs | 57 ++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index f293ae9f51..38a2e70262 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -231,7 +231,7 @@ where fn child_storage_hash( &self, storage_key: ChildStorageKey, - _child_info: ChildInfo, + child_info: ChildInfo, key: &[u8], ) -> Option> { let _guard = sp_panic_handler::AbortGuard::force_abort(); @@ -239,7 +239,8 @@ where .child_storage(storage_key.as_ref(), key) .map(|x| x.map(|x| H::hash(x))) .unwrap_or_else(|| - self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL) + self.backend.child_storage_hash(storage_key.as_ref(), child_info, key) + .expect(EXT_NOT_ALLOWED_TO_FAIL) ); trace!(target: "state-trace", "{:04x}: ChildHash({}) {}={:?}", @@ -613,6 +614,12 @@ mod tests { type TestBackend = InMemoryBackend; type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend>; + const CHILD_KEY_1: &[u8] = b":child_storage:default:Child1"; + + const CHILD_UUID_1: &[u8] = b"unique_id_1"; + const CHILD_INFO_1: ChildInfo<'static> = ChildInfo::new_default(CHILD_UUID_1); + + fn prepare_overlay_with_changes() -> OverlayedChanges { OverlayedChanges { prospective: vec![ @@ -769,4 +776,50 @@ mod tests { // next_overlay exist but next_backend doesn't exist assert_eq!(ext.next_child_storage_key(child(), CHILD_INFO_1, &[40]), Some(vec![50])); } + + #[test] + fn child_storage_works() { + let mut cache = StorageTransactionCache::default(); + let child = || ChildStorageKey::from_slice(CHILD_KEY_1).unwrap(); + let mut overlay = OverlayedChanges::default(); + overlay.set_child_storage(child().as_ref().to_vec(), CHILD_INFO_1, vec![20], None); + overlay.set_child_storage(child().as_ref().to_vec(), CHILD_INFO_1, vec![30], Some(vec![31])); + let backend = Storage { + top: map![], + children: map![ + child().as_ref().to_vec() => StorageChild { + data: map![ + vec![10] => vec![10], + vec![20] => vec![20], + vec![30] => vec![40] + ], + child_info: CHILD_INFO_1.to_owned(), + } + ], + }.into(); + + let ext = TestExt::new(&mut overlay, &mut cache, &backend, None, None); + + assert_eq!(ext.child_storage(child(), CHILD_INFO_1, &[10]), Some(vec![10])); + assert_eq!(ext.original_child_storage(child(), CHILD_INFO_1, &[10]), Some(vec![10])); + assert_eq!( + ext.child_storage_hash(child(), CHILD_INFO_1, &[10]), + Some(Blake2Hasher::hash(&[10]).as_ref().to_vec()), + ); + + assert_eq!(ext.child_storage(child(), CHILD_INFO_1, &[20]), None); + assert_eq!(ext.original_child_storage(child(), CHILD_INFO_1, &[20]), Some(vec![20])); + assert_eq!( + ext.child_storage_hash(child(), CHILD_INFO_1, &[20]), + None, + ); + + assert_eq!(ext.child_storage(child(), CHILD_INFO_1, &[30]), Some(vec![31])); + assert_eq!(ext.original_child_storage(child(), CHILD_INFO_1, &[30]), Some(vec![40])); + assert_eq!( + ext.child_storage_hash(child(), CHILD_INFO_1, &[30]), + Some(Blake2Hasher::hash(&[31]).as_ref().to_vec()), + ); + + } } -- GitLab From eeebfc8fe54f3a288d909ebfea5ec89eed5ebb5f Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Tue, 4 Feb 2020 22:44:40 +1300 Subject: [PATCH 242/296] add state_getKeysPaged (#4718) * add storage_getNextKey * RPC storage_getKeysPages * respect count * use iterator * improve * add tests * improve * add doc comments * Make prefix optional * update error * improve --- client/rpc-api/src/state/error.rs | 13 ++++ client/rpc-api/src/state/mod.rs | 15 +++- client/rpc/src/state/mod.rs | 31 +++++++- client/rpc/src/state/state_full.rs | 18 +++++ client/rpc/src/state/state_light.rs | 10 +++ client/src/client.rs | 115 +++++++++++++++++++++++++++- 6 files changed, 199 insertions(+), 3 deletions(-) diff --git a/client/rpc-api/src/state/error.rs b/client/rpc-api/src/state/error.rs index 4997a728fc..c9c2cf4e45 100644 --- a/client/rpc-api/src/state/error.rs +++ b/client/rpc-api/src/state/error.rs @@ -41,6 +41,14 @@ pub enum Error { /// Details of the error message. details: String, }, + /// Provided count exceeds maximum value. + #[display(fmt = "count exceeds maximum value. value: {}, max: {}", value, max)] + InvalidCount { + /// Provided value + value: u32, + /// Maximum allowed value + max: u32, + }, } impl std::error::Error for Error { @@ -63,6 +71,11 @@ impl From for rpc::Error { message: format!("{}", e), data: None, }, + Error::InvalidCount { .. } => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 2), + message: format!("{}", e), + data: None, + }, e => errors::internal(e), } } diff --git a/client/rpc-api/src/state/mod.rs b/client/rpc-api/src/state/mod.rs index b22bacbe87..6901738efe 100644 --- a/client/rpc-api/src/state/mod.rs +++ b/client/rpc-api/src/state/mod.rs @@ -39,10 +39,23 @@ pub trait StateApi { #[rpc(name = "state_call", alias("state_callAt"))] fn call(&self, name: String, bytes: Bytes, hash: Option) -> FutureResult; - /// Returns the keys with prefix, leave empty to get all the keys + /// DEPRECATED: Please use `state_getKeysPaged` with proper paging support. + /// Returns the keys with prefix, leave empty to get all the keys. #[rpc(name = "state_getKeys")] fn storage_keys(&self, prefix: StorageKey, hash: Option) -> FutureResult>; + /// Returns the keys with prefix with pagination support. + /// Up to `count` keys will be returned. + /// If `start_key` is passed, return next keys in storage in lexicographic order. + #[rpc(name = "state_getKeysPaged", alias("state_getKeysPagedAt"))] + fn storage_keys_paged( + &self, + prefix: Option, + count: u32, + start_key: Option, + hash: Option, + ) -> FutureResult>; + /// Returns a storage entry at a specific block's state. #[rpc(name = "state_getStorage", alias("state_getStorageAt"))] fn storage(&self, key: StorageKey, hash: Option) -> FutureResult>; diff --git a/client/rpc/src/state/mod.rs b/client/rpc/src/state/mod.rs index f8f8fe4223..df26daa929 100644 --- a/client/rpc/src/state/mod.rs +++ b/client/rpc/src/state/mod.rs @@ -24,7 +24,7 @@ mod tests; use std::sync::Arc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use rpc::{Result as RpcResult, futures::Future}; +use rpc::{Result as RpcResult, futures::{Future, future::result}}; use sc_rpc_api::Subscriptions; use sc_client::{Client, CallExecutor, light::{blockchain::RemoteBlockchain, fetcher::Fetcher}}; @@ -38,6 +38,8 @@ use self::error::{Error, FutureResult}; pub use sc_rpc_api::state::*; +const STORAGE_KEYS_PAGED_MAX_COUNT: u32 = 1000; + /// State backend API. pub trait StateBackend: Send + Sync + 'static where @@ -61,6 +63,15 @@ pub trait StateBackend: Send + Sync + 'static prefix: StorageKey, ) -> FutureResult>; + /// Returns the keys with prefix with pagination support. + fn storage_keys_paged( + &self, + block: Option, + prefix: Option, + count: u32, + start_key: Option, + ) -> FutureResult>; + /// Returns a storage entry at a specific block's state. fn storage( &self, @@ -244,6 +255,24 @@ impl StateApi for State self.backend.storage_keys(block, key_prefix) } + fn storage_keys_paged( + &self, + prefix: Option, + count: u32, + start_key: Option, + block: Option, + ) -> FutureResult> { + if count > STORAGE_KEYS_PAGED_MAX_COUNT { + return Box::new(result(Err( + Error::InvalidCount { + value: count, + max: STORAGE_KEYS_PAGED_MAX_COUNT, + } + ))); + } + self.backend.storage_keys_paged(block, prefix, count, start_key) + } + fn storage(&self, key: StorageKey, block: Option) -> FutureResult> { self.backend.storage(block, key) } diff --git a/client/rpc/src/state/state_full.rs b/client/rpc/src/state/state_full.rs index 3f7470ae4e..87c75e77a6 100644 --- a/client/rpc/src/state/state_full.rs +++ b/client/rpc/src/state/state_full.rs @@ -254,6 +254,24 @@ impl StateBackend for FullState, + prefix: Option, + count: u32, + start_key: Option, + ) -> FutureResult> { + Box::new(result( + self.block_or_best(block) + .and_then(|block| + self.client.storage_keys_iter( + &BlockId::Hash(block), prefix.as_ref(), start_key.as_ref() + ) + ) + .map(|v| v.take(count as usize).collect()) + .map_err(client_err))) + } + fn storage( &self, block: Option, diff --git a/client/rpc/src/state/state_light.rs b/client/rpc/src/state/state_light.rs index cc3d1a4951..f25d6e2186 100644 --- a/client/rpc/src/state/state_light.rs +++ b/client/rpc/src/state/state_light.rs @@ -199,6 +199,16 @@ impl StateBackend for LightState, + _prefix: Option, + _count: u32, + _start_key: Option, + ) -> FutureResult> { + Box::new(result(Err(client_err(ClientError::NotAvailableOnLightClient)))) + } + fn storage( &self, block: Option, diff --git a/client/src/client.rs b/client/src/client.rs index a3bbf84f7d..ca8b0c5dd7 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -99,6 +99,46 @@ pub struct Client where Block: BlockT { _phantom: PhantomData, } +/// An `Iterator` that iterates keys in a given block under a prefix. +pub struct KeyIterator<'a, State, Block> { + state: State, + prefix: Option<&'a StorageKey>, + current_key: Vec, + _phantom: PhantomData, +} + +impl <'a, State, Block> KeyIterator<'a, State, Block> { + fn new(state: State, prefix: Option<&'a StorageKey>, current_key: Vec) -> Self { + Self { + state, + prefix, + current_key, + _phantom: PhantomData, + } + } +} + +impl<'a, State, Block> Iterator for KeyIterator<'a, State, Block> where + Block: BlockT, + State: StateBackend>, +{ + type Item = StorageKey; + + fn next(&mut self) -> Option { + let next_key = self.state + .next_storage_key(&self.current_key) + .ok() + .flatten()?; + if let Some(prefix) = self.prefix { + if !next_key.starts_with(&prefix.0[..]) { + return None; + } + } + self.current_key = next_key.clone(); + Some(StorageKey(next_key)) + } +} + // used in importing a block, where additional changes are made after the runtime // executed. enum PrePostHeader { @@ -234,12 +274,27 @@ impl Client where self.backend.state_at(*block) } - /// Given a `BlockId` and a key prefix, return the matching child storage keys in that block. + /// Given a `BlockId` and a key prefix, return the matching storage keys in that block. pub fn storage_keys(&self, id: &BlockId, key_prefix: &StorageKey) -> sp_blockchain::Result> { let keys = self.state_at(id)?.keys(&key_prefix.0).into_iter().map(StorageKey).collect(); Ok(keys) } + /// Given a `BlockId` and a key prefix, return a `KeyIterator` iterates matching storage keys in that block. + pub fn storage_keys_iter<'a>( + &self, + id: &BlockId, + prefix: Option<&'a StorageKey>, + start_key: Option<&StorageKey> + ) -> sp_blockchain::Result> { + let state = self.state_at(id)?; + let start_key = start_key + .or(prefix) + .map(|key| key.0.clone()) + .unwrap_or_else(Vec::new); + Ok(KeyIterator::new(state, prefix, start_key)) + } + /// Given a `BlockId` and a key, return the value under the key in that block. pub fn storage(&self, id: &BlockId, key: &StorageKey) -> sp_blockchain::Result> { Ok(self.state_at(id)? @@ -1900,6 +1955,7 @@ pub(crate) mod tests { sc_client_db::{Backend, DatabaseSettings, DatabaseSettingsSrc, PruningMode}, runtime::{self, Block, Transfer, RuntimeApi, TestAPI}, }; + use hex_literal::hex; /// Returns tuple, consisting of: /// 1) test client pre-filled with blocks changing balances; @@ -3303,4 +3359,61 @@ pub(crate) mod tests { vec![(30, 0), (27, 0), (25, 0), (24, 0), (11, 0)] ); } + + #[test] + fn storage_keys_iter_prefix_and_start_key_works() { + let client = substrate_test_runtime_client::new(); + + let prefix = StorageKey(hex!("3a").to_vec()); + + let res: Vec<_> = client.storage_keys_iter(&BlockId::Number(0), Some(&prefix), None) + .unwrap() + .map(|x| x.0) + .collect(); + assert_eq!(res, [hex!("3a636f6465").to_vec(), hex!("3a686561707061676573").to_vec()]); + + let res: Vec<_> = client.storage_keys_iter(&BlockId::Number(0), Some(&prefix), Some(&StorageKey(hex!("3a636f6465").to_vec()))) + .unwrap() + .map(|x| x.0) + .collect(); + assert_eq!(res, [hex!("3a686561707061676573").to_vec()]); + + let res: Vec<_> = client.storage_keys_iter(&BlockId::Number(0), Some(&prefix), Some(&StorageKey(hex!("3a686561707061676573").to_vec()))) + .unwrap() + .map(|x| x.0) + .collect(); + assert_eq!(res, Vec::>::new()); + } + + #[test] + fn storage_keys_iter_works() { + let client = substrate_test_runtime_client::new(); + + let prefix = StorageKey(hex!("").to_vec()); + + let res: Vec<_> = client.storage_keys_iter(&BlockId::Number(0), Some(&prefix), None) + .unwrap() + .take(2) + .map(|x| x.0) + .collect(); + assert_eq!(res, [hex!("0befda6e1ca4ef40219d588a727f1271").to_vec(), hex!("3a636f6465").to_vec()]); + + let res: Vec<_> = client.storage_keys_iter(&BlockId::Number(0), Some(&prefix), Some(&StorageKey(hex!("3a636f6465").to_vec()))) + .unwrap() + .take(3) + .map(|x| x.0) + .collect(); + assert_eq!(res, [ + hex!("3a686561707061676573").to_vec(), + hex!("6644b9b8bc315888ac8e41a7968dc2b4141a5403c58acdf70b7e8f7e07bf5081").to_vec(), + hex!("79c07e2b1d2e2abfd4855b936617eeff5e0621c4869aa60c02be9adcc98a0d1d").to_vec(), + ]); + + let res: Vec<_> = client.storage_keys_iter(&BlockId::Number(0), Some(&prefix), Some(&StorageKey(hex!("79c07e2b1d2e2abfd4855b936617eeff5e0621c4869aa60c02be9adcc98a0d1d").to_vec()))) + .unwrap() + .take(1) + .map(|x| x.0) + .collect(); + assert_eq!(res, [hex!("cf722c0832b5231d35e29f319ff27389f5032bfc7bfc3ba5ed7839f2042fb99f").to_vec()]); + } } -- GitLab From eed99bdd990e61037b8c6127d18b1a60706632ac Mon Sep 17 00:00:00 2001 From: Gautam Dhameja Date: Tue, 4 Feb 2020 11:25:04 +0100 Subject: [PATCH 243/296] Added GetCallMetadata for extrinsic calls. (#4791) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added GetCallMetadata for extrinsic calls. Co-Authored-By: Bastian Köcher * Improved test for outer call metadata. * fixed review comments * removed dead code * fixed review suggestions * Update frame/support/src/dispatch.rs Co-authored-by: Bastian Köcher --- frame/support/src/dispatch.rs | 104 ++++++++++++++++++++++------------ frame/support/src/traits.rs | 22 +++++++ 2 files changed, 91 insertions(+), 35 deletions(-) diff --git a/frame/support/src/dispatch.rs b/frame/support/src/dispatch.rs index b2d7e6e1d4..85cf8d6ede 100644 --- a/frame/support/src/dispatch.rs +++ b/frame/support/src/dispatch.rs @@ -28,6 +28,7 @@ pub use crate::weights::{ TransactionPriority, Weight, WeighBlock, PaysFee, }; pub use sp_runtime::{traits::Dispatchable, DispatchError, DispatchResult}; +pub use crate::traits::{CallMetadata, GetCallMetadata, GetCallName}; /// A type that cannot be instantiated. pub enum Never {} @@ -1302,42 +1303,48 @@ macro_rules! decl_module { for $call_type<$trait_instance $(, $instance)?> where $( $other_where_bounds )* { fn get_dispatch_info(&self) -> $crate::dispatch::DispatchInfo { - $( - if let $call_type::$fn_name($( ref $param_name ),*) = self { - let weight = >::weigh_data( - &$weight, - ($( $param_name, )*) - ); - let class = >::classify_dispatch( - &$weight, - ($( $param_name, )*) - ); - let pays_fee = >::pays_fee( - &$weight, - ($( $param_name, )*) - ); - return $crate::dispatch::DispatchInfo { weight, class, pays_fee }; - } - if let $call_type::__PhantomItem(_, _) = self { unreachable!("__PhantomItem should never be used.") } - )* - // Defensive only: this function must have already returned at this point. - // all dispatchable function will have a weight which has the `::default` - // implementation of `SimpleDispatchInfo`. Nonetheless, we create one if it does - // not exist. - let weight = >::weigh_data( - &$crate::dispatch::SimpleDispatchInfo::default(), - () - ); - let class = >::classify_dispatch( - &$crate::dispatch::SimpleDispatchInfo::default(), - () - ); - let pays_fee = >::pays_fee( - &$crate::dispatch::SimpleDispatchInfo::default(), - () - ); - $crate::dispatch::DispatchInfo { weight, class, pays_fee } + match *self { + $( + $call_type::$fn_name( $( ref $param_name ),* ) => { + let weight = >::weigh_data( + &$weight, + ($( $param_name, )*) + ); + let class = >::classify_dispatch( + &$weight, + ($( $param_name, )*) + ); + let pays_fee = >::pays_fee( + &$weight, + ($( $param_name, )*) + ); + $crate::dispatch::DispatchInfo { + weight, + class, + pays_fee, + } + }, + )* + $call_type::__PhantomItem(_, _) => unreachable!("__PhantomItem should never be used."), + } + } + } + // Implement GetCallName for the Call. + impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::GetCallName + for $call_type<$trait_instance $(, $instance)?> where $( $other_where_bounds )* + { + fn get_call_name(&self) -> &'static str { + match *self { + $( + $call_type::$fn_name( $( ref $param_name ),* ) => { + // Don't generate any warnings for unused variables + let _ = ( $( $param_name ),* ); + stringify!($fn_name) + }, + )* + $call_type::__PhantomItem(_, _) => unreachable!("__PhantomItem should never be used."), + } } } @@ -1500,6 +1507,18 @@ macro_rules! impl_outer_dispatch { } } } + impl $crate::dispatch::GetCallMetadata for $call_type { + fn get_call_metadata(&self) -> $crate::dispatch::CallMetadata { + use $crate::dispatch::GetCallName; + match self { + $( $call_type::$camelcase(call) => { + let function_name = call.get_call_name(); + let pallet_name = stringify!($camelcase); + $crate::dispatch::CallMetadata { function_name, pallet_name } + }, )* + } + } + } impl $crate::dispatch::Dispatchable for $call_type { type Origin = $origin; type Trait = $call_type; @@ -1871,6 +1890,7 @@ mod tests { use super::*; use crate::sp_runtime::traits::{OnInitialize, OnFinalize}; use crate::weights::{DispatchInfo, DispatchClass}; + use crate::traits::{CallMetadata, GetCallMetadata, GetCallName}; pub trait Trait: system::Trait + Sized where Self::AccountId: From { type Origin; @@ -2084,4 +2104,18 @@ mod tests { assert_eq!(>::on_finalize(2), 10); assert_eq!(>::on_finalize(3), 0); } + + #[test] + fn call_name() { + let name = Call::::aux_3().get_call_name(); + assert_eq!("aux_3", name); + } + + #[test] + fn call_metadata() { + let call = OuterCall::Test(Call::::aux_3()); + let metadata = call.get_call_metadata(); + let expected = CallMetadata { function_name: "aux_3".into(), pallet_name: "Test".into() }; + assert_eq!(metadata, expected); + } } diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index 02e6085046..ecfababfc0 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -22,6 +22,7 @@ use sp_std::{prelude::*, result, marker::PhantomData, ops::Div, fmt::Debug}; use codec::{FullCodec, Codec, Encode, Decode}; use sp_core::u32_trait::Value as U32; use sp_runtime::{ + RuntimeDebug, ConsensusEngineId, DispatchResult, DispatchError, traits::{MaybeSerializeDeserialize, SimpleArithmetic, Saturating, TrailingZeroInput}, }; @@ -800,3 +801,24 @@ pub trait ModuleToIndex { impl ModuleToIndex for () { fn module_to_index() -> Option { Some(0) } } + +/// The function and pallet name of the Call. +#[derive(Clone, Eq, PartialEq, Default, RuntimeDebug)] +pub struct CallMetadata { + /// Name of the function. + pub function_name: &'static str, + /// Name of the pallet to which the function belongs. + pub pallet_name: &'static str, +} + +/// Gets the function name of the Call. +pub trait GetCallName { + /// Return the function name of the Call. + fn get_call_name(&self) -> &'static str; +} + +/// Gets the metadata for the Call - function name and pallet name. +pub trait GetCallMetadata { + /// Return a [`CallMetadata`], containing function and pallet name of the Call. + fn get_call_metadata(&self) -> CallMetadata; +} -- GitLab From 4d41362b1b4d53af68bc92baed1ec77049269209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 4 Feb 2020 12:39:56 +0100 Subject: [PATCH 244/296] Fix flaky messed signature test (#4819) When messing with the signature, we need to make sure that we acutally mess-up the signature. As the generated private/public key is random, the signature is random as well. It can happen that `bytes[0] == bytes[2]` which makes the test fail. We fix this problem by just inverting the bytes at `0` and `2`. --- primitives/core/src/sr25519.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/primitives/core/src/sr25519.rs b/primitives/core/src/sr25519.rs index d98aa19e1d..3495f32872 100644 --- a/primitives/core/src/sr25519.rs +++ b/primitives/core/src/sr25519.rs @@ -735,7 +735,8 @@ mod test { let public = pair.public(); let message = b"Signed payload"; let Signature(mut bytes) = pair.sign(&message[..]); - bytes[0] = bytes[2]; + bytes[0] = !bytes[0]; + bytes[2] = !bytes[2]; let signature = Signature(bytes); assert!(!Pair::verify(&signature, &message[..], &public)); } -- GitLab From a9680b40469c8180e5b6b083c01dc04f69e4037c Mon Sep 17 00:00:00 2001 From: Demi Obenour <48690212+DemiMarie-parity@users.noreply.github.com> Date: Tue, 4 Feb 2020 15:56:50 +0000 Subject: [PATCH 245/296] Bump `parking_lot` (#4817) Hopefully this can be merged if the tests pass. --- Cargo.lock | 62 +++++++++---------- client/Cargo.toml | 2 +- client/api/Cargo.toml | 2 +- client/basic-authorship/Cargo.toml | 2 +- client/consensus/aura/Cargo.toml | 2 +- client/consensus/babe/Cargo.toml | 2 +- client/consensus/manual-seal/Cargo.toml | 2 +- client/consensus/slots/Cargo.toml | 2 +- client/db/Cargo.toml | 2 +- client/executor/Cargo.toml | 2 +- client/finality-grandpa/Cargo.toml | 2 +- client/keystore/Cargo.toml | 2 +- client/network-gossip/Cargo.toml | 2 +- client/network/Cargo.toml | 2 +- client/network/test/Cargo.toml | 2 +- client/offchain/Cargo.toml | 2 +- client/rpc-api/Cargo.toml | 2 +- client/rpc/Cargo.toml | 2 +- client/service/Cargo.toml | 2 +- client/state-db/Cargo.toml | 2 +- client/telemetry/Cargo.toml | 2 +- client/tracing/Cargo.toml | 2 +- client/transaction-pool/Cargo.toml | 2 +- client/transaction-pool/graph/Cargo.toml | 2 +- frame/aura/Cargo.toml | 2 +- frame/babe/Cargo.toml | 2 +- primitives/blockchain/Cargo.toml | 2 +- primitives/consensus/common/Cargo.toml | 2 +- primitives/core/Cargo.toml | 2 +- primitives/inherents/Cargo.toml | 2 +- primitives/state-machine/Cargo.toml | 2 +- .../runtime/transaction-pool/Cargo.toml | 2 +- utils/grafana-data-source/Cargo.toml | 2 +- 33 files changed, 63 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9fbff15de..e27589d5f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1896,7 +1896,7 @@ dependencies = [ "hyper 0.13.2", "lazy_static", "log 0.4.8", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "serde", "serde_json", "tokio 0.2.11", @@ -3813,7 +3813,7 @@ dependencies = [ "pallet-session", "pallet-timestamp", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "serde", "sp-application-crypto", "sp-consensus-aura", @@ -3870,7 +3870,7 @@ dependencies = [ "pallet-session", "pallet-timestamp", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "serde", "sp-consensus-babe", "sp-core", @@ -5474,7 +5474,7 @@ dependencies = [ "futures 0.3.1", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-block-builder", "sc-client", "sc-client-api", @@ -5580,7 +5580,7 @@ dependencies = [ "kvdb-memorydb", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-block-builder", "sc-client-api", "sc-executor", @@ -5615,7 +5615,7 @@ dependencies = [ "kvdb", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-executor", "sc-telemetry", "sp-api", @@ -5647,7 +5647,7 @@ dependencies = [ "log 0.4.8", "parity-scale-codec", "parity-util-mem 0.4.1", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "quickcheck", "sc-client", "sc-client-api", @@ -5675,7 +5675,7 @@ dependencies = [ "futures-timer 0.4.0", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-client", "sc-client-api", "sc-consensus-slots", @@ -5719,7 +5719,7 @@ dependencies = [ "num-rational", "num-traits", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "pdqselect", "rand 0.7.3", "sc-block-builder", @@ -5808,7 +5808,7 @@ dependencies = [ "futures-timer 2.0.2", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-client-api", "sc-telemetry", "sp-api", @@ -5846,7 +5846,7 @@ dependencies = [ "log 0.4.8", "parity-scale-codec", "parity-wasm 0.41.0", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", @@ -5934,7 +5934,7 @@ dependencies = [ "futures-timer 2.0.2", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "pin-project", "rand 0.7.3", "sc-client", @@ -5968,7 +5968,7 @@ version = "2.0.0" dependencies = [ "derive_more", "hex", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "rand 0.7.3", "serde_json", "sp-application-crypto", @@ -5998,7 +5998,7 @@ dependencies = [ "log 0.4.8", "lru 0.4.3", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "quickcheck", "rand 0.7.3", "rustc-hex", @@ -6037,7 +6037,7 @@ dependencies = [ "libp2p", "log 0.4.8", "lru 0.1.17", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-network", "sp-runtime", ] @@ -6052,7 +6052,7 @@ dependencies = [ "futures-timer 0.4.0", "libp2p", "log 0.4.8", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "rand 0.7.3", "sc-block-builder", "sc-client", @@ -6084,7 +6084,7 @@ dependencies = [ "log 0.4.8", "num_cpus", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "rand 0.7.3", "sc-client-api", "sc-client-db", @@ -6124,7 +6124,7 @@ dependencies = [ "jsonrpc-pubsub", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "rustc-hex", "sc-client", "sc-client-api", @@ -6161,7 +6161,7 @@ dependencies = [ "jsonrpc-pubsub", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "serde", "serde_json", "sp-core", @@ -6212,7 +6212,7 @@ dependencies = [ "log 0.4.8", "parity-multiaddr 0.5.0", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-chain-spec", "sc-client", "sc-client-api", @@ -6276,7 +6276,7 @@ dependencies = [ "env_logger 0.7.1", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sp-core", ] @@ -6289,7 +6289,7 @@ dependencies = [ "futures-timer 2.0.2", "libp2p", "log 0.4.8", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "pin-project", "rand 0.7.3", "serde", @@ -6307,7 +6307,7 @@ dependencies = [ "erased-serde", "grafana-data-source", "log 0.4.8", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-telemetry", "serde", "serde_json", @@ -6326,7 +6326,7 @@ dependencies = [ "futures 0.3.1", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "serde", "sp-core", "sp-runtime", @@ -6343,7 +6343,7 @@ dependencies = [ "futures-diagnose", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-client-api", "sc-transaction-graph", "sp-api", @@ -6818,7 +6818,7 @@ dependencies = [ "log 0.4.8", "lru 0.4.3", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sp-block-builder", "sp-consensus", "sp-runtime", @@ -6836,7 +6836,7 @@ dependencies = [ "libp2p", "log 0.4.8", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "serde", "sp-core", "sp-inherents", @@ -6905,7 +6905,7 @@ dependencies = [ "log 0.4.8", "num-traits", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "pretty_assertions", "primitive-types", "rand 0.7.3", @@ -6974,7 +6974,7 @@ version = "2.0.0" dependencies = [ "derive_more", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sp-core", "sp-std", ] @@ -7165,7 +7165,7 @@ dependencies = [ "log 0.4.8", "num-traits", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "rand 0.7.3", "sp-core", "sp-externalities", @@ -7525,7 +7525,7 @@ dependencies = [ "derive_more", "futures 0.3.1", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "sc-transaction-graph", "sp-runtime", "sp-transaction-pool", diff --git a/client/Cargo.toml b/client/Cargo.toml index 6437d699d1..8560408569 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -21,7 +21,7 @@ sp-inherents = { version = "2.0.0", path = "../primitives/inherents" } sp-keyring = { version = "2.0.0", path = "../primitives/keyring" } kvdb = "0.3.0" log = { version = "0.4.8" } -parking_lot = { version = "0.9.0" } +parking_lot = "0.10.0" sp-core = { version = "2.0.0", path = "../primitives/core" } sp-std = { version = "2.0.0", path = "../primitives/std" } sp-version = { version = "2.0.0", path = "../primitives/version" } diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index ac47537e79..4c2867deb3 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -20,7 +20,7 @@ sp-inherents = { version = "2.0.0", default-features = false, path = "../../prim sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } kvdb = "0.3.0" log = { version = "0.4.8" } -parking_lot = { version = "0.9.0" } +parking_lot = "0.10.0" sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-version = { version = "2.0.0", default-features = false, path = "../../primitives/version" } diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index 68bd4d87f2..6a013f7a74 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -25,4 +25,4 @@ tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } [dev-dependencies] sc-transaction-pool = { version = "2.0.0", path = "../../client/transaction-pool" } substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } -parking_lot = "0.9" +parking_lot = "0.10.0" diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index 4f15a11302..142b10b9da 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -20,7 +20,7 @@ futures-timer = "0.4.0" sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } sc-keystore = { version = "2.0.0", path = "../../keystore" } log = "0.4.8" -parking_lot = "0.9.0" +parking_lot = "0.10.0" sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } sp-io = { version = "2.0.0", path = "../../../primitives/io" } diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 124304093f..551754c7b6 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -32,7 +32,7 @@ sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } fork-tree = { version = "2.0.0", path = "../../../utils/fork-tree" } futures = "0.3.1" futures-timer = "0.4.0" -parking_lot = "0.9.0" +parking_lot = "0.10.0" log = "0.4.8" schnorrkel = { version = "0.8.5", features = ["preaudit_deprecated"] } rand = "0.7.2" diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index de601b4ab3..71c1f6e558 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -13,7 +13,7 @@ jsonrpc-core = "14.0.5" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.5" log = "0.4.8" -parking_lot = "0.10" +parking_lot = "0.10.0" serde = { version = "1.0", features=["derive"] } sc-client = { path = "../../../client" } diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index d9b55bb07d..d500a0fdc7 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -20,7 +20,7 @@ sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } futures = "0.3.1" futures-timer = "2.0" -parking_lot = "0.9.0" +parking_lot = "0.10.0" log = "0.4.8" [dev-dependencies] diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index ae6445c8d3..ebb9986ef0 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "GPL-3.0" [dependencies] -parking_lot = "0.9.0" +parking_lot = "0.10.0" log = "0.4.8" kvdb = "0.3.0" kvdb-rocksdb = { version = "0.4", optional = true } diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index 21fd00ba90..c8774470fe 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -23,7 +23,7 @@ sp-externalities = { version = "0.8.0", path = "../../primitives/externalities" sc-executor-common = { version = "0.8", path = "common" } sc-executor-wasmi = { version = "0.8", path = "wasmi" } sc-executor-wasmtime = { version = "0.8", path = "wasmtime", optional = true } -parking_lot = "0.9.0" +parking_lot = "0.10.0" log = "0.4.8" libsecp256k1 = "0.3.4" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 68efa2e644..7c427dfd5c 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -10,7 +10,7 @@ fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } futures = "0.3.1" futures-timer = "2.0.2" log = "0.4.8" -parking_lot = "0.9.0" +parking_lot = "0.10.0" rand = "0.7.2" assert_matches = "1.3.0" parity-scale-codec = { version = "1.0.0", features = ["derive"] } diff --git a/client/keystore/Cargo.toml b/client/keystore/Cargo.toml index b4dde77e7d..89ab787cb4 100644 --- a/client/keystore/Cargo.toml +++ b/client/keystore/Cargo.toml @@ -13,7 +13,7 @@ hex = "0.4.0" rand = "0.7.2" serde_json = "1.0.41" subtle = "2.1.1" -parking_lot = "0.9.0" +parking_lot = "0.10.0" [dev-dependencies] tempfile = "3.1.0" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index ca86af7df4..22f22b4856 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -13,6 +13,6 @@ futures01 = { package = "futures", version = "0.1.29" } futures-timer = "0.4.0" libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } lru = "0.1.2" -parking_lot = "0.9.0" +parking_lot = "0.10.0" sc-network = { version = "0.8", path = "../network" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index f20ce36a27..e506a61c75 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -23,7 +23,7 @@ linked-hash-map = "0.5.2" linked_hash_set = "0.1.3" log = "0.4.8" lru = "0.4.0" -parking_lot = "0.9.0" +parking_lot = "0.10.0" rand = "0.7.2" rustc-hex = "2.0.1" sc-block-builder = { version = "0.8", path = "../block-builder" } diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 19590c2651..3f1d1d5867 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" [dependencies] sc-network = { version = "0.8", path = "../" } log = "0.4.8" -parking_lot = "0.9.0" +parking_lot = "0.10.0" futures = "0.1.29" futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } futures-timer = "0.4.0" diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index 3ef98f1ab9..bdbf3fa199 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -19,7 +19,7 @@ threadpool = "1.7" num_cpus = "1.10" sp-offchain = { version = "2.0.0", path = "../../primitives/offchain" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } -parking_lot = "0.9.0" +parking_lot = "0.10.0" sp-core = { version = "2.0.0", path = "../../primitives/core" } rand = "0.7.2" sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index 1f52f41508..4781c9d350 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -14,7 +14,7 @@ jsonrpc-core-client = "14.0.3" jsonrpc-derive = "14.0.3" jsonrpc-pubsub = "14.0.3" log = "0.4.8" -parking_lot = "0.9.0" +parking_lot = "0.10.0" sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-version = { version = "2.0.0", path = "../../primitives/version" } serde = { version = "1.0.101", features = ["derive"] } diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index a8cbc5c536..d09617ebc1 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -28,7 +28,7 @@ sc-keystore = { version = "2.0.0", path = "../keystore" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } hash-db = { version = "0.15.2", default-features = false } -parking_lot = { version = "0.9.0" } +parking_lot = "0.10.0" [dev-dependencies] assert_matches = "1.3.0" diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 36213993e3..8e81cce4ee 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -19,7 +19,7 @@ derive_more = "0.99.2" futures01 = { package = "futures", version = "0.1.29" } futures = "0.3.1" futures-diagnose = "1.0" -parking_lot = "0.9.0" +parking_lot = "0.10.0" lazy_static = "1.4.0" log = "0.4.8" slog = { version = "2.5.2", features = ["nested-values"] } diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index 3d3eca9d5e..1bfa136937 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "GPL-3.0" [dependencies] -parking_lot = "0.9.0" +parking_lot = "0.10.0" log = "0.4.8" sp-core = { version = "2.0.0", path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 5127712e12..44e332b9d7 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0" [dependencies] bytes = "0.5" -parking_lot = "0.9.0" +parking_lot = "0.10.0" futures = "0.3.1" futures-timer = "2.0.0" libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } diff --git a/client/tracing/Cargo.toml b/client/tracing/Cargo.toml index 2268c5719f..b476db6a01 100644 --- a/client/tracing/Cargo.toml +++ b/client/tracing/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] erased-serde = "0.3.9" log = { version = "0.4.8" } -parking_lot = "0.9.0" +parking_lot = "0.10.0" serde = "1.0.101" serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index e151e9adbe..1387d1df27 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -11,7 +11,7 @@ derive_more = "0.99.2" futures = { version = "0.3.1", features = ["compat"] } futures-diagnose = "1.0" log = "0.4.8" -parking_lot = "0.9.0" +parking_lot = "0.10.0" sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-api = { version = "2.0.0", path = "../../primitives/api" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index 3b0adf5cb1..4f12ab7fcc 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0" derive_more = "0.99.2" futures = "0.3.1" log = "0.4.8" -parking_lot = "0.9.0" +parking_lot = "0.10.0" serde = { version = "1.0.101", features = ["derive"] } sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index 8eb91016ff..e982a02b47 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -24,7 +24,7 @@ pallet-timestamp = { version = "2.0.0", default-features = false, path = "../tim [dev-dependencies] lazy_static = "1.4.0" -parking_lot = "0.9.0" +parking_lot = "0.10.0" [features] default = ["std"] diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 590c1fe5bd..5e7764862a 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -23,7 +23,7 @@ sp-io ={ path = "../../primitives/io", default-features = false } [dev-dependencies] lazy_static = "1.4.0" -parking_lot = "0.9.0" +parking_lot = "0.10.0" sp-version = { version = "2.0.0", default-features = false, path = "../../primitives/version" } sp-core = { version = "2.0.0", path = "../../primitives/core" } substrate-test-runtime = { version = "2.0.0", path = "../../test-utils/runtime" } diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index cd8ee78394..8b93436f9a 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0" [dependencies] log = "0.4.8" lru = "0.4.0" -parking_lot = "0.9.0" +parking_lot = "0.10.0" derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-consensus = { version = "0.8", path = "../consensus/common" } diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 3ac89ec70c..1b5c54b7e9 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -20,7 +20,7 @@ sp-std = { version = "2.0.0", path = "../../std" } sp-version = { version = "2.0.0", path = "../../version" } sp-runtime = { version = "2.0.0", path = "../../runtime" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } -parking_lot = "0.9.0" +parking_lot = "0.10.0" serde = { version = "1.0", features = ["derive"] } [dev-dependencies] diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 0cc7498184..873d607ecd 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -25,7 +25,7 @@ regex = { version = "1.3.1", optional = true } num-traits = { version = "0.2.8", default-features = false } zeroize = { version = "1.0.0", default-features = false } lazy_static = { version = "1.4.0", default-features = false, optional = true } -parking_lot = { version = "0.9.0", optional = true } +parking_lot = { version = "0.10.0", optional = true } sp-debug-derive = { version = "2.0.0", path = "../debug-derive" } sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } sp-storage = { version = "2.0.0", default-features = false, path = "../storage" } diff --git a/primitives/inherents/Cargo.toml b/primitives/inherents/Cargo.toml index 18fa8412f3..698ab5389a 100644 --- a/primitives/inherents/Cargo.toml +++ b/primitives/inherents/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "GPL-3.0" [dependencies] -parking_lot = { version = "0.9.0", optional = true } +parking_lot = { version = "0.10.0", optional = true } sp-std = { version = "2.0.0", default-features = false, path = "../std" } sp-core = { version = "2.0.0", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false, features = ["derive"] } diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index a856146667..3752e95695 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0" [dependencies] log = "0.4.8" -parking_lot = "0.9.0" +parking_lot = "0.10.0" hash-db = "0.15.2" trie-db = "0.19.2" trie-root = "0.15.2" diff --git a/test-utils/runtime/transaction-pool/Cargo.toml b/test-utils/runtime/transaction-pool/Cargo.toml index c10a34f938..615886d987 100644 --- a/test-utils/runtime/transaction-pool/Cargo.toml +++ b/test-utils/runtime/transaction-pool/Cargo.toml @@ -7,7 +7,7 @@ license = "GPL-3.0" [dependencies] substrate-test-runtime-client = { version = "2.0.0", path = "../client" } -parking_lot = "0.9.0" +parking_lot = "0.10.0" codec = { package = "parity-scale-codec", version = "1.0.0" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } diff --git a/utils/grafana-data-source/Cargo.toml b/utils/grafana-data-source/Cargo.toml index 4487b5359f..ab4251ef57 100644 --- a/utils/grafana-data-source/Cargo.toml +++ b/utils/grafana-data-source/Cargo.toml @@ -15,7 +15,7 @@ serde_json = "1" serde = { version = "1", features = ["derive"] } chrono = { version = "0.4", features = ["serde"] } lazy_static = "1.4" -parking_lot = "0.9" +parking_lot = "0.10.0" futures-timer = "2.0" derive_more = "0.99" -- GitLab From efd27a538e6be0f0f077a81442c8f0547acee918 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Tue, 4 Feb 2020 16:58:23 +0100 Subject: [PATCH 246/296] pallet-evm: log created address (#4821) * pallet-evm: log created address * Bump spec_version * Only emit Created event when ExitReason is Succeed --- Cargo.lock | 6 +++--- bin/node/runtime/src/lib.rs | 2 +- frame/evm/src/lib.rs | 8 +++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e27589d5f6..ed97668987 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1229,9 +1229,9 @@ dependencies = [ [[package]] name = "evm" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2c6961fdc9952371fc5f0416f03a9d90378a9dfb6862f6a7a9a3b8986b8dd" +checksum = "73f887b371f9999682ccc5b1cb771e7d4408ae61e93fc0343ceaeb761fca42d1" dependencies = [ "evm-core", "evm-gasometer", @@ -8190,7 +8190,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bfd5b7557925ce778ff9b9ef90e3ade34c524b5ff10e239c69a42d546d2af56" dependencies = [ - "rand 0.7.3", + "rand 0.3.23", ] [[package]] diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index f2c374cedd..65e09e99d2 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -79,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 212, + spec_version: 213, impl_version: 0, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index 9c79274b4a..edd3d46a9a 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -174,6 +174,8 @@ decl_event! { pub enum Event { /// Ethereum events from contracts. Log(Log), + /// A contract has been created at given address. + Created(H160), } } @@ -343,6 +345,7 @@ decl_module! { } executor.withdraw(source, total_fee).map_err(|_| Error::::WithdrawFailed)?; + let create_address = executor.create_address(source, evm::CreateScheme::Dynamic); let reason = executor.transact_create( source, value, @@ -351,7 +354,10 @@ decl_module! { ); let ret = match reason { - ExitReason::Succeed(_) => Ok(()), + ExitReason::Succeed(_) => { + Module::::deposit_event(Event::Created(create_address)); + Ok(()) + }, ExitReason::Error(_) => Err(Error::::ExitReasonFailed), ExitReason::Revert(_) => Err(Error::::ExitReasonRevert), ExitReason::Fatal(_) => Err(Error::::ExitReasonFatal), -- GitLab From 7b22fbfc6ba567af8ac0a693ef6593e179f46a53 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 5 Feb 2020 11:56:59 +0100 Subject: [PATCH 247/296] Fix missing overrides of NetworkBehaviour (#4829) --- client/network/src/debug_info.rs | 12 ++++++++ client/network/src/discovery.rs | 29 ++++++++++++++++++- client/network/src/protocol.rs | 10 ++++++- .../src/protocol/legacy_proto/tests.rs | 12 ++++++-- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/client/network/src/debug_info.rs b/client/network/src/debug_info.rs index 9cc39baae6..b06e275d1d 100644 --- a/client/network/src/debug_info.rs +++ b/client/network/src/debug_info.rs @@ -17,12 +17,14 @@ use fnv::FnvHashMap; use futures::prelude::*; use libp2p::Multiaddr; +use libp2p::core::nodes::listeners::ListenerId; use libp2p::core::{ConnectedPoint, either::EitherOutput, PeerId, PublicKey}; use libp2p::swarm::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use libp2p::identify::{Identify, IdentifyEvent, IdentifyInfo}; use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; use log::{debug, trace, error}; +use std::error; use std::collections::hash_map::Entry; use std::pin::Pin; use std::task::{Context, Poll}; @@ -251,6 +253,16 @@ where TSubstream: AsyncRead + AsyncWrite + Unpin + Send + 'static { self.identify.inject_new_external_addr(addr); } + fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn error::Error + 'static)) { + self.ping.inject_listener_error(id, err); + self.identify.inject_listener_error(id, err); + } + + fn inject_listener_closed(&mut self, id: ListenerId) { + self.ping.inject_listener_closed(id); + self.identify.inject_listener_closed(id); + } + fn poll( &mut self, cx: &mut Context, diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 531e769cce..ab5ab0a1f4 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -47,7 +47,7 @@ use futures::prelude::*; use futures_timer::Delay; -use libp2p::core::{ConnectedPoint, Multiaddr, PeerId, PublicKey}; +use libp2p::core::{nodes::listeners::ListenerId, ConnectedPoint, Multiaddr, PeerId, PublicKey}; use libp2p::swarm::{ProtocolsHandler, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use libp2p::kad::{Kademlia, KademliaEvent, Quorum, Record}; use libp2p::kad::GetClosestPeersError; @@ -266,6 +266,15 @@ where NetworkBehaviour::inject_replaced(&mut self.kademlia, peer_id, closed, opened) } + fn inject_addr_reach_failure( + &mut self, + peer_id: Option<&PeerId>, + addr: &Multiaddr, + error: &dyn std::error::Error + ) { + NetworkBehaviour::inject_addr_reach_failure(&mut self.kademlia, peer_id, addr, error) + } + fn inject_node_event( &mut self, peer_id: PeerId, @@ -278,10 +287,28 @@ where 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); + NetworkBehaviour::inject_new_external_addr(&mut self.kademlia, addr) } fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { info!(target: "sub-libp2p", "No longer listening on {}", addr); + NetworkBehaviour::inject_expired_listen_addr(&mut self.kademlia, addr) + } + + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + NetworkBehaviour::inject_dial_failure(&mut self.kademlia, peer_id) + } + + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + NetworkBehaviour::inject_new_listen_addr(&mut self.kademlia, addr) + } + + fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn std::error::Error + 'static)) { + NetworkBehaviour::inject_listener_error(&mut self.kademlia, id, err); + } + + fn inject_listener_closed(&mut self, id: ListenerId) { + NetworkBehaviour::inject_listener_closed(&mut self.kademlia, id); } fn poll( diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 2df8f6597c..5e8df2831b 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -20,7 +20,7 @@ use crate::utils::interval; use bytes::{Bytes, BytesMut}; use futures::prelude::*; use libp2p::{Multiaddr, PeerId}; -use libp2p::core::{ConnectedPoint, nodes::Substream, muxing::StreamMuxerBox}; +use libp2p::core::{ConnectedPoint, nodes::{listeners::ListenerId, Substream}, muxing::StreamMuxerBox}; use libp2p::swarm::{ProtocolsHandler, IntoProtocolsHandler}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use sp_core::storage::{StorageKey, ChildInfo}; @@ -2004,6 +2004,14 @@ Protocol { fn inject_new_external_addr(&mut self, addr: &Multiaddr) { self.behaviour.inject_new_external_addr(addr) } + + fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn std::error::Error + 'static)) { + self.behaviour.inject_listener_error(id, err); + } + + fn inject_listener_closed(&mut self, id: ListenerId) { + self.behaviour.inject_listener_closed(id); + } } impl, H: ExHashT> DiscoveryNetBehaviour for Protocol { diff --git a/client/network/src/protocol/legacy_proto/tests.rs b/client/network/src/protocol/legacy_proto/tests.rs index 6a2174f30c..18e32f1d01 100644 --- a/client/network/src/protocol/legacy_proto/tests.rs +++ b/client/network/src/protocol/legacy_proto/tests.rs @@ -18,13 +18,13 @@ use futures::{prelude::*, ready}; use codec::{Encode, Decode}; -use libp2p::core::nodes::Substream; +use libp2p::core::nodes::{Substream, listeners::ListenerId}; use libp2p::core::{ConnectedPoint, transport::boxed::Boxed, muxing::StreamMuxerBox}; use libp2p::swarm::{Swarm, ProtocolsHandler, IntoProtocolsHandler}; use libp2p::swarm::{PollParameters, NetworkBehaviour, NetworkBehaviourAction}; use libp2p::{PeerId, Multiaddr, Transport}; use rand::seq::SliceRandom; -use std::{io, task::Context, task::Poll, time::Duration}; +use std::{error, io, task::Context, task::Poll, time::Duration}; use crate::message::Message; use crate::protocol::legacy_proto::{LegacyProto, LegacyProtoOut}; use sp_test_primitives::Block; @@ -204,6 +204,14 @@ impl NetworkBehaviour for CustomProtoWithAddr { fn inject_new_external_addr(&mut self, addr: &Multiaddr) { self.inner.inject_new_external_addr(addr) } + + fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn error::Error + 'static)) { + self.inner.inject_listener_error(id, err); + } + + fn inject_listener_closed(&mut self, id: ListenerId) { + self.inner.inject_listener_closed(id); + } } #[test] -- GitLab From eefb472c33f8acb1852e90526af46f2ac878c155 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 5 Feb 2020 16:56:49 +0100 Subject: [PATCH 248/296] Remove support for secio (#4831) --- client/network/src/transport.rs | 36 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index d632f9b75c..b11b187051 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -17,12 +17,10 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - mplex, identity, secio, yamux, bandwidth, wasm_ext + mplex, identity, yamux, bandwidth, wasm_ext }; #[cfg(not(target_os = "unknown"))] use libp2p::{tcp, dns, websocket, noise}; -#[cfg(not(target_os = "unknown"))] -use libp2p::core::{either::EitherError, either::EitherOutput}; use libp2p::core::{self, upgrade, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; use std::{io, sync::Arc, time::Duration, usize}; @@ -52,7 +50,6 @@ pub fn build_transport( 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(); @@ -93,28 +90,23 @@ pub fn build_transport( // 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, upgrade::Version::V1) - .map(|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((remote_id, out)) => - Ok((EitherOutput::Second(out), remote_id)) + core::upgrade::apply(stream, noise_config, endpoint, upgrade::Version::V1) + .and_then(|(remote_id, out)| async move { + let remote_key = match remote_id { + noise::RemoteIdentity::IdentityKey(key) => key, + _ => return Err(upgrade::UpgradeError::Apply(noise::NoiseError::InvalidKey)) + }; + Ok((out, remote_key.into_peer_id())) }) }); - // For WASM, we only support secio for now. + // We refuse all WASM connections for now. It is intended that we negotiate noise in the + // future. See https://github.com/libp2p/rust-libp2p/issues/1414 #[cfg(target_os = "unknown")] - let transport = transport.and_then(move |stream, endpoint| { - core::upgrade::apply(stream, secio_config, endpoint, upgrade::Version::V1) - .map_ok(|(id, stream)| ((stream, id))) + let transport = transport.and_then(move |_, _| async move { + let r: Result<(wasm_ext::Connection, PeerId), _> = + Err(io::Error::new(io::ErrorKind::Other, format!("No encryption protocol supported"))); + r }); // Multiplexing -- GitLab From b9ee3dfeca8b4d105111564238ec2943c2130adc Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 5 Feb 2020 17:25:14 +0100 Subject: [PATCH 249/296] Print an error if listener is closed (#4830) * Print an error if listener is closed * Oops, forgot to commit this --- client/network/src/discovery.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index ab5ab0a1f4..de49913b26 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -59,7 +59,7 @@ use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; #[cfg(not(target_os = "unknown"))] use libp2p::mdns::{Mdns, MdnsEvent}; use libp2p::multiaddr::Protocol; -use log::{debug, info, trace, warn}; +use log::{debug, info, trace, warn, error}; use std::{cmp, collections::VecDeque, time::Duration}; use std::task::{Context, Poll}; use sp_core::hexdisplay::HexDisplay; @@ -304,10 +304,12 @@ where } fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn std::error::Error + 'static)) { + error!(target: "sub-libp2p", "Error on libp2p listener {:?}: {}", id, err); NetworkBehaviour::inject_listener_error(&mut self.kademlia, id, err); } fn inject_listener_closed(&mut self, id: ListenerId) { + error!(target: "sub-libp2p", "Libp2p listener {:?} closed", id); NetworkBehaviour::inject_listener_closed(&mut self.kademlia, id); } -- GitLab From 584ac4f8d925387efcbf5af805f06173e42c338d Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 5 Feb 2020 17:26:07 +0100 Subject: [PATCH 250/296] Avoid losing values in intermediate take (#4833) --- primitives/consensus/common/src/block_import.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/primitives/consensus/common/src/block_import.rs b/primitives/consensus/common/src/block_import.rs index 952a044e9b..dabe6331e8 100644 --- a/primitives/consensus/common/src/block_import.rs +++ b/primitives/consensus/common/src/block_import.rs @@ -228,15 +228,14 @@ impl BlockImportParams { /// Take interemdiate by given key, and remove it from the processing list. pub fn take_intermediate(&mut self, key: &[u8]) -> Result, Error> { - if self.intermediates.contains_key(key) { - self.intermediates.remove(key) - .ok_or(Error::NoIntermediate) - .and_then(|value| { - value.downcast::() - .map_err(|_| Error::InvalidIntermediate) - }) - } else { - Err(Error::NoIntermediate) + let (k, v) = self.intermediates.remove_entry(key).ok_or(Error::NoIntermediate)?; + + match v.downcast::() { + Ok(v) => Ok(v), + Err(v) => { + self.intermediates.insert(k, v); + Err(Error::InvalidIntermediate) + }, } } -- GitLab From 4e0e8c179faaad362e3013024c70abda6493fa1b Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Wed, 5 Feb 2020 17:26:48 +0100 Subject: [PATCH 251/296] Get rid of in-substrate usages of `core_intrinsics` feature (#4823) * Remove usage of unneeded Rust feature core_intrinsics * core::intrinsics::abort -> arch::wasm32::unreachable * Don't publish `core::intrinsics`. * Disable panic_handler and alloc_error_handler for no_std non wasm builds --- primitives/application-crypto/Cargo.toml | 6 +++++- primitives/io/src/lib.rs | 5 ++--- primitives/sandbox/src/lib.rs | 1 - primitives/std/src/lib.rs | 2 +- primitives/std/without_std.rs | 1 - 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/primitives/application-crypto/Cargo.toml b/primitives/application-crypto/Cargo.toml index 9377bcff8a..1fa9a6631c 100644 --- a/primitives/application-crypto/Cargo.toml +++ b/primitives/application-crypto/Cargo.toml @@ -21,5 +21,9 @@ std = [ "full_crypto", "sp-core/std", "codec/std", "serde", "sp-std/std", "sp-io # or Intel SGX. # For the regular wasm runtime builds this should not be used. full_crypto = [ - "sp-core/full_crypto" + "sp-core/full_crypto", + # Don't add `panic_handler` and `alloc_error_handler` since they are expected to be provided + # by the user anyway. + "sp-io/disable_panic_handler", + "sp-io/disable_oom", ] diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index dce67133d3..1b531725fe 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -20,7 +20,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(alloc_error_handler))] -#![cfg_attr(not(feature = "std"), feature(core_intrinsics))] #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] @@ -892,7 +891,7 @@ pub fn panic(info: &core::panic::PanicInfo) -> ! { unsafe { let message = sp_std::alloc::format!("{}", info); logging::log(LogLevel::Error, "runtime", message.as_bytes()); - core::intrinsics::abort() + core::arch::wasm32::unreachable(); } } @@ -902,7 +901,7 @@ pub fn panic(info: &core::panic::PanicInfo) -> ! { pub fn oom(_: core::alloc::Layout) -> ! { unsafe { logging::log(LogLevel::Error, "runtime", b"Runtime memory exhausted. Aborting"); - core::intrinsics::abort(); + core::arch::wasm32::unreachable(); } } diff --git a/primitives/sandbox/src/lib.rs b/primitives/sandbox/src/lib.rs index 17712ad365..e7cd684b45 100755 --- a/primitives/sandbox/src/lib.rs +++ b/primitives/sandbox/src/lib.rs @@ -36,7 +36,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(core_intrinsics))] use sp_std::prelude::*; diff --git a/primitives/std/src/lib.rs b/primitives/std/src/lib.rs index 3fcf5daeb4..856b095403 100644 --- a/primitives/std/src/lib.rs +++ b/primitives/std/src/lib.rs @@ -18,7 +18,7 @@ //! or client/alloc to be used with any code that depends on the runtime. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(core_intrinsics))] + #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] diff --git a/primitives/std/without_std.rs b/primitives/std/without_std.rs index ad587531dd..4424ca0e7d 100755 --- a/primitives/std/without_std.rs +++ b/primitives/std/without_std.rs @@ -27,7 +27,6 @@ pub use core::convert; pub use core::default; pub use core::fmt; pub use core::hash; -pub use core::intrinsics; pub use core::iter; pub use core::marker; pub use core::mem; -- GitLab From 53008ba412c54f534e6033d9055ea1f403dcfe34 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 5 Feb 2020 17:27:50 +0100 Subject: [PATCH 252/296] Additional RPC for dumping all main storage key pairs under a prefix (#4803) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Merge branch 'gav-split-balanecs-vesting' into gav-upsub # Conflicts: # Cargo.lock # cli/Cargo.toml # collator/Cargo.toml # primitives/Cargo.toml # runtime/common/Cargo.toml # runtime/common/src/claims.rs # runtime/kusama/Cargo.toml # runtime/polkadot/Cargo.toml # service/Cargo.toml * Update client/src/client.rs * Update client/src/client.rs * Fix merge conflict Co-authored-by: Bastian Köcher --- client/rpc-api/src/state/mod.rs | 4 ++++ client/rpc/src/state/mod.rs | 15 +++++++++++++++ client/rpc/src/state/state_full.rs | 11 +++++++++++ client/rpc/src/state/state_light.rs | 8 ++++++++ client/src/client.rs | 23 +++++++++++++++++++++-- 5 files changed, 59 insertions(+), 2 deletions(-) diff --git a/client/rpc-api/src/state/mod.rs b/client/rpc-api/src/state/mod.rs index 6901738efe..b2cf8ce909 100644 --- a/client/rpc-api/src/state/mod.rs +++ b/client/rpc-api/src/state/mod.rs @@ -44,6 +44,10 @@ pub trait StateApi { #[rpc(name = "state_getKeys")] fn storage_keys(&self, prefix: StorageKey, hash: Option) -> FutureResult>; + /// Returns the keys with prefix, leave empty to get all the keys + #[rpc(name = "state_getPairs")] + fn storage_pairs(&self, prefix: StorageKey, hash: Option) -> FutureResult>; + /// Returns the keys with prefix with pagination support. /// Up to `count` keys will be returned. /// If `start_key` is passed, return next keys in storage in lexicographic order. diff --git a/client/rpc/src/state/mod.rs b/client/rpc/src/state/mod.rs index df26daa929..8f621cc8af 100644 --- a/client/rpc/src/state/mod.rs +++ b/client/rpc/src/state/mod.rs @@ -63,6 +63,13 @@ pub trait StateBackend: Send + Sync + 'static prefix: StorageKey, ) -> FutureResult>; + /// Returns the keys with prefix along with their values, leave empty to get all the pairs. + fn storage_pairs( + &self, + block: Option, + prefix: StorageKey, + ) -> FutureResult>; + /// Returns the keys with prefix with pagination support. fn storage_keys_paged( &self, @@ -255,6 +262,14 @@ impl StateApi for State self.backend.storage_keys(block, key_prefix) } + fn storage_pairs( + &self, + key_prefix: StorageKey, + block: Option, + ) -> FutureResult> { + self.backend.storage_pairs(block, key_prefix) + } + fn storage_keys_paged( &self, prefix: Option, diff --git a/client/rpc/src/state/state_full.rs b/client/rpc/src/state/state_full.rs index 87c75e77a6..3d5613626e 100644 --- a/client/rpc/src/state/state_full.rs +++ b/client/rpc/src/state/state_full.rs @@ -254,6 +254,17 @@ impl StateBackend for FullState, + prefix: StorageKey, + ) -> FutureResult> { + Box::new(result( + self.block_or_best(block) + .and_then(|block| self.client.storage_pairs(&BlockId::Hash(block), &prefix)) + .map_err(client_err))) + } + fn storage_keys_paged( &self, block: Option, diff --git a/client/rpc/src/state/state_light.rs b/client/rpc/src/state/state_light.rs index f25d6e2186..7b2455a8fc 100644 --- a/client/rpc/src/state/state_light.rs +++ b/client/rpc/src/state/state_light.rs @@ -199,6 +199,14 @@ impl StateBackend for LightState, + _prefix: StorageKey, + ) -> FutureResult> { + Box::new(result(Err(client_err(ClientError::NotAvailableOnLightClient)))) + } + fn storage_keys_paged( &self, _block: Option, diff --git a/client/src/client.rs b/client/src/client.rs index ca8b0c5dd7..9e30c7b2ea 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -280,6 +280,22 @@ impl Client where Ok(keys) } + /// Given a `BlockId` and a key prefix, return the matching child storage keys and values in that block. + pub fn storage_pairs(&self, id: &BlockId, key_prefix: &StorageKey) + -> sp_blockchain::Result> + { + let state = self.state_at(id)?; + let keys = state + .keys(&key_prefix.0) + .into_iter() + .map(|k| { + let d = state.storage(&k).ok().flatten().unwrap_or_default(); + (StorageKey(k), StorageData(d)) + }) + .collect(); + Ok(keys) + } + /// Given a `BlockId` and a key prefix, return a `KeyIterator` iterates matching storage keys in that block. pub fn storage_keys_iter<'a>( &self, @@ -296,7 +312,9 @@ impl Client where } /// Given a `BlockId` and a key, return the value under the key in that block. - pub fn storage(&self, id: &BlockId, key: &StorageKey) -> sp_blockchain::Result> { + pub fn storage(&self, id: &BlockId, key: &StorageKey) + -> sp_blockchain::Result> + { Ok(self.state_at(id)? .storage(&key.0).map_err(|e| sp_blockchain::Error::from_state(Box::new(e)))? .map(StorageData) @@ -305,7 +323,8 @@ impl Client where /// Given a `BlockId` and a key, return the value under the hash in that block. pub fn storage_hash(&self, id: &BlockId, key: &StorageKey) - -> sp_blockchain::Result> { + -> sp_blockchain::Result> + { Ok(self.state_at(id)? .storage_hash(&key.0).map_err(|e| sp_blockchain::Error::from_state(Box::new(e)))? ) -- GitLab From 7019e30466feb4fc09d28a5e9e13afd54de54f93 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Wed, 5 Feb 2020 18:20:25 +0100 Subject: [PATCH 253/296] executor: Simplify the SandboxCapabilities interface (#4825) * Don't require `store` and `store_mut` in `SandboxCapabilities`. * Simplify the sandbox a bit --- client/executor/common/src/sandbox.rs | 123 +++++++++--------- client/executor/wasmi/src/lib.rs | 34 ++--- .../wasmtime/src/function_executor.rs | 35 ++--- 3 files changed, 81 insertions(+), 111 deletions(-) diff --git a/client/executor/common/src/sandbox.rs b/client/executor/common/src/sandbox.rs index 89285a75fc..f920a47ca7 100644 --- a/client/executor/common/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -27,7 +27,7 @@ use wasmi::{ Externals, ImportResolver, MemoryInstance, MemoryRef, Module, ModuleInstance, ModuleRef, RuntimeArgs, RuntimeValue, Trap, TrapKind, memory_units::Pages, }; -use sp_wasm_interface::{Pointer, WordSize}; +use sp_wasm_interface::{FunctionContext, Pointer, WordSize}; /// Index of a function inside the supervisor. /// @@ -144,48 +144,10 @@ impl ImportResolver for Imports { /// This trait encapsulates sandboxing capabilities. /// /// Note that this functions are only called in the `supervisor` context. -pub trait SandboxCapabilities { +pub trait SandboxCapabilities: FunctionContext { /// Represents a function reference into the supervisor environment. type SupervisorFuncRef; - /// Returns a reference to an associated sandbox `Store`. - fn store(&self) -> &Store; - - /// Returns a mutable reference to an associated sandbox `Store`. - fn store_mut(&mut self) -> &mut Store; - - /// Allocate space of the specified length in the supervisor memory. - /// - /// # Errors - /// - /// Returns `Err` if allocation not possible or errors during heap management. - /// - /// Returns pointer to the allocated block. - fn allocate(&mut self, len: WordSize) -> Result>; - - /// Deallocate space specified by the pointer that was previously returned by [`allocate`]. - /// - /// # Errors - /// - /// Returns `Err` if deallocation not possible or because of errors in heap management. - /// - /// [`allocate`]: #tymethod.allocate - fn deallocate(&mut self, ptr: Pointer) -> 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: Pointer, 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: Pointer, len: WordSize) -> Result>; - /// Invoke a function in the supervisor environment. /// /// This first invokes the dispatch_thunk function, passing in the function index of the @@ -270,8 +232,14 @@ impl<'a, FE: SandboxCapabilities + 'a> Externals for GuestExternals<'a, FE> { // Move serialized arguments inside the memory and invoke dispatch thunk and // then free allocated memory. let invoke_args_len = invoke_args_data.len() as WordSize; - let invoke_args_ptr = self.supervisor_externals.allocate(invoke_args_len)?; - self.supervisor_externals.write_memory(invoke_args_ptr, &invoke_args_data)?; + let invoke_args_ptr = self + .supervisor_externals + .allocate_memory(invoke_args_len) + .map_err(|_| trap("Can't allocate memory in supervisor for the arguments"))?; + self + .supervisor_externals + .write_memory(invoke_args_ptr, &invoke_args_data) + .map_err(|_| trap("Can't write invoke args into memory"))?; let result = self.supervisor_externals.invoke( &self.sandbox_instance.dispatch_thunk, invoke_args_ptr, @@ -279,7 +247,10 @@ impl<'a, FE: SandboxCapabilities + 'a> Externals for GuestExternals<'a, FE> { state, func_idx, )?; - self.supervisor_externals.deallocate(invoke_args_ptr)?; + self + .supervisor_externals + .deallocate_memory(invoke_args_ptr) + .map_err(|_| trap("Can't deallocate memory for dispatch thunk's invoke arguments"))?; // dispatch_thunk returns pointer to serialized arguments. // Unpack pointer and len of the serialized result data. @@ -292,9 +263,11 @@ impl<'a, FE: SandboxCapabilities + 'a> Externals for GuestExternals<'a, FE> { }; let serialized_result_val = self.supervisor_externals - .read_memory(serialized_result_val_ptr, serialized_result_val_len)?; + .read_memory(serialized_result_val_ptr, serialized_result_val_len) + .map_err(|_| trap("Can't read the serialized result from dispatch thunk"))?; self.supervisor_externals - .deallocate(serialized_result_val_ptr)?; + .deallocate_memory(serialized_result_val_ptr) + .map_err(|_| trap("Can't deallocate memory for dispatch thunk's result"))?; deserialize_result(&serialized_result_val) } @@ -433,6 +406,46 @@ fn decode_environment_definition( )) } +/// An environment in which the guest module is instantiated. +pub struct GuestEnvironment { + imports: Imports, + guest_to_supervisor_mapping: GuestToSupervisorFunctionMapping, +} + +impl GuestEnvironment { + /// Decodes an environment definition from the given raw bytes. + /// + /// Returns `Err` if the definition cannot be decoded. + pub fn decode( + store: &Store, + raw_env_def: &[u8], + ) -> std::result::Result { + let (imports, guest_to_supervisor_mapping) = + decode_environment_definition(raw_env_def, &store.memories)?; + Ok(Self { + imports, + guest_to_supervisor_mapping, + }) + } +} + +/// An unregistered sandboxed instance. +/// +/// To finish off the instantiation the user must call `register`. +#[must_use] +pub struct UnregisteredInstance { + sandbox_instance: Rc>, +} + +impl UnregisteredInstance { + /// Finalizes instantiation of this module. + pub fn register(self, store: &mut Store) -> u32 { + // At last, register the instance. + let instance_idx = store.register_sandbox_instance(self.sandbox_instance); + instance_idx + } +} + /// Instantiate a guest module and return it's index in the store. /// /// The guest module's code is specified in `wasm`. Environment that will be available to @@ -447,18 +460,16 @@ fn decode_environment_definition( /// - Module in `wasm` is invalid or couldn't be instantiated. /// /// [`EnvironmentDefinition`]: ../sandbox/struct.EnvironmentDefinition.html -pub fn instantiate( +pub fn instantiate<'a, FE: SandboxCapabilities>( supervisor_externals: &mut FE, dispatch_thunk: FE::SupervisorFuncRef, wasm: &[u8], - raw_env_def: &[u8], + host_env: GuestEnvironment, state: u32, -) -> std::result::Result { - let (imports, guest_to_supervisor_mapping) = - decode_environment_definition(raw_env_def, &supervisor_externals.store().memories)?; - +) -> std::result::Result, InstantiationError> { let module = Module::from_buffer(wasm).map_err(|_| InstantiationError::ModuleDecoding)?; - let instance = ModuleInstance::new(&module, &imports).map_err(|_| InstantiationError::Instantiation)?; + let instance = ModuleInstance::new(&module, &host_env.imports) + .map_err(|_| InstantiationError::Instantiation)?; let sandbox_instance = Rc::new(SandboxInstance { // In general, it's not a very good idea to use `.not_started_instance()` for anything @@ -466,7 +477,7 @@ pub fn instantiate( // for the purpose of running `start` function which should be ok. instance: instance.not_started_instance().clone(), dispatch_thunk, - guest_to_supervisor_mapping, + guest_to_supervisor_mapping: host_env.guest_to_supervisor_mapping, }); with_guest_externals( @@ -480,11 +491,7 @@ pub fn instantiate( }, )?; - // At last, register the instance. - let instance_idx = supervisor_externals - .store_mut() - .register_sandbox_instance(sandbox_instance); - Ok(instance_idx) + Ok(UnregisteredInstance { sandbox_instance }) } /// This struct keeps track of all sandboxed components. diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index 1bcb1aab8a..6fbfdbc1cc 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -66,31 +66,6 @@ impl<'a> FunctionExecutor<'a> { impl<'a> sandbox::SandboxCapabilities for FunctionExecutor<'a> { type SupervisorFuncRef = wasmi::FuncRef; - fn store(&self) -> &sandbox::Store { - &self.sandbox_store - } - fn store_mut(&mut self) -> &mut sandbox::Store { - &mut self.sandbox_store - } - fn allocate(&mut self, len: WordSize) -> Result, Error> { - let heap = &mut self.heap; - self.memory.with_direct_access_mut(|mem| { - heap.allocate(mem, len).map_err(Into::into) - }) - } - fn deallocate(&mut self, ptr: Pointer) -> Result<(), Error> { - let heap = &mut self.heap; - self.memory.with_direct_access_mut(|mem| { - heap.deallocate(mem, ptr).map_err(Into::into) - }) - } - fn write_memory(&mut self, ptr: Pointer, data: &[u8]) -> Result<(), Error> { - self.memory.set(ptr.into(), data).map_err(Into::into) - } - fn read_memory(&self, ptr: Pointer, len: WordSize) -> Result, Error> { - self.memory.get(ptr.into(), len as usize).map_err(Into::into) - } - fn invoke( &mut self, dispatch_thunk: &Self::SupervisorFuncRef, @@ -259,8 +234,15 @@ impl<'a> Sandbox for FunctionExecutor<'a> { .clone() }; + let guest_env = match sandbox::GuestEnvironment::decode(&self.sandbox_store, raw_env_def) { + Ok(guest_env) => guest_env, + Err(_) => return Ok(sandbox_primitives::ERR_MODULE as u32), + }; + let instance_idx_or_err_code = - match sandbox::instantiate(self, dispatch_thunk, wasm, raw_env_def, state) { + match sandbox::instantiate(self, dispatch_thunk, wasm, guest_env, state) + .map(|i| i.register(&mut self.sandbox_store)) + { Ok(instance_idx) => instance_idx, Err(sandbox::InstantiationError::StartTrapped) => sandbox_primitives::ERR_EXECUTION, diff --git a/client/executor/wasmtime/src/function_executor.rs b/client/executor/wasmtime/src/function_executor.rs index 7bbf5a456b..b4971f8b8a 100644 --- a/client/executor/wasmtime/src/function_executor.rs +++ b/client/executor/wasmtime/src/function_executor.rs @@ -118,32 +118,6 @@ impl<'a> FunctionExecutor<'a> { impl<'a> SandboxCapabilities for FunctionExecutor<'a> { type SupervisorFuncRef = SupervisorFuncRef; - fn store(&self) -> &sandbox::Store { - &self.sandbox_store - } - - fn store_mut(&mut self) -> &mut sandbox::Store { - &mut self.sandbox_store - } - - fn allocate(&mut self, len: WordSize) -> Result> { - self.heap.allocate(self.memory, len).map_err(Into::into) - } - - fn deallocate(&mut self, ptr: Pointer) -> Result<()> { - self.heap.deallocate(self.memory, ptr).map_err(Into::into) - } - - fn write_memory(&mut self, ptr: Pointer, data: &[u8]) -> Result<()> { - write_memory_from(self.memory, ptr, data) - } - - fn read_memory(&self, ptr: Pointer, len: WordSize) -> Result> { - let mut output = vec![0; len as usize]; - read_memory_into(self.memory, ptr, output.as_mut())?; - Ok(output) - } - fn invoke( &mut self, dispatch_thunk: &Self::SupervisorFuncRef, @@ -327,8 +301,15 @@ impl<'a> Sandbox for FunctionExecutor<'a> { SupervisorFuncRef(func_ref) }; + let guest_env = match sandbox::GuestEnvironment::decode(&self.sandbox_store, raw_env_def) { + Ok(guest_env) => guest_env, + Err(_) => return Ok(sandbox_primitives::ERR_MODULE as u32), + }; + let instance_idx_or_err_code = - match sandbox::instantiate(self, dispatch_thunk, wasm, raw_env_def, state) { + match sandbox::instantiate(self, dispatch_thunk, wasm, guest_env, state) + .map(|i| i.register(&mut self.sandbox_store)) + { Ok(instance_idx) => instance_idx, Err(sandbox::InstantiationError::StartTrapped) => sandbox_primitives::ERR_EXECUTION, -- GitLab From 0d19d9566f8628a7b33a7730d1201a7f63af2968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Wed, 5 Feb 2020 20:47:11 +0000 Subject: [PATCH 254/296] grandpa: bump version to v0.11.1 (#4813) --- client/finality-grandpa/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 7c427dfd5c..1249bff751 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -29,11 +29,11 @@ sc-network = { version = "0.8", path = "../network" } sc-network-gossip = { version = "0.8", path = "../network-gossip" } sp-finality-tracker = { version = "2.0.0", path = "../../primitives/finality-tracker" } sp-finality-grandpa = { version = "2.0.0", path = "../../primitives/finality-grandpa" } -finality-grandpa = { version = "0.11.0", features = ["derive-codec"] } +finality-grandpa = { version = "0.11.1", features = ["derive-codec"] } pin-project = "0.4.6" [dev-dependencies] -finality-grandpa = { version = "0.11.0", features = ["derive-codec", "test-helpers"] } +finality-grandpa = { version = "0.11.1", features = ["derive-codec", "test-helpers"] } sc-network = { version = "0.8", path = "../network" } sc-network-test = { version = "0.8.0", path = "../network/test" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } -- GitLab From 1fa99067a86962a18f5d7ef4db83bb9797b93dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Wed, 5 Feb 2020 23:10:35 +0000 Subject: [PATCH 255/296] node: disable grandpa automatic finality fallback (#4835) * node: disable grandpa automatic finality fallback * node: bump spec_version --- bin/node/runtime/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 65e09e99d2..40342c1ce8 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -79,7 +79,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 213, + spec_version: 214, impl_version: 0, apis: RUNTIME_API_VERSIONS, }; @@ -476,7 +476,7 @@ parameter_types! { } impl pallet_finality_tracker::Trait for Runtime { - type OnFinalizationStalled = Grandpa; + type OnFinalizationStalled = (); type WindowSize = WindowSize; type ReportLatency = ReportLatency; } -- GitLab From c9e8aa3a8e6a2b3a049c2a84dd7ccbcb7d90ac1f Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 6 Feb 2020 13:07:52 +0100 Subject: [PATCH 256/296] do join_all (#4832) --- client/transaction-pool/graph/src/pool.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index 815b5871ea..91ce58518a 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -378,8 +378,13 @@ impl Pool { let block_number = self.resolve_block_number(at)?; let mut result = HashMap::new(); - for xt in xts { - let (hash, validated_tx) = self.verify_one(at, block_number, xt, force).await; + for (hash, validated_tx) in + futures::future::join_all( + xts.into_iter() + .map(|xt| self.verify_one(at, block_number, xt, force)) + ) + .await + { result.insert(hash, validated_tx); } -- GitLab From 3fc91c76b1ed62a8db9d6b78910e8b7d7c928911 Mon Sep 17 00:00:00 2001 From: Jimmy Chu Date: Thu, 6 Feb 2020 20:13:44 +0800 Subject: [PATCH 257/296] Node template folders restructuring (#4811) * Restructure node-template so it is clear that node, runtime, and pallets are separated * Separating to mock and tests * restructuring runtime to top-level * updated release script * updated Cargo.lock --- .maintain/node-template-release/src/main.rs | 16 +++- Cargo.lock | 14 +++ Cargo.toml | 3 +- bin/node-template/Cargo.toml | 37 -------- bin/node-template/node/Cargo.toml | 38 ++++++++ bin/node-template/{ => node}/build.rs | 0 .../{ => node}/src/chain_spec.rs | 0 bin/node-template/{ => node}/src/cli.rs | 0 bin/node-template/{ => node}/src/command.rs | 0 bin/node-template/{ => node}/src/main.rs | 0 bin/node-template/{ => node}/src/service.rs | 0 bin/node-template/pallets/template/Cargo.toml | 44 ++++++++++ .../template/src/lib.rs} | 88 ++----------------- .../pallets/template/src/mock.rs | 52 +++++++++++ .../pallets/template/src/tests.rs | 26 ++++++ bin/node-template/runtime/Cargo.toml | 7 +- bin/node-template/runtime/src/lib.rs | 6 +- 17 files changed, 205 insertions(+), 126 deletions(-) delete mode 100644 bin/node-template/Cargo.toml create mode 100644 bin/node-template/node/Cargo.toml rename bin/node-template/{ => node}/build.rs (100%) rename bin/node-template/{ => node}/src/chain_spec.rs (100%) rename bin/node-template/{ => node}/src/cli.rs (100%) rename bin/node-template/{ => node}/src/command.rs (100%) rename bin/node-template/{ => node}/src/main.rs (100%) rename bin/node-template/{ => node}/src/service.rs (100%) create mode 100644 bin/node-template/pallets/template/Cargo.toml rename bin/node-template/{runtime/src/template.rs => pallets/template/src/lib.rs} (59%) create mode 100644 bin/node-template/pallets/template/src/mock.rs create mode 100644 bin/node-template/pallets/template/src/tests.rs diff --git a/.maintain/node-template-release/src/main.rs b/.maintain/node-template-release/src/main.rs index db42b155e6..a1d85bf33f 100644 --- a/.maintain/node-template-release/src/main.rs +++ b/.maintain/node-template-release/src/main.rs @@ -1,7 +1,7 @@ use structopt::StructOpt; use std::{ - path::{PathBuf, Path}, collections::HashMap, fs::{File, self}, io::{Read, Write}, + path::{PathBuf, Path}, collections::HashMap, fs::{File, OpenOptions, self}, io::{Read, Write}, process::Command }; @@ -88,7 +88,7 @@ fn replace_path_dependencies_with_git(cargo_toml_path: &Path, commit_id: &str, c // remove `Cargo.toml` cargo_toml_path.pop(); - for &table in &["dependencies", "build-dependencies"] { + for &table in &["dependencies", "build-dependencies", "dev-dependencies"] { let mut dependencies: toml::value::Table = match cargo_toml .remove(table) .and_then(|v| v.try_into().ok()) { @@ -212,11 +212,21 @@ fn main() { let node_template_path = build_dir.path().join(node_template_folder); copy_node_template(&options.node_template, build_dir.path()); - let cargo_tomls = find_cargo_tomls(build_dir.path().to_owned()); + let mut cargo_tomls = find_cargo_tomls(build_dir.path().to_owned()); let commit_id = get_git_commit_id(&options.node_template); let top_level_cargo_toml_path = node_template_path.join("Cargo.toml"); + // Check if top level Cargo.toml exists. If not, create one in the destination + if !cargo_tomls.contains(&top_level_cargo_toml_path) { + // create the top_level_cargo_toml + OpenOptions::new().create(true).write(true).open(top_level_cargo_toml_path.clone()) + .expect("Create root level `Cargo.toml` failed."); + + // push into our data structure + cargo_tomls.push(PathBuf::from(top_level_cargo_toml_path.clone())); + } + cargo_tomls.iter().for_each(|t| { let mut cargo_toml = parse_cargo_toml(&t); replace_path_dependencies_with_git(&t, &commit_id, &mut cargo_toml); diff --git a/Cargo.lock b/Cargo.lock index ed97668987..f521817b2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3554,6 +3554,7 @@ dependencies = [ "pallet-indices", "pallet-randomness-collective-flip", "pallet-sudo", + "pallet-template", "pallet-timestamp", "pallet-transaction-payment", "parity-scale-codec", @@ -4337,6 +4338,19 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-template" +version = "2.0.0" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "safe-mix", + "sp-core", + "sp-io", + "sp-runtime", +] + [[package]] name = "pallet-timestamp" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index 0bd6b4c0b0..552f1eadc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,8 @@ [workspace] members = [ - "bin/node-template", + "bin/node-template/node", "bin/node-template/runtime", + "bin/node-template/pallets/template", "bin/node/cli", "bin/node/executor", "bin/node/primitives", diff --git a/bin/node-template/Cargo.toml b/bin/node-template/Cargo.toml deleted file mode 100644 index 7001099b0b..0000000000 --- a/bin/node-template/Cargo.toml +++ /dev/null @@ -1,37 +0,0 @@ -[package] -name = "node-template" -version = "2.0.0" -authors = ["Anonymous"] -build = "build.rs" -edition = "2018" -license = "Unlicense" - -[[bin]] -name = "node-template" -path = "src/main.rs" - -[dependencies] -futures = "0.3.1" -log = "0.4.8" -sc-cli = { version = "0.8.0", path = "../../client/cli" } -sp-core = { version = "2.0.0", path = "../../primitives/core" } -sc-executor = { version = "0.8", path = "../../client/executor" } -sc-service = { version = "0.8", path = "../../client/service" } -sp-inherents = { version = "2.0.0", path = "../../primitives/inherents" } -sc-transaction-pool = { version = "2.0.0", path = "../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } -sc-network = { version = "0.8", path = "../../client/network" } -sc-consensus-aura = { version = "0.8", path = "../../client/consensus/aura" } -sp-consensus-aura = { version = "0.8", path = "../../primitives/consensus/aura" } -sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" } -grandpa = { version = "0.8", package = "sc-finality-grandpa", path = "../../client/finality-grandpa" } -grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } -sc-client = { version = "0.8", path = "../../client/" } -node-template-runtime = { version = "2.0.0", path = "runtime" } -sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } -sc-basic-authorship = { path = "../../client/basic-authorship" } -structopt = "0.3.8" - -[build-dependencies] -vergen = "3.0.4" -build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../utils/build-script-utils" } diff --git a/bin/node-template/node/Cargo.toml b/bin/node-template/node/Cargo.toml new file mode 100644 index 0000000000..9ad4a0e8a5 --- /dev/null +++ b/bin/node-template/node/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "node-template" +version = "2.0.0" +authors = ["Anonymous"] +edition = "2018" +license = "Unlicense" +build = "build.rs" + +[[bin]] +name = "node-template" + +[dependencies] +futures = "0.3.1" +log = "0.4.8" +structopt = "0.3.8" + +sc-cli = { version = "0.8.0", path = "../../../client/cli" } +sp-core = { version = "2.0.0", path = "../../../primitives/core" } +sc-executor = { version = "0.8", path = "../../../client/executor" } +sc-service = { version = "0.8", path = "../../../client/service" } +sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } +sc-transaction-pool = { version = "2.0.0", path = "../../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } +sc-network = { version = "0.8", path = "../../../client/network" } +sc-consensus-aura = { version = "0.8", path = "../../../client/consensus/aura" } +sp-consensus-aura = { version = "0.8", path = "../../../primitives/consensus/aura" } +sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } +grandpa = { version = "0.8", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } +grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } +sc-client = { version = "0.8", path = "../../../client/" } +sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } +sc-basic-authorship = { path = "../../../client/basic-authorship" } + +node-template-runtime = { version = "2.0.0", path = "../runtime" } + +[build-dependencies] +vergen = "3.0.4" +build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../../utils/build-script-utils" } diff --git a/bin/node-template/build.rs b/bin/node-template/node/build.rs similarity index 100% rename from bin/node-template/build.rs rename to bin/node-template/node/build.rs diff --git a/bin/node-template/src/chain_spec.rs b/bin/node-template/node/src/chain_spec.rs similarity index 100% rename from bin/node-template/src/chain_spec.rs rename to bin/node-template/node/src/chain_spec.rs diff --git a/bin/node-template/src/cli.rs b/bin/node-template/node/src/cli.rs similarity index 100% rename from bin/node-template/src/cli.rs rename to bin/node-template/node/src/cli.rs diff --git a/bin/node-template/src/command.rs b/bin/node-template/node/src/command.rs similarity index 100% rename from bin/node-template/src/command.rs rename to bin/node-template/node/src/command.rs diff --git a/bin/node-template/src/main.rs b/bin/node-template/node/src/main.rs similarity index 100% rename from bin/node-template/src/main.rs rename to bin/node-template/node/src/main.rs diff --git a/bin/node-template/src/service.rs b/bin/node-template/node/src/service.rs similarity index 100% rename from bin/node-template/src/service.rs rename to bin/node-template/node/src/service.rs diff --git a/bin/node-template/pallets/template/Cargo.toml b/bin/node-template/pallets/template/Cargo.toml new file mode 100644 index 0000000000..8ea3f3adab --- /dev/null +++ b/bin/node-template/pallets/template/Cargo.toml @@ -0,0 +1,44 @@ +[package] +authors = ['Anonymous'] +edition = '2018' +name = 'pallet-template' +version = '2.0.0' + +[dependencies] +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +safe-mix = { default-features = false, version = '1.0.0' } + +[dependencies.frame-support] +default-features = false +version = '2.0.0' +path = "../../../../frame/support" + +[dependencies.system] +default-features = false +package = 'frame-system' +version = '2.0.0' +path = "../../../../frame/system" + +[dev-dependencies.sp-core] +default-features = false +version = '2.0.0' +path = "../../../../primitives/core" + +[dev-dependencies.sp-io] +default-features = false +version = '2.0.0' +path = "../../../../primitives/io" + +[dev-dependencies.sp-runtime] +default-features = false +version = '2.0.0' +path = "../../../../primitives/runtime" + +[features] +default = ['std'] +std = [ + 'codec/std', + 'frame-support/std', + 'safe-mix/std', + 'system/std' +] diff --git a/bin/node-template/runtime/src/template.rs b/bin/node-template/pallets/template/src/lib.rs similarity index 59% rename from bin/node-template/runtime/src/template.rs rename to bin/node-template/pallets/template/src/lib.rs index 4ed8066578..a1615b4c1f 100644 --- a/bin/node-template/runtime/src/template.rs +++ b/bin/node-template/pallets/template/src/lib.rs @@ -1,16 +1,23 @@ +#![cfg_attr(not(feature = "std"), no_std)] + /// A runtime module template with necessary imports /// Feel free to remove or edit this file as needed. /// If you change the name of this file, make sure to update its references in runtime/src/lib.rs /// If you remove this file, you can remove those references - /// For more guidance on Substrate modules, see the example module /// https://github.com/paritytech/substrate/blob/master/frame/example/src/lib.rs use frame_support::{decl_module, decl_storage, decl_event, decl_error, dispatch}; use system::ensure_signed; +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod tests; + /// The pallet's configuration trait. pub trait Trait: system::Trait { // Add other types and constants required to configure this pallet. @@ -95,82 +102,3 @@ decl_module! { } } } - - -/// Tests for this pallet -#[cfg(test)] -mod tests { - use super::*; - - use sp_core::H256; - use frame_support::{impl_outer_origin, assert_ok, assert_noop, parameter_types, weights::Weight}; - use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, testing::Header, Perbill, - }; - - impl_outer_origin! { - pub enum Origin for Test {} - } - - // For testing the module, we construct most of a mock runtime. This means - // first constructing a configuration type (`Test`) which `impl`s each of the - // configuration traits of modules we want to use. - #[derive(Clone, Eq, PartialEq)] - pub struct Test; - parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const MaximumBlockWeight: Weight = 1024; - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); - } - impl system::Trait for Test { - type Origin = Origin; - type Call = (); - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = (); - type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; - type Version = (); - type ModuleToIndex = (); - } - impl Trait for Test { - type Event = (); - } - type TemplateModule = Module; - - // This function basically just builds a genesis storage key/value store according to - // our desired mockup. - fn new_test_ext() -> sp_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().into() - } - - #[test] - fn it_works_for_default_value() { - new_test_ext().execute_with(|| { - // Just a dummy test for the dummy funtion `do_something` - // calling the `do_something` function with a value 42 - assert_ok!(TemplateModule::do_something(Origin::signed(1), 42)); - // asserting that the stored value is equal to what we stored - assert_eq!(TemplateModule::something(), Some(42)); - }); - } - - #[test] - fn correct_error_for_none_value() { - new_test_ext().execute_with(|| { - // Ensure the correct error is thrown on None value - assert_noop!( - TemplateModule::cause_error(Origin::signed(1)), - Error::::NoneValue - ); - }); - } -} diff --git a/bin/node-template/pallets/template/src/mock.rs b/bin/node-template/pallets/template/src/mock.rs new file mode 100644 index 0000000000..2cbfc89d5b --- /dev/null +++ b/bin/node-template/pallets/template/src/mock.rs @@ -0,0 +1,52 @@ +// Creating mock runtime here + +use crate::{Module, Trait}; +use sp_core::H256; +use frame_support::{impl_outer_origin, parameter_types, weights::Weight}; +use sp_runtime::{ + traits::{BlakeTwo256, IdentityLookup}, testing::Header, Perbill, +}; + +impl_outer_origin! { + pub enum Origin for Test {} +} + +// For testing the module, we construct most of a mock runtime. This means +// first constructing a configuration type (`Test`) which `impl`s each of the +// configuration traits of modules we want to use. +#[derive(Clone, Eq, PartialEq)] +pub struct Test; +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); +} +impl system::Trait for Test { + type Origin = Origin; + type Call = (); + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type ModuleToIndex = (); +} +impl Trait for Test { + type Event = (); +} +pub type TemplateModule = Module; + +// This function basically just builds a genesis storage key/value store according to +// our desired mockup. +pub fn new_test_ext() -> sp_io::TestExternalities { + system::GenesisConfig::default().build_storage::().unwrap().into() +} diff --git a/bin/node-template/pallets/template/src/tests.rs b/bin/node-template/pallets/template/src/tests.rs new file mode 100644 index 0000000000..44a423c948 --- /dev/null +++ b/bin/node-template/pallets/template/src/tests.rs @@ -0,0 +1,26 @@ +// Tests to be written here + +use crate::{Error, mock::*}; +use frame_support::{assert_ok, assert_noop}; + +#[test] +fn it_works_for_default_value() { + new_test_ext().execute_with(|| { + // Just a dummy test for the dummy funtion `do_something` + // calling the `do_something` function with a value 42 + assert_ok!(TemplateModule::do_something(Origin::signed(1), 42)); + // asserting that the stored value is equal to what we stored + assert_eq!(TemplateModule::something(), Some(42)); + }); +} + +#[test] +fn correct_error_for_none_value() { + new_test_ext().execute_with(|| { + // Ensure the correct error is thrown on None value + assert_noop!( + TemplateModule::cause_error(Origin::signed(1)), + Error::::NoneValue + ); + }); +} diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index 299e78996a..ddecb0e4cf 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -6,6 +6,8 @@ edition = "2018" license = "Unlicense" [dependencies] +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } + aura = { version = "2.0.0", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } balances = { version = "2.0.0", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } frame-support = { version = "2.0.0", default-features = false, path = "../../../frame/support" } @@ -16,8 +18,6 @@ sudo = { version = "2.0.0", default-features = false, package = "pallet-sudo", p system = { version = "2.0.0", default-features = false, package = "frame-system", path = "../../../frame/system" } timestamp = { version = "2.0.0", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } transaction-payment = { version = "2.0.0", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } - -codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } frame-executive = { version = "2.0.0", default-features = false, path = "../../../frame/executive" } serde = { version = "1.0.101", optional = true, features = ["derive"] } sp-api = { version = "2.0.0", default-features = false, path = "../../../primitives/api" } @@ -33,6 +33,8 @@ sp-std = { version = "2.0.0", default-features = false, path = "../../../primiti sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../../../primitives/transaction-pool" } sp-version = { version = "2.0.0", default-features = false, path = "../../../primitives/version" } +template = { version = "2.0.0", default-features = false, path = "../pallets/template", package = "pallet-template" } + [build-dependencies] wasm-builder-runner = { version = "1.0.4", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } @@ -64,4 +66,5 @@ std = [ "system/std", "timestamp/std", "transaction-payment/std", + "template/std", ] diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index ea4535e26d..a863ec40a7 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -37,6 +37,9 @@ pub use frame_support::{ weights::Weight, }; +/// Importing a template pallet +pub use template; + /// An index to a block. pub type BlockNumber = u32; @@ -63,9 +66,6 @@ pub type Hash = sp_core::H256; /// Digest item type. pub type DigestItem = generic::DigestItem; -/// Used for the module template in `./template.rs` -mod template; - /// Opaque types. These are used by the CLI to instantiate machinery that don't need to know /// the specifics of the runtime. They can then be made to be agnostic over specific formats /// of data like extrinsics, allowing for them to continue syncing the network through upgrades -- GitLab From 666b1c9f86258c48d65efb50f1e86ac25b25332e Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 6 Feb 2020 14:06:53 +0100 Subject: [PATCH 258/296] Fixed a few warnings (#4841) --- client/cli/src/node_key.rs | 3 ++- client/network/src/behaviour.rs | 2 +- frame/authority-discovery/src/lib.rs | 1 - frame/executive/src/lib.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/cli/src/node_key.rs b/client/cli/src/node_key.rs index 88102acc63..4401481ca5 100644 --- a/client/cli/src/node_key.rs +++ b/client/cli/src/node_key.rs @@ -91,9 +91,10 @@ where net_config_dir.as_ref().map(|d| d.as_ref().join(name)) } +#[cfg(test)] mod tests { - use super::*; use sc_network::config::identity::ed25519; + use super::*; #[test] fn tests_node_name_good() { diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index c31fd84eff..8b903cec35 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -25,7 +25,7 @@ use libp2p::core::{Multiaddr, PeerId, PublicKey}; use libp2p::kad::record; use libp2p::swarm::{NetworkBehaviourAction, NetworkBehaviourEventProcess}; use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; -use log::{debug, warn}; +use log::debug; use sp_consensus::{BlockOrigin, import_queue::{IncomingBlock, Origin}}; use sp_runtime::{traits::{Block as BlockT, NumberFor}, Justification}; use std::{iter, task::Context, task::Poll}; diff --git a/frame/authority-discovery/src/lib.rs b/frame/authority-discovery/src/lib.rs index c427043397..22ea3d3bba 100644 --- a/frame/authority-discovery/src/lib.rs +++ b/frame/authority-discovery/src/lib.rs @@ -103,7 +103,6 @@ mod tests { use frame_support::{impl_outer_origin, parameter_types, weights::Weight}; type AuthorityDiscovery = Module; - type SessionIndex = u32; #[derive(Clone, Eq, PartialEq)] pub struct Test; diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 936da70211..93db141856 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -357,7 +357,7 @@ mod tests { use sp_core::H256; use sp_runtime::{ generic::Era, Perbill, DispatchError, testing::{Digest, Header, Block}, - traits::{Bounded, Header as HeaderT, BlakeTwo256, IdentityLookup, ConvertInto}, + traits::{Header as HeaderT, BlakeTwo256, IdentityLookup, ConvertInto}, transaction_validity::{InvalidTransaction, UnknownTransaction, TransactionValidityError}, }; use frame_support::{ -- GitLab From 7d83cabf678a0cd51d017b5dcf59d1a5de376a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 6 Feb 2020 14:26:41 +0100 Subject: [PATCH 259/296] Fix memory leak in runtime interface (#4837) * Fix memory leak in runtime interface We used `slice::from_raw_parts` in runtime-interface which did not free the memory afterwards. This pr changes it to `Vec::from_raw_parts` to make sure `drop` is called properly and the values are freed. * Check that `len` is non-zero * Adds comment --- primitives/runtime-interface/src/impls.rs | 19 +++++----- primitives/runtime-interface/src/pass_by.rs | 11 ++++-- .../runtime-interface/test-wasm/src/lib.rs | 35 +++++++++++++++++++ primitives/runtime-interface/test/src/lib.rs | 15 ++++++++ 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index 35bd96bd05..084b5e11eb 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -38,9 +38,6 @@ use sp_std::{any::TypeId, mem, vec::Vec}; #[cfg(feature = "std")] use sp_std::borrow::Cow; -#[cfg(not(feature = "std"))] -use sp_std::{slice, boxed::Box}; - // Make sure that our assumptions for storing a pointer + its size in `u64` is valid. #[cfg(all(not(feature = "std"), not(feature = "disable_target_static_assertions")))] assert_eq_size!(usize, u32); @@ -196,11 +193,16 @@ impl FromFFIValue for Vec { let (ptr, len) = unpack_ptr_and_len(arg); let len = len as usize; + if len == 0 { + return Vec::new(); + } + + let data = unsafe { Vec::from_raw_parts(ptr as *mut u8, len, len) }; + if TypeId::of::() == TypeId::of::() { - unsafe { mem::transmute(Vec::from_raw_parts(ptr as *mut u8, len, len)) } + unsafe { mem::transmute(data) } } else { - let slice = unsafe { slice::from_raw_parts(ptr as *const u8, len) }; - Self::decode(&mut &slice[..]).expect("Host to wasm values are encoded correctly; qed") + Self::decode(&mut &data[..]).expect("Host to wasm values are encoded correctly; qed") } } } @@ -302,10 +304,9 @@ macro_rules! impl_traits_for_arrays { impl FromFFIValue for [u8; $n] { fn from_ffi_value(arg: u32) -> [u8; $n] { let mut res = [0u8; $n]; - res.copy_from_slice(unsafe { slice::from_raw_parts(arg as *const u8, $n) }); + let data = unsafe { Vec::from_raw_parts(arg as *mut u8, $n, $n) }; - // Make sure we free the pointer. - let _ = unsafe { Box::from_raw(arg as *mut u8) }; + res.copy_from_slice(&data); res } diff --git a/primitives/runtime-interface/src/pass_by.rs b/primitives/runtime-interface/src/pass_by.rs index 597a0284ee..d6767b5ebb 100644 --- a/primitives/runtime-interface/src/pass_by.rs +++ b/primitives/runtime-interface/src/pass_by.rs @@ -32,7 +32,7 @@ use sp_wasm_interface::{FunctionContext, Pointer, Result}; use sp_std::{marker::PhantomData, convert::TryFrom}; #[cfg(not(feature = "std"))] -use sp_std::{slice, vec::Vec}; +use sp_std::vec::Vec; /// Derive macro for implementing [`PassBy`] with the [`Codec`] strategy. /// @@ -255,8 +255,13 @@ impl PassByImpl for Codec { let (ptr, len) = unpack_ptr_and_len(arg); let len = len as usize; - let slice = unsafe { slice::from_raw_parts(ptr as *const u8, len) }; - T::decode(&mut &slice[..]).expect("Host to wasm values are encoded correctly; qed") + let encoded = if len == 0 { + Vec::new() + } else { + unsafe { Vec::from_raw_parts(ptr as *mut u8, len, len) } + }; + + T::decode(&mut &encoded[..]).expect("Host to wasm values are encoded correctly; qed") } } diff --git a/primitives/runtime-interface/test-wasm/src/lib.rs b/primitives/runtime-interface/test-wasm/src/lib.rs index 67fbfdcfec..c6e2c9909f 100644 --- a/primitives/runtime-interface/test-wasm/src/lib.rs +++ b/primitives/runtime-interface/test-wasm/src/lib.rs @@ -39,6 +39,17 @@ pub trait TestApi { data } + /// Returns 16kb data. + /// + /// # Note + /// + /// We return a `Vec` because this will use the code path that uses SCALE + /// to pass the data between native/wasm. (Vec is passed without encoding the + /// data) + fn return_16kb() -> Vec { + vec![0; 4 * 1024] + } + /// Set the storage at key with value. fn set_storage(&mut self, key: &[u8], data: &[u8]) { self.place_storage(key.to_vec(), Some(data.to_vec())); @@ -211,4 +222,28 @@ wasm_export_functions! { assert_eq!(*val, test_api::get_and_return_i128(*val)); } } + + fn test_vec_return_value_memory_is_freed() { + let mut len = 0; + for _ in 0..1024 { + len += test_api::return_16kb().len(); + } + assert_eq!(1024 * 1024 * 4, len); + } + + fn test_encoded_return_value_memory_is_freed() { + let mut len = 0; + for _ in 0..1024 { + len += test_api::return_option_input(vec![0; 16 * 1024]).map(|v| v.len()).unwrap(); + } + assert_eq!(1024 * 1024 * 16, len); + } + + fn test_array_return_value_memory_is_freed() { + let mut len = 0; + for _ in 0..1024 * 1024 { + len += test_api::get_and_return_array([0; 34])[1]; + } + assert_eq!(0, len); + } } diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index 48c120b2c9..559a4281e0 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -113,3 +113,18 @@ fn test_overwrite_native_function_implementation() { fn test_u128_i128_as_parameter_and_return_value() { call_wasm_method::("test_u128_i128_as_parameter_and_return_value"); } + +#[test] +fn test_vec_return_value_memory_is_freed() { + call_wasm_method::("test_vec_return_value_memory_is_freed"); +} + +#[test] +fn test_encoded_return_value_memory_is_freed() { + call_wasm_method::("test_encoded_return_value_memory_is_freed"); +} + +#[test] +fn test_array_return_value_memory_is_freed() { + call_wasm_method::("test_array_return_value_memory_is_freed"); +} -- GitLab From faf608eeeda0031629f7608321c7ab41fac6024f Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Thu, 6 Feb 2020 14:48:19 +0100 Subject: [PATCH 260/296] Fix broken factory by adding keystore back. (#4840) --- bin/node/cli/src/command.rs | 2 ++ client/cli/src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 3395717f2f..7a22710ec1 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -50,6 +50,8 @@ where cli_args.shared_params.dev, )?; + sc_cli::fill_config_keystore_in_memory(&mut config)?; + match ChainSpec::from(config.expect_chain_spec().id()) { Some(ref c) if c == &ChainSpec::Development || c == &ChainSpec::LocalTestnet => {}, _ => panic!("Factory is only supported for development and local testnet."), diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index c602d52ed9..785a6fb073 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -445,7 +445,7 @@ fn input_keystore_password() -> Result { } /// Use in memory keystore config when it is not required at all. -fn fill_config_keystore_in_memory(config: &mut sc_service::Configuration) +pub fn fill_config_keystore_in_memory(config: &mut sc_service::Configuration) -> Result<(), String> { match &mut config.keystore { -- GitLab From 099cd0f2ba2a041f087978ef9d53473d0a6d0aee Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 6 Feb 2020 15:46:49 +0100 Subject: [PATCH 261/296] CLI improvements & fixes (#4812) These are a few changes I missed during the refactoring. 1. Initialization issue and boilerplate Most importantly: part of the `Configuration` initialization was done in `sc_cli::init`. This means the user can not benefit from this initialization boilerplate if they have multiple `Configuration` since `sc_cli::init` can only be called once. 2. Boilerplate for `VersionInfo` and `Configuration` I'm also answering to the critic of @bkchr on the initialization using version: https://github.com/paritytech/substrate/pull/4692/files/bea809d4c14a2ede953227ac885e3b3f9771c548#r372047238 This will allow initializing a `Configuration` and provide the version by default. 3. Loading the `chain_spec` explicitly In the past it was done automatically but in some cases we want to delay this. I moved the code to `Configuration.load_spec()` so it can be called later on. `chain_spec` can also be written directly to the `Configuration` without using this `load_spec` helper. 4. [deleted] 5. Fixing issue that prevents the user to override the port In the refactoring I introduced a bug by mistake that could potentially prevent the CLI user to override the ports if defaults where provided for these ports (only on cumulus). 6. Change task_executor from Box to Arc This is useful for cumulus where we have 2 nodes with 2 separate Configuration that need to spawn tasks to the same runtime. 7. Renamed TasksExecutorRequired to TaskExecutor For consistency. This is related to https://github.com/paritytech/cumulus/issues/24 This is the continuation (and hopefully the end of) #4692 --- .gitlab-ci.yml | 9 - .maintain/check_for_exit.sh | 16 -- Cargo.lock | 74 ++++++- bin/node-template/node/src/command.rs | 3 +- bin/node/cli/Cargo.toml | 2 + bin/node/cli/src/command.rs | 7 +- .../tests/running_the_node_and_interrupt.rs | 58 ++++++ client/cli/src/lib.rs | 193 +++++++++++------- client/cli/src/params.rs | 5 +- client/cli/src/runtime.rs | 6 +- client/service/src/builder.rs | 6 +- client/service/src/config.rs | 56 ++++- client/service/src/error.rs | 2 +- client/service/src/lib.rs | 2 +- client/service/test/src/lib.rs | 12 +- utils/browser/src/lib.rs | 6 +- 16 files changed, 321 insertions(+), 136 deletions(-) delete mode 100755 .maintain/check_for_exit.sh create mode 100644 bin/node/cli/tests/running_the_node_and_interrupt.rs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 828c830948..ced3e33eaa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -235,15 +235,6 @@ check-web-wasm: - time cargo build --manifest-path=bin/node/cli/Cargo.toml --no-default-features --features "browser" --target=wasm32-unknown-unknown - sccache -s -node-exits: - stage: test - <<: *docker-env - except: - - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 - script: - - ./.maintain/check_for_exit.sh - - test-full-crypto-feature: stage: test <<: *docker-env diff --git a/.maintain/check_for_exit.sh b/.maintain/check_for_exit.sh deleted file mode 100755 index edc2130e57..0000000000 --- a/.maintain/check_for_exit.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -# Script that checks that a node exits after `SIGINT` was send. - -set -e - -cargo build -./target/debug/substrate --dev & -PID=$! - -# Let the chain running for 60 seconds -sleep 60 - -# Send `SIGINT` and give the process 30 seconds to end -kill -INT $PID -timeout 30 tail --pid=$PID -f /dev/null diff --git a/Cargo.lock b/Cargo.lock index f521817b2c..3f94778b84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -150,6 +150,19 @@ dependencies = [ "syn", ] +[[package]] +name = "assert_cmd" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6283bac8dd7226470d491bc4737816fea4ca1fba7a2847f2e9097fd6bfb4624c" +dependencies = [ + "doc-comment", + "escargot", + "predicates", + "predicates-core", + "predicates-tree", +] + [[package]] name = "assert_matches" version = "1.3.0" @@ -1227,6 +1240,18 @@ dependencies = [ "libc", ] +[[package]] +name = "escargot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74cf96bec282dcdb07099f7e31d9fed323bca9435a09aba7b6d99b7617bca96d" +dependencies = [ + "lazy_static", + "log 0.4.8", + "serde", + "serde_json", +] + [[package]] name = "evm" version = "0.14.2" @@ -3318,10 +3343,24 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "nix" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "void", +] + [[package]] name = "node-cli" version = "2.0.0" dependencies = [ + "assert_cmd", "browser-utils", "frame-support", "frame-system", @@ -3329,6 +3368,7 @@ dependencies = [ "hex-literal", "jsonrpc-core", "log 0.4.8", + "nix", "node-executor", "node-primitives", "node-rpc", @@ -4816,6 +4856,32 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" +[[package]] +name = "predicates" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9bfe52247e5cc9b2f943682a85a5549fb9662245caf094504e69a2f03fe64d4" +dependencies = [ + "difference", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178" + +[[package]] +name = "predicates-tree" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124" +dependencies = [ + "predicates-core", + "treeline", +] + [[package]] name = "pretty_assertions" version = "0.6.1" @@ -8118,6 +8184,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" +[[package]] +name = "treeline" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" + [[package]] name = "trie-bench" version = "0.19.0" @@ -8204,7 +8276,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bfd5b7557925ce778ff9b9ef90e3ade34c524b5ff10e239c69a42d546d2af56" dependencies = [ - "rand 0.3.23", + "rand 0.7.3", ] [[package]] diff --git a/bin/node-template/node/src/command.rs b/bin/node-template/node/src/command.rs index 86058929b0..585b8e1ca8 100644 --- a/bin/node-template/node/src/command.rs +++ b/bin/node-template/node/src/command.rs @@ -25,8 +25,7 @@ pub fn run(version: VersionInfo) -> error::Result<()> { let opt = sc_cli::from_args::(&version); - let mut config = sc_service::Configuration::default(); - config.impl_name = "node-template"; + let config = sc_service::Configuration::new(&version); match opt.subcommand { Some(subcommand) => sc_cli::run_subcommand( diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index ef6e90f91a..cf666ffdc5 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -95,6 +95,8 @@ sc-consensus-babe = { version = "0.8", features = ["test-helpers"], path = "../. sc-service-test = { version = "2.0.0", path = "../../../client/service/test" } futures = "0.3.1" tempfile = "3.1.0" +assert_cmd = "0.12" +nix = "0.17" [build-dependencies] build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../../utils/build-script-utils" } diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 7a22710ec1..eb18d6d8b3 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -28,8 +28,7 @@ where let args: Vec<_> = args.collect(); let opt = sc_cli::from_iter::(args.clone(), &version); - let mut config = sc_service::Configuration::default(); - config.impl_name = "substrate-node"; + let mut config = sc_service::Configuration::new(&version); match opt.subcommand { None => sc_cli::run( @@ -41,8 +40,8 @@ where &version, ), Some(Subcommand::Factory(cli_args)) => { - sc_cli::init(&mut config, load_spec, &cli_args.shared_params, &version)?; - + sc_cli::init(&cli_args.shared_params, &version)?; + sc_cli::load_spec(&mut config, &cli_args.shared_params, load_spec)?; sc_cli::fill_import_params( &mut config, &cli_args.import_params, diff --git a/bin/node/cli/tests/running_the_node_and_interrupt.rs b/bin/node/cli/tests/running_the_node_and_interrupt.rs new file mode 100644 index 0000000000..6b0d696396 --- /dev/null +++ b/bin/node/cli/tests/running_the_node_and_interrupt.rs @@ -0,0 +1,58 @@ +// Copyright 2020 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 assert_cmd::cargo::cargo_bin; +use std::convert::TryInto; +use std::process::{Child, Command, ExitStatus}; +use std::thread::sleep; +use std::time::Duration; + +#[test] +#[cfg(unix)] +fn running_the_node_works_and_can_be_interrupted() { + use nix::sys::signal::{kill, Signal::{self, SIGINT, SIGTERM}}; + use nix::unistd::Pid; + + fn wait_for(child: &mut Child, secs: usize) -> Option { + for _ in 0..secs { + match child.try_wait().unwrap() { + Some(status) => return Some(status), + None => sleep(Duration::from_secs(1)), + } + } + eprintln!("Took to long to exit. Killing..."); + let _ = child.kill(); + child.wait().unwrap(); + + None + } + + fn run_command_and_kill(signal: Signal) { + let mut cmd = Command::new(cargo_bin("substrate")).spawn().unwrap(); + sleep(Duration::from_secs(30)); + assert!(cmd.try_wait().unwrap().is_none(), "the process should still be running"); + kill(Pid::from_raw(cmd.id().try_into().unwrap()), signal).unwrap(); + assert_eq!( + wait_for(&mut cmd, 30).map(|x| x.success()), + Some(true), + "the pocess must exit gracefully after signal {}", + signal, + ); + } + + run_command_and_kill(SIGINT); + run_command_and_kill(SIGTERM); +} diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 785a6fb073..7f72689336 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -35,6 +35,7 @@ use sc_service::{ RuntimeGenesis, ChainSpecExtension, PruningMode, ChainSpec, AbstractService, Roles as ServiceRoles, }; +pub use sc_service::config::VersionInfo; use sc_network::{ self, multiaddr::Protocol, @@ -74,32 +75,11 @@ const DEFAULT_NETWORK_CONFIG_PATH : &'static str = "network"; /// default sub directory to store database const DEFAULT_DB_CONFIG_PATH : &'static str = "db"; /// default sub directory for the key store -const DEFAULT_KEYSTORE_CONFIG_PATH : &'static str = "keystore"; +const DEFAULT_KEYSTORE_CONFIG_PATH : &'static str = "keystore"; /// The maximum number of characters for a node name. const NODE_NAME_MAX_LENGTH: usize = 32; -/// Executable version. Used to pass version information from the root crate. -#[derive(Clone)] -pub struct VersionInfo { - /// Implementaiton name. - pub name: &'static str, - /// Implementation version. - pub version: &'static str, - /// SCM Commit hash. - pub commit: &'static str, - /// Executable file name. - pub executable_name: &'static str, - /// Executable file description. - pub description: &'static str, - /// Executable file author. - pub author: &'static str, - /// Support URL. - pub support_url: &'static str, - /// Copyright starting year (x-current year) - pub copyright_start_year: i32, -} - fn get_chain_key(cli: &SharedParams) -> String { match cli.chain { Some(ref chain) => chain.clone(), @@ -120,8 +100,12 @@ fn generate_node_name() -> String { result } -/// Load spec give shared params and spec factory. -pub fn load_spec(cli: &SharedParams, factory: F) -> error::Result> where +/// Load spec to `Configuration` from shared params and spec factory. +pub fn load_spec<'a, G, E, F>( + mut config: &'a mut Configuration, + cli: &SharedParams, + factory: F, +) -> error::Result<&'a ChainSpec> where G: RuntimeGenesis, E: ChainSpecExtension, F: FnOnce(&str) -> Result>, String>, @@ -131,7 +115,13 @@ pub fn load_spec(cli: &SharedParams, factory: F) -> error::Result spec, None => ChainSpec::from_json_file(PathBuf::from(chain_key))? }; - Ok(spec) + + config.network.boot_nodes = spec.boot_nodes().to_vec(); + config.telemetry_endpoints = spec.telemetry_endpoints().clone(); + + config.chain_spec = Some(spec); + + Ok(config.chain_spec.as_ref().unwrap()) } fn base_path(cli: &SharedParams, version: &VersionInfo) -> PathBuf { @@ -243,8 +233,8 @@ where SL: AbstractService + Unpin, SF: AbstractService + Unpin, { - init(&mut config, spec_factory, &run_cmd.shared_params, version)?; - + init(&run_cmd.shared_params, version)?; + load_spec(&mut config, &run_cmd.shared_params, spec_factory)?; run_cmd.run(config, new_light, new_full, version) } @@ -266,30 +256,21 @@ where <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, ::Hash: std::str::FromStr, { - init(&mut config, spec_factory, &subcommand.get_shared_params(), version)?; + let shared_params = subcommand.get_shared_params(); + init(shared_params, version)?; + load_spec(&mut config, shared_params, spec_factory)?; subcommand.run(config, builder) } -/// Initialize substrate and its configuration +/// Initialize substrate. This must be done only once. /// /// This method: /// /// 1. set the panic handler /// 2. raise the FD limit /// 3. initialize the logger -/// 4. update the configuration provided with the chain specification, config directory, -/// information (version, commit), database's path, boot nodes and telemetry endpoints -pub fn init( - mut config: &mut Configuration, - spec_factory: F, - shared_params: &SharedParams, - version: &VersionInfo, -) -> error::Result<()> -where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, +pub fn init(shared_params: &SharedParams, version: &VersionInfo) -> error::Result<()> { let full_version = sc_service::config::full_version_from_strs( version.version, @@ -300,21 +281,6 @@ where fdlimit::raise_fd_limit(); init_logger(shared_params.log.as_ref().map(|v| v.as_ref()).unwrap_or("")); - config.chain_spec = Some(load_spec(shared_params, spec_factory)?); - config.config_dir = Some(base_path(shared_params, version)); - config.impl_commit = version.commit; - config.impl_version = version.version; - - config.database = DatabaseConfig::Path { - path: config - .in_chain_config_dir(DEFAULT_DB_CONFIG_PATH) - .expect("We provided a base_path/config_dir."), - cache_size: None, - }; - - config.network.boot_nodes = config.expect_chain_spec().boot_nodes().to_vec(); - config.telemetry_endpoints = config.expect_chain_spec().telemetry_endpoints().clone(); - Ok(()) } @@ -419,8 +385,6 @@ fn fill_network_configuration( ]; } - config.public_addresses = Vec::new(); - config.client_version = client_id; config.node_key = node_key::node_key_config(cli.node_key_params, &config.net_config_path)?; @@ -496,10 +460,8 @@ pub fn fill_import_params( where G: RuntimeGenesis, { - match config.database { - DatabaseConfig::Path { ref mut cache_size, .. } => - *cache_size = Some(cli.database_cache_size), - DatabaseConfig::Custom(_) => {}, + if let Some(DatabaseConfig::Path { ref mut cache_size, .. }) = config.database { + *cache_size = Some(cli.database_cache_size); } config.state_cache_size = cli.state_cache_size; @@ -549,14 +511,30 @@ where Ok(()) } -/// Update and prepare a `Configuration` with command line parameters of `RunCmd` +/// Update and prepare a `Configuration` with command line parameters of `RunCmd` and `VersionInfo` pub fn update_config_for_running_node( mut config: &mut Configuration, cli: RunCmd, + version: &VersionInfo, ) -> error::Result<()> where G: RuntimeGenesis, { + if config.config_dir.is_none() { + config.config_dir = Some(base_path(&cli.shared_params, version)); + } + + if config.database.is_none() { + // NOTE: the loading of the DatabaseConfig is voluntarily delayed to here + // in case config.config_dir has been customized + config.database = Some(DatabaseConfig::Path { + path: config + .in_chain_config_dir(DEFAULT_DB_CONFIG_PATH) + .expect("We provided a base_path/config_dir."), + cache_size: None, + }); + } + fill_config_keystore_password_and_path(&mut config, &cli)?; let keyring = cli.get_keyring(); @@ -580,16 +558,13 @@ where (_, Some(keyring)) => keyring.to_string(), (None, None) => generate_node_name(), }; - match node_key::is_node_name_valid(&config.name) { - Ok(_) => (), - Err(msg) => Err( - error::Error::Input( - format!("Invalid node name '{}'. Reason: {}. If unsure, use none.", - config.name, - msg - ) + if let Err(msg) = node_key::is_node_name_valid(&config.name) { + return Err(error::Error::Input( + format!("Invalid node name '{}'. Reason: {}. If unsure, use none.", + config.name, + msg, ) - )? + )); } // set sentry mode (i.e. act as an authority but **never** actively participate) @@ -625,16 +600,16 @@ where } }); - if config.rpc_http.is_none() { + if config.rpc_http.is_none() || cli.rpc_port.is_some() { let rpc_interface: &str = interface_str(cli.rpc_external, cli.unsafe_rpc_external, cli.validator)?; config.rpc_http = Some(parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)?); } - if config.rpc_ws.is_none() { + if config.rpc_ws.is_none() || cli.ws_port.is_some() { let ws_interface: &str = interface_str(cli.ws_external, cli.unsafe_ws_external, cli.validator)?; config.rpc_ws = Some(parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)?); } - if config.grafana_port.is_none() { + if config.grafana_port.is_none() || cli.grafana_port.is_some() { let grafana_interface: &str = if cli.grafana_external { "0.0.0.0" } else { "127.0.0.1" }; config.grafana_port = Some( parse_address(&format!("{}:{}", grafana_interface, 9955), cli.grafana_port)? @@ -781,6 +756,17 @@ fn kill_color(s: &str) -> String { mod tests { use super::*; + const TEST_VERSION_INFO: &'static VersionInfo = &VersionInfo { + name: "node-test", + version: "0.1.0", + commit: "some_commit", + executable_name: "node-test", + description: "description", + author: "author", + support_url: "http://example.org", + copyright_start_year: 2020, + }; + #[test] fn keystore_path_is_generated_correctly() { let chain_spec = ChainSpec::from_genesis( @@ -805,6 +791,7 @@ mod tests { update_config_for_running_node( &mut node_config, run_cmds.clone(), + TEST_VERSION_INFO, ).unwrap(); let expected_path = match keystore_path { @@ -815,4 +802,60 @@ mod tests { assert_eq!(expected_path, node_config.keystore.path().unwrap().to_owned()); } } + + #[test] + fn ensure_load_spec_provide_defaults() { + let chain_spec = ChainSpec::from_genesis( + "test", + "test-id", + || (), + vec!["boo".to_string()], + Some(TelemetryEndpoints::new(vec![("foo".to_string(), 42)])), + None, + None, + None::<()>, + ); + + let args: Vec<&str> = vec![]; + let cli = RunCmd::from_iter(args); + + let mut config = Configuration::new(TEST_VERSION_INFO); + load_spec(&mut config, &cli.shared_params, |_| Ok(Some(chain_spec))).unwrap(); + + assert!(config.chain_spec.is_some()); + assert!(!config.network.boot_nodes.is_empty()); + assert!(config.telemetry_endpoints.is_some()); + } + + #[test] + fn ensure_update_config_for_running_node_provides_defaults() { + let chain_spec = ChainSpec::from_genesis( + "test", + "test-id", + || (), + vec![], + None, + None, + None, + None::<()>, + ); + + let args: Vec<&str> = vec![]; + let cli = RunCmd::from_iter(args); + + let mut config = Configuration::new(TEST_VERSION_INFO); + config.chain_spec = Some(chain_spec); + update_config_for_running_node(&mut config, cli, TEST_VERSION_INFO).unwrap(); + + assert!(config.config_dir.is_some()); + assert!(config.database.is_some()); + if let Some(DatabaseConfig::Path { ref cache_size, .. }) = config.database { + assert!(cache_size.is_some()); + } else { + panic!("invalid config.database variant"); + } + assert!(!config.name.is_empty()); + assert!(config.network.config_path.is_some()); + assert!(!config.network.listen_addresses.is_empty()); + } } diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index eddd8578b3..3a4aa319c6 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -936,6 +936,7 @@ impl RunCmd { crate::update_config_for_running_node( &mut config, self, + &version, )?; crate::run_node(config, new_light, new_full, &version) @@ -1003,7 +1004,7 @@ impl ExportBlocksCmd { crate::fill_config_keystore_in_memory(&mut config)?; - if let DatabaseConfig::Path { ref path, .. } = &config.database { + if let DatabaseConfig::Path { ref path, .. } = config.expect_database() { info!("DB path: {}", path.display()); } let from = self.from.as_ref().and_then(|f| f.parse().ok()).unwrap_or(1); @@ -1124,7 +1125,7 @@ impl PurgeChainCmd { crate::fill_config_keystore_in_memory(&mut config)?; - let db_path = match config.database { + let db_path = match config.expect_database() { DatabaseConfig::Path { path, .. } => path, _ => { eprintln!("Cannot purge custom database implementation"); diff --git a/client/cli/src/runtime.rs b/client/cli/src/runtime.rs index 3eee94c049..62a2245c9e 100644 --- a/client/cli/src/runtime.rs +++ b/client/cli/src/runtime.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use std::sync::Arc; + use futures::{Future, future, future::FutureExt}; use futures::select; use futures::pin_mut; @@ -91,7 +93,7 @@ where config.task_executor = { let runtime_handle = runtime.handle().clone(); - Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) + Some(Arc::new(move |fut| { runtime_handle.spawn(fut); })) }; let f = future_builder(config)?; @@ -117,7 +119,7 @@ where config.task_executor = { let runtime_handle = runtime.handle().clone(); - Some(Box::new(move |fut| { runtime_handle.spawn(fut); })) + Some(Arc::new(move |fut| { runtime_handle.spawn(fut); })) }; let service = service_builder(config)?; diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 7a6ca8dc79..ad1d225134 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -196,7 +196,7 @@ fn new_full_parts( state_cache_child_ratio: config.state_cache_child_ratio.map(|v| (v, 100)), pruning: config.pruning.clone(), - source: match &config.database { + source: match config.expect_database() { DatabaseConfig::Path { path, cache_size } => sc_client_db::DatabaseSettingsSrc::Path { path: path.clone(), @@ -307,7 +307,7 @@ where TGen: RuntimeGenesis, TCSExt: Extension { state_cache_child_ratio: config.state_cache_child_ratio.map(|v| (v, 100)), pruning: config.pruning.clone(), - source: match &config.database { + source: match config.expect_database() { DatabaseConfig::Path { path, cache_size } => sc_client_db::DatabaseSettingsSrc::Path { path: path.clone(), @@ -1187,7 +1187,7 @@ ServiceBuilder< task_executor: if let Some(exec) = config.task_executor { exec } else { - return Err(Error::TasksExecutorRequired); + return Err(Error::TaskExecutorRequired); }, rpc_handlers, _rpc: rpc, diff --git a/client/service/src/config.rs b/client/service/src/config.rs index cb8170f7f4..f4043d533e 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -28,6 +28,27 @@ use sp_core::crypto::Protected; use target_info::Target; use sc_telemetry::TelemetryEndpoints; +/// Executable version. Used to pass version information from the root crate. +#[derive(Clone)] +pub struct VersionInfo { + /// Implementation name. + pub name: &'static str, + /// Implementation version. + pub version: &'static str, + /// SCM Commit hash. + pub commit: &'static str, + /// Executable file name. + pub executable_name: &'static str, + /// Executable file description. + pub description: &'static str, + /// Executable file author. + pub author: &'static str, + /// Support URL. + pub support_url: &'static str, + /// Copyright starting year (x-current year) + pub copyright_start_year: i32, +} + /// Service configuration. pub struct Configuration { /// Implementation name @@ -39,7 +60,7 @@ pub struct Configuration { /// Node roles. pub roles: Roles, /// How to spawn background tasks. Mandatory, otherwise creating a `Service` will error. - pub task_executor: Option + Send>>) + Send>>, + pub task_executor: Option + Send>>) + Send + Sync>>, /// Extrinsic pool configuration. pub transaction_pool: TransactionPoolOptions, /// Network configuration. @@ -49,7 +70,7 @@ pub struct Configuration { /// Configuration for the keystore. pub keystore: KeystoreConfig, /// Configuration for the database. - pub database: DatabaseConfig, + pub database: Option, /// Size of internal state cache in Bytes pub state_cache_size: usize, /// Size in percent of cache size dedicated to child tries @@ -147,7 +168,7 @@ pub enum DatabaseConfig { impl Default for Configuration { /// Create a default config fn default() -> Self { - let configuration = Configuration { + Configuration { impl_name: "parity-substrate", impl_version: "0.0.0", impl_commit: "", @@ -159,10 +180,7 @@ impl Default for Configuration { transaction_pool: Default::default(), network: Default::default(), keystore: KeystoreConfig::None, - database: DatabaseConfig::Path { - path: Default::default(), - cache_size: Default::default(), - }, + database: None, state_cache_size: Default::default(), state_cache_child_ratio: Default::default(), pruning: PruningMode::default(), @@ -183,14 +201,21 @@ impl Default for Configuration { dev_key_seed: None, tracing_targets: Default::default(), tracing_receiver: Default::default(), - }; - - configuration + } } - } impl Configuration { + /// Create a default config using `VersionInfo` + pub fn new(version: &VersionInfo) -> Self { + let mut config = Configuration::default(); + config.impl_name = version.name; + config.impl_version = version.version; + config.impl_commit = version.commit; + + config + } + /// Returns full version string of this configuration. pub fn full_version(&self) -> String { full_version_from_strs(self.impl_version, self.impl_commit) @@ -220,6 +245,15 @@ impl Configuration { pub fn expect_chain_spec(&self) -> &ChainSpec { self.chain_spec.as_ref().expect("chain_spec must be specified") } + + /// Return a reference to the `DatabaseConfig` of this `Configuration`. + /// + /// ### Panics + /// + /// This method panic if the `database` is `None` + pub fn expect_database(&self) -> &DatabaseConfig { + self.database.as_ref().expect("database must be specified") + } } /// Returns platform info diff --git a/client/service/src/error.rs b/client/service/src/error.rs index 14b03d7e95..059e1c19e4 100644 --- a/client/service/src/error.rs +++ b/client/service/src/error.rs @@ -42,7 +42,7 @@ pub enum Error { SelectChainRequired, /// Tasks executor is missing. #[display(fmt="Tasks executor hasn't been provided.")] - TasksExecutorRequired, + TaskExecutorRequired, /// Other error. Other(String), } diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index dc158f1300..577f36572a 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -96,7 +96,7 @@ pub struct Service { /// Receiver for futures that must be spawned as background tasks. to_spawn_rx: mpsc::UnboundedReceiver<(Pin + Send>>, Cow<'static, str>)>, /// How to spawn background tasks. - task_executor: Box + Send>>) + Send>, + task_executor: Arc + Send>>) + Send + Sync>, rpc_handlers: sc_rpc_server::RpcHandler, _rpc: Box, _telemetry: Option, diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index cb458d533f..2976e66a29 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -133,7 +133,7 @@ fn node_config ( index: usize, spec: &ChainSpec, role: Roles, - task_executor: Box + Send>>) + Send>, + task_executor: Arc + Send>>) + Send + Sync>, key_seed: Option, base_port: u16, root: &TempDir, @@ -183,10 +183,10 @@ fn node_config ( password: None }, config_dir: Some(root.clone()), - database: DatabaseConfig::Path { + database: Some(DatabaseConfig::Path { path: root.join("db"), cache_size: None - }, + }), state_cache_size: 16777216, state_cache_child_ratio: None, pruning: Default::default(), @@ -256,7 +256,7 @@ impl TestNet where for (key, authority) in authorities { let task_executor = { let executor = executor.clone(); - Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) + Arc::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) }; let node_config = node_config( self.nodes, @@ -280,7 +280,7 @@ impl TestNet where for full in full { let task_executor = { let executor = executor.clone(); - Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) + Arc::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) }; let node_config = node_config(self.nodes, &self.chain_spec, Roles::FULL, task_executor, None, self.base_port, &temp); let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); @@ -296,7 +296,7 @@ impl TestNet where for light in light { let task_executor = { let executor = executor.clone(); - Box::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) + Arc::new(move |fut: Pin + Send>>| executor.spawn(fut.unit_error().compat())) }; let node_config = node_config(self.nodes, &self.chain_spec, Roles::LIGHT, task_executor, None, self.base_port, &temp); let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs index 4f985871f5..d7ffdca1aa 100644 --- a/utils/browser/src/lib.rs +++ b/utils/browser/src/lib.rs @@ -51,18 +51,18 @@ where allow_private_ipv4: true, enable_mdns: false, }; - config.task_executor = Some(Box::new(move |fut| { + config.task_executor = Some(Arc::new(move |fut| { wasm_bindgen_futures::spawn_local(fut) })); config.telemetry_external_transport = Some(transport); config.roles = Roles::LIGHT; config.name = format!("{} (Browser)", name); - config.database = { + config.database = Some({ info!("Opening Indexed DB database '{}'...", name); let db = kvdb_web::Database::open(name, 10) .await?; DatabaseConfig::Custom(Arc::new(db)) - }; + }); config.keystore = KeystoreConfig::InMemory; Ok(config) -- GitLab From 13d88accd2fa81be421b1102ff4c590a69260f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 6 Feb 2020 16:08:11 +0100 Subject: [PATCH 262/296] Allocator improvements/clean ups (#4838) * FreeingBumpAllocator: Initialize the heads to `u32::max_value()` `self.heads` can point to an element with the index `0` in the heap. This would make the allocator fail to reuse this element. * Simplify the `PREFIX_SIZE` handling --- primitives/allocator/src/freeing_bump.rs | 43 +++++++++++++++--------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/primitives/allocator/src/freeing_bump.rs b/primitives/allocator/src/freeing_bump.rs index 46c314c2c2..f51dc222a2 100644 --- a/primitives/allocator/src/freeing_bump.rs +++ b/primitives/allocator/src/freeing_bump.rs @@ -106,7 +106,7 @@ impl FreeingBumpHeapAllocator { FreeingBumpHeapAllocator { bumper: 0, - heads: [0; N], + heads: [u32::max_value(); N], ptr_offset, total_size: 0, } @@ -138,31 +138,30 @@ impl FreeingBumpHeapAllocator { } let list_index = (item_size.trailing_zeros() - 3) as usize; - let ptr: u32 = if self.heads[list_index] != 0 { + let ptr: u32 = if self.heads[list_index] != u32::max_value() { // Something from the free list - let item = self.heads[list_index]; - let ptr = item + PREFIX_SIZE; + let ptr = self.heads[list_index]; assert!( - ptr + item_size <= max_heap_size, + ptr + item_size + PREFIX_SIZE <= max_heap_size, "Pointer is looked up in list of free entries, into which only valid values are inserted; qed" ); - self.heads[list_index] = self.get_heap_u64(mem, item)? + self.heads[list_index] = self.get_heap_u64(mem, ptr)? .try_into() .map_err(|_| error("read invalid free list pointer"))?; ptr } else { // Nothing to be freed. Bump. - self.bump(item_size, max_heap_size)? + PREFIX_SIZE + self.bump(item_size, max_heap_size)? }; - self.set_heap_u64(mem, ptr - PREFIX_SIZE, list_index as u64)?; + self.set_heap_u64(mem, ptr, list_index as u64)?; self.total_size = self.total_size + item_size + PREFIX_SIZE; trace!("Heap size is {} bytes after allocation", self.total_size); - Ok(Pointer::new(self.ptr_offset + ptr)) + Ok(Pointer::new(self.ptr_offset + ptr + PREFIX_SIZE)) } /// Deallocates the space which was allocated for a pointer. @@ -173,18 +172,18 @@ impl FreeingBumpHeapAllocator { /// - `ptr` - pointer to the allocated chunk pub fn deallocate(&mut self, mem: &mut [u8], ptr: Pointer) -> Result<(), Error> { let ptr = u32::from(ptr) - self.ptr_offset; - if ptr < PREFIX_SIZE { - return Err(error("Invalid pointer for deallocation")); - } + let ptr = ptr.checked_sub(PREFIX_SIZE).ok_or_else(|| + error("Invalid pointer for deallocation") + )?; - let list_index: usize = self.get_heap_u64(mem, ptr - PREFIX_SIZE)? + let list_index: usize = self.get_heap_u64(mem, ptr)? .try_into() .map_err(|_| error("read invalid list index"))?; if list_index > self.heads.len() { return Err(error("read invalid list index")); } - self.set_heap_u64(mem, ptr - PREFIX_SIZE, self.heads[list_index] as u64)?; - self.heads[list_index] = ptr - PREFIX_SIZE; + self.set_heap_u64(mem, ptr, self.heads[list_index] as u64)?; + self.heads[list_index] = ptr; let item_size = Self::get_item_size_from_index(list_index); self.total_size = self.total_size.checked_sub(item_size as u32 + PREFIX_SIZE) @@ -357,7 +356,7 @@ mod tests { // then // should have re-allocated assert_eq!(ptr3, to_pointer(padded_offset + 16 + PREFIX_SIZE)); - assert_eq!(heap.heads, [0; N]); + assert_eq!(heap.heads, [u32::max_value(); N]); } #[test] @@ -563,4 +562,16 @@ mod tests { assert_eq!(item_size as u32, MAX_POSSIBLE_ALLOCATION); } + #[test] + fn deallocate_needs_to_maintain_linked_list() { + let mut mem = [0u8; 8 * 2 * 4 + ALIGNMENT as usize]; + let mut heap = FreeingBumpHeapAllocator::new(0); + + // Allocate and free some pointers + let ptrs = (0..4).map(|_| heap.allocate(&mut mem, 8).unwrap()).collect::>(); + ptrs.into_iter().for_each(|ptr| heap.deallocate(&mut mem, ptr).unwrap()); + + // Second time we should be able to allocate all of them again. + let _ = (0..4).map(|_| heap.allocate(&mut mem, 8).unwrap()).collect::>(); + } } -- GitLab From 203445bb155249e0e69592864a23510fd6c4c46e Mon Sep 17 00:00:00 2001 From: gabriel klawitter Date: Thu, 6 Feb 2020 16:47:44 +0100 Subject: [PATCH 263/296] ci: enable build for pre-tags (#4836) * build for pre-tags * shallow clone rustdocs --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ced3e33eaa..62a6c2de32 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -65,6 +65,7 @@ variables: only: - master - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + - /^pre-v[0-9]+\.[0-9]+-[0-9a-f]+$/ - web @@ -515,7 +516,7 @@ publish-gh-doc: insteadOf = "https://github.com/" EOC - unset GITHUB_TOKEN - - git clone https://github.com/substrate-developer-hub/rustdocs.git + - git clone --depth 1 https://github.com/substrate-developer-hub/rustdocs.git - rsync -ax --delete ./crate-docs/ ./rustdocs/${CI_COMMIT_REF_NAME}/ - cd ./rustdocs; git add . - git commit -m "update rustdoc ${CI_COMMIT_REF_NAME}" -- GitLab From 8d7bf66719ff5469c71ea50f5651c5df638c65dd Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 6 Feb 2020 16:48:38 +0100 Subject: [PATCH 264/296] Refactor epoch changes to a separate crate (#4785) * Init epoch changes module * Initial integration of new epoch changes module for BABE * Fix all initial compile errors * rename: digest -> digests * Fix babe tests * Bump impl_version * Fix more test issues * Remove test flag for tree It unfortunately won't work for multiple crates. * Update cargo lock * Fix duplicate parking_lot version * Add missing license header --- Cargo.lock | 13 ++ Cargo.toml | 3 +- bin/node/runtime/src/lib.rs | 2 +- client/consensus/babe/Cargo.toml | 1 + client/consensus/babe/src/authorship.rs | 18 +- client/consensus/babe/src/aux_schema.rs | 16 +- client/consensus/babe/src/lib.rs | 76 +++++-- client/consensus/babe/src/tests.rs | 5 +- client/consensus/babe/src/verification.rs | 12 +- client/consensus/epochs/Cargo.toml | 14 ++ .../epoch_changes.rs => epochs/src/lib.rs} | 203 ++++++++++-------- frame/babe/src/lib.rs | 15 +- frame/babe/src/tests.rs | 4 +- .../babe/src/{digest.rs => digests.rs} | 57 +++-- primitives/consensus/babe/src/lib.rs | 44 +--- 15 files changed, 265 insertions(+), 218 deletions(-) create mode 100644 client/consensus/epochs/Cargo.toml rename client/consensus/{babe/src/epoch_changes.rs => epochs/src/lib.rs} (79%) rename primitives/consensus/babe/src/{digest.rs => digests.rs} (85%) diff --git a/Cargo.lock b/Cargo.lock index 3f94778b84..4771b78586 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5805,6 +5805,7 @@ dependencies = [ "sc-block-builder", "sc-client", "sc-client-api", + "sc-consensus-epochs", "sc-consensus-slots", "sc-consensus-uncles", "sc-executor", @@ -5832,6 +5833,18 @@ dependencies = [ "tokio 0.1.22", ] +[[package]] +name = "sc-consensus-epochs" +version = "0.8.0" +dependencies = [ + "fork-tree", + "parity-scale-codec", + "parking_lot 0.10.0", + "sc-client-api", + "sp-blockchain", + "sp-runtime", +] + [[package]] name = "sc-consensus-manual-seal" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 552f1eadc7..47e3fe3f0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,8 +25,9 @@ members = [ "client/consensus/babe", "client/consensus/manual-seal", "client/consensus/pow", - "client/consensus/slots", "client/consensus/uncles", + "client/consensus/slots", + "client/consensus/epochs", "client/db", "client/executor", "client/executor/common", diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 40342c1ce8..7b718ca21f 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 214, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, }; diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 551754c7b6..23bf9cea28 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -22,6 +22,7 @@ sc-telemetry = { version = "2.0.0", path = "../../telemetry" } sc-keystore = { version = "2.0.0", path = "../../keystore" } sc-client-api = { version = "2.0.0", path = "../../api" } sc-client = { version = "0.8", path = "../../" } +sc-consensus-epochs = { version = "0.8", path = "../epochs" } sp-api = { version = "2.0.0", path = "../../../primitives/api" } sp-block-builder = { version = "2.0.0", path = "../../../primitives/block-builder" } sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } diff --git a/client/consensus/babe/src/authorship.rs b/client/consensus/babe/src/authorship.rs index 62667ef397..8b28aefa2f 100644 --- a/client/consensus/babe/src/authorship.rs +++ b/client/consensus/babe/src/authorship.rs @@ -17,13 +17,17 @@ //! BABE authority selection and slot claiming. use merlin::Transcript; -use sp_consensus_babe::{AuthorityId, BabeAuthorityWeight, BABE_ENGINE_ID, BABE_VRF_PREFIX}; -use sp_consensus_babe::{Epoch, SlotNumber, AuthorityPair, BabePreDigest, BabeConfiguration}; +use sp_consensus_babe::{ + AuthorityId, BabeAuthorityWeight, BABE_ENGINE_ID, BABE_VRF_PREFIX, + SlotNumber, AuthorityPair, BabeConfiguration +}; +use sp_consensus_babe::digests::PreDigest; use sp_core::{U256, blake2_256}; use codec::Encode; use schnorrkel::vrf::VRFInOut; use sp_core::Pair; use sc_keystore::KeyStorePtr; +use super::Epoch; /// Calculates the primary selection threshold for a given authority, taking /// into account `c` (`1 - c` represents the probability of a slot being empty). @@ -104,7 +108,7 @@ fn claim_secondary_slot( authorities: &[(AuthorityId, BabeAuthorityWeight)], keystore: &KeyStorePtr, randomness: [u8; 32], -) -> Option<(BabePreDigest, AuthorityPair)> { +) -> Option<(PreDigest, AuthorityPair)> { if authorities.is_empty() { return None; } @@ -124,7 +128,7 @@ fn claim_secondary_slot( }) { if pair.public() == *expected_author { - let pre_digest = BabePreDigest::Secondary { + let pre_digest = PreDigest::Secondary { slot_number, authority_index: authority_index as u32, }; @@ -145,7 +149,7 @@ pub(super) fn claim_slot( epoch: &Epoch, config: &BabeConfiguration, keystore: &KeyStorePtr, -) -> Option<(BabePreDigest, AuthorityPair)> { +) -> Option<(PreDigest, AuthorityPair)> { claim_primary_slot(slot_number, epoch, config.c, keystore) .or_else(|| { if config.secondary_slots { @@ -175,7 +179,7 @@ fn claim_primary_slot( epoch: &Epoch, c: (u64, u64), keystore: &KeyStorePtr, -) -> Option<(BabePreDigest, AuthorityPair)> { +) -> Option<(PreDigest, AuthorityPair)> { let Epoch { authorities, randomness, epoch_index, .. } = epoch; let keystore = keystore.read(); @@ -196,7 +200,7 @@ fn claim_primary_slot( let pre_digest = get_keypair(&pair) .vrf_sign_after_check(transcript, |inout| super::authorship::check_primary_threshold(inout, threshold)) .map(|s| { - BabePreDigest::Primary { + PreDigest::Primary { slot_number, vrf_output: s.0.to_output(), vrf_proof: s.1, diff --git a/client/consensus/babe/src/aux_schema.rs b/client/consensus/babe/src/aux_schema.rs index 170c2bf42d..2f64157f22 100644 --- a/client/consensus/babe/src/aux_schema.rs +++ b/client/consensus/babe/src/aux_schema.rs @@ -16,6 +16,8 @@ //! Schema for BABE epoch changes in the aux-db. +use std::sync::Arc; +use parking_lot::Mutex; use log::info; use codec::{Decode, Encode}; @@ -23,8 +25,8 @@ use sc_client_api::backend::AuxStore; use sp_blockchain::{Result as ClientResult, Error as ClientError}; use sp_runtime::traits::Block as BlockT; use sp_consensus_babe::BabeBlockWeight; - -use super::{epoch_changes::EpochChangesFor, SharedEpochChanges}; +use sc_consensus_epochs::{EpochChangesFor, SharedEpochChanges}; +use crate::Epoch; const BABE_EPOCH_CHANGES: &[u8] = b"babe_epoch_changes"; @@ -49,14 +51,14 @@ fn load_decode(backend: &B, key: &[u8]) -> ClientResult> /// Load or initialize persistent epoch change data from backend. pub(crate) fn load_epoch_changes( backend: &B, -) -> ClientResult> { - let epoch_changes = load_decode::<_, EpochChangesFor>(backend, BABE_EPOCH_CHANGES)? - .map(Into::into) +) -> ClientResult> { + let epoch_changes = load_decode::<_, EpochChangesFor>(backend, BABE_EPOCH_CHANGES)? + .map(|v| Arc::new(Mutex::new(v))) .unwrap_or_else(|| { info!(target: "babe", "Creating empty BABE epoch changes on what appears to be first startup." ); - SharedEpochChanges::new() + SharedEpochChanges::::default() }); // rebalance the tree after deserialization. this isn't strictly necessary @@ -70,7 +72,7 @@ pub(crate) fn load_epoch_changes( /// Update the epoch changes on disk after a change. pub(crate) fn write_epoch_changes( - epoch_changes: &EpochChangesFor, + epoch_changes: &EpochChangesFor, write_aux: F, ) -> R where F: FnOnce(&[(&'static [u8], &[u8])]) -> R, diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 8480972311..dbf61692eb 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -59,8 +59,10 @@ #![forbid(unsafe_code)] #![warn(missing_docs)] pub use sp_consensus_babe::{ - BabeApi, ConsensusLog, BABE_ENGINE_ID, BabePreDigest, SlotNumber, BabeConfiguration, - CompatibleDigestItem, + BabeApi, ConsensusLog, BABE_ENGINE_ID, SlotNumber, BabeConfiguration, + AuthorityId, AuthorityPair, AuthoritySignature, + BabeAuthorityWeight, VRF_OUTPUT_LENGTH, + digests::{PreDigest, CompatibleDigestItem, NextEpochDescriptor}, }; pub use sp_consensus::SyncOracle; use std::{collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}}; @@ -101,26 +103,58 @@ use log::{warn, debug, info, trace}; use sc_consensus_slots::{ SlotWorker, SlotInfo, SlotCompatible, StorageChanges, CheckedHeader, check_equivocation, }; -use epoch_changes::descendent_query; +use sc_consensus_epochs::{descendent_query, SharedEpochChanges, EpochChangesFor, Epoch as EpochT}; use sp_blockchain::{ Result as ClientResult, Error as ClientError, HeaderBackend, ProvideCache, HeaderMetadata }; use schnorrkel::SignatureError; - +use codec::{Encode, Decode}; use sp_api::ApiExt; mod aux_schema; mod verification; -mod epoch_changes; mod authorship; #[cfg(test)] mod tests; -pub use sp_consensus_babe::{ - AuthorityId, AuthorityPair, AuthoritySignature, Epoch, NextEpochDescriptor, -}; -pub use epoch_changes::{EpochChanges, EpochChangesFor, SharedEpochChanges}; +/// BABE epoch information +#[derive(Decode, Encode, Default, PartialEq, Eq, Clone, Debug)] +pub struct Epoch { + /// The epoch index + pub epoch_index: u64, + /// The starting slot of the epoch, + pub start_slot: SlotNumber, + /// The duration of this epoch + pub duration: SlotNumber, + /// The authorities and their weights + pub authorities: Vec<(AuthorityId, BabeAuthorityWeight)>, + /// Randomness for this epoch + pub randomness: [u8; VRF_OUTPUT_LENGTH], +} + +impl EpochT for Epoch { + type NextEpochDescriptor = NextEpochDescriptor; + type SlotNumber = SlotNumber; + + fn increment(&self, descriptor: NextEpochDescriptor) -> Epoch { + Epoch { + epoch_index: self.epoch_index + 1, + start_slot: self.start_slot + self.duration, + duration: self.duration, + authorities: descriptor.authorities, + randomness: descriptor.randomness, + } + } + + fn start_slot(&self) -> SlotNumber { + self.start_slot + } + + fn end_slot(&self) -> SlotNumber { + self.start_slot + self.duration + } +} #[derive(derive_more::Display, Debug)] enum Error { @@ -343,7 +377,7 @@ struct BabeWorker { sync_oracle: SO, force_authoring: bool, keystore: KeyStorePtr, - epoch_changes: SharedEpochChanges, + epoch_changes: SharedEpochChanges, config: Config, } @@ -361,7 +395,7 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork Error: std::error::Error + Send + From + From + 'static, { type EpochData = Epoch; - type Claim = (BabePreDigest, AuthorityPair); + type Claim = (PreDigest, AuthorityPair); type SyncOracle = SO; type CreateProposer = Pin> + Send + 'static @@ -533,12 +567,12 @@ impl SlotWorker for BabeWorker where /// Extract the BABE pre digest from the given header. Pre-runtime digests are /// mandatory, the function will return `Err` if none is found. -fn find_pre_digest(header: &B::Header) -> Result> +fn find_pre_digest(header: &B::Header) -> Result> { // genesis block doesn't contain a pre digest so let's generate a // dummy one to not break any invariants in the rest of the code if header.number().is_zero() { - return Ok(BabePreDigest::Secondary { + return Ok(PreDigest::Secondary { slot_number: 0, authority_index: 0, }); @@ -597,7 +631,7 @@ impl SlotCompatible for TimeSource { #[derive(Clone)] pub struct BabeLink { time_source: TimeSource, - epoch_changes: SharedEpochChanges, + epoch_changes: SharedEpochChanges, config: Config, } /// A verifier for Babe blocks. @@ -606,7 +640,7 @@ pub struct BabeVerifier { api: Arc, inherent_data_providers: sp_inherents::InherentDataProviders, config: Config, - epoch_changes: SharedEpochChanges, + epoch_changes: SharedEpochChanges, time_source: TimeSource, } @@ -711,7 +745,7 @@ impl Verifier for BabeVerifier::Runtime)?; + .map_err(Error::::Runtime)?; let (_, slot_now, _) = self.time_source.extract_timestamp_and_slot(&inherent_data) .map_err(Error::::Extraction)?; @@ -855,7 +889,7 @@ pub struct BabeBlockImport { inner: I, client: Arc>, api: Arc, - epoch_changes: SharedEpochChanges, + epoch_changes: SharedEpochChanges, config: Config, } @@ -875,7 +909,7 @@ impl BabeBlockImport { fn new( client: Arc>, api: Arc, - epoch_changes: SharedEpochChanges, + epoch_changes: SharedEpochChanges, block_import: I, config: Config, ) -> Self { @@ -1114,7 +1148,7 @@ impl BlockImport for BabeBlockImport( client: &Client, - epoch_changes: &mut EpochChangesFor, + epoch_changes: &mut EpochChangesFor, ) -> Result<(), ConsensusError> where Block: BlockT, E: CallExecutor + Send + Sync, @@ -1161,7 +1195,7 @@ pub fn block_import( RA: Send + Sync, Client: AuxStore, { - let epoch_changes = aux_schema::load_epoch_changes(&*client)?; + let epoch_changes = aux_schema::load_epoch_changes::(&*client)?; let link = BabeLink { epoch_changes: epoch_changes.clone(), time_source: Default::default(), @@ -1245,7 +1279,7 @@ pub mod test_helpers { client: &C, keystore: &KeyStorePtr, link: &BabeLink, - ) -> Option where + ) -> Option where B: BlockT, C: ProvideRuntimeApi + ProvideCache + diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 3339c06d65..701155e7cc 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -59,7 +59,7 @@ type Mutator = Arc; #[derive(Clone)] struct DummyFactory { client: Arc, - epoch_changes: crate::SharedEpochChanges, + epoch_changes: SharedEpochChanges, config: Config, mutator: Mutator, } @@ -105,7 +105,6 @@ impl DummyProposer { > > { - use codec::Encode; let block_builder = self.factory.client.new_block_at( &BlockId::Hash(self.parent_hash), pre_digests, @@ -558,7 +557,7 @@ fn propose_and_import_block( let pre_digest = sp_runtime::generic::Digest { logs: vec![ Item::babe_pre_digest( - BabePreDigest::Secondary { + PreDigest::Secondary { authority_index: 0, slot_number, }, diff --git a/client/consensus/babe/src/verification.rs b/client/consensus/babe/src/verification.rs index ee5a99ec9d..70418b8aea 100644 --- a/client/consensus/babe/src/verification.rs +++ b/client/consensus/babe/src/verification.rs @@ -18,11 +18,11 @@ use schnorrkel::vrf::{VRFOutput, VRFProof}; use sp_runtime::{traits::Header, traits::DigestItemFor}; use sp_core::{Pair, Public}; -use sp_consensus_babe::{Epoch, BabePreDigest, CompatibleDigestItem, AuthorityId}; -use sp_consensus_babe::{AuthoritySignature, SlotNumber, AuthorityIndex, AuthorityPair}; +use sp_consensus_babe::{AuthoritySignature, SlotNumber, AuthorityIndex, AuthorityPair, AuthorityId}; +use sp_consensus_babe::digests::{PreDigest, CompatibleDigestItem}; use sc_consensus_slots::CheckedHeader; use log::{debug, trace}; -use super::{find_pre_digest, babe_err, BlockT, Error}; +use super::{find_pre_digest, babe_err, Epoch, BlockT, Error}; use super::authorship::{make_transcript, calculate_primary_threshold, check_primary_threshold, secondary_slot_author}; /// BABE verification parameters @@ -32,7 +32,7 @@ pub(super) struct VerificationParams<'a, B: 'a + BlockT> { /// the pre-digest of the header being verified. this is optional - if prior /// verification code had to read it, it can be included here to avoid duplicate /// work. - pub(super) pre_digest: Option, + pub(super) pre_digest: Option, /// the slot number of the current time. pub(super) slot_now: SlotNumber, /// epoch descriptor of the epoch this block _should_ be under, if it's valid. @@ -93,7 +93,7 @@ pub(super) fn check_header( }; match &pre_digest { - BabePreDigest::Primary { vrf_output, vrf_proof, authority_index, slot_number } => { + PreDigest::Primary { vrf_output, vrf_proof, authority_index, slot_number } => { debug!(target: "babe", "Verifying Primary block"); let digest = (vrf_output, vrf_proof, *authority_index, *slot_number); @@ -106,7 +106,7 @@ pub(super) fn check_header( config.c, )?; }, - BabePreDigest::Secondary { authority_index, slot_number } if config.secondary_slots => { + PreDigest::Secondary { authority_index, slot_number } if config.secondary_slots => { debug!(target: "babe", "Verifying Secondary block"); let digest = (*authority_index, *slot_number); diff --git a/client/consensus/epochs/Cargo.toml b/client/consensus/epochs/Cargo.toml new file mode 100644 index 0000000000..e08553a241 --- /dev/null +++ b/client/consensus/epochs/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "sc-consensus-epochs" +version = "0.8.0" +authors = ["Parity Technologies "] +description = "Generic epochs-based utilities for consensus" +edition = "2018" + +[dependencies] +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } +parking_lot = "0.10.0" +fork-tree = { version = "2.0.0", path = "../../../utils/fork-tree" } +sp-runtime = { path = "../../../primitives/runtime" } +sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" } +sc-client-api = { path = "../../api" } diff --git a/client/consensus/babe/src/epoch_changes.rs b/client/consensus/epochs/src/lib.rs similarity index 79% rename from client/consensus/babe/src/epoch_changes.rs rename to client/consensus/epochs/src/lib.rs index 01e957c499..cf3d9f5c4c 100644 --- a/client/consensus/babe/src/epoch_changes.rs +++ b/client/consensus/epochs/src/lib.rs @@ -14,20 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Handling epoch changes in BABE. -//! -//! This exposes the `SharedEpochChanges`, which is a wrapper around a -//! persistent DAG superimposed over the forks of the blockchain. +//! Generic utilities for epoch-based consensus engines. -use std::sync::Arc; -use sp_consensus_babe::{Epoch, SlotNumber, NextEpochDescriptor}; -use fork_tree::ForkTree; -use parking_lot::{Mutex, MutexGuard}; -use sp_runtime::traits::{Block as BlockT, NumberFor, One, Zero}; +use std::{sync::Arc, ops::Add}; +use parking_lot::Mutex; use codec::{Encode, Decode}; +use fork_tree::ForkTree; use sc_client_api::utils::is_descendent_of; use sp_blockchain::{HeaderMetadata, HeaderBackend, Error as ClientError}; -use std::ops::Add; +use sp_runtime::traits::{Block as BlockT, NumberFor, One, Zero}; /// A builder for `is_descendent_of` functions. pub trait IsDescendentOfBuilder { @@ -48,13 +43,13 @@ pub trait IsDescendentOfBuilder { } /// Produce a descendent query object given the client. -pub(crate) fn descendent_query(client: &H) -> HeaderBackendDescendentBuilder<&H, Block> { +pub fn descendent_query(client: &H) -> HeaderBackendDescendentBuilder<&H, Block> { HeaderBackendDescendentBuilder(client, std::marker::PhantomData) } /// Wrapper to get around unconstrained type errors when implementing /// `IsDescendentOfBuilder` for header backends. -pub(crate) struct HeaderBackendDescendentBuilder(H, std::marker::PhantomData); +pub struct HeaderBackendDescendentBuilder(H, std::marker::PhantomData); impl<'a, H, Block> IsDescendentOfBuilder for HeaderBackendDescendentBuilder<&'a H, Block> where @@ -71,49 +66,73 @@ impl<'a, H, Block> IsDescendentOfBuilder } } +/// Epoch data, distinguish whether it is genesis or not. +pub trait Epoch { + /// Descriptor for the next epoch. + type NextEpochDescriptor; + /// Type of the slot number. + type SlotNumber: Ord; + + /// Increment the epoch data, using the next epoch descriptor. + fn increment(&self, descriptor: Self::NextEpochDescriptor) -> Self; + + /// Produce the "end slot" of the epoch. This is NOT inclusive to the epoch, + /// i.e. the slots covered by the epoch are `self.start_slot() .. self.end_slot()`. + fn end_slot(&self) -> Self::SlotNumber; + /// Produce the "start slot" of the epoch. + fn start_slot(&self) -> Self::SlotNumber; +} + /// An unimported genesis epoch. -pub struct UnimportedGenesis(Epoch); +pub struct UnimportedGenesisEpoch(Epoch); /// The viable epoch under which a block can be verified. /// /// If this is the first non-genesis block in the chain, then it will /// hold an `UnimportedGenesis` epoch. -pub enum ViableEpoch { - Genesis(UnimportedGenesis), +pub enum ViableEpoch { + /// Genesis viable epoch data. + Genesis(UnimportedGenesisEpoch), + /// Regular viable epoch data. Regular(Epoch), } -impl From for ViableEpoch { - fn from(epoch: Epoch) -> ViableEpoch { +impl From for ViableEpoch { + fn from(epoch: Epoch) -> ViableEpoch { ViableEpoch::Regular(epoch) } } -impl AsRef for ViableEpoch { +impl AsRef for ViableEpoch { fn as_ref(&self) -> &Epoch { match *self { - ViableEpoch::Genesis(UnimportedGenesis(ref e)) => e, + ViableEpoch::Genesis(UnimportedGenesisEpoch(ref e)) => e, ViableEpoch::Regular(ref e) => e, } } } -impl ViableEpoch { +impl ViableEpoch where + Epoch: crate::Epoch + Clone, +{ /// Extract the underlying epoch, disregarding the fact that a genesis /// epoch may be unimported. pub fn into_inner(self) -> Epoch { match self { - ViableEpoch::Genesis(UnimportedGenesis(e)) => e, + ViableEpoch::Genesis(UnimportedGenesisEpoch(e)) => e, ViableEpoch::Regular(e) => e, } } /// Increment the epoch, yielding an `IncrementedEpoch` to be imported /// into the fork-tree. - pub fn increment(&self, next_descriptor: NextEpochDescriptor) -> IncrementedEpoch { + pub fn increment( + &self, + next_descriptor: Epoch::NextEpochDescriptor + ) -> IncrementedEpoch { let next = self.as_ref().increment(next_descriptor); let to_persist = match *self { - ViableEpoch::Genesis(UnimportedGenesis(ref epoch_0)) => + ViableEpoch::Genesis(UnimportedGenesisEpoch(ref epoch_0)) => PersistedEpoch::Genesis(epoch_0.clone(), next), ViableEpoch::Regular(_) => PersistedEpoch::Regular(next), }; @@ -123,12 +142,11 @@ impl ViableEpoch { } /// The datatype encoded on disk. -// This really shouldn't be public, but the encode/decode derives force it to be. #[derive(Clone, Encode, Decode)] -pub enum PersistedEpoch { - // epoch_0, epoch_1, +pub enum PersistedEpoch { + /// Genesis persisted epoch data. epoch_0, epoch_1. Genesis(Epoch, Epoch), - // epoch_n + /// Regular persisted epoch data. epoch_n. Regular(Epoch), } @@ -136,9 +154,9 @@ pub enum PersistedEpoch { /// /// Create this with `ViableEpoch::increment`. #[must_use = "Freshly-incremented epoch must be imported with `EpochChanges::import`"] -pub struct IncrementedEpoch(PersistedEpoch); +pub struct IncrementedEpoch(PersistedEpoch); -impl AsRef for IncrementedEpoch { +impl AsRef for IncrementedEpoch { fn as_ref(&self) -> &Epoch { match self.0 { PersistedEpoch::Genesis(_, ref epoch_1) => epoch_1, @@ -151,7 +169,7 @@ impl AsRef for IncrementedEpoch { /// the hash and block number of the block signaling the epoch change, and the /// epoch that was signalled at that block. /// -/// BABE special-cases the first epoch, epoch_0, by saying that it starts at +/// The first epoch, epoch_0, is special cased by saying that it starts at /// slot number of the first block in the chain. When bootstrapping a chain, /// there can be multiple competing block #1s, so we have to ensure that the overlayed /// DAG doesn't get confused. @@ -163,8 +181,8 @@ impl AsRef for IncrementedEpoch { /// /// Further epochs (epoch_2, ..., epoch_n) each get their own entry. #[derive(Clone, Encode, Decode)] -pub struct EpochChanges { - inner: ForkTree, +pub struct EpochChanges { + inner: ForkTree>, } // create a fake header hash which hasn't been included in the chain. @@ -176,13 +194,23 @@ fn fake_head_hash + AsMut<[u8]> + Clone>(parent_hash: &H) -> H { h } -impl EpochChanges where +impl Default for EpochChanges where + Hash: PartialEq, + Number: Ord, +{ + fn default() -> Self { + EpochChanges { inner: ForkTree::new() } + } +} + +impl EpochChanges where Hash: PartialEq + AsRef<[u8]> + AsMut<[u8]> + Copy, Number: Ord + One + Zero + Add + Copy, + Epoch: crate::Epoch + Clone, { - /// Create a new epoch-change tracker. - fn new() -> Self { - EpochChanges { inner: ForkTree::new() } + /// Create a new epoch change. + pub fn new() -> Self { + Self::default() } /// Rebalances the tree of epoch changes so that it is sorted by length of @@ -199,12 +227,12 @@ impl EpochChanges where descendent_of_builder: D, hash: &Hash, number: Number, - slot: SlotNumber, + slot: Epoch::SlotNumber, ) -> Result<(), fork_tree::Error> { let is_descendent_of = descendent_of_builder .build_is_descendent_of(None); - let predicate = |epoch: &PersistedEpoch| match *epoch { + let predicate = |epoch: &PersistedEpoch| match *epoch { PersistedEpoch::Genesis(_, ref epoch_1) => slot >= epoch_1.end_slot(), PersistedEpoch::Regular(ref epoch_n) => @@ -233,10 +261,10 @@ impl EpochChanges where descendent_of_builder: D, parent_hash: &Hash, parent_number: Number, - slot_number: SlotNumber, + slot_number: Epoch::SlotNumber, make_genesis: G, - ) -> Result, fork_tree::Error> - where G: FnOnce(SlotNumber) -> Epoch + ) -> Result>, fork_tree::Error> + where G: FnOnce(Epoch::SlotNumber) -> Epoch { // find_node_where will give you the node in the fork-tree which is an ancestor // of the `parent_hash` by default. if the last epoch was signalled at the parent_hash, @@ -250,7 +278,7 @@ impl EpochChanges where if parent_number == Zero::zero() { // need to insert the genesis epoch. let genesis_epoch = make_genesis(slot_number); - return Ok(Some(ViableEpoch::Genesis(UnimportedGenesis(genesis_epoch)))); + return Ok(Some(ViableEpoch::Genesis(UnimportedGenesisEpoch(genesis_epoch)))); } // We want to find the deepest node in the tree which is an ancestor @@ -258,11 +286,11 @@ impl EpochChanges where // slot of our block. The genesis special-case doesn't need to look // at epoch_1 -- all we're doing here is figuring out which node // we need. - let predicate = |epoch: &PersistedEpoch| match *epoch { + let predicate = |epoch: &PersistedEpoch| match *epoch { PersistedEpoch::Genesis(ref epoch_0, _) => - epoch_0.start_slot <= slot_number, + epoch_0.start_slot() <= slot_number, PersistedEpoch::Regular(ref epoch_n) => - epoch_n.start_slot <= slot_number, + epoch_n.start_slot() <= slot_number, }; self.inner.find_node_where( @@ -276,7 +304,7 @@ impl EpochChanges where // and here we figure out which of the internal epochs // of a genesis node to use based on their start slot. PersistedEpoch::Genesis(ref epoch_0, ref epoch_1) => - if epoch_1.start_slot <= slot_number { + if epoch_1.start_slot() <= slot_number { epoch_1.clone() } else { epoch_0.clone() @@ -296,7 +324,7 @@ impl EpochChanges where hash: Hash, number: Number, parent_hash: Hash, - epoch: IncrementedEpoch, + epoch: IncrementedEpoch, ) -> Result<(), fork_tree::Error> { let is_descendent_of = descendent_of_builder .build_is_descendent_of(Some((hash, parent_hash))); @@ -314,47 +342,22 @@ impl EpochChanges where } } - /// Return the inner fork tree, useful for testing purposes. - #[cfg(test)] - pub fn tree(&self) -> &ForkTree { + /// Return the inner fork tree. + pub fn tree(&self) -> &ForkTree> { &self.inner } } /// Type alias to produce the epoch-changes tree from a block type. -pub type EpochChangesFor = EpochChanges<::Hash, NumberFor>; +pub type EpochChangesFor = EpochChanges<::Hash, NumberFor, Epoch>; /// A shared epoch changes tree. -#[derive(Clone)] -pub struct SharedEpochChanges { - inner: Arc>>, -} - -impl SharedEpochChanges { - /// Create a new instance of the `SharedEpochChanges`. - pub fn new() -> Self { - SharedEpochChanges { - inner: Arc::new(Mutex::new(EpochChanges::<_, _>::new())) - } - } - - /// Lock the shared epoch changes, - pub fn lock(&self) -> MutexGuard> { - self.inner.lock() - } -} - -impl From> for SharedEpochChanges { - fn from(epoch_changes: EpochChangesFor) -> Self { - SharedEpochChanges { - inner: Arc::new(Mutex::new(epoch_changes)) - } - } -} +pub type SharedEpochChanges = Arc>>; #[cfg(test)] mod tests { use super::*; + use super::Epoch as EpochT; #[derive(Debug, PartialEq)] pub struct TestError; @@ -396,6 +399,33 @@ mod tests { } type Hash = [u8; 1]; + type SlotNumber = u64; + + #[derive(Debug, Clone, Eq, PartialEq)] + struct Epoch { + start_slot: SlotNumber, + duration: SlotNumber, + } + + impl EpochT for Epoch { + type NextEpochDescriptor = (); + type SlotNumber = SlotNumber; + + fn increment(&self, _: ()) -> Self { + Epoch { + start_slot: self.start_slot + self.duration, + duration: self.duration, + } + } + + fn end_slot(&self) -> SlotNumber { + self.start_slot + self.duration + } + + fn start_slot(&self) -> SlotNumber { + self.start_slot + } + } #[test] fn genesis_epoch_is_created_but_not_imported() { @@ -414,11 +444,8 @@ mod tests { }; let make_genesis = |slot| Epoch { - epoch_index: 0, start_slot: slot, duration: 100, - authorities: Vec::new(), - randomness: [0; 32], }; let epoch_changes = EpochChanges::new(); @@ -468,11 +495,8 @@ mod tests { }; let make_genesis = |slot| Epoch { - epoch_index: 0, start_slot: slot, duration: 100, - authorities: Vec::new(), - randomness: [0; 32], }; let mut epoch_changes = EpochChanges::new(); @@ -486,10 +510,7 @@ mod tests { assert_eq!(genesis_epoch.as_ref(), &make_genesis(100)); - let import_epoch_1 = genesis_epoch.increment(NextEpochDescriptor { - authorities: Vec::new(), - randomness: [1; 32], - }); + let import_epoch_1 = genesis_epoch.increment(()); let epoch_1 = import_epoch_1.as_ref().clone(); epoch_changes.import( @@ -566,18 +587,12 @@ mod tests { let duration = 100; let make_genesis = |slot| Epoch { - epoch_index: 0, start_slot: slot, duration, - authorities: Vec::new(), - randomness: [0; 32], }; let mut epoch_changes = EpochChanges::new(); - let next_descriptor = NextEpochDescriptor { - authorities: Vec::new(), - randomness: [0; 32], - }; + let next_descriptor = (); // insert genesis epoch for A { diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index ab1822712f..1578d5c556 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -35,8 +35,9 @@ use sp_staking::{ use codec::{Encode, Decode}; use sp_inherents::{InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; use sp_consensus_babe::{ - BABE_ENGINE_ID, ConsensusLog, BabeAuthorityWeight, NextEpochDescriptor, RawBabePreDigest, - SlotNumber, inherents::{INHERENT_IDENTIFIER, BabeInherentData} + BABE_ENGINE_ID, ConsensusLog, BabeAuthorityWeight, SlotNumber, + inherents::{INHERENT_IDENTIFIER, BabeInherentData}, + digests::{NextEpochDescriptor, RawPreDigest}, }; pub use sp_consensus_babe::{AuthorityId, VRF_OUTPUT_LENGTH, PUBLIC_KEY_LENGTH}; @@ -205,11 +206,11 @@ impl FindAuthor for Module { { for (id, mut data) in digests.into_iter() { if id == BABE_ENGINE_ID { - let pre_digest = RawBabePreDigest::decode(&mut data).ok()?; + let pre_digest = RawPreDigest::decode(&mut data).ok()?; return Some(match pre_digest { - RawBabePreDigest::Primary { authority_index, .. } => + RawPreDigest::Primary { authority_index, .. } => authority_index, - RawBabePreDigest::Secondary { authority_index, .. } => + RawPreDigest::Secondary { authority_index, .. } => authority_index, }); } @@ -397,7 +398,7 @@ impl Module { .iter() .filter_map(|s| s.as_pre_runtime()) .filter_map(|(id, mut data)| if id == BABE_ENGINE_ID { - RawBabePreDigest::decode(&mut data).ok() + RawPreDigest::decode(&mut data).ok() } else { None }) @@ -424,7 +425,7 @@ impl Module { CurrentSlot::put(digest.slot_number()); - if let RawBabePreDigest::Primary { vrf_output, .. } = digest { + if let RawPreDigest::Primary { vrf_output, .. } = digest { // place the VRF output into the `Initialized` storage item // and it'll be put onto the under-construction randomness // later, once we've decided which epoch this block is in. diff --git a/frame/babe/src/tests.rs b/frame/babe/src/tests.rs index dbd6123816..976a264d7b 100644 --- a/frame/babe/src/tests.rs +++ b/frame/babe/src/tests.rs @@ -34,7 +34,7 @@ fn make_pre_digest( vrf_output: [u8; sp_consensus_babe::VRF_OUTPUT_LENGTH], vrf_proof: [u8; sp_consensus_babe::VRF_PROOF_LENGTH], ) -> Digest { - let digest_data = sp_consensus_babe::RawBabePreDigest::Primary { + let digest_data = sp_consensus_babe::digests::RawPreDigest::Primary { authority_index, slot_number, vrf_output, @@ -110,7 +110,7 @@ fn first_block_epoch_zero_start() { let authorities = Babe::authorities(); let consensus_log = sp_consensus_babe::ConsensusLog::NextEpochData( - sp_consensus_babe::NextEpochDescriptor { + sp_consensus_babe::digests::NextEpochDescriptor { authorities, randomness: Babe::randomness(), } diff --git a/primitives/consensus/babe/src/digest.rs b/primitives/consensus/babe/src/digests.rs similarity index 85% rename from primitives/consensus/babe/src/digest.rs rename to primitives/consensus/babe/src/digests.rs index cca088b92b..7ec0f9b977 100644 --- a/primitives/consensus/babe/src/digest.rs +++ b/primitives/consensus/babe/src/digests.rs @@ -41,7 +41,7 @@ use sp_std::vec::Vec; /// (VRF based) and to a secondary (slot number based). #[cfg(feature = "std")] #[derive(Clone, Debug)] -pub enum BabePreDigest { +pub enum PreDigest { /// A primary VRF-based slot assignment. Primary { /// VRF output @@ -63,20 +63,20 @@ pub enum BabePreDigest { } #[cfg(feature = "std")] -impl BabePreDigest { +impl PreDigest { /// Returns the slot number of the pre digest. pub fn authority_index(&self) -> AuthorityIndex { match self { - BabePreDigest::Primary { authority_index, .. } => *authority_index, - BabePreDigest::Secondary { authority_index, .. } => *authority_index, + PreDigest::Primary { authority_index, .. } => *authority_index, + PreDigest::Secondary { authority_index, .. } => *authority_index, } } /// Returns the slot number of the pre digest. pub fn slot_number(&self) -> SlotNumber { match self { - BabePreDigest::Primary { slot_number, .. } => *slot_number, - BabePreDigest::Secondary { slot_number, .. } => *slot_number, + PreDigest::Primary { slot_number, .. } => *slot_number, + PreDigest::Secondary { slot_number, .. } => *slot_number, } } @@ -84,18 +84,15 @@ impl BabePreDigest { /// of the chain. pub fn added_weight(&self) -> crate::BabeBlockWeight { match self { - BabePreDigest::Primary { .. } => 1, - BabePreDigest::Secondary { .. } => 0, + PreDigest::Primary { .. } => 1, + PreDigest::Secondary { .. } => 0, } } } -/// The prefix used by BABE for its VRF keys. -pub const BABE_VRF_PREFIX: &[u8] = b"substrate-babe-vrf"; - /// A raw version of `BabePreDigest`, usable on `no_std`. #[derive(Copy, Clone, Encode, Decode)] -pub enum RawBabePreDigest { +pub enum RawPreDigest { /// A primary VRF-based slot assignment. #[codec(index = "1")] Primary { @@ -123,38 +120,38 @@ pub enum RawBabePreDigest { }, } -impl RawBabePreDigest { +impl RawPreDigest { /// Returns the slot number of the pre digest. pub fn slot_number(&self) -> SlotNumber { match self { - RawBabePreDigest::Primary { slot_number, .. } => *slot_number, - RawBabePreDigest::Secondary { slot_number, .. } => *slot_number, + RawPreDigest::Primary { slot_number, .. } => *slot_number, + RawPreDigest::Secondary { slot_number, .. } => *slot_number, } } } #[cfg(feature = "std")] -impl Encode for BabePreDigest { +impl Encode for PreDigest { fn encode(&self) -> Vec { let raw = match self { - BabePreDigest::Primary { + PreDigest::Primary { vrf_output, vrf_proof, authority_index, slot_number, } => { - RawBabePreDigest::Primary { + RawPreDigest::Primary { vrf_output: *vrf_output.as_bytes(), vrf_proof: vrf_proof.to_bytes(), authority_index: *authority_index, slot_number: *slot_number, } }, - BabePreDigest::Secondary { + PreDigest::Secondary { authority_index, slot_number, } => { - RawBabePreDigest::Secondary { + RawPreDigest::Secondary { authority_index: *authority_index, slot_number: *slot_number, } @@ -166,26 +163,26 @@ impl Encode for BabePreDigest { } #[cfg(feature = "std")] -impl codec::EncodeLike for BabePreDigest {} +impl codec::EncodeLike for PreDigest {} #[cfg(feature = "std")] -impl Decode for BabePreDigest { +impl Decode for PreDigest { fn decode(i: &mut R) -> Result { let pre_digest = match Decode::decode(i)? { - RawBabePreDigest::Primary { vrf_output, vrf_proof, authority_index, slot_number } => { + RawPreDigest::Primary { vrf_output, vrf_proof, authority_index, slot_number } => { // Verify (at compile time) that the sizes in babe_primitives are correct let _: [u8; super::VRF_OUTPUT_LENGTH] = vrf_output; let _: [u8; super::VRF_PROOF_LENGTH] = vrf_proof; - BabePreDigest::Primary { + PreDigest::Primary { vrf_proof: VRFProof::from_bytes(&vrf_proof).map_err(convert_error)?, vrf_output: VRFOutput::from_bytes(&vrf_output).map_err(convert_error)?, authority_index, slot_number, } }, - RawBabePreDigest::Secondary { authority_index, slot_number } => { - BabePreDigest::Secondary { authority_index, slot_number } + RawPreDigest::Secondary { authority_index, slot_number } => { + PreDigest::Secondary { authority_index, slot_number } }, }; @@ -208,10 +205,10 @@ pub struct NextEpochDescriptor { #[cfg(feature = "std")] pub trait CompatibleDigestItem: Sized { /// Construct a digest item which contains a BABE pre-digest. - fn babe_pre_digest(seal: BabePreDigest) -> Self; + fn babe_pre_digest(seal: PreDigest) -> Self; /// If this item is an BABE pre-digest, return it. - fn as_babe_pre_digest(&self) -> Option; + fn as_babe_pre_digest(&self) -> Option; /// Construct a digest item which contains a BABE seal. fn babe_seal(signature: AuthoritySignature) -> Self; @@ -227,11 +224,11 @@ pub trait CompatibleDigestItem: Sized { impl CompatibleDigestItem for DigestItem where Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static { - fn babe_pre_digest(digest: BabePreDigest) -> Self { + fn babe_pre_digest(digest: PreDigest) -> Self { DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) } - fn as_babe_pre_digest(&self) -> Option { + fn as_babe_pre_digest(&self) -> Option { self.try_to(OpaqueDigestItemId::PreRuntime(&BABE_ENGINE_ID)) } diff --git a/primitives/consensus/babe/src/lib.rs b/primitives/consensus/babe/src/lib.rs index 4cdeb072bd..78c63e5022 100644 --- a/primitives/consensus/babe/src/lib.rs +++ b/primitives/consensus/babe/src/lib.rs @@ -19,22 +19,22 @@ #![forbid(unsafe_code, missing_docs, unused_variables, unused_imports)] #![cfg_attr(not(feature = "std"), no_std)] -mod digest; +pub mod digests; pub mod inherents; use codec::{Encode, Decode}; use sp_std::vec::Vec; use sp_runtime::{ConsensusEngineId, RuntimeDebug}; - -#[cfg(feature = "std")] -pub use digest::{BabePreDigest, CompatibleDigestItem}; -pub use digest::{BABE_VRF_PREFIX, RawBabePreDigest, NextEpochDescriptor}; +use crate::digests::NextEpochDescriptor; mod app { use sp_application_crypto::{app_crypto, key_types::BABE, sr25519}; app_crypto!(sr25519, BABE); } +/// The prefix used by BABE for its VRF keys. +pub const BABE_VRF_PREFIX: &[u8] = b"substrate-babe-vrf"; + /// A Babe authority keypair. Necessarily equivalent to the schnorrkel public key used in /// the main Babe module. If that ever changes, then this must, too. #[cfg(feature = "std")] @@ -78,40 +78,6 @@ pub type BabeAuthorityWeight = u64; /// The weight of a BABE block. pub type BabeBlockWeight = u32; -/// BABE epoch information -#[derive(Decode, Encode, Default, PartialEq, Eq, Clone, RuntimeDebug)] -pub struct Epoch { - /// The epoch index - pub epoch_index: u64, - /// The starting slot of the epoch, - pub start_slot: SlotNumber, - /// The duration of this epoch - pub duration: SlotNumber, - /// The authorities and their weights - pub authorities: Vec<(AuthorityId, BabeAuthorityWeight)>, - /// Randomness for this epoch - pub randomness: [u8; VRF_OUTPUT_LENGTH], -} - -impl Epoch { - /// "increment" the epoch, with given descriptor for the next. - pub fn increment(&self, descriptor: NextEpochDescriptor) -> Epoch { - Epoch { - epoch_index: self.epoch_index + 1, - start_slot: self.start_slot + self.duration, - duration: self.duration, - authorities: descriptor.authorities, - randomness: descriptor.randomness, - } - } - - /// Produce the "end slot" of the epoch. This is NOT inclusive to the epoch, - // i.e. the slots covered by the epoch are `self.start_slot .. self.end_slot()`. - pub fn end_slot(&self) -> SlotNumber { - self.start_slot + self.duration - } -} - /// An consensus log item for BABE. #[derive(Decode, Encode, Clone, PartialEq, Eq)] pub enum ConsensusLog { -- GitLab From dec1bb7d30f3afee7ab585c661b3f6100441c220 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 6 Feb 2020 18:52:30 +0100 Subject: [PATCH 265/296] babe: pass epoch data via intermediates (#4807) * babe: pass epoch data via intermediates * Switch to use Box for intermediates * Set intermediate.epoch to be Option * Fix proposer should put out an empty intermediate * Remove unnecessary encode/decode * Add EpochData to block_import_params in slot worker * Fix aura compile * Fix integration test --- Cargo.lock | 1 + bin/node/cli/Cargo.toml | 1 + bin/node/cli/src/service.rs | 28 ++++++++-- client/consensus/aura/src/lib.rs | 3 +- client/consensus/babe/src/lib.rs | 84 ++++++++++++++++++++---------- client/consensus/babe/src/tests.rs | 19 ++++++- client/consensus/slots/src/lib.rs | 4 +- 7 files changed, 106 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4771b78586..0333904bff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3391,6 +3391,7 @@ dependencies = [ "sc-client-api", "sc-client-db", "sc-consensus-babe", + "sc-consensus-epochs", "sc-finality-grandpa", "sc-keystore", "sc-network", diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index cf666ffdc5..d5f3f45b31 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -92,6 +92,7 @@ browser-utils = { path = "../../../utils/browser", optional = true } [dev-dependencies] sc-keystore = { version = "2.0.0", path = "../../../client/keystore" } sc-consensus-babe = { version = "0.8", features = ["test-helpers"], path = "../../../client/consensus/babe" } +sc-consensus-epochs = { version = "0.8", path = "../../../client/consensus/epochs" } sc-service-test = { version = "2.0.0", path = "../../../client/service/test" } futures = "0.3.1" tempfile = "3.1.0" diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index c462a60836..2c500c6a1c 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -371,8 +371,11 @@ pub fn new_light(config: NodeConfiguration) #[cfg(test)] mod tests { - use std::sync::Arc; - use sc_consensus_babe::CompatibleDigestItem; + use std::{sync::Arc, collections::HashMap, borrow::Cow, any::Any}; + use sc_consensus_babe::{ + CompatibleDigestItem, BabeIntermediate, INTERMEDIATE_KEY + }; + use sc_consensus_epochs::descendent_query; use sp_consensus::{ Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy, BlockImport, RecordProof, @@ -384,7 +387,7 @@ mod tests { use sp_core::{crypto::Pair as CryptoPair, H256}; use sp_runtime::{ generic::{BlockId, Era, Digest, SignedPayload}, - traits::Block as BlockT, + traits::{Block as BlockT, Header as HeaderT}, traits::Verify, OpaqueExtrinsic, }; @@ -499,11 +502,21 @@ mod tests { let parent_id = BlockId::number(service.client().chain_info().best_number); let parent_header = service.client().header(&parent_id).unwrap().unwrap(); + let parent_hash = parent_header.hash(); + let parent_number = *parent_header.number(); let mut proposer_factory = sc_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), }; + let epoch = babe_link.epoch_changes().lock().epoch_for_child_of( + descendent_query(&*service.client()), + &parent_hash, + parent_number, + slot_num, + |slot| babe_link.config().genesis_epoch(slot) + ).unwrap().unwrap(); + let mut digest = Digest::::default(); // even though there's only one authority some slots might be empty, @@ -555,7 +568,14 @@ mod tests { storage_changes: None, finalized: false, auxiliary: Vec::new(), - intermediates: Default::default(), + intermediates: { + let mut intermediates = HashMap::new(); + intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate { epoch }) as Box, + ); + intermediates + }, fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 4b107d87d5..434314a853 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -274,8 +274,9 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW Vec, StorageChanges, B>, Self::Claim, + Self::EpochData, ) -> sp_consensus::BlockImportParams> + Send> { - Box::new(|header, header_hash, body, storage_changes, pair| { + Box::new(|header, header_hash, body, storage_changes, pair, _epoch| { // sign the pre-sealed hash of the block and then // add it to a digest item. let signature = pair.sign(header_hash.as_ref()); diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index dbf61692eb..f9e3ef98d6 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -65,7 +65,10 @@ pub use sp_consensus_babe::{ digests::{PreDigest, CompatibleDigestItem, NextEpochDescriptor}, }; pub use sp_consensus::SyncOracle; -use std::{collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}}; +use std::{ + collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}, + any::Any, borrow::Cow +}; use sp_consensus_babe; use sp_consensus::{ImportResult, CanAuthorWith}; use sp_consensus::import_queue::{ @@ -103,7 +106,9 @@ use log::{warn, debug, info, trace}; use sc_consensus_slots::{ SlotWorker, SlotInfo, SlotCompatible, StorageChanges, CheckedHeader, check_equivocation, }; -use sc_consensus_epochs::{descendent_query, SharedEpochChanges, EpochChangesFor, Epoch as EpochT}; +use sc_consensus_epochs::{ + descendent_query, ViableEpoch, SharedEpochChanges, EpochChangesFor, Epoch as EpochT +}; use sp_blockchain::{ Result as ClientResult, Error as ClientError, HeaderBackend, ProvideCache, HeaderMetadata @@ -196,10 +201,6 @@ enum Error { FetchParentHeader(sp_blockchain::Error), #[display(fmt = "Expected epoch change to happen at {:?}, s{}", _0, _1)] ExpectedEpochChange(B::Hash, u64), - #[display(fmt = "Could not look up epoch: {:?}", _0)] - CouldNotLookUpEpoch(Box>), - #[display(fmt = "Block {} is not valid under any epoch.", _0)] - BlockNotValid(B::Hash), #[display(fmt = "Unexpected epoch change")] UnexpectedEpochChange, #[display(fmt = "Parent block of {} has no associated weight", _0)] @@ -231,6 +232,16 @@ macro_rules! babe_info { }; } + +/// Intermediate value passed to block importer. +pub struct BabeIntermediate { + /// The epoch data, if available. + pub epoch: ViableEpoch, +} + +/// Intermediate key for Babe engine. +pub static INTERMEDIATE_KEY: &[u8] = b"babe1"; + /// A slot duration. Create with `get_or_compute`. // FIXME: Once Rust has higher-kinded types, the duplication between this // and `super::babe::Config` can be eliminated. @@ -394,7 +405,7 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork SO: SyncOracle + Send + Clone, Error: std::error::Error + Send + From + From + 'static, { - type EpochData = Epoch; + type EpochData = ViableEpoch; type Claim = (PreDigest, AuthorityPair); type SyncOracle = SO; type CreateProposer = Pin sc_consensus_slots::SimpleSlotWorker for BabeWork |slot| self.config.genesis_epoch(slot) ) .map_err(|e| ConsensusError::ChainLookup(format!("{:?}", e)))? - .map(|e| e.into_inner()) .ok_or(sp_consensus::Error::InvalidAuthoritiesSet) } fn authorities_len(&self, epoch_data: &Self::EpochData) -> usize { - epoch_data.authorities.len() + epoch_data.as_ref().authorities.len() } fn claim_slot( &self, _parent_header: &B::Header, slot_number: SlotNumber, - epoch_data: &Epoch, + epoch_data: &ViableEpoch, ) -> Option { debug!(target: "babe", "Attempting to claim slot {}", slot_number); let s = authorship::claim_slot( slot_number, - epoch_data, + epoch_data.as_ref(), &*self.config, &self.keystore, ); @@ -469,8 +479,9 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork Vec, StorageChanges, Self::Claim, + Self::EpochData, ) -> sp_consensus::BlockImportParams + Send> { - Box::new(|header, header_hash, body, storage_changes, (_, pair)| { + Box::new(|header, header_hash, body, storage_changes, (_, pair), epoch| { // sign the pre-sealed hash of the block and then // add it to a digest item. let signature = pair.sign(header_hash.as_ref()); @@ -485,7 +496,14 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork storage_changes: Some(storage_changes), finalized: false, auxiliary: Vec::new(), // block-weight is written in block import. - intermediates: Default::default(), + intermediates: { + let mut intermediates = HashMap::new(); + intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate { epoch }) as Box, + ); + intermediates + }, fork_choice: None, allow_missing_state: false, import_existing: false, @@ -634,6 +652,19 @@ pub struct BabeLink { epoch_changes: SharedEpochChanges, config: Config, } + +impl BabeLink { + /// Get the epoch changes of this link. + pub fn epoch_changes(&self) -> &SharedEpochChanges { + &self.epoch_changes + } + + /// Get the config of this link. + pub fn config(&self) -> &Config { + &self.config + } +} + /// A verifier for Babe blocks. pub struct BabeVerifier { client: Arc>, @@ -830,6 +861,14 @@ impl Verifier for BabeVerifier ?pre_header); + let mut intermediates = HashMap::new(); + intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate { + epoch, + }) as Box, + ); + let block_import_params = BlockImportParams { origin, header: pre_header, @@ -839,7 +878,7 @@ impl Verifier for BabeVerifier BlockImport for BabeBlockImport| ConsensusError::ChainLookup( - babe_err(Error::::CouldNotLookUpEpoch(Box::new(e))).into() - ))? - .ok_or_else(|| ConsensusError::ClientImport( - babe_err(Error::::BlockNotValid(hash)).into() - ))?; + let intermediate = block.take_intermediate::( + INTERMEDIATE_KEY + )?; + let epoch = intermediate.epoch; let first_in_epoch = parent_slot < epoch.as_ref().start_slot; (epoch, first_in_epoch, parent_weight) }; diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 701155e7cc..687f23e646 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -565,8 +565,18 @@ fn propose_and_import_block( ], }; + let parent_hash = parent.hash(); + let mut block = futures::executor::block_on(proposer.propose_with(pre_digest)).unwrap().block; + let epoch = proposer_factory.epoch_changes.lock().epoch_for_child_of( + descendent_query(&*proposer_factory.client), + &parent_hash, + *parent.number(), + slot_number, + |slot| proposer_factory.config.genesis_epoch(slot) + ).unwrap().unwrap(); + let seal = { // sign the pre-sealed hash of the block and then // add it to a digest item. @@ -593,7 +603,14 @@ fn propose_and_import_block( storage_changes: None, finalized: false, auxiliary: Vec::new(), - intermediates: Default::default(), + intermediates: { + let mut intermediates = HashMap::new(); + intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate { epoch }) as Box, + ); + intermediates + }, fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, diff --git a/client/consensus/slots/src/lib.rs b/client/consensus/slots/src/lib.rs index c6185d5d30..8bc2547a49 100644 --- a/client/consensus/slots/src/lib.rs +++ b/client/consensus/slots/src/lib.rs @@ -81,7 +81,7 @@ pub trait SimpleSlotWorker { type Claim: Send + 'static; /// Epoch data necessary for authoring. - type EpochData; + type EpochData: Send + 'static; /// The logging target to use when logging messages. fn logging_target(&self) -> &'static str; @@ -119,6 +119,7 @@ pub trait SimpleSlotWorker { Vec, StorageChanges<>::Transaction, B>, Self::Claim, + Self::EpochData, ) -> sp_consensus::BlockImportParams< B, >::Transaction @@ -280,6 +281,7 @@ pub trait SimpleSlotWorker { body, proposal.storage_changes, claim, + epoch_data, ); info!( -- GitLab From f3742e70b2b74c541cf2e8ff2226be7d8f824ffe Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 6 Feb 2020 23:32:48 +0100 Subject: [PATCH 266/296] easy with threads (#4848) --- client/finality-grandpa/src/tests.rs | 34 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 0d7cf0541f..0f4d9dadd0 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -499,11 +499,17 @@ fn add_forced_change( )); } +fn thread_pool() -> futures::executor::ThreadPool { + futures::executor::ThreadPool::builder().pool_size(2) + .create() + .expect("never fails") +} + #[test] fn finalize_3_voters_no_observers() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); @@ -529,7 +535,7 @@ fn finalize_3_voters_no_observers() { #[test] fn finalize_3_voters_1_full_observer() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); @@ -635,7 +641,7 @@ fn transition_3_voters_twice_1_full_observer() { let net = Arc::new(Mutex::new(GrandpaTestNet::new(api, 8))); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); net.lock().peer(0).push_blocks(1, false); net.lock().block_until_sync(&mut runtime); @@ -770,7 +776,7 @@ fn transition_3_voters_twice_1_full_observer() { #[test] fn justification_is_emitted_when_consensus_data_changes() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); @@ -789,7 +795,7 @@ fn justification_is_emitted_when_consensus_data_changes() { #[test] fn justification_is_generated_periodically() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); @@ -829,7 +835,7 @@ fn consensus_changes_works() { #[test] fn sync_justifications_on_change_blocks() { let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_b); @@ -884,7 +890,7 @@ fn sync_justifications_on_change_blocks() { fn finalizes_multiple_pending_changes_in_order() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let peers_b = &[Ed25519Keyring::Dave, Ed25519Keyring::Eve, Ed25519Keyring::Ferdie]; @@ -945,7 +951,7 @@ fn finalizes_multiple_pending_changes_in_order() { fn force_change_to_new_set() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); // two of these guys are offline. let genesis_authorities = &[ Ed25519Keyring::Alice, @@ -1126,7 +1132,7 @@ fn voter_persists_its_votes() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); // we have two authorities but we'll only be running the voter for alice // we are going to be listening for the prevotes it casts @@ -1383,7 +1389,7 @@ fn voter_persists_its_votes() { fn finalize_3_voters_1_light_observer() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let authorities = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(authorities); @@ -1429,7 +1435,7 @@ fn finalize_3_voters_1_light_observer() { fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { let _ = ::env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers = &[Ed25519Keyring::Alice]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 1); @@ -1461,7 +1467,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ let _ = ::env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); // two of these guys are offline. let genesis_authorities = if FORCE_CHANGE { @@ -1526,7 +1532,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ fn voter_catches_up_to_latest_round_when_behind() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers); @@ -1646,7 +1652,7 @@ fn grandpa_environment_respects_voting_rules() { use finality_grandpa::Chain; use sc_network_test::TestClient; - let threads_pool = futures::executor::ThreadPool::new().unwrap(); + let threads_pool = thread_pool(); let peers = &[Ed25519Keyring::Alice]; let voters = make_ids(peers); -- GitLab From 18e6ea00188a50d6fc04de254923ab026228ed77 Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Fri, 7 Feb 2020 08:12:19 +0100 Subject: [PATCH 267/296] Enable trace timings logs for transaction factory (#4845) * Enable trace timings logs for transaction factory. --- Cargo.lock | 2 ++ bin/node/cli/Cargo.toml | 2 ++ bin/node/cli/src/command.rs | 10 ++++++++++ client/cli/src/lib.rs | 4 ++-- client/cli/src/params.rs | 28 ++++++++++++++-------------- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0333904bff..440b3b218e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3400,6 +3400,7 @@ dependencies = [ "sc-service", "sc-service-test", "sc-telemetry", + "sc-tracing", "sc-transaction-pool", "serde", "sp-authority-discovery", @@ -3417,6 +3418,7 @@ dependencies = [ "structopt", "substrate-build-script-utils", "tempfile", + "tracing", "vergen", "wasm-bindgen", "wasm-bindgen-futures", diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index d5f3f45b31..dad76ae4bf 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -32,6 +32,7 @@ jsonrpc-core = "14.0.3" log = "0.4.8" rand = "0.7.2" structopt = { version = "0.3.8", optional = true } +tracing = "0.1.10" # primitives sp-authority-discovery = { version = "2.0.0", path = "../../../primitives/authority-discovery" } @@ -60,6 +61,7 @@ sc-offchain = { version = "2.0.0", path = "../../../client/offchain" } sc-rpc = { version = "2.0.0", path = "../../../client/rpc" } sc-basic-authorship = { version = "0.8", path = "../../../client/basic-authorship" } sc-service = { version = "0.8", default-features = false, path = "../../../client/service" } +sc-tracing = { version = "2.0.0", path = "../../../client/tracing" } sc-telemetry = { version = "2.0.0", path = "../../../client/telemetry" } sc-authority-discovery = { version = "0.8", path = "../../../client/authority-discovery" } diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index eb18d6d8b3..f5d747a146 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -56,6 +56,16 @@ where _ => panic!("Factory is only supported for development and local testnet."), } + // Setup tracing. + if let Some(tracing_targets) = cli_args.shared_params.tracing_targets.as_ref() { + let subscriber = sc_tracing::ProfilingSubscriber::new( + cli_args.shared_params.tracing_receiver.into(), tracing_targets + ); + if let Err(e) = tracing::subscriber::set_global_default(subscriber) { + panic!("Unable to set global default subscriber {}", e); + } + } + let factory_state = FactoryState::new( cli_args.mode.clone(), cli_args.num, diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 7f72689336..0965a79f15 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -638,8 +638,8 @@ where config.telemetry_endpoints = Some(TelemetryEndpoints::new(cli.telemetry_endpoints)); } - config.tracing_targets = cli.tracing_targets.into(); - config.tracing_receiver = cli.tracing_receiver.into(); + config.tracing_targets = cli.shared_params.tracing_targets.into(); + config.tracing_receiver = cli.shared_params.tracing_receiver.into(); // Imply forced authoring on --dev config.force_authoring = cli.shared_params.dev || cli.force_authoring; diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 3a4aa319c6..1dc6b0567c 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -113,6 +113,20 @@ pub struct SharedParams { /// Sets a custom logging filter. #[structopt(short = "l", long = "log", value_name = "LOG_PATTERN")] pub log: Option, + + /// Comma separated list of targets for tracing + #[structopt(long = "tracing-targets", value_name = "TARGETS")] + pub tracing_targets: Option, + + /// Receiver to process tracing messages + #[structopt( + long = "tracing-receiver", + value_name = "RECEIVER", + possible_values = &TracingReceiver::variants(), + case_insensitive = true, + default_value = "Log" + )] + pub tracing_receiver: TracingReceiver, } /// Parameters for block import. @@ -579,20 +593,6 @@ pub struct RunCmd { #[structopt(long = "force-authoring")] pub force_authoring: bool, - /// Comma separated list of targets for tracing - #[structopt(long = "tracing-targets", value_name = "TARGETS")] - pub tracing_targets: Option, - - /// Receiver to process tracing messages - #[structopt( - long = "tracing-receiver", - value_name = "RECEIVER", - possible_values = &TracingReceiver::variants(), - case_insensitive = true, - default_value = "Log" - )] - pub tracing_receiver: TracingReceiver, - /// Specify custom keystore path. #[structopt(long = "keystore-path", value_name = "PATH", parse(from_os_str))] pub keystore_path: Option, -- GitLab From 65763cdb2474c664337e3a33bc9c7a548d34ea86 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 7 Feb 2020 11:53:11 +0100 Subject: [PATCH 268/296] Subsystems memory tracking: 1. Transaction pool (#4822) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update sp-runtime * total update * usage informant * update to crates.io version * update Cargo.lock * update dummy update * fix todo * cleanup * avoid custom impl * Update client/transaction-pool/graph/src/future.rs Co-Authored-By: Tomasz Drwięga * remove another custom impl * remove another custom impl * add kb in report * update Cargo.lock * review suggestions * --amend * --amend * bump parity-util-mem to 0.5.0 * bumps * update macro and versions * add to grafana * naming Co-authored-by: Tomasz Drwięga --- Cargo.lock | 45 +++++++++++-------- client/Cargo.toml | 4 +- client/api/Cargo.toml | 2 +- client/cli/Cargo.toml | 1 + client/cli/src/informant.rs | 6 +++ client/db/Cargo.toml | 10 ++--- client/service/Cargo.toml | 1 + client/service/src/builder.rs | 2 + client/transaction-pool/Cargo.toml | 1 + client/transaction-pool/graph/Cargo.toml | 1 + .../transaction-pool/graph/src/base_pool.rs | 31 ++++++++++++- client/transaction-pool/graph/src/future.rs | 30 ++++++++++++- client/transaction-pool/graph/src/pool.rs | 10 +++++ client/transaction-pool/graph/src/ready.rs | 24 ++++++++-- .../graph/src/validated_pool.rs | 11 +++++ client/transaction-pool/src/lib.rs | 12 +++++ client/transaction-pool/src/testing/pool.rs | 11 +++++ frame/system/src/lib.rs | 6 +-- primitives/core/Cargo.toml | 1 + primitives/core/src/changes_trie.rs | 2 +- primitives/runtime/Cargo.toml | 2 + primitives/runtime/src/generic/block.rs | 6 +-- primitives/runtime/src/generic/digest.rs | 5 ++- primitives/runtime/src/generic/header.rs | 22 ++++++++- .../src/generic/unchecked_extrinsic.rs | 12 +++++ primitives/runtime/src/lib.rs | 7 +++ primitives/runtime/src/testing.rs | 13 ++++-- primitives/runtime/src/traits.rs | 26 +++++++---- primitives/test-primitives/Cargo.toml | 1 + primitives/test-primitives/src/lib.rs | 1 + primitives/transaction-pool/src/pool.rs | 4 +- test-utils/runtime/Cargo.toml | 1 + test-utils/runtime/src/lib.rs | 2 + utils/browser/Cargo.toml | 2 +- 34 files changed, 257 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 440b3b218e..ca7a5d1844 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2527,31 +2527,31 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8396be0e5561ccd1bf7ff0b2007487cdd7a87a056873fe6ea906b35d4dbf7ed8" +checksum = "03080afe6f42cd996da9f568d6add5d7fb5ee2ea7fb7802d2d2cbd836958fd87" dependencies = [ "parity-bytes", - "parity-util-mem 0.4.1", + "parity-util-mem 0.5.1", "smallvec 1.2.0", ] [[package]] name = "kvdb-memorydb" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25ef14155e418515c4839e9144c839de3506e68946f255a32b7f166095493d" +checksum = "b9355274e5a9e0a7e8ef43916950eae3949024de2a8dffe4d5a6c13974a37c8e" dependencies = [ "kvdb", - "parity-util-mem 0.4.1", - "parking_lot 0.9.0", + "parity-util-mem 0.5.1", + "parking_lot 0.10.0", ] [[package]] name = "kvdb-rocksdb" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af488cc16c3801705c8d681c3a32c8faa8fafc7fb5309dee0f573f3c6a19d395" +checksum = "af36fd66ccd99f3f771ae39b75aaba28b952372b6debfb971134bf1f03466ab2" dependencies = [ "fs-swap", "interleaved-ordered", @@ -2559,8 +2559,8 @@ dependencies = [ "log 0.4.8", "num_cpus", "owning_ref", - "parity-util-mem 0.4.1", - "parking_lot 0.9.0", + "parity-util-mem 0.5.1", + "parking_lot 0.10.0", "regex", "rocksdb", "smallvec 1.2.0", @@ -2568,16 +2568,16 @@ dependencies = [ [[package]] name = "kvdb-web" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a0e36637fb86454de401e7cb88f40eb0ad1b9bcee837d46785e7c451f1ebf4" +checksum = "7a985c47b4c46429e96033ebf6eaed784a81ceccb4e5df13d63f3b9078a4df81" dependencies = [ "futures 0.3.1", "js-sys", "kvdb", "kvdb-memorydb", "log 0.4.8", - "parity-util-mem 0.4.1", + "parity-util-mem 0.5.1", "send_wrapper 0.3.0", "wasm-bindgen", "web-sys", @@ -4620,14 +4620,15 @@ dependencies = [ [[package]] name = "parity-util-mem" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900dd84654b048e5bad420bb341658fc2c4d7fea628c22bcf4621733e54859b4" +checksum = "ef1476e40bf8f5c6776e9600983435821ca86eb9819d74a6207cca69d091406a" dependencies = [ "cfg-if", "impl-trait-for-tuples", "parity-util-mem-derive", - "parking_lot 0.9.0", + "parking_lot 0.10.0", + "primitive-types", "smallvec 1.2.0", "winapi 0.3.8", ] @@ -5629,6 +5630,7 @@ dependencies = [ "lazy_static", "log 0.4.8", "names", + "parity-util-mem 0.5.1", "regex", "rpassword", "sc-client-api", @@ -5729,7 +5731,7 @@ dependencies = [ "linked-hash-map", "log 0.4.8", "parity-scale-codec", - "parity-util-mem 0.4.1", + "parity-util-mem 0.5.1", "parking_lot 0.10.0", "quickcheck", "sc-client", @@ -6308,6 +6310,7 @@ dependencies = [ "log 0.4.8", "parity-multiaddr 0.5.0", "parity-scale-codec", + "parity-util-mem 0.5.1", "parking_lot 0.10.0", "sc-chain-spec", "sc-client", @@ -6422,6 +6425,7 @@ dependencies = [ "futures 0.3.1", "log 0.4.8", "parity-scale-codec", + "parity-util-mem 0.5.1", "parking_lot 0.10.0", "serde", "sp-core", @@ -6439,6 +6443,7 @@ dependencies = [ "futures-diagnose", "log 0.4.8", "parity-scale-codec", + "parity-util-mem 0.5.1", "parking_lot 0.10.0", "sc-client-api", "sc-transaction-graph", @@ -7001,6 +7006,7 @@ dependencies = [ "log 0.4.8", "num-traits", "parity-scale-codec", + "parity-util-mem 0.5.1", "parking_lot 0.10.0", "pretty_assertions", "primitive-types", @@ -7146,6 +7152,7 @@ dependencies = [ "impl-trait-for-tuples", "log 0.4.8", "parity-scale-codec", + "parity-util-mem 0.5.1", "paste", "rand 0.7.3", "serde", @@ -7290,6 +7297,7 @@ name = "sp-test-primitives" version = "2.0.0" dependencies = [ "parity-scale-codec", + "parity-util-mem 0.5.1", "serde", "sp-application-crypto", "sp-core", @@ -7571,6 +7579,7 @@ dependencies = [ "pallet-babe", "pallet-timestamp", "parity-scale-codec", + "parity-util-mem 0.5.1", "sc-client", "sc-executor", "serde", diff --git a/client/Cargo.toml b/client/Cargo.toml index 8560408569..c89fe88145 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -19,7 +19,7 @@ hash-db = { version = "0.15.2" } hex-literal = { version = "0.2.1" } sp-inherents = { version = "2.0.0", path = "../primitives/inherents" } sp-keyring = { version = "2.0.0", path = "../primitives/keyring" } -kvdb = "0.3.0" +kvdb = "0.4.0" log = { version = "0.4.8" } parking_lot = "0.10.0" sp-core = { version = "2.0.0", path = "../primitives/core" } @@ -37,5 +37,5 @@ tracing = "0.1.10" env_logger = "0.7.0" tempfile = "3.1.0" substrate-test-runtime-client = { version = "2.0.0", path = "../test-utils/runtime/client" } -kvdb-memorydb = "0.3.0" +kvdb-memorydb = "0.4.0" sp-panic-handler = { version = "2.0.0", path = "../primitives/panic-handler" } diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 4c2867deb3..27a40c4d94 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -18,7 +18,7 @@ sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } sp-inherents = { version = "2.0.0", default-features = false, path = "../../primitives/inherents" } sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } -kvdb = "0.3.0" +kvdb = "0.4.0" log = { version = "0.4.8" } parking_lot = "0.10.0" sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index abfb53ccb1..e302d53d55 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -35,6 +35,7 @@ names = "0.11.0" structopt = "0.3.8" sc-tracing = { version = "2.0.0", path = "../tracing" } chrono = "0.4.10" +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } [target.'cfg(not(target_os = "unknown"))'.dependencies] rpassword = "4.0.1" diff --git a/client/cli/src/informant.rs b/client/cli/src/informant.rs index 312e4017d5..9e7c5044e0 100644 --- a/client/cli/src/informant.rs +++ b/client/cli/src/informant.rs @@ -28,6 +28,7 @@ mod display; /// Creates an informant in the form of a `Future` that must be polled regularly. pub fn build(service: &impl AbstractService) -> impl futures::Future { let client = service.client(); + let pool = service.transaction_pool(); let mut display = display::InformantDisplay::new(); @@ -40,6 +41,11 @@ pub fn build(service: &impl AbstractService) -> impl futures::Future info.usage.as_ref().map(|usage| usage.memory.database_cache).unwrap_or(0), "disk_read_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_read).unwrap_or(0), "disk_write_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_written).unwrap_or(0), + "memory_transaction_pool" => parity_util_mem::malloc_size(&*transaction_pool_), ); ready(()) }); + let _ = to_spawn_tx.unbounded_send(( Box::pin(select(tel_task, exit.clone()).map(drop)), From::from("telemetry-periodic-send") diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 1387d1df27..524e9a98a0 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -19,6 +19,7 @@ sc-transaction-graph = { version = "2.0.0", path = "./graph" } sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } sc-client-api = { version = "2.0.0", path = "../api" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } [dev-dependencies] sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index 4f12ab7fcc..2d3172fc91 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -14,6 +14,7 @@ serde = { version = "1.0.101", features = ["derive"] } sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } [dev-dependencies] assert_matches = "1.3.0" diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 7b7900c3e9..52e00df363 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -84,7 +84,7 @@ pub struct PruneStatus { /// Immutable transaction #[cfg_attr(test, derive(Clone))] -#[derive(PartialEq, Eq)] +#[derive(PartialEq, Eq, parity_util_mem::MallocSizeOf)] pub struct Transaction { /// Raw extrinsic representing that transaction. pub data: Extrinsic, @@ -209,7 +209,7 @@ const RECENTLY_PRUNED_TAGS: usize = 2; /// as-is for the second time will fail or produce unwanted results. /// Most likely it is required to revalidate them and recompute set of /// required tags. -#[derive(Debug)] +#[derive(Debug, parity_util_mem::MallocSizeOf)] pub struct BasePool { reject_future_transactions: bool, future: FutureTransactions, @@ -846,6 +846,33 @@ mod tests { } } + #[test] + fn can_track_heap_size() { + let mut pool = pool(); + pool.import(Transaction { + data: vec![5u8; 1024], + bytes: 1, + hash: 5, + priority: 5u64, + valid_till: 64u64, + requires: vec![], + provides: vec![vec![0], vec![4]], + propagate: true, + }).expect("import 1 should be ok"); + pool.import(Transaction { + data: vec![3u8; 1024], + bytes: 1, + hash: 7, + priority: 5u64, + valid_till: 64u64, + requires: vec![], + provides: vec![vec![2], vec![7]], + propagate: true, + }).expect("import 2 should be ok"); + + assert!(parity_util_mem::malloc_size(&pool) > 5000); + } + #[test] fn should_remove_invalid_transactions() { // given diff --git a/client/transaction-pool/graph/src/future.rs b/client/transaction-pool/graph/src/future.rs index 0de50c1a65..bda26fe34f 100644 --- a/client/transaction-pool/graph/src/future.rs +++ b/client/transaction-pool/graph/src/future.rs @@ -29,6 +29,7 @@ use sp_runtime::transaction_validity::{ use crate::base_pool::Transaction; +#[derive(parity_util_mem::MallocSizeOf)] /// Transaction with partially satisfied dependencies. pub struct WaitingTransaction { /// Transaction details. @@ -109,7 +110,7 @@ impl WaitingTransaction { /// /// Contains transactions that are still awaiting for some other transactions that /// could provide a tag that they require. -#[derive(Debug)] +#[derive(Debug, parity_util_mem::MallocSizeOf)] pub struct FutureTransactions { /// tags that are not yet provided by any transaction and we await for them wanted_tags: HashMap>, @@ -243,3 +244,30 @@ impl FutureTransactions { self.waiting.values().fold(0, |acc, tx| acc + tx.transaction.bytes) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn can_track_heap_size() { + let mut future = FutureTransactions::default(); + future.import(WaitingTransaction { + transaction: Transaction { + data: vec![0u8; 1024], + bytes: 1, + hash: 1, + priority: 1, + valid_till: 2, + requires: vec![vec![1], vec![2]], + provides: vec![vec![3], vec![4]], + propagate: true, + }.into(), + missing_tags: vec![vec![1u8], vec![2u8]].into_iter().collect(), + imported_at: std::time::Instant::now(), + }); + + // data is at least 1024! + assert!(parity_util_mem::malloc_size(&future) > 1024); + } +} diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index 91ce58518a..ab4e3a5a79 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -122,6 +122,16 @@ pub struct Pool { validated_pool: Arc>, } +impl parity_util_mem::MallocSizeOf for Pool +where + B::Hash: parity_util_mem::MallocSizeOf, + ExtrinsicFor: parity_util_mem::MallocSizeOf, +{ + fn size_of(&self, ops: &mut parity_util_mem::MallocSizeOfOps) -> usize { + self.validated_pool.size_of(ops) + } +} + impl Pool { /// Create a new transaction pool. pub fn new(options: Options, api: Arc) -> Self { diff --git a/client/transaction-pool/graph/src/ready.rs b/client/transaction-pool/graph/src/ready.rs index ec8d66e6b9..23f0d49a93 100644 --- a/client/transaction-pool/graph/src/ready.rs +++ b/client/transaction-pool/graph/src/ready.rs @@ -36,7 +36,7 @@ use crate::base_pool::Transaction; /// An in-pool transaction reference. /// /// Should be cheap to clone. -#[derive(Debug)] +#[derive(Debug, parity_util_mem::MallocSizeOf)] pub struct TransactionRef { /// The actual transaction data. pub transaction: Arc>, @@ -74,7 +74,7 @@ impl PartialEq for TransactionRef { } impl Eq for TransactionRef {} -#[derive(Debug)] +#[derive(Debug, parity_util_mem::MallocSizeOf)] pub struct ReadyTx { /// A reference to a transaction pub transaction: TransactionRef, @@ -104,7 +104,7 @@ Hence every hash retrieved from `provided_tags` is always present in `ready`; qed "#; -#[derive(Debug)] +#[derive(Debug, parity_util_mem::MallocSizeOf)] pub struct ReadyTransactions { /// Insertion id insertion_id: u64, @@ -676,6 +676,24 @@ mod tests { assert_eq!(it.next(), None); } + #[test] + fn can_report_heap_size() { + let mut ready = ReadyTransactions::default(); + let tx = Transaction { + data: vec![5], + bytes: 1, + hash: 5, + priority: 1, + valid_till: u64::max_value(), // use the max_value() here for testing. + requires: vec![], + provides: vec![], + propagate: true, + }; + import(&mut ready, tx).unwrap(); + + assert!(parity_util_mem::malloc_size(&ready) > 200); + } + #[test] fn should_order_refs() { let mut id = 1; diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index c7e60deb4a..9524284064 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -74,6 +74,17 @@ pub(crate) struct ValidatedPool { rotator: PoolRotator>, } +impl parity_util_mem::MallocSizeOf for ValidatedPool +where + B::Hash: parity_util_mem::MallocSizeOf, + ExtrinsicFor: parity_util_mem::MallocSizeOf, +{ + fn size_of(&self, ops: &mut parity_util_mem::MallocSizeOfOps) -> usize { + // other entries insignificant or non-primary references + self.pool.size_of(ops) + } +} + impl ValidatedPool { /// Create a new transaction pool. pub fn new(options: Options, api: Arc) -> Self { diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 85bf2fd327..7084e1c4a0 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -53,6 +53,18 @@ pub struct BasicPool revalidation_strategy: Arc>>>, } +impl parity_util_mem::MallocSizeOf for BasicPool +where + PoolApi: sc_transaction_graph::ChainApi, + PoolApi::Hash: parity_util_mem::MallocSizeOf, + Block: BlockT, +{ + fn size_of(&self, ops: &mut parity_util_mem::MallocSizeOfOps) -> usize { + // other entries insignificant or non-primary references + self.pool.size_of(ops) + } +} + /// Type of revalidation. pub enum RevalidationType { /// Light revalidation type. diff --git a/client/transaction-pool/src/testing/pool.rs b/client/transaction-pool/src/testing/pool.rs index d4f3d0ccb4..fed02067b1 100644 --- a/client/transaction-pool/src/testing/pool.rs +++ b/client/transaction-pool/src/testing/pool.rs @@ -215,3 +215,14 @@ fn should_not_retain_invalid_hashes_from_retracted() { block_on(pool.maintain(&BlockId::number(1), &[retracted_hash])); assert_eq!(pool.status().ready, 0); } + +#[test] +fn can_track_heap_size() { + let pool = maintained_pool(); + block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 209))).expect("1. Imported"); + block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 210))).expect("1. Imported"); + block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 211))).expect("1. Imported"); + block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 212))).expect("1. Imported"); + + assert!(parity_util_mem::malloc_size(&pool) > 3000); +} \ No newline at end of file diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 4a06dec6ee..a0f3700c9d 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -106,7 +106,7 @@ use sp_runtime::{ traits::{ self, CheckEqual, SimpleArithmetic, Zero, SignedExtension, Lookup, LookupError, SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, BadOrigin, SaturatedConversion, - MaybeSerialize, MaybeSerializeDeserialize, StaticLookup, One, Bounded, + MaybeSerialize, MaybeSerializeDeserialize, MaybeMallocSizeOf, StaticLookup, One, Bounded, }, }; @@ -171,12 +171,12 @@ pub trait Trait: 'static + Eq + Clone { /// The block number type used by the runtime. type BlockNumber: Parameter + Member + MaybeSerializeDeserialize + Debug + MaybeDisplay + SimpleArithmetic - + Default + Bounded + Copy + sp_std::hash::Hash + sp_std::str::FromStr; + + Default + Bounded + Copy + sp_std::hash::Hash + sp_std::str::FromStr + MaybeMallocSizeOf; /// The output of the `Hashing` function. type Hash: Parameter + Member + MaybeSerializeDeserialize + Debug + MaybeDisplay + SimpleBitOps + Ord - + Default + Copy + CheckEqual + sp_std::hash::Hash + AsRef<[u8]> + AsMut<[u8]>; + + Default + Copy + CheckEqual + sp_std::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + MaybeMallocSizeOf; /// The hashing system (algorithm) being used in the runtime (e.g. Blake2). type Hashing: Hash; diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 873d607ecd..9bd30d1823 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -30,6 +30,7 @@ sp-debug-derive = { version = "2.0.0", path = "../debug-derive" } sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } sp-storage = { version = "2.0.0", default-features = false, path = "../storage" } libsecp256k1 = { version = "0.3.2", default-features = false } +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } # full crypto ed25519-dalek = { version = "1.0.0-pre.3", default-features = false, features = ["u64_backend", "alloc"], optional = true } diff --git a/primitives/core/src/changes_trie.rs b/primitives/core/src/changes_trie.rs index d38761ccf0..cb21ffe13d 100644 --- a/primitives/core/src/changes_trie.rs +++ b/primitives/core/src/changes_trie.rs @@ -22,7 +22,7 @@ use codec::{Encode, Decode}; use num_traits::Zero; /// Substrate changes trie configuration. -#[cfg_attr(any(feature = "std", test), derive(Serialize, Deserialize))] +#[cfg_attr(any(feature = "std", test), derive(Serialize, Deserialize, parity_util_mem::MallocSizeOf))] #[derive(Debug, Clone, PartialEq, Eq, Default, Encode, Decode)] pub struct ChangesTrieConfiguration { /// Interval (in blocks) at which level1-digests are created. Digests are not diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index 6f50a1a4d9..bf7b2b80a3 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -18,6 +18,7 @@ paste = "0.1.6" rand = { version = "0.7.2", optional = true } impl-trait-for-tuples = "0.1.3" sp-inherents = { version = "2.0.0", default-features = false, path = "../inherents" } +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } [dev-dependencies] serde_json = "1.0.41" @@ -37,4 +38,5 @@ std = [ "sp-io/std", "serde", "sp-inherents/std", + "parity-util-mem/std", ] diff --git a/primitives/runtime/src/generic/block.rs b/primitives/runtime/src/generic/block.rs index 21e65d1fb5..a46396dce0 100644 --- a/primitives/runtime/src/generic/block.rs +++ b/primitives/runtime/src/generic/block.rs @@ -25,7 +25,7 @@ use serde::{Deserialize, Serialize}; use sp_std::prelude::*; use sp_core::RuntimeDebug; use crate::codec::{Codec, Encode, Decode}; -use crate::traits::{self, Member, Block as BlockT, Header as HeaderT, MaybeSerialize}; +use crate::traits::{self, Member, Block as BlockT, Header as HeaderT, MaybeSerialize, MaybeMallocSizeOf}; use crate::Justification; /// Something to identify a block. @@ -63,7 +63,7 @@ impl fmt::Display for BlockId { /// Abstraction over a substrate block. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, parity_util_mem::MallocSizeOf))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Block { @@ -76,7 +76,7 @@ pub struct Block { impl traits::Block for Block where Header: HeaderT, - Extrinsic: Member + Codec + traits::Extrinsic, + Extrinsic: Member + Codec + traits::Extrinsic + MaybeMallocSizeOf, { type Extrinsic = Extrinsic; type Header = Header; diff --git a/primitives/runtime/src/generic/digest.rs b/primitives/runtime/src/generic/digest.rs index fef02d4f00..4d09b58793 100644 --- a/primitives/runtime/src/generic/digest.rs +++ b/primitives/runtime/src/generic/digest.rs @@ -27,7 +27,7 @@ use sp_core::{ChangesTrieConfiguration, RuntimeDebug}; /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, parity_util_mem::MallocSizeOf))] pub struct Digest { /// A list of logs in the digest. pub logs: Vec>, @@ -74,6 +74,7 @@ impl Digest { /// Digest item that is able to encode/decode 'system' digest items and /// provide opaque access to other items. #[derive(PartialEq, Eq, Clone, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(parity_util_mem::MallocSizeOf))] 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 @@ -107,7 +108,7 @@ pub enum DigestItem { /// Available changes trie signals. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Debug, parity_util_mem::MallocSizeOf))] pub enum ChangesTrieSignal { /// New changes trie configuration is enacted, starting from **next block**. /// diff --git a/primitives/runtime/src/generic/header.rs b/primitives/runtime/src/generic/header.rs index 51f31af078..5bc7932feb 100644 --- a/primitives/runtime/src/generic/header.rs +++ b/primitives/runtime/src/generic/header.rs @@ -22,6 +22,7 @@ use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef use crate::traits::{ self, Member, SimpleArithmetic, SimpleBitOps, Hash as HashT, MaybeSerializeDeserialize, MaybeSerialize, MaybeDisplay, + MaybeMallocSizeOf, }; use crate::generic::Digest; use sp_core::U256; @@ -51,6 +52,22 @@ pub struct Header + TryFrom, Hash: HashT> { pub digest: Digest, } +#[cfg(feature = "std")] +impl parity_util_mem::MallocSizeOf for Header +where + Number: Copy + Into + TryFrom + parity_util_mem::MallocSizeOf, + Hash: HashT, + Hash::Output: parity_util_mem::MallocSizeOf, +{ + fn size_of(&self, ops: &mut parity_util_mem::MallocSizeOfOps) -> usize { + self.parent_hash.size_of(ops) + + self.number.size_of(ops) + + self.state_root.size_of(ops) + + self.extrinsics_root.size_of(ops) + + self.digest.size_of(ops) + } +} + #[cfg(feature = "std")] pub fn serialize_number + TryFrom>( val: &T, s: S, @@ -105,10 +122,11 @@ impl codec::EncodeLike for Header where impl traits::Header for Header where Number: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + MaybeDisplay + - SimpleArithmetic + Codec + Copy + Into + TryFrom + sp_std::str::FromStr, + SimpleArithmetic + Codec + Copy + Into + TryFrom + sp_std::str::FromStr + + MaybeMallocSizeOf, Hash: HashT, Hash::Output: Default + sp_std::hash::Hash + Copy + Member + Ord + - MaybeSerialize + Debug + MaybeDisplay + SimpleBitOps + Codec, + MaybeSerialize + Debug + MaybeDisplay + SimpleBitOps + Codec + MaybeMallocSizeOf, { type Number = Number; type Hash = ::Output; diff --git a/primitives/runtime/src/generic/unchecked_extrinsic.rs b/primitives/runtime/src/generic/unchecked_extrinsic.rs index 1625d42e93..a516bc1f7f 100644 --- a/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -44,6 +44,18 @@ where pub function: Call, } +#[cfg(feature = "std")] +impl parity_util_mem::MallocSizeOf + for UncheckedExtrinsic +where + Extra: SignedExtension +{ + fn size_of(&self, _ops: &mut parity_util_mem::MallocSizeOfOps) -> usize { + // Instantiated only in runtime. + 0 + } +} + impl UncheckedExtrinsic { diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 46930c35e8..8d8effcc66 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -639,6 +639,13 @@ macro_rules! assert_eq_error_rate { #[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] pub struct OpaqueExtrinsic(pub Vec); +#[cfg(feature = "std")] +impl parity_util_mem::MallocSizeOf for OpaqueExtrinsic { + fn size_of(&self, ops: &mut parity_util_mem::MallocSizeOfOps) -> usize { + self.0.size_of(ops) + } +} + impl sp_std::fmt::Debug for OpaqueExtrinsic { #[cfg(feature = "std")] fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { diff --git a/primitives/runtime/src/testing.rs b/primitives/runtime/src/testing.rs index c86638b57b..e3e94c3c9f 100644 --- a/primitives/runtime/src/testing.rs +++ b/primitives/runtime/src/testing.rs @@ -148,7 +148,7 @@ pub type DigestItem = generic::DigestItem; pub type Digest = generic::Digest; /// Block Header -#[derive(PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode, Default)] +#[derive(PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode, Default, parity_util_mem::MallocSizeOf)] #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] pub struct Header { @@ -220,10 +220,12 @@ impl<'a> Deserialize<'a> for Header { } /// An opaque extrinsic wrapper type. -#[derive(PartialEq, Eq, Clone, Debug, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Debug, Encode, Decode, parity_util_mem::MallocSizeOf)] pub struct ExtrinsicWrapper(Xt); -impl traits::Extrinsic for ExtrinsicWrapper { +impl traits::Extrinsic for ExtrinsicWrapper +where Xt: parity_util_mem::MallocSizeOf +{ type Call = (); type SignaturePayload = (); @@ -253,7 +255,7 @@ impl Deref for ExtrinsicWrapper { } /// Testing block -#[derive(PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode, parity_util_mem::MallocSizeOf)] pub struct Block { /// Block header pub header: Header, @@ -300,6 +302,9 @@ impl<'a, Xt> Deserialize<'a> for Block where Block: Decode { #[derive(PartialEq, Eq, Clone, Encode, Decode)] pub struct TestXt(pub Option<(u64, Extra)>, pub Call); +// Non-opaque extrinsics always 0. +parity_util_mem::malloc_size_of_is_0!(any: TestXt); + impl Serialize for TestXt where TestXt: Encode { fn serialize(&self, seq: S) -> Result where S: Serializer { self.using_encoded(|bytes| seq.serialize_bytes(bytes)) diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index f8c2ed11a4..f07f4dd7ac 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -470,6 +470,9 @@ sp_core::impl_maybe_marker!( /// A type that implements Serialize, DeserializeOwned and Debug when in std environment. trait MaybeSerializeDeserialize: DeserializeOwned, Serialize; + + /// A type that implements MallocSizeOf. + trait MaybeMallocSizeOf: parity_util_mem::MallocSizeOf; ); /// A type that provides a randomness beacon. @@ -503,13 +506,18 @@ pub trait IsMember { /// `parent_hash`, as well as a `digest` and a block `number`. /// /// You can also create a `new` one from those fields. -pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + 'static { +pub trait Header: + Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + + MaybeMallocSizeOf + 'static +{ /// Header number. type Number: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash - + Copy + MaybeDisplay + SimpleArithmetic + Codec + sp_std::str::FromStr; + + Copy + MaybeDisplay + SimpleArithmetic + Codec + sp_std::str::FromStr + + MaybeMallocSizeOf; /// Header hash type type Hash: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + Ord - + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; + + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + + AsMut<[u8]> + MaybeMallocSizeOf; /// Hashing algorithm type Hashing: Hash; @@ -557,14 +565,15 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + 's /// `Extrinsic` pieces of information as well as a `Header`. /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. -pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + 'static { +pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + MaybeMallocSizeOf + 'static { /// Type for extrinsics. - type Extrinsic: Member + Codec + Extrinsic + MaybeSerialize; + type Extrinsic: Member + Codec + Extrinsic + MaybeSerialize + MaybeMallocSizeOf; /// Header type. - type Header: Header; + type Header: Header + MaybeMallocSizeOf; /// Block hash type. type Hash: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + Ord - + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; + + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]> + + MaybeMallocSizeOf; /// Returns a reference to the header. fn header(&self) -> &Self::Header; @@ -583,8 +592,9 @@ pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + 'st fn encode_from(header: &Self::Header, extrinsics: &[Self::Extrinsic]) -> Vec; } + /// Something that acts like an `Extrinsic`. -pub trait Extrinsic: Sized { +pub trait Extrinsic: Sized + MaybeMallocSizeOf { /// The function call. type Call; diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index ba19eb00f3..2edd5f0575 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -11,6 +11,7 @@ codec = { package = "parity-scale-codec", version = "1.0.0", default-features = sp-core = { version = "2.0.0", default-features = false, path = "../core" } serde = { version = "1.0.101", optional = true, features = ["derive"] } sp-runtime = { version = "2.0.0", default-features = false, path = "../runtime" } +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } [features] default = [ diff --git a/primitives/test-primitives/src/lib.rs b/primitives/test-primitives/src/lib.rs index 74115bdb8f..302b24fcc1 100644 --- a/primitives/test-primitives/src/lib.rs +++ b/primitives/test-primitives/src/lib.rs @@ -28,6 +28,7 @@ use sp_runtime::traits::{BlakeTwo256, Verify, Extrinsic as ExtrinsicT,}; /// Extrinsic for test-runtime. #[derive(Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(parity_util_mem::MallocSizeOf))] pub enum Extrinsic { IncludeData(Vec), StorageChange(Vec, Option>), diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index 2a71773996..0b23c27f82 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -29,7 +29,7 @@ use futures::{ use serde::{Deserialize, Serialize}; use sp_runtime::{ generic::BlockId, - traits::{Block as BlockT, Member}, + traits::{Block as BlockT, Member, MaybeMallocSizeOf}, transaction_validity::{ TransactionLongevity, TransactionPriority, TransactionTag, }, @@ -154,7 +154,7 @@ pub trait InPoolTransaction { } /// Transaction pool interface. -pub trait TransactionPool: Send + Sync { +pub trait TransactionPool: Send + Sync + MaybeMallocSizeOf { /// Block type. type Block: BlockT; /// Transaction hash type. diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index e0d8aa77b7..684a681554 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -37,6 +37,7 @@ sc-client = { version = "0.8", optional = true, path = "../../client" } sp-trie = { version = "2.0.0", default-features = false, path = "../../primitives/trie" } sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../../primitives/transaction-pool" } trie-db = { version = "0.19.2", default-features = false } +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } [dev-dependencies] sc-executor = { version = "0.8", path = "../../client/executor" } diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index 96387b1efc..dac232b25c 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -114,6 +114,8 @@ pub enum Extrinsic { ChangesTrieConfigUpdate(Option), } +parity_util_mem::malloc_size_of_is_0!(Extrinsic); // non-opaque extrinisic does not need this + #[cfg(feature = "std")] impl serde::Serialize for Extrinsic { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index 36f21f192b..3afa49fc25 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -16,7 +16,7 @@ console_log = "0.1.2" js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" -kvdb-web = "0.3" +kvdb-web = "0.4" service = { version = "0.8", package = "sc-service", path = "../../client/service", default-features = false } network = { package = "sc-network", path = "../../client/network" } chain-spec = { package = "sc-chain-spec", path = "../../client/chain-spec" } -- GitLab From 4944bd196ccc32f453dd87511e437b18d327e7ba Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Fri, 7 Feb 2020 11:58:31 +0100 Subject: [PATCH 269/296] pow: re-add support for algorithms where only linear verification is possible (#4843) * pow: re-add support for algorithms where only linear verification is possible * Remove unused generic parameters * Clone impl for PowBlockImport --- client/consensus/pow/src/lib.rs | 62 ++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index 87f51be216..d656f71a15 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -63,8 +63,8 @@ pub enum Error { HeaderUnsealed(B::Hash), #[display(fmt = "PoW validation error: invalid seal")] InvalidSeal, - #[display(fmt = "PoW validation error: invalid difficulty")] - InvalidDifficulty, + #[display(fmt = "PoW validation error: preliminary verification failed")] + FailedPreliminaryVerify, #[display(fmt = "Rejecting block too far in future")] TooFarInFuture, #[display(fmt = "Fetching best header failed using select chain: {:?}", _0)] @@ -154,18 +154,23 @@ pub trait PowAlgorithm { /// This function will be called twice during the import process, so the implementation /// should be properly cached. fn difficulty(&self, parent: &BlockId) -> Result>; - /// Verify that the seal is valid against given pre hash. - fn verify_seal( + /// Verify that the seal is valid against given pre hash when parent block is not yet imported. + /// + /// None means that preliminary verify is not available for this algorithm. + fn preliminary_verify( &self, - pre_hash: &B::Hash, - seal: &Seal, - ) -> Result>; + _pre_hash: &B::Hash, + _seal: &Seal, + ) -> Result, Error> { + Ok(None) + } /// Verify that the difficulty is valid against given seal. - fn verify_difficulty( + fn verify( &self, - difficulty: Self::Difficulty, parent: &BlockId, + pre_hash: &B::Hash, seal: &Seal, + difficulty: Self::Difficulty, ) -> Result>; /// Mine a seal that satisfies the given difficulty. fn mine( @@ -187,6 +192,19 @@ pub struct PowBlockImport { check_inherents_after: <::Header as HeaderT>::Number, } +impl Clone for PowBlockImport { + fn clone(&self) -> Self { + Self { + algorithm: self.algorithm.clone(), + inner: self.inner.clone(), + select_chain: self.select_chain.clone(), + client: self.client.clone(), + inherent_data_providers: self.inherent_data_providers.clone(), + check_inherents_after: self.check_inherents_after.clone(), + } + } +} + impl PowBlockImport where B: BlockT, I: BlockImport> + Send + Sync, @@ -322,12 +340,14 @@ impl BlockImport for PowBlockImport self.algorithm.difficulty(&BlockId::hash(parent_hash))?, }; - if !self.algorithm.verify_difficulty( - difficulty, + let pre_hash = block.header.hash(); + if !self.algorithm.verify( &BlockId::hash(parent_hash), + &pre_hash, &inner_seal, + difficulty, )? { - return Err(Error::::InvalidDifficulty.into()) + return Err(Error::::InvalidSeal.into()) } aux.difficulty = difficulty; @@ -379,11 +399,8 @@ impl PowVerifier { let pre_hash = header.hash(); - if !self.algorithm.verify_seal( - &pre_hash, - &inner_seal, - )? { - return Err(Error::InvalidSeal); + if !self.algorithm.preliminary_verify(&pre_hash, &inner_seal)?.unwrap_or(true) { + return Err(Error::FailedPreliminaryVerify); } Ok((header, seal)) @@ -450,20 +467,17 @@ pub fn register_pow_inherent_data_provider( pub type PowImportQueue = BasicQueue; /// Import queue for PoW engine. -pub fn import_queue( - block_import: BoxBlockImport>, +pub fn import_queue( + block_import: BoxBlockImport, algorithm: Algorithm, inherent_data_providers: InherentDataProviders, ) -> Result< - PowImportQueue>, + PowImportQueue, sp_consensus::Error > where B: BlockT, - C: ProvideRuntimeApi + HeaderBackend + BlockOf + ProvideCache + AuxStore, - C: Send + Sync + AuxStore + 'static, - C::Api: BlockBuilderApi, + Transaction: Send + Sync + 'static, Algorithm: PowAlgorithm + Clone + Send + Sync + 'static, - S: SelectChain + 'static, { register_pow_inherent_data_provider(&inherent_data_providers)?; -- GitLab From 20d81157b831fef52949d6e34e10dd2aea6060df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 7 Feb 2020 13:21:46 +0100 Subject: [PATCH 270/296] Move tracing cli args to `ImportParams` (#4850) --- bin/node-template/node/src/command.rs | 3 +-- bin/node/cli/src/command.rs | 4 ++-- client/cli/src/lib.rs | 7 +++---- client/cli/src/params.rs | 28 +++++++++++++-------------- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/bin/node-template/node/src/command.rs b/bin/node-template/node/src/command.rs index 585b8e1ca8..e7e386703d 100644 --- a/bin/node-template/node/src/command.rs +++ b/bin/node-template/node/src/command.rs @@ -21,8 +21,7 @@ use crate::chain_spec; use crate::cli::Cli; /// Parse and run command line arguments -pub fn run(version: VersionInfo) -> error::Result<()> -{ +pub fn run(version: VersionInfo) -> error::Result<()> { let opt = sc_cli::from_args::(&version); let config = sc_service::Configuration::new(&version); diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index f5d747a146..0e9b23b73e 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -57,9 +57,9 @@ where } // Setup tracing. - if let Some(tracing_targets) = cli_args.shared_params.tracing_targets.as_ref() { + if let Some(tracing_targets) = cli_args.import_params.tracing_targets.as_ref() { let subscriber = sc_tracing::ProfilingSubscriber::new( - cli_args.shared_params.tracing_receiver.into(), tracing_targets + cli_args.import_params.tracing_receiver.into(), tracing_targets ); if let Err(e) = tracing::subscriber::set_global_default(subscriber) { panic!("Unable to set global default subscriber {}", e); diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 0965a79f15..735f8cb27a 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -270,8 +270,7 @@ where /// 1. set the panic handler /// 2. raise the FD limit /// 3. initialize the logger -pub fn init(shared_params: &SharedParams, version: &VersionInfo) -> error::Result<()> -{ +pub fn init(shared_params: &SharedParams, version: &VersionInfo) -> error::Result<()> { let full_version = sc_service::config::full_version_from_strs( version.version, version.commit @@ -638,8 +637,8 @@ where config.telemetry_endpoints = Some(TelemetryEndpoints::new(cli.telemetry_endpoints)); } - config.tracing_targets = cli.shared_params.tracing_targets.into(); - config.tracing_receiver = cli.shared_params.tracing_receiver.into(); + config.tracing_targets = cli.import_params.tracing_targets.into(); + config.tracing_receiver = cli.import_params.tracing_receiver.into(); // Imply forced authoring on --dev config.force_authoring = cli.shared_params.dev || cli.force_authoring; diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index 1dc6b0567c..ddded79142 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -113,20 +113,6 @@ pub struct SharedParams { /// Sets a custom logging filter. #[structopt(short = "l", long = "log", value_name = "LOG_PATTERN")] pub log: Option, - - /// Comma separated list of targets for tracing - #[structopt(long = "tracing-targets", value_name = "TARGETS")] - pub tracing_targets: Option, - - /// Receiver to process tracing messages - #[structopt( - long = "tracing-receiver", - value_name = "RECEIVER", - possible_values = &TracingReceiver::variants(), - case_insensitive = true, - default_value = "Log" - )] - pub tracing_receiver: TracingReceiver, } /// Parameters for block import. @@ -169,6 +155,20 @@ pub struct ImportParams { /// Specify the state cache size. #[structopt(long = "state-cache-size", value_name = "Bytes", default_value = "67108864")] pub state_cache_size: usize, + + /// Comma separated list of targets for tracing + #[structopt(long = "tracing-targets", value_name = "TARGETS")] + pub tracing_targets: Option, + + /// Receiver to process tracing messages + #[structopt( + long = "tracing-receiver", + value_name = "RECEIVER", + possible_values = &TracingReceiver::variants(), + case_insensitive = true, + default_value = "Log" + )] + pub tracing_receiver: TracingReceiver, } /// Parameters used to create the network configuration. -- GitLab From 4c34b6462340b04b0cf0b2c30f512ea5617fd8a6 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Fri, 7 Feb 2020 13:22:06 +0100 Subject: [PATCH 271/296] Update parity-multiaddr dependency (#4852) --- Cargo.lock | 85 +++++++++------------------------------ client/service/Cargo.toml | 2 +- 2 files changed, 21 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ca7a5d1844..9b57b0153f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -443,12 +443,6 @@ dependencies = [ "wasm-bindgen-futures", ] -[[package]] -name = "bs58" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95ee6bba9d950218b6cc910cf62bc9e0a171d0f4537e3627b0f54d08549b188" - [[package]] name = "bs58" version = "0.3.0" @@ -2646,8 +2640,8 @@ dependencies = [ "libp2p-wasm-ext", "libp2p-websocket", "libp2p-yamux", - "parity-multiaddr 0.7.1", - "parity-multihash 0.2.1", + "parity-multiaddr", + "parity-multihash", "parking_lot 0.10.0", "pin-project", "smallvec 1.2.0", @@ -2661,7 +2655,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbafb2706b8082233f66dc13e196f9cf9b4c229f2cd7c96b2b16617ad6ee330b" dependencies = [ "asn1_der", - "bs58 0.3.0", + "bs58", "ed25519-dalek", "fnv", "futures 0.3.1", @@ -2670,8 +2664,8 @@ dependencies = [ "libsecp256k1", "log 0.4.8", "multistream-select", - "parity-multiaddr 0.7.1", - "parity-multihash 0.2.1", + "parity-multiaddr", + "parity-multihash", "parking_lot 0.10.0", "pin-project", "prost", @@ -2682,7 +2676,7 @@ dependencies = [ "sha2", "smallvec 1.2.0", "thiserror", - "unsigned-varint 0.3.0", + "unsigned-varint", "untrusted", "void", "zeroize 1.1.0", @@ -2726,7 +2720,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bdf6fba9272ad47dde94bade89540fdb16e24ae9ff7fb714c1c80a035165f28" dependencies = [ - "bs58 0.3.0", + "bs58", "cuckoofilter", "fnv", "futures 0.3.1", @@ -2745,7 +2739,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e6ecd058bf769d27ebec530544b081e08b0a1088e3186da8cc58d59915784d0" dependencies = [ "base64 0.11.0", - "bs58 0.3.0", + "bs58", "byteorder 1.3.2", "bytes 0.5.4", "fnv", @@ -2760,7 +2754,7 @@ dependencies = [ "rand 0.7.3", "sha2", "smallvec 1.2.0", - "unsigned-varint 0.3.0", + "unsigned-varint", "wasm-timer", ] @@ -2795,14 +2789,14 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log 0.4.8", - "parity-multihash 0.2.1", + "parity-multihash", "prost", "prost-build", "rand 0.7.3", "sha2", "smallvec 1.2.0", "uint", - "unsigned-varint 0.3.0", + "unsigned-varint", "void", "wasm-timer", ] @@ -2842,7 +2836,7 @@ dependencies = [ "libp2p-core", "log 0.4.8", "parking_lot 0.10.0", - "unsigned-varint 0.3.0", + "unsigned-varint", ] [[package]] @@ -2894,7 +2888,7 @@ dependencies = [ "prost", "prost-build", "rw-stream-sink", - "unsigned-varint 0.3.0", + "unsigned-varint", "void", ] @@ -3302,7 +3296,7 @@ dependencies = [ "log 0.4.8", "smallvec 1.2.0", "tokio-io", - "unsigned-varint 0.3.0", + "unsigned-varint", ] [[package]] @@ -4510,24 +4504,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c276d76c5333b8c2579e02d49a06733a55b8282d2d9b13e8d53b6406bd7e30a" -[[package]] -name = "parity-multiaddr" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" -dependencies = [ - "arrayref", - "bs58 0.2.5", - "byteorder 1.3.2", - "bytes 0.4.12", - "data-encoding", - "parity-multihash 0.1.3", - "percent-encoding 1.0.1", - "serde", - "unsigned-varint 0.2.3", - "url 1.7.2", -] - [[package]] name = "parity-multiaddr" version = "0.7.1" @@ -4535,32 +4511,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80878c27f90dd162d3143333d672e80b194d6b080f05c83440e3dfda42e409f2" dependencies = [ "arrayref", - "bs58 0.3.0", + "bs58", "byteorder 1.3.2", "data-encoding", - "parity-multihash 0.2.1", + "parity-multihash", "percent-encoding 2.1.0", "serde", "static_assertions", - "unsigned-varint 0.3.0", + "unsigned-varint", "url 2.1.1", ] -[[package]] -name = "parity-multihash" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" -dependencies = [ - "blake2", - "bytes 0.4.12", - "rand 0.6.5", - "sha-1", - "sha2", - "sha3", - "unsigned-varint 0.2.3", -] - [[package]] name = "parity-multihash" version = "0.2.1" @@ -4573,7 +4534,7 @@ dependencies = [ "sha-1", "sha2", "sha3", - "unsigned-varint 0.3.0", + "unsigned-varint", ] [[package]] @@ -6120,7 +6081,7 @@ dependencies = [ "substrate-test-client", "substrate-test-runtime-client", "tempfile", - "unsigned-varint 0.3.0", + "unsigned-varint", "void", "zeroize 1.1.0", ] @@ -6308,7 +6269,7 @@ dependencies = [ "grafana-data-source", "lazy_static", "log 0.4.8", - "parity-multiaddr 0.5.0", + "parity-multiaddr", "parity-scale-codec", "parity-util-mem 0.5.1", "parking_lot 0.10.0", @@ -8388,12 +8349,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -[[package]] -name = "unsigned-varint" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f0023a96687fe169081e8adce3f65e3874426b7886e9234d490af2dc077959" - [[package]] name = "unsigned-varint" version = "0.3.0" diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 31408a9a96..bc246db03e 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -52,7 +52,7 @@ sc-rpc-server = { version = "2.0.0", path = "../rpc-servers" } sc-rpc = { version = "2.0.0", path = "../rpc" } sc-telemetry = { version = "2.0.0", path = "../telemetry" } sc-offchain = { version = "2.0.0", path = "../offchain" } -parity-multiaddr = { package = "parity-multiaddr", version = "0.5.0" } +parity-multiaddr = { package = "parity-multiaddr", version = "0.7.1" } grafana-data-source = { version = "0.8", path = "../../utils/grafana-data-source" } sc-tracing = { version = "2.0.0", path = "../tracing" } tracing = "0.1.10" -- GitLab From 09abd3b436ea568a47ec4fc47f933728d8cf466b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 7 Feb 2020 15:00:51 +0100 Subject: [PATCH 272/296] Fix CLI setup again (#4851) * Fix CLI setup again We need to set `config_dir` and `database_path` for almost every command. This fixes `purge-chain` and also adds a test to make sure we don't break it again. * Adds missing test files * Split methods --- bin/node/cli/src/command.rs | 2 +- bin/node/cli/tests/common.rs | 34 +++++++++ bin/node/cli/tests/purge_chain_works.rs | 53 ++++++++++++++ .../tests/running_the_node_and_interrupt.rs | 32 +++------ client/cli/src/lib.rs | 69 ++++++++++++------- client/cli/src/params.rs | 6 +- 6 files changed, 144 insertions(+), 52 deletions(-) create mode 100644 bin/node/cli/tests/common.rs create mode 100644 bin/node/cli/tests/purge_chain_works.rs diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 0e9b23b73e..3bfed148f5 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -41,7 +41,7 @@ where ), Some(Subcommand::Factory(cli_args)) => { sc_cli::init(&cli_args.shared_params, &version)?; - sc_cli::load_spec(&mut config, &cli_args.shared_params, load_spec)?; + sc_cli::init_config(&mut config, &cli_args.shared_params, &version, load_spec)?; sc_cli::fill_import_params( &mut config, &cli_args.import_params, diff --git a/bin/node/cli/tests/common.rs b/bin/node/cli/tests/common.rs new file mode 100644 index 0000000000..96060bf85d --- /dev/null +++ b/bin/node/cli/tests/common.rs @@ -0,0 +1,34 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use std::{process::{Child, ExitStatus}, thread, time::Duration}; + +/// Wait for the given `child` the given ammount of `secs`. +/// +/// Returns the `Some(exit status)` or `None` if the process did not finish in the given time. +pub fn wait_for(child: &mut Child, secs: usize) -> Option { + for _ in 0..secs { + match child.try_wait().unwrap() { + Some(status) => return Some(status), + None => thread::sleep(Duration::from_secs(1)), + } + } + eprintln!("Took to long to exit. Killing..."); + let _ = child.kill(); + child.wait().unwrap(); + + None +} diff --git a/bin/node/cli/tests/purge_chain_works.rs b/bin/node/cli/tests/purge_chain_works.rs new file mode 100644 index 0000000000..e6b71db991 --- /dev/null +++ b/bin/node/cli/tests/purge_chain_works.rs @@ -0,0 +1,53 @@ +// Copyright 2020 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 assert_cmd::cargo::cargo_bin; +use std::{convert::TryInto, process::Command, thread, time::Duration, fs, path::PathBuf}; + +mod common; + +#[test] +#[cfg(unix)] +fn purge_chain_works() { + use nix::sys::signal::{kill, Signal::SIGINT}; + use nix::unistd::Pid; + + let base_path = "purge_chain_test"; + + let _ = fs::remove_dir_all(base_path); + let mut cmd = Command::new(cargo_bin("substrate")) + .args(&["--dev", "-d", base_path]) + .spawn() + .unwrap(); + + // Let it produce some blocks. + thread::sleep(Duration::from_secs(30)); + assert!(cmd.try_wait().unwrap().is_none(), "the process should still be running"); + + // Stop the process + kill(Pid::from_raw(cmd.id().try_into().unwrap()), SIGINT).unwrap(); + assert!(common::wait_for(&mut cmd, 30).map(|x| x.success()).unwrap_or_default()); + + let status = Command::new(cargo_bin("substrate")) + .args(&["purge-chain", "--dev", "-d", base_path, "-y"]) + .status() + .unwrap(); + assert!(status.success()); + + // Make sure that the `dev` chain folder exists, but the `db` is deleted. + assert!(PathBuf::from(base_path).join("chains/dev/").exists()); + assert!(!PathBuf::from(base_path).join("chains/dev/db").exists()); +} diff --git a/bin/node/cli/tests/running_the_node_and_interrupt.rs b/bin/node/cli/tests/running_the_node_and_interrupt.rs index 6b0d696396..6ab719de91 100644 --- a/bin/node/cli/tests/running_the_node_and_interrupt.rs +++ b/bin/node/cli/tests/running_the_node_and_interrupt.rs @@ -15,10 +15,9 @@ // along with Substrate. If not, see . use assert_cmd::cargo::cargo_bin; -use std::convert::TryInto; -use std::process::{Child, Command, ExitStatus}; -use std::thread::sleep; -use std::time::Duration; +use std::{convert::TryInto, process::Command, thread, time::Duration, fs}; + +mod common; #[test] #[cfg(unix)] @@ -26,27 +25,18 @@ fn running_the_node_works_and_can_be_interrupted() { use nix::sys::signal::{kill, Signal::{self, SIGINT, SIGTERM}}; use nix::unistd::Pid; - fn wait_for(child: &mut Child, secs: usize) -> Option { - for _ in 0..secs { - match child.try_wait().unwrap() { - Some(status) => return Some(status), - None => sleep(Duration::from_secs(1)), - } - } - eprintln!("Took to long to exit. Killing..."); - let _ = child.kill(); - child.wait().unwrap(); - - None - } - fn run_command_and_kill(signal: Signal) { - let mut cmd = Command::new(cargo_bin("substrate")).spawn().unwrap(); - sleep(Duration::from_secs(30)); + let _ = fs::remove_dir_all("interrupt_test"); + let mut cmd = Command::new(cargo_bin("substrate")) + .args(&["--dev", "-d", "interrupt_test"]) + .spawn() + .unwrap(); + + thread::sleep(Duration::from_secs(30)); assert!(cmd.try_wait().unwrap().is_none(), "the process should still be running"); kill(Pid::from_raw(cmd.id().try_into().unwrap()), signal).unwrap(); assert_eq!( - wait_for(&mut cmd, 30).map(|x| x.success()), + common::wait_for(&mut cmd, 30).map(|x| x.success()), Some(true), "the pocess must exit gracefully after signal {}", signal, diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 735f8cb27a..54a98a6ad3 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -234,7 +234,7 @@ where SF: AbstractService + Unpin, { init(&run_cmd.shared_params, version)?; - load_spec(&mut config, &run_cmd.shared_params, spec_factory)?; + init_config(&mut config, &run_cmd.shared_params, version, spec_factory)?; run_cmd.run(config, new_light, new_full, version) } @@ -257,9 +257,8 @@ where ::Hash: std::str::FromStr, { let shared_params = subcommand.get_shared_params(); - init(shared_params, version)?; - load_spec(&mut config, shared_params, spec_factory)?; + init_config(&mut config, shared_params, version, spec_factory)?; subcommand.run(config, builder) } @@ -267,9 +266,9 @@ where /// /// This method: /// -/// 1. set the panic handler -/// 2. raise the FD limit -/// 3. initialize the logger +/// 1. Set the panic handler +/// 2. Raise the FD limit +/// 3. Initialize the logger pub fn init(shared_params: &SharedParams, version: &VersionInfo) -> error::Result<()> { let full_version = sc_service::config::full_version_from_strs( version.version, @@ -283,6 +282,37 @@ pub fn init(shared_params: &SharedParams, version: &VersionInfo) -> error::Resul Ok(()) } +/// Initialize the given `config`. +/// +/// This will load the chain spec, set the `config_dir` and the `database_dir`. +pub fn init_config( + config: &mut Configuration, + shared_params: &SharedParams, + version: &VersionInfo, + spec_factory: F, +) -> error::Result<()> where + F: FnOnce(&str) -> Result>, String>, + G: RuntimeGenesis, + E: ChainSpecExtension, +{ + load_spec(config, shared_params, spec_factory)?; + + if config.config_dir.is_none() { + config.config_dir = Some(base_path(&shared_params, version)); + } + + if config.database.is_none() { + config.database = Some(DatabaseConfig::Path { + path: config + .in_chain_config_dir(DEFAULT_DB_CONFIG_PATH) + .expect("We provided a base_path/config_dir."), + cache_size: None, + }); + } + + Ok(()) +} + /// Run the node /// /// Builds and runs either a full or a light node, depending on the `role` within the `Configuration`. @@ -514,26 +544,10 @@ where pub fn update_config_for_running_node( mut config: &mut Configuration, cli: RunCmd, - version: &VersionInfo, ) -> error::Result<()> where G: RuntimeGenesis, { - if config.config_dir.is_none() { - config.config_dir = Some(base_path(&cli.shared_params, version)); - } - - if config.database.is_none() { - // NOTE: the loading of the DatabaseConfig is voluntarily delayed to here - // in case config.config_dir has been customized - config.database = Some(DatabaseConfig::Path { - path: config - .in_chain_config_dir(DEFAULT_DB_CONFIG_PATH) - .expect("We provided a base_path/config_dir."), - cache_size: None, - }); - } - fill_config_keystore_password_and_path(&mut config, &cli)?; let keyring = cli.get_keyring(); @@ -790,7 +804,6 @@ mod tests { update_config_for_running_node( &mut node_config, run_cmds.clone(), - TEST_VERSION_INFO, ).unwrap(); let expected_path = match keystore_path { @@ -843,8 +856,14 @@ mod tests { let cli = RunCmd::from_iter(args); let mut config = Configuration::new(TEST_VERSION_INFO); - config.chain_spec = Some(chain_spec); - update_config_for_running_node(&mut config, cli, TEST_VERSION_INFO).unwrap(); + init(&cli.shared_params, &TEST_VERSION_INFO).unwrap(); + init_config( + &mut config, + &cli.shared_params, + &TEST_VERSION_INFO, + |_| Ok(Some(chain_spec)), + ).unwrap(); + update_config_for_running_node(&mut config, cli).unwrap(); assert!(config.config_dir.is_some()); assert!(config.database.is_some()); diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index ddded79142..a99d887d25 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -933,11 +933,7 @@ impl RunCmd { { assert!(config.chain_spec.is_some(), "chain_spec must be present before continuing"); - crate::update_config_for_running_node( - &mut config, - self, - &version, - )?; + crate::update_config_for_running_node(&mut config, self)?; crate::run_node(config, new_light, new_full, &version) } -- GitLab From 9d55595ec1a345008b3a862c85e22837d966c8ad Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 7 Feb 2020 16:25:20 +0100 Subject: [PATCH 273/296] Implement From for '&static str (#4856) --- primitives/runtime/src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 8d8effcc66..9494c53cc6 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -405,13 +405,13 @@ impl From<&'static str> for DispatchError { } } -impl Into<&'static str> for DispatchError { - fn into(self) -> &'static str { - match self { - Self::Other(msg) => msg, - Self::CannotLookup => "Can not lookup", - Self::BadOrigin => "Bad origin", - Self::Module { message, .. } => message.unwrap_or("Unknown module error"), +impl From for &'static str { + fn from(err: DispatchError) -> &'static str { + match err { + DispatchError::Other(msg) => msg, + DispatchError::CannotLookup => "Can not lookup", + DispatchError::BadOrigin => "Bad origin", + DispatchError::Module { message, .. } => message.unwrap_or("Unknown module error"), } } } -- GitLab From aa15e17a71e28eea1291f2e5d169574d4894bc38 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Fri, 7 Feb 2020 17:38:13 +0100 Subject: [PATCH 274/296] WIP: Test: does cargo update work? (#4844) * Initial commit Forked at: 099cd0f2ba2a041f087978ef9d53473d0a6d0aee Parent branch: origin/master * Update Cargo.lock * Cargo.lock * Add missing features of libsecp256k1 * Update dependencies --- Cargo.lock | 477 ++++++++++++++++------------------ primitives/core/Cargo.toml | 2 +- primitives/trie/Cargo.toml | 8 +- test-utils/runtime/Cargo.toml | 4 +- 4 files changed, 236 insertions(+), 255 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b57b0153f..d13c45afa2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,7 +35,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" dependencies = [ "block-cipher-trait", - "byteorder 1.3.2", + "byteorder 1.3.4", "opaque-debug", ] @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f56c476256dc249def911d6f7580b5fc7e875895b5d7ee88f5d602208035744" +checksum = "743ad5a418686aad3b87fd14c43badd828cf26e214a00f92a384291cf22e1811" dependencies = [ "memchr", ] @@ -179,7 +179,7 @@ dependencies = [ "broadcaster", "crossbeam-channel", "crossbeam-deque", - "crossbeam-utils 0.7.0", + "crossbeam-utils", "futures-core", "futures-io", "futures-timer 2.0.2", @@ -211,7 +211,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce6977f57fa68da77ffe5542950d47e9c23d65f5bc7cb0a9f8700996913eec7" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "rustls", "webpki", "webpki-roots 0.17.0", @@ -274,7 +274,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "safemem", ] @@ -284,7 +284,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", ] [[package]] @@ -299,7 +299,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "serde", ] @@ -385,7 +385,7 @@ checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ "block-padding", "byte-tools", - "byteorder 1.3.2", + "byteorder 1.3.4", "generic-array", ] @@ -429,7 +429,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "js-sys", "kvdb-web", "libp2p", @@ -451,9 +451,9 @@ checksum = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" [[package]] name = "bstr" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe8a65814ca90dfc9705af76bb6ba3c6e2534489a72270e797e603783bb4990b" +checksum = "502ae1441a0a5adb8fbd38a5955a6416b9493e92b465de5e4a9bde6a539c2c48" dependencies = [ "lazy_static", "memchr", @@ -496,9 +496,9 @@ checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" [[package]] name = "byteorder" -version = "1.3.2" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "bytes" @@ -506,7 +506,7 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "either", "iovec", ] @@ -731,7 +731,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c63d9b6ff8a94f98deabab21880d7fd54996e0e16be687b6f80a3b6bdd9c188d" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", @@ -873,7 +873,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "cast", "itertools", ] @@ -894,7 +894,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c" dependencies = [ - "crossbeam-utils 0.7.0", + "crossbeam-utils", ] [[package]] @@ -904,7 +904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" dependencies = [ "crossbeam-epoch", - "crossbeam-utils 0.7.0", + "crossbeam-utils", ] [[package]] @@ -915,21 +915,12 @@ checksum = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" dependencies = [ "autocfg 0.1.7", "cfg-if", - "crossbeam-utils 0.7.0", + "crossbeam-utils", "lazy_static", "memoffset", "scopeguard 1.0.0", ] -[[package]] -name = "crossbeam-queue" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -dependencies = [ - "crossbeam-utils 0.6.6", -] - [[package]] name = "crossbeam-queue" version = "0.2.1" @@ -937,17 +928,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" dependencies = [ "cfg-if", - "crossbeam-utils 0.7.0", -] - -[[package]] -name = "crossbeam-utils" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -dependencies = [ - "cfg-if", - "lazy_static", + "crossbeam-utils", ] [[package]] @@ -1044,7 +1025,7 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7dcd30ba50cdf88b55b033456138b7c0ac4afdc436d82e1b79f370f24cc66d" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "clear_on_drop", "digest", "rand_core 0.3.1", @@ -1057,7 +1038,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26778518a7f6cffa1d25a44b602b62b979bd88adb9e99ffec546998cf3404839" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "digest", "rand_core 0.5.1", "subtle 2.2.2", @@ -1124,7 +1105,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "quick-error", ] @@ -1298,7 +1279,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", ] [[package]] @@ -1376,7 +1357,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cbb25bef9fcad97fb31e817da280b1c9174435b8769c770ee190a330dd181ea" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "log 0.4.8", "num-traits", @@ -1391,7 +1372,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "libc", "rand 0.7.3", "rustc-hex", @@ -1622,9 +1603,9 @@ checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" [[package]] name = "futures" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987" +checksum = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" dependencies = [ "futures-channel", "futures-core", @@ -1637,9 +1618,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcae98ca17d102fd8a3603727b9259fcf7fa4239b603d2142926189bc8999b86" +checksum = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" dependencies = [ "futures-core", "futures-sink", @@ -1656,9 +1637,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866" +checksum = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" [[package]] name = "futures-core-preview" @@ -1678,12 +1659,12 @@ dependencies = [ [[package]] name = "futures-diagnose" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebbb8371dd6ee87aa2aeaa8458a372fd82fe216032387b766255754c92dd7271" +checksum = "fdcef58a173af8148b182684c9f2d5250875adbcaff7b5794073894f9d8634a9" dependencies = [ "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "lazy_static", "log 0.4.8", "parking_lot 0.9.0", @@ -1694,9 +1675,9 @@ dependencies = [ [[package]] name = "futures-executor" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231" +checksum = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" dependencies = [ "futures-core", "futures-task", @@ -1706,15 +1687,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff" +checksum = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" [[package]] name = "futures-macro" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764" +checksum = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" dependencies = [ "proc-macro-hack", "proc-macro2 1.0.8", @@ -1724,15 +1705,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171be33efae63c2d59e6dbba34186fe0d6394fb378069a76dfd80fdcffd43c16" +checksum = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" [[package]] name = "futures-task" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bae52d6b29cf440e298856fec3965ee6fa71b06aa7495178615953fd669e5f9" +checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" [[package]] name = "futures-timer" @@ -1753,9 +1734,9 @@ checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" [[package]] name = "futures-util" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76" +checksum = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" dependencies = [ "futures 0.1.29", "futures-channel", @@ -1791,7 +1772,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" dependencies = [ "bytes 0.5.4", - "futures 0.3.1", + "futures 0.3.4", "memchr", "pin-project", ] @@ -1802,7 +1783,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", ] [[package]] @@ -1861,7 +1842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162d18ae5f2e3b90a993d202f1ba17a5633c2484426f8bcae201f86194bacd00" dependencies = [ "arrayvec 0.4.12", - "byteorder 1.3.2", + "byteorder 1.3.4", "fallible-iterator", "indexmap", "stable_deref_trait", @@ -1925,7 +1906,7 @@ dependencies = [ name = "grafana-data-source-test" version = "2.0.0" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "grafana-data-source", "rand 0.7.3", @@ -1937,7 +1918,7 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "bytes 0.4.12", "fnv", "futures 0.1.29", @@ -1989,7 +1970,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "scopeguard 0.3.3", ] @@ -2172,7 +2153,7 @@ dependencies = [ "time", "tokio 0.1.22", "tokio-buf", - "tokio-executor 0.1.9", + "tokio-executor 0.1.10", "tokio-io", "tokio-reactor", "tokio-tcp", @@ -2305,9 +2286,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" +checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" dependencies = [ "autocfg 1.0.0", ] @@ -2526,7 +2507,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03080afe6f42cd996da9f568d6add5d7fb5ee2ea7fb7802d2d2cbd836958fd87" dependencies = [ "parity-bytes", - "parity-util-mem 0.5.1", + "parity-util-mem", "smallvec 1.2.0", ] @@ -2537,7 +2518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9355274e5a9e0a7e8ef43916950eae3949024de2a8dffe4d5a6c13974a37c8e" dependencies = [ "kvdb", - "parity-util-mem 0.5.1", + "parity-util-mem", "parking_lot 0.10.0", ] @@ -2553,7 +2534,7 @@ dependencies = [ "log 0.4.8", "num_cpus", "owning_ref", - "parity-util-mem 0.5.1", + "parity-util-mem", "parking_lot 0.10.0", "regex", "rocksdb", @@ -2566,12 +2547,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a985c47b4c46429e96033ebf6eaed784a81ceccb4e5df13d63f3b9078a4df81" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "js-sys", "kvdb", "kvdb-memorydb", "log 0.4.8", - "parity-util-mem 0.5.1", + "parity-util-mem", "send_wrapper 0.3.0", "wasm-bindgen", "web-sys", @@ -2618,7 +2599,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84847789ab24b3fc5971a68656ac85886df640986d9ce3264c0327694eae471" dependencies = [ "bytes 0.5.4", - "futures 0.3.1", + "futures 0.3.4", "lazy_static", "libp2p-core", "libp2p-core-derive", @@ -2658,7 +2639,7 @@ dependencies = [ "bs58", "ed25519-dalek", "fnv", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "lazy_static", "libsecp256k1", @@ -2699,7 +2680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be32697b42d040b325c3737f827ea04ede569ec956b7807700dd8d89d8210f9" dependencies = [ "flate2", - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", ] @@ -2709,7 +2690,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f11c979b882f25d85726b15637d5bbc722dfa1be576605c54e99b8cf56906be3" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "log 0.4.8", ] @@ -2723,7 +2704,7 @@ dependencies = [ "bs58", "cuckoofilter", "fnv", - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "libp2p-swarm", "prost", @@ -2740,10 +2721,10 @@ checksum = "6e6ecd058bf769d27ebec530544b081e08b0a1088e3186da8cc58d59915784d0" dependencies = [ "base64 0.11.0", "bs58", - "byteorder 1.3.2", + "byteorder 1.3.4", "bytes 0.5.4", "fnv", - "futures 0.3.1", + "futures 0.3.4", "futures_codec", "libp2p-core", "libp2p-swarm", @@ -2764,7 +2745,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1a6261b804111c2dbf53f8ca03f66edc5ad1c29b78a61cf0cc5354052e28e9" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "libp2p-swarm", "log 0.4.8", @@ -2784,7 +2765,7 @@ dependencies = [ "bytes 0.5.4", "either", "fnv", - "futures 0.3.1", + "futures 0.3.4", "futures_codec", "libp2p-core", "libp2p-swarm", @@ -2811,7 +2792,7 @@ dependencies = [ "data-encoding", "dns-parser", "either", - "futures 0.3.1", + "futures 0.3.4", "lazy_static", "libp2p-core", "libp2p-swarm", @@ -2831,7 +2812,7 @@ checksum = "89d0b44dfdef80cc2be4b42d127de1c793905eca2459415a5c57d6b4fbd8ec30" dependencies = [ "bytes 0.5.4", "fnv", - "futures 0.3.1", + "futures 0.3.4", "futures_codec", "libp2p-core", "log 0.4.8", @@ -2846,7 +2827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0845e8208d814cd41c26c90a6a2f2b720c31b588209cecc49a44c881a09f417f" dependencies = [ "curve25519-dalek 1.2.3", - "futures 0.3.1", + "futures 0.3.4", "lazy_static", "libp2p-core", "log 0.4.8", @@ -2865,7 +2846,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16ecced2949ae93b6ff29565303ecd1bef15c4e4efb689033ee744922561a36b" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "libp2p-swarm", "log 0.4.8", @@ -2881,7 +2862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "195fda6b6a948a242fd30570e0e3418ae8e0a20055ea75d45458e1079a8efb05" dependencies = [ "bytes 0.5.4", - "futures 0.3.1", + "futures 0.3.4", "futures_codec", "libp2p-core", "log 0.4.8", @@ -2900,7 +2881,7 @@ checksum = "ceef68ca377b264f84d64c88739a8fa118b5db1e8f18297351dff75314504a5f" dependencies = [ "aes-ctr", "ctr", - "futures 0.3.1", + "futures 0.3.4", "hmac", "js-sys", "lazy_static", @@ -2928,7 +2909,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14ea00be81bc3985e36abad263ce2ad1b6aeb862aa743563eb70ad42880c05ae" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "log 0.4.8", "smallvec 1.2.0", @@ -2943,7 +2924,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e65ef381570df31cb047dfbc11483ab0fe7e6abbdcf2bdc2c60b5d11133d241" dependencies = [ "async-std", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "get_if_addrs", "ipnet", @@ -2958,7 +2939,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e4f4f7989b35f33d4b9738aab2f031310eb20fec513cab44d12b1bc985a8074" dependencies = [ "async-std", - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "log 0.4.8", ] @@ -2969,7 +2950,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b4d457adb91a5e2212343218a554394cd8ced64a79fb8e36e7aed2a16d49495" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "js-sys", "libp2p-core", "parity-send-wrapper", @@ -2986,7 +2967,7 @@ dependencies = [ "async-tls", "bytes 0.5.4", "either", - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "log 0.4.8", "quicksink", @@ -3004,7 +2985,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ca25b3aac78a3c93c2a567622abd3cfc16f96f26ae1bf6134f0056203d62d86" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "libp2p-core", "log 0.4.8", "parking_lot 0.10.0", @@ -3026,9 +3007,9 @@ dependencies = [ [[package]] name = "libsecp256k1" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6edf84fd62aad1c93932b39324eaeda3912c1d26bc18dfaee6293848e49a50" +checksum = "1fc1e2c808481a63dc6da2074752fdd4336a3c8fcc68b83db6f1fd5224ae7962" dependencies = [ "arrayref", "crunchy", @@ -3130,17 +3111,6 @@ dependencies = [ "libc", ] -[[package]] -name = "malloc_size_of_derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37c5d4cd9473c5f4c9c111f033f15d4df9bd378fdf615944e360a4f55a05f0b" -dependencies = [ - "proc-macro2 1.0.8", - "syn", - "synstructure", -] - [[package]] name = "matches" version = "0.1.8" @@ -3173,14 +3143,14 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881736a0f68a6fae1b596bb066c5bd16d7b3ed645a4dd8ffaefd02f585abaf71" +checksum = "198831fe8722331a395bc199a5d08efbc197497ef354cb4c77b969c02ffc0fc4" dependencies = [ "ahash", "hash-db", "hashbrown 0.6.3", - "parity-util-mem 0.3.0", + "parity-util-mem", ] [[package]] @@ -3195,7 +3165,7 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b0942b357c1b4d0dc43ba724674ec89c3218e6ca2b3e8269e7cb53bcecd2f6e" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "keccak", "rand_core 0.4.2", "zeroize 1.1.0", @@ -3358,7 +3328,7 @@ dependencies = [ "browser-utils", "frame-support", "frame-system", - "futures 0.3.1", + "futures 0.3.4", "hex-literal", "jsonrpc-core", "log 0.4.8", @@ -3446,7 +3416,7 @@ dependencies = [ "sp-state-machine", "sp-trie", "substrate-test-client", - "trie-root", + "trie-root 0.15.2", "wabt", ] @@ -3554,7 +3524,7 @@ dependencies = [ name = "node-template" version = "2.0.0" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "log 0.4.8", "node-template-runtime", "sc-basic-authorship", @@ -3778,9 +3748,9 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "openssl" -version = "0.10.27" +version = "0.10.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e176a45fedd4c990e26580847a525e39e16ec32ac78957dbf62ded31b3abfd6f" +checksum = "973293749822d7dd6370d6da1e523b0d1db19f06c459134c658b2a4261378b52" dependencies = [ "bitflags", "cfg-if", @@ -4512,7 +4482,7 @@ checksum = "80878c27f90dd162d3143333d672e80b194d6b080f05c83440e3dfda42e409f2" dependencies = [ "arrayref", "bs58", - "byteorder 1.3.2", + "byteorder 1.3.4", "data-encoding", "parity-multihash", "percent-encoding 2.1.0", @@ -4524,9 +4494,9 @@ dependencies = [ [[package]] name = "parity-multihash" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" +checksum = "b11f42bbd3a021c5061b77154bd3334d5a57e1a03eb162de0b962681cc25800d" dependencies = [ "blake2", "bytes 0.5.4", @@ -4568,17 +4538,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" -[[package]] -name = "parity-util-mem" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" -dependencies = [ - "cfg-if", - "malloc_size_of_derive", - "winapi 0.3.8", -] - [[package]] name = "parity-util-mem" version = "0.5.1" @@ -4611,7 +4570,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", ] [[package]] @@ -4721,7 +4680,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "crypto-mac", ] @@ -4999,7 +4958,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "log 0.4.8", "parity-wasm 0.41.0", ] @@ -5228,7 +5187,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "rand_core 0.3.1", ] @@ -5261,8 +5220,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" dependencies = [ "crossbeam-deque", - "crossbeam-queue 0.2.1", - "crossbeam-utils 0.7.0", + "crossbeam-queue", + "crossbeam-utils", "lazy_static", "num_cpus", ] @@ -5311,7 +5270,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", ] [[package]] @@ -5343,9 +5302,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.10" +version = "0.16.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113f53b644c5442e20ff3a299be3d6c61ba143737af5bd2ab298e248a7575b2d" +checksum = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862" dependencies = [ "cc", "lazy_static", @@ -5394,7 +5353,7 @@ dependencies = [ "base64 0.11.0", "blake2b_simd", "constant_time_eq", - "crossbeam-utils 0.7.0", + "crossbeam-utils", ] [[package]] @@ -5448,7 +5407,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "pin-project", "static_assertions", ] @@ -5461,9 +5420,9 @@ checksum = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" [[package]] name = "safe-mix" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" +checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" dependencies = [ "rustc_version", ] @@ -5490,7 +5449,7 @@ dependencies = [ "bytes 0.4.12", "derive_more", "env_logger 0.7.1", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "libp2p", "log 0.4.8", @@ -5516,7 +5475,7 @@ dependencies = [ name = "sc-basic-authorship" version = "0.8.0" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "log 0.4.8", "parity-scale-codec", "parking_lot 0.10.0", @@ -5587,11 +5546,11 @@ dependencies = [ "derive_more", "env_logger 0.7.1", "fdlimit", - "futures 0.3.1", + "futures 0.3.4", "lazy_static", "log 0.4.8", "names", - "parity-util-mem 0.5.1", + "parity-util-mem", "regex", "rpassword", "sc-client-api", @@ -5619,7 +5578,7 @@ dependencies = [ "derive_more", "env_logger 0.7.1", "fnv", - "futures 0.3.1", + "futures 0.3.4", "hash-db", "hex-literal", "kvdb", @@ -5655,7 +5614,7 @@ version = "2.0.0" dependencies = [ "derive_more", "fnv", - "futures 0.3.1", + "futures 0.3.4", "hash-db", "hex-literal", "kvdb", @@ -5692,7 +5651,7 @@ dependencies = [ "linked-hash-map", "log 0.4.8", "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "parking_lot 0.10.0", "quickcheck", "sc-client", @@ -5717,7 +5676,7 @@ dependencies = [ "derive_more", "env_logger 0.7.1", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 0.4.0", "log 0.4.8", "parity-scale-codec", @@ -5757,7 +5716,7 @@ dependencies = [ "env_logger 0.7.1", "fork-tree", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 0.4.0", "log 0.4.8", "merlin", @@ -5817,7 +5776,7 @@ version = "0.8.0" dependencies = [ "derive_more", "env_logger 0.7.1", - "futures 0.3.1", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -5844,7 +5803,7 @@ name = "sc-consensus-pow" version = "0.8.0" dependencies = [ "derive_more", - "futures 0.3.1", + "futures 0.3.4", "log 0.4.8", "parity-scale-codec", "sc-client-api", @@ -5863,7 +5822,7 @@ dependencies = [ name = "sc-consensus-slots" version = "0.8.0" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "log 0.4.8", "parity-scale-codec", @@ -5989,7 +5948,7 @@ dependencies = [ "finality-grandpa", "fork-tree", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "log 0.4.8", "parity-scale-codec", @@ -6048,7 +6007,7 @@ dependencies = [ "erased-serde", "fnv", "fork-tree", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 0.4.0", "futures_codec", "libp2p", @@ -6091,7 +6050,7 @@ name = "sc-network-gossip" version = "0.8.0" dependencies = [ "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 0.4.0", "libp2p", "log 0.4.8", @@ -6107,7 +6066,7 @@ version = "0.8.0" dependencies = [ "env_logger 0.7.1", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 0.4.0", "libp2p", "log 0.4.8", @@ -6136,7 +6095,7 @@ dependencies = [ "env_logger 0.7.1", "fnv", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "hyper 0.12.35", "hyper-rustls", @@ -6164,7 +6123,7 @@ dependencies = [ name = "sc-peerset" version = "2.0.0" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "libp2p", "log 0.4.8", "rand 0.7.3", @@ -6177,7 +6136,7 @@ version = "2.0.0" dependencies = [ "assert_matches", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "hash-db", "jsonrpc-core", "jsonrpc-pubsub", @@ -6213,7 +6172,7 @@ name = "sc-rpc-api" version = "0.8.0" dependencies = [ "derive_more", - "futures 0.3.1", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6263,7 +6222,7 @@ dependencies = [ "derive_more", "exit-future", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "futures-diagnose", "futures-timer 2.0.2", "grafana-data-source", @@ -6271,7 +6230,7 @@ dependencies = [ "log 0.4.8", "parity-multiaddr", "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "parking_lot 0.10.0", "sc-chain-spec", "sc-client", @@ -6305,7 +6264,7 @@ dependencies = [ "sysinfo", "target_info", "tokio 0.2.11", - "tokio-executor 0.1.9", + "tokio-executor 0.1.10", "tracing", ] @@ -6316,7 +6275,7 @@ dependencies = [ "env_logger 0.7.1", "fdlimit", "futures 0.1.29", - "futures 0.3.1", + "futures 0.3.4", "log 0.4.8", "sc-client", "sc-network", @@ -6345,7 +6304,7 @@ name = "sc-telemetry" version = "2.0.0" dependencies = [ "bytes 0.5.4", - "futures 0.3.1", + "futures 0.3.4", "futures-timer 2.0.2", "libp2p", "log 0.4.8", @@ -6383,10 +6342,10 @@ dependencies = [ "assert_matches", "criterion 0.3.1", "derive_more", - "futures 0.3.1", + "futures 0.3.4", "log 0.4.8", "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "parking_lot 0.10.0", "serde", "sp-core", @@ -6400,11 +6359,11 @@ name = "sc-transaction-pool" version = "2.0.0" dependencies = [ "derive_more", - "futures 0.3.1", + "futures 0.3.4", "futures-diagnose", "log 0.4.8", "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "parking_lot 0.10.0", "sc-client-api", "sc-transaction-graph", @@ -6420,9 +6379,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" +checksum = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" dependencies = [ "lazy_static", "winapi 0.3.8", @@ -6732,7 +6691,7 @@ dependencies = [ "base64 0.11.0", "bytes 0.5.4", "flate2", - "futures 0.3.1", + "futures 0.3.4", "http 0.2.0", "httparse", "log 0.4.8", @@ -6892,7 +6851,7 @@ name = "sp-consensus" version = "0.8.0" dependencies = [ "derive_more", - "futures 0.3.1", + "futures 0.3.4", "futures-diagnose", "futures-timer 0.4.0", "libp2p", @@ -6954,7 +6913,7 @@ version = "2.0.0" dependencies = [ "base58", "blake2-rfc", - "byteorder 1.3.2", + "byteorder 1.3.4", "criterion 0.2.11", "ed25519-dalek", "hash-db", @@ -6967,7 +6926,7 @@ dependencies = [ "log 0.4.8", "num-traits", "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "parking_lot 0.10.0", "pretty_assertions", "primitive-types", @@ -7113,7 +7072,7 @@ dependencies = [ "impl-trait-for-tuples", "log 0.4.8", "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "paste", "rand 0.7.3", "serde", @@ -7235,8 +7194,8 @@ dependencies = [ "sp-externalities", "sp-panic-handler", "sp-trie", - "trie-db", - "trie-root", + "trie-db 0.19.2", + "trie-root 0.15.2", ] [[package]] @@ -7258,7 +7217,7 @@ name = "sp-test-primitives" version = "2.0.0" dependencies = [ "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "serde", "sp-application-crypto", "sp-core", @@ -7282,7 +7241,7 @@ name = "sp-transaction-pool" version = "2.0.0" dependencies = [ "derive_more", - "futures 0.3.1", + "futures 0.3.4", "log 0.4.8", "parity-scale-codec", "serde", @@ -7302,8 +7261,8 @@ dependencies = [ "sp-core", "sp-std", "trie-bench", - "trie-db", - "trie-root", + "trie-db 0.20.0", + "trie-root 0.16.0", "trie-standardmap", ] @@ -7474,7 +7433,7 @@ version = "2.0.0" dependencies = [ "frame-support", "frame-system", - "futures 0.3.1", + "futures 0.3.4", "jsonrpc-client-transports", "jsonrpc-core", "parity-scale-codec", @@ -7490,7 +7449,7 @@ version = "2.0.0" dependencies = [ "env_logger 0.7.1", "frame-system-rpc-runtime-api", - "futures 0.3.1", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -7511,7 +7470,7 @@ dependencies = [ name = "substrate-test-client" version = "2.0.0" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "hash-db", "parity-scale-codec", "sc-client", @@ -7540,7 +7499,7 @@ dependencies = [ "pallet-babe", "pallet-timestamp", "parity-scale-codec", - "parity-util-mem 0.5.1", + "parity-util-mem", "sc-client", "sc-executor", "serde", @@ -7564,14 +7523,14 @@ dependencies = [ "sp-version", "substrate-test-runtime-client", "substrate-wasm-builder-runner", - "trie-db", + "trie-db 0.20.0", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "parity-scale-codec", "sc-block-builder", "sc-client", @@ -7589,7 +7548,7 @@ name = "substrate-test-runtime-transaction-pool" version = "2.0.0" dependencies = [ "derive_more", - "futures 0.3.1", + "futures 0.3.4", "parity-scale-codec", "parking_lot 0.10.0", "sc-transaction-graph", @@ -7846,11 +7805,11 @@ dependencies = [ "num_cpus", "tokio-codec", "tokio-current-thread", - "tokio-executor 0.1.9", + "tokio-executor 0.1.10", "tokio-fs", "tokio-io", "tokio-reactor", - "tokio-sync 0.1.7", + "tokio-sync 0.1.8", "tokio-tcp", "tokio-threadpool", "tokio-timer", @@ -7891,9 +7850,9 @@ dependencies = [ [[package]] name = "tokio-codec" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" +checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" dependencies = [ "bytes 0.4.12", "futures 0.1.29", @@ -7902,21 +7861,21 @@ dependencies = [ [[package]] name = "tokio-current-thread" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" +checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" dependencies = [ "futures 0.1.29", - "tokio-executor 0.1.9", + "tokio-executor 0.1.10", ] [[package]] name = "tokio-executor" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" +checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" dependencies = [ - "crossbeam-utils 0.6.6", + "crossbeam-utils", "futures 0.1.29", ] @@ -7933,9 +7892,9 @@ dependencies = [ [[package]] name = "tokio-fs" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" +checksum = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" dependencies = [ "futures 0.1.29", "tokio-io", @@ -7944,9 +7903,9 @@ dependencies = [ [[package]] name = "tokio-io" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" +checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" dependencies = [ "bytes 0.4.12", "futures 0.1.29", @@ -7966,11 +7925,11 @@ dependencies = [ [[package]] name = "tokio-reactor" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" +checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" dependencies = [ - "crossbeam-utils 0.6.6", + "crossbeam-utils", "futures 0.1.29", "lazy_static", "log 0.4.8", @@ -7978,9 +7937,9 @@ dependencies = [ "num_cpus", "parking_lot 0.9.0", "slab", - "tokio-executor 0.1.9", + "tokio-executor 0.1.10", "tokio-io", - "tokio-sync 0.1.7", + "tokio-sync 0.1.8", ] [[package]] @@ -7999,9 +7958,9 @@ dependencies = [ [[package]] name = "tokio-sync" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" +checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" dependencies = [ "fnv", "futures 0.1.29", @@ -8020,9 +7979,9 @@ dependencies = [ [[package]] name = "tokio-tcp" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" +checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" dependencies = [ "bytes 0.4.12", "futures 0.1.29", @@ -8034,31 +7993,31 @@ dependencies = [ [[package]] name = "tokio-threadpool" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" +checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" dependencies = [ "crossbeam-deque", - "crossbeam-queue 0.1.2", - "crossbeam-utils 0.6.6", + "crossbeam-queue", + "crossbeam-utils", "futures 0.1.29", "lazy_static", "log 0.4.8", "num_cpus", "slab", - "tokio-executor 0.1.9", + "tokio-executor 0.1.10", ] [[package]] name = "tokio-timer" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" +checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" dependencies = [ - "crossbeam-utils 0.6.6", + "crossbeam-utils", "futures 0.1.29", "slab", - "tokio-executor 0.1.9", + "tokio-executor 0.1.10", ] [[package]] @@ -8074,9 +8033,9 @@ dependencies = [ [[package]] name = "tokio-udp" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b" +checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" dependencies = [ "bytes 0.4.12", "futures 0.1.29", @@ -8089,9 +8048,9 @@ dependencies = [ [[package]] name = "tokio-uds" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" +checksum = "5076db410d6fdc6523df7595447629099a1fdc47b3d9f896220780fa48faf798" dependencies = [ "bytes 0.4.12", "futures 0.1.29", @@ -8178,17 +8137,17 @@ checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" [[package]] name = "trie-bench" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fd042d57ee9c987c562811162a78db78b5340ab674ac76056c85dca49b26bc" +checksum = "6dcd9bac85703d8f974ee1e6dfe668784b105d3385c174ad729adb7427ad5d81" dependencies = [ "criterion 0.2.11", "hash-db", "keccak-hasher", "memory-db", "parity-scale-codec", - "trie-db", - "trie-root", + "trie-db 0.20.0", + "trie-root 0.16.0", "trie-standardmap", ] @@ -8206,6 +8165,19 @@ dependencies = [ "smallvec 1.2.0", ] +[[package]] +name = "trie-db" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9222c50cc325855621271157c973da27a0dcd26fa06f8edf81020bd2333df0" +dependencies = [ + "hash-db", + "hashbrown 0.6.3", + "log 0.4.8", + "rustc-hex", + "smallvec 1.2.0", +] + [[package]] name = "trie-root" version = "0.15.2" @@ -8215,6 +8187,15 @@ dependencies = [ "hash-db", ] +[[package]] +name = "trie-root" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "652931506d2c1244d7217a70b99f56718a7b4161b37f04e7cd868072a99f68cd" +dependencies = [ + "hash-db", +] + [[package]] name = "trie-standardmap" version = "0.15.2" @@ -8252,7 +8233,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" dependencies = [ "block-cipher-trait", - "byteorder 1.3.2", + "byteorder 1.3.4", "opaque-debug", ] @@ -8283,7 +8264,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "crunchy", "rustc-hex", "static_assertions", @@ -8589,7 +8570,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" dependencies = [ - "futures 0.3.1", + "futures 0.3.4", "js-sys", "parking_lot 0.9.0", "pin-utils", @@ -8791,7 +8772,7 @@ checksum = "5e3810f0d00c4dccb54c30a4eee815e703232819dec7b007db115791c42aa374" dependencies = [ "base64 0.10.1", "bitflags", - "byteorder 1.3.2", + "byteorder 1.3.4", "bytes 0.4.12", "futures 0.1.29", "native-tls", @@ -8880,7 +8861,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c51a2c47b5798ccc774ffb93ff536aec7c4275d722fd9c740c83cdd1af1f2d94" dependencies = [ - "byteorder 1.3.2", + "byteorder 1.3.4", "bytes 0.4.12", "httparse", "log 0.4.8", @@ -8921,12 +8902,12 @@ checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" [[package]] name = "yamux" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f937668802a2e862a4fed05267e10b20c310bf771adc89687710706d55a9a65" +checksum = "902f4cee32c401c211b6b69f4a3f6f4cf3515644db5bd822cf685a7dbd6201f9" dependencies = [ "bytes 0.5.4", - "futures 0.3.1", + "futures 0.3.4", "log 0.4.8", "nohash-hasher", "parking_lot 0.10.0", diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 9bd30d1823..6f1ce2f080 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -29,7 +29,7 @@ parking_lot = { version = "0.10.0", optional = true } sp-debug-derive = { version = "2.0.0", path = "../debug-derive" } sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } sp-storage = { version = "2.0.0", default-features = false, path = "../storage" } -libsecp256k1 = { version = "0.3.2", default-features = false } +libsecp256k1 = { version = "0.3.2", default-features = false, features = ["hmac"] } parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } # full crypto diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index a78a26db73..361ddb186c 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -15,13 +15,13 @@ harness = false codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } sp-std = { version = "2.0.0", default-features = false, path = "../std" } hash-db = { version = "0.15.2", default-features = false } -trie-db = { version = "0.19.2", default-features = false } -trie-root = { version = "0.15.2", default-features = false } -memory-db = { version = "0.18.1", default-features = false } +trie-db = { version = "0.20.0", default-features = false } +trie-root = { version = "0.16.0", default-features = false } +memory-db = { version = "0.19.0", default-features = false } sp-core = { version = "2.0.0", default-features = false, path = "../core" } [dev-dependencies] -trie-bench = "0.19.0" +trie-bench = "0.20.0" trie-standardmap = "0.15.2" criterion = "0.2.11" hex-literal = "0.2.1" diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 684a681554..01244d8c6f 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -17,7 +17,7 @@ frame-executive = { version = "2.0.0", default-features = false, path = "../../f sp-inherents = { version = "2.0.0", default-features = false, path = "../../primitives/inherents" } sp-keyring = { version = "2.0.0", optional = true, path = "../../primitives/keyring" } log = { version = "0.4.8", optional = true } -memory-db = { version = "0.18.0", default-features = false } +memory-db = { version = "0.19.0", default-features = false } sp-offchain = { path = "../../primitives/offchain", default-features = false} sp-core = { version = "2.0.0", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } @@ -36,7 +36,7 @@ pallet-timestamp = { version = "2.0.0", default-features = false, path = "../../ sc-client = { version = "0.8", optional = true, path = "../../client" } sp-trie = { version = "2.0.0", default-features = false, path = "../../primitives/trie" } sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../../primitives/transaction-pool" } -trie-db = { version = "0.19.2", default-features = false } +trie-db = { version = "0.20.0", default-features = false } parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } [dev-dependencies] -- GitLab From f123c297de9f9159d034f1af1f132b16f302ab74 Mon Sep 17 00:00:00 2001 From: Alexander Popiak Date: Sat, 8 Feb 2020 20:31:35 +0100 Subject: [PATCH 275/296] Rename StorageMap::exists to ::contains_key (Resolves #4839) (#4847) * rename StorageMap::exists(key) to ::contains_key(key) * bump impl_version --- bin/node/runtime/src/lib.rs | 2 +- frame/balances/src/lib.rs | 2 +- frame/collective/src/lib.rs | 2 +- frame/contracts/src/account_db.rs | 2 +- frame/contracts/src/tests.rs | 2 +- frame/democracy/src/lib.rs | 18 ++--- frame/elections-phragmen/src/lib.rs | 2 +- frame/elections/src/lib.rs | 4 +- frame/generic-asset/src/lib.rs | 2 +- frame/identity/src/lib.rs | 2 +- frame/im-online/src/lib.rs | 6 +- frame/offences/src/lib.rs | 2 +- frame/recovery/src/lib.rs | 6 +- frame/recovery/src/tests.rs | 6 +- frame/scored-pool/src/lib.rs | 2 +- frame/society/src/lib.rs | 12 ++-- frame/staking/src/lib.rs | 6 +- frame/staking/src/tests.rs | 72 +++++++++---------- .../src/storage/generator/double_map.rs | 2 +- .../src/storage/generator/linked_map.rs | 2 +- frame/support/src/storage/generator/map.rs | 2 +- frame/support/src/storage/mod.rs | 12 ++-- frame/support/test/tests/instance.rs | 18 ++--- frame/system/src/lib.rs | 2 +- frame/treasury/src/lib.rs | 8 +-- frame/vesting/src/lib.rs | 4 +- 26 files changed, 100 insertions(+), 100 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 7b718ca21f..f0e2c79743 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 214, - impl_version: 1, + impl_version: 2, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index 4b3e88eb9f..64932fb256 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -1381,6 +1381,6 @@ where { fn is_dead_account(who: &T::AccountId) -> bool { // this should always be exactly equivalent to `Self::account(who).total().is_zero()` - !Account::::exists(who) + !Account::::contains_key(who) } } diff --git a/frame/collective/src/lib.rs b/frame/collective/src/lib.rs index 8d811b8dec..ffc62d976a 100644 --- a/frame/collective/src/lib.rs +++ b/frame/collective/src/lib.rs @@ -191,7 +191,7 @@ decl_module! { let proposal_hash = T::Hashing::hash_of(&proposal); - ensure!(!>::exists(proposal_hash), Error::::DuplicateProposal); + ensure!(!>::contains_key(proposal_hash), Error::::DuplicateProposal); if threshold < 2 { let seats = Self::members().len() as MemberCount; diff --git a/frame/contracts/src/account_db.rs b/frame/contracts/src/account_db.rs index 814983c586..efef02222d 100644 --- a/frame/contracts/src/account_db.rs +++ b/frame/contracts/src/account_db.rs @@ -137,7 +137,7 @@ impl AccountDb for DirectAccountDb { >::get(account).and_then(|i| i.as_alive().map(|i| i.rent_allowance)) } fn contract_exists(&self, account: &T::AccountId) -> bool { - >::exists(account) + >::contains_key(account) } fn get_balance(&self, account: &T::AccountId) -> BalanceOf { T::Currency::free_balance(account) diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 5eb7bce48a..783eca02ca 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -460,7 +460,7 @@ fn instantiate_and_call_and_deposit_event() { ]); assert_ok!(creation); - assert!(ContractInfoOf::::exists(BOB)); + assert!(ContractInfoOf::::contains_key(BOB)); }); } diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index da0cccb1d0..9bf08840f4 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -294,7 +294,7 @@ decl_storage! { /// 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. + /// also check for simple existence with `VoteOf::contains_key` first. pub VoteOf get(fn vote_of): map hasher(blake2_256) (ReferendumIndex, T::AccountId) => Vote; /// Who is able to vote for whom. Value is the fund-holding account, key is the @@ -537,7 +537,7 @@ decl_module! { let info = Self::referendum_info(ref_index).ok_or(Error::::BadIndex)?; let h = info.proposal_hash; - ensure!(!>::exists(h), Error::::AlreadyCanceled); + ensure!(!>::contains_key(h), Error::::AlreadyCanceled); >::insert(h, true); Self::clear_referendum(ref_index); @@ -667,7 +667,7 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn set_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; - ensure!(!>::exists(&proxy), Error::::AlreadyProxy); + ensure!(!>::contains_key(&proxy), Error::::AlreadyProxy); >::insert(proxy, who) } @@ -725,7 +725,7 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn undelegate(origin) { let who = ensure_signed(origin)?; - ensure!(>::exists(&who), Error::::NotDelegated); + ensure!(>::contains_key(&who), Error::::NotDelegated); let (_, conviction) = >::take(&who); // Indefinite lock is reduced to the maximum voting lock that could be possible. let now = >::block_number(); @@ -754,7 +754,7 @@ decl_module! { fn note_preimage(origin, encoded_proposal: Vec) { let who = ensure_signed(origin)?; let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); - ensure!(!>::exists(&proposal_hash), Error::::DuplicatePreimage); + ensure!(!>::contains_key(&proposal_hash), Error::::DuplicatePreimage); let deposit = >::from(encoded_proposal.len() as u32) .saturating_mul(T::PreimageByteDeposit::get()); @@ -772,7 +772,7 @@ decl_module! { fn note_imminent_preimage(origin, encoded_proposal: Vec) { let who = ensure_signed(origin)?; let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); - ensure!(!>::exists(&proposal_hash), Error::::DuplicatePreimage); + ensure!(!>::contains_key(&proposal_hash), Error::::DuplicatePreimage); let queue = >::get(); ensure!(queue.iter().any(|item| &item.1 == &proposal_hash), Error::::NotImminent); @@ -832,7 +832,7 @@ impl Module { /// Return true if `ref_index` is an on-going referendum. pub fn is_active_referendum(ref_index: ReferendumIndex) -> bool { - >::exists(ref_index) + >::contains_key(ref_index) } /// Get all referenda currently active. @@ -913,7 +913,7 @@ impl Module { if recursion_limit == 0 { return (Zero::zero(), Zero::zero()); } >::enumerate() .filter(|(delegator, (delegate, _))| - *delegate == to && !>::exists(&(ref_index, delegator.clone())) + *delegate == to && !>::contains_key(&(ref_index, delegator.clone())) ).fold( (Zero::zero(), Zero::zero()), |(votes_acc, turnout_acc), (delegator, (_delegate, max_conviction))| { @@ -963,7 +963,7 @@ impl Module { /// Actually enact a vote, if legit. fn do_vote(who: T::AccountId, ref_index: ReferendumIndex, vote: Vote) -> DispatchResult { ensure!(Self::is_active_referendum(ref_index), Error::::ReferendumInvalid); - if !>::exists((ref_index, &who)) { + if !>::contains_key((ref_index, &who)) { >::append_or_insert(ref_index, &[&who][..]); } >::insert((ref_index, &who), vote); diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 33d4c46e91..b3dc05fe7b 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -520,7 +520,7 @@ impl Module { /// /// State: O(1). fn is_voter(who: &T::AccountId) -> bool { - >::exists(who) + >::contains_key(who) } /// Check if `who` is currently an active member. diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index 899fcfac8a..eb87057f95 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -525,7 +525,7 @@ decl_module! { let who = ensure_signed(origin)?; ensure!(!Self::presentation_active(), Error::::CannotRetractPresenting); - ensure!(>::exists(&who), Error::::RetractNonVoter); + ensure!(>::contains_key(&who), Error::::RetractNonVoter); let index = index as usize; let voter = Self::voter_at(index).ok_or(Error::::InvalidRetractionIndex)?; ensure!(voter == who, Error::::InvalidRetractionIndex); @@ -730,7 +730,7 @@ impl Module { /// If `who` a candidate at the moment? pub fn is_a_candidate(who: &T::AccountId) -> bool { - >::exists(who) + >::contains_key(who) } /// Iff the member `who` still has a seat at blocknumber `n` returns `true`. diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index 3b8ebe0535..5d246a8afd 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -580,7 +580,7 @@ impl Module { options: AssetOptions, ) -> DispatchResult { let asset_id = if let Some(asset_id) = asset_id { - ensure!(!>::exists(&asset_id), Error::::IdAlreadyTaken); + ensure!(!>::contains_key(&asset_id), Error::::IdAlreadyTaken); ensure!(asset_id < Self::next_asset_id(), Error::::IdUnavailable); asset_id } else { diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 56960b2d1d..80a200e808 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -553,7 +553,7 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedNormal(50_000)] fn set_subs(origin, subs: Vec<(T::AccountId, Data)>) { let sender = ensure_signed(origin)?; - ensure!(>::exists(&sender), Error::::NotFound); + ensure!(>::contains_key(&sender), Error::::NotFound); ensure!(subs.len() <= T::MaxSubAccounts::get() as usize, Error::::TooManySubAccounts); let (old_deposit, old_ids) = >::get(&sender); diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index ff06cb37d4..f7067a5843 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -315,7 +315,7 @@ decl_module! { ensure_none(origin)?; let current_session = >::current_index(); - let exists = ::exists( + let exists = ::contains_key( ¤t_session, &heartbeat.authority_index ); @@ -398,7 +398,7 @@ impl Module { fn is_online_aux(authority_index: AuthIndex, authority: &T::ValidatorId) -> bool { let current_session = >::current_index(); - ::exists(¤t_session, &authority_index) || + ::contains_key(¤t_session, &authority_index) || >::get( ¤t_session, authority, @@ -409,7 +409,7 @@ impl Module { /// the authorities series, during the current session. Otherwise `false`. pub fn received_heartbeat_in_current_session(authority_index: AuthIndex) -> bool { let current_session = >::current_index(); - ::exists(¤t_session, &authority_index) + ::contains_key(¤t_session, &authority_index) } /// Note that the given authority has authored a block in the current session. diff --git a/frame/offences/src/lib.rs b/frame/offences/src/lib.rs index 2b625873f0..ea6f96cbc3 100644 --- a/frame/offences/src/lib.rs +++ b/frame/offences/src/lib.rs @@ -150,7 +150,7 @@ impl Module { for offender in offenders { let report_id = Self::report_id::(time_slot, &offender); - if !>::exists(&report_id) { + if !>::contains_key(&report_id) { any_new = true; >::insert( &report_id, diff --git a/frame/recovery/src/lib.rs b/frame/recovery/src/lib.rs index 0309fec12a..668608c892 100644 --- a/frame/recovery/src/lib.rs +++ b/frame/recovery/src/lib.rs @@ -401,7 +401,7 @@ decl_module! { ) { let who = ensure_signed(origin)?; // Check account is not already set up for recovery - ensure!(!>::exists(&who), Error::::AlreadyRecoverable); + ensure!(!>::contains_key(&who), Error::::AlreadyRecoverable); // Check user input is valid ensure!(threshold >= 1, Error::::ZeroThreshold); ensure!(!friends.is_empty(), Error::::NotEnoughFriends); @@ -456,9 +456,9 @@ decl_module! { fn initiate_recovery(origin, account: T::AccountId) { let who = ensure_signed(origin)?; // Check that the account is recoverable - ensure!(>::exists(&account), Error::::NotRecoverable); + ensure!(>::contains_key(&account), Error::::NotRecoverable); // Check that the recovery process has not already been started - ensure!(!>::exists(&account, &who), Error::::AlreadyStarted); + ensure!(!>::contains_key(&account, &who), Error::::AlreadyStarted); // Take recovery deposit let recovery_deposit = T::RecoveryDeposit::get(); T::Currency::reserve(&who, recovery_deposit)?; diff --git a/frame/recovery/src/tests.rs b/frame/recovery/src/tests.rs index cfc8e25b12..af4eadb58f 100644 --- a/frame/recovery/src/tests.rs +++ b/frame/recovery/src/tests.rs @@ -92,9 +92,9 @@ fn recovery_lifecycle_works() { assert_eq!(Balances::free_balance(1), 200); assert_eq!(Balances::free_balance(5), 0); // All storage items are removed from the module - assert!(!>::exists(&5, &1)); - assert!(!>::exists(&5)); - assert!(!>::exists(&5)); + assert!(!>::contains_key(&5, &1)); + assert!(!>::contains_key(&5)); + assert!(!>::contains_key(&5)); }); } diff --git a/frame/scored-pool/src/lib.rs b/frame/scored-pool/src/lib.rs index 2a73c4bb68..98a7ed217e 100644 --- a/frame/scored-pool/src/lib.rs +++ b/frame/scored-pool/src/lib.rs @@ -265,7 +265,7 @@ decl_module! { /// the index of the transactor in the `Pool`. pub fn submit_candidacy(origin) { let who = ensure_signed(origin)?; - ensure!(!>::exists(&who), Error::::AlreadyInPool); + ensure!(!>::contains_key(&who), Error::::AlreadyInPool); let deposit = T::CandidateDeposit::get(); T::Currency::reserve(&who, deposit)?; diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index e45ac30bce..c1e1803c64 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -530,8 +530,8 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedNormal(50_000)] pub fn bid(origin, value: BalanceOf) -> DispatchResult { let who = ensure_signed(origin)?; - ensure!(!>::exists(&who), Error::::Suspended); - ensure!(!>::exists(&who), Error::::Suspended); + ensure!(!>::contains_key(&who), Error::::Suspended); + ensure!(!>::contains_key(&who), Error::::Suspended); let bids = >::get(); ensure!(!Self::is_bid(&bids, &who), Error::::AlreadyBid); let candidates = >::get(); @@ -640,8 +640,8 @@ decl_module! { pub fn vouch(origin, who: T::AccountId, value: BalanceOf, tip: BalanceOf) -> DispatchResult { let voucher = ensure_signed(origin)?; // Check user is not suspended. - ensure!(!>::exists(&who), Error::::Suspended); - ensure!(!>::exists(&who), Error::::Suspended); + ensure!(!>::contains_key(&who), Error::::Suspended); + ensure!(!>::contains_key(&who), Error::::Suspended); // Check user is not a bid or candidate. let bids = >::get(); ensure!(!Self::is_bid(&bids, &who), Error::::AlreadyBid); @@ -652,7 +652,7 @@ decl_module! { ensure!(!Self::is_member(&members, &who), Error::::AlreadyMember); // Check sender can vouch. ensure!(Self::is_member(&members, &voucher), Error::::NotMember); - ensure!(!>::exists(&voucher), Error::::AlreadyVouching); + ensure!(!>::contains_key(&voucher), Error::::AlreadyVouching); >::insert(&voucher, VouchingStatus::Vouching); Self::put_bid(bids, &who, value.clone(), BidKind::Vouch(voucher.clone(), tip)); @@ -892,7 +892,7 @@ decl_module! { #[weight = SimpleDispatchInfo::FixedNormal(30_000)] fn judge_suspended_member(origin, who: T::AccountId, forgive: bool) { T::SuspensionJudgementOrigin::ensure_origin(origin)?; - ensure!(>::exists(&who), Error::::NotSuspended); + ensure!(>::contains_key(&who), Error::::NotSuspended); if forgive { // Try to add member back to society. Can fail with `MaxMembers` limit. diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index ca2a2bf092..0c1c9a4942 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -887,13 +887,13 @@ decl_module! { ) { let stash = ensure_signed(origin)?; - if >::exists(&stash) { + if >::contains_key(&stash) { Err(Error::::AlreadyBonded)? } let controller = T::Lookup::lookup(controller)?; - if >::exists(&controller) { + if >::contains_key(&controller) { Err(Error::::AlreadyPaired)? } @@ -1139,7 +1139,7 @@ decl_module! { let stash = ensure_signed(origin)?; let old_controller = Self::bonded(&stash).ok_or(Error::::NotStash)?; let controller = T::Lookup::lookup(controller)?; - if >::exists(&controller) { + if >::contains_key(&controller) { Err(Error::::AlreadyPaired)? } if controller != old_controller { diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index a9b6e16598..f62a58e20b 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -977,7 +977,7 @@ fn bond_extra_works() { // See `bond_extra_and_withdraw_unbonded_works` for more details and updates on `Exposure`. ExtBuilder::default().build().execute_with(|| { // Check that account 10 is a validator - assert!(>::exists(11)); + assert!(>::contains_key(11)); // Check that account 10 is bonded to account 11 assert_eq!(Staking::bonded(&11), Some(10)); // Check how much is at stake @@ -1375,7 +1375,7 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment( // Confirm validator count is 2 assert_eq!(Staking::validator_count(), 2); // Confirm account 10 and 20 are validators - assert!(>::exists(&11) && >::exists(&21)); + assert!(>::contains_key(&11) && >::contains_key(&21)); assert_eq!(Staking::stakers(&11).total, 1000); assert_eq!(Staking::stakers(&21).total, 2000); @@ -1433,10 +1433,10 @@ fn on_free_balance_zero_stash_removes_validator() { assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Stash)); // Check storage items that should be cleaned up - assert!(>::exists(&10)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); + assert!(>::contains_key(&10)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); // Reduce free_balance of controller to 0 let _ = Balances::slash(&10, u64::max_value()); @@ -1447,10 +1447,10 @@ fn on_free_balance_zero_stash_removes_validator() { assert_eq!(Staking::bonded(&11), Some(10)); // Check storage items have not changed - assert!(>::exists(&10)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); + assert!(>::contains_key(&10)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); // Reduce free_balance of stash to 0 let _ = Balances::slash(&11, u64::max_value()); @@ -1458,11 +1458,11 @@ fn on_free_balance_zero_stash_removes_validator() { assert_eq!(Balances::total_balance(&11), 0); // Check storage items do not exist - assert!(!>::exists(&10)); - assert!(!>::exists(&11)); - assert!(!>::exists(&11)); - assert!(!>::exists(&11)); - assert!(!>::exists(&11)); + assert!(!>::contains_key(&10)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); }); } @@ -1474,7 +1474,7 @@ fn on_free_balance_zero_stash_removes_nominator() { // Make 10 a nominator assert_ok!(Staking::nominate(Origin::signed(10), vec![20])); // Check that account 10 is a nominator - assert!(>::exists(11)); + assert!(>::contains_key(11)); // Check the balance of the nominator account assert_eq!(Balances::free_balance(10), 256); // Check the balance of the stash account @@ -1484,10 +1484,10 @@ fn on_free_balance_zero_stash_removes_nominator() { assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Stash)); // Check storage items that should be cleaned up - assert!(>::exists(&10)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); + assert!(>::contains_key(&10)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); // Reduce free_balance of controller to 0 let _ = Balances::slash(&10, u64::max_value()); @@ -1500,10 +1500,10 @@ fn on_free_balance_zero_stash_removes_nominator() { assert_eq!(Staking::bonded(&11), Some(10)); // Check storage items have not changed - assert!(>::exists(&10)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); - assert!(>::exists(&11)); + assert!(>::contains_key(&10)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); // Reduce free_balance of stash to 0 let _ = Balances::slash(&11, u64::max_value()); @@ -1511,11 +1511,11 @@ fn on_free_balance_zero_stash_removes_nominator() { assert_eq!(Balances::total_balance(&11), 0); // Check storage items do not exist - assert!(!>::exists(&10)); - assert!(!>::exists(&11)); - assert!(!>::exists(&11)); - assert!(!>::exists(&11)); - assert!(!>::exists(&11)); + assert!(!>::contains_key(&10)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); }); } @@ -1968,7 +1968,7 @@ fn offence_ensures_new_era_without_clobbering() { #[test] fn offence_deselects_validator_when_slash_is_zero() { ExtBuilder::default().build().execute_with(|| { - assert!(>::exists(11)); + assert!(>::contains_key(11)); on_offence_now( &[OffenceDetails { offender: ( @@ -1980,7 +1980,7 @@ fn offence_deselects_validator_when_slash_is_zero() { &[Perbill::from_percent(0)], ); assert_eq!(Staking::force_era(), Forcing::ForceNew); - assert!(!>::exists(11)); + assert!(!>::contains_key(11)); }); } @@ -2017,7 +2017,7 @@ fn slash_in_old_span_does_not_deselect() { ExtBuilder::default().build().execute_with(|| { start_era(1); - assert!(>::exists(11)); + assert!(>::contains_key(11)); on_offence_now( &[OffenceDetails { offender: ( @@ -2029,13 +2029,13 @@ fn slash_in_old_span_does_not_deselect() { &[Perbill::from_percent(0)], ); assert_eq!(Staking::force_era(), Forcing::ForceNew); - assert!(!>::exists(11)); + assert!(!>::contains_key(11)); start_era(2); Staking::validate(Origin::signed(10), Default::default()).unwrap(); assert_eq!(Staking::force_era(), Forcing::NotForcing); - assert!(>::exists(11)); + assert!(>::contains_key(11)); start_era(3); @@ -2056,7 +2056,7 @@ fn slash_in_old_span_does_not_deselect() { // not for zero-slash. assert_eq!(Staking::force_era(), Forcing::NotForcing); - assert!(>::exists(11)); + assert!(>::contains_key(11)); on_offence_in_era( &[OffenceDetails { @@ -2072,7 +2072,7 @@ fn slash_in_old_span_does_not_deselect() { // or non-zero. assert_eq!(Staking::force_era(), Forcing::NotForcing); - assert!(>::exists(11)); + assert!(>::contains_key(11)); assert_ledger_consistent(11); }); } diff --git a/frame/support/src/storage/generator/double_map.rs b/frame/support/src/storage/generator/double_map.rs index 947235c4bd..ff73fdbedf 100644 --- a/frame/support/src/storage/generator/double_map.rs +++ b/frame/support/src/storage/generator/double_map.rs @@ -110,7 +110,7 @@ where Self::storage_double_map_final_key(k1, k2) } - fn exists(k1: KArg1, k2: KArg2) -> bool + fn contains_key(k1: KArg1, k2: KArg2) -> bool where KArg1: EncodeLike, KArg2: EncodeLike, diff --git a/frame/support/src/storage/generator/linked_map.rs b/frame/support/src/storage/generator/linked_map.rs index face87edf9..2d0df8fcc8 100644 --- a/frame/support/src/storage/generator/linked_map.rs +++ b/frame/support/src/storage/generator/linked_map.rs @@ -326,7 +326,7 @@ where type Enumerator = Enumerator; - fn exists>(key: KeyArg) -> bool { + fn contains_key>(key: KeyArg) -> bool { unhashed::exists(Self::storage_linked_map_final_key(key).as_ref()) } diff --git a/frame/support/src/storage/generator/map.rs b/frame/support/src/storage/generator/map.rs index 78f261e7da..c1d9f1b149 100644 --- a/frame/support/src/storage/generator/map.rs +++ b/frame/support/src/storage/generator/map.rs @@ -95,7 +95,7 @@ impl> storage::StorageMap } } - fn exists>(key: KeyArg) -> bool { + fn contains_key>(key: KeyArg) -> bool { unhashed::exists(Self::storage_map_final_key(key).as_ref()) } diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index f629ac3eb9..3eb1a6f116 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -126,7 +126,7 @@ pub trait StorageMap { fn hashed_key_for>(key: KeyArg) -> Vec; /// Does the value (explicitly) exist in storage? - fn exists>(key: KeyArg) -> bool; + fn contains_key>(key: KeyArg) -> bool; /// Load the value associated with the given key from the map. fn get>(key: KeyArg) -> Self::Query; @@ -176,7 +176,7 @@ pub trait StorageMap { /// `T` is required to implement `Codec::DecodeLength`. /// /// Note that `0` is returned as the default value if no encoded value exists at the given key. - /// Therefore, this function cannot be used as a sign of _existence_. use the `::exists()` + /// Therefore, this function cannot be used as a sign of _existence_. use the `::contains_key()` /// function for this purpose. fn decode_len>(key: KeyArg) -> Result where V: codec::DecodeLength + Len; @@ -196,7 +196,7 @@ pub trait StorageLinkedMap { type Enumerator: Iterator; /// Does the value (explicitly) exist in storage? - fn exists>(key: KeyArg) -> bool; + fn contains_key>(key: KeyArg) -> bool; /// Load the value associated with the given key from the map. fn get>(key: KeyArg) -> Self::Query; @@ -227,7 +227,7 @@ pub trait StorageLinkedMap { /// `T` is required to implement `Codec::DecodeLength`. /// /// Note that `0` is returned as the default value if no encoded value exists at the given key. - /// Therefore, this function cannot be used as a sign of _existence_. use the `::exists()` + /// Therefore, this function cannot be used as a sign of _existence_. use the `::contains_key()` /// function for this purpose. fn decode_len>(key: KeyArg) -> Result where V: codec::DecodeLength + Len; @@ -270,7 +270,7 @@ pub trait StorageDoubleMap { KArg1: EncodeLike, KArg2: EncodeLike; - fn exists(k1: KArg1, k2: KArg2) -> bool + fn contains_key(k1: KArg1, k2: KArg2) -> bool where KArg1: EncodeLike, KArg2: EncodeLike; @@ -348,7 +348,7 @@ pub trait StorageDoubleMap { /// `V` is required to implement `Codec::DecodeLength`. /// /// Note that `0` is returned as the default value if no encoded value exists at the given key. - /// Therefore, this function cannot be used as a sign of _existence_. use the `::exists()` + /// Therefore, this function cannot be used as a sign of _existence_. use the `::contains_key()` /// function for this purpose. fn decode_len(key1: KArg1, key2: KArg2) -> Result where diff --git a/frame/support/test/tests/instance.rs b/frame/support/test/tests/instance.rs index 2c761ca43e..4c509ae18f 100644 --- a/frame/support/test/tests/instance.rs +++ b/frame/support/test/tests/instance.rs @@ -348,8 +348,8 @@ fn storage_with_instance_basic_operation() { assert_eq!(Value::get(), 0); let key = 1; - assert_eq!(Map::exists(0), true); - assert_eq!(Map::exists(key), false); + assert_eq!(Map::contains_key(0), true); + assert_eq!(Map::contains_key(key), false); Map::insert(key, 1); assert_eq!(Map::get(key), 1); assert_eq!(Map::take(key), 1); @@ -357,11 +357,11 @@ fn storage_with_instance_basic_operation() { Map::mutate(key, |a| *a=2); assert_eq!(Map::get(key), 2); Map::remove(key); - assert_eq!(Map::exists(key), false); + assert_eq!(Map::contains_key(key), false); assert_eq!(Map::get(key), 0); - assert_eq!(LinkedMap::exists(0), true); - assert_eq!(LinkedMap::exists(key), false); + assert_eq!(LinkedMap::contains_key(0), true); + assert_eq!(LinkedMap::contains_key(key), false); LinkedMap::insert(key, vec![1]); assert_eq!(LinkedMap::enumerate().count(), 2); assert_eq!(LinkedMap::get(key), vec![1]); @@ -373,17 +373,17 @@ fn storage_with_instance_basic_operation() { assert_eq!(LinkedMap::get(key), vec![2]); LinkedMap::remove(key); assert_eq!(LinkedMap::enumerate().count(), 1); - assert_eq!(LinkedMap::exists(key), false); + assert_eq!(LinkedMap::contains_key(key), false); assert_eq!(LinkedMap::get(key), vec![]); - assert_eq!(LinkedMap::exists(key), false); + assert_eq!(LinkedMap::contains_key(key), false); assert_eq!(LinkedMap::enumerate().count(), 1); LinkedMap::insert(key, &vec![1]); assert_eq!(LinkedMap::enumerate().count(), 2); let key1 = 1; let key2 = 1; - assert_eq!(DoubleMap::exists(&0, &0), true); - assert_eq!(DoubleMap::exists(&key1, &key2), false); + assert_eq!(DoubleMap::contains_key(&0, &0), true); + assert_eq!(DoubleMap::contains_key(&key1, &key2), false); DoubleMap::insert(&key1, &key2, &1); assert_eq!(DoubleMap::get(&key1, &key2), 1); assert_eq!(DoubleMap::take(&key1, &key2), 1); diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index a0f3700c9d..03b5d48aad 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -1146,7 +1146,7 @@ impl SignedExtension for CheckEra { fn additional_signed(&self) -> Result { let current_u64 = >::block_number().saturated_into::(); let n = (self.0).0.birth(current_u64).saturated_into::(); - if !>::exists(n) { + if !>::contains_key(n) { Err(InvalidTransaction::AncientBirthBlock.into()) } else { Ok(>::block_hash(n)) diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 0872bc718c..ef37cc12ee 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -371,7 +371,7 @@ decl_module! { fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::ApproveOrigin::ensure_origin(origin)?; - ensure!(>::exists(proposal_id), Error::::InvalidProposalIndex); + ensure!(>::contains_key(proposal_id), Error::::InvalidProposalIndex); Approvals::mutate(|v| v.push(proposal_id)); } @@ -403,9 +403,9 @@ decl_module! { ensure!(reason.len() <= MAX_SENSIBLE_REASON_LENGTH, Error::::ReasonTooBig); let reason_hash = T::Hashing::hash(&reason[..]); - ensure!(!Reasons::::exists(&reason_hash), Error::::AlreadyKnown); + ensure!(!Reasons::::contains_key(&reason_hash), Error::::AlreadyKnown); let hash = T::Hashing::hash_of(&(&reason_hash, &who)); - ensure!(!Tips::::exists(&hash), Error::::AlreadyKnown); + ensure!(!Tips::::contains_key(&hash), Error::::AlreadyKnown); let deposit = T::TipReportDepositBase::get() + T::TipReportDepositPerByte::get() * (reason.len() as u32).into(); @@ -474,7 +474,7 @@ decl_module! { let tipper = ensure_signed(origin)?; ensure!(T::Tippers::contains(&tipper), BadOrigin); let reason_hash = T::Hashing::hash(&reason[..]); - ensure!(!Reasons::::exists(&reason_hash), Error::::AlreadyKnown); + ensure!(!Reasons::::contains_key(&reason_hash), Error::::AlreadyKnown); let hash = T::Hashing::hash_of(&(&reason_hash, &who)); Reasons::::insert(&reason_hash, &reason); diff --git a/frame/vesting/src/lib.rs b/frame/vesting/src/lib.rs index 4a079e7693..2a1ff12716 100644 --- a/frame/vesting/src/lib.rs +++ b/frame/vesting/src/lib.rs @@ -212,7 +212,7 @@ impl Module { /// (Re)set or remove the module's currency lock on `who`'s account in accordance with their /// current unvested amount. fn update_lock(who: T::AccountId) -> DispatchResult { - ensure!(Vesting::::exists(&who), Error::::NotVesting); + ensure!(Vesting::::contains_key(&who), Error::::NotVesting); let unvested = Self::vesting_balance(&who); if unvested.is_zero() { T::Currency::remove_lock(VESTING_ID, &who); @@ -257,7 +257,7 @@ impl VestingSchedule for Module where starting_block: T::BlockNumber ) -> DispatchResult { if locked.is_zero() { return Ok(()) } - if Vesting::::exists(who) { + if Vesting::::contains_key(who) { Err(Error::::ExistingVestingSchedule)? } let vesting_schedule = VestingInfo { -- GitLab From 0a894803c73175e08944e6032098deded1e65755 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sun, 9 Feb 2020 15:11:22 +0300 Subject: [PATCH 276/296] Alter usage collection a bit (#4863) * alter usage collection a bit * replace with mutex --- client/db/src/lib.rs | 20 ++++++++++---------- client/db/src/light.rs | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index be56919497..36cf7dacf4 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -699,7 +699,7 @@ impl sp_state_machine::Storage> for DbGenesisSto /// Used as inner structure under lock in `FrozenForDuration`. struct Frozen { at: std::time::Instant, - value: T, + value: Option, } /// Some value frozen for period of time. @@ -709,26 +709,26 @@ struct Frozen { /// a new value which will be again frozen for `duration`. pub(crate) struct FrozenForDuration { duration: std::time::Duration, - value: RwLock>, + value: parking_lot::Mutex>, } impl FrozenForDuration { - fn new(duration: std::time::Duration, initial: T) -> Self { + fn new(duration: std::time::Duration) -> Self { Self { duration, - value: Frozen { at: std::time::Instant::now(), value: initial }.into(), + value: Frozen { at: std::time::Instant::now(), value: None }.into(), } } fn take_or_else(&self, f: F) -> T where F: FnOnce() -> T { - if self.value.read().at.elapsed() > self.duration { - let mut write_lock = self.value.write(); + let mut lock = self.value.lock(); + if lock.at.elapsed() > self.duration || lock.value.is_none() { let new_value = f(); - write_lock.at = std::time::Instant::now(); - write_lock.value = new_value.clone(); + lock.at = std::time::Instant::now(); + lock.value = Some(new_value.clone()); new_value } else { - self.value.read().value.clone() + lock.value.as_ref().expect("checked with lock above").clone() } } } @@ -818,7 +818,7 @@ impl Backend { ), import_lock: Default::default(), is_archive: is_archive_pruning, - io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), (kvdb::IoStats::empty(), StateUsageInfo::empty())), + io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1)), state_usage: StateUsageStats::new(), }) } diff --git a/client/db/src/light.rs b/client/db/src/light.rs index e663fc5699..8fb220973f 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -102,7 +102,7 @@ impl LightStorage { cache: Arc::new(DbCacheSync(RwLock::new(cache))), header_metadata_cache: HeaderMetadataCache::default(), #[cfg(not(target_os = "unknown"))] - io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), kvdb::IoStats::empty()), + io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1)), }) } -- GitLab From 3b21fb5020679236a8fe6d6b7a3a009a810d13a2 Mon Sep 17 00:00:00 2001 From: h4x3rotab Date: Mon, 10 Feb 2020 03:11:53 +0800 Subject: [PATCH 277/296] Wrap runtime_print! macro in its own scope (#4867) * Wrap runtime_print! macro in its own scope Before this fix runtime_print! can be used only once in a scope because of the name pollution. * Bump runtime impl versioin (no logic change) --- bin/node/runtime/src/lib.rs | 2 +- frame/support/src/debug.rs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index f0e2c79743..76241eb5e7 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 214, - impl_version: 2, + impl_version: 3, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/support/src/debug.rs b/frame/support/src/debug.rs index 0316fb9797..29847b70e5 100644 --- a/frame/support/src/debug.rs +++ b/frame/support/src/debug.rs @@ -129,10 +129,12 @@ pub mod native { #[macro_export] macro_rules! runtime_print { ($($arg:tt)+) => { - use core::fmt::Write; - let mut w = $crate::debug::Writer::default(); - let _ = core::write!(&mut w, $($arg)+); - w.print(); + { + use core::fmt::Write; + let mut w = $crate::debug::Writer::default(); + let _ = core::write!(&mut w, $($arg)+); + w.print(); + } } } -- GitLab From 8d822dad74598d924612c9cf915933ddc6345089 Mon Sep 17 00:00:00 2001 From: h4x3rotab Date: Mon, 10 Feb 2020 03:29:45 +0800 Subject: [PATCH 278/296] Remove the unnecessary std dependency from 'blake2-rfc' (#4868) --- primitives/api/proc-macro/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index cb9f2e4599..66c2c5dba8 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -12,7 +12,7 @@ proc-macro = true quote = "1.0.2" syn = { version = "1.0.8", features = ["full", "fold", "extra-traits", "visit"] } proc-macro2 = "1.0.6" -blake2-rfc = "0.2.18" +blake2-rfc = { version = "0.2.18", default-features = false } proc-macro-crate = "0.1.4" # Required for the doc tests -- GitLab From 19b67cd93b56396e8921b5227add3f7de18c60f4 Mon Sep 17 00:00:00 2001 From: h4x3rotab Date: Mon, 10 Feb 2020 16:26:09 +0800 Subject: [PATCH 279/296] Export GRANDPA AuthorityPair when full_crypto is enabled (#4872) * Export crypto_full feature in primitives/finality-grandpa * Export GRANDPA AuthorityPair when full_crypto is enabled --- primitives/finality-grandpa/Cargo.toml | 3 +++ primitives/finality-grandpa/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index dfa6b572d8..6498763e4c 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -23,3 +23,6 @@ std = [ "sp-api/std", "sp-runtime/std", ] +full_crypto = [ + "app-crypto/full_crypto" +] diff --git a/primitives/finality-grandpa/src/lib.rs b/primitives/finality-grandpa/src/lib.rs index f1481c0aed..98fce45081 100644 --- a/primitives/finality-grandpa/src/lib.rs +++ b/primitives/finality-grandpa/src/lib.rs @@ -34,7 +34,7 @@ mod app { } /// The grandpa crypto scheme defined via the keypair type. -#[cfg(feature = "std")] +#[cfg(any(feature = "std", feature = "full_crypto"))] pub type AuthorityPair = app::Pair; /// Identity of a Grandpa authority. -- GitLab From 8b6b093dd9a84547fa1fbbfd88fbf45b545a9855 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Mon, 10 Feb 2020 10:23:08 +0100 Subject: [PATCH 280/296] Create Benchmarking Setup for Identity Pallet #4695 (#4818) * Starting * closer * Compiles! * comments * Create seperate mock * Remove changes to test env * Fix step calculation * Add host function * Add runtime api * compiles * Update to use offchain timestamp * Gives a result * added some CLI wip * make generic * Update instance * Remove CLI stuff * Remove last cli stuff * undo more changes * Update benchmarks * Update Cargo.lock * remove test * Move loop out of runtime * Benchmarking externalities * Benchmarking state * Implemented commit * Make CLI work, move loop back into runtime * Wipe resets to genesis * Speedup benchmarks * Use enum to select extrinsic within pallet * CLI controls which module and extrinsic to call * Select a pallet with cli * Add steps and repeats to cli * Output as CSV format * Introduce benchmark pallet * Append bench * Use Results * fix merge * Clear Identity benchmark * Bench request judgment and cancel request * Add final benchmarks * Fix CSV output * Start cleaning up for PR * Bump numbers in `wasmtime` integration tests. * More docs * Add rockdb feature to bench * Fix formatting issues * Add test feature to bench * Add test feature to bench * Add rocksdb feature flag * Update bench.rs Co-authored-by: Arkadiy Paronyan Co-authored-by: Gavin Wood --- Cargo.lock | 1 + bin/node/runtime/src/lib.rs | 25 +- client/cli/src/lib.rs | 1 + client/cli/src/params.rs | 77 +++ client/db/Cargo.toml | 1 + client/db/src/bench.rs | 286 ++++++++ client/db/src/lib.rs | 6 + client/executor/src/integration_tests/mod.rs | 4 +- client/service/src/builder.rs | 2 + client/service/src/chain_ops.rs | 73 +- client/service/src/lib.rs | 1 + client/src/lib.rs | 2 +- frame/identity/src/benchmarking.rs | 630 ++++++++++++++++++ frame/identity/src/lib.rs | 4 +- primitives/externalities/src/lib.rs | 8 + primitives/io/src/lib.rs | 25 + primitives/runtime/src/lib.rs | 12 + primitives/runtime/src/traits.rs | 21 + primitives/state-machine/src/backend.rs | 10 + primitives/state-machine/src/ext.rs | 19 + .../state-machine/src/overlayed_changes.rs | 28 +- 21 files changed, 1217 insertions(+), 19 deletions(-) create mode 100644 client/db/src/bench.rs create mode 100644 frame/identity/src/benchmarking.rs diff --git a/Cargo.lock b/Cargo.lock index d13c45afa2..b59da69bfe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5654,6 +5654,7 @@ dependencies = [ "parity-util-mem", "parking_lot 0.10.0", "quickcheck", + "rand 0.7.3", "sc-client", "sc-client-api", "sc-executor", diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 76241eb5e7..c9528a3c3e 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -30,12 +30,14 @@ use sp_core::u32_trait::{_1, _2, _3, _4}; use node_primitives::{AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Moment, Signature}; use sp_api::impl_runtime_apis; use sp_runtime::{ - Permill, Perbill, Percent, ApplyExtrinsicResult, impl_opaque_keys, generic, create_runtime_str + Permill, Perbill, Percent, ApplyExtrinsicResult, impl_opaque_keys, generic, create_runtime_str, + BenchmarkResults, }; use sp_runtime::curve::PiecewiseLinear; use sp_runtime::transaction_validity::TransactionValidity; use sp_runtime::traits::{ - self, BlakeTwo256, Block as BlockT, StaticLookup, SaturatedConversion, ConvertInto, OpaqueKeys, + self, BlakeTwo256, Block as BlockT, StaticLookup, SaturatedConversion, + ConvertInto, OpaqueKeys, Benchmarking, }; use sp_version::RuntimeVersion; #[cfg(any(feature = "std", test))] @@ -804,6 +806,25 @@ impl_runtime_apis! { SessionKeys::decode_into_raw_public_keys(&encoded) } } + + impl crate::Benchmark for Runtime { + fn dispatch_benchmark(module: Vec, extrinsic: Vec, steps: u32, repeat: u32) + -> Option> + { + match module.as_slice() { + b"pallet-identity" | b"identity" => Identity::run_benchmark(extrinsic, steps, repeat).ok(), + _ => return None, + } + } + } +} + +sp_api::decl_runtime_apis! { + pub trait Benchmark + { + fn dispatch_benchmark(module: Vec, extrinsic: Vec, steps: u32, repeat: u32) + -> Option>; + } } #[cfg(test)] diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 54a98a6ad3..5649232c37 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -58,6 +58,7 @@ use params::{ pub use params::{ SharedParams, ImportParams, ExecutionStrategy, Subcommand, RunCmd, BuildSpecCmd, ExportBlocksCmd, ImportBlocksCmd, CheckBlockCmd, PurgeChainCmd, RevertCmd, + BenchmarkCmd, }; pub use traits::GetSharedParams; use app_dirs::{AppInfo, AppDataType}; diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs index a99d887d25..0881247b07 100644 --- a/client/cli/src/params.rs +++ b/client/cli/src/params.rs @@ -845,6 +845,49 @@ pub struct PurgeChainCmd { pub shared_params: SharedParams, } +/// The `benchmark` command used to benchmark FRAME Pallets. +#[derive(Debug, StructOpt, Clone)] +pub struct BenchmarkCmd { + /// Select a FRAME Pallet to benchmark. + #[structopt(short, long)] + pub pallet: String, + + /// Select an extrinsic to benchmark. + #[structopt(short, long)] + pub extrinsic: String, + + /// Select how many samples we should take across the variable components. + #[structopt(short, long, default_value = "1")] + pub steps: u32, + + /// Select how many repetitions of this benchmark should run. + #[structopt(short, long, default_value = "1")] + pub repeat: u32, + + #[allow(missing_docs)] + #[structopt(flatten)] + pub shared_params: SharedParams, + + /// The execution strategy that should be used for benchmarks + #[structopt( + long = "execution", + value_name = "STRATEGY", + possible_values = &ExecutionStrategy::variants(), + case_insensitive = true, + )] + pub execution: Option, + + /// Method for executing Wasm runtime code. + #[structopt( + long = "wasm-execution", + value_name = "METHOD", + possible_values = &WasmExecutionMethod::enabled_variants(), + case_insensitive = true, + default_value = "Interpreted" + )] + pub wasm_method: WasmExecutionMethod, +} + /// All core commands that are provided by default. /// /// The core commands are split into multiple subcommands and `Run` is the default subcommand. From @@ -869,6 +912,9 @@ pub enum Subcommand { /// Remove the whole chain data. PurgeChain(PurgeChainCmd), + + /// Run runtime benchmarks. + Benchmark(BenchmarkCmd), } impl Subcommand { @@ -883,6 +929,7 @@ impl Subcommand { CheckBlock(params) => ¶ms.shared_params, Revert(params) => ¶ms.shared_params, PurgeChain(params) => ¶ms.shared_params, + Benchmark(params) => ¶ms.shared_params, } } @@ -909,6 +956,7 @@ impl Subcommand { Subcommand::ImportBlocks(cmd) => cmd.run(config, builder), Subcommand::CheckBlock(cmd) => cmd.run(config, builder), Subcommand::PurgeChain(cmd) => cmd.run(config), + Subcommand::Benchmark(cmd) => cmd.run(config, builder), Subcommand::Revert(cmd) => cmd.run(config, builder), } } @@ -1186,3 +1234,32 @@ impl RevertCmd { Ok(()) } } + +impl BenchmarkCmd { + /// Runs the command and benchmarks the chain. + pub fn run( + self, + config: Configuration, + _builder: B, + ) -> error::Result<()> + where + B: FnOnce(Configuration) -> Result, + G: RuntimeGenesis, + E: ChainSpecExtension, + BC: ServiceBuilderCommand + Unpin, + BB: sp_runtime::traits::Block + Debug, + <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, + ::Hash: std::str::FromStr, + { + let spec = config.chain_spec.expect("chain_spec is always Some"); + let execution_strategy = self.execution.unwrap_or(ExecutionStrategy::Native).into(); + let wasm_method = self.wasm_method.into(); + let pallet = self.pallet; + let extrinsic = self.extrinsic; + let steps = self.steps; + let repeat = self.repeat; + sc_service::chain_ops::benchmark_runtime::(spec, execution_strategy, wasm_method, pallet, extrinsic, steps, repeat)?; + Ok(()) + } +} + diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index d35a554d3f..ef418d43ef 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -8,6 +8,7 @@ license = "GPL-3.0" [dependencies] parking_lot = "0.10.0" log = "0.4.8" +rand = "0.7" kvdb = "0.4.0" kvdb-rocksdb = { version = "0.5", optional = true } kvdb-memorydb = "0.4.0" diff --git a/client/db/src/bench.rs b/client/db/src/bench.rs new file mode 100644 index 0000000000..9858a5c148 --- /dev/null +++ b/client/db/src/bench.rs @@ -0,0 +1,286 @@ +// Copyright 2020 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 . + +//! State backend that's useful for benchmarking + +use std::sync::Arc; +use std::path::PathBuf; +use std::cell::{Cell, RefCell}; +use rand::Rng; + +use hash_db::{Prefix, Hasher}; +use sp_trie::{MemoryDB, prefixed_key}; +use sp_core::storage::ChildInfo; +use sp_runtime::traits::{Block as BlockT, HasherFor}; +use sp_runtime::Storage; +use sp_state_machine::{DBValue, backend::Backend as StateBackend}; +use kvdb::{KeyValueDB, DBTransaction}; +use kvdb_rocksdb::{Database, DatabaseConfig}; + +type DbState = sp_state_machine::TrieBackend< + Arc>>, HasherFor +>; + +struct StorageDb { + db: Arc, + _block: std::marker::PhantomData, +} + +impl sp_state_machine::Storage> for StorageDb { + fn get(&self, key: &Block::Hash, prefix: Prefix) -> Result, String> { + let key = prefixed_key::>(key, prefix); + self.db.get(0, &key) + .map_err(|e| format!("Database backend error: {:?}", e)) + } +} + +/// State that manages the backend database reference. Allows runtime to control the database. +pub struct BenchmarkingState { + path: PathBuf, + root: Cell, + state: RefCell>>, + db: Cell>>, + genesis: as StateBackend>>::Transaction, +} + +impl BenchmarkingState { + /// Create a new instance that creates a database in a temporary dir. + pub fn new(genesis: Storage) -> Result { + let temp_dir = PathBuf::from(std::env::temp_dir()); + let name: String = rand::thread_rng().sample_iter(&rand::distributions::Alphanumeric).take(10).collect(); + let path = temp_dir.join(&name); + + let mut root = B::Hash::default(); + let mut mdb = MemoryDB::>::default(); + sp_state_machine::TrieDBMut::>::new(&mut mdb, &mut root); + + std::fs::create_dir(&path).map_err(|_| String::from("Error creating temp dir"))?; + let mut state = BenchmarkingState { + state: RefCell::new(None), + db: Cell::new(None), + path, + root: Cell::new(root), + genesis: Default::default(), + }; + + state.reopen()?; + let child_delta = genesis.children.into_iter().map(|(storage_key, child_content)| ( + storage_key, + child_content.data.into_iter().map(|(k, v)| (k, Some(v))), + child_content.child_info + )); + let (root, transaction) = state.state.borrow_mut().as_mut().unwrap().full_storage_root( + genesis.top.into_iter().map(|(k, v)| (k, Some(v))), + child_delta, + ); + state.genesis = transaction.clone(); + state.commit(root, transaction)?; + Ok(state) + } + + fn reopen(&self) -> Result<(), String> { + *self.state.borrow_mut() = None; + self.db.set(None); + let db_config = DatabaseConfig::with_columns(1); + let path = self.path.to_str() + .ok_or_else(|| String::from("Invalid database path"))?; + let db = Arc::new(Database::open(&db_config, &path).map_err(|e| format!("Error opening database: {:?}", e))?); + self.db.set(Some(db.clone())); + let storage_db = Arc::new(StorageDb:: { db, _block: Default::default() }); + *self.state.borrow_mut() = Some(DbState::::new(storage_db, self.root.get())); + Ok(()) + } + + fn kill(&self) -> Result<(), String> { + self.db.set(None); + *self.state.borrow_mut() = None; + let mut root = B::Hash::default(); + let mut mdb = MemoryDB::>::default(); + sp_state_machine::TrieDBMut::>::new(&mut mdb, &mut root); + self.root.set(root); + + std::fs::remove_dir_all(&self.path).map_err(|_| "Error removing database dir".into()) + } +} + +impl Drop for BenchmarkingState { + fn drop(&mut self) { + self.kill().ok(); + } +} + +fn state_err() -> String { + "State is not open".into() +} + +impl StateBackend> for BenchmarkingState { + type Error = as StateBackend>>::Error; + type Transaction = as StateBackend>>::Transaction; + type TrieBackendStorage = as StateBackend>>::TrieBackendStorage; + + fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + self.state.borrow().as_ref().ok_or_else(state_err)?.storage(key) + } + + fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { + self.state.borrow().as_ref().ok_or_else(state_err)?.storage_hash(key) + } + + fn child_storage( + &self, + storage_key: &[u8], + child_info: ChildInfo, + key: &[u8], + ) -> Result>, Self::Error> { + self.state.borrow().as_ref().ok_or_else(state_err)?.child_storage(storage_key, child_info, key) + } + + fn exists_storage(&self, key: &[u8]) -> Result { + self.state.borrow().as_ref().ok_or_else(state_err)?.exists_storage(key) + } + + fn exists_child_storage( + &self, + storage_key: &[u8], + child_info: ChildInfo, + key: &[u8], + ) -> Result { + self.state.borrow().as_ref().ok_or_else(state_err)?.exists_child_storage(storage_key, child_info, key) + } + + fn next_storage_key(&self, key: &[u8]) -> Result>, Self::Error> { + self.state.borrow().as_ref().ok_or_else(state_err)?.next_storage_key(key) + } + + fn next_child_storage_key( + &self, + storage_key: &[u8], + child_info: ChildInfo, + key: &[u8], + ) -> Result>, Self::Error> { + self.state.borrow().as_ref().ok_or_else(state_err)?.next_child_storage_key(storage_key, child_info, key) + } + + fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { + if let Some(ref state) = *self.state.borrow() { + state.for_keys_with_prefix(prefix, f) + } + } + + fn for_key_values_with_prefix(&self, prefix: &[u8], f: F) { + if let Some(ref state) = *self.state.borrow() { + state.for_key_values_with_prefix(prefix, f) + } + } + + fn for_keys_in_child_storage( + &self, + storage_key: &[u8], + child_info: ChildInfo, + f: F, + ) { + if let Some(ref state) = *self.state.borrow() { + state.for_keys_in_child_storage(storage_key, child_info, f) + } + } + + fn for_child_keys_with_prefix( + &self, + storage_key: &[u8], + child_info: ChildInfo, + prefix: &[u8], + f: F, + ) { + if let Some(ref state) = *self.state.borrow() { + state.for_child_keys_with_prefix(storage_key, child_info, prefix, f) + } + } + + fn storage_root(&self, delta: I) -> (B::Hash, Self::Transaction) where + I: IntoIterator, Option>)> + { + self.state.borrow().as_ref().map_or(Default::default(), |s| s.storage_root(delta)) + } + + fn child_storage_root( + &self, + storage_key: &[u8], + child_info: ChildInfo, + delta: I, + ) -> (B::Hash, bool, Self::Transaction) where + I: IntoIterator, Option>)>, + { + self.state.borrow().as_ref().map_or(Default::default(), |s| s.child_storage_root(storage_key, child_info, delta)) + } + + fn pairs(&self) -> Vec<(Vec, Vec)> { + self.state.borrow().as_ref().map_or(Default::default(), |s| s.pairs()) + } + + fn keys(&self, prefix: &[u8]) -> Vec> { + self.state.borrow().as_ref().map_or(Default::default(), |s| s.keys(prefix)) + } + + fn child_keys( + &self, + storage_key: &[u8], + child_info: ChildInfo, + prefix: &[u8], + ) -> Vec> { + self.state.borrow().as_ref().map_or(Default::default(), |s| s.child_keys(storage_key, child_info, prefix)) + } + + fn as_trie_backend(&mut self) + -> Option<&sp_state_machine::TrieBackend>> + { + None + } + + fn commit(&self, storage_root: as Hasher>::Out, mut transaction: Self::Transaction) + -> Result<(), Self::Error> + { + if let Some(db) = self.db.take() { + let mut db_transaction = DBTransaction::new(); + + for (key, (val, rc)) in transaction.drain() { + if rc > 0 { + db_transaction.put(0, &key, &val); + } else if rc < 0 { + db_transaction.delete(0, &key); + } + } + db.write(db_transaction).map_err(|_| String::from("Error committing transaction"))?; + self.root.set(storage_root); + } else { + return Err("Trying to commit to a closed db".into()) + } + self.reopen() + } + + fn wipe(&self) -> Result<(), Self::Error> { + self.kill()?; + self.reopen()?; + self.commit(self.root.get(), self.genesis.clone())?; + Ok(()) + } +} + +impl std::fmt::Debug for BenchmarkingState { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "DB at {:?}", self.path) + } +} + diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 36cf7dacf4..20998a57f9 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -29,6 +29,9 @@ pub mod light; pub mod offchain; +#[cfg(any(feature = "kvdb-rocksdb", test))] +pub mod bench; + mod children; mod cache; mod changes_tries_storage; @@ -80,6 +83,9 @@ use crate::stats::StateUsageStats; use log::{trace, debug, warn}; pub use sc_state_db::PruningMode; +#[cfg(any(feature = "kvdb-rocksdb", test))] +pub use bench::BenchmarkingState; + #[cfg(feature = "test-helpers")] use sc_client::in_mem::Backend as InMemoryBackend; diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 3f3d9f69e1..2ac67215a8 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -88,7 +88,7 @@ fn call_not_existing_function(wasm_method: WasmExecutionMethod) { #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => assert_eq!( &format!("{:?}", e), - "Other(\"call to undefined external function with index 68\")" + "Other(\"call to undefined external function with index 71\")" ), } } @@ -117,7 +117,7 @@ fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => assert_eq!( &format!("{:?}", e), - "Other(\"call to undefined external function with index 69\")" + "Other(\"call to undefined external function with index 72\")" ), } } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 2c10804675..71749ac308 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -673,6 +673,8 @@ impl(spec: ChainSpec, raw: bool) -> error::Result ( + spec: ChainSpec, + strategy: ExecutionStrategy, + wasm_method: WasmExecutionMethod, + pallet: String, + extrinsic: String, + steps: u32, + repeat: u32, +) -> error::Result<()> where + TBl: BlockT, + TExecDisp: NativeExecutionDispatch + 'static, + G: RuntimeGenesis, + E: Extension, +{ + let genesis_storage = spec.build_storage()?; + let mut changes = Default::default(); + let state = BenchmarkingState::::new(genesis_storage)?; + let executor = NativeExecutor::::new( + wasm_method, + None, // heap pages + ); + let result = StateMachine::<_, _, NumberFor, _>::new( + &state, + None, + &mut changes, + &executor, + "Benchmark_dispatch_benchmark", + &(&pallet, &extrinsic, steps, repeat).encode(), + Default::default(), + ).execute(strategy).map_err(|e| format!("Error executing runtime benchmark: {:?}", e))?; + let results = > as Decode>::decode(&mut &result[..]).unwrap_or(None); + if let Some(results) = results { + // Print benchmark metadata + println!("Pallet: {:?}, Extrinsic: {:?}, Steps: {:?}, Repeat: {:?}", pallet, extrinsic, steps, repeat); + // Print the table header + results[0].0.iter().for_each(|param| print!("{:?},", param.0)); + print!("time\n"); + // Print the values + results.iter().for_each(|result| { + let parameters = &result.0; + parameters.iter().for_each(|param| print!("{:?},", param.1)); + print!("{:?}\n", result.1); + }); + info!("Done."); + } else { + info!("No Results."); + } + Ok(()) +} + + impl< TBl, TRtApi, TGen, TCSExt, TBackend, - TExec, TFchr, TSc, TImpQu, TFprb, TFpp, TNetP, + TExecDisp, TFchr, TSc, TImpQu, TFprb, TFpp, TNetP, TExPool, TRpc, Backend > ServiceBuilderCommand for ServiceBuilder< - TBl, TRtApi, TGen, TCSExt, Client, + TBl, TRtApi, TGen, TCSExt, + Client>, TBl, TRtApi>, TFchr, TSc, TImpQu, TFprb, TFpp, TNetP, TExPool, TRpc, Backend > where TBl: BlockT, TBackend: 'static + sc_client_api::backend::Backend + Send, - TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, + TExecDisp: 'static + NativeExecutionDispatch, TImpQu: 'static + ImportQueue, TRtApi: 'static + Send + Sync, { type Block = TBl; + type NativeDispatch = TExecDisp; fn import_blocks( self, diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 577f36572a..920cdc5c4c 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -65,6 +65,7 @@ pub use sp_transaction_pool::{TransactionPool, InPoolTransaction, error::IntoPoo pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; pub use sc_client::FinalityNotifications; pub use sc_rpc::Metadata as RpcMetadata; +pub use sc_executor::NativeExecutionDispatch; #[doc(hidden)] pub use std::{ops::Deref, result::Result, sync::Arc}; #[doc(hidden)] diff --git a/client/src/lib.rs b/client/src/lib.rs index 4caabfa201..d97246d478 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -104,4 +104,4 @@ pub use crate::{ }, leaves::LeafSet, }; -pub use sp_state_machine::{ExecutionStrategy, StorageProof}; +pub use sp_state_machine::{ExecutionStrategy, StorageProof, StateMachine}; diff --git a/frame/identity/src/benchmarking.rs b/frame/identity/src/benchmarking.rs new file mode 100644 index 0000000000..0a4a143ea9 --- /dev/null +++ b/frame/identity/src/benchmarking.rs @@ -0,0 +1,630 @@ +// Copyright 2020 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 . + +//! Identity pallet benchmarking. + +use super::*; + +use frame_system::RawOrigin; +use sp_io::hashing::blake2_256; +use sp_runtime::{BenchmarkResults, BenchmarkParameter}; +use sp_runtime::traits::{Bounded, Benchmarking, BenchmarkingSetup, Dispatchable}; + +use crate::Module as Identity; + +// The maximum number of identity registrars we will test. +const MAX_REGISTRARS: u32 = 50; + +// Support Functions +fn account(name: &'static str, index: u32) -> T::AccountId { + let entropy = (name, index).using_encoded(blake2_256); + T::AccountId::decode(&mut &entropy[..]).unwrap_or_default() +} + +// Adds `r` registrars to the Identity Pallet. These registrars will have set fees and fields. +fn add_registrars(r: u32) -> Result<(), &'static str> { + for i in 0..r { + let _ = T::Currency::make_free_balance_be(&account::("registrar", i), BalanceOf::::max_value()); + Identity::::add_registrar(RawOrigin::Root.into(), account::("registrar", i))?; + Identity::::set_fee(RawOrigin::Signed(account::("registrar", i)).into(), i.into(), 10.into())?; + let fields = IdentityFields( + IdentityField::Display | IdentityField::Legal | IdentityField::Web | IdentityField::Riot + | IdentityField::Email | IdentityField::PgpFingerprint | IdentityField::Image | IdentityField::Twitter + ); + Identity::::set_fields(RawOrigin::Signed(account::("registrar", i)).into(), i.into(), fields)?; + } + + assert_eq!(Registrars::::get().len(), r as usize); + Ok(()) +} + +// Adds `s` sub-accounts to the identity of `who`. Each wil have 32 bytes of raw data added to it. +// This additionally returns the vector of sub-accounts to it can be modified if needed. +fn add_sub_accounts(who: T::AccountId, s: u32) -> Result, &'static str> { + let mut subs = Vec::new(); + let who_origin = RawOrigin::Signed(who.clone()); + let data = Data::Raw(vec![0; 32]); + + for i in 0..s { + let sub_account = account::("sub", i); + subs.push((sub_account, data.clone())); + } + Identity::::set_subs(who_origin.into(), subs.clone())?; + + return Ok(subs) +} + +// This creates an `IdentityInfo` object with `num_fields` extra fields. +// All data is pre-populated with some arbitrary bytes. +fn create_identity_info(num_fields: u32) -> IdentityInfo { + let data = Data::Raw(vec![0; 32]); + + let info = IdentityInfo { + additional: vec![(data.clone(), data.clone()); num_fields as usize], + display: data.clone(), + legal: data.clone(), + web: data.clone(), + riot: data.clone(), + email: data.clone(), + pgp_fingerprint: Some([0; 20]), + image: data.clone(), + twitter: data.clone(), + }; + + return info +} + +// Benchmark `add_registrar` extrinsic. +struct AddRegistrar; +impl BenchmarkingSetup, RawOrigin> for AddRegistrar { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // Add r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Return the `add_registrar` r + 1 call + Ok((crate::Call::::add_registrar(account::("registrar", r + 1)), RawOrigin::Root)) + } +} + +// Benchmark `set_identity` extrinsic. +struct SetIdentity; +impl BenchmarkingSetup, RawOrigin> for SetIdentity { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + // Additional Field Count + (BenchmarkParameter::X, 1, T::MaxAdditionalFields::get()) + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // Add r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // The target user + let caller = account::("caller", r); + let caller_lookup: ::Source = T::Lookup::unlookup(caller.clone()); + let caller_origin: ::Origin = RawOrigin::Signed(caller.clone()).into(); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Add an initial identity + let initial_info = benchmarking::create_identity_info::(1); + Identity::::set_identity(caller_origin.clone(), initial_info)?; + + // User requests judgement from all the registrars, and they approve + for i in 0..r { + Identity::::request_judgement(caller_origin.clone(), i, 10.into())?; + Identity::::provide_judgement( + RawOrigin::Signed(account::("registrar", i)).into(), + i, + caller_lookup.clone(), + Judgement::Reasonable + )?; + } + + // Create identity info with x additional fields + let x = components.iter().find(|&c| c.0 == BenchmarkParameter::X).unwrap().1; + // 32 byte data that we reuse below + let info = benchmarking::create_identity_info::(x); + + // Return the `set_identity` call + Ok((crate::Call::::set_identity(info), RawOrigin::Signed(caller))) + } +} + +// Benchmark `set_subs` extrinsic. +struct SetSubs; +impl BenchmarkingSetup, RawOrigin> for SetSubs { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Subs Count + (BenchmarkParameter::S, 1, T::MaxSubAccounts::get()), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // Generic data to be used. + let data = Data::Raw(vec![0; 32]); + + // The target user + let caller = account::("caller", 0); + let caller_origin: ::Origin = RawOrigin::Signed(caller.clone()).into(); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Create their main identity + let info = benchmarking::create_identity_info::(1); + Identity::::set_identity(caller_origin.clone(), info)?; + + // Give them s many sub accounts + let s = components.iter().find(|&c| c.0 == BenchmarkParameter::S).unwrap().1; + let mut subs = add_sub_accounts::(caller.clone(), s)?; + + // Create an s+1 sub account to add + subs.push((account::("sub", s+1), data)); + + // Return the `set_subs` call + Ok((crate::Call::::set_subs(subs), RawOrigin::Signed(caller))) + } +} + +// Benchmark `clear_identity` extrinsic. +struct ClearIdentity; +impl BenchmarkingSetup, RawOrigin> for ClearIdentity { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + // Subs Count + (BenchmarkParameter::S, 1, T::MaxSubAccounts::get()), + // Additional Field Count + (BenchmarkParameter::X, 1, T::MaxAdditionalFields::get()), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // The target user + let caller = account::("caller", 0); + let caller_origin: ::Origin = RawOrigin::Signed(caller.clone()).into(); + let caller_lookup: ::Source = T::Lookup::unlookup(caller.clone()); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Register r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Create their main identity with x additional fields + let x = components.iter().find(|&c| c.0 == BenchmarkParameter::X).unwrap().1; + let info = benchmarking::create_identity_info::(x); + Identity::::set_identity(caller_origin.clone(), info)?; + + // Give them s many sub accounts + let s = components.iter().find(|&c| c.0 == BenchmarkParameter::S).unwrap().1; + let _ = benchmarking::add_sub_accounts::(caller.clone(), s)?; + + // User requests judgement from all the registrars, and they approve + for i in 0..r { + Identity::::request_judgement(caller_origin.clone(), i, 10.into())?; + Identity::::provide_judgement( + RawOrigin::Signed(account::("registrar", i)).into(), + i, + caller_lookup.clone(), + Judgement::Reasonable + )?; + } + + // Return the `clear_identity` call + Ok((crate::Call::::clear_identity(), RawOrigin::Signed(caller))) + } +} + +// Benchmark `request_judgement` extrinsic. +struct RequestJudgement; +impl BenchmarkingSetup, RawOrigin> for RequestJudgement { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + // Additional Field Count + (BenchmarkParameter::X, 1, T::MaxAdditionalFields::get()), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // The target user + let caller = account::("caller", 0); + let caller_origin: ::Origin = RawOrigin::Signed(caller.clone()).into(); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Register r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Create their main identity with x additional fields + let x = components.iter().find(|&c| c.0 == BenchmarkParameter::X).unwrap().1; + let info = benchmarking::create_identity_info::(x); + Identity::::set_identity(caller_origin.clone(), info)?; + + // Return the `request_judgement` call + Ok((crate::Call::::request_judgement(r-1, 10.into()), RawOrigin::Signed(caller))) + } +} + +// Benchmark `cancel_request` extrinsic. +struct CancelRequest; +impl BenchmarkingSetup, RawOrigin> for CancelRequest { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + // Additional Field Count + (BenchmarkParameter::X, 1, T::MaxAdditionalFields::get()), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // The target user + let caller = account::("caller", 0); + let caller_origin: ::Origin = RawOrigin::Signed(caller.clone()).into(); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Register r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Create their main identity with x additional fields + let x = components.iter().find(|&c| c.0 == BenchmarkParameter::X).unwrap().1; + let info = benchmarking::create_identity_info::(x); + Identity::::set_identity(caller_origin.clone(), info)?; + + // Request judgement + Identity::::request_judgement(caller_origin.clone(), r-1, 10.into())?; + + Ok((crate::Call::::cancel_request(r-1), RawOrigin::Signed(caller))) + } +} + +// Benchmark `set_fee` extrinsic. +struct SetFee; +impl BenchmarkingSetup, RawOrigin> for SetFee { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // The target user + let caller = account::("caller", 0); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Register r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Add caller as registrar + Identity::::add_registrar(RawOrigin::Root.into(), caller.clone())?; + + // Return `set_fee` call + Ok((crate::Call::::set_fee(r, 10.into()), RawOrigin::Signed(caller))) + } +} + +// Benchmark `set_account_id` extrinsic. +struct SetAccountId; +impl BenchmarkingSetup, RawOrigin> for SetAccountId { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // The target user + let caller = account::("caller", 0); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Register r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Add caller as registrar + Identity::::add_registrar(RawOrigin::Root.into(), caller.clone())?; + + // Return `set_account_id` call + Ok((crate::Call::::set_account_id(r, account::("new", 0)), RawOrigin::Signed(caller))) + } +} + +// Benchmark `set_fields` extrinsic. +struct SetFields; +impl BenchmarkingSetup, RawOrigin> for SetFields { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // The target user + let caller = account::("caller", 0); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Register r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Add caller as registrar + Identity::::add_registrar(RawOrigin::Root.into(), caller.clone())?; + + let fields = IdentityFields( + IdentityField::Display | IdentityField::Legal | IdentityField::Web | IdentityField::Riot + | IdentityField::Email | IdentityField::PgpFingerprint | IdentityField::Image | IdentityField::Twitter + ); + + // Return `set_account_id` call + Ok((crate::Call::::set_fields(r, fields), RawOrigin::Signed(caller))) + } +} + +// Benchmark `provide_judgement` extrinsic. +struct ProvideJudgement; +impl BenchmarkingSetup, RawOrigin> for ProvideJudgement { + + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + // Additional Field Count + (BenchmarkParameter::X, 1, T::MaxAdditionalFields::get()), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // Add r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // The user + let user = account::("user", r); + let user_origin: ::Origin = RawOrigin::Signed(user.clone()).into(); + let user_lookup: ::Source = T::Lookup::unlookup(user.clone()); + let _ = T::Currency::make_free_balance_be(&user, BalanceOf::::max_value()); + + // Create their main identity with x additional fields + let x = components.iter().find(|&c| c.0 == BenchmarkParameter::X).unwrap().1; + let info = benchmarking::create_identity_info::(x); + Identity::::set_identity(user_origin.clone(), info)?; + + // The caller registrar + let caller = account::("caller", r); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Add caller as registrar + Identity::::add_registrar(RawOrigin::Root.into(), caller.clone())?; + + // User requests judgement from caller registrar + Identity::::request_judgement(user_origin.clone(), r, 10.into())?; + + // Return `provide_judgement` call + Ok((crate::Call::::provide_judgement( + r, + user_lookup.clone(), + Judgement::Reasonable + ), RawOrigin::Signed(caller))) + } +} + +// Benchmark `kill_identity` extrinsic. +struct KillIdentity; +impl BenchmarkingSetup, RawOrigin> for KillIdentity { + + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + vec![ + // Registrar Count + (BenchmarkParameter::R, 1, MAX_REGISTRARS), + // Subs Count + (BenchmarkParameter::S, 1, T::MaxSubAccounts::get()), + // Additional Field Count + (BenchmarkParameter::X, 1, T::MaxAdditionalFields::get()), + ] + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + // The target user + let caller = account::("caller", 0); + let caller_origin: ::Origin = RawOrigin::Signed(caller.clone()).into(); + let caller_lookup: ::Source = T::Lookup::unlookup(caller.clone()); + let _ = T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Register r registrars + let r = components.iter().find(|&c| c.0 == BenchmarkParameter::R).unwrap().1; + benchmarking::add_registrars::(r)?; + + // Create their main identity with x additional fields + let x = components.iter().find(|&c| c.0 == BenchmarkParameter::X).unwrap().1; + let info = benchmarking::create_identity_info::(x); + Identity::::set_identity(caller_origin.clone(), info)?; + + // Give them s many sub accounts + let s = components.iter().find(|&c| c.0 == BenchmarkParameter::S).unwrap().1; + let _ = benchmarking::add_sub_accounts::(caller.clone(), s)?; + + // User requests judgement from all the registrars, and they approve + for i in 0..r { + Identity::::request_judgement(caller_origin.clone(), i, 10.into())?; + Identity::::provide_judgement( + RawOrigin::Signed(account::("registrar", i)).into(), + i, + caller_lookup.clone(), + Judgement::Reasonable + )?; + } + + // Return the `kill_identity` call + Ok((crate::Call::::kill_identity(caller_lookup), RawOrigin::Root)) + } +} + +// The list of available benchmarks for this pallet. +enum SelectedBenchmark { + AddRegistrar, + SetIdentity, + SetSubs, + ClearIdentity, + RequestJudgement, + CancelRequest, + SetFee, + SetAccountId, + SetFields, + ProvideJudgement, + KillIdentity, +} + +// Allow us to select a benchmark from the list of available benchmarks. + +impl BenchmarkingSetup, RawOrigin> for SelectedBenchmark { + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)> { + match self { + Self::AddRegistrar => , RawOrigin>>::components(&AddRegistrar), + Self::SetIdentity => , RawOrigin>>::components(&SetIdentity), + Self::SetSubs => , RawOrigin>>::components(&SetSubs), + Self::ClearIdentity => , RawOrigin>>::components(&ClearIdentity), + Self::RequestJudgement => , RawOrigin>>::components(&RequestJudgement), + Self::CancelRequest => , RawOrigin>>::components(&CancelRequest), + Self::SetFee => , RawOrigin>>::components(&SetFee), + Self::SetAccountId => , RawOrigin>>::components(&SetAccountId), + Self::SetFields => , RawOrigin>>::components(&SetFields), + Self::ProvideJudgement => , RawOrigin>>::components(&ProvideJudgement), + Self::KillIdentity => , RawOrigin>>::components(&KillIdentity), + } + } + + fn instance(&self, components: &[(BenchmarkParameter, u32)]) + -> Result<(crate::Call, RawOrigin), &'static str> + { + match self { + Self::AddRegistrar => , RawOrigin>>::instance(&AddRegistrar, components), + Self::SetIdentity => , RawOrigin>>::instance(&SetIdentity, components), + Self::SetSubs => , RawOrigin>>::instance(&SetSubs, components), + Self::ClearIdentity => , RawOrigin>>::instance(&ClearIdentity, components), + Self::RequestJudgement => , RawOrigin>>::instance(&RequestJudgement, components), + Self::CancelRequest => , RawOrigin>>::instance(&CancelRequest, components), + Self::SetFee => , RawOrigin>>::instance(&SetFee, components), + Self::SetAccountId => , RawOrigin>>::instance(&SetAccountId, components), + Self::SetFields => , RawOrigin>>::instance(&SetFields, components), + Self::ProvideJudgement => , RawOrigin>>::instance(&ProvideJudgement, components), + Self::KillIdentity => , RawOrigin>>::instance(&KillIdentity, components), + } + } +} + +impl Benchmarking for Module { + fn run_benchmark(extrinsic: Vec, steps: u32, repeat: u32) -> Result, &'static str> { + // Map the input to the selected benchmark. + let selected_benchmark = match extrinsic.as_slice() { + b"add_registrar" => SelectedBenchmark::AddRegistrar, + b"set_identity" => SelectedBenchmark::SetIdentity, + b"set_subs" => SelectedBenchmark::SetSubs, + b"clear_identity" => SelectedBenchmark::ClearIdentity, + b"request_judgement" => SelectedBenchmark::RequestJudgement, + b"cancel_request" => SelectedBenchmark::CancelRequest, + b"set_fee" => SelectedBenchmark::SetFee, + b"set_account_id" => SelectedBenchmark::SetAccountId, + b"set_fields" => SelectedBenchmark::SetFields, + b"provide_judgement" => SelectedBenchmark::ProvideJudgement, + b"kill_identity" => SelectedBenchmark::KillIdentity, + _ => return Err("Could not find extrinsic."), + }; + + // Warm up the DB + sp_io::benchmarking::commit_db(); + sp_io::benchmarking::wipe_db(); + + // first one is set_identity. + let components = , RawOrigin>>::components(&selected_benchmark); + // results go here + let mut results: Vec = Vec::new(); + // Select the component we will be benchmarking. Each component will be benchmarked. + for (name, low, high) in components.iter() { + // Create up to `STEPS` steps for that component between high and low. + let step_size = ((high - low) / steps).max(1); + let num_of_steps = (high - low) / step_size; + for s in 0..num_of_steps { + // This is the value we will be testing for component `name` + let component_value = low + step_size * s; + + // Select the mid value for all the other components. + let c: Vec<(BenchmarkParameter, u32)> = components.iter() + .map(|(n, l, h)| + (*n, if n == name { component_value } else { (h - l) / 2 + l }) + ).collect(); + + // Run the benchmark `repeat` times. + for _ in 0..repeat { + // Set up the externalities environment for the setup we want to benchmark. + let (call, caller) = , RawOrigin>>::instance(&selected_benchmark, &c)?; + // Commit the externalities to the database, flushing the DB cache. + // This will enable worst case scenario for reading from the database. + sp_io::benchmarking::commit_db(); + // Run the benchmark. + let start = sp_io::benchmarking::current_time(); + call.dispatch(caller.into())?; + let finish = sp_io::benchmarking::current_time(); + let elapsed = finish - start; + results.push((c.clone(), elapsed)); + // Wipe the DB back to the genesis state. + sp_io::benchmarking::wipe_db(); + } + } + } + return Ok(results); + } +} diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 80a200e808..c6fc0062be 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -78,6 +78,8 @@ use frame_support::{ }; use frame_system::{self as system, ensure_signed, ensure_root}; +pub mod benchmarking; + type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; @@ -880,7 +882,7 @@ mod tests { use sp_runtime::traits::BadOrigin; use frame_support::{ assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight, - ord_parameter_types + ord_parameter_types, }; use sp_core::H256; use frame_system::EnsureSignedBy; diff --git a/primitives/externalities/src/lib.rs b/primitives/externalities/src/lib.rs index 350b65d190..75193a4b9c 100644 --- a/primitives/externalities/src/lib.rs +++ b/primitives/externalities/src/lib.rs @@ -202,6 +202,14 @@ pub trait Externalities: ExtensionStore { /// /// Returns the SCALE encoded hash. fn storage_changes_root(&mut self, parent: &[u8]) -> Result>, ()>; + + fn wipe(&mut self) { + unimplemented!() + } + + fn commit(&mut self) { + unimplemented!() + } } /// Extension for the [`Externalities`] trait. diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 1b531725fe..ea45b580ce 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -771,6 +771,30 @@ pub trait Logging { } } +/// Interface that provides functions for benchmarking the runtime. +#[runtime_interface] +pub trait Benchmarking { + /// Get the number of nanoseconds passed since the UNIX epoch + /// + /// WARNING! This is a non-deterministic call. Do not use this within + /// consensus critical logic. + fn current_time() -> u128 { + std::time::SystemTime::now().duration_since(std::time::SystemTime::UNIX_EPOCH) + .expect("Unix time doesn't go backwards; qed") + .as_nanos() + } + + /// Reset the trie database to the genesis state. + fn wipe_db(&mut self) { + self.wipe() + } + + /// Commit pending storage changes to the trie database and clear the database cache. + fn commit_db(&mut self) { + self.commit() + } +} + /// Wasm-only interface that provides functions for interacting with the sandbox. #[runtime_interface(wasm_only)] pub trait Sandbox { @@ -923,6 +947,7 @@ pub type SubstrateHostFunctions = ( logging::HostFunctions, sandbox::HostFunctions, crate::trie::HostFunctions, + benchmarking::HostFunctions, ); #[cfg(test)] diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 9494c53cc6..f525f91ff6 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -685,6 +685,18 @@ pub fn print(print: impl traits::Printable) { print.print(); } +/// An alphabet of possible parameters to use for benchmarking. +#[derive(Encode, Decode, Clone, Copy, PartialEq, Debug)] +#[allow(missing_docs)] +pub enum BenchmarkParameter { + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, +} + +/// Results from running benchmarks on a FRAME pallet. +/// Contains duration of the function call in nanoseconds along with the benchmark parameters +/// used for that benchmark result. +pub type BenchmarkResults = (Vec<(BenchmarkParameter, u32)>, u128); + #[cfg(test)] mod tests { use super::*; diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index f07f4dd7ac..e95fc073eb 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -24,6 +24,7 @@ use std::fmt::Display; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; use sp_core::{self, Hasher, Blake2Hasher, TypeId, RuntimeDebug}; +use crate::BenchmarkParameter; use crate::codec::{Codec, Encode, Decode}; use crate::transaction_validity::{ ValidTransaction, TransactionValidity, TransactionValidityError, UnknownTransaction, @@ -1328,6 +1329,26 @@ pub trait BlockIdTo { ) -> Result>, Self::Error>; } +/// The pallet benchmarking trait. +pub trait Benchmarking { + /// Run the benchmarks for this pallet. + /// + /// Parameters + /// - `extrinsic`: The name of extrinsic function you want to benchmark encoded as bytes. + /// - `steps`: The number of sample points you want to take across the range of parameters. + /// - `repeat`: The number of times you want to repeat a benchmark. + fn run_benchmark(extrinsic: Vec, steps: u32, repeat: u32) -> Result, &'static str>; +} + +/// The required setup for creating a benchmark. +pub trait BenchmarkingSetup { + /// Return the components and their ranges which should be tested in this benchmark. + fn components(&self) -> Vec<(BenchmarkParameter, u32, u32)>; + + /// Set up the storage, and prepare a call and caller to test in a single run of the benchmark. + fn instance(&self, components: &[(BenchmarkParameter, u32)]) -> Result<(Call, RawOrigin), &'static str>; +} + #[cfg(test)] mod tests { use super::*; diff --git a/primitives/state-machine/src/backend.rs b/primitives/state-machine/src/backend.rs index 4ef9b970ae..396ef6575a 100644 --- a/primitives/state-machine/src/backend.rs +++ b/primitives/state-machine/src/backend.rs @@ -213,6 +213,16 @@ pub trait Backend: std::fmt::Debug { fn usage_info(&self) -> UsageInfo { UsageInfo::empty() } + + /// Wipe the state database. + fn wipe(&self) -> Result<(), Self::Error> { + unimplemented!() + } + + /// Commit given transaction to storage. + fn commit(&self, _storage_root: H::Out, _transaction: Self::Transaction) -> Result<(), Self::Error> { + unimplemented!() + } } impl<'a, T: Backend, H: Hasher> Backend for &'a T { diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index 38a2e70262..53156cb186 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -583,6 +583,25 @@ where root.map(|r| r.map(|o| o.encode())) } + + fn wipe(&mut self) { + self.overlay.discard_prospective(); + self.overlay.drain_storage_changes(&self.backend, None, Default::default(), self.storage_transaction_cache) + .expect(EXT_NOT_ALLOWED_TO_FAIL); + self.storage_transaction_cache.reset(); + self.backend.wipe().expect(EXT_NOT_ALLOWED_TO_FAIL) + } + + fn commit(&mut self) { + self.overlay.commit_prospective(); + let changes = self.overlay.drain_storage_changes(&self.backend, None, Default::default(), self.storage_transaction_cache) + .expect(EXT_NOT_ALLOWED_TO_FAIL); + self.backend.commit( + changes.transaction_storage_root, + changes.transaction, + ).expect(EXT_NOT_ALLOWED_TO_FAIL); + self.storage_transaction_cache.reset(); + } } impl<'a, H, B, N> sp_externalities::ExtensionStore for Ext<'a, H, N, B> diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index ed6f30a4f5..37187e163f 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -428,15 +428,18 @@ impl OverlayedChanges { /// /// Panics: /// Will panic if there are any uncommitted prospective changes. - pub fn into_committed(self) -> ( + fn drain_committed(&mut self) -> ( impl Iterator)>, impl Iterator)>, OwnedChildInfo))>, - ){ + ) { assert!(self.prospective.is_empty()); ( - self.committed.top.into_iter().map(|(k, v)| (k, v.value)), - self.committed.children.into_iter() - .map(|(sk, (v, ci))| (sk, (v.into_iter().map(|(k, v)| (k, v.value)), ci))) + std::mem::replace(&mut self.committed.top, Default::default()) + .into_iter() + .map(|(k, v)| (k, v.value)), + std::mem::replace(&mut self.committed.children, Default::default()) + .into_iter() + .map(|(sk, (v, ci))| (sk, (v.into_iter().map(|(k, v)| (k, v.value)), ci))), ) } @@ -444,11 +447,22 @@ impl OverlayedChanges { pub fn into_storage_changes< B: Backend, H: Hasher, N: BlockNumber >( - self, + mut self, backend: &B, changes_trie_state: Option<&ChangesTrieState>, parent_hash: H::Out, mut cache: StorageTransactionCache, + ) -> Result, String> where H::Out: Ord + Encode + 'static { + self.drain_storage_changes(backend, changes_trie_state, parent_hash, &mut cache) + } + + /// Drain all changes into a [`StorageChanges`] instance. Leave empty overlay in place. + pub fn drain_storage_changes, H: Hasher, N: BlockNumber>( + &mut self, + backend: &B, + changes_trie_state: Option<&ChangesTrieState>, + parent_hash: H::Out, + mut cache: &mut StorageTransactionCache, ) -> Result, String> where H::Out: Ord + Encode + 'static { // If the transaction does not exist, we generate it. if cache.transaction.is_none() { @@ -474,7 +488,7 @@ impl OverlayedChanges { .take() .expect("Changes trie transaction was generated by `changes_trie_root`; qed"); - let (main_storage_changes, child_storage_changes) = self.into_committed(); + let (main_storage_changes, child_storage_changes) = self.drain_committed(); Ok(StorageChanges { main_storage_changes: main_storage_changes.collect(), -- GitLab From f735d3e2491d347825ec9560e8916decd72a4f11 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 10 Feb 2020 10:30:42 +0100 Subject: [PATCH 281/296] Fix vesting logic (#4864) * Fix vesting logic * Bump runtime version * Docs. --- bin/node/runtime/src/lib.rs | 4 ++-- frame/support/src/traits.rs | 6 ++++++ frame/vesting/src/lib.rs | 18 ++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index c9528a3c3e..0435755d19 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -81,8 +81,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 214, - impl_version: 3, + spec_version: 215, + impl_version: 0, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index ecfababfc0..f7701b4cd5 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -620,6 +620,10 @@ pub trait VestingSchedule { /// /// If there already exists a vesting schedule for the given account, an `Err` is returned /// and nothing is updated. + /// + /// Is a no-op if the amount to be vested is zero. + /// + /// NOTE: This doesn't alter the free balance of the account. fn add_vesting_schedule( who: &AccountId, locked: >::Balance, @@ -628,6 +632,8 @@ pub trait VestingSchedule { ) -> DispatchResult; /// Remove a vesting schedule for a given account. + /// + /// NOTE: This doesn't alter the free balance of the account. fn remove_vesting_schedule(who: &AccountId); } diff --git a/frame/vesting/src/lib.rs b/frame/vesting/src/lib.rs index 2a1ff12716..dd12f28ec4 100644 --- a/frame/vesting/src/lib.rs +++ b/frame/vesting/src/lib.rs @@ -52,7 +52,7 @@ use codec::{Encode, Decode}; use sp_runtime::{DispatchResult, RuntimeDebug, traits::{ StaticLookup, Zero, SimpleArithmetic, MaybeSerializeDeserialize, Saturating, Convert }}; -use frame_support::{decl_module, decl_event, decl_storage, ensure, decl_error}; +use frame_support::{decl_module, decl_event, decl_storage, decl_error}; use frame_support::traits::{ Currency, LockableCurrency, VestingSchedule, WithdrawReason, LockIdentifier }; @@ -212,16 +212,18 @@ impl Module { /// (Re)set or remove the module's currency lock on `who`'s account in accordance with their /// current unvested amount. fn update_lock(who: T::AccountId) -> DispatchResult { - ensure!(Vesting::::contains_key(&who), Error::::NotVesting); - let unvested = Self::vesting_balance(&who); - if unvested.is_zero() { + let vesting = Self::vesting(&who).ok_or(Error::::NotVesting)?; + let now = >::block_number(); + let locked_now = vesting.locked_at::(now); + + if locked_now.is_zero() { T::Currency::remove_lock(VESTING_ID, &who); Vesting::::remove(&who); Self::deposit_event(RawEvent::VestingCompleted(who)); } else { let reasons = WithdrawReason::Transfer | WithdrawReason::Reserve; - T::Currency::set_lock(VESTING_ID, &who, unvested, reasons); - Self::deposit_event(RawEvent::VestingUpdated(who, unvested)); + T::Currency::set_lock(VESTING_ID, &who, locked_now, reasons); + Self::deposit_event(RawEvent::VestingUpdated(who, locked_now)); } Ok(()) } @@ -249,6 +251,10 @@ impl VestingSchedule for Module where /// If there already exists a vesting schedule for the given account, an `Err` is returned /// and nothing is updated. /// + /// On success, a linearly reducing amount of funds will be locked. In order to realise any + /// reduction of the lock over time as it diminishes, the account owner must use `vest` or + /// `vest_other`. + /// /// Is a no-op if the amount to be vested is zero. fn add_vesting_schedule( who: &T::AccountId, -- GitLab From 7e8ac2eb0df9a4a6154dc1ba6029caabcf5e7191 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Mon, 10 Feb 2020 11:51:56 +0100 Subject: [PATCH 282/296] Update trie-db to the latest (#4874) --- Cargo.lock | 69 ++++++++++------------------- bin/node/executor/Cargo.toml | 2 +- primitives/state-machine/Cargo.toml | 4 +- 3 files changed, 26 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b59da69bfe..7d5d3c641a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -472,9 +472,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.1.2" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb8038c1ddc0a5f73787b130f4cc75151e96ed33e417fde765eb5a81e3532f4" +checksum = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" [[package]] name = "byte-slice-cast" @@ -2010,9 +2010,9 @@ dependencies = [ [[package]] name = "hex" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" +checksum = "76cdda6bf525062a0c9e8f14ee2b37935c86b8efb6c8b69b3c83dfb518a914af" [[package]] name = "hex-literal" @@ -2409,28 +2409,28 @@ dependencies = [ [[package]] name = "jsonrpc-http-server" -version = "14.0.5" +version = "14.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d83d348120edee487c560b7cdd2565055d61cda053aa0d0ef0f8b6a18429048" +checksum = "816d63997ea45d3634608edbef83ddb35e661f7c0b27b5b72f237e321f0e9807" dependencies = [ "hyper 0.12.35", "jsonrpc-core", "jsonrpc-server-utils", "log 0.4.8", "net2", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "unicase 2.6.0", ] [[package]] name = "jsonrpc-pubsub" -version = "14.0.5" +version = "14.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3453625f0f0f5cd6d6776d389d73b7d70fcc98620b7cbb1cbbb1f6a36e95f39a" +checksum = "5b31c9b90731276fdd24d896f31bb10aecf2e5151733364ae81123186643d939" dependencies = [ "jsonrpc-core", "log 0.4.8", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "serde", ] @@ -2452,14 +2452,14 @@ dependencies = [ [[package]] name = "jsonrpc-ws-server" -version = "14.0.5" +version = "14.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b34faa167c3ac9705aeecb986c0da6056529f348425dbe0441db60a2c4cc41d1" +checksum = "b94e5773b2ae66e0e02c80775ce6bbba6f15d5bb47c14ec36a36fcf94f8df851" dependencies = [ "jsonrpc-core", "jsonrpc-server-utils", "log 0.4.8", - "parking_lot 0.9.0", + "parking_lot 0.10.0", "slab", "ws", ] @@ -3416,7 +3416,7 @@ dependencies = [ "sp-state-machine", "sp-trie", "substrate-test-client", - "trie-root 0.15.2", + "trie-root", "wabt", ] @@ -6527,9 +6527,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b01d7f0288608a01dca632cf1df859df6fd6ffa885300fc275ce2ba6221953" +checksum = "15913895b61e0be854afd32fd4163fcd2a3df34142cf2cb961b310ce694cbf90" dependencies = [ "itoa", "ryu", @@ -7195,8 +7195,8 @@ dependencies = [ "sp-externalities", "sp-panic-handler", "sp-trie", - "trie-db 0.19.2", - "trie-root 0.15.2", + "trie-db", + "trie-root", ] [[package]] @@ -7262,8 +7262,8 @@ dependencies = [ "sp-core", "sp-std", "trie-bench", - "trie-db 0.20.0", - "trie-root 0.16.0", + "trie-db", + "trie-root", "trie-standardmap", ] @@ -7524,7 +7524,7 @@ dependencies = [ "sp-version", "substrate-test-runtime-client", "substrate-wasm-builder-runner", - "trie-db 0.20.0", + "trie-db", ] [[package]] @@ -8147,25 +8147,11 @@ dependencies = [ "keccak-hasher", "memory-db", "parity-scale-codec", - "trie-db 0.20.0", - "trie-root 0.16.0", + "trie-db", + "trie-root", "trie-standardmap", ] -[[package]] -name = "trie-db" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d747ae5b6f078df7e46477fcc7df66df9eb4f27a031cf4a7c890a8dd03d8e6" -dependencies = [ - "hash-db", - "hashbrown 0.6.3", - "log 0.4.8", - "rand 0.6.5", - "rustc-hex", - "smallvec 1.2.0", -] - [[package]] name = "trie-db" version = "0.20.0" @@ -8179,15 +8165,6 @@ dependencies = [ "smallvec 1.2.0", ] -[[package]] -name = "trie-root" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b779f7c1c8fe9276365d9d5be5c4b5adeacf545117bb3f64c974305789c5c0b" -dependencies = [ - "hash-db", -] - [[package]] name = "trie-root" version = "0.16.0" diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 0d68b70522..1d894e39fa 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -15,7 +15,7 @@ sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-io = { version = "2.0.0", path = "../../../primitives/io" } sp-state-machine = { version = "0.8", path = "../../../primitives/state-machine" } sp-trie = { version = "2.0.0", path = "../../../primitives/trie" } -trie-root = "0.15.2" +trie-root = "0.16.0" [dev-dependencies] criterion = "0.3.0" diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index 3752e95695..2408cce099 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -10,8 +10,8 @@ license = "GPL-3.0" log = "0.4.8" parking_lot = "0.10.0" hash-db = "0.15.2" -trie-db = "0.19.2" -trie-root = "0.15.2" +trie-db = "0.20.0" +trie-root = "0.16.0" sp-trie = { version = "2.0.0", path = "../trie" } sp-core = { version = "2.0.0", path = "../core" } sp-panic-handler = { version = "2.0.0", path = "../panic-handler" } -- GitLab From ae03ee918e6338a3afc5dbd3742f5b8d7fa35271 Mon Sep 17 00:00:00 2001 From: Ashley Date: Mon, 10 Feb 2020 12:23:55 +0100 Subject: [PATCH 283/296] Fix timer panics in the wasm light client (#4561) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make WASM browser thing compile * Fix * updated exit-future (github repo) * Switch to broadcast crate * Migrate client/cli * Switch exit-future to modernize branch * Small changes * Switch to cargo version and fix fg tests * fix basic-authorship * Fix crash on grafana macro * Fix grafana macro * Switch node python version * Disable record_metrics_slice in grafana macro on wasm * Update client/grafana-data-source/src/lib.rs * Revert "Update client/grafana-data-source/src/lib.rs" This reverts commit 888009a8e0b7051bd4bfbbfdb0448bcf2e2aae93. * Add wasm support for state machine * Switch to my own libp2p version * Revert "Switch to my own libp2p version" This reverts commit ce613871b59264b3165b45c37943e6560240daa7. * Revert "Add wasm support for state machine" This reverts commit de7eaa0694d9534fc3b164621737968e9a6a7c5f. * Add sc-browser * Squash * remove sc-browser * Fix keystore on wasm * stubs for removed functions to make env compatible with old runtimes * Add test (that doesn't work) * Fix build scripts * Revert basic-authorship due to no panics * Revert cli/informant * Revert consensus * revert offchain * Update utils/browser/Cargo.toml Co-Authored-By: Benjamin Kampmann * export console functions * Add new chainspec * Fix ws in chain spec * revert chainspec * Fix chainspec * Use an Option in keystore instead of cfg flags * Remove crud * Only use wasm-timer for instant and systemtime * Remove telemetry changes * Assuming this is ok * Add a KeystoreConfig * Add stubs back in * Update libp2p * Revert "Add stubs back in" This reverts commit 4690cf1882aa0f99f7f00a58c4080c8aa9b77c36. * Remove commented js again * Bump kvdb-web version * Fix cli * Switch branch on futures-timer * Fix tests * Remove sc-client test build in check-web-wasm because there isn't a good way to build futures-timer with wasm-bindgen support in the build * Remove more things ^^ * Switch branch on futures-timer back * Put DB io stats behind a cfg flag * Fix things * Don't timeout transports on wasm * Update branch of futures-timer and fix bad merge * Spawn informant * Fix network test * Fix delay resets * Changes * Fix tests * use wasm_timer for transaction pool * Fixes * Switch futures-timer to crates * Only diagnose futures on native * Fix sc-network-test tests * Select log level in js * Fix syncing ;^) * Allow disabling colours in the informant * Use OutputFormat enum for informant * MallocSizeOf impl on transaction pool broke stuff because wasm_timer::Instant doesnt impl it so just revert the transaction pool to master * Update futures-diagnose * Revert "MallocSizeOf impl on transaction pool broke stuff because wasm_timer::Instant doesnt impl it so just revert the transaction pool to master" This reverts commit baa4ffc94fd968b6660a2c17ba8113e06af15548. * Pass whole chain spec in start_client * Get Instant::now to work in transaction pool again * Informant dep reordering Co-authored-by: Pierre Krieger Co-authored-by: Bastian Köcher Co-authored-by: Svyatoslav Nikolsky Co-authored-by: Benjamin Kampmann Co-authored-by: Demi Obenour <48690212+DemiMarie-parity@users.noreply.github.com> --- Cargo.lock | 94 ++++++++++++++----- Cargo.toml | 1 + bin/node/cli/browser-demo/index.html | 7 +- bin/node/cli/src/browser.rs | 14 +-- client/authority-discovery/Cargo.toml | 2 +- client/cli/Cargo.toml | 1 + client/cli/src/lib.rs | 1 - client/cli/src/runtime.rs | 3 +- client/consensus/aura/Cargo.toml | 2 +- client/consensus/babe/Cargo.toml | 2 +- client/consensus/slots/Cargo.toml | 2 +- client/finality-grandpa/Cargo.toml | 2 +- .../src/communication/periodic.rs | 10 +- client/informant/Cargo.toml | 19 ++++ .../informant => informant/src}/display.rs | 61 ++++++++---- .../src/informant.rs => informant/src/lib.rs} | 12 ++- client/network-gossip/Cargo.toml | 3 +- client/network-gossip/src/state_machine.rs | 9 +- client/network/Cargo.toml | 3 +- client/network/src/debug_info.rs | 3 +- client/network/src/protocol.rs | 13 +-- .../src/protocol/legacy_proto/behaviour.rs | 7 +- .../src/protocol/legacy_proto/handler.rs | 11 +-- .../src/protocol/legacy_proto/tests.rs | 2 +- client/network/src/protocol/light_dispatch.rs | 3 +- .../src/protocol/sync/extra_requests.rs | 3 +- client/network/src/transport.rs | 15 ++- client/network/test/Cargo.toml | 2 +- client/network/test/src/sync.rs | 4 +- client/offchain/Cargo.toml | 2 +- client/peerset/Cargo.toml | 1 + client/peerset/src/lib.rs | 3 +- client/service/Cargo.toml | 3 +- client/service/src/builder.rs | 13 ++- client/service/src/lib.rs | 18 +++- client/telemetry/Cargo.toml | 3 +- client/telemetry/src/lib.rs | 3 +- client/telemetry/src/worker.rs | 4 +- client/transaction-pool/Cargo.toml | 1 + client/transaction-pool/graph/Cargo.toml | 1 + .../transaction-pool/graph/src/base_pool.rs | 3 +- client/transaction-pool/graph/src/future.rs | 11 ++- client/transaction-pool/graph/src/pool.rs | 11 +-- client/transaction-pool/graph/src/rotator.rs | 3 +- .../graph/src/validated_pool.rs | 15 +-- client/transaction-pool/src/lib.rs | 6 +- primitives/consensus/common/Cargo.toml | 2 +- primitives/timestamp/Cargo.toml | 1 + primitives/timestamp/src/lib.rs | 2 +- primitives/transaction-pool/src/pool.rs | 6 +- utils/browser/Cargo.toml | 9 +- utils/browser/src/lib.rs | 14 ++- utils/grafana-data-source/Cargo.toml | 2 +- utils/grafana-data-source/test/Cargo.toml | 2 +- 54 files changed, 297 insertions(+), 153 deletions(-) create mode 100644 client/informant/Cargo.toml rename client/{cli/src/informant => informant/src}/display.rs (76%) rename client/{cli/src/informant.rs => informant/src/lib.rs} (90%) diff --git a/Cargo.lock b/Cargo.lock index 7d5d3c641a..b93b32fd93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -425,11 +425,13 @@ dependencies = [ name = "browser-utils" version = "0.8.0" dependencies = [ + "chrono", "clear_on_drop", "console_error_panic_hook", "console_log", "futures 0.1.29", "futures 0.3.4", + "futures-timer 3.0.1", "js-sys", "kvdb-web", "libp2p", @@ -437,6 +439,7 @@ dependencies = [ "rand 0.6.5", "rand 0.7.3", "sc-chain-spec", + "sc-informant", "sc-network", "sc-service", "wasm-bindgen", @@ -595,10 +598,12 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" dependencies = [ + "js-sys", "num-integer", "num-traits", "serde", "time", + "wasm-bindgen", ] [[package]] @@ -1717,20 +1722,19 @@ checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" [[package]] name = "futures-timer" -version = "0.4.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878f1d2fc31355fa02ed2372e741b0c17e58373341e6a122569b4623a14a7d33" -dependencies = [ - "futures-core-preview", - "futures-util-preview", - "pin-utils", -] +checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" [[package]] name = "futures-timer" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" +checksum = "3de1a2b2a2a33d9e60e17980b60ee061eeaae96a5abe9121db0fdb9af167a1c5" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] [[package]] name = "futures-util" @@ -1873,6 +1877,19 @@ dependencies = [ "regex", ] +[[package]] +name = "gloo-timers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2d17dbd803c2fc86cb1b613adf63192046a7176f383a8302594654752c4c4a" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "goblin" version = "0.1.3" @@ -1891,7 +1908,7 @@ dependencies = [ "async-std", "chrono", "derive_more", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "futures-util", "hyper 0.13.2", "lazy_static", @@ -1907,7 +1924,7 @@ name = "grafana-data-source-test" version = "2.0.0" dependencies = [ "futures 0.3.4", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "grafana-data-source", "rand 0.7.3", ] @@ -5450,7 +5467,7 @@ dependencies = [ "derive_more", "env_logger 0.7.1", "futures 0.3.4", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "libp2p", "log 0.4.8", "parity-scale-codec", @@ -5554,6 +5571,7 @@ dependencies = [ "regex", "rpassword", "sc-client-api", + "sc-informant", "sc-network", "sc-service", "sc-telemetry", @@ -5678,7 +5696,7 @@ dependencies = [ "env_logger 0.7.1", "futures 0.1.29", "futures 0.3.4", - "futures-timer 0.4.0", + "futures-timer 3.0.1", "log 0.4.8", "parity-scale-codec", "parking_lot 0.10.0", @@ -5718,7 +5736,7 @@ dependencies = [ "fork-tree", "futures 0.1.29", "futures 0.3.4", - "futures-timer 0.4.0", + "futures-timer 3.0.1", "log 0.4.8", "merlin", "num-bigint", @@ -5824,7 +5842,7 @@ name = "sc-consensus-slots" version = "0.8.0" dependencies = [ "futures 0.3.4", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "log 0.4.8", "parity-scale-codec", "parking_lot 0.10.0", @@ -5950,7 +5968,7 @@ dependencies = [ "fork-tree", "futures 0.1.29", "futures 0.3.4", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "log 0.4.8", "parity-scale-codec", "parking_lot 0.10.0", @@ -5981,6 +5999,22 @@ dependencies = [ "tokio 0.1.22", ] +[[package]] +name = "sc-informant" +version = "0.8.0" +dependencies = [ + "ansi_term 0.12.1", + "futures 0.3.4", + "log 0.4.8", + "parity-util-mem", + "sc-client-api", + "sc-network", + "sc-service", + "sp-blockchain", + "sp-runtime", + "wasm-timer", +] + [[package]] name = "sc-keystore" version = "2.0.0" @@ -6009,7 +6043,7 @@ dependencies = [ "fnv", "fork-tree", "futures 0.3.4", - "futures-timer 0.4.0", + "futures-timer 3.0.1", "futures_codec", "libp2p", "linked-hash-map", @@ -6043,6 +6077,7 @@ dependencies = [ "tempfile", "unsigned-varint", "void", + "wasm-timer", "zeroize 1.1.0", ] @@ -6052,13 +6087,14 @@ version = "0.8.0" dependencies = [ "futures 0.1.29", "futures 0.3.4", - "futures-timer 0.4.0", + "futures-timer 3.0.1", "libp2p", "log 0.4.8", "lru 0.1.17", "parking_lot 0.10.0", "sc-network", "sp-runtime", + "wasm-timer", ] [[package]] @@ -6068,7 +6104,7 @@ dependencies = [ "env_logger 0.7.1", "futures 0.1.29", "futures 0.3.4", - "futures-timer 0.4.0", + "futures-timer 3.0.1", "libp2p", "log 0.4.8", "parking_lot 0.10.0", @@ -6097,7 +6133,7 @@ dependencies = [ "fnv", "futures 0.1.29", "futures 0.3.4", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "hyper 0.12.35", "hyper-rustls", "log 0.4.8", @@ -6129,6 +6165,7 @@ dependencies = [ "log 0.4.8", "rand 0.7.3", "serde_json", + "wasm-timer", ] [[package]] @@ -6225,7 +6262,7 @@ dependencies = [ "futures 0.1.29", "futures 0.3.4", "futures-diagnose", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "grafana-data-source", "lazy_static", "log 0.4.8", @@ -6267,6 +6304,7 @@ dependencies = [ "tokio 0.2.11", "tokio-executor 0.1.10", "tracing", + "wasm-timer", ] [[package]] @@ -6306,7 +6344,7 @@ version = "2.0.0" dependencies = [ "bytes 0.5.4", "futures 0.3.4", - "futures-timer 2.0.2", + "futures-timer 3.0.1", "libp2p", "log 0.4.8", "parking_lot 0.10.0", @@ -6318,6 +6356,7 @@ dependencies = [ "slog-scope", "take_mut", "void", + "wasm-timer", ] [[package]] @@ -6353,6 +6392,7 @@ dependencies = [ "sp-runtime", "sp-transaction-pool", "substrate-test-runtime", + "wasm-timer", ] [[package]] @@ -6376,6 +6416,7 @@ dependencies = [ "sp-transaction-pool", "substrate-test-runtime-client", "substrate-test-runtime-transaction-pool", + "wasm-timer", ] [[package]] @@ -6505,6 +6546,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + [[package]] name = "serde" version = "1.0.104" @@ -6854,7 +6901,7 @@ dependencies = [ "derive_more", "futures 0.3.4", "futures-diagnose", - "futures-timer 0.4.0", + "futures-timer 3.0.1", "libp2p", "log 0.4.8", "parity-scale-codec", @@ -7235,6 +7282,7 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-std", + "wasm-timer", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 47e3fe3f0e..0c620d251d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ members = [ "client/executor/wasmtime", "client/executor/runtime-test", "client/finality-grandpa", + "client/informant", "client/tracing", "client/keystore", "client/network", diff --git a/bin/node/cli/browser-demo/index.html b/bin/node/cli/browser-demo/index.html index 0b66b612f1..f40863c46e 100644 --- a/bin/node/cli/browser-demo/index.html +++ b/bin/node/cli/browser-demo/index.html @@ -15,11 +15,12 @@ function log(msg) { async function start() { log('Loading WASM'); await init('./pkg/node_cli_bg.wasm'); - log('Successfully loaded WASM'); + log('Fetching chain spec'); + const chain_spec_response = await fetch("https://raw.githubusercontent.com/paritytech/substrate/master/bin/node/cli/res/flaming-fir.json"); + const chain_spec_text = await chain_spec_response.text(); // Build our client. - log('Starting client'); - let client = await start_client(ws()); + let client = await start_client(chain_spec_text, 'info', ws()); log('Client started'); client.rpcSubscribe('{"method":"chain_subscribeNewHead","params":[],"id":1,"jsonrpc":"2.0"}', diff --git a/bin/node/cli/src/browser.rs b/bin/node/cli/src/browser.rs index e05238b82d..80ca963445 100644 --- a/bin/node/cli/src/browser.rs +++ b/bin/node/cli/src/browser.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::ChainSpec; +use crate::chain_spec::ChainSpec; use log::info; use wasm_bindgen::prelude::*; use sc_service::Configuration; @@ -22,20 +22,20 @@ use browser_utils::{ Transport, Client, browser_configuration, set_console_error_panic_hook, init_console_log, }; +use std::str::FromStr; /// Starts the client. #[wasm_bindgen] -pub async fn start_client(wasm_ext: Transport) -> Result { - start_inner(wasm_ext) +pub async fn start_client(chain_spec: String, log_level: String, wasm_ext: Transport) -> Result { + start_inner(chain_spec, log_level, wasm_ext) .await .map_err(|err| JsValue::from_str(&err.to_string())) } -async fn start_inner(wasm_ext: Transport) -> Result> { +async fn start_inner(chain_spec: String, log_level: String, wasm_ext: Transport) -> Result> { set_console_error_panic_hook(); - init_console_log(log::Level::Info)?; - - let chain_spec = ChainSpec::FlamingFir.load() + init_console_log(log::Level::from_str(&log_level)?)?; + let chain_spec = ChainSpec::from_json_bytes(chain_spec.as_bytes().to_vec()) .map_err(|e| format!("{:?}", e))?; let config: Configuration<_, _> = browser_configuration(wasm_ext, chain_spec) diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 68144625b3..40b1b30173 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -14,7 +14,7 @@ bytes = "0.4.12" codec = { package = "parity-scale-codec", default-features = false, version = "1.0.3" } derive_more = "0.99.2" futures = "0.3.1" -futures-timer = "2.0" +futures-timer = "3.0.1" libp2p = { version = "0.15.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" prost = "0.6.1" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index e302d53d55..e176894d64 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -21,6 +21,7 @@ tokio = { version = "0.2.9", features = [ "signal", "rt-core", "rt-threaded" ] } futures = "0.3.1" fdlimit = "0.1.1" serde_json = "1.0.41" +sc-informant = { version = "0.8", path = "../informant" } sp-panic-handler = { version = "2.0.0", path = "../../primitives/panic-handler" } sc-client-api = { version = "2.0.0", path = "../api" } sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 5649232c37..a2e9fa96da 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -24,7 +24,6 @@ mod traits; mod params; mod execution_strategy; pub mod error; -pub mod informant; mod runtime; mod node_key; diff --git a/client/cli/src/runtime.rs b/client/cli/src/runtime.rs index 62a2245c9e..157b75f205 100644 --- a/client/cli/src/runtime.rs +++ b/client/cli/src/runtime.rs @@ -21,7 +21,6 @@ use futures::select; use futures::pin_mut; use sc_service::{AbstractService, Configuration}; use crate::error; -use crate::informant; #[cfg(target_family = "unix")] async fn main(func: F) -> Result<(), Box> @@ -124,7 +123,7 @@ where let service = service_builder(config)?; - let informant_future = informant::build(&service); + let informant_future = sc_informant::build(&service, sc_informant::OutputFormat::Coloured); let _informant_handle = runtime.spawn(informant_future); // we eagerly drop the service so that the internal exit future is fired, diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index 142b10b9da..e67f1e15a3 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -16,7 +16,7 @@ codec = { package = "parity-scale-codec", version = "1.0.0" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } derive_more = "0.99.2" futures = "0.3.1" -futures-timer = "0.4.0" +futures-timer = "3.0.1" sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } sc-keystore = { version = "2.0.0", path = "../../keystore" } log = "0.4.8" diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 23bf9cea28..c36b5216c2 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -32,7 +32,7 @@ sc-consensus-slots = { version = "0.8", path = "../slots" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } fork-tree = { version = "2.0.0", path = "../../../utils/fork-tree" } futures = "0.3.1" -futures-timer = "0.4.0" +futures-timer = "3.0.1" parking_lot = "0.10.0" log = "0.4.8" schnorrkel = { version = "0.8.5", features = ["preaudit_deprecated"] } diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index d500a0fdc7..67de0a54ed 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -19,7 +19,7 @@ sc-telemetry = { version = "2.0.0", path = "../../telemetry" } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" } futures = "0.3.1" -futures-timer = "2.0" +futures-timer = "3.0.1" parking_lot = "0.10.0" log = "0.4.8" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 1249bff751..e96792258a 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0" [dependencies] fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } futures = "0.3.1" -futures-timer = "2.0.2" +futures-timer = "3.0.1" log = "0.4.8" parking_lot = "0.10.0" rand = "0.7.2" diff --git a/client/finality-grandpa/src/communication/periodic.rs b/client/finality-grandpa/src/communication/periodic.rs index 4635899690..f2e79e8f14 100644 --- a/client/finality-grandpa/src/communication/periodic.rs +++ b/client/finality-grandpa/src/communication/periodic.rs @@ -19,7 +19,7 @@ use futures_timer::Delay; use futures::{channel::mpsc, future::{FutureExt as _}, prelude::*, ready, stream::Stream}; use log::debug; -use std::{pin::Pin, task::{Context, Poll}, time::{Instant, Duration}}; +use std::{pin::Pin, task::{Context, Poll}, time::Duration}; use sc_network::PeerId; use sp_runtime::traits::{NumberFor, Block as BlockT}; @@ -28,10 +28,6 @@ use super::gossip::{NeighborPacket, GossipMessage}; // How often to rebroadcast, in cases where no new packets are created. const REBROADCAST_AFTER: Duration = Duration::from_secs(2 * 60); -fn rebroadcast_instant() -> Instant { - Instant::now() + REBROADCAST_AFTER -} - /// A sender used to send neighbor packets to a background job. #[derive(Clone)] pub(super) struct NeighborPacketSender( @@ -85,7 +81,7 @@ impl Stream for NeighborPacketWorker { match this.rx.poll_next_unpin(cx) { Poll::Ready(None) => return Poll::Ready(None), Poll::Ready(Some((to, packet))) => { - this.delay.reset(rebroadcast_instant()); + this.delay.reset(REBROADCAST_AFTER); this.last = Some((to.clone(), packet.clone())); return Poll::Ready(Some((to, GossipMessage::::from(packet.clone())))); @@ -98,7 +94,7 @@ impl Stream for NeighborPacketWorker { // Getting this far here implies that the timer fired. - this.delay.reset(rebroadcast_instant()); + this.delay.reset(REBROADCAST_AFTER); // Make sure the underlying task is scheduled for wake-up. // diff --git a/client/informant/Cargo.toml b/client/informant/Cargo.toml new file mode 100644 index 0000000000..197f320889 --- /dev/null +++ b/client/informant/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "sc-informant" +version = "0.8.0" +authors = ["Parity Technologies "] +description = "Substrate informant." +edition = "2018" +license = "GPL-3.0" + +[dependencies] +ansi_term = "0.12.1" +futures = "0.3.1" +log = "0.4.8" +parity-util-mem = { version = "0.5.1", default-features = false, features = ["primitive-types"] } +wasm-timer = "0.2" +sc-client-api = { version = "2.0.0", path = "../api" } +sc-network = { version = "0.8", path = "../network" } +sc-service = { version = "0.8", default-features = false, path = "../service" } +sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } +sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/cli/src/informant/display.rs b/client/informant/src/display.rs similarity index 76% rename from client/cli/src/informant/display.rs rename to client/informant/src/display.rs index 199635e7c7..53c9697868 100644 --- a/client/cli/src/informant/display.rs +++ b/client/informant/src/display.rs @@ -20,7 +20,9 @@ use log::info; use sc_network::SyncState; use sp_runtime::traits::{Block as BlockT, CheckedDiv, NumberFor, Zero, Saturating}; use sc_service::NetworkStatus; -use std::{convert::{TryFrom, TryInto}, fmt, time}; +use std::{convert::{TryFrom, TryInto}, fmt}; +use wasm_timer::Instant; +use crate::OutputFormat; /// State of the informant display system. /// @@ -40,15 +42,18 @@ pub struct InformantDisplay { /// `None` if `display` has never been called. last_number: Option>, /// The last time `display` or `new` has been called. - last_update: time::Instant, + last_update: Instant, + /// The format to print output in. + format: OutputFormat, } impl InformantDisplay { /// Builds a new informant display system. - pub fn new() -> InformantDisplay { + pub fn new(format: OutputFormat) -> InformantDisplay { InformantDisplay { last_number: None, - last_update: time::Instant::now(), + last_update: Instant::now(), + format, } } @@ -56,8 +61,10 @@ impl InformantDisplay { pub fn display(&mut self, info: &ClientInfo, net_status: NetworkStatus) { let best_number = info.chain.best_number; let best_hash = info.chain.best_hash; + let finalized_number = info.chain.finalized_number; + let num_connected_peers = net_status.num_connected_peers; let speed = speed::(best_number, self.last_number, self.last_update); - self.last_update = time::Instant::now(); + self.last_update = Instant::now(); self.last_number = Some(best_number); let (status, target) = match (net_status.sync_state, net_status.best_seen_block) { @@ -66,19 +73,35 @@ impl InformantDisplay { (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed), format!(", target=#{}", n)), }; - info!( - target: "substrate", - "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", - Colour::White.bold().paint(&status), - target, - Colour::White.bold().paint(format!("{}", net_status.num_connected_peers)), - Colour::White.paint(format!("{}", best_number)), - best_hash, - Colour::White.paint(format!("{}", info.chain.finalized_number)), - info.chain.finalized_hash, - TransferRateFormat(net_status.average_download_per_sec), - TransferRateFormat(net_status.average_upload_per_sec), - ); + if self.format == OutputFormat::Coloured { + info!( + target: "substrate", + "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", + Colour::White.bold().paint(&status), + target, + Colour::White.bold().paint(format!("{}", num_connected_peers)), + Colour::White.paint(format!("{}", best_number)), + best_hash, + Colour::White.paint(format!("{}", finalized_number)), + info.chain.finalized_hash, + TransferRateFormat(net_status.average_download_per_sec), + TransferRateFormat(net_status.average_upload_per_sec), + ); + } else { + info!( + target: "substrate", + "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", + status, + target, + num_connected_peers, + best_number, + best_hash, + finalized_number, + info.chain.finalized_hash, + TransferRateFormat(net_status.average_download_per_sec), + TransferRateFormat(net_status.average_upload_per_sec), + ); + } } } @@ -87,7 +110,7 @@ impl InformantDisplay { fn speed( best_number: NumberFor, last_number: Option>, - last_update: time::Instant + last_update: Instant ) -> String { // Number of milliseconds elapsed since last time. let elapsed_ms = { diff --git a/client/cli/src/informant.rs b/client/informant/src/lib.rs similarity index 90% rename from client/cli/src/informant.rs rename to client/informant/src/lib.rs index 9e7c5044e0..699dcfdd74 100644 --- a/client/cli/src/informant.rs +++ b/client/informant/src/lib.rs @@ -25,12 +25,19 @@ use std::time::Duration; mod display; +/// The format to print telemetry output in. +#[derive(PartialEq)] +pub enum OutputFormat { + Coloured, + Plain, +} + /// Creates an informant in the form of a `Future` that must be polled regularly. -pub fn build(service: &impl AbstractService) -> impl futures::Future { +pub fn build(service: &impl AbstractService, format: OutputFormat) -> impl futures::Future { let client = service.client(); let pool = service.transaction_pool(); - let mut display = display::InformantDisplay::new(); + let mut display = display::InformantDisplay::new(format); let display_notifications = service .network_status(Duration::from_millis(5000)) @@ -41,6 +48,7 @@ pub fn build(service: &impl AbstractService) -> impl futures::Future { messages: Vec>, known_messages: LruCache, validators: HashMap>>, - next_broadcast: time::Instant, + next_broadcast: Instant, } impl ConsensusGossip { @@ -177,7 +178,7 @@ impl ConsensusGossip { messages: Default::default(), known_messages: LruCache::new(KNOWN_MESSAGES_CACHE_SIZE), validators: Default::default(), - next_broadcast: time::Instant::now() + REBROADCAST_INTERVAL, + next_broadcast: Instant::now() + REBROADCAST_INTERVAL, } } @@ -260,9 +261,9 @@ impl ConsensusGossip { /// Perform periodic maintenance pub fn tick(&mut self, network: &mut dyn Network) { self.collect_garbage(); - if time::Instant::now() >= self.next_broadcast { + if Instant::now() >= self.next_broadcast { self.rebroadcast(network); - self.next_broadcast = time::Instant::now() + REBROADCAST_INTERVAL; + self.next_broadcast = Instant::now() + REBROADCAST_INTERVAL; } } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index e506a61c75..10d5f1ce9b 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -17,7 +17,8 @@ fnv = "1.0.6" fork-tree = { version = "2.0.0", path = "../../utils/fork-tree" } futures = "0.3.1" futures_codec = "0.3.3" -futures-timer = "0.4.0" +futures-timer = "3.0.1" +wasm-timer = "0.2" libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } linked-hash-map = "0.5.2" linked_hash_set = "0.1.3" diff --git a/client/network/src/debug_info.rs b/client/network/src/debug_info.rs index b06e275d1d..a3d63333fa 100644 --- a/client/network/src/debug_info.rs +++ b/client/network/src/debug_info.rs @@ -28,7 +28,8 @@ use std::error; use std::collections::hash_map::Entry; use std::pin::Pin; use std::task::{Context, Poll}; -use std::time::{Duration, Instant}; +use std::time::Duration; +use wasm_timer::Instant; use crate::utils::interval; /// Time after we disconnect from a node before we purge its information from the cache. diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 5e8df2831b..99b0117882 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -52,6 +52,7 @@ use crate::chain::{Client, FinalityProofProvider}; use sc_client_api::{FetchChecker, ChangesProof, StorageProof}; use crate::error; use util::LruHashSet; +use wasm_timer::Instant; mod legacy_proto; mod util; @@ -158,7 +159,7 @@ struct PacketStats { /// A peer that we are connected to /// and from whom we have not yet received a Status message. struct HandshakingPeer { - timestamp: time::Instant, + timestamp: Instant, } /// Peer information @@ -166,9 +167,9 @@ struct HandshakingPeer { struct Peer { info: PeerInfo, /// Current block request, if any. - block_request: Option<(time::Instant, message::BlockRequest)>, + block_request: Option<(Instant, message::BlockRequest)>, /// Requests we are no longer insterested in. - obsolete_requests: HashMap, + obsolete_requests: HashMap, /// Holds a set of transactions known to this peer. known_extrinsics: LruHashSet, /// Holds a set of blocks known to this peer. @@ -701,7 +702,7 @@ impl, H: ExHashT> Protocol { /// Called when a new peer is connected pub fn on_peer_connected(&mut self, who: PeerId) { trace!(target: "sync", "Connecting {}", who); - self.handshaking_peers.insert(who.clone(), HandshakingPeer { timestamp: time::Instant::now() }); + self.handshaking_peers.insert(who.clone(), HandshakingPeer { timestamp: Instant::now() }); self.send_status(who); } @@ -890,7 +891,7 @@ impl, H: ExHashT> Protocol { } fn maintain_peers(&mut self) { - let tick = time::Instant::now(); + let tick = Instant::now(); let mut aborting = Vec::new(); { for (who, peer) in self.context_data.peers.iter() { @@ -1833,7 +1834,7 @@ fn send_request( trace!(target: "sync", "Request {} for {} is now obsolete.", request.id, who); peer.obsolete_requests.insert(request.id, timestamp); } - peer.block_request = Some((time::Instant::now(), r.clone())); + peer.block_request = Some((Instant::now(), r.clone())); } } send_message::(behaviour, stats, who, message) diff --git a/client/network/src/protocol/legacy_proto/behaviour.rs b/client/network/src/protocol/legacy_proto/behaviour.rs index b4047f320a..1eb6b157dd 100644 --- a/client/network/src/protocol/legacy_proto/behaviour.rs +++ b/client/network/src/protocol/legacy_proto/behaviour.rs @@ -26,7 +26,8 @@ use log::{debug, error, trace, warn}; use rand::distributions::{Distribution as _, Uniform}; use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; -use std::time::{Duration, Instant}; +use std::time::Duration; +use wasm_timer::Instant; use std::task::{Context, Poll}; /// Network behaviour that handles opening substreams for custom protocols with other nodes. @@ -387,7 +388,7 @@ impl LegacyProto { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \ until {:?}", occ_entry.key(), until); *occ_entry.into_mut() = PeerState::PendingRequest { - timer: futures_timer::Delay::new_at(until.clone()), + timer: futures_timer::Delay::new(until.clone() - Instant::now()), timer_deadline: until.clone(), }; }, @@ -406,7 +407,7 @@ impl LegacyProto { *occ_entry.into_mut() = PeerState::DisabledPendingEnable { connected_point: connected_point.clone(), open, - timer: futures_timer::Delay::new_at(banned.clone()), + timer: futures_timer::Delay::new(banned.clone() - Instant::now()), timer_deadline: banned.clone(), }; }, diff --git a/client/network/src/protocol/legacy_proto/handler.rs b/client/network/src/protocol/legacy_proto/handler.rs index fc3b64b968..66fb0dca13 100644 --- a/client/network/src/protocol/legacy_proto/handler.rs +++ b/client/network/src/protocol/legacy_proto/handler.rs @@ -348,13 +348,12 @@ where ProtocolState::Init { substreams, mut init_deadline } => { match Pin::new(&mut init_deadline).poll(cx) { - Poll::Ready(Ok(())) => { + Poll::Ready(()) => { init_deadline = Delay::new(Duration::from_secs(60)); error!(target: "sub-libp2p", "Handler initialization process is too long \ with {:?}", self.remote_peer_id) }, Poll::Pending => {} - Poll::Ready(Err(_)) => error!(target: "sub-libp2p", "Tokio timer has errored") } self.state = ProtocolState::Init { substreams, init_deadline }; @@ -363,7 +362,7 @@ where ProtocolState::Opening { mut deadline } => { match Pin::new(&mut deadline).poll(cx) { - Poll::Ready(Ok(())) => { + Poll::Ready(()) => { deadline = Delay::new(Duration::from_secs(60)); let event = CustomProtoHandlerOut::ProtocolError { is_severe: true, @@ -376,12 +375,6 @@ where self.state = ProtocolState::Opening { deadline }; None }, - Poll::Ready(Err(_)) => { - error!(target: "sub-libp2p", "Tokio timer has errored"); - deadline = Delay::new(Duration::from_secs(60)); - self.state = ProtocolState::Opening { deadline }; - None - }, } } diff --git a/client/network/src/protocol/legacy_proto/tests.rs b/client/network/src/protocol/legacy_proto/tests.rs index 18e32f1d01..4f523fa31d 100644 --- a/client/network/src/protocol/legacy_proto/tests.rs +++ b/client/network/src/protocol/legacy_proto/tests.rs @@ -409,7 +409,7 @@ fn reconnect_after_disconnect() { _ => panic!() } - if let Poll::Ready(Ok(_)) = delay.poll_unpin(cx) { + if let Poll::Ready(()) = delay.poll_unpin(cx) { Poll::Ready(Ok(())) } else { Poll::Pending diff --git a/client/network/src/protocol/light_dispatch.rs b/client/network/src/protocol/light_dispatch.rs index bfa8daa181..5b587d2045 100644 --- a/client/network/src/protocol/light_dispatch.rs +++ b/client/network/src/protocol/light_dispatch.rs @@ -21,7 +21,8 @@ use std::collections::{HashMap, VecDeque}; use std::sync::Arc; -use std::time::{Instant, Duration}; +use std::time::Duration; +use wasm_timer::Instant; use log::{trace, info}; use futures::channel::oneshot::{Sender as OneShotSender}; use linked_hash_map::{Entry, LinkedHashMap}; diff --git a/client/network/src/protocol/sync/extra_requests.rs b/client/network/src/protocol/sync/extra_requests.rs index 44b42b154f..a5fb232b8d 100644 --- a/client/network/src/protocol/sync/extra_requests.rs +++ b/client/network/src/protocol/sync/extra_requests.rs @@ -21,7 +21,8 @@ use libp2p::PeerId; use log::{debug, trace, warn}; use sp_runtime::traits::{Block as BlockT, NumberFor, Zero}; use std::collections::{HashMap, HashSet, VecDeque}; -use std::time::{Duration, Instant}; +use std::time::Duration; +use wasm_timer::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); diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index b11b187051..6b5c18cf33 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -118,11 +118,18 @@ pub fn build_transport( core::upgrade::apply(stream, upgrade, endpoint, upgrade::Version::V1) .map_ok(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer))) - }) + }); - .timeout(Duration::from_secs(20)) - .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) - .boxed(); + let transport = if cfg!(not(target_os = "unknown")) { + transport + .timeout(Duration::from_secs(20)) + .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) + .boxed() + } else { + transport + .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) + .boxed() + }; (transport, sinks) } diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 3f1d1d5867..ca4b0237cf 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -12,7 +12,7 @@ log = "0.4.8" parking_lot = "0.10.0" futures = "0.1.29" futures03 = { package = "futures", version = "0.3.1", features = ["compat"] } -futures-timer = "0.4.0" +futures-timer = "3.0.1" rand = "0.7.2" libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" } diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index 2140de0973..210a4fb38b 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -405,7 +405,7 @@ fn blocks_are_not_announced_by_light_nodes() { net.peers.remove(0); // Poll for a few seconds and make sure 1 and 2 (now 0 and 1) don't sync together. - let mut delay = futures_timer::Delay::new(Duration::from_secs(5)).compat(); + let mut delay = futures_timer::Delay::new(Duration::from_secs(5)).unit_error().compat(); runtime.block_on(futures::future::poll_fn::<(), (), _>(|| { net.poll(); delay.poll().map_err(|_| ()) @@ -504,7 +504,7 @@ fn can_not_sync_from_light_peer() { net.peers.remove(0); // ensure that the #2 (now #1) fails to sync block #1 even after 5 seconds - let mut test_finished = futures_timer::Delay::new(Duration::from_secs(5)).compat(); + let mut test_finished = futures_timer::Delay::new(Duration::from_secs(5)).unit_error().compat(); runtime.block_on(futures::future::poll_fn::<(), (), _>(|| -> Result<_, ()> { net.poll(); test_finished.poll().map_err(|_| ()) diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index bdbf3fa199..ed5db3f2c7 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -13,7 +13,7 @@ sp-api = { version = "2.0.0", path = "../../primitives/api" } fnv = "1.0.6" futures01 = { package = "futures", version = "0.1" } futures = "0.3.1" -futures-timer = "2.0" +futures-timer = "3.0.1" log = "0.4.8" threadpool = "1.7" num_cpus = "1.10" diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index 85c988d048..2527b86795 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -12,6 +12,7 @@ futures = "0.3.1" libp2p = { version = "0.15.0", default-features = false } log = "0.4.8" serde_json = "1.0.41" +wasm-timer = "0.2" [dev-dependencies] rand = "0.7.2" diff --git a/client/peerset/src/lib.rs b/client/peerset/src/lib.rs index c958912727..7c7bbc6b36 100644 --- a/client/peerset/src/lib.rs +++ b/client/peerset/src/lib.rs @@ -19,12 +19,13 @@ mod peersstate; -use std::{collections::{HashSet, HashMap}, collections::VecDeque, time::Instant}; +use std::{collections::{HashSet, HashMap}, collections::VecDeque}; use futures::{prelude::*, channel::mpsc}; use libp2p::PeerId; use log::{debug, error, trace}; use serde_json::json; use std::{pin::Pin, task::Context, task::Poll}; +use wasm_timer::Instant; /// We don't accept nodes whose reputation is under this value. const BANNED_THRESHOLD: i32 = 82 * (i32::min_value() / 100); diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index bc246db03e..7f7ef80b16 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -24,7 +24,8 @@ lazy_static = "1.4.0" log = "0.4.8" slog = { version = "2.5.2", features = ["nested-values"] } tokio-executor = "0.1.8" -futures-timer = "2" +futures-timer = "3.0.1" +wasm-timer = "0.2" exit-future = "0.2.0" serde = "1.0.101" serde_json = "1.0.41" diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 71749ac308..4d672006b8 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.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::{Service, NetworkStatus, NetworkState, error::Error, DEFAULT_PROTOCOL_ID}; +use crate::{Service, NetworkStatus, NetworkState, error::Error, DEFAULT_PROTOCOL_ID, MallocSizeOfWasm}; use crate::{SpawnTaskHandle, start_rpc_servers, build_network_future, TransactionPoolAdapter}; use crate::status_sinks; use crate::config::{Configuration, DatabaseConfig, KeystoreConfig}; @@ -46,8 +46,9 @@ use sc_executor::{NativeExecutor, NativeExecutionDispatch}; use std::{ borrow::Cow, io::{Read, Write, Seek}, - marker::PhantomData, sync::Arc, time::SystemTime, pin::Pin + marker::PhantomData, sync::Arc, pin::Pin }; +use wasm_timer::SystemTime; use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use sc_telemetry::{telemetry, SUBSTRATE_INFO}; use sp_transaction_pool::MaintainedTransactionPool; @@ -738,7 +739,7 @@ ServiceBuilder< TSc: Clone, TImpQu: 'static + ImportQueue, TNetP: NetworkSpecialization, - TExPool: MaintainedTransactionPool::Hash> + 'static, + TExPool: MaintainedTransactionPool::Hash> + MallocSizeOfWasm + 'static, TRpc: sc_rpc::RpcExtension + Clone, { @@ -984,6 +985,10 @@ ServiceBuilder< "disk_read_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_read).unwrap_or(0), "disk_write_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_written).unwrap_or(0), ); + #[cfg(not(target_os = "unknown"))] + let memory_transaction_pool = parity_util_mem::malloc_size(&*transaction_pool_); + #[cfg(target_os = "unknown")] + let memory_transaction_pool = 0; let _ = record_metrics!( "peers" => num_peers, "height" => best_number, @@ -997,7 +1002,7 @@ ServiceBuilder< "used_db_cache_size" => info.usage.as_ref().map(|usage| usage.memory.database_cache).unwrap_or(0), "disk_read_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_read).unwrap_or(0), "disk_write_per_sec" => info.usage.as_ref().map(|usage| usage.io.bytes_written).unwrap_or(0), - "memory_transaction_pool" => parity_util_mem::malloc_size(&*transaction_pool_), + "memory_transaction_pool" => memory_transaction_pool, ); ready(()) diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 920cdc5c4c..8c2f57dd7c 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -31,7 +31,8 @@ use std::{borrow::Cow, io, pin::Pin}; use std::marker::PhantomData; use std::net::SocketAddr; use std::collections::HashMap; -use std::time::{Duration, Instant}; +use std::time::Duration; +use wasm_timer::Instant; use std::task::{Poll, Context}; use parking_lot::Mutex; @@ -52,6 +53,7 @@ use log::{log, warn, debug, error, Level}; use codec::{Encode, Decode}; use sp_runtime::generic::BlockId; use sp_runtime::traits::{NumberFor, Block as BlockT}; +use parity_util_mem::MallocSizeOf; pub use self::error::Error; pub use self::builder::{ @@ -73,6 +75,16 @@ pub use sc_network::{FinalityProofProvider, OnDemand, config::BoxFinalityProofRe const DEFAULT_PROTOCOL_ID: &str = "sup"; +/// A type that implements `MallocSizeOf` on native but not wasm. +#[cfg(not(target_os = "unknown"))] +pub trait MallocSizeOfWasm: MallocSizeOf {} +#[cfg(target_os = "unknown")] +pub trait MallocSizeOfWasm {} +#[cfg(not(target_os = "unknown"))] +impl MallocSizeOfWasm for T {} +#[cfg(target_os = "unknown")] +impl MallocSizeOfWasm for T {} + /// Substrate service. pub struct Service { client: Arc, @@ -163,7 +175,7 @@ pub trait AbstractService: 'static + Future> + /// Chain selection algorithm. type SelectChain: sp_consensus::SelectChain; /// Transaction pool. - type TransactionPool: TransactionPool; + type TransactionPool: TransactionPool + MallocSizeOfWasm; /// Network specialization. type NetworkSpecialization: NetworkSpecialization; @@ -227,7 +239,7 @@ where TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, TRtApi: 'static + Send + Sync, TSc: sp_consensus::SelectChain + 'static + Clone + Send + Unpin, - TExPool: 'static + TransactionPool, + TExPool: 'static + TransactionPool + MallocSizeOfWasm, TOc: 'static + Send + Sync, TNetSpec: NetworkSpecialization, { diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 44e332b9d7..f75c6dd44e 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -10,7 +10,8 @@ license = "GPL-3.0" bytes = "0.5" parking_lot = "0.10.0" futures = "0.3.1" -futures-timer = "2.0.0" +futures-timer = "3.0.1" +wasm-timer = "0.2.0" libp2p = { version = "0.15.0", default-features = false, features = ["libp2p-websocket"] } log = "0.4.8" pin-project = "0.4.6" diff --git a/client/telemetry/src/lib.rs b/client/telemetry/src/lib.rs index 906df545e2..1c6f1425d6 100644 --- a/client/telemetry/src/lib.rs +++ b/client/telemetry/src/lib.rs @@ -63,7 +63,8 @@ use libp2p::{Multiaddr, wasm_ext}; use log::{error, warn}; use parking_lot::Mutex; use serde::{Serialize, Deserialize}; -use std::{pin::Pin, sync::Arc, task::{Context, Poll}, time::{Duration, Instant}}; +use std::{pin::Pin, sync::Arc, task::{Context, Poll}, time::Duration}; +use wasm_timer::Instant; pub use libp2p::wasm_ext::ExtTransport; pub use slog_scope::with_logger; diff --git a/client/telemetry/src/worker.rs b/client/telemetry/src/worker.rs index 8f43bb612a..ef1f9fa067 100644 --- a/client/telemetry/src/worker.rs +++ b/client/telemetry/src/worker.rs @@ -98,10 +98,10 @@ impl TelemetryWorker { .map_ok(|data| BytesMut::from(data.as_ref())); future::ready(Ok::<_, io::Error>(connec)) }) - }); + }) + .timeout(CONNECT_TIMEOUT); let transport = transport - .timeout(CONNECT_TIMEOUT) .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) .map(|out, _| { let out = out diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 524e9a98a0..27aec1b92e 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -12,6 +12,7 @@ futures = { version = "0.3.1", features = ["compat"] } futures-diagnose = "1.0" log = "0.4.8" parking_lot = "0.10.0" +wasm-timer = "0.2" sp-core = { version = "2.0.0", path = "../../primitives/core" } sp-api = { version = "2.0.0", path = "../../primitives/api" } sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index 2d3172fc91..3bbe46bc50 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -11,6 +11,7 @@ futures = "0.3.1" log = "0.4.8" parking_lot = "0.10.0" serde = { version = "1.0.101", features = ["derive"] } +wasm-timer = "0.2" sp-core = { version = "2.0.0", path = "../../../primitives/core" } sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" } sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" } diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 52e00df363..8a33d8244e 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -209,7 +209,8 @@ const RECENTLY_PRUNED_TAGS: usize = 2; /// as-is for the second time will fail or produce unwanted results. /// Most likely it is required to revalidate them and recompute set of /// required tags. -#[derive(Debug, parity_util_mem::MallocSizeOf)] +#[derive(Debug)] +#[cfg_attr(not(target_os = "unknown"), derive(parity_util_mem::MallocSizeOf))] pub struct BasePool { reject_future_transactions: bool, future: FutureTransactions, diff --git a/client/transaction-pool/graph/src/future.rs b/client/transaction-pool/graph/src/future.rs index bda26fe34f..a84a5fbe68 100644 --- a/client/transaction-pool/graph/src/future.rs +++ b/client/transaction-pool/graph/src/future.rs @@ -19,17 +19,17 @@ use std::{ fmt, hash, sync::Arc, - time, }; use sp_core::hexdisplay::HexDisplay; use sp_runtime::transaction_validity::{ TransactionTag as Tag, }; +use wasm_timer::Instant; use crate::base_pool::Transaction; -#[derive(parity_util_mem::MallocSizeOf)] +#[cfg_attr(not(target_os = "unknown"), derive(parity_util_mem::MallocSizeOf))] /// Transaction with partially satisfied dependencies. pub struct WaitingTransaction { /// Transaction details. @@ -37,7 +37,7 @@ pub struct WaitingTransaction { /// Tags that are required and have not been satisfied yet by other transactions in the pool. pub missing_tags: HashSet, /// Time of import to the Future Queue. - pub imported_at: time::Instant, + pub imported_at: Instant, } impl fmt::Debug for WaitingTransaction { @@ -91,7 +91,7 @@ impl WaitingTransaction { WaitingTransaction { transaction: Arc::new(transaction), missing_tags, - imported_at: time::Instant::now(), + imported_at: Instant::now(), } } @@ -110,7 +110,8 @@ impl WaitingTransaction { /// /// Contains transactions that are still awaiting for some other transactions that /// could provide a tag that they require. -#[derive(Debug, parity_util_mem::MallocSizeOf)] +#[derive(Debug)] +#[cfg_attr(not(target_os = "unknown"), derive(parity_util_mem::MallocSizeOf))] pub struct FutureTransactions { /// tags that are not yet provided by any transaction and we await for them wanted_tags: HashMap>, diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index ab4e3a5a79..edcd211df9 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -34,6 +34,7 @@ use sp_runtime::{ transaction_validity::{TransactionValidity, TransactionTag as Tag, TransactionValidityError}, }; use sp_transaction_pool::{error, PoolStatus}; +use wasm_timer::Instant; use crate::validated_pool::{ValidatedPool, ValidatedTransaction}; @@ -122,6 +123,7 @@ pub struct Pool { validated_pool: Arc>, } +#[cfg(not(target_os = "unknown"))] impl parity_util_mem::MallocSizeOf for Pool where B::Hash: parity_util_mem::MallocSizeOf, @@ -189,7 +191,6 @@ impl Pool { at: &BlockId, max: Option, ) -> Result<(), B::Error> { - use std::time::Instant; log::debug!(target: "txpool", "Fetching ready transactions (up to: {})", max.map(|x| format!("{}", x)).unwrap_or_else(|| "all".into()) @@ -317,7 +318,7 @@ impl Pool { // Make sure that we don't revalidate extrinsics that were part of the recently // imported block. This is especially important for UTXO-like chains cause the // inputs are pruned so such transaction would go to future again. - self.validated_pool.ban(&std::time::Instant::now(), known_imported_hashes.clone().into_iter()); + self.validated_pool.ban(&Instant::now(), known_imported_hashes.clone().into_iter()); // Try to re-validate pruned transactions since some of them might be still valid. // note that `known_imported_hashes` will be rejected here due to temporary ban. @@ -469,10 +470,7 @@ impl Clone for Pool { #[cfg(test)] mod tests { - use std::{ - collections::{HashMap, HashSet}, - time::Instant, - }; + use std::collections::{HashMap, HashSet}; use parking_lot::Mutex; use futures::executor::block_on; use super::*; @@ -481,6 +479,7 @@ mod tests { use codec::Encode; use substrate_test_runtime::{Block, Extrinsic, Transfer, H256, AccountId}; use assert_matches::assert_matches; + use wasm_timer::Instant; use crate::base_pool::Limit; const INVALID_NONCE: u64 = 254; diff --git a/client/transaction-pool/graph/src/rotator.rs b/client/transaction-pool/graph/src/rotator.rs index e1c852f95a..55a9230522 100644 --- a/client/transaction-pool/graph/src/rotator.rs +++ b/client/transaction-pool/graph/src/rotator.rs @@ -23,9 +23,10 @@ use std::{ collections::HashMap, hash, iter, - time::{Duration, Instant}, + time::Duration, }; use parking_lot::RwLock; +use wasm_timer::Instant; use crate::base_pool::Transaction; diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 9524284064..d02bc0ec72 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -19,7 +19,6 @@ use std::{ fmt, hash, sync::Arc, - time, }; use crate::base_pool as base; @@ -37,6 +36,7 @@ use sp_runtime::{ transaction_validity::TransactionTag as Tag, }; use sp_transaction_pool::{error, PoolStatus}; +use wasm_timer::Instant; use crate::base_pool::PruneStatus; use crate::pool::{EventStream, Options, ChainApi, BlockHash, ExHash, ExtrinsicFor, TransactionFor}; @@ -74,6 +74,7 @@ pub(crate) struct ValidatedPool { rotator: PoolRotator>, } +#[cfg(not(target_os = "unknown"))] impl parity_util_mem::MallocSizeOf for ValidatedPool where B::Hash: parity_util_mem::MallocSizeOf, @@ -100,7 +101,7 @@ impl ValidatedPool { } /// Bans given set of hashes. - pub fn ban(&self, now: &std::time::Instant, hashes: impl IntoIterator>) { + pub fn ban(&self, now: &Instant, hashes: impl IntoIterator>) { self.rotator.ban(now, hashes) } @@ -145,7 +146,7 @@ impl ValidatedPool { Ok(imported.hash().clone()) } ValidatedTransaction::Invalid(hash, err) => { - self.rotator.ban(&std::time::Instant::now(), std::iter::once(hash)); + self.rotator.ban(&Instant::now(), std::iter::once(hash)); Err(err.into()) }, ValidatedTransaction::Unknown(hash, err) => { @@ -177,7 +178,7 @@ impl ValidatedPool { let removed = pool.enforce_limits(ready_limit, future_limit) .into_iter().map(|x| x.hash.clone()).collect::>(); // ban all removed transactions - self.rotator.ban(&std::time::Instant::now(), removed.iter().map(|x| x.clone())); + self.rotator.ban(&Instant::now(), removed.iter().map(|x| x.clone())); removed }; // run notifications @@ -208,7 +209,7 @@ impl ValidatedPool { .map(|_| watcher) }, ValidatedTransaction::Invalid(hash, err) => { - self.rotator.ban(&std::time::Instant::now(), std::iter::once(hash)); + self.rotator.ban(&Instant::now(), std::iter::once(hash)); Err(err.into()) }, ValidatedTransaction::Unknown(_, err) => Err(err.into()), @@ -430,7 +431,7 @@ impl ValidatedPool { let block_number = self.api.block_id_to_number(at)? .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())? .saturated_into::(); - let now = time::Instant::now(); + let now = Instant::now(); let to_remove = { self.ready() .filter(|tx| self.rotator.ban_if_stale(&now, block_number, &tx)) @@ -497,7 +498,7 @@ impl ValidatedPool { debug!(target: "txpool", "Removing invalid transactions: {:?}", hashes); // temporarily ban invalid transactions - self.rotator.ban(&time::Instant::now(), hashes.iter().cloned()); + self.rotator.ban(&Instant::now(), hashes.iter().cloned()); let invalid = self.pool.write().remove_subtree(hashes); diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 7084e1c4a0..139efcd59e 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -28,7 +28,7 @@ pub mod testing; pub use sc_transaction_graph as txpool; pub use crate::api::{FullChainApi, LightChainApi}; -use std::{collections::HashMap, sync::Arc, pin::Pin, time::Instant}; +use std::{collections::HashMap, sync::Arc, pin::Pin}; use futures::{Future, FutureExt, future::ready}; use parking_lot::Mutex; @@ -41,6 +41,7 @@ use sp_transaction_pool::{ TxHash, TransactionFor, TransactionStatusStreamFor, BlockHash, MaintainedTransactionPool, PoolFuture, }; +use wasm_timer::Instant; /// Basic implementation of transaction pool that can be customized by providing PoolApi. pub struct BasicPool @@ -53,6 +54,7 @@ pub struct BasicPool revalidation_strategy: Arc>>>, } +#[cfg(not(target_os = "unknown"))] impl parity_util_mem::MallocSizeOf for BasicPool where PoolApi: sc_transaction_graph::ChainApi, @@ -205,7 +207,7 @@ enum RevalidationStatus { /// The revalidation has never been completed. NotScheduled, /// The revalidation is scheduled. - Scheduled(Option, Option), + Scheduled(Option, Option), /// The revalidation is in progress. InProgress, } diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 1b5c54b7e9..2abc6f5617 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -14,7 +14,7 @@ sp-core = { path= "../../core" } sp-inherents = { version = "2.0.0", path = "../../inherents" } sp-state-machine = { version = "0.8.0", path = "../../../primitives/state-machine" } futures = { version = "0.3.1", features = ["thread-pool"] } -futures-timer = "0.4.0" +futures-timer = "3.0.1" futures-diagnose = "1.0" sp-std = { version = "2.0.0", path = "../../std" } sp-version = { version = "2.0.0", path = "../../version" } diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index fa146ebd6f..815aaf5305 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -12,6 +12,7 @@ sp-runtime = { version = "2.0.0", default-features = false, path = "../runtime" codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sp-inherents = { version = "2.0.0", default-features = false, path = "../inherents" } impl-trait-for-tuples = "0.1.3" +wasm-timer = "0.2" [features] default = [ "std" ] diff --git a/primitives/timestamp/src/lib.rs b/primitives/timestamp/src/lib.rs index 50b871d73e..979b98b495 100644 --- a/primitives/timestamp/src/lib.rs +++ b/primitives/timestamp/src/lib.rs @@ -90,7 +90,7 @@ impl ProvideInherentData for InherentDataProvider { &self, inherent_data: &mut InherentData, ) -> Result<(), sp_inherents::Error> { - use std::time::SystemTime; + use wasm_timer::SystemTime; let now = SystemTime::now(); now.duration_since(SystemTime::UNIX_EPOCH) diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index 0b23c27f82..d4e6a5caf2 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -29,7 +29,7 @@ use futures::{ use serde::{Deserialize, Serialize}; use sp_runtime::{ generic::BlockId, - traits::{Block as BlockT, Member, MaybeMallocSizeOf}, + traits::{Block as BlockT, Member}, transaction_validity::{ TransactionLongevity, TransactionPriority, TransactionTag, }, @@ -154,7 +154,7 @@ pub trait InPoolTransaction { } /// Transaction pool interface. -pub trait TransactionPool: Send + Sync + MaybeMallocSizeOf { +pub trait TransactionPool: Send + Sync { /// Block type. type Block: BlockT; /// Transaction hash type. @@ -263,4 +263,4 @@ impl OffchainSubmitTransaction for TPool { e )) } -} \ No newline at end of file +} diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index 3afa49fc25..e52f630cb5 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -17,12 +17,15 @@ js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" kvdb-web = "0.4" -service = { version = "0.8", package = "sc-service", path = "../../client/service", default-features = false } -network = { package = "sc-network", path = "../../client/network" } -chain-spec = { package = "sc-chain-spec", path = "../../client/chain-spec" } +sc-informant = { version = "0.8", path = "../../client/informant" } +sc-service = { version = "0.8", path = "../../client/service", default-features = false } +sc-network = { path = "../../client/network" } +sc-chain-spec = { path = "../../client/chain-spec" } # Imported just for the `no_cc` feature clear_on_drop = { version = "0.2.3", features = ["no_cc"] } # Imported just for the `wasm-bindgen` feature rand6 = { package = "rand", version = "0.6", features = ["wasm-bindgen"] } rand = { version = "0.7", features = ["wasm-bindgen"] } +futures-timer = { version = "3.0.1", features = ["wasm-bindgen"]} +chrono = { version = "0.4", features = ["wasmbind"] } diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs index d7ffdca1aa..b054d73ac9 100644 --- a/utils/browser/src/lib.rs +++ b/utils/browser/src/lib.rs @@ -17,7 +17,7 @@ use futures01::sync::mpsc as mpsc01; use log::{debug, info}; use std::sync::Arc; -use service::{ +use sc_service::{ AbstractService, RpcSession, Roles, Configuration, config::{DatabaseConfig, KeystoreConfig}, ChainSpec, RuntimeGenesis }; @@ -25,7 +25,7 @@ use wasm_bindgen::prelude::*; use futures::{prelude::*, channel::{oneshot, mpsc}, future::{poll_fn, ok}, compat::*}; use std::task::Poll; use std::pin::Pin; -use chain_spec::Extension; +use sc_chain_spec::Extension; pub use libp2p::wasm_ext::{ExtTransport, ffi::Transport}; pub use console_error_panic_hook::set_once as set_console_error_panic_hook; @@ -46,7 +46,10 @@ where let transport = ExtTransport::new(transport); let mut config = Configuration::default(); - config.network.transport = network::config::TransportConfig::Normal { + config.network.boot_nodes = chain_spec.boot_nodes().to_vec(); + config.telemetry_endpoints = chain_spec.telemetry_endpoints().clone(); + config.chain_spec = Some(chain_spec); + config.network.transport = sc_network::config::TransportConfig::Normal { wasm_external_transport: Some(transport.clone()), allow_private_ipv4: true, enable_mdns: false, @@ -82,6 +85,11 @@ struct RpcMessage { /// Create a Client object that connects to a service. pub fn start_client(mut service: impl AbstractService) -> Client { + // Spawn informant + wasm_bindgen_futures::spawn_local( + sc_informant::build(&service, sc_informant::OutputFormat::Plain).map(drop) + ); + // We dispatch a background task responsible for processing the service. // // The main action performed by the code below consists in polling the service with diff --git a/utils/grafana-data-source/Cargo.toml b/utils/grafana-data-source/Cargo.toml index ab4251ef57..e1bd037009 100644 --- a/utils/grafana-data-source/Cargo.toml +++ b/utils/grafana-data-source/Cargo.toml @@ -16,7 +16,7 @@ serde = { version = "1", features = ["derive"] } chrono = { version = "0.4", features = ["serde"] } lazy_static = "1.4" parking_lot = "0.10.0" -futures-timer = "2.0" +futures-timer = "3.0.1" derive_more = "0.99" [target.'cfg(not(target_os = "unknown"))'.dependencies] diff --git a/utils/grafana-data-source/test/Cargo.toml b/utils/grafana-data-source/test/Cargo.toml index 9575866fa8..18c080c8d1 100644 --- a/utils/grafana-data-source/test/Cargo.toml +++ b/utils/grafana-data-source/test/Cargo.toml @@ -9,5 +9,5 @@ edition = "2018" [dependencies] grafana-data-source = { version = "0.8", path = ".." } futures = "0.3" -futures-timer = "2.0" +futures-timer = "3.0.1" rand = "0.7" -- GitLab From 0d4586b13f176ca35c65f288b59e4ecccd099313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 10 Feb 2020 13:13:04 +0100 Subject: [PATCH 284/296] Don't expose `Benchmarking` host functions by default (#4875) * Don't expose `Benchmarking` host functions by default * Fix tests Co-authored-by: Shawn Tabrizi --- bin/node/executor/src/lib.rs | 3 +- client/executor/src/integration_tests/mod.rs | 4 +-- primitives/io/src/lib.rs | 35 ++++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/bin/node/executor/src/lib.rs b/bin/node/executor/src/lib.rs index 812c018502..72f40b7c1f 100644 --- a/bin/node/executor/src/lib.rs +++ b/bin/node/executor/src/lib.rs @@ -25,5 +25,6 @@ use sc_executor::native_executor_instance; native_executor_instance!( pub Executor, node_runtime::api::dispatch, - node_runtime::native_version + node_runtime::native_version, + sp_io::benchmarking::HostFunctions, ); diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 2ac67215a8..3f3d9f69e1 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -88,7 +88,7 @@ fn call_not_existing_function(wasm_method: WasmExecutionMethod) { #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => assert_eq!( &format!("{:?}", e), - "Other(\"call to undefined external function with index 71\")" + "Other(\"call to undefined external function with index 68\")" ), } } @@ -117,7 +117,7 @@ fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => assert_eq!( &format!("{:?}", e), - "Other(\"call to undefined external function with index 72\")" + "Other(\"call to undefined external function with index 69\")" ), } } diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index ea45b580ce..ce8a546e86 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -774,25 +774,25 @@ pub trait Logging { /// Interface that provides functions for benchmarking the runtime. #[runtime_interface] pub trait Benchmarking { - /// Get the number of nanoseconds passed since the UNIX epoch - /// - /// WARNING! This is a non-deterministic call. Do not use this within - /// consensus critical logic. - fn current_time() -> u128 { - std::time::SystemTime::now().duration_since(std::time::SystemTime::UNIX_EPOCH) - .expect("Unix time doesn't go backwards; qed") - .as_nanos() - } + /// Get the number of nanoseconds passed since the UNIX epoch + /// + /// WARNING! This is a non-deterministic call. Do not use this within + /// consensus critical logic. + fn current_time() -> u128 { + std::time::SystemTime::now().duration_since(std::time::SystemTime::UNIX_EPOCH) + .expect("Unix time doesn't go backwards; qed") + .as_nanos() + } - /// Reset the trie database to the genesis state. - fn wipe_db(&mut self) { - self.wipe() - } + /// Reset the trie database to the genesis state. + fn wipe_db(&mut self) { + self.wipe() + } - /// Commit pending storage changes to the trie database and clear the database cache. - fn commit_db(&mut self) { - self.commit() - } + /// Commit pending storage changes to the trie database and clear the database cache. + fn commit_db(&mut self) { + self.commit() + } } /// Wasm-only interface that provides functions for interacting with the sandbox. @@ -947,7 +947,6 @@ pub type SubstrateHostFunctions = ( logging::HostFunctions, sandbox::HostFunctions, crate::trie::HostFunctions, - benchmarking::HostFunctions, ); #[cfg(test)] -- GitLab From 571e3c4d9cdcf55a7c09b7040061f6e096dd3b08 Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Mon, 10 Feb 2020 13:25:20 +0100 Subject: [PATCH 285/296] Add trace on import block. (#4871) --- client/src/client.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/client.rs b/client/src/client.rs index 9e30c7b2ea..d085b92025 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1599,6 +1599,9 @@ impl sp_consensus::BlockImport for &Client>, new_cache: HashMap>, ) -> Result { + let span = tracing::span!(tracing::Level::DEBUG, "import_block"); + let _enter = span.enter(); + if let Some(res) = self.prepare_block_storage_changes(&mut import_block).map_err(|e| { warn!("Block prepare storage changes error:\n{:?}", e); ConsensusError::ClientImport(e.to_string()) -- GitLab From 1fa3f7f607351e008ec6d817ca218d9aade576f7 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Mon, 10 Feb 2020 13:37:10 +0100 Subject: [PATCH 286/296] Refactor and document allocator (#4855) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Clarify code a bit. * Move code around. * Introduce `Order`. * Introduce `Link` structure. * Get rid of ptr_offset This is beneficial since ptr_offset is essentially makes us handle two different address spaces, global (i.e. `mem`) and heap local and without it things are becoming simpler. * Rename PREFIX_SIZE to HEADER_SIZE. This will come in the next commits. * Introduce a separate `Memory` trait. This is not necessary, but will come in handy for the upcoming changes. * Rename `ptr` to `header_ptr` where makes sense. * Introduce a `Header` type. * Make `bump` dumber. This allows us to pull `HEADER_SIZE` to see that we actually allocate `order.size() + HEADER_SIZE`. * Clean up. * Introduce a freelists struct. * Update documentation. * Make Sized requirement optional to make the PR truly back-compatible. * Apply suggestions from code review Co-Authored-By: Gavin Wood * Apply suggestions from code review Co-Authored-By: Bastian Köcher Co-authored-by: Gavin Wood Co-authored-by: Bastian Köcher --- primitives/allocator/src/freeing_bump.rs | 524 ++++++++++++++++------- 1 file changed, 369 insertions(+), 155 deletions(-) diff --git a/primitives/allocator/src/freeing_bump.rs b/primitives/allocator/src/freeing_bump.rs index f51dc222a2..caac9dd6c4 100644 --- a/primitives/allocator/src/freeing_bump.rs +++ b/primitives/allocator/src/freeing_bump.rs @@ -16,42 +16,40 @@ //! This module implements a freeing-bump allocator. //! -//! The algorithm is as follows: -//! We store `N` linked list heads, where `N` is the total number of sizes -//! of allocations to support. A simple set is powers of two from 8 bytes -//! to 16,777,216 bytes (2^3 - 2^24 inclusive), resulting in `N = 22`: +//! The heap is a continuous linear memory and chunks are allocated using a bump allocator. //! //! ```ignore -//! let mut heads [u64; N] = [0; N]; -//! fn size(n: u64) -> u64 { 8 << n } -//! let mut bumper = 0; -//! fn bump(n: u64) -> u64 { let res = bumper; bumper += n; res } +//! +-------------+-------------------------------------------------+ +//! | | | +//! +-------------+-------------------------------------------------+ +//! ^ +//! |_ bumper //! ``` //! -//! We assume there is a slab of heap to be allocated: +//! Only allocations with sizes of power of two can be allocated. If the incoming request has a non +//! power of two size it is increased to the nearest power of two. The power of two of size is +//! referred as **an order**. //! -//! ```ignore -//! let mut heap = [0u8; HEAP_SIZE]; -//! ``` +//! Each allocation has a header immediately preceding to it. The header is always 8 bytes and can +//! be of two types: free and occupied. //! -//! Whenever we allocate, we select the lowest linked list item size that -//! will fit the allocation (i.e. the next highest power of two). -//! We then check to see if the linked list is empty. If empty, we use -//! the bump allocator to get the allocation with an extra 8 bytes -//! preceding it. We initialise those preceding 8 bytes to identify the -//! list to which it belongs. If it is not empty, we unlink the first item from -//! the linked list and then reset the 8 preceding bytes so they now record -//! the identity of the linked list. +//! For implementing freeing we maintain a linked lists for each order. The maximum supported +//! allocation size is capped, therefore the number of orders and thus the linked lists is as well +//! limited. //! -//! To deallocate we use the preceding 8 bytes of the allocation to knit -//! back the allocation into the linked list from the head. +//! When the allocater serves an allocation request it first checks the linked list for the respective +//! order. If it doesn't have any free chunks, the allocator requests memory from the bump allocator. +//! In any case the order is stored in the header of the allocation. +//! +//! Upon deallocation we get the order of the allocation from its header and then add that +//! allocation to the linked list for the respective order. use crate::Error; -use sp_std::{convert::{TryFrom, TryInto}, ops::Range}; +use sp_std::{convert::{TryFrom, TryInto}, ops::{Range, Index, IndexMut}}; use sp_wasm_interface::{Pointer, WordSize}; -// The pointers need to be aligned to 8 bytes. This is because the -// maximum value type handled by wasm32 is u64. +/// The minimal alignment guaranteed by this allocator. The alignment of 8 is choosen because it is +/// the alignment guaranteed by wasm32. const ALIGNMENT: u32 = 8; // The pointer returned by `allocate()` needs to fulfill the alignment @@ -65,17 +63,7 @@ const MIN_POSSIBLE_ALLOCATION: u32 = 8; // Each pointer is prefixed with 8 bytes, which identify the list index // to which it belongs. -const PREFIX_SIZE: u32 = 8; - -/// An implementation of freeing bump allocator. -/// -/// Refer to the module-level documentation for further details. -pub struct FreeingBumpHeapAllocator { - bumper: u32, - heads: [u32; N], - ptr_offset: u32, - total_size: u32, -} +const HEADER_SIZE: u32 = 8; /// Create an allocator error. fn error(msg: &'static str) -> Error { @@ -93,6 +81,219 @@ macro_rules! trace { } } +/// The exponent for the power of two sized block adjusted to the minimum size. +/// +/// This way, if `MIN_POSSIBLE_ALLOCATION == 8`, we would get: +/// +/// power_of_two_size | order +/// 8 | 0 +/// 16 | 1 +/// 32 | 2 +/// 64 | 3 +/// +/// and so on. +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +struct Order(u32); + +impl Order { + /// Create `Order` object from a raw order. + /// + /// Returns `Err` if it is greater than the maximum supported order. + fn from_raw(order: u32) -> Result { + if order < N as u32 { + Ok(Self(order)) + } else { + Err(error("invalid order")) + } + } + + /// Compute the order by the given size + /// + /// The size is clamped, so that the following holds: + /// + /// `MIN_POSSIBLE_ALLOCATION <= size <= MAX_POSSIBLE_ALLOCATION` + fn from_size(size: u32) -> Result { + let clamped_size = if size > MAX_POSSIBLE_ALLOCATION { + return Err(Error::RequestedAllocationTooLarge); + } else if size < MIN_POSSIBLE_ALLOCATION { + MIN_POSSIBLE_ALLOCATION + } else { + size + }; + + // Round the clamped size to the next power of two. + // + // It returns the unchanged value if the value is already a power of two. + let power_of_two_size = clamped_size.next_power_of_two(); + + // Compute the number of trailing zeroes to get the order. We adjust it by the number of + // trailing zeroes in the minimum possible allocation. + let order = power_of_two_size.trailing_zeros() - MIN_POSSIBLE_ALLOCATION.trailing_zeros(); + + Ok(Self(order)) + } + + /// Returns the corresponding size for this order. + /// + /// Note that it is always a power of two. + fn size(&self) -> u32 { + MIN_POSSIBLE_ALLOCATION << self.0 + } + + /// Extract the order as `u32`. + fn into_raw(self) -> u32 { + self.0 + } +} + +/// A marker for denoting the end of the linked list. +const EMPTY_MARKER: u32 = u32::max_value(); + +/// A link between headers in the free list. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +enum Link { + /// Null, denotes that there is no next element. + Null, + /// Link to the next element represented as a pointer to the a header. + Ptr(u32), +} + +impl Link { + /// Creates a link from raw value. + fn from_raw(raw: u32) -> Self { + if raw != EMPTY_MARKER { + Self::Ptr(raw) + } else { + Self::Null + } + } + + /// Converts this link into a raw u32. + fn into_raw(self) -> u32 { + match self { + Self::Null => EMPTY_MARKER, + Self::Ptr(ptr) => ptr, + } + } +} + +/// A header of an allocation. +/// +/// The header is encoded in memory as follows. +/// +/// ## Free header +/// +/// ```ignore +/// 64 32 0 +// +--------------+-------------------+ +/// | 0 | next element link | +/// +--------------+-------------------+ +/// ``` +/// +/// ## Occupied header +/// +/// ```ignore +/// 64 32 0 +// +--------------+-------------------+ +/// | 1 | order | +/// +--------------+-------------------+ +/// ``` +#[derive(Clone, Debug, PartialEq, Eq)] +enum Header { + /// A free header contains a link to the next element to form a free linked list. + Free(Link), + /// An occupied header has attached order to know in which free list we should put the + /// allocation upon deallocation. + Occupied(Order), +} + +impl Header { + fn read_from(memory: &M, header_ptr: u32) -> Result { + let raw_header = memory.read_le_u64(header_ptr)?; + + // Check if the header represents an occupied or free allocation and extract the header data + // by trimming (and discarding) the high bits. + let occupied = raw_header & 0x00000001_00000000 != 0; + let header_data = raw_header as u32; + + Ok(if occupied { + Self::Occupied(Order::from_raw(header_data)?) + } else { + Self::Free(Link::from_raw(header_data)) + }) + } + + /// Write out this header to memory. + fn write_into(&self, memory: &mut M, header_ptr: u32) -> Result<(), Error> { + let (header_data, occupied_mask) = match *self { + Self::Occupied(order) => (order.into_raw(), 0x00000001_00000000), + Self::Free(link) => (link.into_raw(), 0x00000000_00000000), + }; + let raw_header = header_data as u64 | occupied_mask; + memory.write_le_u64(header_ptr, raw_header)?; + Ok(()) + } + + /// Returns the order of the allocation if this is an occupied header. + fn into_occupied(self) -> Option { + match self { + Self::Occupied(order) => Some(order), + _ => None, + } + } + + /// Returns the link to the next element in the free list if this is a free header. + fn into_free(self) -> Option { + match self { + Self::Free(link) => Some(link), + _ => None, + } + } +} + +/// This struct represents a collection of intrusive linked lists for each order. +struct FreeLists { + heads: [Link; N], +} + +impl FreeLists { + /// Creates the free empty lists. + fn new() -> Self { + Self { + heads: [Link::Null; N] + } + } + + /// Replaces a given link for the specified order and returns the old one. + fn replace(&mut self, order: Order, new: Link) -> Link { + let prev = self[order]; + self[order] = new; + prev + } +} + +impl Index for FreeLists { + type Output = Link; + fn index(&self, index: Order) -> &Link { + &self.heads[index.0 as usize] + } +} + +impl IndexMut for FreeLists { + fn index_mut(&mut self, index: Order) -> &mut Link { + &mut self.heads[index.0 as usize] + } +} + +/// An implementation of freeing bump allocator. +/// +/// Refer to the module-level documentation for further details. +pub struct FreeingBumpHeapAllocator { + bumper: u32, + free_lists: FreeLists, + total_size: u32, +} + 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. @@ -101,13 +302,11 @@ impl FreeingBumpHeapAllocator { /// /// - `heap_base` - the offset from the beginning of the linear memory where the heap starts. pub fn new(heap_base: u32) -> Self { - // ptr_offset is the next alignment boundary on or after heap_base. - let ptr_offset = (heap_base + ALIGNMENT - 1) / ALIGNMENT * ALIGNMENT; + let aligned_heap_base = (heap_base + ALIGNMENT - 1) / ALIGNMENT * ALIGNMENT; FreeingBumpHeapAllocator { - bumper: 0, - heads: [u32::max_value(); N], - ptr_offset, + bumper: aligned_heap_base, + free_lists: FreeLists::new(), total_size: 0, } } @@ -122,46 +321,42 @@ impl FreeingBumpHeapAllocator { /// /// - `mem` - a slice representing the linear memory on which this allocator operates. /// - `size` - size in bytes of the allocation request - pub fn allocate(&mut self, mem: &mut [u8], size: WordSize) -> Result, Error> { - let mem_size = u32::try_from(mem.len()) - .expect("size of Wasm linear memory is <2^32; qed"); - let max_heap_size = mem_size - self.ptr_offset; - - if size > MAX_POSSIBLE_ALLOCATION { - return Err(Error::RequestedAllocationTooLarge); - } - - let size = size.max(MIN_POSSIBLE_ALLOCATION); - let item_size = size.next_power_of_two(); - if item_size + PREFIX_SIZE + self.total_size > max_heap_size { - return Err(Error::AllocatorOutOfSpace); - } - - let list_index = (item_size.trailing_zeros() - 3) as usize; - let ptr: u32 = if self.heads[list_index] != u32::max_value() { - // Something from the free list - let ptr = self.heads[list_index]; - assert!( - ptr + item_size + PREFIX_SIZE <= max_heap_size, - "Pointer is looked up in list of free entries, into which - only valid values are inserted; qed" - ); - - self.heads[list_index] = self.get_heap_u64(mem, ptr)? - .try_into() - .map_err(|_| error("read invalid free list pointer"))?; - ptr - } else { - // Nothing to be freed. Bump. - self.bump(item_size, max_heap_size)? + pub fn allocate( + &mut self, + mem: &mut M, + size: WordSize, + ) -> Result, Error> { + let order = Order::from_size(size)?; + + let header_ptr: u32 = match self.free_lists[order] { + Link::Ptr(header_ptr) => { + assert!( + header_ptr + order.size() + HEADER_SIZE <= mem.size(), + "Pointer is looked up in list of free entries, into which + only valid values are inserted; qed" + ); + + // Remove this header from the free list. + let next_free = Header::read_from(mem, header_ptr)? + .into_free() + .ok_or_else(|| error("free list points to a occupied header"))?; + self.free_lists[order] = next_free; + + header_ptr + } + Link::Null => { + // Corresponding free list is empty. Allocate a new item. + self.bump(order.size() + HEADER_SIZE, mem.size())? + } }; - self.set_heap_u64(mem, ptr, list_index as u64)?; + // Write the order in the occupied header. + Header::Occupied(order).write_into(mem, header_ptr)?; - self.total_size = self.total_size + item_size + PREFIX_SIZE; + self.total_size += order.size() + HEADER_SIZE; trace!("Heap size is {} bytes after allocation", self.total_size); - Ok(Pointer::new(self.ptr_offset + ptr + PREFIX_SIZE)) + Ok(Pointer::new(header_ptr + HEADER_SIZE)) } /// Deallocates the space which was allocated for a pointer. @@ -170,80 +365,83 @@ impl FreeingBumpHeapAllocator { /// /// - `mem` - a slice representing the linear memory on which this allocator operates. /// - `ptr` - pointer to the allocated chunk - pub fn deallocate(&mut self, mem: &mut [u8], ptr: Pointer) -> Result<(), Error> { - let ptr = u32::from(ptr) - self.ptr_offset; - let ptr = ptr.checked_sub(PREFIX_SIZE).ok_or_else(|| - error("Invalid pointer for deallocation") - )?; - - let list_index: usize = self.get_heap_u64(mem, ptr)? - .try_into() - .map_err(|_| error("read invalid list index"))?; - if list_index > self.heads.len() { - return Err(error("read invalid list index")); - } - self.set_heap_u64(mem, ptr, self.heads[list_index] as u64)?; - self.heads[list_index] = ptr; - - let item_size = Self::get_item_size_from_index(list_index); - self.total_size = self.total_size.checked_sub(item_size as u32 + PREFIX_SIZE) + pub fn deallocate(&mut self, mem: &mut M, ptr: Pointer) -> Result<(), Error> { + let header_ptr = u32::from(ptr) + .checked_sub(HEADER_SIZE) + .ok_or_else(|| error("Invalid pointer for deallocation"))?; + + let order = Header::read_from(mem, header_ptr)? + .into_occupied() + .ok_or_else(|| error("the allocation points to an empty header"))?; + + // Update the just freed header and knit it back to the free list. + let prev_head = self.free_lists.replace(order, Link::Ptr(header_ptr)); + Header::Free(prev_head).write_into(mem, header_ptr)?; + + // Do the total_size book keeping. + self.total_size = self + .total_size + .checked_sub(order.size() + HEADER_SIZE) .ok_or_else(|| error("Unable to subtract from total heap size without overflow"))?; trace!("Heap size is {} bytes after deallocation", self.total_size); Ok(()) } - /// Increases the `bumper` by `item_size + PREFIX_SIZE`. + /// Increases the `bumper` by `size`. /// /// Returns the `bumper` from before the increase. /// Returns an `Error::AllocatorOutOfSpace` if the operation /// would exhaust the heap. - fn bump(&mut self, item_size: u32, max_heap_size: u32) -> Result { - if self.bumper + PREFIX_SIZE + item_size > max_heap_size { + fn bump(&mut self, size: u32, heap_end: u32) -> Result { + if self.bumper + size > heap_end { return Err(Error::AllocatorOutOfSpace); } let res = self.bumper; - self.bumper += item_size + PREFIX_SIZE; + self.bumper += size; Ok(res) } +} - fn get_item_size_from_index(index: usize) -> usize { - // we shift 1 by three places, since the first possible item size is 8 - 1 << 3 << index - } +/// A trait for abstraction of accesses to linear memory. +pub trait Memory { + /// Read a u64 from the heap in LE form. Used to read heap allocation prefixes. + fn read_le_u64(&self, ptr: u32) -> Result; + /// Write a u64 to the heap in LE form. Used to write heap allocation prefixes. + fn write_le_u64(&mut self, ptr: u32, val: u64) -> Result<(), Error>; + /// Returns the full size of the memory. + fn size(&self) -> u32; +} - // Read a u64 from the heap in LE form. Used to read heap allocation prefixes. - fn get_heap_u64(&self, heap: &[u8], offset: u32) -> Result { - let range = self.heap_range(offset, 8, heap.len()) - .ok_or_else(|| error("read out of heap bounds"))?; - let bytes = heap[range].try_into() +impl Memory for [u8] { + fn read_le_u64(&self, ptr: u32) -> Result { + let range = + heap_range(ptr, 8, self.len()).ok_or_else(|| error("read out of heap bounds"))?; + let bytes = self[range] + .try_into() .expect("[u8] slice of length 8 must be convertible to [u8; 8]"); Ok(u64::from_le_bytes(bytes)) } - - // Write a u64 to the heap in LE form. Used to write heap allocation prefixes. - fn set_heap_u64(&self, heap: &mut [u8], offset: u32, val: u64) -> Result<(), Error> { - let range = self.heap_range(offset, 8, heap.len()) - .ok_or_else(|| error("write out of heap bounds"))?; + fn write_le_u64(&mut self, ptr: u32, val: u64) -> Result<(), Error> { + let range = + heap_range(ptr, 8, self.len()).ok_or_else(|| error("write out of heap bounds"))?; let bytes = val.to_le_bytes(); - &mut heap[range].copy_from_slice(&bytes[..]); + &mut self[range].copy_from_slice(&bytes[..]); Ok(()) } + fn size(&self) -> u32 { + u32::try_from(self.len()).expect("size of Wasm linear memory is <2^32; qed") + } +} - fn heap_range(&self, offset: u32, length: u32, heap_len: usize) -> Option> { - let start = offset - .checked_add(self.ptr_offset)? - as usize; - let end = offset - .checked_add(self.ptr_offset)? - .checked_add(length)? - as usize; - if end <= heap_len { - Some(start..end) - } else { - None - } +fn heap_range(offset: u32, length: u32, heap_len: usize) -> Option> { + let start = offset as usize; + let end = offset.checked_add(length)? as usize; + if end <= heap_len { + Some(start..end) + } else { + None } } @@ -268,8 +466,8 @@ mod tests { let ptr = heap.allocate(&mut mem[..], 1).unwrap(); // then - // returned pointer must start right after `PREFIX_SIZE` - assert_eq!(ptr, to_pointer(PREFIX_SIZE)); + // returned pointer must start right after `HEADER_SIZE` + assert_eq!(ptr, to_pointer(HEADER_SIZE)); } #[test] @@ -300,14 +498,14 @@ mod tests { // then // a prefix of 8 bytes is prepended to each pointer - assert_eq!(ptr1, to_pointer(PREFIX_SIZE)); + assert_eq!(ptr1, to_pointer(HEADER_SIZE)); // the prefix of 8 bytes + the content of ptr1 padded to the lowest possible // item size of 8 bytes + the prefix of ptr1 assert_eq!(ptr2, to_pointer(24)); // ptr2 + its content of 16 bytes + the prefix of 8 bytes - assert_eq!(ptr3, to_pointer(24 + 16 + PREFIX_SIZE)); + assert_eq!(ptr3, to_pointer(24 + 16 + HEADER_SIZE)); } #[test] @@ -317,7 +515,7 @@ mod tests { let mut heap = FreeingBumpHeapAllocator::new(0); let ptr1 = heap.allocate(&mut mem[..], 1).unwrap(); // the prefix of 8 bytes is prepended to the pointer - assert_eq!(ptr1, to_pointer(PREFIX_SIZE)); + assert_eq!(ptr1, to_pointer(HEADER_SIZE)); let ptr2 = heap.allocate(&mut mem[..], 1).unwrap(); // the prefix of 8 bytes + the content of ptr 1 is prepended to the pointer @@ -329,7 +527,7 @@ mod tests { // then // then the heads table should contain a pointer to the // prefix of ptr2 in the leftmost entry - assert_eq!(heap.heads[0], u32::from(ptr2) - PREFIX_SIZE); + assert_eq!(heap.free_lists.heads[0], Link::Ptr(u32::from(ptr2) - HEADER_SIZE)); } #[test] @@ -341,13 +539,13 @@ mod tests { let ptr1 = heap.allocate(&mut mem[..], 1).unwrap(); // the prefix of 8 bytes is prepended to the pointer - assert_eq!(ptr1, to_pointer(padded_offset + PREFIX_SIZE)); + assert_eq!(ptr1, to_pointer(padded_offset + HEADER_SIZE)); let ptr2 = heap.allocate(&mut mem[..], 9).unwrap(); // the padded_offset + the previously allocated ptr (8 bytes prefix + // 8 bytes content) + the prefix of 8 bytes which is prepended to the // current pointer - assert_eq!(ptr2, to_pointer(padded_offset + 16 + PREFIX_SIZE)); + assert_eq!(ptr2, to_pointer(padded_offset + 16 + HEADER_SIZE)); // when heap.deallocate(&mut mem[..], ptr2).unwrap(); @@ -355,8 +553,8 @@ mod tests { // then // should have re-allocated - assert_eq!(ptr3, to_pointer(padded_offset + 16 + PREFIX_SIZE)); - assert_eq!(heap.heads, [u32::max_value(); N]); + assert_eq!(ptr3, to_pointer(padded_offset + 16 + HEADER_SIZE)); + assert_eq!(heap.free_lists.heads, [Link::Null; N]); } #[test] @@ -375,12 +573,12 @@ mod tests { heap.deallocate(&mut mem[..], ptr3).unwrap(); // then - assert_eq!(heap.heads[0], u32::from(ptr3) - PREFIX_SIZE); + assert_eq!(heap.free_lists.heads[0], Link::Ptr(u32::from(ptr3) - HEADER_SIZE)); let ptr4 = heap.allocate(&mut mem[..], 8).unwrap(); assert_eq!(ptr4, ptr3); - assert_eq!(heap.heads[0], u32::from(ptr2) - PREFIX_SIZE); + assert_eq!(heap.free_lists.heads[0], Link::Ptr(u32::from(ptr2) - HEADER_SIZE)); } #[test] @@ -404,8 +602,8 @@ mod tests { // given let mut mem = [0u8; PAGE_SIZE as usize]; let mut heap = FreeingBumpHeapAllocator::new(0); - let ptr1 = heap.allocate(&mut mem[..], (PAGE_SIZE / 2) - PREFIX_SIZE).unwrap(); - assert_eq!(ptr1, to_pointer(PREFIX_SIZE)); + let ptr1 = heap.allocate(&mut mem[..], (PAGE_SIZE / 2) - HEADER_SIZE).unwrap(); + assert_eq!(ptr1, to_pointer(HEADER_SIZE)); // when let ptr2 = heap.allocate(&mut mem[..], PAGE_SIZE / 2); @@ -428,7 +626,7 @@ mod tests { let ptr = heap.allocate(&mut mem[..], MAX_POSSIBLE_ALLOCATION).unwrap(); // then - assert_eq!(ptr, to_pointer(PREFIX_SIZE)); + assert_eq!(ptr, to_pointer(HEADER_SIZE)); } #[test] @@ -454,7 +652,7 @@ mod tests { let mut heap = FreeingBumpHeapAllocator::new(0); let ptr1 = heap.allocate(&mut mem[..], 32).unwrap(); - assert_eq!(ptr1, to_pointer(PREFIX_SIZE)); + assert_eq!(ptr1, to_pointer(HEADER_SIZE)); heap.deallocate(&mut mem[..], ptr1).expect("failed freeing ptr1"); assert_eq!(heap.total_size, 0); assert_eq!(heap.bumper, 40); @@ -466,7 +664,7 @@ mod tests { assert_eq!(heap.bumper, 64); // when - // the `bumper` value is equal to `max_heap_size` here and any + // the `bumper` value is equal to `size` here and any // further allocation which would increment the bumper must fail. // we try to allocate 8 bytes here, which will increment the // bumper since no 8 byte item has been allocated+freed before. @@ -490,7 +688,7 @@ mod tests { heap.allocate(&mut mem[..], 9).unwrap(); // then - assert_eq!(heap.total_size, PREFIX_SIZE + 16); + assert_eq!(heap.total_size, HEADER_SIZE + 16); } #[test] @@ -501,7 +699,7 @@ mod tests { // when let ptr = heap.allocate(&mut mem[..], 42).unwrap(); - assert_eq!(ptr, to_pointer(16 + PREFIX_SIZE)); + assert_eq!(ptr, to_pointer(16 + HEADER_SIZE)); heap.deallocate(&mut mem[..], ptr).unwrap(); // then @@ -528,23 +726,22 @@ mod tests { fn should_read_and_write_u64_correctly() { // given let mut mem = [0u8; PAGE_SIZE as usize]; - let heap = FreeingBumpHeapAllocator::new(16); // when - heap.set_heap_u64(&mut mem[..], 40, 4480113).unwrap(); + Memory::write_le_u64(mem.as_mut(), 40, 4480113).unwrap(); // then - let value = heap.get_heap_u64(&mut mem[..], 40).unwrap(); + let value = Memory::read_le_u64(mem.as_mut(), 40).unwrap(); assert_eq!(value, 4480113); } #[test] - fn should_get_item_size_from_index() { + fn should_get_item_size_from_order() { // given - let index = 0; + let raw_order = 0; // when - let item_size = FreeingBumpHeapAllocator::get_item_size_from_index(index); + let item_size = Order::from_raw(raw_order).unwrap().size(); // then assert_eq!(item_size, 8); @@ -553,10 +750,10 @@ mod tests { #[test] fn should_get_max_item_size_from_index() { // given - let index = 21; + let raw_order = 21; // when - let item_size = FreeingBumpHeapAllocator::get_item_size_from_index(index); + let item_size = Order::from_raw(raw_order).unwrap().size(); // then assert_eq!(item_size as u32, MAX_POSSIBLE_ALLOCATION); @@ -568,10 +765,27 @@ mod tests { let mut heap = FreeingBumpHeapAllocator::new(0); // Allocate and free some pointers - let ptrs = (0..4).map(|_| heap.allocate(&mut mem, 8).unwrap()).collect::>(); - ptrs.into_iter().for_each(|ptr| heap.deallocate(&mut mem, ptr).unwrap()); + let ptrs = (0..4).map(|_| heap.allocate(&mut mem[..], 8).unwrap()).collect::>(); + ptrs.into_iter().for_each(|ptr| heap.deallocate(&mut mem[..], ptr).unwrap()); // Second time we should be able to allocate all of them again. - let _ = (0..4).map(|_| heap.allocate(&mut mem, 8).unwrap()).collect::>(); + let _ = (0..4).map(|_| heap.allocate(&mut mem[..], 8).unwrap()).collect::>(); + } + + #[test] + fn header_read_write() { + let roundtrip = |header: Header| { + let mut memory = [0u8; 32]; + header.write_into(memory.as_mut(), 0).unwrap(); + + let read_header = Header::read_from(memory.as_mut(), 0).unwrap(); + assert_eq!(header, read_header); + }; + + roundtrip(Header::Occupied(Order(0))); + roundtrip(Header::Occupied(Order(1))); + roundtrip(Header::Free(Link::Null)); + roundtrip(Header::Free(Link::Ptr(0))); + roundtrip(Header::Free(Link::Ptr(4))); } } -- GitLab From d472cd6ef27c93a3f58b0c1efd0927fc49394387 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 10 Feb 2020 14:04:50 +0100 Subject: [PATCH 287/296] Avoid challenging those that can't be suspended anyway (#4804) * Merge branch 'gav-split-balanecs-vesting' into gav-upsub # Conflicts: # Cargo.lock # cli/Cargo.toml # collator/Cargo.toml # primitives/Cargo.toml # runtime/common/Cargo.toml # runtime/common/src/claims.rs # runtime/kusama/Cargo.toml # runtime/polkadot/Cargo.toml # service/Cargo.toml * Fix tests --- frame/society/src/lib.rs | 30 ++++++++++++++++++------------ frame/society/src/tests.rs | 14 +++++++------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index c1e1803c64..28220f1063 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -1536,18 +1536,24 @@ impl, I: Instance> Module { >::remove_all(); } - // Start a new defender rotation - let phrase = b"society_challenge"; - // we'll need a random seed here. - let seed = T::Randomness::random(phrase); - // seed needs to be guaranteed to be 32 bytes. - let seed = <[u8; 32]>::decode(&mut TrailingZeroInput::new(seed.as_ref())) - .expect("input is padded with zeroes; qed"); - let mut rng = ChaChaRng::from_seed(seed); - let chosen = pick_item(&mut rng, &members).expect("exited if members empty; qed"); - - >::put(&chosen); - Self::deposit_event(RawEvent::Challenged(chosen.clone())); + // Avoid challenging if there's only two members since we never challenge the Head or + // the Founder. + if members.len() > 2 { + // Start a new defender rotation + let phrase = b"society_challenge"; + // we'll need a random seed here. + let seed = T::Randomness::random(phrase); + // seed needs to be guaranteed to be 32 bytes. + let seed = <[u8; 32]>::decode(&mut TrailingZeroInput::new(seed.as_ref())) + .expect("input is padded with zeroes; qed"); + let mut rng = ChaChaRng::from_seed(seed); + let chosen = pick_item(&mut rng, &members[1..members.len() - 1]) + .expect("exited if members empty; qed"); + >::put(&chosen); + Self::deposit_event(RawEvent::Challenged(chosen.clone())); + } else { + >::kill(); + } } } diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs index 3e5afc47f5..47d13d8361 100644 --- a/frame/society/src/tests.rs +++ b/frame/society/src/tests.rs @@ -577,14 +577,14 @@ fn challenges_work() { assert_eq!(Society::defender(), None); // 20 will be challenged during the challenge rotation run_to_block(8); - assert_eq!(Society::defender(), Some(20)); + assert_eq!(Society::defender(), Some(30)); // They can always free vote for themselves - assert_ok!(Society::defender_vote(Origin::signed(20), true)); + assert_ok!(Society::defender_vote(Origin::signed(30), true)); // If no one else votes, nothing happens run_to_block(16); assert_eq!(Society::members(), vec![10, 20, 30, 40]); // New challenge period - assert_eq!(Society::defender(), Some(20)); + assert_eq!(Society::defender(), Some(30)); // Non-member cannot challenge assert_noop!(Society::defender_vote(Origin::signed(1), true), Error::::NotMember); // 3 people say accept, 1 reject @@ -601,7 +601,7 @@ fn challenges_work() { assert_eq!(>::get(30), None); assert_eq!(>::get(40), None); // One more time - assert_eq!(Society::defender(), Some(20)); + assert_eq!(Society::defender(), Some(30)); // 2 people say accept, 2 reject assert_ok!(Society::defender_vote(Origin::signed(10), true)); assert_ok!(Society::defender_vote(Origin::signed(20), true)); @@ -609,10 +609,10 @@ fn challenges_work() { assert_ok!(Society::defender_vote(Origin::signed(40), false)); run_to_block(32); // 20 is suspended - assert_eq!(Society::members(), vec![10, 30, 40]); - assert_eq!(Society::suspended_member(20), true); + assert_eq!(Society::members(), vec![10, 20, 40]); + assert_eq!(Society::suspended_member(30), true); // New defender is chosen - assert_eq!(Society::defender(), Some(40)); + assert_eq!(Society::defender(), Some(20)); // Votes are reset assert_eq!(>::get(10), None); assert_eq!(>::get(20), None); -- GitLab From b388338814c5040f6a6b84018430f799445b4876 Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Mon, 10 Feb 2020 14:27:40 +0100 Subject: [PATCH 288/296] Add trait to get module and call names. (#4854) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add trait to get module and call names. Co-authored-by: Bastian Köcher --- bin/node/runtime/src/lib.rs | 2 +- frame/support/src/dispatch.rs | 38 +++++++++++++++++++++++++++++++++++ frame/support/src/traits.rs | 6 ++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 0435755d19..be9dbb9686 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -82,7 +82,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 215, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/support/src/dispatch.rs b/frame/support/src/dispatch.rs index 85cf8d6ede..c2f42fd561 100644 --- a/frame/support/src/dispatch.rs +++ b/frame/support/src/dispatch.rs @@ -1346,6 +1346,14 @@ macro_rules! decl_module { $call_type::__PhantomItem(_, _) => unreachable!("__PhantomItem should never be used."), } } + + fn get_call_names() -> &'static [&'static str] { + &[ + $( + stringify!($fn_name), + )* + ] + } } // manual implementation of clone/eq/partialeq because using derive erroneously requires @@ -1518,6 +1526,24 @@ macro_rules! impl_outer_dispatch { }, )* } } + + fn get_module_names() -> &'static [&'static str] { + &[$( + stringify!($camelcase), + )*] + } + + fn get_call_names(module: &str) -> &'static [&'static str] { + use $crate::dispatch::{Callable, GetCallName}; + match module { + $( + stringify!($camelcase) => + <<$camelcase as Callable<$runtime>>::Call + as GetCallName>::get_call_names(), + )* + _ => unreachable!(), + } + } } impl $crate::dispatch::Dispatchable for $call_type { type Origin = $origin; @@ -2118,4 +2144,16 @@ mod tests { let expected = CallMetadata { function_name: "aux_3".into(), pallet_name: "Test".into() }; assert_eq!(metadata, expected); } + + #[test] + fn get_call_names() { + let call_names = Call::::get_call_names(); + assert_eq!(["aux_0", "aux_1", "aux_2", "aux_3", "aux_4", "aux_5", "operational"], call_names); + } + + #[test] + fn get_module_names() { + let module_names = OuterCall::get_module_names(); + assert_eq!(["Test"], module_names); + } } diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index f7701b4cd5..ba8a0d7ded 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -819,12 +819,18 @@ pub struct CallMetadata { /// Gets the function name of the Call. pub trait GetCallName { + /// Return all function names. + fn get_call_names() -> &'static [&'static str]; /// Return the function name of the Call. fn get_call_name(&self) -> &'static str; } /// Gets the metadata for the Call - function name and pallet name. pub trait GetCallMetadata { + /// Return all module names. + fn get_module_names() -> &'static [&'static str]; + /// Return all function names for the given `module`. + fn get_call_names(module: &str) -> &'static [&'static str]; /// Return a [`CallMetadata`], containing function and pallet name of the Call. fn get_call_metadata(&self) -> CallMetadata; } -- GitLab From 26a4b73931e636157a38a26a92f9103fe1b644c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 10 Feb 2020 14:49:42 +0100 Subject: [PATCH 289/296] Fix runtime-interface tests on windows (#4805) --- primitives/runtime-interface/test-wasm/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/primitives/runtime-interface/test-wasm/src/lib.rs b/primitives/runtime-interface/test-wasm/src/lib.rs index c6e2c9909f..467f58cb30 100644 --- a/primitives/runtime-interface/test-wasm/src/lib.rs +++ b/primitives/runtime-interface/test-wasm/src/lib.rs @@ -108,6 +108,7 @@ pub trait TestApi { /// Two random external functions from the old runtime interface. /// This ensures that we still inherently export these functions from the host and that we are still /// compatible with old wasm runtimes. +#[cfg(not(feature = "std"))] extern "C" { pub fn ext_clear_storage(key_data: *const u8, key_len: u32); pub fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); @@ -115,6 +116,7 @@ extern "C" { /// Make sure the old runtime interface needs to be imported. #[no_mangle] +#[cfg(not(feature = "std"))] pub fn force_old_runtime_interface_import() { unsafe { ext_clear_storage(sp_std::ptr::null(), 0); } unsafe { ext_keccak_256(sp_std::ptr::null(), 0, sp_std::ptr::null_mut()); } -- GitLab From 613a3bc895f1031e7ede7c7232ae256efe11d8b2 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 10 Feb 2020 22:21:38 +0300 Subject: [PATCH 290/296] update primitive types to 0.6.2 (#4866) --- Cargo.lock | 2 +- frame/evm/Cargo.toml | 2 +- primitives/arithmetic/Cargo.toml | 2 +- primitives/arithmetic/fuzzer/Cargo.toml | 2 +- primitives/core/Cargo.toml | 2 +- primitives/runtime-interface/Cargo.toml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b93b32fd93..76d3d004c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8269,7 +8269,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bfd5b7557925ce778ff9b9ef90e3ade34c524b5ff10e239c69a42d546d2af56" dependencies = [ - "rand 0.7.3", + "rand 0.3.23", ] [[package]] diff --git a/frame/evm/Cargo.toml b/frame/evm/Cargo.toml index b45bf6e31e..50d7b03672 100644 --- a/frame/evm/Cargo.toml +++ b/frame/evm/Cargo.toml @@ -16,7 +16,7 @@ sp-core = { version = "2.0.0", default-features = false, path = "../../primitive sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" } sp-std = { version = "2.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "2.0.0", default-features = false, path = "../../primitives/io" } -primitive-types = { version = "0.6", default-features = false, features = ["rlp"] } +primitive-types = { version = "0.6.2", default-features = false, features = ["rlp"] } rlp = { version = "0.4", default-features = false } evm = { version = "0.14", default-features = false } sha3 = { version = "0.8", default-features = false } diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index 1b6d36ca37..995e36d5c9 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -14,7 +14,7 @@ serde = { version = "1.0.101", optional = true, features = ["derive"] } sp-debug-derive = { version = "2.0.0", default-features = false, path = "../../primitives/debug-derive" } [dev-dependencies] -primitive-types = "0.6.0" +primitive-types = "0.6.2" rand = "0.7.2" criterion = "0.3" diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index 56e789f3e4..19d677f744 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0" [dependencies] sp-arithmetic = { version = "2.0.0", path = ".." } honggfuzz = "0.5" -primitive-types = "0.6" +primitive-types = "0.6.2" num-bigint = "0.2" num-traits = "0.2" diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 6f1ce2f080..574b9aa9cb 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -12,7 +12,7 @@ rustc-hex = { version = "2.0.1", default-features = false } log = { version = "0.4.8", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } byteorder = { version = "1.3.2", default-features = false } -primitive-types = { version = "0.6", default-features = false, features = ["codec"] } +primitive-types = { version = "0.6.2", default-features = false, features = ["codec"] } impl-serde = { version = "0.2.3", optional = true } wasmi = { version = "0.6.2", optional = true } hash-db = { version = "0.15.2", default-features = false } diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index 3f20de1288..cef3acdbfb 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -12,7 +12,7 @@ sp-runtime-interface-proc-macro = { version = "2.0.0", path = "proc-macro" } sp-externalities = { version = "0.8.0", optional = true, path = "../externalities" } codec = { package = "parity-scale-codec", version = "1.0.6", default-features = false } static_assertions = "1.0.0" -primitive-types = { version = "0.6.1", default-features = false } +primitive-types = { version = "0.6.2", default-features = false } [dev-dependencies] sp-runtime-interface-test-wasm = { version = "2.0.0", path = "test-wasm" } -- GitLab From 671cb85238ce18b23392e3298a399ee8ee64e98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 11 Feb 2020 00:41:59 +0100 Subject: [PATCH 291/296] Run offchain workers at hash, not number. (#4878) * Run offchain workers at particular hash, not number. * Don't run if not new best. * Don't run if not new best. * Update client/service/src/builder.rs Co-Authored-By: Nikolay Volf * Update client/service/src/builder.rs Co-Authored-By: Nikolay Volf * Update client/service/src/builder.rs Co-authored-by: Nikolay Volf --- client/db/src/utils.rs | 4 +++- client/offchain/src/lib.rs | 11 ++--------- client/service/src/builder.rs | 28 ++++++++++++++++++---------- primitives/blockchain/src/backend.rs | 10 +++++++--- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index f7f51d7f6d..534cbb2197 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -320,7 +320,9 @@ pub fn require_header( id: BlockId, ) -> sp_blockchain::Result { read_header(db, col_index, col, id) - .and_then(|header| header.ok_or_else(|| sp_blockchain::Error::UnknownBlock(format!("{}", id)))) + .and_then(|header| header.ok_or_else(|| + sp_blockchain::Error::UnknownBlock(format!("Require header: {}", id)) + )) } /// Read meta from the database. diff --git a/client/offchain/src/lib.rs b/client/offchain/src/lib.rs index f0a10a5409..fadfaa0134 100644 --- a/client/offchain/src/lib.rs +++ b/client/offchain/src/lib.rs @@ -97,7 +97,7 @@ impl OffchainWorkers< is_validator: bool, ) -> impl Future { let runtime = self.client.runtime_api(); - let at = BlockId::number(*header.number()); + let at = BlockId::hash(header.hash()); let has_api_v1 = runtime.has_api_with::, _>( &at, |v| v == 1 ); @@ -169,7 +169,6 @@ mod tests { use substrate_test_runtime_client::runtime::Block; use sc_transaction_pool::{BasicPool, FullChainApi}; use sp_transaction_pool::{TransactionPool, InPoolTransaction}; - use sp_runtime::{generic::Header, traits::Header as _}; struct MockNetworkStateInfo(); @@ -210,13 +209,7 @@ mod tests { .register_transaction_pool(Arc::downgrade(&pool.clone()) as _); let db = sc_client_db::offchain::LocalStorage::new_test(); let network_state = Arc::new(MockNetworkStateInfo()); - let header = Header::new( - 0u64, - Default::default(), - Default::default(), - Default::default(), - Default::default(), - ); + let header = client.header(&BlockId::number(0)).unwrap().unwrap(); // when let offchain = OffchainWorkers::new(client, db); diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 4d672006b8..e29c503402 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -898,16 +898,24 @@ ServiceBuilder< } let offchain = offchain.as_ref().and_then(|o| o.upgrade()); - if let Some(offchain) = offchain { - let future = offchain.on_block_imported( - ¬ification.header, - network_state_info.clone(), - is_validator - ); - let _ = to_spawn_tx_.unbounded_send(( - Box::pin(future), - From::from("offchain-on-block") - )); + match offchain { + Some(offchain) if notification.is_new_best => { + let future = offchain.on_block_imported( + ¬ification.header, + network_state_info.clone(), + is_validator, + ); + let _ = to_spawn_tx_.unbounded_send(( + Box::pin(future), + From::from("offchain-on-block"), + )); + }, + Some(_) => log::debug!( + target: "sc_offchain", + "Skipping offchain workers for non-canon block: {:?}", + notification.header, + ), + _ => {}, } ready(()) diff --git a/primitives/blockchain/src/backend.rs b/primitives/blockchain/src/backend.rs index 101dcd1443..35cac1e481 100644 --- a/primitives/blockchain/src/backend.rs +++ b/primitives/blockchain/src/backend.rs @@ -59,19 +59,23 @@ pub trait HeaderBackend: Send + Sync { /// Get block header. Returns `UnknownBlock` error if block is not found. fn expect_header(&self, id: BlockId) -> Result { - self.header(id)?.ok_or_else(|| Error::UnknownBlock(format!("{}", id))) + self.header(id)?.ok_or_else(|| Error::UnknownBlock(format!("Expect header: {}", id))) } /// Convert an arbitrary block ID into a block number. Returns `UnknownBlock` error if block is not found. fn expect_block_number_from_id(&self, id: &BlockId) -> Result> { self.block_number_from_id(id) - .and_then(|n| n.ok_or_else(|| Error::UnknownBlock(format!("{}", id)))) + .and_then(|n| n.ok_or_else(|| + Error::UnknownBlock(format!("Expect block number from id: {}", id)) + )) } /// Convert an arbitrary block ID into a block hash. Returns `UnknownBlock` error if block is not found. fn expect_block_hash_from_id(&self, id: &BlockId) -> Result { self.block_hash_from_id(id) - .and_then(|n| n.ok_or_else(|| Error::UnknownBlock(format!("{}", id)))) + .and_then(|n| n.ok_or_else(|| + Error::UnknownBlock(format!("Expect block hash from id: {}", id)) + )) } } -- GitLab From 50bb62fff79bb5c437634302d23fd97528369261 Mon Sep 17 00:00:00 2001 From: cheme Date: Tue, 11 Feb 2020 10:00:56 +0100 Subject: [PATCH 292/296] Use prefixed iterator from trie. (#4858) --- primitives/state-machine/src/trie_backend_essence.rs | 11 +++-------- primitives/trie/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/primitives/state-machine/src/trie_backend_essence.rs b/primitives/state-machine/src/trie_backend_essence.rs index 2598682ae0..125a823f57 100644 --- a/primitives/state-machine/src/trie_backend_essence.rs +++ b/primitives/state-machine/src/trie_backend_essence.rs @@ -23,7 +23,7 @@ use log::{debug, warn}; use hash_db::{self, Hasher, EMPTY_PREFIX, Prefix}; use sp_trie::{Trie, MemoryDB, PrefixedMemoryDB, DBValue, default_child_trie_root, read_trie_value, read_child_trie_value, - for_keys_in_child_trie, KeySpacedDB}; + for_keys_in_child_trie, KeySpacedDB, TrieDBIterator}; use sp_trie::trie_types::{TrieDB, TrieError, Layout}; use crate::{backend::Consolidate, StorageKey, StorageValue}; use sp_core::storage::ChildInfo; @@ -252,16 +252,11 @@ impl, H: Hasher> TrieBackendEssence where H::Out: let mut iter = move |db| -> Result<(), Box>> { let trie = TrieDB::::new(db, root)?; - let mut iter = trie.iter()?; - iter.seek(prefix)?; - - for x in iter { + for x in TrieDBIterator::new_prefixed(&trie, prefix)? { let (key, value) = x?; - if !key.starts_with(prefix) { - break; - } + debug_assert!(key.starts_with(prefix)); f(&key, &value); } diff --git a/primitives/trie/src/lib.rs b/primitives/trie/src/lib.rs index c71d3fb84c..0cf268856b 100644 --- a/primitives/trie/src/lib.rs +++ b/primitives/trie/src/lib.rs @@ -37,7 +37,7 @@ pub use trie_stream::TrieStream; pub use node_codec::NodeCodec; /// Various re-exports from the `trie-db` crate. pub use trie_db::{ - Trie, TrieMut, DBValue, Recorder, CError, Query, TrieLayout, TrieConfiguration, nibble_ops, + Trie, TrieMut, DBValue, Recorder, CError, Query, TrieLayout, TrieConfiguration, nibble_ops, TrieDBIterator, }; /// Various re-exports from the `memory-db` crate. pub use memory_db::KeyFunction; -- GitLab From a5a61df9c442339a8b67fc467ea990867431f355 Mon Sep 17 00:00:00 2001 From: Hayden Bakkum <53467950+hbakkum-dotstar@users.noreply.github.com> Date: Tue, 11 Feb 2020 22:35:58 +1300 Subject: [PATCH 293/296] Add support for json output in subkey (#4882) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add support for json output in subkey * Updates as per code review * Apply suggestions from code review Co-Authored-By: Nikolay Volf * Apply suggestions from code review Co-Authored-By: Bastian Köcher * Clean up error handler as per code review * Apply suggestions from code review Co-Authored-By: Marcio Diaz * Fix compilation error * Remove accidental file commit Co-authored-by: Nikolay Volf Co-authored-by: Bastian Köcher Co-authored-by: Marcio Diaz --- Cargo.lock | 1 + bin/utils/subkey/Cargo.toml | 1 + bin/utils/subkey/src/main.rs | 146 ++++++++++++++++++++++++++--------- 3 files changed, 112 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76d3d004c5..7564a72a01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7454,6 +7454,7 @@ dependencies = [ "rpassword", "rustc-hex", "sc-rpc", + "serde_json", "sp-core", "sp-runtime", "substrate-bip39", diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 9b7db6699f..d352cf28fa 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -28,6 +28,7 @@ derive_more = { version = "0.99.2" } sc-rpc = { version = "2.0.0", path = "../../../client/rpc" } jsonrpc-core-client = { version = "14.0.3", features = ["http"] } hyper = "0.12.35" +serde_json = "1.0" [features] bench = [] diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index c2fd7e28c2..52bacea384 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -25,6 +25,7 @@ use hex_literal::hex; use itertools::Itertools; use node_primitives::{Balance, Hash, Index, AccountId, Signature}; use node_runtime::{BalancesCall, Call, Runtime, SignedPayload, UncheckedExtrinsic, VERSION}; +use serde_json::json; use sp_core::{ crypto::{set_default_ss58_version, Ss58AddressFormat, Ss58Codec}, ed25519, sr25519, ecdsa, Pair, Public, H256, hexdisplay::HexDisplay, @@ -37,6 +38,24 @@ use std::{ mod rpc; mod vanity; +enum OutputType { + Json, + Text, +} + +impl<'a> TryFrom<&'a str> for OutputType { + type Error = (); + + fn try_from(s: &'a str) -> Result { + match s { + "json" => Ok(OutputType::Json), + "text" => Ok(OutputType::Text), + _ => Err(()), + } + } + +} + trait Crypto: Sized { type Pair: Pair; type Public: Public + Ss58Codec + AsRef<[u8]> + std::hash::Hash; @@ -55,50 +74,97 @@ trait Crypto: Sized { uri: &str, password: Option<&str>, network_override: Option, + output: OutputType, ) where ::Public: PublicT, { if let Ok((pair, seed)) = Self::Pair::from_phrase(uri, password) { let public_key = Self::public_from_pair(&pair); - println!("Secret phrase `{}` is account:\n \ - Secret seed: {}\n \ - Public key (hex): {}\n \ - Account ID: {}\n \ - SS58 Address: {}", - uri, - format_seed::(seed), - format_public_key::(public_key.clone()), - format_account_id::(public_key), - Self::ss58_from_pair(&pair) - ); + + match output { + OutputType::Json => { + let json = json!({ + "secretPhrase": uri, + "secretSeed": format_seed::(seed), + "publicKey": format_public_key::(public_key.clone()), + "accountId": format_account_id::(public_key), + "ss58Address": Self::ss58_from_pair(&pair), + }); + println!("{}", serde_json::to_string_pretty(&json).expect("Json pretty print failed")); + }, + OutputType::Text => { + println!("Secret phrase `{}` is account:\n \ + Secret seed: {}\n \ + Public key (hex): {}\n \ + Account ID: {}\n \ + SS58 Address: {}", + uri, + format_seed::(seed), + format_public_key::(public_key.clone()), + format_account_id::(public_key), + Self::ss58_from_pair(&pair), + ); + }, + } } else if let Ok((pair, seed)) = Self::Pair::from_string_with_seed(uri, password) { let public_key = Self::public_from_pair(&pair); - println!("Secret Key URI `{}` is account:\n \ - Secret seed: {}\n \ - Public key (hex): {}\n \ - Account ID: {}\n \ - SS58 Address: {}", - uri, - if let Some(seed) = seed { format_seed::(seed) } else { "n/a".into() }, - format_public_key::(public_key.clone()), - format_account_id::(public_key), - Self::ss58_from_pair(&pair) - ); + + match output { + OutputType::Json => { + let json = json!({ + "secretKeyUri": uri, + "secretSeed": if let Some(seed) = seed { format_seed::(seed) } else { "n/a".into() }, + "publicKey": format_public_key::(public_key.clone()), + "accountId": format_account_id::(public_key), + "ss58Address": Self::ss58_from_pair(&pair), + }); + println!("{}", serde_json::to_string_pretty(&json).expect("Json pretty print failed")); + }, + OutputType::Text => { + println!("Secret Key URI `{}` is account:\n \ + Secret seed: {}\n \ + Public key (hex): {}\n \ + Account ID: {}\n \ + SS58 Address: {}", + uri, + if let Some(seed) = seed { format_seed::(seed) } else { "n/a".into() }, + format_public_key::(public_key.clone()), + format_account_id::(public_key), + Self::ss58_from_pair(&pair), + ); + }, + } + } else if let Ok((public_key, v)) = ::Public::from_string_with_version(uri) { let v = network_override.unwrap_or(v); - println!("Public Key URI `{}` is account:\n \ - Network ID/version: {}\n \ - Public key (hex): {}\n \ - Account ID: {}\n \ - SS58 Address: {}", - uri, - String::from(v), - format_public_key::(public_key.clone()), - format_account_id::(public_key.clone()), - public_key.to_ss58check_with_version(v) - ); + + match output { + OutputType::Json => { + let json = json!({ + "publicKeyUri": uri, + "networkId": String::from(v), + "publicKey": format_public_key::(public_key.clone()), + "accountId": format_account_id::(public_key.clone()), + "ss58Address": public_key.to_ss58check_with_version(v), + }); + println!("{}", serde_json::to_string_pretty(&json).expect("Json pretty print failed")); + }, + OutputType::Text => { + println!("Public Key URI `{}` is account:\n \ + Network ID/version: {}\n \ + Public key (hex): {}\n \ + Account ID: {}\n \ + SS58 Address: {}", + uri, + String::from(v), + format_public_key::(public_key.clone()), + format_account_id::(public_key.clone()), + public_key.to_ss58check_with_version(v), + ); + }, + } } else { println!("Invalid phrase/URI given"); } @@ -165,6 +231,7 @@ fn get_usage() -> String { [network] -n, --network 'Specify a network. One of {}. Default is {}' [password] -p, --password 'The password for the key' --password-interactive 'You will be prompted for the password for the key.' + [output] -o, --output 'Specify an output format. One of text, json. Default is text.' ", networks, default_network) } @@ -329,13 +396,20 @@ where if let Some(network) = maybe_network { set_default_ss58_version(network); } + + let output: OutputType = match matches.value_of("output").map(TryInto::try_into) { + Some(Err(_)) => return Err(Error::Static("Invalid output name. See --help for available outputs.")), + Some(Ok(v)) => v, + None => OutputType::Text, + }; + match matches.subcommand() { ("generate", Some(matches)) => { let mnemonic = generate_mnemonic(matches)?; - C::print_from_uri(mnemonic.phrase(), password, maybe_network); + C::print_from_uri(mnemonic.phrase(), password, maybe_network, output); } ("inspect", Some(matches)) => { - C::print_from_uri(&get_uri("uri", &matches)?, password, maybe_network); + C::print_from_uri(&get_uri("uri", &matches)?, password, maybe_network, output); } ("sign", Some(matches)) => { let suri = get_uri("suri", &matches)?; @@ -364,7 +438,7 @@ where .unwrap_or_default(); let result = vanity::generate_key::(&desired)?; let formated_seed = format_seed::(result.seed); - C::print_from_uri(&formated_seed, None, maybe_network); + C::print_from_uri(&formated_seed, None, maybe_network, output); } ("transfer", Some(matches)) => { let signer = read_pair::(matches.value_of("from"), password)?; -- GitLab From 1dd662b5439841468a1f827a53731cb5ee91165b Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 11 Feb 2020 11:07:14 +0100 Subject: [PATCH 294/296] impl Randomness trait for Babe and remove unused RandomBeacon trait (#4886) * impl Randomness trait for Babe and remove unused RandomBeacon trait * bump runtime version --- bin/node/runtime/src/lib.rs | 2 +- frame/babe/src/lib.rs | 14 +++++++++----- frame/support/src/traits.rs | 5 ++++- primitives/runtime/src/traits.rs | 16 ---------------- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index be9dbb9686..ca6ce955e6 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -82,7 +82,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 215, - impl_version: 1, + impl_version: 2, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index 1578d5c556..e707b9a10b 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -23,10 +23,10 @@ pub use pallet_timestamp; use sp_std::{result, prelude::*}; -use frame_support::{decl_storage, decl_module, traits::FindAuthor, traits::Get}; +use frame_support::{decl_storage, decl_module, traits::{FindAuthor, Get, Randomness as RandomnessT}}; use sp_timestamp::OnTimestampSet; use sp_runtime::{generic::DigestItem, ConsensusEngineId, Perbill}; -use sp_runtime::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon}; +use sp_runtime::traits::{IsMember, SaturatedConversion, Saturating, Hash}; use sp_staking::{ SessionIndex, offence::{Offence, Kind}, @@ -191,9 +191,13 @@ decl_module! { } } -impl RandomnessBeacon for Module { - fn random() -> [u8; VRF_OUTPUT_LENGTH] { - Self::randomness() +impl RandomnessT<::Hash> for Module { + fn random(subject: &[u8]) -> T::Hash { + let mut subject = subject.to_vec(); + subject.reserve(VRF_OUTPUT_LENGTH); + subject.extend_from_slice(&Self::randomness()[..]); + + ::Hashing::hash(&subject[..]) } } diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index ba8a0d7ded..f456ef5bec 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -767,7 +767,10 @@ pub trait Randomness { /// Get a "random" value /// /// Being a deterministic blockchain, 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 + /// something that approximates it. At best, this will be randomness which was + /// hard to predict a long time ago, but that has become easy to predict recently. + /// + /// `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"[..])`. fn random(subject: &[u8]) -> Output; diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index e95fc073eb..645725e1bf 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -476,22 +476,6 @@ sp_core::impl_maybe_marker!( trait MaybeMallocSizeOf: parity_util_mem::MallocSizeOf; ); -/// A type that provides a randomness beacon. -pub trait RandomnessBeacon { - /// Returns 32 bytes of random data. The output will change eventually, but - /// is not guaranteed to be different between any two calls. - /// - /// # Security - /// - /// This MUST NOT be used for gambling, as it can be influenced by a - /// malicious validator in the short term. It MAY be used in many - /// cryptographic protocols, however, so long as one remembers that this - /// (like everything else on-chain) is public. For example, it can be - /// used where a number is needed that cannot have been chosen by an - /// adversary, for purposes such as public-coin zero-knowledge proofs. - fn random() -> [u8; 32]; -} - /// A type that can be used in runtime structures. pub trait Member: Send + Sync + Sized + Debug + Eq + PartialEq + Clone + 'static {} impl Member for T {} -- GitLab From 60f05698c9fefe7efe38e8d7508190f10a4fde7b Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 11 Feb 2020 12:22:25 +0100 Subject: [PATCH 295/296] Pause Kademlia if too many connections (#4828) * Pause Kademlia if too many connections * Fix test * Update client/network/src/discovery.rs Co-Authored-By: Toralf Wittner * Change the limit Co-authored-by: Toralf Wittner --- client/network/src/behaviour.rs | 4 +++- client/network/src/discovery.rs | 26 +++++++++++++++++++++----- client/network/src/service.rs | 1 + 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 8b903cec35..a1f54654b3 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -65,6 +65,7 @@ impl, H: ExHashT> Behaviour { known_addresses: Vec<(PeerId, Multiaddr)>, enable_mdns: bool, allow_private_ipv4: bool, + discovery_only_if_under_num: u64, ) -> Self { Behaviour { substrate, @@ -73,7 +74,8 @@ impl, H: ExHashT> Behaviour { local_public_key, known_addresses, enable_mdns, - allow_private_ipv4 + allow_private_ipv4, + discovery_only_if_under_num, ).await, events: Vec::new(), } diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index de49913b26..2da69e1894 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -87,6 +87,8 @@ pub struct DiscoveryBehaviour { /// If false, `addresses_of_peer` won't return any private IPv4 address, except for the ones /// stored in `user_defined`. allow_private_ipv4: bool, + /// Number of active connections over which we interrupt the discovery process. + discovery_only_if_under_num: u64, } impl DiscoveryBehaviour { @@ -98,6 +100,7 @@ impl DiscoveryBehaviour { user_defined: Vec<(PeerId, Multiaddr)>, enable_mdns: bool, allow_private_ipv4: bool, + discovery_only_if_under_num: u64, ) -> Self { if enable_mdns { #[cfg(target_os = "unknown")] @@ -120,6 +123,7 @@ impl DiscoveryBehaviour { local_peer_id: local_public_key.into_peer_id(), num_connections: 0, allow_private_ipv4, + discovery_only_if_under_num, #[cfg(not(target_os = "unknown"))] mdns: if enable_mdns { match Mdns::new() { @@ -331,11 +335,19 @@ where // Poll the stream that fires when we need to start a random Kademlia query. while let Poll::Ready(_) = self.next_kad_random_query.poll_unpin(cx) { - let random_peer_id = PeerId::random(); - debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ - {:?}", random_peer_id); + if self.num_connections < self.discovery_only_if_under_num { + let random_peer_id = PeerId::random(); + debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ + {:?}", random_peer_id); - self.kademlia.get_closest_peers(random_peer_id); + self.kademlia.get_closest_peers(random_peer_id); + } else { + debug!( + target: "sub-libp2p", + "Kademlia paused due to high number of connections ({})", + self.num_connections + ); + } // Schedule the next random query with exponentially increasing delay, // capped at 60 seconds. @@ -435,6 +447,10 @@ where NetworkBehaviourAction::GenerateEvent(event) => { match event { MdnsEvent::Discovered(list) => { + if self.num_connections >= self.discovery_only_if_under_num { + continue; + } + self.discoveries.extend(list.into_iter().map(|(peer_id, _)| peer_id)); if let Some(peer_id) = self.discoveries.pop_front() { let ev = DiscoveryOut::Discovered(peer_id); @@ -502,7 +518,7 @@ mod tests { let user_defined = user_defined.clone(); let keypair_public = keypair.public(); async move { - DiscoveryBehaviour::new(keypair_public, user_defined, false, true).await + DiscoveryBehaviour::new(keypair_public, user_defined, false, true, 50).await } }); let mut swarm = Swarm::new(transport, behaviour, keypair.public().into_peer_id()); diff --git a/client/network/src/service.rs b/client/network/src/service.rs index e3eaf6c31d..b4281112f6 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -232,6 +232,7 @@ impl, H: ExHashT> NetworkWorker TransportConfig::MemoryOnly => false, TransportConfig::Normal { allow_private_ipv4, .. } => allow_private_ipv4, }, + u64::from(params.network_config.out_peers) + 15, )); let (transport, bandwidth) = { let (config_mem, config_wasm) = match params.network_config.transport { -- GitLab From 657484a45b1f941b695c01ff3b944a4d81bd1849 Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Tue, 11 Feb 2020 13:59:52 +0100 Subject: [PATCH 296/296] Refactor tx factory 1 (#4870) * Remove modes. * Refactor. --- bin/node/cli/src/cli.rs | 33 +--- bin/node/cli/src/command.rs | 5 +- bin/node/cli/src/factory_impl.rs | 124 +++--------- .../transaction-factory/src/complex_mode.rs | 157 --------------- bin/node/transaction-factory/src/lib.rs | 182 ++++++++---------- bin/node/transaction-factory/src/modes.rs | 40 ---- .../transaction-factory/src/simple_modes.rs | 112 ----------- 7 files changed, 113 insertions(+), 540 deletions(-) delete mode 100644 bin/node/transaction-factory/src/complex_mode.rs delete mode 100644 bin/node/transaction-factory/src/modes.rs delete mode 100644 bin/node/transaction-factory/src/simple_modes.rs diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index dd3ee4a596..7844c2c0a5 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -52,34 +52,13 @@ pub enum Subcommand { /// 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, + /// Number of blocks to generate. + #[structopt(long="blocks", default_value = "1")] + pub blocks: u32, - /// 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: node_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, + /// Number of transactions to push per block. + #[structopt(long="transactions", default_value = "8")] + pub transactions: u32, #[allow(missing_docs)] #[structopt(flatten)] diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 3bfed148f5..61d1051796 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -67,9 +67,8 @@ where } let factory_state = FactoryState::new( - cli_args.mode.clone(), - cli_args.num, - cli_args.rounds, + cli_args.blocks, + cli_args.transactions, ); let service_builder = new_full_start!(config).0; diff --git a/bin/node/cli/src/factory_impl.rs b/bin/node/cli/src/factory_impl.rs index a1c5a5f4e0..1d1eabe29c 100644 --- a/bin/node/cli/src/factory_impl.rs +++ b/bin/node/cli/src/factory_impl.rs @@ -33,7 +33,6 @@ use sp_runtime::{ generic::Era, traits::{Block as BlockT, Header as HeaderT, SignedExtension, Verify, IdentifyAccount} }; use node_transaction_factory::RuntimeAdapter; -use node_transaction_factory::modes::Mode; use sp_inherents::InherentData; use sp_timestamp; use sp_finality_tracker; @@ -41,14 +40,10 @@ use sp_finality_tracker; type AccountPublic = ::Signer; pub struct FactoryState { - block_no: N, - - mode: Mode, - start_number: u32, - rounds: u32, - round: u32, - block_in_round: u32, - num: u32, + blocks: u32, + transactions: u32, + block_number: N, + index: u32, } type Number = <::Header as HeaderT>::Number; @@ -78,63 +73,35 @@ impl RuntimeAdapter for FactoryState { type Number = Number; fn new( - mode: Mode, - num: u64, - rounds: u64, + blocks: u32, + transactions: u32, ) -> FactoryState { FactoryState { - mode, - num: num as u32, - round: 0, - rounds: rounds as u32, - block_in_round: 0, - block_no: 0, - start_number: 0, + blocks, + transactions, + block_number: 0, + index: 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 block_number(&self) -> u32 { + self.block_number } - fn set_block_no(&mut self, val: Self::Number) { - self.block_no = val; + fn blocks(&self) -> u32 { + self.blocks } - fn set_block_in_round(&mut self, val: Self::Number) { - self.block_in_round = val; + fn transactions(&self) -> u32 { + self.transactions } - fn set_round(&mut self, val: Self::Number) { - self.round = val; + fn set_block_number(&mut self, value: u32) { + self.block_number = value; } fn transfer_extrinsic( - &self, + &mut self, sender: &Self::AccountId, key: &Self::Secret, destination: &Self::AccountId, @@ -143,10 +110,12 @@ impl RuntimeAdapter for FactoryState { genesis_hash: &::Hash, prior_block_hash: &::Hash, ) -> ::Extrinsic { - let index = self.extract_index(&sender, prior_block_hash); - let phase = self.extract_phase(*prior_block_hash); + let phase = self.block_number() as Self::Phase; + let extra = Self::build_extra(self.index, phase); + self.index += 1; + sign::(CheckedExtrinsic { - signed: Some((sender.clone(), Self::build_extra(index, phase))), + signed: Some((sender.clone(), extra)), function: Call::Balances( BalancesCall::transfer( pallet_indices::address::Address::Id(destination.clone().into()), @@ -157,12 +126,12 @@ impl RuntimeAdapter for FactoryState { } fn inherent_extrinsics(&self) -> InherentData { - let timestamp = (self.block_no as u64 + 1) * MinimumPeriod::get(); + let timestamp = (self.block_number as u64 + 1) * MinimumPeriod::get(); let mut inherent = InherentData::new(); inherent.put_data(sp_timestamp::INHERENT_IDENTIFIER, ×tamp) .expect("Failed putting timestamp inherent"); - inherent.put_data(sp_finality_tracker::INHERENT_IDENTIFIER, &self.block_no) + inherent.put_data(sp_finality_tracker::INHERENT_IDENTIFIER, &self.block_number) .expect("Failed putting finalized number inherent"); inherent } @@ -180,49 +149,16 @@ 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)); + fn gen_random_account_id(seed: u32) -> Self::AccountId { + let pair: sr25519::Pair = sr25519::Pair::from_seed(&gen_seed_bytes(seed)); AccountPublic::from(pair.public()).into_account() } /// 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)); + fn gen_random_account_secret(seed: u32) -> 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() as Self::Index - } else { - match self.round() { - 0 => - // if round is 0 all transactions will be done with master as a sender - self.block_no() as Self::Index, - _ => - // 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() as Self::Phase - } } fn gen_seed_bytes(seed: u32) -> [u8; 32] { diff --git a/bin/node/transaction-factory/src/complex_mode.rs b/bin/node/transaction-factory/src/complex_mode.rs deleted file mode 100644 index 6d7e60c8d3..0000000000 --- a/bin/node/transaction-factory/src/complex_mode.rs +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2019-2020 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 sc_client::Client; -use sp_block_builder::BlockBuilder; -use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi}; -use sp_runtime::generic::BlockId; -use sp_runtime::traits::{Block as BlockT, One, Zero}; - -use crate::{RuntimeAdapter, create_block}; - -pub fn next( - factory_state: &mut RA, - client: &Arc>, - version: u32, - genesis_hash: ::Hash, - prior_block_hash: ::Hash, - prior_block_id: BlockId, -) -> Option -where - Block: BlockT, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilder + - sp_api::ApiExt, - RtApi: ConstructRuntimeApi> + Send + Sync, - 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 rounds_left = factory_state.rounds() - factory_state.round(); - let amount = RA::minimum_balance() * rounds_left.into(); - - let transfer = factory_state.transfer_extrinsic( - &from.0, - &from.1, - &to, - &amount, - version, - &genesis_hash, - &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/bin/node/transaction-factory/src/lib.rs b/bin/node/transaction-factory/src/lib.rs index a0c6a4f663..12c24e4f2f 100644 --- a/bin/node/transaction-factory/src/lib.rs +++ b/bin/node/transaction-factory/src/lib.rs @@ -39,11 +39,6 @@ use sp_runtime::generic::BlockId; use sp_runtime::traits::{ Block as BlockT, Header as HeaderT, SimpleArithmetic, One, Zero, }; -pub use crate::modes::Mode; - -pub mod modes; -mod complex_mode; -mod simple_modes; pub trait RuntimeAdapter { type AccountId: Display; @@ -54,22 +49,16 @@ pub trait RuntimeAdapter { type Phase: Copy; type Secret; - fn new(mode: Mode, rounds: u64, start_number: u64) -> Self; + fn new(blocks: u32, transactions: u32) -> 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 blocks(&self) -> u32; + fn transactions(&self) -> u32; - 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 block_number(&self) -> u32; + fn set_block_number(&mut self, value: u32); fn transfer_extrinsic( - &self, + &mut self, sender: &Self::AccountId, key: &Self::Secret, destination: &Self::AccountId, @@ -84,14 +73,12 @@ pub trait RuntimeAdapter { fn minimum_balance() -> Self::Balance; 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; + + fn gen_random_account_id(seed: u32) -> Self::AccountId; + fn gen_random_account_secret(seed: u32) -> Self::Secret; } -/// Manufactures transactions. The exact amount depends on -/// `mode`, `num` and `rounds`. +/// Manufactures transactions. The exact amount depends on `num` and `rounds`. pub fn factory( mut factory_state: RA, client: &Arc>, @@ -110,11 +97,6 @@ where RA: RuntimeAdapter, Block::Hash: From, { - if *factory_state.mode() != Mode::MasterToNToM && factory_state.rounds() > RA::Number::one() { - let msg = "The factory can only be used with rounds set to 1 in this mode.".into(); - return Err(sc_cli::error::Error::Input(msg)); - } - let best_header: Result<::Header, sc_cli::error::Error> = select_chain.best_chain().map_err(|e| format!("{:?}", e).into()); let mut best_hash = best_header?.hash(); @@ -123,89 +105,75 @@ where let genesis_hash = client.block_hash(Zero::zero())? .expect("Genesis block always exists; qed").into(); - while let Some(block) = match factory_state.mode() { - Mode::MasterToNToM => complex_mode::next::( - &mut factory_state, - &client, - version, - genesis_hash, - best_hash.into(), - best_block_id, - ), - _ => simple_modes::next::( - &mut factory_state, - &client, - version, - genesis_hash, - best_hash.into(), - best_block_id, - ), - } { + while factory_state.block_number() < factory_state.blocks() { + let from = (RA::master_account_id(), RA::master_account_secret()); + let amount = RA::minimum_balance(); + + let inherents = RA::inherent_extrinsics(&factory_state); + let inherents = client.runtime_api().inherent_extrinsics(&best_block_id, inherents) + .expect("Failed to create inherent extrinsics"); + + let tx_per_block = factory_state.transactions(); + + let mut block = client.new_block(Default::default()).expect("Failed to create new block"); + + for tx_num in 0..tx_per_block { + let seed = tx_num * (factory_state.block_number() + 1); + let to = RA::gen_random_account_id(seed); + + let transfer = factory_state.transfer_extrinsic( + &from.0, + &from.1, + &to, + &amount, + version, + &genesis_hash, + &best_hash, + ); + + info!("Pushing transfer {}/{} to {} into block.", tx_num + 1, tx_per_block, to); + + block.push( + Decode::decode(&mut &transfer.encode()[..]) + .expect("Failed to decode transfer extrinsic") + ).expect("Failed to push transfer extrinsic into block"); + } + + for inherent in inherents { + block.push(inherent).expect("Failed ..."); + } + + let block = block.build().expect("Failed to bake block").block; + + factory_state.set_block_number(factory_state.block_number() + 1); + + info!( + "Created block {} with hash {}.", + factory_state.block_number(), + best_hash, + ); + best_hash = block.header().hash(); best_block_id = BlockId::::hash(best_hash); - import_block(client.clone(), block); - info!("Imported block at {}", factory_state.block_no()); + let import = BlockImportParams { + origin: BlockOrigin::File, + header: block.header().clone(), + post_digests: Vec::new(), + body: Some(block.extrinsics().to_vec()), + storage_changes: None, + finalized: false, + justification: None, + auxiliary: Vec::new(), + intermediates: Default::default(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), + allow_missing_state: false, + import_existing: false, + }; + client.clone().import_block(import, HashMap::new()).expect("Failed to import block"); + + info!("Imported block at {}", factory_state.block_number()); } 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 - Block: BlockT, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, - RtApi: ConstructRuntimeApi> + Send + Sync, - as ProvideRuntimeApi>::Api: - BlockBuilder + - ApiExt, - RA: RuntimeAdapter, -{ - 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") - ).expect("Failed to push transfer extrinsic into block"); - - for inherent in inherent_extrinsics { - block.push(inherent).expect("Failed ..."); - } - - block.build().expect("Failed to bake block").block -} - -fn import_block( - mut client: Arc>, - block: Block -) -> () where - Block: BlockT, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - sp_api::Core + - ApiExt, -{ - let import = BlockImportParams { - origin: BlockOrigin::File, - header: block.header().clone(), - post_digests: Vec::new(), - body: Some(block.extrinsics().to_vec()), - storage_changes: None, - finalized: false, - justification: None, - auxiliary: Vec::new(), - intermediates: Default::default(), - fork_choice: Some(ForkChoiceStrategy::LongestChain), - allow_missing_state: false, - import_existing: false, - }; - client.import_block(import, HashMap::new()).expect("Failed to import block"); -} diff --git a/bin/node/transaction-factory/src/modes.rs b/bin/node/transaction-factory/src/modes.rs deleted file mode 100644 index 5deab7635e..0000000000 --- a/bin/node/transaction-factory/src/modes.rs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2019-2020 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/bin/node/transaction-factory/src/simple_modes.rs b/bin/node/transaction-factory/src/simple_modes.rs deleted file mode 100644 index fba328731a..0000000000 --- a/bin/node/transaction-factory/src/simple_modes.rs +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2019-2020 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 sc_client::Client; -use sp_block_builder::BlockBuilder; -use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi}; -use sp_runtime::traits::{Block as BlockT, One}; -use sp_runtime::generic::BlockId; - -use crate::{Mode, RuntimeAdapter, create_block}; - -pub fn next( - factory_state: &mut RA, - client: &Arc>, - version: u32, - genesis_hash: ::Hash, - prior_block_hash: ::Hash, - prior_block_id: BlockId, -) -> Option -where - Block: BlockT, - Exec: sc_client::CallExecutor + Send + Sync + Clone, - Backend: sc_client_api::backend::Backend + Send, - Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: - BlockBuilder + - sp_api::ApiExt, - RtApi: ConstructRuntimeApi> + Send + Sync, - 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, - version, - &genesis_hash, - &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

{ - fn clone(&self) -> Self { - Self { - inner: self.inner.clone() - } - } -} - pub fn extract_type_option(typ: &syn::Type) -> Option { if let syn::Type::Path(ref path) = typ { let v = path.path.segments.last()?; -- GitLab From d56db2b99273de08b95ef890362d29b3bd63925e Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Sat, 25 Jan 2020 23:53:08 +0100 Subject: [PATCH 184/296] Cursed implementation of allowing missing imports on wasmtime (#4730) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Quick and dirty impl. * Clean up * Check the signatures. * Fix tests. * Apply suggestions from code review Co-Authored-By: Bastian Köcher * Ignore non function members. Co-authored-by: Bastian Köcher --- client/executor/src/integration_tests/mod.rs | 90 +++++------- client/executor/src/lib.rs | 8 +- client/executor/src/wasm_runtime.rs | 6 +- client/executor/wasmi/src/lib.rs | 34 ++--- client/executor/wasmtime/src/runtime.rs | 140 ++++++++++++++++++- client/executor/wasmtime/src/util.rs | 18 +++ 6 files changed, 215 insertions(+), 81 deletions(-) diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 00f4eb33b0..5b2fc5ca0c 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -31,48 +31,6 @@ use sp_trie::{TrieConfiguration, trie_types::Layout}; use crate::WasmExecutionMethod; pub type TestExternalities = CoreTestExternalities; - -#[cfg(feature = "wasmtime")] -mod wasmtime_missing_externals { - use sp_wasm_interface::{Function, FunctionContext, HostFunctions, Result, Signature, Value}; - - pub struct WasmtimeHostFunctions; - - impl HostFunctions for WasmtimeHostFunctions { - fn host_functions() -> Vec<&'static dyn Function> { - vec![MISSING_EXTERNAL_FUNCTION, YET_ANOTHER_MISSING_EXTERNAL_FUNCTION] - } - } - - struct MissingExternalFunction(&'static str); - - impl Function for MissingExternalFunction { - fn name(&self) -> &str { self.0 } - - fn signature(&self) -> Signature { - Signature::new(vec![], None) - } - - fn execute( - &self, - _context: &mut dyn FunctionContext, - _args: &mut dyn Iterator, - ) -> Result> { - panic!("should not be called"); - } - } - - static MISSING_EXTERNAL_FUNCTION: &'static MissingExternalFunction = - &MissingExternalFunction("missing_external"); - static YET_ANOTHER_MISSING_EXTERNAL_FUNCTION: &'static MissingExternalFunction = - &MissingExternalFunction("yet_another_missing_external"); -} - -#[cfg(feature = "wasmtime")] -type HostFunctions = - (wasmtime_missing_externals::WasmtimeHostFunctions, sp_io::SubstrateHostFunctions); - -#[cfg(not(feature = "wasmtime"))] type HostFunctions = sp_io::SubstrateHostFunctions; fn call_in_wasm( @@ -114,40 +72,66 @@ fn returning_should_work(wasm_method: WasmExecutionMethod) { #[test_case(WasmExecutionMethod::Interpreted)] #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] -#[should_panic(expected = "Function `missing_external` is only a stub. Calling a stub is not allowed.")] -#[cfg(not(feature = "wasmtime"))] fn call_not_existing_function(wasm_method: WasmExecutionMethod) { - let mut ext = TestExternalities::default(); - let mut ext = ext.ext(); - let test_code = WASM_BINARY; + let mut ext = TestExternalities::default(); + let mut ext = ext.ext(); + let test_code = WASM_BINARY; - call_in_wasm( + match call_in_wasm( "test_calling_missing_external", &[], wasm_method, &mut ext, &test_code[..], 8, - ).unwrap(); + ) { + Ok(_) => panic!("was expected an `Err`"), + Err(e) => { + match wasm_method { + WasmExecutionMethod::Interpreted => assert_eq!( + &format!("{:?}", e), + "Wasmi(Trap(Trap { kind: Host(Other(\"Function `missing_external` is only a stub. Calling a stub is not allowed.\")) }))" + ), + #[cfg(feature = "wasmtime")] + WasmExecutionMethod::Compiled => assert_eq!( + &format!("{:?}", e), + "Other(\"call to undefined external function with index 67\")" + ), + } + } + } } #[test_case(WasmExecutionMethod::Interpreted)] #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] -#[should_panic(expected = "Function `yet_another_missing_external` is only a stub. Calling a stub is not allowed.")] -#[cfg(not(feature = "wasmtime"))] fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { let mut ext = TestExternalities::default(); let mut ext = ext.ext(); let test_code = WASM_BINARY; - call_in_wasm( + match call_in_wasm( "test_calling_yet_another_missing_external", &[], wasm_method, &mut ext, &test_code[..], 8, - ).unwrap(); + ) { + Ok(_) => panic!("was expected an `Err`"), + Err(e) => { + match wasm_method { + WasmExecutionMethod::Interpreted => assert_eq!( + &format!("{:?}", e), + "Wasmi(Trap(Trap { kind: Host(Other(\"Function `yet_another_missing_external` is only a stub. Calling a stub is not allowed.\")) }))" + ), + #[cfg(feature = "wasmtime")] + WasmExecutionMethod::Compiled => assert_eq!( + &format!("{:?}", e), + "Other(\"call to undefined external function with index 68\")" + ), + } + } + } } #[test_case(WasmExecutionMethod::Interpreted)] diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index a054f4dc76..152e3a4984 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -68,7 +68,7 @@ pub fn call_in_wasm( ext: &mut dyn Externalities, code: &[u8], heap_pages: u64, - allow_missing_imports: bool, + allow_missing_func_imports: bool, ) -> error::Result> { call_in_wasm_with_host_functions( function, @@ -78,7 +78,7 @@ pub fn call_in_wasm( code, heap_pages, HF::host_functions(), - allow_missing_imports, + allow_missing_func_imports, ) } @@ -92,14 +92,14 @@ pub fn call_in_wasm_with_host_functions( code: &[u8], heap_pages: u64, host_functions: Vec<&'static dyn sp_wasm_interface::Function>, - allow_missing_imports: bool, + allow_missing_func_imports: bool, ) -> error::Result> { let instance = wasm_runtime::create_wasm_runtime_with_code( execution_method, heap_pages, code, host_functions, - allow_missing_imports, + allow_missing_func_imports, )?; // It is safe, as we delete the instance afterwards. diff --git a/client/executor/src/wasm_runtime.rs b/client/executor/src/wasm_runtime.rs index 036b28f764..b8966c3af2 100644 --- a/client/executor/src/wasm_runtime.rs +++ b/client/executor/src/wasm_runtime.rs @@ -191,15 +191,15 @@ pub fn create_wasm_runtime_with_code( heap_pages: u64, code: &[u8], host_functions: Vec<&'static dyn Function>, - allow_missing_imports: bool, + allow_missing_func_imports: bool, ) -> Result, WasmError> { match wasm_method { WasmExecutionMethod::Interpreted => - sc_executor_wasmi::create_instance(code, heap_pages, host_functions, allow_missing_imports) + sc_executor_wasmi::create_instance(code, heap_pages, host_functions, allow_missing_func_imports) .map(|runtime| -> Box { Box::new(runtime) }), #[cfg(feature = "wasmtime")] WasmExecutionMethod::Compiled => - sc_executor_wasmtime::create_instance(code, heap_pages, host_functions) + sc_executor_wasmtime::create_instance(code, heap_pages, host_functions, allow_missing_func_imports) .map(|runtime| -> Box { Box::new(runtime) }), } } diff --git a/client/executor/wasmi/src/lib.rs b/client/executor/wasmi/src/lib.rs index d3d0ee6e1e..cf8125e774 100644 --- a/client/executor/wasmi/src/lib.rs +++ b/client/executor/wasmi/src/lib.rs @@ -38,7 +38,7 @@ struct FunctionExecutor<'a> { memory: MemoryRef, table: Option, host_functions: &'a [&'static dyn Function], - allow_missing_imports: bool, + allow_missing_func_imports: bool, missing_functions: &'a [String], } @@ -48,7 +48,7 @@ impl<'a> FunctionExecutor<'a> { heap_base: u32, t: Option, host_functions: &'a [&'static dyn Function], - allow_missing_imports: bool, + allow_missing_func_imports: bool, missing_functions: &'a [String], ) -> Result { Ok(FunctionExecutor { @@ -57,7 +57,7 @@ impl<'a> FunctionExecutor<'a> { memory: m, table: t, host_functions, - allow_missing_imports, + allow_missing_func_imports, missing_functions, }) } @@ -273,15 +273,15 @@ impl<'a> Sandbox for FunctionExecutor<'a> { struct Resolver<'a> { host_functions: &'a[&'static dyn Function], - allow_missing_imports: bool, + allow_missing_func_imports: bool, missing_functions: RefCell>, } impl<'a> Resolver<'a> { - fn new(host_functions: &'a[&'static dyn Function], allow_missing_imports: bool) -> Resolver<'a> { + fn new(host_functions: &'a[&'static dyn Function], allow_missing_func_imports: bool) -> Resolver<'a> { Resolver { host_functions, - allow_missing_imports, + allow_missing_func_imports, missing_functions: RefCell::new(Vec::new()), } } @@ -311,7 +311,7 @@ impl<'a> wasmi::ModuleImportResolver for Resolver<'a> { } } - if self.allow_missing_imports { + if self.allow_missing_func_imports { trace!(target: "wasm-executor", "Could not find function `{}`, a stub will be provided instead.", name); let id = self.missing_functions.borrow().len() + self.host_functions.len(); self.missing_functions.borrow_mut().push(name.to_string()); @@ -336,7 +336,7 @@ impl<'a> wasmi::Externals for FunctionExecutor<'a> { .map_err(|msg| Error::FunctionExecution(function.name().to_string(), msg)) .map_err(wasmi::Trap::from) .map(|v| v.map(Into::into)) - } else if self.allow_missing_imports + } else if self.allow_missing_func_imports && index >= self.host_functions.len() && index < self.host_functions.len() + self.missing_functions.len() { @@ -381,7 +381,7 @@ fn call_in_wasm_module( method: &str, data: &[u8], host_functions: &[&'static dyn Function], - allow_missing_imports: bool, + allow_missing_func_imports: bool, missing_functions: &Vec, ) -> Result, Error> { // extract a reference to a linear memory, optional reference to a table @@ -397,7 +397,7 @@ fn call_in_wasm_module( heap_base, table, host_functions, - allow_missing_imports, + allow_missing_func_imports, missing_functions, )?; @@ -433,9 +433,9 @@ fn instantiate_module( heap_pages: usize, module: &Module, host_functions: &[&'static dyn Function], - allow_missing_imports: bool, + allow_missing_func_imports: bool, ) -> Result<(ModuleRef, Vec), Error> { - let resolver = Resolver::new(host_functions, allow_missing_imports); + let resolver = Resolver::new(host_functions, allow_missing_func_imports); // start module instantiation. Don't run 'start' function yet. let intermediate_instance = ModuleInstance::new( module, @@ -575,7 +575,7 @@ pub struct WasmiRuntime { host_functions: Vec<&'static dyn Function>, /// Enable stub generation for functions that are not available in `host_functions`. /// These stubs will error when the wasm blob tries to call them. - allow_missing_imports: bool, + allow_missing_func_imports: bool, /// List of missing functions detected during function resolution missing_functions: Vec, } @@ -607,7 +607,7 @@ impl WasmRuntime for WasmiRuntime { method, data, &self.host_functions, - self.allow_missing_imports, + self.allow_missing_func_imports, &self.missing_functions, ) } @@ -617,7 +617,7 @@ pub fn create_instance( code: &[u8], heap_pages: u64, host_functions: Vec<&'static dyn Function>, - allow_missing_imports: bool, + allow_missing_func_imports: bool, ) -> Result { let module = Module::from_buffer(&code).map_err(|_| WasmError::InvalidModule)?; @@ -632,7 +632,7 @@ pub fn create_instance( heap_pages as usize, &module, &host_functions, - allow_missing_imports, + allow_missing_func_imports, ).map_err(|e| WasmError::Instantiation(e.to_string()))?; // Take state snapshot before executing anything. @@ -648,7 +648,7 @@ pub fn create_instance( instance, state_snapshot, host_functions, - allow_missing_imports, + allow_missing_func_imports, missing_functions, }) } diff --git a/client/executor/wasmtime/src/runtime.rs b/client/executor/wasmtime/src/runtime.rs index f9b1b6209c..77a11ddc7d 100644 --- a/client/executor/wasmtime/src/runtime.rs +++ b/client/executor/wasmtime/src/runtime.rs @@ -18,7 +18,12 @@ use crate::function_executor::FunctionExecutorState; use crate::trampoline::{EnvState, make_trampoline}; -use crate::util::{cranelift_ir_signature, read_memory_into, write_memory_from}; +use crate::util::{ + cranelift_ir_signature, + convert_parity_wasm_signature, + read_memory_into, + write_memory_from +}; use sc_executor_common::{ error::{Error, Result, WasmError}, @@ -86,8 +91,9 @@ pub fn create_instance( code: &[u8], heap_pages: u64, host_functions: Vec<&'static dyn Function>, + allow_missing_func_imports: bool, ) -> std::result::Result { - let (compiled_module, context) = create_compiled_unit(code, &host_functions)?; + let (compiled_module, context) = create_compiled_unit(code, &host_functions, allow_missing_func_imports)?; // Inspect the module for the min and max memory sizes. let (min_memory_size, max_memory_size) = { @@ -115,9 +121,95 @@ pub fn create_instance( }) } +#[derive(Debug)] +struct MissingFunction { + name: String, + sig: cranelift_codegen::ir::Signature, +} + +#[derive(Debug)] +struct MissingFunctionStubs { + stubs: HashMap>, +} + +impl MissingFunctionStubs { + fn new() -> Self { + Self { + stubs: HashMap::new(), + } + } + + fn insert(&mut self, module: String, name: String, sig: cranelift_codegen::ir::Signature) { + self.stubs.entry(module).or_insert_with(Vec::new).push(MissingFunction { + name, + sig, + }); + } +} + +fn scan_missing_functions( + code: &[u8], + host_functions: &[&'static dyn Function], +) -> std::result::Result { + let isa = target_isa()?; + let call_conv = isa.default_call_conv(); + + let module = parity_wasm::elements::Module::from_bytes(code) + .map_err(|e| WasmError::Other(format!("cannot deserialize error: {}", e)))?; + + let types = module.type_section().map(|ts| ts.types()).unwrap_or(&[]); + let import_entries = module + .import_section() + .map(|is| is.entries()) + .unwrap_or(&[]); + + let mut missing_functions = MissingFunctionStubs::new(); + for import_entry in import_entries { + let func_ty = match import_entry.external() { + parity_wasm::elements::External::Function(func_ty_idx) => { + let parity_wasm::elements::Type::Function(ref func_ty) = + types.get(*func_ty_idx as usize).ok_or_else(|| { + WasmError::Other(format!("corrupted module, type out of bounds")) + })?; + func_ty + } + _ => { + // We are looking only for missing **functions** here. Any other items, be they + // missing or not, will be handled at the resolution stage later. + continue; + } + }; + let signature = convert_parity_wasm_signature(func_ty); + + if import_entry.module() == "env" { + if let Some(hf) = host_functions + .iter() + .find(|hf| hf.name() == import_entry.field()) + { + if signature == hf.signature() { + continue; + } + } + } + + // This function is either not from the env module, or doesn't have a corresponding host + // function, or the signature is not matching. Add it to the list. + let sig = cranelift_ir_signature(signature, &call_conv); + + missing_functions.insert( + import_entry.module().to_string(), + import_entry.field().to_string(), + sig, + ); + } + + Ok(missing_functions) +} + fn create_compiled_unit( code: &[u8], host_functions: &[&'static dyn Function], + allow_missing_func_imports: bool, ) -> std::result::Result<(CompiledModule, Context), WasmError> { let compilation_strategy = CompilationStrategy::Cranelift; @@ -130,8 +222,27 @@ fn create_compiled_unit( // Instantiate and link the env module. let global_exports = context.get_global_exports(); let compiler = new_compiler(compilation_strategy)?; - let env_module = instantiate_env_module(global_exports, compiler, host_functions)?; - context.name_instance("env".to_owned(), env_module); + + let mut missing_functions_stubs = if allow_missing_func_imports { + scan_missing_functions(code, host_functions)? + } else { + // If there are in fact missing functions they will be detected at the instantiation time + // and the module will be rejected. + MissingFunctionStubs::new() + }; + + let env_missing_functions = missing_functions_stubs.stubs.remove("env").unwrap_or_else(|| Vec::new()); + context.name_instance( + "env".to_owned(), + instantiate_env_module(global_exports, compiler, host_functions, env_missing_functions)?, + ); + + for (module, missing_functions_stubs) in missing_functions_stubs.stubs { + let compiler = new_compiler(compilation_strategy)?; + let global_exports = context.get_global_exports(); + let instance = instantiate_env_module(global_exports, compiler, &[], missing_functions_stubs)?; + context.name_instance(module, instance); + } // Compile the wasm module. let module = context.compile_module(&code) @@ -199,6 +310,7 @@ fn instantiate_env_module( global_exports: Rc>>>, compiler: Compiler, host_functions: &[&'static dyn Function], + missing_functions_stubs: Vec, ) -> std::result::Result { let isa = target_isa()?; @@ -231,6 +343,26 @@ fn instantiate_env_module( finished_functions.push(trampoline); } + for MissingFunction { name, sig } in missing_functions_stubs { + let sig = translate_signature( + sig, + pointer_type, + ); + let sig_id = module.signatures.push(sig.clone()); + let func_id = module.functions.push(sig_id); + module + .exports + .insert(name, wasmtime_environ::Export::Function(func_id)); + let trampoline = make_trampoline( + isa.as_ref(), + &mut code_memory, + &mut fn_builder_ctx, + func_id.index() as u32, + &sig, + )?; + finished_functions.push(trampoline); + } + code_memory.publish(); let imports = Imports::none(); diff --git a/client/executor/wasmtime/src/util.rs b/client/executor/wasmtime/src/util.rs index 551295911a..77fb8af386 100644 --- a/client/executor/wasmtime/src/util.rs +++ b/client/executor/wasmtime/src/util.rs @@ -51,6 +51,24 @@ pub fn checked_range(offset: usize, len: usize, max: usize) -> Option Signature { + fn convert_value_type(val_ty: parity_wasm::elements::ValueType) -> ValueType { + use parity_wasm::elements::ValueType::*; + match val_ty { + I32 => ValueType::I32, + I64 => ValueType::I64, + F32 => ValueType::F32, + F64 => ValueType::F64, + } + } + + Signature::new( + func_ty.params().iter().cloned().map(convert_value_type).collect::>(), + func_ty.return_type().map(convert_value_type), + ) +} + /// Convert a wasm_interface Signature into a cranelift_codegen Signature. pub fn cranelift_ir_signature(signature: Signature, call_conv: &isa::CallConv) -> ir::Signature { ir::Signature { -- GitLab From 03ffa5a501acab0c1d6ae5c41d291941fb8a79af Mon Sep 17 00:00:00 2001 From: Seun LanLege Date: Mon, 27 Jan 2020 10:59:40 +0100 Subject: [PATCH 185/296] Manual Seal (#4143) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * instant/manual seal unbounded queues are evil Apply suggestions from code review Co-Authored-By: Robert Habermeier add fork tests, docs, remove todos moar docs Update client/consensus/manual-seal/src/rpc.rs Co-Authored-By: Robert Habermeier remove unbound generic, parameter, docs, deps, code style changes Apply suggestions from code review Co-Authored-By: Tomasz Drwięga code style chnges remove unused deps, remove dep renames, check if block is empty before importing, use ? for error propagation fix tests log errors for instant seal use debug code style changes, updated copyright dates use txpool::Pool instead of BasicPool, code style changes fixed tests * fix tests * requested changes from review * check inherents len * rebase --- .maintain/rename-crates-for-2.0.sh | 0 Cargo.lock | 636 +++++++++--------- Cargo.toml | 1 + bin/node/cli/src/browser.rs | 2 +- bin/node/cli/src/cli.rs | 2 +- client/consensus/manual-seal/Cargo.toml | 32 + client/consensus/manual-seal/src/error.rs | 98 +++ .../manual-seal/src/finalize_block.rs | 64 ++ client/consensus/manual-seal/src/lib.rs | 467 +++++++++++++ client/consensus/manual-seal/src/rpc.rs | 163 +++++ .../manual-seal/src/seal_new_block.rs | 148 ++++ client/transaction-pool/Cargo.toml | 19 +- client/transaction-pool/src/lib.rs | 2 + client/transaction-pool/src/testing.rs | 185 +++++ client/transaction-pool/src/tests.rs | 156 +---- primitives/consensus/common/Cargo.toml | 1 + .../consensus/common/src/block_import.rs | 9 +- primitives/inherents/src/lib.rs | 5 + 18 files changed, 1521 insertions(+), 469 deletions(-) mode change 100644 => 100755 .maintain/rename-crates-for-2.0.sh create mode 100644 client/consensus/manual-seal/Cargo.toml create mode 100644 client/consensus/manual-seal/src/error.rs create mode 100644 client/consensus/manual-seal/src/finalize_block.rs create mode 100644 client/consensus/manual-seal/src/lib.rs create mode 100644 client/consensus/manual-seal/src/rpc.rs create mode 100644 client/consensus/manual-seal/src/seal_new_block.rs create mode 100644 client/transaction-pool/src/testing.rs diff --git a/.maintain/rename-crates-for-2.0.sh b/.maintain/rename-crates-for-2.0.sh old mode 100644 new mode 100755 diff --git a/Cargo.lock b/Cargo.lock index 6ec2225830..b2bf3f6265 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,21 +138,11 @@ name = "assert_matches" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "async-macros" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "async-std" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-macros 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "async-task 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "broadcaster 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -162,7 +152,7 @@ dependencies = [ "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -259,7 +249,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -275,7 +265,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (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.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -378,17 +368,17 @@ dependencies = [ "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-web 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-chain-spec 2.0.0", "sc-network 0.8.0", "sc-service 0.8.0", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -409,7 +399,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -422,7 +412,7 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.1.1" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -479,8 +469,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -533,7 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -591,7 +581,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -599,8 +589,8 @@ name = "console_log" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -658,8 +648,8 @@ dependencies = [ "cranelift-codegen-meta 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-codegen-shared 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -684,7 +674,7 @@ name = "cranelift-entity" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -693,7 +683,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -716,8 +706,8 @@ dependencies = [ "cranelift-codegen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-entity 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -749,8 +739,8 @@ dependencies = [ "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -773,8 +763,8 @@ dependencies = [ "rand_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xoshiro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -887,7 +877,7 @@ dependencies = [ "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1069,7 +1059,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1081,7 +1071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1096,7 +1086,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1128,7 +1118,7 @@ dependencies = [ "evm-runtime 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1176,7 +1166,7 @@ dependencies = [ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "goblin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "string-interner 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1227,7 +1217,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1237,7 +1227,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1309,7 +1299,7 @@ dependencies = [ "pallet-indices 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -1321,7 +1311,7 @@ name = "frame-metadata" version = "10.0.0" dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", ] @@ -1335,12 +1325,12 @@ dependencies = [ "frame-support-procedural 2.0.0", "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.6 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-arithmetic 2.0.0", "sp-core 2.0.0", "sp-inherents 2.0.0", @@ -1388,7 +1378,7 @@ dependencies = [ "frame-support 2.0.0", "parity-scale-codec 1.1.2 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-inherents 2.0.0", "sp-io 2.0.0", @@ -1405,7 +1395,7 @@ dependencies = [ "frame-support 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-externalities 0.8.0", "sp-io 2.0.0", @@ -1667,7 +1657,7 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1700,7 +1690,7 @@ dependencies = [ "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.8 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1709,7 +1699,7 @@ name = "goblin" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1718,16 +1708,16 @@ dependencies = [ name = "grafana-data-source" version = "0.8.0" dependencies = [ - "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1753,7 +1743,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "string 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)", @@ -1771,7 +1761,7 @@ dependencies = [ "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1823,7 +1813,7 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1955,7 +1945,7 @@ dependencies = [ "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (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)", @@ -1984,7 +1974,7 @@ dependencies = [ "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2061,7 +2051,7 @@ name = "impl-serde" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2125,15 +2115,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "js-sys" -version = "0.3.34" +version = "0.3.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2147,8 +2137,8 @@ dependencies = [ "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2161,9 +2151,9 @@ version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2194,7 +2184,7 @@ dependencies = [ "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2206,9 +2196,9 @@ version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2220,7 +2210,7 @@ dependencies = [ "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (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.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2233,7 +2223,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.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.9.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2268,7 +2258,7 @@ name = "kv-log-macro" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2299,7 +2289,7 @@ dependencies = [ "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2315,14 +2305,14 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2406,7 +2396,7 @@ dependencies = [ "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2451,7 +2441,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2481,7 +2471,7 @@ dependencies = [ "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2502,7 +2492,7 @@ dependencies = [ "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2520,7 +2510,7 @@ name = "libp2p-mdns" version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2528,7 +2518,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2547,7 +2537,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2562,7 +2552,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2580,7 +2570,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-swarm 0.4.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2596,7 +2586,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures_codec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2612,10 +2602,10 @@ dependencies = [ "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2626,9 +2616,9 @@ dependencies = [ "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2648,14 +2638,14 @@ name = "libp2p-tcp" version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2663,10 +2653,10 @@ name = "libp2p-uds" version = "0.14.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2675,11 +2665,11 @@ version = "0.7.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.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)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2692,11 +2682,11 @@ dependencies = [ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "quicksink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2709,7 +2699,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "yamux 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2786,12 +2776,12 @@ name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2911,7 +2901,7 @@ dependencies = [ "iovec 0.1.4 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (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)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2924,7 +2914,7 @@ version = "2.0.6" 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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2967,7 +2957,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2988,7 +2978,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "openssl 0.10.26 (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.53 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3031,7 +3021,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", "node-rpc 2.0.0", @@ -3063,7 +3053,7 @@ dependencies = [ "sc-service-test 2.0.0", "sc-telemetry 2.0.0", "sc-transaction-pool 2.0.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-authority-discovery 2.0.0", "sp-consensus 0.8.0", "sp-consensus-babe 0.8.0", @@ -3081,8 +3071,8 @@ dependencies = [ "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3151,7 +3141,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "sc-rpc 2.0.0", ] @@ -3196,7 +3186,7 @@ dependencies = [ "pallet-utility 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-authority-discovery 2.0.0", "sp-block-builder 2.0.0", @@ -3221,7 +3211,7 @@ version = "2.0.0" dependencies = [ "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", "sc-basic-authorship 0.8.0", "sc-cli 0.8.0", @@ -3260,7 +3250,7 @@ dependencies = [ "pallet-timestamp 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-block-builder 2.0.0", "sp-consensus-aura 0.8.0", @@ -3310,7 +3300,7 @@ dependencies = [ name = "node-transaction-factory" version = "0.8.0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-cli 0.8.0", "sc-client 0.8.0", @@ -3386,7 +3376,7 @@ name = "num_cpus" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3475,7 +3465,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3493,7 +3483,7 @@ dependencies = [ "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-consensus-aura 0.8.0", "sp-core 2.0.0", @@ -3512,7 +3502,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-session 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-authority-discovery 2.0.0", "sp-core 2.0.0", @@ -3550,7 +3540,7 @@ dependencies = [ "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-consensus-babe 0.8.0", "sp-core 2.0.0", "sp-inherents 2.0.0", @@ -3571,7 +3561,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-transaction-payment 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3587,7 +3577,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3608,7 +3598,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3627,7 +3617,7 @@ dependencies = [ "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-contracts-rpc-runtime-api 0.8.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", @@ -3654,7 +3644,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3670,7 +3660,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3686,7 +3676,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-phragmen 2.0.0", @@ -3707,7 +3697,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3723,7 +3713,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3738,7 +3728,7 @@ dependencies = [ "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-finality-tracker 2.0.0", "sp-inherents 2.0.0", @@ -3754,7 +3744,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3770,7 +3760,7 @@ dependencies = [ "pallet-finality-tracker 2.0.0", "pallet-session 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-finality-grandpa 2.0.0", "sp-io 2.0.0", @@ -3788,7 +3778,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3804,7 +3794,7 @@ dependencies = [ "pallet-authorship 2.0.0", "pallet-session 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3820,7 +3810,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-keyring 2.0.0", @@ -3835,7 +3825,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3850,7 +3840,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3865,7 +3855,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3896,7 +3886,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3911,7 +3901,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3928,7 +3918,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", "sp-io 2.0.0", @@ -3947,7 +3937,7 @@ dependencies = [ "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -3966,7 +3956,7 @@ dependencies = [ "pallet-staking-reward-curve 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-keyring 2.0.0", @@ -3995,7 +3985,7 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -4010,7 +4000,7 @@ dependencies = [ "frame-system 2.0.0", "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-inherents 2.0.0", "sp-io 2.0.0", @@ -4043,7 +4033,7 @@ dependencies = [ "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-transaction-payment-rpc-runtime-api 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", @@ -4057,7 +4047,7 @@ version = "2.0.0" dependencies = [ "frame-support 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-runtime 2.0.0", @@ -4072,7 +4062,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -4087,7 +4077,7 @@ dependencies = [ "frame-system 2.0.0", "pallet-balances 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", @@ -4111,7 +4101,7 @@ dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.3 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4127,7 +4117,7 @@ dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4169,13 +4159,13 @@ dependencies = [ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec-derive 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-scale-codec-derive" -version = "1.1.1" +version = "1.1.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)", @@ -4515,7 +4505,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4568,7 +4558,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4583,7 +4573,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4748,7 +4738,7 @@ dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4904,7 +4894,7 @@ dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4968,7 +4958,7 @@ version = "0.16.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)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5029,7 +5019,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5053,7 +5043,7 @@ name = "sc-basic-authorship" version = "0.8.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", @@ -5095,7 +5085,7 @@ dependencies = [ "sc-chain-spec-derive 2.0.0", "sc-network 0.8.0", "sc-telemetry 2.0.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -5124,7 +5114,7 @@ dependencies = [ "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5158,7 +5148,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", @@ -5193,7 +5183,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor 0.8.0", @@ -5224,7 +5214,7 @@ dependencies = [ "kvdb-memorydb 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-rocksdb 0.4.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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5253,7 +5243,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", @@ -5293,7 +5283,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5332,13 +5322,40 @@ dependencies = [ "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sc-consensus-manual-seal" +version = "0.8.0" +dependencies = [ + "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sc-basic-authorship 0.8.0", + "sc-client 0.8.0", + "sc-client-api 2.0.0", + "sc-transaction-pool 2.0.0", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-blockchain 2.0.0", + "sp-consensus 0.8.0", + "sp-inherents 2.0.0", + "sp-runtime 2.0.0", + "sp-transaction-pool 2.0.0", + "substrate-test-runtime-client 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sc-consensus-pow" version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sp-api 2.0.0", @@ -5358,7 +5375,7 @@ version = "0.8.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", @@ -5377,7 +5394,7 @@ dependencies = [ name = "sc-consensus-uncles" version = "0.8.0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", "sp-authorship 2.0.0", "sp-consensus 0.8.0", @@ -5395,7 +5412,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5424,7 +5441,7 @@ name = "sc-executor-common" version = "0.8.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-allocator 2.0.0", "sp-core 2.0.0", @@ -5438,7 +5455,7 @@ dependencies = [ name = "sc-executor-wasmi" version = "0.8.0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", @@ -5459,7 +5476,7 @@ dependencies = [ "cranelift-frontend 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-native 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", "cranelift-wasm 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-executor-common 0.8.0", @@ -5483,7 +5500,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5546,7 +5563,7 @@ dependencies = [ "libp2p 0.14.0-alpha.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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5557,7 +5574,7 @@ dependencies = [ "sc-client 0.8.0", "sc-client-api 2.0.0", "sc-peerset 2.0.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5586,7 +5603,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-network 0.8.0", @@ -5602,7 +5619,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-block-builder 0.8.0", @@ -5632,7 +5649,7 @@ dependencies = [ "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5658,7 +5675,7 @@ version = "2.0.0" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5673,7 +5690,7 @@ dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5709,10 +5726,10 @@ dependencies = [ "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-rpc 2.0.0", @@ -5728,8 +5745,8 @@ dependencies = [ "jsonrpc-http-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-ws-server 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-runtime 2.0.0", ] @@ -5758,7 +5775,7 @@ dependencies = [ "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "grafana-data-source 0.8.0", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5776,7 +5793,7 @@ dependencies = [ "sc-telemetry 2.0.0", "sc-tracing 2.0.0", "sc-transaction-pool 2.0.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", @@ -5806,7 +5823,7 @@ dependencies = [ "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-network 0.8.0", "sc-service 0.8.0", @@ -5823,7 +5840,7 @@ name = "sc-state-db" version = "0.8.0" dependencies = [ "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", @@ -5837,11 +5854,11 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5855,10 +5872,10 @@ version = "2.0.0" dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "grafana-data-source 0.8.0", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-telemetry 2.0.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tracing 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5873,10 +5890,10 @@ dependencies = [ "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-runtime 2.0.0", "sp-transaction-pool 2.0.0", @@ -5889,7 +5906,7 @@ version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client-api 2.0.0", @@ -5998,7 +6015,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6018,15 +6035,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6041,7 +6058,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 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6117,7 +6134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.10 (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.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6169,7 +6186,7 @@ dependencies = [ [[package]] name = "soketto" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6178,7 +6195,7 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6196,7 +6213,7 @@ name = "sp-allocator" version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-std 2.0.0", "sp-wasm-interface 2.0.0", @@ -6250,7 +6267,7 @@ name = "sp-application-crypto" version = "2.0.0" dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-io 2.0.0", "sp-std 2.0.0", @@ -6277,7 +6294,7 @@ dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", "sp-std 2.0.0", ] @@ -6319,7 +6336,7 @@ name = "sp-blockchain" version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6337,9 +6354,10 @@ dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.14.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-inherents 2.0.0", "sp-runtime 2.0.0", @@ -6404,7 +6422,7 @@ dependencies = [ "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6414,7 +6432,7 @@ dependencies = [ "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", @@ -6454,7 +6472,7 @@ name = "sp-finality-grandpa" version = "2.0.0" dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", "sp-runtime 2.0.0", @@ -6487,7 +6505,7 @@ version = "2.0.0" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", "sp-externalities 0.8.0", @@ -6520,7 +6538,7 @@ name = "sp-panic-handler" version = "2.0.0" dependencies = [ "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6528,7 +6546,7 @@ name = "sp-phragmen" version = "2.0.0" dependencies = [ "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-io 2.0.0", "sp-runtime 2.0.0", "sp-std 2.0.0", @@ -6539,7 +6557,7 @@ dependencies = [ name = "sp-rpc" version = "2.0.0" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-core 2.0.0", ] @@ -6549,11 +6567,11 @@ name = "sp-runtime" version = "2.0.0" dependencies = [ "impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-arithmetic 2.0.0", @@ -6633,7 +6651,7 @@ dependencies = [ name = "sp-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6662,7 +6680,7 @@ version = "0.8.0" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6684,7 +6702,7 @@ name = "sp-storage" version = "2.0.0" dependencies = [ "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-debug-derive 2.0.0", "sp-std 2.0.0", ] @@ -6694,7 +6712,7 @@ name = "sp-test-primitives" version = "2.0.0" dependencies = [ "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-application-crypto 2.0.0", "sp-core 2.0.0", "sp-runtime 2.0.0", @@ -6718,9 +6736,9 @@ version = "2.0.0" dependencies = [ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-runtime 2.0.0", ] @@ -6748,7 +6766,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-runtime 2.0.0", "sp-std 2.0.0", ] @@ -6798,7 +6816,7 @@ name = "string-interner" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6900,7 +6918,7 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-rpc-api 0.8.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-storage 2.0.0", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -6915,11 +6933,11 @@ dependencies = [ "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-transaction-pool 2.0.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-blockchain 2.0.0", "sp-core 2.0.0", @@ -6956,14 +6974,14 @@ dependencies = [ "frame-support 2.0.0", "frame-system 2.0.0", "frame-system-rpc-runtime-api 2.0.0", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "pallet-babe 2.0.0", "pallet-timestamp 2.0.0", "parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sc-client 0.8.0", "sc-executor 0.8.0", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sp-api 2.0.0", "sp-application-crypto 2.0.0", "sp-block-builder 2.0.0", @@ -7233,7 +7251,7 @@ name = "tinytemplate" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7270,6 +7288,7 @@ dependencies = [ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-macros 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7337,7 +7356,16 @@ 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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7348,7 +7376,7 @@ dependencies = [ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7413,7 +7441,7 @@ dependencies = [ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.11.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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7447,7 +7475,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)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (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)", @@ -7463,7 +7491,7 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (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)", @@ -7479,7 +7507,7 @@ dependencies = [ "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7489,7 +7517,7 @@ name = "toml" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7553,7 +7581,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hash-db 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7588,7 +7616,7 @@ 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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7765,8 +7793,8 @@ name = "wabt" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7797,7 +7825,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7806,7 +7834,7 @@ name = "want" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7817,76 +7845,76 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.57" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.57" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.57" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.57" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.57" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.57" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anyhow 1.0.25 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7895,7 +7923,7 @@ name = "wasm-gc-api" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7906,13 +7934,13 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -7976,10 +8004,10 @@ dependencies = [ "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "more-asserts 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8032,14 +8060,14 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.34" +version = "0.3.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.35 (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.57 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -8177,7 +8205,7 @@ 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)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8217,7 +8245,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8294,8 +8322,7 @@ dependencies = [ "checksum asn1_der 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6fce6b6a0ffdafebd82c87e79e3f40e8d2c523e5fea5566ff6b90509bf98d638" "checksum asn1_der_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" -"checksum async-macros 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "644a5a8de80f2085a1e7e57cd1544a2a7438f6e003c0790999bd43b92a77cdb2" -"checksum async-std 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "513ee3c49800679a319912340f5601afda9e72848d7dea3a48bab489e8c1a46f" +"checksum async-std 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94ef4b71b2f56d7f8793c2a353fa0aa254833c55ab611dc6f3e0bd63db487e2d" "checksum async-task 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de6bd58f7b9cc49032559422595c81cbfcf04db2f2133592f70af19e258a1ced" "checksum async-tls 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce6977f57fa68da77ffe5542950d47e9c23d65f5bc7cb0a9f8700996913eec7" "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" @@ -8322,7 +8349,7 @@ dependencies = [ "checksum bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" "checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245" "checksum build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" -"checksum bumpalo 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fe2567a8d8a3aedb4e39aa39e186d5673acfd56393c6ac83b2bc5bd82f4369c" +"checksum bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb8038c1ddc0a5f73787b130f4cc75151e96ed33e417fde765eb5a81e3532f4" "checksum byte-slice-cast 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f6209f3b2c1edea170002e016d5ead6903d3bb0a846477f53bbeb614967a52a9" "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" @@ -8459,7 +8486,7 @@ dependencies = [ "checksum hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" "checksum hashbrown 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120" +"checksum hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f629dc602392d3ec14bfc8a09b5e644d7ffd725102b48b81e59f90f2633621d7" "checksum hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" "checksum hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "961de220ec9a91af2e1e5bd80d02109155695e516771762381ef8581317066e0" "checksum hex-literal-impl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9d4c5c844e2fee0bf673d54c2c177f1713b3d2af2ff6e666b49cb7572e6cf42d" @@ -8490,7 +8517,7 @@ dependencies = [ "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b1d42ef453b30b7387e113da1c83ab1605d90c5b4e0eb8e96d016ed3b8c160" -"checksum js-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)" = "c40e7a4fafb6cf0be06d25662fc99aacb25f526eb6e1bc0c24100bde5d6a834e" +"checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" "checksum jsonrpc-client-transports 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0a9ae166c4d1f702d297cd76d4b55758ace80272ffc6dbb139fdc1bf810de40b" "checksum jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970" "checksum jsonrpc-core-client 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "080dc110be17701097df238fad3c816d4a478a1899dfbcf8ec8957dd40ec7304" @@ -8540,7 +8567,7 @@ dependencies = [ "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e57b3997725d2b60dbec1297f6c2e2957cc383db1cebd6be812163f969c7d586" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +"checksum log 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "1b9ad466a945c9c40f6f9a449c55675547e59bc75a2722d4689042ab3ae80c9c" "checksum lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "5d8f669d42c72d18514dfca8115689c5f6370a17d980cb5bd777a67f404594c8" "checksum lru 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" "checksum mach 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1" @@ -8589,7 +8616,7 @@ dependencies = [ "checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" "checksum parity-multihash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70a4d7b05e51bff5ae2c29c7b8c3d889985bbd8f4e15b3542fcc1f6f9666d292" "checksum parity-scale-codec 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f747c06d9f3b2ad387ac881b9667298c81b1243aa9833f086e05996937c35507" -"checksum parity-scale-codec-derive 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34e513ff3e406f3ede6796dcdc83d0b32ffb86668cea1ccf7363118abeb00476" +"checksum parity-scale-codec-derive 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "492ac3aa93d6caa5d20e4e3e0b75d08e2dcd9dd8a50d19529548b6fe11b3f295" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8174d85e62c4d615fddd1ef67966bdc5757528891d0742f15b131ad04667b3f9" "checksum parity-util-mem 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "900dd84654b048e5bad420bb341658fc2c4d7fea628c22bcf4621733e54859b4" @@ -8698,8 +8725,8 @@ dependencies = [ "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 send_wrapper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" -"checksum serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "1217f97ab8e8904b57dd22eb61cde455fa7446a9c1cf43966066da047c1f3702" -"checksum serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0" +"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" "checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" "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" @@ -8715,7 +8742,7 @@ dependencies = [ "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" "checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86" "checksum snow 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" -"checksum soketto 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" +"checksum soketto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3caa0ad6b765419f21e4cfa490ec7514a9fae4af986adef168a69477ba528671" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" @@ -8762,6 +8789,7 @@ dependencies = [ "checksum tokio-executor 0.2.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" "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-macros 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5795a71419535c6dcecc9b6ca95bdd3c2d6142f7e8343d7beb9923f129aa87e" "checksum tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" "checksum tokio-rustls 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1df2fa53ac211c136832f530ccb081af9af891af22d685a9493e232c7a359bc2" "checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" @@ -8815,13 +8843,13 @@ dependencies = [ "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" "checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" -"checksum wasm-bindgen 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "701bc20794a7f9e8dcd85984a848f951ef6c5083322b6dd17fe880c99390f7cd" -"checksum wasm-bindgen-backend 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "426315280d373e1a828e1c322507d51aa82e03c2fb1d654720b9e2f2368d291d" -"checksum wasm-bindgen-futures 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1de54efe80cb87a8fa1f715d60ab47a5eac6b1447dd68665300773f498c229b1" -"checksum wasm-bindgen-macro 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "d9a8a46373db32c892de910ccca302ecdaf8262abab746324a8a4dac352fc11f" -"checksum wasm-bindgen-macro-support 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "45d1c6c2259c0f4ef3d61ea0976ea075b6f8185497c4a5457793740c2cda6430" -"checksum wasm-bindgen-shared 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "dd8e108ae395aae8017b091c4766101f08c635a5074e6631e0085e8a839e5810" -"checksum wasm-bindgen-webidl 0.2.57 (registry+https://github.com/rust-lang/crates.io-index)" = "7a38859ace1c29c8ed75cd74940d4c96b980837179355de542a2eab3b435bb5c" +"checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" +"checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" +"checksum wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8bbdd49e3e28b40dec6a9ba8d17798245ce32b019513a845369c641b275135d9" +"checksum wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" +"checksum wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" +"checksum wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" +"checksum wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" "checksum wasm-gc-api 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" "checksum wasm-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" "checksum wasmi 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" @@ -8831,7 +8859,7 @@ dependencies = [ "checksum wasmtime-environ 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a3947662a0b8e05b1418465e64f16de9114f9fec18cc3f56e0ed5aa7737b89d0" "checksum wasmtime-jit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ed7922689461a7b5bd0d9c7350cac526c8a520a23b3ffd7f5b446ac51dfc51f" "checksum wasmtime-runtime 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "781d6bb8b346efaa3dc39746386957cd79b8d841e8652ed9b02d77bcf64fb514" -"checksum web-sys 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ba09295448c0b93bc87d2769614d371a924749e5e6c87e4c1df8b2416b49b775" +"checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" "checksum webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d7e664e770ac0110e2384769bcc59ed19e329d81f555916a6e072714957b81b4" "checksum webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b" "checksum webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" diff --git a/Cargo.toml b/Cargo.toml index fb15de2ebe..5dd85091cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ members = [ "client/cli", "client/consensus/aura", "client/consensus/babe", + "client/consensus/manual-seal", "client/consensus/pow", "client/consensus/slots", "client/consensus/uncles", diff --git a/bin/node/cli/src/browser.rs b/bin/node/cli/src/browser.rs index 9747a583c7..b41bbe6281 100644 --- a/bin/node/cli/src/browser.rs +++ b/bin/node/cli/src/browser.rs @@ -43,7 +43,7 @@ async fn start_inner(wasm_ext: Transport) -> Result(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re |exit, _cli_args, _custom_args, mut config: Config<_, _>| { info!("{}", version.name); info!(" version {}", config.full_version()); - info!(" by Parity Technologies, 2017-2019"); + info!(" by Parity Technologies, 2017-2020"); info!("Chain specification: {}", config.chain_spec.name()); info!("Node name: {}", config.name); info!("Roles: {}", display_role(&config)); diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml new file mode 100644 index 0000000000..83d7535dae --- /dev/null +++ b/client/consensus/manual-seal/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "sc-consensus-manual-seal" +version = "0.8.0" +authors = ["Parity Technologies "] +description = "Manual sealing engine for Substrate" +edition = "2018" + +[dependencies] +derive_more = "0.99.2" +futures = "0.3.1" +jsonrpc-core = "14.0.5" +jsonrpc-core-client = "14.0.5" +jsonrpc-derive = "14.0.5" +log = "0.4.8" +parking_lot = "0.10" +serde = { version = "1.0", features=["derive"] } + +sc-client = { path = "../../../client" } +sc-client-api = { path = "../../../client/api" } +sc-transaction-pool = { path = "../../transaction-pool", features = ["test-helpers"] } +sp-blockchain = { path = "../../../primitives/blockchain" } +sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common" } +sp-inherents = { path = "../../../primitives/inherents" } +sp-runtime = { path = "../../../primitives/runtime" } +sp-transaction-pool = { path = "../../../primitives/transaction-pool" } + +[dev-dependencies] +sc-basic-authorship = { path = "../../basic-authorship" } +substrate-test-runtime-client = { path = "../../../test-utils/runtime/client" } +tokio = { version = "0.2", features = ["rt-core", "macros"] } +env_logger = "0.7.0" +tempfile = "3.1.0" diff --git a/client/consensus/manual-seal/src/error.rs b/client/consensus/manual-seal/src/error.rs new file mode 100644 index 0000000000..d6ee9f1767 --- /dev/null +++ b/client/consensus/manual-seal/src/error.rs @@ -0,0 +1,98 @@ +// Copyright 2020 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 manual sealing engine: the engine listens for rpc calls to seal blocks and create forks. +//! This is suitable for a testing environment. +use sp_consensus::{Error as ConsensusError, ImportResult}; +use sp_blockchain::Error as BlockchainError; +use sp_inherents::Error as InherentsError; +use futures::channel::{oneshot, mpsc::SendError}; + +/// Error code for rpc +mod codes { + pub const SERVER_SHUTTING_DOWN: i64 = 10_000; + pub const BLOCK_IMPORT_FAILED: i64 = 11_000; + pub const EMPTY_TRANSACTION_POOL: i64 = 12_000; + pub const BLOCK_NOT_FOUND: i64 = 13_000; + pub const CONSENSUS_ERROR: i64 = 14_000; + pub const INHERENTS_ERROR: i64 = 15_000; + pub const BLOCKCHAIN_ERROR: i64 = 16_000; + pub const UNKNOWN_ERROR: i64 = 20_000; +} + +/// errors encountered by background block authorship task +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// An error occurred while importing the block + #[display(fmt = "Block import failed: {:?}", _0)] + BlockImportError(ImportResult), + /// Transaction pool is empty, cannot create a block + #[display(fmt = "Transaction pool is empty, set create_empty to true,\ + if you want to create empty blocks")] + EmptyTransactionPool, + /// encountered during creation of Proposer. + #[display(fmt = "Consensus Error: {}", _0)] + ConsensusError(ConsensusError), + /// Failed to create Inherents data + #[display(fmt = "Inherents Error: {}", _0)] + InherentError(InherentsError), + /// error encountered during finalization + #[display(fmt = "Finalization Error: {}", _0)] + BlockchainError(BlockchainError), + /// Supplied parent_hash doesn't exist in chain + #[display(fmt = "Supplied parent_hash: {} doesn't exist in chain", _0)] + #[from(ignore)] + BlockNotFound(String), + /// Some string error + #[display(fmt = "{}", _0)] + #[from(ignore)] + StringError(String), + ///send error + #[display(fmt = "Consensus process is terminating")] + Canceled(oneshot::Canceled), + ///send error + #[display(fmt = "Consensus process is terminating")] + SendError(SendError), + /// Some other error. + #[display(fmt="Other error: {}", _0)] + Other(Box), +} + +impl Error { + fn to_code(&self) -> i64 { + use Error::*; + match self { + BlockImportError(_) => codes::BLOCK_IMPORT_FAILED, + BlockNotFound(_) => codes::BLOCK_NOT_FOUND, + EmptyTransactionPool => codes::EMPTY_TRANSACTION_POOL, + ConsensusError(_) => codes::CONSENSUS_ERROR, + InherentError(_) => codes::INHERENTS_ERROR, + BlockchainError(_) => codes::BLOCKCHAIN_ERROR, + SendError(_) | Canceled(_) => codes::SERVER_SHUTTING_DOWN, + _ => codes::UNKNOWN_ERROR + } + } +} + +impl std::convert::From for jsonrpc_core::Error { + fn from(error: Error) -> Self { + jsonrpc_core::Error { + code: jsonrpc_core::ErrorCode::ServerError(error.to_code()), + message: format!("{}", error), + data: None + } + } +} diff --git a/client/consensus/manual-seal/src/finalize_block.rs b/client/consensus/manual-seal/src/finalize_block.rs new file mode 100644 index 0000000000..419159709f --- /dev/null +++ b/client/consensus/manual-seal/src/finalize_block.rs @@ -0,0 +1,64 @@ +// 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 . + +//! Block finalization utilities + +use crate::rpc; +use sp_runtime::{ + Justification, + traits::Block as BlockT, + generic::BlockId, +}; +use std::sync::Arc; +use sc_client_api::backend::Backend as ClientBackend; + +/// params for block finalization. +pub struct FinalizeBlockParams { + /// hash of the block + pub hash: ::Hash, + /// sender to report errors/success to the rpc. + pub sender: rpc::Sender<()>, + /// finalization justification + pub justification: Option, + /// client backend + pub backend: Arc, +} + +/// finalizes a block in the backend with the given params. +pub async fn finalize_block(params: FinalizeBlockParams) + where + B: BlockT, + CB: ClientBackend, +{ + let FinalizeBlockParams { + hash, + mut sender, + justification, + backend: back_end, + .. + } = params; + + match back_end.finalize_block(BlockId::Hash(hash), justification) { + Err(e) => { + log::warn!("Failed to finalize block {:?}", e); + rpc::send_result(&mut sender, Err(e.into())) + } + Ok(()) => { + log::info!("Successfully finalized block: {}", hash); + rpc::send_result(&mut sender, Ok(())) + } + } +} \ No newline at end of file diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs new file mode 100644 index 0000000000..3bd85b9380 --- /dev/null +++ b/client/consensus/manual-seal/src/lib.rs @@ -0,0 +1,467 @@ +// Copyright 2020 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 manual sealing engine: the engine listens for rpc calls to seal blocks and create forks. +//! This is suitable for a testing environment. + +use sp_consensus::{ + self, BlockImport, Environment, Proposer, BlockCheckParams, + ForkChoiceStrategy, BlockImportParams, BlockOrigin, + ImportResult, SelectChain, + import_queue::{ + BasicQueue, + CacheKeyId, + Verifier, + BoxBlockImport, + }, +}; +use sp_inherents::InherentDataProviders; +use sp_runtime::{traits::Block as BlockT, Justification}; +use sc_client_api::backend::Backend as ClientBackend; +use futures::prelude::*; +use sc_transaction_pool::txpool; +use std::collections::HashMap; +use std::sync::Arc; + +pub mod rpc; +mod error; +mod finalize_block; +mod seal_new_block; +use finalize_block::{finalize_block, FinalizeBlockParams}; +use seal_new_block::{seal_new_block, SealBlockParams}; +pub use error::Error; +pub use rpc::{EngineCommand, CreatedBlock}; + +/// The synchronous block-import worker of the engine. +pub struct ManualSealBlockImport { + inner: I, +} + +impl From for ManualSealBlockImport { + fn from(i: I) -> Self { + ManualSealBlockImport { inner: i } + } +} + +impl BlockImport for ManualSealBlockImport + where + B: BlockT, + I: BlockImport, +{ + type Error = I::Error; + type Transaction = (); + + fn check_block(&mut self, block: BlockCheckParams) -> Result + { + self.inner.check_block(block) + } + + fn import_block( + &mut self, + block: BlockImportParams, + cache: HashMap>, + ) -> Result { + self.inner.import_block(block, cache) + } +} + +/// The verifier for the manual seal engine; instantly finalizes. +struct ManualSealVerifier; + +impl Verifier for ManualSealVerifier { + fn verify( + &mut self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + body: Option>, + ) -> Result<(BlockImportParams, Option)>>), String> { + let import_params = BlockImportParams { + origin, + header, + justification, + post_digests: Vec::new(), + body, + storage_changes: None, + finalized: true, + auxiliary: Vec::new(), + intermediates: HashMap::new(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), + allow_missing_state: false, + import_existing: false, + }; + + Ok((import_params, None)) + } +} + +/// Instantiate the import queue for the manual seal consensus engine. +pub fn import_queue(block_import: BoxBlockImport) -> BasicQueue +{ + BasicQueue::new( + ManualSealVerifier, + block_import, + None, + None, + ) +} + +/// Creates the background authorship task for the manual seal engine. +pub async fn run_manual_seal( + mut block_import: BoxBlockImport, + mut env: E, + backend: Arc, + pool: Arc>, + mut seal_block_channel: S, + select_chain: C, + inherent_data_providers: InherentDataProviders, +) + where + B: BlockT + 'static, + CB: ClientBackend + 'static, + E: Environment + 'static, + E::Error: std::fmt::Display, + >::Error: std::fmt::Display, + A: txpool::ChainApi::Hash> + 'static, + S: Stream::Hash>> + Unpin + 'static, + C: SelectChain + 'static, +{ + while let Some(command) = seal_block_channel.next().await { + match command { + EngineCommand::SealNewBlock { + create_empty, + finalize, + parent_hash, + sender, + } => { + seal_new_block( + SealBlockParams { + sender, + parent_hash, + finalize, + create_empty, + env: &mut env, + select_chain: &select_chain, + block_import: &mut block_import, + inherent_data_provider: &inherent_data_providers, + pool: pool.clone(), + backend: backend.clone(), + } + ).await; + } + EngineCommand::FinalizeBlock { hash, sender, justification } => { + finalize_block( + FinalizeBlockParams { + hash, + sender, + justification, + backend: backend.clone(), + } + ).await + } + } + } +} + +/// runs the background authorship task for the instant seal engine. +/// instant-seal creates a new block for every transaction imported into +/// the transaction pool. +pub async fn run_instant_seal( + block_import: BoxBlockImport, + env: E, + backend: Arc, + pool: Arc>, + select_chain: C, + inherent_data_providers: InherentDataProviders, +) + where + A: txpool::ChainApi::Hash> + 'static, + B: BlockT + 'static, + CB: ClientBackend + 'static, + E: Environment + 'static, + E::Error: std::fmt::Display, + >::Error: std::fmt::Display, + C: SelectChain + 'static +{ + // instant-seal creates blocks as soon as transactions are imported + // into the transaction pool. + let seal_block_channel = pool.import_notification_stream() + .map(|_| { + EngineCommand::SealNewBlock { + create_empty: false, + finalize: false, + parent_hash: None, + sender: None, + } + }); + + run_manual_seal( + block_import, + env, + backend, + pool, + seal_block_channel, + select_chain, + inherent_data_providers, + ).await +} + +#[cfg(test)] +mod tests { + use super::*; + use substrate_test_runtime_client::{ + DefaultTestClientBuilderExt, + TestClientBuilderExt, + AccountKeyring::*, + TestClientBuilder, + }; + use sc_transaction_pool::{ + BasicPool, + txpool::Options, + testing::*, + }; + use sp_transaction_pool::TransactionPool; + use sp_runtime::generic::BlockId; + use sp_blockchain::HeaderBackend; + use sp_consensus::ImportedAux; + use sc_client::LongestChain; + use sp_inherents::InherentDataProviders; + use sc_basic_authorship::ProposerFactory; + + fn api() -> TestApi { + let mut api = TestApi::default(); + api.nonce_offset = 0; + + api + } + + #[tokio::test] + async fn instant_seal() { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let client = Arc::new(builder.build()); + let select_chain = LongestChain::new(backend.clone()); + let inherent_data_providers = InherentDataProviders::new(); + let pool = Arc::new(BasicPool::new(Options::default(), api())); + let env = ProposerFactory { + transaction_pool: pool.clone(), + client: client.clone(), + }; + // this test checks that blocks are created as soon as transactions are imported into the pool. + let (sender, receiver) = futures::channel::oneshot::channel(); + let mut sender = Arc::new(Some(sender)); + let stream = pool.pool().import_notification_stream() + .map(move |_| { + // we're only going to submit one tx so this fn will only be called once. + let mut_sender = Arc::get_mut(&mut sender).unwrap(); + let sender = std::mem::replace(mut_sender, None); + EngineCommand::SealNewBlock { + create_empty: false, + finalize: true, + parent_hash: None, + sender + } + }); + let future = run_manual_seal( + Box::new(client.clone()), + env, + backend.clone(), + pool.pool().clone(), + stream, + select_chain, + inherent_data_providers, + ); + std::thread::spawn(|| { + let mut rt = tokio::runtime::Runtime::new().unwrap(); + // spawn the background authorship task + rt.block_on(future); + }); + // submit a transaction to pool. + let result = pool.submit_one(&BlockId::Number(0), uxt(Alice, 0)).await; + // assert that it was successfully imported + assert!(result.is_ok()); + // assert that the background task returns ok + let created_block = receiver.await.unwrap().unwrap(); + assert_eq!( + created_block, + CreatedBlock { + hash: created_block.hash.clone(), + aux: ImportedAux { + header_only: false, + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + is_new_best: true, + } + } + ); + // assert that there's a new block in the db. + assert!(backend.blockchain().header(BlockId::Number(1)).unwrap().is_some()) + } + + #[tokio::test] + async fn manual_seal_and_finalization() { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let client = Arc::new(builder.build()); + let select_chain = LongestChain::new(backend.clone()); + let inherent_data_providers = InherentDataProviders::new(); + let pool = Arc::new(BasicPool::new(Options::default(), api())); + let env = ProposerFactory { + transaction_pool: pool.clone(), + client: client.clone(), + }; + // this test checks that blocks are created as soon as an engine command is sent over the stream. + let (mut sink, stream) = futures::channel::mpsc::channel(1024); + let future = run_manual_seal( + Box::new(client.clone()), + env, + backend.clone(), + pool.pool().clone(), + stream, + select_chain, + inherent_data_providers, + ); + std::thread::spawn(|| { + let mut rt = tokio::runtime::Runtime::new().unwrap(); + // spawn the background authorship task + rt.block_on(future); + }); + // submit a transaction to pool. + let result = pool.submit_one(&BlockId::Number(0), uxt(Alice, 0)).await; + // assert that it was successfully imported + assert!(result.is_ok()); + let (tx, rx) = futures::channel::oneshot::channel(); + sink.send(EngineCommand::SealNewBlock { + parent_hash: None, + sender: Some(tx), + create_empty: false, + finalize: false, + }).await.unwrap(); + let created_block = rx.await.unwrap().unwrap(); + + // assert that the background task returns ok + assert_eq!( + created_block, + CreatedBlock { + hash: created_block.hash.clone(), + aux: ImportedAux { + header_only: false, + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + is_new_best: true, + } + } + ); + // assert that there's a new block in the db. + let header = backend.blockchain().header(BlockId::Number(1)).unwrap().unwrap(); + let (tx, rx) = futures::channel::oneshot::channel(); + sink.send(EngineCommand::FinalizeBlock { + sender: Some(tx), + hash: header.hash(), + justification: None + }).await.unwrap(); + // assert that the background task returns ok + assert_eq!(rx.await.unwrap().unwrap(), ()); + } + + #[tokio::test] + async fn manual_seal_fork_blocks() { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let client = Arc::new(builder.build()); + let select_chain = LongestChain::new(backend.clone()); + let inherent_data_providers = InherentDataProviders::new(); + let pool = Arc::new(BasicPool::new(Options::default(), api())); + let env = ProposerFactory { + transaction_pool: pool.clone(), + client: client.clone(), + }; + // this test checks that blocks are created as soon as an engine command is sent over the stream. + let (mut sink, stream) = futures::channel::mpsc::channel(1024); + let future = run_manual_seal( + Box::new(client.clone()), + env, + backend.clone(), + pool.pool().clone(), + stream, + select_chain, + inherent_data_providers, + ); + std::thread::spawn(|| { + let mut rt = tokio::runtime::Runtime::new().unwrap(); + // spawn the background authorship task + rt.block_on(future); + }); + // submit a transaction to pool. + let result = pool.submit_one(&BlockId::Number(0), uxt(Alice, 0)).await; + // assert that it was successfully imported + assert!(result.is_ok()); + + let (tx, rx) = futures::channel::oneshot::channel(); + sink.send(EngineCommand::SealNewBlock { + parent_hash: None, + sender: Some(tx), + create_empty: false, + finalize: false, + }).await.unwrap(); + let created_block = rx.await.unwrap().unwrap(); + + // assert that the background task returns ok + assert_eq!( + created_block, + CreatedBlock { + hash: created_block.hash.clone(), + aux: ImportedAux { + header_only: false, + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + is_new_best: true + } + } + ); + // assert that there's a new block in the db. + assert!(backend.blockchain().header(BlockId::Number(0)).unwrap().is_some()); + assert!(pool.submit_one(&BlockId::Number(1), uxt(Alice, 1)).await.is_ok()); + + let (tx1, rx1) = futures::channel::oneshot::channel(); + assert!(sink.send(EngineCommand::SealNewBlock { + parent_hash: Some(created_block.hash.clone()), + sender: Some(tx1), + create_empty: false, + finalize: false, + }).await.is_ok()); + assert!(rx1.await.unwrap().is_ok()); + assert!(backend.blockchain().header(BlockId::Number(1)).unwrap().is_some()); + + assert!(pool.submit_one(&BlockId::Number(2), uxt(Alice, 2)).await.is_ok()); + let (tx2, rx2) = futures::channel::oneshot::channel(); + assert!(sink.send(EngineCommand::SealNewBlock { + parent_hash: Some(created_block.hash), + sender: Some(tx2), + create_empty: false, + finalize: false, + }).await.is_ok()); + let imported = rx2.await.unwrap().unwrap(); + // assert that fork block is in the db + assert!(backend.blockchain().header(BlockId::Hash(imported.hash)).unwrap().is_some()) + } +} diff --git a/client/consensus/manual-seal/src/rpc.rs b/client/consensus/manual-seal/src/rpc.rs new file mode 100644 index 0000000000..f3f0fe4a12 --- /dev/null +++ b/client/consensus/manual-seal/src/rpc.rs @@ -0,0 +1,163 @@ +// 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 . + +//! RPC interface for the ManualSeal Engine. +use sp_consensus::ImportedAux; +use jsonrpc_core::Error; +use jsonrpc_derive::rpc; +use futures::{ + channel::{mpsc, oneshot}, + TryFutureExt, + FutureExt, + SinkExt +}; +use serde::{Deserialize, Serialize}; +use sp_runtime::Justification; +pub use self::gen_client::Client as ManualSealClient; + +/// Future's type for jsonrpc +type FutureResult = Box + Send>; +/// sender passed to the authorship task to report errors or successes. +pub type Sender = Option>>; + +/// Message sent to the background authorship task, usually by RPC. +pub enum EngineCommand { + /// Tells the engine to propose a new block + /// + /// if create_empty == true, it will create empty blocks if there are no transactions + /// in the transaction pool. + /// + /// if finalize == true, the block will be instantly finalized. + SealNewBlock { + /// if true, empty blocks(without extrinsics) will be created. + /// otherwise, will return Error::EmptyTransactionPool. + create_empty: bool, + /// instantly finalize this block? + finalize: bool, + /// specify the parent hash of the about-to-created block + parent_hash: Option, + /// sender to report errors/success to the rpc. + sender: Sender>, + }, + /// Tells the engine to finalize the block with the supplied hash + FinalizeBlock { + /// hash of the block + hash: Hash, + /// sender to report errors/success to the rpc. + sender: Sender<()>, + /// finalization justification + justification: Option, + } +} + +/// RPC trait that provides methods for interacting with the manual-seal authorship task over rpc. +#[rpc] +pub trait ManualSealApi { + /// Instructs the manual-seal authorship task to create a new block + #[rpc(name = "engine_createBlock")] + fn create_block( + &self, + create_empty: bool, + finalize: bool, + parent_hash: Option + ) -> FutureResult>; + + /// Instructs the manual-seal authorship task to finalize a block + #[rpc(name = "engine_finalizeBlock")] + fn finalize_block( + &self, + hash: Hash, + justification: Option + ) -> FutureResult; +} + +/// A struct that implements the [`ManualSealApi`]. +pub struct ManualSeal { + import_block_channel: mpsc::Sender>, +} + +/// return type of `engine_createBlock` +#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)] +pub struct CreatedBlock { + /// hash of the created block. + pub hash: Hash, + /// some extra details about the import operation + pub aux: ImportedAux +} + +impl ManualSeal { + /// Create new `ManualSeal` with the given reference to the client. + pub fn new(import_block_channel: mpsc::Sender>) -> Self { + Self { import_block_channel } + } +} + +impl ManualSealApi for ManualSeal { + fn create_block( + &self, + create_empty: bool, + finalize: bool, + parent_hash: Option + ) -> FutureResult> { + let mut sink = self.import_block_channel.clone(); + let future = async move { + let (sender, receiver) = oneshot::channel(); + let command = EngineCommand::SealNewBlock { + create_empty, + finalize, + parent_hash, + sender: Some(sender), + }; + sink.send(command).await?; + receiver.await? + }.boxed(); + + Box::new(future.map_err(Error::from).compat()) + } + + fn finalize_block(&self, hash: Hash, justification: Option) -> FutureResult { + let mut sink = self.import_block_channel.clone(); + let future = async move { + let (sender, receiver) = oneshot::channel(); + sink.send( + EngineCommand::FinalizeBlock { hash, sender: Some(sender), justification } + ).await?; + + receiver.await?.map(|_| true) + }; + + Box::new(future.boxed().map_err(Error::from).compat()) + } +} + +/// report any errors or successes encountered by the authorship task back +/// to the rpc +pub fn send_result( + sender: &mut Sender, + result: std::result::Result +) { + if let Some(sender) = sender.take() { + if let Err(err) = sender.send(result) { + log::warn!("Server is shutting down: {:?}", err) + } + } else { + // instant seal doesn't report errors over rpc, simply log them. + match result { + Ok(r) => log::info!("Instant Seal success: {:?}", r), + Err(e) => log::error!("Instant Seal encountered an error: {}", e) + } + } +} diff --git a/client/consensus/manual-seal/src/seal_new_block.rs b/client/consensus/manual-seal/src/seal_new_block.rs new file mode 100644 index 0000000000..53dc82d353 --- /dev/null +++ b/client/consensus/manual-seal/src/seal_new_block.rs @@ -0,0 +1,148 @@ +// 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 . + +//! Block sealing utilities + +use crate::{Error, rpc}; +use std::sync::Arc; +use sp_runtime::{ + traits::{Block as BlockT, Header as HeaderT}, + generic::BlockId, +}; +use futures::prelude::*; +use sc_transaction_pool::txpool; +use rpc::CreatedBlock; + +use sp_consensus::{ + self, BlockImport, Environment, Proposer, + ForkChoiceStrategy, BlockImportParams, BlockOrigin, + ImportResult, SelectChain, + import_queue::BoxBlockImport, +}; +use sp_blockchain::HeaderBackend; +use sc_client_api::backend::Backend as ClientBackend; +use std::collections::HashMap; +use std::time::Duration; +use sp_inherents::InherentDataProviders; + +/// max duration for creating a proposal in secs +const MAX_PROPOSAL_DURATION: u64 = 10; + +/// params for sealing a new block +pub struct SealBlockParams<'a, B: BlockT, C, CB, E, T, P: txpool::ChainApi> { + /// if true, empty blocks(without extrinsics) will be created. + /// otherwise, will return Error::EmptyTransactionPool. + pub create_empty: bool, + /// instantly finalize this block? + pub finalize: bool, + /// specify the parent hash of the about-to-created block + pub parent_hash: Option<::Hash>, + /// sender to report errors/success to the rpc. + pub sender: rpc::Sender::Hash>>, + /// transaction pool + pub pool: Arc>, + /// client backend + pub backend: Arc, + /// Environment trait object for creating a proposer + pub env: &'a mut E, + /// SelectChain object + pub select_chain: &'a C, + /// block import object + pub block_import: &'a mut BoxBlockImport, + /// inherent data provider + pub inherent_data_provider: &'a InherentDataProviders, +} + +/// seals a new block with the given params +pub async fn seal_new_block( + SealBlockParams { + create_empty, + finalize, + pool, + parent_hash, + backend: back_end, + select_chain, + block_import, + env, + inherent_data_provider, + mut sender, + .. + }: SealBlockParams<'_, B, SC, CB, E, T, P> +) + where + B: BlockT, + CB: ClientBackend, + E: Environment, + >::Error: std::fmt::Display, + >::Error: std::fmt::Display, + P: txpool::ChainApi::Hash>, + SC: SelectChain, +{ + let future = async { + if pool.status().ready == 0 && !create_empty { + return Err(Error::EmptyTransactionPool) + } + + // get the header to build this new block on. + // use the parent_hash supplied via `EngineCommand` + // or fetch the best_block. + let header = match parent_hash { + Some(hash) => { + match back_end.blockchain().header(BlockId::Hash(hash))? { + Some(header) => header, + None => return Err(Error::BlockNotFound(format!("{}", hash))), + } + } + None => select_chain.best_chain()? + }; + + let mut proposer = env.init(&header) + .map_err(|err| Error::StringError(format!("{}", err))).await?; + let id = inherent_data_provider.create_inherent_data()?; + let inherents_len = id.len(); + let proposal = proposer.propose(id, Default::default(), Duration::from_secs(MAX_PROPOSAL_DURATION), false.into()) + .map_err(|err| Error::StringError(format!("{}", err))).await?; + + if proposal.block.extrinsics().len() == inherents_len && !create_empty { + return Err(Error::EmptyTransactionPool) + } + + let (header, body) = proposal.block.deconstruct(); + let params = BlockImportParams { + origin: BlockOrigin::Own, + header: header.clone(), + justification: None, + post_digests: Vec::new(), + body: Some(body), + finalized: finalize, + storage_changes: None, + auxiliary: Vec::new(), + intermediates: HashMap::new(), + fork_choice: Some(ForkChoiceStrategy::LongestChain), + allow_missing_state: false, + import_existing: false, + }; + + match block_import.import_block(params, HashMap::new())? { + ImportResult::Imported(aux) => { + Ok(CreatedBlock { hash: ::Header::hash(&header), aux }) + }, + other => Err(other.into()), + } + }; + + rpc::send_result(&mut sender, future.await) +} diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 7018263071..c3cd8c9838 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -10,14 +10,17 @@ derive_more = "0.99.2" futures = { version = "0.3.1", features = ["compat"] } log = "0.4.8" parking_lot = "0.9.0" -sp-core = { version = "2.0.0", path = "../../primitives/core" } -sp-api = { version = "2.0.0", path = "../../primitives/api" } -sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" } -sc-transaction-graph = { version = "2.0.0", path = "./graph" } -sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" } -sc-client-api = { version = "2.0.0", path = "../api" } -sp-blockchain = { version = "2.0.0", path = "../../primitives/blockchain" } +sp-core = { path = "../../primitives/core" } +sp-api = { path = "../../primitives/api" } +sp-runtime = { path = "../../primitives/runtime" } +sc-transaction-graph = { path = "./graph" } +sp-transaction-pool = { path = "../../primitives/transaction-pool" } +sc-client-api = { path = "../api" } +sp-blockchain = { path = "../../primitives/blockchain" } +substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } [dev-dependencies] sp-keyring = { version = "2.0.0", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" } + +[features] +test-helpers = [] diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index b085dba279..2771471ad9 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -24,6 +24,8 @@ pub mod error; #[cfg(test)] mod tests; +#[cfg(any(feature = "test-helpers", test))] +pub mod testing; pub use sc_transaction_graph as txpool; pub use crate::api::{FullChainApi, LightChainApi}; diff --git a/client/transaction-pool/src/testing.rs b/client/transaction-pool/src/testing.rs new file mode 100644 index 0000000000..f4fecbe1d6 --- /dev/null +++ b/client/transaction-pool/src/testing.rs @@ -0,0 +1,185 @@ +// Copyright 2018-2020 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 . + +//! Utilities for testing transaction pool +use super::*; +use codec::Encode; +use sp_runtime::{ + generic::{BlockId}, + traits::{Hash as HashT, BlakeTwo256}, + transaction_validity::{TransactionValidity, ValidTransaction, TransactionValidityError, InvalidTransaction}, +}; +use std::collections::HashSet; +use crate::BasicPool; +use parking_lot::RwLock; +use sc_transaction_graph::{self, ExHash, Pool}; +use substrate_test_runtime_client::{ + runtime::{AccountId, Block, BlockNumber, Extrinsic, Hash, Header, Index, Transfer}, + AccountKeyring, +}; + +/// `ChainApi` for test environments +pub struct TestApi { + /// transaction modifier + pub modifier: RwLock>, + /// cache of block number to extrinsics + pub chain_block_by_number: RwLock>>, + /// cache of block number to header + pub chain_headers_by_number: RwLock>, + /// cache of invalid hashes + pub invalid_hashes: RwLock>>, + /// validation requests + pub validation_requests: RwLock>, + /// used for calculating nonce for extrinsics + pub nonce_offset: u64, +} + +impl TestApi { + /// create an instance of `TestApi` + pub fn default() -> Self { + TestApi { + modifier: RwLock::new(Box::new(|_| {})), + chain_block_by_number: RwLock::new(HashMap::new()), + invalid_hashes: RwLock::new(HashSet::new()), + chain_headers_by_number: RwLock::new(HashMap::new()), + validation_requests: RwLock::new(Default::default()), + nonce_offset: 209, + } + } + + /// add a block to `TestApi` + pub fn push_block(&self, block_number: BlockNumber, xts: Vec) { + self.chain_block_by_number.write().insert(block_number, xts); + self.chain_headers_by_number.write().insert(block_number, Header { + number: block_number, + digest: Default::default(), + extrinsics_root: Default::default(), + parent_hash: Default::default(), + state_root: Default::default(), + }); + } +} + +impl sc_transaction_graph::ChainApi for TestApi { + type Block = Block; + type Hash = Hash; + type Error = error::Error; + type ValidationFuture = futures::future::Ready>; + type BodyFuture = futures::future::Ready>>>; + + fn validate_transaction( + &self, + at: &BlockId, + uxt: sc_transaction_graph::ExtrinsicFor, + ) -> Self::ValidationFuture { + + self.validation_requests.write().push(uxt.clone()); + + let expected = index(at, self.nonce_offset); + let requires = if expected == uxt.transfer().nonce { + vec![] + } else { + vec![vec![uxt.transfer().nonce as u8 - 1]] + }; + let provides = vec![vec![uxt.transfer().nonce as u8]]; + + if self.invalid_hashes.read().contains(&self.hash_and_length(&uxt).0) { + return futures::future::ready(Ok( + Err(TransactionValidityError::Invalid(InvalidTransaction::Custom(0))) + )) + } + + let mut validity = ValidTransaction { + priority: 1, + requires, + provides, + longevity: 64, + propagate: true, + }; + + (self.modifier.read())(&mut validity); + + futures::future::ready(Ok(Ok(validity))) + } + + fn block_id_to_number( + &self, + at: &BlockId, + ) -> error::Result>> { + Ok(Some(number_of(at))) + } + + fn block_id_to_hash( + &self, + at: &BlockId, + ) -> error::Result>> { + Ok(match at { + BlockId::Hash(x) => Some(x.clone()), + _ => Some(Default::default()), + }) + } + + fn hash_and_length( + &self, + ex: &sc_transaction_graph::ExtrinsicFor, + ) -> (Self::Hash, usize) { + let encoded = ex.encode(); + (BlakeTwo256::hash(&encoded), encoded.len()) + } + + fn block_body(&self, id: &BlockId) -> Self::BodyFuture { + futures::future::ready(Ok(if let BlockId::Number(num) = id { + self.chain_block_by_number.read().get(num).cloned() + } else { + None + })) + } +} + +/// get an instance of `BasicPool` with default options and `TestApi` +/// as the `ChainApi` +pub fn maintained_pool() -> BasicPool { + BasicPool::new(Default::default(), TestApi::default()) +} + +/// generate nonce to be used with testing TestApi +pub fn index(at: &BlockId, offset: u64) -> u64 { + offset + number_of(at) +} + +fn number_of(at: &BlockId) -> u64 { + match at { + BlockId::Number(n) => *n as u64, + _ => 0, + } +} + +/// generates a transfer extrinsic, given a keyring and a nonce. +pub fn uxt(who: AccountKeyring, nonce: Index) -> Extrinsic { + let transfer = Transfer { + from: who.into(), + to: AccountId::default(), + nonce, + amount: 1, + }; + let signature = transfer.using_encoded(|e| who.sign(e)); + Extrinsic::Transfer(transfer, signature.into()) +} + +/// creates a transaction pool with the TestApi ChainApi +pub fn pool() -> Pool { + Pool::new(Default::default(), Arc::new(TestApi::default())) +} diff --git a/client/transaction-pool/src/tests.rs b/client/transaction-pool/src/tests.rs index 778536b7b9..b06e335faf 100644 --- a/client/transaction-pool/src/tests.rs +++ b/client/transaction-pool/src/tests.rs @@ -16,163 +16,19 @@ use super::*; -use crate::{BasicPool, MaintainedTransactionPool}; -use codec::Encode; use futures::executor::block_on; -use parking_lot::RwLock; -use sc_transaction_graph::{self, ExHash, Pool}; +use txpool::{self, Pool}; +use substrate_test_runtime_client::{runtime::Index, AccountKeyring::*}; use sp_runtime::{ - generic::{self, BlockId}, - traits::{BlakeTwo256, Hash as HashT}, - transaction_validity::{TransactionValidity, ValidTransaction, TransactionValidityError, InvalidTransaction}, + generic::BlockId, + transaction_validity::ValidTransaction, }; -use std::collections::HashSet; -use substrate_test_runtime_client::{ - runtime::{AccountId, Block, BlockNumber, Extrinsic, Hash, Header, Index, Transfer}, - AccountKeyring::{self, *}, -}; - -struct TestApi { - pub modifier: RwLock>, - pub chain_block_by_number: RwLock>>, - pub chain_headers_by_number: RwLock>, - pub invalid_hashes: RwLock>>, - pub validation_requests: RwLock>, -} - -impl TestApi { - fn default() -> Self { - TestApi { - modifier: RwLock::new(Box::new(|_| {})), - chain_block_by_number: RwLock::new(HashMap::new()), - invalid_hashes: RwLock::new(HashSet::new()), - chain_headers_by_number: RwLock::new(HashMap::new()), - validation_requests: RwLock::new(Default::default()), - } - } - - fn push_block(&self, block_number: BlockNumber, xts: Vec) { - self.chain_block_by_number.write().insert(block_number, xts); - self.chain_headers_by_number.write().insert(block_number, Header { - number: block_number, - digest: Default::default(), - extrinsics_root: Default::default(), - parent_hash: Default::default(), - state_root: Default::default(), - }); - } -} - -impl sc_transaction_graph::ChainApi for TestApi { - type Block = Block; - type Hash = Hash; - type Error = error::Error; - type ValidationFuture = futures::future::Ready>; - type BodyFuture = futures::future::Ready>>>; - - fn validate_transaction( - &self, - at: &BlockId, - uxt: sc_transaction_graph::ExtrinsicFor, - ) -> Self::ValidationFuture { - - self.validation_requests.write().push(uxt.clone()); - - let expected = index(at); - let requires = if expected == uxt.transfer().nonce { - vec![] - } else { - vec![vec![uxt.transfer().nonce as u8 - 1]] - }; - let provides = vec![vec![uxt.transfer().nonce as u8]]; - - if self.invalid_hashes.read().contains(&self.hash_and_length(&uxt).0) { - return futures::future::ready(Ok( - Err(TransactionValidityError::Invalid(InvalidTransaction::Custom(0))) - )) - } - - let mut validity = ValidTransaction { - priority: 1, - requires, - provides, - longevity: 64, - propagate: true, - }; - - (self.modifier.read())(&mut validity); - - futures::future::ready(Ok(Ok(validity))) - } - - fn block_id_to_number( - &self, - at: &BlockId, - ) -> error::Result>> { - Ok(Some(number_of(at))) - } - - fn block_id_to_hash( - &self, - at: &BlockId, - ) -> error::Result>> { - Ok(match at { - generic::BlockId::Hash(x) => Some(x.clone()), - _ => Some(Default::default()), - }) - } - - fn hash_and_length( - &self, - ex: &sc_transaction_graph::ExtrinsicFor, - ) -> (Self::Hash, usize) { - let encoded = ex.encode(); - (BlakeTwo256::hash(&encoded), encoded.len()) - } - - fn block_body(&self, id: &BlockId) -> Self::BodyFuture { - futures::future::ready(Ok(if let BlockId::Number(num) = id { - self.chain_block_by_number.read().get(num).cloned() - } else { - None - })) - } -} - -fn index(at: &BlockId) -> u64 { - 209 + number_of(at) -} - -fn number_of(at: &BlockId) -> u64 { - match at { - generic::BlockId::Number(n) => *n as u64, - _ => 0, - } -} - -fn uxt(who: AccountKeyring, nonce: Index) -> Extrinsic { - let transfer = Transfer { - from: who.into(), - to: AccountId::default(), - nonce, - amount: 1, - }; - let signature = transfer.using_encoded(|e| who.sign(e)); - Extrinsic::Transfer(transfer, signature.into()) -} - -fn pool() -> Pool { - Pool::new(Default::default(), TestApi::default().into()) -} - -fn maintained_pool() -> BasicPool { - BasicPool::new(Default::default(), TestApi::default()) -} +use testing::*; #[test] fn submission_should_work() { let pool = pool(); - assert_eq!(209, index(&BlockId::number(0))); + assert_eq!(209, index(&BlockId::number(0), 209)); block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 209))).unwrap(); let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 3ae79caa43..8735416028 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -19,6 +19,7 @@ sp-version = { version = "2.0.0", path = "../../version" } sp-runtime = { version = "2.0.0", path = "../../runtime" } codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } parking_lot = "0.9.0" +serde = { version = "1.0", features = ["derive"] } [dev-dependencies] sp-test-primitives = { version = "2.0.0", path = "../../test-primitives" } diff --git a/primitives/consensus/common/src/block_import.rs b/primitives/consensus/common/src/block_import.rs index 71315b63ef..af1b61a9fe 100644 --- a/primitives/consensus/common/src/block_import.rs +++ b/primitives/consensus/common/src/block_import.rs @@ -16,10 +16,9 @@ //! Block import helpers. -use sp_runtime::{ - Justification, - traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor, HasherFor}, -}; +use sp_runtime::traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor, HasherFor}; +use sp_runtime::Justification; +use serde::{Serialize, Deserialize}; use std::borrow::Cow; use std::collections::HashMap; use std::sync::Arc; @@ -42,7 +41,7 @@ pub enum ImportResult { } /// Auxiliary data associated with an imported block result. -#[derive(Debug, Default, PartialEq, Eq)] +#[derive(Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct ImportedAux { /// Only the header has been imported. Block body verification was skipped. pub header_only: bool, diff --git a/primitives/inherents/src/lib.rs b/primitives/inherents/src/lib.rs index f79d8357a5..f1b8db982d 100644 --- a/primitives/inherents/src/lib.rs +++ b/primitives/inherents/src/lib.rs @@ -147,6 +147,11 @@ impl InherentData { None => Ok(None) } } + + /// Get the number of inherents in this instance + pub fn len(&self) -> usize { + self.data.len() + } } /// The result of checking inherents. -- GitLab From 9a9f52a05d9520aeee627a6c942564e807fda6a2 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 27 Jan 2020 04:22:04 -0800 Subject: [PATCH 186/296] Transaction queue tests update (#4734) * shuffle tests * update tests * inc_nonce -> increment_nonce --- client/consensus/manual-seal/src/lib.rs | 9 +- client/transaction-pool/src/lib.rs | 5 +- .../src/{testing.rs => testing/api.rs} | 163 +++++++++++------- client/transaction-pool/src/testing/mod.rs | 23 +++ .../src/{tests.rs => testing/pool.rs} | 97 +++++++---- 5 files changed, 196 insertions(+), 101 deletions(-) rename client/transaction-pool/src/{testing.rs => testing/api.rs} (50%) create mode 100644 client/transaction-pool/src/testing/mod.rs rename client/transaction-pool/src/{tests.rs => testing/pool.rs} (68%) diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs index 3bd85b9380..7262a62d12 100644 --- a/client/consensus/manual-seal/src/lib.rs +++ b/client/consensus/manual-seal/src/lib.rs @@ -231,7 +231,7 @@ mod tests { use sc_transaction_pool::{ BasicPool, txpool::Options, - testing::*, + testing::api::*, }; use sp_transaction_pool::TransactionPool; use sp_runtime::generic::BlockId; @@ -242,10 +242,7 @@ mod tests { use sc_basic_authorship::ProposerFactory; fn api() -> TestApi { - let mut api = TestApi::default(); - api.nonce_offset = 0; - - api + TestApi::empty() } #[tokio::test] @@ -422,6 +419,7 @@ mod tests { finalize: false, }).await.unwrap(); let created_block = rx.await.unwrap().unwrap(); + pool.api().increment_nonce(Alice.into()); // assert that the background task returns ok assert_eq!( @@ -451,6 +449,7 @@ mod tests { }).await.is_ok()); assert!(rx1.await.unwrap().is_ok()); assert!(backend.blockchain().header(BlockId::Number(1)).unwrap().is_some()); + pool.api().increment_nonce(Alice.into()); assert!(pool.submit_one(&BlockId::Number(2), uxt(Alice, 2)).await.is_ok()); let (tx2, rx2) = futures::channel::oneshot::channel(); diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 2771471ad9..b97294abe1 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -22,8 +22,6 @@ mod api; pub mod error; -#[cfg(test)] -mod tests; #[cfg(any(feature = "test-helpers", test))] pub mod testing; @@ -114,7 +112,8 @@ impl BasicPool &self.pool } - #[cfg(test)] + /// Get reference to the inner chain api, for tests only. + #[cfg(any(feature = "test-helpers", test))] pub fn api(&self) -> &Arc { &self.api } diff --git a/client/transaction-pool/src/testing.rs b/client/transaction-pool/src/testing/api.rs similarity index 50% rename from client/transaction-pool/src/testing.rs rename to client/transaction-pool/src/testing/api.rs index f4fecbe1d6..c8e4b62883 100644 --- a/client/transaction-pool/src/testing.rs +++ b/client/transaction-pool/src/testing/api.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. +// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -14,56 +14,74 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Utilities for testing transaction pool -use super::*; +//! Test ChainApi + +use crate::*; use codec::Encode; +use parking_lot::RwLock; use sp_runtime::{ - generic::{BlockId}, - traits::{Hash as HashT, BlakeTwo256}, + generic::{self, BlockId}, + traits::{BlakeTwo256, Hash as HashT}, transaction_validity::{TransactionValidity, ValidTransaction, TransactionValidityError, InvalidTransaction}, }; use std::collections::HashSet; -use crate::BasicPool; -use parking_lot::RwLock; -use sc_transaction_graph::{self, ExHash, Pool}; use substrate_test_runtime_client::{ - runtime::{AccountId, Block, BlockNumber, Extrinsic, Hash, Header, Index, Transfer}, - AccountKeyring, + runtime::{Index, AccountId, Block, BlockNumber, Extrinsic, Hash, Header, Transfer}, + AccountKeyring::{self, *}, }; -/// `ChainApi` for test environments +#[derive(Default)] +struct ChainState { + pub block_by_number: HashMap>, + pub block_by_hash: HashMap>, + pub header_by_number: HashMap, + pub nonces: HashMap, + pub invalid_hashes: HashSet, +} + +/// Test Api for transaction pool. pub struct TestApi { - /// transaction modifier - pub modifier: RwLock>, - /// cache of block number to extrinsics - pub chain_block_by_number: RwLock>>, - /// cache of block number to header - pub chain_headers_by_number: RwLock>, - /// cache of invalid hashes - pub invalid_hashes: RwLock>>, - /// validation requests - pub validation_requests: RwLock>, - /// used for calculating nonce for extrinsics - pub nonce_offset: u64, + valid_modifier: RwLock>, + chain: RwLock, + validation_requests: RwLock>, } impl TestApi { - /// create an instance of `TestApi` - pub fn default() -> Self { - TestApi { - modifier: RwLock::new(Box::new(|_| {})), - chain_block_by_number: RwLock::new(HashMap::new()), - invalid_hashes: RwLock::new(HashSet::new()), - chain_headers_by_number: RwLock::new(HashMap::new()), + + /// Test Api with Alice nonce set initially. + pub fn with_alice_nonce(nonce: u64) -> Self { + let api = TestApi { + valid_modifier: RwLock::new(Box::new(|_| {})), + chain: Default::default(), validation_requests: RwLock::new(Default::default()), - nonce_offset: 209, - } + }; + + api.chain.write().nonces.insert(Alice.into(), nonce); + + api } - /// add a block to `TestApi` + /// Default Test Api + pub fn empty() -> Self { + let api = TestApi { + valid_modifier: RwLock::new(Box::new(|_| {})), + chain: Default::default(), + validation_requests: RwLock::new(Default::default()), + }; + + api + } + + /// Set hook on modify valid result of transaction. + pub fn set_valid_modifier(&self, modifier: Box) { + *self.valid_modifier.write() = modifier; + } + + /// Push block as a part of canonical chain under given number. pub fn push_block(&self, block_number: BlockNumber, xts: Vec) { - self.chain_block_by_number.write().insert(block_number, xts); - self.chain_headers_by_number.write().insert(block_number, Header { + let mut chain = self.chain.write(); + chain.block_by_number.insert(block_number, xts); + chain.header_by_number.insert(block_number, Header { number: block_number, digest: Default::default(), extrinsics_root: Default::default(), @@ -71,6 +89,40 @@ impl TestApi { state_root: Default::default(), }); } + + /// Push a block without a number. + /// + /// As a part of non-canonical chain. + pub fn push_fork_block(&self, block_hash: Hash, xts: Vec) { + let mut chain = self.chain.write(); + chain.block_by_hash.insert(block_hash, xts); + } + + fn hash_and_length_inner(ex: &Extrinsic) -> (Hash, usize) { + let encoded = ex.encode(); + (BlakeTwo256::hash(&encoded), encoded.len()) + } + + /// Mark some transaction is invalid. + /// + /// Next time transaction pool will try to validate this + /// extrinsic, api will return invalid result. + pub fn add_invalid(&self, xts: &Extrinsic) { + self.chain.write().invalid_hashes.insert( + Self::hash_and_length_inner(xts).0 + ); + } + + /// Query validation requests received. + pub fn validation_requests(&self) -> Vec { + self.validation_requests.read().clone() + } + + /// Increment nonce in the inner state. + pub fn increment_nonce(&self, account: AccountId) { + let mut chain = self.chain.write(); + chain.nonces.entry(account).and_modify(|n| *n += 1).or_insert(1); + } } impl sc_transaction_graph::ChainApi for TestApi { @@ -82,21 +134,20 @@ impl sc_transaction_graph::ChainApi for TestApi { fn validate_transaction( &self, - at: &BlockId, + _at: &BlockId, uxt: sc_transaction_graph::ExtrinsicFor, ) -> Self::ValidationFuture { - self.validation_requests.write().push(uxt.clone()); - let expected = index(at, self.nonce_offset); - let requires = if expected == uxt.transfer().nonce { + let chain_nonce = self.chain.read().nonces.get(&uxt.transfer().from).cloned().unwrap_or(0); + let requires = if chain_nonce == uxt.transfer().nonce { vec![] } else { - vec![vec![uxt.transfer().nonce as u8 - 1]] + vec![vec![chain_nonce as u8]] }; let provides = vec![vec![uxt.transfer().nonce as u8]]; - if self.invalid_hashes.read().contains(&self.hash_and_length(&uxt).0) { + if self.chain.read().invalid_hashes.contains(&self.hash_and_length(&uxt).0) { return futures::future::ready(Ok( Err(TransactionValidityError::Invalid(InvalidTransaction::Custom(0))) )) @@ -110,7 +161,7 @@ impl sc_transaction_graph::ChainApi for TestApi { propagate: true, }; - (self.modifier.read())(&mut validity); + (self.valid_modifier.read())(&mut validity); futures::future::ready(Ok(Ok(validity))) } @@ -127,7 +178,7 @@ impl sc_transaction_graph::ChainApi for TestApi { at: &BlockId, ) -> error::Result>> { Ok(match at { - BlockId::Hash(x) => Some(x.clone()), + generic::BlockId::Hash(x) => Some(x.clone()), _ => Some(Default::default()), }) } @@ -136,38 +187,28 @@ impl sc_transaction_graph::ChainApi for TestApi { &self, ex: &sc_transaction_graph::ExtrinsicFor, ) -> (Self::Hash, usize) { - let encoded = ex.encode(); - (BlakeTwo256::hash(&encoded), encoded.len()) + Self::hash_and_length_inner(ex) } fn block_body(&self, id: &BlockId) -> Self::BodyFuture { futures::future::ready(Ok(if let BlockId::Number(num) = id { - self.chain_block_by_number.read().get(num).cloned() + self.chain.read().block_by_number.get(num).cloned() } else { None })) } } -/// get an instance of `BasicPool` with default options and `TestApi` -/// as the `ChainApi` -pub fn maintained_pool() -> BasicPool { - BasicPool::new(Default::default(), TestApi::default()) -} - -/// generate nonce to be used with testing TestApi -pub fn index(at: &BlockId, offset: u64) -> u64 { - offset + number_of(at) -} - fn number_of(at: &BlockId) -> u64 { match at { - BlockId::Number(n) => *n as u64, + generic::BlockId::Number(n) => *n as u64, _ => 0, } } -/// generates a transfer extrinsic, given a keyring and a nonce. +/// Generate transfer extrinsic with a given nonce. +/// +/// Part of the test api. pub fn uxt(who: AccountKeyring, nonce: Index) -> Extrinsic { let transfer = Transfer { from: who.into(), @@ -179,7 +220,3 @@ pub fn uxt(who: AccountKeyring, nonce: Index) -> Extrinsic { Extrinsic::Transfer(transfer, signature.into()) } -/// creates a transaction pool with the TestApi ChainApi -pub fn pool() -> Pool { - Pool::new(Default::default(), Arc::new(TestApi::default())) -} diff --git a/client/transaction-pool/src/testing/mod.rs b/client/transaction-pool/src/testing/mod.rs new file mode 100644 index 0000000000..c216a17ee6 --- /dev/null +++ b/client/transaction-pool/src/testing/mod.rs @@ -0,0 +1,23 @@ +// Copyright 2020 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 top-level transaction pool api + +#[cfg(any(feature = "test-helpers", test))] +pub mod api; + +#[cfg(test)] +mod pool; \ No newline at end of file diff --git a/client/transaction-pool/src/tests.rs b/client/transaction-pool/src/testing/pool.rs similarity index 68% rename from client/transaction-pool/src/tests.rs rename to client/transaction-pool/src/testing/pool.rs index b06e335faf..30a48fbec6 100644 --- a/client/transaction-pool/src/tests.rs +++ b/client/transaction-pool/src/testing/pool.rs @@ -1,34 +1,28 @@ -// Copyright 2018-2020 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 super::*; +use crate::*; +use sc_transaction_graph::{self, Pool}; use futures::executor::block_on; -use txpool::{self, Pool}; -use substrate_test_runtime_client::{runtime::Index, AccountKeyring::*}; use sp_runtime::{ generic::BlockId, transaction_validity::ValidTransaction, }; -use testing::*; +use substrate_test_runtime_client::{ + runtime::{Block, Hash, Index}, + AccountKeyring::*, +}; +use crate::testing::api::{TestApi, uxt}; + +fn pool() -> Pool { + Pool::new(Default::default(), TestApi::with_alice_nonce(209).into()) +} + +fn maintained_pool() -> BasicPool { + BasicPool::new(Default::default(), TestApi::with_alice_nonce(209)) +} #[test] fn submission_should_work() { let pool = pool(); - assert_eq!(209, index(&BlockId::number(0), 209)); block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 209))).unwrap(); let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); @@ -70,13 +64,19 @@ fn late_nonce_should_be_queued() { #[test] fn prune_tags_should_work() { let pool = pool(); - block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 209))).unwrap(); + let hash209 = block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 209))).unwrap(); block_on(pool.submit_one(&BlockId::number(0), uxt(Alice, 210))).unwrap(); let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, vec![209, 210]); - block_on(pool.prune_tags(&BlockId::number(1), vec![vec![209]], vec![])).unwrap(); + block_on( + pool.prune_tags( + &BlockId::number(1), + vec![vec![209]], + vec![hash209], + ) + ).expect("Prune tags"); let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, vec![210]); @@ -100,22 +100,24 @@ fn should_ban_invalid_transactions() { #[test] fn should_correctly_prune_transactions_providing_more_than_one_tag() { - let api = TestApi::default(); - *api.modifier.write() = Box::new(|v: &mut ValidTransaction| { + let api = Arc::new(TestApi::with_alice_nonce(209)); + api.set_valid_modifier(Box::new(|v: &mut ValidTransaction| { v.provides.push(vec![155]); - }); - let pool = Pool::new(Default::default(), Arc::new(api)); + })); + let pool = Pool::new(Default::default(), api.clone()); let xt = uxt(Alice, 209); block_on(pool.submit_one(&BlockId::number(0), xt.clone())).expect("1. Imported"); assert_eq!(pool.status().ready, 1); // remove the transaction that just got imported. + api.increment_nonce(Alice.into()); block_on(pool.prune_tags(&BlockId::number(1), vec![vec![209]], vec![])).expect("1. Pruned"); assert_eq!(pool.status().ready, 0); // it's re-imported to future assert_eq!(pool.status().future, 1); // so now let's insert another transaction that also provides the 155 + api.increment_nonce(Alice.into()); let xt = uxt(Alice, 211); block_on(pool.submit_one(&BlockId::number(2), xt.clone())).expect("2. Imported"); assert_eq!(pool.status().ready, 1); @@ -124,6 +126,7 @@ fn should_correctly_prune_transactions_providing_more_than_one_tag() { assert_eq!(pending, vec![211]); // prune it and make sure the pool is empty + api.increment_nonce(Alice.into()); block_on(pool.prune_tags(&BlockId::number(3), vec![vec![155]], vec![])).expect("2. Pruned"); assert_eq!(pool.status().ready, 0); assert_eq!(pool.status().future, 2); @@ -144,7 +147,6 @@ fn should_prune_old_during_maintenance() { assert_eq!(pool.status().ready, 0); } - #[test] fn should_revalidate_during_maintenance() { let xt1 = uxt(Alice, 209); @@ -154,12 +156,47 @@ fn should_revalidate_during_maintenance() { block_on(pool.submit_one(&BlockId::number(0), xt1.clone())).expect("1. Imported"); block_on(pool.submit_one(&BlockId::number(0), xt2.clone())).expect("2. Imported"); assert_eq!(pool.status().ready, 2); - assert_eq!(pool.api.validation_requests.read().len(), 2); + assert_eq!(pool.api.validation_requests().len(), 2); pool.api.push_block(1, vec![xt1.clone()]); block_on(pool.maintain(&BlockId::number(1), &[])); assert_eq!(pool.status().ready, 1); // test that pool revalidated transaction that left ready and not included in the block - assert_eq!(pool.api.validation_requests.read().len(), 3); + assert_eq!(pool.api.validation_requests().len(), 3); +} + +#[test] +fn should_resubmit_from_retracted_during_maintaince() { + let xt = uxt(Alice, 209); + let retracted_hash = Hash::random(); + + let pool = maintained_pool(); + + block_on(pool.submit_one(&BlockId::number(0), xt.clone())).expect("1. Imported"); + assert_eq!(pool.status().ready, 1); + + pool.api.push_block(1, vec![]); + pool.api.push_fork_block(retracted_hash, vec![xt.clone()]); + + block_on(pool.maintain(&BlockId::number(1), &[retracted_hash])); + assert_eq!(pool.status().ready, 1); +} + +#[test] +fn should_not_retain_invalid_hashes_from_retracted() { + let xt = uxt(Alice, 209); + let retracted_hash = Hash::random(); + + let pool = maintained_pool(); + + block_on(pool.submit_one(&BlockId::number(0), xt.clone())).expect("1. Imported"); + assert_eq!(pool.status().ready, 1); + + pool.api.push_block(1, vec![]); + pool.api.push_fork_block(retracted_hash, vec![xt.clone()]); + pool.api.add_invalid(&xt); + + block_on(pool.maintain(&BlockId::number(1), &[retracted_hash])); + assert_eq!(pool.status().ready, 0); } -- GitLab From e46f77b1fb1ec43aa635b6c71ce62a9a370a4a24 Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Mon, 27 Jan 2020 11:14:10 -0500 Subject: [PATCH 187/296] Remove references to frame_consensus from docs (#4582) * Simply remove references to frame_consensus * More thorough re-write * Update frame/session/src/lib.rs Co-Authored-By: thiolliere * on_initialize is not dispatchable * Attempt to fix test. * Actually fix test. * Actually ran passing test. * Update frame/session/src/lib.rs Co-Authored-By: thiolliere Co-authored-by: thiolliere --- frame/aura/src/lib.rs | 2 -- frame/session/src/lib.rs | 78 +++++++++++++++------------------------- frame/sudo/src/lib.rs | 1 - 3 files changed, 29 insertions(+), 52 deletions(-) diff --git a/frame/aura/src/lib.rs b/frame/aura/src/lib.rs index 1a711f314a..e2aafde9ef 100644 --- a/frame/aura/src/lib.rs +++ b/frame/aura/src/lib.rs @@ -33,8 +33,6 @@ //! //! - [Timestamp](../pallet_timestamp/index.html): The Timestamp module is used in Aura to track //! consensus rounds (via `slots`). -//! - [Consensus](../frame_consensus/index.html): The Consensus module does not relate directly to Aura, -//! but serves to manage offline reporting by implementing `ProvideInherent` in a similar way. //! //! ## References //! diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index 098b533077..f98e334cbb 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -30,92 +30,72 @@ //! //! - **Session:** A session is a period of time that has a constant set of validators. Validators can only join //! or exit the validator set at a session change. It is measured in block numbers. The block where a session is -//! ended is determined by the `ShouldSessionEnd` trait. When the session is ending, a new validator set +//! ended is determined by the `ShouldEndSession` trait. When the session is ending, a new validator set //! can be chosen by `OnSessionEnding` implementations. //! - **Session key:** A session key is actually several keys kept together that provide the various signing //! functions required by network authorities/validators in pursuit of their duties. //! - **Validator ID:** Every account has an associated validator ID. For some simple staking systems, this //! may just be the same as the account ID. For staking systems using a stash/controller model, //! the validator ID would be the stash account ID of the controller. -//! - **Session key configuration process:** A session key is set using `set_key` for use in the -//! next session. It is stored in `NextKeyFor`, a mapping between the caller's `ValidatorId` and the session -//! keys provided. `set_key` allows users to set their session key prior to being selected as validator. +//! - **Session key configuration process:** Session keys are set using `set_keys` for use not in +//! the next session, but the session after next. They are stored in `NextKeys`, a mapping between +//! the caller's `ValidatorId` and the session keys provided. `set_keys` allows users to set their +//! session key prior to being selected as validator. //! It is a public call since it uses `ensure_signed`, which checks that the origin is a signed account. -//! As such, the account ID of the origin stored in in `NextKeyFor` may not necessarily be associated with +//! As such, the account ID of the origin stored in `NextKeys` may not necessarily be associated with //! a block author or a validator. The session keys of accounts are removed once their account balance is zero. -//! - **Validator set session key configuration process:** Each session we iterate through the current -//! set of validator account IDs to check if a session key was created for it in the previous session -//! using `set_key`. If it was then we call `set_authority` from the [Consensus module](../frame_consensus/index.html) -//! and pass it a set of session keys (each associated with an account ID) as the session keys for the new -//! validator set. Lastly, if the session key of the current authority does not match any session keys stored under -//! its validator index in the `AuthorityStorageVec` mapping, then we update the mapping with its session -//! key and update the saved list of original authorities if necessary -//! (see https://github.com/paritytech/substrate/issues/1290). Note: Authorities are stored in the Consensus module. -//! They are represented by a validator account ID index from the Session module and allocated with a session -//! key for the length of the session. -//! - **Session length change process:** At the start of the next session we allocate a session index and record the -//! timestamp when the session started. If a `NextSessionLength` was recorded in the previous session, we record -//! it as the new session length. Additionally, if the new session length differs from the length of the -//! next session then we record a `LastLengthChange`. +//! - **Session length:** This pallet does not assume anything about the length of each session. +//! Rather, it relies on an implementation of `ShouldEndSession` to dictate a new session's start. +//! This pallet provides the `PeriodicSessions` struct for simple periodic sessions. //! - **Session rotation configuration:** Configure as either a 'normal' (rewardable session where rewards are //! applied) or 'exceptional' (slashable) session rotation. -//! - **Session rotation process:** The session is changed at the end of the final block of the current session -//! using the `on_finalize` method. It may be called by either an origin or internally from another runtime -//! module at the end of each block. +//! - **Session rotation process:** At the beginning of each block, the `on_initialize` function +//! queries the provided implementation of `ShouldEndSession`. If the session is to end the newly +//! activated validator IDs and session keys are taken from storage and passed to the +//! `SessionHandler`. The validator set supplied by `SessionManager::new_session` and the corresponding session +//! keys, which may have been registered via `set_keys` during the previous session, are written +//! to storage where they will wait one session before being passed to the `SessionHandler` +//! themselves. //! //! ### Goals //! -//! The Session module in Substrate is designed to make the following possible: +//! The Session pallet is designed to make the following possible: //! -//! - Set session keys of the validator set for the next session. -//! - Set the length of a session. +//! - Set session keys of the validator set for upcoming sessions. +//! - Control the length of sessions. //! - Configure and switch between either normal or exceptional session rotations. //! //! ## Interface //! //! ### Dispatchable Functions //! -//! - `set_key` - Set a validator's session key for the next session. -//! - `set_length` - Set a new session length to be applied upon the next session change. -//! - `force_new_session` - Force a new session that should be considered either a normal (rewardable) -//! or exceptional rotation. -//! - `on_finalize` - Called when a block is finalized. Will rotate session if it is the last -//! block of the current session. +//! - `set_keys` - Set a validator's session keys for upcoming sessions. //! //! ### Public Functions //! -//! - `validator_count` - Get the current number of validators. -//! - `last_length_change` - Get the block number when the session length last changed. -//! - `apply_force_new_session` - Force a new session. Can be called by other runtime modules. -//! - `set_validators` - Set the current set of validators. Can only be called by the Staking module. -//! - `check_rotate_session` - Rotate the session and apply rewards if necessary. Called after the Staking -//! module updates the authorities to the new validator set. -//! - `rotate_session` - Change to the next session. Register the new authority set. Update session keys. -//! Enact session length change if applicable. -//! - `ideal_session_duration` - Get the time of an ideal session. -//! - `blocks_remaining` - Get the number of blocks remaining in the current session, -//! excluding the current block. +//! - `rotate_session` - Change to the next session. Register the new authority set. Queue changes +//! for next session rotation. +//! - `disable_index` - Disable a validator by index. +//! - `disable` - Disable a validator by Validator ID //! //! ## Usage //! //! ### Example from the SRML //! -//! The [Staking module](../pallet_staking/index.html) uses the Session module to get the validator set. +//! The [Staking pallet](../pallet_staking/index.html) uses the Session pallet to get the validator set. //! //! ``` //! use pallet_session as session; -//! # fn not_executed() { //! -//! let validators = >::validators(); -//! # } +//! fn validators() -> Vec<::ValidatorId> { +//! >::validators() +//! } //! # fn main(){} //! ``` //! //! ## Related Modules //! -//! - [Consensus](../frame_consensus/index.html) //! - [Staking](../pallet_staking/index.html) -//! - [Timestamp](../pallet_timestamp/index.html) #![cfg_attr(not(feature = "std"), no_std)] @@ -478,7 +458,7 @@ decl_module! { fn deposit_event() = default; - /// Sets the session key(s) of the function caller to `key`. + /// Sets the session key(s) of the function caller to `keys`. /// Allows an account to set its session key prior to becoming a validator. /// This doesn't take effect until the next session. /// diff --git a/frame/sudo/src/lib.rs b/frame/sudo/src/lib.rs index e49596b4bd..ea436e2629 100644 --- a/frame/sudo/src/lib.rs +++ b/frame/sudo/src/lib.rs @@ -77,7 +77,6 @@ //! //! ## Related Modules //! -//! * [Consensus](../frame_consensus/index.html) //! * [Democracy](../pallet_democracy/index.html) //! //! [`Call`]: ./enum.Call.html -- GitLab From d2d7ab900d8a55661cb86aa1cc222a5964f021e1 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Mon, 27 Jan 2020 17:40:57 +0100 Subject: [PATCH 188/296] pallet-contracts: Refactor and comment `rent` module. (#4733) * Refactor and comment `rent` module. * impl_version bump * Add doc for Exempt * Simplify code. * Update bin/node/runtime/src/lib.rs Co-Authored-By: thiolliere * Update frame/contracts/src/exec.rs Co-Authored-By: Hero Bird Co-authored-by: thiolliere Co-authored-by: Hero Bird --- bin/node/runtime/src/lib.rs | 2 +- frame/contracts/src/exec.rs | 6 +- frame/contracts/src/lib.rs | 2 +- frame/contracts/src/rent.rs | 289 +++++++++++++++++++++++------------- 4 files changed, 192 insertions(+), 107 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 23cd7405dd..7e1082ef54 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 205, - impl_version: 205, + impl_version: 206, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/contracts/src/exec.rs b/frame/contracts/src/exec.rs index ceaccd35cb..cfbefa2a72 100644 --- a/frame/contracts/src/exec.rs +++ b/frame/contracts/src/exec.rs @@ -356,10 +356,10 @@ where }); } - // Assumption: pay_rent doesn't collide with overlay because - // pay_rent will be done on first call and dest contract and balance + // Assumption: `collect_rent` doesn't collide with overlay because + // `collect_rent` will be done on first call and destination contract and balance // cannot be changed before the first call - let contract_info = rent::pay_rent::(&dest); + let contract_info = rent::collect_rent::(&dest); // Calls to dead contracts always fail. if let Some(ContractInfo::Tombstone(_)) = contract_info { diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index d16462d8bf..1460ca3cf1 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -669,7 +669,7 @@ decl_module! { }; // If poking the contract has lead to eviction of the contract, give out the rewards. - if rent::try_evict::(&dest, handicap) == rent::RentOutcome::Evicted { + if rent::snitch_contract_should_be_evicted::(&dest, handicap) { T::Currency::deposit_into_existing(&rewarded, T::SurchargeReward::get())?; } } diff --git a/frame/contracts/src/rent.rs b/frame/contracts/src/rent.rs index 508511da4c..46f915e642 100644 --- a/frame/contracts/src/rent.rs +++ b/frame/contracts/src/rent.rs @@ -14,64 +14,91 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::{Module, RawEvent, BalanceOf, ContractInfo, ContractInfoOf, TombstoneContractInfo, - Trait, AliveContractInfo}; -use sp_runtime::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, - SaturatedConversion}; -use frame_support::traits::{Currency, ExistenceRequirement, Get, WithdrawReason, OnUnbalanced}; -use frame_support::StorageMap; +use crate::{ + AliveContractInfo, BalanceOf, ContractInfo, ContractInfoOf, Module, RawEvent, + TombstoneContractInfo, Trait, +}; use frame_support::storage::child; +use frame_support::traits::{Currency, ExistenceRequirement, Get, OnUnbalanced, WithdrawReason}; +use frame_support::StorageMap; +use sp_runtime::traits::{Bounded, CheckedDiv, CheckedMul, SaturatedConversion, Saturating, Zero}; -#[derive(PartialEq, Eq, Copy, Clone)] -#[must_use] -pub enum RentOutcome { - /// Exempted from rent iff: - /// * rent is offset completely by the `rent_deposit_offset`, - /// * or rent has already been paid for this block number, - /// * or account doesn't have a contract, - /// * or account has a tombstone. - Exempted, - /// Evicted iff: - /// * rent exceed rent allowance, - /// * or can't withdraw the rent, - /// * or go below subsistence threshold. - Evicted, - /// The outstanding dues were paid or were able to be paid. - Ok, +/// The amount to charge. +/// +/// This amount respects the contract's rent allowance and the subsistence deposit. +/// Because of that, charging the amount cannot remove the contract. +struct OutstandingAmount { + amount: BalanceOf, } -/// Evict and optionally pay dues (or check account can pay them otherwise) at the current -/// block number (modulo `handicap`, read on). -/// -/// `pay_rent` gives an ability to pay or skip paying rent. -/// `handicap` gives a way to check or pay the rent up to a moment in the past instead -/// of current block. +impl OutstandingAmount { + /// Create the new outstanding amount. + /// + /// The amount should be always withdrawable and it should not kill the account. + fn new(amount: BalanceOf) -> Self { + Self { amount } + } + + /// Returns the amount this instance wraps. + fn peek(&self) -> BalanceOf { + self.amount + } + + /// Withdraws the outstanding amount from the given account. + fn withdraw(self, account: &T::AccountId) { + if let Ok(imbalance) = T::Currency::withdraw( + account, + self.amount, + WithdrawReason::Fee.into(), + ExistenceRequirement::KeepAlive, + ) { + // This should never fail. However, let's err on the safe side. + T::RentPayment::on_unbalanced(imbalance); + } + } +} + +enum Verdict { + /// The contract is exempted from paying rent. + /// + /// For example, it already paid its rent in the current block, or it has enough deposit for not + /// paying rent at all. + Exempt, + /// Funds dropped below the subsistence deposit. + /// + /// Remove the contract along with it's storage. + Kill, + /// The contract cannot afford payment within its rent budget so it gets evicted. However, + /// because its balance is greater than the subsistence threshold it leaves a tombstone. + Evict { + amount: Option>, + }, + /// Everything is OK, we just only take some charge. + Charge { + amount: OutstandingAmount, + }, +} + +/// Consider the case for rent payment of the given account and returns a `Verdict`. /// -/// NOTE: This function acts eagerly, all modification are committed into the storage. -fn try_evict_or_and_pay_rent( +/// The `current_block_number` must be equal to the current block number. Use `handicap` do +/// change the reference block number. (See `snitch_contract_should_be_evicted` for more details). +fn consider_case( account: &T::AccountId, + current_block_number: T::BlockNumber, handicap: T::BlockNumber, - pay_rent: bool, -) -> (RentOutcome, Option>) { - let contract_info = >::get(account); - let contract = match contract_info { - None | Some(ContractInfo::Tombstone(_)) => return (RentOutcome::Exempted, contract_info), - Some(ContractInfo::Alive(contract)) => contract, - }; - - let current_block_number = >::block_number(); - + contract: &AliveContractInfo, +) -> Verdict { // How much block has passed since the last deduction for the contract. let blocks_passed = { // Calculate an effective block number, i.e. after adjusting for handicap. let effective_block_number = current_block_number.saturating_sub(handicap); - let n = effective_block_number.saturating_sub(contract.deduct_block); - if n.is_zero() { - // Rent has already been paid - return (RentOutcome::Exempted, Some(ContractInfo::Alive(contract))); - } - n + effective_block_number.saturating_sub(contract.deduct_block) }; + if blocks_passed.is_zero() { + // Rent has already been paid + return Verdict::Exempt; + } let balance = T::Currency::free_balance(account); @@ -92,7 +119,7 @@ fn try_evict_or_and_pay_rent( if fee_per_block.is_zero() { // The rent deposit offset reduced the fee to 0. This means that the contract // gets the rent for free. - return (RentOutcome::Exempted, Some(ContractInfo::Alive(contract))); + return Verdict::Exempt; } // The minimal amount of funds required for a contract not to be evicted. @@ -100,10 +127,7 @@ fn try_evict_or_and_pay_rent( if balance < subsistence_threshold { // The contract cannot afford to leave a tombstone, so remove the contract info altogether. - >::remove(account); - child::kill_storage(&contract.trie_id, contract.child_trie_unique_id()); - >::deposit_event(RawEvent::Evicted(account.clone(), false)); - return (RentOutcome::Evicted, None); + return Verdict::Kill; } let dues = fee_per_block @@ -127,75 +151,136 @@ fn try_evict_or_and_pay_rent( ) .is_ok(); - if can_withdraw_rent && (insufficient_rent || pay_rent) { - // Collect dues. - let imbalance = T::Currency::withdraw( - account, - dues_limited, - WithdrawReason::Fee.into(), - ExistenceRequirement::KeepAlive, - ) - .expect( - "Withdraw has been checked above; - dues_limited < rent_budget < balance - subsistence < balance - existential_deposit; - qed", - ); - - T::RentPayment::on_unbalanced(imbalance); - } - if insufficient_rent || !can_withdraw_rent { // The contract cannot afford the rent payment and has a balance above the subsistence // threshold, so it leaves a tombstone. + let amount = if can_withdraw_rent { + Some(OutstandingAmount::new(dues_limited)) + } else { + None + }; + return Verdict::Evict { amount }; + } - // Note: this operation is heavy. - let child_storage_root = child::child_root( - &contract.trie_id, - ); + return Verdict::Charge { + // We choose to use `dues_limited` here instead of `dues` just to err on the safer side. + amount: OutstandingAmount::new(dues_limited), + }; +} - let tombstone = >::new( - &child_storage_root[..], - contract.code_hash, - ); - let tombstone_info = ContractInfo::Tombstone(tombstone); - >::insert(account, &tombstone_info); +/// Enacts the given verdict and returns the updated `ContractInfo`. +/// +/// `alive_contract_info` should be from the same address as `account`. +fn enact_verdict( + account: &T::AccountId, + alive_contract_info: AliveContractInfo, + current_block_number: T::BlockNumber, + verdict: Verdict, +) -> Option> { + match verdict { + Verdict::Exempt => return Some(ContractInfo::Alive(alive_contract_info)), + Verdict::Kill => { + >::remove(account); + child::kill_storage( + &alive_contract_info.trie_id, + alive_contract_info.child_trie_unique_id(), + ); + >::deposit_event(RawEvent::Evicted(account.clone(), false)); + None + } + Verdict::Evict { amount } => { + if let Some(amount) = amount { + amount.withdraw(account); + } - child::kill_storage(&contract.trie_id, contract.child_trie_unique_id()); + // Note: this operation is heavy. + let child_storage_root = child::child_root(&alive_contract_info.trie_id); - >::deposit_event(RawEvent::Evicted(account.clone(), true)); + let tombstone = >::new( + &child_storage_root[..], + alive_contract_info.code_hash, + ); + let tombstone_info = ContractInfo::Tombstone(tombstone); + >::insert(account, &tombstone_info); - return (RentOutcome::Evicted, Some(tombstone_info)); - } + child::kill_storage( + &alive_contract_info.trie_id, + alive_contract_info.child_trie_unique_id(), + ); - if pay_rent { - let contract_info = ContractInfo::Alive(AliveContractInfo:: { - rent_allowance: contract.rent_allowance - dues, // rent_allowance is not exceeded - deduct_block: current_block_number, - ..contract - }); - - >::insert(account, &contract_info); + >::deposit_event(RawEvent::Evicted(account.clone(), true)); + Some(tombstone_info) + } + Verdict::Charge { amount } => { + let contract_info = ContractInfo::Alive(AliveContractInfo:: { + rent_allowance: alive_contract_info.rent_allowance - amount.peek(), + deduct_block: current_block_number, + ..alive_contract_info + }); + >::insert(account, &contract_info); - return (RentOutcome::Ok, Some(contract_info)); + amount.withdraw(account); + Some(contract_info) + } } - - (RentOutcome::Ok, Some(ContractInfo::Alive(contract))) } /// Make account paying the rent for the current block number /// -/// NOTE: This function acts eagerly. -pub fn pay_rent(account: &T::AccountId) -> Option> { - try_evict_or_and_pay_rent::(account, Zero::zero(), true).1 +/// NOTE this function performs eviction eagerly. All changes are read and written directly to +/// storage. +pub fn collect_rent(account: &T::AccountId) -> Option> { + let contract_info = >::get(account); + let alive_contract_info = match contract_info { + None | Some(ContractInfo::Tombstone(_)) => return contract_info, + Some(ContractInfo::Alive(contract)) => contract, + }; + + let current_block_number = >::block_number(); + let verdict = consider_case::( + account, + current_block_number, + Zero::zero(), + &alive_contract_info, + ); + enact_verdict(account, alive_contract_info, current_block_number, verdict) } -/// Evict the account if it should be evicted at the given block number. +/// Process a snitch that a contract under the given address should be evicted. +/// +/// Enact the eviction right away if the contract should be evicted and return true. +/// Otherwise, **do nothing** and return false. /// -/// `handicap` gives a way to check or pay the rent up to a moment in the past instead +/// The `handicap` parameter gives a way to check the rent to a moment in the past instead /// of current block. E.g. if the contract is going to be evicted at the current block, -/// `handicap=1` can defer the eviction for 1 block. +/// `handicap = 1` can defer the eviction for 1 block. This is useful to handicap certain snitchers +/// relative to others. /// -/// NOTE: This function acts eagerly. -pub fn try_evict(account: &T::AccountId, handicap: T::BlockNumber) -> RentOutcome { - try_evict_or_and_pay_rent::(account, handicap, false).0 +/// NOTE this function performs eviction eagerly. All changes are read and written directly to +/// storage. +pub fn snitch_contract_should_be_evicted( + account: &T::AccountId, + handicap: T::BlockNumber, +) -> bool { + let contract_info = >::get(account); + let alive_contract_info = match contract_info { + None | Some(ContractInfo::Tombstone(_)) => return false, + Some(ContractInfo::Alive(contract)) => contract, + }; + let current_block_number = >::block_number(); + let verdict = consider_case::( + account, + current_block_number, + handicap, + &alive_contract_info, + ); + + // Enact the verdict only if the contract gets removed. + match verdict { + Verdict::Kill | Verdict::Evict { .. } => { + enact_verdict(account, alive_contract_info, current_block_number, verdict); + true + } + _ => false, + } } -- GitLab From 6027e31d23f6e9b5b06c661a74f266e018bd57d0 Mon Sep 17 00:00:00 2001 From: gabriel klawitter Date: Mon, 27 Jan 2020 18:22:52 +0100 Subject: [PATCH 189/296] ci: fix runtime version check (#4741) --- .maintain/gitlab/check_runtime.sh | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/.maintain/gitlab/check_runtime.sh b/.maintain/gitlab/check_runtime.sh index f989904cb5..102c634dd9 100755 --- a/.maintain/gitlab/check_runtime.sh +++ b/.maintain/gitlab/check_runtime.sh @@ -9,11 +9,12 @@ set -e # fail on any error -# give some context -git log --graph --oneline --decorate=short -n 10 VERSIONS_FILE="bin/node/runtime/src/lib.rs" +boldprint () { printf "|\n| \033[1m${@}\033[0m\n|\n" ; } +boldcat () { printf "|\n"; while read l; do printf "| \033[1m${l}\033[0m\n"; done; printf "|\n" ; } + github_label () { echo echo "# run github-api job for labeling it ${1}" @@ -26,21 +27,19 @@ github_label () { } +boldprint "latest 10 commits of ${CI_COMMIT_REF_NAME}" +git log --graph --oneline --decorate=short -n 10 +boldprint "make sure the master branch is available in shallow clones" git fetch --depth=${GIT_DEPTH:-100} origin master -# check if master is part of this checkout -if ! git log -n 1 origin/master -then - echo "unable to check for runtime changes: checkout does not contain origin/master branch" - exit 3 -fi -# check if the wasm sources changed +boldprint "check if the wasm sources changed" if ! git diff --name-only origin/master...${CI_COMMIT_SHA} \ - | grep -q -e '^bin/node/src/runtime' -e '^frame/' -e '^primitives/sr-' | grep -v -e '^primitives/sr-arithmetic/fuzzer' + | grep -v -e '^primitives/sr-arithmetic/fuzzer' \ + | grep -q -e '^bin/node/src/runtime' -e '^frame/' -e '^primitives/sr-' then - cat <<-EOT + boldcat <<-EOT no changes to the runtime source code detected @@ -61,13 +60,13 @@ sub_spec_version="$(git diff origin/master...${CI_COMMIT_SHA} ${VERSIONS_FILE} \ | sed -n -r "s/^\-[[:space:]]+spec_version: +([0-9]+),$/\1/p")" -# see if the version and the binary blob changed + if [ "${add_spec_version}" != "${sub_spec_version}" ] then github_label "B2-breaksapi" - cat <<-EOT + boldcat <<-EOT changes to the runtime sources and changes in the spec version. @@ -89,7 +88,7 @@ else # see if the impl version changed if [ "${add_impl_version}" != "${sub_impl_version}" ] then - cat <<-EOT + boldcat <<-EOT changes to the runtime sources and changes in the impl version. @@ -100,7 +99,7 @@ else fi - cat <<-EOT + boldcat <<-EOT wasm source files changed but not the spec/impl version and the runtime binary blob. If changes made do not alter logic, just bump 'impl_version'. @@ -114,8 +113,6 @@ else versions file: ${VERSIONS_FILE} EOT - - # drop through into pushing `gotissues` and exit 1... fi # dropped through. there's something wrong; exit 1. -- GitLab From d2bb42d314bbdcc48c0cf01cb59f7ab10294ebad Mon Sep 17 00:00:00 2001 From: thiolliere Date: Mon, 27 Jan 2020 18:23:10 +0100 Subject: [PATCH 190/296] Remove default hasher (#4739) * remove default hasher from decl_storage! * fix decl_storage declarations --- frame/assets/src/lib.rs | 4 +- frame/babe/src/lib.rs | 2 +- frame/balances/src/lib.rs | 12 +++-- frame/collective/src/lib.rs | 6 ++- frame/contracts/src/lib.rs | 6 +-- frame/democracy/src/lib.rs | 25 ++++++---- frame/elections-phragmen/src/lib.rs | 4 +- frame/elections/src/lib.rs | 13 ++++-- frame/evm/src/lib.rs | 6 +-- frame/example/src/lib.rs | 6 +-- frame/generic-asset/src/lib.rs | 14 ++++-- frame/grandpa/src/lib.rs | 2 +- frame/identity/src/lib.rs | 9 ++-- frame/im-online/src/lib.rs | 6 ++- frame/indices/src/lib.rs | 2 +- frame/nicks/src/lib.rs | 2 +- frame/offences/src/lib.rs | 8 ++-- frame/recovery/src/lib.rs | 6 ++- frame/scored-pool/src/lib.rs | 2 +- frame/session/src/historical.rs | 7 ++- frame/society/src/lib.rs | 11 +++-- frame/staking/src/lib.rs | 30 +++++++----- frame/support/procedural/src/lib.rs | 17 ++++--- frame/support/procedural/src/storage/parse.rs | 18 ++++---- frame/support/src/lib.rs | 13 ++++-- frame/support/src/storage/generator/mod.rs | 2 +- frame/support/test/tests/decl_storage.rs | 46 ++++++++++--------- frame/support/test/tests/final_keys.rs | 16 +++---- frame/support/test/tests/genesisconfig.rs | 2 +- frame/support/test/tests/instance.rs | 10 ++-- frame/support/test/tests/issue2219.rs | 8 ++-- frame/system/src/lib.rs | 9 ++-- frame/treasury/src/lib.rs | 2 +- test-utils/runtime/src/system.rs | 2 +- utils/frame/rpc/support/src/lib.rs | 6 +-- 35 files changed, 193 insertions(+), 141 deletions(-) diff --git a/frame/assets/src/lib.rs b/frame/assets/src/lib.rs index f77eb663db..8a62fa9d82 100644 --- a/frame/assets/src/lib.rs +++ b/frame/assets/src/lib.rs @@ -228,11 +228,11 @@ decl_error! { decl_storage! { trait Store for Module as Assets { /// The number of units of assets held by any given account. - Balances: map (T::AssetId, T::AccountId) => T::Balance; + Balances: map hasher(blake2_256) (T::AssetId, T::AccountId) => T::Balance; /// The next asset identifier up for grabs. NextAssetId get(fn next_asset_id): T::AssetId; /// The total unit supply of an asset. - TotalSupply: map T::AssetId => T::Balance; + TotalSupply: map hasher(blake2_256) T::AssetId => T::Balance; } } diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index f249ca9e29..ab1822712f 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -145,7 +145,7 @@ decl_storage! { /// We reset all segments and return to `0` at the beginning of every /// epoch. SegmentIndex build(|_| 0): u32; - UnderConstruction: map u32 => Vec<[u8; 32 /* VRF_OUTPUT_LENGTH */]>; + UnderConstruction: map hasher(blake2_256) u32 => Vec<[u8; 32 /* VRF_OUTPUT_LENGTH */]>; /// Temporary value (cleared at block finalization) which is `Some` /// if per-block initialization has already been called for current block. diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index b488b96701..77d28e89e9 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -374,7 +374,9 @@ decl_storage! { }) }) }).collect::>() - }): map T::AccountId => Option>; + }): + map hasher(blake2_256) T::AccountId + => Option>; /// The 'free' balance of a given account. /// @@ -389,7 +391,7 @@ decl_storage! { /// collapsed to zero if it ever becomes less than `ExistentialDeposit`. pub FreeBalance get(fn free_balance) build(|config: &GenesisConfig| config.balances.clone()): - map T::AccountId => T::Balance; + map hasher(blake2_256) T::AccountId => T::Balance; /// The amount of the balance of a given account that is externally reserved; this can still get /// slashed, but gets slashed last of all. @@ -402,10 +404,12 @@ decl_storage! { /// /// `frame_system::AccountNonce` is also deleted if `FreeBalance` is also zero (it also gets /// collapsed to zero if it ever becomes less than `ExistentialDeposit`.) - pub ReservedBalance get(fn reserved_balance): map T::AccountId => T::Balance; + pub ReservedBalance get(fn reserved_balance): + map hasher(blake2_256) T::AccountId => T::Balance; /// Any liquidity locks on some account balances. - pub Locks get(fn locks): map T::AccountId => Vec>; + pub Locks get(fn locks): + map hasher(blake2_256) T::AccountId => Vec>; } add_extra_genesis { config(balances): Vec<(T::AccountId, T::Balance)>; diff --git a/frame/collective/src/lib.rs b/frame/collective/src/lib.rs index 0d1032cca4..8d811b8dec 100644 --- a/frame/collective/src/lib.rs +++ b/frame/collective/src/lib.rs @@ -87,9 +87,11 @@ decl_storage! { /// The hashes of the active proposals. pub Proposals get(fn proposals): Vec; /// Actual proposal for a given hash, if it's current. - pub ProposalOf get(fn proposal_of): map T::Hash => Option<>::Proposal>; + pub ProposalOf get(fn proposal_of): + map hasher(blake2_256) T::Hash => Option<>::Proposal>; /// Votes on a given proposal, if it is ongoing. - pub Voting get(fn voting): map T::Hash => Option>; + pub Voting get(fn voting): + map hasher(blake2_256) T::Hash => Option>; /// Proposals so far. pub ProposalCount get(fn proposal_count): u32; /// The current members of the collective. This is stored sorted (just by value). diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index 1460ca3cf1..6324b3fabc 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -942,13 +942,13 @@ decl_storage! { /// Current cost schedule for contracts. CurrentSchedule get(fn current_schedule) config(): Schedule = Schedule::default(); /// A mapping from an original code hash to the original code, untouched by instrumentation. - pub PristineCode: map CodeHash => Option>; + pub PristineCode: map hasher(blake2_256) CodeHash => Option>; /// A mapping between an original code hash and instrumented wasm code, ready for execution. - pub CodeStorage: map CodeHash => Option; + pub CodeStorage: map hasher(blake2_256) CodeHash => Option; /// The subtrie counter. pub AccountCounter: u64 = 0; /// The code associated with a given account. - pub ContractInfoOf: map T::AccountId => Option>; + pub ContractInfoOf: map hasher(blake2_256) T::AccountId => Option>; /// The price of one unit of gas. GasPrice get(fn gas_price) config(): BalanceOf = 1.into(); } diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index d7790be8f7..682ce59f25 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -268,9 +268,12 @@ decl_storage! { pub PublicProps get(fn public_props): Vec<(PropIndex, T::Hash, T::AccountId)>; /// Map of hashes to the proposal preimage, along with who registered it and their deposit. /// The block number is the block at which it was deposited. - pub Preimages: map T::Hash => Option<(Vec, T::AccountId, BalanceOf, T::BlockNumber)>; + pub Preimages: + map hasher(blake2_256) T::Hash + => Option<(Vec, T::AccountId, BalanceOf, T::BlockNumber)>; /// Those who have locked a deposit. - pub DepositOf get(fn deposit_of): map PropIndex => Option<(BalanceOf, Vec)>; + pub DepositOf get(fn deposit_of): + map hasher(blake2_256) PropIndex => Option<(BalanceOf, Vec)>; /// The next free referendum index, aka the number of referenda started so far. pub ReferendumCount get(fn referendum_count) build(|_| 0 as ReferendumIndex): ReferendumIndex; @@ -279,25 +282,28 @@ decl_storage! { pub LowestUnbaked get(fn lowest_unbaked) build(|_| 0 as ReferendumIndex): ReferendumIndex; /// Information concerning any given referendum. pub ReferendumInfoOf get(fn referendum_info): - map ReferendumIndex => Option>; + map hasher(blake2_256) ReferendumIndex + => Option>; /// Queue of successful referenda to be dispatched. Stored ordered by block number. pub DispatchQueue get(fn dispatch_queue): Vec<(T::BlockNumber, T::Hash, ReferendumIndex)>; /// Get the voters for the current proposal. - pub VotersFor get(fn voters_for): map ReferendumIndex => Vec; + pub VotersFor get(fn voters_for): + map hasher(blake2_256) 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(fn vote_of): map (ReferendumIndex, T::AccountId) => Vote; + pub VoteOf get(fn vote_of): map hasher(blake2_256) (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(fn proxy): map T::AccountId => Option; + pub Proxy get(fn proxy): map hasher(blake2_256) T::AccountId => Option; /// Get the account (and lock periods) to which another account is delegating vote. - pub Delegations get(fn delegations): linked_map T::AccountId => (T::AccountId, Conviction); + pub Delegations get(fn delegations): + linked_map hasher(blake2_256) T::AccountId => (T::AccountId, Conviction); /// True if the last referendum tabled was submitted externally. False if it was a public /// proposal. @@ -311,10 +317,11 @@ decl_storage! { /// 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(fn blacklist): map T::Hash => Option<(T::BlockNumber, Vec)>; + pub Blacklist get(fn blacklist): + map hasher(blake2_256) T::Hash => Option<(T::BlockNumber, Vec)>; /// Record of all proposals that have been subject to emergency cancellation. - pub Cancellations: map T::Hash => bool; + pub Cancellations: map hasher(blake2_256) T::Hash => bool; } } diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 1d9573cbbf..e022b24f01 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -157,9 +157,9 @@ decl_storage! { pub ElectionRounds get(fn election_rounds): u32 = Zero::zero(); /// Votes of a particular voter, with the round index of the votes. - pub VotesOf get(fn votes_of): linked_map T::AccountId => Vec; + pub VotesOf get(fn votes_of): linked_map hasher(blake2_256) T::AccountId => Vec; /// Locked stake of a voter. - pub StakeOf get(fn stake_of): map T::AccountId => BalanceOf; + pub StakeOf get(fn stake_of): map hasher(blake2_256) T::AccountId => BalanceOf; /// The present candidate list. Sorted based on account-id. A current member or a runner can /// never enter this vector and is always implicitly assumed to be a candidate. diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index e722c4db80..504aa5d8a0 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -235,14 +235,17 @@ decl_storage! { // 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(fn approvals_of): map (T::AccountId, SetIndex) => Vec; + pub ApprovalsOf get(fn approvals_of): + map hasher(blake2_256) (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(fn candidate_reg_info): map T::AccountId => Option<(VoteIndex, u32)>; + pub RegisterInfoOf get(fn candidate_reg_info): + map hasher(blake2_256) T::AccountId => Option<(VoteIndex, u32)>; /// Basic information about a voter. - pub VoterInfoOf get(fn voter_info): map T::AccountId => Option>>; + pub VoterInfoOf get(fn voter_info): + map hasher(blake2_256) T::AccountId => Option>>; /// The present voter list (chunked and capped at [`VOTER_SET_SIZE`]). - pub Voters get(fn voters): map SetIndex => Vec>; + pub Voters get(fn voters): map hasher(blake2_256) SetIndex => Vec>; /// the next free set to store a voter in. This will keep growing. pub NextVoterSet get(fn next_nonfull_voter_set): SetIndex = 0; /// Current number of Voters. @@ -263,7 +266,7 @@ decl_storage! { /// Who is able to vote for whom. Value is the fund-holding account, key is the /// vote-transaction-sending account. - pub Proxy get(fn proxy): map T::AccountId => Option; + pub Proxy get(fn proxy): map hasher(blake2_256) T::AccountId => Option; } } diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index 8d50412724..9c79274b4a 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -163,9 +163,9 @@ pub trait Trait: frame_system::Trait + pallet_timestamp::Trait { decl_storage! { trait Store for Module as Example { - Accounts get(fn accounts) config(): map H160 => Account; - AccountCodes: map H160 => Vec; - AccountStorages: double_map H160, H256 => H256; + Accounts get(fn accounts) config(): map hasher(blake2_256) H160 => Account; + AccountCodes: map hasher(blake2_256) H160 => Vec; + AccountStorages: double_map hasher(blake2_256) H160, hasher(blake2_256) H256 => H256; } } diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index 80569a1b57..ab85de8ea9 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -329,7 +329,7 @@ decl_storage! { // `pub? Name get(fn getter_name)? [config()|config(myname)] [build(|_| {...})] : (= )?;` // where `` is either: // - `Type` (a basic value item); or - // - `map KeyType => ValueType` (a map item). + // - `map hasher(HasherKind) KeyType => ValueType` (a map item). // // Note that there are two optional modifiers for the storage type declaration. // - `Foo: Option`: @@ -339,7 +339,7 @@ decl_storage! { // - `Foo::put(1); Foo::get()` returns `1`; // - `Foo::kill(); Foo::get()` returns `0` (u32::default()). // e.g. Foo: u32; - // e.g. pub Bar get(fn bar): map T::AccountId => Vec<(T::Balance, u64)>; + // e.g. pub Bar get(fn bar): map hasher(blake2_256) T::AccountId => Vec<(T::Balance, u64)>; // // For basic value items, you'll get a type which implements // `frame_support::StorageValue`. For map items, you'll get a type which @@ -351,7 +351,7 @@ decl_storage! { Dummy get(fn dummy) config(): Option; // A map that has enumerable entries. - Bar get(fn bar) config(): linked_map T::AccountId => T::Balance; + Bar get(fn bar) config(): linked_map hasher(blake2_256) T::AccountId => T::Balance; // this one uses the default, we'll demonstrate the usage of 'mutate' API. Foo get(fn foo) config(): T::Balance; diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index 3b509a683d..ca6812da8e 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -454,22 +454,26 @@ decl_storage! { pub TotalIssuance get(fn total_issuance) build(|config: &GenesisConfig| { let issuance = config.initial_balance * (config.endowed_accounts.len() as u32).into(); config.assets.iter().map(|id| (id.clone(), issuance)).collect::>() - }): map T::AssetId => T::Balance; + }): map hasher(blake2_256) T::AssetId => T::Balance; /// The free balance of a given asset under an account. - pub FreeBalance: double_map T::AssetId, hasher(twox_128) T::AccountId => T::Balance; + pub FreeBalance: + double_map hasher(blake2_256) T::AssetId, hasher(twox_128) T::AccountId => T::Balance; /// The reserved balance of a given asset under an account. - pub ReservedBalance: double_map T::AssetId, hasher(twox_128) T::AccountId => T::Balance; + pub ReservedBalance: + double_map hasher(blake2_256) T::AssetId, hasher(twox_128) T::AccountId => T::Balance; /// Next available ID for user-created asset. pub NextAssetId get(fn next_asset_id) config(): T::AssetId; /// Permission options for a given asset. - pub Permissions get(fn get_permission): map T::AssetId => PermissionVersions; + pub Permissions get(fn get_permission): + map hasher(blake2_256) T::AssetId => PermissionVersions; /// Any liquidity locks on some account balances. - pub Locks get(fn locks): map T::AccountId => Vec>; + pub Locks get(fn locks): + map hasher(blake2_256) T::AccountId => Vec>; /// The identity of the asset which is the one that is designated for the chain's staking system. pub StakingAssetId get(fn staking_asset_id) config(): T::AssetId; diff --git a/frame/grandpa/src/lib.rs b/frame/grandpa/src/lib.rs index f2ef16dc0e..71440f7aac 100644 --- a/frame/grandpa/src/lib.rs +++ b/frame/grandpa/src/lib.rs @@ -175,7 +175,7 @@ decl_storage! { CurrentSetId get(fn current_set_id) build(|_| fg_primitives::SetId::default()): SetId; /// A mapping from grandpa set ID to the index of the *most recent* session for which its members were responsible. - SetIdSession get(fn session_for_set): map SetId => Option; + SetIdSession get(fn session_for_set): map hasher(blake2_256) SetId => Option; } add_extra_genesis { config(authorities): AuthorityList; diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index b23407406b..0bcc33b217 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -377,16 +377,19 @@ pub struct RegistrarInfo< decl_storage! { trait Store for Module as Sudo { /// Information that is pertinent to identify the entity behind an account. - pub IdentityOf get(fn identity): map T::AccountId => Option>>; + pub IdentityOf get(fn identity): + map hasher(blake2_256) T::AccountId => Option>>; /// The super-identity of an alternative "sub" identity together with its name, within that /// context. If the account is not some other account's sub-identity, then just `None`. - pub SuperOf get(fn super_of): map T::AccountId => Option<(T::AccountId, Data)>; + pub SuperOf get(fn super_of): + map hasher(blake2_256) T::AccountId => Option<(T::AccountId, Data)>; /// Alternative "sub" identities of this account. /// /// The first item is the deposit, the second is a vector of the accounts. - pub SubsOf get(fn subs): map T::AccountId => (BalanceOf, Vec); + pub SubsOf get(fn subs): + map hasher(blake2_256) T::AccountId => (BalanceOf, Vec); /// The set of registrars. Not expected to get very big as can only be added through a /// special origin (likely a council motion). diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index 065ca7e3bf..ab1c6d7fd3 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -233,12 +233,14 @@ decl_storage! { /// For each session index, we keep a mapping of `AuthIndex` /// to `offchain::OpaqueNetworkState`. - ReceivedHeartbeats get(fn received_heartbeats): double_map SessionIndex, AuthIndex + ReceivedHeartbeats get(fn received_heartbeats): + double_map hasher(blake2_256) SessionIndex, hasher(blake2_256) AuthIndex => Option>; /// For each session index, we keep a mapping of `T::ValidatorId` to the /// number of blocks authored by the given authority. - AuthoredBlocks get(fn authored_blocks): double_map SessionIndex, T::ValidatorId => u32; + AuthoredBlocks get(fn authored_blocks): + double_map hasher(blake2_256) SessionIndex, hasher(blake2_256) T::ValidatorId => u32; } add_extra_genesis { config(keys): Vec; diff --git a/frame/indices/src/lib.rs b/frame/indices/src/lib.rs index 8d7e37d5df..e6a2a7c144 100644 --- a/frame/indices/src/lib.rs +++ b/frame/indices/src/lib.rs @@ -108,7 +108,7 @@ decl_storage! { ].to_owned(), )) .collect::>() - }): map T::AccountIndex => Vec; + }): map hasher(blake2_256) T::AccountIndex => Vec; } add_extra_genesis { config(ids): Vec; diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index 1d33d12ae4..79365ff713 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -78,7 +78,7 @@ pub trait Trait: frame_system::Trait { decl_storage! { trait Store for Module as Sudo { /// The lookup table for names. - NameOf: map T::AccountId => Option<(Vec, BalanceOf)>; + NameOf: map hasher(blake2_256) T::AccountId => Option<(Vec, BalanceOf)>; } } diff --git a/frame/offences/src/lib.rs b/frame/offences/src/lib.rs index 310c018d76..2b625873f0 100644 --- a/frame/offences/src/lib.rs +++ b/frame/offences/src/lib.rs @@ -54,10 +54,12 @@ pub trait Trait: frame_system::Trait { decl_storage! { trait Store for Module as Offences { /// The primary structure that holds all offence records keyed by report identifiers. - Reports get(fn reports): map ReportIdOf => Option>; + Reports get(fn reports): map hasher(blake2_256) ReportIdOf => Option>; /// A vector of reports of the same kind that happened at the same time slot. - ConcurrentReportsIndex: double_map Kind, OpaqueTimeSlot => Vec>; + ConcurrentReportsIndex: + double_map hasher(blake2_256) Kind, hasher(blake2_256) OpaqueTimeSlot + => Vec>; /// Enumerates all reports of a kind along with the time they happened. /// @@ -65,7 +67,7 @@ decl_storage! { /// /// Note that the actual type of this mapping is `Vec`, this is because values of /// different types are not supported at the moment so we are doing the manual serialization. - ReportsByKindIndex: map Kind => Vec; // (O::TimeSlot, ReportIdOf) + ReportsByKindIndex: map hasher(blake2_256) Kind => Vec; // (O::TimeSlot, ReportIdOf) } } diff --git a/frame/recovery/src/lib.rs b/frame/recovery/src/lib.rs index f63f216fc7..0309fec12a 100644 --- a/frame/recovery/src/lib.rs +++ b/frame/recovery/src/lib.rs @@ -242,7 +242,8 @@ decl_storage! { trait Store for Module as Recovery { /// The set of recoverable accounts and their recovery configuration. pub Recoverable get(fn recovery_config): - map T::AccountId => Option, T::AccountId>>; + map hasher(blake2_256) T::AccountId + => Option, T::AccountId>>; /// Active recovery attempts. /// /// First account is the account to be recovered, and the second account @@ -253,7 +254,8 @@ decl_storage! { /// The final list of recovered accounts. /// /// Map from the recovered account to the user who can access it. - pub Recovered get(fn recovered_account): map T::AccountId => Option; + pub Recovered get(fn recovered_account): + map hasher(blake2_256) T::AccountId => Option; } } diff --git a/frame/scored-pool/src/lib.rs b/frame/scored-pool/src/lib.rs index a8fc69971a..2a73c4bb68 100644 --- a/frame/scored-pool/src/lib.rs +++ b/frame/scored-pool/src/lib.rs @@ -165,7 +165,7 @@ decl_storage! { /// check if a candidate is already in the pool, without having to /// iterate over the entire pool (the `Pool` is not sorted by /// `T::AccountId`, but by `T::Score` instead). - CandidateExists get(fn candidate_exists): map T::AccountId => bool; + CandidateExists get(fn candidate_exists): map hasher(blake2_256) T::AccountId => bool; /// The current membership, stored as an ordered Vec. Members get(fn members): Vec; diff --git a/frame/session/src/historical.rs b/frame/session/src/historical.rs index e67a2ae1b0..76175cd6be 100644 --- a/frame/session/src/historical.rs +++ b/frame/session/src/historical.rs @@ -55,11 +55,14 @@ pub trait Trait: super::Trait { decl_storage! { trait Store for Module as Session { /// Mapping from historical session indices to session-data root hash and validator count. - HistoricalSessions get(fn historical_root): map SessionIndex => Option<(T::Hash, ValidatorCount)>; + HistoricalSessions get(fn historical_root): + map hasher(blake2_256) SessionIndex => Option<(T::Hash, ValidatorCount)>; /// The range of historical sessions we store. [first, last) StoredRange: Option<(SessionIndex, SessionIndex)>; /// Deprecated. - CachedObsolete: map SessionIndex => Option>; + CachedObsolete: + map hasher(blake2_256) SessionIndex + => Option>; } } diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index f4e5904ea4..e45ac30bce 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -414,7 +414,8 @@ decl_storage! { /// The set of suspended candidates. pub SuspendedCandidates get(suspended_candidate): - map T::AccountId => Option<(BalanceOf, BidKind>)>; + map hasher(blake2_256) T::AccountId + => Option<(BalanceOf, BidKind>)>; /// Amount of our account balance that is specifically for the next round's bid(s). pub Pot get(fn pot) config(): BalanceOf; @@ -431,19 +432,19 @@ decl_storage! { }): Vec; /// The set of suspended members. - pub SuspendedMembers get(fn suspended_member): map T::AccountId => bool; + pub SuspendedMembers get(fn suspended_member): map hasher(blake2_256) T::AccountId => bool; /// The current bids, stored ordered by the value of the bid. Bids: Vec>>; /// Members currently vouching or banned from vouching again - Vouching get(fn vouching): map T::AccountId => Option; + Vouching get(fn vouching): map hasher(blake2_256) T::AccountId => Option; /// Pending payouts; ordered by block number, with the amount that should be paid out. - Payouts: map T::AccountId => Vec<(T::BlockNumber, BalanceOf)>; + Payouts: map hasher(blake2_256) T::AccountId => Vec<(T::BlockNumber, BalanceOf)>; /// The ongoing number of losing votes cast by the member. - Strikes: map T::AccountId => StrikeCount; + Strikes: map hasher(blake2_256) T::AccountId => StrikeCount; /// Double map from Candidate -> Voter -> (Maybe) Vote. Votes: double_map diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 7f1ad37b32..21ac24bc68 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -671,28 +671,32 @@ decl_storage! { pub Invulnerables get(fn invulnerables) config(): Vec; /// Map from all locked "stash" accounts to the controller account. - pub Bonded get(fn bonded): map T::AccountId => Option; + pub Bonded get(fn bonded): map hasher(blake2_256) T::AccountId => Option; /// Map from all (unlocked) "controller" accounts to the info regarding the staking. pub Ledger get(fn ledger): - map T::AccountId => Option>>; + map hasher(blake2_256) T::AccountId + => Option>>; /// Where the reward payment should be made. Keyed by stash. - pub Payee get(fn payee): map T::AccountId => RewardDestination; + pub Payee get(fn payee): map hasher(blake2_256) T::AccountId => RewardDestination; /// The map from (wannabe) validator stash key to the preferences of that validator. - pub Validators get(fn validators): linked_map T::AccountId => ValidatorPrefs; + pub Validators get(fn validators): + linked_map hasher(blake2_256) T::AccountId => ValidatorPrefs; /// The map from nominator stash key to the set of stash keys of all validators to nominate. /// /// NOTE: is private so that we can ensure upgraded before all typical accesses. /// Direct storage APIs can still bypass this protection. - Nominators get(fn nominators): linked_map T::AccountId => Option>; + Nominators get(fn nominators): + linked_map hasher(blake2_256) T::AccountId => Option>; /// 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(fn stakers): map T::AccountId => Exposure>; + pub Stakers get(fn stakers): + map hasher(blake2_256) T::AccountId => Exposure>; /// The currently elected validator set keyed by stash account ID. pub CurrentElected get(fn current_elected): Vec; @@ -729,7 +733,8 @@ decl_storage! { pub CanceledSlashPayout get(fn canceled_payout) config(): BalanceOf; /// All unapplied slashes that are queued for later. - pub UnappliedSlashes: map EraIndex => Vec>>; + pub UnappliedSlashes: + map hasher(blake2_256) EraIndex => Vec>>; /// A mapping from still-bonded eras to the first session index of that era. BondedEras: Vec<(EraIndex, SessionIndex)>; @@ -737,19 +742,22 @@ decl_storage! { /// All slashing events on validators, mapped by era to the highest slash proportion /// and slash value of the era. ValidatorSlashInEra: - double_map EraIndex, hasher(twox_128) T::AccountId => Option<(Perbill, BalanceOf)>; + double_map hasher(blake2_256) EraIndex, hasher(twox_128) T::AccountId + => Option<(Perbill, BalanceOf)>; /// All slashing events on nominators, mapped by era to the highest slash value of the era. NominatorSlashInEra: - double_map EraIndex, hasher(twox_128) T::AccountId => Option>; + double_map hasher(blake2_256) EraIndex, hasher(twox_128) T::AccountId + => Option>; /// Slashing spans for stash accounts. - SlashingSpans: map T::AccountId => Option; + SlashingSpans: map hasher(blake2_256) T::AccountId => Option; /// Records information about the maximum slash of a stash within a slashing span, /// as well as how much reward has been paid out. SpanSlash: - map (T::AccountId, slashing::SpanIndex) => slashing::SpanRecord>; + map hasher(blake2_256) (T::AccountId, slashing::SpanIndex) + => slashing::SpanRecord>; /// The earliest era for which we have a pending, unapplied slash. EarliestUnappliedSlash: Option; diff --git a/frame/support/procedural/src/lib.rs b/frame/support/procedural/src/lib.rs index 7c27bc2a04..b4376915a2 100644 --- a/frame/support/procedural/src/lib.rs +++ b/frame/support/procedural/src/lib.rs @@ -35,8 +35,8 @@ use proc_macro::TokenStream; /// decl_storage! { /// trait Store for Module as Example { /// Foo get(fn foo) config(): u32=12; -/// Bar: map u32 => u32; -/// pub Zed build(|config| vec![(0, 0)]): linked_map u32 => u32; +/// Bar: map hasher(blake2_256) u32 => u32; +/// pub Zed build(|config| vec![(0, 0)]): linked_map hasher(blake2_256) u32 => u32; /// } /// } /// ``` @@ -74,7 +74,7 @@ use proc_macro::TokenStream; /// `$hash` representing a choice of hashing algorithms available in the /// [`Hashable`](../frame_support/trait.Hashable.html) trait. /// -/// `hasher($hash)` is optional and its default is `blake2_256`. One should use another hasher +/// `blake2_256` and `blake2_128_concat` are strong hasher. One should use another hasher /// with care, see generator documentation. /// /// The generator is implemented with: @@ -95,7 +95,7 @@ use proc_macro::TokenStream; /// `$hash` representing a choice of hashing algorithms available in the /// [`Hashable`](../frame_support/trait.Hashable.html) trait. /// -/// `hasher($hash)` is optional and its default is `blake2_256`. One should use another hasher +/// `blake2_256` and `blake2_128_concat` are strong hasher. One should use another hasher /// with care, see generator documentation. /// /// All key formatting logic can be accessed in a type-agnostic format via the @@ -126,13 +126,12 @@ use proc_macro::TokenStream; /// [`Hashable`](../frame_support/trait.Hashable.html) trait. They must be choosen with care, see /// generator documentation. /// -/// `hasher($hash1)` and `hasher($hash2) are optional and default to `blake2_256`. -/// One should use another hasher with care, see generator documentation. -/// -/// If the first key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. +/// If the first key is untrusted, a cryptographic `hasher` such as `blake2_256` or +/// `blake2_128_concat` must be used. /// Otherwise, other values of all storage items can be compromised. /// -/// If the second key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. +/// If the second key is untrusted, a cryptographic `hasher` such as `blake2_256` or +/// `blake2_128_concat` must be used. /// Otherwise, other items in storage with the same first key can be compromised. /// /// The generator is implemented with: diff --git a/frame/support/procedural/src/storage/parse.rs b/frame/support/procedural/src/storage/parse.rs index 04af85a312..b503c2b81c 100644 --- a/frame/support/procedural/src/storage/parse.rs +++ b/frame/support/procedural/src/storage/parse.rs @@ -461,29 +461,31 @@ fn parse_storage_line_defs( })?; } + let span = line.storage_type.span(); + let no_hasher_error = || syn::Error::new( + span, + "Default hasher has been removed, use explicit hasher(blake2_256) instead." + ); + let storage_type = match line.storage_type { DeclStorageType::Map(map) => super::StorageLineTypeDef::Map( super::MapDef { - hasher: map.hasher.inner.map(Into::into) - .unwrap_or(super::HasherKind::Blake2_256), + hasher: map.hasher.inner.ok_or_else(no_hasher_error)?.into(), key: map.key, value: map.value, } ), DeclStorageType::LinkedMap(map) => super::StorageLineTypeDef::LinkedMap( super::MapDef { - hasher: map.hasher.inner.map(Into::into) - .unwrap_or(super::HasherKind::Blake2_256), + hasher: map.hasher.inner.ok_or_else(no_hasher_error)?.into(), key: map.key, value: map.value, } ), DeclStorageType::DoubleMap(map) => super::StorageLineTypeDef::DoubleMap( super::DoubleMapDef { - hasher1: map.hasher1.inner.map(Into::into) - .unwrap_or(super::HasherKind::Blake2_256), - hasher2: map.hasher2.inner.map(Into::into) - .unwrap_or(super::HasherKind::Blake2_256), + hasher1: map.hasher1.inner.ok_or_else(no_hasher_error)?.into(), + hasher2: map.hasher2.inner.ok_or_else(no_hasher_error)?.into(), key1: map.key1, key2: map.key2, value: map.value, diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index ebfc7bbe97..e601544b01 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -253,20 +253,23 @@ mod tests { trait Store for Module as Example { pub Data get(fn data) build(|_| vec![(15u32, 42u64)]): linked_map hasher(twox_64_concat) u32 => u64; - pub OptionLinkedMap: linked_map u32 => Option; + pub OptionLinkedMap: linked_map hasher(blake2_256) u32 => Option; pub GenericData get(fn generic_data): linked_map hasher(twox_128) T::BlockNumber => T::BlockNumber; pub GenericData2 get(fn generic_data2): - linked_map T::BlockNumber => Option; + linked_map hasher(blake2_256) T::BlockNumber => Option; pub GetterNoFnKeyword get(no_fn): Option; pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]): double_map hasher(twox_64_concat) u32, hasher(blake2_256) u32 => u64; pub GenericDataDM: - double_map T::BlockNumber, hasher(twox_128) T::BlockNumber => T::BlockNumber; + double_map hasher(blake2_256) T::BlockNumber, hasher(twox_128) T::BlockNumber + => T::BlockNumber; pub GenericData2DM: - double_map T::BlockNumber, hasher(twox_256) T::BlockNumber => Option; - pub AppendableDM: double_map u32, T::BlockNumber => Vec; + double_map hasher(blake2_256) T::BlockNumber, hasher(twox_256) T::BlockNumber + => Option; + pub AppendableDM: + double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Vec; } } diff --git a/frame/support/src/storage/generator/mod.rs b/frame/support/src/storage/generator/mod.rs index 476c6d4472..2bee76babd 100644 --- a/frame/support/src/storage/generator/mod.rs +++ b/frame/support/src/storage/generator/mod.rs @@ -65,7 +65,7 @@ mod tests { crate::decl_storage! { trait Store for Module as Runtime { Value get(fn value) config(): (u64, u64); - NumberMap: linked_map NumberNumber => u64; + NumberMap: linked_map hasher(blake2_256) NumberNumber => u64; } } diff --git a/frame/support/test/tests/decl_storage.rs b/frame/support/test/tests/decl_storage.rs index 15a0807fa5..f5e3892d5f 100644 --- a/frame/support/test/tests/decl_storage.rs +++ b/frame/support/test/tests/decl_storage.rs @@ -59,23 +59,27 @@ mod tests { GetOptU32WithBuilderNone get(fn opt_u32_with_builder_none) build(|_| None): Option; // map non-getters: pub / $default - MAPU32 : map u32 => Option; - pub PUBMAPU32 : map u32 => Option; - MAPU32MYDEF : map u32 => Option; - pub PUBMAPU32MYDEF : map u32 => Option; + MAPU32 : map hasher(blake2_256) u32 => Option; + pub PUBMAPU32 : map hasher(blake2_256) u32 => Option; + MAPU32MYDEF : map hasher(blake2_256) u32 => Option; + pub PUBMAPU32MYDEF : map hasher(blake2_256) u32 => Option; // map getters: pub / $default - GETMAPU32 get(fn map_u32_getter): map u32 => String; - pub PUBGETMAPU32 get(fn pub_map_u32_getter): map u32 => String; + GETMAPU32 get(fn map_u32_getter): map hasher(blake2_256) u32 => String; + pub PUBGETMAPU32 get(fn pub_map_u32_getter): map hasher(blake2_256) u32 => String; - GETMAPU32MYDEF get(fn map_u32_getter_mydef): map u32 => String = "map".into(); - pub PUBGETMAPU32MYDEF get(fn pub_map_u32_getter_mydef): map u32 => String = "pubmap".into(); + GETMAPU32MYDEF get(fn map_u32_getter_mydef): + map hasher(blake2_256) u32 => String = "map".into(); + pub PUBGETMAPU32MYDEF get(fn pub_map_u32_getter_mydef): + map hasher(blake2_256) u32 => String = "pubmap".into(); // linked map - LINKEDMAPU32 : linked_map u32 => Option; - pub PUBLINKEDMAPU32MYDEF : linked_map u32 => Option; - GETLINKEDMAPU32 get(fn linked_map_u32_getter): linked_map u32 => String; - pub PUBGETLINKEDMAPU32MYDEF get(fn pub_linked_map_u32_getter_mydef): linked_map u32 => String = "pubmap".into(); + LINKEDMAPU32 : linked_map hasher(blake2_256) u32 => Option; + pub PUBLINKEDMAPU32MYDEF : linked_map hasher(blake2_256) u32 => Option; + GETLINKEDMAPU32 get(fn linked_map_u32_getter): + linked_map hasher(blake2_256) u32 => String; + pub PUBGETLINKEDMAPU32MYDEF get(fn pub_linked_map_u32_getter_mydef): + linked_map hasher(blake2_256) u32 => String = "pubmap".into(); COMPLEXTYPE1: ::std::vec::Vec<::Origin>; COMPLEXTYPE2: (Vec)>>, u32); @@ -558,17 +562,17 @@ mod test_append_and_len { JustVecWithDefault: Vec = vec![6, 9]; OptionVec: Option>; - MapVec: map u32 => Vec; - MapVecWithDefault: map u32 => Vec = vec![6, 9]; - OptionMapVec: map u32 => Option>; + MapVec: map hasher(blake2_256) u32 => Vec; + MapVecWithDefault: map hasher(blake2_256) u32 => Vec = vec![6, 9]; + OptionMapVec: map hasher(blake2_256) u32 => Option>; - DoubleMapVec: double_map u32, u32 => Vec; - DoubleMapVecWithDefault: double_map u32, u32 => Vec = vec![6, 9]; - OptionDoubleMapVec: double_map u32, u32 => Option>; + DoubleMapVec: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => Vec; + DoubleMapVecWithDefault: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => Vec = vec![6, 9]; + OptionDoubleMapVec: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => Option>; - LinkedMapVec: linked_map u32 => Vec; - LinkedMapVecWithDefault: linked_map u32 => Vec = vec![6, 9]; - OptionLinkedMapVec: linked_map u32 => Option>; + LinkedMapVec: linked_map hasher(blake2_256) u32 => Vec; + LinkedMapVecWithDefault: linked_map hasher(blake2_256) u32 => Vec = vec![6, 9]; + OptionLinkedMapVec: linked_map hasher(blake2_256) u32 => Option>; } } diff --git a/frame/support/test/tests/final_keys.rs b/frame/support/test/tests/final_keys.rs index 9f1b379e25..15ee65b627 100644 --- a/frame/support/test/tests/final_keys.rs +++ b/frame/support/test/tests/final_keys.rs @@ -35,18 +35,18 @@ mod no_instance { trait Store for Module as FinalKeysNone { pub Value config(value): u32; - pub Map: map u32 => u32; + pub Map: map hasher(blake2_256) u32 => u32; pub Map2: map hasher(twox_128) u32 => u32; - pub LinkedMap: linked_map u32 => u32; + pub LinkedMap: linked_map hasher(blake2_256) u32 => u32; pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; - pub DoubleMap: double_map u32, u32 => u32; + pub DoubleMap: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => u32; pub DoubleMap2: double_map hasher(twox_128) u32, hasher(blake2_128) u32 => u32; pub TestGenericValue get(fn test_generic_value) config(): Option; pub TestGenericDoubleMap get(fn foo2) config(test_generic_double_map): - double_map u32, T::BlockNumber => Option; + double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Option; } } } @@ -65,18 +65,18 @@ mod instance { { pub Value config(value): u32; - pub Map: map u32 => u32; + pub Map: map hasher(blake2_256) u32 => u32; pub Map2: map hasher(twox_128) u32 => u32; - pub LinkedMap: linked_map u32 => u32; + pub LinkedMap: linked_map hasher(blake2_256) u32 => u32; pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; - pub DoubleMap: double_map u32, u32 => u32; + pub DoubleMap: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => u32; pub DoubleMap2: double_map hasher(twox_128) u32, hasher(blake2_128) u32 => u32; pub TestGenericValue get(fn test_generic_value) config(): Option; pub TestGenericDoubleMap get(fn foo2) config(test_generic_double_map): - double_map u32, T::BlockNumber => Option; + double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Option; } add_extra_genesis { // See `decl_storage` limitation. diff --git a/frame/support/test/tests/genesisconfig.rs b/frame/support/test/tests/genesisconfig.rs index dee7aefe0a..12af18aac9 100644 --- a/frame/support/test/tests/genesisconfig.rs +++ b/frame/support/test/tests/genesisconfig.rs @@ -25,7 +25,7 @@ frame_support::decl_module! { frame_support::decl_storage! { trait Store for Module as Example { - pub AppendableDM config(t): double_map u32, T::BlockNumber => Vec; + pub AppendableDM config(t): double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Vec; } } diff --git a/frame/support/test/tests/instance.rs b/frame/support/test/tests/instance.rs index 879ef4fa68..2c761ca43e 100644 --- a/frame/support/test/tests/instance.rs +++ b/frame/support/test/tests/instance.rs @@ -67,8 +67,8 @@ mod module1 { T::BlockNumber: From + std::fmt::Display { pub Value config(value): T::GenericType; - pub Map: map u32 => u64; - pub LinkedMap: linked_map u32 => u64; + pub Map: map hasher(blake2_256) u32 => u64; + pub LinkedMap: linked_map hasher(blake2_256) u32 => u64; } add_extra_genesis { @@ -136,9 +136,9 @@ mod module2 { frame_support::decl_storage! { trait Store for Module, I: Instance=DefaultInstance> as Module2 { pub Value config(value): T::Amount; - pub Map config(map): map u64 => u64; - pub LinkedMap config(linked_map): linked_map u64 => Vec; - pub DoubleMap config(double_map): double_map u64, u64 => u64; + pub Map config(map): map hasher(blake2_256) u64 => u64; + pub LinkedMap config(linked_map): linked_map hasher(blake2_256) u64 => Vec; + pub DoubleMap config(double_map): double_map hasher(blake2_256) u64, hasher(blake2_256) u64 => u64; } } diff --git a/frame/support/test/tests/issue2219.rs b/frame/support/test/tests/issue2219.rs index f3ce4dac80..c0a253f22b 100644 --- a/frame/support/test/tests/issue2219.rs +++ b/frame/support/test/tests/issue2219.rs @@ -109,7 +109,7 @@ mod module { } else { vec![] } - }): map Role => Option>; + }): map hasher(blake2_256) Role => Option>; /// the roles members can enter into pub AvailableRoles get(fn available_roles) build(|config: &GenesisConfig| { @@ -124,10 +124,12 @@ mod module { pub ActorAccountIds get(fn actor_account_ids) : Vec; /// actor accounts associated with a role - pub AccountIdsByRole get(fn account_ids_by_role) : map Role => Vec; + pub AccountIdsByRole get(fn account_ids_by_role): + map hasher(blake2_256) Role => Vec; /// tokens locked until given block number - pub Bondage get(fn bondage) : map T::AccountId => T::BlockNumber; + pub Bondage get(fn bondage): + map hasher(blake2_256) T::AccountId => T::BlockNumber; /// First step before enter a role is registering intent with a new account/key. /// This is done by sending a role_entry_request() from the new account. diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index ac51ef70e3..752ab9cc91 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -436,7 +436,7 @@ type EventIndex = u32; decl_storage! { trait Store for Module as System { /// Extrinsics nonce for accounts. - pub AccountNonce get(fn account_nonce): map T::AccountId => T::Index; + pub AccountNonce get(fn account_nonce): map hasher(blake2_256) T::AccountId => T::Index; /// Total extrinsics count for the current block. ExtrinsicCount: Option; /// Total weight for all extrinsics put together, for the current block. @@ -444,9 +444,10 @@ decl_storage! { /// Total length (in bytes) for all extrinsics put together, for the current block. AllExtrinsicsLen: Option; /// Map of block numbers to block hashes. - pub BlockHash get(fn block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): map T::BlockNumber => T::Hash; + pub BlockHash get(fn block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): + map hasher(blake2_256) T::BlockNumber => T::Hash; /// Extrinsics data for the current block (maps an extrinsic's index to its data). - ExtrinsicData get(fn extrinsic_data): map u32 => Vec; + ExtrinsicData get(fn extrinsic_data): map hasher(blake2_256) u32 => Vec; /// The current block number being processed. Set by `execute_block`. Number get(fn block_number) build(|_| 1.into()): T::BlockNumber; /// Hash of the previous block. @@ -475,7 +476,7 @@ decl_storage! { /// The value has the type `(T::BlockNumber, EventIndex)` because if we used only just /// the `EventIndex` then in case if the topic has the same contents on the next block /// no notification will be triggered thus the event might be lost. - EventTopics get(fn event_topics): map T::Hash => Vec<(T::BlockNumber, EventIndex)>; + EventTopics get(fn event_topics): map hasher(blake2_256) T::Hash => Vec<(T::BlockNumber, EventIndex)>; } add_extra_genesis { config(changes_trie_config): Option; diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 1800d0ad04..8d1c25ad66 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -200,7 +200,7 @@ decl_storage! { ProposalCount get(fn proposal_count): ProposalIndex; /// Proposals that have been made. - Proposals get(fn proposals): map ProposalIndex => Option>>; + Proposals get(fn proposals): map hasher(blake2_256) ProposalIndex => Option>>; /// Proposal indices that have been approved but not yet awarded. Approvals get(fn approvals): Vec; diff --git a/test-utils/runtime/src/system.rs b/test-utils/runtime/src/system.rs index 4d12ab8437..d0a38c7c77 100644 --- a/test-utils/runtime/src/system.rs +++ b/test-utils/runtime/src/system.rs @@ -46,7 +46,7 @@ decl_module! { decl_storage! { trait Store for Module as TestRuntime { - ExtrinsicData: map u32 => Vec; + ExtrinsicData: map hasher(blake2_256) u32 => Vec; // The current block number being processed. Set by `execute_block`. Number get(fn number): Option; ParentHash get(fn parent_hash): Hash; diff --git a/utils/frame/rpc/support/src/lib.rs b/utils/frame/rpc/support/src/lib.rs index 1e29c4e91b..a9982945e7 100644 --- a/utils/frame/rpc/support/src/lib.rs +++ b/utils/frame/rpc/support/src/lib.rs @@ -65,9 +65,9 @@ use sc_rpc_api::state::StateClient; /// decl_storage! { /// trait Store for Module as TestRuntime { /// pub LastActionId: u64; -/// pub Voxels: map Loc => Block; -/// pub Actions: linked_map u64 => Loc; -/// pub Prefab: double_map u128, (i8, i8, i8) => Block; +/// pub Voxels: map hasher(blake2_256) Loc => Block; +/// pub Actions: linked_map hasher(blake2_256) u64 => Loc; +/// pub Prefab: double_map hasher(blake2_256) u128, hasher(blake2_256) (i8, i8, i8) => Block; /// } /// } /// -- GitLab From 70575db721d581eef782d77cc654a35bb8cd6673 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 27 Jan 2020 09:26:42 -0800 Subject: [PATCH 191/296] Fix quadratic iterations over transaction pool (#4736) * transaction pool changes * service & network changes * address review * reduce future pool --- client/network/src/protocol.rs | 30 +++++++++++++++---- client/network/src/service.rs | 25 ++++++++++++---- client/network/test/src/lib.rs | 2 ++ client/service/src/builder.rs | 4 +-- client/service/src/lib.rs | 6 +++- .../transaction-pool/graph/src/base_pool.rs | 11 +++++-- client/transaction-pool/graph/src/future.rs | 2 +- client/transaction-pool/graph/src/pool.rs | 19 +++++++----- client/transaction-pool/graph/src/ready.rs | 9 ++++-- .../graph/src/validated_pool.rs | 15 ++++++---- client/transaction-pool/src/lib.rs | 6 +++- primitives/transaction-pool/src/pool.rs | 10 ++++--- 12 files changed, 102 insertions(+), 37 deletions(-) diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 7a9fc7ecfb..2df8f6597c 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -1135,18 +1135,26 @@ impl, H: ExHashT> Protocol { } } - /// Call when we must propagate ready extrinsics to peers. - pub fn propagate_extrinsics( + /// Propagate one extrinsic. + pub fn propagate_extrinsic( &mut self, + hash: &H, ) { - debug!(target: "sync", "Propagating extrinsics"); - + debug!(target: "sync", "Propagating extrinsic [{:?}]", hash); // Accept transactions only when fully synced if self.sync.status().state != SyncState::Idle { return; } + if let Some(extrinsic) = self.transaction_pool.transaction(hash) { + let propagated_to = self.do_propagate_extrinsics(&[(hash.clone(), extrinsic)]); + self.transaction_pool.on_broadcasted(propagated_to); + } + } - let extrinsics = self.transaction_pool.transactions(); + fn do_propagate_extrinsics( + &mut self, + extrinsics: &[(H, B::Extrinsic)], + ) -> HashMap> { let mut propagated_to = HashMap::new(); for (who, peer) in self.context_data.peers.iter_mut() { // never send extrinsics to the light node @@ -1177,6 +1185,18 @@ impl, H: ExHashT> Protocol { } } + propagated_to + } + + /// Call when we must propagate ready extrinsics to peers. + pub fn propagate_extrinsics(&mut self) { + debug!(target: "sync", "Propagating extrinsics"); + // Accept transactions only when fully synced + if self.sync.status().state != SyncState::Idle { + return; + } + let extrinsics = self.transaction_pool.transactions(); + let propagated_to = self.do_propagate_extrinsics(&extrinsics); self.transaction_pool.on_broadcasted(propagated_to); } diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 9c9a87bb67..c6b6168126 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -77,6 +77,8 @@ pub trait TransactionPool: Send + Sync { ); /// Notify the pool about transactions broadcast. fn on_broadcasted(&self, propagations: HashMap>); + /// Get transaction by hash. + fn transaction(&self, hash: &H) -> Option; } /// A cloneable handle for reporting cost/benefits of peers. @@ -115,7 +117,7 @@ pub struct NetworkService, H: E /// nodes it should be connected to or not. peerset: PeersetHandle, /// Channel that sends messages to the actual worker. - to_worker: mpsc::UnboundedSender>, + to_worker: mpsc::UnboundedSender>, /// Marker to pin the `H` generic. Serves no purpose except to not break backwards /// compatibility. _marker: PhantomData, @@ -477,14 +479,22 @@ impl, H: ExHashT> NetworkServic }); } - /// You must call this when new transactons are imported by the transaction pool. + /// You may call this when new transactons are imported by the transaction pool. /// - /// The latest transactions will be fetched from the `TransactionPool` that was passed at - /// initialization as part of the configuration. + /// All transactions will be fetched from the `TransactionPool` that was passed at + /// initialization as part of the configuration and propagated to peers. pub fn trigger_repropagate(&self) { let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::PropagateExtrinsics); } + /// You must call when new transaction is imported by the transaction pool. + /// + /// This transaction will be fetched from the `TransactionPool` that was passed at + /// initialization as part of the configuration and propagated to peers. + pub fn propagate_extrinsic(&self, hash: H) { + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::PropagateExtrinsic(hash)); + } + /// Make sure an important block is propagated to peers. /// /// In chain-based consensus, we often need to make sure non-best forks are @@ -665,7 +675,8 @@ impl NetworkStateInfo for NetworkService /// Messages sent from the `NetworkService` to the `NetworkWorker`. /// /// Each entry corresponds to a method of `NetworkService`. -enum ServiceToWorkerMsg> { +enum ServiceToWorkerMsg> { + PropagateExtrinsic(H), PropagateExtrinsics, RequestJustification(B::Hash, NumberFor), AnnounceBlock(B::Hash, Vec), @@ -704,7 +715,7 @@ pub struct NetworkWorker, H: Ex /// The import queue that was passed as initialization. import_queue: Box>, /// Messages from the `NetworkService` and that must be processed. - from_worker: mpsc::UnboundedReceiver>, + from_worker: mpsc::UnboundedReceiver>, /// Receiver for queries from the light client that must be processed. light_client_rqs: Option>>, /// Senders for events that happen on the network. @@ -747,6 +758,8 @@ impl, H: ExHashT> Future for Ne this.network_service.user_protocol_mut().announce_block(hash, data), ServiceToWorkerMsg::RequestJustification(hash, number) => this.network_service.user_protocol_mut().request_justification(&hash, number), + ServiceToWorkerMsg::PropagateExtrinsic(hash) => + this.network_service.user_protocol_mut().propagate_extrinsic(&hash), ServiceToWorkerMsg::PropagateExtrinsics => this.network_service.user_protocol_mut().propagate_extrinsics(), ServiceToWorkerMsg::GetValue(key) => diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 2369ba4f22..874c4d19f9 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -391,6 +391,8 @@ impl TransactionPool for EmptyTransactionPool { ) {} fn on_broadcasted(&self, _: HashMap>) {} + + fn transaction(&self, h: &Hash) -> Option { None } } pub trait SpecializationFactory { diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index caf97438ad..202597e787 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -906,9 +906,9 @@ ServiceBuilder< let network = Arc::downgrade(&network); let transaction_pool_ = transaction_pool.clone(); let events = transaction_pool.import_notification_stream() - .for_each(move |_| { + .for_each(move |hash| { if let Some(network) = network.upgrade() { - network.trigger_repropagate(); + network.propagate_extrinsic(hash); } let status = transaction_pool_.status(); telemetry!(SUBSTRATE_INFO; "txpool.import"; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 57e1462f64..c7069ac6e5 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -608,7 +608,7 @@ where H: std::hash::Hash + Eq + sp_runtime::traits::Member + sp_runtime::traits::MaybeSerialize, E: 'static + IntoPoolError + From, { - fn transactions(&self) -> Vec<(H, ::Extrinsic)> { + fn transactions(&self) -> Vec<(H, B::Extrinsic)> { transactions_to_propagate(&*self.pool) } @@ -660,6 +660,10 @@ where fn on_broadcasted(&self, propagations: HashMap>) { self.pool.on_broadcasted(propagations) } + + fn transaction(&self, hash: &H) -> Option { + self.pool.ready_transaction(hash).map(|tx| tx.data().clone()) + } } #[cfg(test)] diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 1da731b71e..7b7900c3e9 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -374,9 +374,9 @@ impl BasePool Vec>>> { - let ready = self.ready.by_hash(hashes); - let future = self.future.by_hash(hashes); + pub fn by_hashes(&self, hashes: &[Hash]) -> Vec>>> { + let ready = self.ready.by_hashes(hashes); + let future = self.future.by_hashes(hashes); ready .into_iter() @@ -385,6 +385,11 @@ impl BasePool Option>> { + self.ready.by_hash(hash) + } + /// Makes sure that the transactions in the queues stay within provided limits. /// /// Removes and returns worst transactions from the queues and all transactions that depend on them. diff --git a/client/transaction-pool/graph/src/future.rs b/client/transaction-pool/graph/src/future.rs index d106c65d45..0de50c1a65 100644 --- a/client/transaction-pool/graph/src/future.rs +++ b/client/transaction-pool/graph/src/future.rs @@ -160,7 +160,7 @@ impl FutureTransactions { } /// Returns a list of known transactions - pub fn by_hash(&self, hashes: &[Hash]) -> Vec>>> { + pub fn by_hashes(&self, hashes: &[Hash]) -> Vec>>> { hashes.iter().map(|h| self.waiting.get(h).map(|x| x.transaction.clone())).collect() } diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index d0f14ad40a..815b5871ea 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -38,7 +38,7 @@ use sp_transaction_pool::{error, PoolStatus}; use crate::validated_pool::{ValidatedPool, ValidatedTransaction}; /// Modification notification event stream type; -pub type EventStream = mpsc::UnboundedReceiver<()>; +pub type EventStream = mpsc::UnboundedReceiver; /// Extrinsic hash type for a pool. pub type ExHash = ::Hash; @@ -105,11 +105,11 @@ impl Default for Options { fn default() -> Self { Options { ready: base::Limit { - count: 512, - total_bytes: 10 * 1024 * 1024, + count: 8192, + total_bytes: 20 * 1024 * 1024, }, future: base::Limit { - count: 128, + count: 512, total_bytes: 1 * 1024 * 1024, }, reject_future_transactions: false, @@ -331,7 +331,7 @@ impl Pool { /// /// Consumers of this stream should use the `ready` method to actually get the /// pending transactions in the right order. - pub fn import_notification_stream(&self) -> EventStream { + pub fn import_notification_stream(&self) -> EventStream> { self.validated_pool.import_notification_stream() } @@ -437,6 +437,11 @@ impl Pool { (hash, validity) } + + /// Get ready transaction by hash, if it present in the pool. + pub fn ready_transaction(&self, hash: &ExHash) -> Option> { + self.validated_pool.ready_by_hash(hash) + } } impl Clone for Pool { @@ -638,8 +643,8 @@ mod tests { // then let mut it = futures::executor::block_on_stream(stream); - assert_eq!(it.next(), Some(())); - assert_eq!(it.next(), Some(())); + assert_eq!(it.next(), Some(32)); + assert_eq!(it.next(), Some(33)); assert_eq!(it.next(), None); } diff --git a/client/transaction-pool/graph/src/ready.rs b/client/transaction-pool/graph/src/ready.rs index cdb0076e5a..ec8d66e6b9 100644 --- a/client/transaction-pool/graph/src/ready.rs +++ b/client/transaction-pool/graph/src/ready.rs @@ -230,8 +230,13 @@ impl ReadyTransactions { self.ready.read().contains_key(hash) } - /// Retrieve transaction by hash - pub fn by_hash(&self, hashes: &[Hash]) -> Vec>>> { + /// Retrive transaction by hash + pub fn by_hash(&self, hash: &Hash) -> Option>> { + self.by_hashes(&[hash.clone()]).into_iter().next().unwrap_or(None) + } + + /// Retrieve transactions by hash + pub fn by_hashes(&self, hashes: &[Hash]) -> Vec>>> { let ready = self.ready.read(); hashes.iter().map(|hash| { ready.get(hash).map(|x| x.transaction.transaction.clone()) diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 34f34d5806..44e51a7a61 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -70,7 +70,7 @@ pub(crate) struct ValidatedPool { ExHash, ExtrinsicFor, >>, - import_notification_sinks: Mutex>>, + import_notification_sinks: Mutex>>>, rotator: PoolRotator>, } @@ -125,8 +125,8 @@ impl ValidatedPool { ValidatedTransaction::Valid(tx) => { let imported = self.pool.write().import(tx)?; - if let base::Imported::Ready { .. } = imported { - self.import_notification_sinks.lock().retain(|sink| sink.unbounded_send(()).is_ok()); + if let base::Imported::Ready { ref hash, .. } = imported { + self.import_notification_sinks.lock().retain(|sink| sink.unbounded_send(hash.clone()).is_ok()); } let mut listener = self.listener.write(); @@ -320,7 +320,7 @@ impl ValidatedPool { /// For each extrinsic, returns tags that it provides (if known), or None (if it is unknown). pub fn extrinsics_tags(&self, hashes: &[ExHash]) -> Vec>> { - self.pool.read().by_hash(&hashes) + self.pool.read().by_hashes(&hashes) .into_iter() .map(|existing_in_pool| existing_in_pool .map(|transaction| transaction.provides.iter().cloned() @@ -328,6 +328,11 @@ impl ValidatedPool { .collect() } + /// Get ready transaction by hash + pub fn ready_by_hash(&self, hash: &ExHash) -> Option> { + self.pool.read().ready_by_hash(hash) + } + /// Prunes ready transactions that provide given list of tags. pub fn prune_tags( &self, @@ -444,7 +449,7 @@ impl ValidatedPool { } /// Return an event stream of transactions imported to the pool. - pub fn import_notification_stream(&self) -> EventStream { + pub fn import_notification_stream(&self) -> EventStream> { let (sink, stream) = mpsc::unbounded(); self.import_notification_sinks.lock().push(sink); stream diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index b97294abe1..5f116dfd02 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -180,7 +180,7 @@ impl TransactionPool for BasicPool Box::new(self.pool.ready()) } - fn import_notification_stream(&self) -> ImportNotificationStream { + fn import_notification_stream(&self) -> ImportNotificationStream> { self.pool.import_notification_stream() } @@ -191,6 +191,10 @@ impl TransactionPool for BasicPool fn on_broadcasted(&self, propagations: HashMap, Vec>) { self.pool.on_broadcasted(propagations) } + + fn ready_transaction(&self, hash: &TxHash) -> Option> { + self.pool.ready_transaction(hash) + } } #[cfg_attr(test, derive(Debug))] diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index 92a0c4b5c3..2a71773996 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -113,7 +113,7 @@ pub enum TransactionStatus { pub type TransactionStatusStream = dyn Stream> + Send + Unpin; /// The import notification event stream. -pub type ImportNotificationStream = mpsc::UnboundedReceiver<()>; +pub type ImportNotificationStream = mpsc::UnboundedReceiver; /// Transaction hash type for a pool. pub type TxHash